From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2456C433EF for ; Mon, 4 Apr 2022 15:12:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2CAF86B0072; Mon, 4 Apr 2022 11:12:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 27A546B0075; Mon, 4 Apr 2022 11:12:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E11816B0078; Mon, 4 Apr 2022 11:12:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0233.hostedemail.com [216.40.44.233]) by kanga.kvack.org (Postfix) with ESMTP id BF3956B0072 for ; Mon, 4 Apr 2022 11:12:31 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 790CB824C421 for ; Mon, 4 Apr 2022 15:12:21 +0000 (UTC) X-FDA: 79319537682.28.F477F03 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf16.hostedemail.com (Postfix) with ESMTP id 0180918000D for ; Mon, 4 Apr 2022 15:12:19 +0000 (UTC) Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 234Dk3NS014690; Mon, 4 Apr 2022 14:35:41 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2021-07-09; bh=3RYvxc/5p7A+iRIVbj2AqXq/uiCnJGiIL6iM4IBgXeA=; b=GgHY2xmdHr31ZJ66ng2aIEI0zHo9rpEgLRuIs/MDE5jfqbPCdURP4c843Eypdr+oEH2c c/8ZrzVwFaR5l6lzotmy419OBZE/P/tgJJjv9ePxFIlrr5/uxErhWl2mR2MWzpIVmodK DhReWRboi7/aVVaEBYbS5XePYtX/qTHsknd9TcXUxc/jocSyy9oUQ8eEMXHCbSzWF0/v yXC2KJhWSbaNJGPHQPep6I4uFj1ATR14+yL+yrP1RcbvfS6KT0ekob6mg0X5DJE3ApXf 9lhzKfDwOe+Mhz0/a6vFkwd8MRRsjqtnDostw7LN3h0XtfOv6xkgn0XpacBDPK1qwHJZ +A== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com with ESMTP id 3f6ec9kbu5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 Apr 2022 14:35:39 +0000 Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 234EZaYa034331; Mon, 4 Apr 2022 14:35:39 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2047.outbound.protection.outlook.com [104.47.66.47]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com with ESMTP id 3f6cx2mgyc-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 Apr 2022 14:35:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dg3qlPNCDqmCU27xgXudzZlD6KEr1GQ7NFvkpe49cCJzDP6CUd5tnc+jdd6ZcoiSerLCfCNFrfx3gC5nFojGUaezpzW8ab2V4mj49236nzWdENsbxTKilyk3rQP6qIQw37lhsnCed+2Sr7zjI8MB4/Cw2lLkKVKnD54mLc29nIbD0yx0McDy8d/g1IQ1fveNXropib45daEyZtmY9QJKyx4DlNbCy3Jqs8K2cdUaM1+/jhRGT1ioRKdGgyHSXhRkP4ndylE3fwzvTYFKX+8hn4lGXGfFCTHyXCiPsHQO1eXDwNsVcDutH3bz6Y6V4pxBXq8UIc5+aUZ8WTYHezlueg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=3RYvxc/5p7A+iRIVbj2AqXq/uiCnJGiIL6iM4IBgXeA=; b=LBqKjKjN3f0QCvIor1AAN+TpyyAZp7qE1h47SC25sPnm+HEGWBcNjBNHWIti371ZuwSUqhMPAMEp7c0aUY16u8uOBh1NvZm4sSSeYd5jbMmGMZk9s7wYF7aiIrnPO8a+41I/vV/Gb/WFbbkXCDAInWr8iSPuK/F4HqFrHIiiqBxw+2IDM6et+G/luZ1acVCJG3v5CyJ7cpguFQg53Ta1BlcnYs3vuKoD6l8wMDV9gW93J6ABB/0lBxa2NOymvJWL7xx6IuXEhvo4EvanFH7uKqC5A9s30xa8bSL+JZgfG3EOktRzlZtvdncuTcpFmICwwbM9PStejOqhPLn4DA8nrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3RYvxc/5p7A+iRIVbj2AqXq/uiCnJGiIL6iM4IBgXeA=; b=a1Hu+hgXGeSx0JLnddPkOTukIzFBEdF/dJetnlCCzh45xWkJirFSsDrAGCOp3eOYncols0eDXnKBOS5FtlvuUUoLtSI85d9XcxYn9ZYZZw9YRpC7FupDljwMrjXzH5yQAcYoz0hwc+R9tPWMr8jezNfQ/LRL38orN/5H7pzkh3c= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by MW4PR10MB5812.namprd10.prod.outlook.com (2603:10b6:303:18e::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5123.30; Mon, 4 Apr 2022 14:35:31 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::74fd:df41:4c93:24a5]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::74fd:df41:4c93:24a5%6]) with mapi id 15.20.5123.031; Mon, 4 Apr 2022 14:35:31 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton Subject: [PATCH v7 07/70] Maple Tree: Add new data structure Thread-Topic: [PATCH v7 07/70] Maple Tree: Add new data structure Thread-Index: AQHYSDE8DkCjbdTP2E+hzXnGNGH0rQ== Date: Mon, 4 Apr 2022 14:35:31 +0000 Message-ID: <20220404143501.2016403-8-Liam.Howlett@oracle.com> References: <20220404143501.2016403-1-Liam.Howlett@oracle.com> In-Reply-To: <20220404143501.2016403-1-Liam.Howlett@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.34.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 09c937e4-0b34-4685-a892-08da16485f23 x-ms-traffictypediagnostic: MW4PR10MB5812:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: yg95t18oWXecakM05hDdFIq67ykmV1T49NAT63Sqk2JoQ8KhR+yqiY7yLYorz9xwF1S+ta0fxxqZauEXfRqsx0tfF4A1aZOmLE7AWaCcj4AQNROO2AREu0iPYUOwkQb4WzEsPJErRAkiAtS5RGw4KNwDT17yb1ZHMxkZPKIr3SwYmrWmSbh+NXwPChPe5GQBCkcQcZgqGCkBpShWGIu6SMWeITFpRjUZrKzYPIHZwSbQZ1to2E5b/uv0XxgO6sNQYaMdzWxDD8CU/JS7P1RlgnY2DhsJqU4e/00aOoEHk1O9xsnYCd0Dn+15TaoDO1ngR1/sIVM5ny0r5TYLMbTfkjJrarbfoVoH3FGnr5lIFCyBCKUHyphLRrp4QISkk3IXgPxKZ5gvoGWDFvj/vyPjCHnwmfTPGkfs4Mp5VVNgXbzJrzKMcZPRuNJirN7wd4z6ECZ5GY12OgiMJ/YmDpjWXoQDsqjMyl2MZPro2PBzeErR5dwnvqB8gAh9PUm6WlWgv4wv/ypm3KZMQF6ofzlxogYcn2YvDNsgVf298Qc1+kng0ia88t6Jj9WNkv0HgonGfy/SJtAys+X9hloD2eUIVs3WqiQGy0B7NbvqBJ05/6rvldL1ODzteaBBcrmI4O/5BurPaYlwDTeeAwvjOL/QT/ALxHH/EH4isqs50JcVrbFJvHIahQzrSwzYmO7h6KPR3AMSMMv/XlmXEBWTGcUL3WLo1dBbvK+JkDOJdMdE0h2SV3D8Huya0HuxDDTCkPJcY6INVU9RKb1bc7u074qRFxfEV62E7k9kKwc4PszL5utN516spHDVMae6WI34Blir x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR10MB3022.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(26005)(30864003)(6486002)(8936002)(1076003)(44832011)(83380400001)(508600001)(5660300002)(6506007)(36756003)(966005)(71200400001)(2616005)(2906002)(186003)(91956017)(64756008)(66556008)(66476007)(66446008)(76116006)(66946007)(6512007)(38070700005)(86362001)(38100700002)(8676002)(316002)(122000001)(110136005)(559001)(579004)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?REpaRFBDV3FTdmlEMlA2aGpsZ056aXR2NmIyOUtQTFk4NnV6VFVkVFBVSlpE?= =?utf-8?B?Ull6MUVYODh2M2k4WXNyQWpmUzZVSTI2dlNWT05ZaWFoQ3Z2TUdIc1NjT3lY?= =?utf-8?B?MS83MGV1ZmlBZXJhbDJ3SitCVWlCbXdMTjZIYWI4T1RycWpGNW8yUUNzNk9z?= =?utf-8?B?eS92bXhZbjdkNmk3eWk0c3ZLWkZEYnJDZzRsU3diVFpsN05sUk0zbW5sUVRE?= =?utf-8?B?K3dXTjF5ay9GL25uUnZEZ0RLM1NtejNTTmQ4S2srUTNhWnNkamNJR3Jtekho?= =?utf-8?B?SHBDSzFqWExHdk1QUWVleUs4S2pod01Eb3hoK3lrK25OUUpyZ0pEcDRJNXNX?= =?utf-8?B?SGhCOG5iaUo0a2lKSGJBS1ltejU0WDVTNlZQdG84N0ljVTV1aW1DU0NKS2tn?= =?utf-8?B?MkVnOXZGM1BibFZwNW5ZMGpuTUJqRnRobWl5Skl3VnFSaGdCNFkyWUM1bUo1?= =?utf-8?B?akFsL1RyY2NoVDVQWW4weGFaQ0ZiR3hRaWpFbUpFejVES2tzTWp4T3pVM1ZV?= =?utf-8?B?cU8xZFpRT1lYVnk5eFh5WVJyd0FySWN4dm53YVhmSkhqbnlBOHoxTjN6d0tE?= =?utf-8?B?RkFWOHYybGZaZ3JnT29pdDJ0empvNTdkTFY4YmNDbGlOeHVQN08zSjZIaXlw?= =?utf-8?B?c1M2WnFocUJLeTlPSzV0WXV1VUpZczM1cEdZazc0SEQzOE9EeVd5bExzOFlo?= =?utf-8?B?MG43UlA3KzlVNk9NOUtTY0pnR0crN1JzRUl0MVFDcjluTGk4K1NUeHRWVGNz?= =?utf-8?B?NXUrcDA3VUdWUVFuajI4SWlKUWtwQlZuSVhUZmRaZFFFUDJhb21ZQStUeFlQ?= =?utf-8?B?clljMjJhNDdieGx4clFmSVRxOUhSSkt5akxITWpTK2pqVTlDTUhhL3JpZE9r?= =?utf-8?B?U3BJYjJ2MEJVV3dtdWFSUjExbkhpeUJXYURvaVBtYzRsd2JhWDltYkc2K3NF?= =?utf-8?B?MlpnVEFEa2h0VldQbnhyU0tkUTdUb1g3ZjM1czFWcW8yMko3Q0EwSzYwREtt?= =?utf-8?B?WnpTWGlzR2lqdmJSSEhRSmdoc3FQYkFrSWlMMDIycitmRTR6UjdYT0FaYmNJ?= =?utf-8?B?aWdYVjNFcXJPQ29iWlFyTjFVMVljMWl5MlFjWFF1bnhNd3N6NXhocHExQkpu?= =?utf-8?B?aEp6VGx5aHhaMkgrYzM3anJDNENiVUpOUUQ2ZTZJQXF6WFN2ckQ2K3F6Ykpk?= =?utf-8?B?TDlJWVVSaDF2MmFOUGMvNE5aQS9WTnJLYkE5c0tjcVUrdy9FUFZEYmhXWHBH?= =?utf-8?B?a0JoUGNPVjNDSHVkaXpycTZTQWxkN0h3VmhsV1lZczlBdzMrL2ZOS2xnKzBO?= =?utf-8?B?TkZLNTlEdE1VRTZ6OWZxYUI5dkdrOEI3MEJ1eVM3OUJBTllkcE9iMG5nNmVu?= =?utf-8?B?MGJaUzZIa0FJdEFsc0xIZlhCOWtyaHFXVmx6TE9pcVltYWxiWWI5RVQwL1dz?= =?utf-8?B?TmpuYlJlMUpvTGJPS2d6UzJibjd1TmJnWWU0ZGJUZUpGK3NMM21raTZRWTJD?= =?utf-8?B?SzFvWUtvcEhad2kwang4cGsxLzRpeWpncTJrTyswWStiditXWUI2TnBXMStv?= =?utf-8?B?dWIycFJBdXZuRDZEeVZ0YlVRdTFVZVZVUzBYTlp5WmUxS0dTZi81N1plL3ZY?= =?utf-8?B?YTFaby9OMGwySW9hL3VESlZ3K0Y1WXJDZG0xVEwzcGlFa082bXNncjdsbVFz?= =?utf-8?B?MnR5OWpMRUNSL0dydzhRY0wvblVueEhIRStzQXJjRGhyMHg1TmxPZGg2ZGNQ?= =?utf-8?B?Tmkvclc2SUplQXAxZkE5bzRuYzFkT1lpSkpkMktlZkREMStadnVHdzdLOGZV?= =?utf-8?B?Z2FxQ085ZDNSSkZPVW5rcE85YjRUK1o2eHAxaWRJS0ZybUZTRnFoZFhlcm5N?= =?utf-8?B?ajk2SnpMdk0rM0tpTi9WRkpqcFJMSlJZQ25LY1RWUStHVW1laFZySGZTTU0r?= =?utf-8?B?NXBzRUpnOEw4YU0rOUpjbjhyeW82TmRHVUlOUDdhYkk4bDRJcW45QWppT1RY?= =?utf-8?B?V0x4cytoVUhPY1JzQXdobENiZnpIcHBYZWVQNGxHdVRYbmZVZTlkYmR1c253?= =?utf-8?B?Nk8xQml2Yk1UMG5hYjBsYXQ3aEw0QWFFaEY3WHBpSFNPRDNTRzVqTXk4cmhv?= =?utf-8?B?OHI3V3NIam52TDNMWWh4NFRPZXBkMDFyeG4zdjA0cUk5amFMWWdlaGkxZThI?= =?utf-8?B?T0xVZjVtMWZ0VjZKZUtaM082eWxnbDJ5WHU0SktRMlg5QVNjck1FcVc0UDNG?= =?utf-8?B?OTlNUVBhWUxTRnhRdDRHb1VWRWNyUnpDM0VsdU9KOFE3RE5kS2ZQeVpJZDJ3?= =?utf-8?B?R1ZzWXdFRkpUNXRuVG5KVjNTbzlBUEZPOTAzUW9maHZMWkxRVlNGWDJFeTlk?= =?utf-8?Q?76yFvTdZgApmXNRk=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <375D3BDF30F2E14AB6C69F4378763E9F@namprd10.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR10MB3022.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09c937e4-0b34-4685-a892-08da16485f23 X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Apr 2022 14:35:31.1288 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 4DrdNGoAuPXxaaGj7PtLEuIprz/8Q/q6N9UeDYFoA26/V6g415c9DmEuwTJakbkuGGr+fUBTUdIfM5AhxvouKw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR10MB5812 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.425,18.0.850 definitions=2022-04-04_06:2022-03-30,2022-04-04 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 mlxlogscore=999 phishscore=0 spamscore=0 adultscore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2204040083 X-Proofpoint-GUID: N68mmTUgYL4cFTAJw0516XhMRr6qTV5q X-Proofpoint-ORIG-GUID: N68mmTUgYL4cFTAJw0516XhMRr6qTV5q X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 0180918000D X-Rspam-User: Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2021-07-09 header.b=GgHY2xmd; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=a1Hu+hgX; dmarc=pass (policy=none) header.from=oracle.com; spf=none (imf16.hostedemail.com: domain of liam.howlett@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=liam.howlett@oracle.com X-Stat-Signature: nfn57a88j4w8z68bjrzj3w9fcxow6xh9 X-HE-Tag: 1649085139-579338 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpUaGUg bWFwbGUgdHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8g dXNlIG1vZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVt YmVyIG9mIHBsYWNlcyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdl LWJhc2VkIHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBz aW1wbGUgaW50ZXJmYWNlLiAgVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMN CnBhdGNoIHNldCBpcyB0aGUgdm1fYXJlYV9zdHJ1Y3QsIHdoZXJlIHRocmVlIGRhdGEgc3RydWN0 dXJlcyBhcmUNCnJlcGxhY2VkIGJ5IHRoZSBtYXBsZSB0cmVlOiB0aGUgYXVnbWVudGVkIHJidHJl ZSwgdGhlIHZtYSBjYWNoZSwgYW5kIHRoZQ0KbGlua2VkIGxpc3Qgb2YgVk1BcyBpbiB0aGUgbW1f c3RydWN0LiAgVGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZQ0Kb3IgcmVtb3ZlIHRoZSBt bWFwX3NlbSBjb250ZW50aW9uLg0KDQpUaGUgdHJlZSBoYXMgYSBicmFuY2hpbmcgZmFjdG9yIG9m IDEwIGZvciBub24tbGVhZiBub2RlcyBhbmQgMTYgZm9yIGxlYWYNCm5vZGVzLiAgV2l0aCB0aGUg aW5jcmVhc2VkIGJyYW5jaGluZyBmYWN0b3IsIGl0IGlzIHNpZ25pZmljYW50bHkgc2hvcnRlciB0 aGFuDQp0aGUgcmJ0cmVlIHNvIGl0IGhhcyBmZXdlciBjYWNoZSBtaXNzZXMuICBUaGUgcmVtb3Zh bCBvZiB0aGUgbGlua2VkIGxpc3QNCmJldHdlZW4gc3Vic2VxdWVudCBlbnRyaWVzIGFsc28gcmVk dWNlcyB0aGUgY2FjaGUgbWlzc2VzIGFuZCB0aGUgbmVlZCB0byBwdWxsDQppbiB0aGUgcHJldmlv dXMgYW5kIG5leHQgVk1BIGR1cmluZyBtYW55IHRyZWUgYWx0ZXJhdGlvbnMuDQoNClNpZ25lZC1v ZmYtYnk6IE1hdHRoZXcgV2lsY294IChPcmFjbGUpIDx3aWxseUBpbmZyYWRlYWQub3JnPg0KU2ln bmVkLW9mZi1ieTogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xlLmNvbT4NClRl c3RlZC1ieTogRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4NCi0tLQ0KIERvY3Vt ZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0ICAgICAgICAgICAgICB8ICAgIDEgKw0KIERvY3Vt ZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgICAgICAgICB8ICAyMTggKw0KIE1BSU5U QUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTIgKw0KIGluY2x1 ZGUvbGludXgvbWFwbGVfdHJlZS5oICAgICAgICAgICAgICAgICAgICB8ICA2ODIgKysNCiBpbmNs dWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAgICAgICAgICAgfCAgMTIzICsNCiBpbml0 L21haW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyICsNCiBsaWIv S2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDE1ICsNCiBsaWIv TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAzICstDQogbGli L21hcGxlX3RyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjk3OSArKysrKysr KysrKysrKysrKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0aWdub3JlICAgICAgICAg ICB8ICAgIDIgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2NvbmYu aCB8ICAgIDEgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgg ICB8ICAgIDcgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBsZS5jICAgICAgICAgICAg ICB8ICAgNTkgKw0KIC4uLi9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAg ICB8ICAgIDMgKw0KIDE0IGZpbGVzIGNoYW5nZWQsIDgxMDYgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQ0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2NvcmUtYXBpL21hcGxl X3RyZWUucnN0DQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5o DQogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0K IGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIvbWFwbGVfdHJlZS5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0 IHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCiBjcmVhdGUgbW9k ZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMNCiBjcmVhdGUgbW9kZSAx MDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgN Cg0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0IGIvRG9jdW1l bnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCmluZGV4IDk3MmQ0NmE1ZGRmNi4uMWRkZjM3ZGNh NWZkIDEwMDY0NA0KLS0tIGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCisrKyBi L0RvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0DQpAQCAtMzQsNiArMzQsNyBAQCBMaWJy YXJ5IGZ1bmN0aW9uYWxpdHkgdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGtlcm5lbC4NCiAg ICBrcmVmDQogICAgYXNzb2NfYXJyYXkNCiAgICB4YXJyYXkNCisgICBtYXBsZV90cmVlDQogICAg aWRyDQogICAgY2lyY3VsYXItYnVmZmVycw0KICAgIHJidHJlZQ0KZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBp L21hcGxlX3RyZWUucnN0DQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAw Li5jOTUxNmEyZTAzMjQNCi0tLSAvZGV2L251bGwNCisrKyBiL0RvY3VtZW50YXRpb24vY29yZS1h cGkvbWFwbGVfdHJlZS5yc3QNCkBAIC0wLDAgKzEsMjE4IEBADQorLi4gU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjArDQorDQorDQorPT09PT09PT09PQ0KK01hcGxlIFRyZWUNCis9PT09 PT09PT09DQorDQorOkF1dGhvcjogTGlhbSBSLiBIb3dsZXR0DQorDQorT3ZlcnZpZXcNCis9PT09 PT09PQ0KKw0KK1RoZSBNYXBsZSBUcmVlIGlzIGEgQi1UcmVlIGRhdGEgdHlwZSB3aGljaCBpcyBv cHRpbWl6ZWQgZm9yIHN0b3JpbmcNCitub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLCBpbmNsdWRpbmcg cmFuZ2VzIG9mIHNpemUgMS4gIFRoZSB0cmVlIHdhcyBkZXNpZ25lZCB0bw0KK2JlIHNpbXBsZSB0 byB1c2UgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSB1c2VyIHdyaXR0ZW4gc2VhcmNoIG1ldGhvZC4g IEl0DQorc3VwcG9ydHMgaXRlcmF0aW5nIG92ZXIgYSByYW5nZSBvZiBlbnRyaWVzIGFuZCBnb2lu ZyB0byB0aGUgcHJldmlvdXMgb3IgbmV4dA0KK2VudHJ5IGluIGEgY2FjaGUtZWZmaWNpZW50IG1h bm5lci4gIFRoZSB0cmVlIGNhbiBhbHNvIGJlIHB1dCBpbnRvIGFuIFJDVS1zYWZlDQorbW9kZSBv ZiBvcGVyYXRpb24gd2hpY2ggYWxsb3dzIHJlYWRpbmcgYW5kIHdyaXRpbmcgY29uY3VycmVudGx5 LiAgV3JpdGVycyBtdXN0DQorc3luY2hyb25pemUgb24gYSBsb2NrLCB3aGljaCBjYW4gYmUgdGhl IGRlZmF1bHQgc3BpbmxvY2ssIG9yIHRoZSB1c2VyIGNhbiBzZXQNCit0aGUgbG9jayB0byBhbiBl eHRlcm5hbCBsb2NrIG9mIGEgZGlmZmVyZW50IHR5cGUuDQorDQorVGhlIE1hcGxlIFRyZWUgbWFp bnRhaW5zIGEgc21hbGwgbWVtb3J5IGZvb3RwcmludCBhbmQgd2FzIGRlc2lnbmVkIHRvIHVzZQ0K K21vZGVybiBwcm9jZXNzb3IgY2FjaGUgZWZmaWNpZW50bHkuICBUaGUgbWFqb3JpdHkgb2YgdGhl IHVzZXJzIHdpbGwgYmUgYWJsZSB0bw0KK3VzZSB0aGUgbm9ybWFsIEFQSS4gIEFuIDpyZWY6YG1h cGxlLXRyZWUtYWR2YW5jZWQtYXBpYCBleGlzdHMgZm9yIG1vcmUgY29tcGxleA0KK3NjZW5hcmlv cy4gIFRoZSBtb3N0IGltcG9ydGFudCB1c2FnZSBvZiB0aGUgTWFwbGUgVHJlZSBpcyB0aGUgdHJh Y2tpbmcgb2YgdGhlDQordmlydHVhbCBtZW1vcnkgYXJlYXMuDQorDQorVGhlIE1hcGxlIFRyZWUg Y2FuIHN0b3JlIHZhbHVlcyBiZXR3ZWVuIGBgMGBgIGFuZCBgYFVMT05HX01BWGBgLiAgVGhlIE1h cGxlDQorVHJlZSByZXNlcnZlcyB2YWx1ZXMgd2l0aCB0aGUgYm90dG9tIHR3byBiaXRzIHNldCB0 byAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2DQorKGllIDIsIDYsIDEwIC4uIDQwOTQpIGZvciBp bnRlcm5hbCB1c2UuICBJZiB0aGUgZW50cmllcyBtYXkgdXNlIHJlc2VydmVkDQorZW50cmllcyB0 aGVuIHRoZSB1c2VycyBjYW4gY29udmVydCB0aGUgZW50cmllcyB1c2luZyB4YV9ta192YWx1ZSgp IGFuZCBjb252ZXJ0DQordGhlbSBiYWNrIGJ5IGNhbGxpbmcgeGFfdG9fdmFsdWUoKS4gIElmIHRo ZSB1c2VyIG5lZWRzIHRvIHVzZSBhIHJlc2VydmVkDQordmFsdWUsIHRoZW4gdGhlIHVzZXIgY2Fu IGNvbnZlcnQgdGhlIHZhbHVlIHdoZW4gdXNpbmcgdGhlDQorOnJlZjpgbWFwbGUtdHJlZS1hZHZh bmNlZC1hcGlgLCBidXQgYXJlIGJsb2NrZWQgYnkgdGhlIG5vcm1hbCBBUEkuDQorDQorVGhlIE1h cGxlIFRyZWUgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IHNlYXJjaGluZyBmb3Ig YSBnYXAgb2YgYSBnaXZlbg0KK3NpemUgKG9yIGxhcmdlcikuDQorDQorUHJlLWFsbG9jYXRpbmcg b2Ygbm9kZXMgaXMgYWxzbyBzdXBwb3J0ZWQgdXNpbmcgdGhlDQorOnJlZjpgbWFwbGUtdHJlZS1h ZHZhbmNlZC1hcGlgLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHVzZXJzIHdobyBtdXN0IGd1YXJhbnRl ZSBhDQorc3VjY2Vzc2Z1bCBzdG9yZSBvcGVyYXRpb24gd2l0aGluIGEgZ2l2ZW4NCitjb2RlIHNl Z21lbnQgd2hlbiBhbGxvY2F0aW5nIGNhbm5vdCBiZSBkb25lLiAgQWxsb2NhdGlvbnMgb2Ygbm9k ZXMgYXJlDQorcmVsYXRpdmVseSBzbWFsbCBhdCBhcm91bmQgMjU2IGJ5dGVzLg0KKw0KKy4uIF9t YXBsZS10cmVlLW5vcm1hbC1hcGk6DQorDQorTm9ybWFsIEFQSQ0KKz09PT09PT09PT0NCisNCitT dGFydCBieSBpbml0aWFsaXNpbmcgYSBtYXBsZSB0cmVlLCBlaXRoZXIgd2l0aCBERUZJTkVfTVRS RUUoKSBmb3Igc3RhdGljYWxseQ0KK2FsbG9jYXRlZCBtYXBsZSB0cmVlcyBvciBtdF9pbml0KCkg Zm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmVzLiAgQQ0KK2ZyZXNobHktaW5pdGlhbGlzZWQg bWFwbGUgdHJlZSBjb250YWlucyBhIGBgTlVMTGBgIHBvaW50ZXIgZm9yIHRoZSByYW5nZSBgYDBg YA0KKy0gYGBVTE9OR19NQVhgYC4gIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHR5cGVzIG9mIG1h cGxlIHRyZWVzIHN1cHBvcnRlZDogdGhlDQorYWxsb2NhdGlvbiB0cmVlIGFuZCB0aGUgcmVndWxh ciB0cmVlLiAgVGhlIHJlZ3VsYXIgdHJlZSBoYXMgYSBoaWdoZXIgYnJhbmNoaW5nDQorZmFjdG9y IGZvciBpbnRlcm5hbCBub2Rlcy4gIFRoZSBhbGxvY2F0aW9uIHRyZWUgaGFzIGEgbG93ZXIgYnJh bmNoaW5nIGZhY3Rvcg0KK2J1dCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VhcmNoIGZvciBhIGdhcCBv ZiBhIGdpdmVuIHNpemUgb3IgbGFyZ2VyIGZyb20gZWl0aGVyDQorYGAwYGAgdXB3YXJkcyBvciBg YFVMT05HX01BWGBgIGRvd24uICBBbiBhbGxvY2F0aW9uIHRyZWUgY2FuIGJlIHVzZWQgYnkNCitw YXNzaW5nIGluIHRoZSBgYE1UX0ZMQUdTX0FMTE9DX1JBTkdFYGAgZmxhZyB3aGVuIGluaXRpYWxp c2luZyB0aGUgdHJlZS4NCisNCitZb3UgY2FuIHRoZW4gc2V0IGVudHJpZXMgdXNpbmcgbXRyZWVf c3RvcmUoKSBvciBtdHJlZV9zdG9yZV9yYW5nZSgpLg0KK210cmVlX3N0b3JlKCkgd2lsbCBvdmVy d3JpdGUgYW55IGVudHJ5IHdpdGggdGhlIG5ldyBlbnRyeSBhbmQgcmV0dXJuIDAgb24NCitzdWNj ZXNzIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLiAgbXRyZWVfc3RvcmVfcmFuZ2UoKSB3b3Jr cyBpbiB0aGUgc2FtZSB3YXkNCitidXQgdGFrZXMgYSByYW5nZS4gIG10cmVlX2xvYWQoKSBpcyB1 c2VkIHRvIHJldHJpZXZlIHRoZSBlbnRyeSBzdG9yZWQgYXQgYQ0KK2dpdmVuIGluZGV4LiAgWW91 IGNhbiB1c2UgbXRyZWVfZXJhc2UoKSB0byBlcmFzZSBhbiBlbnRpcmUgcmFuZ2UgYnkgb25seQ0K K2tub3dpbmcgb25lIHZhbHVlIHdpdGhpbiB0aGF0IHJhbmdlLCBvciBtdHJlZV9zdG9yZSgpIGNh bGwgd2l0aCBhbiBlbnRyeSBvZg0KK05VTEwgbWF5IGJlIHVzZWQgdG8gcGFydGlhbGx5IGVyYXNl IGEgcmFuZ2Ugb3IgbWFueSByYW5nZXMgYXQgb25jZS4NCisNCitJZiB5b3Ugd2FudCB0byBvbmx5 IHN0b3JlIGEgbmV3IGVudHJ5IHRvIGEgcmFuZ2UgKG9yIGluZGV4KSBpZiB0aGF0IHJhbmdlIGlz DQorY3VycmVudGx5IGBgTlVMTGBgLCB5b3UgY2FuIHVzZSBtdHJlZV9pbnNlcnRfcmFuZ2UoKSBv ciBtdHJlZV9pbnNlcnQoKSB3aGljaA0KK3JldHVybiAtRUVYSVNUIGlmIHRoZSByYW5nZSBpcyBu b3QgZW1wdHkuDQorDQorWW91IGNhbiBzZWFyY2ggZm9yIGFuIGVudHJ5IGZyb20gYW4gaW5kZXgg dXB3YXJkcyBieSB1c2luZyBtdF9maW5kKCkuDQorDQorWW91IGNhbiB3YWxrIGVhY2ggZW50cnkg d2l0aGluIGEgcmFuZ2UgYnkgY2FsbGluZyBtdF9mb3JfZWFjaCgpLiAgWW91IG11c3QNCitwcm92 aWRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIGEgY3Vyc29yLiAgSWYgeW91IHdhbnQg dG8gd2FsayBlYWNoDQorZWxlbWVudCBvZiB0aGUgdHJlZSB0aGVuIGBgMGBgIGFuZCBgYFVMT05H X01BWGBgIG1heSBiZSB1c2VkIGFzIHRoZSByYW5nZS4gIElmDQordGhlIGNhbGxlciBpcyBnb2lu ZyB0byBob2xkIHRoZSBsb2NrIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdhbGsgdGhlbiBpdCBp cw0KK3dvcnRoIGxvb2tpbmcgYXQgdGhlIG1hc19mb3JfZWFjaCgpIEFQSSBpbiB0aGUgOnJlZjpg bWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgDQorc2VjdGlvbi4NCisNCitTb21ldGltZXMgaXQgaXMg bmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGUgbmV4dCBjYWxsIHRvIHN0b3JlIHRvIGEgbWFwbGUgdHJl ZSBkb2VzDQorbm90IGFsbG9jYXRlIG1lbW9yeSwgcGxlYXNlIHNlZSA6cmVmOmBtYXBsZS10cmVl LWFkdmFuY2VkLWFwaWAgZm9yIHRoaXMgdXNlIGNhc2UuDQorDQorRmluYWxseSwgeW91IGNhbiBy ZW1vdmUgYWxsIGVudHJpZXMgZnJvbSBhIG1hcGxlIHRyZWUgYnkgY2FsbGluZw0KK210cmVlX2Rl c3Ryb3koKS4gIElmIHRoZSBtYXBsZSB0cmVlIGVudHJpZXMgYXJlIHBvaW50ZXJzLCB5b3UgbWF5 IHdpc2ggdG8gZnJlZQ0KK3RoZSBlbnRyaWVzIGZpcnN0Lg0KKw0KK0FsbG9jYXRpbmcgTm9kZXMN CistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIGFsbG9jYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRo ZSBpbnRlcm5hbCB0cmVlIGNvZGUuICBTZWUNCis6cmVmOmBtYXBsZS10cmVlLWFkdmFuY2VkLWFs bG9jYCBmb3Igb3RoZXIgb3B0aW9ucy4NCisNCitMb2NraW5nDQorLS0tLS0tLQ0KKw0KK1lvdSBk byBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsb2NraW5nLiAgU2VlIDpyZWY6YG1hcGxlLXRyZWUt YWR2YW5jZWQtbG9ja3NgDQorZm9yIG90aGVyIG9wdGlvbnMuDQorDQorVGhlIE1hcGxlIFRyZWUg dXNlcyBSQ1UgYW5kIGFuIGludGVybmFsIHNwaW5sb2NrIHRvIHN5bmNocm9uaXNlIGFjY2VzczoN CisNCitUYWtlcyBSQ1UgcmVhZCBsb2NrOg0KKyAqIG10cmVlX2xvYWQoKQ0KKyAqIG10X2ZpbmQo KQ0KKyAqIG10X2Zvcl9lYWNoKCkNCisgKiBtdF9uZXh0KCkNCisgKiBtdF9wcmV2KCkNCisNCitU YWtlcyBtYV9sb2NrIGludGVybmFsbHk6DQorICogbXRyZWVfc3RvcmUoKQ0KKyAqIG10cmVlX3N0 b3JlX3JhbmdlKCkNCisgKiBtdHJlZV9pbnNlcnQoKQ0KKyAqIG10cmVlX2luc2VydF9yYW5nZSgp DQorICogbXRyZWVfZXJhc2UoKQ0KKyAqIG10cmVlX2Rlc3Ryb3koKQ0KKyAqIG10X3NldF9pbl9y Y3UoKQ0KKyAqIG10X2NsZWFyX2luX3JjdSgpDQorDQorSWYgeW91IHdhbnQgdG8gdGFrZSBhZHZh bnRhZ2Ugb2YgdGhlIGludGVybmFsIGxvY2sgdG8gcHJvdGVjdCB0aGUgZGF0YQ0KK3N0cnVjdHVy ZXMgdGhhdCB5b3UgYXJlIHN0b3JpbmcgaW4gdGhlIE1hcGxlIFRyZWUsIHlvdSBjYW4gY2FsbCBt dHJlZV9sb2NrKCkNCitiZWZvcmUgY2FsbGluZyBtdHJlZV9sb2FkKCksIHRoZW4gdGFrZSBhIHJl ZmVyZW5jZSBjb3VudCBvbiB0aGUgb2JqZWN0IHlvdQ0KK2hhdmUgZm91bmQgYmVmb3JlIGNhbGxp bmcgbXRyZWVfdW5sb2NrKCkuICBUaGlzIHdpbGwgcHJldmVudCBzdG9yZXMgZnJvbQ0KK3JlbW92 aW5nIHRoZSBvYmplY3QgZnJvbSB0aGUgdHJlZSBiZXR3ZWVuIGxvb2tpbmcgdXAgdGhlIG9iamVj dCBhbmQNCitpbmNyZW1lbnRpbmcgdGhlIHJlZmNvdW50LiAgWW91IGNhbiBhbHNvIHVzZSBSQ1Ug dG8gYXZvaWQgZGVyZWZlcmVuY2luZw0KK2ZyZWVkIG1lbW9yeSwgYnV0IGFuIGV4cGxhbmF0aW9u IG9mIHRoYXQgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzDQorZG9jdW1lbnQuDQorDQorLi4g X21hcGxlLXRyZWUtYWR2YW5jZWQtYXBpOg0KKw0KK0FkdmFuY2VkIEFQSQ0KKz09PT09PT09PT09 PQ0KKw0KK1RoZSBhZHZhbmNlZCBBUEkgb2ZmZXJzIG1vcmUgZmxleGliaWxpdHkgYW5kIGJldHRl ciBwZXJmb3JtYW5jZSBhdCB0aGUNCitjb3N0IG9mIGFuIGludGVyZmFjZSB3aGljaCBjYW4gYmUg aGFyZGVyIHRvIHVzZSBhbmQgaGFzIGZld2VyIHNhZmVndWFyZHMuDQorWW91IG11c3QgdGFrZSBj YXJlIG9mIHlvdXIgb3duIGxvY2tpbmcgd2hpbGUgdXNpbmcgdGhlIGFkdmFuY2VkIEFQSS4NCitZ b3UgY2FuIHVzZSB0aGUgbWFfbG9jaywgUkNVIG9yIGFuIGV4dGVybmFsIGxvY2sgZm9yIHByb3Rl Y3Rpb24uDQorWW91IGNhbiBtaXggYWR2YW5jZWQgYW5kIG5vcm1hbCBvcGVyYXRpb25zIG9uIHRo ZSBzYW1lIGFycmF5LCBhcyBsb25nDQorYXMgdGhlIGxvY2tpbmcgaXMgY29tcGF0aWJsZS4gIFRo ZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgIGlzIGltcGxlbWVudGVkDQoraW4gdGVybXMg b2YgdGhlIGFkdmFuY2VkIEFQSS4NCisNCitUaGUgYWR2YW5jZWQgQVBJIGlzIGJhc2VkIGFyb3Vu ZCB0aGUgbWFfc3RhdGUsIHRoaXMgaXMgd2hlcmUgdGhlICdtYXMnDQorcHJlZml4IG9yaWdpbmF0 ZXMuICBUaGUgbWFfc3RhdGUgc3RydWN0IGtlZXBzIHRyYWNrIG9mIHRyZWUgb3BlcmF0aW9ucyB0 byBtYWtlDQorbGlmZSBlYXNpZXIgZm9yIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsIHRyZWUg dXNlcnMuDQorDQorSW5pdGlhbGlzaW5nIHRoZSBtYXBsZSB0cmVlIGlzIHRoZSBzYW1lIGFzIGlu IHRoZSA6cmVmOmBtYXBsZS10cmVlLW5vcm1hbC1hcGlgLg0KK1BsZWFzZSBzZWUgYWJvdmUuDQor DQorVGhlIG1hcGxlIHN0YXRlIGtlZXBzIHRyYWNrIG9mIHRoZSByYW5nZSBzdGFydCBhbmQgZW5k IGluIG1hcy0+aW5kZXggYW5kDQorbWFzLT5sYXN0LCByZXNwZWN0aXZlbHkuDQorDQorbWFzX3dh bGsoKSB3aWxsIHdhbGsgdGhlIHRyZWUgdG8gdGhlIGxvY2F0aW9uIG9mIG1hcy0+aW5kZXggYW5k IHNldCB0aGUNCittYXMtPmluZGV4IGFuZCBtYXMtPmxhc3QgYWNjb3JkaW5nIHRvIHRoZSByYW5n ZSBmb3IgdGhlIGVudHJ5Lg0KKw0KK1lvdSBjYW4gc2V0IGVudHJpZXMgdXNpbmcgbWFzX3N0b3Jl KCkuICBtYXNfc3RvcmUoKSB3aWxsIG92ZXJ3cml0ZSBhbnkgZW50cnkNCit3aXRoIHRoZSBuZXcg ZW50cnkgYW5kIHJldHVybiB0aGUgZmlyc3QgZXhpc3RpbmcgZW50cnkgdGhhdCBpcyBvdmVyd3Jp dHRlbi4NCitUaGUgcmFuZ2UgaXMgcGFzc2VkIGluIGFzIG1lbWJlcnMgb2YgdGhlIG1hcGxlIHN0 YXRlOiBpbmRleCBhbmQgbGFzdC4NCisNCitZb3UgY2FuIHVzZSBtYXNfZXJhc2UoKSB0byBlcmFz ZSBhbiBlbnRpcmUgcmFuZ2UgYnkgc2V0dGluZyBpbmRleCBhbmQNCitsYXN0IG9mIHRoZSBtYXBs ZSBzdGF0ZSB0byB0aGUgZGVzaXJlZCByYW5nZSB0byBlcmFzZS4gIFRoaXMgd2lsbCBlcmFzZQ0K K3RoZSBmaXJzdCByYW5nZSB0aGF0IGlzIGZvdW5kIGluIHRoYXQgcmFuZ2UsIHNldCB0aGUgbWFw bGUgc3RhdGUgaW5kZXgNCithbmQgbGFzdCBhcyB0aGUgcmFuZ2UgdGhhdCB3YXMgZXJhc2VkIGFu ZCByZXR1cm4gdGhlIGVudHJ5IHRoYXQgZXhpc3RlZA0KK2F0IHRoYXQgbG9jYXRpb24uDQorDQor WW91IGNhbiB3YWxrIGVhY2ggZW50cnkgd2l0aGluIGEgcmFuZ2UgYnkgdXNpbmcgbWFzX2Zvcl9l YWNoKCkuICBJZiB5b3Ugd2FudA0KK3RvIHdhbGsgZWFjaCBlbGVtZW50IG9mIHRoZSB0cmVlIHRo ZW4gYGAwYGAgYW5kIGBgVUxPTkdfTUFYYGAgbWF5IGJlIHVzZWQgYXMNCit0aGUgcmFuZ2UuICBJ ZiB0aGUgbG9jayBuZWVkcyB0byBiZSBwZXJpb2RpY2FsbHkgZHJvcHBlZCwgc2VlIHRoZSBsb2Nr aW5nDQorc2VjdGlvbiBtYXNfcGF1c2UoKS4NCisNCitVc2luZyBhIG1hcGxlIHN0YXRlIGFsbG93 cyBtYXNfbmV4dCgpIGFuZCBtYXNfcHJldigpIHRvIGZ1bmN0aW9uIGFzIGlmIHRoZQ0KK3RyZWUg d2FzIGEgbGlua2VkIGxpc3QuICBXaXRoIHN1Y2ggYSBoaWdoIGJyYW5jaGluZyBmYWN0b3IgdGhl IGFtb3J0aXplZA0KK3BlcmZvcm1hbmNlIHBlbmFsdHkgaXMgb3V0d2VpZ2hlZCBieSBjYWNoZSBv cHRpbWl6YXRpb24uICBtYXNfbmV4dCgpIHdpbGwNCityZXR1cm4gdGhlIG5leHQgZW50cnkgd2hp Y2ggb2NjdXJzIGFmdGVyIHRoZSBlbnRyeSBhdCBpbmRleC4gIG1hc19wcmV2KCkNCit3aWxsIHJl dHVybiB0aGUgcHJldmlvdXMgZW50cnkgd2hpY2ggb2NjdXJzIGJlZm9yZSB0aGUgZW50cnkgYXQg aW5kZXguDQorDQorbWFzX2ZpbmQoKSB3aWxsIGZpbmQgdGhlIGZpcnN0IGVudHJ5IHdoaWNoIGV4 aXN0cyBhdCBvciBhYm92ZSBpbmRleCBvbg0KK3RoZSBmaXJzdCBjYWxsLCBhbmQgdGhlIG5leHQg ZW50cnkgZnJvbSBldmVyeSBzdWJzZXF1ZW50IGNhbGxzLg0KKw0KK21hc19maW5kX3JldigpIHdp bGwgZmluZCB0aGUgZmlzdCBlbnRyeSB3aGljaCBleGlzdHMgYXQgb3IgYmVsb3cgdGhlIGxhc3Qg b24NCit0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZSBwcmV2aW91cyBlbnRyeSBmcm9tIGV2ZXJ5IHN1 YnNlcXVlbnQgY2FsbHMuDQorDQorSWYgdGhlIHVzZXIgbmVlZHMgdG8geWllbGQgdGhlIGxvY2sg ZHVyaW5nIGFuIG9wZXJhdGlvbiwgdGhlbiB0aGUgbWFwbGUgc3RhdGUNCittdXN0IGJlIHBhdXNl ZCB1c2luZyBtYXNfcGF1c2UoKS4NCisNCitUaGVyZSBhcmUgYSBmZXcgZXh0cmEgaW50ZXJmYWNl cyBwcm92aWRlZCB3aGVuIHVzaW5nIGFuIGFsbG9jYXRpb24gdHJlZS4NCitJZiB5b3Ugd2lzaCB0 byBzZWFyY2ggZm9yIGEgZ2FwIHdpdGhpbiBhIHJhbmdlLCB0aGVuIG1hc19lbXB0eV9hcmVhKCkN CitvciBtYXNfZW1wdHlfYXJlYV9yZXYoKSBjYW4gYmUgdXNlZC4gIG1hc19lbXB0eV9hcmVhKCkg c2VhcmNoZXMgZm9yIGEgZ2FwDQorc3RhcnRpbmcgYXQgdGhlIGxvd2VzdCBpbmRleCBnaXZlbiB1 cCB0byB0aGUgbWF4aW11bSBvZiB0aGUgcmFuZ2UuDQorbWFzX2VtcHR5X2FyZWFfcmV2KCkgc2Vh cmNoZXMgZm9yIGEgZ2FwIHN0YXJ0aW5nIGF0IHRoZSBoaWdoZXN0IGluZGV4IGdpdmVuDQorYW5k IGNvbnRpbnVlcyBkb3dud2FyZCB0byB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLg0KKw0K Ky4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWFsbG9jOg0KKw0KK0FkdmFuY2VkIEFsbG9jYXRpbmcg Tm9kZXMNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorQWxsb2NhdGlvbnMgYXJlIHVz dWFsbHkgaGFuZGxlZCBpbnRlcm5hbGx5IHRvIHRoZSB0cmVlLCBob3dldmVyIGlmIGFsbG9jYXRp b25zDQorbmVlZCB0byBvY2N1ciBiZWZvcmUgYSB3cml0ZSBvY2N1cnMgdGhlbiBjYWxsaW5nIG1h c19leHBlY3RlZF9lbnRyaWVzKCkgd2lsbA0KK2FsbG9jYXRlIHRoZSB3b3JzdC1jYXNlIG51bWJl ciBvZiBuZWVkZWQgbm9kZXMgdG8gaW5zZXJ0IHRoZSBwcm92aWRlZCBudW1iZXIgb2YNCityYW5n ZXMuICBUaGlzIGFsc28gY2F1c2VzIHRoZSB0cmVlIHRvIGVudGVyIG1hc3MgaW5zZXJ0aW9uIG1v ZGUuICBPbmNlDQoraW5zZXJ0aW9ucyBhcmUgY29tcGxldGUgY2FsbGluZyBtYXNfZGVzdHJveSgp IG9uIHRoZSBtYXBsZSBzdGF0ZSB3aWxsIGZyZWUgdGhlDQordW51c2VkIGFsbG9jYXRpb25zLg0K Kw0KKy4uIF9tYXBsZS10cmVlLWFkdmFuY2VkLWxvY2tzOg0KKw0KK0FkdmFuY2VkIExvY2tpbmcN CistLS0tLS0tLS0tLS0tLS0tDQorDQorVGhlIG1hcGxlIHRyZWUgdXNlcyBhIHNwaW5sb2NrIGJ5 IGRlZmF1bHQsIGJ1dCBleHRlcm5hbCBsb2NrcyBjYW4gYmUgdXNlZCBmb3INCit0cmVlIHVwZGF0 ZXMgYXMgd2VsbC4gIFRvIHVzZSBhbiBleHRlcm5hbCBsb2NrLCB0aGUgdHJlZSBtdXN0IGJlIGlu aXRpYWxpemVkDQord2l0aCB0aGUgYGBNVF9GTEFHU19MT0NLX0VYVEVSTiBmbGFnYGAsIHRoaXMg aXMgdXN1YWxseSBkb25lIHdpdGggdGhlDQorTVRSRUVfSU5JVF9FWFQoKSAjZGVmaW5lLCB3aGlj aCB0YWtlcyBhbiBleHRlcm5hbCBsb2NrIGFzIGFuIGFyZ3VtZW50Lg0KKw0KK0Z1bmN0aW9ucyBh bmQgc3RydWN0dXJlcw0KKz09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKy4uIGtlcm5lbC1k b2M6OiBpbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KKy4uIGtlcm5lbC1kb2M6OiBsaWIvbWFw bGVfdHJlZS5jDQorDQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUw0KaW5k ZXggZmQ3NjhkNDNlMDQ4Li4zN2QwNjk0NjNmYzMgMTAwNjQ0DQotLS0gYS9NQUlOVEFJTkVSUw0K KysrIGIvTUFJTlRBSU5FUlMNCkBAIC0xMTY1OCw2ICsxMTY1OCwxOCBAQCBMOglsaW51eC1tYW5A dmdlci5rZXJuZWwub3JnDQogUzoJTWFpbnRhaW5lZA0KIFc6CWh0dHA6Ly93d3cua2VybmVsLm9y Zy9kb2MvbWFuLXBhZ2VzDQogDQorTUFQTEUgVFJFRQ0KK006CUxpYW0gUi4gSG93bGV0dCA8TGlh bS5Ib3dsZXR0QG9yYWNsZS5jb20+DQorTDoJbGludXgtbW1Aa3ZhY2sub3JnDQorUzoJU3VwcG9y dGVkDQorRjoJRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdA0KK0Y6CWluY2x1 ZGUvbGludXgvbWFwbGVfdHJlZS5oDQorRjoJaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJl ZS5oDQorRjoJbGliL21hcGxlX3RyZWUuYw0KK0Y6CWxpYi90ZXN0X21hcGxlX3RyZWUuYw0KK0Y6 CXRvb2xzL3Rlc3RpbmcvX2FkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCitGOgl0b29scy90 ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KKw0KIE1BUkRVSyAoQ1JFQVRPUiBDSTQwKSBERVZJ Q0UgVFJFRSBTVVBQT1JUDQogTToJUmFodWwgQmVkYXJrYXIgPHJhaHVsYmVkYXJrYXI4OUBnbWFp bC5jb20+DQogTDoJbGludXgtbWlwc0B2Z2VyLmtlcm5lbC5vcmcNCmRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L21hcGxlX3RyZWUuaCBiL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQpuZXcg ZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi44ZjRkODcxMjlhM2UNCi0tLSAv ZGV2L251bGwNCisrKyBiL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDY4 MiBAQA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKyAqLw0KKyNpZm5kZWYg X0xJTlVYX01BUExFX1RSRUVfSA0KKyNkZWZpbmUgX0xJTlVYX01BUExFX1RSRUVfSA0KKy8qDQor ICogTWFwbGUgVHJlZSAtIEFuIFJDVS1zYWZlIGFkYXB0aXZlIHRyZWUgZm9yIHN0b3JpbmcgcmFu Z2VzDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlDQorICogQXV0aG9yczogICAg IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQorICogICAgICAgICAg ICAgIE1hdHRoZXcgV2lsY294IDx3aWxseUBpbmZyYWRlYWQub3JnPg0KKyAqLw0KKw0KKyNpbmNs dWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4NCisjaW5j bHVkZSA8bGludXgvc3BpbmxvY2suaD4NCisvKiAjZGVmaW5lIENPTkZJR19NQVBMRV9SQ1VfRElT QUJMRUQgKi8NCisvKiAjZGVmaW5lIENPTkZJR19ERUJVR19NQVBMRV9UUkVFX1ZFUkJPU0UgKi8N CisNCisvKg0KKyAqIEFsbG9jYXRlZCBub2RlcyBhcmUgbXV0YWJsZSB1bnRpbCB0aGV5IGhhdmUg YmVlbiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLA0KKyAqIGF0IHdoaWNoIHRpbWUgdGhleSBjYW5u b3QgY2hhbmdlIHRoZWlyIHR5cGUgdW50aWwgdGhleSBoYXZlIGJlZW4gcmVtb3ZlZA0KKyAqIGZy b20gdGhlIHRyZWUgYW5kIGFuIFJDVSBncmFjZSBwZXJpb2QgaGFzIHBhc3NlZC4NCisgKg0KKyAq IFJlbW92ZWQgbm9kZXMgaGF2ZSB0aGVpciAtPnBhcmVudCBzZXQgdG8gcG9pbnQgdG8gdGhlbXNl bHZlcy4gIFJDVSByZWFkZXJzDQorICogY2hlY2sgLT5wYXJlbnQgYmVmb3JlIHJlbHlpbmcgb24g dGhlIHZhbHVlIHRoYXQgdGhleSBsb2FkZWQgZnJvbSB0aGUNCisgKiBzbG90cyBhcnJheS4gIFRo aXMgbGV0cyB1cyByZXVzZSB0aGUgc2xvdHMgYXJyYXkgZm9yIHRoZSBSQ1UgaGVhZC4NCisgKg0K KyAqIE5vZGVzIGluIHRoZSB0cmVlIHBvaW50IHRvIHRoZWlyIHBhcmVudCB1bmxlc3MgYml0IDAg aXMgc2V0Lg0KKyAqLw0KKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChCVUlM RF9WRFNPMzJfNjQpDQorLyogNjRiaXQgc2l6ZXMgKi8NCisjZGVmaW5lIE1BUExFX05PREVfU0xP VFMJMzEJLyogMjU2IGJ5dGVzIGluY2x1ZGluZyAtPnBhcmVudCAqLw0KKyNkZWZpbmUgTUFQTEVf UkFOR0U2NF9TTE9UUwkxNgkvKiAyNTYgYnl0ZXMgKi8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0 X1NMT1RTCTEwCS8qIDI0MCBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfTUVUQV9N QVgJMTUJLyogT3V0IG9mIHJhbmdlIGZvciBtZXRhZGF0YSAqLw0KKyNkZWZpbmUgTUFQTEVfQUxM T0NfU0xPVFMJKE1BUExFX05PREVfU0xPVFMgLSAxKQ0KKyNlbHNlDQorLyogMzJiaXQgc2l6ZXMg Ki8NCisjZGVmaW5lIE1BUExFX05PREVfU0xPVFMJNjMJLyogMjU2IGJ5dGVzIGluY2x1ZGluZyAt PnBhcmVudCAqLw0KKyNkZWZpbmUgTUFQTEVfUkFOR0U2NF9TTE9UUwkzMgkvKiAyNTYgYnl0ZXMg Ki8NCisjZGVmaW5lIE1BUExFX0FSQU5HRTY0X1NMT1RTCTIxCS8qIDI0MCBieXRlcyAqLw0KKyNk ZWZpbmUgTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgJMjIJLyogT3V0IG9mIHJhbmdlIGZvciBtZXRh ZGF0YSAqLw0KKyNkZWZpbmUgTUFQTEVfQUxMT0NfU0xPVFMJKE1BUExFX05PREVfU0xPVFMgLSAy KQ0KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR182NEJJVCkgfHwgZGVmaW5lZChCVUlMRF9WRFNP MzJfNjQpICovDQorDQorI2RlZmluZSBNQVBMRV9OT0RFX01BU0sJCTI1NVVMDQorDQorLyoNCisg KiBUaGUgbm9kZS0+cGFyZW50IG9mIHRoZSByb290IG5vZGUgaGFzIGJpdCAwIHNldCBhbmQgdGhl IHJlc3Qgb2YgdGhlIHBvaW50ZXINCisgKiBpcyBhIHBvaW50ZXIgdG8gdGhlIHRyZWUgaXRzZWxm LiAgTm8gbW9yZSBiaXRzIGFyZSBhdmFpbGFibGUgaW4gdGhpcyBwb2ludGVyDQorICogKG9uIG02 OGssIHRoZSBkYXRhIHN0cnVjdHVyZSBtYXkgb25seSBiZSAyLWJ5dGUgYWxpZ25lZCkuDQorICoN CisgKiBJbnRlcm5hbCBub24tcm9vdCBub2RlcyBjYW4gb25seSBoYXZlIG1hcGxlX3JhbmdlXyog bm9kZXMgYXMgcGFyZW50cy4gIFRoZQ0KKyAqIHBhcmVudCBwb2ludGVyIGlzIDI1NkIgYWxpZ25l ZCBsaWtlIGFsbCBvdGhlciB0cmVlIG5vZGVzLiAgV2hlbiBzdG9yaW5nIGEgMzINCisgKiBvciA2 NCBiaXQgdmFsdWVzLCB0aGUgb2Zmc2V0IGNhbiBmaXQgaW50byA0IGJpdHMuICBUaGUgMTYgYml0 IHZhbHVlcyBuZWVkIGFuDQorICogZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBvZmZzZXQuICBUaGlz IGV4dHJhIGJpdCBjb21lcyBmcm9tIGEgcmV1c2Ugb2YgdGhlIGxhc3QNCisgKiBiaXQgaW4gdGhl IG5vZGUgdHlwZS4gIFRoaXMgaXMgcG9zc2libGUgYnkgdXNpbmcgYml0IDEgdG8gaW5kaWNhdGUg aWYgYml0IDINCisgKiBpcyBwYXJ0IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90Lg0KKyAqDQorICog T25jZSB0aGUgdHlwZSBpcyBkZWNpZGVkLCB0aGUgZGVjaXNpb24gb2YgYW4gYWxsb2NhdGlvbiBy YW5nZSB0eXBlIG9yIGEgcmFuZ2UNCisgKiB0eXBlIGlzIGRvbmUgYnkgZXhhbWluaW5nIHRoZSBp bW11dGFibGUgdHJlZSBmbGFnIGZvciB0aGUgTUFQTEVfQUxMT0NfUkFOR0UNCisgKiBmbGFnLg0K KyAqDQorICogIE5vZGUgdHlwZXM6DQorICogICAweD8/MSA9IFJvb3QNCisgKiAgIDB4PzAwID0g MTYgYml0IG5vZGVzDQorICogICAweDAxMCA9IDMyIGJpdCBub2Rlcw0KKyAqICAgMHgxMTAgPSA2 NCBiaXQgbm9kZXMNCisgKg0KKyAqICBTbG90IHNpemUgYW5kIGxvY2F0aW9uIGluIHRoZSBwYXJl bnQgcG9pbnRlcjoNCisgKiAgIHR5cGUgIDogc2xvdCBsb2NhdGlvbg0KKyAqICAgMHg/PzEgOiBS b290DQorICogICAweD8wMCA6IDE2IGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0xLCBzbG90IGluIDIt Ng0KKyAqICAgMHgwMTAgOiAzMiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYN CisgKiAgIDB4MTEwIDogNjQgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQor ICovDQordHlwZWRlZiBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1hcGxlX2Vub2RlOyAvKiBlbmNvZGVk IG5vZGUgKi8NCit0eXBlZGVmIHN0cnVjdCBtYXBsZV9wbm9kZSAqbWFwbGVfcG5vZGU7IC8qIHBh cmVudCBub2RlICovDQorDQorLyoNCisgKiBUaGlzIG1ldGFkYXRhIGlzIHVzZWQgdG8gb3B0aW1p emUgdGhlIGdhcCB1cGRhdGluZyBjb2RlIGFuZCBpbiByZXZlcnNlDQorICogc2VhcmNoaW5nIGZv ciBnYXBzIG9yIGFueSBvdGhlciBjb2RlIHRoYXQgbmVlZHMgdG8gZmluZCB0aGUgZW5kIG9mIHRo ZSBkYXRhLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9tZXRhZGF0YSB7DQorCXVuc2lnbmVkIGNoYXIg ZW5kOw0KKwl1bnNpZ25lZCBjaGFyIGdhcDsNCit9Ow0KKw0KKy8qDQorICogTGVhZiBub2RlcyBk byBub3Qgc3RvcmUgcG9pbnRlcnMgdG8gbm9kZXMsIHRoZXkgc3RvcmUgdXNlciBkYXRhLiAgVXNl cnMgbWF5DQorICogc3RvcmUgYWxtb3N0IGFueSBiaXQgcGF0dGVybi4gIEFzIG5vdGVkIGFib3Zl LCB0aGUgb3B0aW1pc2F0aW9uIG9mIHN0b3JpbmcgYW4NCisgKiBlbnRyeSBhdCAwIGluIHRoZSBy b290IHBvaW50ZXIgY2Fubm90IGJlIGRvbmUgZm9yIGRhdGEgd2hpY2ggaGF2ZSB0aGUgYm90dG9t DQorICogdHdvIGJpdHMgc2V0IHRvICcxMCcuICBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdpdGgg dGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8NCisgKiAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2 IChpZSAyLCA2LCAxMCAuLiA0MDk0KSBmb3IgaW50ZXJuYWwgdXNlLiAgU29tZSBBUElzDQorICog cmV0dXJuIGVycm5vcyBhcyBhIG5lZ2F0aXZlIGVycm5vIHNoaWZ0ZWQgcmlnaHQgYnkgdHdvIGJp dHMgYW5kIHRoZSBib3R0b20NCisgKiB0d28gYml0cyBzZXQgdG8gJzEwJywgYW5kIHdoaWxlIGNo b29zaW5nIHRvIHN0b3JlIHRoZXNlIHZhbHVlcyBpbiB0aGUgYXJyYXkNCisgKiBpcyBub3QgYW4g ZXJyb3IsIGl0IG1heSBsZWFkIHRvIGNvbmZ1c2lvbiBpZiB5b3UncmUgdGVzdGluZyBmb3IgYW4g ZXJyb3Igd2l0aA0KKyAqIG1hc19pc19lcnIoKS4NCisgKg0KKyAqIE5vbi1sZWFmIG5vZGVzIHN0 b3JlIHRoZSB0eXBlIG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gKGVudW0gbWFwbGVfdHlwZSBpbiBi aXRzDQorICogMy02KSwgYml0IDIgaXMgcmVzZXJ2ZWQuICBUaGF0IGxlYXZlcyBiaXRzIDAtMSB1 bnVzZWQgZm9yIG5vdy4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMg YXJlIGNhbGxlZCBrZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRl IHRoYXQgdGhlIHRyZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBp biB0aGUNCisgKiBzdWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdo ZXJlYXMga2V5cyBhcmUgdW5pcXVlIHRvIGENCisgKiBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIEIt dHJlZS4gIFBpdm90IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBzbG90IHdpdGgNCisgKiB0 aGUgc2FtZSBpbmRleC4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgew0KKwlzdHJ1 Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9SQU5H RTY0X1NMT1RTIC0gMV07DQorCXVuaW9uIHsNCisJCXZvaWQgX19yY3UgKnNsb3RbTUFQTEVfUkFO R0U2NF9TTE9UU107DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgX19yY3UgKnBhZFtNQVBMRV9SQU5H RTY0X1NMT1RTIC0gMV07DQorCQkJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorCQl9Ow0K Kwl9Ow0KK307DQorDQorLyoNCisgKiBBdCB0cmVlIGNyZWF0aW9uIHRpbWUsIHRoZSB1c2VyIGNh biBzcGVjaWZ5IHRoYXQgdGhleSdyZSB3aWxsaW5nIHRvIHRyYWRlIG9mZg0KKyAqIHN0b3Jpbmcg ZmV3ZXIgZW50cmllcyBpbiBhIHRyZWUgaW4gcmV0dXJuIGZvciBzdG9yaW5nIG1vcmUgaW5mb3Jt YXRpb24gaW4NCisgKiBlYWNoIG5vZGUuDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSBzdXBwb3J0 cyByZWNvcmRpbmcgdGhlIGxhcmdlc3QgcmFuZ2Ugb2YgTlVMTCBlbnRyaWVzIGF2YWlsYWJsZQ0K KyAqIGluIHRoaXMgbm9kZSwgYWxzbyBjYWxsZWQgZ2Fwcy4gIFRoaXMgb3B0aW1pc2VzIHRoZSB0 cmVlIGZvciBhbGxvY2F0aW5nIGENCisgKiByYW5nZS4NCisgKi8NCitzdHJ1Y3QgbWFwbGVfYXJh bmdlXzY0IHsNCisJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcg cGl2b3RbTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxXTsNCisJdm9pZCBfX3JjdSAqc2xvdFtNQVBM RV9BUkFOR0U2NF9TTE9UU107DQorCXVuc2lnbmVkIGxvbmcgZ2FwW01BUExFX0FSQU5HRTY0X1NM T1RTXTsNCisJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorfTsNCisNCitzdHJ1Y3QgbWFw bGVfYWxsb2Mgew0KKwl1bnNpZ25lZCBsb25nIHRvdGFsOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVf Y291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0X2NvdW50Ow0KKwlzdHJ1Y3QgbWFwbGVfYWxs b2MgKnNsb3RbTUFQTEVfQUxMT0NfU0xPVFNdOw0KK307DQorDQorc3RydWN0IG1hcGxlX3RvcGlh cnkgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpuZXh0OyAvKiBPdmVybGFwcyB0aGUgcGl2b3QgKi8NCit9Ow0KKw0KK2VudW0gbWFwbGVfdHlw ZSB7DQorCW1hcGxlX2RlbnNlLA0KKwltYXBsZV9sZWFmXzY0LA0KKwltYXBsZV9yYW5nZV82NCwN CisJbWFwbGVfYXJhbmdlXzY0LA0KK307DQorDQorDQorLyoqDQorICogRE9DOiBNYXBsZSB0cmVl IGZsYWdzDQorICoNCisgKiAqIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCS0gVHJhY2sgZ2FwcyBpbiB0 aGlzIHRyZWUNCisgKiAqIE1UX0ZMQUdTX1VTRV9SQ1UJCS0gT3BlcmF0ZSBpbiBSQ1UgbW9kZQ0K KyAqICogTVRfRkxBR1NfSEVJR0hUX09GRlNFVAktIFRoZSBwb3NpdGlvbiBvZiB0aGUgdHJlZSBo ZWlnaHQgaW4gdGhlIGZsYWdzDQorICogKiBNVF9GTEFHU19IRUlHSFRfTUFTSwktIFRoZSBtYXNr IGZvciB0aGUgbWFwbGUgdHJlZSBoZWlnaHQgdmFsdWUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfTUFT SwkJLSBIb3cgdGhlIG10X2xvY2sgaXMgdXNlZA0KKyAqICogTVRfRkxBR1NfTE9DS19JUlEJCS0g QWNxdWlyZWQgaXJxLXNhZmUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfQkgJCS0gQWNxdWlyZWQgYmgt c2FmZQ0KKyAqICogTVRfRkxBR1NfTE9DS19FWFRFUk4JLSBtdF9sb2NrIGlzIG5vdCB1c2VkDQor ICoNCisgKiBNQVBMRV9IRUlHSFRfTUFYCVRoZSBsYXJnZXN0IGhlaWdodCB0aGF0IGNhbiBiZSBz dG9yZWQNCisgKi8NCisjZGVmaW5lIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCTB4MDENCisjZGVmaW5l IE1UX0ZMQUdTX1VTRV9SQ1UJMHgwMg0KKyNkZWZpbmUgTVRfRkxBR1NfSEVJR0hUX09GRlNFVAkw eDAyDQorI2RlZmluZSBNVF9GTEFHU19IRUlHSFRfTUFTSwkweDdDDQorI2RlZmluZSBNVF9GTEFH U19MT0NLX01BU0sJMHgzMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfSVJRCTB4MTAwDQorI2Rl ZmluZSBNVF9GTEFHU19MT0NLX0JICTB4MjAwDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX0VYVEVS TgkweDMwMA0KKw0KKyNkZWZpbmUgTUFQTEVfSEVJR0hUX01BWAkzMQ0KKw0KKw0KKyNkZWZpbmUg TUFQTEVfTk9ERV9UWVBFX01BU0sJMHgwRg0KKyNkZWZpbmUgTUFQTEVfTk9ERV9UWVBFX1NISUZU CTB4MDMNCisNCisjZGVmaW5lIE1BUExFX1JFU0VSVkVEX1JBTkdFCTQwOTYNCisNCisjaWZkZWYg Q09ORklHX0xPQ0tERVANCit0eXBlZGVmIHN0cnVjdCBsb2NrZGVwX21hcCAqbG9ja2RlcF9tYXBf cDsNCisjZGVmaW5lIG10X2xvY2tfaXNfaGVsZChtdCkJbG9ja19pc19oZWxkKG10LT5tYV9leHRl cm5hbF9sb2NrKQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCQkJCQlc DQorCShtdCktPm1hX2V4dGVybmFsX2xvY2sgPSAmKGxvY2spLT5kZXBfbWFwOw0KKyNlbHNlDQor dHlwZWRlZiBzdHJ1Y3QgeyAvKiBub3RoaW5nICovIH0gbG9ja2RlcF9tYXBfcDsNCisjZGVmaW5l IG10X2xvY2tfaXNfaGVsZChtdCkJMQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQs IGxvY2spCWRvIHsgfSB3aGlsZSAoMCkNCisjZW5kaWYNCisNCisvKg0KKyAqIElmIHRoZSB0cmVl IGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGF0IGluZGV4IDAsIGl0IGlzIHVzdWFsbHkgc3RvcmVk IGluDQorICogdHJlZS0+bWFfcm9vdC4gIFRvIG9wdGltaXNlIGZvciB0aGUgcGFnZSBjYWNoZSwg YW4gZW50cnkgd2hpY2ggZW5kcyBpbiAnMDAnLA0KKyAqICcwMScgb3IgJzExJyBpcyBzdG9yZWQg aW4gdGhlIHJvb3QsIGJ1dCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcxMCcgd2lsbCBiZQ0KKyAq IHN0b3JlZCBpbiBhIG5vZGUuICBCaXRzIDMtNiBhcmUgdXNlZCB0byBzdG9yZSBlbnVtIG1hcGxl X3R5cGUuDQorICoNCisgKiBUaGUgZmxhZ3MgYXJlIHVzZWQgYm90aCB0byBzdG9yZSBzb21lIGlt bXV0YWJsZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRyZWUNCisgKiAoc2V0IGF0IHRyZWUgY3Jl YXRpb24gdGltZSkgYW5kIGR5bmFtaWMgaW5mb3JtYXRpb24gc2V0IHVuZGVyIHRoZSBzcGlubG9j ay4NCisgKg0KKyAqIEFub3RoZXIgdXNlIG9mIGZsYWdzIGFyZSB0byBpbmRpY2F0ZSBnbG9iYWwg c3RhdGVzIG9mIHRoZSB0cmVlLiAgVGhpcyBpcyB0aGUNCisgKiBjYXNlIHdpdGggdGhlIE1BUExF X1VTRV9SQ1UgZmxhZywgd2hpY2ggaW5kaWNhdGVzIHRoZSB0cmVlIGlzIGN1cnJlbnRseSBpbg0K KyAqIFJDVSBtb2RlLiAgVGhpcyBtb2RlIHdhcyBhZGRlZCB0byBhbGxvdyB0aGUgdHJlZSB0byBy ZXVzZSBub2RlcyBpbnN0ZWFkIG9mDQorICogcmUtYWxsb2NhdGluZyBhbmQgUkNVIGZyZWVpbmcg bm9kZXMgd2hlbiB0aGVyZSBpcyBhIHNpbmdsZSB1c2VyLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV90 cmVlIHsNCisJdW5pb24gew0KKwkJc3BpbmxvY2tfdAltYV9sb2NrOw0KKwkJbG9ja2RlcF9tYXBf cAltYV9leHRlcm5hbF9sb2NrOw0KKwl9Ow0KKwl2b2lkIF9fcmN1ICAgICAgKm1hX3Jvb3Q7DQor CXVuc2lnbmVkIGludAltYV9mbGFnczsNCit9Ow0KKw0KKy8qKg0KKyAqIE1UUkVFX0lOSVQoKSAt IEluaXRpYWxpemUgYSBtYXBsZSB0cmVlDQorICogQG5hbWU6IFRoZSBtYXBsZSB0cmVlIG5hbWUN CisgKiBAZmxhZ3M6IFRoZSBtYXBsZSB0cmVlIGZsYWdzDQorICoNCisgKi8NCisjZGVmaW5lIE1U UkVFX0lOSVQobmFtZSwgZmxhZ3MpIHsJCQkJCVwNCisJLm1hX2xvY2sgPSBfX1NQSU5fTE9DS19V TkxPQ0tFRChuYW1lLm1hX2xvY2spLAkJCVwNCisJLm1hX2ZsYWdzID0gZmxhZ3MsCQkJCQkJXA0K KwkubWFfcm9vdCA9IE5VTEwsCQkJCQkJXA0KK30NCisNCisvKioNCisgKiBNVFJFRV9JTklUX0VY VCgpIC0gSW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUgd2l0aCBhbiBleHRlcm5hbCBsb2NrLg0KKyAq IEBuYW1lOiBUaGUgdHJlZSBuYW1lDQorICogQGZsYWdzOiBUaGUgbWFwbGUgdHJlZSBmbGFncw0K KyAqIEBsb2NrOiBUaGUgZXh0ZXJuYWwgbG9jaw0KKyAqLw0KKyNpZmRlZiBDT05GSUdfTE9DS0RF UA0KKyNkZWZpbmUgTVRSRUVfSU5JVF9FWFQobmFtZSwgZmxhZ3MsIGxvY2spIHsJCQkJXA0KKwku bWFfZXh0ZXJuYWxfbG9jayA9ICYobG9jaykuZGVwX21hcCwJCQkJXA0KKwkubWFfZmxhZ3MgPSBm bGFncywJCQkJCQlcDQorCS5tYV9yb290ID0gTlVMTCwJCQkJCQlcDQorfQ0KKyNlbHNlDQorI2Rl ZmluZSBNVFJFRV9JTklUX0VYVChuYW1lLCBmbGFncywgbG9jaykJTVRSRUVfSU5JVChuYW1lLCBm bGFncykNCisjZW5kaWYNCisNCisjZGVmaW5lIERFRklORV9NVFJFRShuYW1lKQkJCQkJCVwNCisJ c3RydWN0IG1hcGxlX3RyZWUgbmFtZSA9IE1UUkVFX0lOSVQobmFtZSwgMCkNCisNCisjZGVmaW5l IG10cmVlX2xvY2sobXQpCQlzcGluX2xvY2soKCYobXQpLT5tYV9sb2NrKSkNCisjZGVmaW5lIG10 cmVlX3VubG9jayhtdCkJc3Bpbl91bmxvY2soKCYobXQpLT5tYV9sb2NrKSkNCisNCisvKg0KKyAq IFRoZSBNYXBsZSBUcmVlIHNxdWVlemVzIHZhcmlvdXMgYml0cyBpbiBhdCB2YXJpb3VzIHBvaW50 cyB3aGljaCBhcmVuJ3QNCisgKiBuZWNlc3NhcmlseSBvYnZpb3VzLiAgVXN1YWxseSwgdGhpcyBp cyBkb25lIGJ5IG9ic2VydmluZyB0aGF0IHBvaW50ZXJzIGFyZQ0KKyAqIE4tYnl0ZSBhbGlnbmVk IGFuZCB0aHVzIHRoZSBib3R0b20gbG9nXzIoTikgYml0cyBhcmUgYXZhaWxhYmxlIGZvciB1c2Uu ICBXZQ0KKyAqIGRvbid0IHVzZSB0aGUgaGlnaCBiaXRzIG9mIHBvaW50ZXJzIHRvIHN0b3JlIGFk ZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVjYXVzZQ0KKyAqIHdlIGRvbid0IGtub3cgd2hhdCBiaXRz IGFyZSB1bnVzZWQgb24gYW55IGdpdmVuIGFyY2hpdGVjdHVyZS4NCisgKg0KKyAqIE5vZGVzIGFy ZSAyNTYgYnl0ZXMgaW4gc2l6ZSBhbmQgYXJlIGFsc28gYWxpZ25lZCB0byAyNTYgYnl0ZXMsIGdp dmluZyB1cyA4DQorICogbG93IGJpdHMgZm9yIG91ciBvd24gcHVycG9zZXMuICBOb2RlcyBhcmUg Y3VycmVudGx5IG9mIDQgdHlwZXM6DQorICogMS4gU2luZ2xlIHBvaW50ZXIgKFJhbmdlIGlzIDAt MCkNCisgKiAyLiBOb24tbGVhZiBBbGxvY2F0aW9uIFJhbmdlIG5vZGVzDQorICogMy4gTm9uLWxl YWYgUmFuZ2Ugbm9kZXMNCisgKiA0LiBMZWFmIFJhbmdlIG5vZGVzIEFsbCBub2RlcyBjb25zaXN0 IG9mIGEgbnVtYmVyIG9mIG5vZGUgc2xvdHMsDQorICogICAgcGl2b3RzLCBhbmQgYSBwYXJlbnQg cG9pbnRlci4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfbm9kZSB7DQorCXVuaW9uIHsNCisJCXN0 cnVjdCB7DQorCQkJc3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCQkJdm9pZCBfX3JjdSAq c2xvdFtNQVBMRV9OT0RFX1NMT1RTXTsNCisJCX07DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgKnBh ZDsNCisJCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1Ow0KKwkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGl2 X3BhcmVudDsNCisJCQl1bnNpZ25lZCBjaGFyIHBhcmVudF9zbG90Ow0KKwkJCWVudW0gbWFwbGVf dHlwZSB0eXBlOw0KKwkJCXVuc2lnbmVkIGNoYXIgc2xvdF9sZW47DQorCQkJdW5zaWduZWQgaW50 IG1hX2ZsYWdzOw0KKwkJfTsNCisJCXN0cnVjdCBtYXBsZV9yYW5nZV82NCBtcjY0Ow0KKwkJc3Ry dWN0IG1hcGxlX2FyYW5nZV82NCBtYTY0Ow0KKwkJc3RydWN0IG1hcGxlX2FsbG9jIGFsbG9jOw0K Kwl9Ow0KK307DQorDQorLyoNCisgKiBNb3JlIGNvbXBsaWNhdGVkIHN0b3JlcyBjYW4gY2F1c2Ug dHdvIG5vZGVzIHRvIGJlY29tZSBvbmUgb3IgdGhyZWUgYW5kDQorICogcG90ZW50aWFsbHkgYWx0 ZXIgdGhlIGhlaWdodCBvZiB0aGUgdHJlZS4gIEVpdGhlciBoYWxmIG9mIHRoZSB0cmVlIG1heSBu ZWVkDQorICogdG8gYmUgcmViYWxhbmNlZCBhZ2FpbnN0IHRoZSBvdGhlci4gIFRoZSBtYV90b3Bp YXJ5IHN0cnVjdCBpcyB1c2VkIHRvIHRyYWNrDQorICogd2hpY2ggbm9kZXMgaGF2ZSBiZWVuICdj dXQnIGZyb20gdGhlIHRyZWUgc28gdGhhdCB0aGUgY2hhbmdlIGNhbiBiZSBkb25lDQorICogc2Fm ZWx5IGF0IGEgbGF0ZXIgZGF0ZS4gIFRoaXMgaXMgZG9uZSB0byBzdXBwb3J0IFJDVS4NCisgKi8N CitzdHJ1Y3QgbWFfdG9waWFyeSB7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqaGVhZDsNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICp0YWlsOw0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSAqbXRyZWU7DQorfTsN CisNCit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyBpbmRleCk7DQorDQoraW50IG10cmVlX2luc2VydChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgaW5kZXgsDQorCQl2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRy ZWVfaW5zZXJ0X3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBmaXJz dCwNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCwgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQoraW50 IG10cmVlX2FsbG9jX3JhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAq c3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9u ZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVfYWxs b2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqc3RhcnRwLA0K KwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBtaW4sDQor CQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKTsNCisNCitpbnQgbXRyZWVfc3RvcmVfcmFu Z2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJICAgICAg dW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVf c3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LA0KKwkJdm9p ZCAqZW50cnksIGdmcF90IGdmcCk7DQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0IG1hcGxlX3Ry ZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCit2b2lkIG10cmVlX2Rlc3Ryb3koc3Ry dWN0IG1hcGxlX3RyZWUgKm10KTsNCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2VtcHR5KCkgLSBEZXRlcm1pbmUgaWYgYSB0cmVl IGhhcyBhbnkgcHJlc2VudCBlbnRyaWVzLg0KKyAqIEBtdDogTWFwbGUgVHJlZS4NCisgKg0KKyAq IENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqIFJldHVybjogJXRydWUgaWYgdGhlIHRyZWUgY29u dGFpbnMgb25seSBOVUxMIHBvaW50ZXJzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdHJl ZV9lbXB0eShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXQtPm1h X3Jvb3QgPT0gTlVMTDsNCit9DQorDQorLyogQWR2YW5jZWQgQVBJICovDQorDQorLyoNCisgKiBU aGUgbWFwbGUgc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgc3RydWN0IG1hX3N0YXRlIGFuZCBpcyB1 c2VkIHRvIGtlZXAgdHJhY2sNCisgKiBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgb3BlcmF0aW9ucywg YW5kIGV2ZW4gYmV0d2VlbiBvcGVyYXRpb25zIHdoZW4gdXNpbmcgdGhlDQorICogYWR2YW5jZWQg QVBJLg0KKyAqDQorICogSWYgc3RhdGUtPm5vZGUgaGFzIGJpdCAwIHNldCB0aGVuIGl0IHJlZmVy ZW5jZXMgYSB0cmVlIGxvY2F0aW9uIHdoaWNoIGlzIG5vdA0KKyAqIGEgbm9kZSAoZWcgdGhlIHJv b3QpLiAgSWYgYml0IDEgaXMgc2V0LCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgYSBuZWdhdGl2 ZQ0KKyAqIGVycm5vLiAgQml0IDIgKHRoZSAndW5hbGxvY2F0ZWQgc2xvdHMnIGJpdCkgaXMgY2xl YXIuICBCaXRzIDMtNiBpbmRpY2F0ZSB0aGUNCisgKiBub2RlIHR5cGUuDQorICoNCisgKiBzdGF0 ZS0+YWxsb2MgZWl0aGVyIGhhcyBhIHJlcXVlc3QgbnVtYmVyIG9mIG5vZGVzIG9yIGFuIGFsbG9j YXRlZCBub2RlLiAgSWYNCisgKiBzdGF0LT5hbGxvYyBoYXMgYSByZXF1ZXN0ZWQgbnVtYmVyIG9m IG5vZGVzLCB0aGUgZmlyc3QgYml0IHdpbGwgYmUgc2V0ICgweDEpDQorICogYW5kIHRoZSByZW1h aW5pbmcgYml0cyBhcmUgdGhlIHZhbHVlLiAgSWYgc3RhdGUtPmFsbG9jIGlzIGEgbm9kZSwgdGhl biB0aGUNCisgKiBub2RlIHdpbGwgYmUgb2YgdHlwZSBtYXBsZV9hbGxvYy4gIG1hcGxlX2FsbG9j IGhhcyBNQVBMRV9OT0RFX1NMT1RTIC0gMSBmb3INCisgKiBzdG9yaW5nIG1vcmUgYWxsb2NhdGVk IG5vZGVzLCBhIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0ZWQsIGFuZCB0aGUNCisgKiBu b2RlX2NvdW50IGluIHRoaXMgbm9kZS4gIG5vZGVfY291bnQgaXMgdGhlIG51bWJlciBvZiBhbGxv Y2F0ZWQgbm9kZXMgaW4gdGhpcw0KKyAqIG5vZGUuICBUaGUgc2NhbGluZyBiZXlvbmQgTUFQTEVf Tk9ERV9TTE9UUyAtIDEgaXMgaGFuZGxlZCBieSBzdG9yaW5nIGZ1cnRoZXINCisgKiBub2RlcyBp bnRvIHN0YXRlLT5hbGxvYy0+c2xvdFswXSdzIG5vZGUuICBOb2RlcyBhcmUgdGFrZW4gZnJvbSBz dGF0ZS0+YWxsb2MNCisgKiBieSByZW1vdmluZyBhIG5vZGUgZnJvbSB0aGUgc3RhdGUtPmFsbG9j IG5vZGUgdW50aWwgc3RhdGUtPmFsbG9jLT5ub2RlX2NvdW50DQorICogaXMgMSwgd2hlbiBzdGF0 ZS0+YWxsb2MgaXMgcmV0dXJuZWQgYW5kIHRoZSBzdGF0ZS0+YWxsb2MtPnNsb3RbMF0gaXMgcHJv bW90ZWQNCisgKiB0byBzdGF0ZS0+YWxsb2MuICBOb2RlcyBhcmUgcHVzaGVkIG9udG8gc3RhdGUt PmFsbG9jIGJ5IHB1dHRpbmcgdGhlIGN1cnJlbnQNCisgKiBzdGF0ZS0+YWxsb2MgaW50byB0aGUg cHVzaGVkIG5vZGUncyBzbG90WzBdLg0KKyAqDQorICogVGhlIHN0YXRlIGFsc28gY29udGFpbnMg dGhlIGltcGxpZWQgbWluL21heCBvZiB0aGUgc3RhdGUtPm5vZGUsIHRoZSBkZXB0aCBvZg0KKyAq IHRoaXMgc2VhcmNoLCBhbmQgdGhlIG9mZnNldC4gVGhlIGltcGxpZWQgbWluL21heCBhcmUgZWl0 aGVyIGZyb20gdGhlIHBhcmVudA0KKyAqIG5vZGUgb3IgYXJlIDAtb28gZm9yIHRoZSByb290IG5v ZGUuICBUaGUgZGVwdGggaXMgaW5jcmVtZW50ZWQgb3IgZGVjcmVtZW50ZWQNCisgKiBldmVyeSB0 aW1lIGEgbm9kZSBpcyB3YWxrZWQgZG93biBvciB1cC4gIFRoZSBvZmZzZXQgaXMgdGhlIHNsb3Qv cGl2b3Qgb2YNCisgKiBpbnRlcmVzdCBpbiB0aGUgbm9kZSAtIGVpdGhlciBmb3IgcmVhZGluZyBv ciB3cml0aW5nLg0KKyAqDQorICogV2hlbiByZXR1cm5pbmcgYSB2YWx1ZSB0aGUgbWFwbGUgc3Rh dGUgaW5kZXggYW5kIGxhc3QgcmVzcGVjdGl2ZWx5IGNvbnRhaW4NCisgKiB0aGUgc3RhcnQgYW5k IGVuZCBvZiB0aGUgcmFuZ2UgZm9yIHRoZSBlbnRyeS4gIFJhbmdlcyBhcmUgaW5jbHVzaXZlIGlu IHRoZQ0KKyAqIE1hcGxlIFRyZWUuDQorICovDQorc3RydWN0IG1hX3N0YXRlIHsNCisJc3RydWN0 IG1hcGxlX3RyZWUgKnRyZWU7CS8qIFRoZSB0cmVlIHdlJ3JlIG9wZXJhdGluZyBpbiAqLw0KKwl1 bnNpZ25lZCBsb25nIGluZGV4OwkJLyogVGhlIGluZGV4IHdlJ3JlIG9wZXJhdGluZyBvbiAtIHJh bmdlIHN0YXJ0ICovDQorCXVuc2lnbmVkIGxvbmcgbGFzdDsJCS8qIFRoZSBsYXN0IGluZGV4IHdl J3JlIG9wZXJhdGluZyBvbiAtIHJhbmdlIGVuZCAqLw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5v ZGU7CS8qIFRoZSBub2RlIGNvbnRhaW5pbmcgdGhpcyBlbnRyeSAqLw0KKwl1bnNpZ25lZCBsb25n IG1pbjsJCS8qIFRoZSBtaW5pbXVtIGluZGV4IG9mIHRoaXMgbm9kZSAtIGltcGxpZWQgcGl2b3Qg bWluICovDQorCXVuc2lnbmVkIGxvbmcgbWF4OwkJLyogVGhlIG1heGltdW0gaW5kZXggb2YgdGhp cyBub2RlIC0gaW1wbGllZCBwaXZvdCBtYXggKi8NCisJc3RydWN0IG1hcGxlX2FsbG9jICphbGxv YzsJLyogQWxsb2NhdGVkIG5vZGVzIGZvciB0aGlzIG9wZXJhdGlvbiAqLw0KKwl1bnNpZ25lZCBj aGFyIGRlcHRoOwkJLyogZGVwdGggb2YgdHJlZSBkZXNjZW50IGR1cmluZyB3cml0ZSAqLw0KKwl1 bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgY2hhciBtYXNfZmxhZ3M7DQorfTsNCisN CitzdHJ1Y3QgbWFfd3Jfc3RhdGUgew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hczsNCisJc3RydWN0 IG1hcGxlX25vZGUgKm5vZGU7CS8qIERlY29kZWQgbWFzLT5ub2RlICovDQorCXVuc2lnbmVkIGxv bmcgcl9taW47CQkvKiByYW5nZSBtaW4gKi8NCisJdW5zaWduZWQgbG9uZyByX21heDsJCS8qIHJh bmdlIG1heCAqLw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsJCS8qIG1hcy0+bm9kZSB0eXBlICov DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0X2VuZDsJLyogVGhlIG9mZnNldCB3aGVyZSB0aGUgd3Jp dGUgZW5kcyAqLw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfZW5kOwkJLyogbWFzLT5ub2RlIGVuZCAq Lw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7CQkvKiBtYXMtPm5vZGUtPnBpdm90cyBwb2ludGVy ICovDQorCXVuc2lnbmVkIGxvbmcgZW5kX3BpdjsJCS8qIFRoZSBwaXZvdCBhdCB0aGUgb2Zmc2V0 IGVuZCAqLw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7CQkvKiBtYXMtPm5vZGUtPnNsb3RzIHBvaW50 ZXIgKi8NCisJdm9pZCAqZW50cnk7CQkJLyogVGhlIGVudHJ5IHRvIHdyaXRlICovDQorCXZvaWQg KmNvbnRlbnQ7CQkJLyogVGhlIGV4aXN0aW5nIGVudHJ5IHRoYXQgaXMgYmVpbmcgb3ZlcndyaXR0 ZW4gKi8NCit9Ow0KKw0KKyNkZWZpbmUgbWFzX2xvY2sobWFzKSAgICAgICAgICAgc3Bpbl9sb2Nr KCYoKG1hcyktPnRyZWUtPm1hX2xvY2spKQ0KKyNkZWZpbmUgbWFzX3VubG9jayhtYXMpICAgICAg ICAgc3Bpbl91bmxvY2soJigobWFzKS0+dHJlZS0+bWFfbG9jaykpDQorDQorDQorLyoNCisgKiBT cGVjaWFsIHZhbHVlcyBmb3IgbWFfc3RhdGUubm9kZS4NCisgKiBNQVNfU1RBUlQgbWVhbnMgd2Ug aGF2ZSBub3Qgc2VhcmNoZWQgdGhlIHRyZWUuDQorICogTUFTX1JPT1QgbWVhbnMgd2UgaGF2ZSBz ZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlIGVudHJ5IHdlIGZvdW5kIGxpdmVzIGluDQorICogdGhl IHJvb3Qgb2YgdGhlIHRyZWUgKGllIGl0IGhhcyBpbmRleCAwLCBsZW5ndGggMSBhbmQgaXMgdGhl IG9ubHkgZW50cnkgaW4NCisgKiB0aGUgdHJlZSkuDQorICogTUFTX05PTkUgbWVhbnMgd2UgaGF2 ZSBzZWFyY2hlZCB0aGUgdHJlZSBhbmQgdGhlcmUgaXMgbm8gbm9kZSBpbiB0aGUNCisgKiB0cmVl IGZvciB0aGlzIGVudHJ5LiAgRm9yIGV4YW1wbGUsIHdlIHNlYXJjaGVkIGZvciBpbmRleCAxIGlu IGFuIGVtcHR5DQorICogdHJlZS4gIE9yIHdlIGhhdmUgYSB0cmVlIHdoaWNoIHBvaW50cyB0byBh IGZ1bGwgbGVhZiBub2RlIGFuZCB3ZQ0KKyAqIHNlYXJjaGVkIGZvciBhbiBlbnRyeSB3aGljaCBp cyBsYXJnZXIgdGhhbiBjYW4gYmUgY29udGFpbmVkIGluIHRoYXQNCisgKiBsZWFmIG5vZGUuDQor ICogTUFfRVJST1IgcmVwcmVzZW50cyBhbiBlcnJuby4gIEFmdGVyIGRyb3BwaW5nIHRoZSBsb2Nr IGFuZCBhdHRlbXB0aW5nDQorICogdG8gcmVzb2x2ZSB0aGUgZXJyb3IsIHRoZSB3YWxrIHdvdWxk IGhhdmUgdG8gYmUgcmVzdGFydGVkIGZyb20gdGhlDQorICogdG9wIG9mIHRoZSB0cmVlIGFzIHRo ZSB0cmVlIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQuDQorICovDQorI2RlZmluZSBNQVNfU1RBUlQJ KChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikxVUwpDQorI2RlZmluZSBNQVNfUk9PVAkoKHN0cnVjdCBt YXBsZV9lbm9kZSAqKTVVTCkNCisjZGVmaW5lIE1BU19OT05FCSgoc3RydWN0IG1hcGxlX2Vub2Rl ICopOVVMKQ0KKyNkZWZpbmUgTUFTX1BBVVNFCSgoc3RydWN0IG1hcGxlX2Vub2RlICopMTdVTCkN CisjZGVmaW5lIE1BX0VSUk9SKGVycikgXA0KKwkJKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikoKCh1 bnNpZ25lZCBsb25nKWVyciA8PCAyKSB8IDJVTCkpDQorDQorI2RlZmluZSBNQV9TVEFURShuYW1l LCBtdCwgZmlyc3QsIGVuZCkJCQkJCVwNCisJc3RydWN0IG1hX3N0YXRlIG5hbWUgPSB7CQkJCQlc DQorCQkudHJlZSA9IG10LAkJCQkJCVwNCisJCS5pbmRleCA9IGZpcnN0LAkJCQkJCVwNCisJCS5s YXN0ID0gZW5kLAkJCQkJCVwNCisJCS5ub2RlID0gTUFTX1NUQVJULAkJCQkJXA0KKwkJLm1pbiA9 IDAsCQkJCQkJXA0KKwkJLm1heCA9IFVMT05HX01BWCwJCQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUg TUFfV1JfU1RBVEUobmFtZSwgbWFfc3RhdGUsIHdyX2VudHJ5KQkJCQlcDQorCXN0cnVjdCBtYV93 cl9zdGF0ZSBuYW1lID0gewkJCQkJXA0KKwkJLm1hcyA9IG1hX3N0YXRlLAkJCQkJXA0KKwkJLmNv bnRlbnQgPSBOVUxMLAkJCQkJXA0KKwkJLmVudHJ5ID0gd3JfZW50cnksCQkJCQlcDQorCX0NCisN CisjZGVmaW5lIE1BX1RPUElBUlkobmFtZSwgdHJlZSkJCQkJCQlcDQorCXN0cnVjdCBtYV90b3Bp YXJ5IG5hbWUgPSB7CQkJCQlcDQorCQkuaGVhZCA9IE5VTEwsCQkJCQkJXA0KKwkJLnRhaWwgPSBO VUxMLAkJCQkJCVwNCisJCS5tdHJlZSA9IHRyZWUsCQkJCQkJXA0KKwl9DQorDQordm9pZCAqbWFz X3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpOw0KK3ZvaWQgKm1hc19zdG9yZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdm9pZCAqZW50cnkpOw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcyk7DQoraW50IG1hc19zdG9yZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQg KmVudHJ5LCBnZnBfdCBnZnApOw0KK3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCB1bnNpZ25lZCBsb25nIG1heCk7DQordm9pZCAqbWFzX2ZpbmRfcmV2KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbik7DQorDQorYm9vbCBtYXNfbm9tZW0oc3RydWN0IG1h X3N0YXRlICptYXMsIGdmcF90IGdmcCk7DQordm9pZCBtYXNfcGF1c2Uoc3RydWN0IG1hX3N0YXRl ICptYXMpOw0KK3ZvaWQgbWFwbGVfdHJlZV9pbml0KHZvaWQpOw0KK3ZvaWQgbWFzX2Rlc3Ryb3ko c3RydWN0IG1hX3N0YXRlICptYXMpOw0KK2ludCBtYXNfZXhwZWN0ZWRfZW50cmllcyhzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBucl9lbnRyaWVzKTsNCisNCit2b2lkICptYXNf cHJldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pOw0KK3ZvaWQgKm1h c19uZXh0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCk7DQorDQoraW50 IG1hc19lbXB0eV9hcmVhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwg dW5zaWduZWQgbG9uZyBtYXgsDQorCQkgICB1bnNpZ25lZCBsb25nIHNpemUpOw0KKw0KKy8qIENo ZWNrcyBpZiBhIG1hcyBoYXMgbm90IGZvdW5kIGFueXRoaW5nICovDQorc3RhdGljIGlubGluZSBi b29sIG1hc19pc19ub25lKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+ bm9kZSA9PSBNQVNfTk9ORTsNCit9DQorDQorLyogQ2hlY2tzIGlmIGEgbWFzIGhhcyBiZWVuIHBh dXNlZCAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfcGF1c2VkKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfUEFVU0U7DQorfQ0KKw0KK3Zv aWQgbWFzX2R1cF90cmVlKHN0cnVjdCBtYV9zdGF0ZSAqb2xkbWFzLCBzdHJ1Y3QgbWFfc3RhdGUg Km1hcyk7DQordm9pZCBtYXNfZHVwX3N0b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICpl bnRyeSk7DQorDQorLyoNCisgKiBUaGlzIGZpbmRzIGFuIGVtcHR5IGFyZWEgZnJvbSB0aGUgaGln aGVzdCBhZGRyZXNzIHRvIHRoZSBsb3dlc3QuDQorICogQUtBICJUb3Bkb3duIiB2ZXJzaW9uLA0K KyAqLw0KK2ludCBtYXNfZW1wdHlfYXJlYV9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2ln bmVkIGxvbmcgbWluLA0KKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25n IHNpemUpOw0KKy8qKg0KKyAqIG1hc19yZXNldCgpIC0gUmVzZXQgYSBNYXBsZSBUcmVlIG9wZXJh dGlvbiBzdGF0ZS4NCisgKiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKg0K KyAqIFJlc2V0cyB0aGUgZXJyb3Igb3Igd2FsayBzdGF0ZSBvZiB0aGUgQG1hcyBzbyBmdXR1cmUg d2Fsa3Mgb2YgdGhlDQorICogYXJyYXkgd2lsbCBzdGFydCBmcm9tIHRoZSByb290LiAgVXNlIHRo aXMgaWYgeW91IGhhdmUgZHJvcHBlZCB0aGUNCisgKiBsb2NrIGFuZCB3YW50IHRvIHJldXNlIHRo ZSBtYV9zdGF0ZS4NCisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtYXNfcmVzZXQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwltYXMt Pm5vZGUgPSBNQVNfU1RBUlQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19mb3JfZWFjaCgpIC0gSXRl cmF0ZSBvdmVyIGEgcmFuZ2Ugb2YgdGhlIG1hcGxlIHRyZWUuDQorICogQG1hczogTWFwbGUgVHJl ZSBvcGVyYXRpb24gc3RhdGUgKG1hcGxlX3N0YXRlKQ0KKyAqIEBlbnRyeTogRW50cnkgcmV0cmll dmVkIGZyb20gdGhlIHRyZWUNCisgKiBAbWF4OiBtYXhpbXVtIGluZGV4IHRvIHJldHJpZXZlIGZy b20gdGhlIHRyZWUNCisgKg0KKyAqIFdoZW4gcmV0dXJuZWQsIG1hcy0+aW5kZXggYW5kIG1hcy0+ bGFzdCB3aWxsIGhvbGQgdGhlIGVudGlyZSByYW5nZSBmb3IgdGhlDQorICogZW50cnkuDQorICoN CisgKiBOb3RlOiBtYXkgcmV0dXJuIHRoZSB6ZXJvIGVudHJ5Lg0KKyAqDQorICovDQorI2RlZmlu ZSBtYXNfZm9yX2VhY2gobWFzLCBlbnRyeSwgbWF4KSBcDQorCXdoaWxlICgoKGVudHJ5KSA9IG1h c19maW5kKChtYXMpLCAobWF4KSkpICE9IE5VTEwpDQorDQorDQorLyoqDQorICogbWFzX3NldF9y YW5nZSgpIC0gU2V0IHVwIE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVu dCBpbmRleC4NCisgKiBAbWFzOiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAc3Rh cnQ6IE5ldyBzdGFydCBvZiByYW5nZSBpbiB0aGUgTWFwbGUgVHJlZS4NCisgKiBAbGFzdDogTmV3 IGVuZCBvZiByYW5nZSBpbiB0aGUgTWFwbGUgVHJlZS4NCisgKg0KKyAqIE1vdmUgdGhlIG9wZXJh dGlvbiBzdGF0ZSB0byByZWZlciB0byBhIGRpZmZlcmVudCByYW5nZS4gIFRoaXMgd2lsbA0KKyAq IGhhdmUgdGhlIGVmZmVjdCBvZiBzdGFydGluZyBhIHdhbGsgZnJvbSB0aGUgdG9wOyBzZWUgbWFz X25leHQoKQ0KKyAqIHRvIG1vdmUgdG8gYW4gYWRqYWNlbnQgaW5kZXguDQorICovDQorc3RhdGlj IGlubGluZQ0KK3ZvaWQgbWFzX3NldF9yYW5nZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsYXN0KQ0KK3sNCisJICAgICAgIG1hcy0+aW5k ZXggPSBzdGFydDsNCisJICAgICAgIG1hcy0+bGFzdCA9IGxhc3Q7DQorCSAgICAgICBtYXMtPm5v ZGUgPSBNQVNfU1RBUlQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19zZXQoKSAtIFNldCB1cCBNYXBs ZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZSBmb3IgYSBkaWZmZXJlbnQgaW5kZXguDQorICogQG1hczog TWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUuDQorICogQGluZGV4OiBOZXcgaW5kZXggaW50byB0 aGUgTWFwbGUgVHJlZS4NCisgKg0KKyAqIE1vdmUgdGhlIG9wZXJhdGlvbiBzdGF0ZSB0byByZWZl ciB0byBhIGRpZmZlcmVudCBpbmRleC4gIFRoaXMgd2lsbA0KKyAqIGhhdmUgdGhlIGVmZmVjdCBv ZiBzdGFydGluZyBhIHdhbGsgZnJvbSB0aGUgdG9wOyBzZWUgbWFzX25leHQoKQ0KKyAqIHRvIG1v dmUgdG8gYW4gYWRqYWNlbnQgaW5kZXguDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19z ZXQoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKw0KKwlt YXNfc2V0X3JhbmdlKG1hcywgaW5kZXgsIGluZGV4KTsNCit9DQorDQorc3RhdGljIGlubGluZSBi b29sIG10X2V4dGVybmFsX2xvY2soY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJ cmV0dXJuIChtdC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19MT0NLX01BU0spID09IE1UX0ZMQUdTX0xP Q0tfRVhURVJOOw0KK30NCisNCisvKioNCisgKiBtdF9pbml0X2ZsYWdzKCkgLSBJbml0aWFsaXNl IGFuIGVtcHR5IG1hcGxlIHRyZWUgd2l0aCBmbGFncy4NCisgKiBAbXQ6IE1hcGxlIFRyZWUNCisg KiBAZmxhZ3M6IG1hcGxlIHRyZWUgZmxhZ3MuDQorICoNCisgKiBJZiB5b3UgbmVlZCB0byBpbml0 aWFsaXNlIGEgTWFwbGUgVHJlZSB3aXRoIHNwZWNpYWwgZmxhZ3MgKGVnLCBhbg0KKyAqIGFsbG9j YXRpb24gdHJlZSksIHVzZSB0aGlzIGZ1bmN0aW9uLg0KKyAqDQorICogQ29udGV4dDogQW55IGNv bnRleHQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10X2luaXRfZmxhZ3Moc3RydWN0IG1h cGxlX3RyZWUgKm10LCB1bnNpZ25lZCBpbnQgZmxhZ3MpDQorew0KKwltdC0+bWFfZmxhZ3MgPSBm bGFnczsNCisJaWYgKCFtdF9leHRlcm5hbF9sb2NrKG10KSkNCisJCXNwaW5fbG9ja19pbml0KCZt dC0+bWFfbG9jayk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihtdC0+bWFfcm9vdCwgTlVMTCk7DQor fQ0KKw0KKy8qKg0KKyAqIG10X2luaXQoKSAtIEluaXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJl ZS4NCisgKiBAbXQ6IE1hcGxlIFRyZWUNCisgKg0KKyAqIEFuIGVtcHR5IE1hcGxlIFRyZWUuDQor ICoNCisgKiBDb250ZXh0OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg bXRfaW5pdChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwltdF9pbml0X2ZsYWdzKG10LCAw KTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQpDQorew0KKyNpZmRlZiBDT05GSUdfTUFQTEVfUkNVX0RJU0FCTEVEDQorCXJldHVybiBm YWxzZTsNCisjZW5kaWYNCisJcmV0dXJuIG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX1VTRV9SQ1U7 DQorfQ0KKw0KKy8qKg0KKyAqIG10X2NsZWFyX2luX3JjdSgpIC0gU3dpdGNoIHRoZSB0cmVlIHRv IG5vbi1SQ1UgbW9kZS4NCisgKiBAbXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3RhdGljIGlu bGluZSB2b2lkIG10X2NsZWFyX2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlp ZiAoIW10X2luX3JjdShtdCkpDQorCQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9sb2Nr KG10KSkgew0KKwkJQlVHX09OKCFtdF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9mbGFn cyAmPSB+TVRfRkxBR1NfVVNFX1JDVTsNCisJfSBlbHNlIHsNCisJCW10cmVlX2xvY2sobXQpOw0K KwkJbXQtPm1hX2ZsYWdzICY9IH5NVF9GTEFHU19VU0VfUkNVOw0KKwkJbXRyZWVfdW5sb2NrKG10 KTsNCisJfQ0KK30NCisNCisvKioNCisgKiBtdF9zZXRfaW5fcmN1KCkgLSBTd2l0Y2ggdGhlIHRy ZWUgdG8gUkNVIHNhZmUgbW9kZS4NCisgKiBAbXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG10X3NldF9pbl9yY3Uoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sN CisJaWYgKG10X2luX3JjdShtdCkpDQorCQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9s b2NrKG10KSkgew0KKwkJQlVHX09OKCFtdF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9m bGFncyB8PSBNVF9GTEFHU19VU0VfUkNVOw0KKwl9IGVsc2Ugew0KKwkJbXRyZWVfbG9jayhtdCk7 DQorCQltdC0+bWFfZmxhZ3MgfD0gTVRfRkxBR1NfVVNFX1JDVTsNCisJCW10cmVlX3VubG9jayht dCk7DQorCX0NCit9DQorDQordm9pZCAqbXRfZmluZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVu c2lnbmVkIGxvbmcgKmluZGV4LCB1bnNpZ25lZCBsb25nIG1heCk7DQordm9pZCAqbXRfZmluZF9h ZnRlcihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LA0KKwkJICAg IHVuc2lnbmVkIGxvbmcgbWF4KTsNCit2b2lkICptdF9wcmV2KHN0cnVjdCBtYXBsZV90cmVlICpt dCwgdW5zaWduZWQgbG9uZyBpbmRleCwgIHVuc2lnbmVkIGxvbmcgbWluKTsNCit2b2lkICptdF9u ZXh0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQg bG9uZyBtYXgpOw0KKw0KKy8qKg0KKyAqIG10X2Zvcl9lYWNoIC0gSXRlcmF0ZSBvdmVyIGVhY2gg ZW50cnkgc3RhcnRpbmcgYXQgaW5kZXggdW50aWwgbWF4Lg0KKyAqIEB0cmVlOiBUaGUgTWFwbGUg VHJlZQ0KKyAqIEBlbnRyeTogVGhlIGN1cnJlbnQgZW50cnkNCisgKiBAaW5kZXg6IFRoZSBpbmRl eCB0byB1cGRhdGUgdG8gdHJhY2sgdGhlIGxvY2F0aW9uIGluIHRoZSB0cmVlDQorICogQG1heDog VGhlIG1heGltdW0gbGltaXQgZm9yIEBpbmRleA0KKyAqDQorICogTm90ZTogV2lsbCBub3QgcmV0 dXJuIHRoZSB6ZXJvIGVudHJ5Lg0KKyAqLw0KKyNkZWZpbmUgbXRfZm9yX2VhY2godHJlZSwgZW50 cnksIGluZGV4LCBtYXgpIFwNCisJZm9yIChlbnRyeSA9IG10X2ZpbmQodHJlZSwgJihpbmRleCks IG1heCk7IFwNCisJCWVudHJ5OyBlbnRyeSA9IG10X2ZpbmRfYWZ0ZXIodHJlZSwgJihpbmRleCks IG1heCkpDQorDQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorZXh0ZXJuIGF0 b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcnVuOw0KK2V4dGVybiBhdG9taWNfdCBtYXBsZV90cmVl X3Rlc3RzX3Bhc3NlZDsNCisNCit2b2lkIG10X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUg Km10KTsNCisjZGVmaW5lIE1UX0JVR19PTih0cmVlLCB4KSBkbyB7CQkJCQkJXA0KKwlhdG9taWNf aW5jKCZtYXBsZV90cmVlX3Rlc3RzX3J1bik7CQkJCVwNCisJaWYgKHgpIHsJCQkJCQkJXA0KKwkJ cHJfaW5mbygiQlVHIGF0ICVzOiVkICgldSlcbiIsCQkJCVwNCisJCV9fZnVuY19fLCBfX0xJTkVf XywgeCk7CQkJCQlcDQorCQltdF9kdW1wKHRyZWUpOwkJCQkJCVwNCisJCXByX2luZm8oIlBhc3M6 ICV1IFJ1bjoldVxuIiwJCQkJXA0KKwkJCWF0b21pY19yZWFkKCZtYXBsZV90cmVlX3Rlc3RzX3Bh c3NlZCksCQlcDQorCQkJYXRvbWljX3JlYWQoJm1hcGxlX3RyZWVfdGVzdHNfcnVuKSk7CQlcDQor CQlkdW1wX3N0YWNrKCk7CQkJCQkJXA0KKwl9IGVsc2UgewkJCQkJCQlcDQorCQlhdG9taWNfaW5j KCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCk7CQkJXA0KKwl9CQkJCQkJCQlcDQorfSB3aGlsZSAo MCkNCisjZWxzZQ0KKyNkZWZpbmUgTVRfQlVHX09OKHRyZWUsIHgpIEJVR19PTih4KQ0KKyNlbmRp ZiAvKiBDT05GSUdfREVCVUdfTUFQTEVfVFJFRSAqLw0KKw0KKyNlbmRpZiAvKl9MSU5VWF9NQVBM RV9UUkVFX0ggKi8NCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVl LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUgMTAw NjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmZiZDE1ODM5ZjlhYQ0KLS0tIC9kZXYvbnVsbA0KKysr IGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDEyMyBAQA0K Ky8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovDQorI3VuZGVmIFRSQUNFX1NZ U1RFTQ0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIG1hcGxlX3RyZWUNCisNCisjaWYgIWRlZmluZWQo X1RSQUNFX01NX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpDQorI2RlZmlu ZSBfVFJBQ0VfTU1fSA0KKw0KKw0KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+DQorDQor c3RydWN0IG1hX3N0YXRlOw0KKw0KK1RSQUNFX0VWRU5UKG1hX29wLA0KKw0KKwlUUF9QUk9UTyhj b25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZuLCBt YXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAqLCBm bikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVk IGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9fZmll bGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwN CisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRy eS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlf X2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5s YXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9wcmlu dGsoIiVzXHROb2RlOiAlcHggKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19lbnRy eS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBsb25n KSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQorCQkg ICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9f ZW50cnktPmxhc3QNCisJKQ0KKykNCitUUkFDRV9FVkVOVChtYV9yZWFkLA0KKw0KKwlUUF9QUk9U Tyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZu LCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAq LCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2ln bmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9f ZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJ KSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19l bnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJ CQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFz LT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9w cmludGsoIiVzXHROb2RlOiAlcHggKCVsdSAlbHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19l bnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBs b25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQor CQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcp IF9fZW50cnktPmxhc3QNCisJKQ0KKykNCisNCitUUkFDRV9FVkVOVChtYV93cml0ZSwNCisNCisJ VFBfUFJPVE8oY29uc3QgY2hhciAqZm4sIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBs b25nIHBpdiwNCisJCSB2b2lkICp2YWwpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMsIHBpdiwgdmFs KSwNCisNCisJVFBfU1RSVUNUX19lbnRyeSgNCisJCQlfX2ZpZWxkKGNvbnN0IGNoYXIgKiwgZm4p DQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtaW4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBs b25nLCBtYXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBpbmRleCkNCisJCQlfX2ZpZWxk KHVuc2lnbmVkIGxvbmcsIGxhc3QpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBwaXYpDQor CQkJX19maWVsZCh2b2lkICosIHZhbCkNCisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwN CisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRy eS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlf X2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5s YXN0Ow0KKwkJCV9fZW50cnktPnBpdgkJPSBwaXY7DQorCQkJX19lbnRyeS0+dmFsCQk9IHZhbDsN CisJCQlfX2VudHJ5LT5ub2RlCQk9IG1hcy0+bm9kZTsNCisJKSwNCisNCisJVFBfcHJpbnRrKCIl c1x0Tm9kZSAlcHggKCVsdSAlbHUpIHJhbmdlOiVsdS0lbHUgcGl2ICglbHUpIHZhbCAlcHgiLA0K KwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9kZSwNCisJCSAgKHVu c2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnkt Pm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0KKwkJICAodW5zaWdu ZWQgbG9uZykgX19lbnRyeS0+bGFzdCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPnBp diwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+dmFsDQorCSkNCispDQorI2VuZGlmIC8qIF9UUkFD RV9NTV9IICovDQorDQorLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICov DQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPg0KZGlmZiAtLWdpdCBhL2luaXQvbWFp bi5jIGIvaW5pdC9tYWluLmMNCmluZGV4IDk4MTgyYzNjMmM0Yi4uMjU0MWE2ZTlmYTQxIDEwMDY0 NA0KLS0tIGEvaW5pdC9tYWluLmMNCisrKyBiL2luaXQvbWFpbi5jDQpAQCAtMTE2LDYgKzExNiw3 IEBAIHN0YXRpYyBpbnQga2VybmVsX2luaXQodm9pZCAqKTsNCiANCiBleHRlcm4gdm9pZCBpbml0 X0lSUSh2b2lkKTsNCiBleHRlcm4gdm9pZCByYWRpeF90cmVlX2luaXQodm9pZCk7DQorZXh0ZXJu IHZvaWQgbWFwbGVfdHJlZV9pbml0KHZvaWQpOw0KIA0KIC8qDQogICogRGVidWcgaGVscGVyOiB2 aWEgdGhpcyBmbGFnIHdlIGtub3cgdGhhdCB3ZSBhcmUgaW4gJ2Vhcmx5IGJvb3R1cCBjb2RlJw0K QEAgLTEwMDEsNiArMTAwMiw3IEBAIGFzbWxpbmthZ2UgX192aXNpYmxlIHZvaWQgX19pbml0IF9f bm9fc2FuaXRpemVfYWRkcmVzcyBzdGFydF9rZXJuZWwodm9pZCkNCiAJCSAiSW50ZXJydXB0cyB3 ZXJlIGVuYWJsZWQgKnZlcnkqIGVhcmx5LCBmaXhpbmcgaXRcbiIpKQ0KIAkJbG9jYWxfaXJxX2Rp c2FibGUoKTsNCiAJcmFkaXhfdHJlZV9pbml0KCk7DQorCW1hcGxlX3RyZWVfaW5pdCgpOw0KIA0K IAkvKg0KIAkgKiBTZXQgdXAgaG91c2VrZWVwaW5nIGJlZm9yZSBzZXR0aW5nIHVwIHdvcmtxdWV1 ZXMgdG8gYWxsb3cgdGhlIHVuYm91bmQNCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZy5kZWJ1ZyBi L2xpYi9LY29uZmlnLmRlYnVnDQppbmRleCAwNzVjZDI1MzYzYWMuLjNkOTM2NjA3NTE1MyAxMDA2 NDQNCi0tLSBhL2xpYi9LY29uZmlnLmRlYnVnDQorKysgYi9saWIvS2NvbmZpZy5kZWJ1Zw0KQEAg LTg0NSw2ICs4NDUsMTMgQEAgY29uZmlnIERFQlVHX1ZNX1ZNQUNBQ0hFDQogCSAgY2FuIGNhdXNl IHNpZ25pZmljYW50IG92ZXJoZWFkLCBzbyBvbmx5IGVuYWJsZSBpdCBpbiBub24tcHJvZHVjdGlv bg0KIAkgIGVudmlyb25tZW50cy4NCiANCitjb25maWcgREVCVUdfVk1fTUFQTEVfVFJFRQ0KKwli b29sICJEZWJ1ZyBWTSBtYXBsZSB0cmVlcyINCisJZGVwZW5kcyBvbiBERUJVR19WTQ0KKwlzZWxl Y3QgREVCVUdfTUFQTEVfVFJFRQ0KKwloZWxwDQorCSAgRW5hYmxlIFZNIG1hcGxlIHRyZWUgZGVi dWdnaW5nIGluZm9ybWF0aW9uIGFuZCBleHRyYSB2YWxpZGF0aW9ucy4NCisNCiAJICBJZiB1bnN1 cmUsIHNheSBOLg0KIA0KIGNvbmZpZyBERUJVR19WTV9SQg0KQEAgLTE3MDUsNiArMTcxMiwxNCBA QCBjb25maWcgQlVHX09OX0RBVEFfQ09SUlVQVElPTg0KIA0KIAkgIElmIHVuc3VyZSwgc2F5IE4u DQogDQorY29uZmlnIERFQlVHX01BUExFX1RSRUUNCisJYm9vbCAiRGVidWcgbWFwbGUgdHJlZXMi DQorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMDQorCWhlbHANCisJICBFbmFibGUgbWFwbGUgdHJl ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJhIHZhbGlkYXRpb25zLg0KKw0KKwkgIElm IHVuc3VyZSwgc2F5IE4uDQorDQogZW5kbWVudQ0KIA0KIGNvbmZpZyBERUJVR19DUkVERU5USUFM Uw0KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQ0KaW5kZXggNmI5ZmZj MWJkMWVlLi4yOGI0MTM2M2E2MzYgMTAwNjQ0DQotLS0gYS9saWIvTWFrZWZpbGUNCisrKyBiL2xp Yi9NYWtlZmlsZQ0KQEAgLTI5LDcgKzI5LDggQEAgZW5kaWYNCiANCiBsaWIteSA6PSBjdHlwZS5v IHN0cmluZy5vIHZzcHJpbnRmLm8gY21kbGluZS5vIFwNCiAJIHJidHJlZS5vIHJhZGl4LXRyZWUu byB0aW1lcnF1ZXVlLm8geGFycmF5Lm8gXA0KLQkgaWRyLm8gZXh0YWJsZS5vIHNoYTEubyBpcnFf cmVncy5vIGFyZ3Zfc3BsaXQubyBcDQorCSBtYXBsZV90cmVlLm8gaWRyLm8gZXh0YWJsZS5vIFwN CisJIHNoYTEubyBpcnFfcmVncy5vIGFyZ3Zfc3BsaXQubyBcDQogCSBmbGV4X3Byb3BvcnRpb25z Lm8gcmF0ZWxpbWl0Lm8gc2hvd19tZW0ubyBcDQogCSBpc19zaW5nbGVfdGhyZWFkZWQubyBwbGlz dC5vIGRlY29tcHJlc3MubyBrb2JqZWN0X3VldmVudC5vIFwNCiAJIGVhcmx5Y3Bpby5vIHNlcV9i dWYubyBzaXBoYXNoLm8gZGVjX2FuZF9sb2NrLm8gXA0KZGlmZiAtLWdpdCBhL2xpYi9tYXBsZV90 cmVlLmMgYi9saWIvbWFwbGVfdHJlZS5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAw MDAwMDAwMDAwLi42MzkzYmU5ZDkyMzANCi0tLSAvZGV2L251bGwNCisrKyBiL2xpYi9tYXBsZV90 cmVlLmMNCkBAIC0wLDAgKzEsNjk3OSBAQA0KKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKw0KKy8qDQorICogTWFwbGUgVHJlZSBpbXBsZW1lbnRhdGlvbg0KKyAqIENvcHlyaWdo dCAoYykgMjAxOC0yMDIyIE9yYWNsZSBDb3Jwb3JhdGlvbg0KKyAqIEF1dGhvcnM6IExpYW0gUi4g SG93bGV0dCA8TGlhbS5Ib3dsZXR0QG9yYWNsZS5jb20+DQorICoJICAgIE1hdHRoZXcgV2lsY294 IDx3aWxseUBpbmZyYWRlYWQub3JnPg0KKyAqLw0KKw0KKy8qDQorICogRE9DOiBJbnRlcmVzdGlu ZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZSBNYXBsZSBUcmVlDQorICoNCisgKiBFYWNo IG5vZGUgdHlwZSBoYXMgYSBudW1iZXIgb2Ygc2xvdHMgZm9yIGVudHJpZXMgYW5kIGEgbnVtYmVy IG9mIHNsb3RzIGZvcg0KKyAqIHBpdm90cy4gIEluIHRoZSBjYXNlIG9mIGRlbnNlIG5vZGVzLCB0 aGUgcGl2b3RzIGFyZSBpbXBsaWVkIGJ5IHRoZSBwb3NpdGlvbg0KKyAqIGFuZCBhcmUgc2ltcGx5 IHRoZSBzbG90IGluZGV4ICsgdGhlIG1pbmltdW0gb2YgdGhlIG5vZGUuDQorICoNCisgKiBJbiBy ZWd1bGFyIEItVHJlZSB0ZXJtcywgcGl2b3RzIGFyZSBjYWxsZWQga2V5cy4gIFRoZSB0ZXJtIHBp dm90IGlzIHVzZWQgdG8NCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlIGlzIHNwZWNpZnlpbmcg cmFuZ2VzLCAgUGl2b3RzIG1heSBhcHBlYXIgaW4gdGhlDQorICogc3VidHJlZSB3aXRoIGFuIGVu dHJ5IGF0dGFjaGVkIHRvIHRoZSB2YWx1ZSB3aGVyZSBhcyBrZXlzIGFyZSB1bmlxdWUgdG8gYQ0K KyAqIHNwZWNpZmljIHBvc2l0aW9uIG9mIGEgQi10cmVlLiAgUGl2b3QgdmFsdWVzIGFyZSBpbmNs dXNpdmUgb2YgdGhlIHNsb3Qgd2l0aA0KKyAqIHRoZSBzYW1lIGluZGV4Lg0KKyAqDQorICoNCisg KiBUaGUgZm9sbG93aW5nIGlsbHVzdHJhdGVzIHRoZSBsYXlvdXQgb2YgYSByYW5nZTY0IG5vZGVz IHNsb3RzIGFuZCBwaXZvdHMuDQorICoNCisgKg0KKyAqICBTbG90cyAtPiB8IDAgfCAxIHwgMiB8 IC4uLiB8IDEyIHwgMTMgfCAxNCB8IDE1IHwNCisgKiAgICAgICAgICAg4pSsICAg4pSsICAg4pSs ICAg4pSsICAgICDilKwgICAg4pSsICAgIOKUrCAgICDilKwgICAg4pSsDQorICogICAgICAgICAg IOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg4pSCICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKU lOKUgCBJbXBsaWVkIG1heGltdW0NCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSC ICAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIAgUGl2b3QgMTQNCisgKiAgICAgICAgICAg 4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilIIgICAg4pSCICAgIOKUlOKUgCBQaXZvdCAxMw0K KyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilJTilIAgUGl2 b3QgMTINCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilJTilIAgUGl2 b3QgMTENCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSU4pSAIFBpdm90IDINCisg KiAgICAgICAgICAg4pSCICAg4pSCICAg4pSU4pSAIFBpdm90IDENCisgKiAgICAgICAgICAg4pSC ICAg4pSU4pSAIFBpdm90IDANCisgKiAgICAgICAgICAg4pSU4pSAICBJbXBsaWVkIG1pbmltdW0N CisgKg0KKyAqIFNsb3QgY29udGVudHM6DQorICogIEludGVybmFsIChub24tbGVhZikgbm9kZXMg Y29udGFpbiBwb2ludGVycyB0byBvdGhlciBub2Rlcy4NCisgKiAgTGVhZiBub2RlcyBjb250YWlu IGVudHJpZXMuDQorICoNCisgKiBUaGUgbG9jYXRpb24gb2YgaW50ZXJlc3QgaXMgb2Z0ZW4gcmVm ZXJyZWQgdG8gYXMgYW4gb2Zmc2V0LiAgQWxsIG9mZnNldHMgaGF2ZQ0KKyAqIGEgc2xvdCwgYnV0 IHRoZSBsYXN0IG9mZnNldCBoYXMgYW4gaW1wbGllZCBwaXZvdCBmcm9tIHRoZSBub2RlIGFib3Zl IChvcg0KKyAqIFVJTlRfTUFYIGZvciB0aGUgcm9vdCBub2RlLg0KKyAqDQorICogUmFuZ2VzIGNv bXBsaWNhdGUgY2VydGFpbiB3cml0ZSBhY3Rpdml0aWVzLiAgV2hlbiBtb2RpZnlpbmcgYW55IG9m DQorICogdGhlIEItdHJlZSB2YXJpYW50cywgaXQgaXMga25vd24gdGhhdCBvbmUgZW50cnkgd2ls bCBlaXRoZXIgYmUgYWRkZWQgb3INCisgKiBkZWxldGVkLiAgV2hlbiBtb2RpZnlpbmcgdGhlIE1h cGxlIFRyZWUsIG9uZSBzdG9yZSBvcGVyYXRpb24gbWF5IG92ZXJ3cml0ZQ0KKyAqIHRoZSBlbnRp cmUgZGF0YSBzZXQsIG9yIG9uZSBoYWxmIG9mIHRoZSB0cmVlLCBvciB0aGUgbWlkZGxlIGhhbGYg b2YgdGhlIHRyZWUuDQorICoNCisgKi8NCisNCisNCisjaW5jbHVkZSA8bGludXgvbWFwbGVfdHJl ZS5oPg0KKyNpbmNsdWRlIDxsaW51eC94YXJyYXkuaD4NCisjaW5jbHVkZSA8bGludXgvdHlwZXMu aD4NCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4N CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+DQorI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+DQor DQorI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTDQorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9t YXBsZV90cmVlLmg+DQorDQorI2RlZmluZSBNQV9ST09UX1BBUkVOVCAxDQorDQorLyogTWFwbGUg c3RhdGUgZmxhZ3MgKi8NCisjZGVmaW5lIE1BX1NUQVRFX0JVTEsJCTENCisjZGVmaW5lIE1BX1NU QVRFX1JFQkFMQU5DRQkyDQorDQorI2RlZmluZSBtYV9wYXJlbnRfcHRyKHgpICgoc3RydWN0IG1h cGxlX3Bub2RlICopKHgpKQ0KKyNkZWZpbmUgbWFfbW5vZGVfcHRyKHgpICgoc3RydWN0IG1hcGxl X25vZGUgKikoeCkpDQorI2RlZmluZSBtYV9lbm9kZV9wdHIoeCkgKChzdHJ1Y3QgbWFwbGVfZW5v ZGUgKikoeCkpDQorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICptYXBsZV9ub2RlX2NhY2hlOw0K Kw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG10X21heFtdID0gew0KKwlbbWFwbGVfZGVu c2VdCQk9IE1BUExFX05PREVfU0xPVFMsDQorCVttYXBsZV9sZWFmXzY0XQkJPSBVTE9OR19NQVgs DQorCVttYXBsZV9yYW5nZV82NF0JPSBVTE9OR19NQVgsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0g VUxPTkdfTUFYLA0KK307DQorI2RlZmluZSBtdF9ub2RlX21heCh4KSBtdF9tYXhbbXRlX25vZGVf dHlwZSh4KV0NCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdF9zbG90c1tdID0gew0K KwlbbWFwbGVfZGVuc2VdCQk9IE1BUExFX05PREVfU0xPVFMsDQorCVttYXBsZV9sZWFmXzY0XQkJ PSBNQVBMRV9SQU5HRTY0X1NMT1RTLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gTUFQTEVfUkFOR0U2 NF9TTE9UUywNCisJW21hcGxlX2FyYW5nZV82NF0JPSBNQVBMRV9BUkFOR0U2NF9TTE9UUywNCit9 Ow0KKyNkZWZpbmUgbXRfc2xvdF9jb3VudCh4KSBtdF9zbG90c1ttdGVfbm9kZV90eXBlKHgpXQ0K Kw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG10X3Bpdm90c1tdID0gew0KKwlbbWFwbGVf ZGVuc2VdCQk9IDAsDQorCVttYXBsZV9sZWFmXzY0XQkJPSBNQVBMRV9SQU5HRTY0X1NMT1RTIC0g MSwNCisJW21hcGxlX3JhbmdlXzY0XQk9IE1BUExFX1JBTkdFNjRfU0xPVFMgLSAxLA0KKwlbbWFw bGVfYXJhbmdlXzY0XQk9IE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMSwNCit9Ow0KKyNkZWZpbmUg bXRfcGl2b3RfY291bnQoeCkgbXRfcGl2b3RzW210ZV9ub2RlX3R5cGUoeCldDQorDQorc3RhdGlj IGNvbnN0IHVuc2lnbmVkIGNoYXIgbXRfbWluX3Nsb3RzW10gPSB7DQorCVttYXBsZV9kZW5zZV0J CT0gTUFQTEVfTk9ERV9TTE9UUyAvIDIsDQorCVttYXBsZV9sZWFmXzY0XQkJPSAoTUFQTEVfUkFO R0U2NF9TTE9UUyAvIDIpIC0gMiwNCisJW21hcGxlX3JhbmdlXzY0XQk9IChNQVBMRV9SQU5HRTY0 X1NMT1RTIC8gMikgLSAyLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IChNQVBMRV9BUkFOR0U2NF9T TE9UUyAvIDIpIC0gMSwNCit9Ow0KKyNkZWZpbmUgbXRfbWluX3Nsb3RfY291bnQoeCkgbXRfbWlu X3Nsb3RzW210ZV9ub2RlX3R5cGUoeCldDQorDQorI2RlZmluZSBNQVBMRV9CSUdfTk9ERV9TTE9U UwkoTUFQTEVfUkFOR0U2NF9TTE9UUyAqIDIgKyAyKQ0KKyNkZWZpbmUgTUFQTEVfQklHX05PREVf R0FQUwkoTUFQTEVfQVJBTkdFNjRfU0xPVFMgKiAyICsgMSkNCisNCitzdHJ1Y3QgbWFwbGVfYmln X25vZGUgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBw aXZvdFtNQVBMRV9CSUdfTk9ERV9TTE9UUyAtIDFdOw0KKwl1bmlvbiB7DQorCQlzdHJ1Y3QgbWFw bGVfZW5vZGUgKnNsb3RbTUFQTEVfQklHX05PREVfU0xPVFNdOw0KKwkJc3RydWN0IHsNCisJCQl1 bnNpZ25lZCBsb25nIHBhZGRpbmdbTUFQTEVfQklHX05PREVfR0FQU107DQorCQkJdW5zaWduZWQg bG9uZyBnYXBbTUFQTEVfQklHX05PREVfR0FQU107DQorCQl9Ow0KKwl9Ow0KKwl1bnNpZ25lZCBj aGFyIGJfZW5kOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCit9Ow0KKw0KKy8qDQorICogVGhl IG1hcGxlX3N1YnRyZWVfc3RhdGUgaXMgdXNlZCB0byBidWlsZCBhIHRyZWUgdG8gcmVwbGFjZSBh IHNlZ21lbnQgb2YgYW4NCisgKiBleGlzdGluZyB0cmVlIGluIGEgbW9yZSBhdG9taWMgd2F5LiAg QW55IHdhbGtlcnMgb2YgdGhlIG9sZGVyIHRyZWUgd2lsbCBoaXQgYQ0KKyAqIGRlYWQgbm9kZSBh bmQgcmVzdGFydCBvbiB1cGRhdGVzLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRl IHsNCisJc3RydWN0IG1hX3N0YXRlICpvcmlnX2w7CS8qIE9yaWdpbmFsIGxlZnQgc2lkZSBvZiBz dWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqb3JpZ19yOwkvKiBPcmlnaW5hbCByaWdodCBz aWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICpsOwkJLyogTmV3IGxlZnQgc2lk ZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqbTsJCS8qIE5ldyBtaWRkbGUgb2Yg c3VidHJlZSAocmFyZSkgKi8NCisJc3RydWN0IG1hX3N0YXRlICpyOwkJLyogTmV3IHJpZ2h0IHNp ZGUgb2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFyeSAqZnJlZTsJLyogbm9kZXMgdG8g YmUgZnJlZWQgKi8NCisJc3RydWN0IG1hX3RvcGlhcnkgKmRlc3Ryb3k7CS8qIE5vZGVzIHRvIGJl IGRlc3Ryb3llZCAod2Fsa2VkIGFuZCBmcmVlZCkgKi8NCisJc3RydWN0IG1hcGxlX2JpZ19ub2Rl ICpibjsNCit9Ow0KKw0KKy8qIEZ1bmN0aW9ucyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1h cGxlX25vZGUgKm10X2FsbG9jX29uZShnZnBfdCBnZnApDQorew0KKwlyZXR1cm4ga21lbV9jYWNo ZV9hbGxvYyhtYXBsZV9ub2RlX2NhY2hlLCBnZnAgfCBfX0dGUF9aRVJPKTsNCit9DQorDQorc3Rh dGljIGlubGluZSBpbnQgbXRfYWxsb2NfYnVsayhnZnBfdCBnZnAsIHNpemVfdCBzaXplLCB2b2lk ICoqbm9kZXMpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvY19idWxrKG1hcGxlX25vZGVf Y2FjaGUsIGdmcCB8IF9fR0ZQX1pFUk8sIHNpemUsDQorCQkJCSAgICAgbm9kZXMpOw0KK30NCisN CitzdGF0aWMgaW5saW5lIHZvaWQgbXRfZnJlZV9idWxrKHNpemVfdCBzaXplLCB2b2lkIF9fcmN1 ICoqbm9kZXMpDQorew0KKwlrbWVtX2NhY2hlX2ZyZWVfYnVsayhtYXBsZV9ub2RlX2NhY2hlLCBz aXplLCAodm9pZCAqKilub2Rlcyk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2ZyZWVfcmN1KHN0 cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gY29u dGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3UpOw0KKw0KKwlrbWVtX2NhY2hl X2ZyZWUobWFwbGVfbm9kZV9jYWNoZSwgbm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFfZnJlZV9y Y3UoKSAtIFVzZSByY3UgY2FsbGJhY2sgdG8gZnJlZSBhIG1hcGxlIG5vZGUNCisgKiBAbm9kZTog VGhlIG5vZGUgdG8gZnJlZQ0KKyAqDQorICogVGhlIG1hcGxlIHRyZWUgdXNlcyB0aGUgcGFyZW50 IHBvaW50ZXIgdG8gaW5kaWNhdGUgdGhpcyBub2RlIGlzIG5vIGxvbmdlciBpbg0KKyAqIHVzZSBh bmQgd2lsbCBiZSBmcmVlZC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYV9mcmVlX3JjdShzdHJ1Y3Qg bWFwbGVfbm9kZSAqbm9kZSkNCit7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIobm9k ZSk7DQorCWNhbGxfcmN1KCZub2RlLT5yY3UsIG10X2ZyZWVfcmN1KTsNCit9DQorDQorc3RhdGlj IHVuc2lnbmVkIGludCBtdF9oZWlnaHQoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sN CisJcmV0dXJuIChtdC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19IRUlHSFRfTUFTSykgPj4gTVRfRkxB R1NfSEVJR0hUX09GRlNFVDsNCit9DQorDQorc3RhdGljIHZvaWQgbWFzX3NldF9oZWlnaHQoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBpbnQgbmV3X2ZsYWdzID0gbWFzLT50 cmVlLT5tYV9mbGFnczsNCisNCisJbmV3X2ZsYWdzICY9IH5NVF9GTEFHU19IRUlHSFRfTUFTSzsN CisJQlVHX09OKG1hcy0+ZGVwdGggPiBNQVBMRV9IRUlHSFRfTUFYKTsNCisJbmV3X2ZsYWdzIHw9 IG1hcy0+ZGVwdGggPDwgTVRfRkxBR1NfSEVJR0hUX09GRlNFVDsNCisJbWFzLT50cmVlLT5tYV9m bGFncyA9IG5ld19mbGFnczsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGludCBtYXNfbXRfaGVp Z2h0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG10X2hlaWdodChtYXMtPnRy ZWUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGVudW0gbWFwbGVfdHlwZSBtdGVfbm9kZV90eXBl KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwlyZXR1cm4gKCh1bnNpZ25l ZCBsb25nKWVudHJ5ID4+IE1BUExFX05PREVfVFlQRV9TSElGVCkgJg0KKwkJTUFQTEVfTk9ERV9U WVBFX01BU0s7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9pc19kZW5zZShjb25zdCBl bnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXJldHVybiB0eXBlIDwgbWFwbGVfbGVhZl82NDsN Cit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX2xlYWYoY29uc3QgZW51bSBtYXBsZV90 eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gdHlwZSA8IG1hcGxlX3JhbmdlXzY0Ow0KK30NCisNCitz dGF0aWMgaW5saW5lIGJvb2wgbXRlX2lzX2xlYWYoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpl bnRyeSkNCit7DQorCXJldHVybiBtYV9pc19sZWFmKG10ZV9ub2RlX3R5cGUoZW50cnkpKTsNCit9 DQorDQorLyoNCisgKiBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdpdGggdGhlIGJvdHRvbSB0d28g Yml0cyBzZXQgdG8gJzEwJyB3aGljaCBhcmUNCisgKiBiZWxvdyA0MDk2DQorICovDQorc3RhdGlj IGlubGluZSBib29sIG10X2lzX3Jlc2VydmVkKGNvbnN0IHZvaWQgKmVudHJ5KQ0KK3sNCisJcmV0 dXJuICgodW5zaWduZWQgbG9uZyllbnRyeSA8IE1BUExFX1JFU0VSVkVEX1JBTkdFKSAmJg0KKwkJ eGFfaXNfaW50ZXJuYWwoZW50cnkpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3Nl dF9lcnIoc3RydWN0IG1hX3N0YXRlICptYXMsIGxvbmcgZXJyKQ0KK3sNCisJbWFzLT5ub2RlID0g TUFfRVJST1IoZXJyKTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19wdHIoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19ST09UOw0K K30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX2lzX3N0YXJ0KHN0cnVjdCBtYV9zdGF0ZSAq bWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfU1RBUlQ7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtYXNfaXNfZXJyKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0 dXJuIHhhX2lzX2VycihtYXMtPm5vZGUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFz X3NlYXJjaGFibGUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlpZiAobWFzX2lzX25vbmUo bWFzKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKG1hc19pc19wdHIobWFzKSkNCisJCXJl dHVybiBmYWxzZTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IG1hcGxlX25vZGUgKm10ZV90b19ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50 cnkpDQorew0KKwlyZXR1cm4gKHN0cnVjdCBtYXBsZV9ub2RlICopKCh1bnNpZ25lZCBsb25nKWVu dHJ5ICYgfk1BUExFX05PREVfTUFTSyk7DQorfQ0KKw0KKy8qDQorICogbXRlX3RvX21hdCgpIC0g Q29udmVydCBhIG1hcGxlIGVuY29kZWQgbm9kZSB0byBhIG1hcGxlIHRvcGlhcnkgbm9kZS4NCisg KiBAZW50cnk6IFRoZSBtYXBsZSBlbmNvZGVkIG5vZGUNCisgKg0KKyAqIFJldHVybjogYSBtYXBs ZSB0b3BpYXJ5IHBvaW50ZXINCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV90b3Bp YXJ5ICptdGVfdG9fbWF0KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwly ZXR1cm4gKHN0cnVjdCBtYXBsZV90b3BpYXJ5ICopDQorCQkoKHVuc2lnbmVkIGxvbmcpZW50cnkg JiB+TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtYXNfbW4oKSAtIEdldCB0aGUg bWFwbGUgc3RhdGUgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFJl dHVybjogdGhlIG1hcGxlIG5vZGUgKG5vdCBlbmNvZGVkIC0gYmFyZSBwb2ludGVyKS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9ub2RlICptYXNfbW4oY29uc3Qgc3RydWN0IG1h X3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRlX3RvX25vZGUobWFzLT5ub2RlKTsNCit9DQor DQorLyoNCisgKiBtdGVfc2V0X25vZGVfZGVhZCgpIC0gU2V0IGEgbWFwbGUgZW5jb2RlZCBub2Rl IGFzIGRlYWQuDQorICogQG1uOiBUaGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtdGVfc2V0X25vZGVfZGVhZChzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uKQ0K K3sNCisJbXRlX3RvX25vZGUobW4pLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKG10ZV90b19ub2Rl KG1uKSk7DQorCXNtcF93bWIoKTsNCit9DQorDQorLyogQml0IDEgaW5kaWNhdGVzIHRoZSByb290 IGlzIGEgbm9kZSAqLw0KKyNkZWZpbmUgTUFQTEVfUk9PVF9OT0RFCQkJMHgwMg0KKy8qIG1hcGxl X3R5cGUgc3RvcmVkIGJpdCAzLTYgKi8NCisjZGVmaW5lIE1BUExFX0VOT0RFX1RZUEVfU0hJRlQJ CTB4MDMNCisvKiBCaXQgMiBtZWFucyBhIE5VTEwgc29tZXdoZXJlIGJlbG93ICovDQorI2RlZmlu ZSBNQVBMRV9FTk9ERV9OVUxMCQkweDA0DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVf ZW5vZGUgKm10X21rX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkg ICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25l ZCBsb25nKW5vZGUgfA0KKwkJCSh0eXBlIDw8IE1BUExFX0VOT0RFX1RZUEVfU0hJRlQpIHwgTUFQ TEVfRU5PREVfTlVMTCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRlX21rX3Jvb3Qo Y29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1 bnNpZ25lZCBsb25nKW5vZGUgfCBNQVBMRV9ST09UX05PREUpOw0KK30NCisNCitzdGF0aWMgaW5s aW5lIHZvaWQgKm10ZV9zYWZlX3Jvb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0K K3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgJiB+TUFQTEVfUk9PVF9O T0RFKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9zZXRfZnVsbChjb25zdCBzdHJ1 Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlub2RlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxv bmcpbm9kZSAmIH5NQVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lk IG10ZV9jbGVhcl9mdWxsKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCW5v ZGUgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylub2RlIHwgTUFQTEVfRU5PREVfTlVMTCk7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9pc19yb290KHN0cnVjdCBtYXBsZV9ub2RlICpu b2RlKQ0KK3sNCisJcmV0dXJuICgodW5zaWduZWQgbG9uZylub2RlLT5wYXJlbnQgJiBNQV9ST09U X1BBUkVOVCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfaXNfcm9vdChjb25zdCBz dHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gbWFfaXNfcm9vdChtdGVfdG9f bm9kZShub2RlKSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfcm9vdF9saW1p dHMoY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gIW1hcy0+bWluICYm IG1hcy0+bWF4ID09IFVMT05HX01BWDsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2lz X2FsbG9jKHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXJldHVybiAobXQtPm1hX2ZsYWdz ICYgTVRfRkxBR1NfQUxMT0NfUkFOR0UpOw0KK30NCisNCisvKg0KKyAqIFRoZSBQYXJlbnQgUG9p bnRlcg0KKyAqIEV4Y2x1ZGluZyByb290LCB0aGUgcGFyZW50IHBvaW50ZXIgaXMgMjU2QiBhbGln bmVkIGxpa2UgYWxsIG90aGVyIHRyZWUgbm9kZXMuDQorICogV2hlbiBzdG9yaW5nIGEgMzIgb3Ig NjQgYml0IHZhbHVlcywgdGhlIG9mZnNldCBjYW4gZml0IGludG8gNCBiaXRzLiAgVGhlIDE2DQor ICogYml0IHZhbHVlcyBuZWVkIGFuIGV4dHJhIGJpdCB0byBzdG9yZSB0aGUgb2Zmc2V0LiAgVGhp cyBleHRyYSBiaXQgY29tZXMgZnJvbQ0KKyAqIGEgcmV1c2Ugb2YgdGhlIGxhc3QgYml0IGluIHRo ZSBub2RlIHR5cGUuICBUaGlzIGlzIHBvc3NpYmxlIGJ5IHVzaW5nIGJpdCAxIHRvDQorICogaW5k aWNhdGUgaWYgYml0IDIgaXMgcGFydCBvZiB0aGUgdHlwZSBvciB0aGUgc2xvdC4NCisgKg0KKyAq IE5vdGUgdHlwZXM6DQorICogIDB4Pz8xID0gUm9vdA0KKyAqICAweD8wMCA9IDE2IGJpdCBub2Rl cw0KKyAqICAweDAxMCA9IDMyIGJpdCBub2Rlcw0KKyAqICAweDExMCA9IDY0IGJpdCBub2Rlcw0K KyAqDQorICogU2xvdCBzaXplIGFuZCBhbGlnbm1lbnQNCisgKiAgMHg/PzEgOiBSb290DQorICog IDB4PzAwIDogMTYgYml0IHZhbHVlcywgdHlwZSBpbiAwLTEsIHNsb3QgaW4gMi02DQorICogIDB4 MDEwIDogMzIgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQorICogIDB4MTEw IDogNjQgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3QgaW4gMy02DQorICovDQorDQorI2Rl ZmluZSBNQVBMRV9QQVJFTlRfUk9PVAkJMHgwMQ0KKw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1NM T1RfU0hJRlQJCTB4MDMNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9TTE9UX01BU0sJCTB4NzgNCisN CisjZGVmaW5lIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9TSElGVAkweDAyDQorI2RlZmluZSBNQVBM RV9QQVJFTlRfMTZCX1NMT1RfTUFTSwkweDdDDQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfUkFO R0U2NAkJMHgwNg0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1JBTkdFMzIJCTB4MDQNCisjZGVmaW5l IE1BUExFX1BBUkVOVF9OT1RfUkFOR0UxNgkweDAyDQorDQorLyoNCisgKiBtdGVfcGFyZW50X3No aWZ0KCkgLSBHZXQgdGhlIHBhcmVudCBzaGlmdCBmb3IgdGhlIHNsb3Qgc3RvcmFnZS4NCisgKiBA cGFyZW50OiBUaGUgcGFyZW50IHBvaW50ZXIgY2FzdCBhcyBhbiB1bnNpZ25lZCBsb25nDQorICog UmV0dXJuOiBUaGUgc2hpZnQgaW50byB0aGF0IHBvaW50ZXIgdG8gdGhlIHN0YXIgdG8gb2YgdGhl IHNsb3QNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3BhcmVudF9zaGlm dCh1bnNpZ25lZCBsb25nIHBhcmVudCkNCit7DQorCS8qIE5vdGUgYml0IDEgPT0gMCBtZWFucyAx NkIgKi8NCisJaWYgKGxpa2VseShwYXJlbnQgJiBNQVBMRV9QQVJFTlRfTk9UX1JBTkdFMTYpKQ0K KwkJcmV0dXJuIE1BUExFX1BBUkVOVF9TTE9UX1NISUZUOw0KKw0KKwlyZXR1cm4gTUFQTEVfUEFS RU5UXzE2Ql9TTE9UX1NISUZUOw0KK30NCisNCisvKg0KKyAqIG10ZV9wYXJlbnRfc2xvdF9tYXNr KCkgLSBHZXQgdGhlIHNsb3QgbWFzayBmb3IgdGhlIHBhcmVudC4NCisgKiBAcGFyZW50OiBUaGUg cGFyZW50IHBvaW50ZXIgY2FzdCBhcyBhbiB1bnNpZ25lZCBsb25nLg0KKyAqIFJldHVybjogVGhl IHNsb3QgbWFzayBmb3IgdGhhdCBwYXJlbnQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBsb25nIG10ZV9wYXJlbnRfc2xvdF9tYXNrKHVuc2lnbmVkIGxvbmcgcGFyZW50KQ0KK3sNCisJ LyogTm90ZSBiaXQgMSA9PSAwIG1lYW5zIDE2QiAqLw0KKwlpZiAobGlrZWx5KHBhcmVudCAmIE1B UExFX1BBUkVOVF9OT1RfUkFOR0UxNikpDQorCQlyZXR1cm4gTUFQTEVfUEFSRU5UX1NMT1RfTUFT SzsNCisNCisJcmV0dXJuIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLOw0KK30NCisNCisvKg0K KyAqIG1hc19wYXJlbnRfZW51bSgpIC0gUmV0dXJuIHRoZSBtYXBsZV90eXBlIG9mIHRoZSBwYXJl bnQgZnJvbSB0aGUgc3RvcmVkDQorICogcGFyZW50IHR5cGUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQG5vZGU6IFRoZSBtYXBsZV9lbm9kZSB0byBleHRyYWN0IHRoZSBwYXJlbnQn cyBlbnVtDQorICogUmV0dXJuOiBUaGUgbm9kZS0+cGFyZW50IG1hcGxlX3R5cGUNCisgKi8NCitz dGF0aWMgaW5saW5lDQorZW51bSBtYXBsZV90eXBlIG10ZV9wYXJlbnRfZW51bShzdHJ1Y3QgbWFw bGVfZW5vZGUgKnBfZW5vZGUsDQorCQkJCXN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXVu c2lnbmVkIGxvbmcgcF90eXBlOw0KKw0KKwlwX3R5cGUgPSAodW5zaWduZWQgbG9uZylwX2Vub2Rl Ow0KKwlpZiAocF90eXBlICYgTUFQTEVfUEFSRU5UX1JPT1QpDQorCQlyZXR1cm4gMDsgLyogVmFs aWRhdGVkIGluIHRoZSBjYWxsZXIuICovDQorDQorCXBfdHlwZSAmPSBNQVBMRV9OT0RFX01BU0s7 DQorCXBfdHlwZSA9IHBfdHlwZSAmIH4oTUFQTEVfUEFSRU5UX1JPT1QgfCBtdGVfcGFyZW50X3Ns b3RfbWFzayhwX3R5cGUpKTsNCisNCisJc3dpdGNoIChwX3R5cGUpIHsNCisJY2FzZSBNQVBMRV9Q QVJFTlRfUkFOR0U2NDogLyogb3IgTUFQTEVfUEFSRU5UX0FSQU5HRTY0ICovDQorCQlpZiAobXRf aXNfYWxsb2MobXQpKQ0KKwkJCXJldHVybiBtYXBsZV9hcmFuZ2VfNjQ7DQorCQlyZXR1cm4gbWFw bGVfcmFuZ2VfNjQ7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUN CitlbnVtIG1hcGxlX3R5cGUgbWFzX3BhcmVudF9lbnVtKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBz dHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJcmV0dXJuIG10ZV9wYXJlbnRfZW51bSht YV9lbm9kZV9wdHIobXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpLCBtYXMtPnRyZWUpOw0KK30N CisNCisvKg0KKyAqIG10ZV9zZXRfcGFyZW50KCkgLSBTZXQgdGhlIHBhcmVudCBub2RlIGFuZCBl bmNvZGUgdGhlIHNsb3QNCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICog QHBhcmVudDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0aGF0IGlzIHRoZSBwYXJlbnQgb2YgQGVu b2RlLg0KKyAqIEBzbG90OiBUaGUgc2xvdCB0aGF0IEBlbm9kZSByZXNpZGVzIGluIEBwYXJlbnQu DQorICoNCisgKiBTbG90IG51bWJlciBpcyBlbmNvZGVkIGluIHRoZSBlbm9kZS0+cGFyZW50IGJp dCAzLTYgb3IgMi02LCBkZXBlbmRpbmcgb24gdGhlDQorICogcGFyZW50IHR5cGUuDQorICovDQor c3RhdGljIGlubGluZQ0KK3ZvaWQgbXRlX3NldF9wYXJlbnQoc3RydWN0IG1hcGxlX2Vub2RlICpl bm9kZSwgY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQsDQorCQkgICAgdW5zaWduZWQg Y2hhciBzbG90KQ0KK3sNCisJdW5zaWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZykgcGFy ZW50Ow0KKwl1bnNpZ25lZCBsb25nIHNoaWZ0Ow0KKwl1bnNpZ25lZCBsb25nIHR5cGU7DQorCWVu dW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtdGVfbm9kZV90eXBlKHBhcmVudCk7DQorDQorCUJVR19P TihwX3R5cGUgPT0gbWFwbGVfZGVuc2UpOw0KKwlCVUdfT04ocF90eXBlID09IG1hcGxlX2xlYWZf NjQpOw0KKw0KKwlzd2l0Y2gocF90eXBlKSB7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNh c2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJc2hpZnQgPSBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVDsN CisJCXR5cGUgPSBNQVBMRV9QQVJFTlRfUkFOR0U2NDsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0K KwljYXNlIG1hcGxlX2RlbnNlOg0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlzaGlmdCA9IHR5 cGUgPSAwOw0KKwkJYnJlYWs7DQorCX0NCisNCisJdmFsICY9IH5NQVBMRV9OT0RFX01BU0s7IC8q IENsZWFyIGFsbCBub2RlIG1ldGFkYXRhIGluIHBhcmVudCAqLw0KKwl2YWwgfD0gKHNsb3QgPDwg c2hpZnQpIHwgdHlwZTsNCisJbXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQgPSBtYV9wYXJlbnRf cHRyKHZhbCk7DQorfQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90KCkgLSBnZXQgdGhlIHBh cmVudCBzbG90IG9mIEBlbm9kZS4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUu DQorICoNCisgKiBSZXR1cm46IFRoZSBzbG90IGluIHRoZSBwYXJlbnQgbm9kZSB3aGVyZSBAZW5v ZGUgcmVzaWRlcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtdGVfcGFyZW50 X3Nsb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXVuc2lnbmVkIGxv bmcgdmFsID0gKHVuc2lnbmVkIGxvbmcpIG10ZV90b19ub2RlKGVub2RlKS0+cGFyZW50Ow0KKw0K KwkvKiBSb290LiAqLw0KKwlpZiAodmFsICYgMSkNCisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkg KiBPa2F5IHRvIHVzZSBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfTUFTSyBhcyB0aGUgbGFzdCBiaXQg d2lsbCBiZSBsb3N0DQorCSAqIGJ5IHNoaWZ0IGlmIHRoZSBwYXJlbnQgc2hpZnQgaXMgTUFQTEVf UEFSRU5UX1NMT1RfU0hJRlQNCisJICovDQorCXJldHVybiAodmFsICYgTUFQTEVfUEFSRU5UXzE2 Ql9TTE9UX01BU0spID4+IG10ZV9wYXJlbnRfc2hpZnQodmFsKTsNCit9DQorDQorLyoNCisgKiBt dGVfcGFyZW50KCkgLSBHZXQgdGhlIHBhcmVudCBvZiBAbm9kZS4NCisgKiBAbm9kZTogVGhlIGVu Y29kZWQgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBhcmVudCBtYXBsZSBub2Rl Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10ZV9wYXJlbnQoY29u c3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXJldHVybiAodm9pZCAqKSgodW5z aWduZWQgbG9uZykNCisJCQkobXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQpICYgfk1BUExFX05P REVfTUFTSyk7DQorfQ0KKw0KKy8qDQorICogbWFfZGVhZF9ub2RlKCkgLSBjaGVjayBpZiB0aGUg QGVub2RlIGlzIGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlDQorICoN CisgKiBSZXR1cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtYV9kZWFkX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50ID0gKHZvaWQgKikoKHVuc2lnbmVkIGxv bmcpDQorCQkJCQkgICAgIG5vZGUtPnBhcmVudCAmIH5NQVBMRV9OT0RFX01BU0spOw0KKw0KKwly ZXR1cm4gKHBhcmVudCA9PSBub2RlKTsNCit9DQorLyoNCisgKiBtdGVfZGVhZF9ub2RlKCkgLSBj aGVjayBpZiB0aGUgQGVub2RlIGlzIGRlYWQuDQorICogQGVub2RlOiBUaGUgZW5jb2RlZCBtYXBs ZSBub2RlDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgZGVhZCwgZmFsc2Ugb3RoZXJ3aXNlLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfZGVhZF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBs ZV9lbm9kZSAqZW5vZGUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50LCAqbm9kZTsN CisNCisJbm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisJcGFyZW50ID0gbXRlX3BhcmVudChl bm9kZSk7DQorCXJldHVybiAocGFyZW50ID09IG5vZGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19h bGxvY2F0ZWQoKSAtIEdldCB0aGUgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZCBpbiBhIG1hcGxl IHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIG1hX3N0YXRl IGFsbG9jIG1lbWJlciBpcyBvdmVybG9hZGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJz dA0KKyAqIGFsbG9jYXRlZCBub2RlIG9yIHRvIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIG5vZGVz IHRvIGFsbG9jYXRlLiAgSWYgYml0IDAgaXMNCisgKiBzZXQsIHRoZW4gdGhlIGFsbG9jIGNvbnRh aW5zIHRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIG5vZGVzLiAgSWYgdGhlcmUgaXMgYW4NCisgKiBh bGxvY2F0ZWQgbm9kZSwgdGhlbiB0aGUgdG90YWwgYWxsb2NhdGVkIG5vZGVzIGlzIGluIHRoYXQg bm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHRvdGFsIG51bWJlciBvZiBub2RlcyBhbGxvY2F0 ZWQNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWFzX2FsbG9jYXRlZChjb25z dCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmICghbWFzLT5hbGxvYyB8fCAoKHVuc2ln bmVkIGxvbmcpbWFzLT5hbGxvYyAmIDB4MSkpDQorCQlyZXR1cm4gMDsNCisNCisJcmV0dXJuIG1h cy0+YWxsb2MtPnRvdGFsOw0KK30NCisNCisvKg0KKyAqIG1hc19zZXRfYWxsb2NfcmVxKCkgLSBT ZXQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMuDQorICogQG1hczogdGhlIG1h cGxlIHN0YXRlDQorICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLg0KKyAqDQor ICogVGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYWxsb2NhdGlvbnMgaXMgZWl0aGVyIGluIHRoZSBm aXJzdCBhbGxvY2F0ZWQgbm9kZSwNCisgKiBsb2NhdGVkIGluIEBtYXMtPmFsbG9jLT5yZXF1ZXN0 X2NvdW50LCBvciBkaXJlY3RseSBpbiBAbWFzLT5hbGxvYyBpZiB0aGVyZSBpcw0KKyAqIG5vIGFs bG9jYXRlZCBub2RlLiAgU2V0IHRoZSByZXF1ZXN0IGVpdGhlciBpbiB0aGUgbm9kZSBvciBkbyB0 aGUgbmVjZXNzYXJ5DQorICogZW5jb2RpbmcgdG8gc3RvcmUgaW4gQG1hcy0+YWxsb2MgZGlyZWN0 bHkuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRfYWxsb2NfcmVxKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGNvdW50KQ0KK3sNCisJaWYgKCFtYXMtPmFsbG9j IHx8ICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkgew0KKwkJaWYgKCFjb3VudCkN CisJCQltYXMtPmFsbG9jID0gTlVMTDsNCisJCWVsc2UNCisJCQltYXMtPmFsbG9jID0gKHN0cnVj dCBtYXBsZV9hbGxvYyAqKSgoKGNvdW50KSA8PCAxVSkgfCAxVSk7DQorCQlyZXR1cm47DQorCX0N CisNCisJbWFzLT5hbGxvYy0+cmVxdWVzdF9jb3VudCA9IGNvdW50Ow0KK30NCisNCisvKg0KKyAq IG1hc19hbGxvY19yZXEoKSAtIGdldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9u cy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFRoZSBhbGxvYyBjb3VudCBp cyBlaXRoZXIgc3RvcmVkIGRpcmVjdGx5IGluIEBtYXMsIG9yIGluDQorICogQG1hcy0+YWxsb2Mt PnJlcXVlc3RfY291bnQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG5vZGUgYWxsb2NhdGVkLiAg RGVjb2RlDQorICogdGhlIHJlcXVlc3QgY291bnQgaWYgaXQncyBzdG9yZWQgZGlyZWN0bHkgaW4g QG1hcy0+YWxsb2MuDQorICoNCisgKiBSZXR1cm46IFRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgY291 bnQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWFzX2FsbG9jX3JlcShjb25z dCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmICgodW5zaWduZWQgbG9uZyltYXMtPmFs bG9jICYgMHgxKQ0KKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKShtYXMtPmFsbG9jKSA+PiAxOw0K KwllbHNlIGlmIChtYXMtPmFsbG9jKQ0KKwkJcmV0dXJuIG1hcy0+YWxsb2MtPnJlcXVlc3RfY291 bnQ7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hX3Bpdm90cygpIC0gR2V0IGEgcG9p bnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMuDQorICogQG5vZGUgLSB0aGUgbWFwbGUgbm9k ZQ0KKyAqIEB0eXBlIC0gdGhlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIg dG8gdGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBs b25nICptYV9waXZvdHMoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCQkgICBlbnVtIG1h cGxlX3R5cGUgdHlwZSkNCit7DQorCXN3aXRjaCAodHlwZSkgew0KKwljYXNlIG1hcGxlX2FyYW5n ZV82NDoNCisJCXJldHVybiBub2RlLT5tYTY0LnBpdm90Ow0KKwljYXNlIG1hcGxlX3JhbmdlXzY0 Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5waXZvdDsNCisJ Y2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVybiBOVUxMOw0K K30NCisNCisvKg0KKyAqIG1hX2dhcHMoKSAtIEdldCBhIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5v ZGUgZ2Fwcy4NCisgKiBAbm9kZSAtIHRoZSBtYXBsZSBub2RlDQorICogQHR5cGUgLSB0aGUgbm9k ZSB0eXBlDQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBnYXBz DQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICptYV9nYXBzKHN0cnVjdCBtYXBs ZV9ub2RlICpub2RlLA0KKwkJCQkgICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dp dGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1h NjQuZ2FwOw0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQor CWNhc2UgbWFwbGVfZGVuc2U6DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKwlyZXR1cm4gTlVMTDsN Cit9DQorDQorLyoNCisgKiBtdGVfcGl2b3QoKSAtIEdldCB0aGUgcGl2b3QgYXQgQHBpdiBvZiB0 aGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIGVuY29kZWQgbm9kZS4N CisgKiBAcGl2OiBUaGUgcGl2b3QuDQorICoNCisgKiBSZXR1cm46IHRoZSBwaXZvdCBhdCBAcGl2 IG9mIEBtbi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3Bpdm90KGNv bnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4sDQorCQkJCSB1bnNpZ25lZCBjaGFyIHBpdikNCit7 DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKw0KKwlpZihw aXYgPj0gbXRfcGl2b3RzW3Bpdl0pIHsNCisJCVdBUk5fT04oMSk7DQorCQlyZXR1cm4gMDsNCisJ fQ0KKwlzd2l0Y2ggKG10ZV9ub2RlX3R5cGUobW4pKSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0 Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQucGl2b3RbcGl2XTsNCisJY2FzZSBtYXBsZV9yYW5nZV82 NDoNCisJY2FzZSBtYXBsZV9sZWFmXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1yNjQucGl2b3RbcGl2 XTsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVybiAwOw0KKwl9DQorCXJldHVybiAwOw0K K30NCisNCisvKg0KKyAqIG1hc19zYWZlX3Bpdm90KCkgLSBnZXQgdGhlIHBpdm90IGF0IEBwaXYg b3IgbWFzLT5tYXguDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHBpdm90czogVGhl IHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICogQHBpdjogVGhlIHBpdm90IHRv IGZldGNoDQorICogQHR5cGU6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjog VGhlIHBpdm90IGF0IEBwaXYgd2l0aGluIHRoZSBsaW1pdCBvZiB0aGUgQHBpdm90cyBhcnJheSwg QG1hcy0+bWF4DQorICogb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQg bG9uZw0KK21hc19zYWZlX3Bpdm90KGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25l ZCBsb25nICpwaXZvdHMsDQorCSAgICAgICB1bnNpZ25lZCBjaGFyIHBpdiwgZW51bSBtYXBsZV90 eXBlIHR5cGUpDQorew0KKwlpZiAocGl2ID49IG10X3Bpdm90c1t0eXBlXSkNCisJCXJldHVybiBt YXMtPm1heDsNCisNCisJcmV0dXJuIHBpdm90c1twaXZdOw0KK30NCisNCisvKg0KKyAqIG1hc19z YWZlX21pbigpIC0gUmV0dXJuIHRoZSBtaW5pbXVtIGZvciBhIGdpdmVuIG9mZnNldC4NCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAcGl2b3RzOiBUaGUgcG9pbnRlciB0byB0aGUgbWFw bGUgbm9kZSBwaXZvdHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHBpdm90IGFy cmF5DQorICoNCisgKiBSZXR1cm46IFRoZSBtaW5pbXVtIHJhbmdlIHZhbHVlIHRoYXQgaXMgY29u dGFpbmVkIGluIEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQor bWFzX3NhZmVfbWluKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nICpwaXZvdHMs IHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJaWYgKGxpa2VseShvZmZzZXQpKQ0KKwkJcmV0 dXJuIHBpdm90c1tvZmZzZXQgLSAxXSArIDE7DQorDQorCXJldHVybiBtYXMtPm1pbjsNCit9DQor DQorLyoNCisgKiBtYXNfbG9naWNhbF9waXZvdCgpIC0gR2V0IHRoZSBsb2dpY2FsIHBpdm90IG9m IGEgZ2l2ZW4gb2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6 IFRoZSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBvZmZzZXQ6IFRoZSBv ZmZzZXQgaW50byB0aGUgcGl2b3QgYXJyYXkNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlw ZQ0KKyAqDQorICogV2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBhdCBhIHBpdm90IChiZXlvbmQgdGhl IGVuZCBvZiB0aGUgZGF0YSksIHRoZW4gdGhlDQorICogcGl2b3QgaXMgYWN0dWFsbHkgQG1hcy0+ bWF4Lg0KKyAqDQorICogUmV0dXJuOiB0aGUgbG9naWNhbCBwaXZvdCBvZiBhIGdpdmVuIEBvZmZz ZXQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQorbWFzX2xvZ2ljYWxfcGl2 b3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJCSAgdW5z aWduZWQgY2hhciBvZmZzZXQsIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJdW5zaWduZWQg bG9uZyBscGl2ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIG9mZnNldCwgdHlwZSk7DQor DQorCWlmIChsaWtlbHkobHBpdikpDQorCQlyZXR1cm4gbHBpdjsNCisNCisJaWYgKGxpa2VseShv ZmZzZXQpKQ0KKwkJcmV0dXJuIG1hcy0+bWF4Ow0KKw0KKwlyZXR1cm4gbHBpdjsNCit9DQorDQor LyoNCisgKiBtdGVfc2V0X3Bpdm90KCkgLSBTZXQgYSBwaXZvdCB0byBhIHZhbHVlIGluIGFuIGVu Y29kZWQgbWFwbGUgbm9kZS4NCisgKiBAbW46IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBA cGl2OiBUaGUgcGl2b3Qgb2Zmc2V0DQorICogQHZhbDogVGhlIHZhbHVlIG9mIHRoZSBwaXZvdA0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfc2V0X3Bpdm90KHN0cnVjdCBtYXBsZV9lbm9k ZSAqbW4sIHVuc2lnbmVkIGNoYXIgcGl2LA0KKwkJCQl1bnNpZ25lZCBsb25nIHZhbCkNCit7DQor CXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKwllbnVtIG1hcGxl X3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobW4pOw0KKw0KKwlCVUdfT04ocGl2ID49IG10X3Bp dm90c1t0eXBlXSk7DQorCXN3aXRjaCAodHlwZSkgew0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxl X3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlub2RlLT5tcjY0LnBpdm90W3Bp dl0gPSB2YWw7DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlub2RlLT5t YTY0LnBpdm90W3Bpdl0gPSB2YWw7DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJ CWJyZWFrOw0KKwl9DQorDQorfQ0KKw0KKy8qDQorICogbWFfc2xvdHMoKSAtIEdldCBhIHBvaW50 ZXIgdG8gdGhlIG1hcGxlIG5vZGUgc2xvdHMuDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAq IEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50ZXIgdG8g dGhlIG1hcGxlIG5vZGUgc2xvdHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgX19yY3UgKipt YV9zbG90cyhzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQor CXN3aXRjaCAobXQpIHsNCisJZGVmYXVsdDoNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQly ZXR1cm4gbW4tPm1hNjQuc2xvdDsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2FzZSBtYXBs ZV9sZWFmXzY0Og0KKwkJcmV0dXJuIG1uLT5tcjY0LnNsb3Q7DQorCWNhc2UgbWFwbGVfZGVuc2U6 DQorCQlyZXR1cm4gbW4tPnNsb3Q7DQorCX0NCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10 X2xvY2tlZChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXRfZXh0 ZXJuYWxfbG9jayhtdCkgPyBtdF9sb2NrX2lzX2hlbGQobXQpIDoNCisJCWxvY2tkZXBfaXNfaGVs ZCgmbXQtPm1hX2xvY2spOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10X3Nsb3QoY29u c3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LA0KKwkJdm9pZCBfX3JjdSAqKnNsb3RzLCB1bnNpZ25l ZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2soc2xvdHNb b2Zmc2V0XSwgbXRfbG9ja2VkKG10KSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Nsb3RfbG9ja2Vk KCkgLSBHZXQgdGhlIHNsb3QgdmFsdWUgd2hlbiBob2xkaW5nIHRoZSBtYXBsZSB0cmVlIGxvY2su DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNsb3RzOiBUaGUgcG9pbnRlciB0byB0 aGUgc2xvdHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHNsb3RzIGFycmF5IHRv IGZldGNoDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBzdG9yZWQgaW4gQHNsb3RzIGF0IHRo ZSBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3Nsb3RfbG9ja2VkKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJCSAgICAgICB1bnNp Z25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVk KHNsb3RzW29mZnNldF0sIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorLyoNCisgKiBt YXNfc2xvdCgpIC0gR2V0IHRoZSBzbG90IHZhbHVlIHdoZW4gbm90IGhvbGRpbmcgdGhlIG1hcGxl IHRyZWUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFRoZSBw b2ludGVyIHRvIHRoZSBzbG90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xv dHMgYXJyYXkgdG8gZmV0Y2gNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBpbiBA c2xvdHMgYXQgdGhlIEBvZmZzZXQNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zbG90 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJICAgICB1bnNp Z25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiBtdF9zbG90KG1hcy0+dHJlZSwgc2xvdHMs IG9mZnNldCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jvb3QoKSAtIEdldCB0aGUgbWFwbGUgdHJl ZSByb290Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogVGhl IHBvaW50ZXIgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgKm1hc19yb290KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJl ZmVyZW5jZV9jaGVjayhtYXMtPnRyZWUtPm1hX3Jvb3QsIG10X2xvY2tlZChtYXMtPnRyZWUpKTsN Cit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdF9yb290X2xvY2tlZChzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChtdC0+bWFf cm9vdCwgbXRfbG9ja2VkKG10KSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jvb3RfbG9ja2VkKCkg LSBHZXQgdGhlIG1hcGxlIHRyZWUgcm9vdCB3aGVuIGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9j ay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBwb2lu dGVyIHRvIHRoZSByb290IG9mIHRoZSB0cmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICpt YXNfcm9vdF9sb2NrZWQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRfcm9v dF9sb2NrZWQobWFzLT50cmVlKTsNCit9DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVf bWV0YWRhdGEgKm1hX21ldGEoc3RydWN0IG1hcGxlX25vZGUgKm1uLA0KKwkJCQkJICAgICBlbnVt IG1hcGxlX3R5cGUgbXQpDQorew0KKwlzd2l0Y2ggKG10KSB7DQorCWNhc2UgbWFwbGVfYXJhbmdl XzY0Og0KKwkJcmV0dXJuICZtbi0+bWE2NC5tZXRhOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuICZt bi0+bXI2NC5tZXRhOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFfc2V0X21ldGEoKSAtIFNldCB0 aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gb2YgYSBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5v ZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0 IG9mIHRoZSBoaWdoZXN0IHN1Yi1nYXAgaW4gdGhpcyBub2RlLg0KKyAqIEBlbmQ6IFRoZSBlbmQg b2YgdGhlIGRhdGEgaW4gdGhpcyBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYV9z ZXRfbWV0YShzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJCQkg ICAgICAgdW5zaWduZWQgY2hhciBvZmZzZXQsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3Ry dWN0IG1hcGxlX21ldGFkYXRhICptZXRhID0gbWFfbWV0YShtbiwgbXQpOw0KKw0KKwltZXRhLT5n YXAgPSBvZmZzZXQ7DQorCW1ldGEtPmVuZCA9IGVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRh X2VuZCgpIC0gR2V0IHRoZSBkYXRhIGVuZCBvZiBhIG5vZGUgZnJvbSB0aGUgbWV0YWRhdGENCisg KiBAbW46IFRoZSBtYXBsZSBub2RlDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICov DQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hX21ldGFfZW5kKHN0cnVjdCBtYXBsZV9u b2RlICptbiwNCisJCQkJCWVudW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCXN0cnVjdCBtYXBsZV9t ZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJcmV0dXJuIG1ldGEtPmVuZDsN Cit9DQorDQorLyoNCisgKiBtYV9tZXRhX2dhcCgpIC0gR2V0IHRoZSBsYXJnZXN0IGdhcCBsb2Nh dGlvbiBvZiBhIG5vZGUgZnJvbSB0aGUgbWV0YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2Rl DQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlubGluZSB1bnNp Z25lZCBjaGFyIG1hX21ldGFfZ2FwKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCWVudW0g bWFwbGVfdHlwZSBtdCkNCit7DQorCUJVR19PTihtdCAhPSBtYXBsZV9hcmFuZ2VfNjQpOw0KKw0K KwlyZXR1cm4gbW4tPm1hNjQubWV0YS5nYXA7DQorfQ0KKw0KKy8qDQorICogbWFfc2V0X21ldGFf Z2FwKCkgLSBTZXQgdGhlIGxhcmdlc3QgZ2FwIGxvY2F0aW9uIGluIGEgbm9kZXMgbWV0YWRhdGEN CisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQorICogQG1uOiBUaGUgbWFwbGUgbm9kZSB0eXBlDQor ICogQG9mZnNldDogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXJnZXN0IGdhcC4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFfc2V0X21ldGFfZ2FwKHN0cnVjdCBtYXBsZV9ub2RlICptbiwgZW51 bSBtYXBsZV90eXBlIG10LA0KKwkJCQkgICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorDQor CXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEobW4sIG10KTsNCisNCisJbWV0 YS0+Z2FwID0gb2Zmc2V0Ow0KK30NCisNCisvKg0KKyAqIG1hdF9hZGQoKSAtIEFkZCBhIEBkZWFk X2Vub2RlIHRvIHRoZSBtYV90b3BpYXJ5IG9mIGEgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBt YXQgLSB0aGUgbWFfdG9waWFyeSwgYSBsaW5rZWQgbGlzdCBvZiBkZWFkIG5vZGVzLg0KKyAqIEBk ZWFkX2Vub2RlIC0gdGhlIG5vZGUgdG8gYmUgbWFya2VkIGFzIGRlYWQgYW5kIGFkZGVkIHRvIHRo ZSB0YWlsIG9mIHRoZSBsaXN0DQorICoNCisgKiBBZGQgdGhlIEBkZWFkX2Vub2RlIHRvIHRoZSBs aW5rZWQgbGlzdCBpbiBAbWF0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXRfYWRkKHN0 cnVjdCBtYV90b3BpYXJ5ICptYXQsDQorCQkJICAgc3RydWN0IG1hcGxlX2Vub2RlICpkZWFkX2Vu b2RlKQ0KK3sNCisJbXRlX3NldF9ub2RlX2RlYWQoZGVhZF9lbm9kZSk7DQorCW10ZV90b19tYXQo ZGVhZF9lbm9kZSktPm5leHQgPSBOVUxMOw0KKwlpZiAoIW1hdC0+dGFpbCkgew0KKwkJbWF0LT50 YWlsID0gbWF0LT5oZWFkID0gZGVhZF9lbm9kZTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltdGVf dG9fbWF0KG1hdC0+dGFpbCktPm5leHQgPSBkZWFkX2Vub2RlOw0KKwltYXQtPnRhaWwgPSBkZWFk X2Vub2RlOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdGVfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBs ZV9lbm9kZSAqLCBzdHJ1Y3QgbWFwbGVfdHJlZSAqKTsNCitzdGF0aWMgaW5saW5lIHZvaWQgbWFz X2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9lbm9kZSAqdXNlZCk7DQor DQorLyoNCisgKiBtYXNfbWF0X2ZyZWUoKSAtIEZyZWUgYWxsIG5vZGVzIGluIGEgZGVhZCBsaXN0 Lg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUNCisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnkg bGlua2VkIGxpc3Qgb2YgZGVhZCBub2RlcyB0byBmcmVlLg0KKyAqDQorICogRnJlZSB3YWxrIGEg ZGVhZCBsaXN0Lg0KKyAqLw0KK3N0YXRpYyB2b2lkIG1hc19tYXRfZnJlZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgc3RydWN0IG1hX3RvcGlhcnkgKm1hdCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqbmV4dDsNCisNCisJd2hpbGUgKG1hdC0+aGVhZCkgew0KKwkJbmV4dCA9IG10ZV90b19tYXQo bWF0LT5oZWFkKS0+bmV4dDsNCisJCW1hc19mcmVlKG1hcywgbWF0LT5oZWFkKTsNCisJCW1hdC0+ aGVhZCA9IG5leHQ7DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfbWF0X2Rlc3Ryb3koKSAtIEZy ZWUgYWxsIG5vZGVzIGFuZCBzdWJ0cmVlcyBpbiBhIGRlYWQgbGlzdC4NCisgKiBAbWFzIC0gdGhl IG1hcGxlIHN0YXRlDQorICogQG1hdCAtIHRoZSBtYV90b3BpYXJ5IGxpbmtlZCBsaXN0IG9mIGRl YWQgbm9kZXMgdG8gZnJlZS4NCisgKg0KKyAqIERlc3Ryb3kgd2FsayBhIGRlYWQgbGlzdC4NCisg Ki8NCitzdGF0aWMgdm9pZCBtYXNfbWF0X2Rlc3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMsIHN0 cnVjdCBtYV90b3BpYXJ5ICptYXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQ7DQor DQorCXdoaWxlIChtYXQtPmhlYWQpIHsNCisJCW5leHQgPSBtdGVfdG9fbWF0KG1hdC0+aGVhZCkt Pm5leHQ7DQorCQltdGVfZGVzdHJveV93YWxrKG1hdC0+aGVhZCwgbWF0LT5tdHJlZSk7DQorCQlt YXQtPmhlYWQgPSBuZXh0Ow0KKwl9DQorfQ0KKy8qDQorICogbWFzX2Rlc2NlbmQoKSAtIERlc2Nl bmQgaW50byB0aGUgc2xvdCBzdG9yZWQgaW4gdGhlIG1hX3N0YXRlLg0KKyAqIEBtYXMgLSB0aGUg bWFwbGUgc3RhdGUuDQorICoNCisgKiBOb3RlOiBOb3QgUkNVIHNhZmUsIG9ubHkgdXNlIGluIHdy aXRlIHNpZGUgb3IgZGVidWcgY29kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Rl c2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsN CisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJ dm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXR5cGUgPSBt dGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBl KTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisNCisJaWYgKG1hcy0+b2Zmc2V0 KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbbWFzLT5vZmZzZXQgLSAxXSArIDE7DQorCW1hcy0+bWF4 ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIG1hcy0+b2Zmc2V0LCB0eXBlKTsNCisJbWFz LT5ub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0KK30NCisNCisvKg0K KyAqIG10ZV9zZXRfZ2FwKCkgLSBTZXQgYSBtYXBsZSBub2RlIGdhcC4NCisgKiBAbW46IFRoZSBl bmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAZ2FwOiBUaGUgb2Zmc2V0IG9mIHRoZSBnYXAgdG8gc2V0 DQorICogQHZhbDogVGhlIGdhcCB2YWx1ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVf c2V0X2dhcChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uLA0KKwkJCQkgdW5zaWduZWQgY2hh ciBnYXAsIHVuc2lnbmVkIGxvbmcgdmFsKQ0KK3sNCisJc3dpdGNoIChtdGVfbm9kZV90eXBlKG1u KSkgew0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJ bXRlX3RvX25vZGUobW4pLT5tYTY0LmdhcFtnYXBdID0gdmFsOw0KKwkJYnJlYWs7DQorCX0NCit9 DQorDQorLyoNCisgKiBtYXNfYXNjZW5kKCkgLSBXYWxrIHVwIGEgbGV2ZWwgb2YgdGhlIHRyZWUu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBTZXRzIHRoZSBAbWFzLT5tYXgg YW5kIEBtYXMtPm1pbiB0byB0aGUgY29ycmVjdCB2YWx1ZXMgd2hlbiB3YWxraW5nIHVwLiAgVGhp cw0KKyAqIG1heSBjYXVzZSBzZXZlcmFsIGxldmVscyBvZiB3YWxraW5nIHVwIHRvIGZpbmQgdGhl IGNvcnJlY3QgbWluIGFuZCBtYXguDQorICogTWF5IGZpbmQgYSBkZWFkIG5vZGUgd2hpY2ggd2ls bCBjYXVzZSBhIHByZW1hdHVyZSByZXR1cm4uDQorICogUmV0dXJuOiAxIG9uIGRlYWQgbm9kZSwg MCBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW50IG1hc19hc2NlbmQoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBfZW5vZGU7IC8qIHBhcmVudCBlbm9k ZS4gKi8NCisJc3RydWN0IG1hcGxlX2Vub2RlICphX2Vub2RlOyAvKiBhbmNlc3RvciBlbm9kZS4g Ki8NCisJc3RydWN0IG1hcGxlX25vZGUgKmFfbm9kZTsgLyogYW5jZXN0b3Igbm9kZS4gKi8NCisJ c3RydWN0IG1hcGxlX25vZGUgKnBfbm9kZTsgLyogcGFyZW50IG5vZGUuICovDQorCXVuc2lnbmVk IGNoYXIgYV9zbG90Ow0KKwllbnVtIG1hcGxlX3R5cGUgYV90eXBlOw0KKwl1bnNpZ25lZCBsb25n IG1pbiwgbWF4Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zm c2V0Ow0KKwlib29sIHNldF9tYXggPSBmYWxzZSwgc2V0X21pbiA9IGZhbHNlOw0KKw0KKwlhX25v ZGUgPSBtYXNfbW4obWFzKTsNCisJaWYgKG1hX2lzX3Jvb3QoYV9ub2RlKSkgew0KKwkJbWFzLT5v ZmZzZXQgPSAwOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJcF9ub2RlID0gbXRlX3BhcmVudCht YXMtPm5vZGUpOw0KKwlpZiAodW5saWtlbHkoYV9ub2RlID09IHBfbm9kZSkpDQorCQlyZXR1cm4g MTsNCisJYV90eXBlID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJb2Zmc2V0 ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCWFfZW5vZGUgPSBtdF9ta19ub2RlKHBf bm9kZSwgYV90eXBlKTsNCisNCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBwYXJlbnQgaW5m b3JtYXRpb24gaXMgc3RpbGwgYWNjdXJhdGUgKi8NCisJaWYgKHBfbm9kZSAhPSBtdGVfcGFyZW50 KG1hcy0+bm9kZSkpDQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gYV9lbm9kZTsNCisJ bWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorDQorCWlmIChtdGVfaXNfcm9vdChhX2Vub2RlKSkgew0K KwkJbWFzLT5tYXggPSBVTE9OR19NQVg7DQorCQltYXMtPm1pbiA9IDA7DQorCQlyZXR1cm4gMDsN CisJfQ0KKw0KKwltaW4gPSAwOw0KKwltYXggPSBVTE9OR19NQVg7DQorCWRvIHsNCisJCXBfZW5v ZGUgPSBhX2Vub2RlOw0KKwkJYV90eXBlID0gbWFzX3BhcmVudF9lbnVtKG1hcywgcF9lbm9kZSk7 DQorCQlhX25vZGUgPSBtdGVfcGFyZW50KHBfZW5vZGUpOw0KKwkJYV9zbG90ID0gbXRlX3BhcmVu dF9zbG90KHBfZW5vZGUpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKGFfbm9kZSwgYV90eXBlKTsN CisJCWFfZW5vZGUgPSBtdF9ta19ub2RlKGFfbm9kZSwgYV90eXBlKTsNCisNCisJCWlmICghc2V0 X21pbiAmJiBhX3Nsb3QpIHsNCisJCQlzZXRfbWluID0gdHJ1ZTsNCisJCQltaW4gPSBwaXZvdHNb YV9zbG90IC0gMV0gKyAxOw0KKwkJfQ0KKw0KKwkJaWYgKCFzZXRfbWF4ICYmIGFfc2xvdCA8IG10 X3Bpdm90c1thX3R5cGVdKSB7DQorCQkJc2V0X21heCA9IHRydWU7DQorCQkJbWF4ID0gcGl2b3Rz W2Ffc2xvdF07DQorCQl9DQorDQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKGFfbm9kZSkp KQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJaWYgKHVubGlrZWx5KG1hX2lzX3Jvb3QoYV9ub2RlKSkp DQorCQkJYnJlYWs7DQorDQorCX0gd2hpbGUgKCFzZXRfbWluIHx8ICFzZXRfbWF4KTsNCisNCisJ bWFzLT5tYXggPSBtYXg7DQorCW1hcy0+bWluID0gbWluOw0KKwlyZXR1cm4gMDsNCit9DQorDQor LyoNCisgKiBtYXNfcG9wX25vZGUoKSAtIEdldCBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1hcGxl IG5vZGUgZnJvbSB0aGUgbWFwbGUgc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byBhIG1hcGxlIG5vZGUuDQorICovDQorc3RhdGlj IGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbWFzX3BvcF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAq bWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpyZXQsICpub2RlID0gbWFzLT5hbGxvYzsN CisJdW5zaWduZWQgbG9uZyB0b3RhbCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJLyogbm90 aGluZyBvciBhIHJlcXVlc3QgcGVuZGluZy4gKi8NCisJaWYgKHVubGlrZWx5KCF0b3RhbCkpDQor CQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKHRvdGFsID09IDEpIHsNCisJCS8qIHNpbmdsZSBhbGxv Y2F0aW9uIGluIHRoaXMgbWFfc3RhdGUgKi8NCisJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJcmV0 ID0gbm9kZTsNCisJCWdvdG8gc2luZ2xlX25vZGU7DQorCX0NCisNCisJaWYgKCFub2RlLT5ub2Rl X2NvdW50KSB7DQorCQkvKiBTaW5nbGUgYWxsb2NhdGlvbiBpbiB0aGlzIG5vZGUuICovDQorCQlt YXMtPmFsbG9jID0gbm9kZS0+c2xvdFswXTsNCisJCW5vZGUtPnNsb3RbMF0gPSBOVUxMOw0KKwkJ bWFzLT5hbGxvYy0+dG90YWwgPSBub2RlLT50b3RhbCAtIDE7DQorCQlyZXQgPSBub2RlOw0KKwkJ Z290byBuZXdfaGVhZDsNCisJfQ0KKw0KKwlub2RlLT50b3RhbC0tOw0KKwlyZXQgPSBub2RlLT5z bG90W25vZGUtPm5vZGVfY291bnRdOw0KKwlub2RlLT5zbG90W25vZGUtPm5vZGVfY291bnQtLV0g PSBOVUxMOw0KKw0KK3NpbmdsZV9ub2RlOg0KK25ld19oZWFkOg0KKwlyZXQtPnRvdGFsID0gMDsN CisJcmV0LT5ub2RlX2NvdW50ID0gMDsNCisJaWYgKHJldC0+cmVxdWVzdF9jb3VudCkgew0KKwkJ bWFzX3NldF9hbGxvY19yZXEobWFzLCByZXQtPnJlcXVlc3RfY291bnQgKyAxKTsNCisJCXJldC0+ cmVxdWVzdF9jb3VudCA9IDA7DQorCX0NCisJcmV0dXJuIChzdHJ1Y3QgbWFwbGVfbm9kZSAqKXJl dDsNCit9DQorDQorLyoNCisgKiBtYXNfcHVzaF9ub2RlKCkgLSBQdXNoIGEgbm9kZSBiYWNrIG9u IHRoZSBtYXBsZSBzdGF0ZSBhbGxvY2F0aW9uLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEB1c2VkOiBUaGUgdXNlZCBtYXBsZSBub2RlDQorICoNCisgKiBTdG9yZXMgdGhlIG1hcGxl IG5vZGUgYmFjayBpbnRvIEBtYXMtPmFsbG9jIGZvciByZXVzZS4gIFVwZGF0ZXMgYWxsb2NhdGVk IGFuZA0KKyAqIHJlcXVlc3RlZCBub2RlIGNvdW50IGFzIG5lY2Vzc2FyeS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3B1c2hfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0 IG1hcGxlX25vZGUgKnVzZWQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKnJldXNlID0gKHN0 cnVjdCBtYXBsZV9hbGxvYyAqKXVzZWQ7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqaGVhZCA9IG1h cy0+YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcgY291bnQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0 ZWQgPSBtYXNfYWxsb2NfcmVxKG1hcyk7DQorDQorCW1lbXNldChyZXVzZSwgMCwgc2l6ZW9mKCpy ZXVzZSkpOw0KKwljb3VudCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJaWYgKGNvdW50ICYm IChoZWFkLT5ub2RlX2NvdW50IDwgTUFQTEVfQUxMT0NfU0xPVFMgLSAxKSkgew0KKwkJaWYgKGhl YWQtPnNsb3RbMF0pDQorCQkJaGVhZC0+bm9kZV9jb3VudCsrOw0KKwkJaGVhZC0+c2xvdFtoZWFk LT5ub2RlX2NvdW50XSA9IHJldXNlOw0KKwkJaGVhZC0+dG90YWwrKzsNCisJCWdvdG8gZG9uZTsN CisJfQ0KKw0KKwlyZXVzZS0+dG90YWwgPSAxOw0KKwlpZiAoKGhlYWQpICYmICEoKHVuc2lnbmVk IGxvbmcpaGVhZCAmIDB4MSkpIHsNCisJCWhlYWQtPnJlcXVlc3RfY291bnQgPSAwOw0KKwkJcmV1 c2UtPnNsb3RbMF0gPSBoZWFkOw0KKwkJcmV1c2UtPnRvdGFsICs9IGhlYWQtPnRvdGFsOw0KKwl9 DQorDQorCW1hcy0+YWxsb2MgPSByZXVzZTsNCitkb25lOg0KKwlpZiAocmVxdWVzdGVkID4gMSkN CisJCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgcmVxdWVzdGVkIC0gMSk7DQorfQ0KKw0KKy8qDQor ICogbWFzX2FsbG9jX25vZGVzKCkgLSBBbGxvY2F0ZSBub2RlcyBpbnRvIGEgbWFwbGUgc3RhdGUN CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZ2ZwOiBUaGUgR0ZQIEZsYWdzDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19hbGxvY19ub2RlcyhzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgZ2ZwX3QgZ2ZwKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpub2RlOw0KKwlzdHJ1Y3Qg bWFwbGVfYWxsb2MgKipub2RlcCA9ICZtYXMtPmFsbG9jOw0KKwl1bnNpZ25lZCBsb25nIGFsbG9j YXRlZCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisJdW5zaWduZWQgbG9uZyBzdWNjZXNzID0gYWxs b2NhdGVkOw0KKwl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkID0gbWFzX2FsbG9jX3JlcShtYXMpOw0K Kwl1bnNpZ25lZCBpbnQgY291bnQ7DQorDQorCWlmICghcmVxdWVzdGVkKQ0KKwkJcmV0dXJuOw0K Kw0KKwltYXNfc2V0X2FsbG9jX3JlcShtYXMsIDApOw0KKwlpZiAoIWFsbG9jYXRlZCB8fCBtYXMt PmFsbG9jLT5ub2RlX2NvdW50ID09IE1BUExFX0FMTE9DX1NMT1RTIC0gMSkgew0KKwkJbm9kZSA9 IChzdHJ1Y3QgbWFwbGVfYWxsb2MgKiltdF9hbGxvY19vbmUoZ2ZwKTsNCisJCWlmICghbm9kZSkN CisJCQlnb3RvIG5vbWVtOw0KKw0KKwkJaWYgKGFsbG9jYXRlZCkNCisJCQlub2RlLT5zbG90WzBd ID0gbWFzLT5hbGxvYzsNCisNCisJCXN1Y2Nlc3MrKzsNCisJCW1hcy0+YWxsb2MgPSBub2RlOw0K KwkJcmVxdWVzdGVkLS07DQorCX0NCisNCisJbm9kZSA9IG1hcy0+YWxsb2M7DQorCXdoaWxlIChy ZXF1ZXN0ZWQpIHsNCisJCXZvaWQgKipzbG90cyA9ICh2b2lkICoqKSZub2RlLT5zbG90Ow0KKwkJ dW5zaWduZWQgaW50IG1heF9yZXEgPSBNQVBMRV9OT0RFX1NMT1RTIC0gMTsNCisNCisJCWlmIChu b2RlLT5zbG90WzBdKSB7DQorCQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG5vZGUtPm5vZGVfY291 bnQgKyAxOw0KKw0KKwkJCXNsb3RzID0gKHZvaWQgKiopJm5vZGUtPnNsb3Rbb2Zmc2V0XTsNCisJ CQltYXhfcmVxIC09IG9mZnNldDsNCisJCX0NCisNCisJCWNvdW50ID0gbXRfYWxsb2NfYnVsayhn ZnAsIG1pbihyZXF1ZXN0ZWQsIG1heF9yZXEpLA0KKwkJCQkgICAgICBzbG90cyk7DQorCQlpZiAo IWNvdW50KQ0KKwkJCWdvdG8gbm9tZW07DQorDQorCQlub2RlLT5ub2RlX2NvdW50ICs9IGNvdW50 Ow0KKwkJLyogemVybyBpbmRleGVkLiAqLw0KKwkJaWYgKHNsb3RzID09ICh2b2lkICoqKSZub2Rl LT5zbG90KQ0KKwkJCW5vZGUtPm5vZGVfY291bnQtLTsNCisNCisJCXN1Y2Nlc3MgKz0gY291bnQ7 DQorCQlub2RlcCA9ICZub2RlLT5zbG90WzBdOw0KKwkJbm9kZSA9ICpub2RlcDsNCisJCXJlcXVl c3RlZCAtPSBjb3VudDsNCisJfQ0KKwltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nlc3M7DQorCXJl dHVybjsNCitub21lbToNCisJbWFzX3NldF9hbGxvY19yZXEobWFzLCByZXF1ZXN0ZWQpOw0KKwlp ZiAobWFzLT5hbGxvYyAmJiAhKCgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkpDQor CQltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nlc3M7DQorCW1hc19zZXRfZXJyKG1hcywgLUVOT01F TSk7DQorCXJldHVybjsNCisNCit9DQorDQorLyoNCisgKiBtYXNfZnJlZSgpIC0gRnJlZSBhbiBl bmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAdXNlZDog VGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byBmcmVlLg0KKyAqDQorICogVXNlcyByY3UgZnJlZSBp ZiBuZWNlc3NhcnksIHB1c2hlcyBAdXNlZCBiYWNrIG9uIHRoZSBtYXBsZSBzdGF0ZSBhbGxvY2F0 aW9ucw0KKyAqIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZyZWUo c3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9lbm9kZSAqdXNlZCkNCit7DQorCXN0 cnVjdCBtYXBsZV9ub2RlICp0bXAgPSBtdGVfdG9fbm9kZSh1c2VkKTsNCisNCisJaWYgKG10X2lu X3JjdShtYXMtPnRyZWUpKQ0KKwkJbWFfZnJlZV9yY3UodG1wKTsNCisJZWxzZQ0KKwkJbWFzX3B1 c2hfbm9kZShtYXMsIHRtcCk7DQorfQ0KKw0KKy8qDQorICogbWFzX25vZGVfY291bnQoKSAtIENo ZWNrIGlmIGVub3VnaCBub2RlcyBhcmUgYWxsb2NhdGVkIGFuZCByZXF1ZXN0IG1vcmUgaWYNCisg KiB0aGVyZSBpcyBub3QgZW5vdWdoIG5vZGVzLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEBjb3VudDogVGhlIG51bWJlciBvZiBub2RlcyBuZWVkZWQNCisgKi8NCitzdGF0aWMgdm9p ZCBtYXNfbm9kZV9jb3VudChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGNvdW50KQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBhbGxvY2F0ZWQgPSBtYXNfYWxsb2NhdGVkKG1hcyk7DQorDQorCWlmIChh bGxvY2F0ZWQgPCBjb3VudCkgew0KKwkJbWFzX3NldF9hbGxvY19yZXEobWFzLCBjb3VudCAtIGFs bG9jYXRlZCk7DQorCQltYXNfYWxsb2Nfbm9kZXMobWFzLCBHRlBfTk9XQUlUIHwgX19HRlBfTk9X QVJOKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19zdGFydCgpIC0gU2V0cyB1cCBtYXBsZSBz dGF0ZSBmb3Igb3BlcmF0aW9ucy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoNCisg KiBJZiBtYXMtPm5vZGUgPT0gTUFTX1NUQVJULCB0aGVuIHNldCB0aGUgbWluLCBtYXgsIGRlcHRo LCBhbmQgb2Zmc2V0IHRvDQorICogZGVmYXVsdHMuDQorICoNCisgKiBSZXR1cm46DQorICogLSBJ ZiBtYXMtPm5vZGUgaXMgYW4gZXJyb3Igb3Igbm90IE1BU19TVEFSVCwgcmV0dXJuIE5VTEwuDQor ICogLSBJZiBpdCdzIGFuIGVtcHR5IHRyZWU6ICAgICBOVUxMICYgbWFzLT5ub2RlID09IE1BU19O T05FDQorICogLSBJZiBpdCdzIGEgc2luZ2xlIGVudHJ5OiAgICBUaGUgZW50cnkgJiBtYXMtPm5v ZGUgPT0gTUFTX1JPT1QNCisgKiAtIElmIGl0J3MgYSB0cmVlOiAgICAgICAgICAgIE5VTEwgJiBt YXMtPm5vZGUgPT0gc2FmZSByb290IG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3Qg bWFwbGVfZW5vZGUgKm1hc19zdGFydChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmIChs aWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQorCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJvb3Q7 DQorDQorCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCW1hcy0+bWluID0gMDsNCisJCW1hcy0+ bWF4ID0gVUxPTkdfTUFYOw0KKwkJbWFzLT5kZXB0aCA9IDA7DQorCQltYXMtPm9mZnNldCA9IDA7 DQorDQorCQlyb290ID0gbWFzX3Jvb3QobWFzKTsNCisJCS8qIFRyZWUgd2l0aCBub2RlcyAqLw0K KwkJaWYgKGxpa2VseSh4YV9pc19ub2RlKHJvb3QpKSkgew0KKwkJCW1hcy0+bm9kZSA9IG10ZV9z YWZlX3Jvb3Qocm9vdCk7DQorCQkJcmV0dXJuIE5VTEw7DQorCQl9DQorDQorCQkvKiBlbXB0eSB0 cmVlICovDQorCQlpZiAodW5saWtlbHkoIXJvb3QpKSB7DQorCQkJbWFzLT5vZmZzZXQgPSBNQVBM RV9OT0RFX1NMT1RTOw0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKw0KKwkJLyogU2luZ2xlIGVu dHJ5IHRyZWUgKi8NCisJCW1hcy0+bm9kZSA9IE1BU19ST09UOw0KKwkJbWFzLT5vZmZzZXQgPSBN QVBMRV9OT0RFX1NMT1RTOw0KKw0KKwkJLyogU2luZ2xlIGVudHJ5IHRyZWUuICovDQorCQlpZiAo bWFzLT5pbmRleCA+IDApDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQlyZXR1cm4gcm9vdDsNCisJ fQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYV9kYXRhX2VuZCgpIC0gRmlu ZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIGEgbm9kZS4NCisgKiBAbm9kZTogVGhlIG1hcGxlIG5v ZGUNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEBwaXZvdHM6IFRoZSBhcnJh eSBvZiBwaXZvdHMgaW4gdGhlIG5vZGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0 aGUgbm9kZQ0KKyAqDQorICogVXNlcyBtZXRhZGF0YSB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIGRh dGEgd2hlbiBwb3NzaWJsZS4NCisgKiBSZXR1cm46IFRoZSB6ZXJvIGluZGV4ZWQgbGFzdCBzbG90 IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQg Y2hhciBtYV9kYXRhX2VuZChzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJCWVudW0gbWFw bGVfdHlwZSB0eXBlLA0KKwkJCQkJdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkJCQkJdW5zaWdu ZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJaWYgKHR5cGUg PT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUsIHR5cGUpOw0K Kw0KKwlvZmZzZXQgPSBtdF9waXZvdHNbdHlwZV0gLSAxOw0KKwlpZiAobGlrZWx5KCFwaXZvdHNb b2Zmc2V0XSkpDQorCQlyZXR1cm4gbWFfbWV0YV9lbmQobm9kZSwgdHlwZSk7DQorDQorCWlmIChs aWtlbHkocGl2b3RzW29mZnNldF0gPT0gbWF4KSkNCisJCXJldHVybiBvZmZzZXQ7DQorDQorCXJl dHVybiBtdF9waXZvdHNbdHlwZV07DQorfQ0KKw0KKy8qDQorICogbWFzX2RhdGFfZW5kKCkgLSBG aW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgKHNsb3QpLg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0 ZQ0KKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiBtYXBsZSBub2RlDQorICoNCisgKiBUaGlzIG1ldGhv ZCBpcyBvcHRpbWl6ZWQgdG8gY2hlY2sgdGhlIG1ldGFkYXRhIG9mIGEgbm9kZSBpZiB0aGUgbm9k ZSB0eXBlDQorICogc3VwcG9ydHMgZGF0YSBlbmQgbWV0YWRhdGEuDQorICoNCisgKiBSZXR1cm46 IFRoZSB6ZXJvIGluZGV4ZWQgbGFzdCBzbG90IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYXNfZGF0YV9lbmQoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJc3RydWN0IG1hcGxlX25v ZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZv dHM7DQorDQorCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW5vZGUgPSBtYXNf bW4obWFzKTsNCisJaWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21l dGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7 DQorCW9mZnNldCA9IG10X3Bpdm90c1t0eXBlXSAtIDE7DQorCWlmIChsaWtlbHkoIXBpdm90c1tv ZmZzZXRdKSkNCisJCXJldHVybiBtYV9tZXRhX2VuZChub2RlLCB0eXBlKTsNCisNCisJaWYgKGxp a2VseShwaXZvdHNbb2Zmc2V0XSA9PSBtYXMtPm1heCkpDQorCQlyZXR1cm4gb2Zmc2V0Ow0KKw0K KwlyZXR1cm4gbXRfcGl2b3RzW3R5cGVdOw0KK30NCisNCisvKg0KKyAqIG1hc19sZWFmX21heF9n YXAoKSAtIFJldHVybnMgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbGVhZiBub2RlDQorICogQG1hcyAt IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11bSBnYXAgaW4gdGhl IGxlYWYuDQorICovDQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzX2xlYWZfbWF4X2dhcChzdHJ1 Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdW5zaWduZWQg bG9uZyBwc3RhcnQsIGdhcCwgbWF4X2dhcDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm1uOw0KKwl1 bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQg Y2hhciBpOw0KKwl1bnNpZ25lZCBjaGFyIG1heF9waXY7DQorDQorCW10ID0gbXRlX25vZGVfdHlw ZShtYXMtPm5vZGUpOw0KKwltbiA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1u LCBtdCk7DQorCW1heF9nYXAgPSAwOw0KKwlpZiAodW5saWtlbHkobWFfaXNfZGVuc2UobXQpKSkg ew0KKwkJZ2FwID0gMDsNCisJCWZvciAoaSA9IDA7IGkgPCBtdF9zbG90c1ttdF07IGkrKykgew0K KwkJCWlmIChzbG90c1tpXSkgew0KKwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9n YXAgPSBnYXA7DQorCQkJCWdhcCA9IDA7DQorCQkJfSBlbHNlIHsNCisJCQkJZ2FwKys7DQorCQkJ fQ0KKwkJfQ0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisJCXJl dHVybiBtYXhfZ2FwOw0KKwl9DQorDQorCS8qDQorCSAqIENoZWNrIHRoZSBmaXJzdCBpbXBsaWVk IHBpdm90IG9wdGltaXplcyB0aGUgbG9vcCBiZWxvdyBhbmQgc2xvdCAxIG1heQ0KKwkgKiBiZSBz a2lwcGVkIGlmIHRoZXJlIGlzIGEgZ2FwIGluIHNsb3QgMC4NCisJICovDQorCXBpdm90cyA9IG1h X3Bpdm90cyhtbiwgbXQpOw0KKwlpZiAobGlrZWx5KCFzbG90c1swXSkpIHsNCisJCW1heF9nYXAg PSBwaXZvdHNbMF0gLSBtYXMtPm1pbiArIDE7DQorCQlpID0gMjsNCisJfSBlbHNlIHsNCisJCWkg PSAxOw0KKwl9DQorDQorCS8qIHJlZHVjZSBtYXhfcGl2IGFzIHRoZSBzcGVjaWFsIGNhc2UgaXMg Y2hlY2tlZCBiZWZvcmUgdGhlIGxvb3AgKi8NCisJbWF4X3BpdiA9IG1hX2RhdGFfZW5kKG1uLCBt dCwgcGl2b3RzLCBtYXMtPm1heCkgLSAxOw0KKwkvKg0KKwkgKiBDaGVjayBlbmQgaW1wbGllZCBw aXZvdCB3aGljaCBjYW4gb25seSBiZSBhIGdhcCBvbiB0aGUgcmlnaHQgbW9zdA0KKwkgKiBub2Rl Lg0KKwkgKi8NCisJaWYgKHVubGlrZWx5KG1hcy0+bWF4ID09IFVMT05HX01BWCkgJiYgIXNsb3Rz W21heF9waXYgKyAxXSkgew0KKwkJZ2FwID0gVUxPTkdfTUFYIC0gcGl2b3RzW21heF9waXZdOw0K KwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisJfQ0KKw0KKwlmb3Ig KDsgaSA8PSBtYXhfcGl2OyBpKyspIHsNCisJCS8qIGRhdGEgPT0gbm8gZ2FwLiAqLw0KKwkJaWYg KGxpa2VseShzbG90c1tpXSkpDQorCQkJY29udGludWU7DQorDQorCQlwc3RhcnQgPSBwaXZvdHNb aSAtIDFdOw0KKwkJZ2FwID0gcGl2b3RzW2ldIC0gcHN0YXJ0Ow0KKwkJaWYgKGdhcCA+IG1heF9n YXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisNCisJCS8qIFRoZXJlIGNhbm5vdCBiZSB0d28gZ2Fw cyBpbiBhIHJvdy4gKi8NCisJCWkrKzsNCisJfQ0KKwlyZXR1cm4gbWF4X2dhcDsNCit9DQorDQor LyoNCisgKiBtYV9tYXhfZ2FwKCkgLSBHZXQgdGhlIG1heGltdW0gZ2FwIGluIGEgbWFwbGUgbm9k ZSAobm9uLWxlYWYpDQorICogQG5vZGU6IFRoZSBtYXBsZSBub2RlDQorICogQGdhcHM6IFRoZSBw b2ludGVyIHRvIHRoZSBnYXBzDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQCpv ZmY6IFBvaW50ZXIgdG8gc3RvcmUgdGhlIG9mZnNldCBsb2NhdGlvbiBvZiB0aGUgZ2FwLg0KKyAq DQorICogVXNlcyB0aGUgbWV0YWRhdGEgZGF0YSBlbmQgdG8gc2NhbiBiYWNrd2FyZHMgYWNyb3Nz IHNldCBnYXBzLg0KKyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11bSBnYXAgdmFsdWUNCisgKi8N CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcNCittYV9tYXhfZ2FwKHN0cnVjdCBtYXBsZV9u b2RlICpub2RlLCB1bnNpZ25lZCBsb25nICpnYXBzLCBlbnVtIG1hcGxlX3R5cGUgbXQsDQorCSAg ICB1bnNpZ25lZCBjaGFyICpvZmYpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCwgaTsNCisJ dW5zaWduZWQgbG9uZyBtYXhfZ2FwID0gMDsNCisNCisJaSA9IG9mZnNldCA9IG1hX21ldGFfZW5k KG5vZGUsIG10KTsNCisJZG8gew0KKwkJaWYgKGdhcHNbaV0gPiBtYXhfZ2FwKSB7DQorCQkJbWF4 X2dhcCA9IGdhcHNbaV07DQorCQkJb2Zmc2V0ID0gaTsNCisJCX0NCisJfSB3aGlsZSAoaS0tKTsN CisNCisJKm9mZiA9IG9mZnNldDsNCisJcmV0dXJuIG1heF9nYXA7DQorfQ0KKw0KKy8qDQorICog bWFzX21heF9nYXAoKSAtIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbm9uLWxlYWYgbm9kZSBh bmQgc2V0IHRoZSBzbG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIElm IHRoZSBtZXRhZGF0YSBnYXAgaXMgc2V0IHRvIE1BUExFX0FSQU5HRTY0X01FVEFfTUFYLCB0aGVy ZSBpcyBubyBnYXAuDQorICoNCisgKiBSZXR1cm46IFRoZSBnYXAgdmFsdWUuDQorICovDQorc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1hc19tYXhfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqZ2FwczsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQor CWVudW0gbWFwbGVfdHlwZSBtdDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorDQorCW10 ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlpZiAobWFfaXNfbGVhZihtdCkpDQorCQly ZXR1cm4gbWFzX2xlYWZfbWF4X2dhcChtYXMpOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQor CW9mZnNldCA9IG1hX21ldGFfZ2FwKG5vZGUsIG10KTsNCisJaWYgKG9mZnNldCA9PSBNQVBMRV9B UkFOR0U2NF9NRVRBX01BWCkNCisJCXJldHVybiAwOw0KKw0KKwlnYXBzID0gbWFfZ2Fwcyhub2Rl LCBtdCk7DQorCXJldHVybiBnYXBzW29mZnNldF07DQorfQ0KKw0KKy8qDQorICogbWFzX3BhcmVu dF9nYXAoKSAtIFNldCB0aGUgcGFyZW50IGdhcCBhbmQgYW55IGdhcHMgYWJvdmUsIGFzIG5lZWRl ZA0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBnYXAgb2Zmc2V0 IGluIHRoZSBwYXJlbnQgdG8gc2V0DQorICogQG5ldzogVGhlIG5ldyBnYXAgdmFsdWUuDQorICoN CisgKiBTZXQgdGhlIHBhcmVudCBnYXAgdGhlbiBjb250aW51ZSB0byBzZXQgdGhlIGdhcCB1cHdh cmRzLCB1c2luZyB0aGUgbWV0YWRhdGENCisgKiBvZiB0aGUgcGFyZW50IHRvIHNlZSBpZiBpdCBp cyBuZWNlc3NhcnkgdG8gY2hlY2sgdGhlIG5vZGUgYWJvdmUuDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc19wYXJlbnRfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFy IG9mZnNldCwNCisJCXVuc2lnbmVkIGxvbmcgbmV3KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtZXRh X2dhcCA9IDA7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpwZW5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBnYXBzOw0KKwl1bnNpZ25lZCBjaGFyIG1l dGFfb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgcG10Ow0KKw0KKwlwbm9kZSA9IG10ZV9wYXJl bnQobWFzLT5ub2RlKTsNCisJcG10ID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsN CisJcGVub2RlID0gbXRfbWtfbm9kZShwbm9kZSwgcG10KTsNCisJcGdhcHMgPSBtYV9nYXBzKHBu b2RlLCBwbXQpOw0KKw0KK2FzY2VuZDoNCisJbWV0YV9vZmZzZXQgPSBtYV9tZXRhX2dhcChwbm9k ZSwgcG10KTsNCisJaWYgKG1ldGFfb2Zmc2V0ID09IE1BUExFX0FSQU5HRTY0X01FVEFfTUFYKQ0K KwkJbWV0YV9nYXAgPSAwOw0KKwllbHNlDQorCQltZXRhX2dhcCA9IHBnYXBzW21ldGFfb2Zmc2V0 XTsNCisNCisJcGdhcHNbb2Zmc2V0XSA9IG5ldzsNCisNCisJaWYgKG1ldGFfZ2FwID09IG5ldykN CisJCXJldHVybjsNCisNCisJaWYgKG9mZnNldCAhPSBtZXRhX29mZnNldCkgew0KKwkJaWYgKG1l dGFfZ2FwID4gbmV3KQ0KKwkJCXJldHVybjsNCisNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwg cG10LCBvZmZzZXQpOw0KKwl9IGVsc2UgaWYgKG5ldyA8IG1ldGFfZ2FwKSB7DQorCQltZXRhX29m ZnNldCA9IDE1Ow0KKwkJbmV3ID0gbWFfbWF4X2dhcChwbm9kZSwgcGdhcHMsIHBtdCwgJm1ldGFf b2Zmc2V0KTsNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10LCBtZXRhX29mZnNldCk7DQor CX0NCisNCisJaWYgKG1hX2lzX3Jvb3QocG5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwkvKiBHbyB0 byB0aGUgcGFyZW50IG5vZGUuICovDQorCXBub2RlID0gbXRlX3BhcmVudChwZW5vZGUpOw0KKwlw bXQgPSBtYXNfcGFyZW50X2VudW0obWFzLCBwZW5vZGUpOw0KKwlwZ2FwcyA9IG1hX2dhcHMocG5v ZGUsIHBtdCk7DQorCW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChwZW5vZGUpOw0KKwlwZW5vZGUg PSBtdF9ta19ub2RlKHBub2RlLCBwbXQpOw0KKwlnb3RvIGFzY2VuZDsNCit9DQorDQorLyoNCisg KiBtYXNfdXBkYXRlX2dhcCgpIC0gVXBkYXRlIGEgbm9kZXMgZ2FwcyBhbmQgcHJvcGFnYXRlIHVw IGlmIG5lY2Vzc2FyeS4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtYXNfdXBkYXRlX2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQor CXVuc2lnbmVkIGNoYXIgcHNsb3Q7DQorCXVuc2lnbmVkIGxvbmcgcF9nYXA7DQorCXVuc2lnbmVk IGxvbmcgbWF4X2dhcDsNCisNCisJaWYgKCFtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJcmV0 dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJ bWF4X2dhcCA9IG1hc19tYXhfZ2FwKG1hcyk7DQorDQorCXBzbG90ID0gbXRlX3BhcmVudF9zbG90 KG1hcy0+bm9kZSk7DQorCXBfZ2FwID0gbWFfZ2FwcyhtdGVfcGFyZW50KG1hcy0+bm9kZSksDQor CQkJbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKSlbcHNsb3RdOw0KKw0KKwlpZiAocF9n YXAgIT0gbWF4X2dhcCkNCisJCW1hc19wYXJlbnRfZ2FwKG1hcywgcHNsb3QsIG1heF9nYXApOw0K K30NCisNCisvKg0KKyAqIG1hc19hZG9wdF9jaGlsZHJlbigpIC0gU2V0IHRoZSBwYXJlbnQgcG9p bnRlciBvZiBhbGwgbm9kZXMgaW4gQHBhcmVudCB0bw0KKyAqIEBwYXJlbnQgd2l0aCB0aGUgc2xv dCBlbmNvZGVkLg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgKGZvciB0aGUgdHJlZSkNCisg KiBAcGFyZW50IC0gdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBjb250YWluaW5nIHRoZSBjaGlsZHJl bi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Fkb3B0X2NoaWxkcmVuKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQpDQorew0KKwllbnVt IG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisJc3RydWN0IG1hcGxl X25vZGUgKm5vZGUgPSBtYXNfbW4obWFzKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xv dHMobm9kZSwgdHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhub2Rl LCB0eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdW5zaWduZWQgY2hhciBv ZmZzZXQ7DQorDQorCW9mZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWFz LT5tYXgpOw0KKwlkbyB7DQorCQljaGlsZCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBv ZmZzZXQpOw0KKwkJbXRlX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCwgb2Zmc2V0KTsNCisJfSB3 aGlsZShvZmZzZXQtLSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3JlcGxhY2UoKSAtIFJlcGxhY2Ug YSBtYXBsZSBub2RlIGluIHRoZSB0cmVlIHdpdGggbWFzLT5ub2RlLiAgVXNlcyB0aGUNCisgKiBw YXJlbnQgZW5jb2RpbmcgdG8gbG9jYXRlIHRoZSBtYXBsZSBub2RlIGluIHRoZSB0cmVlLg0KKyAq IEBtYXMgLSB0aGUgbWFfc3RhdGUgdG8gdXNlIGZvciBvcGVyYXRpb25zLg0KKyAqIEBhZHZhbmNl ZCAtIGJvb2xlYW4gdG8gYWRvcHQgdGhlIGNoaWxkIG5vZGVzIGFuZCBmcmVlIHRoZSBvbGQgbm9k ZSAoZmFsc2UpIG9yDQorICogbGVhdmUgdGhlIG5vZGUgKHRydWUpIGFuZCBoYW5kbGUgdGhlIGFk b3B0aW9uIGFuZCBmcmVlIGVsc2V3aGVyZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFz X3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIGJvb2wgYWR2YW5jZWQpDQorCV9fbXVzdF9o b2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbiA9IG1hc19t bihtYXMpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9lbm9kZTsNCisJdW5zaWduZWQgY2hh ciBvZmZzZXQgPSAwOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHMgPSBOVUxMOw0KKw0KKwlpZiAobWFf aXNfcm9vdChtbikpIHsNCisJCW9sZF9lbm9kZSA9IG1hc19yb290X2xvY2tlZChtYXMpOw0KKwl9 IGVsc2Ugew0KKwkJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCQlzbG90 cyA9IG1hX3Nsb3RzKG10ZV9wYXJlbnQobWFzLT5ub2RlKSwNCisJCQkJIG1hc19wYXJlbnRfZW51 bShtYXMsIG1hcy0+bm9kZSkpOw0KKwkJb2xkX2Vub2RlID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywg c2xvdHMsIG9mZnNldCk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNlZCAmJiAhbXRlX2lzX2xlYWYo bWFzLT5ub2RlKSkNCisJCW1hc19hZG9wdF9jaGlsZHJlbihtYXMsIG1hcy0+bm9kZSk7DQorDQor CWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQltbi0+cGFyZW50ID0gbWFfcGFyZW50 X3B0cigNCisJCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJF TlQpKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIG10ZV9ta19y b290KG1hcy0+bm9kZSkpOw0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJfSBlbHNlIHsNCisJ CXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBtYXMtPm5vZGUpOw0KKwl9DQorDQor CWlmICghYWR2YW5jZWQpDQorCQltYXNfZnJlZShtYXMsIG9sZF9lbm9kZSk7DQorfQ0KKw0KKy8q DQorICogbWFzX25ld19jaGlsZCgpIC0gRmluZCB0aGUgbmV3IGNoaWxkIG9mIGEgbm9kZS4NCisg KiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY2hpbGQ6IHRoZSBtYXBsZSBzdGF0ZSB0byBz dG9yZSB0aGUgY2hpbGQuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19uZXdfY2hpbGQo c3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV9zdGF0ZSAqY2hpbGQpDQorCV9fbXVzdF9o b2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdW5zaWdu ZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnk7DQorCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZSht YXMtPm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9k ZSwgbXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwllbmQgPSBtYV9kYXRh X2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWZvciAob2Zmc2V0ID0gbWFzLT5v ZmZzZXQ7IG9mZnNldCA8PSBlbmQ7IG9mZnNldCsrKSB7DQorCQllbnRyeSA9IG1hc19zbG90X2xv Y2tlZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKG10ZV9wYXJlbnQoZW50cnkpID09IG5v ZGUpIHsNCisJCQkqY2hpbGQgPSAqbWFzOw0KKwkJCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0ICsgMTsN CisJCQljaGlsZC0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwkJCW1hc19kZXNjZW5kKGNoaWxkKTsNCisJ CQljaGlsZC0+b2Zmc2V0ID0gMDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJfQ0KKwlyZXR1 cm4gZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX3NoaWZ0X3JpZ2h0KCkgLSBTaGlmdCB0aGUg ZGF0YSBpbiBtYWIgcmlnaHQuIE5vdGUsIGRvZXMgbm90IGNsZWFuIG91dCB0aGUNCisgKiBvbGQg ZGF0YSBvciBzZXQgYl9ub2RlLT5iX2VuZC4NCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25v ZGUNCisgKiBAc2hpZnQ6IHRoZSBzaGlmdCBjb3VudA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYWJfc2hpZnRfcmlnaHQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSB1 bnNpZ25lZCBjaGFyIHNoaWZ0KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBzaXplID0gYl9ub2RlLT5i X2VuZCAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsNCisNCisJbWVtbW92ZShiX25vZGUtPnBpdm90 ICsgc2hpZnQsIGJfbm9kZS0+cGl2b3QsIHNpemUpOw0KKwltZW1tb3ZlKGJfbm9kZS0+c2xvdCAr IHNoaWZ0LCBiX25vZGUtPnNsb3QsIHNpemUpOw0KKwlpZiAoYl9ub2RlLT50eXBlID09IG1hcGxl X2FyYW5nZV82NCkNCisJCW1lbW1vdmUoYl9ub2RlLT5nYXAgKyBzaGlmdCwgYl9ub2RlLT5nYXAs IHNpemUpOw0KK30NCisNCisvKg0KKyAqIG1hYl9taWRkbGVfbm9kZSgpIC0gQ2hlY2sgaWYgYSBt aWRkbGUgbm9kZSBpcyBuZWVkZWQgKHVubGlrZWx5KQ0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9i aWdfbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhLg0KKyAqIEBzaXplOiB0aGUgYW1vdW50IG9m IGRhdGEgaW4gdGhlIGJfbm9kZQ0KKyAqIEBzcGxpdDogdGhlIHBvdGVudGlhbCBzcGxpdCBsb2Nh dGlvbg0KKyAqIEBzbG90X2NvdW50OiB0aGUgc2l6ZSB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSBz aW5nbGUgbm9kZSBiZWluZyBjb25zaWRlcmVkLg0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlmIGEg bWlkZGxlIG5vZGUgaXMgcmVxdWlyZWQuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hYl9t aWRkbGVfbm9kZShzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwgaW50IHNwbGl0LA0KKwkJ CQkgICB1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNpemUg PSBiX25vZGUtPmJfZW5kOw0KKw0KKwlpZiAoc2l6ZSA+PSAyICogc2xvdF9jb3VudCkNCisJCXJl dHVybiB0cnVlOw0KKw0KKwlpZiAoIWJfbm9kZS0+c2xvdFtzcGxpdF0gJiYgKHNpemUgPj0gMiAq IHNsb3RfY291bnQgLSAxKSkNCisJCXJldHVybiB0cnVlOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQor fQ0KKw0KKy8qDQorICogbWFiX25vX251bGxfc3BsaXQoKSAtIGVuc3VyZSB0aGUgc3BsaXQgZG9l c24ndCBmYWxsIG9uIGEgTlVMTA0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZSB3aXRo IHRoZSBkYXRhDQorICogQHNwbGl0OiB0aGUgc3VnZ2VzdGVkIHNwbGl0IGxvY2F0aW9uDQorICog QHNsb3RfY291bnQ6IHRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIG5vZGUgYmVpbmcgY29uc2lk ZXJlZC4NCisgKg0KKyAqIFJldHVybjogdGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgaW50IG1hYl9ub19udWxsX3NwbGl0KHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9u b2RlLA0KKwkJCQkgICAgdW5zaWduZWQgY2hhciBzcGxpdCwgdW5zaWduZWQgY2hhciBzbG90X2Nv dW50KQ0KK3sNCisJaWYgKCFiX25vZGUtPnNsb3Rbc3BsaXRdKSB7DQorCQkvKg0KKwkJICogSWYg dGhlIHNwbGl0IGlzIGxlc3MgdGhhbiB0aGUgbWF4IHNsb3QgJiYgdGhlIHJpZ2h0IHNpZGUgd2ls bA0KKwkJICogc3RpbGwgYmUgc3VmZmljaWVudCwgdGhlbiBpbmNyZW1lbnQgdGhlIHNwbGl0IG9u IE5VTEwuDQorCQkgKi8NCisJCWlmICgoc3BsaXQgPCBzbG90X2NvdW50IC0gMSkgJiYNCisJCSAg ICAoYl9ub2RlLT5iX2VuZCAtIHNwbGl0KSA+IChtdF9taW5fc2xvdHNbYl9ub2RlLT50eXBlXSkp DQorCQkJc3BsaXQrKzsNCisJCWVsc2UNCisJCQlzcGxpdC0tOw0KKwl9DQorCXJldHVybiBzcGxp dDsNCit9DQorDQorLyoNCisgKiBtYWJfY2FsY19zcGxpdCgpIC0gQ2FsY3VsYXRlIHRoZSBzcGxp dCBsb2NhdGlvbiBhbmQgaWYgdGhlcmUgbmVlZHMgdG8gYmUgdHdvDQorICogc3BsaXRzLg0KKyAq IEBibjogVGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIGRhdGENCisgKiBAbWlkX3NwbGl0OiBU aGUgc2Vjb25kIHNwbGl0LCBpZiByZXF1aXJlZC4gIDAgb3RoZXJ3aXNlLg0KKyAqDQorICogUmV0 dXJuOiBUaGUgZmlyc3Qgc3BsaXQgbG9jYXRpb24uICBUaGUgbWlkZGxlIHNwbGl0IGlzIHNldCBp biBAbWlkX3NwbGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hYl9jYWxjX3NwbGl0KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpibiwgdW5zaWdu ZWQgY2hhciAqbWlkX3NwbGl0LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXVuc2lnbmVkIGNo YXIgYl9lbmQgPSBibi0+Yl9lbmQ7DQorCWludCBzcGxpdCA9IGJfZW5kIC8gMjsgLyogQXNzdW1l IGVxdWFsIHNwbGl0LiAqLw0KKwl1bnNpZ25lZCBjaGFyIHNsb3RfbWluLCBzbG90X2NvdW50ID0g bXRfc2xvdHNbYm4tPnR5cGVdOw0KKw0KKwkvKg0KKwkgKiBUbyBzdXBwb3J0IGdhcCB0cmFja2lu ZywgYWxsIE5VTEwgZW50cmllcyBhcmUga2VwdCB0b2dldGhlciBhbmQgYSBub2RlIGNhbm5vdA0K KwkgKiBlbmQgb24gYSBOVUxMIGVudHJ5LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGxlZnQt bW9zdCBsZWFmLiAgVGhlDQorCSAqIGxpbWl0YXRpb24gbWVhbnMgdGhhdCB0aGUgc3BsaXQgb2Yg YSBub2RlIG11c3QgYmUgY2hlY2tlZCBmb3IgdGhpcyBjb25kaXRpb24NCisJICogYW5kIGJlIGFi bGUgdG8gcHV0IG1vcmUgZGF0YSBpbiBvbmUgZGlyZWN0aW9uIG9yIHRoZSBvdGhlci4NCisJICov DQorCWlmICh1bmxpa2VseSgobWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9CVUxLKSkpIHsNCisJ CSptaWRfc3BsaXQgPSAwOw0KKwkJaWYgKG1hX2lzX2xlYWYoYm4tPnR5cGUpKQ0KKwkJCXNsb3Rf bWluID0gMjsNCisJCWVsc2UNCisJCQlyZXR1cm4gYl9lbmQgLSBtdF9taW5fc2xvdHNbYm4tPnR5 cGVdOw0KKw0KKwkJc3BsaXQgPSBiX2VuZCAtIHNsb3RfbWluOw0KKwkJbWFzLT5tYXNfZmxhZ3Mg fD0gTUFfU1RBVEVfUkVCQUxBTkNFOw0KKwkJaWYgKCFibi0+c2xvdFtzcGxpdF0pDQorCQkJc3Bs aXQtLTsNCisJCXJldHVybiBzcGxpdDsNCisJfQ0KKw0KKwkvKg0KKwkgKiBBbHRob3VnaCBleHRy ZW1lbHkgcmFyZSwgaXQgaXMgcG9zc2libGUgdG8gZW50ZXIgd2hhdCBpcyBrbm93biBhcyB0aGUg My13YXkNCisJICogc3BsaXQgc2NlbmFyaW8uICBUaGUgMy13YXkgc3BsaXQgY29tZXMgYWJvdXQg YnkgbWVhbnMgb2YgYSBzdG9yZSBvZiBhIHJhbmdlDQorCSAqIHRoYXQgb3ZlcndyaXRlcyB0aGUg ZW5kIGFuZCBiZWdpbm5pbmcgb2YgdHdvIGZ1bGwgbm9kZXMuICBUaGUgcmVzdWx0IGlzIGEgc2V0 DQorCSAqIG9mIGVudHJpZXMgdGhhdCBjYW5ub3QgYmUgc3RvcmVkIGluIDIgbm9kZXMuICBTb21l dGltZXMsIHRoZXNlIHR3byBub2RlcyBjYW4NCisJICogYWxzbyBiZSBsb2NhdGVkIGluIGRpZmZl cmVudCBwYXJlbnQgbm9kZXMgd2hpY2ggYXJlIGFsc28gZnVsbC4gIFRoaXMgY2FuDQorCSAqIGNh cnJ5IHVwd2FyZHMgYWxsIHRoZSB3YXkgdG8gdGhlIHJvb3QgaW4gdGhlIHdvcnN0IGNhc2UuDQor CSAqLw0KKwlpZiAodW5saWtlbHkobWFiX21pZGRsZV9ub2RlKGJuLCBzcGxpdCwgc2xvdF9jb3Vu dCkpKSB7DQorCQlzcGxpdCA9IGJfZW5kIC8gMzsNCisJCSptaWRfc3BsaXQgPSBzcGxpdCAqIDI7 DQorCX0gZWxzZSB7DQorCQlzbG90X21pbiA9IG10X21pbl9zbG90c1tibi0+dHlwZV07DQorDQor CQkqbWlkX3NwbGl0ID0gMDsNCisJCS8qDQorCQkgKiBBdm9pZCBoYXZpbmcgYSByYW5nZSBsZXNz IHRoYW4gdGhlIHNsb3QgY291bnQgdW5sZXNzIGl0DQorCQkgKiBjYXVzZXMgb25lIG5vZGUgdG8g YmUgZGVmaWNpZW50Lg0KKwkJICogTk9URTogbXRfbWluX3Nsb3RzIGlzIDEgYmFzZWQsIGJfZW5k IGFuZCBzcGxpdCBhcmUgemVyby4NCisJCSAqLw0KKwkJd2hpbGUgKCgoYm4tPnBpdm90W3NwbGl0 XSAtIG1pbikgPCBzbG90X2NvdW50IC0gMSkgJiYNCisJCSAgICAgICAoc3BsaXQgPCBzbG90X2Nv dW50IC0gMSkgJiYgKGJfZW5kIC0gc3BsaXQgPiBzbG90X21pbikpDQorCQkJc3BsaXQrKzsNCisJ fQ0KKw0KKwkvKiBBdm9pZCBlbmRpbmcgYSBub2RlIG9uIGEgTlVMTCBlbnRyeSAqLw0KKwlzcGxp dCA9IG1hYl9ub19udWxsX3NwbGl0KGJuLCBzcGxpdCwgc2xvdF9jb3VudCk7DQorCWlmICghKCpt aWRfc3BsaXQpKQ0KKwkJcmV0dXJuIHNwbGl0Ow0KKw0KKwkqbWlkX3NwbGl0ID0gbWFiX25vX251 bGxfc3BsaXQoYm4sICptaWRfc3BsaXQsIHNsb3RfY291bnQpOw0KKw0KKwlyZXR1cm4gc3BsaXQ7 DQorfQ0KKw0KKy8qDQorICogbWFzX21hYl9jcCgpIC0gQ29weSBkYXRhIGZyb20gYSBtYXBsZSBz dGF0ZSBpbmNsdXNpdmVseSB0byBhIG1hcGxlX2JpZ19ub2RlDQorICogYW5kIHNldCBAYl9ub2Rl LT5iX2VuZCB0byB0aGUgbmV4dCBmcmVlIHNsb3QuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQG1hc19zdGFydDogVGhlIHN0YXJ0aW5nIHNsb3QgdG8gY29weQ0KKyAqIEBtYXNfZW5k OiBUaGUgZW5kIHNsb3QgdG8gY29weSAoaW5jbHVzaXZlbHkpDQorICogQGJfbm9kZTogVGhlIG1h cGxlX2JpZ19ub2RlIHRvIHBsYWNlIHRoZSBkYXRhDQorICogQG1hYl9zdGFydDogVGhlIHN0YXJ0 aW5nIGxvY2F0aW9uIGluIG1hcGxlX2JpZ19ub2RlIHRvIHN0b3JlIHRoZSBkYXRhLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfbWFiX2NwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNp Z25lZCBjaGFyIG1hc19zdGFydCwNCisJCQl1bnNpZ25lZCBjaGFyIG1hc19lbmQsIHN0cnVjdCBt YXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCXVuc2lnbmVkIGNoYXIgbWFiX3N0YXJ0KQ0KK3sN CisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9p ZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMsICpnYXBzOw0KKwlpbnQg aSA9IG1hc19zdGFydCwgaiA9IG1hYl9zdGFydDsNCisJdW5zaWduZWQgY2hhciBwaXZfZW5kOw0K Kw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwlpZiAoIWkpIHsNCisJCWJfbm9k ZS0+cGl2b3Rbal0gPSBwaXZvdHNbaSsrXTsNCisJCWlmICh1bmxpa2VseShpID4gbWFzX2VuZCkp DQorCQkJZ290byBjb21wbGV0ZTsNCisJCWorKzsNCisJfQ0KKw0KKwlwaXZfZW5kID0gbWluKG1h c19lbmQsIG10X3Bpdm90c1ttdF0pOw0KKwlmb3IgKDsgaSA8IHBpdl9lbmQ7IGkrKywgaisrKSB7 DQorCQliX25vZGUtPnBpdm90W2pdID0gcGl2b3RzW2ldOw0KKwkJaWYgKHVubGlrZWx5KCFiX25v ZGUtPnBpdm90W2pdKSkNCisJCQlicmVhazsNCisNCisJCWlmICh1bmxpa2VseShtYXMtPm1heCA9 PSBiX25vZGUtPnBpdm90W2pdKSkNCisJCQlnb3RvIGNvbXBsZXRlOw0KKwl9DQorDQorCWlmIChs aWtlbHkoaSA8PSBtYXNfZW5kKSkNCisJCWJfbm9kZS0+cGl2b3Rbal0gPSBtYXNfc2FmZV9waXZv dChtYXMsIHBpdm90cywgaSwgbXQpOw0KKw0KK2NvbXBsZXRlOg0KKwliX25vZGUtPmJfZW5kID0g KytqOw0KKwlqIC09IG1hYl9zdGFydDsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQor CW1lbWNweShiX25vZGUtPnNsb3QgKyBtYWJfc3RhcnQsIHNsb3RzICsgbWFzX3N0YXJ0LCBzaXpl b2Yodm9pZCAqKSAqIGopOw0KKwlpZiAoIW1hX2lzX2xlYWYobXQpICYmIG10X2lzX2FsbG9jKG1h cy0+dHJlZSkpIHsNCisJCWdhcHMgPSBtYV9nYXBzKG5vZGUsIG10KTsNCisJCW1lbWNweShiX25v ZGUtPmdhcCArIG1hYl9zdGFydCwgZ2FwcyArIG1hc19zdGFydCwNCisJCSAgICAgICBzaXplb2Yo dW5zaWduZWQgbG9uZykgKiBqKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19sZWFmX3NldF9t ZXRhKCkgLSBTZXQgdGhlIG1ldGFkYXRhIG9mIGEgbGVhZiBpZiBwb3NzaWJsZS4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxlIG5vZGUNCisgKiBAcGl2b3Rz OiBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBtdDogVGhlIG1hcGxlIHR5 cGUNCisgKiBAZW5kOiBUaGUgYXNzdW1lZCBlbmQNCisgKg0KKyAqIE5vdGUsIGVuZCBtYXkgYmUg aW5jcmVtZW50ZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gYnV0IG5vdCBtb2RpZmllZCBhdCB0aGUN CisgKiBzb3VyY2UuICBUaGlzIGlzIGZpbmUgc2luY2UgdGhlIG1ldGFkYXRhIGlzIHRoZSBsYXN0 IHRoaW5nIHRvIGJlIHN0b3JlZCBpbiBhDQorICogbm9kZSBkdXJpbmcgYSB3cml0ZS4NCisgKi8N CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2xlYWZfc2V0X21ldGEoc3RydWN0IG1hX3N0YXRlICpt YXMsDQorCQlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0K KwkJZW51bSBtYXBsZV90eXBlIG10LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCS8qIFRoZXJl IGlzIG5vIHJvb20gZm9yIG1ldGFkYXRhIGFscmVhZHkgKi8NCisJaWYgKG10X3Bpdm90c1ttdF0g PD0gZW5kKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAocGl2b3RzW2VuZF0gJiYgcGl2b3RzW2VuZF0g PCBtYXMtPm1heCkNCisJCWVuZCsrOw0KKw0KKwlpZiAoZW5kIDwgbXRfc2xvdHNbbXRdIC0gMSkN CisJCW1hX3NldF9tZXRhKG5vZGUsIG10LCAwLCBlbmQpOw0KK30NCisNCisvKg0KKyAqIG1hYl9t YXNfY3AoKSAtIENvcHkgZGF0YSBmcm9tIG1hcGxlX2JpZ19ub2RlIHRvIGEgbWFwbGUgZW5jb2Rl ZCBub2RlLg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZSB0aGF0IGhhcyB0aGUgZGF0 YQ0KKyAqIEBtYWJfc3RhcnQ6IHRoZSBzdGFydCBsb2NhdGlvbiBpbiBAYl9ub2RlLg0KKyAqIEBt YWJfZW5kOiBUaGUgZW5kIGxvY2F0aW9uIGluIEBiX25vZGUgKGluY2x1c2l2ZWx5KQ0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZSB3aXRoIHRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICovDQor c3RhdGljIGlubGluZSB2b2lkIG1hYl9tYXNfY3Aoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25v ZGUsDQorCQkJICAgICAgdW5zaWduZWQgY2hhciBtYWJfc3RhcnQsIHVuc2lnbmVkIGNoYXIgbWFi X2VuZCwNCisJCQkgICAgICBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgYm9vbCBuZXdfbWF4KQ0KK3sN CisJaW50IGksIGogPSAwOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQgPSBtdGVfbm9kZV90eXBlKG1h cy0+bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobWFzLT5u b2RlKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwl1bnNp Z25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwl1bnNpZ25lZCBsb25n ICpnYXBzID0gTlVMTDsNCisJdW5zaWduZWQgY2hhciBlbmQ7DQorDQorCWlmIChtYWJfZW5kIC0g bWFiX3N0YXJ0ID4gbXRfcGl2b3RzW210XSkNCisJCW1hYl9lbmQtLTsNCisNCisJaWYgKCFwaXZv dHNbbXRfcGl2b3RzW210XSAtIDFdKQ0KKwkJc2xvdHNbbXRfcGl2b3RzW210XV0gPSBOVUxMOw0K Kw0KKwlpID0gbWFiX3N0YXJ0Ow0KKwlwaXZvdHNbaisrXSA9IGJfbm9kZS0+cGl2b3RbaSsrXTsN CisJZG8gew0KKwkJcGl2b3RzW2orK10gPSBiX25vZGUtPnBpdm90W2krK107DQorCX0gd2hpbGUg KGkgPD0gbWFiX2VuZCAmJiBsaWtlbHkoYl9ub2RlLT5waXZvdFtpXSkpOw0KKw0KKwltZW1jcHko c2xvdHMsIGJfbm9kZS0+c2xvdCArIG1hYl9zdGFydCwNCisJICAgICAgIHNpemVvZih2b2lkICop ICogKGkgLSBtYWJfc3RhcnQpKTsNCisNCisJaWYgKG5ld19tYXgpDQorCQltYXMtPm1heCA9IGJf bm9kZS0+cGl2b3RbaSAtIDFdOw0KKw0KKwllbmQgPSBqIC0gMTsNCisJaWYgKGxpa2VseSghbWFf aXNfbGVhZihtdCkgJiYgbXRfaXNfYWxsb2MobWFzLT50cmVlKSkpIHsNCisJCXVuc2lnbmVkIGxv bmcgbWF4X2dhcCA9IDA7DQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDE1Ow0KKw0KKwkJZ2Fw cyA9IG1hX2dhcHMobm9kZSwgbXQpOw0KKwkJZG8gew0KKwkJCWdhcHNbLS1qXSA9IGJfbm9kZS0+ Z2FwWy0taV07DQorCQkJaWYgKGdhcHNbal0gPiBtYXhfZ2FwKSB7DQorCQkJCW9mZnNldCA9IGo7 DQorCQkJCW1heF9nYXAgPSBnYXBzW2pdOw0KKwkJCX0NCisJCX0gd2hpbGUgKGopOw0KKw0KKwkJ bWFfc2V0X21ldGEobm9kZSwgbXQsIG9mZnNldCwgZW5kKTsNCisJfSBlbHNlIHsNCisJCW1hc19s ZWFmX3NldF9tZXRhKG1hcywgbm9kZSwgcGl2b3RzLCBtdCwgZW5kKTsNCisJfQ0KK30NCisNCisv Kg0KKyAqIG1hc19kZXNjZW5kX2Fkb3B0KCkgLSBEZXNjZW5kIHRocm91Z2ggYSBzdWItdHJlZSBh bmQgYWRvcHQgY2hpbGRyZW4uDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHdpdGggdGhlIG1h cGxlIGVuY29kZWQgbm9kZSBvZiB0aGUgc3ViLXRyZWUuDQorICoNCisgKiBEZXNjZW5kIHRocm91 Z2ggYSBzdWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4gd2hvIGRvIG5vdCBoYXZlIHRoZSBjb3Jy ZWN0DQorICogcGFyZW50cyBzZXQuICBGb2xsb3cgdGhlIHBhcmVudHMgd2hpY2ggaGF2ZSB0aGUg Y29ycmVjdCBwYXJlbnRzIGFzIHRoZXkgYXJlDQorICogdGhlIG5ldyBlbnRyaWVzIHdoaWNoIG5l ZWQgdG8gYmUgZm9sbG93ZWQgdG8gZmluZCBvdGhlciBpbmNvcnJlY3RseSBzZXQNCisgKiBwYXJl bnRzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVzY2VuZF9hZG9wdChzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSBsaXN0WzNdLCBuZXh0WzNdOw0K KwlpbnQgaSwgbjsNCisNCisJLyoNCisJICogQXQgZWFjaCBsZXZlbCB0aGVyZSBtYXkgYmUgdXAg dG8gMyBjb3JyZWN0IHBhcmVudCBwb2ludGVycyB3aGljaCBpbmRpY2F0ZXMNCisJICogdGhlIG5l dyBub2RlcyB3aGljaCBuZWVkIHRvIGJlIHdhbGtlZCB0byBmaW5kIGFueSBuZXcgbm9kZXMgYXQg YSBsb3dlciBsZXZlbC4NCisJICovDQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisJ CWxpc3RbaV0gPSAqbWFzOw0KKwkJbGlzdFtpXS5vZmZzZXQgPSAwOw0KKwkJbmV4dFtpXS5vZmZz ZXQgPSAwOw0KKwl9DQorCW5leHRbMF0gPSAqbWFzOw0KKw0KKwl3aGlsZSAoIW10ZV9pc19sZWFm KGxpc3RbMF0ubm9kZSkpIHsNCisJCW4gPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykg ew0KKwkJCWlmIChtYXNfaXNfbm9uZSgmbGlzdFtpXSkpDQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJ CWlmIChpICYmIGxpc3RbaS0xXS5ub2RlID09IGxpc3RbaV0ubm9kZSkNCisJCQkJY29udGludWU7 DQorDQorCQkJd2hpbGUgKChuIDwgMykgJiYgKG1hc19uZXdfY2hpbGQoJmxpc3RbaV0sICZuZXh0 W25dKSkpDQorCQkJCW4rKzsNCisNCisJCQltYXNfYWRvcHRfY2hpbGRyZW4oJmxpc3RbaV0sIGxp c3RbaV0ubm9kZSk7DQorCQl9DQorDQorCQl3aGlsZSAobiA8IDMpDQorCQkJbmV4dFtuKytdLm5v ZGUgPSBNQVNfTk9ORTsNCisNCisJCS8qIGRlc2NlbmQgYnkgc2V0dGluZyB0aGUgbGlzdCB0byB0 aGUgY2hpbGRyZW4gKi8NCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQkJbGlzdFtpXSA9 IG5leHRbaV07DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfYnVsa19yZWJhbGFuY2UoKSAtIFJl YmFsYW5jZSB0aGUgZW5kIG9mIGEgdHJlZSBhZnRlciBhIGJ1bGsgaW5zZXJ0Lg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbmQ6IFRoZSBtYXBsZSBub2RlIGVuZA0KKyAqIEBtdDog VGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYnVsa19y ZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5kLA0KKwkJCQkg ICAgICBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlpZiAoIShtYXMtPm1hc19mbGFncyAmIE1B X1NUQVRFX0JVTEspKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2Rl KSkNCisJCXJldHVybjsNCisNCisJaWYgKGVuZCA+IG10X21pbl9zbG90c1ttdF0pIHsNCisJCW1h cy0+bWFzX2ZsYWdzICY9IH5NQV9TVEFURV9SRUJBTEFOQ0U7DQorCQlyZXR1cm47DQorCX0NCit9 DQorDQorLyoNCisgKiBtYXNfc3RvcmVfYl9ub2RlKCkgLSBTdG9yZSBhbiBAZW50cnkgaW50byB0 aGUgYl9ub2RlIHdoaWxlIGFsc28gY29weWluZyB0aGUNCisgKiBkYXRhIGZyb20gYSBtYXBsZSBl bmNvZGVkIG5vZGUuDQorICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICogQGJf bm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGZpbGwgd2l0aCBkYXRhDQorICogQG9mZnNldF9l bmQ6IHRoZSBvZmZzZXQgdG8gZW5kIGNvcHlpbmcNCisgKg0KKyAqIFJldHVybjogVGhlIGFjdHVh bCBlbmQgb2YgdGhlIGRhdGEgc3RvcmVkIGluIEBiX25vZGUNCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzX3N0b3JlX2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcywNCisJCXN0 cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBjaGFyIG9mZnNldF9lbmQpDQor ew0KKwl1bnNpZ25lZCBjaGFyIHNsb3Q7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQ7DQorCS8qIFBv c3NpYmxlIHVuZGVyZmxvdyBvZiBwaXYgd2lsbCB3cmFwIGJhY2sgdG8gMCBiZWZvcmUgdXNlLiAq Lw0KKwl1bnNpZ25lZCBsb25nIHBpdjsNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMt Pm1hczsNCisNCisJYl9ub2RlLT50eXBlID0gd3JfbWFzLT50eXBlOw0KKwliX2VuZCA9IDA7DQor CXNsb3QgPSBtYXMtPm9mZnNldDsNCisJaWYgKHNsb3QpIHsNCisJCS8qIENvcHkgc3RhcnQgZGF0 YSB1cCB0byBpbnNlcnQuICovDQorCQltYXNfbWFiX2NwKG1hcywgMCwgc2xvdCAtIDEsIGJfbm9k ZSwgMCk7DQorCQliX2VuZCA9IGJfbm9kZS0+Yl9lbmQ7DQorCQlwaXYgPSBiX25vZGUtPnBpdm90 W2JfZW5kIC0gMV07DQorCX0gZWxzZQ0KKwkJcGl2ID0gbWFzLT5taW4gLSAxOw0KKw0KKwlpZiAo cGl2ICsgMSA8IG1hcy0+aW5kZXgpIHsNCisJCS8qIEhhbmRsZSByYW5nZSBzdGFydGluZyBhZnRl ciBvbGQgcmFuZ2UgKi8NCisJCWJfbm9kZS0+c2xvdFtiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7 DQorCQlpZiAoIXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBtYXMt PmluZGV4IC0gMSAtIHBpdjsNCisJCWJfbm9kZS0+cGl2b3RbYl9lbmQrK10gPSBtYXMtPmluZGV4 IC0gMTsNCisJfQ0KKw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5LiAqLw0KKwltYXMtPm9mZnNl dCA9IGJfZW5kOw0KKwliX25vZGUtPnNsb3RbYl9lbmRdID0gd3JfbWFzLT5lbnRyeTsNCisJYl9u b2RlLT5waXZvdFtiX2VuZF0gPSBtYXMtPmxhc3Q7DQorDQorCS8qIEFwcGVuZGVkLiAqLw0KKwlp ZiAobWFzLT5sYXN0ID49IG1hcy0+bWF4KQ0KKwkJZ290byBiX2VuZDsNCisNCisJLyogSGFuZGxl IG5ldyByYW5nZSBlbmRpbmcgYmVmb3JlIG9sZCByYW5nZSBlbmRzICovDQorCXBpdiA9IG1hc19s b2dpY2FsX3Bpdm90KG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNldF9lbmQsIHdyX21hcy0+dHlw ZSk7DQorCWlmIChwaXYgPiBtYXMtPmxhc3QpIHsNCisJCWlmIChwaXYgPT0gVUxPTkdfTUFYKQ0K KwkJCW1hc19idWxrX3JlYmFsYW5jZShtYXMsIGJfbm9kZS0+Yl9lbmQsIHdyX21hcy0+dHlwZSk7 DQorDQorCQlpZiAob2Zmc2V0X2VuZCAhPSBzbG90KQ0KKwkJCXdyX21hcy0+Y29udGVudCA9IG1h c19zbG90X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJCSAgb2Zmc2V0X2VuZCk7 DQorDQorCQliX25vZGUtPnNsb3RbKytiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7DQorCQlpZiAo IXdyX21hcy0+Y29udGVudCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBwaXYgLSBtYXMtPmxh c3QgKyAxOw0KKwkJYl9ub2RlLT5waXZvdFtiX2VuZF0gPSBwaXY7DQorCX0NCisNCisJc2xvdCA9 IG9mZnNldF9lbmQgKyAxOw0KKwlpZiAoc2xvdCA+IHdyX21hcy0+bm9kZV9lbmQpDQorCQlnb3Rv IGJfZW5kOw0KKw0KKwkvKiBDb3B5IGVuZCBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIG5vZGUuICov DQorCW1hc19tYWJfY3AobWFzLCBzbG90LCB3cl9tYXMtPm5vZGVfZW5kICsgMSwgYl9ub2RlLCAr K2JfZW5kKTsNCisJYl9ub2RlLT5iX2VuZC0tOw0KKwlyZXR1cm47DQorDQorYl9lbmQ6DQorCWJf bm9kZS0+Yl9lbmQgPSBiX2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJldl9zaWJsaW5nKCkg LSBGaW5kIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIHNhbWUgcGFyZW50Lg0KKyAqIEBtYXM6 IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHRoZXJlIGlzIGEgcHJl dmlvdXMgc2libGluZywgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9v bCBtYXNfcHJldl9zaWJsaW5nKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQg aW50IHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKw0KKwlpZiAobXRlX2lz X3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKCFwX3Nsb3QpDQor CQlyZXR1cm4gZmFsc2U7DQorDQorCW1hc19hc2NlbmQobWFzKTsNCisJbWFzLT5vZmZzZXQgPSBw X3Nsb3QgLSAxOw0KKwltYXNfZGVzY2VuZChtYXMpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQor LyoNCisgKiBtYXNfbmV4dF9zaWJsaW5nKCkgLSBGaW5kIHRoZSBuZXh0IG5vZGUgd2l0aCB0aGUg c2FtZSBwYXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBSZXR1cm46 IHRydWUgaWYgdGhlcmUgaXMgYSBuZXh0IHNpYmxpbmcsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8N CitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX25leHRfc2libGluZyhzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCU1BX1NUQVRFKHBhcmVudCwgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxh c3QpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybiBmYWxzZTsN CisNCisJcGFyZW50ID0gKm1hczsNCisJbWFzX2FzY2VuZCgmcGFyZW50KTsNCisJcGFyZW50Lm9m ZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpICsgMTsNCisJaWYgKHBhcmVudC5vZmZz ZXQgPiBtYXNfZGF0YV9lbmQoJnBhcmVudCkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCSptYXMg PSBwYXJlbnQ7DQorCW1hc19kZXNjZW5kKG1hcyk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisv Kg0KKyAqIG10ZV9ub2RlX29yX25vZGUoKSAtIFJldHVybiB0aGUgZW5jb2RlZCBub2RlIG9yIE1B U19OT05FLg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFNo b3J0aGFuZCB0byBhdm9pZCBzZXR0aW5nICVOVUxMcyBpbiB0aGUgdHJlZSBvciBtYXBsZV9zdWJ0 cmVlX3N0YXRlLg0KKyAqDQorICogUmV0dXJuOiBAZW5vZGUgb3IgTUFTX05PTkUNCisgKi8NCitz dGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbXRlX25vZGVfb3Jfbm9uZShzdHJ1Y3Qg bWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJaWYgKGVub2RlKQ0KKwkJcmV0dXJuIGVub2RlOw0K Kw0KKwlyZXR1cm4gbWFfZW5vZGVfcHRyKE1BU19OT05FKTsNCit9DQorDQorLyoNCisgKiBtYXNf d3Jfbm9kZV93YWxrKCkgLSBGaW5kIHRoZSBjb3JyZWN0IG9mZnNldCBmb3IgdGhlIGluZGV4IGlu IHRoZSBAbWFzLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqDQorICog VXNlcyBtYXNfc2xvdF9sb2NrZWQoKSBhbmQgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBk ZWFkIG5vZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3Jfbm9kZV93YWxrKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3 cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBjb3VudDsNCisJdW5zaWduZWQgY2hhciBvZmZz ZXQ7DQorCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1pbiwgbWF4Ow0KKw0KKwlpZiAodW5saWtlbHko bWFfaXNfZGVuc2Uod3JfbWFzLT50eXBlKSkpIHsNCisJCXdyX21hcy0+cl9tYXggPSB3cl9tYXMt PnJfbWluID0gbWFzLT5pbmRleDsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzLT5pbmRleCA9IG1hcy0+ bWluOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCXdyX21hcy0+bm9kZSA9IG1hc19tbih3cl9tYXMt Pm1hcyk7DQorCXdyX21hcy0+cGl2b3RzID0gbWFfcGl2b3RzKHdyX21hcy0+bm9kZSwgd3JfbWFz LT50eXBlKTsNCisJY291bnQgPSB3cl9tYXMtPm5vZGVfZW5kID0gbWFfZGF0YV9lbmQod3JfbWFz LT5ub2RlLCB3cl9tYXMtPnR5cGUsDQorCQkJCQkgICAgICAgd3JfbWFzLT5waXZvdHMsIG1hcy0+ bWF4KTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1pbiA9IG1hc19zYWZlX21pbihtYXMs IHdyX21hcy0+cGl2b3RzLCBvZmZzZXQpOw0KKwltYXggPSB3cl9tYXMtPnBpdm90c1tvZmZzZXRd Ow0KKwlpZiAodW5saWtlbHkob2Zmc2V0ID09IGNvdW50KSkNCisJCWdvdG8gbWF4OyAvKiBtYXkg aGF2ZSBiZWVuIHNldCB0byB6ZXJvICovDQorDQorCWluZGV4ID0gbWFzLT5pbmRleDsNCisJaWYg KHVubGlrZWx5KGluZGV4IDw9IG1heCkpDQorCQlnb3RvIGRvbmU7DQorDQorCWlmICh1bmxpa2Vs eSghbWF4ICYmIG9mZnNldCkpDQorCQlnb3RvIG1heDsNCisNCisJbWluID0gbWF4ICsgMTsNCisJ d2hpbGUgKCsrb2Zmc2V0IDwgY291bnQpIHsNCisJCW1heCA9IHdyX21hcy0+cGl2b3RzW29mZnNl dF07DQorCQlpZiAoaW5kZXggPD0gbWF4KQ0KKwkJCWdvdG8gZG9uZTsNCisJCWVsc2UgaWYgKHVu bGlrZWx5KCFtYXgpKQ0KKwkJCWJyZWFrOw0KKw0KKwkJbWluID0gbWF4ICsgMTsNCisJfQ0KKw0K K21heDoNCisJbWF4ID0gbWFzLT5tYXg7DQorZG9uZToNCisJd3JfbWFzLT5yX21heCA9IG1heDsN CisJd3JfbWFzLT5yX21pbiA9IG1pbjsNCisJd3JfbWFzLT5vZmZzZXRfZW5kID0gbWFzLT5vZmZz ZXQgPSBvZmZzZXQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF90b3BpYXJ5KCkgLSBBZGQgdGhlIHBv cnRpb25zIG9mIHRoZSB0cmVlIHRvIHRoZSByZW1vdmFsIGxpc3Q7IGVpdGhlciB0bw0KKyAqIGJl IGZyZWVkIG9yIGRpc2NhcmRlZCAoZGVzdHJveSB3YWxrKS4NCisgKiBAbWFzdDogVGhlIG1hcGxl X3N1YnRyZWVfc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfdG9waWFyeShz dHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21h cywgbWFzdC0+b3JpZ19sLCBOVUxMKTsNCisJdW5zaWduZWQgY2hhciBsX29mZiwgcl9vZmYsIG9m ZnNldDsNCisJdW5zaWduZWQgbG9uZyBsX2luZGV4Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmNo aWxkOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCXdyX21hcy50eXBlID0gbXRlX25vZGVf dHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwkvKiBUaGUgbGVmdCBub2RlIGlzIGNvbnN1bWVk LCBzbyBhZGQgdG8gdGhlIGZyZWUgbGlzdC4gKi8NCisJbF9pbmRleCA9IG1hc3QtPm9yaWdfbC0+ aW5kZXg7DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBtYXN0LT5vcmlnX2wtPmxhc3Q7DQorCW1h c193cl9ub2RlX3dhbGsoJndyX21hcyk7DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBsX2luZGV4 Ow0KKwlsX29mZiA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0Ow0KKwlyX29mZiA9IG1hc3QtPm9yaWdf ci0+b2Zmc2V0Ow0KKwlpZiAobWFzdC0+b3JpZ19sLT5ub2RlID09IG1hc3QtPm9yaWdfci0+bm9k ZSkgew0KKwkJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9fbm9kZShtYXN0LT5vcmlnX2wtPm5vZGUp LCB3cl9tYXMudHlwZSk7DQorCQlmb3IgKG9mZnNldCA9IGxfb2ZmICsgMTsgb2Zmc2V0IDwgcl9v ZmY7IG9mZnNldCsrKQ0KKwkJCW1hdF9hZGQobWFzdC0+ZGVzdHJveSwgbWFzX3Nsb3RfbG9ja2Vk KG1hc3QtPm9yaWdfbCwNCisJCQkJCQkJc2xvdHMsIG9mZnNldCkpOw0KKw0KKwkJcmV0dXJuOw0K Kwl9DQorDQorCS8qIG1hc3QtPm9yaWdfciBpcyBkaWZmZXJlbnQgYW5kIGNvbnN1bWVkLiAqLw0K KwlpZiAobXRlX2lzX2xlYWYobWFzdC0+b3JpZ19yLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJ LyogTm93IGRlc3Ryb3kgbF9vZmYgKyAxIC0+IGVuZCBhbmQgMCAtPiByX29mZiAtIDEgKi8NCisJ b2Zmc2V0ID0gbF9vZmYgKyAxOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hc3Qt Pm9yaWdfbC0+bm9kZSksIHdyX21hcy50eXBlKTsNCisJd2hpbGUgKG9mZnNldCA8IG10X3Nsb3Rz W3dyX21hcy50eXBlXSkgew0KKwkJY2hpbGQgPSBtYXNfc2xvdF9sb2NrZWQobWFzdC0+b3JpZ19s LCBzbG90cywgb2Zmc2V0KyspOw0KKwkJaWYgKCFjaGlsZCkNCisJCQlicmVhazsNCisNCisJCW1h dF9hZGQobWFzdC0+ZGVzdHJveSwgY2hpbGQpOw0KKwl9DQorDQorCXNsb3RzID0gbWFfc2xvdHMo bXRlX3RvX25vZGUobWFzdC0+b3JpZ19yLT5ub2RlKSwNCisJCQkgICAgIG10ZV9ub2RlX3R5cGUo bWFzdC0+b3JpZ19yLT5ub2RlKSk7DQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcl9vZmY7 IG9mZnNldCsrKQ0KKwkJbWF0X2FkZChtYXN0LT5kZXN0cm95LA0KKwkJCQltYXNfc2xvdF9sb2Nr ZWQobWFzdC0+b3JpZ19sLCBzbG90cywgb2Zmc2V0KSk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9y ZWJhbGFuY2VfbmV4dCgpIC0gUmViYWxhbmNlIGFnYWluc3QgdGhlIG5leHQgbm9kZQ0KKyAqIEBt YXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBvbGRfcjogVGhlIGVuY29kZWQgbWFw bGUgbm9kZSB0byB0aGUgcmlnaHQgKG5leHQgbm9kZSkuDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc3RfcmViYWxhbmNlX25leHQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3Qs DQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9yLCBib29sIGZyZWUpDQorew0K Kwl1bnNpZ25lZCBjaGFyIGJfZW5kID0gbWFzdC0+Ym4tPmJfZW5kOw0KKw0KKwltYXNfbWFiX2Nw KG1hc3QtPm9yaWdfciwgMCwgbXRfc2xvdF9jb3VudChtYXN0LT5vcmlnX3ItPm5vZGUpLA0KKwkJ ICAgbWFzdC0+Ym4sIGJfZW5kKTsNCisJaWYgKGZyZWUpDQorCQltYXRfYWRkKG1hc3QtPmZyZWUs IG9sZF9yKTsNCisNCisJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQor CWlmIChvbGRfciA9PSBtYXN0LT5vcmlnX2wtPm5vZGUpDQorCQltYXN0LT5vcmlnX2wtPm5vZGUg PSBtYXN0LT5vcmlnX3ItPm5vZGU7DQorfQ0KKw0KKy8qDQorICogbWFzdF9yZWJhbGFuY2VfcHJl digpIC0gUmViYWxhbmNlIGFnYWluc3QgdGhlIHByZXZpb3VzIG5vZGUNCisgKiBAbWFzdDogVGhl IG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAb2xkX2w6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUg dG8gdGhlIGxlZnQgKHByZXZpb3VzIG5vZGUpDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1h c3RfcmViYWxhbmNlX3ByZXYoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJ CSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9sKQ0KK3sNCisJdW5zaWduZWQgY2hhciBl bmQgPSBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19sKSArIDE7DQorCXVuc2lnbmVkIGNoYXIgYl9l bmQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorDQorCW1hYl9zaGlmdF9yaWdodChtYXN0LT5ibiwgZW5k KTsNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX2wsIDAsIGVuZCAtIDEsIG1hc3QtPmJuLCAwKTsN CisJbWF0X2FkZChtYXN0LT5mcmVlLCBvbGRfbCk7DQorCWlmIChtYXN0LT5vcmlnX3ItPm5vZGUg PT0gb2xkX2wpDQorCQltYXN0LT5vcmlnX3ItPm5vZGUgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQor CW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+bWluOw0KKwltYXN0LT5vcmlnX2wtPmluZGV4 ID0gbWFzdC0+b3JpZ19sLT5taW47DQorCW1hc3QtPmJuLT5iX2VuZCA9IGVuZCArIGJfZW5kOw0K KwltYXN0LT5sLT5vZmZzZXQgKz0gZW5kOw0KK30NCisNCisvKg0KKyAqIG1hc3Rfc2libGluZ19y ZWJhbGFuY2VfcmlnaHQoKSAtIFJlYmFsYW5jZSBmcm9tIG5vZGVzIHdpdGggdGhlIHNhbWUgcGFy ZW50cy4NCisgKiBDaGVjayB0aGUgcmlnaHQgc2lkZSwgdGhlbiB0aGUgbGVmdC4gIERhdGEgaXMg Y29waWVkIGludG8gdGhlIEBtYXN0LT5ibi4NCisgKiBAbWFzdDogVGhlIG1hcGxlX3N1YnRyZWVf c3RhdGUuDQorICovDQorc3RhdGljIGlubGluZQ0KK2Jvb2wgbWFzdF9zaWJsaW5nX3JlYmFsYW5j ZV9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwgYm9vbCBmcmVlKQ0KK3sN CisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRfcjsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRf bDsNCisNCisJb2xkX3IgPSBtYXN0LT5vcmlnX3ItPm5vZGU7DQorCWlmIChtYXNfbmV4dF9zaWJs aW5nKG1hc3QtPm9yaWdfcikpIHsNCisJCW1hc3RfcmViYWxhbmNlX25leHQobWFzdCwgb2xkX3Is IGZyZWUpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJb2xkX2wgPSBtYXN0LT5vcmlnX2wt Pm5vZGU7DQorCWlmIChtYXNfcHJldl9zaWJsaW5nKG1hc3QtPm9yaWdfbCkpIHsNCisJCW1hc3Qt PmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwkJbWFzdF9y ZWJhbGFuY2VfcHJldihtYXN0LCBvbGRfbCk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwly ZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19wcmV2X25vZGUoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKTsNCitzdGF0aWMgaW5saW5lIGlu dCBtYXNfbmV4dF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfbm9kZSAq bm9kZSwNCisJCQkJdW5zaWduZWQgbG9uZyBtYXgpOw0KKy8qDQorICogbWFzdF9jb3VzaW5fcmVi YWxhbmNlX3JpZ2h0KCkgLSBSZWJhbGFuY2UgZnJvbSBub2RlcyB3aXRoIGRpZmZlcmVudCBwYXJl bnRzLg0KKyAqIENoZWNrIHRoZSByaWdodCBzaWRlLCB0aGVuIHRoZSBsZWZ0LiAgRGF0YSBpcyBj b3BpZWQgaW50byB0aGUgQG1hc3QtPmJuLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9z dGF0ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lDQorYm9vbCBtYXN0X2NvdXNpbl9yZWJhbGFuY2Vf cmlnaHQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsIGJvb2wgZnJlZSkNCit7DQor CXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkX2wgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQorCXN0cnVj dCBtYXBsZV9lbm9kZSAqb2xkX3IgPSBtYXN0LT5vcmlnX3ItPm5vZGU7DQorDQorCU1BX1NUQVRF KHRtcCwgbWFzdC0+b3JpZ19yLT50cmVlLCBtYXN0LT5vcmlnX3ItPmluZGV4LCBtYXN0LT5vcmln X3ItPmxhc3QpOw0KKw0KKwl0bXAgPSAqbWFzdC0+b3JpZ19yOw0KKwltYXNfbmV4dF9ub2RlKG1h c3QtPm9yaWdfciwgbWFzX21uKG1hc3QtPm9yaWdfciksIFVMT05HX01BWCk7DQorCWlmICghbWFz X2lzX25vbmUobWFzdC0+b3JpZ19yKSkgew0KKwkJbWFzdF9yZWJhbGFuY2VfbmV4dChtYXN0LCBv bGRfciwgZnJlZSk7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwkqbWFzdC0+b3JpZ19yID0g Km1hc3QtPm9yaWdfbDsNCisJKm1hc3QtPnIgPSAqbWFzdC0+bDsNCisJbWFzX3ByZXZfbm9kZSht YXN0LT5vcmlnX2wsIDApOw0KKwlpZiAobWFzX2lzX25vbmUobWFzdC0+b3JpZ19sKSkgew0KKwkJ LyogTWFraW5nIGEgbmV3IHJvb3Qgd2l0aCB0aGUgY29udGVudHMgb2YgbWFzdC0+Ym4gKi8NCisJ CSptYXN0LT5vcmlnX2wgPSAqbWFzdC0+b3JpZ19yOw0KKwkJKm1hc3QtPm9yaWdfciA9IHRtcDsN CisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwltYXN0LT5vcmlnX2wtPm9mZnNldCA9IDA7DQor CW1hc3RfcmViYWxhbmNlX3ByZXYobWFzdCwgb2xkX2wpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQor DQorLyoNCisgKiBtYXN0X2FzY2VuZF9mcmVlKCkgLSBBZGQgY3VycmVudCBvcmlnaW5hbCBtYXBs ZSBzdGF0ZSBub2RlcyB0byB0aGUgZnJlZSBsaXN0DQorICogYW5kIGFzY2VuZC4NCisgKiBAbWFz dDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUuDQorICoNCisgKiBBc2NlbmQgdGhlIG9yaWdpbmFs IGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGFuZCBhZGQgdGhlIHByZXZpb3VzIG5vZGVzIHRvIHRoZQ0K KyAqIGZyZWUgbGlzdC4gIFNldCB0aGUgc2xvdHMgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QgbG9j YXRpb24gaW4gdGhlIG5ldyBub2Rlcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQNCittYXN0 X2FzY2VuZF9mcmVlKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJTUFf V1JfU1RBVEUod3JfbWFzLCBtYXN0LT5vcmlnX3IsICBOVUxMKTsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpsZWZ0ID0gbWFzdC0+b3JpZ19sLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJp Z2h0ID0gbWFzdC0+b3JpZ19yLT5ub2RlOw0KKw0KKwltYXNfYXNjZW5kKG1hc3QtPm9yaWdfbCk7 DQorCW1hc19hc2NlbmQobWFzdC0+b3JpZ19yKTsNCisJbWF0X2FkZChtYXN0LT5mcmVlLCBsZWZ0 KTsNCisNCisJaWYgKGxlZnQgIT0gcmlnaHQpDQorCQltYXRfYWRkKG1hc3QtPmZyZWUsIHJpZ2h0 KTsNCisNCisJbWFzdC0+b3JpZ19yLT5vZmZzZXQgPSAwOw0KKwltYXN0LT5vcmlnX3ItPmluZGV4 ID0gbWFzdC0+ci0+bWF4Ow0KKwkvKiBsYXN0IHNob3VsZCBiZSBsYXJnZXIgdGhhbiBvciBlcXVh bCB0byBpbmRleCAqLw0KKwlpZiAobWFzdC0+b3JpZ19yLT5sYXN0IDwgbWFzdC0+b3JpZ19yLT5p bmRleCkNCisJCW1hc3QtPm9yaWdfci0+bGFzdCA9IG1hc3QtPm9yaWdfci0+aW5kZXg7DQorCS8q DQorCSAqIFRoZSBub2RlIG1heSBub3QgY29udGFpbiB0aGUgdmFsdWUgc28gc2V0IHNsb3QgdG8g ZW5zdXJlIGFsbA0KKwkgKiBvZiB0aGUgbm9kZXMgY29udGVudHMgYXJlIGZyZWVkIG9yIGRlc3Ry b3llZC4NCisJICovDQorCWlmIChtYXN0LT5vcmlnX3ItPm1heCA8IG1hc3QtPm9yaWdfci0+bGFz dCkNCisJCW1hc3QtPm9yaWdfci0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hc3QtPm9yaWdfcikg KyAxOw0KKwllbHNlIHsNCisJCXdyX21hcy50eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmln X3ItPm5vZGUpOw0KKwkJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsNCisJfQ0KKwkvKiBTZXQg dXAgdGhlIGxlZnQgc2lkZSBvZiB0aGluZ3MgKi8NCisJbWFzdC0+b3JpZ19sLT5vZmZzZXQgPSAw Ow0KKwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+bC0+bWluOw0KKwl3cl9tYXMubWFzID0g bWFzdC0+b3JpZ19sOw0KKwl3cl9tYXMudHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19s LT5ub2RlKTsNCisJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsNCit9DQorDQorLyoNCisgKiBt YXNfbmV3X21hX25vZGUoKSAtIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG1hcGxlIG5vZGUuICBI ZWxwZXIgZnVuY3Rpb24uDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHdpdGggdGhlIGFsbG9j YXRpb25zLg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZSB3aXRoIHRoZSB0eXBlIGVu Y29kaW5nLg0KKyAqDQorICogVXNlIHRoZSBub2RlIHR5cGUgZnJvbSB0aGUgbWFwbGVfYmlnX25v ZGUgdG8gYWxsb2NhdGUgYSBuZXcgbm9kZSBmcm9tIHRoZQ0KKyAqIG1hX3N0YXRlLiAgVGhpcyBm dW5jdGlvbiBleGlzdHMgbWFpbmx5IGZvciBjb2RlIHJlYWRhYmlsaXR5Lg0KKyAqDQorICogUmV0 dXJuOiBBIG5ldyBtYXBsZSBlbmNvZGVkIG5vZGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVj dCBtYXBsZV9lbm9kZQ0KKyptYXNfbmV3X21hX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0 cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlKQ0KK3sNCisJcmV0dXJuIG10X21rX25vZGUobWFf bW5vZGVfcHRyKG1hc19wb3Bfbm9kZShtYXMpKSwgYl9ub2RlLT50eXBlKTsNCit9DQorDQorLyoN CisgKiBtYXNfbWFiX3RvX25vZGUoKSAtIFNldCB1cCByaWdodCBhbmQgbWlkZGxlIG5vZGVzDQor ICoNCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUgdGhhdCBjb250YWlucyB0aGUgYWxsb2NhdGlv bnMuDQorICogQGJfbm9kZTogdGhlIG5vZGUgd2hpY2ggY29udGFpbnMgdGhlIGRhdGEuDQorICog QGxlZnQ6IFRoZSBwb2ludGVyIHdoaWNoIHdpbGwgaGF2ZSB0aGUgbGVmdCBub2RlDQorICogQHJp Z2h0OiBUaGUgcG9pbnRlciB3aGljaCBtYXkgaGF2ZSB0aGUgcmlnaHQgbm9kZQ0KKyAqIEBtaWRk bGU6IHRoZSBwb2ludGVyIHdoaWNoIG1heSBoYXZlIHRoZSBtaWRkbGUgbm9kZSAocmFyZSkNCisg KiBAbWlkX3NwbGl0OiB0aGUgc3BsaXQgbG9jYXRpb24gZm9yIHRoZSBtaWRkbGUgbm9kZQ0KKyAq DQorICogUmV0dXJuOiB0aGUgc3BsaXQgb2YgbGVmdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGNoYXIgbWFzX21hYl90b19ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwlzdHJ1 Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwgc3RydWN0IG1hcGxlX2Vub2RlICoqbGVmdCwNCisJ c3RydWN0IG1hcGxlX2Vub2RlICoqcmlnaHQsIHN0cnVjdCBtYXBsZV9lbm9kZSAqKm1pZGRsZSwN CisJdW5zaWduZWQgY2hhciAqbWlkX3NwbGl0LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXVu c2lnbmVkIGNoYXIgc3BsaXQgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQgPSBtdF9z bG90c1tiX25vZGUtPnR5cGVdOw0KKw0KKwkqbGVmdCA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJf bm9kZSk7DQorCSpyaWdodCA9IE5VTEw7DQorCSptaWRkbGUgPSBOVUxMOw0KKwkqbWlkX3NwbGl0 ID0gMDsNCisNCisJaWYgKGJfbm9kZS0+Yl9lbmQgPCBzbG90X2NvdW50KSB7DQorCQlzcGxpdCA9 IGJfbm9kZS0+Yl9lbmQ7DQorCX0gZWxzZSB7DQorCQlzcGxpdCA9IG1hYl9jYWxjX3NwbGl0KG1h cywgYl9ub2RlLCBtaWRfc3BsaXQsIG1pbik7DQorCQkqcmlnaHQgPSBtYXNfbmV3X21hX25vZGUo bWFzLCBiX25vZGUpOw0KKwl9DQorDQorCWlmICgqbWlkX3NwbGl0KQ0KKwkJKm1pZGRsZSA9IG1h c19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorDQorCXJldHVybiBzcGxpdDsNCisNCit9DQor DQorLyoNCisgKiBtYWJfc2V0X2JfZW5kKCkgLSBBZGQgZW50cnkgdG8gYl9ub2RlIGF0IGJfbm9k ZS0+Yl9lbmQgYW5kIGluY3JlbWVudCB0aGUgZW5kDQorICogcG9pbnRlci4NCisgKiBAYl9ub2Rl IC0gdGhlIGJpZyBub2RlIHRvIGFkZCB0aGUgZW50cnkNCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0 YXRlIHRvIGdldCB0aGUgcGl2b3QgKG1hcy0+bWF4KQ0KKyAqIEBlbnRyeSAtIHRoZSBlbnRyeSB0 byBhZGQsIGlmIE5VTEwgbm90aGluZyBoYXBwZW5zLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYWJfc2V0X2JfZW5kKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCQkgc3Ry dWN0IG1hX3N0YXRlICptYXMsDQorCQkJCSB2b2lkICplbnRyeSkNCit7DQorCWlmICghZW50cnkp DQorCQlyZXR1cm47DQorDQorCWJfbm9kZS0+c2xvdFtiX25vZGUtPmJfZW5kXSA9IGVudHJ5Ow0K KwlpZiAobXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCWJfbm9kZS0+Z2FwW2Jfbm9kZS0+Yl9l bmRdID0gbWFzX21heF9nYXAobWFzKTsNCisJYl9ub2RlLT5waXZvdFtiX25vZGUtPmJfZW5kKytd ID0gbWFzLT5tYXg7DQorfQ0KKw0KKy8qDQorICogbWFzX3NldF9zcGxpdF9wYXJlbnQoKSAtIGNv bWJpbmVfdGhlbl9zZXBhcmF0ZSBoZWxwZXIgZnVuY3Rpb24uICBTZXRzIHRoZSBwYXJlbnQNCisg KiBvZiBAbWFzLT5ub2RlIHRvIGVpdGhlciBAbGVmdCBvciBAcmlnaHQsIGRlcGVuZGluZyBvbiBA c2xvdCBhbmQgQHNwbGl0DQorICoNCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlIHdpdGggdGhl IG5vZGUgdGhhdCBuZWVkcyBhIHBhcmVudA0KKyAqIEBsZWZ0IC0gcG9zc2libGUgcGFyZW50IDEN CisgKiBAcmlnaHQgLSBwb3NzaWJsZSBwYXJlbnQgMg0KKyAqIEBzbG90IC0gdGhlIHNsb3QgdGhl IG1hcy0+bm9kZSB3YXMgcGxhY2VkDQorICogQHNwbGl0IC0gdGhlIHNwbGl0IGxvY2F0aW9uIGJl dHdlZW4gQGxlZnQgYW5kIEByaWdodA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc2V0 X3NwbGl0X3BhcmVudChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJCXN0cnVjdCBtYXBsZV9l bm9kZSAqbGVmdCwNCisJCQkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQsDQorCQkJCQl1bnNp Z25lZCBjaGFyICpzbG90LCB1bnNpZ25lZCBjaGFyIHNwbGl0KQ0KK3sNCisJaWYgKG1hc19pc19u b25lKG1hcykpDQorCQlyZXR1cm47DQorDQorCWlmICgoKnNsb3QpIDw9IHNwbGl0KQ0KKwkJbXRl X3NldF9wYXJlbnQobWFzLT5ub2RlLCBsZWZ0LCAqc2xvdCk7DQorCWVsc2UgaWYgKHJpZ2h0KQ0K KwkJbXRlX3NldF9wYXJlbnQobWFzLT5ub2RlLCByaWdodCwgKCpzbG90KSAtIHNwbGl0IC0gMSk7 DQorDQorCSgqc2xvdCkrKzsNCit9DQorDQorLyoNCisgKiBtdGVfbWlkX3NwbGl0X2NoZWNrKCkg LSBDaGVjayBpZiB0aGUgbmV4dCBub2RlIHBhc3NlcyB0aGUgbWlkLXNwbGl0DQorICogQCoqbDog UG9pbnRlciB0byBsZWZ0IGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAKiptOiBQb2ludGVyIHRv IG1pZGRsZSBlbmNvZGVkIG1hcGxlIG5vZGUuDQorICogQCoqcjogUG9pbnRlciB0byByaWdodCBl bmNvZGVkIG1hcGxlIG5vZGUuDQorICogQHNsb3Q6IFRoZSBvZmZzZXQNCisgKiBAKnNwbGl0OiBU aGUgc3BsaXQgbG9jYXRpb24uDQorICogQG1pZF9zcGxpdDogVGhlIG1pZGRsZSBzcGxpdC4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX21pZF9zcGxpdF9jaGVjayhzdHJ1Y3QgbWFwbGVf ZW5vZGUgKipsLA0KKwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vub2RlICoqciwNCisJCQkJICAg ICAgIHN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFy IHNsb3QsDQorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzcGxpdCwNCisJCQkJICAgICAgIHVu c2lnbmVkIGNoYXIgbWlkX3NwbGl0KQ0KK3sNCisJaWYgKCpyID09IHJpZ2h0KQ0KKwkJcmV0dXJu Ow0KKw0KKwlpZiAoc2xvdCA8IG1pZF9zcGxpdCkNCisJCXJldHVybjsNCisNCisJKmwgPSAqcjsN CisJKnIgPSByaWdodDsNCisJKnNwbGl0ID0gbWlkX3NwbGl0Ow0KK30NCisNCisvKg0KKyAqIG1h c3Rfc2V0X3NwbGl0X3BhcmVudHMoKSAtIEhlbHBlciBmdW5jdGlvbiB0byBzZXQgdGhyZWUgbm9k ZXMgcGFyZW50cy4gIFNsb3QNCisgKiBpcyB0YWtlbiBmcm9tIEBtYXN0LT5sLg0KKyAqIEBtYXN0 IC0gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdCAtIHRoZSBsZWZ0IG5vZGUNCisg KiBAcmlnaHQgLSB0aGUgcmlnaHQgbm9kZQ0KKyAqIEBzcGxpdCAtIHRoZSBzcGxpdCBsb2NhdGlv bi4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9zZXRfc3BsaXRfcGFyZW50cyhzdHJ1 Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJCSAgc3RydWN0IG1hcGxlX2Vub2Rl ICpsZWZ0LA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1pZGRsZSwNCisJCQkJCSAgc3Ry dWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJCQkJCSAgdW5zaWduZWQgY2hhciBzcGxpdCwNCisJ CQkJCSAgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3Q7 DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbCA9IGxlZnQ7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq ciA9IHJpZ2h0Ow0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzdC0+bCkpDQorCQlyZXR1cm47DQor DQorCWlmIChtaWRkbGUpDQorCQlyID0gbWlkZGxlOw0KKw0KKwlzbG90ID0gbWFzdC0+bC0+b2Zm c2V0Ow0KKw0KKwltdGVfbWlkX3NwbGl0X2NoZWNrKCZsLCAmciwgcmlnaHQsIHNsb3QsICZzcGxp dCwgbWlkX3NwbGl0KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+bCwgbCwgciwgJnNs b3QsIHNwbGl0KTsNCisNCisJbXRlX21pZF9zcGxpdF9jaGVjaygmbCwgJnIsIHJpZ2h0LCBzbG90 LCAmc3BsaXQsIG1pZF9zcGxpdCk7DQorCW1hc19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPm0sIGws IHIsICZzbG90LCBzcGxpdCk7DQorDQorCW10ZV9taWRfc3BsaXRfY2hlY2soJmwsICZyLCByaWdo dCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0 LT5yLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0KK30NCisNCisvKg0KKyAqIG1hc193bWJfcmVwbGFj ZSgpIC0gV3JpdGUgbWVtb3J5IGJhcnJpZXIgYW5kIHJlcGxhY2UNCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAZnJlZTogdGhlIG1hcGxlIHRvcGlhcnkgbGlzdCBvZiBub2RlcyB0byBm cmVlDQorICogQGRlc3Ryb3k6IFRoZSBtYXBsZSB0b3BpYXJ5IGxpc3Qgb2Ygbm9kZXMgdG8gZGVz dHJveSAod2FsayBhbmQgZnJlZSkNCisgKg0KKyAqIFVwZGF0ZXMgZ2FwIGFzIG5lY2Vzc2FyeS4N CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dtYl9yZXBsYWNlKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLA0KKwkJCQkgICBzdHJ1Y3QgbWFfdG9waWFyeSAqZnJlZSwNCisJCQkJICAgc3RydWN0 IG1hX3RvcGlhcnkgKmRlc3Ryb3kpDQorew0KKwkvKiBBbGwgbm9kZXMgbXVzdCBzZWUgb2xkIGRh dGEgYXMgZGVhZCBwcmlvciB0byByZXBsYWNpbmcgdGhhdCBkYXRhICovDQorCXNtcF93bWIoKTsN CisNCisJLyogSW5zZXJ0IHRoZSBuZXcgZGF0YSBpbiB0aGUgdHJlZSAqLw0KKwltYXNfcmVwbGFj ZShtYXMsIHRydWUpOw0KKw0KKwlpZiAoIW10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQltYXNf ZGVzY2VuZF9hZG9wdChtYXMpOw0KKw0KKwltYXNfbWF0X2ZyZWUobWFzLCBmcmVlKTsNCisNCisJ aWYgKGRlc3Ryb3kpDQorCQltYXNfbWF0X2Rlc3Ryb3kobWFzLCBkZXN0cm95KTsNCisNCisJaWYg KG10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCW1hc191cGRhdGVfZ2Fw KG1hcyk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9uZXdfcm9vdCgpIC0gU2V0IGEgbmV3IHRyZWUg cm9vdCBkdXJpbmcgc3VidHJlZSBjcmVhdGlvbg0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJl ZSBzdGF0ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc3RfbmV3X3Jvb3Qoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQor CQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCW1hc19tbihtYXN0LT5sKS0+cGFyZW50 ID0NCisJCW1hX3BhcmVudF9wdHIoKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1Rf UEFSRU5UKSk7DQorCWlmICghbXRlX2RlYWRfbm9kZShtYXN0LT5vcmlnX2wtPm5vZGUpICYmDQor CSAgICAhbXRlX2lzX3Jvb3QobWFzdC0+b3JpZ19sLT5ub2RlKSkgew0KKwkJZG8gew0KKwkJCW1h c3RfYXNjZW5kX2ZyZWUobWFzdCk7DQorCQkJbWFzdF90b3BpYXJ5KG1hc3QpOw0KKwkJfSB3aGls ZSAoIW10ZV9pc19yb290KG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0KKwl9DQorCWlmICgobWFzdC0+ b3JpZ19sLT5ub2RlICE9IG1hcy0+bm9kZSkgJiYNCisJCSAgIChtYXN0LT5sLT5kZXB0aCA+IG1h c19tdF9oZWlnaHQobWFzKSkpIHsNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgbWFzLT5ub2RlKTsN CisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY3BfdG9fbm9kZXMoKSAtIENvcHkgZGF0YSBvdXQg dG8gbm9kZXMuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQGxlZnQ6 IFRoZSBsZWZ0IGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAqIEBtaWRkbGU6IFRoZSBtaWRkbGUgZW5j b2RlZCBtYXBsZSBub2RlDQorICogQHJpZ2h0OiBUaGUgcmlnaHQgZW5jb2RlZCBtYXBsZSBub2Rl DQorICogQHNwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0d2VlbiBsZWZ0IGFuZCAobWlk ZGxlID8gbWlkZGxlIDogcmlnaHQpDQorICogQG1pZF9zcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNw bGl0IGJldHdlZW4gbWlkZGxlIGFuZCByaWdodC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg bWFzdF9jcF90b19ub2RlcyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpsZWZ0LCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1pZGRsZSwNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpyaWdodCwgdW5zaWduZWQgY2hhciBzcGxpdCwgdW5zaWduZWQgY2hh ciBtaWRfc3BsaXQpDQorew0KKwlib29sIG5ld19sbWF4ID0gdHJ1ZTsNCisNCisJbWFzdC0+bC0+ bm9kZSA9IG10ZV9ub2RlX29yX25vbmUobGVmdCk7DQorCW1hc3QtPm0tPm5vZGUgPSBtdGVfbm9k ZV9vcl9ub25lKG1pZGRsZSk7DQorCW1hc3QtPnItPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKHJp Z2h0KTsNCisNCisJbWFzdC0+bC0+bWluID0gbWFzdC0+b3JpZ19sLT5taW47DQorCWlmIChzcGxp dCA9PSBtYXN0LT5ibi0+Yl9lbmQpIHsNCisJCW1hc3QtPmwtPm1heCA9IG1hc3QtPm9yaWdfci0+ bWF4Ow0KKwkJbmV3X2xtYXggPSBmYWxzZTsNCisJfQ0KKw0KKwltYWJfbWFzX2NwKG1hc3QtPmJu LCAwLCBzcGxpdCwgbWFzdC0+bCwgbmV3X2xtYXgpOw0KKw0KKwlpZiAobWlkZGxlKSB7DQorCQlt YWJfbWFzX2NwKG1hc3QtPmJuLCAxICsgc3BsaXQsIG1pZF9zcGxpdCwgbWFzdC0+bSwgdHJ1ZSk7 DQorCQltYXN0LT5tLT5taW4gPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdICsgMTsNCisJCXNwbGl0 ID0gbWlkX3NwbGl0Ow0KKwl9DQorDQorCW1hc3QtPnItPm1heCA9IG1hc3QtPm9yaWdfci0+bWF4 Ow0KKwlpZiAocmlnaHQpIHsNCisJCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDEgKyBzcGxpdCwgbWFz dC0+Ym4tPmJfZW5kLCBtYXN0LT5yLCBmYWxzZSk7DQorCQltYXN0LT5yLT5taW4gPSBtYXN0LT5i bi0+cGl2b3Rbc3BsaXRdICsgMTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY29tYmluZV9j cF9sZWZ0IC0gQ29weSBpbiB0aGUgb3JpZ2luYWwgbGVmdCBzaWRlIG9mIHRoZSB0cmVlIGludG8g dGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmln IG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9sZWZ0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0 YXRlICptYXN0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBsX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9m ZnNldDsNCisNCisJaWYgKCFsX3Nsb3QpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFz dC0+b3JpZ19sLCAwLCBsX3Nsb3QgLSAxLCBtYXN0LT5ibiwgMCk7DQorfQ0KKw0KKy8qDQorICog bWFzdF9jb21iaW5lX2NwX3JpZ2h0OiBDb3B5IGluIHRoZSBvcmlnaW5hbCByaWdodCBzaWRlIG9m IHRoZSB0cmVlIGludG8gdGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1 YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRl DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9yaWdodChzdHJ1Y3Qg bWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5ibi0+cGl2b3RbbWFz dC0+Ym4tPmJfZW5kIC0gMV0gPj0gbWFzdC0+b3JpZ19yLT5tYXgpDQorCQlyZXR1cm47DQorDQor CW1hc19tYWJfY3AobWFzdC0+b3JpZ19yLCBtYXN0LT5vcmlnX3ItPm9mZnNldCArIDEsDQorCQkg ICBtdF9zbG90X2NvdW50KG1hc3QtPm9yaWdfci0+bm9kZSksIG1hc3QtPmJuLA0KKwkJICAgbWFz dC0+Ym4tPmJfZW5kKTsNCisJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5tYXg7 DQorfQ0KKw0KKy8qDQorICogbWFzdF9zdWZmaWNpZW50OiBDaGVjayBpZiB0aGUgbWFwbGUgc3Vi dHJlZSBzdGF0ZSBoYXMgZW5vdWdoIGRhdGEgaW4gdGhlIGJpZw0KKyAqIG5vZGUgdG8gY3JlYXRl IGF0IGxlYXN0IG9uZSBzdWZmaWNpZW50IG5vZGUNCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRy ZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9zdWZmaWNpZW50KHN0cnVj dCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5iX2VuZCA+ IG10X21pbl9zbG90X2NvdW50KG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQlyZXR1cm4gdHJ1ZTsN CisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0KKyAqIG1hc3Rfb3ZlcmZsb3c6IENoZWNr IGlmIHRoZXJlIGlzIHRvbyBtdWNoIGRhdGEgaW4gdGhlIHN1YnRyZWUgc3RhdGUgZm9yIGENCisg KiBzaW5nbGUgbm9kZS4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8N CitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9vdmVyZmxvdyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5ibi0+Yl9lbmQgPj0gbXRfc2xvdF9jb3VudCht YXN0LT5vcmlnX2wtPm5vZGUpKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCXJldHVybiBmYWxzZTsN Cit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdHJlZV9yYW5nZV93YWxrKHN0cnVjdCBtYV9z dGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFy IG9mZnNldDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqbmV4dCwgKmxhc3Q7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwl2b2lkIF9fcmN1ICoq c2xvdHM7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nIG1heCwgbWluOw0K Kwl1bnNpZ25lZCBsb25nIHByZXZfbWF4LCBwcmV2X21pbjsNCisNCisJbGFzdCA9IG5leHQgPSBt YXMtPm5vZGU7DQorCXByZXZfbWluID0gbWluID0gbWFzLT5taW47DQorCW1heCA9IG1hcy0+bWF4 Ow0KKwlkbyB7DQorCQlvZmZzZXQgPSAwOw0KKwkJbGFzdCA9IG5leHQ7DQorCQlub2RlID0gbXRl X3RvX25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90 cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5 cGUsIHBpdm90cywgbWF4KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0K KwkJCWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYgKHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5k ZXgpIHsNCisJCQlwcmV2X21heCA9IG1heDsNCisJCQlwcmV2X21pbiA9IG1pbjsNCisJCQltYXgg PSBwaXZvdHNbb2Zmc2V0XTsNCisJCQlnb3RvIG5leHQ7DQorCQl9DQorDQorCQlkbyB7DQorCQkJ b2Zmc2V0Kys7DQorCQl9IHdoaWxlKChvZmZzZXQgPCBlbmQpICYmIChwaXZvdHNbb2Zmc2V0XSA8 IG1hcy0+aW5kZXgpKTsNCisNCisJCXByZXZfbWluID0gbWluOw0KKwkJbWluID0gcGl2b3RzW29m ZnNldCAtIDFdICsgMTsNCisJCXByZXZfbWF4ID0gbWF4Ow0KKwkJaWYgKGxpa2VseShvZmZzZXQg PCBlbmQgJiYgcGl2b3RzW29mZnNldF0pKQ0KKwkJCW1heCA9IHBpdm90c1tvZmZzZXRdOw0KKw0K K25leHQ6DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwkJbmV4dCA9IG10X3Ns b3QobWFzLT50cmVlLCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25v ZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKwl9IHdoaWxlICghbWFfaXNfbGVhZih0 eXBlKSk7DQorDQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwltYXMtPmluZGV4ID0gbWluOw0K KwltYXMtPmxhc3QgPSBtYXg7DQorCW1hcy0+bWluID0gcHJldl9taW47DQorCW1hcy0+bWF4ID0g cHJldl9tYXg7DQorCW1hcy0+bm9kZSA9IGxhc3Q7DQorCXJldHVybiAodm9pZCAqKSBuZXh0Ow0K Kw0KK2RlYWRfbm9kZToNCisJbWFzX3Jlc2V0KG1hcyk7DQorCXJldHVybiBOVUxMOw0KK30NCisN CisvKg0KKyAqIG1hc19zcGFubmluZ19yZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSBhY3Jvc3MgdHdv IG5vZGVzIHdoaWNoIG1heSBub3QgYmUgcGVlcnMuDQorICogQG1hczogVGhlIHN0YXJ0aW5nIG1h cGxlIHN0YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVlX3N0YXRlLCBrZWVwcyB0cmFj ayBvZiA0IG1hcGxlIHN0YXRlcy4NCisgKiBAY291bnQ6IFRoZSBlc3RpbWF0ZWQgY291bnQgb2Yg aXRlcmF0aW9ucyBuZWVkZWQuDQorICoNCisgKiBGb2xsb3cgdGhlIHRyZWUgdXB3YXJkcyBmcm9t IEBsX21hcyBhbmQgQHJfbWFzIGZvciBAY291bnQsIG9yIHVudGlsIHRoZSByb290DQorICogaXMg aGl0LiAgRmlyc3QgQGJfbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBlbnRyaWVzIHdoaWNoIGFyZSBp bnNlcnRlZCBpbnRvIHRoZQ0KKyAqIG5leHQgaXRlcmF0aW9uIG9mIHRoZSBsb29wLiAgQGJfbm9k ZSBpcyByZXR1cm5lZCBwb3B1bGF0ZWQgd2l0aCB0aGUgZmluYWwNCisgKiBpdGVyYXRpb24uIEBt YXMgaXMgdXNlZCB0byBvYnRhaW4gYWxsb2NhdGlvbnMuICBvcmlnX2xfbWFzIGtlZXBzIHRyYWNr IG9mIHRoZQ0KKyAqIG5vZGVzIHRoYXQgd2lsbCByZW1haW4gYWN0aXZlIGJ5IHVzaW5nIG9yaWdf bF9tYXMtPmluZGV4IGFuZCBvcmlnX2xfbWFzLT5sYXN0DQorICogdG8gYWNjb3VudCBvZiB3aGF0 IGhhcyBiZWVuIGNvcGllZCBpbnRvIHRoZSBuZXcgc3ViLXRyZWUuICBUaGUgdXBkYXRlIG9mDQor ICogb3JpZ19sX21hcy0+bGFzdCBpcyB1c2VkIGluIG1hc19jb25zdW1lIHRvIGZpbmQgdGhlIHNs b3RzIHRoYXQgd2lsbCBuZWVkIHRvDQorICogYmUgZWl0aGVyIGZyZWVkIG9yIGRlc3Ryb3llZC4g IG9yaWdfbF9tYXMtPmRlcHRoIGtlZXBzIHRyYWNrIG9mIHRoZSBoZWlnaHQgb2YNCisgKiB0aGUg bmV3IHN1Yi10cmVlIGluIGNhc2UgdGhlIHN1Yi10cmVlIGJlY29tZXMgdGhlIGZ1bGwgdHJlZS4N CisgKg0KKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBiX25vZGUgZHVyaW5n IHRoZSBsYXN0IGxvb3AuDQorICovDQorc3RhdGljIGludCBtYXNfc3Bhbm5pbmdfcmViYWxhbmNl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1h c3QsIHVuc2lnbmVkIGNoYXIgY291bnQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNwbGl0LCBtaWRf c3BsaXQ7DQorCXVuc2lnbmVkIGNoYXIgc2xvdCA9IDA7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq bGVmdCA9IE5VTEwsICptaWRkbGUgPSBOVUxMLCAqcmlnaHQgPSBOVUxMOw0KKw0KKwlNQV9TVEFU RShsX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmluZGV4KTsNCisJTUFfU1RBVEUo cl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5pbmRleCk7DQorCU1BX1NUQVRFKG1f bWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+aW5kZXgpOw0KKwlNQV9UT1BJQVJZKGZy ZWUsIG1hcy0+dHJlZSk7DQorCU1BX1RPUElBUlkoZGVzdHJveSwgbWFzLT50cmVlKTsNCisNCisJ LyoNCisJICogVGhlIHRyZWUgbmVlZHMgdG8gYmUgcmViYWxhbmNlZCBhbmQgbGVhdmVzIG5lZWQg dG8gYmUga2VwdCBhdCB0aGUgc2FtZSBsZXZlbC4NCisJICogUmViYWxhbmNpbmcgaXMgZG9uZSBi eSB1c2Ugb2YgdGhlIGBgc3RydWN0IG1hcGxlX3RvcGlhcnlgYC4NCisJICovDQorCW1hc3QtPmwg PSAmbF9tYXM7DQorCW1hc3QtPm0gPSAmbV9tYXM7DQorCW1hc3QtPnIgPSAmcl9tYXM7DQorCW1h c3QtPmZyZWUgPSAmZnJlZTsNCisJbWFzdC0+ZGVzdHJveSA9ICZkZXN0cm95Ow0KKwlsX21hcy5u b2RlID0gcl9tYXMubm9kZSA9IG1fbWFzLm5vZGUgPSBNQVNfTk9ORTsNCisJaWYgKCFtYXNfaXNf cm9vdF9saW1pdHMobWFzKSAmJg0KKwkgICAgdW5saWtlbHkobWFzdC0+Ym4tPmJfZW5kIDw9IG10 X21pbl9zbG90c1ttYXN0LT5ibi0+dHlwZV0pKSB7DQorCQkvKg0KKwkJICogRG8gbm90IGZyZWUg dGhlIGN1cnJlbnQgbm9kZSBhcyBpdCBtYXkgYmUgZnJlZWQgaW4gYSBidWxrDQorCQkgKiBmcmVl Lg0KKwkJICovDQorCQlpZiAoIW1hc3Rfc2libGluZ19yZWJhbGFuY2VfcmlnaHQobWFzdCwgZmFs c2UpKQ0KKwkJCW1hc3RfY291c2luX3JlYmFsYW5jZV9yaWdodChtYXN0LCBmYWxzZSk7DQorCX0N CisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9IDA7DQorDQorCS8qDQorCSAqIEVhY2ggbGV2ZWwgb2Yg dGhlIHRyZWUgaXMgZXhhbWluZWQgYW5kIGJhbGFuY2VkLCBwdXNoaW5nIGRhdGEgdG8gdGhlIGxl ZnQgb3INCisJICogcmlnaHQsIG9yIHJlYmFsYW5jaW5nIGFnYWluc3QgbGVmdCBvciByaWdodCBu b2RlcyBpcyBlbXBsb3llZCB0byBhdm9pZA0KKwkgKiByaXBwbGluZyB1cCB0aGUgdHJlZSB0byBs aW1pdCB0aGUgYW1vdW50IG9mIGNodXJuLiAgT25jZSBhIG5ldyBzdWItc2VjdGlvbiBvZg0KKwkg KiB0aGUgdHJlZSBpcyBjcmVhdGVkLCB0aGVyZSBtYXkgYmUgYSBtaXggb2YgbmV3IGFuZCBvbGQg bm9kZXMuICBUaGUgb2xkIG5vZGVzDQorCSAqIHdpbGwgaGF2ZSB0aGUgaW5jb3JyZWN0IHBhcmVu dCBwb2ludGVycyBhbmQgY3VycmVudGx5IGJlIGluIHR3byB0cmVlczogdGhlDQorCSAqIG9yaWdp bmFsIHRyZWUgYW5kIHRoZSBwYXJ0aWFsbHkgbmV3IHRyZWUuICBUbyByZW1lZHkgdGhlIHBhcmVu dCBwb2ludGVycyBpbg0KKwkgKiB0aGUgb2xkIHRyZWUsIHRoZSBuZXcgZGF0YSBpcyBzd2FwcGVk IGludG8gdGhlIGFjdGl2ZSB0cmVlIGFuZCBhIHdhbGsgZG93bg0KKwkgKiB0aGUgdHJlZSBpcyBw ZXJmb3JtZWQgYW5kIHRoZSBwYXJlbnQgcG9pbnRlcnMgYXJlIHVwZGF0ZWQuDQorCSAqIFNlZSBt YXNfZGVzY2VuZF9hZG9wdCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLi4NCisJICovDQorCXdoaWxl IChjb3VudC0tKSB7DQorCQltYXN0LT5ibi0+Yl9lbmQtLTsNCisJCW1hc3QtPmJuLT50eXBlID0g bXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwkJc3BsaXQgPSBtYXNfbWFiX3Rv X25vZGUobWFzLCBtYXN0LT5ibiwgJmxlZnQsICZyaWdodCwgJm1pZGRsZSwNCisJCQkJCSZtaWRf c3BsaXQsIG1hc3QtPm9yaWdfbC0+bWluKTsNCisJCW1hc3Rfc2V0X3NwbGl0X3BhcmVudHMobWFz dCwgbGVmdCwgbWlkZGxlLCByaWdodCwgc3BsaXQsDQorCQkJCSAgICAgICBtaWRfc3BsaXQpOw0K KwkJbWFzdF9jcF90b19ub2RlcyhtYXN0LCBsZWZ0LCBtaWRkbGUsIHJpZ2h0LCBzcGxpdCwgbWlk X3NwbGl0KTsNCisNCisJCS8qDQorCQkgKiBDb3B5IGRhdGEgZnJvbSBuZXh0IGxldmVsIGluIHRo ZSB0cmVlIHRvIG1hc3QtPmJuIGZyb20gbmV4dA0KKwkJICogaXRlcmF0aW9uDQorCQkgKi8NCisJ CW1lbXNldChtYXN0LT5ibiwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSkpOw0KKwkJ bWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9kZV90eXBlKGxlZnQpOw0KKwkJbWFzdC0+b3JpZ19sLT5k ZXB0aCsrOw0KKw0KKwkJLyogUm9vdCBhbHJlYWR5IHN0b3JlZCBpbiBsLT5ub2RlLiAqLw0KKwkJ aWYgKG1hc19pc19yb290X2xpbWl0cyhtYXN0LT5sKSkNCisJCQlnb3RvIG5ld19yb290Ow0KKw0K KwkJbWFzdF9hc2NlbmRfZnJlZShtYXN0KTsNCisJCW1hc3RfY29tYmluZV9jcF9sZWZ0KG1hc3Qp Ow0KKwkJbF9tYXMub2Zmc2V0ID0gbWFzdC0+Ym4tPmJfZW5kOw0KKwkJbWFiX3NldF9iX2VuZCht YXN0LT5ibiwgJmxfbWFzLCBsZWZ0KTsNCisJCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sICZtX21h cywgbWlkZGxlKTsNCisJCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sICZyX21hcywgcmlnaHQpOw0K Kw0KKwkJLyogQ29weSBhbnl0aGluZyBuZWNlc3Nhcnkgb3V0IG9mIHRoZSByaWdodCBub2RlLiAq Lw0KKwkJbWFzdF9jb21iaW5lX2NwX3JpZ2h0KG1hc3QpOw0KKwkJbWFzdF90b3BpYXJ5KG1hc3Qp Ow0KKwkJbWFzdC0+b3JpZ19sLT5sYXN0ID0gbWFzdC0+b3JpZ19sLT5tYXg7DQorDQorCQlpZiAo bWFzdF9zdWZmaWNpZW50KG1hc3QpKQ0KKwkJCWNvbnRpbnVlOw0KKw0KKwkJaWYgKG1hc3Rfb3Zl cmZsb3cobWFzdCkpDQorCQkJY29udGludWU7DQorDQorCQkvKiBNYXkgYmUgYSBuZXcgcm9vdCBz dG9yZWQgaW4gbWFzdC0+Ym4gKi8NCisJCWlmIChtYXNfaXNfcm9vdF9saW1pdHMobWFzdC0+b3Jp Z19sKSkNCisJCQlicmVhazsNCisNCisJCS8qIFRyeSB0byBnZXQgZW5vdWdoIGRhdGEgZm9yIHRo ZSBuZXh0IGl0ZXJhdGlvbi4gKi8NCisJCWlmICghbWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdo dChtYXN0LCB0cnVlKSkNCisJCQlpZiAoIW1hc3RfY291c2luX3JlYmFsYW5jZV9yaWdodChtYXN0 LCB0cnVlKSkNCisJCQkJYnJlYWs7DQorDQorCQkvKiByZWJhbGFuY2luZyBmcm9tIG90aGVyIG5v ZGVzIG1heSByZXF1aXJlIGFub3RoZXIgbG9vcC4gKi8NCisJCWlmICghY291bnQpDQorCQkJY291 bnQrKzsNCisJfQ0KKwlsX21hcy5ub2RlID0gbXRfbWtfbm9kZShtYV9tbm9kZV9wdHIobWFzX3Bv cF9ub2RlKG1hcykpLA0KKwkJCQltdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfbC0+bm9kZSkpOw0K KwltYXN0LT5vcmlnX2wtPmRlcHRoKys7DQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10X3Ns b3RzW21hc3QtPmJuLT50eXBlXSAtIDEsICZsX21hcywgdHJ1ZSk7DQorCW10ZV9zZXRfcGFyZW50 KGxlZnQsIGxfbWFzLm5vZGUsIHNsb3QpOw0KKwlpZiAobWlkZGxlKQ0KKwkJbXRlX3NldF9wYXJl bnQobWlkZGxlLCBsX21hcy5ub2RlLCArK3Nsb3QpOw0KKw0KKwlpZiAocmlnaHQpDQorCQltdGVf c2V0X3BhcmVudChyaWdodCwgbF9tYXMubm9kZSwgKytzbG90KTsNCisNCisJaWYgKG1hc19pc19y b290X2xpbWl0cyhtYXN0LT5sKSkgew0KK25ld19yb290Og0KKwkJbWFzdF9uZXdfcm9vdChtYXN0 LCBtYXMpOw0KKwl9IGVsc2Ugew0KKwkJbWFzX21uKCZsX21hcyktPnBhcmVudCA9IG1hc19tbiht YXN0LT5vcmlnX2wpLT5wYXJlbnQ7DQorCX0NCisNCisJaWYgKCFtdGVfZGVhZF9ub2RlKG1hc3Qt Pm9yaWdfbC0+bm9kZSkpDQorCQltYXRfYWRkKCZmcmVlLCBtYXN0LT5vcmlnX2wtPm5vZGUpOw0K Kw0KKwltYXMtPmRlcHRoID0gbWFzdC0+b3JpZ19sLT5kZXB0aDsNCisJKm1hc3QtPm9yaWdfbCA9 IGxfbWFzOw0KKwltdGVfc2V0X25vZGVfZGVhZChtYXMtPm5vZGUpOw0KKw0KKwkvKiBTZXQgdXAg bWFzIGZvciBpbnNlcnRpb24uICovDQorCW1hc3QtPm9yaWdfbC0+ZGVwdGggPSBtYXMtPmRlcHRo Ow0KKwltYXN0LT5vcmlnX2wtPmFsbG9jID0gbWFzLT5hbGxvYzsNCisJKm1hcyA9ICptYXN0LT5v cmlnX2w7DQorCW1hc193bWJfcmVwbGFjZShtYXMsICZmcmVlLCAmZGVzdHJveSk7DQorCW10cmVl X3JhbmdlX3dhbGsobWFzKTsNCisJcmV0dXJuIG1hc3QtPmJuLT5iX2VuZDsNCit9DQorDQorLyoN CisgKiBtYXNfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2UgYSBnaXZlbiBub2RlLg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBiX25vZGU6IFRoZSBiaWcgbWFwbGUgbm9kZS4NCisgKg0K KyAqIFJlYmFsYW5jZSB0d28gbm9kZXMgaW50byBhIHNpbmdsZSBub2RlIG9yIHR3byBuZXcgbm9k ZXMgdGhhdCBhcmUgc3VmZmljaWVudC4NCisgKiBDb250aW51ZSB1cHdhcmRzIHVudGlsIHRyZWUg aXMgc3VmZmljaWVudC4NCisgKg0KKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBlbGVtZW50cyBp biBiX25vZGUgZHVyaW5nIHRoZSBsYXN0IGxvb3AuDQorICovDQorc3RhdGljIGlubGluZSBpbnQg bWFzX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJc3RydWN0IG1hcGxlX2Jp Z19ub2RlICpiX25vZGUpDQorew0KKwljaGFyIGVtcHR5X2NvdW50ID0gbWFzX210X2hlaWdodCht YXMpOw0KKwlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSBtYXN0Ow0KKwl1bnNpZ25lZCBjaGFy IHNoaWZ0LCBiX2VuZCA9ICsrYl9ub2RlLT5iX2VuZDsNCisNCisJTUFfU1RBVEUobF9tYXMsIG1h cy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJTUFfU1RBVEUocl9tYXMsIG1hcy0+ dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisNCisJdHJhY2VfbWFfb3AoX19mdW5jX18s IG1hcyk7DQorDQorCS8qDQorCSAqIFJlYmFsYW5jaW5nIG9jY3VycyBpZiBhIG5vZGUgaXMgaW5z dWZmaWNpZW50LiAgRGF0YSBpcyByZWJhbGFuY2VkDQorCSAqIGFnYWluc3QgdGhlIG5vZGUgdG8g dGhlIHJpZ2h0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIHRoZSBub2RlIHRvIHRoZQ0KKwkgKiBs ZWZ0IG9mIHRoaXMgbm9kZSBpcyByZWJhbGFuY2VkIGFnYWluc3QgdGhpcyBub2RlLiAgSWYgcmVi YWxhbmNpbmcNCisJICogY2F1c2VzIGp1c3Qgb25lIG5vZGUgdG8gYmUgcHJvZHVjZWQgaW5zdGVh ZCBvZiB0d28sIHRoZW4gdGhlIHBhcmVudA0KKwkgKiBpcyBhbHNvIGV4YW1pbmVkIGFuZCByZWJh bGFuY2VkIGlmIGl0IGlzIGluc3VmZmljaWVudC4gIEV2ZXJ5IGxldmVsDQorCSAqIHRyaWVzIHRv IGNvbWJpbmUgdGhlIGRhdGEgaW4gdGhlIHNhbWUgd2F5LiAgSWYgb25lIG5vZGUgY29udGFpbnMg dGhlDQorCSAqIGVudGlyZSByYW5nZSBvZiB0aGUgdHJlZSwgdGhlbiB0aGF0IG5vZGUgaXMgdXNl ZCBhcyBhIG5ldyByb290IG5vZGUuDQorCSAqLw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBl bXB0eV9jb3VudCAqIDMpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQor DQorCW1hc3Qub3JpZ19sID0gJmxfbWFzOw0KKwltYXN0Lm9yaWdfciA9ICZyX21hczsNCisJbWFz dC5ibiA9IGJfbm9kZTsNCisNCisJbF9tYXMgPSByX21hcyA9ICptYXM7DQorDQorCWlmIChtYXNf bmV4dF9zaWJsaW5nKCZyX21hcykpIHsNCisJCW1hc19tYWJfY3AoJnJfbWFzLCAwLCBtdF9zbG90 X2NvdW50KHJfbWFzLm5vZGUpLCBiX25vZGUsIGJfZW5kKTsNCisJCXJfbWFzLmxhc3QgPSByX21h cy5pbmRleCA9IHJfbWFzLm1heDsNCisJfSBlbHNlIHsNCisJCW1hc19wcmV2X3NpYmxpbmcoJmxf bWFzKTsNCisJCXNoaWZ0ID0gbWFzX2RhdGFfZW5kKCZsX21hcykgKyAxOw0KKwkJbWFiX3NoaWZ0 X3JpZ2h0KGJfbm9kZSwgc2hpZnQpOw0KKwkJbWFzLT5vZmZzZXQgKz0gc2hpZnQ7DQorCQltYXNf bWFiX2NwKCZsX21hcywgMCwgc2hpZnQgLSAxLCBiX25vZGUsIDApOw0KKwkJYl9ub2RlLT5iX2Vu ZCA9IHNoaWZ0ICsgYl9lbmQ7DQorCQlsX21hcy5pbmRleCA9IGxfbWFzLmxhc3QgPSBsX21hcy5t aW47DQorCX0NCisNCisJcmV0dXJuIG1hc19zcGFubmluZ19yZWJhbGFuY2UobWFzLCAmbWFzdCwg ZW1wdHlfY291bnQpOw0KK30NCisNCisvKg0KKyAqIG1hc19kZXN0cm95X3JlYmFsYW5jZSgpIC0g UmViYWxhbmNlIGxlZnQtbW9zdCBub2RlIHdoaWxlIGRlc3Ryb3lpbmcgdGhlIG1hcGxlDQorICog c3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVuZDogVGhlIGVuZCBvZiB0 aGUgbGVmdC1tb3N0IG5vZGUuDQorICoNCisgKiBEdXJpbmcgYSBtYXNzLWluc2VydCBldmVudCAo c3VjaCBhcyBmb3JraW5nKSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0bw0KKyAqIHJlYmFsYW5jZSB0 aGUgbGVmdC1tb3N0IG5vZGUgd2hlbiBpdCBpcyBub3Qgc3VmZmljaWVudC4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX2Rlc3Ryb3lfcmViYWxhbmNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdCA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJc3RydWN0IG1hcGxlX25vZGUgcmV1c2UsICpuZXdub2RlLCAq cGFyZW50LCAqbmV3X2xlZnQsICpsZWZ0LCAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpl cGFyZW50Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCwgdG1wLCBzcGxpdCA9IG10X3Nsb3RzW210 XSAvIDI7DQorCXZvaWQgX19yY3UgKipsX3Nsb3RzLCAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25n ICpsX3BpdnMsICpwaXZzLCBnYXA7DQorCWJvb2wgaW5fcmN1ID0gbXRfaW5fcmN1KG1hcy0+dHJl ZSk7DQorDQorCU1BX1NUQVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFz dCk7DQorDQorCWxfbWFzID0gKm1hczsNCisJbWFzX3ByZXZfc2libGluZygmbF9tYXMpOw0KKw0K KwkvKiBzZXQgdXAgbm9kZS4gKi8NCisJaWYgKGluX3JjdSkgew0KKwkJLyogQWxsb2NhdGUgZm9y IGJvdGggbGVmdCBhbmQgcmlnaHQgYXMgd2VsbCBhcyBwYXJlbnQuICovDQorCQltYXNfbm9kZV9j b3VudChtYXMsIDMpOw0KKwkJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1cm47DQorDQor CQluZXdub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCX0gZWxzZSB7DQorCQluZXdub2RlID0g JnJldXNlOw0KKwl9DQorDQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJbmV3bm9kZS0+cGFyZW50 ID0gbm9kZS0+cGFyZW50Ow0KKwlzbG90cyA9IG1hX3Nsb3RzKG5ld25vZGUsIG10KTsNCisJcGl2 cyA9IG1hX3Bpdm90cyhuZXdub2RlLCBtdCk7DQorCWxlZnQgPSBtYXNfbW4oJmxfbWFzKTsNCisJ bF9zbG90cyA9IG1hX3Nsb3RzKGxlZnQsIG10KTsNCisJbF9waXZzID0gbWFfcGl2b3RzKGxlZnQs IG10KTsNCisJaWYgKCFsX3Nsb3RzW3NwbGl0XSkNCisJCXNwbGl0Kys7DQorCXRtcCA9IG1hc19k YXRhX2VuZCgmbF9tYXMpIC0gc3BsaXQ7DQorDQorCW1lbWNweShzbG90cywgbF9zbG90cyArIHNw bGl0ICsgMSwgc2l6ZW9mKHZvaWQgKikgKiB0bXApOw0KKwltZW1jcHkocGl2cywgbF9waXZzICsg c3BsaXQgKyAxLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiB0bXApOw0KKwlwaXZzW3RtcF0gPSBs X21hcy5tYXg7DQorCW1lbWNweShzbG90cyArIHRtcCwgbWFfc2xvdHMobm9kZSwgbXQpLCBzaXpl b2Yodm9pZCAqKSAqIGVuZCk7DQorCW1lbWNweShwaXZzICsgdG1wLCBtYV9waXZvdHMobm9kZSwg bXQpLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBlbmQpOw0KKw0KKwlsX21hcy5tYXggPSBsX3Bp dnNbc3BsaXRdOw0KKwltYXMtPm1pbiA9IGxfbWFzLm1heCArIDE7DQorCWVwYXJlbnQgPSBtdF9t a19ub2RlKG10ZV9wYXJlbnQobF9tYXMubm9kZSksDQorCQkJICAgICBtYXNfcGFyZW50X2VudW0o JmxfbWFzLCBsX21hcy5ub2RlKSk7DQorCXRtcCArPSBlbmQ7DQorCWlmICghaW5fcmN1KSB7DQor CQl1bnNpZ25lZCBjaGFyIG1heF9wID0gbXRfcGl2b3RzW210XTsNCisJCXVuc2lnbmVkIGNoYXIg bWF4X3MgPSBtdF9zbG90c1ttdF07DQorDQorCQlpZiAodG1wIDwgbWF4X3ApDQorCQkJbWVtc2V0 KHBpdnMgKyB0bXAsIDAsDQorCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nICopICogKG1h eF9wIC0gdG1wKSk7DQorDQorCQlpZiAodG1wIDwgbXRfc2xvdHNbbXRdKQ0KKwkJCW1lbXNldChz bG90cyArIHRtcCwgMCwgc2l6ZW9mKHZvaWQgKikgKiAobWF4X3MgLSB0bXApKTsNCisNCisJCW1l bWNweShub2RlLCBuZXdub2RlLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJCW1hX3Nl dF9tZXRhKG5vZGUsIG10LCAwLCB0bXAgLSAxKTsNCisJCW10ZV9zZXRfcGl2b3QoZXBhcmVudCwg bXRlX3BhcmVudF9zbG90KGxfbWFzLm5vZGUpLA0KKwkJCSAgICAgIGxfcGl2c1tzcGxpdF0pOw0K Kw0KKwkJLyogUmVtb3ZlIGRhdGEgZnJvbSBsX3BpdnMuICovDQorCQl0bXAgPSBzcGxpdCArIDE7 DQorCQltZW1zZXQobF9waXZzICsgdG1wLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiAobWF4 X3AgLSB0bXApKTsNCisJCW1lbXNldChsX3Nsb3RzICsgdG1wLCAwLCBzaXplb2Yodm9pZCAqKSAq IChtYXhfcyAtIHRtcCkpOw0KKwkJbWFfc2V0X21ldGEobGVmdCwgbXQsIDAsIHNwbGl0KTsNCisN CisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBSQ1UgcmVxdWlyZXMgcmVwbGFjaW5nIGJvdGgg bF9tYXMsIG1hcywgYW5kIHBhcmVudC4gKi8NCisJbWFzLT5ub2RlID0gbXRfbWtfbm9kZShuZXdu b2RlLCBtdCk7DQorCW1hX3NldF9tZXRhKG5ld25vZGUsIG10LCAwLCB0bXApOw0KKw0KKwluZXdf bGVmdCA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwluZXdfbGVmdC0+cGFyZW50ID0gbGVmdC0+cGFy ZW50Ow0KKwltdCA9IG10ZV9ub2RlX3R5cGUobF9tYXMubm9kZSk7DQorCXNsb3RzID0gbWFfc2xv dHMobmV3X2xlZnQsIG10KTsNCisJcGl2cyA9IG1hX3Bpdm90cyhuZXdfbGVmdCwgbXQpOw0KKwlt ZW1jcHkoc2xvdHMsIGxfc2xvdHMsIHNpemVvZih2b2lkICopICogc3BsaXQpOw0KKwltZW1jcHko cGl2cywgbF9waXZzLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBzcGxpdCk7DQorCW1hX3NldF9t ZXRhKG5ld19sZWZ0LCBtdCwgMCwgc3BsaXQpOw0KKwlsX21hcy5ub2RlID0gbXRfbWtfbm9kZShu ZXdfbGVmdCwgbXQpOw0KKw0KKwkvKiByZXBsYWNlIHBhcmVudC4gKi8NCisJb2Zmc2V0ID0gbXRl X3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCW10ID0gbWFzX3BhcmVudF9lbnVtKCZsX21hcywg bF9tYXMubm9kZSk7DQorCXBhcmVudCA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwlzbG90cyA9IG1h X3Nsb3RzKHBhcmVudCwgbXQpOw0KKwlwaXZzID0gbWFfcGl2b3RzKHBhcmVudCwgbXQpOw0KKwlt ZW1jcHkocGFyZW50LCBtdGVfdG9fbm9kZShlcGFyZW50KSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9u b2RlKSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBtYXMtPm5vZGUpOw0K KwlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbb2Zmc2V0IC0gMV0sIGxfbWFzLm5vZGUpOw0KKwlw aXZzW29mZnNldCAtIDFdID0gbF9tYXMubWF4Ow0KKwllcGFyZW50ID0gbXRfbWtfbm9kZShwYXJl bnQsIG10KTsNCitkb25lOg0KKwlnYXAgPSBtYXNfbGVhZl9tYXhfZ2FwKG1hcyk7DQorCW10ZV9z ZXRfZ2FwKGVwYXJlbnQsIG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpLCBnYXApOw0KKwlnYXAg PSBtYXNfbGVhZl9tYXhfZ2FwKCZsX21hcyk7DQorCW10ZV9zZXRfZ2FwKGVwYXJlbnQsIG10ZV9w YXJlbnRfc2xvdChsX21hcy5ub2RlKSwgZ2FwKTsNCisJbWFzX2FzY2VuZChtYXMpOw0KKw0KKwlp ZiAoaW5fcmN1KQ0KKwkJbWFzX3JlcGxhY2UobWFzLCBmYWxzZSk7DQorDQorCW1hc191cGRhdGVf Z2FwKG1hcyk7DQorfQ0KKw0KKy8qDQorICogbWFzX3NwbGl0X2ZpbmFsX25vZGUoKSAtIFNwbGl0 IHRoZSBmaW5hbCBub2RlIGluIGEgc3VidHJlZSBvcGVyYXRpb24uDQorICogQG1hc3Q6IHRoZSBt YXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGhlaWdo dDogVGhlIGhlaWdodCBvZiB0aGUgdHJlZSBpbiBjYXNlIGl0J3MgYSBuZXcgcm9vdC4NCisgKi8N CitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3NwbGl0X2ZpbmFsX25vZGUoc3RydWN0IG1hcGxlX3N1 YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQlzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGhlaWdo dCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqYW5jZXN0b3I7DQorDQorCWlmIChtdGVfaXNf cm9vdChtYXMtPm5vZGUpKSB7DQorCQlpZiAobXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCQlt YXN0LT5ibi0+dHlwZSA9IG1hcGxlX2FyYW5nZV82NDsNCisJCWVsc2UNCisJCQltYXN0LT5ibi0+ dHlwZSA9IG1hcGxlX3JhbmdlXzY0Ow0KKwkJbWFzLT5kZXB0aCA9IGhlaWdodDsNCisJfQ0KKwkv Kg0KKwkgKiBPbmx5IGEgc2luZ2xlIG5vZGUgaXMgdXNlZCBoZXJlLCBjb3VsZCBiZSByb290Lg0K KwkgKiBUaGUgQmlnX25vZGUgZGF0YSBzaG91bGQganVzdCBmaXQgaW4gYSBzaW5nbGUgbm9kZS4N CisJICovDQorCWFuY2VzdG9yID0gbWFzX25ld19tYV9ub2RlKG1hcywgbWFzdC0+Ym4pOw0KKwlt dGVfc2V0X3BhcmVudChtYXN0LT5sLT5ub2RlLCBhbmNlc3RvciwgbWFzdC0+bC0+b2Zmc2V0KTsN CisJbXRlX3NldF9wYXJlbnQobWFzdC0+ci0+bm9kZSwgYW5jZXN0b3IsIG1hc3QtPnItPm9mZnNl dCk7DQorCW10ZV90b19ub2RlKGFuY2VzdG9yKS0+cGFyZW50ID0gbWFzX21uKG1hcyktPnBhcmVu dDsNCisNCisJbWFzdC0+bC0+bm9kZSA9IGFuY2VzdG9yOw0KKwltYWJfbWFzX2NwKG1hc3QtPmJu LCAwLCBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0gLSAxLCBtYXN0LT5sLCB0cnVlKTsNCisJbWFz LT5vZmZzZXQgPSBtYXN0LT5ibi0+Yl9lbmQgLSAxOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQor LyoNCisgKiBtYXN0X2ZpbGxfYm5vZGUoKSAtIENvcHkgZGF0YSBpbnRvIHRoZSBiaWcgbm9kZSBp biB0aGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0K KyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBza2lwOiBUaGUgbnVtYmVyIG9mIGVudHJp ZXMgdG8gc2tpcCBmb3IgbmV3IG5vZGVzIGluc2VydGlvbi4NCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgbWFzdF9maWxsX2Jub2RlKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0K KwkJCQkJIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQkJIHVuc2lnbmVkIGNoYXIgc2tpcCkN Cit7DQorCWJvb2wgY3AgPSB0cnVlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZCA9IG1hcy0+ bm9kZTsNCisJdW5zaWduZWQgY2hhciBzcGxpdDsNCisNCisJbWVtc2V0KG1hc3QtPmJuLT5nYXAs IDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIEFSUkFZX1NJWkUobWFzdC0+Ym4tPmdhcCkpOw0K KwltZW1zZXQobWFzdC0+Ym4tPnNsb3QsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIEFSUkFZ X1NJWkUobWFzdC0+Ym4tPnNsb3QpKTsNCisJbWVtc2V0KG1hc3QtPmJuLT5waXZvdCwgMCwgc2l6 ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+cGl2b3QpKTsNCisJbWFz dC0+Ym4tPmJfZW5kID0gMDsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJ CWNwID0gZmFsc2U7DQorCX0gZWxzZSB7DQorCQltYXNfYXNjZW5kKG1hcyk7DQorCQltYXRfYWRk KG1hc3QtPmZyZWUsIG9sZCk7DQorCQltYXMtPm9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChtYXMt Pm5vZGUpOw0KKwl9DQorDQorCWlmIChjcCAmJiBtYXN0LT5sLT5vZmZzZXQpDQorCQltYXNfbWFi X2NwKG1hcywgMCwgbWFzdC0+bC0+b2Zmc2V0IC0gMSwgbWFzdC0+Ym4sIDApOw0KKw0KKwlzcGxp dCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJbWFiX3NldF9iX2VuZChtYXN0LT5ibiwgbWFzdC0+bCwg bWFzdC0+bC0+bm9kZSk7DQorCW1hc3QtPnItPm9mZnNldCA9IG1hc3QtPmJuLT5iX2VuZDsNCisJ bWFiX3NldF9iX2VuZChtYXN0LT5ibiwgbWFzdC0+ciwgbWFzdC0+ci0+bm9kZSk7DQorCWlmICht YXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5kIC0gMV0gPT0gbWFzLT5tYXgpDQorCQljcCA9 IGZhbHNlOw0KKw0KKwlpZiAoY3ApDQorCQltYXNfbWFiX2NwKG1hcywgc3BsaXQgKyBza2lwLCBt dF9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAxLA0KKwkJCSAgIG1hc3QtPmJuLCBtYXN0LT5ibi0+ Yl9lbmQpOw0KKw0KKwltYXN0LT5ibi0+Yl9lbmQtLTsNCisJbWFzdC0+Ym4tPnR5cGUgPSBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zcGxpdF9kYXRhKCkg LSBTcGxpdCB0aGUgZGF0YSBpbiB0aGUgc3VidHJlZSBzdGF0ZSBiaWcgbm9kZSBpbnRvIHJlZ3Vs YXINCisgKiBub2Rlcy4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc3BsaXQ6IFRoZSBsb2NhdGlvbiB0byBzcGxpdCB0 aGUgYmlnIG5vZGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9zcGxpdF9kYXRhKHN0 cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkgICBzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgY2hhciBzcGxpdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgcF9zbG90Ow0KKw0K KwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFzdC0+bCwgdHJ1ZSk7DQorCW10ZV9z ZXRfcGl2b3QobWFzdC0+ci0+bm9kZSwgMCwgbWFzdC0+ci0+bWF4KTsNCisJbWFiX21hc19jcCht YXN0LT5ibiwgc3BsaXQgKyAxLCBtYXN0LT5ibi0+Yl9lbmQsIG1hc3QtPnIsIGZhbHNlKTsNCisJ bWFzdC0+bC0+b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCW1hc3QtPmwt Pm1heCA9IG1hc3QtPmJuLT5waXZvdFtzcGxpdF07DQorCW1hc3QtPnItPm1pbiA9IG1hc3QtPmwt Pm1heCArIDE7DQorCWlmIChtdGVfaXNfbGVhZihtYXMtPm5vZGUpKQ0KKwkgICAgcmV0dXJuOw0K Kw0KKwlwX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisJbWFzX3NldF9zcGxpdF9wYXJl bnQobWFzdC0+b3JpZ19sLCBtYXN0LT5sLT5ub2RlLCBtYXN0LT5yLT5ub2RlLA0KKwkJCSAgICAg JnBfc2xvdCwgc3BsaXQpOw0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5vcmlnX3IsIG1h c3QtPmwtPm5vZGUsIG1hc3QtPnItPm5vZGUsDQorCQkJICAgICAmcF9zbG90LCBzcGxpdCk7DQor fQ0KKw0KKy8qDQorICogbWFzX3B1c2hfZGF0YSgpIC0gSW5zdGVhZCBvZiBzcGxpdHRpbmcgYSBu b2RlLCBpdCBpcyBiZW5lZmljaWFsIHRvIHB1c2ggdGhlDQorICogZGF0YSB0byB0aGUgcmlnaHQg b3IgbGVmdCBub2RlIGlmIHRoZXJlIGlzIHJvb20uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQGhlaWdodDogVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBsZWZ0OiBQdXNoIGxlZnQgb3Ig bm90Lg0KKyAqDQorICogS2VlcGluZyB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlIGxvdyBtZWFucyBm YXN0ZXIgbG9va3Vwcy4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBwdXNoZWQsIGZhbHNlIG90 aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3B1c2hfZGF0YShzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgaW50IGhlaWdodCwNCisJCQkJIHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0 YXRlICptYXN0LCBib29sIGxlZnQpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3RfdG90YWwgPSBt YXN0LT5ibi0+Yl9lbmQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kLCBzcGFjZSwgc3BsaXQ7DQorDQor CU1BX1NUQVRFKHRtcF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJ dG1wX21hcyA9ICptYXM7DQorCXRtcF9tYXMuZGVwdGggPSBtYXN0LT5sLT5kZXB0aDsNCisNCisJ aWYgKGxlZnQgJiYgIW1hc19wcmV2X3NpYmxpbmcoJnRtcF9tYXMpKQ0KKwkJcmV0dXJuIGZhbHNl Ow0KKwllbHNlIGlmICghbGVmdCAmJiAhbWFzX25leHRfc2libGluZygmdG1wX21hcykpDQorCQly ZXR1cm4gZmFsc2U7DQorDQorCWVuZCA9IG1hc19kYXRhX2VuZCgmdG1wX21hcyk7DQorCXNsb3Rf dG90YWwgKz0gZW5kOw0KKwlzcGFjZSA9IDIgKiBtdF9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAy Ow0KKwkvKiAtMiBpbnN0ZWFkIG9mIC0xIHRvIGVuc3VyZSB0aGVyZSBpc24ndCBhIHRyaXBsZSBz cGxpdCAqLw0KKwlpZiAobWFfaXNfbGVhZihtYXN0LT5ibi0+dHlwZSkpDQorCQlzcGFjZS0tOw0K Kw0KKwlpZiAobWFzLT5tYXggPT0gVUxPTkdfTUFYKQ0KKwkJc3BhY2UtLTsNCisNCisJaWYgKHNs b3RfdG90YWwgPj0gc3BhY2UpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8qIEdldCB0aGUgZGF0 YTsgRmlsbCBtYXN0LT5ibiAqLw0KKwltYXN0LT5ibi0+Yl9lbmQrKzsNCisJaWYgKGxlZnQpIHsN CisJCW1hYl9zaGlmdF9yaWdodChtYXN0LT5ibiwgZW5kICsgMSk7DQorCQltYXNfbWFiX2NwKCZ0 bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCAwKTsNCisJCW1hc3QtPmJuLT5iX2VuZCA9IHNsb3Rf dG90YWwgKyAxOw0KKwl9IGVsc2Ugew0KKwkJbWFzX21hYl9jcCgmdG1wX21hcywgMCwgZW5kLCBt YXN0LT5ibiwgbWFzdC0+Ym4tPmJfZW5kKTsNCisJfQ0KKw0KKwkvKiBDb25maWd1cmUgbWFzdCBm b3Igc3BsaXR0aW5nIG9mIG1hc3QtPmJuICovDQorCXNwbGl0ID0gbXRfc2xvdHNbbWFzdC0+Ym4t PnR5cGVdIC0gMjsNCisJaWYgKGxlZnQpIHsNCisJCS8qICBTd2l0Y2ggbWFzIHRvIHByZXYgbm9k ZSAgKi8NCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgbWFzLT5ub2RlKTsNCisJCSptYXMgPSB0bXBf bWFzOw0KKwkJLyogU3RhcnQgdXNpbmcgbWFzdC0+bCBmb3IgdGhlIGxlZnQgc2lkZS4gKi8NCisJ CXRtcF9tYXMubm9kZSA9IG1hc3QtPmwtPm5vZGU7DQorCQkqbWFzdC0+bCA9IHRtcF9tYXM7DQor CX0gZWxzZSB7DQorCQltYXRfYWRkKG1hc3QtPmZyZWUsIHRtcF9tYXMubm9kZSk7DQorCQl0bXBf bWFzLm5vZGUgPSBtYXN0LT5yLT5ub2RlOw0KKwkJKm1hc3QtPnIgPSB0bXBfbWFzOw0KKwkJc3Bs aXQgPSBzbG90X3RvdGFsIC0gc3BsaXQ7DQorCX0NCisJc3BsaXQgPSBtYWJfbm9fbnVsbF9zcGxp dChtYXN0LT5ibiwgc3BsaXQsIG10X3Nsb3RzW21hc3QtPmJuLT50eXBlXSk7DQorCS8qIFVwZGF0 ZSBwYXJlbnQgc2xvdCBmb3Igc3BsaXQgY2FsY3VsYXRpb24uICovDQorCWlmIChsZWZ0KQ0KKwkJ bWFzdC0+b3JpZ19sLT5vZmZzZXQgKz0gZW5kICsgMTsNCisNCisJbWFzdF9zcGxpdF9kYXRhKG1h c3QsIG1hcywgc3BsaXQpOw0KKwltYXN0X2ZpbGxfYm5vZGUobWFzdCwgbWFzLCAyKTsNCisJbWFz X3NwbGl0X2ZpbmFsX25vZGUobWFzdCwgbWFzLCBoZWlnaHQgKyAxKTsNCisJcmV0dXJuIHRydWU7 DQorfQ0KKw0KKy8qDQorICogbWFzX3NwbGl0KCkgLSBTcGxpdCBkYXRhIHRoYXQgaXMgdG9vIGJp ZyBmb3Igb25lIG5vZGUgaW50byB0d28uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICog QGJfbm9kZTogVGhlIG1hcGxlIGJpZyBub2RlDQorICogUmV0dXJuOiAxIG9uIHN1Y2Nlc3MsIDAg b24gZmFpbHVyZS4NCisgKi8NCitzdGF0aWMgaW50IG1hc19zcGxpdChzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0KKw0KKwlzdHJ1Y3QgbWFw bGVfc3VidHJlZV9zdGF0ZSBtYXN0Ow0KKwlpbnQgaGVpZ2h0ID0gMDsNCisJdW5zaWduZWQgY2hh ciBtaWRfc3BsaXQsIHNwbGl0ID0gMDsNCisNCisJLyoNCisJICogU3BsaXR0aW5nIGlzIGhhbmRs ZWQgZGlmZmVyZW50bHkgZnJvbSBhbnkgb3RoZXIgQi10cmVlOyB0aGUgTWFwbGUNCisJICogVHJl ZSBzcGxpdHMgdXB3YXJkcy4gIFNwbGl0dGluZyB1cCBtZWFucyB0aGF0IHRoZSBzcGxpdCBvcGVy YXRpb24NCisJICogb2NjdXJzIHdoZW4gdGhlIHdhbGsgb2YgdGhlIHRyZWUgaGl0cyB0aGUgbGVh dmVzIGFuZCBub3Qgb24gdGhlIHdheQ0KKwkgKiBkb3duLiAgVGhlIHJlYXNvbiBmb3Igc3BsaXR0 aW5nIHVwIGlzIHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93DQorCSAqIGhvdyBtdWNoIHNw YWNlIHdpbGwgYmUgbmVlZGVkIHVudGlsIHRoZSBsZWFmIGlzIChvciBsZWF2ZXMgYXJlKQ0KKwkg KiByZWFjaGVkLiAgU2luY2Ugb3ZlcndyaXRpbmcgZGF0YSBpcyBhbGxvd2VkIGFuZCBhIHJhbmdl IGNvdWxkDQorCSAqIG92ZXJ3cml0ZSBtb3JlIHRoYW4gb25lIHJhbmdlIG9yIHJlc3VsdCBpbiBj aGFuZ2luZyBvbmUgZW50cnkgaW50byAzDQorCSAqIGVudHJpZXMsIGl0IGlzIGltcG9zc2libGUg dG8ga25vdyBpZiBhIHNwbGl0IGlzIHJlcXVpcmVkIHVudGlsIHRoZQ0KKwkgKiBkYXRhIGlzIGV4 YW1pbmVkLg0KKwkgKg0KKwkgKiBTcGxpdHRpbmcgaXMgYSBiYWxhbmNpbmcgYWN0IGJldHdlZW4g a2VlcGluZyBhbGxvY2F0aW9ucyB0byBhIG1pbmltdW0NCisJICogYW5kIGF2b2lkaW5nIGEgJ2pp dHRlcicgZXZlbnQgd2hlcmUgYSB0cmVlIGlzIGV4cGFuZGVkIHRvIG1ha2Ugcm9vbQ0KKwkgKiBm b3IgYW4gZW50cnkgZm9sbG93ZWQgYnkgYSBjb250cmFjdGlvbiB3aGVuIHRoZSBlbnRyeSBpcyBy ZW1vdmVkLiAgVG8NCisJICogYWNjb21wbGlzaCB0aGUgYmFsYW5jZSwgdGhlcmUgYXJlIGVtcHR5 IHNsb3RzIHJlbWFpbmluZyBpbiBib3RoIGxlZnQNCisJICogYW5kIHJpZ2h0IG5vZGVzIGFmdGVy IGEgc3BsaXQuDQorCSAqLw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4 LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBt YXMtPmxhc3QpOw0KKwlNQV9TVEFURShwcmV2X2xfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgs IG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKHByZXZfcl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRl eCwgbWFzLT5sYXN0KTsNCisJTUFfVE9QSUFSWShtYXQsIG1hcy0+dHJlZSk7DQorDQorCXRyYWNl X21hX29wKF9fZnVuY19fLCBtYXMpOw0KKwltYXMtPmRlcHRoID0gbWFzX210X2hlaWdodChtYXMp Ow0KKwkvKiBBbGxvY2F0aW9uIGZhaWx1cmVzIHdpbGwgaGFwcGVuIGVhcmx5LiAqLw0KKwltYXNf bm9kZV9jb3VudChtYXMsIDEgKyBtYXMtPmRlcHRoICogMik7DQorCWlmIChtYXNfaXNfZXJyKG1h cykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5sID0gJmxfbWFzOw0KKwltYXN0LnIgPSAmcl9t YXM7DQorCW1hc3Qub3JpZ19sID0gJnByZXZfbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnByZXZf cl9tYXM7DQorCW1hc3QuZnJlZSA9ICZtYXQ7DQorCW1hc3QuYm4gPSBiX25vZGU7DQorDQorCXdo aWxlIChoZWlnaHQrKyA8PSBtYXMtPmRlcHRoKSB7DQorCQlpZiAobXRfc2xvdHNbYl9ub2RlLT50 eXBlXSA+IGJfbm9kZS0+Yl9lbmQpIHsNCisJCQltYXNfc3BsaXRfZmluYWxfbm9kZSgmbWFzdCwg bWFzLCBoZWlnaHQpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJbF9tYXMgPSByX21hcyA9ICpt YXM7DQorCQlsX21hcy5ub2RlID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisJCXJf bWFzLm5vZGUgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwkJLyoNCisJCSAqIEFu b3RoZXIgd2F5IHRoYXQgJ2ppdHRlcicgaXMgYXZvaWRlZCBpcyB0byB0ZXJtaW5hdGUgYSBzcGxp dCB1cCBlYXJseSBpZiB0aGUNCisJCSAqIGxlZnQgb3IgcmlnaHQgbm9kZSBoYXMgc3BhY2UgdG8g c3BhcmUuICBUaGlzIGlzIHJlZmVycmVkIHRvIGFzICJwdXNoaW5nIGxlZnQiDQorCQkgKiBvciAi cHVzaGluZyByaWdodCIgYW5kIGlzIHNpbWlsYXIgdG8gdGhlIEIqIHRyZWUsIGV4Y2VwdCB0aGUg bm9kZXMgbGVmdCBvcg0KKwkJICogcmlnaHQgY2FuIHJhcmVseSBiZSByZXVzZWQgZHVlIHRvIFJD VSwgYnV0IHRoZSByaXBwbGUgdXB3YXJkcyBpcyBoYWx0ZWQgd2hpY2gNCisJCSAqIGlzIGEgc2ln bmlmaWNhbnQgc2F2aW5ncy4NCisJCSAqLw0KKwkJLyogVHJ5IHRvIHB1c2ggbGVmdC4gKi8NCisJ CWlmIChtYXNfcHVzaF9kYXRhKG1hcywgaGVpZ2h0LCAmbWFzdCwgdHJ1ZSkpDQorCQkJYnJlYWs7 DQorDQorCQkvKiBUcnkgdG8gcHVzaCByaWdodC4gKi8NCisJCWlmIChtYXNfcHVzaF9kYXRhKG1h cywgaGVpZ2h0LCAmbWFzdCwgZmFsc2UpKQ0KKwkJCWJyZWFrOw0KKw0KKwkJc3BsaXQgPSBtYWJf Y2FsY19zcGxpdChtYXMsIGJfbm9kZSwgJm1pZF9zcGxpdCwgcHJldl9sX21hcy5taW4pOw0KKwkJ bWFzdF9zcGxpdF9kYXRhKCZtYXN0LCBtYXMsIHNwbGl0KTsNCisJCS8qDQorCQkgKiBVc3VhbGx5 IGNvcnJlY3QsIG1hYl9tYXNfY3AgaW4gdGhlIGFib3ZlIGNhbGwgb3ZlcndyaXRlcw0KKwkJICog ci0+bWF4Lg0KKwkJICovDQorCQltYXN0LnItPm1heCA9IG1hcy0+bWF4Ow0KKwkJbWFzdF9maWxs X2Jub2RlKCZtYXN0LCBtYXMsIDEpOw0KKwkJcHJldl9sX21hcyA9ICptYXN0Lmw7DQorCQlwcmV2 X3JfbWFzID0gKm1hc3QucjsNCisJfQ0KKw0KKwkvKiBTZXQgdGhlIG9yaWdpbmFsIG5vZGUgYXMg ZGVhZCAqLw0KKwltYXRfYWRkKG1hc3QuZnJlZSwgbWFzLT5ub2RlKTsNCisJbWFzLT5ub2RlID0g bF9tYXMubm9kZTsNCisJbWFzX3dtYl9yZXBsYWNlKG1hcywgbWFzdC5mcmVlLCBOVUxMKTsNCisJ bXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoNCisgKiBtYXNf cmV1c2Vfbm9kZSgpIC0gUmV1c2UgdGhlIG5vZGUgdG8gc3RvcmUgdGhlIGRhdGEuDQorICogQHdy X21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICogQGJuOiBUaGUgbWFwbGUgYmlnIG5vZGUN CisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBkYXRhLg0KKyAqDQorICogV2lsbCBhbHdheXMgcmV0 dXJuIGZhbHNlIGluIFJDVSBtb2RlLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIG5vZGUgd2Fz IHJldXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNf cmV1c2Vfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcywNCisJCQkgIHN0cnVjdCBtYXBs ZV9iaWdfbm9kZSAqYm4sIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJLyogTmVlZCB0byBiZSBy Y3Ugc2FmZS4gKi8NCisJaWYgKG10X2luX3JjdSh3cl9tYXMtPm1hcy0+dHJlZSkpDQorCQlyZXR1 cm4gZmFsc2U7DQorDQorCWlmIChlbmQgPiBibi0+Yl9lbmQpIHsNCisJCQlpbnQgY2xlYXIgPSBt dF9zbG90c1t3cl9tYXMtPnR5cGVdIC0gYm4tPmJfZW5kOw0KKwkJCW1lbXNldCh3cl9tYXMtPnNs b3RzICsgYm4tPmJfZW5kLCAwLA0KKwkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAqIGNsZWFyLS0p Ow0KKwkJCW1lbXNldCh3cl9tYXMtPnBpdm90cyArIGJuLT5iX2VuZCwgMCwNCisJCQkgICAgICAg c2l6ZW9mKHZvaWQgKikgKiBjbGVhcik7DQorCX0NCisJbWFiX21hc19jcChibiwgMCwgYm4tPmJf ZW5kLCB3cl9tYXMtPm1hcywgZmFsc2UpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisg KiBtYXNfY29tbWl0X2Jfbm9kZSgpIC0gQ29tbWl0IHRoZSBiaWcgbm9kZSBpbnRvIHRoZSB0cmVl Lg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqIEBiX25vZGU6IFRoZSBt YXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6IFRoZSBlbmQgb2YgdGhlIGRhdGEuDQorICovDQorc3Rh dGljIGlubGluZSBpbnQgbWFzX2NvbW1pdF9iX25vZGUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9t YXMsDQorCQkJICAgIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLCB1bnNpZ25lZCBjaGFy IGVuZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl1bnNpZ25lZCBjaGFyIGJf ZW5kID0gYl9ub2RlLT5iX2VuZDsNCisJZW51bSBtYXBsZV90eXBlIGJfdHlwZSA9IGJfbm9kZS0+ dHlwZTsNCisNCisJaWYgKChiX2VuZCA8IG10X21pbl9zbG90c1tiX3R5cGVdKSAmJg0KKwkgICAg KCFtdGVfaXNfcm9vdCh3cl9tYXMtPm1hcy0+bm9kZSkpICYmDQorCSAgICAobWFzX210X2hlaWdo dCh3cl9tYXMtPm1hcykgPiAxKSkNCisJCXJldHVybiBtYXNfcmViYWxhbmNlKHdyX21hcy0+bWFz LCBiX25vZGUpOw0KKw0KKwlpZiAoYl9lbmQgPj0gbXRfc2xvdHNbYl90eXBlXSkNCisJCXJldHVy biBtYXNfc3BsaXQod3JfbWFzLT5tYXMsIGJfbm9kZSk7DQorDQorCWlmIChtYXNfcmV1c2Vfbm9k ZSh3cl9tYXMsIGJfbm9kZSwgZW5kKSkNCisJCWdvdG8gcmV1c2Vfbm9kZTsNCisNCisJbWFzX25v ZGVfY291bnQod3JfbWFzLT5tYXMsIDEpOw0KKwlpZiAobWFzX2lzX2Vycih3cl9tYXMtPm1hcykp DQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1hc19wb3Bfbm9kZSh3cl9tYXMtPm1hcyk7DQor CW5vZGUtPnBhcmVudCA9IG1hc19tbih3cl9tYXMtPm1hcyktPnBhcmVudDsNCisJd3JfbWFzLT5t YXMtPm5vZGUgPSBtdF9ta19ub2RlKG5vZGUsIGJfdHlwZSk7DQorCW1hYl9tYXNfY3AoYl9ub2Rl LCAwLCBiX2VuZCwgd3JfbWFzLT5tYXMsIHRydWUpOw0KKw0KKwltYXNfcmVwbGFjZSh3cl9tYXMt Pm1hcywgZmFsc2UpOw0KK3JldXNlX25vZGU6DQorCW1hc191cGRhdGVfZ2FwKHdyX21hcy0+bWFz KTsNCisJcmV0dXJuIDE7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jvb3RfZXhwYW5kKCkgLSBFeHBh bmQgYSByb290IHRvIGEgbm9kZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRy eTogVGhlIGVudHJ5IHRvIHN0b3JlIGludG8gdGhlIHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5l IGludCBtYXNfcm9vdF9leHBhbmQoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0K K3sNCisJdm9pZCAqY29udGVudHMgPSBtYXNfcm9vdF9sb2NrZWQobWFzKTsNCisJZW51bSBtYXBs ZV90eXBlIHR5cGUgPSBtYXBsZV9sZWFmXzY0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsN CisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCWludCBz bG90ID0gMDsNCisNCisJbWFzX25vZGVfY291bnQobWFzLCAxKTsNCisJaWYgKHVubGlrZWx5KG1h c19pc19lcnIobWFzKSkpDQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1hc19wb3Bfbm9kZSht YXMpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xv dHMobm9kZSwgdHlwZSk7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIoDQorCQkgICAg ICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJbWFzLT5u b2RlID0gbXRfbWtfbm9kZShub2RlLCB0eXBlKTsNCisNCisJaWYgKG1hcy0+aW5kZXgpIHsNCisJ CWlmIChjb250ZW50cykgew0KKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tzbG90XSwgY29u dGVudHMpOw0KKwkJCWlmIChsaWtlbHkobWFzLT5pbmRleCA+IDEpKQ0KKwkJCQlzbG90Kys7DQor CQl9DQorCQlwaXZvdHNbc2xvdCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCXJjdV9h c3NpZ25fcG9pbnRlcihzbG90c1tzbG90XSwgZW50cnkpOw0KKwltYXMtPm9mZnNldCA9IHNsb3Q7 DQorCXBpdm90c1tzbG90XSA9IG1hcy0+bGFzdDsNCisJaWYgKG1hcy0+bGFzdCAhPSBVTE9OR19N QVgpDQorCQlzbG90Kys7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNfc2V0X2hlaWdodChtYXMp Ow0KKw0KKwkvKiBzd2FwIHRoZSBuZXcgcm9vdCBpbnRvIHRoZSB0cmVlICovDQorCXJjdV9hc3Np Z25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0K KwltYV9zZXRfbWV0YShub2RlLCBtYXBsZV9sZWFmXzY0LCAwLCBzbG90KTsNCisJcmV0dXJuIHNs b3Q7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc3RvcmVfcm9vdChzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwlpZiAobGlrZWx5KChtYXMtPmxhc3QgIT0g MCkgfHwgKG1hcy0+aW5kZXggIT0gMCkpKQ0KKwkJbWFzX3Jvb3RfZXhwYW5kKG1hcywgZW50cnkp Ow0KKwllbHNlIGlmICgoKHVuc2lnbmVkIGxvbmcpIChlbnRyeSkgJiAzKSA9PSAyKQ0KKwkJbWFz X3Jvb3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwllbHNlIHsNCisJCXJjdV9hc3NpZ25fcG9pbnRl cihtYXMtPnRyZWUtPm1hX3Jvb3QsIGVudHJ5KTsNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsN CisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19pc19zcGFuX3dyKCkgLSBDaGVjayBpZiB0aGUgd3Jp dGUgbmVlZHMgdG8gYmUgdHJlYXRlZCBhcyBhIHdyaXRlIHRoYXQNCisgKiBzcGFucyB0aGUgbm9k ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAcGl2OiBUaGUgcGl2b3QgdmFsdWUg YmVpbmcgd3JpdHRlbg0KKyAqIEB0eXBlOiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQGVudHJ5 OiBUaGUgZGF0YSB0byB3cml0ZQ0KKyAqDQorICogU3Bhbm5pbmcgd3JpdGVzIGFyZSB3cml0ZXMg dGhhdCBzdGFydCBpbiBvbmUgbm9kZSBhbmQgZW5kIGluIGFub3RoZXIgT1IgaWYNCisgKiB0aGUg d3JpdGUgb2YgYSAlTlVMTCB3aWxsIGNhdXNlIHRoZSBub2RlIHRvIGVuZCB3aXRoIGEgJU5VTEwu DQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgdGhpcyBpcyBhIHNwYW5uaW5nIHdyaXRlLCBmYWxz ZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGJvb2wgbWFzX2lzX3NwYW5fd3Ioc3RydWN0IG1h X3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwl1bnNpZ25lZCBsb25nIG1heDsNCisJdW5zaWduZWQg bG9uZyBsYXN0ID0gd3JfbWFzLT5tYXMtPmxhc3Q7DQorCXVuc2lnbmVkIGxvbmcgcGl2ID0gd3Jf bWFzLT5yX21heDsNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSB3cl9tYXMtPnR5cGU7DQorCXZv aWQgKmVudHJ5ID0gd3JfbWFzLT5lbnRyeTsNCisNCisJLyogQ29udGFpbmVkIGluIHRoaXMgcGl2 b3QgKi8NCisJaWYgKHBpdiA+IGxhc3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1heCA9IHdy X21hcy0+bWFzLT5tYXg7DQorCWlmICh1bmxpa2VseShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJ LyogRml0cyBpbiB0aGUgbm9kZSwgYnV0IG1heSBzcGFuIHNsb3RzLiAqLw0KKwkJaWYgKGxhc3Qg PCBtYXgpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJLyogV3JpdGVzIHRvIHRoZSBlbmQgb2Yg dGhlIG5vZGUgYnV0IG5vdCBudWxsLiAqLw0KKwkJaWYgKChsYXN0ID09IG1heCkgJiYgZW50cnkp DQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJLyoNCisJCSAqIFdyaXRpbmcgVUxPTkdfTUFYIGlz IG5vdCBhIHNwYW5uaW5nIHdyaXRlIHJlZ2FyZGxlc3Mgb2YgdGhlDQorCQkgKiB2YWx1ZSBiZWlu ZyB3cml0dGVuIGFzIGxvbmcgYXMgdGhlIHJhbmdlIGZpdHMgaW4gdGhlIG5vZGUuDQorCQkgKi8N CisJCWlmICgobGFzdCA9PSBVTE9OR19NQVgpICYmIChsYXN0ID09IG1heCkpDQorCQkJcmV0dXJu IGZhbHNlOw0KKwl9IGVsc2UgaWYgKHBpdiA9PSBsYXN0KSB7DQorCQlpZiAoZW50cnkpDQorCQkJ cmV0dXJuIGZhbHNlOw0KKw0KKwkJLyogRGV0ZWN0IHNwYW5uaW5nIHN0b3JlIHdyIHdhbGsgKi8N CisJCWlmIChsYXN0ID09IFVMT05HX01BWCkNCisJCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJ dHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIHdyX21hcy0+bWFzLCBwaXYsIGVudHJ5KTsNCisNCisJ cmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3Jfd2Fsa19kZXNj ZW5kKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJd3JfbWFzLT5tYXMtPmRlcHRo Kys7DQorCXdyX21hcy0+dHlwZSA9IG10ZV9ub2RlX3R5cGUod3JfbWFzLT5tYXMtPm5vZGUpOw0K KwltYXNfd3Jfbm9kZV93YWxrKHdyX21hcyk7DQorCXdyX21hcy0+c2xvdHMgPSBtYV9zbG90cyh3 cl9tYXMtPm5vZGUsIHdyX21hcy0+dHlwZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfd3Jfd2Fsa190cmF2ZXJzZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXdy X21hcy0+bWFzLT5tYXggPSB3cl9tYXMtPnJfbWF4Ow0KKwl3cl9tYXMtPm1hcy0+bWluID0gd3Jf bWFzLT5yX21pbjsNCisJd3JfbWFzLT5tYXMtPm5vZGUgPSB3cl9tYXMtPmNvbnRlbnQ7DQorCXdy X21hcy0+bWFzLT5vZmZzZXQgPSAwOw0KK30NCisvKg0KKyAqIG1hc193cl93YWxrKCkgLSBXYWxr IHRoZSB0cmVlIGZvciBhIHdyaXRlLg0KKyAqIEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0 ZQ0KKyAqDQorICogVXNlcyBtYXNfc2xvdF9sb2NrZWQoKSBhbmQgZG9lcyBub3QgbmVlZCB0byB3 b3JyeSBhYm91dCBkZWFkIG5vZGVzLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIGl0J3MgY29u dGFpbmVkIGluIGEgbm9kZSwgZmFsc2Ugb24gc3Bhbm5pbmcgd3JpdGUuDQorICovDQorc3RhdGlj IGJvb2wgbWFzX3dyX3dhbGsoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1 Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwl3aGlsZSAodHJ1ZSkgew0KKwkJ bWFzX3dyX3dhbGtfZGVzY2VuZCh3cl9tYXMpOw0KKwkJaWYgKHVubGlrZWx5KG1hc19pc19zcGFu X3dyKHdyX21hcykpKQ0KKwkJCXJldHVybiBmYWxzZTsNCisNCisJCXdyX21hcy0+Y29udGVudCA9 IG1hc19zbG90X2xvY2tlZChtYXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJICBtYXMtPm9mZnNl dCk7DQorCQlpZiAobWFfaXNfbGVhZih3cl9tYXMtPnR5cGUpKQ0KKwkJCXJldHVybiB0cnVlOw0K Kw0KKwkJbWFzX3dyX3dhbGtfdHJhdmVyc2Uod3JfbWFzKTsNCisJfQ0KKw0KKwlyZXR1cm4gdHJ1 ZTsNCit9DQorDQorc3RhdGljIGJvb2wgbWFzX3dyX3dhbGtfaW5kZXgoc3RydWN0IG1hX3dyX3N0 YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0K Kw0KKwl3aGlsZSAodHJ1ZSkgew0KKwkJbWFzX3dyX3dhbGtfZGVzY2VuZCh3cl9tYXMpOw0KKwkJ d3JfbWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgd3JfbWFzLT5zbG90cywNCisJ CQkJCQkgIG1hcy0+b2Zmc2V0KTsNCisJCWlmIChtYV9pc19sZWFmKHdyX21hcy0+dHlwZSkpDQor CQkJcmV0dXJuIHRydWU7DQorCQltYXNfd3Jfd2Fsa190cmF2ZXJzZSh3cl9tYXMpOw0KKw0KKwl9 DQorCXJldHVybiB0cnVlOw0KK30NCisvKg0KKyAqIG1hc19leHRlbmRfc3Bhbm5pbmdfbnVsbCgp IC0gRXh0ZW5kIGEgc3RvcmUgb2YgYSAlTlVMTCB0byBpbmNsdWRlIHN1cnJvdW5kaW5nICVOVUxM cy4NCisgKiBAbF93cl9tYXM6IFRoZSBsZWZ0IG1hcGxlIHdyaXRlIHN0YXRlDQorICogQHJfd3Jf bWFzOiBUaGUgcmlnaHQgbWFwbGUgd3JpdGUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX2V4dGVuZF9zcGFubmluZ19udWxsKHN0cnVjdCBtYV93cl9zdGF0ZSAqbF93cl9tYXMs DQorCQkJCQkgICAgc3RydWN0IG1hX3dyX3N0YXRlICpyX3dyX21hcykNCit7DQorCXN0cnVjdCBt YV9zdGF0ZSAqcl9tYXMgPSByX3dyX21hcy0+bWFzOw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKmxfbWFz ID0gbF93cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBsX3Nsb3Q7DQorDQorCWxfc2xvdCA9 IGxfbWFzLT5vZmZzZXQ7DQorCWlmICghbF93cl9tYXMtPmNvbnRlbnQpDQorCQlsX21hcy0+aW5k ZXggPSBsX3dyX21hcy0+cl9taW47DQorDQorCWlmICgobF9tYXMtPmluZGV4ID09IGxfd3JfbWFz LT5yX21pbikgJiYNCisJCSAobF9zbG90ICYmDQorCQkgICFtYXNfc2xvdF9sb2NrZWQobF9tYXMs IGxfd3JfbWFzLT5zbG90cywgbF9zbG90IC0gMSkpKSB7DQorCQlpZiAobF9zbG90ID4gMSkNCisJ CQlsX21hcy0+aW5kZXggPSBsX3dyX21hcy0+cGl2b3RzW2xfc2xvdCAtIDJdICsgMTsNCisJCWVs c2UNCisJCQlsX21hcy0+aW5kZXggPSBsX21hcy0+bWluOw0KKw0KKwkJbF9tYXMtPm9mZnNldCA9 IGxfc2xvdCAtIDE7DQorCX0NCisNCisJaWYgKCFyX3dyX21hcy0+Y29udGVudCkgew0KKwkJaWYg KHJfbWFzLT5sYXN0IDwgcl93cl9tYXMtPnJfbWF4KQ0KKwkJCXJfbWFzLT5sYXN0ID0gcl93cl9t YXMtPnJfbWF4Ow0KKwkJcl9tYXMtPm9mZnNldCsrOw0KKwl9IGVsc2UgaWYgKChyX21hcy0+bGFz dCA9PSByX3dyX21hcy0+cl9tYXgpICYmDQorCSAgICAocl9tYXMtPmxhc3QgPCByX21hcy0+bWF4 KSAmJg0KKwkgICAgIW1hc19zbG90X2xvY2tlZChyX21hcywgcl93cl9tYXMtPnNsb3RzLCByX21h cy0+b2Zmc2V0ICsgMSkpIHsNCisJCXJfbWFzLT5sYXN0ID0gbWFzX3NhZmVfcGl2b3Qocl9tYXMs IHJfd3JfbWFzLT5waXZvdHMsDQorCQkJCQkgICAgIHJfd3JfbWFzLT50eXBlLCByX21hcy0+b2Zm c2V0ICsgMSk7DQorCQlyX21hcy0+b2Zmc2V0Kys7DQorCX0NCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkICptYXNfc3RhdGVfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQg KmVudHJ5Ow0KKw0KKwllbnRyeSA9IG1hc19zdGFydChtYXMpOw0KKwlpZiAobWFzX2lzX25vbmUo bWFzKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKQ0KKwkJcmV0 dXJuIGVudHJ5Ow0KKw0KKwlyZXR1cm4gbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KK30NCisNCisv Kg0KKyAqIG10cmVlX2xvb2t1cF93YWxrKCkgLSBJbnRlcm5hbCBxdWljayBsb29rdXAgdGhhdCBk b2VzIG5vdCBrZWVwIG1hcGxlIHN0YXRlIHVwDQorICogdG8gZGF0ZS4NCisgKg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIE5vdGU6IExlYXZlcyBtYXMgaW4gdW5kZXNpcmFi bGUgc3RhdGUuDQorICogUmV0dXJuOiBUaGUgZW50cnkgZm9yIEBtYXMtPmluZGV4IG9yICVOVUxM IG9uIGRlYWQgbm9kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm10cmVlX2xvb2t1cF93 YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0K Kwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0 cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCXZvaWQg X19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hhciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgbWF4 Ow0KKw0KKwluZXh0ID0gbWFzLT5ub2RlOw0KKwltYXggPSBVTE9OR19NQVg7DQorCWRvIHsNCisJ CW9mZnNldCA9IDA7DQorCQlub2RlID0gbXRlX3RvX25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRl X25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJ CWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWF4KTsNCisJCWlmICh1bmxp a2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYg KHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5kZXgpDQorCQkJZ290byBuZXh0Ow0KKw0KKwkJZG8g ew0KKwkJCW9mZnNldCsrOw0KKwkJfSB3aGlsZSgob2Zmc2V0IDwgZW5kKSAmJiAocGl2b3RzW29m ZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlpZiAobGlrZWx5KG9mZnNldCA+IGVuZCkpDQor CQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorbmV4dDoNCisJCXNsb3RzID0gbWFfc2xvdHMo bm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xvdChtYXMtPnRyZWUsIHNsb3RzLCBvZmZzZXQp Ow0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290byBkZWFkX25v ZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5cGUpKTsNCisNCisJcmV0dXJuICh2b2lkICop IG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNfcmVzZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7 DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19yb290KCkgLSBDcmVhdGUgYSBuZXcgcm9vdCBub2Rl IHRoYXQgb25seSBjb250YWlucyB0aGUgZW50cnkgcGFzc2VkDQorICogaW4uDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUuDQorICoNCisg KiBPbmx5IHZhbGlkIHdoZW4gdGhlIGluZGV4ID09IDAgYW5kIHRoZSBsYXN0ID09IFVMT05HX01B WA0KKyAqDQorICogUmV0dXJuIDAgb24gZXJyb3IsIDEgb24gc3VjY2Vzcy4NCisgKi8NCitzdGF0 aWMgaW5saW5lIGludCBtYXNfbmV3X3Jvb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVu dHJ5KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyb290ID0gbWFzX3Jvb3RfbG9ja2VkKG1h cyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbWFwbGVfbGVhZl82NDsNCisJc3RydWN0IG1h cGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgbG9uZyAq cGl2b3RzOw0KKw0KKwlpZiAoIWVudHJ5ICYmICFtYXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBV TE9OR19NQVgpIHsNCisJCW1hcy0+ZGVwdGggPSAwOw0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsN CisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIGVudHJ5KTsNCisJCW1h cy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwltYXNfbm9kZV9j b3VudChtYXMsIDEpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQor CW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5 cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwlub2RlLT5wYXJlbnQgPSBt YV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNpZ25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JP T1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10X21rX25vZGUobm9kZSwgdHlwZSk7DQorCXJj dV9hc3NpZ25fcG9pbnRlcihzbG90c1swXSwgZW50cnkpOw0KKwlwaXZvdHNbMF0gPSBtYXMtPmxh c3Q7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNfc2V0X2hlaWdodChtYXMpOw0KKwlyY3VfYXNz aWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290LCBtdGVfbWtfcm9vdChtYXMtPm5vZGUpKTsN CisNCitkb25lOg0KKwlpZiAoeGFfaXNfbm9kZShyb290KSkNCisJCW10ZV9kZXN0cm95X3dhbGso cm9vdCwgbWFzLT50cmVlKTsNCisNCisJcmV0dXJuIDE7DQorfQ0KKy8qDQorICogbWFzX3NwYW5u aW5nX3N0b3JlKCkgLSBDcmVhdGUgYSBzdWJ0cmVlIHdpdGggdGhlIHN0b3JlIG9wZXJhdGlvbiBj b21wbGV0ZWQNCisgKiBhbmQgbmV3IG5vZGVzIHdoZXJlIG5lY2Vzc2FyeSwgdGhlbiBwbGFjZSB0 aGUgc3ViLXRyZWUgaW4gdGhlIGFjdHVhbCB0cmVlLg0KKyAqIE5vdGUgdGhhdCBtYXMgaXMgZXhw ZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG5vZGUgd2hpY2ggY2F1c2VkIHRoZSBzdG9yZSB0bw0KKyAq IHNwYW4uDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1 cm46IDAgb24gZXJyb3IsIHBvc2l0aXZlIG9uIHN1Y2Nlc3MuDQorICovDQorc3RhdGljIGlubGlu ZSBpbnQgbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0K K3sNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgbWFzdDsNCisJc3RydWN0IG1hcGxlX2Jp Z19ub2RlIGJfbm9kZTsNCisJc3RydWN0IG1hX3N0YXRlICptYXM7DQorCXVuc2lnbmVkIGNoYXIg aGVpZ2h0Ow0KKw0KKwkvKiBMZWZ0IGFuZCBSaWdodCBzaWRlIG9mIHNwYW5uaW5nIHN0b3JlICov DQorCU1BX1NUQVRFKGxfbWFzLCBOVUxMLCAwLCAwKTsNCisJTUFfU1RBVEUocl9tYXMsIE5VTEws IDAsIDApOw0KKw0KKwlNQV9XUl9TVEFURShyX3dyX21hcywgJnJfbWFzLCB3cl9tYXMtPmVudHJ5 KTsNCisJTUFfV1JfU1RBVEUobF93cl9tYXMsICZsX21hcywgd3JfbWFzLT5lbnRyeSk7DQorDQor CS8qDQorCSAqIEEgc3RvcmUgb3BlcmF0aW9uIHRoYXQgc3BhbnMgbXVsdGlwbGUgbm9kZXMgaXMg Y2FsbGVkIGEgc3Bhbm5pbmcNCisJICogc3RvcmUgYW5kIGlzIGhhbmRsZWQgZWFybHkgaW4gdGhl IHN0b3JlIGNhbGwgc3RhY2sgYnkgdGhlIGZ1bmN0aW9uDQorCSAqIG1hc19pc19zcGFuX3dyKCku ICBXaGVuIGEgc3Bhbm5pbmcgc3RvcmUgaXMgaWRlbnRpZmllZCwgdGhlIG1hcGxlDQorCSAqIHN0 YXRlIGlzIGR1cGxpY2F0ZWQuICBUaGUgZmlyc3QgbWFwbGUgc3RhdGUgd2Fsa3MgdGhlIGxlZnQg dHJlZSBwYXRoDQorCSAqIHRvIGBgaW5kZXhgYCwgdGhlIGR1cGxpY2F0ZSB3YWxrcyB0aGUgcmln aHQgdHJlZSBwYXRoIHRvIGBgbGFzdGBgLg0KKwkgKiBUaGUgZGF0YSBpbiB0aGUgdHdvIG5vZGVz IGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIG5vZGUsIHR3byBub2RlcywNCisJICogb3IgcG9z c2libHkgdGhyZWUgbm9kZXMgKHNlZSB0aGUgMy13YXkgc3BsaXQgYWJvdmUpLiAgQSBgYE5VTExg YA0KKwkgKiB3cml0dGVuIHRvIHRoZSBsYXN0IGVudHJ5IG9mIGEgbm9kZSBpcyBjb25zaWRlcmVk IGEgc3Bhbm5pbmcgc3RvcmUgYXMNCisJICogYSByZWJhbGFuY2UgaXMgcmVxdWlyZWQgZm9yIHRo ZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIGFuIG92ZXJmbG93DQorCSAqIG9mIGRhdGEgbWF5 IGhhcHBlbi4NCisJICovDQorCW1hcyA9IHdyX21hcy0+bWFzOw0KKwl0cmFjZV9tYV9vcChfX2Z1 bmNfXywgbWFzKTsNCisNCisJaWYgKHVubGlrZWx5KCFtYXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9 PSBVTE9OR19NQVgpKQ0KKwkJcmV0dXJuIG1hc19uZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkp Ow0KKwkvKg0KKwkgKiBOb2RlIHJlYmFsYW5jaW5nIG1heSBvY2N1ciBkdWUgdG8gdGhpcyBzdG9y ZSwgc28gdGhlcmUgbWF5IGJlIHR3byBuZXcNCisJICogZW50cmllcyBwZXIgbGV2ZWwgcGx1cyBh IG5ldyByb290Lg0KKwkgKi8NCisJaGVpZ2h0ID0gbWFzX210X2hlaWdodChtYXMpOw0KKwltYXNf bm9kZV9jb3VudChtYXMsIDEgKyBoZWlnaHQgKiAzKTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkN CisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkgKiBTZXQgdXAgcmlnaHQgc2lkZS4gIE5lZWQgdG8g Z2V0IHRvIHRoZSBuZXh0IG9mZnNldCBhZnRlciB0aGUgc3Bhbm5pbmcNCisJICogc3RvcmUgdG8g ZW5zdXJlIGl0J3Mgbm90IE5VTEwgYW5kIHRvIGNvbWJpbmUgYm90aCB0aGUgbmV4dCBub2RlIGFu ZA0KKwkgKiB0aGUgbm9kZSB3aXRoIHRoZSBzdGFydCB0b2dldGhlci4NCisJICovDQorCXJfbWFz ID0gKm1hczsNCisJLyogQXZvaWQgb3ZlcmZsb3csIHdhbGsgdG8gbmV4dCBzbG90IGluIHRoZSB0 cmVlLiAqLw0KKwlpZiAocl9tYXMubGFzdCArIDEpDQorCQlyX21hcy5sYXN0Kys7DQorDQorCXJf bWFzLmluZGV4ID0gcl9tYXMubGFzdDsNCisJbWFzX3dyX3dhbGtfaW5kZXgoJnJfd3JfbWFzKTsN CisJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0gbWFzLT5sYXN0Ow0KKw0KKwkvKiBTZXQgdXAg bGVmdCBzaWRlLiAqLw0KKwlsX21hcyA9ICptYXM7DQorCW1hc193cl93YWxrX2luZGV4KCZsX3dy X21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRyeSkgew0KKwkJbWFzX2V4dGVuZF9zcGFubmlu Z19udWxsKCZsX3dyX21hcywgJnJfd3JfbWFzKTsNCisJCW1hcy0+b2Zmc2V0ID0gbF9tYXMub2Zm c2V0Ow0KKwkJbWFzLT5pbmRleCA9IGxfbWFzLmluZGV4Ow0KKwkJbWFzLT5sYXN0ID0gbF9tYXMu bGFzdCA9IHJfbWFzLmxhc3Q7DQorCX0NCisNCisJbWVtc2V0KCZiX25vZGUsIDAsIHNpemVvZihz dHJ1Y3QgbWFwbGVfYmlnX25vZGUpKTsNCisJLyogQ29weSBsX21hcyBhbmQgc3RvcmUgdGhlIHZh bHVlIGluIGJfbm9kZS4gKi8NCisJbWFzX3N0b3JlX2Jfbm9kZSgmbF93cl9tYXMsICZiX25vZGUs IGxfd3JfbWFzLm5vZGVfZW5kKTsNCisJLyogQ29weSByX21hcyBpbnRvIGJfbm9kZS4gKi8NCisJ aWYgKHJfbWFzLm9mZnNldCA8PSByX3dyX21hcy5ub2RlX2VuZCkNCisJCW1hc19tYWJfY3AoJnJf bWFzLCByX21hcy5vZmZzZXQsIHJfd3JfbWFzLm5vZGVfZW5kLA0KKwkJCSAgICZiX25vZGUsIGJf bm9kZS5iX2VuZCArIDEpOw0KKwkvKiBTdG9wIHNwYW5uaW5nIHNlYXJjaGVzIGJ5IHNlYXJjaGlu ZyBmb3IganVzdCBpbmRleC4gKi8NCisJbF9tYXMuaW5kZXggPSBsX21hcy5sYXN0ID0gbWFzLT5p bmRleDsNCisNCisJbWFzdC5ibiA9ICZiX25vZGU7DQorCW1hc3Qub3JpZ19sID0gJmxfbWFzOw0K KwltYXN0Lm9yaWdfciA9ICZyX21hczsNCisJLyogQ29tYmluZSBsX21hcyBhbmQgcl9tYXMgYW5k IHNwbGl0IHRoZW0gdXAgZXZlbmx5IGFnYWluLiAqLw0KKwlyZXR1cm4gbWFzX3NwYW5uaW5nX3Jl YmFsYW5jZShtYXMsICZtYXN0LCBoZWlnaHQgKyAxKTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jf bm9kZV9zdG9yZSgpIC0gQXR0ZW1wdCB0byBzdG9yZSB0aGUgdmFsdWUgaW4gYSBub2RlDQorICog QHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBBdHRlbXB0cyB0byByZXVz ZSB0aGUgbm9kZSwgYnV0IG1heSBhbGxvY2F0ZS4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBz dG9yZWQsIGZhbHNlIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfd3Jf bm9kZV9zdG9yZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9z dGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXZvaWQgX19yY3UgKipkc3Rfc2xvdHM7DQorCXVu c2lnbmVkIGxvbmcgKmRzdF9waXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgZHN0X29mZnNldDsNCisJ dW5zaWduZWQgY2hhciBuZXdfZW5kID0gd3JfbWFzLT5ub2RlX2VuZDsNCisJdW5zaWduZWQgY2hh ciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9zbG90cyA9IG10X3Nsb3RzW3dyX21hcy0+ dHlwZV07DQorCXN0cnVjdCBtYXBsZV9ub2RlIHJldXNlLCAqbmV3bm9kZTsNCisJdW5zaWduZWQg Y2hhciBjb3B5X3NpemUsIG1heF9waXYgPSBtdF9waXZvdHNbd3JfbWFzLT50eXBlXTsNCisJYm9v bCBpbl9yY3UgPSBtdF9pbl9yY3UobWFzLT50cmVlKTsNCisNCisJb2Zmc2V0ID0gbWFzLT5vZmZz ZXQ7DQorCWlmIChtYXMtPmxhc3QgPT0gd3JfbWFzLT5yX21heCkgew0KKwkJLyogcnVucyByaWdo dCB0byB0aGUgZW5kIG9mIHRoZSBub2RlICovDQorCQlpZiAobWFzLT5sYXN0ID09IG1hcy0+bWF4 KQ0KKwkJCW5ld19lbmQgPSBvZmZzZXQ7DQorCQkvKiBkb24ndCBjb3B5IHRoaXMgb2Zmc2V0ICov DQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJfSBlbHNlIGlmIChtYXMtPmxhc3QgPCB3cl9t YXMtPnJfbWF4KSB7DQorCQkvKiBuZXcgcmFuZ2UgZW5kcyBpbiB0aGlzIHJhbmdlICovDQorCQlp ZiAodW5saWtlbHkod3JfbWFzLT5yX21heCA9PSBVTE9OR19NQVgpKQ0KKwkJCW1hc19idWxrX3Jl YmFsYW5jZShtYXMsIHdyX21hcy0+bm9kZV9lbmQsIHdyX21hcy0+dHlwZSk7DQorDQorCQluZXdf ZW5kKys7DQorCX0gZWxzZSB7DQorCQlpZiAobWFzX3NhZmVfcGl2b3QobWFzLCB3cl9tYXMtPnBp dm90cywgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkJCQkgICB3cl9tYXMtPnR5cGUpID09IG1hcy0+ bGFzdCkNCisJCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisNCisJCW5ld19lbmQgLT0gd3JfbWFz LT5vZmZzZXRfZW5kIC0gb2Zmc2V0IC0gMTsNCisJfQ0KKw0KKwkvKiBuZXcgcmFuZ2Ugc3RhcnRz IHdpdGhpbiBhIHJhbmdlICovDQorCWlmICh3cl9tYXMtPnJfbWluIDwgbWFzLT5pbmRleCkNCisJ CW5ld19lbmQrKzsNCisNCisJLyogTm90IGVub3VnaCByb29tICovDQorCWlmIChuZXdfZW5kID49 IG5vZGVfc2xvdHMpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8qIE5vdCBlbm91Z2ggZGF0YS4g Ki8NCisJaWYgKCFtdGVfaXNfcm9vdChtYXMtPm5vZGUpICYmIChuZXdfZW5kIDw9IG10X21pbl9z bG90c1t3cl9tYXMtPnR5cGVdKSAmJg0KKwkgICAgIShtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRF X0JVTEspKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwkvKiBzZXQgdXAgbm9kZS4gKi8NCisJaWYg KGluX3JjdSkgew0KKwkJbWFzX25vZGVfY291bnQobWFzLCAxKTsNCisJCWlmIChtYXNfaXNfZXJy KG1hcykpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJbmV3bm9kZSA9IG1hc19wb3Bfbm9kZSht YXMpOw0KKwl9IGVsc2Ugew0KKwkJbWVtc2V0KCZyZXVzZSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBs ZV9ub2RlKSk7DQorCQluZXdub2RlID0gJnJldXNlOw0KKwl9DQorDQorCW5ld25vZGUtPnBhcmVu dCA9IG1hc19tbihtYXMpLT5wYXJlbnQ7DQorCWRzdF9waXZvdHMgPSBtYV9waXZvdHMobmV3bm9k ZSwgd3JfbWFzLT50eXBlKTsNCisJZHN0X3Nsb3RzID0gbWFfc2xvdHMobmV3bm9kZSwgd3JfbWFz LT50eXBlKTsNCisJLyogQ29weSBmcm9tIHN0YXJ0IHRvIGluc2VydCBwb2ludCAqLw0KKwltZW1j cHkoZHN0X3Bpdm90cywgd3JfbWFzLT5waXZvdHMsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIChv ZmZzZXQgKyAxKSk7DQorCW1lbWNweShkc3Rfc2xvdHMsIHdyX21hcy0+c2xvdHMsIHNpemVvZih2 b2lkICopICogKG9mZnNldCArIDEpKTsNCisJZHN0X29mZnNldCA9IG9mZnNldDsNCisNCisJLyog SGFuZGxlIGluc2VydCBvZiBuZXcgcmFuZ2Ugc3RhcnRpbmcgYWZ0ZXIgb2xkIHJhbmdlICovDQor CWlmICh3cl9tYXMtPnJfbWluIDwgbWFzLT5pbmRleCkgew0KKwkJbWFzLT5vZmZzZXQrKzsNCisJ CXJjdV9hc3NpZ25fcG9pbnRlcihkc3Rfc2xvdHNbZHN0X29mZnNldF0sIHdyX21hcy0+Y29udGVu dCk7DQorCQlkc3RfcGl2b3RzW2RzdF9vZmZzZXQrK10gPSBtYXMtPmluZGV4IC0gMTsNCisJfQ0K Kw0KKwkvKiBTdG9yZSB0aGUgbmV3IGVudHJ5IGFuZCByYW5nZSBlbmQuICovDQorCWlmIChkc3Rf b2Zmc2V0IDwgbWF4X3BpdikNCisJCWRzdF9waXZvdHNbZHN0X29mZnNldF0gPSBtYXMtPmxhc3Q7 DQorCW1hcy0+b2Zmc2V0ID0gZHN0X29mZnNldDsNCisJcmN1X2Fzc2lnbl9wb2ludGVyKGRzdF9z bG90c1tkc3Rfb2Zmc2V0KytdLCB3cl9tYXMtPmVudHJ5KTsNCisNCisJLyogdGhpcyByYW5nZSB3 cm90ZSB0byB0aGUgZW5kIG9mIHRoZSBub2RlLiAqLw0KKwlpZiAod3JfbWFzLT5vZmZzZXRfZW5k ID4gd3JfbWFzLT5ub2RlX2VuZCkNCisJCWdvdG8gZG9uZTsNCisNCisJLyogQ29weSB0byB0aGUg ZW5kIG9mIG5vZGUgaWYgbmVjZXNzYXJ5LiAqLw0KKwljb3B5X3NpemUgPSB3cl9tYXMtPm5vZGVf ZW5kIC0gd3JfbWFzLT5vZmZzZXRfZW5kICsgMTsNCisJbWVtY3B5KGRzdF9zbG90cyArIGRzdF9v ZmZzZXQsIHdyX21hcy0+c2xvdHMgKyB3cl9tYXMtPm9mZnNldF9lbmQsDQorCSAgICAgICBzaXpl b2Yodm9pZCAqKSAqIGNvcHlfc2l6ZSk7DQorCWlmIChkc3Rfb2Zmc2V0IDwgbWF4X3Bpdikgew0K KwkJaWYgKGNvcHlfc2l6ZSA+IG1heF9waXYgLSBkc3Rfb2Zmc2V0KQ0KKwkJCWNvcHlfc2l6ZSA9 IG1heF9waXYgLSBkc3Rfb2Zmc2V0Ow0KKwkJbWVtY3B5KGRzdF9waXZvdHMgKyBkc3Rfb2Zmc2V0 LCB3cl9tYXMtPnBpdm90cyArIHdyX21hcy0+b2Zmc2V0X2VuZCwNCisJCSAgICAgICBzaXplb2Yo dW5zaWduZWQgbG9uZykgKiBjb3B5X3NpemUpOw0KKwl9DQorDQorZG9uZToNCisJaWYgKCh3cl9t YXMtPm5vZGVfZW5kID09IG5vZGVfc2xvdHMgLSAxKSAmJiAobmV3X2VuZCA8IG5vZGVfc2xvdHMg LSAxKSkNCisJCWRzdF9waXZvdHNbbmV3X2VuZF0gPSBtYXMtPm1heDsNCisNCisJbWFzX2xlYWZf c2V0X21ldGEobWFzLCBuZXdub2RlLCBkc3RfcGl2b3RzLCBtYXBsZV9sZWFmXzY0LCBuZXdfZW5k KTsNCisJaWYgKGluX3JjdSkgew0KKwkJbWFzLT5ub2RlID0gbXRfbWtfbm9kZShuZXdub2RlLCB3 cl9tYXMtPnR5cGUpOw0KKwkJbWFzX3JlcGxhY2UobWFzLCBmYWxzZSk7DQorCX0gZWxzZSB7DQor CQltZW1jcHkod3JfbWFzLT5ub2RlLCBuZXdub2RlLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUp KTsNCisJfQ0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCB3cl9tYXMtPmVudHJ5 KTsNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQor ICogbWFzX3dyX3Nsb3Rfc3RvcmU6IEF0dGVtcHQgdG8gc3RvcmUgYSB2YWx1ZSBpbiBhIHNsb3Qu DQorICogQHdyX21hczogdGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IFRy dWUgaWYgc3RvcmVkLCBmYWxzZSBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wg bWFzX3dyX3Nsb3Rfc3RvcmUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1 Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBsb25nIGxtYXg7IC8q IExvZ2ljYWwgbWF4LiAqLw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0K Kw0KKwlpZiAoKHdyX21hcy0+cl9tYXggPiBtYXMtPmxhc3QpICYmICgod3JfbWFzLT5yX21pbiAh PSBtYXMtPmluZGV4KSB8fA0KKwkJCQkgIChvZmZzZXQgIT0gd3JfbWFzLT5ub2RlX2VuZCkpKQ0K KwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAob2Zmc2V0ID09IHdyX21hcy0+bm9kZV9lbmQgLSAx KQ0KKwkJbG1heCA9IG1hcy0+bWF4Ow0KKwllbHNlDQorCQlsbWF4ID0gd3JfbWFzLT5waXZvdHNb b2Zmc2V0ICsgMV07DQorDQorCS8qIGdvaW5nIHRvIG92ZXJ3cml0ZSB0b28gbWFueSBzbG90cy4g Ki8NCisJaWYgKGxtYXggPCBtYXMtPmxhc3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWlmICh3 cl9tYXMtPnJfbWluID09IG1hcy0+aW5kZXgpIHsNCisJCS8qIG92ZXJ3cml0aW5nIHR3byBvciBt b3JlIHJhbmdlcyB3aXRoIG9uZS4gKi8NCisJCWlmIChsbWF4ID09IG1hcy0+bGFzdCkNCisJCQly ZXR1cm4gZmFsc2U7DQorDQorCQkvKiBPdmVyd3JpdGluZyBhbGwgb2Ygb2Zmc2V0IGFuZCBhIHBv cnRpb24gb2Ygb2Zmc2V0ICsgMS4gKi8NCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNs b3RzW29mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJd3JfbWFzLT5waXZvdHNbb2Zmc2V0XSA9 IG1hcy0+bGFzdDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBEb2Vzbid0IGVuZCBvbiB0 aGUgbmV4dCByYW5nZSBlbmQuICovDQorCWlmIChsbWF4ICE9IG1hcy0+bGFzdCkNCisJCXJldHVy biBmYWxzZTsNCisNCisJLyogT3ZlcndyaXRpbmcgYSBwb3J0aW9uIG9mIG9mZnNldCBhbmQgYWxs IG9mIG9mZnNldCArIDEgKi8NCisJaWYgKChvZmZzZXQgKyAxIDwgbXRfcGl2b3RzW3dyX21hcy0+ dHlwZV0pICYmDQorCSAgICAod3JfbWFzLT5lbnRyeSB8fCB3cl9tYXMtPnBpdm90c1tvZmZzZXQg KyAxXSkpDQorCQkJd3JfbWFzLT5waXZvdHNbb2Zmc2V0ICsgMV0gPSBtYXMtPmxhc3Q7DQorDQor CXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW29mZnNldCArIDFdLCB3cl9tYXMtPmVu dHJ5KTsNCisJd3JfbWFzLT5waXZvdHNbb2Zmc2V0XSA9IG1hcy0+aW5kZXggLSAxOw0KKwltYXMt Pm9mZnNldCsrOyAvKiBLZWVwIG1hcyBhY2N1cmF0ZS4gKi8NCisNCitkb25lOg0KKwl0cmFjZV9t YV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCB3cl9tYXMtPmVudHJ5KTsNCisJbWFzX3VwZGF0ZV9n YXAobWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNf d3JfZW5kX3BpdihzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXdoaWxlICgod3Jf bWFzLT5tYXMtPmxhc3QgPiB3cl9tYXMtPmVuZF9waXYpICYmDQorCSAgICAgICAod3JfbWFzLT5v ZmZzZXRfZW5kIDwgd3JfbWFzLT5ub2RlX2VuZCkpDQorCQl3cl9tYXMtPmVuZF9waXYgPSB3cl9t YXMtPnBpdm90c1srK3dyX21hcy0+b2Zmc2V0X2VuZF07DQorDQorCWlmICh3cl9tYXMtPm1hcy0+ bGFzdCA+IHdyX21hcy0+ZW5kX3BpdikNCisJCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+bWFz LT5tYXg7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3JfZXh0ZW5kX251bGwoc3Ry dWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdy X21hcy0+bWFzOw0KKw0KKwlpZiAobWFzLT5sYXN0IDwgd3JfbWFzLT5lbmRfcGl2ICYmICF3cl9t YXMtPnNsb3RzW3dyX21hcy0+b2Zmc2V0X2VuZF0pDQorCQltYXMtPmxhc3QgPSB3cl9tYXMtPmVu ZF9waXY7DQorDQorCS8qIENoZWNrIG5leHQgc2xvdChzKSBpZiB3ZSBhcmUgb3ZlcndyaXRpbmcg dGhlIGVuZCAqLw0KKwlpZiAoKG1hcy0+bGFzdCA9PSB3cl9tYXMtPmVuZF9waXYpICYmDQorCSAg ICAod3JfbWFzLT5ub2RlX2VuZCAhPSB3cl9tYXMtPm9mZnNldF9lbmQpICYmDQorCSAgICAhd3Jf bWFzLT5zbG90c1t3cl9tYXMtPm9mZnNldF9lbmQgKyAxXSkgew0KKwkJd3JfbWFzLT5vZmZzZXRf ZW5kKys7DQorCQlpZiAod3JfbWFzLT5vZmZzZXRfZW5kID09IHdyX21hcy0+bm9kZV9lbmQpDQor CQkJbWFzLT5sYXN0ID0gbWFzLT5tYXg7DQorCQllbHNlDQorCQkJbWFzLT5sYXN0ID0gd3JfbWFz LT5waXZvdHNbd3JfbWFzLT5vZmZzZXRfZW5kXTsNCisJfSBlbHNlIGlmICgobWFzLT5sYXN0ID4g d3JfbWFzLT5lbmRfcGl2KSAmJg0KKwkJICAgIXdyX21hcy0+c2xvdHNbd3JfbWFzLT5vZmZzZXRf ZW5kXSkgew0KKwkJbWFzLT5sYXN0ID0gd3JfbWFzLT5lbmRfcGl2Ow0KKwkJd3JfbWFzLT5vZmZz ZXRfZW5kKys7DQorCX0NCisNCisJaWYgKCF3cl9tYXMtPmNvbnRlbnQpIHsNCisJCS8qIElmIHRo aXMgb25lIGlzIG51bGwsIHRoZSBuZXh0IGFuZCBwcmV2IGFyZSBub3QgKi8NCisJCW1hcy0+aW5k ZXggPSB3cl9tYXMtPnJfbWluOw0KKwl9IGVsc2Ugew0KKwkJLyogQ2hlY2sgcHJldiBzbG90IGlm IHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgc3RhcnQgKi8NCisJCWlmIChtYXMtPmluZGV4ID09IHdy X21hcy0+cl9taW4gJiYgbWFzLT5vZmZzZXQgJiYNCisJCSAgICAhd3JfbWFzLT5zbG90c1ttYXMt Pm9mZnNldCAtIDFdKSB7DQorCQkJbWFzLT5vZmZzZXQtLTsNCisJCQl3cl9tYXMtPnJfbWluID0g bWFzLT5pbmRleCA9DQorCQkJCW1hc19zYWZlX21pbihtYXMsIHdyX21hcy0+cGl2b3RzLCBtYXMt Pm9mZnNldCk7DQorCQkJd3JfbWFzLT5yX21heCA9IHdyX21hcy0+cGl2b3RzW21hcy0+b2Zmc2V0 XTsNCisJCX0NCisJfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dyX2FwcGVuZChz dHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgZW5kID0gd3Jf bWFzLT5ub2RlX2VuZDsNCisJdW5zaWduZWQgY2hhciBuZXdfZW5kID0gZW5kICsgMTsNCisJc3Ry dWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisJdW5zaWduZWQgY2hhciBub2RlX3Bp dm90cyA9IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVdOw0KKw0KKwlpZiAoKG1hcy0+aW5kZXggIT0g d3JfbWFzLT5yX21pbikgJiYgKG1hcy0+bGFzdCA9PSB3cl9tYXMtPnJfbWF4KSkgew0KKwkJaWYg KG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQl3cl9tYXMtPnBpdm90c1tuZXdfZW5kXSA9IHdy X21hcy0+cGl2b3RzW2VuZF07DQorDQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0KKwkJ CW1hX3NldF9tZXRhKHdyX21hcy0+bm9kZSwgbWFwbGVfbGVhZl82NCwgMCwgbmV3X2VuZCk7DQor DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tuZXdfZW5kXSwgd3JfbWFzLT5l bnRyeSk7DQorCQltYXMtPm9mZnNldCA9IG5ld19lbmQ7DQorCQl3cl9tYXMtPnBpdm90c1tlbmRd ID0gbWFzLT5pbmRleCAtIDE7DQorDQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlpZiAoKG1h cy0+aW5kZXggPT0gd3JfbWFzLT5yX21pbikgJiYgKG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgp KSB7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0KKwkJCXdyX21hcy0+cGl2b3RzW25l d19lbmRdID0gd3JfbWFzLT5waXZvdHNbZW5kXTsNCisNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3 cl9tYXMtPnNsb3RzW25ld19lbmRdLCB3cl9tYXMtPmNvbnRlbnQpOw0KKwkJaWYgKG5ld19lbmQg PCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0YSh3cl9tYXMtPm5vZGUsIG1hcGxlX2xlYWZf NjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJd3JfbWFzLT5waXZvdHNbZW5kXSA9IG1hcy0+bGFzdDsN CisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW2VuZF0sIHdyX21hcy0+ZW50cnkp Ow0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIHZvaWQgbWFzX3dyX21vZGlmeShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykN Cit7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9zbG90czsNCisJdW5zaWduZWQgY2hhciBub2RlX3Np emU7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXN0cnVjdCBtYXBs ZV9iaWdfbm9kZSBiX25vZGU7DQorDQorCS8qIERpcmVjdCByZXBsYWNlbWVudCAqLw0KKwlpZiAo d3JfbWFzLT5yX21pbiA9PSBtYXMtPmluZGV4ICYmIHdyX21hcy0+cl9tYXggPT0gbWFzLT5sYXN0 KSB7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1ttYXMtPm9mZnNldF0sIHdy X21hcy0+ZW50cnkpOw0KKwkJaWYgKCEhd3JfbWFzLT5lbnRyeSBeICEhd3JfbWFzLT5jb250ZW50 KQ0KKwkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCQlyZXR1cm47DQorCX0NCisNCisJLyogQXR0 ZW1wdCB0byBhcHBlbmQgKi8NCisJbm9kZV9zbG90cyA9IG10X3Nsb3RzW3dyX21hcy0+dHlwZV07 DQorCW5vZGVfc2l6ZSA9IHdyX21hcy0+bm9kZV9lbmQgLSB3cl9tYXMtPm9mZnNldF9lbmQgKyBt YXMtPm9mZnNldCArIDI7DQorCWlmIChtYXMtPm1heCA9PSBVTE9OR19NQVgpDQorCQlub2RlX3Np emUrKzsNCisNCisJLyogc2xvdCBhbmQgbm9kZSBzdG9yZSB3aWxsIG5vdCBmaXQsIGdvIHRvIHRo ZSBzbG93IHBhdGggKi8NCisJaWYgKHVubGlrZWx5KG5vZGVfc2l6ZSA+PSBub2RlX3Nsb3RzKSkN CisJCWdvdG8gc2xvd19wYXRoOw0KKw0KKwlpZiAod3JfbWFzLT5lbnRyeSAmJiAod3JfbWFzLT5u b2RlX2VuZCA8IG5vZGVfc2xvdHMgLSAxKSAmJg0KKwkgICAgKG1hcy0+b2Zmc2V0ID09IHdyX21h cy0+bm9kZV9lbmQpICYmIG1hc193cl9hcHBlbmQod3JfbWFzKSkgew0KKwkJCWlmICghd3JfbWFz LT5jb250ZW50IHx8ICF3cl9tYXMtPmVudHJ5KQ0KKwkJCQltYXNfdXBkYXRlX2dhcChtYXMpOw0K KwkJCXJldHVybjsNCisJfQ0KKw0KKwlpZiAoKHdyX21hcy0+b2Zmc2V0X2VuZCAtIG1hcy0+b2Zm c2V0IDw9IDEpICYmIG1hc193cl9zbG90X3N0b3JlKHdyX21hcykpDQorCQlyZXR1cm47DQorCWVs c2UgaWYgKG1hc193cl9ub2RlX3N0b3JlKHdyX21hcykpDQorCQlyZXR1cm47DQorDQorCWlmICht YXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm47DQorDQorc2xvd19wYXRoOg0KKwltZW1zZXQoJmJf bm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSkpOw0KKwltYXNfc3RvcmVfYl9u b2RlKHdyX21hcywgJmJfbm9kZSwgd3JfbWFzLT5vZmZzZXRfZW5kKTsNCisJdHJhY2VfbWFfd3Jp dGUoX19mdW5jX18sIG1hcywgMCwgd3JfbWFzLT5lbnRyeSk7DQorCW1hc19jb21taXRfYl9ub2Rl KHdyX21hcywgJmJfbm9kZSwgd3JfbWFzLT5ub2RlX2VuZCk7DQorfQ0KKw0KKy8qDQorICogbWFz X3dyX3N0b3JlX2VudHJ5KCkgLSBJbnRlcm5hbCBjYWxsIHRvIHN0b3JlIGEgdmFsdWUNCisgKiBA bWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisg Kg0KKyAqIFJldHVybjogVGhlIGNvbnRlbnRzIHRoYXQgd2FzIHN0b3JlZCBhdCB0aGUgaW5kZXgu DQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfd3Jfc3RvcmVfZW50cnkoc3RydWN0IG1h X3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+ bWFzOw0KKw0KKwlpZiAoKHdyX21hcy0+Y29udGVudCA9IG1hc19zdGFydChtYXMpKSB8fCBtYXNf aXNfbm9uZShtYXMpIHx8DQorCSAgICBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19zdG9yZV9y b290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9 DQorDQorCWlmICh1bmxpa2VseSghbWFzX3dyX3dhbGsod3JfbWFzKSkpIHsNCisJCW1hc193cl9z cGFubmluZ19zdG9yZSh3cl9tYXMpOw0KKwkJcmV0dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0K Kw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRz IHRvIGJlIGFsdGVyZWQuICovDQorCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+cl9tYXg7DQor CW1hc193cl9lbmRfcGl2KHdyX21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRyeSkNCisJCW1h c193cl9leHRlbmRfbnVsbCh3cl9tYXMpOw0KKw0KKwkvKiBOZXcgcm9vdCBmb3IgYSBzaW5nbGUg cG9pbnRlciAqLw0KKwlpZiAodW5saWtlbHkoIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVM T05HX01BWCkpIHsNCisJCW1hc19uZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0 dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0KKw0KKwltYXNfd3JfbW9kaWZ5KHdyX21hcyk7DQor CXJldHVybiB3cl9tYXMtPmNvbnRlbnQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19pbnNlcnQoKSAt IEludGVybmFsIGNhbGwgdG8gaW5zZXJ0IGEgdmFsdWUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqDQorICogUmV0dXJuOiAlTlVM TCBvciB0aGUgY29udGVudHMgdGhhdCBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgcmVxdWVzdGVkIGlu ZGV4DQorICogb3RoZXJ3aXNlLiAgVGhlIG1hcGxlIHN0YXRlIG5lZWRzIHRvIGJlIGNoZWNrZWQg Zm9yIGVycm9yIGNvbmRpdGlvbnMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfaW5z ZXJ0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRF KHdyX21hcywgbWFzLCBlbnRyeSk7DQorDQorCS8qDQorCSAqIEluc2VydGluZyBhIG5ldyByYW5n ZSBpbnNlcnRzIGVpdGhlciAwLCAxLCBvciAyIHBpdm90cyB3aXRoaW4gdGhlDQorCSAqIHRyZWUu ICBJZiB0aGUgaW5zZXJ0IGZpdHMgZXhhY3RseSBpbnRvIGFuIGV4aXN0aW5nIGdhcCB3aXRoIGEg dmFsdWUNCisJICogb2YgTlVMTCwgdGhlbiB0aGUgc2xvdCBvbmx5IG5lZWRzIHRvIGJlIHdyaXR0 ZW4gd2l0aCB0aGUgbmV3IHZhbHVlLg0KKwkgKiBJZiB0aGUgcmFuZ2UgYmVpbmcgaW5zZXJ0ZWQg aXMgYWRqYWNlbnQgdG8gYW5vdGhlciByYW5nZSwgdGhlbiBvbmx5IGENCisJICogc2luZ2xlIHBp dm90IG5lZWRzIHRvIGJlIGluc2VydGVkIChhcyB3ZWxsIGFzIHdyaXRpbmcgdGhlIGVudHJ5KS4g IElmDQorCSAqIHRoZSBuZXcgcmFuZ2UgaXMgd2l0aGluIGEgZ2FwIGJ1dCBkb2VzIG5vdCB0b3Vj aCBhbnkgb3RoZXIgcmFuZ2VzLA0KKwkgKiB0aGVuIHR3byBwaXZvdHMgbmVlZCB0byBiZSBpbnNl cnRlZDogdGhlIHN0YXJ0IC0gMSwgYW5kIHRoZSBlbmQuICBBcw0KKwkgKiB1c3VhbCwgdGhlIGVu dHJ5IG11c3QgYmUgd3JpdHRlbi4gIE1vc3Qgb3BlcmF0aW9ucyByZXF1aXJlIGEgbmV3IG5vZGUN CisJICogdG8gYmUgYWxsb2NhdGVkIGFuZCByZXBsYWNlIGFuIGV4aXN0aW5nIG5vZGUgdG8gZW5z dXJlIFJDVSBzYWZldHksDQorCSAqIHdoZW4gaW4gUkNVIG1vZGUuICBUaGUgZXhjZXB0aW9uIHRv IHJlcXVpcmluZyBhIG5ld2x5IGFsbG9jYXRlZCBub2RlDQorCSAqIGlzIHdoZW4gaW5zZXJ0aW5n IGF0IHRoZSBlbmQgb2YgYSBub2RlIChhcHBlbmRpbmcpLiAgV2hlbiBkb25lDQorCSAqIGNhcmVm dWxseSwgYXBwZW5kaW5nIGNhbiByZXVzZSB0aGUgbm9kZSBpbiBwbGFjZS4NCisJICovDQorCXdy X21hcy5jb250ZW50ID0gbWFzX3N0YXJ0KG1hcyk7DQorCWlmICh3cl9tYXMuY29udGVudCkNCisJ CWdvdG8gZXhpc3RzOw0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1h cykpIHsNCisJCW1hc19zdG9yZV9yb290KG1hcywgZW50cnkpOw0KKwkJcmV0dXJuIE5VTEw7DQor CX0NCisNCisJLyogc3Bhbm5pbmcgd3JpdGVzIGFsd2F5cyBvdmVyd3JpdGUgc29tZXRoaW5nICov DQorCWlmICghbWFzX3dyX3dhbGsoJndyX21hcykpDQorCQlnb3RvIGV4aXN0czsNCisNCisJLyog QXQgdGhpcyBwb2ludCwgd2UgYXJlIGF0IHRoZSBsZWFmIG5vZGUgdGhhdCBuZWVkcyB0byBiZSBh bHRlcmVkLiAqLw0KKwl3cl9tYXMub2Zmc2V0X2VuZCA9IG1hcy0+b2Zmc2V0Ow0KKwl3cl9tYXMu ZW5kX3BpdiA9IHdyX21hcy5yX21heDsNCisNCisJaWYgKHdyX21hcy5jb250ZW50IHx8IChtYXMt Pmxhc3QgPiB3cl9tYXMucl9tYXgpKQ0KKwkJZ290byBleGlzdHM7DQorDQorCWlmICghZW50cnkp DQorCQlyZXR1cm4gTlVMTDsNCisNCisJbWFzX3dyX21vZGlmeSgmd3JfbWFzKTsNCisJcmV0dXJu IHdyX21hcy5jb250ZW50Ow0KKw0KK2V4aXN0czoNCisJbWFzX3NldF9lcnIobWFzLCAtRUVYSVNU KTsNCisJcmV0dXJuIHdyX21hcy5jb250ZW50Ow0KKw0KK30NCisNCisvKg0KKyAqIG1hc19wcmV2 X25vZGUoKSAtIEZpbmQgdGhlIHByZXYgbm9uLW51bGwgZW50cnkgYXQgdGhlIHNhbWUgbGV2ZWwg aW4gdGhlDQorICogdHJlZS4gIFRoZSBwcmV2IHZhbHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+ b2Zmc2V0XSBvciBNQVNfTk9ORS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWlu OiBUaGUgbG93ZXIgbGltaXQgdG8gc2VhcmNoDQorICoNCisgKiBUaGUgcHJldiBub2RlIHZhbHVl IHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNfTk9ORS4NCisgKiBSZXR1cm46 IDEgaWYgdGhlIG5vZGUgaXMgZGVhZCwgMCBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGlu ZSBpbnQgbWFzX3ByZXZfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBt aW4pDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCWludCBvZmZzZXQsIGxldmVsOw0KKwl2 b2lkIF9fcmN1ICoqc2xvdHM7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKmVub2RlOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCWlmICht YXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCWxldmVsID0gMDsNCisJZG8gew0K KwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJaWYgKG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290 byBub19lbnRyeTsNCisNCisJCS8qIFdhbGsgdXAuICovDQorCQlpZiAodW5saWtlbHkobWFzX2Fz Y2VuZChtYXMpKSkNCisJCQlyZXR1cm4gMTsNCisJCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwkJ bGV2ZWwrKzsNCisJfSB3aGlsZSAoIW9mZnNldCk7DQorDQorCW9mZnNldC0tOw0KKwltdCA9IG10 ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlzbG90cyA9 IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJ bWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJaWYgKG9mZnNldCkNCisJCW1hcy0+bWluID0g cGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2Rl KSkpDQorCQlyZXR1cm4gMTsNCisNCisJaWYgKG1hcy0+bWF4IDwgbWluKQ0KKwkJZ290byBub19l bnRyeV9taW47DQorDQorCXdoaWxlIChsZXZlbCA+IDEpIHsNCisJCWxldmVsLS07DQorCQllbm9k ZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVh ZF9ub2RlKG5vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisNCisJCW1hcy0+bm9kZSA9IGVub2RlOw0K KwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlub2RlID0gbWFzX21uKG1hcyk7 DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhu b2RlLCBtdCk7DQorCQlvZmZzZXQgPSBtYV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMt Pm1heCk7DQorCQlpZiAob2Zmc2V0KQ0KKwkJCW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFd ICsgMTsNCisNCisJCWlmIChvZmZzZXQgPCBtdF9waXZvdHNbbXRdKQ0KKwkJCW1hcy0+bWF4ID0g cGl2b3RzW29mZnNldF07DQorDQorCQlpZiAobWFzLT5tYXggPCBtaW4pDQorCQkJZ290byBub19l bnRyeTsNCisJfQ0KKw0KKwltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQp Ow0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0K KwltYXMtPm9mZnNldCA9IG1hc19kYXRhX2VuZChtYXMpOw0KKwlpZiAodW5saWtlbHkobXRlX2Rl YWRfbm9kZShtYXMtPm5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwlyZXR1cm4gMDsNCisNCitu b19lbnRyeV9taW46DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlpZiAob2Zmc2V0KQ0KKwkJ bWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KK25vX2VudHJ5Og0KKwlpZiAodW5s aWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUg PSBNQVNfTk9ORTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfbm9kZSgp IC0gR2V0IHRoZSBuZXh0IG5vZGUgYXQgdGhlIHNhbWUgbGV2ZWwgaW4gdGhlIHRyZWUuDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0gcGl2b3QgdmFsdWUg dG8gY2hlY2suDQorICoNCisgKiBUaGUgbmV4dCB2YWx1ZSB3aWxsIGJlIG1hcy0+bm9kZVttYXMt Pm9mZnNldF0gb3IgTUFTX05PTkUuDQorICogUmV0dXJuOiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhl cndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX25leHRfbm9kZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCXVuc2lnbmVkIGxvbmcg bWF4KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtaW4sIHBpdm90Ow0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGU7DQorCWludCBsZXZlbCA9IDA7DQor CXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCXZvaWQgX19y Y3UgKipzbG90czsNCisNCisJaWYgKG1hcy0+bWF4ID49IG1heCkNCisJCWdvdG8gbm9fZW50cnk7 DQorDQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJaWYgKG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJ Z290byBub19lbnRyeTsNCisNCisJCW1pbiA9IG1hcy0+bWF4ICsgMTsNCisJCWlmIChtaW4gPiBt YXgpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCWlmICh1bmxpa2VseShtYXNfYXNjZW5kKG1h cykpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZl bCsrOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwl9IHdoaWxlICh1bmxp a2VseShvZmZzZXQgPT0gbWFfZGF0YV9lbmQobm9kZSwgbXQsIHBpdm90cywgbWFzLT5tYXgpKSk7 DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwlwaXZvdCA9IG1hc19zYWZlX3Bp dm90KG1hcywgcGl2b3RzLCArK29mZnNldCwgbXQpOw0KKwl3aGlsZSAodW5saWtlbHkobGV2ZWwg PiAxKSkgew0KKwkJLyogRGVzY2VuZCwgaWYgbmVjZXNzYXJ5ICovDQorCQllbm9kZSA9IG1hc19z bG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5v ZGUpKSkNCisJCQlyZXR1cm4gMTsNCisNCisJCW1hcy0+bm9kZSA9IGVub2RlOw0KKwkJbGV2ZWwt LTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCQlwaXZvdHMgPSBtYV9waXZv dHMobm9kZSwgbXQpOw0KKwkJb2Zmc2V0ID0gMDsNCisJCXBpdm90ID0gcGl2b3RzWzBdOw0KKwl9 DQorDQorCWVub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJaWYgKHVubGlr ZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0g ZW5vZGU7DQorCW1hcy0+bWluID0gbWluOw0KKwltYXMtPm1heCA9IHBpdm90Ow0KKwlyZXR1cm4g MDsNCisNCitub19lbnRyeToNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQor CQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCXJldHVybiAwOw0KK30N CisNCisvKg0KKyAqIG1hc19uZXh0X25lbnRyeSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgZW50cnkN CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0 byBjaGVjaw0KKyAqIEAqcmFuZ2Vfc3RhcnQ6IFBvaW50ZXIgdG8gc3RvcmUgdGhlIHN0YXJ0IG9m IHRoZSByYW5nZS4NCisgKg0KKyAqIFNldHMgQG1hcy0+b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2Yg dGhlIG5leHQgbm9kZSBlbnRyeSwgQG1hcy0+bGFzdCB0byB0aGUNCisgKiBwaXZvdCBvZiB0aGUg ZW50cnkuDQorICoNCisgKiBSZXR1cm46IFRoZSBuZXh0IGVudHJ5LCAlTlVMTCBvdGhlcndpc2UN CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19uZXh0X25lbnRyeShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywNCisJICAgIHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIG1h eCwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwl1bnNpZ25lZCBjaGFyIGNvdW50Ow0KKwl1 bnNpZ25lZCBsb25nIHBpdm90Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19y Y3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7DQorDQorCWlmIChtYXMtPmxhc3QgPT0gbWFzLT5t YXgpIHsNCisJCW1hcy0+aW5kZXggPSBtYXMtPm1heDsNCisJCXJldHVybiBOVUxMOw0KKwl9DQor DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhu b2RlLCB0eXBlKTsNCisJbWFzLT5pbmRleCA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgbWFz LT5vZmZzZXQpOw0KKwlpZiAobWFfZGVhZF9ub2RlKG5vZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQor DQorCWlmIChtYXMtPmluZGV4ID4gbWF4KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWNvdW50ID0g bWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3RzLCBtYXMtPm1heCk7DQorCXdoaWxlIChtYXMt Pm9mZnNldCA8IGNvdW50KSB7DQorCQlwaXZvdCA9IHBpdm90c1ttYXMtPm9mZnNldF07DQorCQll bnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCisJCWlmIChtYV9kZWFk X25vZGUobm9kZSkpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQlpZiAoZW50cnkpDQorCQkJZ290 byBmb3VuZDsNCisNCisJCWlmIChwaXZvdCA+PSBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQor CQltYXMtPmluZGV4ID0gcGl2b3QgKyAxOw0KKwkJbWFzLT5vZmZzZXQrKzsNCisJfQ0KKw0KKwlp ZiAobWFzLT5pbmRleCA+IG1hcy0+bWF4KSB7DQorCQltYXMtPmluZGV4ID0gbWFzLT5sYXN0Ow0K KwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcGl2b3QgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBp dm90cywgbWFzLT5vZmZzZXQsIHR5cGUpOw0KKwllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMs IG1hcy0+b2Zmc2V0KTsNCisJaWYgKG1hX2RlYWRfbm9kZShub2RlKSkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwlpZiAoIXBpdm90KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICghZW50cnkpDQor CQlyZXR1cm4gTlVMTDsNCisNCitmb3VuZDoNCisJbWFzLT5sYXN0ID0gcGl2b3Q7DQorCXJldHVy biBlbnRyeTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19yZXdhbGsoc3RydWN0IG1h X3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKw0KK3JldHJ5Og0KKwltYXNf c2V0KG1hcywgaW5kZXgpOw0KKwltYXNfc3RhdGVfd2FsayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0 YXJ0KG1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlyZXR1cm47DQorDQorfQ0KKw0KKy8qDQor ICogbWFzX25leHRfZW50cnkoKSAtIEludGVybmFsIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmV4dCBl bnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbGltaXQ6IFRoZSBtYXhpbXVt IHJhbmdlIHN0YXJ0Lg0KKyAqDQorICogU2V0IHRoZSBAbWFzLT5ub2RlIHRvIHRoZSBuZXh0IGVu dHJ5IGFuZCB0aGUgcmFuZ2Vfc3RhcnQgdG8NCisgKiB0aGUgYmVnaW5uaW5nIHZhbHVlIGZvciB0 aGUgZW50cnkuICBEb2VzIG5vdCBjaGVjayBiZXlvbmQgQGxpbWl0Lg0KKyAqIFNldHMgQG1hcy0+ aW5kZXggYW5kIEBtYXMtPmxhc3QgdG8gdGhlIGxpbWl0IGlmIGl0IGlzIGhpdC4NCisgKiBSZXN0 YXJ0cyBvbiBkZWFkIG5vZGVzLg0KKyAqDQorICogUmV0dXJuOiB0aGUgbmV4dCBlbnRyeSBvciAl TlVMTC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19uZXh0X2VudHJ5KHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIGxpbWl0KQ0KK3sNCisJdm9pZCAqZW50cnkgPSBO VUxMOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnByZXZfbm9kZTsNCisJc3RydWN0IG1hcGxlX25v ZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nIGxhc3Q7 DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisNCisJbGFzdCA9IG1hcy0+bGFzdDsNCityZXRyeToN CisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCXByZXZfbm9kZSA9IG1hcy0+bm9kZTsNCisJbm9k ZSA9IG1hc19tbihtYXMpOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbWFz LT5vZmZzZXQrKzsNCisJaWYgKHVubGlrZWx5KG1hcy0+b2Zmc2V0ID49IG10X3Nsb3RzW210XSkp DQorCQlnb3RvIG5leHRfbm9kZTsNCisNCisJd2hpbGUgKCFtYXNfaXNfbm9uZShtYXMpKSB7DQor CQllbnRyeSA9IG1hc19uZXh0X25lbnRyeShtYXMsIG5vZGUsIGxpbWl0LCBtdCk7DQorCQlpZiAo dW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkgew0KKwkJCW1hc19yZXdhbGsobWFzLCBsYXN0 KTsNCisJCQlnb3RvIHJldHJ5Ow0KKwkJfQ0KKw0KKwkJaWYgKGxpa2VseShlbnRyeSkpDQorCQkJ cmV0dXJuIGVudHJ5Ow0KKw0KKwkJaWYgKHVubGlrZWx5KChtYXMtPmluZGV4ID4gbGltaXQpKSkN CisJCQlicmVhazsNCisNCituZXh0X25vZGU6DQorCQlwcmV2X25vZGUgPSBtYXMtPm5vZGU7DQor CQlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJCWlmICh1bmxpa2VseShtYXNfbmV4dF9ub2RlKG1h cywgbm9kZSwgbGltaXQpKSkgew0KKwkJCW1hc19yZXdhbGsobWFzLCBsYXN0KTsNCisJCQlnb3Rv IHJldHJ5Ow0KKwkJfQ0KKwkJbWFzLT5vZmZzZXQgPSAwOw0KKwkJbm9kZSA9IG1hc19tbihtYXMp Ow0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCX0NCisNCisJbWFzLT5pbmRl eCA9IG1hcy0+bGFzdCA9IGxpbWl0Ow0KKwltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJbWFzLT5u b2RlID0gcHJldl9ub2RlOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNfcHJl dl9uZW50cnkoKSAtIEdldCB0aGUgcHJldmlvdXMgbm9kZSBlbnRyeS4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiBUaGUgbG93ZXIgbGltaXQgdG8gY2hlY2sgZm9yIGEg dmFsdWUuDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSwgJU5VTEwgb3RoZXJ3aXNlLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3ByZXZfbmVudHJ5KHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCB1bnNpZ25lZCBsb25nIGxpbWl0LA0KKwkJCQkgICAgdW5zaWduZWQgbG9uZyBpbmRleCkN Cit7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1pbjsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7 DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbjsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNp Z25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7 DQorDQorcmV0cnk6DQorCWlmICghbWFzLT5vZmZzZXQpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJ bW4gPSBtYXNfbW4obWFzKTsNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW9m ZnNldCA9IG1hcy0+b2Zmc2V0IC0gMTsNCisJc2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwlw aXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsNCisJaWYgKG9mZnNldCA9PSBtdF9waXZvdHNbbXRd KQ0KKwkJcGl2b3QgPSBtYXMtPm1heDsNCisJZWxzZQ0KKwkJcGl2b3QgPSBwaXZvdHNbb2Zmc2V0 XTsNCisNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKSB7DQorCQltYXNfcmV3YWxr KG1hcywgaW5kZXgpOw0KKwkJZ290byByZXRyeTsNCisJfQ0KKw0KKwl3aGlsZSAob2Zmc2V0ICYm ICgoIW1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCkgJiYgcGl2b3QgPj0gbGltaXQpIHx8DQor CSAgICAgICAhcGl2b3QpKQ0KKwkJcGl2b3QgPSBwaXZvdHNbLS1vZmZzZXRdOw0KKw0KKwltaW4g PSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQorCWVudHJ5ID0gbWFzX3Nsb3Qo bWFzLCBzbG90cywgb2Zmc2V0KTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShtbikpKSB7 DQorCQltYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKwkJZ290byByZXRyeTsNCisJfQ0KKw0KKwlp ZiAobGlrZWx5KGVudHJ5KSkgew0KKwkJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMtPmxh c3QgPSBwaXZvdDsNCisJCW1hcy0+aW5kZXggPSBtaW47DQorCX0NCisJcmV0dXJuIGVudHJ5Ow0K K30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19wcmV2X2VudHJ5KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5 Og0KKwl3aGlsZSAobGlrZWx5KCFtYXNfaXNfbm9uZShtYXMpKSkgew0KKwkJZW50cnkgPSBtYXNf cHJldl9uZW50cnkobWFzLCBtaW4sIG1hcy0+aW5kZXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hcy0+ bGFzdCA8IG1pbikpDQorCQkJZ290byBub3RfZm91bmQ7DQorDQorCQlpZiAobGlrZWx5KGVudHJ5 KSkNCisJCQlyZXR1cm4gZW50cnk7DQorDQorCQlpZiAodW5saWtlbHkobWFzX3ByZXZfbm9kZSht YXMsIG1pbikpKSB7DQorCQkJbWFzX3Jld2FsayhtYXMsIG1hcy0+aW5kZXgpOw0KKwkJCWdvdG8g cmV0cnk7DQorCQl9DQorDQorCQltYXMtPm9mZnNldCsrOw0KKwl9DQorDQorCW1hcy0+b2Zmc2V0 LS07DQorbm90X2ZvdW5kOg0KKwltYXMtPmluZGV4ID0gbWFzLT5sYXN0ID0gbWluOw0KKwlyZXR1 cm4gTlVMTDsNCit9DQorDQorLyoNCisgKiBtYXNfcmV2X2F3YWxrKCkgLSBJbnRlcm5hbCBmdW5j dGlvbi4gIFJldmVyc2UgYWxsb2NhdGlvbiB3YWxrLiAgRmluZCB0aGUNCisgKiBoaWdoZXN0IGdh cCBhZGRyZXNzIG9mIGEgZ2l2ZW4gc2l6ZSBpbiBhIGdpdmVuIG5vZGUgYW5kIGRlc2NlbmQuDQor ICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNpemU6IFRoZSBuZWVkZWQgc2l6ZS4NCisg Kg0KKyAqIFJldHVybjogVHJ1ZSBpZiBmb3VuZCBpbiBhIGxlYWYsIGZhbHNlIG90aGVyd2lzZS4N CisgKg0KKyAqLw0KK3N0YXRpYyBib29sIG1hc19yZXZfYXdhbGsoc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19t bihtYXMpOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMsICpnYXBzOw0KKwl2b2lkIF9fcmN1ICoq c2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBtYXgsIG1p biwgaW5kZXg7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKw0KKwlpZiAodW5saWtlbHkobWFz X2lzX2VycihtYXMpKSkNCisJICAgIHJldHVybiB0cnVlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2Uo dHlwZSkpIHsNCisJCS8qIGRlbnNlIG5vZGVzLiAqLw0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWdu ZWQgY2hhcikobWFzLT5pbmRleCAtIG1hcy0+bWluKTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQor DQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhu b2RlLCB0eXBlKTsNCisJZ2FwcyA9IG1hX2dhcHMobm9kZSwgdHlwZSk7DQorCW9mZnNldCA9IG1h cy0+b2Zmc2V0Ow0KKwltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQor CS8qIFNraXAgb3V0IG9mIGJvdW5kcy4gKi8NCisJd2hpbGUgKG1hcy0+bGFzdCA8IG1pbikNCisJ CW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgLS1vZmZzZXQpOw0KKw0KKwltYXggPSBt YXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zmc2V0LCB0eXBlKTsNCisJaW5kZXggPSBtYXMt PmluZGV4Ow0KKwl3aGlsZSAoaW5kZXggPD0gbWF4KSB7DQorCQlnYXAgPSAwOw0KKwkJaWYgKGdh cHMpDQorCQkJZ2FwID0gZ2Fwc1tvZmZzZXRdOw0KKwkJZWxzZSBpZiAoIW1hc19zbG90KG1hcywg c2xvdHMsIG9mZnNldCkpDQorCQkJZ2FwID0gbWF4IC0gbWluICsgMTsNCisNCisJCWlmIChnYXAp IHsNCisJCQlpZiAoKHNpemUgPD0gZ2FwKSAmJiAoc2l6ZSA8PSBtYXMtPmxhc3QgLSBtaW4gKyAx KSkNCisJCQkJYnJlYWs7DQorDQorCQkJaWYgKCFnYXBzKSB7DQorCQkJCS8qIFNraXAgdGhlIG5l eHQgc2xvdCwgaXQgY2Fubm90IGJlIGEgZ2FwLiAqLw0KKwkJCQlpZiAob2Zmc2V0IDwgMikNCisJ CQkJCWdvdG8gYXNjZW5kOw0KKw0KKwkJCQlvZmZzZXQgLT0gMjsNCisJCQkJbWF4ID0gcGl2b3Rz W29mZnNldF07DQorCQkJCW1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsN CisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJaWYgKCFvZmZzZXQpDQorCQkJZ290 byBhc2NlbmQ7DQorDQorCQlvZmZzZXQtLTsNCisJCW1heCA9IG1pbiAtIDE7DQorCQltaW4gPSBt YXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5 KGluZGV4ID4gbWF4KSkgew0KKwkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKwkJcmV0dXJu IGZhbHNlOw0KKwl9DQorDQorCWlmICh1bmxpa2VseShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJ bWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCQltYXMtPm1pbiA9IG1pbjsNCisJCW1hcy0+bWF4ID0g bWluICsgZ2FwIC0gMTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCS8qIGRlc2NlbmQsIG9u bHkgaGFwcGVucyB1bmRlciBsb2NrLiAqLw0KKwltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNs b3RzLCBvZmZzZXQpOw0KKwltYXMtPm1pbiA9IG1pbjsNCisJbWFzLT5tYXggPSBtYXg7DQorCW1h cy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7DQorCXJldHVybiBmYWxzZTsNCisNCithc2Nl bmQ6DQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJbWFzX3NldF9lcnIobWFzLCAt RUJVU1kpOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBt YXNfYW5vZGVfZGVzY2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXpl KQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7 DQorCXVuc2lnbmVkIGxvbmcgcGl2b3QsIG1pbiwgZ2FwID0gMDsNCisJdW5zaWduZWQgY2hhciBj b3VudCwgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nICpnYXBzID0gTlVMTCwgKnBpdm90cyA9IG1h X3Bpdm90cyhtYXNfbW4obWFzKSwgdHlwZSk7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Ns b3RzKG1hc19tbihtYXMpLCB0eXBlKTsNCisJYm9vbCBmb3VuZCA9IGZhbHNlOw0KKw0KKwlpZiAo bWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCW1hcy0+b2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIpKG1h cy0+aW5kZXggLSBtYXMtPm1pbik7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlnYXBzID0g bWFfZ2FwcyhtdGVfdG9fbm9kZShtYXMtPm5vZGUpLCB0eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5v ZmZzZXQ7DQorCWNvdW50ID0gbXRfc2xvdHNbdHlwZV07DQorCW1pbiA9IG1hc19zYWZlX21pbiht YXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZm9yICg7IG9mZnNldCA8IGNvdW50OyBvZmZzZXQrKykg ew0KKwkJcGl2b3QgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zmc2V0LCB0eXBlKTsN CisJCWlmIChvZmZzZXQgJiYgIXBpdm90KQ0KKwkJCWJyZWFrOw0KKw0KKwkJLyogTm90IHdpdGhp biBsb3dlciBib3VuZHMgKi8NCisJCWlmIChtYXMtPmluZGV4ID4gcGl2b3QpDQorCQkJZ290byBu ZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwcykNCisJCQlnYXAgPSBnYXBzW29mZnNldF07DQorCQll bHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSkNCisJCQlnYXAgPSBtaW4ocGl2 b3QsIG1hcy0+bGFzdCkgLSBtYXgobWFzLT5pbmRleCwgbWluKSArIDE7DQorCQllbHNlDQorCQkJ Z290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwID49IHNpemUpIHsNCisJCQlpZiAobWFfaXNf bGVhZih0eXBlKSkgew0KKwkJCQlmb3VuZCA9IHRydWU7DQorCQkJCWdvdG8gZG9uZTsNCisJCQl9 DQorCQkJaWYgKG1hcy0+aW5kZXggPD0gcGl2b3QpIHsNCisJCQkJbWFzLT5ub2RlID0gbWFzX3Ns b3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCQkJbWFzLT5taW4gPSBtaW47DQorCQkJCW1hcy0+ bWF4ID0gcGl2b3Q7DQorCQkJCW9mZnNldCA9IDA7DQorCQkJCXR5cGUgPSBtdGVfbm9kZV90eXBl KG1hcy0+bm9kZSk7DQorCQkJCWNvdW50ID0gbXRfc2xvdHNbdHlwZV07DQorCQkJCWJyZWFrOw0K KwkJCX0NCisJCX0NCituZXh0X3Nsb3Q6DQorCQltaW4gPSBwaXZvdCArIDE7DQorCQlpZiAobWFz LT5sYXN0IDwgbWluKSB7DQorCQkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKwkJCXJldHVy biB0cnVlOw0KKwkJfQ0KKwl9DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJ Zm91bmQgPSB0cnVlOw0KK2RvbmU6DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwlyZXR1cm4g Zm91bmQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc193YWxrKCkgLSBTZWFyY2ggZm9yIEBtYXMtPmlu ZGV4IGluIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIG1h cy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxsIGJlIHNldCB0byB0aGUgcmFuZ2UgaWYgdGhlcmUg aXMgYSB2YWx1ZS4gIElmDQorICogbWFzLT5ub2RlIGlzIE1BU19OT05FLCByZXNldCB0byBNQVNf U1RBUlQuDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSBhdCB0aGUgbG9jYXRpb24gb3IgJU5V TEwuDQorICovDQordm9pZCAqbWFzX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl2 b2lkICplbnRyeTsNCisNCityZXRyeToNCisJZW50cnkgPSBtYXNfc3RhdGVfd2FsayhtYXMpOw0K KwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlpZiAobWFzX2lz X3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCQltYXMtPmxhc3QgPSAwOw0K KwkJfSBlbHNlIHsNCisJCQltYXMtPmluZGV4ID0gMTsNCisJCQltYXMtPmxhc3QgPSBVTE9OR19N QVg7DQorCQl9DQorCQlyZXR1cm4gZW50cnk7DQorCX0NCisNCisJaWYgKG1hc19pc19ub25lKG1h cykpIHsNCisJCW1hcy0+aW5kZXggPSAwOw0KKwkJbWFzLT5sYXN0ID0gVUxPTkdfTUFYOw0KKwl9 DQorDQorCXJldHVybiBlbnRyeTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXdp bmRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsN CisNCisJZG8gew0KKwkJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJCQlzbG90ID0g bWFzLT5vZmZzZXQ7DQorCQkJaWYgKCFzbG90KQ0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQl9IGVs c2Ugew0KKwkJCW1hc19hc2NlbmQobWFzKTsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQl9 DQorCX0gd2hpbGUgKCFzbG90KTsNCisNCisJbWFzLT5vZmZzZXQgPSAtLXNsb3Q7DQorCXJldHVy biB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19za2lwX25vZGUoKSAtIEludGVybmFsIGZ1bmN0 aW9uLiAgU2tpcCBvdmVyIGEgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICoN CisgKiBSZXR1cm46IHRydWUgaWYgdGhlcmUgaXMgYW5vdGhlciBub2RlLCBmYWxzZSBvdGhlcndp c2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19za2lwX25vZGUoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3QsIHNsb3RfY291bnQ7DQorCXVuc2ln bmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKw0KKwltdCA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJc2xvdF9jb3VudCA9IG10X3Nsb3RzW210XSAtIDE7DQor CWRvIHsNCisJCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQkJc2xvdCA9IG1hcy0+ b2Zmc2V0Ow0KKwkJCWlmIChzbG90ID4gc2xvdF9jb3VudCkgew0KKwkJCQltYXNfc2V0X2Vyciht YXMsIC1FQlVTWSk7DQorCQkJCXJldHVybiBmYWxzZTsNCisJCQl9DQorCQl9IGVsc2Ugew0KKwkJ CW1hc19hc2NlbmQobWFzKTsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQkJbXQgPSBtdGVf bm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJc2xvdF9jb3VudCA9IG10X3Nsb3RzW210XSAtIDE7 DQorCQl9DQorCX0gd2hpbGUgKHNsb3QgPiBzbG90X2NvdW50KTsNCisNCisJbWFzLT5vZmZzZXQg PSArK3Nsb3Q7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgbXQpOw0KKwlpZiAo c2xvdCA+IDApDQorCQltYXMtPm1pbiA9IHBpdm90c1tzbG90IC0gMV0gKyAxOw0KKw0KKwlpZiAo c2xvdCA8PSBzbG90X2NvdW50KQ0KKwkJbWFzLT5tYXggPSBwaXZvdHNbc2xvdF07DQorDQorCXJl dHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19hd2FsaygpIC0gQWxsb2NhdGlvbiB3YWxr LiAgU2VhcmNoIGZyb20gbG93IGFkZHJlc3MgdG8gaGlnaCwgZm9yIGEgZ2FwIG9mDQorICogQHNp emUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhl IGdhcCByZXF1aXJlZA0KKyAqDQorICogU2VhcmNoIGJldHdlZW4gQG1hcy0+aW5kZXggYW5kIEBt YXMtPmxhc3QgZm9yIGEgZ2FwIG9mIEBzaXplLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfYXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQor CXN0cnVjdCBtYXBsZV9lbm9kZSAqbGFzdCA9IE5VTEw7DQorDQorCS8qDQorCSAqIFRoZXJlIGFy ZSA0IG9wdGlvbnM6DQorCSAqIGdvIHRvIGNoaWxkIChkZXNjZW5kKQ0KKwkgKiBnbyBiYWNrIHRv IHBhcmVudCAoYXNjZW5kKQ0KKwkgKiBubyBnYXAgZm91bmQuIChyZXR1cm4sIHNsb3QgPT0gTUFQ TEVfTk9ERV9TTE9UUykNCisJICogZm91bmQgdGhlIGdhcC4gKHJldHVybiwgc2xvdCAhPSBNQVBM RV9OT0RFX1NMT1RTKQ0KKwkgKi8NCisJd2hpbGUgKCFtYXNfaXNfZXJyKG1hcykgJiYgIW1hc19h bm9kZV9kZXNjZW5kKG1hcywgc2l6ZSkpIHsNCisJCWlmIChsYXN0ID09IG1hcy0+bm9kZSkNCisJ CQltYXNfc2tpcF9ub2RlKG1hcyk7DQorCQllbHNlDQorCQkJbGFzdCA9IG1hcy0+bm9kZTsNCisJ fQ0KK30NCisNCisvKg0KKyAqIG1hc19maWxsX2dhcCgpIC0gRmlsbCBhIGxvY2F0ZWQgZ2FwIHdp dGggQGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhlIHZh bHVlIHRvIHN0b3JlDQorICogQHNsb3Q6IFRoZSBvZmZzZXQgaW50byB0aGUgbm9kZSB0byBzdG9y ZSB0aGUgQGVudHJ5DQorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBlbnRyeQ0KKyAqIEBpbmRl eDogVGhlIHN0YXJ0IGxvY2F0aW9uDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19maWxs X2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksDQorCQl1bnNpZ25lZCBjaGFy IHNsb3QsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwlN QV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkpOw0KKwl1bnNpZ25lZCBjaGFyIHBzbG90ID0g bXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbW4gPSBt YXMtPm5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBtYXBsZV90eXBlIHB0 eXBlOw0KKwkvKg0KKwkgKiBtYXMtPmluZGV4IGlzIHRoZSBzdGFydCBhZGRyZXNzIGZvciB0aGUg c2VhcmNoDQorCSAqICB3aGljaCBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZC4NCisJICogbWFzLT5s YXN0IGlzIHRoZSBlbmQgYWRkcmVzcyBmb3IgdGhlIHNlYXJjaA0KKwkgKi8NCisNCisJKmluZGV4 ID0gbWFzLT5pbmRleDsNCisJbWFzLT5sYXN0ID0gbWFzLT5pbmRleCArIHNpemUgLSAxOw0KKw0K KwkvKg0KKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHVzaW5nIG1hcy0+bWF4IGFuZCBtYXMtPm1p biB0byBjb3JyZWN0bHkNCisJICogY2FsY3VsYXRlIHRoZSBpbmRleCBhbmQgbGFzdCB3aWxsIGNh dXNlIGFuIGlzc3VlIGluIHRoZSBnYXANCisJICogY2FsY3VsYXRpb24sIHNvIGZpeCB0aGUgbWFf c3RhdGUgaGVyZQ0KKwkgKi8NCisJbWFzX2FzY2VuZChtYXMpOw0KKwlwdHlwZSA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCBwdHlw ZSk7DQorCW1hcy0+bWF4ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIHBzbG90LCBwdHlw ZSk7DQorCW1hcy0+bWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBwc2xvdCk7DQorCW1h cy0+bm9kZSA9IG1uOw0KKwltYXMtPm9mZnNldCA9IHNsb3Q7DQorCW1hc193cl9zdG9yZV9lbnRy eSgmd3JfbWFzKTsNCit9DQorDQorLyoNCisgKiBtYXNfc3BhcnNlX2FyZWEoKSAtIEludGVybmFs IGZ1bmN0aW9uLiAgUmV0dXJuIHVwcGVyIG9yIGxvd2VyIGxpbWl0IHdoZW4NCisgKiBzZWFyY2hp bmcgZm9yIGEgZ2FwIGluIGFuIGVtcHR5IHRyZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQG1pbjogdGhlIG1pbmltdW0gcmFuZ2UNCisgKiBAbWF4OiBUaGUgbWF4aW11bSByYW5n ZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgZ2FwDQorICogQGZ3ZDogU2VhcmNoaW5nIGZv cndhcmQgb3IgYmFjaw0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc3BhcnNlX2FyZWEo c3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplLCBib29sIGZ3ZCkNCit7DQorCXVuc2lnbmVkIGxv bmcgc3RhcnQgPSAwOw0KKw0KKwlpZiAoIXVubGlrZWx5KG1hc19pc19ub25lKG1hcykpKQ0KKwkJ c3RhcnQrKzsNCisJLyogbWFzX2lzX3B0ciAqLw0KKw0KKwlpZiAoc3RhcnQgPCBtaW4pDQorCQlz dGFydCA9IG1pbjsNCisNCisJaWYgKGZ3ZCkgew0KKwkJbWFzLT5pbmRleCA9IHN0YXJ0Ow0KKwkJ bWFzLT5sYXN0ID0gc3RhcnQgKyBzaXplIC0gMTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwltYXMt PmluZGV4ID0gbWF4Ow0KK30NCisNCisvKg0KKyAqIG1hc19lbXB0eV9hcmVhKCkgLSBHZXQgdGhl IGxvd2VzdCBhZGRyZXNzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBpcw0KKyAqIHN1ZmZpY2llbnQg Zm9yIHRoZSBzaXplIHJlcXVlc3RlZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA bWluOiBUaGUgbG93ZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBtYXg6IFRoZSBoaWdoZXN0 IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBuZWVkZWQNCisgKi8NCitp bnQgbWFzX2VtcHR5X2FyZWEoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWlu LA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXVuc2ln bmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCWVudW0gbWFwbGVf dHlwZSBtdDsNCisNCisJaWYgKG1hc19pc19zdGFydChtYXMpKSB7DQorCQltYXNfc3RhcnQobWFz KTsNCisJfSBlbHNlIGlmIChtYXMtPm9mZnNldCA+PSAyKSB7DQorCQltYXMtPm9mZnNldCAtPSAy Ow0KKwl9IGVsc2UgaWYgKCFtYXNfc2tpcF9ub2RlKG1hcykpIHsNCisJCXJldHVybiAtRUJVU1k7 DQorCX0NCisNCisJLyogRW1wdHkgc2V0ICovDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1h c19pc19wdHIobWFzKSkgew0KKwkJbWFzX3NwYXJzZV9hcmVhKG1hcywgbWluLCBtYXgsIHNpemUs IHRydWUpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJLyogVGhlIHN0YXJ0IG9mIHRoZSB3aW5k b3cgY2FuIG9ubHkgYmUgd2l0aGluIHRoZXNlIHZhbHVlcyAqLw0KKwltYXMtPmluZGV4ID0gbWlu Ow0KKwltYXMtPmxhc3QgPSBtYXg7DQorCW1hc19hd2FsayhtYXMsIHNpemUpOw0KKw0KKwlpZiAo dW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsN CisNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWlmICh1bmxpa2VseShvZmZzZXQgPT0gTUFQ TEVfTk9ERV9TTE9UUykpDQorCQlyZXR1cm4gLUVCVVNZOw0KKw0KKwltdCA9IG10ZV9ub2RlX3R5 cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCBtdCk7DQor CWlmIChvZmZzZXQpDQorCQltYXMtPm1pbiA9IHBpdm90c1tvZmZzZXQgLSAxXSArIDE7DQorDQor CWlmIChvZmZzZXQgPCBtdF9waXZvdHNbbXRdKQ0KKwkJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0 XTsNCisNCisJaWYgKG1hcy0+aW5kZXggPCBtYXMtPm1pbikNCisJCW1hcy0+aW5kZXggPSBtYXMt Pm1pbjsNCisNCisJbWFzLT5sYXN0ID0gbWFzLT5pbmRleCArIHNpemUgLSAxOw0KKwlyZXR1cm4g MDsNCit9DQorDQorLyoNCisgKiBtYXNfZW1wdHlfYXJlYV9yZXYoKSAtIEdldCB0aGUgaGlnaGVz dCBhZGRyZXNzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBpcw0KKyAqIHN1ZmZpY2llbnQgZm9yIHRo ZSBzaXplIHJlcXVlc3RlZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiBU aGUgbG93ZXN0IHZhbHVlIG9mIHRoZSByYW5nZQ0KKyAqIEBtYXg6IFRoZSBoaWdoZXN0IHZhbHVl IG9mIHRoZSByYW5nZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBuZWVkZWQNCisgKi8NCitpbnQgbWFz X2VtcHR5X2FyZWFfcmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwN CisJCXVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKwlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKmxhc3QgPSBtYXMtPm5vZGU7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFz KSkgew0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCQltYXMtPm9mZnNldCA9IG1hc19kYXRhX2VuZCht YXMpOw0KKwl9IGVsc2UgaWYgKG1hcy0+b2Zmc2V0ID49IDIpIHsNCisJCW1hcy0+b2Zmc2V0IC09 IDI7DQorCX0gZWxzZSBpZiAoIW1hc19yZXdpbmRfbm9kZShtYXMpKSB7DQorCQlyZXR1cm4gLUVC VVNZOw0KKwl9DQorDQorCS8qIEVtcHR5IHNldC4gKi8NCisJaWYgKG1hc19pc19ub25lKG1hcykg fHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNfc3BhcnNlX2FyZWEobWFzLCBtaW4sIG1heCwg c2l6ZSwgZmFsc2UpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisNCisJLyogVGhlIHN0YXJ0IG9mIHRo ZSB3aW5kb3cgY2FuIG9ubHkgYmUgd2l0aGluIHRoZXNlIHZhbHVlcy4gKi8NCisJbWFzLT5pbmRl eCA9IG1pbjsNCisJbWFzLT5sYXN0ID0gbWF4Ow0KKw0KKwl3aGlsZSAoIW1hc19yZXZfYXdhbGso bWFzLCBzaXplKSkgew0KKwkJaWYgKGxhc3QgPT0gbWFzLT5ub2RlKSB7DQorCQkJaWYgKCFtYXNf cmV3aW5kX25vZGUobWFzKSkNCisJCQkJcmV0dXJuIC1FQlVTWTsNCisJCX0gZWxzZSB7DQorCQkJ bGFzdCA9IG1hcy0+bm9kZTsNCisJCX0NCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzLT5vZmZz ZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykpDQorCQlyZXR1cm4gLUVCVVNZOw0KKw0KKwkvKg0KKwkg KiBtYXNfcmV2X2F3YWxrKCkgaGFzIHNldCBtYXMtPm1pbiBhbmQgbWFzLT5tYXggdG8gdGhlIGdh cCB2YWx1ZXMuICBJZg0KKwkgKiB0aGUgbWF4aW11bSBpcyBvdXRzaWRlIHRoZSB3aW5kb3cgd2Ug YXJlIHNlYXJjaGluZywgdGhlbiB1c2UgdGhlIGxhc3QNCisJICogbG9jYXRpb24gaW4gdGhlIHNl YXJjaC4NCisJICogbWFzLT5tYXggYW5kIG1hcy0+bWluIGlzIHRoZSByYW5nZSBvZiB0aGUgZ2Fw Lg0KKwkgKiBtYXMtPmluZGV4IGFuZCBtYXMtPmxhc3QgYXJlIGN1cnJlbnRseSBzZXQgdG8gdGhl IHNlYXJjaCByYW5nZS4NCisJICovDQorDQorCS8qIFRyaW0gdGhlIHVwcGVyIGxpbWl0IHRvIHRo ZSBtYXguICovDQorCWlmIChtYXMtPm1heCA8PSBtYXMtPmxhc3QpDQorCQltYXMtPmxhc3QgPSBt YXMtPm1heDsNCisNCisJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCAtIHNpemUgKyAxOw0KKwlyZXR1 cm4gMDsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbWFzX2FsbG9jKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9u ZyAqaW5kZXgpDQorew0KKwl1bnNpZ25lZCBsb25nIG1pbjsNCisNCisJbWFzX3N0YXJ0KG1hcyk7 DQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3Jv b3RfZXhwYW5kKG1hcywgZW50cnkpOw0KKwkJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1 cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCQlpZiAoIW1hcy0+aW5kZXgpDQorCQkJcmV0dXJu IG10ZV9waXZvdChtYXMtPm5vZGUsIDApOw0KKwkJcmV0dXJuIG10ZV9waXZvdChtYXMtPm5vZGUs IDEpOw0KKwl9DQorDQorCS8qIE11c3QgYmUgd2Fsa2luZyBhIHRyZWUuICovDQorCW1hc19hd2Fs ayhtYXMsIHNpemUpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIHhhX2Vyciht YXMtPm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJ CWdvdG8gbm9fZ2FwOw0KKw0KKwkvKg0KKwkgKiBBdCB0aGlzIHBvaW50LCBtYXMtPm5vZGUgcG9p bnRzIHRvIHRoZSByaWdodCBub2RlIGFuZCB3ZSBoYXZlIGFuDQorCSAqIG9mZnNldCB0aGF0IGhh cyBhIHN1ZmZpY2llbnQgZ2FwLg0KKwkgKi8NCisJbWluID0gbWFzLT5taW47DQorCWlmIChtYXMt Pm9mZnNldCkNCisJCW1pbiA9IG10ZV9waXZvdChtYXMtPm5vZGUsIG1hcy0+b2Zmc2V0IC0gMSkg KyAxOw0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCW1hcy0+aW5kZXggPSBtaW47DQor DQorCW1hc19maWxsX2dhcChtYXMsIGVudHJ5LCBtYXMtPm9mZnNldCwgc2l6ZSwgaW5kZXgpOw0K KwlyZXR1cm4gMDsNCisNCitub19nYXA6DQorCXJldHVybiAtRUJVU1k7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgaW50IG1hc19yZXZfYWxsb2Moc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgbWluLA0KKwkJCQl1bnNpZ25lZCBsb25nIG1heCwgdm9pZCAqZW50cnksDQorCQkJCXVu c2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyAqaW5kZXgpDQorew0KKwlpbnQgcmV0ID0g MDsNCisNCisJcmV0ID0gbWFzX2VtcHR5X2FyZWFfcmV2KG1hcywgbWluLCBtYXgsIHNpemUpOw0K KwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJ CXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisNCisJaWYgKG1hcy0+b2Zmc2V0ID09IE1BUExF X05PREVfU0xPVFMpDQorCQlnb3RvIG5vX2dhcDsNCisNCisJbWFzX2ZpbGxfZ2FwKG1hcywgZW50 cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRleCk7DQorCXJldHVybiAwOw0KKw0KK25vX2dhcDoN CisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQorLyoNCisgKiBtYXNfZGVhZF9sZWF2ZXMoKSAtIE1h cmsgYWxsIGxlYXZlcyBvZiBhIG5vZGUgYXMgZGVhZC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKiBAc2xvdHM6IFBvaW50ZXIgdG8gdGhlIHNsb3QgYXJyYXkNCisgKg0KKyAqIE11c3Qg aG9sZCB0aGUgd3JpdGUgbG9jay4NCisgKg0KKyAqIFJldHVybjogVGhlIG51bWJlciBvZiBsZWF2 ZXMgbWFya2VkIGFzIGRlYWQuDQorICovDQorc3RhdGljIGlubGluZQ0KK3Vuc2lnbmVkIGNoYXIg bWFzX2RlYWRfbGVhdmVzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7 DQorCXZvaWQgKmVudHJ5Ow0KKwlpbnQgb2Zmc2V0Ow0KKw0KKwlmb3IgKG9mZnNldCA9IDA7IG9m ZnNldCA8IG10X3Nsb3RfY291bnQobWFzLT5ub2RlKTsgb2Zmc2V0KyspIHsNCisJCWVudHJ5ID0g bWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQl0eXBlID0gbXRlX25vZGVf dHlwZShlbnRyeSk7DQorCQlub2RlID0gbXRlX3RvX25vZGUoZW50cnkpOw0KKwkJLyogVXNlIGJv dGggbm9kZSBhbmQgdHlwZSB0byBjYXRjaCBMRSAmIEJFIG1ldGFkYXRhICovDQorCQlpZiAoIW5v ZGUgfHwgIXR5cGUpDQorCQkJYnJlYWs7DQorDQorCQltdGVfc2V0X25vZGVfZGVhZChlbnRyeSk7 DQorCQlzbXBfd21iKCk7DQorCQlub2RlLT50eXBlID0gdHlwZTsNCisJCXJjdV9hc3NpZ25fcG9p bnRlcihzbG90c1tvZmZzZXRdLCBub2RlKTsNCisJfQ0KKw0KKwlyZXR1cm4gb2Zmc2V0Ow0KK30N CisNCitzdGF0aWMgdm9pZCAqKm1hc19kZWFkX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVu c2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpuZXh0 Ow0KKwl2b2lkICoqc2xvdHMgPSBOVUxMOw0KKw0KKwluZXh0ID0gbWFzX21uKG1hcyk7DQorCWRv IHsNCisJCW1hcy0+bm9kZSA9IG1hX2Vub2RlX3B0cihuZXh0KTsNCisJCW5vZGUgPSBtYXNfbW4o bWFzKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCQluZXh0ID0g bWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlvZmZzZXQgPSAwOw0KKwl9 IHdoaWxlICghbWFfaXNfbGVhZihuZXh0LT50eXBlKSk7DQorDQorCXJldHVybiBzbG90czsNCit9 DQorDQorc3RhdGljIHZvaWQgbXRfZnJlZV93YWxrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7 DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsICpzdGFy dDsNCisJc3RydWN0IG1hcGxlX3RyZWUgbXQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwll bnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJTUFfU1RBVEUobWFzLCAmbXQsIDAsIDApOw0KKw0KKwlu b2RlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3UpOw0KKw0KKwlp ZiAobWFfaXNfbGVhZihub2RlLT50eXBlKSkNCisJCWdvdG8gZnJlZV9sZWFmOw0KKw0KKwltdF9p bml0X2ZsYWdzKCZtdCwgbm9kZS0+bWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsNCisJc3Rh cnQgPSBub2RlOw0KKwltYXMubm9kZSA9IG10X21rX25vZGUobm9kZSwgbm9kZS0+dHlwZSk7DQor CXNsb3RzID0gbWFzX2RlYWRfd2FsaygmbWFzLCAwKTsNCisJbm9kZSA9IG1hc19tbigmbWFzKTsN CisJZG8gew0KKwkJbXRfZnJlZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlvZmZz ZXQgPSBub2RlLT5wYXJlbnRfc2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9wYXJl bnQ7DQorCQlpZiAobWFzX21uKCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90c19m cmVlOw0KKw0KKwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMgPSBt YV9zbG90cyhtdGVfdG9fbm9kZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZzZXQgPCBt dF9zbG90c1t0eXBlXSkgJiYgKHNsb3RzW29mZnNldF0pKQ0KKwkJCXNsb3RzID0gbWFzX2RlYWRf d2FsaygmbWFzLCBvZmZzZXQpOw0KKw0KKwkJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJfSB3aGls ZSAoKG5vZGUgIT0gc3RhcnQpIHx8IChub2RlLT5zbG90X2xlbiA8IG9mZnNldCkpOw0KKw0KKwlz bG90cyA9IG1hX3Nsb3RzKG5vZGUsIG5vZGUtPnR5cGUpOw0KKwltdF9mcmVlX2J1bGsobm9kZS0+ c2xvdF9sZW4sIHNsb3RzKTsNCisNCitzdGFydF9zbG90c19mcmVlOg0KK2ZyZWVfbGVhZjoNCisJ bXRfZnJlZV9yY3UoJm5vZGUtPnJjdSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Jj dSAqKm1hc19kZXN0cm95X2Rlc2NlbmQoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJc3RydWN0 IG1hcGxlX2Vub2RlICpwcmV2LCB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5leHQgPSBtYXMtPm5vZGU7 DQorCXZvaWQgX19yY3UgKipzbG90cyA9IE5VTEw7DQorDQorCWRvIHsNCisJCW1hcy0+bm9kZSA9 IG5leHQ7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUs IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKSk7DQorCQluZXh0ID0gbWFzX3Nsb3RfbG9ja2VkKG1h cywgc2xvdHMsIDApOw0KKwkJbXRlX3NldF9ub2RlX2RlYWQobWFzLT5ub2RlKTsNCisJCW5vZGUt PnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlub2RlLT5waXZfcGFyZW50ID0g cHJldjsNCisJCW5vZGUtPnBhcmVudF9zbG90ID0gb2Zmc2V0Ow0KKwkJb2Zmc2V0ID0gMDsNCisJ CXByZXYgPSBtYXMtPm5vZGU7DQorCX0gd2hpbGUgKCFtdGVfaXNfbGVhZihuZXh0KSk7DQorCXJl dHVybiBzbG90czsNCit9DQorDQorc3RhdGljIHZvaWQgbXRfZGVzdHJveV93YWxrKHN0cnVjdCBt YXBsZV9lbm9kZSAqZW5vZGUsIHVuc2lnbmVkIGNoYXIgbWFfZmxhZ3MsDQorCQkJICAgIGJvb2wg ZnJlZSkNCit7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5v ZGUgPSBtdGVfdG9fbm9kZShlbm9kZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqc3RhcnQ7DQor CXN0cnVjdCBtYXBsZV90cmVlIG10Ow0KKw0KKwlNQV9TVEFURShtYXMsICZtdCwgMCwgMCk7DQor DQorCWlmIChtdGVfaXNfbGVhZihlbm9kZSkpDQorCQlnb3RvIGZyZWVfbGVhZjsNCisNCisJbXRf aW5pdF9mbGFncygmbXQsIG1hX2ZsYWdzKTsNCisJbWFzX2xvY2soJm1hcyk7DQorDQorCW1hcy5u b2RlID0gc3RhcnQgPSBlbm9kZTsNCisJc2xvdHMgPSBtYXNfZGVzdHJveV9kZXNjZW5kKCZtYXMs IHN0YXJ0LCAwKTsNCisJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJZG8gew0KKwkJZW51bSBtYXBs ZV90eXBlIHR5cGU7DQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJCW5vZGUtPnNsb3Rf bGVuID0gbWFzX2RlYWRfbGVhdmVzKCZtYXMsIHNsb3RzKTsNCisJCWlmIChmcmVlKQ0KKwkJCW10 X2ZyZWVfYnVsayhub2RlLT5zbG90X2xlbiwgc2xvdHMpOw0KKwkJb2Zmc2V0ID0gbm9kZS0+cGFy ZW50X3Nsb3QgKyAxOw0KKwkJbWFzLm5vZGUgPSBub2RlLT5waXZfcGFyZW50Ow0KKwkJaWYgKG1h c19tbigmbWFzKSA9PSBub2RlKQ0KKwkJCWdvdG8gc3RhcnRfc2xvdHNfZnJlZTsNCisJCXR5cGUg PSBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25v ZGUobWFzLm5vZGUpLCB0eXBlKTsNCisJCWlmICgob2Zmc2V0IDwgbXRfc2xvdHNbdHlwZV0pICYm IChzbG90c1tvZmZzZXRdKSkgew0KKwkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGFyZW50ID0gbWFz Lm5vZGU7DQorDQorCQkJbWFzLm5vZGUgPSBzbG90c1tvZmZzZXRdOw0KKwkJCXNsb3RzID0gbWFz X2Rlc3Ryb3lfZGVzY2VuZCgmbWFzLCBwYXJlbnQsIG9mZnNldCk7DQorCQl9DQorCQlub2RlID0g bWFzX21uKCZtYXMpOw0KKwl9IHdoaWxlIChzdGFydCAhPSBtYXMubm9kZSk7DQorDQorCW5vZGUg PSBtYXNfbW4oJm1hcyk7DQorCW5vZGUtPnNsb3RfbGVuID0gbWFzX2RlYWRfbGVhdmVzKCZtYXMs IHNsb3RzKTsNCisJaWYgKGZyZWUpDQorCQltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNs b3RzKTsNCisNCitzdGFydF9zbG90c19mcmVlOg0KKwltYXNfdW5sb2NrKCZtYXMpOw0KKw0KK2Zy ZWVfbGVhZjoNCisJaWYgKGZyZWUpDQorCQltdF9mcmVlX3JjdSgmbm9kZS0+cmN1KTsNCit9DQor DQorLyoNCisgKiBtdGVfZGVzdHJveV93YWxrKCkgLSBGcmVlIGEgdHJlZSBvciBzdWItdHJlZS4N CisgKiBAZW5vZGUgLSB0aGUgZW5jb2RlZCBtYXBsZSBub2RlIChtYXBsZV9lbm9kZSkgdG8gc3Rh cnQNCisgKiBAbW4gLSB0aGUgdHJlZSB0byBmcmVlIC0gbmVlZGVkIGZvciBub2RlIHR5cGVzLg0K KyAqDQorICogTXVzdCBob2xkIHRoZSB3cml0ZSBsb2NrLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtdGVfZGVzdHJveV93YWxrKHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUsDQorCQkJCSAg ICBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9 IG10ZV90b19ub2RlKGVub2RlKTsNCisNCisJaWYgKG10X2luX3JjdShtdCkpIHsNCisJCW10X2Rl c3Ryb3lfd2Fsayhlbm9kZSwgbXQtPm1hX2ZsYWdzLCBmYWxzZSk7DQorCQljYWxsX3JjdSgmbm9k ZS0+cmN1LCBtdF9mcmVlX3dhbGspOw0KKwl9IGVsc2Ugew0KKwkJbXRfZGVzdHJveV93YWxrKGVu b2RlLCBtdC0+bWFfZmxhZ3MsIHRydWUpOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc193 cl9zdG9yZV9zZXR1cChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCWlmICghbWFz X2lzX3N0YXJ0KHdyX21hcy0+bWFzKSkgew0KKwkJaWYgKG1hc19pc19ub25lKHdyX21hcy0+bWFz KSkgew0KKwkJCW1hc19yZXNldCh3cl9tYXMtPm1hcyk7DQorCQl9IGVsc2Ugew0KKwkJCXdyX21h cy0+cl9tYXggPSB3cl9tYXMtPm1hcy0+bWF4Ow0KKwkJCXdyX21hcy0+dHlwZSA9IG10ZV9ub2Rl X3R5cGUod3JfbWFzLT5tYXMtPm5vZGUpOw0KKwkJCWlmIChtYXNfaXNfc3Bhbl93cih3cl9tYXMp KQ0KKwkJCQltYXNfcmVzZXQod3JfbWFzLT5tYXMpOw0KKwkJfQ0KKwl9DQorDQorfQ0KKw0KKy8q IEludGVyZmFjZSAqLw0KKw0KKy8qKg0KKyAqIG1hc19zdG9yZSgpIC0gU3RvcmUgYW4gQGVudHJ5 Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBz dG9yZS4NCisgKg0KKyAqIFRoZSBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCBpcyB1c2VkIHRv IHNldCB0aGUgcmFuZ2UgZm9yIHRoZSBAZW50cnkuDQorICogTm90ZTogVGhlIEBtYXMgc2hvdWxk IGhhdmUgcHJlLWFsbG9jYXRlZCBlbnRyaWVzIHRvIGVuc3VyZSB0aGVyZSBpcyBtZW1vcnkgdG8N CisgKiBzdG9yZSB0aGUgZW50cnkuICBQbGVhc2Ugc2VlIG1hc19leHBlY3RlZF9lbnRyaWVzKCkv bWFzX2Rlc3Ryb3koKSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqDQorICogUmV0dXJuOiB0aGUgZmly c3QgZW50cnkgYmV0d2VlbiBtYXMtPmluZGV4IGFuZCBtYXMtPmxhc3Qgb3IgJU5VTEwuDQorICov DQordm9pZCAqbWFzX3N0b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7 DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBlbnRyeSk7DQorDQorCXRyYWNlX21hX3dyaXRl KF9fZnVuY19fLCBtYXMsIDAsIGVudHJ5KTsNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RS RUUNCisJaWYgKG1hcy0+aW5kZXggPiBtYXMtPmxhc3QpDQorCQlwcmludGsoIkVycm9yICVsdSA+ ICVsdSAlcFxuIiwgbWFzLT5pbmRleCwgbWFzLT5sYXN0LCBlbnRyeSk7DQorCU1UX0JVR19PTiht YXMtPnRyZWUsIG1hcy0+aW5kZXggPiBtYXMtPmxhc3QpOw0KKwlpZiAobWFzLT5pbmRleCA+IG1h cy0+bGFzdCkgew0KKwkJbWFzX3NldF9lcnIobWFzLCAtRUlOVkFMKTsNCisJCXJldHVybiBOVUxM Ow0KKwl9DQorDQorI2VuZGlmDQorDQorCS8qDQorCSAqIFN0b3JpbmcgaXMgdGhlIHNhbWUgb3Bl cmF0aW9uIGFzIGluc2VydCB3aXRoIHRoZSBhZGRlZCBjYXZlYXQgdGhhdCBpdA0KKwkgKiBjYW4g b3ZlcndyaXRlIGVudHJpZXMuICBBbHRob3VnaCB0aGlzIHNlZW1zIHNpbXBsZSBlbm91Z2gsIG9u ZSBtYXkNCisJICogd2FudCB0byBleGFtaW5lIHdoYXQgaGFwcGVucyBpZiBhIHNpbmdsZSBzdG9y ZSBvcGVyYXRpb24gd2FzIHRvDQorCSAqIG92ZXJ3cml0ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGhp biBhIHNlbGYtYmFsYW5jaW5nIEItVHJlZS4NCisJICovDQorCW1hc193cl9zdG9yZV9zZXR1cCgm d3JfbWFzKTsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlyZXR1cm4gd3JfbWFz LmNvbnRlbnQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19zdG9yZV9nZnAoKSAtIFN0b3JlIGEgdmFs dWUgaW50byB0aGUgdHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6 IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBh bGxvY2F0aW9ucyBpZiBuZWNlc3NhcnkuDQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywg LUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVlc3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0K KyAqIGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbWFzX3N0b3JlX2dmcChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdmcCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21h cywgbWFzLCBlbnRyeSk7DQorDQorCW1hc193cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJdHJh Y2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KK3JldHJ5Og0KKwltYXNfd3Jf c3RvcmVfZW50cnkoJndyX21hcyk7DQorCWlmICh1bmxpa2VseShtYXNfbm9tZW0obWFzLCBnZnAp KSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0K KwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoN CisgKiBtYXNfZXhwZWN0ZWRfZW50cmllcygpIC0gU2V0IHRoZSBleHBlY3RlZCBudW1iZXIgb2Yg ZW50cmllcyB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQG5yX2VudHJpZXM6IFRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZW50cmllcy4NCisgKg0K KyAqIFRoaXMgd2lsbCBhdHRlbXB0IHRvIHByZS1hbGxvY2F0ZSBlbm91Z2ggbm9kZXMgdG8gc3Rv cmUgdGhlIGV4cGVjdGVkIG51bWJlcg0KKyAqIG9mIGVudHJpZXMuICBUaGUgYWxsb2NhdGlvbnMg d2lsbCBvY2N1ciB1c2luZyB0aGUgYnVsayBhbGxvY2F0b3IgaW50ZXJmYWNlDQorICogZm9yIHNw ZWVkLiAgUGxlYXNlIGNhbGwgbWFzX2Rlc3Ryb3koKSBvbiB0aGUgQG1hcyBhZnRlciBpbnNlcnRp bmcgdGhlIGVudHJpZXMNCisgKiB0byBlbnN1cmUgYW55IHVudXNlZCBub2RlcyBhcmUgZnJlZWQu DQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBpZiBtZW1vcnkgY291bGQg bm90IGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbWFzX2V4cGVjdGVkX2VudHJpZXMoc3RydWN0 IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbnJfZW50cmllcykNCit7DQorCWludCBub25s ZWFmX2NhcCA9IE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMjsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICplbm9kZSA9IG1hcy0+bm9kZTsNCisJaW50IG5yX25vZGVzOw0KKwlpbnQgcmV0Ow0KKw0KKwkv Kg0KKwkgKiBTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSBhIHRyZWUgdG8g YSBuZXcgdHJlZSwgc3VjaCBhcw0KKwkgKiBmb3JraW5nIGEgcHJvY2VzcyBhbmQgZHVwbGljYXRp bmcgdGhlIFZNQXMgZnJvbSBvbmUgdHJlZSB0byBhIG5ldw0KKwkgKiB0cmVlLiAgV2hlbiBzdWNo IGEgc2l0dWF0aW9uIGFyaXNlcywgaXQgaXMga25vd24gdGhhdCB0aGUgbmV3IHRyZWUgaXMNCisJ ICogbm90IGdvaW5nIHRvIGJlIHVzZWQgdW50aWwgdGhlIGVudGlyZSB0cmVlIGlzIHBvcHVsYXRl ZC4gIEZvcg0KKwkgKiBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBpcyBiZXN0IHRvIHVzZSBhIGJ1 bGsgbG9hZCB3aXRoIFJDVSBkaXNhYmxlZC4NCisJICogVGhpcyBhbGxvd3MgZm9yIG9wdGltaXN0 aWMgc3BsaXR0aW5nIHRoYXQgZmF2b3VycyB0aGUgbGVmdCBhbmQgcmV1c2UNCisJICogb2Ygbm9k ZXMgZHVyaW5nIHRoZSBvcGVyYXRpb24uDQorCSAqLw0KKw0KKwkvKiBPcHRpbWl6ZSBzcGxpdHRp bmcgZm9yIGJ1bGsgaW5zZXJ0IGluLW9yZGVyICovDQorCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NU QVRFX0JVTEs7DQorDQorCS8qDQorCSAqIEF2b2lkIG92ZXJmbG93LCBhc3N1bWUgYSBnYXAgYmV0 d2VlbiBlYWNoIGVudHJ5IGFuZCBhIHRyYWlsaW5nIG51bGwuDQorCSAqIElmIHRoaXMgaXMgd3Jv bmcsIGl0IGp1c3QgbWVhbnMgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGR1cmluZw0KKwkgKiBpbnNl cnRpb24gb2YgZW50cmllcy4NCisJICovDQorCW5yX25vZGVzID0gbWF4KG5yX2VudHJpZXMsIG5y X2VudHJpZXMgKiAyICsgMSk7DQorDQorCWlmICghbXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJ CW5vbmxlYWZfY2FwID0gTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDI7DQorDQorCS8qIExlYXZlcyAq Lw0KKwlucl9ub2RlcyA9IERJVl9ST1VORF9VUChucl9ub2RlcywgTUFQTEVfUkFOR0U2NF9TTE9U UyAtIDEpOw0KKwkvKiBJbnRlcm5hbCBub2RlcyAqLw0KKwlucl9ub2RlcyArPSBESVZfUk9VTkRf VVAobnJfbm9kZXMsIG5vbmxlYWZfY2FwKTsNCisJbWFzX25vZGVfY291bnQobWFzLCBucl9ub2Rl cyk7DQorDQorCWlmICghbWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldCA9 IHhhX2VycihtYXMtPm5vZGUpOw0KKwltYXMtPm5vZGUgPSBlbm9kZTsNCisJcmV0dXJuIHJldDsN CisNCit9DQorDQorLyoNCisgKiBtYXNfZGVzdHJveSgpIC0gZGVzdHJveSBhIG1hcGxlIHN0YXRl Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVXBvbiBjb21wbGV0aW9uLCBj aGVjayB0aGUgbGVmdC1tb3N0IG5vZGUgYW5kIHJlYmFsYW5jZSBhZ2FpbnN0IHRoZSBub2RlIHRv DQorICogdGhlIHJpZ2h0IGlmIG5lY2Vzc2FyeS4gIEZyZWVzIGFueSBhbGxvY2F0ZWQgbm9kZXMg YXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFwbGUNCisgKiBzdGF0ZS4NCisgKi8NCit2b2lkIG1hc19k ZXN0cm95KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpu b2RlOw0KKw0KKwkvKg0KKwkgKiBXaGVuIHVzaW5nIG1hc19mb3JfZWFjaCgpIHRvIGluc2VydCBh biBleHBlY3RlZCBudW1iZXIgb2YgZWxlbWVudHMsDQorCSAqIGl0IGlzIHBvc3NpYmxlIHRoYXQg dGhlIG51bWJlciBpbnNlcnRlZCBpcyBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkDQorCSAqIG51bWJl ci4gIFRvIGZpeCBhbiBpbnZhbGlkIGZpbmFsIG5vZGUsIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGhl cmUgdG8NCisJICogcmViYWxhbmNlIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIGZpbmFsIG5v ZGUuDQorCSAqLw0KKwlpZiAobWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9SRUJBTEFOQ0UpIHsN CisJCXVuc2lnbmVkIGNoYXIgZW5kOw0KKw0KKwkJaWYgKG1hc19pc19zdGFydChtYXMpKQ0KKwkJ CW1hc19zdGFydChtYXMpOw0KKw0KKwkJbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwkJZW5kID0g bWFzX2RhdGFfZW5kKG1hcykgKyAxOw0KKwkJaWYgKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1h cy0+bm9kZSkgLSAxKQ0KKwkJCW1hc19kZXN0cm95X3JlYmFsYW5jZShtYXMsIGVuZCk7DQorDQor CQltYXMtPm1hc19mbGFncyAmPSB+TUFfU1RBVEVfUkVCQUxBTkNFOw0KKwl9DQorCW1hcy0+bWFz X2ZsYWdzICY9IH5NQV9TVEFURV9CVUxLOw0KKw0KKwl3aGlsZSAobWFzLT5hbGxvYyAmJiAhKCh1 bnNpZ25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpKSB7DQorCQlub2RlID0gbWFzLT5hbGxvYzsN CisJCW1hcy0+YWxsb2MgPSBub2RlLT5zbG90WzBdOw0KKwkJaWYgKG5vZGUtPm5vZGVfY291bnQg PiAwKQ0KKwkJCW10X2ZyZWVfYnVsayhub2RlLT5ub2RlX2NvdW50LA0KKwkJCQkgICAgICh2b2lk IF9fcmN1ICoqKSZub2RlLT5zbG90WzFdKTsNCisJCWttZW1fY2FjaGVfZnJlZShtYXBsZV9ub2Rl X2NhY2hlLCBub2RlKTsNCisJfQ0KKwltYXMtPmFsbG9jID0gTlVMTDsNCit9DQorDQorLyoqDQor ICogbWFzX25leHQoKSAtIEdldCB0aGUgbmV4dCBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBpbmRleCB0byBjaGVjay4NCisgKg0KKyAqIFJl dHVybnMgdGhlIG5leHQgZW50cnkgYWZ0ZXIgQG1hcy0+aW5kZXguDQorICogTXVzdCBob2xkIHJj dV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICogQ2FuIHJldHVybiB0aGUgemVybyBl bnRyeS4NCisgKg0KKyAqIFJldHVybjogVGhlIG5leHQgZW50cnkgb3IgJU5VTEwNCisgKi8NCit2 b2lkICptYXNfbmV4dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpDQor ew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMt Pm5vZGUgPSBNQVNfU1RBUlQ7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCW1hc193 YWxrKG1hcyk7IC8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc193YWxrICov DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykpIHsNCisJCWlmICghbWFzLT5pbmRleCkgew0KKwkJ CW1hcy0+aW5kZXggPSAxOw0KKwkJCW1hcy0+bGFzdCA9IFVMT05HX01BWDsNCisJCX0NCisJCXJl dHVybiBOVUxMOw0KKwl9DQorDQorCWlmIChtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKQ0KKwkJcmV0 dXJuIE5VTEw7DQorDQorCS8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc19u ZXh0X2VudHJ5ICovDQorCXJldHVybiBtYXNfbmV4dF9lbnRyeShtYXMsIG1heCk7DQorfQ0KK0VY UE9SVF9TWU1CT0xfR1BMKG1hc19uZXh0KTsNCisNCisvKioNCisgKiBtdF9uZXh0KCkgLSBnZXQg dGhlIG5leHQgdmFsdWUgaW4gdGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVl DQorICogQGluZGV4OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBpbmRl eCB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQgQGluZGV4IG9yIGhpZ2hl ciwgb3IgJU5VTEwgaWYgbm90aGluZyBpcyBmb3VuZC4NCisgKi8NCit2b2lkICptdF9uZXh0KHN0 cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBt YXgpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4 LCBpbmRleCk7DQorDQorCXJjdV9yZWFkX2xvY2soKTsNCisJZW50cnkgPSBtYXNfbmV4dCgmbWFz LCBtYXgpOw0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBP UlRfU1lNQk9MX0dQTChtdF9uZXh0KTsNCisNCisvKioNCisgKiBtYXNfcHJldigpIC0gR2V0IHRo ZSBwcmV2aW91cyBlbnRyeQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRo ZSBtaW5pbXVtIHZhbHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xv Y2sgb3IgdGhlIHdyaXRlIGxvY2suDQorICogV2lsbCByZXNldCBtYXMgdG8gTUFTX1NUQVJUIGlm IHRoZSBub2RlIGlzIE1BU19OT05FLiAgV2lsbCBzdG9wIG9uIG5vdA0KKyAqIHNlYXJjaGFibGUg bm9kZXMuDQorICoNCisgKiBSZXR1cm46IHRoZSBwcmV2aW91cyB2YWx1ZSBvciAlTlVMTC4NCisg Ki8NCit2b2lkICptYXNfcHJldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBt aW4pDQorew0KKwlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCS8qIE5vdGhpbmcgY29tZXMgYmVmb3Jl IDAgKi8NCisJCW1hcy0+bGFzdCA9IDA7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAo dW5saWtlbHkobWFzX2lzX3B0cihtYXMpKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFz X2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNf U1RBUlQ7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3dhbGsobWFzKTsN CisJCWlmICghbWFzLT5pbmRleCkNCisJCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAobWFz X2lzX3B0cihtYXMpKSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCQltYXMtPmxhc3QgPSAw Ow0KKwkJCXJldHVybiBOVUxMOw0KKwkJfQ0KKw0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCA9 IDA7DQorCQlyZXR1cm4gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0NCisJcmV0dXJuIG1hc19w cmV2X2VudHJ5KG1hcywgbWluKTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX3ByZXYpOw0K Kw0KKy8qKg0KKyAqIG10X3ByZXYoKSAtIGdldCB0aGUgcHJldmlvdXMgdmFsdWUgaW4gdGhlIG1h cGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQg aW5kZXgNCisgKiBAbWluOiBUaGUgbWluaW11bSBpbmRleCB0byBjaGVjaw0KKyAqDQorICogUmV0 dXJuOiBUaGUgZW50cnkgYXQgQGluZGV4IG9yIGxvd2VyLCBvciAlTlVMTCBpZiBub3RoaW5nIGlz IGZvdW5kLg0KKyAqLw0KK3ZvaWQgKm10X3ByZXYoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNp Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXZvaWQgKmVudHJ5ID0g TlVMTDsNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisNCisJcmN1X3JlYWRf bG9jaygpOw0KKwllbnRyeSA9IG1hc19wcmV2KCZtYXMsIG1pbik7DQorCXJjdV9yZWFkX3VubG9j aygpOw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG10X3ByZXYpOw0K Kw0KKy8qKg0KKyAqIG1hc19wYXVzZSgpIC0gUGF1c2UgYSBtYXNfZmluZC9tYXNfZm9yX2VhY2gg dG8gZHJvcCB0aGUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUgdG8gcGF1c2UNCisg Kg0KKyAqIFNvbWUgdXNlcnMgbmVlZCB0byBwYXVzZSBhIHdhbGsgYW5kIGRyb3AgdGhlIGxvY2sg dGhleSdyZSBob2xkaW5nIGluDQorICogb3JkZXIgdG8geWllbGQgdG8gYSBoaWdoZXIgcHJpb3Jp dHkgdGhyZWFkIG9yIGNhcnJ5IG91dCBhbiBvcGVyYXRpb24NCisgKiBvbiBhbiBlbnRyeS4gIFRo b3NlIHVzZXJzIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHRoZXkgZHJvcA0KKyAq IHRoZSBsb2NrLiAgSXQgcmVzZXRzIHRoZSBAbWFzIHRvIGJlIHN1aXRhYmxlIGZvciB0aGUgbmV4 dCBpdGVyYXRpb24NCisgKiBvZiB0aGUgbG9vcCBhZnRlciB0aGUgdXNlciBoYXMgcmVhY3F1aXJl ZCB0aGUgbG9jay4gIElmIG1vc3QgZW50cmllcw0KKyAqIGZvdW5kIGR1cmluZyBhIHdhbGsgcmVx dWlyZSB5b3UgdG8gY2FsbCBtYXNfcGF1c2UoKSwgdGhlIG10X2Zvcl9lYWNoKCkNCisgKiBpdGVy YXRvciBtYXkgYmUgbW9yZSBhcHByb3ByaWF0ZS4NCisgKg0KKyAqLw0KK3ZvaWQgbWFzX3BhdXNl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJbWFzLT5ub2RlID0gTUFTX1BBVVNFOw0KK30N CitFWFBPUlRfU1lNQk9MX0dQTChtYXNfcGF1c2UpOw0KKw0KKy8qKg0KKyAqIG1hc19maW5kKCkg LSBPbiB0aGUgZmlyc3QgY2FsbCwgZmluZCB0aGUgZW50cnkgYXQgb3IgYWZ0ZXIgbWFzLT5pbmRl eCB1cCB0bw0KKyAqICVtYXguICBPdGhlcndpc2UsIGZpbmQgdGhlIGVudHJ5IGFmdGVyIG1hcy0+ aW5kZXguDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0g dmFsdWUgdG8gY2hlY2suDQorICoNCisgKiBNdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBvciB0aGUg d3JpdGUgbG9jay4NCisgKiBJZiBhbiBlbnRyeSBleGlzdHMsIGxhc3QgYW5kIGluZGV4IGFyZSB1 cGRhdGVkIGFjY29yZGluZ2x5Lg0KKyAqIE1heSBzZXQgQG1hcy0+bm9kZSB0byBNQVNfTk9ORS4N CisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IG9yICVOVUxMLg0KKyAqLw0KK3ZvaWQgKm1hc19m aW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCWlmICh1 bmxpa2VseShtYXNfaXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0 ID09IFVMT05HX01BWCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCQlyZXR1cm4g TlVMTDsNCisJCX0NCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1hcy0+aW5kZXggPSAr K21hcy0+bGFzdDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7 DQorCQkvKiBGaXJzdCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQgKmVudHJ5Ow0KKw0KKwkJ aWYgKG1hcy0+aW5kZXggPiBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQllbnRyeSA9IG1h c193YWxrKG1hcyk7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQor CWlmICh1bmxpa2VseSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisN CisJLyogUmV0cmllcyBvbiBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25leHRfZW50cnkgKi8N CisJcmV0dXJuIG1hc19uZXh0X2VudHJ5KG1hcywgbWF4KTsNCit9DQorDQorLyoqDQorICogbWFz X2ZpbmRfcmV2OiBPbiB0aGUgZmlyc3QgY2FsbCwgZmluZCB0aGUgZmlyc3Qgbm9uLW51bGwgZW50 cnkgYXQgb3IgYmVsb3cNCisgKiBtYXMtPmluZGV4IGRvd24gdG8gJW1pbi4gIE90aGVyd2lzZSBm aW5kIHRoZSBmaXJzdCBub24tbnVsbCBlbnRyeSBiZWxvdw0KKyAqIG1hcy0+aW5kZXggZG93biB0 byAlbWluLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVt IHZhbHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhl IHdyaXRlIGxvY2suDQorICogSWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0IGFuZCBpbmRleCBhcmUg dXBkYXRlZCBhY2NvcmRpbmdseS4NCisgKiBNYXkgc2V0IEBtYXMtPm5vZGUgdG8gTUFTX05PTkUu DQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNf ZmluZF9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJ aWYgKHVubGlrZWx5KG1hc19pc19wYXVzZWQobWFzKSkpIHsNCisJCWlmICh1bmxpa2VseShtYXMt Pmxhc3QgPT0gVUxPTkdfTUFYKSkgew0KKwkJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwkJCXJl dHVybiBOVUxMOw0KKwkJfQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwkJbWFzLT5sYXN0 ID0gLS1tYXMtPmluZGV4Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfc3RhcnQobWFz KSkpIHsNCisJCS8qIEZpcnN0IHJ1biBvciBjb250aW51ZSAqLw0KKwkJdm9pZCAqZW50cnk7DQor DQorCQlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCWVudHJ5 ID0gbWFzX3dhbGsobWFzKTsNCisJCWlmIChlbnRyeSkNCisJCQlyZXR1cm4gZW50cnk7DQorCX0N CisNCisJaWYgKHVubGlrZWx5KCFtYXNfc2VhcmNoYWJsZShtYXMpKSkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwlpZiAobWFzLT5pbmRleCA8IG1pbikNCisJCXJldHVybiBOVUxMOw0KKw0KKwkvKiBS ZXRyaWVzIG9uIGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9lbnRyeSAqLw0KKwlyZXR1 cm4gbWFzX3ByZXZfZW50cnkobWFzLCBtaW4pOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtYXNf ZmluZCk7DQorDQorLyoqDQorICogbWFzX2VyYXNlKCkgLSBGaW5kIHRoZSByYW5nZSBpbiB3aGlj aCBpbmRleCByZXNpZGVzIGFuZCBlcmFzZSB0aGUgZW50aXJlDQorICogcmFuZ2UuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQor ICogU2VhcmNoZXMgZm9yIEBtYXMtPmluZGV4LCBzZXRzIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5s YXN0IHRvIHRoZSByYW5nZSBhbmQNCisgKiBlcmFzZXMgdGhhdCByYW5nZS4NCisgKg0KKyAqIFJl dHVybjogdGhlIGVudHJ5IHRoYXQgd2FzIGVyYXNlZCBvciAlTlVMTCwgQG1hcy0+aW5kZXggYW5k IEBtYXMtPmxhc3QgYXJlIHVwZGF0ZWQuDQorICovDQordm9pZCAqbWFzX2VyYXNlKHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorCU1BX1dSX1NUQVRFKHdyX21hcywg bWFzLCBOVUxMKTsNCisNCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZCht YXMpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKw0KKwkvKiBSZXRyeSB1bm5lY2Vzc2Fy eSB3aGVuIGhvbGRpbmcgdGhlIHdyaXRlIGxvY2suICovDQorCWVudHJ5ID0gbWFzX3N0YXRlX3dh bGsobWFzKTsNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KK3dyaXRlX3JldHJ5 Og0KKwkvKiBNdXN0IHJlc2V0IHRvIGVuc3VyZSBzcGFubmluZyB3cml0ZXMgb2YgbGFzdCBzbG90 IGFyZSBkZXRlY3RlZCAqLw0KKwltYXNfcmVzZXQobWFzKTsNCisJbWFzX3dyX3N0b3JlX3NldHVw KCZ3cl9tYXMpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCWlmIChtYXNfbm9t ZW0obWFzLCBHRlBfS0VSTkVMKSkNCisJCWdvdG8gd3JpdGVfcmV0cnk7DQorDQorCXJldHVybiBl bnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX2VyYXNlKTsNCisNCisvKioNCisgKiBt YXNfbm9tZW0oKSAtIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhbGxvY2F0aW5nIGFuZCBk byB0aGUgYWxsb2NhdGlvbg0KKyAqIGlmIG5lY2Vzc2FyeSBJZiB0aGVyZSBhcmUgYWxsb2NhdGlv bnMsIHRoZW4gZnJlZSB0aGVtLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBnZnA6 IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucw0KKyAqIFJldHVybjogdHJ1ZSBv biBhbGxvY2F0aW9uLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorYm9vbCBtYXNfbm9tZW0oc3Ry dWN0IG1hX3N0YXRlICptYXMsIGdmcF90IGdmcCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5s b2NrKQ0KK3sNCisJaWYgKGxpa2VseShtYXMtPm5vZGUgIT0gTUFfRVJST1IoLUVOT01FTSkpKSB7 DQorCQltYXNfZGVzdHJveShtYXMpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmIChn ZnBmbGFnc19hbGxvd19ibG9ja2luZyhnZnApICYmICFtdF9leHRlcm5hbF9sb2NrKG1hcy0+dHJl ZSkpIHsNCisJCW10cmVlX3VubG9jayhtYXMtPnRyZWUpOw0KKwkJbWFzX2FsbG9jX25vZGVzKG1h cywgZ2ZwKTsNCisJCW10cmVlX2xvY2sobWFzLT50cmVlKTsNCisJfSBlbHNlIHsNCisJCW1hc19h bGxvY19ub2RlcyhtYXMsIGdmcCk7DQorCX0NCisNCisJaWYgKCFtYXNfYWxsb2NhdGVkKG1hcykp DQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJcmV0dXJu IHRydWU7DQorfQ0KKw0KK3ZvaWQgX19pbml0IG1hcGxlX3RyZWVfaW5pdCh2b2lkKQ0KK3sNCisJ bWFwbGVfbm9kZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJtYXBsZV9ub2RlIiwNCisJCQlz aXplb2Yoc3RydWN0IG1hcGxlX25vZGUpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpLA0KKwkJ CVNMQUJfUEFOSUMsIE5VTEwpOw0KK30NCisNCisvKioNCisgKiBtdHJlZV9sb2FkKCkgLSBMb2Fk IGEgdmFsdWUgc3RvcmVkIGluIGEgbWFwbGUgdHJlZQ0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUN CisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBsb2FkDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRy eSBvciAlTlVMTA0KKyAqLw0KK3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB1bnNpZ25lZCBsb25nIGluZGV4KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGlu ZGV4KTsNCisJdm9pZCAqZW50cnk7DQorDQorCXRyYWNlX21hX3JlYWQoX19mdW5jX18sICZtYXMp Ow0KKwlyY3VfcmVhZF9sb2NrKCk7DQorcmV0cnk6DQorCWVudHJ5ID0gbWFzX3N0YXJ0KCZtYXMp Ow0KKwlpZiAodW5saWtlbHkobWFzX2lzX25vbmUoJm1hcykpKQ0KKwkJZ290byB1bmxvY2s7DQor DQorCWlmICh1bmxpa2VseShtYXNfaXNfcHRyKCZtYXMpKSkgew0KKwkJaWYgKGluZGV4KQ0KKwkJ CWVudHJ5ID0gTlVMTDsNCisNCisJCWdvdG8gdW5sb2NrOw0KKwl9DQorDQorCWVudHJ5ID0gbXRy ZWVfbG9va3VwX3dhbGsoJm1hcyk7DQorCWlmICghZW50cnkgJiYgdW5saWtlbHkobWFzX2lzX3N0 YXJ0KCZtYXMpKSkNCisJCWdvdG8gcmV0cnk7DQordW5sb2NrOg0KKwlyY3VfcmVhZF91bmxvY2so KTsNCisJaWYgKHhhX2lzX3plcm8oZW50cnkpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJldHVy biBlbnRyeTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9sb2FkKTsNCisNCisvKioNCisgKiBt dHJlZV9zdG9yZV9yYW5nZSgpIC0gU3RvcmUgYW4gZW50cnkgYXQgYSBnaXZlbiByYW5nZS4NCisg KiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdl DQorICogQGxhc3Q6IFRoZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkg dG8gc3RvcmUNCisgKiBAZ2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMN CisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGludmFsaWQgcmVxdWVz dCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90DQorICogYmUgYWxsb2NhdGVkLg0KKyAqLw0K K2ludCBtdHJlZV9zdG9yZV9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxv bmcgaW5kZXgsDQorCQl1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnAp DQorew0KKwlNQV9TVEFURShtYXMsIG10LCBpbmRleCwgbGFzdCk7DQorCU1BX1dSX1NUQVRFKHdy X21hcywgJm1hcywgZW50cnkpOw0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgJm1hcywg MCwgZW50cnkpOw0KKwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVudHJ5KSkpDQor CQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKGluZGV4ID4gbGFzdCkNCisJCXJldHVybiAtRUlO VkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFzX3dyX3N0b3JlX2VudHJ5 KCZ3cl9tYXMpOw0KKwlpZiAobWFzX25vbWVtKCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0K Kw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwlpZiAobWFzX2lzX2VycigmbWFzKSkNCisJCXJldHVy biB4YV9lcnIobWFzLm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTCht dHJlZV9zdG9yZV9yYW5nZSk7DQorDQorLyoqDQorICogbXRyZWVfc3RvcmUoKSAtIFN0b3JlIGFu IGVudHJ5IGF0IGEgZ2l2ZW4gaW5kZXguDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBp bmRleDogVGhlIGluZGV4IHRvIHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5 IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25z DQorICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVl c3QsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8N CitpbnQgbXRyZWVfc3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGlu ZGV4LCB2b2lkICplbnRyeSwNCisJCSBnZnBfdCBnZnApDQorew0KKwlyZXR1cm4gbXRyZWVfc3Rv cmVfcmFuZ2UobXQsIGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9SVF9TWU1C T0wobXRyZWVfc3RvcmUpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2VydF9yYW5nZSgpIC0gSW5z ZXJ0IGFuIGVudHJ5IGF0IGEgZ2l2ZSByYW5nZSBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBA bXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGZpcnN0OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlDQor ICogQGxhc3Q6IFRoZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8g c3RvcmUNCisgKiBAZ2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMuDQor ICoNCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVFWElTVFMgaWYgdGhlIHJhbmdlIGlzIG9j Y3VwaWVkLCAtRUlOVkFMIG9uIGludmFsaWQNCisgKiByZXF1ZXN0LCAtRU5PTUVNIGlmIG1lbW9y eSBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uo c3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQg bG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfU1RBVEUobXMsIG10 LCBmaXJzdCwgbGFzdCk7DQorDQorCWlmIChXQVJOX09OX09OQ0UoeGFfaXNfYWR2YW5jZWQoZW50 cnkpKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoZmlyc3QgPiBsYXN0KQ0KKwkJcmV0 dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwltYXNfaW5zZXJ0 KCZtcywgZW50cnkpOw0KKwlpZiAobWFzX25vbWVtKCZtcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7 DQorDQorCW10cmVlX3VubG9jayhtdCk7DQorCWlmIChtYXNfaXNfZXJyKCZtcykpDQorCQlyZXR1 cm4geGFfZXJyKG1zLm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTCht dHJlZV9pbnNlcnRfcmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2VydCgpIC0gSW5zZXJ0 IGFuIGVudHJ5IGF0IGEgZ2l2ZSBpbmRleCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBAbXQ6 IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4IDogVGhlIGluZGV4IHRvIHN0b3JlIHRoZSB2YWx1 ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEZHUF9GTEFH UyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Ms IC1FRVhJU1RTIGlmIHRoZSByYW5nZSBpcyBvY2N1cGllZCwgLUVJTlZBTCBvbiBpbnZhbGlkDQor ICogcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4NCisg Ki8NCitpbnQgbXRyZWVfaW5zZXJ0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyBpbmRleCwgdm9pZCAqZW50cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVl X2luc2VydF9yYW5nZShtdCwgaW5kZXgsIGluZGV4LCBlbnRyeSwgZ2ZwKTsNCit9DQorRVhQT1JU X1NZTUJPTChtdHJlZV9pbnNlcnQpOw0KKw0KK2ludCBtdHJlZV9hbGxvY19yYW5nZShzdHJ1Y3Qg bWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1 bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBt YXgsIGdmcF90IGdmcCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10 LCBtaW4sIG1heCAtIHNpemUpOw0KKwlpZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAt RUlOVkFMOw0KKw0KKwlpZiAoV0FSTl9PTl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQor CQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKG1pbiA+IG1heCkNCisJCXJldHVybiAtRUlOVkFM Ow0KKw0KKwlpZiAobWF4IDwgc2l6ZSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoIXNp emUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorcmV0cnk6DQor CW1hcy5vZmZzZXQgPSAwOw0KKwltYXMuaW5kZXggPSBtaW47DQorCW1hcy5sYXN0ID0gbWF4IC0g c2l6ZTsNCisJcmV0ID0gbWFzX2FsbG9jKCZtYXMsIGVudHJ5LCBzaXplLCBzdGFydHApOw0KKwlp ZiAobWFzX25vbWVtKCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxv Y2sobXQpOw0KKwlyZXR1cm4gcmV0Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVlX2FsbG9jX3Jh bmdlKTsNCisNCitpbnQgbXRyZWVfYWxsb2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwg dW5zaWduZWQgbG9uZyAqc3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6 ZSwgdW5zaWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKQ0K K3sNCisJaW50IHJldCA9IDA7DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIG1pbiwgbWF4IC0gc2l6 ZSk7DQorCWlmICghbXRfaXNfYWxsb2MobXQpKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlm IChXQVJOX09OX09OQ0UobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKSkNCisJCXJldHVybiAtRUlOVkFM Ow0KKw0KKwlpZiAobWluID49IG1heCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWF4 IDwgc2l6ZSAtIDEpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFzaXplKQ0KKwkJcmV0 dXJuIC1FSU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwlyZXQgPSBtYXNf cmV2X2FsbG9jKCZtYXMsIG1pbiwgbWF4LCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJaWYgKG1h c19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2NrKG10 KTsNCisJcmV0dXJuIHJldDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9hbGxvY19ycmFuZ2Up Ow0KKw0KKy8qKg0KKyAqIG10cmVlX2VyYXNlKCkgLSBGaW5kIGFuIGluZGV4IGFuZCBlcmFzZSB0 aGUgZW50aXJlIHJhbmdlLg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRo ZSBpbmRleCB0byBlcmFzZQ0KKyAqDQorICogRXJhc2luZyBpcyB0aGUgc2FtZSBhcyBhIHdhbGsg dG8gYW4gZW50cnkgdGhlbiBhIHN0b3JlIG9mIGEgTlVMTCB0byB0aGF0DQorICogRU5USVJFIHJh bmdlLiAgSW4gZmFjdCwgaXQgaXMgaW1wbGVtZW50ZWQgYXMgc3VjaCB1c2luZyB0aGUgYWR2YW5j ZWQgQVBJLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVkIGF0IHRoZSBAaW5kZXgg b3IgJU5VTEwNCisgKi8NCit2b2lkICptdHJlZV9lcmFzZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorDQorCU1B X1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorCXRyYWNlX21hX29wKF9fZnVuY19fLCAm bWFzKTsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorCWVudHJ5ID0gbWFzX2VyYXNlKCZtYXMpOw0K KwltdHJlZV91bmxvY2sobXQpOw0KKw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1C T0wobXRyZWVfZXJhc2UpOw0KKw0KKy8qKg0KKyAqIF9fbXRfZGVzdHJveSgpIC0gV2FsayBhbmQg ZnJlZSBhbGwgbm9kZXMgb2YgYSBsb2NrZWQgbWFwbGUgdHJlZS4NCisgKiBAbXQ6IFRoZSBtYXBs ZSB0cmVlDQorICoNCisgKiBOb3RlOiBEb2VzIG5vdCBoYW5kbGUgbG9ja2luZy4NCisgKi8NCit2 b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl2b2lkICpyb290 ID0gbXRfcm9vdF9sb2NrZWQobXQpOw0KKw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobXQtPm1hX3Jv b3QsIE5VTEwpOw0KKwlpZiAoeGFfaXNfbm9kZShyb290KSkNCisJCW10ZV9kZXN0cm95X3dhbGso cm9vdCwgbXQpOw0KKw0KKwltdC0+bWFfZmxhZ3MgPSAwOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQ TChfX210X2Rlc3Ryb3kpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kg YSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqDQorICogRnJlZXMgYWxs IHJlc291cmNlcyB1c2VkIGJ5IHRoZSB0cmVlLiAgSGFuZGxlcyBsb2NraW5nLg0KKyAqLw0KK3Zv aWQgbXRyZWVfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwltdHJlZV9sb2Nr KG10KTsNCisJX19tdF9kZXN0cm95KG10KTsNCisJbXRyZWVfdW5sb2NrKG10KTsNCit9DQorRVhQ T1JUX1NZTUJPTChtdHJlZV9kZXN0cm95KTsNCisNCisvKioNCisgKiBtdF9maW5kKCkgLSBTZWFy Y2ggZnJvbSB0aGUgc3RhcnQgdXAgdW50aWwgYW4gZW50cnkgaXMgZm91bmQuDQorICogQG10OiBU aGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogUG9pbnRlciB3aGljaCBjb250YWlucyB0aGUgc3Rh cnQgbG9jYXRpb24gb2YgdGhlIHNlYXJjaA0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRv IGNoZWNrDQorICoNCisgKiBIYW5kbGVzIGxvY2tpbmcuICBAaW5kZXggd2lsbCBiZSBpbmNyZW1l bnRlZCB0byBvbmUgYmV5b25kIHRoZSByYW5nZS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5 IGF0IG9yIGFmdGVyIHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdF9maW5kKHN0 cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcg bWF4KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgKmluZGV4LCAqaW5kZXgpOw0KKwl2b2lkICpl bnRyeTsNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisJdW5zaWduZWQgbG9uZyBj b3B5ID0gKmluZGV4Ow0KKyNlbmRpZg0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFz KTsNCisNCisJaWYgKCgqaW5kZXgpID4gbWF4KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJjdV9y ZWFkX2xvY2soKTsNCityZXRyeToNCisJZW50cnkgPSBtYXNfc3RhdGVfd2FsaygmbWFzKTsNCisJ aWYgKG1hc19pc19zdGFydCgmbWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmICh1bmxpa2Vs eSh4YV9pc196ZXJvKGVudHJ5KSkpDQorCQllbnRyeSA9IE5VTEw7DQorDQorCWlmIChlbnRyeSkN CisJCWdvdG8gdW5sb2NrOw0KKw0KKwl3aGlsZSAobWFzX3NlYXJjaGFibGUoJm1hcykgJiYgKG1h cy5pbmRleCA8IG1heCkpIHsNCisJCWVudHJ5ID0gbWFzX25leHRfZW50cnkoJm1hcywgbWF4KTsN CisJCWlmIChsaWtlbHkoZW50cnkgJiYgIXhhX2lzX3plcm8oZW50cnkpKSkNCisJCQlicmVhazsN CisJfQ0KKw0KKwlpZiAodW5saWtlbHkoeGFfaXNfemVybyhlbnRyeSkpKQ0KKwkJZW50cnkgPSBO VUxMOw0KK3VubG9jazoNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCWlmIChsaWtlbHkoZW50cnkp KSB7DQorCQkqaW5kZXggPSBtYXMubGFzdCArIDE7DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBM RV9UUkVFDQorCQlpZiAoKCppbmRleCkgJiYgKCppbmRleCkgPD0gY29weSkNCisJCQlwcmludGso ImluZGV4IG5vdCBpbmNyZWFzZWQhICVseCA8PSAlbHhcbiIsDQorCQkJICAgICAgICppbmRleCwg Y29weSk7DQorCQlNVF9CVUdfT04obXQsICgqaW5kZXgpICYmICgoKmluZGV4KSA8PSBjb3B5KSk7 DQorI2VuZGlmDQorCX0NCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10 X2ZpbmQpOw0KKw0KKy8qKg0KKyAqIG10X2ZpbmRfYWZ0ZXIoKSAtIFNlYXJjaCBmcm9tIHRoZSBz dGFydCB1cCB1bnRpbCBhbiBlbnRyeSBpcyBmb3VuZC4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVl DQorICogQGluZGV4OiBQb2ludGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBsb2NhdGlvbiBv ZiB0aGUgc2VhcmNoDQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2sNCisgKg0K KyAqIEhhbmRsZXMgbG9ja2luZywgZGV0ZWN0cyB3cmFwcGluZyBvbiBpbmRleCA9PSAwDQorICoN CisgKiBSZXR1cm46IFRoZSBlbnRyeSBhdCBvciBhZnRlciB0aGUgQGluZGV4IG9yICVOVUxMDQor ICovDQordm9pZCAqbXRfZmluZF9hZnRlcihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVk IGxvbmcgKmluZGV4LA0KKwkJICAgIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJaWYgKCEoKmlu ZGV4KSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gbXRfZmluZChtdCwgaW5kZXgsIG1h eCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRfZmluZF9hZnRlcik7DQorDQorI2lmZGVmIENPTkZJ R19ERUJVR19NQVBMRV9UUkVFDQorYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19ydW47DQorRVhQ T1JUX1NZTUJPTF9HUEwobWFwbGVfdHJlZV90ZXN0c19ydW4pOw0KK2F0b21pY190IG1hcGxlX3Ry ZWVfdGVzdHNfcGFzc2VkOw0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcGxlX3RyZWVfdGVzdHNfcGFz c2VkKTsNCisNCisjaWZuZGVmIF9fS0VSTkVMX18NCitleHRlcm4gdm9pZCBrbWVtX2NhY2hlX3Nl dF9ub25fa2VybmVsKHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGludCk7DQordm9pZCBt dF9zZXRfbm9uX2tlcm5lbCh1bnNpZ25lZCBpbnQgdmFsKQ0KK3sNCisJa21lbV9jYWNoZV9zZXRf bm9uX2tlcm5lbChtYXBsZV9ub2RlX2NhY2hlLCB2YWwpOw0KK30NCisNCitleHRlcm4gdW5zaWdu ZWQgbG9uZyBrbWVtX2NhY2hlX2dldF9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNp Z25lZCBsb25nIG10X2dldF9hbGxvY19zaXplKHZvaWQpDQorew0KKwlyZXR1cm4ga21lbV9jYWNo ZV9nZXRfYWxsb2MobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB2b2lkIGttZW1f Y2FjaGVfemVyb19ucl90YWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3ZvaWQgbXRf emVyb19ucl90YWxsb2NhdGVkKCkNCit7DQorCWttZW1fY2FjaGVfemVyb19ucl90YWxsb2NhdGVk KG1hcGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2Fj aGVfbnJfdGFsbG9jYXRlZChzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNpZ25lZCBpbnQgbXRf bnJfdGFsbG9jYXRlZCgpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9ucl90YWxsb2NhdGVkKG1h cGxlX25vZGVfY2FjaGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVf bnJfYWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl9h bGxvY2F0ZWQoKQ0KK3sNCisJcmV0dXJuIGttZW1fY2FjaGVfbnJfYWxsb2NhdGVkKG1hcGxlX25v ZGVfY2FjaGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19kZWFkX25vZGUoKSAtIENoZWNrIGlmIHRo ZSBtYXBsZSBzdGF0ZSBpcyBwb2ludGluZyB0byBhIGRlYWQgbm9kZS4NCisgKiBAbWFzOiBUaGUg bWFwbGUgc3RhdGUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byByZXN0b3JlIGluIEBtYXMuDQor ICoNCisgKiBVc2VkIGluIHRlc3QgY29kZS4NCisgKiBSZXR1cm46IDEgaWYgQG1hcyBoYXMgYmVl biByZXNldCB0byBNQVNfU1RBUlQsIDAgb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg aW50IG1hc19kZWFkX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5k ZXgpDQorew0KKyAgICAgICBpZiAodW5saWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykgfHwgbWFz X2lzX3N0YXJ0KG1hcykpKQ0KKyAgICAgICAgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICAgICBp ZiAobGlrZWx5KCFtdGVfZGVhZF9ub2RlKG1hcy0+bm9kZSkpKQ0KKyAgICAgICAgICAgICAgIHJl dHVybiAwOw0KKw0KKyAgICAgICBtYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKyAgICAgICByZXR1 cm4gMTsNCit9DQorDQorI2RlZmluZSBNQV9QVFIgIiVwIg0KKyNlbHNlIC8qICBfX0tFUk5FTF9f IGlzIGRlZmluZWQgKi8NCisjZGVmaW5lIE1BX1BUUiAiJXB4Ig0KKyNlbmRpZg0KKw0KKy8qDQor ICogbWFzX2dldF9zbG90KCkgLSBHZXQgdGhlIGVudHJ5IGluIHRoZSBtYXBsZSBzdGF0ZSBub2Rl IHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZz ZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdCBhcnJheSB0byBmZXRjaC4NCisgKg0KKyAqIFJl dHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg c3RydWN0IG1hcGxlX2Vub2RlICptYXNfZ2V0X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsDQor CQl1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiBtYXNfc2xvdChtYXMsIG1hX3Ns b3RzKG1hc19tbihtYXMpLCBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSkpLA0KKwkJICAgICAgIG9m ZnNldCk7DQorfQ0KKw0KKw0KKyNpZmRlZiBDT05GSUdfTUFQTEVfU0VBUkNIDQorLyogbWFzIGxp bWl0cyBub3QgYWRqdXN0ZWQgKi8NCitzdGF0aWMgdm9pZCBtYXNfZGZzX3ByZW9yZGVyKHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisNCisJc3RydWN0IG1hcGxlX2Vub2RlICpwcmV2Ow0KKwl1 bnNpZ25lZCBjaGFyIGVuZCwgc2xvdCA9IDA7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkg ew0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCQlyZXR1cm47DQorCX0NCisNCisJaWYgKG10ZV9pc19s ZWFmKG1hcy0+bm9kZSkgJiYgbXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCWdvdG8gZG9uZTsN CisNCit3YWxrX3VwOg0KKwllbmQgPSBtYXNfZGF0YV9lbmQobWFzKTsNCisJaWYgKG10ZV9pc19s ZWFmKG1hcy0+bm9kZSkgfHwNCisJICAgIChzbG90ID4gZW5kKSkgew0KKwkJaWYgKG10ZV9pc19y b290KG1hcy0+bm9kZSkpDQorCQkJZ290byBkb25lOw0KKw0KKwkJc2xvdCA9IG10ZV9wYXJlbnRf c2xvdChtYXMtPm5vZGUpICsgMTsNCisJCW1hc19hc2NlbmQobWFzKTsNCisJCWdvdG8gd2Fsa191 cDsNCisJfQ0KKw0KKwlwcmV2ID0gbWFzLT5ub2RlOw0KKwltYXMtPm5vZGUgPSBtYXNfZ2V0X3Ns b3QobWFzLCBzbG90KTsNCisJaWYgKCFtYXMtPm5vZGUgfHwgc2xvdCA+IGVuZCkgew0KKwkJaWYg KG10ZV9pc19yb290KHByZXYpKQ0KKwkJCWdvdG8gZG9uZTsNCisNCisJCW1hcy0+bm9kZSA9IHBy ZXY7DQorCQlzbG90ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSkgKyAxOw0KKwkJbWFzX2Fz Y2VuZChtYXMpOw0KKwkJZ290byB3YWxrX3VwOw0KKwl9DQorDQorCXJldHVybjsNCitkb25lOg0K KwltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCit9DQorI2lmZGVmIENPTkZJR19NQVBMRV9FWFRSQVMN CitzdGF0aWMgdm9pZCBtYXNfYmZzX3ByZW9yZGVyKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisNCisJaWYgKG1hc19pc19zdGFydChtYXMpKSB7DQorCQltYXNfc3RhcnQobWFzKTsNCisJCXJl dHVybjsNCisJfQ0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSAmJiBtdGVfaXNfcm9v dChtYXMtPm5vZGUpKSB7DQorCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCXJldHVybjsNCisJ fQ0KKw0KK30NCisjZW5kaWYgLyogQ09ORklHX01BUExFX0VYVFJBUyAqLw0KKyNlbmRpZiAvKiBD T05GSUdfTUFQTEVfU0VBUkNIICovDQorDQorLyoNCisgKiBtYXNfZmlyc3RfZW50cnkoKSAtIEdv IHRoZSBmaXJzdCBsZWFmIGFuZCBmaW5kIHRoZSBmaXJzdCBlbnRyeS4NCisgKiBAbWFzOiB0aGUg bWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiB0aGUgbWF4aW11bSBpbmRleCB0byBjaGVjay4NCisg KiBAKnJfc3RhcnQ6IFBvaW50ZXIgdG8gc2V0IHRvIHRoZSByYW5nZSBzdGFydC4NCisgKg0KKyAq IFNldHMgbWFzLT5vZmZzZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUgZW50cnksIHJfc3RhcnQgdG8g dGhlIHJhbmdlIG1pbmltdW0uDQorICoNCisgKiBSZXR1cm46IFRoZSBmaXJzdCBlbnRyeSBvciBN QVNfTk9ORS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19maXJzdF9lbnRyeShzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUgKm1uLA0KKwkJdW5zaWduZWQgbG9u ZyBsaW1pdCwgZW51bSBtYXBsZV90eXBlIG10KQ0KKw0KK3sNCisJdW5zaWduZWQgbG9uZyBtYXg7 DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl2b2lk ICplbnRyeSA9IE5VTEw7DQorDQorCW1hcy0+aW5kZXggPSBtYXMtPm1pbjsNCisJaWYgKG1hcy0+ aW5kZXggPiBsaW1pdCkNCisJCWdvdG8gbm9uZTsNCisNCisJbWF4ID0gbWFzLT5tYXg7DQorCW1h cy0+b2Zmc2V0ID0gMDsNCisJd2hpbGUgKGxpa2VseSghbWFfaXNfbGVhZihtdCkpKSB7DQorCQlz bG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobW4sIG10KTsN CisJCW1heCA9IHBpdm90c1swXTsNCisJCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgMCk7 DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpDQorCQkJcmV0dXJuIE5VTEw7DQor CQltYXMtPm5vZGUgPSBlbnRyeTsNCisJCW1uID0gbWFzX21uKG1hcyk7DQorCQltdCA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJfQ0KKw0KKwltYXMtPm1heCA9IG1heDsNCisJc2xvdHMg PSBtYV9zbG90cyhtbiwgbXQpOw0KKwllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIDApOw0K KwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJ LyogU2xvdCAwIG9yIDEgbXVzdCBiZSBzZXQgKi8NCisJaWYgKG1hcy0+aW5kZXggPiBsaW1pdCkN CisJCWdvdG8gbm9uZTsNCisNCisJaWYobGlrZWx5KGVudHJ5KSkNCisJCXJldHVybiBlbnRyeTsN CisNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCW1hcy0+aW5kZXggPSBwaXZvdHNb MF0gKyAxOw0KKwltYXMtPm9mZnNldCA9IDE7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90 cywgMSk7DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwlpZiAobWFzLT5pbmRleCA+IGxpbWl0KQ0KKwkJZ290byBub25lOw0KKw0KKwlpZihs aWtlbHkoZW50cnkpKQ0KKwkJcmV0dXJuIGVudHJ5Ow0KKw0KK25vbmU6DQorCWlmIChsaWtlbHko IW1hX2RlYWRfbm9kZShtbikpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCXJldHVybiBO VUxMOw0KK30NCisNCisvKiBEZXB0aCBmaXJzdCBzZWFyY2gsIHBvc3Qtb3JkZXIgKi8NCitzdGF0 aWMgdm9pZCBtYXNfZGZzX3Bvc3RvcmRlcihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg bG9uZyBtYXgpDQorew0KKw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnAgPSBNQVNfTk9ORSwgKm1u ID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25lZCBsb25nIHBfbWluLCBwX21heDsNCisNCisJbWFzX25l eHRfbm9kZShtYXMsIG1hc19tbihtYXMpLCBtYXgpOw0KKwlpZiAoIW1hc19pc19ub25lKG1hcykp DQorCQlyZXR1cm47DQorDQorCWlmIChtdGVfaXNfcm9vdChtbikpDQorCQlyZXR1cm47DQorDQor CW1hcy0+bm9kZSA9IG1uOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorCXdoaWxlIChtYXMtPm5vZGUg IT0gTUFTX05PTkUpIHsNCisJCXAgPSBtYXMtPm5vZGU7DQorCQlwX21pbiA9IG1hcy0+bWluOw0K KwkJcF9tYXggPSBtYXMtPm1heDsNCisJCW1hc19wcmV2X25vZGUobWFzLCAwKTsNCisJfQ0KKw0K KwlpZiAocCA9PSBNQVNfTk9ORSkNCisJCXJldHVybjsNCisNCisJbWFzLT5ub2RlID0gcDsNCisJ bWFzLT5tYXggPSBwX21heDsNCisJbWFzLT5taW4gPSBwX21pbjsNCit9DQorDQorLyogVHJlZSB2 YWxpZGF0aW9ucyAqLw0KK3ZvaWQgbXRfZHVtcF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBt YXgsIHVuc2lnbmVkIGludCBkZXB0aCk7DQordm9pZCBtdF9kdW1wX3JhbmdlKHVuc2lnbmVkIGxv bmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3Rh dGljIGNvbnN0IGNoYXIgc3BhY2VzW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiOw0KKw0KKwlpZiAobWluID09IG1heCkNCisJCXByX2luZm8oIiUuKnMlbHU6ICIsIGRlcHRo ICogMiwgc3BhY2VzLCBtaW4pOw0KKwllbHNlDQorCQlwcl9pbmZvKCIlLipzJWx1LSVsdTogIiwg ZGVwdGggKiAyLCBzcGFjZXMsIG1pbiwgbWF4KTsNCit9DQorDQordm9pZCBtdF9kdW1wX2VudHJ5 KHZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIG1pbiwgdW5zaWduZWQgbG9uZyBtYXgsDQorCQl1 bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwltdF9kdW1wX3JhbmdlKG1pbiwgbWF4LCBkZXB0aCk7 DQorDQorCWlmICh4YV9pc192YWx1ZShlbnRyeSkpDQorCQlwcl9jb250KCJ2YWx1ZSAlbGQgKDB4 JWx4KSBbIk1BX1BUUiJdXG4iLCB4YV90b192YWx1ZShlbnRyeSksDQorCQkJCXhhX3RvX3ZhbHVl KGVudHJ5KSwgZW50cnkpOw0KKwllbHNlIGlmICh4YV9pc196ZXJvKGVudHJ5KSkNCisJCXByX2Nv bnQoInplcm8gKCVsZClcbiIsIHhhX3RvX2ludGVybmFsKGVudHJ5KSk7DQorCWVsc2UgaWYgKG10 X2lzX3Jlc2VydmVkKGVudHJ5KSkNCisJCXByX2NvbnQoIlVOS05PV04gRU5UUlkgKCJNQV9QVFIi KVxuIiwgZW50cnkpOw0KKwllbHNlDQorCQlwcl9jb250KCIiTUFfUFRSIlxuIiwgZW50cnkpOw0K K30NCisNCit2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1 bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwlzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgKm5vZGUgPSAm bXRlX3RvX25vZGUoZW50cnkpLT5tcjY0Ow0KKwlib29sIGxlYWYgPSBtdGVfaXNfbGVhZihlbnRy eSk7DQorCXVuc2lnbmVkIGxvbmcgZmlyc3QgPSBtaW47DQorCWludCBpOw0KKw0KKwlwcl9jb250 KCIgY29udGVudHM6ICIpOw0KKwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfUkFOR0U2NF9TTE9UUyAt IDE7IGkrKykNCisJCXByX2NvbnQoIiJNQV9QVFIiICVsdSAiLCBub2RlLT5zbG90W2ldLCBub2Rl LT5waXZvdFtpXSk7DQorCXByX2NvbnQoIiJNQV9QVFIiXG4iLCBub2RlLT5zbG90W2ldKTsNCisJ Zm9yIChpID0gMDsgaSA8IE1BUExFX1JBTkdFNjRfU0xPVFM7IGkrKykgew0KKwkJdW5zaWduZWQg bG9uZyBsYXN0ID0gbWF4Ow0KKw0KKwkJaWYgKGkgPCAoTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEp KQ0KKwkJCWxhc3QgPSBub2RlLT5waXZvdFtpXTsNCisJCWVsc2UgaWYgKCFub2RlLT5zbG90W2ld ICYmIG1heCAhPSBtdF9tYXhbbXRlX25vZGVfdHlwZShlbnRyeSldKQ0KKwkJCWJyZWFrOw0KKwkJ aWYgKGxhc3QgPT0gMCAmJiBpID4gMCkNCisJCQlicmVhazsNCisJCWlmIChsZWFmKQ0KKwkJCW10 X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlmaXJzdCwgbGFz dCwgZGVwdGggKyAxKTsNCisJCWVsc2UgaWYgKG5vZGUtPnNsb3RbaV0pDQorCQkJbXRfZHVtcF9u b2RlKG10LCBtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBk ZXB0aCArIDEpOw0KKw0KKwkJaWYgKGxhc3QgPT0gbWF4KQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxh c3QgPiBtYXgpIHsNCisJCQlwcl9lcnIoIm5vZGUgIk1BX1BUUiIgbGFzdCAoJWx1KSA+IG1heCAo JWx1KSBhdCBwaXZvdCAlZCFcbiIsDQorCQkJCQlub2RlLCBsYXN0LCBtYXgsIGkpOw0KKwkJCWJy ZWFrOw0KKwkJfQ0KKwkJZmlyc3QgPSBsYXN0ICsgMTsNCisJfQ0KK30NCisNCit2b2lkIG10X2R1 bXBfYXJhbmdlNjQoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LCB2b2lkICplbnRyeSwNCisJ CXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRo KQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82NCAqbm9kZSA9ICZtdGVfdG9fbm9kZShlbnRy eSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9pc19sZWFmKGVudHJ5KTsNCisJdW5zaWduZWQg bG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQorDQorCXByX2NvbnQoIiBjb250ZW50czogIik7 DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKQ0KKwkJcHJfY29u dCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXByX2NvbnQoInwgJTAyWCAlMDJYfCAiLCBub2Rl LT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0KKwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfQVJB TkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KE1BX1BUUiIgJWx1ICIsIG5vZGUtPnNs b3RbaV0sIG5vZGUtPnBpdm90W2ldKTsNCisJcHJfY29udChNQV9QVFIiXG4iLCBub2RlLT5zbG90 W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX0FSQU5HRTY0X1NMT1RTOyBpKyspIHsNCisJ CXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExFX0FSQU5HRTY0 X1NMT1RTIC0gMSkpDQorCQkJbGFzdCA9IG5vZGUtPnBpdm90W2ldOw0KKwkJZWxzZSBpZiAoIW5v ZGUtPnNsb3RbaV0pDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA9PSAwICYmIGkgPiAwKQ0KKwkJ CWJyZWFrOw0KKwkJaWYgKGxlYWYpDQorCQkJbXRfZHVtcF9lbnRyeShtdF9zbG90KG10LCBub2Rl LT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEpOw0KKwkJZWxzZSBpZiAo bm9kZS0+c2xvdFtpXSkNCisJCQltdF9kdW1wX25vZGUobXQsIG10X3Nsb3QobXQsIG5vZGUtPnNs b3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRlcHRoICsgMSk7DQorDQorCQlpZiAobGFzdCA9 PSBtYXgpDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA+IG1heCkgew0KKwkJCXByX2Vycigibm9k ZSAiTUFfUFRSIiBsYXN0ICglbHUpID4gbWF4ICglbHUpIGF0IHBpdm90ICVkIVxuIiwNCisJCQkJ CW5vZGUsIGxhc3QsIG1heCwgaSk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlmaXJzdCA9IGxhc3Qg KyAxOw0KKwl9DQorfQ0KKw0KK3ZvaWQgbXRfZHVtcF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV90 cmVlICptdCwgdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9u ZyBtYXgsIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2Rl ID0gbXRlX3RvX25vZGUoZW50cnkpOw0KKwl1bnNpZ25lZCBpbnQgdHlwZSA9IG10ZV9ub2RlX3R5 cGUoZW50cnkpOw0KKwl1bnNpZ25lZCBpbnQgaTsNCisNCisJbXRfZHVtcF9yYW5nZShtaW4sIG1h eCwgZGVwdGgpOw0KKw0KKwlwcl9jb250KCJub2RlICJNQV9QVFIiIGRlcHRoICVkIHR5cGUgJWQg cGFyZW50ICJNQV9QVFIsIG5vZGUsIGRlcHRoLCB0eXBlLA0KKwkJCW5vZGUgPyBub2RlLT5wYXJl bnQgOiBOVUxMKTsNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlw cl9jb250KCJcbiIpOw0KKwkJZm9yIChpID0gMDsgaSA8IE1BUExFX05PREVfU0xPVFM7IGkrKykg ew0KKwkJCWlmIChtaW4gKyBpID4gbWF4KQ0KKwkJCQlwcl9jb250KCJPVVQgT0YgUkFOR0U6ICIp Ow0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlt aW4gKyBpLCBtaW4gKyBpLCBkZXB0aCk7DQorCQl9DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9s ZWFmXzY0Og0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwkJbXRfZHVtcF9yYW5nZTY0KG10LCBl bnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82 NDoNCisJCW10X2R1bXBfYXJhbmdlNjQobXQsIGVudHJ5LCBtaW4sIG1heCwgZGVwdGgpOw0KKwkJ YnJlYWs7DQorDQorCWRlZmF1bHQ6DQorCQlwcl9jb250KCIgVU5LTk9XTiBUWVBFXG4iKTsNCisJ fQ0KK30NCisNCit2b2lkIG10X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sN CisJdm9pZCAqZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobXQtPm1hX3Jvb3QsIG10X2xv Y2tlZChtdCkpOw0KKw0KKwlwcl9pbmZvKCJtYXBsZV90cmVlKCJNQV9QVFIiKSBmbGFncyAlWCwg aGVpZ2h0ICV1IHJvb3QgIk1BX1BUUiJcbiIsDQorCQkgbXQsIG10LT5tYV9mbGFncywgbXRfaGVp Z2h0KG10KSwgZW50cnkpOw0KKwlpZiAoIXhhX2lzX25vZGUoZW50cnkpKQ0KKwkJbXRfZHVtcF9l bnRyeShlbnRyeSwgMCwgMCwgMCk7DQorCWVsc2UgaWYgKGVudHJ5KQ0KKwkJbXRfZHVtcF9ub2Rl KG10LCBlbnRyeSwgMCwgbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSwgMCk7DQorfQ0KKw0K Ky8qDQorICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGdhcCBpbiBhIG5vZGUgYW5kIGNoZWNrIGlm IHRoYXQncyB3aGF0IGlzIHJlcG9ydGVkIGluDQorICogdGhlIHBhcmVudCAodW5sZXNzIHJvb3Qp Lg0KKyAqLw0KK3ZvaWQgbWFzX3ZhbGlkYXRlX2dhcHMoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm10ZSA9IG1hcy0+bm9kZTsNCisJc3RydWN0IG1hcGxl X25vZGUgKnBfbW47DQorCXVuc2lnbmVkIGxvbmcgZ2FwID0gMCwgbWF4X2dhcCA9IDA7DQorCXVu c2lnbmVkIGxvbmcgcF9lbmQsIHBfc3RhcnQgPSBtYXMtPm1pbjsNCisJdW5zaWduZWQgY2hhciBw X3Nsb3Q7DQorCXVuc2lnbmVkIGxvbmcgKmdhcHMgPSBOVUxMOw0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHMgPSBtYV9waXZvdHMobXRlX3RvX25vZGUobXRlKSwgbXRlX25vZGVfdHlwZShtdGUpKTsN CisJaW50IGk7DQorDQorCWlmIChtYV9pc19kZW5zZShtdGVfbm9kZV90eXBlKG10ZSkpKSB7DQor CQlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudChtdGUpOyBpKyspIHsNCisJCQlpZiAobWFz X2dldF9zbG90KG1hcywgaSkpIHsNCisJCQkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJCQltYXhf Z2FwID0gZ2FwOw0KKwkJCQlnYXAgPSAwOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZ2Fw Kys7DQorCQl9DQorCQlnb3RvIGNvdW50ZWQ7DQorCX0NCisNCisJZ2FwcyA9IG1hX2dhcHMobXRl X3RvX25vZGUobXRlKSwgbXRlX25vZGVfdHlwZShtdGUpKTsNCisJZm9yIChpID0gMDsgaSA8IG10 X3Nsb3RfY291bnQobXRlKTsgaSsrKSB7DQorCQlwX2VuZCA9IG1hc19sb2dpY2FsX3Bpdm90KG1h cywgcGl2b3RzLCBpLCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKw0KKwkJaWYgKCFnYXBzKSB7DQor CQkJaWYgKG1hc19nZXRfc2xvdChtYXMsIGkpKSB7DQorCQkJCWdhcCA9IDA7DQorCQkJCWdvdG8g bm90X2VtcHR5Ow0KKwkJCX0NCisNCisJCQlnYXAgKz0gcF9lbmQgLSBwX3N0YXJ0ICsgMTsNCisJ CX0gZWxzZSB7DQorCQkJdm9pZCAqZW50cnkgPSBtYXNfZ2V0X3Nsb3QobWFzLCBpKTsNCisNCisJ CQlnYXAgPSBnYXBzW2ldOw0KKwkJCWlmICghZW50cnkpIHsNCisJCQkJaWYgKGdhcCAhPSBwX2Vu ZCAtIHBfc3RhcnQgKyAxKSB7DQorCQkJCQlwcl9lcnIoTUFfUFRSIlsldV0gLT4gIk1BX1BUUiIg JWx1ICE9ICVsdSAtICVsdSArIDFcbiIsDQorCQkJCQkJbWFzX21uKG1hcyksIGksDQorCQkJCQkJ bWFzX2dldF9zbG90KG1hcywgaSksIGdhcCwNCisJCQkJCQlwX2VuZCwgcF9zdGFydCk7DQorCQkJ CQltdF9kdW1wKG1hcy0+dHJlZSk7DQorDQorCQkJCQlNVF9CVUdfT04obWFzLT50cmVlLA0KKwkJ CQkJCWdhcCAhPSBwX2VuZCAtIHBfc3RhcnQgKyAxKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7DQor CQkJCWlmIChnYXAgPiBwX2VuZCAtIHBfc3RhcnQgKyAxKSB7DQorCQkJCQlwcl9lcnIoTUFfUFRS IlsldV0gJWx1ID49ICVsdSAtICVsdSArIDEgKCVsdSlcbiIsDQorCQkJCQltYXNfbW4obWFzKSwg aSwgZ2FwLCBwX2VuZCwgcF9zdGFydCwNCisJCQkJCXBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJ CQkJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCQkJCQlnYXAgPiBwX2VuZCAtIHBfc3RhcnQgKyAx KTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisNCisJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCW1h eF9nYXAgPSBnYXA7DQorbm90X2VtcHR5Og0KKwkJcF9zdGFydCA9IHBfZW5kICsgMTsNCisJCWlm IChwX2VuZCA+PSBtYXMtPm1heCkNCisJCQlicmVhazsNCisJfQ0KKw0KK2NvdW50ZWQ6DQorCWlm IChtdGVfaXNfcm9vdChtdGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlwX3Nsb3QgPSBtdGVfcGFyZW50 X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9tbiA9IG10ZV9wYXJlbnQobXRlKTsNCisJTVRfQlVHX09O KG1hcy0+dHJlZSwgbWF4X2dhcCA+IG1hcy0+bWF4KTsNCisJaWYgKG1hX2dhcHMocF9tbiwgbWFz X3BhcmVudF9lbnVtKG1hcywgbXRlKSlbcF9zbG90XSAhPSBtYXhfZ2FwKSB7DQorCQlwcl9lcnIo ImdhcCAiTUFfUFRSIlsldV0gIT0gJWx1XG4iLCBwX21uLCBwX3Nsb3QsIG1heF9nYXApOw0KKwkJ bXRfZHVtcChtYXMtPnRyZWUpOw0KKwl9DQorDQorCU1UX0JVR19PTihtYXMtPnRyZWUsDQorCQkg IG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1hcywgbXRlKSlbcF9zbG90XSAhPSBtYXhf Z2FwKTsNCit9DQorDQordm9pZCBtYXNfdmFsaWRhdGVfcGFyZW50X3Nsb3Qoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFw bGVfZW5vZGUgKm5vZGU7DQorCWVudW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtYXNfcGFyZW50X2Vu dW0obWFzLCBtYXMtPm5vZGUpOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdCA9IG10ZV9wYXJlbnRf c2xvdChtYXMtPm5vZGUpOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCWludCBpOw0KKw0KKwlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJcGFyZW50ID0gbXRl X3BhcmVudChtYXMtPm5vZGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgcF90eXBlKTsN CisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWFzX21uKG1hcykgPT0gcGFyZW50KTsNCisNCisJLyog Q2hlY2sgcHJldi9uZXh0IHBhcmVudCBzbG90IGZvciBkdXBsaWNhdGUgbm9kZSBlbnRyeSAqLw0K Kw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdHNbcF90eXBlXTsgaSsrKSB7DQorCQlub2RlID0g bWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorCQlpZiAoaSA9PSBwX3Nsb3QpIHsNCisJCQlpZiAo bm9kZSAhPSBtYXMtPm5vZGUpDQorCQkJCXByX2VycigicGFyZW50ICVwWyV1XSBkb2VzIG5vdCBo YXZlICVwXG4iLA0KKwkJCQkJcGFyZW50LCBpLCBtYXNfbW4obWFzKSk7DQorCQkJTVRfQlVHX09O KG1hcy0+dHJlZSwgbm9kZSAhPSBtYXMtPm5vZGUpOw0KKwkJfSBlbHNlIGlmIChub2RlID09IG1h cy0+bm9kZSkgew0KKwkJCXByX2VycigicGFyZW50IGNvbnRhaW5zIGludmFsaWQgY2hpbGQgYXQg Ik1BX1BUUiJbJXVdICINCisJCQkJTUFfUFRSIiBwX3Nsb3QgJXVcbiIsIHBhcmVudCwgaSwgbWFz X21uKG1hcyksIHBfc2xvdCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9kZSA9PSBtYXMt Pm5vZGUpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK3ZvaWQgbWFzX3ZhbGlkYXRlX2NoaWxkX3Nsb3Qo c3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobXRl X3RvX25vZGUobWFzLT5ub2RlKSwgdHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1h X3Bpdm90cyhtdGVfdG9fbm9kZShtYXMtPm5vZGUpLCB0eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpjaGlsZDsNCisJdW5zaWduZWQgY2hhciBpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFz LT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RzW3R5cGVd OyBpKyspIHsNCisJCWNoaWxkID0gbWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorCQlpZiAoIXBp dm90c1tpXSB8fCBwaXZvdHNbaV0gPT0gbWFzLT5tYXgpDQorCQkJYnJlYWs7DQorDQorCQlpZiAo IWNoaWxkKQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKG10ZV9wYXJlbnRfc2xvdChjaGlsZCkgIT0g aSkgew0KKwkJCXByX2VycigiY2hpbGQgaGFzIGluY29ycmVjdCBzbG90IGF0ICJNQV9QVFIiWyV1 XSAiDQorCQkJCU1BX1BUUiIgaXMgc2V0IHRvICV1XG4iLCBtYXNfbW4obWFzKSwNCisJCQkJaSwg bXRlX3RvX25vZGUoY2hpbGQpLCBtdGVfcGFyZW50X3Nsb3QoY2hpbGQpKTsNCisJCQlNVF9CVUdf T04obWFzLT50cmVlLCAxKTsNCisJCX0NCisNCisJCWlmIChtdGVfcGFyZW50KGNoaWxkKSAhPSBt dGVfdG9fbm9kZShtYXMtPm5vZGUpKSB7DQorCQkJcHJfZXJyKCJjaGlsZCAiTUFfUFRSIiBoYXMg cGFyZW50ICJNQV9QVFIiIG5vdCAiTUFfUFRSIlxuIiwNCisJCQltdGVfdG9fbm9kZShjaGlsZCks IG10ZV9wYXJlbnQoY2hpbGQpLA0KKwkJCW10ZV90b19ub2RlKG1hcy0+bm9kZSkpOw0KKwkJCU1U X0JVR19PTihtYXMtPnRyZWUsIDEpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8qDQorICogVmFsaWRh dGUgYWxsIHBpdm90cyBhcmUgd2l0aGluIG1hcy0+bWluIGFuZCBtYXMtPm1heC4NCisgKi8NCit2 b2lkIG1hc192YWxpZGF0ZV9saW1pdHMoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlpbnQg aTsNCisJdW5zaWduZWQgbG9uZyBwcmV2X3BpdiA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90cyA9 IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+bm9kZSksDQorCQkJCW10ZV9ub2RlX3R5cGUobWFz LT5ub2RlKSk7DQorDQorCS8qIGFsbCBsaW1pdHMgYXJlIGZpbmUgaGVyZS4gKi8NCisJaWYgKG10 ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBt dF9zbG90X2NvdW50KG1hcy0+bm9kZSk7IGkrKykgew0KKwkJZW51bSBtYXBsZV90eXBlIHR5cGUg PSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQl1bnNpZ25lZCBsb25nICpwaXZvdHMgPSBt YV9waXZvdHMobWFzX21uKG1hcyksIHR5cGUpOw0KKwkJdW5zaWduZWQgbG9uZyBwaXYgPSBtYXNf c2FmZV9waXZvdChtYXMsIHBpdm90cywgdHlwZSwgaSk7DQorDQorCQlpZiAoIXBpdikNCisJCQli cmVhazsNCisNCisJCWlmICghbXRlX2lzX2xlYWYobWFzLT5ub2RlKSkgew0KKwkJCXZvaWQgKmVu dHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQorCQkJaWYgKCFlbnRyeSkNCisJCQkJcHJf ZXJyKE1BX1BUUiJbJXVdIGNhbm5vdCBiZSBudWxsXG4iLA0KKwkJCQkgICAgICAgbWFzX21uKG1h cyksIGkpOw0KKw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsICFlbnRyeSk7DQorCQl9DQorDQor CQlpZiAocHJldl9waXYgPiBwaXYpIHsNCisJCQlwcl9lcnIoTUFfUFRSIlsldV0gcGl2ICVsdSA8 IHByZXZfcGl2ICVsdVxuIiwNCisJCQkJbWFzX21uKG1hcyksIGksIHBpdiwgcHJldl9waXYpOw0K KwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIHBpdiA8IHByZXZfcGl2KTsNCisJCX0NCisNCisJCWlm IChwaXYgPCBtYXMtPm1pbikgew0KKwkJCXByX2VycihNQV9QVFIiWyV1XSAlbHUgPCAlbHVcbiIs IG1hc19tbihtYXMpLCBpLA0KKwkJCQlwaXYsIG1hcy0+bWluKTsNCisJCQlNVF9CVUdfT04obWFz LT50cmVlLCBwaXYgPCBtYXMtPm1pbik7DQorCQl9DQorCQlpZiAocGl2ID4gbWFzLT5tYXgpIHsN CisJCQlwcl9lcnIoTUFfUFRSIlsldV0gJWx1ID4gJWx1XG4iLCBtYXNfbW4obWFzKSwgaSwNCisJ CQkJcGl2LCBtYXMtPm1heCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgcGl2ID4gbWFzLT5t YXgpOw0KKwkJfQ0KKwkJcHJldl9waXYgPSBwaXY7DQorCQlpZiAocGl2ID09IG1hcy0+bWF4KQ0K KwkJCWJyZWFrOw0KKwl9DQorfQ0KKw0KK3ZvaWQgbXRfdmFsaWRhdGVfbnVsbHMoc3RydWN0IG1h cGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqZW50cnksICpsYXN0ID0gKHZvaWQgKikxOw0KKwl1 bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJTUFfU1RB VEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1hc19zdGFydCgmbWFzKTsNCisJaWYgKG1hc19pc19u b25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBNQVNfUk9PVCkpDQorCQlyZXR1cm47DQorDQorCXdo aWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUpKQ0KKwkJbWFzX2Rlc2NlbmQoJm1hcyk7DQorDQor CXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUpLCBtdGVfbm9kZV90eXBlKG1h cy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3QoJm1hcywgc2xvdHMsIG9mZnNl dCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5KSB7DQorCQkJcHJfZXJyKCJTZXF1ZW50aWFsIG51 bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJCW1hc19tbigmbWFzKSwgb2Zmc2V0KTsNCisJCX0N CisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYgIWVudHJ5KTsNCisJCWxhc3QgPSBlbnRyeTsNCisJ CWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5kKCZtYXMpKSB7DQorCQkJbWFzX25leHRfbm9kZSgm bWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCk7DQorCQkJaWYgKG1hc19pc19ub25lKCZtYXMp KQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0ID0gMDsNCisJCQlzbG90cyA9IG1hX3Nsb3RzKG10 ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJCSBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKSk7DQor CQl9IGVsc2UNCisJCQlvZmZzZXQrKzsNCisNCisJfSB3aGlsZSAoIW1hc19pc19ub25lKCZtYXMp KTsNCit9DQorDQorLyoNCisgKiB2YWxpZGF0ZSBhIG1hcGxlIHRyZWUgYnkgY2hlY2tpbmc6DQor ICogMS4gVGhlIGxpbWl0cyAocGl2b3RzIGFyZSB3aXRoaW4gbWFzLT5taW4gdG8gbWFzLT5tYXgp DQorICogMi4gVGhlIGdhcCBpcyBjb3JyZWN0bHkgc2V0IGluIHRoZSBwYXJlbnRzDQorICovDQor dm9pZCBtdF92YWxpZGF0ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl1bnNpZ25lZCBj aGFyIGVuZDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorCXJjdV9yZWFkX2xvY2so KTsNCisJbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAoIW1hc19zZWFyY2hhYmxlKCZtYXMpKQ0KKwkJ Z290byBkb25lOw0KKw0KKwltYXNfZmlyc3RfZW50cnkoJm1hcywgbWFzX21uKCZtYXMpLCBVTE9O R19NQVgsIG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpKTsNCisJd2hpbGUgKCFtYXNfaXNfbm9uZSgm bWFzKSkgew0KKwkJTVRfQlVHX09OKG1hcy50cmVlLCBtdGVfZGVhZF9ub2RlKG1hcy5ub2RlKSk7 DQorCQlpZiAoIW10ZV9pc19yb290KG1hcy5ub2RlKSkgew0KKwkJCWVuZCA9IG1hc19kYXRhX2Vu ZCgmbWFzKTsNCisJCQlpZiAoKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy5ub2RlKSkgJiYN CisJCQkgICAgKG1hcy5tYXggIT0gVUxPTkdfTUFYKSkgew0KKwkJCQlwcl9lcnIoIkludmFsaWQg c2l6ZSAldSBvZiAiTUFfUFRSIlxuIiwgZW5kLA0KKwkJCQltYXNfbW4oJm1hcykpOw0KKwkJCQlN VF9CVUdfT04obWFzLnRyZWUsIDEpOw0KKwkJCX0NCisNCisJCX0NCisJCW1hc192YWxpZGF0ZV9w YXJlbnRfc2xvdCgmbWFzKTsNCisJCW1hc192YWxpZGF0ZV9jaGlsZF9zbG90KCZtYXMpOw0KKwkJ bWFzX3ZhbGlkYXRlX2xpbWl0cygmbWFzKTsNCisJCWlmIChtdF9pc19hbGxvYyhtdCkpDQorCQkJ bWFzX3ZhbGlkYXRlX2dhcHMoJm1hcyk7DQorCQltYXNfZGZzX3Bvc3RvcmRlcigmbWFzLCBVTE9O R19NQVgpOw0KKwl9DQorCW10X3ZhbGlkYXRlX251bGxzKG10KTsNCitkb25lOg0KKwlyY3VfcmVh ZF91bmxvY2soKTsNCisNCit9DQorDQorI2VuZGlmIC8qIENPTkZJR19ERUJVR19NQVBMRV9UUkVF ICovDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUgYi90 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KaW5kZXggZDk3MTUxNjQwMWU2Li5j OTAxZDk2ZGQwMTMgMTAwNjQ0DQotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGln bm9yZQ0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUNCkBAIC02LDMg KzYsNSBAQCBtYWluDQogbXVsdGlvcmRlcg0KIHJhZGl4LXRyZWUuYw0KIHhhcnJheQ0KK21hcGxl DQorbWFfeGFfYmVuY2htYXJrDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVl L2dlbmVyYXRlZC9hdXRvY29uZi5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRl ZC9hdXRvY29uZi5oDQppbmRleCAyMjE4YjNjYzE4NGUuLmU3ZGE4MDM1MDIzNiAxMDA2NDQNCi0t LSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaA0KKysrIGIv dG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQpAQCAtMSArMSwy IEBADQogI2RlZmluZSBDT05GSUdfWEFSUkFZX01VTFRJIDENCisjZGVmaW5lIENPTkZJR182NEJJ VCAxDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3Ry ZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90cmVlLmgNCm5ldyBm aWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjg5ZjU2MWU2ODg0MQ0KLS0tIC9k ZXYvbnVsbA0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUu aA0KQEAgLTAsMCArMSw3IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr ICovDQorI2RlZmluZSBhdG9taWNfdCBpbnQzMl90DQorI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2lu Y2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oIg0KKyNkZWZpbmUgYXRvbWljX2luYyh4KSB1YXRvbWlj X2luYyh4KQ0KKyNkZWZpbmUgYXRvbWljX3JlYWQoeCkgdWF0b21pY19yZWFkKHgpDQorI2RlZmlu ZSBhdG9taWNfc2V0KHgsIHkpIGRvIHt9IHdoaWxlKDApDQorI2RlZmluZSBVOF9NQVggVUNIQVJf TUFYDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxlLmMgYi90b29s cy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4 IDAwMDAwMDAwMDAwMC4uMzUwODI2NzE5MjhhDQotLS0gL2Rldi9udWxsDQorKysgYi90b29scy90 ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KQEAgLTAsMCArMSw1OSBAQA0KKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KKy8qDQorICogbWFwbGVfdHJlZS5jOiBVc2Vyc3Bh Y2Ugc2hpbSBmb3IgbWFwbGUgdHJlZSB0ZXN0LXN1aXRlDQorICogQ29weXJpZ2h0IChjKSAyMDE4 IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQorICovDQorDQorI2Rl ZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKyNkZWZpbmUgQ09ORklHX01BUExFX1NFQVJD SA0KKyNpbmNsdWRlICJ0ZXN0LmgiDQorDQorI2RlZmluZSBtb2R1bGVfaW5pdCh4KQ0KKyNkZWZp bmUgbW9kdWxlX2V4aXQoeCkNCisjZGVmaW5lIE1PRFVMRV9BVVRIT1IoeCkNCisjZGVmaW5lIE1P RFVMRV9MSUNFTlNFKHgpDQorI2RlZmluZSBkdW1wX3N0YWNrKCkJYXNzZXJ0KDApDQorDQorI2lu Y2x1ZGUgIi4uLy4uLy4uL2xpYi9tYXBsZV90cmVlLmMiDQorI3VuZGVmIENPTkZJR19ERUJVR19N QVBMRV9UUkVFDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi90ZXN0X21hcGxlX3RyZWUuYyINCisN Cit2b2lkIGZhcm1lcl90ZXN0cyh2b2lkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7 DQorCURFRklORV9NVFJFRSh0cmVlKTsNCisNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCXRyZWUu bWFfcm9vdCA9IHhhX21rX3ZhbHVlKDApOw0KKwltdF9kdW1wKCZ0cmVlKTsNCisNCisJbm9kZSA9 IG10X2FsbG9jX29uZShHRlBfS0VSTkVMKTsNCisJbm9kZS0+cGFyZW50ID0gKHZvaWQgKikoKHVu c2lnbmVkIGxvbmcpKCZ0cmVlKSB8IDEpOw0KKwlub2RlLT5zbG90WzBdID0geGFfbWtfdmFsdWUo MCk7DQorCW5vZGUtPnNsb3RbMV0gPSB4YV9ta192YWx1ZSgxKTsNCisJbm9kZS0+bXI2NC5waXZv dFswXSA9IDA7DQorCW5vZGUtPm1yNjQucGl2b3RbMV0gPSAxOw0KKwlub2RlLT5tcjY0LnBpdm90 WzJdID0gMDsNCisJdHJlZS5tYV9yb290ID0gbXRfbWtfbm9kZShub2RlLCBtYXBsZV9sZWFmXzY0 KTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW1hX2ZyZWVfcmN1KG5vZGUpOw0KK30NCisNCit2 b2lkIG1hcGxlX3RyZWVfdGVzdHModm9pZCkNCit7DQorCWZhcm1lcl90ZXN0cygpOw0KKwltYXBs ZV90cmVlX3NlZWQoKTsNCisJbWFwbGVfdHJlZV9oYXJ2ZXN0KCk7DQorfQ0KKw0KK2ludCBfX3dl YWsgbWFpbih2b2lkKQ0KK3sNCisJbWFwbGVfdHJlZV9pbml0KCk7DQorCW1hcGxlX3RyZWVfdGVz dHMoKTsNCisJcmN1X2JhcnJpZXIoKTsNCisJaWYgKG5yX2FsbG9jYXRlZCkNCisJCXByaW50Zigi bnJfYWxsb2NhdGVkID0gJWRcbiIsIG5yX2FsbG9jYXRlZCk7DQorCXJldHVybiAwOw0KK30NCmRp ZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21hcGxlX3Ry ZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5o DQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi5lNjUzZDAyMzY2M2IN Ci0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVu dHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDMgQEANCisjZGVmaW5lIHRyYWNlX21hX29wKGEs IGIpIGRvIHt9IHdoaWxlKDApOw0KKyNkZWZpbmUgdHJhY2VfbWFfcmVhZChhLCBiKSBkbyB7fSB3 aGlsZSgwKTsNCisjZGVmaW5lIHRyYWNlX21hX3dyaXRlKGEsIGIsIGMsIGQpIGRvIHt9IHdoaWxl KDApOw0KLS0gDQoyLjM0LjENCg==