From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id E6074A00E6 for ; Thu, 16 May 2019 17:28:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F29F87D05; Thu, 16 May 2019 17:28:21 +0200 (CEST) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-eopbgr60080.outbound.protection.outlook.com [40.107.6.80]) by dpdk.org (Postfix) with ESMTP id 777107CE2 for ; Thu, 16 May 2019 17:28:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=i+dk8ckmoOrLvoTYJoc902v4dUWngYsSPLrJHjojnFg=; b=X4VNJ5xJts8XQLwhGgiApiXE+pnwWUClOQQ1w19G7eOIAoUQ5kaCVib9r+S4kqbdbbJQdiUZ7VEF6Ch/FE4/8uEsluy9unTcq2Ur7Jj34f1+Gjc3W9he/c9SfPK3lA+QXeoSJvvSkw7Ai1UFRbpzvTMowj9bO9qBoZwnDVoGDA4= Received: from AM0PR05MB4435.eurprd05.prod.outlook.com (52.134.95.151) by AM0PR05MB5282.eurprd05.prod.outlook.com (20.178.18.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1878.24; Thu, 16 May 2019 15:28:14 +0000 Received: from AM0PR05MB4435.eurprd05.prod.outlook.com ([fe80::c40a:d6fe:1246:7278]) by AM0PR05MB4435.eurprd05.prod.outlook.com ([fe80::c40a:d6fe:1246:7278%4]) with mapi id 15.20.1878.024; Thu, 16 May 2019 15:28:14 +0000 From: Moti Haimovsky To: Shahaf Shuler CC: "dev@dpdk.org" , Moti Haimovsky Thread-Topic: [RFC] net/mlx5: remove TCF support from PMD Thread-Index: AQHVC/v68gKRP6GeJkeiu9oKmIHxYA== Date: Thu, 16 May 2019 15:28:14 +0000 Message-ID: <1558020480-156711-1-git-send-email-motih@mellanox.com> Accept-Language: he-IL, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: LO2P265CA0147.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9::15) To AM0PR05MB4435.eurprd05.prod.outlook.com (2603:10a6:208:61::23) authentication-results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 1.8.3.1 x-originating-ip: [37.142.13.130] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 89bed234-0e44-4fa0-a337-08d6da131ca7 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600141)(711020)(4605104)(4618075)(2017052603328)(7193020); SRVR:AM0PR05MB5282; x-ms-traffictypediagnostic: AM0PR05MB5282: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1247; x-forefront-prvs: 0039C6E5C5 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(136003)(39860400002)(346002)(366004)(376002)(396003)(189003)(199004)(52314003)(66446008)(68736007)(64756008)(66556008)(66476007)(73956011)(5660300002)(52116002)(37006003)(99286004)(66946007)(6436002)(6506007)(386003)(478600001)(107886003)(6486002)(7736002)(3846002)(102836004)(6116002)(36756003)(4720700003)(5024004)(86362001)(256004)(14454004)(14444005)(25786009)(50226002)(2906002)(6862004)(53936002)(53946003)(30864003)(6512007)(305945005)(6636002)(8676002)(81156014)(71190400001)(186003)(71200400001)(54906003)(26005)(316002)(476003)(2616005)(66066001)(4326008)(81166006)(8936002)(486006)(21314003)(569006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR05MB5282; H:AM0PR05MB4435.eurprd05.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: 6gCbMByyFKd/KNL7x4GztF07g7mdQTJ2LNDk+X+sWHMPcOjZhdFGPQzq6n/+UFtzC7jMDqZ8A3MHK9OhD4si8OYOn3u1Jak6nrkyFL5Jbj22ErG/pwzgHvoKcjmSBWsvEH2ld00MOPrvzvc87x093L+krUiM1Od+KU6MJ/wVmwXJvEVGGh8wirpkLpuQIwVgGCMN5ttAMA6U+DkL8lalaMhNbOoQRz9wPn2QmrmYu3bUbqGmrHG1JtzG8OhaVB334HK+7u+O/cZcwG02VGYwZKaE8jVJ5w2KACKkIbcIGZzjwNtehxmLl0o6AKZs6Poc7yJ20gbifbAGgzbOlsl9Kx9yBjB/ZuRfQDZYeyGOxucaGsyizZvwAYePstyxAEq1q4pSNW/86lrDy0S1K+6dtAL60cvUv2z4MRonXJUiQZc= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-Network-Message-Id: 89bed234-0e44-4fa0-a337-08d6da131ca7 X-MS-Exchange-CrossTenant-originalarrivaltime: 16 May 2019 15:28:14.3623 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR05MB5282 Subject: [dpdk-dev] [RFC] net/mlx5: remove TCF support from PMD X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" VG9kYXksIGl0IGlzIHBvc3NpYmxlIHRvIG9mZmxvYWQgYW4gaW50ZXJmYWNlIGZsb3cgcnVsZXMg dG8gdGhlDQpoYXJkd2FyZSB1c2luZyBEUERLIGZsb3cgY29tbWFuZHMuDQpXaXRoIG1seDUgaXQg aXMgYWxzbyBwb3NzaWJsZSB0byBvZmZsb2FkIGEgbGltaXRlZCBzZXQgb2YgZmxvdyBydWxlcw0K dG8gdGhlIG1seHN3IChvciBFLXN3aXRjaCkgdXNpbmcgdGhlIHNhbWUgRFBESyBmbG93IGNvbW1h bmRzLg0KQSAndHJhbnNmZXInIGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8gdGhlIGZsb3cgcnVsZSBj cmVhdGlvbiBjb21tYW5kIGluDQpvcmRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGNvbmZpZ3Vy aW5nIHBvcnQgZmxvd3MgYW5kIEUtc3dpdGNoDQpmbG93cy4gVGhlIGNvbW1hbmRzIGRlc3RpbmVk IGZvciB0aGUgRS1zd2l0Y2ggYXJlIHRyYW5zcG9zZWQgdG8NClRDLWZsb3dlciBydWxlcyBhbmQg YXJlIHNlbmQsIGFzIE5ldGxpbmsgbWVzc2FnZXMsIHRvIHRoZSBtbHg1IGRyaXZlciwNCm9yIG1v cmUgcHJlY2lzZWx5IHRvIHRoZSBuZXRkZXYgd2hpY2ggcmVwcmVzZW50IHRoZSBtbHhzdyBwb3J0 Lg0KV2l0aCB0aGUgYWRkaXRpb24gdG8gdGhlIFBNRCBvZiBFLXN3aXRjaCBjb25maWd1cmF0aW9u IHZpYSBEUg0KKGRpcmVjdCB2ZXJicyBydWxlcykgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNvbmZp Z3VyZSB0aGUgRS1zd2l0Y2gNCnVzaW5nIHRoZXNlIGNvbW1hbmRzIGluc3RlYWQgb2YgdXNpbmcg VEMtRmxvd2VyIG1lc3NhZ2VzLg0KRG9pbmcgc28gd2lsbCBhbGxvdyB1cyB0byByZW1vdmUgdGhl IFRDRiBzdXBwb3J0IGFuZCB0aGUgZGVwZW5kZW5jeQ0Kb2YgbGlibW5sIGZyb20gdGhlIFBNRC4N ClRoZSBwdXJwb3NlIG9mIHRoaXMgUkZDIGlzIHRvIHByb3Bvc2UgY29uZmlndXJpbmcgdGhlIEUt c3dpdGNoDQpmbG93IGZpbHRlcmluZyB1c2luZyBEUiwgdG8gcmVtb3ZlIHRoZSBUQ0Ygc3VwcG9y dCBmcm9tIHRoZSBQTUQgYW5kDQp0byByZW1vdmUgdGhlIGRlcGVuZGVuY3kgb2YgdGhlIFBNRCBp biBsaWJtbmwuDQpBcyBmb3IgdG9kYXkgVkxBTiBpbnNlcnRpb24gb3IgcmVtb3ZhbCBpcyBub3Qg c3VwcG9ydGVkIGluIERSLCB0aGlzDQpzdXBwb3J0IHdpbGwgYmUgYWRkZWQgaW4gc2VwYXJhdGUg Y29tbWl0cy4NCg0KU2lnbmVkLW9mZi1ieTogTW90aSBIYWltb3Zza3kgPG1vdGloQG1lbGxhbm94 LmNvbT4NCi0tLQ0KIGRyaXZlcnMvbmV0L21seDUvTWFrZWZpbGUgICAgICAgIHwgICAgMyAtDQog ZHJpdmVycy9uZXQvbWx4NS9tbHg1LmMgICAgICAgICAgfCAgIDMyIC0NCiBkcml2ZXJzL25ldC9t bHg1L21seDUuaCAgICAgICAgICB8ICAgIDEgLQ0KIGRyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93 LmMgICAgIHwgICAzMyArLQ0KIGRyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93LmggICAgIHwgICAy NSAtDQogZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3dfdGNmLmMgfCA2MzgyIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogbWsvcnRlLmFwcC5tayAgICAgICAgICAgICAg ICAgICAgfCAgICAyICstDQogNyBmaWxlcyBjaGFuZ2VkLCAxNyBpbnNlcnRpb25zKCspLCA2NDYx IGRlbGV0aW9ucygtKQ0KIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC9tbHg1L21seDVf Zmxvd190Y2YuYw0KDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NS9NYWtlZmlsZSBiL2Ry aXZlcnMvbmV0L21seDUvTWFrZWZpbGUNCmluZGV4IDI2OTQ5MTYuLmI3OWRjNWQgMTAwNjQ0DQot LS0gYS9kcml2ZXJzL25ldC9tbHg1L01ha2VmaWxlDQorKysgYi9kcml2ZXJzL25ldC9tbHg1L01h a2VmaWxlDQpAQCAtMzIsNyArMzIsNiBAQCBTUkNTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9Q TUQpICs9IG1seDVfcnNzLmMNCiBTUkNTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9QTUQpICs9 IG1seDVfbXIuYw0KIFNSQ1MtJChDT05GSUdfUlRFX0xJQlJURV9NTFg1X1BNRCkgKz0gbWx4NV9m bG93LmMNCiBTUkNTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9QTUQpICs9IG1seDVfZmxvd19k di5jDQotU1JDUy0kKENPTkZJR19SVEVfTElCUlRFX01MWDVfUE1EKSArPSBtbHg1X2Zsb3dfdGNm LmMNCiBTUkNTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9QTUQpICs9IG1seDVfZmxvd192ZXJi cy5jDQogU1JDUy0kKENPTkZJR19SVEVfTElCUlRFX01MWDVfUE1EKSArPSBtbHg1X21wLmMNCiBT UkNTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9QTUQpICs9IG1seDVfbmwuYw0KQEAgLTUyLDcg KzUxLDYgQEAgQ0ZMQUdTICs9IC1EX0RFRkFVTFRfU09VUkNFDQogQ0ZMQUdTICs9IC1EX1hPUEVO X1NPVVJDRT02MDANCiBDRkxBR1MgKz0gJChXRVJST1JfRkxBR1MpDQogQ0ZMQUdTICs9IC1Xbm8t c3RyaWN0LXByb3RvdHlwZXMNCi1DRkxBR1MgKz0gJChzaGVsbCBjb21tYW5kIC12IHBrZy1jb25m aWcgPiAvZGV2L251bGwgMj4mMSAmJiBwa2ctY29uZmlnIC0tY2ZsYWdzIGxpYm1ubCkNCiBpZmVx ICgkKENPTkZJR19SVEVfSUJWRVJCU19MSU5LX0RMT1BFTikseSkNCiBDRkxBR1MgKz0gLURNTFg1 X0dMVUU9JyIkKExJQl9HTFVFKSInDQogQ0ZMQUdTICs9IC1ETUxYNV9HTFVFX1ZFUlNJT049JyIk KExJQl9HTFVFX1ZFUlNJT04pIicNCkBAIC02Myw3ICs2MSw2IEBAIExETElCUyArPSAkKHNoZWxs ICQoUlRFX1NESykvYnVpbGR0b29scy9vcHRpb25zLWlidmVyYnMtc3RhdGljLnNoKQ0KIGVsc2UN CiBMRExJQlMgKz0gLWxpYnZlcmJzIC1sbWx4NQ0KIGVuZGlmDQotTERMSUJTICs9ICQoc2hlbGwg Y29tbWFuZCAtdiBwa2ctY29uZmlnID4gL2Rldi9udWxsIDI+JjEgJiYgcGtnLWNvbmZpZyAtLWxp YnMgbGlibW5sIHx8IGVjaG8gIi1sbW5sIikNCiBMRExJQlMgKz0gLWxydGVfZWFsIC1scnRlX21i dWYgLWxydGVfbWVtcG9vbCAtbHJ0ZV9yaW5nDQogTERMSUJTICs9IC1scnRlX2V0aGRldiAtbHJ0 ZV9uZXQgLWxydGVfa3ZhcmdzDQogTERMSUJTICs9IC1scnRlX2J1c19wY2kNCmRpZmYgLS1naXQg YS9kcml2ZXJzL25ldC9tbHg1L21seDUuYyBiL2RyaXZlcnMvbmV0L21seDUvbWx4NS5jDQppbmRl eCA5ZjVlYzk3Li4wODQyNWY0IDEwMDY0NA0KLS0tIGEvZHJpdmVycy9uZXQvbWx4NS9tbHg1LmMN CisrKyBiL2RyaXZlcnMvbmV0L21seDUvbWx4NS5jDQpAQCAtNjg3LDggKzY4Nyw2IEBAIHN0cnVj dCBtbHg1X2Rldl9zcGF3bl9kYXRhIHsNCiAJCWNsb3NlKHByaXYtPm5sX3NvY2tldF9yb3V0ZSk7 DQogCWlmIChwcml2LT5ubF9zb2NrZXRfcmRtYSA+PSAwKQ0KIAkJY2xvc2UocHJpdi0+bmxfc29j a2V0X3JkbWEpOw0KLQlpZiAocHJpdi0+dGNmX2NvbnRleHQpDQotCQltbHg1X2Zsb3dfdGNmX2Nv bnRleHRfZGVzdHJveShwcml2LT50Y2ZfY29udGV4dCk7DQogCWlmIChwcml2LT5zaCkgew0KIAkJ LyoNCiAJCSAqIEZyZWUgdGhlIHNoYXJlZCBjb250ZXh0IGluIGxhc3QgdHVybiwgYmVjYXVzZSB0 aGUgY2xlYW51cA0KQEAgLTE0OTIsMzQgKzE0OTAsNiBAQCBzdHJ1Y3QgbWx4NV9kZXZfc3Bhd25f ZGF0YSB7DQogCWNsYWltX3plcm8obWx4NV9tYWNfYWRkcl9hZGQoZXRoX2RldiwgJm1hYywgMCwg MCkpOw0KIAlpZiAoY29uZmlnLnZmICYmIGNvbmZpZy52Zl9ubF9lbikNCiAJCW1seDVfbmxfbWFj X2FkZHJfc3luYyhldGhfZGV2KTsNCi0JcHJpdi0+dGNmX2NvbnRleHQgPSBtbHg1X2Zsb3dfdGNm X2NvbnRleHRfY3JlYXRlKCk7DQotCWlmICghcHJpdi0+dGNmX2NvbnRleHQpIHsNCi0JCWVyciA9 IC1ydGVfZXJybm87DQotCQlEUlZfTE9HKFdBUk5JTkcsDQotCQkJImZsb3cgcnVsZXMgcmVseWlu ZyBvbiBzd2l0Y2ggb2ZmbG9hZHMgd2lsbCBub3QgYmUiDQotCQkJIiBzdXBwb3J0ZWQ6IGNhbm5v dCBvcGVuIGxpYm1ubCBzb2NrZXQ6ICVzIiwNCi0JCQlzdHJlcnJvcihydGVfZXJybm8pKTsNCi0J fSBlbHNlIHsNCi0JCXN0cnVjdCBydGVfZmxvd19lcnJvciBlcnJvcjsNCi0JCXVuc2lnbmVkIGlu dCBpZmluZGV4ID0gbWx4NV9pZmluZGV4KGV0aF9kZXYpOw0KLQ0KLQkJaWYgKCFpZmluZGV4KSB7 DQotCQkJZXJyID0gLXJ0ZV9lcnJubzsNCi0JCQllcnJvci5tZXNzYWdlID0NCi0JCQkJImNhbm5v dCByZXRyaWV2ZSBuZXR3b3JrIGludGVyZmFjZSBpbmRleCI7DQotCQl9IGVsc2Ugew0KLQkJCWVy ciA9IG1seDVfZmxvd190Y2ZfaW5pdChwcml2LT50Y2ZfY29udGV4dCwNCi0JCQkJCQkgaWZpbmRl eCwgJmVycm9yKTsNCi0JCX0NCi0JCWlmIChlcnIpIHsNCi0JCQlEUlZfTE9HKFdBUk5JTkcsDQot CQkJCSJmbG93IHJ1bGVzIHJlbHlpbmcgb24gc3dpdGNoIG9mZmxvYWRzIHdpbGwiDQotCQkJCSIg bm90IGJlIHN1cHBvcnRlZDogJXM6ICVzIiwNCi0JCQkJZXJyb3IubWVzc2FnZSwgc3RyZXJyb3Io cnRlX2Vycm5vKSk7DQotCQkJbWx4NV9mbG93X3RjZl9jb250ZXh0X2Rlc3Ryb3kocHJpdi0+dGNm X2NvbnRleHQpOw0KLQkJCXByaXYtPnRjZl9jb250ZXh0ID0gTlVMTDsNCi0JCX0NCi0JfQ0KIAlU QUlMUV9JTklUKCZwcml2LT5mbG93cyk7DQogCVRBSUxRX0lOSVQoJnByaXYtPmN0cmxfZmxvd3Mp Ow0KIAkvKiBIaW50IGxpYm1seDUgdG8gdXNlIFBNRCBhbGxvY2F0b3IgZm9yIGRhdGEgcGxhbmUg cmVzb3VyY2VzICovDQpAQCAtMTU4NSw4ICsxNTU1LDYgQEAgc3RydWN0IG1seDVfZGV2X3NwYXdu X2RhdGEgew0KIAkJCWNsb3NlKHByaXYtPm5sX3NvY2tldF9yb3V0ZSk7DQogCQlpZiAocHJpdi0+ bmxfc29ja2V0X3JkbWEgPj0gMCkNCiAJCQljbG9zZShwcml2LT5ubF9zb2NrZXRfcmRtYSk7DQot CQlpZiAocHJpdi0+dGNmX2NvbnRleHQpDQotCQkJbWx4NV9mbG93X3RjZl9jb250ZXh0X2Rlc3Ry b3kocHJpdi0+dGNmX2NvbnRleHQpOw0KIAkJaWYgKG93bl9kb21haW5faWQpDQogCQkJY2xhaW1f emVybyhydGVfZXRoX3N3aXRjaF9kb21haW5fZnJlZShwcml2LT5kb21haW5faWQpKTsNCiAJCXJ0 ZV9mcmVlKHByaXYpOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDUvbWx4NS5oIGIvZHJp dmVycy9uZXQvbWx4NS9tbHg1LmgNCmluZGV4IDNlYWFhZmQuLjgxZTYyZmQgMTAwNjQ0DQotLS0g YS9kcml2ZXJzL25ldC9tbHg1L21seDUuaA0KKysrIGIvZHJpdmVycy9uZXQvbWx4NS9tbHg1LmgN CkBAIC0zODIsNyArMzgyLDYgQEAgc3RydWN0IG1seDVfcHJpdiB7DQogCXJ0ZV9zcGlubG9ja190 IHVhcl9sb2NrW01MWDVfVUFSX1BBR0VfTlVNX01BWF07DQogCS8qIFVBUiBzYW1lLXBhZ2UgYWNj ZXNzIGNvbnRyb2wgcmVxdWlyZWQgaW4gMzJiaXQgaW1wbGVtZW50YXRpb25zLiAqLw0KICNlbmRp Zg0KLQlzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICp0Y2ZfY29udGV4dDsgLyogVEMgZmxv d2VyIGNvbnRleHQuICovDQogfTsNCiANCiAjZGVmaW5lIFBPUlRfSUQocHJpdikgKChwcml2KS0+ ZGV2X2RhdGEtPnBvcnRfaWQpDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zs b3cuYyBiL2RyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93LmMNCmluZGV4IGYyOWM2MTcuLmM5MTJk NDEgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL25ldC9tbHg1L21seDVfZmxvdy5jDQorKysgYi9kcml2 ZXJzL25ldC9tbHg1L21seDVfZmxvdy5jDQpAQCAtNDIsNyArNDIsNiBAQA0KICNpZmRlZiBIQVZF X0lCVl9GTE9XX0RWX1NVUFBPUlQNCiBleHRlcm4gY29uc3Qgc3RydWN0IG1seDVfZmxvd19kcml2 ZXJfb3BzIG1seDVfZmxvd19kdl9kcnZfb3BzOw0KICNlbmRpZg0KLWV4dGVybiBjb25zdCBzdHJ1 Y3QgbWx4NV9mbG93X2RyaXZlcl9vcHMgbWx4NV9mbG93X3RjZl9kcnZfb3BzOw0KIGV4dGVybiBj b25zdCBzdHJ1Y3QgbWx4NV9mbG93X2RyaXZlcl9vcHMgbWx4NV9mbG93X3ZlcmJzX2Rydl9vcHM7 DQogDQogY29uc3Qgc3RydWN0IG1seDVfZmxvd19kcml2ZXJfb3BzIG1seDVfZmxvd19udWxsX2Ry dl9vcHM7DQpAQCAtNTIsNyArNTEsNiBAQA0KICNpZmRlZiBIQVZFX0lCVl9GTE9XX0RWX1NVUFBP UlQNCiAJW01MWDVfRkxPV19UWVBFX0RWXSA9ICZtbHg1X2Zsb3dfZHZfZHJ2X29wcywNCiAjZW5k aWYNCi0JW01MWDVfRkxPV19UWVBFX1RDRl0gPSAmbWx4NV9mbG93X3RjZl9kcnZfb3BzLA0KIAlb TUxYNV9GTE9XX1RZUEVfVkVSQlNdID0gJm1seDVfZmxvd192ZXJic19kcnZfb3BzLA0KIAlbTUxY NV9GTE9XX1RZUEVfTUFYXSA9ICZtbHg1X2Zsb3dfbnVsbF9kcnZfb3BzDQogfTsNCkBAIC0xMDM3 LDcgKzEwMzUsNyBAQCB1aW50MzJfdCBtbHg1X2Zsb3dfYWRqdXN0X3ByaW9yaXR5KHN0cnVjdCBy dGVfZXRoX2RldiAqZGV2LCBpbnQzMl90IHByaW9yaXR5LA0KIAkJcmV0dXJuIHJ0ZV9mbG93X2Vy cm9yX3NldChlcnJvciwgRU5PVFNVUCwNCiAJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRS X0VHUkVTUywgTlVMTCwNCiAJCQkJCSAgImVncmVzcyBpcyBub3Qgc3VwcG9ydGVkIik7DQotCWlm IChhdHRyaWJ1dGVzLT50cmFuc2ZlcikNCisJaWYgKGF0dHJpYnV0ZXMtPnRyYW5zZmVyICYmICFw cml2LT5jb25maWcuZHZfZXN3X2VuKQ0KIAkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJv ciwgRU5PVFNVUCwNCiAJCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX1RSQU5TRkVSLA0K IAkJCQkJICBOVUxMLCAidHJhbnNmZXIgaXMgbm90IHN1cHBvcnRlZCIpOw0KQEAgLTEyOTQsNyAr MTI5Miw3IEBAIHVpbnQzMl90IG1seDVfZmxvd19hZGp1c3RfcHJpb3JpdHkoc3RydWN0IHJ0ZV9l dGhfZGV2ICpkZXYsIGludDMyX3QgcHJpb3JpdHksDQogICogQHBhcmFtW2luXSB0YXJnZXRfcHJv dG9jb2wNCiAgKiAgIFRoZSBuZXh0IHByb3RvY29sIGluIHRoZSBwcmV2aW91cyBpdGVtLg0KICAq IEBwYXJhbVtpbl0gZmxvd19tYXNrDQotICogICBtbHg1IGZsb3ctc3BlY2lmaWMgKFRDRiwgRFYs IHZlcmJzLCBldGMuKSBzdXBwb3J0ZWQgaGVhZGVyIGZpZWxkcyBtYXNrLg0KKyAqICAgbWx4NSBm bG93LXNwZWNpZmljIChEViwgdmVyYnMsIGV0Yy4pIHN1cHBvcnRlZCBoZWFkZXIgZmllbGRzIG1h c2suDQogICogQHBhcmFtW291dF0gZXJyb3INCiAgKiAgIFBvaW50ZXIgdG8gZXJyb3Igc3RydWN0 dXJlLg0KICAqDQpAQCAtMTY5Niw4ICsxNjk0LDggQEAgdWludDMyX3QgbWx4NV9mbG93X2FkanVz dF9wcmlvcml0eShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgaW50MzJfdCBwcmlvcml0eSwNCiAJ CSAgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gYWN0aW9uc1tdIF9fcnRlX3VudXNlZCwN CiAJCSAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IgX19ydGVfdW51c2VkKQ0KIHsNCi0J cnRlX2Vycm5vID0gRU5PVFNVUDsNCi0JcmV0dXJuIC1ydGVfZXJybm87DQorCXJldHVybiBydGVf Zmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQorCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQ RV9VTlNQRUNJRklFRCwgTlVMTCwgTlVMTCk7DQogfQ0KIA0KIHN0YXRpYyBzdHJ1Y3QgbWx4NV9m bG93ICoNCkBAIC0xNzA2LDcgKzE3MDQsOCBAQCB1aW50MzJfdCBtbHg1X2Zsb3dfYWRqdXN0X3By aW9yaXR5KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LCBpbnQzMl90IHByaW9yaXR5LA0KIAkJICBj b25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uIGFjdGlvbnNbXSBfX3J0ZV91bnVzZWQsDQogCQkg IHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IgX19ydGVfdW51c2VkKQ0KIHsNCi0JcnRlX2Vy cm5vID0gRU5PVFNVUDsNCisJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLA0KKwkJ CSAgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxMLCBOVUxMKTsNCiAJcmV0 dXJuIE5VTEw7DQogfQ0KIA0KQEAgLTE3MTgsOCArMTcxNyw4IEBAIHVpbnQzMl90IG1seDVfZmxv d19hZGp1c3RfcHJpb3JpdHkoc3RydWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIGludDMyX3QgcHJpb3Jp dHksDQogCQkgICAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiBhY3Rpb25zW10gX19ydGVf dW51c2VkLA0KIAkJICAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IgX19ydGVfdW51c2Vk KQ0KIHsNCi0JcnRlX2Vycm5vID0gRU5PVFNVUDsNCi0JcmV0dXJuIC1ydGVfZXJybm87DQorCXJl dHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQorCQkJCSAgUlRFX0ZMT1df RVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwgTlVMTCk7DQogfQ0KIA0KIHN0YXRpYyBpbnQN CkBAIC0xNzI3LDggKzE3MjYsOCBAQCB1aW50MzJfdCBtbHg1X2Zsb3dfYWRqdXN0X3ByaW9yaXR5 KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LCBpbnQzMl90IHByaW9yaXR5LA0KIAkJc3RydWN0IHJ0 ZV9mbG93ICpmbG93IF9fcnRlX3VudXNlZCwNCiAJCXN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJy b3IgX19ydGVfdW51c2VkKQ0KIHsNCi0JcnRlX2Vycm5vID0gRU5PVFNVUDsNCi0JcmV0dXJuIC1y dGVfZXJybm87DQorCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQor CQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwgTlVMTCk7DQogfQ0K IA0KIHN0YXRpYyB2b2lkDQpAQCAtMTc1MCw4ICsxNzQ5LDggQEAgdWludDMyX3QgbWx4NV9mbG93 X2FkanVzdF9wcmlvcml0eShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgaW50MzJfdCBwcmlvcml0 eSwNCiAJCXZvaWQgKmRhdGEgX19ydGVfdW51c2VkLA0KIAkJc3RydWN0IHJ0ZV9mbG93X2Vycm9y ICplcnJvciBfX3J0ZV91bnVzZWQpDQogew0KLQlydGVfZXJybm8gPSBFTk9UU1VQOw0KLQlyZXR1 cm4gLXJ0ZV9lcnJubzsNCisJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNV UCwNCisJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxMLCBOVUxMKTsN CiB9DQogDQogLyogVm9pZCBkcml2ZXIgdG8gcHJvdGVjdCBmcm9tIG51bGwgcG9pbnRlciByZWZl cmVuY2UuICovDQpAQCAtMTc4Myw5ICsxNzgyLDkgQEAgdWludDMyX3QgbWx4NV9mbG93X2FkanVz dF9wcmlvcml0eShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgaW50MzJfdCBwcmlvcml0eSwNCiAJ c3RydWN0IG1seDVfcHJpdiAqcHJpdiA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQogCWVudW0g bWx4NV9mbG93X2Rydl90eXBlIHR5cGUgPSBNTFg1X0ZMT1dfVFlQRV9NQVg7DQogDQotCWlmIChh dHRyLT50cmFuc2ZlciAmJiAhcHJpdi0+Y29uZmlnLmR2X2Vzd19lbikNCi0JCXR5cGUgPSBNTFg1 X0ZMT1dfVFlQRV9UQ0Y7DQotCWVsc2UNCisJaWYgKGF0dHItPnRyYW5zZmVyICYmIHByaXYtPmNv bmZpZy5kdl9lc3dfZW4pDQorCQl0eXBlID0gTUxYNV9GTE9XX1RZUEVfRFY7DQorCWlmICghYXR0 ci0+dHJhbnNmZXIpDQogCQl0eXBlID0gcHJpdi0+Y29uZmlnLmR2X2Zsb3dfZW4gPyBNTFg1X0ZM T1dfVFlQRV9EViA6DQogCQkJCQkJIE1MWDVfRkxPV19UWVBFX1ZFUkJTOw0KIAlyZXR1cm4gdHlw ZTsNCkBAIC0xODMyLDcgKzE4MzEsNyBAQCB1aW50MzJfdCBtbHg1X2Zsb3dfYWRqdXN0X3ByaW9y aXR5KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LCBpbnQzMl90IHByaW9yaXR5LA0KICAqIGluaXRp YWxpemVzIHRoZSBkZXZpY2UgZmxvdyBhbmQgcmV0dXJucyB0aGUgcG9pbnRlci4NCiAgKg0KICAq IEBub3RlDQotICogICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGRldmljZSBmbG93IHN0cnVj dHVyZSBzdWNoIGFzIGR2LCB0Y2Ygb3IgdmVyYnMgaW4NCisgKiAgIFRoaXMgZnVuY3Rpb24gaW5p dGlhbGl6ZXMgZGV2aWNlIGZsb3cgc3RydWN0dXJlIHN1Y2ggYXMgZHYgb3IgdmVyYnMgaW4NCiAg KiAgIHN0cnVjdCBtbHg1X2Zsb3cuIEhvd2V2ZXIsIGl0IGlzIGNhbGxlcidzIHJlc3BvbnNpYmls aXR5IHRvIGluaXRpYWxpemUgdGhlDQogICogICByZXN0LiBGb3IgZXhhbXBsZSwgYWRkaW5nIHJl dHVybmluZyBkZXZpY2UgZmxvdyB0byBmbG93LT5kZXZfZmxvdyBsaXN0IGFuZA0KICAqICAgc2V0 dGluZyBiYWNrd2FyZCByZWZlcmVuY2UgdG8gdGhlIGZsb3cgc2hvdWxkIGJlIGRvbmUgb3V0IG9m IHRoaXMgZnVuY3Rpb24uDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3cu aCBiL2RyaXZlcnMvbmV0L21seDUvbWx4NV9mbG93LmgNCmluZGV4IGI2NjU0MjAuLjY1Y2ZkYmQg MTAwNjQ0DQotLS0gYS9kcml2ZXJzL25ldC9tbHg1L21seDVfZmxvdy5oDQorKysgYi9kcml2ZXJz L25ldC9tbHg1L21seDVfZmxvdy5oDQpAQCAtMTg4LDcgKzE4OCw2IEBADQogZW51bSBtbHg1X2Zs b3dfZHJ2X3R5cGUgew0KIAlNTFg1X0ZMT1dfVFlQRV9NSU4sDQogCU1MWDVfRkxPV19UWVBFX0RW LA0KLQlNTFg1X0ZMT1dfVFlQRV9UQ0YsDQogCU1MWDVfRkxPV19UWVBFX1ZFUkJTLA0KIAlNTFg1 X0ZMT1dfVFlQRV9NQVgsDQogfTsNCkBAIC0zMDksMjIgKzMwOCw2IEBAIHN0cnVjdCBtbHg1X2Zs b3dfZHYgew0KIAlpbnQgYWN0aW9uc19uOyAvKio8IG51bWJlciBvZiBhY3Rpb25zLiAqLw0KIH07 DQogDQotLyoqIExpbnV4IFRDIGZsb3dlciBkcml2ZXIgZm9yIEUtU3dpdGNoIGZsb3cuICovDQot c3RydWN0IG1seDVfZmxvd190Y2Ygew0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0Jc3RydWN0 IHRjbXNnICp0Y207DQotCXVpbnQzMl90ICpwdGNfZmxhZ3M7IC8qKjwgdGMgcnVsZSBhcHBsaWVk IGZsYWdzLiAqLw0KLQl1bmlvbiB7IC8qKjwgVHVubmVsIGVuY2FwL2RlY2FwIGRlc2NyaXB0b3Iu ICovDQotCQlzdHJ1Y3QgZmxvd190Y2ZfdHVubmVsX2hkciAqdHVubmVsOw0KLQkJc3RydWN0IGZs b3dfdGNmX3Z4bGFuX2RlY2FwICp2eGxhbl9kZWNhcDsNCi0JCXN0cnVjdCBmbG93X3RjZl92eGxh bl9lbmNhcCAqdnhsYW5fZW5jYXA7DQotCX07DQotCXVpbnQzMl90IGFwcGxpZWQ6MTsgLyoqPCBX aGV0aGVyIHJ1bGUgaXMgY3VycmVudGx5IGFwcGxpZWQuICovDQotI2lmbmRlZiBOREVCVUcNCi0J dWludDMyX3QgbmxzaXplOyAvKio8IFNpemUgb2YgTkwgbWVzc2FnZSBidWZmZXIgZm9yIGRlYnVn IGNoZWNrLiAqLw0KLSNlbmRpZg0KLX07DQotDQogLyogVmVyYnMgc3BlY2lmaWNhdGlvbiBoZWFk ZXIuICovDQogc3RydWN0IGlidl9zcGVjX2hlYWRlciB7DQogCWVudW0gaWJ2X2Zsb3dfc3BlY190 eXBlIHR5cGU7DQpAQCAtMzU1LDcgKzMzOCw2IEBAIHN0cnVjdCBtbHg1X2Zsb3cgew0KICNpZmRl ZiBIQVZFX0lCVl9GTE9XX0RWX1NVUFBPUlQNCiAJCXN0cnVjdCBtbHg1X2Zsb3dfZHYgZHY7DQog I2VuZGlmDQotCQlzdHJ1Y3QgbWx4NV9mbG93X3RjZiB0Y2Y7DQogCQlzdHJ1Y3QgbWx4NV9mbG93 X3ZlcmJzIHZlcmJzOw0KIAl9Ow0KIH07DQpAQCAtNTEzLDExICs0OTUsNCBAQCBpbnQgbWx4NV9m bG93X3ZhbGlkYXRlX2l0ZW1fdnhsYW5fZ3BlKGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtICpp dGVtLA0KIAkJCQkgICAgICBzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwNCiAJCQkJICAgICAgc3Ry dWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcik7DQogDQotLyogbWx4NV9mbG93X3RjZi5jICovDQot DQotaW50IG1seDVfZmxvd190Y2ZfaW5pdChzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICpj dHgsDQotCQkgICAgICAgdW5zaWduZWQgaW50IGlmaW5kZXgsIHN0cnVjdCBydGVfZmxvd19lcnJv ciAqZXJyb3IpOw0KLXN0cnVjdCBtbHg1X2Zsb3dfdGNmX2NvbnRleHQgKm1seDVfZmxvd190Y2Zf Y29udGV4dF9jcmVhdGUodm9pZCk7DQotdm9pZCBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfZGVzdHJv eShzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICpjdHgpOw0KLQ0KICNlbmRpZiAvKiBSVEVf UE1EX01MWDVfRkxPV19IXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDUvbWx4NV9m bG93X3RjZi5jIGIvZHJpdmVycy9uZXQvbWx4NS9tbHg1X2Zsb3dfdGNmLmMNCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NA0KaW5kZXggZmMwNGM5ZC4uMDAwMDAwMA0KLS0tIGEvZHJpdmVycy9uZXQv bWx4NS9tbHg1X2Zsb3dfdGNmLmMNCisrKyAvZGV2L251bGwNCkBAIC0xLDYzODIgKzAsMCBAQA0K LS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UNCi0gKiBDb3B5cmlnaHQg MjAxOCA2V0lORCBTLkEuDQotICogQ29weXJpZ2h0IDIwMTggTWVsbGFub3ggVGVjaG5vbG9naWVz LCBMdGQNCi0gKi8NCi0NCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+DQotI2luY2x1ZGUgPGVycm5vLmg+ DQotI2luY2x1ZGUgPGxpYm1ubC9saWJtbmwuaD4NCi0jaW5jbHVkZSA8bGludXgvZ2VuX3N0YXRz Lmg+DQotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+DQotI2luY2x1ZGUgPGxpbnV4L25ldGxp bmsuaD4NCi0jaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPg0KLSNpbmNsdWRlIDxsaW51eC9wa3Rf c2NoZWQuaD4NCi0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+DQotI2luY2x1ZGUgPGxpbnV4 L3RjX2FjdC90Y19nYWN0Lmg+DQotI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19taXJyZWQuaD4N Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPg0KLSNpbmNsdWRlIDxzdGRhbGlnbi5oPg0KLSNpbmNs dWRlIDxzdGRib29sLmg+DQotI2luY2x1ZGUgPHN0ZGRlZi5oPg0KLSNpbmNsdWRlIDxzdGRpbnQu aD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+DQotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4NCi0NCi0j aW5jbHVkZSA8cnRlX2J5dGVvcmRlci5oPg0KLSNpbmNsdWRlIDxydGVfZXJybm8uaD4NCi0jaW5j bHVkZSA8cnRlX2V0aGVyLmg+DQotI2luY2x1ZGUgPHJ0ZV9mbG93Lmg+DQotI2luY2x1ZGUgPHJ0 ZV9tYWxsb2MuaD4NCi0jaW5jbHVkZSA8cnRlX2NvbW1vbi5oPg0KLSNpbmNsdWRlIDxydGVfY3lj bGVzLmg+DQotDQotI2luY2x1ZGUgIm1seDUuaCINCi0jaW5jbHVkZSAibWx4NV9mbG93LmgiDQot I2luY2x1ZGUgIm1seDVfYXV0b2NvbmYuaCINCi0NCi0jaWZkZWYgSEFWRV9UQ19BQ1RfVkxBTg0K LQ0KLSNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfdmxhbi5oPg0KLQ0KLSNlbHNlIC8qIEhBVkVf VENfQUNUX1ZMQU4gKi8NCi0NCi0jZGVmaW5lIFRDQV9WTEFOX0FDVF9QT1AgMQ0KLSNkZWZpbmUg VENBX1ZMQU5fQUNUX1BVU0ggMg0KLSNkZWZpbmUgVENBX1ZMQU5fQUNUX01PRElGWSAzDQotI2Rl ZmluZSBUQ0FfVkxBTl9QQVJNUyAyDQotI2RlZmluZSBUQ0FfVkxBTl9QVVNIX1ZMQU5fSUQgMw0K LSNkZWZpbmUgVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MIDQNCi0jZGVmaW5lIFRDQV9WTEFO X1BBRCA1DQotI2RlZmluZSBUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJJT1JJVFkgNg0KLQ0KLXN0cnVj dCB0Y192bGFuIHsNCi0JdGNfZ2VuOw0KLQlpbnQgdl9hY3Rpb247DQotfTsNCi0NCi0jZW5kaWYg LyogSEFWRV9UQ19BQ1RfVkxBTiAqLw0KLQ0KLSNpZmRlZiBIQVZFX1RDX0FDVF9QRURJVA0KLQ0K LSNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfcGVkaXQuaD4NCi0NCi0jZWxzZSAvKiBIQVZFX1RD X0FDVF9WTEFOICovDQotDQotZW51bSB7DQotCVRDQV9QRURJVF9VTlNQRUMsDQotCVRDQV9QRURJ VF9UTSwNCi0JVENBX1BFRElUX1BBUk1TLA0KLQlUQ0FfUEVESVRfUEFELA0KLQlUQ0FfUEVESVRf UEFSTVNfRVgsDQotCVRDQV9QRURJVF9LRVlTX0VYLA0KLQlUQ0FfUEVESVRfS0VZX0VYLA0KLQlf X1RDQV9QRURJVF9NQVgNCi19Ow0KLQ0KLWVudW0gew0KLQlUQ0FfUEVESVRfS0VZX0VYX0hUWVBF ID0gMSwNCi0JVENBX1BFRElUX0tFWV9FWF9DTUQgPSAyLA0KLQlfX1RDQV9QRURJVF9LRVlfRVhf TUFYDQotfTsNCi0NCi1lbnVtIHBlZGl0X2hlYWRlcl90eXBlIHsNCi0JVENBX1BFRElUX0tFWV9F WF9IRFJfVFlQRV9ORVRXT1JLID0gMCwNCi0JVENBX1BFRElUX0tFWV9FWF9IRFJfVFlQRV9FVEgg PSAxLA0KLQlUQ0FfUEVESVRfS0VZX0VYX0hEUl9UWVBFX0lQNCA9IDIsDQotCVRDQV9QRURJVF9L RVlfRVhfSERSX1RZUEVfSVA2ID0gMywNCi0JVENBX1BFRElUX0tFWV9FWF9IRFJfVFlQRV9UQ1Ag PSA0LA0KLQlUQ0FfUEVESVRfS0VZX0VYX0hEUl9UWVBFX1VEUCA9IDUsDQotCV9fUEVESVRfSERS X1RZUEVfTUFYLA0KLX07DQotDQotZW51bSBwZWRpdF9jbWQgew0KLQlUQ0FfUEVESVRfS0VZX0VY X0NNRF9TRVQgPSAwLA0KLQlUQ0FfUEVESVRfS0VZX0VYX0NNRF9BREQgPSAxLA0KLQlfX1BFRElU X0NNRF9NQVgsDQotfTsNCi0NCi1zdHJ1Y3QgdGNfcGVkaXRfa2V5IHsNCi0JX191MzIgbWFzazsg LyogQU5EICovDQotCV9fdTMyIHZhbDsgLypYT1IgKi8NCi0JX191MzIgb2ZmOyAvKm9mZnNldCAq Lw0KLQlfX3UzMiBhdDsNCi0JX191MzIgb2ZmbWFzazsNCi0JX191MzIgc2hpZnQ7DQotfTsNCi0N Ci1fX2V4dGVuc2lvbl9fDQotc3RydWN0IHRjX3BlZGl0X3NlbCB7DQotCXRjX2dlbjsNCi0JdW5z aWduZWQgY2hhciBua2V5czsNCi0JdW5zaWduZWQgY2hhciBmbGFnczsNCi0Jc3RydWN0IHRjX3Bl ZGl0X2tleSBrZXlzWzBdOw0KLX07DQotDQotI2VuZGlmIC8qIEhBVkVfVENfQUNUX1ZMQU4gKi8N Ci0NCi0jaWZkZWYgSEFWRV9UQ19BQ1RfVFVOTkVMX0tFWQ0KLQ0KLSNpbmNsdWRlIDxsaW51eC90 Y19hY3QvdGNfdHVubmVsX2tleS5oPg0KLQ0KLSNpZm5kZWYgSEFWRV9UQ0FfVFVOTkVMX0tFWV9F TkNfRFNUX1BPUlQNCi0jZGVmaW5lIFRDQV9UVU5ORUxfS0VZX0VOQ19EU1RfUE9SVCA5DQotI2Vu ZGlmDQotDQotI2lmbmRlZiBIQVZFX1RDQV9UVU5ORUxfS0VZX05PX0NTVU0NCi0jZGVmaW5lIFRD QV9UVU5ORUxfS0VZX05PX0NTVU0gMTANCi0jZW5kaWYNCi0NCi0jaWZuZGVmIEhBVkVfVENBX1RV Tk5FTF9LRVlfRU5DX1RPUw0KLSNkZWZpbmUgVENBX1RVTk5FTF9LRVlfRU5DX1RPUyAxMg0KLSNl bmRpZg0KLQ0KLSNpZm5kZWYJSEFWRV9UQ0FfVFVOTkVMX0tFWV9FTkNfVFRMDQotI2RlZmluZSBU Q0FfVFVOTkVMX0tFWV9FTkNfVFRMIDEzDQotI2VuZGlmDQotDQotI2Vsc2UgLyogSEFWRV9UQ19B Q1RfVFVOTkVMX0tFWSAqLw0KLQ0KLSNkZWZpbmUgVENBX0FDVF9UVU5ORUxfS0VZIDE3DQotI2Rl ZmluZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUIDENCi0jZGVmaW5lIFRDQV9UVU5ORUxfS0VZX0FD VF9SRUxFQVNFIDINCi0jZGVmaW5lIFRDQV9UVU5ORUxfS0VZX1BBUk1TIDINCi0jZGVmaW5lIFRD QV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQyAzDQotI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9FTkNf SVBWNF9EU1QgNA0KLSNkZWZpbmUgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDIDUNCi0jZGVm aW5lIFRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVCA2DQotI2RlZmluZSBUQ0FfVFVOTkVMX0tF WV9FTkNfS0VZX0lEIDcNCi0jZGVmaW5lIFRDQV9UVU5ORUxfS0VZX0VOQ19EU1RfUE9SVCA5DQot I2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9OT19DU1VNIDEwDQotI2RlZmluZSBUQ0FfVFVOTkVMX0tF WV9FTkNfVE9TIDEyDQotI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9FTkNfVFRMIDEzDQotDQotc3Ry dWN0IHRjX3R1bm5lbF9rZXkgew0KLQl0Y19nZW47DQotCWludCB0X2FjdGlvbjsNCi19Ow0KLQ0K LSNlbmRpZiAvKiBIQVZFX1RDX0FDVF9UVU5ORUxfS0VZICovDQotDQotLyogTm9ybWFsbHkgZm91 bmQgaW4gbGludXgvbmV0bGluay5oLiAqLw0KLSNpZm5kZWYgTkVUTElOS19DQVBfQUNLDQotI2Rl ZmluZSBORVRMSU5LX0NBUF9BQ0sgMTANCi0jZW5kaWYNCi0NCi0vKiBOb3JtYWxseSBmb3VuZCBp biBsaW51eC9wa3Rfc2NoZWQuaC4gKi8NCi0jaWZuZGVmIFRDX0hfTUlOX0lOR1JFU1MNCi0jZGVm aW5lIFRDX0hfTUlOX0lOR1JFU1MgMHhmZmYydQ0KLSNlbmRpZg0KLQ0KLS8qIE5vcm1hbGx5IGZv dW5kIGluIGxpbnV4L3BrdF9jbHMuaC4gKi8NCi0jaWZuZGVmIFRDQV9DTFNfRkxBR1NfU0tJUF9T Vw0KLSNkZWZpbmUgVENBX0NMU19GTEFHU19TS0lQX1NXICgxIDw8IDEpDQotI2VuZGlmDQotI2lm bmRlZiBUQ0FfQ0xTX0ZMQUdTX0lOX0hXDQotI2RlZmluZSBUQ0FfQ0xTX0ZMQUdTX0lOX0hXICgx IDw8IDIpDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9DSEFJTg0KLSNkZWZpbmUgVENBX0NI QUlOIDExDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfQUNUDQotI2RlZmluZSBU Q0FfRkxPV0VSX0FDVCAzDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfRkxBR1MN Ci0jZGVmaW5lIFRDQV9GTE9XRVJfRkxBR1MgMjINCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENB X0ZMT1dFUl9LRVlfRVRIX1RZUEUNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0VUSF9UWVBFIDgN Ci0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfRVRIX0RTVA0KLSNkZWZpbmUg VENBX0ZMT1dFUl9LRVlfRVRIX0RTVCA0DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9X RVJfS0VZX0VUSF9EU1RfTUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRVRIX0RTVF9NQVNL IDUNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfRVRIX1NSQw0KLSNkZWZp bmUgVENBX0ZMT1dFUl9LRVlfRVRIX1NSQyA2DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9G TE9XRVJfS0VZX0VUSF9TUkNfTUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ19N QVNLIDcNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE8NCi0j ZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQX1BST1RPIDkNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVf VENBX0ZMT1dFUl9LRVlfSVBWNF9TUkMNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQVjRfU1JD IDEwDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX0lQVjRfU1JDX01BU0sN Ci0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQVjRfU1JDX01BU0sgMTENCi0jZW5kaWYNCi0jaWZu ZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfSVBWNF9EU1QNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZ X0lQVjRfRFNUIDEyDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX0lQVjRf RFNUX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQVjRfRFNUX01BU0sgMTMNCi0jZW5k aWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfSVBWNl9TUkMNCi0jZGVmaW5lIFRDQV9G TE9XRVJfS0VZX0lQVjZfU1JDIDE0DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJf S0VZX0lQVjZfU1JDX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQVjZfU1JDX01BU0sg MTUNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfSVBWNl9EU1QNCi0jZGVm aW5lIFRDQV9GTE9XRVJfS0VZX0lQVjZfRFNUIDE2DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RD QV9GTE9XRVJfS0VZX0lQVjZfRFNUX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQVjZf RFNUX01BU0sgMTcNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfVENQX1NS Qw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfVENQX1NSQyAxOA0KLSNlbmRpZg0KLSNpZm5kZWYg SEFWRV9UQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZ X1RDUF9TUkNfTUFTSyAzNQ0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9U Q1BfRFNUDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNUIDE5DQotI2VuZGlmDQotI2lm bmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dF Ul9LRVlfVENQX0RTVF9NQVNLIDM2DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJf S0VZX1VEUF9TUkMNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkMgMjANCi0jZW5kaWYN Ci0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfVURQX1NSQ19NQVNLDQotI2RlZmluZSBUQ0Ff RkxPV0VSX0tFWV9VRFBfU1JDX01BU0sgMzcNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZM T1dFUl9LRVlfVURQX0RTVA0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfVURQX0RTVCAyMQ0KLSNl bmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9VRFBfRFNUX01BU0sNCi0jZGVmaW5l IFRDQV9GTE9XRVJfS0VZX1VEUF9EU1RfTUFTSyAzOA0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9U Q0FfRkxPV0VSX0tFWV9WTEFOX0lEDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9WTEFOX0lEIDIz DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX1ZMQU5fUFJJTw0KLSNkZWZp bmUgVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPIDI0DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RD QV9GTE9XRVJfS0VZX1ZMQU5fRVRIX1RZUEUNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX1ZMQU5f RVRIX1RZUEUgMjUNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfRU5DX0tF WV9JRA0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRCAyNg0KLSNlbmRpZg0KLSNp Zm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkMNCi0jZGVmaW5lIFRDQV9GTE9X RVJfS0VZX0VOQ19JUFY0X1NSQyAyNw0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VS X0tFWV9FTkNfSVBWNF9TUkNfTUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRf U1JDX01BU0sgMjgNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfRU5DX0lQ VjRfRFNUDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1QgMjkNCi0jZW5kaWYN Ci0jaWZuZGVmIEhBVkVfVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0sNCi0jZGVmaW5l IFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF9NQVNLIDMwDQotI2VuZGlmDQotI2lmbmRlZiBI QVZFX1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlf RU5DX0lQVjZfU1JDIDMxDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX0VO Q19JUFY2X1NSQ19NQVNLDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFT SyAzMg0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1QN Ci0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCAzMw0KLSNlbmRpZg0KLSNpZm5k ZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1RfTUFTSw0KLSNkZWZpbmUgVENBX0ZM T1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0sgMzQNCi0jZW5kaWYNCi0jaWZuZGVmIEhBVkVfVENB X0ZMT1dFUl9LRVlfRU5DX1VEUF9TUkNfUE9SVA0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRU5D X1VEUF9TUkNfUE9SVCA0Mw0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9F TkNfVURQX1NSQ19QT1JUX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0VOQ19VRFBfU1JD X1BPUlRfTUFTSyA0NA0KLSNlbmRpZg0KLSNpZm5kZWYgSEFWRV9UQ0FfRkxPV0VSX0tFWV9FTkNf VURQX0RTVF9QT1JUDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9FTkNfVURQX0RTVF9QT1JUIDQ1 DQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX0VOQ19VRFBfRFNUX1BPUlRf TUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfRU5DX1VEUF9EU1RfUE9SVF9NQVNLIDQ2DQot I2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9GTE9XRVJfS0VZX1RDUF9GTEFHUw0KLSNkZWZpbmUg VENBX0ZMT1dFUl9LRVlfVENQX0ZMQUdTIDcxDQotI2VuZGlmDQotI2lmbmRlZiBIQVZFX1RDQV9G TE9XRVJfS0VZX1RDUF9GTEFHU19NQVNLDQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9UQ1BfRkxB R1NfTUFTSyA3Mg0KLSNlbmRpZg0KLSNpZm5kZWYJSEFWRV9UQ0FfRkxPV0VSX0tFWV9JUF9UT1MN Ci0jZGVmaW5lCVRDQV9GTE9XRVJfS0VZX0lQX1RPUyA3Mw0KLSNlbmRpZg0KLSNpZm5kZWYJSEFW RV9UQ0FfRkxPV0VSX0tFWV9JUF9UT1NfTUFTSw0KLSNkZWZpbmUgVENBX0ZMT1dFUl9LRVlfSVBf VE9TX01BU0sgNzQNCi0jZW5kaWYNCi0jaWZuZGVmCUhBVkVfVENBX0ZMT1dFUl9LRVlfSVBfVFRM DQotI2RlZmluZSBUQ0FfRkxPV0VSX0tFWV9JUF9UVEwgNzUNCi0jZW5kaWYNCi0jaWZuZGVmIEhB VkVfVENBX0ZMT1dFUl9LRVlfSVBfVFRMX01BU0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0lQ X1RUTF9NQVNLIDc2DQotI2VuZGlmDQotI2lmbmRlZglIQVZFX1RDQV9GTE9XRVJfS0VZX0VOQ19J UF9UT1MNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0VOQ19JUF9UT1MgODANCi0jZW5kaWYNCi0j aWZuZGVmCUhBVkVfVENBX0ZMT1dFUl9LRVlfRU5DX0lQX1RPU19NQVNLDQotI2RlZmluZSBUQ0Ff RkxPV0VSX0tFWV9FTkNfSVBfVE9TX01BU0sgODENCi0jZW5kaWYNCi0jaWZuZGVmCUhBVkVfVENB X0ZMT1dFUl9LRVlfRU5DX0lQX1RUTA0KLSNkZWZpbmUJVENBX0ZMT1dFUl9LRVlfRU5DX0lQX1RU TCA4Mg0KLSNlbmRpZg0KLSNpZm5kZWYJSEFWRV9UQ0FfRkxPV0VSX0tFWV9FTkNfSVBfVFRMX01B U0sNCi0jZGVmaW5lIFRDQV9GTE9XRVJfS0VZX0VOQ19JUF9UVExfTUFTSyA4Mw0KLSNlbmRpZg0K LQ0KLSNpZm5kZWYgSEFWRV9UQ19BQ1RfR09UT19DSEFJTg0KLSNkZWZpbmUgVENfQUNUX0dPVE9f Q0hBSU4gMHgyMDAwMDAwMA0KLSNlbmRpZg0KLQ0KLSNpZm5kZWYgSVBWNl9BRERSX0xFTg0KLSNk ZWZpbmUgSVBWNl9BRERSX0xFTiAxNg0KLSNlbmRpZg0KLQ0KLSNpZm5kZWYgSVBWNF9BRERSX0xF Tg0KLSNkZWZpbmUgSVBWNF9BRERSX0xFTiA0DQotI2VuZGlmDQotDQotI2lmbmRlZiBUUF9QT1JU X0xFTg0KLSNkZWZpbmUgVFBfUE9SVF9MRU4gMiAvKiBUcmFuc3BvcnQgUG9ydCAoVURQL1RDUCkg TGVuZ3RoICovDQotI2VuZGlmDQotDQotI2lmbmRlZiBUVExfTEVODQotI2RlZmluZSBUVExfTEVO IDENCi0jZW5kaWYNCi0NCi0jaWZuZGVmIFRDQV9BQ1RfTUFYX1BSSU8NCi0jZGVmaW5lIFRDQV9B Q1RfTUFYX1BSSU8gMzINCi0jZW5kaWYNCi0NCi0vKiogUGFyYW1ldGVycyBvZiBWWExBTiBkZXZp Y2VzIGNyZWF0ZWQgYnkgZHJpdmVyLiAqLw0KLSNkZWZpbmUgTUxYNV9WWExBTl9ERUZBVUxUX1ZO SQkxDQotI2RlZmluZSBNTFg1X1ZYTEFOX0RFVklDRV9QRlggInZtbHhfIg0KLS8qKg0KLSAqIFRp bWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgVlhMQU4gVURQIG9mZmxvYWRlZCBwb3J0DQot ICogcmVnaXN0cmF0aW9uICBjb21wbGV0ZWQgd2l0aGluIHRoZSBtbHg1IGRyaXZlci4NCi0gKi8N Ci0jZGVmaW5lIE1MWDVfVlhMQU5fV0FJVF9QT1JUX1JFR19NUyAyNTANCi0NCi0vKiogVHVubmVs IGFjdGlvbiB0eXBlLCB1c2VkIGZvciBAcCB0eXBlIGluIGhlYWRlciBzdHJ1Y3R1cmUuICovDQot ZW51bSBmbG93X3RjZl90dW5hY3RfdHlwZSB7DQotCUZMT1dfVENGX1RVTkFDVF9WWExBTl9ERUNB UCwNCi0JRkxPV19UQ0ZfVFVOQUNUX1ZYTEFOX0VOQ0FQLA0KLX07DQotDQotLyoqIEZsYWdzIHVz ZWQgZm9yIEBwIG1hc2sgaW4gdHVubmVsIGFjdGlvbiBlbmNhcCBkZXNjcmlwdG9ycy4gKi8NCi0j ZGVmaW5lIEZMT1dfVENGX0VOQ0FQX0VUSF9TUkMgKDF1IDw8IDApDQotI2RlZmluZSBGTE9XX1RD Rl9FTkNBUF9FVEhfRFNUICgxdSA8PCAxKQ0KLSNkZWZpbmUgRkxPV19UQ0ZfRU5DQVBfSVBWNF9T UkMgKDF1IDw8IDIpDQotI2RlZmluZSBGTE9XX1RDRl9FTkNBUF9JUFY0X0RTVCAoMXUgPDwgMykN Ci0jZGVmaW5lIEZMT1dfVENGX0VOQ0FQX0lQVjZfU1JDICgxdSA8PCA0KQ0KLSNkZWZpbmUgRkxP V19UQ0ZfRU5DQVBfSVBWNl9EU1QgKDF1IDw8IDUpDQotI2RlZmluZSBGTE9XX1RDRl9FTkNBUF9V RFBfU1JDICgxdSA8PCA2KQ0KLSNkZWZpbmUgRkxPV19UQ0ZfRU5DQVBfVURQX0RTVCAoMXUgPDwg NykNCi0jZGVmaW5lIEZMT1dfVENGX0VOQ0FQX1ZYTEFOX1ZOSSAoMXUgPDwgOCkNCi0jZGVmaW5l IEZMT1dfVENGX0VOQ0FQX0lQX1RUTCAoMXUgPDwgOSkNCi0jZGVmaW5lIEZMT1dfVENGX0VOQ0FQ X0lQX1RPUyAoMXUgPDwgMTApDQotDQotLyoqDQotICogU3RydWN0dXJlIGZvciBob2xkaW5nIG5l dGxpbmsgY29udGV4dC4NCi0gKiBOb3RlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlciB3 aGljaCBpcyBNTkxfU09DS0VUX0JVRkZFUl9TSVpFLg0KLSAqIFVzaW5nIHRoaXMgKDhLQikgYnVm ZmVyIHNpemUgZW5zdXJlcyB0aGF0IG5ldGxpbmsgbWVzc2FnZXMgd2lsbCBuZXZlciBiZQ0KLSAq IHRydW5jYXRlZC4NCi0gKi8NCi1zdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0IHsNCi0Jc3Ry dWN0IG1ubF9zb2NrZXQgKm5sOyAvKiBORVRMSU5LX1JPVVRFIGxpYm1ubCBzb2NrZXQuICovDQot CXVpbnQzMl90IHNlcTsgLyogTWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIuICovDQotCXVpbnQzMl90 IGJ1Zl9zaXplOyAvKiBNZXNzYWdlIGJ1ZmZlciBzaXplLiAqLw0KLQl1aW50OF90ICpidWY7IC8q IE1lc3NhZ2UgYnVmZmVyLiAqLw0KLX07DQotDQotLyoqDQotICogTmVpZ2ggcnVsZSBzdHJ1Y3R1 cmUuIFRoZSBuZWlnaCBydWxlIGlzIGFwcGxpZWQgdmlhIE5ldGxpbmsgdG8NCi0gKiBvdXRlciB0 dW5uZWwgaWZhY2UgaW4gb3JkZXIgdG8gcHJvdmlkZSBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcw0K LSAqIGZvciB0aGUgVlhMQU4gZW5jYXBzdWx0aW9uLiBUaGUgbmVpZ2ggcnVsZSBpcyBpbXBsaWNp dGx5IHJlbGF0ZWQNCi0gKiB0byB0aGUgRmxvdyBpdHNlbGYgYW5kIGNhbiBiZSBzaGFyZWQgYnkg bXVsdGlwbGUgRmxvd3MuDQotICovDQotc3RydWN0IHRjZl9uZWlnaF9ydWxlIHsNCi0JTElTVF9F TlRSWSh0Y2ZfbmVpZ2hfcnVsZSkgbmV4dDsNCi0JdWludDMyX3QgcmVmY250Ow0KLQlzdHJ1Y3Qg ZXRoZXJfYWRkciBldGg7DQotCXVpbnQxNl90IG1hc2s7DQotCXVuaW9uIHsNCi0JCXN0cnVjdCB7 DQotCQkJcnRlX2JlMzJfdCBkc3Q7DQotCQl9IGlwdjQ7DQotCQlzdHJ1Y3Qgew0KLQkJCXVpbnQ4 X3QgZHN0W0lQVjZfQUREUl9MRU5dOw0KLQkJfSBpcHY2Ow0KLQl9Ow0KLX07DQotDQotLyoqDQot ICogTG9jYWwgcnVsZSBzdHJ1Y3R1cmUuIFRoZSBsb2NhbCBydWxlIGlzIGFwcGxpZWQgdmlhIE5l dGxpbmsgdG8NCi0gKiBvdXRlciB0dW5uZWwgaWZhY2UgaW4gb3JkZXIgdG8gcHJvdmlkZSBsb2Nh bCBhbmQgcGVlciBJUCBhZGRyZXNzZXMNCi0gKiBvZiB0aGUgVlhMQU4gdHVubmVsIGZvciBlbmNh cHN1bGF0aW9uLiBUaGUgbG9jYWwgcnVsZSBpcyBpbXBsaWNpdGx5DQotICogcmVsYXRlZCB0byB0 aGUgRmxvdyBpdHNlbGYgYW5kIGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgRmxvd3MuDQotICov DQotc3RydWN0IHRjZl9sb2NhbF9ydWxlIHsNCi0JTElTVF9FTlRSWSh0Y2ZfbG9jYWxfcnVsZSkg bmV4dDsNCi0JdWludDMyX3QgcmVmY250Ow0KLQl1aW50MTZfdCBtYXNrOw0KLQl1bmlvbiB7DQot CQlzdHJ1Y3Qgew0KLQkJCXJ0ZV9iZTMyX3QgZHN0Ow0KLQkJCXJ0ZV9iZTMyX3Qgc3JjOw0KLQkJ fSBpcHY0Ow0KLQkJc3RydWN0IHsNCi0JCQl1aW50OF90IGRzdFtJUFY2X0FERFJfTEVOXTsNCi0J CQl1aW50OF90IHNyY1tJUFY2X0FERFJfTEVOXTsNCi0JCX0gaXB2NjsNCi0JfTsNCi19Ow0KLQ0K LS8qKiBPdXRlciBpbnRlcmZhY2UgVlhMQU4gZW5jYXBzdWxhdGlvbiBydWxlcyBjb250YWluZXIu ICovDQotc3RydWN0IHRjZl9pcnVsZSB7DQotCUxJU1RfRU5UUlkodGNmX2lydWxlKSBuZXh0Ow0K LQlMSVNUX0hFQUQoLCB0Y2ZfbmVpZ2hfcnVsZSkgbmVpZ2g7DQotCUxJU1RfSEVBRCgsIHRjZl9s b2NhbF9ydWxlKSBsb2NhbDsNCi0JdWludDMyX3QgcmVmY250Ow0KLQl1bnNpZ25lZCBpbnQgaWZv dXRlcjsgLyoqPCBPd24gaW50ZXJmYWNlIGluZGV4LiAqLw0KLX07DQotDQotLyoqIFZYTEFOIHZp cnR1YWwgbmV0ZGV2LiAqLw0KLXN0cnVjdCB0Y2ZfdnRlcCB7DQotCUxJU1RfRU5UUlkodGNmX3Z0 ZXApIG5leHQ7DQotCXVpbnQzMl90IHJlZmNudDsNCi0JdW5zaWduZWQgaW50IGlmaW5kZXg7IC8q KjwgT3duIGludGVyZmFjZSBpbmRleC4gKi8NCi0JdWludDE2X3QgcG9ydDsNCi0JdWludDMyX3Qg Y3JlYXRlZDoxOyAvKio8IEFjdHVhbGx5IGNyZWF0ZWQgYnkgUE1ELiAqLw0KLQl1aW50MzJfdCB3 YWl0cmVnOjE7IC8qKjwgV2FpdCBmb3IgVlhMQU4gVURQIHBvcnQgcmVnaXN0cmF0aW9uLiAqLw0K LX07DQotDQotLyoqIFR1bm5lbCBkZXNjcmlwdG9yIGhlYWRlciwgY29tbW9uIGZvciBhbGwgdHVu bmVsIHR5cGVzLiAqLw0KLXN0cnVjdCBmbG93X3RjZl90dW5uZWxfaGRyIHsNCi0JdWludDMyX3Qg dHlwZTsgLyoqPCBUdW5uZWwgYWN0aW9uIHR5cGUuICovDQotCXN0cnVjdCB0Y2ZfdnRlcCAqdnRl cDsgLyoqPCBWaXJ0dWFsIHR1bm5lbCBlbmRwb2ludCBkZXZpY2UuICovDQotCXVuc2lnbmVkIGlu dCBpZmluZGV4X29yZzsgLyoqPCBPcmlnaW5hbCBkc3Qvc3JjIGludGVyZmFjZSAqLw0KLQl1bnNp Z25lZCBpbnQgKmlmaW5kZXhfcHRyOyAvKio8IEludGVyZmFjZSBwdHIgaW4gbWVzc2FnZS4gKi8N Ci19Ow0KLQ0KLXN0cnVjdCBmbG93X3RjZl92eGxhbl9kZWNhcCB7DQotCXN0cnVjdCBmbG93X3Rj Zl90dW5uZWxfaGRyIGhkcjsNCi0JdWludDE2X3QgdWRwX3BvcnQ7DQotfTsNCi0NCi1zdHJ1Y3Qg Zmxvd190Y2ZfdnhsYW5fZW5jYXAgew0KLQlzdHJ1Y3QgZmxvd190Y2ZfdHVubmVsX2hkciBoZHI7 DQotCXN0cnVjdCB0Y2ZfaXJ1bGUgKmlmYWNlOw0KLQl1aW50MzJfdCBtYXNrOw0KLQl1aW50OF90 IGlwX3RvczsNCi0JdWludDhfdCBpcF90dGxfaG9wOw0KLQlzdHJ1Y3Qgew0KLQkJc3RydWN0IGV0 aGVyX2FkZHIgZHN0Ow0KLQkJc3RydWN0IGV0aGVyX2FkZHIgc3JjOw0KLQl9IGV0aDsNCi0JdW5p b24gew0KLQkJc3RydWN0IHsNCi0JCQlydGVfYmUzMl90IGRzdDsNCi0JCQlydGVfYmUzMl90IHNy YzsNCi0JCX0gaXB2NDsNCi0JCXN0cnVjdCB7DQotCQkJdWludDhfdCBkc3RbSVBWNl9BRERSX0xF Tl07DQotCQkJdWludDhfdCBzcmNbSVBWNl9BRERSX0xFTl07DQotCQl9IGlwdjY7DQotCX07DQot CXN0cnVjdCB7DQotCQlydGVfYmUxNl90IHNyYzsNCi0JCXJ0ZV9iZTE2X3QgZHN0Ow0KLQl9IHVk cDsNCi0Jc3RydWN0IHsNCi0JCXVpbnQ4X3Qgdm5pWzNdOw0KLQl9IHZ4bGFuOw0KLX07DQotDQot LyoqIFN0cnVjdHVyZSB1c2VkIHdoZW4gZXh0cmFjdGluZyB0aGUgdmFsdWVzIG9mIGEgZmxvdyBj b3VudGVycw0KLSAqIGZyb20gYSBuZXRsaW5rIG1lc3NhZ2UuDQotICovDQotc3RydWN0IGZsb3df dGNmX3N0YXRzX2Jhc2ljIHsNCi0JYm9vbCB2YWxpZDsNCi0Jc3RydWN0IGduZXRfc3RhdHNfYmFz aWMgY291bnRlcnM7DQotfTsNCi0NCi0vKiogRW1wdHkgbWFza3MgZm9yIGtub3duIGl0ZW0gdHlw ZXMuICovDQotc3RhdGljIGNvbnN0IHVuaW9uIHsNCi0Jc3RydWN0IHJ0ZV9mbG93X2l0ZW1fcG9y dF9pZCBwb3J0X2lkOw0KLQlzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9ldGggZXRoOw0KLQlzdHJ1Y3Qg cnRlX2Zsb3dfaXRlbV92bGFuIHZsYW47DQotCXN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjQgaXB2 NDsNCi0Jc3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2NiBpcHY2Ow0KLQlzdHJ1Y3QgcnRlX2Zsb3df aXRlbV90Y3AgdGNwOw0KLQlzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV91ZHAgdWRwOw0KLQlzdHJ1Y3Qg cnRlX2Zsb3dfaXRlbV92eGxhbiB2eGxhbjsNCi19IGZsb3dfdGNmX21hc2tfZW1wdHkgPSB7DQot CXswfSwNCi19Ow0KLQ0KLS8qKiBTdXBwb3J0ZWQgbWFza3MgZm9yIGtub3duIGl0ZW0gdHlwZXMu ICovDQotc3RhdGljIGNvbnN0IHN0cnVjdCB7DQotCXN0cnVjdCBydGVfZmxvd19pdGVtX3BvcnRf aWQgcG9ydF9pZDsNCi0Jc3RydWN0IHJ0ZV9mbG93X2l0ZW1fZXRoIGV0aDsNCi0Jc3RydWN0IHJ0 ZV9mbG93X2l0ZW1fdmxhbiB2bGFuOw0KLQlzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9pcHY0IGlwdjQ7 DQotCXN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjYgaXB2NjsNCi0Jc3RydWN0IHJ0ZV9mbG93X2l0 ZW1fdGNwIHRjcDsNCi0Jc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwIHVkcDsNCi0Jc3RydWN0IHJ0 ZV9mbG93X2l0ZW1fdnhsYW4gdnhsYW47DQotfSBmbG93X3RjZl9tYXNrX3N1cHBvcnRlZCA9IHsN Ci0JLnBvcnRfaWQgPSB7DQotCQkuaWQgPSAweGZmZmZmZmZmLA0KLQl9LA0KLQkuZXRoID0gew0K LQkJLnR5cGUgPSBSVEVfQkUxNigweGZmZmYpLA0KLQkJLmRzdC5hZGRyX2J5dGVzID0gIlx4ZmZc eGZmXHhmZlx4ZmZceGZmXHhmZiIsDQotCQkuc3JjLmFkZHJfYnl0ZXMgPSAiXHhmZlx4ZmZceGZm XHhmZlx4ZmZceGZmIiwNCi0JfSwNCi0JLnZsYW4gPSB7DQotCQkvKiBQQ1AgYW5kIFZJRCBvbmx5 LCBubyBERUkuICovDQotCQkudGNpID0gUlRFX0JFMTYoMHhlZmZmKSwNCi0JCS5pbm5lcl90eXBl ID0gUlRFX0JFMTYoMHhmZmZmKSwNCi0JfSwNCi0JLmlwdjQuaGRyID0gew0KLQkJLm5leHRfcHJv dG9faWQgPSAweGZmLA0KLQkJLnRpbWVfdG9fbGl2ZSA9IDB4ZmYsDQotCQkudHlwZV9vZl9zZXJ2 aWNlID0gMHhmZiwNCi0JCS5zcmNfYWRkciA9IFJURV9CRTMyKDB4ZmZmZmZmZmYpLA0KLQkJLmRz dF9hZGRyID0gUlRFX0JFMzIoMHhmZmZmZmZmZiksDQotCX0sDQotCS5pcHY2LmhkciA9IHsNCi0J CS5wcm90byA9IDB4ZmYsDQotCQkudnRjX2Zsb3cgPSBSVEVfQkUzMigweGZmdWwgPDwgSVBWNl9I RFJfRkxfU0hJRlQpLA0KLQkJLmhvcF9saW1pdHMgPSAweGZmLA0KLQkJLnNyY19hZGRyID0NCi0J CQkiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiDQotCQkJIlx4ZmZceGZmXHhmZlx4 ZmZceGZmXHhmZlx4ZmZceGZmIiwNCi0JCS5kc3RfYWRkciA9DQotCQkJIlx4ZmZceGZmXHhmZlx4 ZmZceGZmXHhmZlx4ZmZceGZmIg0KLQkJCSJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhm ZiIsDQotCX0sDQotCS50Y3AuaGRyID0gew0KLQkJLnNyY19wb3J0ID0gUlRFX0JFMTYoMHhmZmZm KSwNCi0JCS5kc3RfcG9ydCA9IFJURV9CRTE2KDB4ZmZmZiksDQotCQkudGNwX2ZsYWdzID0gMHhm ZiwNCi0JfSwNCi0JLnVkcC5oZHIgPSB7DQotCQkuc3JjX3BvcnQgPSBSVEVfQkUxNigweGZmZmYp LA0KLQkJLmRzdF9wb3J0ID0gUlRFX0JFMTYoMHhmZmZmKSwNCi0JfSwNCi0JLnZ4bGFuID0gew0K LQkgICAgICAgLnZuaSA9ICJceGZmXHhmZlx4ZmYiLA0KLQl9LA0KLX07DQotDQotI2RlZmluZSBT Wl9OTEFUVFJfSERSIE1OTF9BTElHTihzaXplb2Yoc3RydWN0IG5sYXR0cikpDQotI2RlZmluZSBT Wl9OTEFUVFJfTkVTVCBTWl9OTEFUVFJfSERSDQotI2RlZmluZSBTWl9OTEFUVFJfREFUQV9PRihs ZW4pIE1OTF9BTElHTihTWl9OTEFUVFJfSERSICsgKGxlbikpDQotI2RlZmluZSBTWl9OTEFUVFJf VFlQRV9PRih0eXApIFNaX05MQVRUUl9EQVRBX09GKHNpemVvZih0eXApKQ0KLSNkZWZpbmUgU1pf TkxBVFRSX1NUUlpfT0Yoc3RyKSBTWl9OTEFUVFJfREFUQV9PRihzdHJsZW4oc3RyKSArIDEpDQot DQotI2RlZmluZSBQVE9JX1RBQkxFX1NaX01BWChkZXYpIChtbHg1X2Rldl90b19wb3J0X2lkKChk ZXYpLT5kZXZpY2UsIE5VTEwsIDApICsgMikNCi0NCi0vKiogRFBESyBwb3J0IHRvIG5ldHdvcmsg aW50ZXJmYWNlIGluZGV4IChpZmluZGV4KSBjb252ZXJzaW9uLiAqLw0KLXN0cnVjdCBmbG93X3Rj Zl9wdG9pIHsNCi0JdWludDE2X3QgcG9ydF9pZDsgLyoqPCBEUERLIHBvcnQgSUQuICovDQotCXVu c2lnbmVkIGludCBpZmluZGV4OyAvKio8IE5ldHdvcmsgaW50ZXJmYWNlIGluZGV4LiAqLw0KLX07 DQotDQotLyogRHVlIHRvIGEgbGltaXRhdGlvbiBvbiBkcml2ZXIvRlcuICovDQotI2RlZmluZSBN TFg1X1RDRl9HUk9VUF9JRF9NQVggMw0KLQ0KLS8qDQotICogRHVlIHRvIGEgbGltaXRhdGlvbiBv biBkcml2ZXIvRlcsIHByaW9yaXR5IHJhbmdlcyBmcm9tIDEgdG8gMTYgaW4ga2VybmVsLg0KLSAq IFByaW9yaXR5IGluIHJ0ZV9mbG93IGF0dHJpYnV0ZSBzdGFydHMgZnJvbSAwIGFuZCBpcyBhZGRl ZCBieSAxIGluDQotICogdHJhbnNsYXRpb24uIFRoaXMgaXMgc3ViamVjdCB0byBiZSBjaGFuZ2Vk IHRvIGRldGVybWluZSB0aGUgbWF4IHByaW9yaXR5DQotICogYmFzZWQgb24gdHJpYWwtYW5kLWVy cm9yIGxpa2UgVmVyYnMgZHJpdmVyIG9uY2UgdGhlIHJlc3RyaWN0aW9uIGlzIGxpZnRlZCBvcg0K LSAqIHRoZSByYW5nZSBpcyBleHRlbmRlZC4NCi0gKi8NCi0jZGVmaW5lIE1MWDVfVENGX0dST1VQ X1BSSU9SSVRZX01BWCAxNQ0KLQ0KLSNkZWZpbmUgTUxYNV9UQ0ZfRkFURV9BQ1RJT05TIFwNCi0J KE1MWDVfRkxPV19BQ1RJT05fRFJPUCB8IE1MWDVfRkxPV19BQ1RJT05fUE9SVF9JRCB8IFwNCi0J IE1MWDVfRkxPV19BQ1RJT05fSlVNUCkNCi0NCi0jZGVmaW5lIE1MWDVfVENGX1ZMQU5fQUNUSU9O UyBcDQotCShNTFg1X0ZMT1dfQUNUSU9OX09GX1BPUF9WTEFOIHwgTUxYNV9GTE9XX0FDVElPTl9P Rl9QVVNIX1ZMQU4gfCBcDQotCSBNTFg1X0ZMT1dfQUNUSU9OX09GX1NFVF9WTEFOX1ZJRCB8IE1M WDVfRkxPV19BQ1RJT05fT0ZfU0VUX1ZMQU5fUENQKQ0KLQ0KLSNkZWZpbmUgTUxYNV9UQ0ZfVlhM QU5fQUNUSU9OUyBcDQotCShNTFg1X0ZMT1dfQUNUSU9OX1ZYTEFOX0VOQ0FQIHwgTUxYNV9GTE9X X0FDVElPTl9WWExBTl9ERUNBUCkNCi0NCi0jZGVmaW5lIE1MWDVfVENGX1BFRElUX0FDVElPTlMg XA0KLQkoTUxYNV9GTE9XX0FDVElPTl9TRVRfSVBWNF9TUkMgfCBNTFg1X0ZMT1dfQUNUSU9OX1NF VF9JUFY0X0RTVCB8IFwNCi0JIE1MWDVfRkxPV19BQ1RJT05fU0VUX0lQVjZfU1JDIHwgTUxYNV9G TE9XX0FDVElPTl9TRVRfSVBWNl9EU1QgfCBcDQotCSBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9UUF9T UkMgfCBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9UUF9EU1QgfCBcDQotCSBNTFg1X0ZMT1dfQUNUSU9O X1NFVF9UVEwgfCBNTFg1X0ZMT1dfQUNUSU9OX0RFQ19UVEwgfCBcDQotCSBNTFg1X0ZMT1dfQUNU SU9OX1NFVF9NQUNfU1JDIHwgTUxYNV9GTE9XX0FDVElPTl9TRVRfTUFDX0RTVCkNCi0NCi0jZGVm aW5lIE1MWDVfVENGX0NPTkZJR19BQ1RJT05TIFwNCi0JKE1MWDVfRkxPV19BQ1RJT05fUE9SVF9J RCB8IE1MWDVfRkxPV19BQ1RJT05fSlVNUCB8IFwNCi0JIE1MWDVfRkxPV19BQ1RJT05fT0ZfUFVT SF9WTEFOIHwgTUxYNV9GTE9XX0FDVElPTl9PRl9TRVRfVkxBTl9WSUQgfCBcDQotCSBNTFg1X0ZM T1dfQUNUSU9OX09GX1NFVF9WTEFOX1BDUCB8IFwNCi0JIChNTFg1X1RDRl9QRURJVF9BQ1RJT05T ICYgfk1MWDVfRkxPV19BQ1RJT05fREVDX1RUTCkpDQotDQotI2RlZmluZSBNQVhfUEVESVRfS0VZ UyAxMjgNCi0jZGVmaW5lIFNaX1BFRElUX0tFWV9WQUwgNA0KLQ0KLSNkZWZpbmUgTlVNX09GX1BF RElUX0tFWVMoc3opIFwNCi0JKCgoc3opIC8gU1pfUEVESVRfS0VZX1ZBTCkgKyAoKChzeikgJSBT Wl9QRURJVF9LRVlfVkFMKSA/IDEgOiAwKSkNCi0NCi1zdHJ1Y3QgcGVkaXRfa2V5X2V4IHsNCi0J ZW51bSBwZWRpdF9oZWFkZXJfdHlwZSBodHlwZTsNCi0JZW51bSBwZWRpdF9jbWQgY21kOw0KLX07 DQotDQotc3RydWN0IHBlZGl0X3BhcnNlciB7DQotCXN0cnVjdCB0Y19wZWRpdF9zZWwgc2VsOw0K LQlzdHJ1Y3QgdGNfcGVkaXRfa2V5IGtleXNbTUFYX1BFRElUX0tFWVNdOw0KLQlzdHJ1Y3QgcGVk aXRfa2V5X2V4IGtleXNfZXhbTUFYX1BFRElUX0tFWVNdOw0KLX07DQotDQotLyoqDQotICogQ3Jl YXRlIHNwYWNlIGZvciB1c2luZyB0aGUgaW1wbGljaXRseSBjcmVhdGVkIFRDIGZsb3cgY291bnRl ci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gZGV2DQotICogICBQb2ludGVyIHRvIHRoZSBFdGhlcm5l dCBkZXZpY2Ugc3RydWN0dXJlLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgQSBwb2ludGVyIHRv IHRoZSBjb3VudGVyIGRhdGEgc3RydWN0dXJlLCBOVUxMIG90aGVyd2lzZSBhbmQNCi0gKiAgIHJ0 ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIHN0cnVjdCBtbHg1X2Zsb3dfY291bnRlciAq DQotZmxvd190Y2ZfY291bnRlcl9uZXcodm9pZCkNCi17DQotCXN0cnVjdCBtbHg1X2Zsb3dfY291 bnRlciAqY250Ow0KLQ0KLQkvKg0KLQkgKiBlc3dpdGNoIGNvdW50ZXIgY2Fubm90IGJlIHNoYXJl ZCBhbmQgaXRzIGlkIGlzIHVua25vd24uDQotCSAqIGN1cnJlbnRseSByZXR1cm5pbmcgYWxsIHdp dGggaWQgMC4NCi0JICogaW4gdGhlIGZ1dHVyZSBtYXliZSBiZXR0ZXIgdG8gc3dpdGNoIHRvIHVu aXF1ZSBudW1iZXJzLg0KLQkgKi8NCi0Jc3RydWN0IG1seDVfZmxvd19jb3VudGVyIHRtcGwgPSB7 DQotCQkucmVmX2NudCA9IDEsDQotCX07DQotCWNudCA9IHJ0ZV9jYWxsb2MoX19mdW5jX18sIDEs IHNpemVvZigqY250KSwgMCk7DQotCWlmICghY250KSB7DQotCQlydGVfZXJybm8gPSBFTk9NRU07 DQotCQlyZXR1cm4gTlVMTDsNCi0JfQ0KLQkqY250ID0gdG1wbDsNCi0JLyogSW1wbGljaXQgY291 bnRlciwgZG8gbm90IGFkZCB0byBsaXN0LiAqLw0KLQlyZXR1cm4gY250Ow0KLX0NCi0NCi0vKioN Ci0gKiBTZXQgcGVkaXQga2V5IG9mIE1BQyBhZGRyZXNzDQotICoNCi0gKiBAcGFyYW1baW5dIGFj dGlvbnMNCi0gKiAgIHBvaW50ZXIgdG8gYWN0aW9uIHNwZWNpZmljYXRpb24NCi0gKiBAcGFyYW1b aW4sb3V0XSBwX3BhcnNlcg0KLSAqICAgcG9pbnRlciB0byBwZWRpdF9wYXJzZXINCi0gKi8NCi1z dGF0aWMgdm9pZA0KLWZsb3dfdGNmX3BlZGl0X2tleV9zZXRfbWFjKGNvbnN0IHN0cnVjdCBydGVf Zmxvd19hY3Rpb24gKmFjdGlvbnMsDQotCQkJICAgc3RydWN0IHBlZGl0X3BhcnNlciAqcF9wYXJz ZXIpDQotew0KLQlpbnQgaWR4ID0gcF9wYXJzZXItPnNlbC5ua2V5czsNCi0JdWludDMyX3Qgb2Zm ID0gYWN0aW9ucy0+dHlwZSA9PSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRfTUFDX1NSQyA/DQot CQkJCQlvZmZzZXRvZihzdHJ1Y3QgZXRoZXJfaGRyLCBzX2FkZHIpIDoNCi0JCQkJCW9mZnNldG9m KHN0cnVjdCBldGhlcl9oZHIsIGRfYWRkcik7DQotCWNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rp b25fc2V0X21hYyAqY29uZiA9DQotCQkoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbl9zZXRf bWFjICopYWN0aW9ucy0+Y29uZjsNCi0NCi0JcF9wYXJzZXItPmtleXNbaWR4XS5vZmYgPSBvZmY7 DQotCXBfcGFyc2VyLT5rZXlzW2lkeF0ubWFzayA9IH5VSU5UMzJfTUFYOw0KLQlwX3BhcnNlci0+ a2V5c19leFtpZHhdLmh0eXBlID0gVENBX1BFRElUX0tFWV9FWF9IRFJfVFlQRV9FVEg7DQotCXBf cGFyc2VyLT5rZXlzX2V4W2lkeF0uY21kID0gVENBX1BFRElUX0tFWV9FWF9DTURfU0VUOw0KLQlt ZW1jcHkoJnBfcGFyc2VyLT5rZXlzW2lkeF0udmFsLA0KLQkJY29uZi0+bWFjX2FkZHIsIFNaX1BF RElUX0tFWV9WQUwpOw0KLQlpZHgrKzsNCi0JcF9wYXJzZXItPmtleXNbaWR4XS5vZmYgPSBvZmYg KyBTWl9QRURJVF9LRVlfVkFMOw0KLQlwX3BhcnNlci0+a2V5c1tpZHhdLm1hc2sgPSAweEZGRkYw MDAwOw0KLQlwX3BhcnNlci0+a2V5c19leFtpZHhdLmh0eXBlID0gVENBX1BFRElUX0tFWV9FWF9I RFJfVFlQRV9FVEg7DQotCXBfcGFyc2VyLT5rZXlzX2V4W2lkeF0uY21kID0gVENBX1BFRElUX0tF WV9FWF9DTURfU0VUOw0KLQltZW1jcHkoJnBfcGFyc2VyLT5rZXlzW2lkeF0udmFsLA0KLQkJY29u Zi0+bWFjX2FkZHIgKyBTWl9QRURJVF9LRVlfVkFMLA0KLQkJRVRIRVJfQUREUl9MRU4gLSBTWl9Q RURJVF9LRVlfVkFMKTsNCi0JcF9wYXJzZXItPnNlbC5ua2V5cyA9ICgrK2lkeCk7DQotfQ0KLQ0K LS8qKg0KLSAqIFNldCBwZWRpdCBrZXkgb2YgZGVjcmVhc2Uvc2V0IHR0bA0KLSAqDQotICogQHBh cmFtW2luXSBhY3Rpb25zDQotICogICBwb2ludGVyIHRvIGFjdGlvbiBzcGVjaWZpY2F0aW9uDQot ICogQHBhcmFtW2luLG91dF0gcF9wYXJzZXINCi0gKiAgIHBvaW50ZXIgdG8gcGVkaXRfcGFyc2Vy DQotICogQHBhcmFtW2luXSBpdGVtX2ZsYWdzDQotICogICBmbGFncyBvZiBhbGwgaXRlbXMgcHJl c2VudGVkDQotICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9wZWRpdF9rZXlfc2V0X2RlY190 dGwoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAqYWN0aW9ucywNCi0JCQkJc3RydWN0IHBl ZGl0X3BhcnNlciAqcF9wYXJzZXIsDQotCQkJCXVpbnQ2NF90IGl0ZW1fZmxhZ3MpDQotew0KLQlp bnQgaWR4ID0gcF9wYXJzZXItPnNlbC5ua2V5czsNCi0NCi0JcF9wYXJzZXItPmtleXNbaWR4XS5t YXNrID0gMHhGRkZGRkYwMDsNCi0JaWYgKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJfT1VU RVJfTDNfSVBWNCkgew0KLQkJcF9wYXJzZXItPmtleXNfZXhbaWR4XS5odHlwZSA9IFRDQV9QRURJ VF9LRVlfRVhfSERSX1RZUEVfSVA0Ow0KLQkJcF9wYXJzZXItPmtleXNbaWR4XS5vZmYgPQ0KLQkJ CW9mZnNldG9mKHN0cnVjdCBpcHY0X2hkciwgdGltZV90b19saXZlKTsNCi0JfQ0KLQlpZiAoaXRl bV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MM19JUFY2KSB7DQotCQlwX3BhcnNlci0+ a2V5c19leFtpZHhdLmh0eXBlID0gVENBX1BFRElUX0tFWV9FWF9IRFJfVFlQRV9JUDY7DQotCQlw X3BhcnNlci0+a2V5c1tpZHhdLm9mZiA9DQotCQkJb2Zmc2V0b2Yoc3RydWN0IGlwdjZfaGRyLCBo b3BfbGltaXRzKTsNCi0JfQ0KLQlpZiAoYWN0aW9ucy0+dHlwZSA9PSBSVEVfRkxPV19BQ1RJT05f VFlQRV9ERUNfVFRMKSB7DQotCQlwX3BhcnNlci0+a2V5c19leFtpZHhdLmNtZCA9IFRDQV9QRURJ VF9LRVlfRVhfQ01EX0FERDsNCi0JCXBfcGFyc2VyLT5rZXlzW2lkeF0udmFsID0gMHgwMDAwMDBG RjsNCi0JfSBlbHNlIHsNCi0JCXBfcGFyc2VyLT5rZXlzX2V4W2lkeF0uY21kID0gVENBX1BFRElU X0tFWV9FWF9DTURfU0VUOw0KLQkJcF9wYXJzZXItPmtleXNbaWR4XS52YWwgPQ0KLQkJCShfX3Uz MikoKGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb25fc2V0X3R0bCAqKQ0KLQkJCSBhY3Rpb25z LT5jb25mKS0+dHRsX3ZhbHVlOw0KLQl9DQotCXBfcGFyc2VyLT5zZWwubmtleXMgPSAoKytpZHgp Ow0KLX0NCi0NCi0vKioNCi0gKiBTZXQgcGVkaXQga2V5IG9mIHRyYW5zcG9ydCAoVENQL1VEUCkg cG9ydCB2YWx1ZQ0KLSAqDQotICogQHBhcmFtW2luXSBhY3Rpb25zDQotICogICBwb2ludGVyIHRv IGFjdGlvbiBzcGVjaWZpY2F0aW9uDQotICogQHBhcmFtW2luLG91dF0gcF9wYXJzZXINCi0gKiAg IHBvaW50ZXIgdG8gcGVkaXRfcGFyc2VyDQotICogQHBhcmFtW2luXSBpdGVtX2ZsYWdzDQotICog ICBmbGFncyBvZiBhbGwgaXRlbXMgcHJlc2VudGVkDQotICovDQotc3RhdGljIHZvaWQNCi1mbG93 X3RjZl9wZWRpdF9rZXlfc2V0X3RwX3BvcnQoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAq YWN0aW9ucywNCi0JCQkJc3RydWN0IHBlZGl0X3BhcnNlciAqcF9wYXJzZXIsDQotCQkJCXVpbnQ2 NF90IGl0ZW1fZmxhZ3MpDQotew0KLQlpbnQgaWR4ID0gcF9wYXJzZXItPnNlbC5ua2V5czsNCi0N Ci0JaWYgKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJfT1VURVJfTDRfVURQKQ0KLQkJcF9w YXJzZXItPmtleXNfZXhbaWR4XS5odHlwZSA9IFRDQV9QRURJVF9LRVlfRVhfSERSX1RZUEVfVURQ Ow0KLQlpZiAoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MNF9UQ1ApDQotCQlw X3BhcnNlci0+a2V5c19leFtpZHhdLmh0eXBlID0gVENBX1BFRElUX0tFWV9FWF9IRFJfVFlQRV9U Q1A7DQotCXBfcGFyc2VyLT5rZXlzX2V4W2lkeF0uY21kID0gVENBX1BFRElUX0tFWV9FWF9DTURf U0VUOw0KLQkvKiBvZmZzZXQgb2Ygc3JjL2RzdCBwb3J0IGlzIHNhbWUgZm9yIFRDUCBhbmQgVURQ ICovDQotCXBfcGFyc2VyLT5rZXlzW2lkeF0ub2ZmID0NCi0JCWFjdGlvbnMtPnR5cGUgPT0gUlRF X0ZMT1dfQUNUSU9OX1RZUEVfU0VUX1RQX1NSQyA/DQotCQlvZmZzZXRvZihzdHJ1Y3QgdGNwX2hk ciwgc3JjX3BvcnQpIDoNCi0JCW9mZnNldG9mKHN0cnVjdCB0Y3BfaGRyLCBkc3RfcG9ydCk7DQot CXBfcGFyc2VyLT5rZXlzW2lkeF0ubWFzayA9IDB4RkZGRjAwMDA7DQotCXBfcGFyc2VyLT5rZXlz W2lkeF0udmFsID0NCi0JCShfX3UzMikoKGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb25fc2V0 X3RwICopDQotCQkJCWFjdGlvbnMtPmNvbmYpLT5wb3J0Ow0KLQlwX3BhcnNlci0+c2VsLm5rZXlz ID0gKCsraWR4KTsNCi19DQotDQotLyoqDQotICogU2V0IHBlZGl0IGtleSBvZiBpcHY2IGFkZHJl c3MNCi0gKg0KLSAqIEBwYXJhbVtpbl0gYWN0aW9ucw0KLSAqICAgcG9pbnRlciB0byBhY3Rpb24g c3BlY2lmaWNhdGlvbg0KLSAqIEBwYXJhbVtpbixvdXRdIHBfcGFyc2VyDQotICogICBwb2ludGVy IHRvIHBlZGl0X3BhcnNlcg0KLSAqLw0KLXN0YXRpYyB2b2lkDQotZmxvd190Y2ZfcGVkaXRfa2V5 X3NldF9pcHY2X2FkZHIoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAqYWN0aW9ucywNCi0J CQkJIHN0cnVjdCBwZWRpdF9wYXJzZXIgKnBfcGFyc2VyKQ0KLXsNCi0JaW50IGlkeCA9IHBfcGFy c2VyLT5zZWwubmtleXM7DQotCWludCBrZXlzID0gTlVNX09GX1BFRElUX0tFWVMoSVBWNl9BRERS X0xFTik7DQotCWludCBvZmZfYmFzZSA9DQotCQlhY3Rpb25zLT50eXBlID09IFJURV9GTE9XX0FD VElPTl9UWVBFX1NFVF9JUFY2X1NSQyA/DQotCQlvZmZzZXRvZihzdHJ1Y3QgaXB2Nl9oZHIsIHNy Y19hZGRyKSA6DQotCQlvZmZzZXRvZihzdHJ1Y3QgaXB2Nl9oZHIsIGRzdF9hZGRyKTsNCi0JY29u c3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbl9zZXRfaXB2NiAqY29uZiA9DQotCQkoY29uc3Qgc3Ry dWN0IHJ0ZV9mbG93X2FjdGlvbl9zZXRfaXB2NiAqKWFjdGlvbnMtPmNvbmY7DQotDQotCWZvciAo aW50IGkgPSAwOyBpIDwga2V5czsgaSsrLCBpZHgrKykgew0KLQkJcF9wYXJzZXItPmtleXNfZXhb aWR4XS5odHlwZSA9IFRDQV9QRURJVF9LRVlfRVhfSERSX1RZUEVfSVA2Ow0KLQkJcF9wYXJzZXIt PmtleXNfZXhbaWR4XS5jbWQgPSBUQ0FfUEVESVRfS0VZX0VYX0NNRF9TRVQ7DQotCQlwX3BhcnNl ci0+a2V5c1tpZHhdLm9mZiA9IG9mZl9iYXNlICsgaSAqIFNaX1BFRElUX0tFWV9WQUw7DQotCQlw X3BhcnNlci0+a2V5c1tpZHhdLm1hc2sgPSB+VUlOVDMyX01BWDsNCi0JCW1lbWNweSgmcF9wYXJz ZXItPmtleXNbaWR4XS52YWwsDQotCQkJY29uZi0+aXB2Nl9hZGRyICsgaSAqICBTWl9QRURJVF9L RVlfVkFMLA0KLQkJCVNaX1BFRElUX0tFWV9WQUwpOw0KLQl9DQotCXBfcGFyc2VyLT5zZWwubmtl eXMgKz0ga2V5czsNCi19DQotDQotLyoqDQotICogU2V0IHBlZGl0IGtleSBvZiBpcHY0IGFkZHJl c3MNCi0gKg0KLSAqIEBwYXJhbVtpbl0gYWN0aW9ucw0KLSAqICAgcG9pbnRlciB0byBhY3Rpb24g c3BlY2lmaWNhdGlvbg0KLSAqIEBwYXJhbVtpbixvdXRdIHBfcGFyc2VyDQotICogICBwb2ludGVy IHRvIHBlZGl0X3BhcnNlcg0KLSAqLw0KLXN0YXRpYyB2b2lkDQotZmxvd190Y2ZfcGVkaXRfa2V5 X3NldF9pcHY0X2FkZHIoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAqYWN0aW9ucywNCi0J CQkJIHN0cnVjdCBwZWRpdF9wYXJzZXIgKnBfcGFyc2VyKQ0KLXsNCi0JaW50IGlkeCA9IHBfcGFy c2VyLT5zZWwubmtleXM7DQotDQotCXBfcGFyc2VyLT5rZXlzX2V4W2lkeF0uaHR5cGUgPSBUQ0Ff UEVESVRfS0VZX0VYX0hEUl9UWVBFX0lQNDsNCi0JcF9wYXJzZXItPmtleXNfZXhbaWR4XS5jbWQg PSBUQ0FfUEVESVRfS0VZX0VYX0NNRF9TRVQ7DQotCXBfcGFyc2VyLT5rZXlzW2lkeF0ub2ZmID0N Ci0JCWFjdGlvbnMtPnR5cGUgPT0gUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX0lQVjRfU1JDID8N Ci0JCW9mZnNldG9mKHN0cnVjdCBpcHY0X2hkciwgc3JjX2FkZHIpIDoNCi0JCW9mZnNldG9mKHN0 cnVjdCBpcHY0X2hkciwgZHN0X2FkZHIpOw0KLQlwX3BhcnNlci0+a2V5c1tpZHhdLm1hc2sgPSB+ VUlOVDMyX01BWDsNCi0JcF9wYXJzZXItPmtleXNbaWR4XS52YWwgPQ0KLQkJKChjb25zdCBzdHJ1 Y3QgcnRlX2Zsb3dfYWN0aW9uX3NldF9pcHY0ICopDQotCQkgYWN0aW9ucy0+Y29uZiktPmlwdjRf YWRkcjsNCi0JcF9wYXJzZXItPnNlbC5ua2V5cyA9ICgrK2lkeCk7DQotfQ0KLQ0KLS8qKg0KLSAq IENyZWF0ZSB0aGUgcGVkaXQncyBuYSBhdHRyaWJ1dGUgaW4gbmV0bGluayBtZXNzYWdlDQotICog b24gcHJlLWFsbG9jYXRlIG1lc3NhZ2UgYnVmZmVyDQotICoNCi0gKiBAcGFyYW1baW4sb3V0XSBu bA0KLSAqICAgcG9pbnRlciB0byBwcmUtYWxsb2NhdGVkIG5ldGxpbmsgbWVzc2FnZSBidWZmZXIN Ci0gKiBAcGFyYW1baW4sb3V0XSBhY3Rpb25zDQotICogICBwb2ludGVyIHRvIHBvaW50ZXIgb2Yg YWN0aW9ucyBzcGVjaWZpY2F0aW9uLg0KLSAqIEBwYXJhbVtpbixvdXRdIGFjdGlvbl9mbGFncw0K LSAqICAgcG9pbnRlciB0byBhY3Rpb25zIGZsYWdzDQotICogQHBhcmFtW2luXSBpdGVtX2ZsYWdz DQotICogICBmbGFncyBvZiBhbGwgaXRlbSBwcmVzZW50ZWQNCi0gKi8NCi1zdGF0aWMgdm9pZA0K LWZsb3dfdGNmX2NyZWF0ZV9wZWRpdF9tbmxfbXNnKHN0cnVjdCBubG1zZ2hkciAqbmwsDQotCQkJ ICAgICAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAqKmFjdGlvbnMsDQotCQkJICAgICAg dWludDY0X3QgaXRlbV9mbGFncykNCi17DQotCXN0cnVjdCBwZWRpdF9wYXJzZXIgcF9wYXJzZXI7 DQotCXN0cnVjdCBubGF0dHIgKm5hX2FjdF9vcHRpb25zOw0KLQlzdHJ1Y3QgbmxhdHRyICpuYV9w ZWRpdF9rZXlzOw0KLQ0KLQltZW1zZXQoJnBfcGFyc2VyLCAwLCBzaXplb2YocF9wYXJzZXIpKTsN Ci0JbW5sX2F0dHJfcHV0X3N0cnoobmwsIFRDQV9BQ1RfS0lORCwgInBlZGl0Iik7DQotCW5hX2Fj dF9vcHRpb25zID0gbW5sX2F0dHJfbmVzdF9zdGFydChubCwgVENBX0FDVF9PUFRJT05TKTsNCi0J LyogYWxsIG1vZGlmeSBoZWFkZXIgYWN0aW9ucyBzaG91bGQgYmUgaW4gb25lIHRjLXBlZGl0IGFj dGlvbiAqLw0KLQlmb3IgKDsgKCphY3Rpb25zKS0+dHlwZSAhPSBSVEVfRkxPV19BQ1RJT05fVFlQ RV9FTkQ7ICgqYWN0aW9ucykrKykgew0KLQkJc3dpdGNoICgoKmFjdGlvbnMpLT50eXBlKSB7DQot CQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9JUFY0X1NSQzoNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX0lQVjRfRFNUOg0KLQkJCWZsb3dfdGNmX3BlZGl0X2tleV9zZXRf aXB2NF9hZGRyKCphY3Rpb25zLCAmcF9wYXJzZXIpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVf RkxPV19BQ1RJT05fVFlQRV9TRVRfSVBWNl9TUkM6DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9U WVBFX1NFVF9JUFY2X0RTVDoNCi0JCQlmbG93X3RjZl9wZWRpdF9rZXlfc2V0X2lwdjZfYWRkcigq YWN0aW9ucywgJnBfcGFyc2VyKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9O X1RZUEVfU0VUX1RQX1NSQzoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX1RQX0RT VDoNCi0JCQlmbG93X3RjZl9wZWRpdF9rZXlfc2V0X3RwX3BvcnQoKmFjdGlvbnMsDQotCQkJCQkJ CSZwX3BhcnNlciwgaXRlbV9mbGFncyk7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FD VElPTl9UWVBFX1NFVF9UVEw6DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX0RFQ19UVEw6 DQotCQkJZmxvd190Y2ZfcGVkaXRfa2V5X3NldF9kZWNfdHRsKCphY3Rpb25zLA0KLQkJCQkJCQkm cF9wYXJzZXIsIGl0ZW1fZmxhZ3MpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJ T05fVFlQRV9TRVRfTUFDX1NSQzoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX01B Q19EU1Q6DQotCQkJZmxvd190Y2ZfcGVkaXRfa2V5X3NldF9tYWMoKmFjdGlvbnMsICZwX3BhcnNl cik7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCWdvdG8gcGVkaXRfbW5sX21zZ19kb25l Ow0KLQkJfQ0KLQl9DQotcGVkaXRfbW5sX21zZ19kb25lOg0KLQlwX3BhcnNlci5zZWwuYWN0aW9u ID0gVENfQUNUX1BJUEU7DQotCW1ubF9hdHRyX3B1dChubCwgVENBX1BFRElUX1BBUk1TX0VYLA0K LQkJICAgICBzaXplb2YocF9wYXJzZXIuc2VsKSArDQotCQkgICAgIHBfcGFyc2VyLnNlbC5ua2V5 cyAqIHNpemVvZihzdHJ1Y3QgdGNfcGVkaXRfa2V5KSwNCi0JCSAgICAgJnBfcGFyc2VyKTsNCi0J bmFfcGVkaXRfa2V5cyA9DQotCQltbmxfYXR0cl9uZXN0X3N0YXJ0KG5sLCBUQ0FfUEVESVRfS0VZ U19FWCB8IE5MQV9GX05FU1RFRCk7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgcF9wYXJzZXIuc2Vs Lm5rZXlzOyBpKyspIHsNCi0JCXN0cnVjdCBubGF0dHIgKm5hX3BlZGl0X2tleSA9DQotCQkJbW5s X2F0dHJfbmVzdF9zdGFydChubCwNCi0JCQkJCSAgICBUQ0FfUEVESVRfS0VZX0VYIHwgTkxBX0Zf TkVTVEVEKTsNCi0JCW1ubF9hdHRyX3B1dF91MTYobmwsIFRDQV9QRURJVF9LRVlfRVhfSFRZUEUs DQotCQkJCSBwX3BhcnNlci5rZXlzX2V4W2ldLmh0eXBlKTsNCi0JCW1ubF9hdHRyX3B1dF91MTYo bmwsIFRDQV9QRURJVF9LRVlfRVhfQ01ELA0KLQkJCQkgcF9wYXJzZXIua2V5c19leFtpXS5jbWQp Ow0KLQkJbW5sX2F0dHJfbmVzdF9lbmQobmwsIG5hX3BlZGl0X2tleSk7DQotCX0NCi0JbW5sX2F0 dHJfbmVzdF9lbmQobmwsIG5hX3BlZGl0X2tleXMpOw0KLQltbmxfYXR0cl9uZXN0X2VuZChubCwg bmFfYWN0X29wdGlvbnMpOw0KLQkoKmFjdGlvbnMpLS07DQotfQ0KLQ0KLS8qKg0KLSAqIENhbGN1 bGF0ZSBtYXggbWVtb3J5IHNpemUgb2Ygb25lIFRDLXBlZGl0IGFjdGlvbnMuDQotICogT25lIFRD LXBlZGl0IGFjdGlvbiBjYW4gY29udGFpbiBzZXQgb2Yga2V5cyBlYWNoIGRlZmluaW5nDQotICog YSByZXdyaXRlIGVsZW1lbnQgKHJ0ZV9mbG93IGFjdGlvbikNCi0gKg0KLSAqIEBwYXJhbVtpbixv dXRdIGFjdGlvbnMNCi0gKiAgIGFjdGlvbnMgc3BlY2lmaWNhdGlvbi4NCi0gKiBAcGFyYW1baW4s b3V0XSBhY3Rpb25fZmxhZ3MNCi0gKiAgIGFjdGlvbnMgZmxhZ3MNCi0gKiBAcGFyYW1baW4sb3V0 XSBzaXplDQotICogICBhY2N1bXVsYXRlZCBzaXplDQotICogQHJldHVybg0KLSAqICAgTWF4IG1l bW9yeSBzaXplIG9mIG9uZSBUQy1wZWRpdCBhY3Rpb24NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxv d190Y2ZfZ2V0X3BlZGl0X2FjdGlvbnNfc2l6ZShjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9u ICoqYWN0aW9ucywNCi0JCQkJdWludDY0X3QgKmFjdGlvbl9mbGFncykNCi17DQotCWludCBwZWRp dF9zaXplID0gMDsNCi0JaW50IGtleXMgPSAwOw0KLQl1aW50NjRfdCBmbGFncyA9IDA7DQotDQot CXBlZGl0X3NpemUgKz0gU1pfTkxBVFRSX05FU1QgKyAvKiBuYV9hY3RfaW5kZXguICovDQotCQkg ICAgICBTWl9OTEFUVFJfU1RSWl9PRigicGVkaXQiKSArDQotCQkgICAgICBTWl9OTEFUVFJfTkVT VDsgLyogVENBX0FDVF9PUFRJT05TLiAqLw0KLQlmb3IgKDsgKCphY3Rpb25zKS0+dHlwZSAhPSBS VEVfRkxPV19BQ1RJT05fVFlQRV9FTkQ7ICgqYWN0aW9ucykrKykgew0KLQkJc3dpdGNoICgoKmFj dGlvbnMpLT50eXBlKSB7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9JUFY0X1NS QzoNCi0JCQlrZXlzICs9IE5VTV9PRl9QRURJVF9LRVlTKElQVjRfQUREUl9MRU4pOw0KLQkJCWZs YWdzIHw9IE1MWDVfRkxPV19BQ1RJT05fU0VUX0lQVjRfU1JDOw0KLQkJCWJyZWFrOw0KLQkJY2Fz ZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRfSVBWNF9EU1Q6DQotCQkJa2V5cyArPSBOVU1fT0Zf UEVESVRfS0VZUyhJUFY0X0FERFJfTEVOKTsNCi0JCQlmbGFncyB8PSBNTFg1X0ZMT1dfQUNUSU9O X1NFVF9JUFY0X0RTVDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVf U0VUX0lQVjZfU1JDOg0KLQkJCWtleXMgKz0gTlVNX09GX1BFRElUX0tFWVMoSVBWNl9BRERSX0xF Tik7DQotCQkJZmxhZ3MgfD0gTUxYNV9GTE9XX0FDVElPTl9TRVRfSVBWNl9TUkM7DQotCQkJYnJl YWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9JUFY2X0RTVDoNCi0JCQlrZXlz ICs9IE5VTV9PRl9QRURJVF9LRVlTKElQVjZfQUREUl9MRU4pOw0KLQkJCWZsYWdzIHw9IE1MWDVf RkxPV19BQ1RJT05fU0VUX0lQVjZfRFNUOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19B Q1RJT05fVFlQRV9TRVRfVFBfU1JDOg0KLQkJCS8qIFRDUCBpcyBhcyBzYW1lIGFzIFVEUCAqLw0K LQkJCWtleXMgKz0gTlVNX09GX1BFRElUX0tFWVMoVFBfUE9SVF9MRU4pOw0KLQkJCWZsYWdzIHw9 IE1MWDVfRkxPV19BQ1RJT05fU0VUX1RQX1NSQzsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX1RQX0RTVDoNCi0JCQkvKiBUQ1AgaXMgYXMgc2FtZSBhcyBVRFAg Ki8NCi0JCQlrZXlzICs9IE5VTV9PRl9QRURJVF9LRVlTKFRQX1BPUlRfTEVOKTsNCi0JCQlmbGFn cyB8PSBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9UUF9EU1Q7DQotCQkJYnJlYWs7DQotCQljYXNlIFJU RV9GTE9XX0FDVElPTl9UWVBFX1NFVF9UVEw6DQotCQkJa2V5cyArPSBOVU1fT0ZfUEVESVRfS0VZ UyhUVExfTEVOKTsNCi0JCQlmbGFncyB8PSBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9UVEw7DQotCQkJ YnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX0RFQ19UVEw6DQotCQkJa2V5cyAr PSBOVU1fT0ZfUEVESVRfS0VZUyhUVExfTEVOKTsNCi0JCQlmbGFncyB8PSBNTFg1X0ZMT1dfQUNU SU9OX0RFQ19UVEw7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NF VF9NQUNfU1JDOg0KLQkJCWtleXMgKz0gTlVNX09GX1BFRElUX0tFWVMoRVRIRVJfQUREUl9MRU4p Ow0KLQkJCWZsYWdzIHw9IE1MWDVfRkxPV19BQ1RJT05fU0VUX01BQ19TUkM7DQotCQkJYnJlYWs7 DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9NQUNfRFNUOg0KLQkJCWtleXMgKz0g TlVNX09GX1BFRElUX0tFWVMoRVRIRVJfQUREUl9MRU4pOw0KLQkJCWZsYWdzIHw9IE1MWDVfRkxP V19BQ1RJT05fU0VUX01BQ19EU1Q7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCWdvdG8g Z2V0X3BlZGl0X2FjdGlvbl9zaXplX2RvbmU7DQotCQl9DQotCX0NCi1nZXRfcGVkaXRfYWN0aW9u X3NpemVfZG9uZToNCi0JLyogVENBX1BFRElUX1BBUkFNU19FWCAqLw0KLQlwZWRpdF9zaXplICs9 DQotCQlTWl9OTEFUVFJfREFUQV9PRihzaXplb2Yoc3RydWN0IHRjX3BlZGl0X3NlbCkgKw0KLQkJ CQkgIGtleXMgKiBzaXplb2Yoc3RydWN0IHRjX3BlZGl0X2tleSkpOw0KLQlwZWRpdF9zaXplICs9 IFNaX05MQVRUUl9ORVNUOyAvKiBUQ0FfUEVESVRfS0VZUyAqLw0KLQlwZWRpdF9zaXplICs9IGtl eXMgKg0KLQkJICAgICAgLyogVENBX1BFRElUX0tFWV9FWCArIEhUWVBFICsgQ01EICovDQotCQkg ICAgICAoU1pfTkxBVFRSX05FU1QgKyBTWl9OTEFUVFJfREFUQV9PRigyKSArDQotCQkgICAgICAg U1pfTkxBVFRSX0RBVEFfT0YoMikpOw0KLQkoKmFjdGlvbl9mbGFncykgfD0gZmxhZ3M7DQotCSgq YWN0aW9ucyktLTsNCi0JcmV0dXJuIHBlZGl0X3NpemU7DQotfQ0KLQ0KLS8qKg0KLSAqIFJldHJp ZXZlIG1hc2sgZm9yIHBhdHRlcm4gaXRlbS4NCi0gKg0KLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBi YXNpYyBzYW5pdHkgY2hlY2tzIG9uIGEgcGF0dGVybiBpdGVtIGluIG9yZGVyIHRvDQotICogcmV0 dXJuIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1hc2sgZm9yIGl0Lg0KLSAqDQotICogQHBhcmFtW2lu XSBpdGVtDQotICogICBJdGVtIHNwZWNpZmljYXRpb24uDQotICogQHBhcmFtW2luXSBtYXNrX2Rl ZmF1bHQNCi0gKiAgIERlZmF1bHQgbWFzayBmb3IgcGF0dGVybiBpdGVtIGFzIHNwZWNpZmllZCBi eSB0aGUgZmxvdyBBUEkuDQotICogQHBhcmFtW2luXSBtYXNrX3N1cHBvcnRlZA0KLSAqICAgTWFz ayBmaWVsZHMgc3VwcG9ydGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4NCi0gKiBAcGFyYW1baW5d IG1hc2tfZW1wdHkNCi0gKiAgIEVtcHR5IG1hc2sgdG8gcmV0dXJuIHdoZW4gdGhlcmUgaXMgbm8g c3BlY2lmaWNhdGlvbi4NCi0gKiBAcGFyYW1bb3V0XSBlcnJvcg0KLSAqICAgUGVyZm9ybSB2ZXJi b3NlIGVycm9yIHJlcG9ydGluZyBpZiBub3QgTlVMTC4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAg IEVpdGhlciBAcCBpdGVtLT5tYXNrIG9yIG9uZSBvZiB0aGUgbWFzayBwYXJhbWV0ZXJzIG9uIHN1 Y2Nlc3MsIE5VTEwNCi0gKiAgIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4NCi0gKi8N Ci1zdGF0aWMgY29uc3Qgdm9pZCAqDQotZmxvd190Y2ZfaXRlbV9tYXNrKGNvbnN0IHN0cnVjdCBy dGVfZmxvd19pdGVtICppdGVtLCBjb25zdCB2b2lkICptYXNrX2RlZmF1bHQsDQotCQkgICBjb25z dCB2b2lkICptYXNrX3N1cHBvcnRlZCwgY29uc3Qgdm9pZCAqbWFza19lbXB0eSwNCi0JCSAgIHNp emVfdCBtYXNrX3NpemUsIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQotew0KLQljb25z dCB1aW50OF90ICptYXNrOw0KLQlzaXplX3QgaTsNCi0NCi0JLyogaXRlbS0+bGFzdCBhbmQgaXRl bS0+bWFzayBjYW5ub3QgZXhpc3Qgd2l0aG91dCBpdGVtLT5zcGVjLiAqLw0KLQlpZiAoIWl0ZW0t PnNwZWMgJiYgKGl0ZW0tPm1hc2sgfHwgaXRlbS0+bGFzdCkpIHsNCi0JCXJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgRUlOVkFMLA0KLQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sIGl0 ZW0sDQotCQkJCSAgICJcIm1hc2tcIiBvciBcImxhc3RcIiBmaWVsZCBwcm92aWRlZCB3aXRob3V0 Ig0KLQkJCQkgICAiIGEgY29ycmVzcG9uZGluZyBcInNwZWNcIiIpOw0KLQkJcmV0dXJuIE5VTEw7 DQotCX0NCi0JLyogTm8gc3BlYywgbm8gbWFzaywgbm8gcHJvYmxlbS4gKi8NCi0JaWYgKCFpdGVt LT5zcGVjKQ0KLQkJcmV0dXJuIG1hc2tfZW1wdHk7DQotCW1hc2sgPSBpdGVtLT5tYXNrID8gaXRl bS0+bWFzayA6IG1hc2tfZGVmYXVsdDsNCi0JYXNzZXJ0KG1hc2spOw0KLQkvKg0KLQkgKiBTaW5n bGUtcGFzcyBjaGVjayB0byBtYWtlIHN1cmUgdGhhdDoNCi0JICogLSBNYXNrIGlzIHN1cHBvcnRl ZCwgbm8gYml0cyBhcmUgc2V0IG91dHNpZGUgbWFza19zdXBwb3J0ZWQuDQotCSAqIC0gQm90aCBp dGVtLT5zcGVjIGFuZCBpdGVtLT5sYXN0IGFyZSBpbmNsdWRlZCBpbiBtYXNrLg0KLQkgKi8NCi0J Zm9yIChpID0gMDsgaSAhPSBtYXNrX3NpemU7ICsraSkgew0KLQkJaWYgKCFtYXNrW2ldKQ0KLQkJ CWNvbnRpbnVlOw0KLQkJaWYgKChtYXNrW2ldIHwgKChjb25zdCB1aW50OF90ICopbWFza19zdXBw b3J0ZWQpW2ldKSAhPQ0KLQkJICAgICgoY29uc3QgdWludDhfdCAqKW1hc2tfc3VwcG9ydGVkKVtp XSkgew0KLQkJCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSAgIFJU RV9GTE9XX0VSUk9SX1RZUEVfSVRFTV9NQVNLLCBtYXNrLA0KLQkJCQkJICAgInVuc3VwcG9ydGVk IGZpZWxkIGZvdW5kIg0KLQkJCQkJICAgIiBpbiBcIm1hc2tcIiIpOw0KLQkJCXJldHVybiBOVUxM Ow0KLQkJfQ0KLQkJaWYgKGl0ZW0tPmxhc3QgJiYNCi0JCSAgICAoKChjb25zdCB1aW50OF90ICop aXRlbS0+c3BlYylbaV0gJiBtYXNrW2ldKSAhPQ0KLQkJICAgICgoKGNvbnN0IHVpbnQ4X3QgKilp dGVtLT5sYXN0KVtpXSAmIG1hc2tbaV0pKSB7DQotCQkJcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9y LCBFSU5WQUwsDQotCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fTEFTVCwNCi0JCQkJ CSAgIGl0ZW0tPmxhc3QsDQotCQkJCQkgICAicmFuZ2UgYmV0d2VlbiBcInNwZWNcIiBhbmQgXCJs YXN0XCIiDQotCQkJCQkgICAiIG5vdCBjb21wcmlzZWQgaW4gXCJtYXNrXCIiKTsNCi0JCQlyZXR1 cm4gTlVMTDsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gbWFzazsNCi19DQotDQotLyoqDQotICogQnVp bGQgYSBjb252ZXJzaW9uIHRhYmxlIGJldHdlZW4gcG9ydCBJRCBhbmQgaWZpbmRleC4NCi0gKg0K LSAqIEBwYXJhbVtpbl0gZGV2DQotICogICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmljZS4NCi0g KiBAcGFyYW1bb3V0XSBwdG9pDQotICogICBQb2ludGVyIHRvIHB0b2kgdGFibGUuDQotICogQHBh cmFtW2luXSBsZW4NCi0gKiAgIFNpemUgb2YgcHRvaSB0YWJsZSBwcm92aWRlZC4NCi0gKg0KLSAq IEByZXR1cm4NCi0gKiAgIFNpemUgb2YgcHRvaSB0YWJsZSBmaWxsZWQuDQotICovDQotc3RhdGlj IHVuc2lnbmVkIGludA0KLWZsb3dfdGNmX2J1aWxkX3B0b2lfdGFibGUoc3RydWN0IHJ0ZV9ldGhf ZGV2ICpkZXYsIHN0cnVjdCBmbG93X3RjZl9wdG9pICpwdG9pLA0KLQkJCSAgdW5zaWduZWQgaW50 IGxlbikNCi17DQotCXVuc2lnbmVkIGludCBuID0gbWx4NV9kZXZfdG9fcG9ydF9pZChkZXYtPmRl dmljZSwgTlVMTCwgMCk7DQotCXVpbnQxNl90IHBvcnRfaWRbbiArIDFdOw0KLQl1bnNpZ25lZCBp bnQgaTsNCi0JdW5zaWduZWQgaW50IG93biA9IDA7DQotDQotCS8qIEF0IGxlYXN0IG9uZSBwb3J0 IGlzIG5lZWRlZCB3aGVuIG5vIHN3aXRjaCBkb21haW4gaXMgcHJlc2VudC4gKi8NCi0JaWYgKCFu KSB7DQotCQluID0gMTsNCi0JCXBvcnRfaWRbMF0gPSBkZXYtPmRhdGEtPnBvcnRfaWQ7DQotCX0g ZWxzZSB7DQotCQluID0gUlRFX01JTihtbHg1X2Rldl90b19wb3J0X2lkKGRldi0+ZGV2aWNlLCBw b3J0X2lkLCBuKSwgbik7DQotCX0NCi0JaWYgKG4gPiBsZW4pDQotCQlyZXR1cm4gMDsNCi0JZm9y IChpID0gMDsgaSAhPSBuOyArK2kpIHsNCi0JCXN0cnVjdCBydGVfZXRoX2Rldl9pbmZvIGRldl9p bmZvOw0KLQ0KLQkJcnRlX2V0aF9kZXZfaW5mb19nZXQocG9ydF9pZFtpXSwgJmRldl9pbmZvKTsN Ci0JCWlmIChwb3J0X2lkW2ldID09IGRldi0+ZGF0YS0+cG9ydF9pZCkNCi0JCQlvd24gPSBpOw0K LQkJcHRvaVtpXS5wb3J0X2lkID0gcG9ydF9pZFtpXTsNCi0JCXB0b2lbaV0uaWZpbmRleCA9IGRl dl9pbmZvLmlmX2luZGV4Ow0KLQl9DQotCS8qIEVuc3VyZSBmaXJzdCBlbnRyeSBvZiBwdG9pW10g aXMgdGhlIGN1cnJlbnQgZGV2aWNlLiAqLw0KLQlpZiAob3duKSB7DQotCQlwdG9pW25dID0gcHRv aVswXTsNCi0JCXB0b2lbMF0gPSBwdG9pW293bl07DQotCQlwdG9pW293bl0gPSBwdG9pW25dOw0K LQl9DQotCS8qIEFuIGVudHJ5IHdpdGggemVybyBpZmluZGV4IHRlcm1pbmF0ZXMgcHRvaVtdLiAq Lw0KLQlwdG9pW25dLnBvcnRfaWQgPSAwOw0KLQlwdG9pW25dLmlmaW5kZXggPSAwOw0KLQlyZXR1 cm4gbjsNCi19DQotDQotLyoqDQotICogVmVyaWZ5IHRoZSBAcCBhdHRyIHdpbGwgYmUgY29ycmVj dGx5IHVuZGVyc3Rvb2QgYnkgdGhlIEUtc3dpdGNoLg0KLSAqDQotICogQHBhcmFtW2luXSBhdHRy DQotICogICBQb2ludGVyIHRvIGZsb3cgYXR0cmlidXRlcw0KLSAqIEBwYXJhbVtvdXRdIGVycm9y DQotICogICBQb2ludGVyIHRvIGVycm9yIHN0cnVjdHVyZS4NCi0gKg0KLSAqIEByZXR1cm4NCi0g KiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0 ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIGludA0KLWZsb3dfdGNmX3ZhbGlkYXRlX2F0 dHJpYnV0ZXMoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2F0dHIgKmF0dHIsDQotCQkJICAgICBzdHJ1 Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0JLyoNCi0JICogU3VwcG9ydGVkIGF0dHJp YnV0ZXM6IGdyb3Vwcywgc29tZSBwcmlvcml0aWVzIGFuZCBpbmdyZXNzIG9ubHkuDQotCSAqIGdy b3VwIGlzIHN1cHBvcnRlZCBvbmx5IGlmIGtlcm5lbCBzdXBwb3J0cyBjaGFpbi4gRG9uJ3QgY2Fy ZSBhYm91dA0KLQkgKiB0cmFuc2ZlciBhcyBpdCBpcyB0aGUgY2FsbGVyJ3MgcHJvYmxlbS4NCi0J ICovDQotCWlmIChhdHRyLT5ncm91cCA+IE1MWDVfVENGX0dST1VQX0lEX01BWCkNCi0JCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkgIFJURV9GTE9XX0VS Uk9SX1RZUEVfQVRUUl9HUk9VUCwgYXR0ciwNCi0JCQkJCSAgImdyb3VwIElEIGxhcmdlciB0aGFu ICINCi0JCQkJCSAgUlRFX1NUUihNTFg1X1RDRl9HUk9VUF9JRF9NQVgpDQotCQkJCQkgICIgaXNu J3Qgc3VwcG9ydGVkIik7DQotCWVsc2UgaWYgKGF0dHItPnByaW9yaXR5ID4gTUxYNV9UQ0ZfR1JP VVBfUFJJT1JJVFlfTUFYKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5P VFNVUCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX1BSSU9SSVRZLA0KLQkJCQkJ ICBhdHRyLA0KLQkJCQkJICAicHJpb3JpdHkgbW9yZSB0aGFuICINCi0JCQkJCSAgUlRFX1NUUihN TFg1X1RDRl9HUk9VUF9QUklPUklUWV9NQVgpDQotCQkJCQkgICIgaXMgbm90IHN1cHBvcnRlZCIp Ow0KLQlpZiAoIWF0dHItPmluZ3Jlc3MpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFSU5WQUwsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQVRUUl9JTkdSRVNTLA0K LQkJCQkJICBhdHRyLCAib25seSBpbmdyZXNzIGlzIHN1cHBvcnRlZCIpOw0KLQlpZiAoYXR0ci0+ ZWdyZXNzKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0J CQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BVFRSX0lOR1JFU1MsDQotCQkJCQkgIGF0dHIsICJl Z3Jlc3MgaXMgbm90IHN1cHBvcnRlZCIpOw0KLQlyZXR1cm4gMDsNCi19DQotDQotLyoqDQotICog VmFsaWRhdGUgVlhMQU5fRU5DQVAgYWN0aW9uIFJURV9GTE9XX0lURU1fVFlQRV9FVEggaXRlbSBm b3IgRS1Td2l0Y2guDQotICogVGhlIHJvdXRpbmUgY2hlY2tzIHRoZSBMMiBmaWVsZHMgdG8gYmUg dXNlZCBpbiBlbmNhcHN1bGF0aW9uIGhlYWRlci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gaXRlbQ0K LSAqICAgUG9pbnRlciB0byB0aGUgaXRlbSBzdHJ1Y3R1cmUuDQotICogQHBhcmFtW291dF0gZXJy b3INCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGVycm9yIHN0cnVjdHVyZS4NCi0gKg0KLSAqIEByZXR1 cm4NCi0gKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2Ug YW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICoqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl92YWxp ZGF0ZV92eGxhbl9lbmNhcF9ldGgoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gKml0ZW0sDQot CQkJCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikNCi17DQotCWNvbnN0IHN0cnVjdCBy dGVfZmxvd19pdGVtX2V0aCAqc3BlYyA9IGl0ZW0tPnNwZWM7DQotCWNvbnN0IHN0cnVjdCBydGVf Zmxvd19pdGVtX2V0aCAqbWFzayA9IGl0ZW0tPm1hc2s7DQotDQotCWlmICghc3BlYykgew0KLQkJ LyoNCi0JCSAqIFNwZWNpZmljYXRpb24gZm9yIEwyIGFkZHJlc3NlcyBjYW4gYmUgZW1wdHkNCi0J CSAqIGJlY2F1c2UgdGhlc2Ugb25lcyBhcmUgb3B0aW9uYWwgYW5kIG5vdA0KLQkJICogcmVxdWly ZWQgZGlyZWN0bHkgYnkgdGMgcnVsZS4gS2VybmVsIHRyaWVzDQotCQkgKiB0byByZXNvbHZlIHRo ZXNlIG9uZXMgb24gaXRzIG93bg0KLQkJICovDQotCQlyZXR1cm4gMDsNCi0JfQ0KLQlpZiAoIW1h c2spIHsNCi0JCS8qIElmIG1hc2sgaXMgbm90IHNwZWNpZmllZCB1c2UgdGhlIGRlZmF1bHQgb25l LiAqLw0KLQkJbWFzayA9ICZydGVfZmxvd19pdGVtX2V0aF9tYXNrOw0KLQl9DQotCWlmIChtZW1j bXAoJm1hc2stPmRzdCwNCi0JCSAgICZmbG93X3RjZl9tYXNrX2VtcHR5LmV0aC5kc3QsDQotCQkg ICBzaXplb2YoZmxvd190Y2ZfbWFza19lbXB0eS5ldGguZHN0KSkpIHsNCi0JCWlmIChtZW1jbXAo Jm1hc2stPmRzdCwNCi0JCQkgICAmcnRlX2Zsb3dfaXRlbV9ldGhfbWFzay5kc3QsDQotCQkJICAg c2l6ZW9mKHJ0ZV9mbG93X2l0ZW1fZXRoX21hc2suZHN0KSkpDQotCQkJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldA0KLQkJCQkoZXJyb3IsIEVOT1RTVVAsDQotCQkJCSBSVEVfRkxPV19FUlJPUl9U WVBFX0lURU1fTUFTSywgbWFzaywNCi0JCQkJICJubyBzdXBwb3J0IGZvciBwYXJ0aWFsIG1hc2sg b24iDQotCQkJCSAiIFwiZXRoLmRzdFwiIGZpZWxkIik7DQotCX0NCi0JaWYgKG1lbWNtcCgmbWFz ay0+c3JjLA0KLQkJICAgJmZsb3dfdGNmX21hc2tfZW1wdHkuZXRoLnNyYywNCi0JCSAgIHNpemVv ZihmbG93X3RjZl9tYXNrX2VtcHR5LmV0aC5zcmMpKSkgew0KLQkJaWYgKG1lbWNtcCgmbWFzay0+ c3JjLA0KLQkJCSAgICZydGVfZmxvd19pdGVtX2V0aF9tYXNrLnNyYywNCi0JCQkgICBzaXplb2Yo cnRlX2Zsb3dfaXRlbV9ldGhfbWFzay5zcmMpKSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jf c2V0DQotCQkJCShlcnJvciwgRU5PVFNVUCwNCi0JCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRF TV9NQVNLLCBtYXNrLA0KLQkJCQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0J CQkJICIgXCJldGguc3JjXCIgZmllbGQiKTsNCi0JfQ0KLQlpZiAobWFzay0+dHlwZSAhPSBSVEVf QkUxNigweDAwMDApKSB7DQotCQlpZiAobWFzay0+dHlwZSAhPSBSVEVfQkUxNigweGZmZmYpKQ0K LQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJ CQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQotCQkJCSAibm8gc3VwcG9y dCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkgIiBcImV0aC50eXBlXCIgZmllbGQiKTsNCi0J CURSVl9MT0coV0FSTklORywNCi0JCQkib3V0ZXIgZXRoZXJuZXQgdHlwZSBmaWVsZCINCi0JCQki IGNhbm5vdCBiZSBmb3JjZWQgZm9yIHZ4bGFuIg0KLQkJCSIgZW5jYXBzdWxhdGlvbiwgcGFyYW1l dGVyIGlnbm9yZWQiKTsNCi0JfQ0KLQlyZXR1cm4gMDsNCi19DQotDQotLyoqDQotICogVmFsaWRh dGUgVlhMQU5fRU5DQVAgYWN0aW9uIFJURV9GTE9XX0lURU1fVFlQRV9JUFY0IGl0ZW0gZm9yIEUt U3dpdGNoLg0KLSAqIFRoZSByb3V0aW5lIGNoZWNrcyB0aGUgSVB2NCBmaWVsZHMgdG8gYmUgdXNl ZCBpbiBlbmNhcHN1bGF0aW9uIGhlYWRlci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gaXRlbQ0KLSAq ICAgUG9pbnRlciB0byB0aGUgaXRlbSBzdHJ1Y3R1cmUuDQotICogQHBhcmFtW291dF0gZXJyb3IN Ci0gKiAgIFBvaW50ZXIgdG8gdGhlIGVycm9yIHN0cnVjdHVyZS4NCi0gKg0KLSAqIEByZXR1cm4N Ci0gKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UgYW5k IHJ0ZV9lcnJubyBpcyBzZXQuDQotICoqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl92YWxpZGF0 ZV92eGxhbl9lbmNhcF9pcHY0KGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtICppdGVtLA0KLQkJ CQkgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0JY29uc3Qgc3RydWN0IHJ0 ZV9mbG93X2l0ZW1faXB2NCAqc3BlYyA9IGl0ZW0tPnNwZWM7DQotCWNvbnN0IHN0cnVjdCBydGVf Zmxvd19pdGVtX2lwdjQgKm1hc2sgPSBpdGVtLT5tYXNrOw0KLQ0KLQlpZiAoIXNwZWMpIHsNCi0J CS8qDQotCQkgKiBTcGVjaWZpY2F0aW9uIGZvciBJUCBhZGRyZXNzZXMgY2Fubm90IGJlIGVtcHR5 DQotCQkgKiBiZWNhdXNlIGl0IGlzIHJlcXVpcmVkIGJ5IHR1bm5lbF9rZXkgcGFyYW1ldGVyLg0K LQkJICovDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJ CQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwgaXRlbSwNCi0JCQkJCSAgIk5VTEwgb3V0ZXIg aXB2NCBhZGRyZXNzIg0KLQkJCQkJICAiIHNwZWNpZmljYXRpb24gZm9yIHZ4bGFuIg0KLQkJCQkJ ICAiIGVuY2Fwc3VsYXRpb24iKTsNCi0JfQ0KLQlpZiAoIW1hc2spDQotCQltYXNrID0gJnJ0ZV9m bG93X2l0ZW1faXB2NF9tYXNrOw0KLQlpZiAobWFzay0+aGRyLmRzdF9hZGRyICE9IFJURV9CRTMy KDB4MDAwMDAwMDApKSB7DQotCQlpZiAobWFzay0+aGRyLmRzdF9hZGRyICE9IFJURV9CRTMyKDB4 ZmZmZmZmZmYpKQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJKGVycm9yLCBF Tk9UU1VQLA0KLQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQotCQkJ CSAibm8gc3VwcG9ydCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkgIiBcImlwdjQuaGRyLmRz dF9hZGRyXCIgZmllbGQiDQotCQkJCSAiIGZvciB2eGxhbiBlbmNhcHN1bGF0aW9uIik7DQotCQkv KiBNb3JlIElQdjQgYWRkcmVzcyB2YWxpZGF0aW9ucyBjYW4gYmUgcHV0IGhlcmUuICovDQotCX0g ZWxzZSB7DQotCQkvKg0KLQkJICogS2VybmVsIHVzZXMgdGhlIGRlc3RpbmF0aW9uIElQIGFkZHJl c3MgdG8gZGV0ZXJtaW5lDQotCQkgKiB0aGUgcm91dGluZyBwYXRoIGFuZCBvYnRhaW4gdGhlIE1B QyBkZXN0aW5hdGlvbg0KLQkJICogYWRkcmVzcywgc28gSVAgZGVzdGluYXRpb24gYWRkcmVzcyBt dXN0IGJlDQotCQkgKiBzcGVjaWZpZWQgaW4gdGhlIHRjIHJ1bGUuDQotCQkgKi8NCi0JCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJS T1JfVFlQRV9JVEVNLCBpdGVtLA0KLQkJCQkJICAib3V0ZXIgaXB2NCBkZXN0aW5hdGlvbiBhZGRy ZXNzIg0KLQkJCQkJICAiIG11c3QgYmUgc3BlY2lmaWVkIGZvciINCi0JCQkJCSAgIiB2eGxhbiBl bmNhcHN1bGF0aW9uIik7DQotCX0NCi0JaWYgKG1hc2stPmhkci5zcmNfYWRkciAhPSBSVEVfQkUz MigweDAwMDAwMDAwKSkgew0KLQkJaWYgKG1hc2stPmhkci5zcmNfYWRkciAhPSBSVEVfQkUzMigw eGZmZmZmZmZmKSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCShlcnJvciwg RU5PVFNVUCwNCi0JCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTV9NQVNLLCBtYXNrLA0KLQkJ CQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0JCQkJICIgXCJpcHY0Lmhkci5z cmNfYWRkclwiIGZpZWxkIg0KLQkJCQkgIiBmb3IgdnhsYW4gZW5jYXBzdWxhdGlvbiIpOw0KLQkJ LyogTW9yZSBJUHY0IGFkZHJlc3MgdmFsaWRhdGlvbnMgY2FuIGJlIHB1dCBoZXJlLiAqLw0KLQl9 IGVsc2Ugew0KLQkJLyoNCi0JCSAqIEtlcm5lbCB1c2VzIHRoZSBzb3VyY2UgSVAgYWRkcmVzcyB0 byBzZWxlY3QgdGhlDQotCQkgKiBpbnRlcmZhY2UgZm9yIGVncmVzcyBlbmNhcHN1bGF0ZWQgdHJh ZmZpYywgc28NCi0JCSAqIGl0IG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSB0YyBydWxlLg0KLQkJ ICovDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkg IFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwgaXRlbSwNCi0JCQkJCSAgIm91dGVyIGlwdjQgc291 cmNlIGFkZHJlc3MiDQotCQkJCQkgICIgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIg0KLQkJCQkJICAi IHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsNCi0JfQ0KLQlpZiAobWFzay0+aGRyLnR5cGVfb2Zfc2Vy dmljZSAmJg0KLQkgICAgbWFzay0+aGRyLnR5cGVfb2Zfc2VydmljZSAhPSAweGZmKQ0KLQkJcmV0 dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSAgUlRFX0ZMT1df RVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQotCQkJCQkgICJubyBzdXBwb3J0IGZvciBwYXJ0 aWFsIG1hc2sgb24iDQotCQkJCQkgICIgXCJpcHY0Lmhkci50eXBlX29mX3NlcnZpY2VcIiBmaWVs ZCINCi0JCQkJCSAgIiBmb3IgdnhsYW4gZW5jYXBzdWxhdGlvbiIpOw0KLQlpZiAobWFzay0+aGRy LnRpbWVfdG9fbGl2ZSAmJg0KLQkgICAgbWFzay0+aGRyLnRpbWVfdG9fbGl2ZSAhPSAweGZmKQ0K LQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSAgUlRF X0ZMT1dfRVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQotCQkJCQkgICJubyBzdXBwb3J0IGZv ciBwYXJ0aWFsIG1hc2sgb24iDQotCQkJCQkgICIgXCJpcHY0Lmhkci50aW1lX3RvX2xpdmVcIiBm aWVsZCINCi0JCQkJCSAgIiBmb3IgdnhsYW4gZW5jYXBzdWxhdGlvbiIpOw0KLQlyZXR1cm4gMDsN Ci19DQotDQotLyoqDQotICogVmFsaWRhdGUgVlhMQU5fRU5DQVAgYWN0aW9uIFJURV9GTE9XX0lU RU1fVFlQRV9JUFY2IGl0ZW0gZm9yIEUtU3dpdGNoLg0KLSAqIFRoZSByb3V0aW5lIGNoZWNrcyB0 aGUgSVB2NiBmaWVsZHMgdG8gYmUgdXNlZCBpbiBlbmNhcHN1bGF0aW9uIGhlYWRlci4NCi0gKg0K LSAqIEBwYXJhbVtpbl0gaXRlbQ0KLSAqICAgUG9pbnRlciB0byB0aGUgaXRlbSBzdHJ1Y3R1cmUu DQotICogQHBhcmFtW291dF0gZXJyb3INCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGVycm9yIHN0cnVj dHVyZS4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBl cnJubyB2YWx1ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICoqLw0KLXN0YXRp YyBpbnQNCi1mbG93X3RjZl92YWxpZGF0ZV92eGxhbl9lbmNhcF9pcHY2KGNvbnN0IHN0cnVjdCBy dGVfZmxvd19pdGVtICppdGVtLA0KLQkJCQkgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9y KQ0KLXsNCi0JY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2NiAqc3BlYyA9IGl0ZW0tPnNw ZWM7DQotCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjYgKm1hc2sgPSBpdGVtLT5tYXNr Ow0KLQl1aW50OF90IG1zazY7DQotDQotCWlmICghc3BlYykgew0KLQkJLyoNCi0JCSAqIFNwZWNp ZmljYXRpb24gZm9yIElQIGFkZHJlc3NlcyBjYW5ub3QgYmUgZW1wdHkNCi0JCSAqIGJlY2F1c2Ug aXQgaXMgcmVxdWlyZWQgYnkgdHVubmVsX2tleSBwYXJhbWV0ZXIuDQotCQkgKi8NCi0JCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJS T1JfVFlQRV9JVEVNLCBpdGVtLA0KLQkJCQkJICAiTlVMTCBvdXRlciBpcHY2IGFkZHJlc3MiDQot CQkJCQkgICIgc3BlY2lmaWNhdGlvbiBmb3IiDQotCQkJCQkgICIgdnhsYW4gZW5jYXBzdWxhdGlv biIpOw0KLQl9DQotCWlmICghbWFzaykNCi0JCW1hc2sgPSAmcnRlX2Zsb3dfaXRlbV9pcHY2X21h c2s7DQotCWlmIChtZW1jbXAoJm1hc2stPmhkci5kc3RfYWRkciwNCi0JCSAgICZmbG93X3RjZl9t YXNrX2VtcHR5LmlwdjYuaGRyLmRzdF9hZGRyLA0KLQkJICAgSVBWNl9BRERSX0xFTikpIHsNCi0J CWlmIChtZW1jbXAoJm1hc2stPmhkci5kc3RfYWRkciwNCi0JCQkgICAmcnRlX2Zsb3dfaXRlbV9p cHY2X21hc2suaGRyLmRzdF9hZGRyLA0KLQkJCSAgIElQVjZfQUREUl9MRU4pKQ0KLQkJCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCShlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSBSVEVf RkxPV19FUlJPUl9UWVBFX0lURU1fTUFTSywgbWFzaywNCi0JCQkJCSAibm8gc3VwcG9ydCBmb3Ig cGFydGlhbCBtYXNrIG9uIg0KLQkJCQkJICIgXCJpcHY2Lmhkci5kc3RfYWRkclwiIGZpZWxkIg0K LQkJCQkJICIgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsNCi0JCS8qIE1vcmUgSVB2NiBhZGRy ZXNzIHZhbGlkYXRpb25zIGNhbiBiZSBwdXQgaGVyZS4gKi8NCi0JfSBlbHNlIHsNCi0JCS8qDQot CQkgKiBLZXJuZWwgdXNlcyB0aGUgZGVzdGluYXRpb24gSVAgYWRkcmVzcyB0byBkZXRlcm1pbmUN Ci0JCSAqIHRoZSByb3V0aW5nIHBhdGggYW5kIG9idGFpbiB0aGUgTUFDIGRlc3RpbmF0aW9uDQot CQkgKiBhZGRyZXNzIChoZWlnaCBvciBnYXRlKSwgc28gSVAgZGVzdGluYXRpb24gYWRkcmVzcw0K LQkJICogbXVzdCBiZSBzcGVjaWZpZWQgd2l0aGluIHRoZSB0YyBydWxlLg0KLQkJICovDQotCQly ZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkgIFJURV9GTE9X X0VSUk9SX1RZUEVfSVRFTSwgaXRlbSwNCi0JCQkJCSAgIm91dGVyIGlwdjYgZGVzdGluYXRpb24g YWRkcmVzcyINCi0JCQkJCSAgIiBtdXN0IGJlIHNwZWNpZmllZCBmb3IiDQotCQkJCQkgICIgdnhs YW4gZW5jYXBzdWxhdGlvbiIpOw0KLQl9DQotCWlmIChtZW1jbXAoJm1hc2stPmhkci5zcmNfYWRk ciwNCi0JCSAgICZmbG93X3RjZl9tYXNrX2VtcHR5LmlwdjYuaGRyLnNyY19hZGRyLA0KLQkJICAg SVBWNl9BRERSX0xFTikpIHsNCi0JCWlmIChtZW1jbXAoJm1hc2stPmhkci5zcmNfYWRkciwNCi0J CQkgICAmcnRlX2Zsb3dfaXRlbV9pcHY2X21hc2suaGRyLnNyY19hZGRyLA0KLQkJCSAgIElQVjZf QUREUl9MRU4pKQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCShlcnJvciwg RU5PVFNVUCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fTUFTSywgbWFzaywNCi0J CQkJCSAibm8gc3VwcG9ydCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkJICIgXCJpcHY2Lmhk ci5zcmNfYWRkclwiIGZpZWxkIg0KLQkJCQkJICIgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsN Ci0JCS8qIE1vcmUgTDMgYWRkcmVzcyB2YWxpZGF0aW9uIGNhbiBiZSBwdXQgaGVyZS4gKi8NCi0J fSBlbHNlIHsNCi0JCS8qDQotCQkgKiBLZXJuZWwgdXNlcyB0aGUgc291cmNlIElQIGFkZHJlc3Mg dG8gc2VsZWN0IHRoZQ0KLQkJICogaW50ZXJmYWNlIGZvciBlZ3Jlc3MgZW5jYXBzdWxhdGVkIHRy YWZmaWMsIHNvDQotCQkgKiBpdCBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgdGMgcnVsZS4NCi0J CSAqLw0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLA0KLQkJCQkJ ICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sIGl0ZW0sDQotCQkJCQkgICJvdXRlciBMMyBzb3Vy Y2UgYWRkcmVzcyINCi0JCQkJCSAgIiBtdXN0IGJlIHNwZWNpZmllZCBmb3IiDQotCQkJCQkgICIg dnhsYW4gZW5jYXBzdWxhdGlvbiIpOw0KLQl9DQotCW1zazYgPSAocnRlX2JlX3RvX2NwdV8zMiht YXNrLT5oZHIudnRjX2Zsb3cpID4+DQotCQlJUFY2X0hEUl9UQ19TSElGVCkgJiAweGZmOw0KLQlp ZiAobXNrNiAmJiBtc2s2ICE9IDB4ZmYpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFTk9UU1VQLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fTUFTSywgbWFz aywNCi0JCQkJCSAgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0JCQkJCSAgIiBc ImlwdjYuaGRyLnZ0Y19mbG93LnRvc1wiIGZpZWxkIg0KLQkJCQkJICAiIGZvciB2eGxhbiBlbmNh cHN1bGF0aW9uIik7DQotCWlmIChtYXNrLT5oZHIuaG9wX2xpbWl0cyAmJiBtYXNrLT5oZHIuaG9w X2xpbWl0cyAhPSAweGZmKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5P VFNVUCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQotCQkJ CQkgICJubyBzdXBwb3J0IGZvciBwYXJ0aWFsIG1hc2sgb24iDQotCQkJCQkgICIgXCJpcHY2Lmhk ci5ob3BfbGltaXRzXCIgZmllbGQiDQotCQkJCQkgICIgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24i KTsNCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLS8qKg0KLSAqIFZhbGlkYXRlIFZYTEFOX0VOQ0FQIGFj dGlvbiBSVEVfRkxPV19JVEVNX1RZUEVfVURQIGl0ZW0gZm9yIEUtU3dpdGNoLg0KLSAqIFRoZSBy b3V0aW5lIGNoZWNrcyB0aGUgVURQIGZpZWxkcyB0byBiZSB1c2VkIGluIGVuY2Fwc3VsYXRpb24g aGVhZGVyLg0KLSAqDQotICogQHBhcmFtW2luXSBpdGVtDQotICogICBQb2ludGVyIHRvIHRoZSBp dGVtIHN0cnVjdHVyZS4NCi0gKiBAcGFyYW1bb3V0XSBlcnJvcg0KLSAqICAgUG9pbnRlciB0byB0 aGUgZXJyb3Igc3RydWN0dXJlLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgMCBvbiBzdWNjZXNz LCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4N Ci0gKiovDQotc3RhdGljIGludA0KLWZsb3dfdGNmX3ZhbGlkYXRlX3Z4bGFuX2VuY2FwX3VkcChj b25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbSAqaXRlbSwNCi0JCQkJICBzdHJ1Y3QgcnRlX2Zsb3df ZXJyb3IgKmVycm9yKQ0KLXsNCi0JY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwICpzcGVj ID0gaXRlbS0+c3BlYzsNCi0JY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwICptYXNrID0g aXRlbS0+bWFzazsNCi0NCi0JaWYgKCFzcGVjKSB7DQotCQkvKg0KLQkJICogU3BlY2lmaWNhdGlv biBmb3IgVURQIHBvcnRzIGNhbm5vdCBiZSBlbXB0eQ0KLQkJICogYmVjYXVzZSBpdCBpcyByZXF1 aXJlZCBieSB0dW5uZWxfa2V5IHBhcmFtZXRlci4NCi0JCSAqLw0KLQkJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lU RU0sIGl0ZW0sDQotCQkJCQkgICJOVUxMIFVEUCBwb3J0IHNwZWNpZmljYXRpb24gIg0KLQkJCQkJ ICAiIGZvciB2eGxhbiBlbmNhcHN1bGF0aW9uIik7DQotCX0NCi0JaWYgKCFtYXNrKQ0KLQkJbWFz ayA9ICZydGVfZmxvd19pdGVtX3VkcF9tYXNrOw0KLQlpZiAobWFzay0+aGRyLmRzdF9wb3J0ICE9 IFJURV9CRTE2KDB4MDAwMCkpIHsNCi0JCWlmIChtYXNrLT5oZHIuZHN0X3BvcnQgIT0gUlRFX0JF MTYoMHhmZmZmKSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3Is IEVOT1RTVVAsDQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNX01BU0ssIG1hc2ssDQot CQkJCQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0JCQkJCSAiIFwidWRwLmhk ci5kc3RfcG9ydFwiIGZpZWxkIg0KLQkJCQkJICIgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsN Ci0JCWlmICghc3BlYy0+aGRyLmRzdF9wb3J0KQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9z ZXQNCi0JCQkJCShlcnJvciwgRUlOVkFMLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRF TSwgaXRlbSwNCi0JCQkJCSAib3V0ZXIgVURQIHJlbW90ZSBwb3J0IGNhbm5vdCBiZSINCi0JCQkJ CSAiIDAgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsNCi0JfSBlbHNlIHsNCi0JCXJldHVybiBy dGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1Jf VFlQRV9JVEVNLCBpdGVtLA0KLQkJCQkJICAib3V0ZXIgVURQIHJlbW90ZSBwb3J0Ig0KLQkJCQkJ ICAiIG11c3QgYmUgc3BlY2lmaWVkIGZvciINCi0JCQkJCSAgIiB2eGxhbiBlbmNhcHN1bGF0aW9u Iik7DQotCX0NCi0JaWYgKG1hc2stPmhkci5zcmNfcG9ydCAhPSBSVEVfQkUxNigweDAwMDApKSB7 DQotCQlpZiAobWFzay0+aGRyLnNyY19wb3J0ICE9IFJURV9CRTE2KDB4ZmZmZikpDQotCQkJcmV0 dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJU RV9GTE9XX0VSUk9SX1RZUEVfSVRFTV9NQVNLLCBtYXNrLA0KLQkJCQkJICJubyBzdXBwb3J0IGZv ciBwYXJ0aWFsIG1hc2sgb24iDQotCQkJCQkgIiBcInVkcC5oZHIuc3JjX3BvcnRcIiBmaWVsZCIN Ci0JCQkJCSAiIGZvciB2eGxhbiBlbmNhcHN1bGF0aW9uIik7DQotCQlEUlZfTE9HKFdBUk5JTkcs DQotCQkJIm91dGVyIFVEUCBzb3VyY2UgcG9ydCBjYW5ub3QgYmUiDQotCQkJIiBmb3JjZWQgZm9y IHZ4bGFuIGVuY2Fwc3VsYXRpb24sIg0KLQkJCSIgcGFyYW1ldGVyIGlnbm9yZWQiKTsNCi0JfQ0K LQlyZXR1cm4gMDsNCi19DQotDQotLyoqDQotICogVmFsaWRhdGUgVlhMQU5fRU5DQVAgYWN0aW9u IFJURV9GTE9XX0lURU1fVFlQRV9WWExBTiBpdGVtIGZvciBFLVN3aXRjaC4NCi0gKiBUaGUgcm91 dGluZSBjaGVja3MgdGhlIFZOSVAgZmllbGRzIHRvIGJlIHVzZWQgaW4gZW5jYXBzdWxhdGlvbiBo ZWFkZXIuDQotICoNCi0gKiBAcGFyYW1baW5dIGl0ZW0NCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGl0 ZW0gc3RydWN0dXJlLg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQb2ludGVyIHRvIHRo ZSBlcnJvciBzdHJ1Y3R1cmUuDQotICoNCi0gKiBAcmV0dXJuDQotICogICAwIG9uIHN1Y2Nlc3Ms IGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0Lg0K LSAqKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfdmFsaWRhdGVfdnhsYW5fZW5jYXBfdm5pKGNv bnN0IHN0cnVjdCBydGVfZmxvd19pdGVtICppdGVtLA0KLQkJCQkgIHN0cnVjdCBydGVfZmxvd19l cnJvciAqZXJyb3IpDQotew0KLQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV92eGxhbiAqc3Bl YyA9IGl0ZW0tPnNwZWM7DQotCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3Z4bGFuICptYXNr ID0gaXRlbS0+bWFzazsNCi0NCi0JaWYgKCFzcGVjKSB7DQotCQkvKiBPdXRlciBWTkkgaXMgcmVx dWlyZWQgYnkgdHVubmVsX2tleSBwYXJhbWV0ZXIuICovDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwg aXRlbSwNCi0JCQkJCSAgIk5VTEwgVk5JIHNwZWNpZmljYXRpb24iDQotCQkJCQkgICIgZm9yIHZ4 bGFuIGVuY2Fwc3VsYXRpb24iKTsNCi0JfQ0KLQlpZiAoIW1hc2spDQotCQltYXNrID0gJnJ0ZV9m bG93X2l0ZW1fdnhsYW5fbWFzazsNCi0JaWYgKCFtYXNrLT52bmlbMF0gJiYgIW1hc2stPnZuaVsx XSAmJiAhbWFzay0+dm5pWzJdKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwg RUlOVkFMLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sIGl0ZW0sDQotCQkJCQkg ICJvdXRlciBWTkkgbXVzdCBiZSBzcGVjaWZpZWQgIg0KLQkJCQkJICAiZm9yIHZ4bGFuIGVuY2Fw c3VsYXRpb24iKTsNCi0JaWYgKG1hc2stPnZuaVswXSAhPSAweGZmIHx8DQotCSAgICBtYXNrLT52 bmlbMV0gIT0gMHhmZiB8fA0KLQkgICAgbWFzay0+dm5pWzJdICE9IDB4ZmYpDQotCQlyZXR1cm4g cnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJICBSVEVfRkxPV19FUlJP Ul9UWVBFX0lURU1fTUFTSywgbWFzaywNCi0JCQkJCSAgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwg bWFzayBvbiINCi0JCQkJCSAgIiBcInZ4bGFuLnZuaVwiIGZpZWxkIik7DQotDQotCWlmICghc3Bl Yy0+dm5pWzBdICYmICFzcGVjLT52bmlbMV0gJiYgIXNwZWMtPnZuaVsyXSkNCi0JCXJldHVybiBy dGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1Jf VFlQRV9JVEVNLCBpdGVtLA0KLQkJCQkJICAidnhsYW4gdm5pIGNhbm5vdCBiZSAwIik7DQotCXJl dHVybiAwOw0KLX0NCi0NCi0vKioNCi0gKiBWYWxpZGF0ZSBWWExBTl9FTkNBUCBhY3Rpb24gaXRl bSBsaXN0IGZvciBFLVN3aXRjaC4NCi0gKiBUaGUgcm91dGluZSBjaGVja3MgaXRlbXMgdG8gYmUg dXNlZCBpbiBlbmNhcHN1bGF0aW9uIGhlYWRlci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gYWN0aW9u DQotICogICBQb2ludGVyIHRvIHRoZSBWWExBTl9FTkNBUCBhY3Rpb24gc3RydWN0dXJlLg0KLSAq IEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQb2ludGVyIHRvIHRoZSBlcnJvciBzdHJ1Y3R1cmUu DQotICoNCi0gKiBAcmV0dXJuDQotICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8g dmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0Lg0KLSAqKi8NCi1zdGF0aWMgaW50 DQotZmxvd190Y2ZfdmFsaWRhdGVfdnhsYW5fZW5jYXAoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2Fj dGlvbiAqYWN0aW9uLA0KLQkJCSAgICAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQot ew0KLQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbSAqaXRlbXM7DQotCWludCByZXQ7DQotCXVp bnQzMl90IGl0ZW1fZmxhZ3MgPSAwOw0KLQ0KLQlpZiAoIWFjdGlvbi0+Y29uZikNCi0JCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJS T1JfVFlQRV9BQ1RJT04sIGFjdGlvbiwNCi0JCQkJCSAgIk1pc3NpbmcgdnhsYW4gdHVubmVsIg0K LQkJCQkJICAiIGFjdGlvbiBjb25maWd1cmF0aW9uIik7DQotCWl0ZW1zID0gKChjb25zdCBzdHJ1 Y3QgcnRlX2Zsb3dfYWN0aW9uX3Z4bGFuX2VuY2FwICopDQotCQkJCQlhY3Rpb24tPmNvbmYpLT5k ZWZpbml0aW9uOw0KLQlpZiAoIWl0ZW1zKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChl cnJvciwgRUlOVkFMLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwgYWN0aW9u LA0KLQkJCQkJICAiTWlzc2luZyB2eGxhbiB0dW5uZWwiDQotCQkJCQkgICIgZW5jYXBzdWxhdGlv biBwYXJhbWV0ZXJzIik7DQotCWZvciAoOyBpdGVtcy0+dHlwZSAhPSBSVEVfRkxPV19JVEVNX1RZ UEVfRU5EOyBpdGVtcysrKSB7DQotCQlzd2l0Y2ggKGl0ZW1zLT50eXBlKSB7DQotCQljYXNlIFJU RV9GTE9XX0lURU1fVFlQRV9WT0lEOg0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVN X1RZUEVfRVRIOg0KLQkJCXJldCA9IG1seDVfZmxvd192YWxpZGF0ZV9pdGVtX2V0aChpdGVtcywg aXRlbV9mbGFncywNCi0JCQkJCQkJICBlcnJvcik7DQotCQkJaWYgKHJldCA8IDApDQotCQkJCXJl dHVybiByZXQ7DQotCQkJcmV0ID0gZmxvd190Y2ZfdmFsaWRhdGVfdnhsYW5fZW5jYXBfZXRoKGl0 ZW1zLCBlcnJvcik7DQotCQkJaWYgKHJldCA8IDApDQotCQkJCXJldHVybiByZXQ7DQotCQkJaXRl bV9mbGFncyB8PSBNTFg1X0ZMT1dfTEFZRVJfT1VURVJfTDI7DQotCQkJYnJlYWs7DQotCQlicmVh azsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX0lQVjQ6DQotCQkJcmV0ID0gbWx4NV9mbG93 X3ZhbGlkYXRlX2l0ZW1faXB2NA0KLQkJCQkJKGl0ZW1zLCBpdGVtX2ZsYWdzLA0KLQkJCQkJICZm bG93X3RjZl9tYXNrX3N1cHBvcnRlZC5pcHY0LCBlcnJvcik7DQotCQkJaWYgKHJldCA8IDApDQot CQkJCXJldHVybiByZXQ7DQotCQkJcmV0ID0gZmxvd190Y2ZfdmFsaWRhdGVfdnhsYW5fZW5jYXBf aXB2NChpdGVtcywgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0KLQkJCQlyZXR1cm4gcmV0Ow0K LQkJCWl0ZW1fZmxhZ3MgfD0gTUxYNV9GTE9XX0xBWUVSX09VVEVSX0wzX0lQVjQ7DQotCQkJYnJl YWs7DQotCQljYXNlIFJURV9GTE9XX0lURU1fVFlQRV9JUFY2Og0KLQkJCXJldCA9IG1seDVfZmxv d192YWxpZGF0ZV9pdGVtX2lwdjYNCi0JCQkJCShpdGVtcywgaXRlbV9mbGFncywNCi0JCQkJCSAm Zmxvd190Y2ZfbWFza19zdXBwb3J0ZWQuaXB2NiwgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0K LQkJCQlyZXR1cm4gcmV0Ow0KLQkJCXJldCA9IGZsb3dfdGNmX3ZhbGlkYXRlX3Z4bGFuX2VuY2Fw X2lwdjYoaXRlbXMsIGVycm9yKTsNCi0JCQlpZiAocmV0IDwgMCkNCi0JCQkJcmV0dXJuIHJldDsN Ci0JCQlpdGVtX2ZsYWdzIHw9IE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MM19JUFY2Ow0KLQkJCWJy ZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfVURQOg0KLQkJCXJldCA9IG1seDVfZmxv d192YWxpZGF0ZV9pdGVtX3VkcChpdGVtcywgaXRlbV9mbGFncywNCi0JCQkJCQkJICAgMHhGRiwg ZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCXJldCA9IGZs b3dfdGNmX3ZhbGlkYXRlX3Z4bGFuX2VuY2FwX3VkcChpdGVtcywgZXJyb3IpOw0KLQkJCWlmIChy ZXQgPCAwKQ0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCWl0ZW1fZmxhZ3MgfD0gTUxYNV9GTE9XX0xB WUVSX09VVEVSX0w0X1VEUDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBF X1ZYTEFOOg0KLQkJCXJldCA9IG1seDVfZmxvd192YWxpZGF0ZV9pdGVtX3Z4bGFuKGl0ZW1zLA0K LQkJCQkJCQkgICAgaXRlbV9mbGFncywgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0KLQkJCQly ZXR1cm4gcmV0Ow0KLQkJCXJldCA9IGZsb3dfdGNmX3ZhbGlkYXRlX3Z4bGFuX2VuY2FwX3ZuaShp dGVtcywgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCWl0 ZW1fZmxhZ3MgfD0gTUxYNV9GTE9XX0xBWUVSX1ZYTEFOOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVs dDoNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3IsIEVOT1RTVVAs DQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLCBpdGVtcywNCi0JCQkJCSAidnhsYW4g ZW5jYXAgaXRlbSBub3Qgc3VwcG9ydGVkIik7DQotCQl9DQotCX0NCi0JaWYgKCEoaXRlbV9mbGFn cyAmIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MMykpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jf c2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLCBh Y3Rpb24sDQotCQkJCQkgICJubyBvdXRlciBJUCBsYXllciBmb3VuZCINCi0JCQkJCSAgIiBmb3Ig dnhsYW4gZW5jYXBzdWxhdGlvbiIpOw0KLQlpZiAoIShpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xB WUVSX09VVEVSX0w0X1VEUCkpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBF SU5WQUwsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLCBhY3Rpb24sDQotCQkJ CQkgICJubyBvdXRlciBVRFAgbGF5ZXIgZm91bmQiDQotCQkJCQkgICIgZm9yIHZ4bGFuIGVuY2Fw c3VsYXRpb24iKTsNCi0JaWYgKCEoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9WWExBTikp DQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkgIFJU RV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLCBhY3Rpb24sDQotCQkJCQkgICJubyBWWExBTiBWTkkg Zm91bmQiDQotCQkJCQkgICIgZm9yIHZ4bGFuIGVuY2Fwc3VsYXRpb24iKTsNCi0JcmV0dXJuIDA7 DQotfQ0KLQ0KLS8qKg0KLSAqIFZhbGlkYXRlIG91dGVyIFJURV9GTE9XX0lURU1fVFlQRV9VRFAg aXRlbSBpZiB0dW5uZWwgaXRlbQ0KLSAqIFJURV9GTE9XX0lURU1fVFlQRV9WWExBTiBpcyBwcmVz ZW50IGluIGl0ZW0gbGlzdC4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdWRwDQotICogICBPdXRlciBV RFAgbGF5ZXIgaXRlbSAoaWYgYW55LCBOVUxMIG90aGVyd2lzZSkuDQotICogQHBhcmFtW291dF0g ZXJyb3INCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGVycm9yIHN0cnVjdHVyZS4NCi0gKg0KLSAqIEBy ZXR1cm4NCi0gKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndp c2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICoqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl92 YWxpZGF0ZV92eGxhbl9kZWNhcF91ZHAoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW0gKnVkcCwN Ci0JCQkJICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0JY29uc3Qgc3RydWN0 IHJ0ZV9mbG93X2l0ZW1fdWRwICpzcGVjID0gdWRwLT5zcGVjOw0KLQljb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfaXRlbV91ZHAgKm1hc2sgPSB1ZHAtPm1hc2s7DQotDQotCWlmICghc3BlYykNCi0JCS8q DQotCQkgKiBTcGVjaWZpY2F0aW9uIGZvciBVRFAgcG9ydHMgY2Fubm90IGJlIGVtcHR5DQotCQkg KiBiZWNhdXNlIGl0IGlzIHJlcXVpcmVkIGFzIGRlY2FwIHBhcmFtZXRlci4NCi0JCSAqLw0KLQkJ cmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLA0KLQkJCQkJICBSVEVfRkxP V19FUlJPUl9UWVBFX0lURU0sIHVkcCwNCi0JCQkJCSAgIk5VTEwgVURQIHBvcnQgc3BlY2lmaWNh dGlvbiINCi0JCQkJCSAgIiBmb3IgVlhMQU4gZGVjYXBzdWxhdGlvbiIpOw0KLQlpZiAoIW1hc2sp DQotCQltYXNrID0gJnJ0ZV9mbG93X2l0ZW1fdWRwX21hc2s7DQotCWlmIChtYXNrLT5oZHIuZHN0 X3BvcnQgIT0gUlRFX0JFMTYoMHgwMDAwKSkgew0KLQkJaWYgKG1hc2stPmhkci5kc3RfcG9ydCAh PSBSVEVfQkUxNigweGZmZmYpKQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJ CShlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fTUFTSywg bWFzaywNCi0JCQkJCSAibm8gc3VwcG9ydCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkJICIg XCJ1ZHAuaGRyLmRzdF9wb3J0XCIgZmllbGQiKTsNCi0JCWlmICghc3BlYy0+aGRyLmRzdF9wb3J0 KQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCShlcnJvciwgRUlOVkFMLA0K LQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwgdWRwLA0KLQkJCQkJICJ6ZXJvIGRlY2Fw IGxvY2FsIFVEUCBwb3J0Iik7DQotCX0gZWxzZSB7DQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jf c2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwgdWRw LA0KLQkJCQkJICAib3V0ZXIgVURQIGRlc3RpbmF0aW9uIHBvcnQgbXVzdCBiZSAiDQotCQkJCQkg ICJzcGVjaWZpZWQgZm9yIHZ4bGFuIGRlY2Fwc3VsYXRpb24iKTsNCi0JfQ0KLQlpZiAobWFzay0+ aGRyLnNyY19wb3J0ICE9IFJURV9CRTE2KDB4MDAwMCkpIHsNCi0JCWlmIChtYXNrLT5oZHIuc3Jj X3BvcnQgIT0gUlRFX0JFMTYoMHhmZmZmKSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0 DQotCQkJCQkoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVN X01BU0ssIG1hc2ssDQotCQkJCQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0J CQkJCSAiIFwidWRwLmhkci5zcmNfcG9ydFwiIGZpZWxkIik7DQotCQlEUlZfTE9HKFdBUk5JTkcs DQotCQkJIm91dGVyIFVEUCBsb2NhbCBwb3J0IGNhbm5vdCBiZSAiDQotCQkJImZvcmNlZCBmb3Ig VlhMQU4gZW5jYXBzdWxhdGlvbiwgIg0KLQkJCSJwYXJhbWV0ZXIgaWdub3JlZCIpOw0KLQl9DQot CXJldHVybiAwOw0KLX0NCi0NCi0vKioNCi0gKiBWYWxpZGF0ZSBmbG93IGZvciBFLVN3aXRjaC4N Ci0gKg0KLSAqIEBwYXJhbVtpbl0gcHJpdg0KLSAqICAgUG9pbnRlciB0byB0aGUgcHJpdiBzdHJ1 Y3R1cmUuDQotICogQHBhcmFtW2luXSBhdHRyDQotICogICBQb2ludGVyIHRvIHRoZSBmbG93IGF0 dHJpYnV0ZXMuDQotICogQHBhcmFtW2luXSBpdGVtcw0KLSAqICAgUG9pbnRlciB0byB0aGUgbGlz dCBvZiBpdGVtcy4NCi0gKiBAcGFyYW1baW5dIGFjdGlvbnMNCi0gKiAgIFBvaW50ZXIgdG8gdGhl IGxpc3Qgb2YgYWN0aW9ucy4NCi0gKiBAcGFyYW1bb3V0XSBlcnJvcg0KLSAqICAgUG9pbnRlciB0 byB0aGUgZXJyb3Igc3RydWN0dXJlLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgMCBvbiBzdWNj ZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNl dC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfdmFsaWRhdGUoc3RydWN0IHJ0ZV9ldGhf ZGV2ICpkZXYsDQotCQkgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hdHRyICphdHRyLA0KLQkJICBj b25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbSBpdGVtc1tdLA0KLQkJICBjb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfYWN0aW9uIGFjdGlvbnNbXSwNCi0JCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJv cikNCi17DQotCXVuaW9uIHsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3BvcnRfaWQg KnBvcnRfaWQ7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9ldGggKmV0aDsNCi0JCWNv bnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3ZsYW4gKnZsYW47DQotCQljb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfaXRlbV9pcHY0ICppcHY0Ow0KLQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2 NiAqaXB2NjsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3RjcCAqdGNwOw0KLQkJY29u c3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwICp1ZHA7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zs b3dfaXRlbV92eGxhbiAqdnhsYW47DQotCX0gc3BlYywgbWFzazsNCi0JdW5pb24gew0KLQkJY29u c3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbl9wb3J0X2lkICpwb3J0X2lkOw0KLQkJY29uc3Qgc3Ry dWN0IHJ0ZV9mbG93X2FjdGlvbl9qdW1wICpqdW1wOw0KLQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93 X2FjdGlvbl9vZl9wdXNoX3ZsYW4gKm9mX3B1c2hfdmxhbjsNCi0JCWNvbnN0IHN0cnVjdCBydGVf Zmxvd19hY3Rpb25fb2Zfc2V0X3ZsYW5fdmlkICoNCi0JCQlvZl9zZXRfdmxhbl92aWQ7DQotCQlj b25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uX29mX3NldF92bGFuX3BjcCAqDQotCQkJb2Zfc2V0 X3ZsYW5fcGNwOw0KLQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbl92eGxhbl9lbmNhcCAq dnhsYW5fZW5jYXA7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uX3NldF9pcHY0ICpz ZXRfaXB2NDsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb25fc2V0X2lwdjYgKnNldF9p cHY2Ow0KLQl9IGNvbmY7DQotCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtICpvdXRlcl91ZHAg PSBOVUxMOw0KLQlydGVfYmUxNl90IGlubmVyX2V0eXBlID0gUlRFX0JFMTYoRVRIX1BfQUxMKTsN Ci0JcnRlX2JlMTZfdCBvdXRlcl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0FMTCk7DQotCXJ0ZV9i ZTE2X3Qgdmxhbl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0FMTCk7DQotCXVpbnQ2NF90IGl0ZW1f ZmxhZ3MgPSAwOw0KLQl1aW50NjRfdCBhY3Rpb25fZmxhZ3MgPSAwOw0KLQl1aW50OF90IG5leHRf cHJvdG9jb2wgPSAweGZmOw0KLQl1bnNpZ25lZCBpbnQgdGNtX2lmaW5kZXggPSAwOw0KLQl1aW50 OF90IHBlZGl0X3ZhbGlkYXRlZCA9IDA7DQotCXN0cnVjdCBmbG93X3RjZl9wdG9pIHB0b2lbUFRP SV9UQUJMRV9TWl9NQVgoZGV2KV07DQotCXN0cnVjdCBydGVfZXRoX2RldiAqcG9ydF9pZF9kZXYg PSBOVUxMOw0KLQlib29sIGluX3BvcnRfaWRfc2V0Ow0KLQlpbnQgcmV0Ow0KLQ0KLQljbGFpbV9u b256ZXJvKGZsb3dfdGNmX2J1aWxkX3B0b2lfdGFibGUoZGV2LCBwdG9pLA0KLQkJCQkJCVBUT0lf VEFCTEVfU1pfTUFYKGRldikpKTsNCi0JcmV0ID0gZmxvd190Y2ZfdmFsaWRhdGVfYXR0cmlidXRl cyhhdHRyLCBlcnJvcik7DQotCWlmIChyZXQgPCAwKQ0KLQkJcmV0dXJuIHJldDsNCi0JZm9yICg7 IGFjdGlvbnMtPnR5cGUgIT0gUlRFX0ZMT1dfQUNUSU9OX1RZUEVfRU5EOyBhY3Rpb25zKyspIHsN Ci0JCXVuc2lnbmVkIGludCBpOw0KLQkJdWludDY0X3QgY3VycmVudF9hY3Rpb25fZmxhZyA9IDA7 DQotDQotCQlzd2l0Y2ggKGFjdGlvbnMtPnR5cGUpIHsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9O X1RZUEVfVk9JRDoNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfUE9S VF9JRDoNCi0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0gTUxYNV9GTE9XX0FDVElPTl9QT1JUX0lE Ow0KLQkJCWlmICghYWN0aW9ucy0+Y29uZikNCi0JCQkJYnJlYWs7DQotCQkJY29uZi5wb3J0X2lk ID0gYWN0aW9ucy0+Y29uZjsNCi0JCQlpZiAoY29uZi5wb3J0X2lkLT5vcmlnaW5hbCkNCi0JCQkJ aSA9IDA7DQotCQkJZWxzZQ0KLQkJCQlmb3IgKGkgPSAwOyBwdG9pW2ldLmlmaW5kZXg7ICsraSkN Ci0JCQkJCWlmIChwdG9pW2ldLnBvcnRfaWQgPT0gY29uZi5wb3J0X2lkLT5pZCkNCi0JCQkJCQli cmVhazsNCi0JCQlpZiAoIXB0b2lbaV0uaWZpbmRleCkNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vy cm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9ERVYsDQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQ RV9BQ1RJT05fQ09ORiwNCi0JCQkJCSBjb25mLnBvcnRfaWQsDQotCQkJCQkgIm1pc3NpbmcgZGF0 YSB0byBjb252ZXJ0IHBvcnQgSUQgdG8iDQotCQkJCQkgIiBpZmluZGV4Iik7DQotCQkJcG9ydF9p ZF9kZXYgPSAmcnRlX2V0aF9kZXZpY2VzW2NvbmYucG9ydF9pZC0+aWRdOw0KLQkJCWJyZWFrOw0K LQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9KVU1QOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2Zs YWcgPSBNTFg1X0ZMT1dfQUNUSU9OX0pVTVA7DQotCQkJaWYgKCFhY3Rpb25zLT5jb25mKQ0KLQkJ CQlicmVhazsNCi0JCQljb25mLmp1bXAgPSBhY3Rpb25zLT5jb25mOw0KLQkJCWlmIChhdHRyLT5n cm91cCA+PSBjb25mLmp1bXAtPmdyb3VwKQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0 DQotCQkJCQkoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJ T04sDQotCQkJCQkgYWN0aW9ucywNCi0JCQkJCSAiY2FuIGp1bXAgb25seSB0byBhIGdyb3VwIGZv cndhcmQiKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfRFJPUDoN Ci0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0gTUxYNV9GTE9XX0FDVElPTl9EUk9QOw0KLQkJCWJy ZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9DT1VOVDoNCi0JCQlicmVhazsNCi0J CWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfT0ZfUE9QX1ZMQU46DQotCQkJY3VycmVudF9hY3Rp b25fZmxhZyA9IE1MWDVfRkxPV19BQ1RJT05fT0ZfUE9QX1ZMQU47DQotCQkJYnJlYWs7DQotCQlj YXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1BVU0hfVkxBTjogew0KLQkJCXJ0ZV9iZTE2X3Qg ZXRoZXJ0eXBlOw0KLQ0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBNTFg1X0ZMT1dfQUNUSU9O X09GX1BVU0hfVkxBTjsNCi0JCQlpZiAoIWFjdGlvbnMtPmNvbmYpDQotCQkJCWJyZWFrOw0KLQkJ CWNvbmYub2ZfcHVzaF92bGFuID0gYWN0aW9ucy0+Y29uZjsNCi0JCQlldGhlcnR5cGUgPSBjb25m Lm9mX3B1c2hfdmxhbi0+ZXRoZXJ0eXBlOw0KLQkJCWlmIChldGhlcnR5cGUgIT0gUlRFX0JFMTYo RVRIX1BfODAyMVEpICYmDQotCQkJICAgIGV0aGVydHlwZSAhPSBSVEVfQkUxNihFVEhfUF84MDIx QUQpKQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3IsIEVJTlZB TCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwgYWN0aW9ucywNCi0JCQkJCSAi dmxhbiBwdXNoIFRQSUQgbXVzdCBiZSAiDQotCQkJCQkgIjgwMi4xUSBvciA4MDIuMUFEIik7DQot CQkJYnJlYWs7DQotCQl9DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1NFVF9WTEFO X1ZJRDoNCi0JCQlpZiAoIShhY3Rpb25fZmxhZ3MgJiBNTFg1X0ZMT1dfQUNUSU9OX09GX1BVU0hf VkxBTikpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCShlcnJvciwgRU5P VFNVUCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwgYWN0aW9ucywNCi0JCQkJ CSAidmxhbiBtb2RpZnkgaXMgbm90IHN1cHBvcnRlZCwiDQotCQkJCQkgIiBzZXQgYWN0aW9uIG11 c3QgZm9sbG93IHB1c2ggYWN0aW9uIik7DQotCQkJY3VycmVudF9hY3Rpb25fZmxhZyA9IE1MWDVf RkxPV19BQ1RJT05fT0ZfU0VUX1ZMQU5fVklEOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxP V19BQ1RJT05fVFlQRV9PRl9TRVRfVkxBTl9QQ1A6DQotCQkJaWYgKCEoYWN0aW9uX2ZsYWdzICYg TUxYNV9GTE9XX0FDVElPTl9PRl9QVVNIX1ZMQU4pKQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJy b3Jfc2V0DQotCQkJCQkoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQ RV9BQ1RJT04sIGFjdGlvbnMsDQotCQkJCQkgInZsYW4gbW9kaWZ5IGlzIG5vdCBzdXBwb3J0ZWQs Ig0KLQkJCQkJICIgc2V0IGFjdGlvbiBtdXN0IGZvbGxvdyBwdXNoIGFjdGlvbiIpOw0KLQkJCWN1 cnJlbnRfYWN0aW9uX2ZsYWcgPSBNTFg1X0ZMT1dfQUNUSU9OX09GX1NFVF9WTEFOX1BDUDsNCi0J CQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfVlhMQU5fREVDQVA6DQotCQkJ Y3VycmVudF9hY3Rpb25fZmxhZyA9IE1MWDVfRkxPV19BQ1RJT05fVlhMQU5fREVDQVA7DQotCQkJ YnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1ZYTEFOX0VOQ0FQOg0KLQkJCXJl dCA9IGZsb3dfdGNmX3ZhbGlkYXRlX3Z4bGFuX2VuY2FwKGFjdGlvbnMsIGVycm9yKTsNCi0JCQlp ZiAocmV0IDwgMCkNCi0JCQkJcmV0dXJuIHJldDsNCi0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0g TUxYNV9GTE9XX0FDVElPTl9WWExBTl9FTkNBUDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX0lQVjRfU1JDOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBN TFg1X0ZMT1dfQUNUSU9OX1NFVF9JUFY0X1NSQzsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX0lQVjRfRFNUOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBN TFg1X0ZMT1dfQUNUSU9OX1NFVF9JUFY0X0RTVDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX0lQVjZfU1JDOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBN TFg1X0ZMT1dfQUNUSU9OX1NFVF9JUFY2X1NSQzsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX0lQVjZfRFNUOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBN TFg1X0ZMT1dfQUNUSU9OX1NFVF9JUFY2X0RTVDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZM T1dfQUNUSU9OX1RZUEVfU0VUX1RQX1NSQzoNCi0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0gTUxY NV9GTE9XX0FDVElPTl9TRVRfVFBfU1JDOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19B Q1RJT05fVFlQRV9TRVRfVFBfRFNUOg0KLQkJCWN1cnJlbnRfYWN0aW9uX2ZsYWcgPSBNTFg1X0ZM T1dfQUNUSU9OX1NFVF9UUF9EU1Q7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElP Tl9UWVBFX1NFVF9UVEw6DQotCQkJY3VycmVudF9hY3Rpb25fZmxhZyA9IE1MWDVfRkxPV19BQ1RJ T05fU0VUX1RUTDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfREVD X1RUTDoNCi0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0gTUxYNV9GTE9XX0FDVElPTl9ERUNfVFRM Ow0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRfTUFDX1NSQzoN Ci0JCQljdXJyZW50X2FjdGlvbl9mbGFnID0gTUxYNV9GTE9XX0FDVElPTl9TRVRfTUFDX1NSQzsN Ci0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX01BQ19EU1Q6DQot CQkJY3VycmVudF9hY3Rpb25fZmxhZyA9IE1MWDVfRkxPV19BQ1RJT05fU0VUX01BQ19EU1Q7DQot CQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJy b3IsIEVOT1RTVVAsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJ CQkgIGFjdGlvbnMsDQotCQkJCQkJICAiYWN0aW9uIG5vdCBzdXBwb3J0ZWQiKTsNCi0JCX0NCi0J CWlmIChjdXJyZW50X2FjdGlvbl9mbGFnICYgTUxYNV9UQ0ZfQ09ORklHX0FDVElPTlMpIHsNCi0J CQlpZiAoIWFjdGlvbnMtPmNvbmYpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0J CQkJCShlcnJvciwgRUlOVkFMLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OX0NP TkYsDQotCQkJCQkgYWN0aW9ucywNCi0JCQkJCSAiYWN0aW9uIGNvbmZpZ3VyYXRpb24gbm90IHNl dCIpOw0KLQkJfQ0KLQkJaWYgKChjdXJyZW50X2FjdGlvbl9mbGFnICYgTUxYNV9UQ0ZfUEVESVRf QUNUSU9OUykgJiYNCi0JCSAgICBwZWRpdF92YWxpZGF0ZWQpDQotCQkJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVf QUNUSU9OLA0KLQkJCQkJCSAgYWN0aW9ucywNCi0JCQkJCQkgICJzZXQgYWN0aW9ucyBzaG91bGQg YmUgIg0KLQkJCQkJCSAgImxpc3RlZCBzdWNjZXNzaXZlbHkiKTsNCi0JCWlmICgoY3VycmVudF9h Y3Rpb25fZmxhZyAmIH5NTFg1X1RDRl9QRURJVF9BQ1RJT05TKSAmJg0KLQkJICAgIChhY3Rpb25f ZmxhZ3MgJiBNTFg1X1RDRl9QRURJVF9BQ1RJT05TKSkNCi0JCQlwZWRpdF92YWxpZGF0ZWQgPSAx Ow0KLQkJaWYgKChjdXJyZW50X2FjdGlvbl9mbGFnICYgTUxYNV9UQ0ZfRkFURV9BQ1RJT05TKSAm Jg0KLQkJICAgIChhY3Rpb25fZmxhZ3MgJiBNTFg1X1RDRl9GQVRFX0FDVElPTlMpKQ0KLQkJCXJl dHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCQkgIFJURV9GTE9X X0VSUk9SX1RZUEVfQUNUSU9OLA0KLQkJCQkJCSAgYWN0aW9ucywNCi0JCQkJCQkgICJjYW4ndCBo YXZlIG11bHRpcGxlIGZhdGUiDQotCQkJCQkJICAiIGFjdGlvbnMiKTsNCi0JCWlmICgoY3VycmVu dF9hY3Rpb25fZmxhZyAmIE1MWDVfVENGX1ZYTEFOX0FDVElPTlMpICYmDQotCQkgICAgKGFjdGlv bl9mbGFncyAmIE1MWDVfVENGX1ZYTEFOX0FDVElPTlMpKQ0KLQkJCXJldHVybiBydGVfZmxvd19l cnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNU SU9OLA0KLQkJCQkJCSAgYWN0aW9ucywNCi0JCQkJCQkgICJjYW4ndCBoYXZlIG11bHRpcGxlIHZ4 bGFuIg0KLQkJCQkJCSAgIiBhY3Rpb25zIik7DQotCQlpZiAoKGN1cnJlbnRfYWN0aW9uX2ZsYWcg JiBNTFg1X1RDRl9WWExBTl9BQ1RJT05TKSAmJg0KLQkJICAgIChhY3Rpb25fZmxhZ3MgJiBNTFg1 X1RDRl9WTEFOX0FDVElPTlMpKQ0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3Is IEVOT1RTVVAsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJCQkg IGFjdGlvbnMsDQotCQkJCQkJICAiY2FuJ3QgaGF2ZSB2eGxhbiBhbmQgdmxhbiINCi0JCQkJCQkg ICIgYWN0aW9ucyBpbiB0aGUgc2FtZSBydWxlIik7DQotCQlhY3Rpb25fZmxhZ3MgfD0gY3VycmVu dF9hY3Rpb25fZmxhZzsNCi0JfQ0KLQlmb3IgKDsgaXRlbXMtPnR5cGUgIT0gUlRFX0ZMT1dfSVRF TV9UWVBFX0VORDsgaXRlbXMrKykgew0KLQkJdW5zaWduZWQgaW50IGk7DQotDQotCQlzd2l0Y2gg KGl0ZW1zLT50eXBlKSB7DQotCQljYXNlIFJURV9GTE9XX0lURU1fVFlQRV9WT0lEOg0KLQkJCWJy ZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfUE9SVF9JRDoNCi0JCQlpZiAoaXRlbV9m bGFncyAmIE1MWDVfRkxPV19MQVlFUl9UVU5ORUwpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJv cl9zZXQNCi0JCQkJCShlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBF X0lURU0sIGl0ZW1zLA0KLQkJCQkJICJpbm5lciB0dW5uZWwgcG9ydCBpZCINCi0JCQkJCSAiIGl0 ZW0gaXMgbm90IHN1cHBvcnRlZCIpOw0KLQkJCW1hc2sucG9ydF9pZCA9IGZsb3dfdGNmX2l0ZW1f bWFzaw0KLQkJCQkoaXRlbXMsICZydGVfZmxvd19pdGVtX3BvcnRfaWRfbWFzaywNCi0JCQkJICZm bG93X3RjZl9tYXNrX3N1cHBvcnRlZC5wb3J0X2lkLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfZW1w dHkucG9ydF9pZCwNCi0JCQkJIHNpemVvZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC5wb3J0X2lk KSwNCi0JCQkJIGVycm9yKTsNCi0JCQlpZiAoIW1hc2sucG9ydF9pZCkNCi0JCQkJcmV0dXJuIC1y dGVfZXJybm87DQotCQkJaWYgKG1hc2sucG9ydF9pZCA9PSAmZmxvd190Y2ZfbWFza19lbXB0eS5w b3J0X2lkKSB7DQotCQkJCWluX3BvcnRfaWRfc2V0ID0gMTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0K LQkJCXNwZWMucG9ydF9pZCA9IGl0ZW1zLT5zcGVjOw0KLQkJCWlmIChtYXNrLnBvcnRfaWQtPmlk ICYmIG1hc2sucG9ydF9pZC0+aWQgIT0gMHhmZmZmZmZmZikNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93 X2Vycm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9S X1RZUEVfSVRFTV9NQVNLLA0KLQkJCQkJIG1hc2sucG9ydF9pZCwNCi0JCQkJCSAibm8gc3VwcG9y dCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkJICIgXCJpZFwiIGZpZWxkIik7DQotCQkJaWYg KCFtYXNrLnBvcnRfaWQtPmlkKQ0KLQkJCQlpID0gMDsNCi0JCQllbHNlDQotCQkJCWZvciAoaSA9 IDA7IHB0b2lbaV0uaWZpbmRleDsgKytpKQ0KLQkJCQkJaWYgKHB0b2lbaV0ucG9ydF9pZCA9PSBz cGVjLnBvcnRfaWQtPmlkKQ0KLQkJCQkJCWJyZWFrOw0KLQkJCWlmICghcHRvaVtpXS5pZmluZGV4 KQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3IsIEVOT0RFViwN Ci0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fU1BFQywNCi0JCQkJCSBzcGVjLnBvcnRf aWQsDQotCQkJCQkgIm1pc3NpbmcgZGF0YSB0byBjb252ZXJ0IHBvcnQgSUQgdG8iDQotCQkJCQkg IiBpZmluZGV4Iik7DQotCQkJaWYgKGluX3BvcnRfaWRfc2V0ICYmIHB0b2lbaV0uaWZpbmRleCAh PSB0Y21faWZpbmRleCkNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkJKGVy cm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTV9TUEVDLA0KLQkJ CQkJIHNwZWMucG9ydF9pZCwNCi0JCQkJCSAiY2Fubm90IG1hdGNoIHRyYWZmaWMgZm9yIg0KLQkJ CQkJICIgc2V2ZXJhbCBwb3J0IElEcyB0aHJvdWdoIg0KLQkJCQkJICIgYSBzaW5nbGUgZmxvdyBy dWxlIik7DQotCQkJdGNtX2lmaW5kZXggPSBwdG9pW2ldLmlmaW5kZXg7DQotCQkJaW5fcG9ydF9p ZF9zZXQgPSAxOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfRVRIOg0K LQkJCXJldCA9IG1seDVfZmxvd192YWxpZGF0ZV9pdGVtX2V0aChpdGVtcywgaXRlbV9mbGFncywN Ci0JCQkJCQkJICBlcnJvcik7DQotCQkJaWYgKHJldCA8IDApDQotCQkJCXJldHVybiByZXQ7DQot CQkJaXRlbV9mbGFncyB8PSAoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9UVU5ORUwpID8N Ci0JCQkJICAgICAgTUxYNV9GTE9XX0xBWUVSX0lOTkVSX0wyIDoNCi0JCQkJICAgICAgTUxYNV9G TE9XX0xBWUVSX09VVEVSX0wyOw0KLQkJCS8qIFRPRE86DQotCQkJICogUmVkdW5kYW50IGNoZWNr IGR1ZSB0byBkaWZmZXJlbnQgc3VwcG9ydGVkIG1hc2suDQotCQkJICogU2FtZSBmb3IgdGhlIHJl c3Qgb2YgaXRlbXMuDQotCQkJICovDQotCQkJbWFzay5ldGggPSBmbG93X3RjZl9pdGVtX21hc2sN Ci0JCQkJKGl0ZW1zLCAmcnRlX2Zsb3dfaXRlbV9ldGhfbWFzaywNCi0JCQkJICZmbG93X3RjZl9t YXNrX3N1cHBvcnRlZC5ldGgsDQotCQkJCSAmZmxvd190Y2ZfbWFza19lbXB0eS5ldGgsDQotCQkJ CSBzaXplb2YoZmxvd190Y2ZfbWFza19zdXBwb3J0ZWQuZXRoKSwNCi0JCQkJIGVycm9yKTsNCi0J CQlpZiAoIW1hc2suZXRoKQ0KLQkJCQlyZXR1cm4gLXJ0ZV9lcnJubzsNCi0JCQlpZiAobWFzay5l dGgtPnR5cGUgJiYgbWFzay5ldGgtPnR5cGUgIT0NCi0JCQkgICAgUlRFX0JFMTYoMHhmZmZmKSkN Ci0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0K LQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTV9NQVNLLA0KLQkJCQkJIG1hc2suZXRoLA0K LQkJCQkJICJubyBzdXBwb3J0IGZvciBwYXJ0aWFsIG1hc2sgb24iDQotCQkJCQkgIiBcInR5cGVc IiBmaWVsZCIpOw0KLQkJCWFzc2VydChpdGVtcy0+c3BlYyk7DQotCQkJc3BlYy5ldGggPSBpdGVt cy0+c3BlYzsNCi0JCQlpZiAobWFzay5ldGgtPnR5cGUgJiYNCi0JCQkgICAgKGl0ZW1fZmxhZ3Mg JiBNTFg1X0ZMT1dfTEFZRVJfVFVOTkVMKSAmJg0KLQkJCSAgICBpbm5lcl9ldHlwZSAhPSBSVEVf QkUxNihFVEhfUF9BTEwpICYmDQotCQkJICAgIGlubmVyX2V0eXBlICE9IHNwZWMuZXRoLT50eXBl KQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3IsIEVJTlZBTCwN Ci0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sDQotCQkJCQkgaXRlbXMsDQotCQkJCQkg ImlubmVyIGV0aF90eXBlIGNvbmZsaWN0Iik7DQotCQkJaWYgKG1hc2suZXRoLT50eXBlICYmDQot CQkJICAgICEoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9UVU5ORUwpICYmDQotCQkJICAg IG91dGVyX2V0eXBlICE9IFJURV9CRTE2KEVUSF9QX0FMTCkgJiYNCi0JCQkgICAgb3V0ZXJfZXR5 cGUgIT0gc3BlYy5ldGgtPnR5cGUpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0J CQkJCShlcnJvciwgRUlOVkFMLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwNCi0J CQkJCSBpdGVtcywNCi0JCQkJCSAib3V0ZXIgZXRoX3R5cGUgY29uZmxpY3QiKTsNCi0JCQlpZiAo bWFzay5ldGgtPnR5cGUpIHsNCi0JCQkJaWYgKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJf VFVOTkVMKQ0KLQkJCQkJaW5uZXJfZXR5cGUgPSBzcGVjLmV0aC0+dHlwZTsNCi0JCQkJZWxzZQ0K LQkJCQkJb3V0ZXJfZXR5cGUgPSBzcGVjLmV0aC0+dHlwZTsNCi0JCQl9DQotCQkJYnJlYWs7DQot CQljYXNlIFJURV9GTE9XX0lURU1fVFlQRV9WTEFOOg0KLQkJCWlmIChpdGVtX2ZsYWdzICYgTUxY NV9GTE9XX0xBWUVSX1RVTk5FTCkNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJ CQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwgaXRl bXMsDQotCQkJCQkgImlubmVyIHR1bm5lbCBWTEFOIg0KLQkJCQkJICIgaXMgbm90IHN1cHBvcnRl ZCIpOw0KLQkJCXJldCA9IG1seDVfZmxvd192YWxpZGF0ZV9pdGVtX3ZsYW4oaXRlbXMsIGl0ZW1f ZmxhZ3MsDQotCQkJCQkJCSAgIGVycm9yKTsNCi0JCQlpZiAocmV0IDwgMCkNCi0JCQkJcmV0dXJu IHJldDsNCi0JCQlpdGVtX2ZsYWdzIHw9IE1MWDVfRkxPV19MQVlFUl9PVVRFUl9WTEFOOw0KLQkJ CW1hc2sudmxhbiA9IGZsb3dfdGNmX2l0ZW1fbWFzaw0KLQkJCQkoaXRlbXMsICZydGVfZmxvd19p dGVtX3ZsYW5fbWFzaywNCi0JCQkJICZmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC52bGFuLA0KLQkJ CQkgJmZsb3dfdGNmX21hc2tfZW1wdHkudmxhbiwNCi0JCQkJIHNpemVvZihmbG93X3RjZl9tYXNr X3N1cHBvcnRlZC52bGFuKSwNCi0JCQkJIGVycm9yKTsNCi0JCQlpZiAoIW1hc2sudmxhbikNCi0J CQkJcmV0dXJuIC1ydGVfZXJybm87DQotCQkJaWYgKChtYXNrLnZsYW4tPnRjaSAmIFJURV9CRTE2 KDB4ZTAwMCkgJiYNCi0JCQkgICAgIChtYXNrLnZsYW4tPnRjaSAmIFJURV9CRTE2KDB4ZTAwMCkp ICE9DQotCQkJICAgICAgUlRFX0JFMTYoMHhlMDAwKSkgfHwNCi0JCQkgICAgKG1hc2sudmxhbi0+ dGNpICYgUlRFX0JFMTYoMHgwZmZmKSAmJg0KLQkJCSAgICAgKG1hc2sudmxhbi0+dGNpICYgUlRF X0JFMTYoMHgwZmZmKSkgIT0NCi0JCQkgICAgICBSVEVfQkUxNigweDBmZmYpKSB8fA0KLQkJCSAg ICAobWFzay52bGFuLT5pbm5lcl90eXBlICYmDQotCQkJICAgICBtYXNrLnZsYW4tPmlubmVyX3R5 cGUgIT0gUlRFX0JFMTYoMHhmZmZmKSkpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQN Ci0JCQkJCShlcnJvciwgRU5PVFNVUCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1f TUFTSywNCi0JCQkJCSBtYXNrLnZsYW4sDQotCQkJCQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwg bWFza3Mgb24iDQotCQkJCQkgIiBcInRjaVwiIChQQ1AgYW5kIFZJRCBwYXJ0cykgYW5kIg0KLQkJ CQkJICIgXCJpbm5lcl90eXBlXCIgZmllbGRzIik7DQotCQkJaWYgKG91dGVyX2V0eXBlICE9IFJU RV9CRTE2KEVUSF9QX0FMTCkgJiYNCi0JCQkgICAgb3V0ZXJfZXR5cGUgIT0gUlRFX0JFMTYoRVRI X1BfODAyMVEpKQ0KLQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkoZXJyb3Is IEVJTlZBTCwNCi0JCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sDQotCQkJCQkgaXRlbXMs DQotCQkJCQkgIm91dGVyIGV0aF90eXBlIGNvbmZsaWN0LCINCi0JCQkJCSAiIG11c3QgYmUgODAy LjFRIik7DQotCQkJb3V0ZXJfZXR5cGUgPSBSVEVfQkUxNihFVEhfUF84MDIxUSk7DQotCQkJYXNz ZXJ0KGl0ZW1zLT5zcGVjKTsNCi0JCQlzcGVjLnZsYW4gPSBpdGVtcy0+c3BlYzsNCi0JCQlpZiAo bWFzay52bGFuLT5pbm5lcl90eXBlICYmDQotCQkJICAgIHZsYW5fZXR5cGUgIT0gUlRFX0JFMTYo RVRIX1BfQUxMKSAmJg0KLQkJCSAgICB2bGFuX2V0eXBlICE9IHNwZWMudmxhbi0+aW5uZXJfdHlw ZSkNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkJKGVycm9yLCBFSU5WQUws DQotCQkJCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9JVEVNLA0KLQkJCQkJIGl0ZW1zLA0KLQkJCQkJ ICJ2bGFuIGV0aF90eXBlIGNvbmZsaWN0Iik7DQotCQkJaWYgKG1hc2sudmxhbi0+aW5uZXJfdHlw ZSkNCi0JCQkJdmxhbl9ldHlwZSA9IHNwZWMudmxhbi0+aW5uZXJfdHlwZTsNCi0JCQlicmVhazsN Ci0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX0lQVjQ6DQotCQkJcmV0ID0gbWx4NV9mbG93X3Zh bGlkYXRlX2l0ZW1faXB2NA0KLQkJCQkJKGl0ZW1zLCBpdGVtX2ZsYWdzLA0KLQkJCQkJICZmbG93 X3RjZl9tYXNrX3N1cHBvcnRlZC5pcHY0LCBlcnJvcik7DQotCQkJaWYgKHJldCA8IDApDQotCQkJ CXJldHVybiByZXQ7DQotCQkJaXRlbV9mbGFncyB8PSAoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19M QVlFUl9UVU5ORUwpID8NCi0JCQkJICAgICAgTUxYNV9GTE9XX0xBWUVSX0lOTkVSX0wzX0lQVjQg Og0KLQkJCQkgICAgICBNTFg1X0ZMT1dfTEFZRVJfT1VURVJfTDNfSVBWNDsNCi0JCQltYXNrLmlw djQgPSBmbG93X3RjZl9pdGVtX21hc2sNCi0JCQkJKGl0ZW1zLCAmcnRlX2Zsb3dfaXRlbV9pcHY0 X21hc2ssDQotCQkJCSAmZmxvd190Y2ZfbWFza19zdXBwb3J0ZWQuaXB2NCwNCi0JCQkJICZmbG93 X3RjZl9tYXNrX2VtcHR5LmlwdjQsDQotCQkJCSBzaXplb2YoZmxvd190Y2ZfbWFza19zdXBwb3J0 ZWQuaXB2NCksDQotCQkJCSBlcnJvcik7DQotCQkJaWYgKCFtYXNrLmlwdjQpDQotCQkJCXJldHVy biAtcnRlX2Vycm5vOw0KLQkJCWlmIChtYXNrLmlwdjQtPmhkci5uZXh0X3Byb3RvX2lkICYmDQot CQkJICAgIG1hc2suaXB2NC0+aGRyLm5leHRfcHJvdG9faWQgIT0gMHhmZikNCi0JCQkJcmV0dXJu IHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9G TE9XX0VSUk9SX1RZUEVfSVRFTV9NQVNLLA0KLQkJCQkJIG1hc2suaXB2NCwNCi0JCQkJCSAibm8g c3VwcG9ydCBmb3IgcGFydGlhbCBtYXNrIG9uIg0KLQkJCQkJICIgXCJoZHIubmV4dF9wcm90b19p ZFwiIGZpZWxkIik7DQotCQkJZWxzZSBpZiAobWFzay5pcHY0LT5oZHIubmV4dF9wcm90b19pZCkN Ci0JCQkJbmV4dF9wcm90b2NvbCA9DQotCQkJCQkoKGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVt X2lwdjQgKikNCi0JCQkJCSAoaXRlbXMtPnNwZWMpKS0+aGRyLm5leHRfcHJvdG9faWQ7DQotCQkJ aWYgKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJfVFVOTkVMKSB7DQotCQkJCWlmIChpbm5l cl9ldHlwZSAhPSBSVEVfQkUxNihFVEhfUF9BTEwpICYmDQotCQkJCSAgICBpbm5lcl9ldHlwZSAh PSBSVEVfQkUxNihFVEhfUF9JUCkpDQotCQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQot CQkJCQkJKGVycm9yLCBFSU5WQUwsDQotCQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwN Ci0JCQkJCQkgaXRlbXMsDQotCQkJCQkJICJpbm5lciBldGhfdHlwZSBjb25mbGljdCwiDQotCQkJ CQkJICIgSVB2NCBpcyByZXF1aXJlZCIpOw0KLQkJCQlpbm5lcl9ldHlwZSA9IFJURV9CRTE2KEVU SF9QX0lQKTsNCi0JCQl9IGVsc2UgaWYgKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJfT1VU RVJfVkxBTikgew0KLQkJCQlpZiAodmxhbl9ldHlwZSAhPSBSVEVfQkUxNihFVEhfUF9BTEwpICYm DQotCQkJCSAgICB2bGFuX2V0eXBlICE9IFJURV9CRTE2KEVUSF9QX0lQKSkNCi0JCQkJCXJldHVy biBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCQkoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCQkgUlRF X0ZMT1dfRVJST1JfVFlQRV9JVEVNLA0KLQkJCQkJCSBpdGVtcywNCi0JCQkJCQkgInZsYW4gZXRo X3R5cGUgY29uZmxpY3QsIg0KLQkJCQkJCSAiIElQdjQgaXMgcmVxdWlyZWQiKTsNCi0JCQkJdmxh bl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0lQKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlpZiAob3V0 ZXJfZXR5cGUgIT0gUlRFX0JFMTYoRVRIX1BfQUxMKSAmJg0KLQkJCQkgICAgb3V0ZXJfZXR5cGUg IT0gUlRFX0JFMTYoRVRIX1BfSVApKQ0KLQkJCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldA0K LQkJCQkJCShlcnJvciwgRUlOVkFMLA0KLQkJCQkJCSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0s DQotCQkJCQkJIGl0ZW1zLA0KLQkJCQkJCSAiZXRoX3R5cGUgY29uZmxpY3QsIg0KLQkJCQkJCSAi IElQdjQgaXMgcmVxdWlyZWQiKTsNCi0JCQkJb3V0ZXJfZXR5cGUgPSBSVEVfQkUxNihFVEhfUF9J UCk7DQotCQkJfQ0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfSVBWNjoN Ci0JCQlyZXQgPSBtbHg1X2Zsb3dfdmFsaWRhdGVfaXRlbV9pcHY2DQotCQkJCQkoaXRlbXMsIGl0 ZW1fZmxhZ3MsDQotCQkJCQkgJmZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLmlwdjYsIGVycm9yKTsN Ci0JCQlpZiAocmV0IDwgMCkNCi0JCQkJcmV0dXJuIHJldDsNCi0JCQlpdGVtX2ZsYWdzIHw9IChp dGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgPw0KLQkJCQkgICAgICBNTFg1X0ZM T1dfTEFZRVJfSU5ORVJfTDNfSVBWNiA6DQotCQkJCSAgICAgIE1MWDVfRkxPV19MQVlFUl9PVVRF Ul9MM19JUFY2Ow0KLQkJCW1hc2suaXB2NiA9IGZsb3dfdGNmX2l0ZW1fbWFzaw0KLQkJCQkoaXRl bXMsICZydGVfZmxvd19pdGVtX2lwdjZfbWFzaywNCi0JCQkJICZmbG93X3RjZl9tYXNrX3N1cHBv cnRlZC5pcHY2LA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfZW1wdHkuaXB2NiwNCi0JCQkJIHNpemVv ZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC5pcHY2KSwNCi0JCQkJIGVycm9yKTsNCi0JCQlpZiAo IW1hc2suaXB2NikNCi0JCQkJcmV0dXJuIC1ydGVfZXJybm87DQotCQkJaWYgKG1hc2suaXB2Ni0+ aGRyLnByb3RvICYmDQotCQkJICAgIG1hc2suaXB2Ni0+aGRyLnByb3RvICE9IDB4ZmYpDQotCQkJ CXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0JCQkJCShlcnJvciwgRU5PVFNVUCwNCi0JCQkJ CSBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU1fTUFTSywNCi0JCQkJCSBtYXNrLmlwdjYsDQotCQkJ CQkgIm5vIHN1cHBvcnQgZm9yIHBhcnRpYWwgbWFzayBvbiINCi0JCQkJCSAiIFwiaGRyLnByb3Rv XCIgZmllbGQiKTsNCi0JCQllbHNlIGlmIChtYXNrLmlwdjYtPmhkci5wcm90bykNCi0JCQkJbmV4 dF9wcm90b2NvbCA9DQotCQkJCQkoKGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjYgKikN Ci0JCQkJCSAoaXRlbXMtPnNwZWMpKS0+aGRyLnByb3RvOw0KLQkJCWlmIChpdGVtX2ZsYWdzICYg TUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgew0KLQkJCQlpZiAoaW5uZXJfZXR5cGUgIT0gUlRFX0JF MTYoRVRIX1BfQUxMKSAmJg0KLQkJCQkgICAgaW5uZXJfZXR5cGUgIT0gUlRFX0JFMTYoRVRIX1Bf SVBWNikpDQotCQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkJKGVycm9yLCBF SU5WQUwsDQotCQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwNCi0JCQkJCQkgaXRlbXMs DQotCQkJCQkJICJpbm5lciBldGhfdHlwZSBjb25mbGljdCwiDQotCQkJCQkJICIgSVB2NiBpcyBy ZXF1aXJlZCIpOw0KLQkJCQlpbm5lcl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0lQVjYpOw0KLQkJ CX0gZWxzZSBpZiAoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9WTEFOKSB7DQot CQkJCWlmICh2bGFuX2V0eXBlICE9IFJURV9CRTE2KEVUSF9QX0FMTCkgJiYNCi0JCQkJICAgIHZs YW5fZXR5cGUgIT0gUlRFX0JFMTYoRVRIX1BfSVBWNikpDQotCQkJCQlyZXR1cm4gcnRlX2Zsb3df ZXJyb3Jfc2V0DQotCQkJCQkJKGVycm9yLCBFSU5WQUwsDQotCQkJCQkJIFJURV9GTE9XX0VSUk9S X1RZUEVfSVRFTSwNCi0JCQkJCQkgaXRlbXMsDQotCQkJCQkJICJ2bGFuIGV0aF90eXBlIGNvbmZs aWN0LCINCi0JCQkJCQkgIiBJUHY2IGlzIHJlcXVpcmVkIik7DQotCQkJCXZsYW5fZXR5cGUgPSBS VEVfQkUxNihFVEhfUF9JUFY2KTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlpZiAob3V0ZXJfZXR5cGUg IT0gUlRFX0JFMTYoRVRIX1BfQUxMKSAmJg0KLQkJCQkgICAgb3V0ZXJfZXR5cGUgIT0gUlRFX0JF MTYoRVRIX1BfSVBWNikpDQotCQkJCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCQkJ KGVycm9yLCBFSU5WQUwsDQotCQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVfSVRFTSwNCi0JCQkJ CQkgaXRlbXMsDQotCQkJCQkJICJldGhfdHlwZSBjb25mbGljdCwiDQotCQkJCQkJICIgSVB2NiBp cyByZXF1aXJlZCIpOw0KLQkJCQlvdXRlcl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0lQVjYpOw0K LQkJCX0NCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1VEUDoNCi0JCQly ZXQgPSBtbHg1X2Zsb3dfdmFsaWRhdGVfaXRlbV91ZHAoaXRlbXMsIGl0ZW1fZmxhZ3MsDQotCQkJ CQkJCSAgbmV4dF9wcm90b2NvbCwgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAwKQ0KLQkJCQlyZXR1 cm4gcmV0Ow0KLQkJCWl0ZW1fZmxhZ3MgfD0gKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJf VFVOTkVMKSA/DQotCQkJCSAgICAgIE1MWDVfRkxPV19MQVlFUl9JTk5FUl9MNF9VRFAgOg0KLQkJ CQkgICAgICBNTFg1X0ZMT1dfTEFZRVJfT1VURVJfTDRfVURQOw0KLQkJCW1hc2sudWRwID0gZmxv d190Y2ZfaXRlbV9tYXNrDQotCQkJCShpdGVtcywgJnJ0ZV9mbG93X2l0ZW1fdWRwX21hc2ssDQot CQkJCSAmZmxvd190Y2ZfbWFza19zdXBwb3J0ZWQudWRwLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tf ZW1wdHkudWRwLA0KLQkJCQkgc2l6ZW9mKGZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLnVkcCksDQot CQkJCSBlcnJvcik7DQotCQkJaWYgKCFtYXNrLnVkcCkNCi0JCQkJcmV0dXJuIC1ydGVfZXJybm87 DQotCQkJLyoNCi0JCQkgKiBTYXZlIHRoZSBwcmVzdW1lZCBvdXRlciBVRFAgaXRlbSBmb3IgZXh0 cmEgY2hlY2sNCi0JCQkgKiBpZiB0aGUgdHVubmVsIGl0ZW0gd2lsbCBiZSBmb3VuZCBsYXRlciBp biB0aGUgbGlzdC4NCi0JCQkgKi8NCi0JCQlpZiAoIShpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xB WUVSX1RVTk5FTCkpDQotCQkJCW91dGVyX3VkcCA9IGl0ZW1zOw0KLQkJCWJyZWFrOw0KLQkJY2Fz ZSBSVEVfRkxPV19JVEVNX1RZUEVfVENQOg0KLQkJCXJldCA9IG1seDVfZmxvd192YWxpZGF0ZV9p dGVtX3RjcA0KLQkJCQkJICAgICAoaXRlbXMsIGl0ZW1fZmxhZ3MsDQotCQkJCQkgICAgICBuZXh0 X3Byb3RvY29sLA0KLQkJCQkJICAgICAgJmZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLnRjcCwNCi0J CQkJCSAgICAgIGVycm9yKTsNCi0JCQlpZiAocmV0IDwgMCkNCi0JCQkJcmV0dXJuIHJldDsNCi0J CQlpdGVtX2ZsYWdzIHw9IChpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgPw0K LQkJCQkgICAgICBNTFg1X0ZMT1dfTEFZRVJfSU5ORVJfTDRfVENQIDoNCi0JCQkJICAgICAgTUxY NV9GTE9XX0xBWUVSX09VVEVSX0w0X1RDUDsNCi0JCQltYXNrLnRjcCA9IGZsb3dfdGNmX2l0ZW1f bWFzaw0KLQkJCQkoaXRlbXMsICZydGVfZmxvd19pdGVtX3RjcF9tYXNrLA0KLQkJCQkgJmZsb3df dGNmX21hc2tfc3VwcG9ydGVkLnRjcCwNCi0JCQkJICZmbG93X3RjZl9tYXNrX2VtcHR5LnRjcCwN Ci0JCQkJIHNpemVvZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC50Y3ApLA0KLQkJCQkgZXJyb3Ip Ow0KLQkJCWlmICghbWFzay50Y3ApDQotCQkJCXJldHVybiAtcnRlX2Vycm5vOw0KLQkJCWJyZWFr Ow0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfVlhMQU46DQotCQkJaWYgKGl0ZW1fZmxhZ3Mg JiBNTFg1X0ZMT1dfTEFZRVJfT1VURVJfVkxBTikNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9y X3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZUEVf SVRFTSwgaXRlbXMsDQotCQkJCQkgInZ4bGFuIHR1bm5lbCBvdmVyIHZsYW4iDQotCQkJCQkgIiBp cyBub3Qgc3VwcG9ydGVkIik7DQotCQkJcmV0ID0gbWx4NV9mbG93X3ZhbGlkYXRlX2l0ZW1fdnhs YW4oaXRlbXMsDQotCQkJCQkJCSAgICBpdGVtX2ZsYWdzLCBlcnJvcik7DQotCQkJaWYgKHJldCA8 IDApDQotCQkJCXJldHVybiByZXQ7DQotCQkJaXRlbV9mbGFncyB8PSBNTFg1X0ZMT1dfTEFZRVJf VlhMQU47DQotCQkJbWFzay52eGxhbiA9IGZsb3dfdGNmX2l0ZW1fbWFzaw0KLQkJCQkoaXRlbXMs ICZydGVfZmxvd19pdGVtX3Z4bGFuX21hc2ssDQotCQkJCSAmZmxvd190Y2ZfbWFza19zdXBwb3J0 ZWQudnhsYW4sDQotCQkJCSAmZmxvd190Y2ZfbWFza19lbXB0eS52eGxhbiwNCi0JCQkJIHNpemVv ZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC52eGxhbiksIGVycm9yKTsNCi0JCQlpZiAoIW1hc2su dnhsYW4pDQotCQkJCXJldHVybiAtcnRlX2Vycm5vOw0KLQkJCWlmIChtYXNrLnZ4bGFuLT52bmlb MF0gIT0gMHhmZiB8fA0KLQkJCSAgICBtYXNrLnZ4bGFuLT52bmlbMV0gIT0gMHhmZiB8fA0KLQkJ CSAgICBtYXNrLnZ4bGFuLT52bmlbMl0gIT0gMHhmZikNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vy cm9yX3NldA0KLQkJCQkJKGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJIFJURV9GTE9XX0VSUk9SX1RZ UEVfSVRFTV9NQVNLLA0KLQkJCQkJIG1hc2sudnhsYW4sDQotCQkJCQkgIm5vIHN1cHBvcnQgZm9y IHBhcnRpYWwgb3IgIg0KLQkJCQkJICJlbXB0eSBtYXNrIG9uIFwidnhsYW4udm5pXCIgZmllbGQi KTsNCi0JCQkvKg0KLQkJCSAqIFRoZSBWTkkgaXRlbSBhc3N1bWVzIHRoZSBWWExBTiB0dW5uZWws IGl0IHJlcXVpcmVzDQotCQkJICogYXQgbGVhc3QgdGhlIG91dGVyIGRlc3RpbmF0aW9uIFVEUCBw b3J0IG11c3QgYmUNCi0JCQkgKiBzcGVjaWZpZWQgd2l0aG91dCB3aWxkY2FyZHMgdG8gYWxsb3cg a2VybmVsIHNlbGVjdA0KLQkJCSAqIHRoZSB2aXJ0dWFsIFZYTEFOIGRldmljZSBieSBwb3J0LiBB bHNvIG91dGVyIElQdjQNCi0JCQkgKiBvciBJUHY2IGl0ZW0gbXVzdCBiZSBzcGVjaWZpZWQgKHdp bGNhcmRzIG9yIGV2ZW4NCi0JCQkgKiB6ZXJvIG1hc2sgYXJlIGFsbG93ZWQpIHRvIGxldCBkcml2 ZXIga25vdyB0aGUgdHVubmVsDQotCQkJICogSVAgdmVyc2lvbiBhbmQgcHJvY2VzcyBVRFAgdHJh ZmZpYyBjb3JyZWN0bHkuDQotCQkJICovDQotCQkJaWYgKCEoaXRlbV9mbGFncyAmDQotCQkJICAg ICAoTUxYNV9GTE9XX0xBWUVSX09VVEVSX0wzX0lQVjQgfA0KLQkJCSAgICAgIE1MWDVfRkxPV19M QVlFUl9PVVRFUl9MM19JUFY2KSkpDQotCQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQNCi0J CQkJCQkgKGVycm9yLCBFSU5WQUwsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElP TiwNCi0JCQkJCQkgIE5VTEwsDQotCQkJCQkJICAibm8gb3V0ZXIgSVAgcGF0dGVybiBmb3VuZCIN Ci0JCQkJCQkgICIgZm9yIHZ4bGFuIHR1bm5lbCIpOw0KLQkJCWlmICghKGl0ZW1fZmxhZ3MgJiBN TFg1X0ZMT1dfTEFZRVJfT1VURVJfTDRfVURQKSkNCi0JCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9y X3NldA0KLQkJCQkJCSAoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZ UEVfQUNUSU9OLA0KLQkJCQkJCSAgTlVMTCwNCi0JCQkJCQkgICJubyBvdXRlciBVRFAgcGF0dGVy biBmb3VuZCINCi0JCQkJCQkgICIgZm9yIHZ4bGFuIHR1bm5lbCIpOw0KLQkJCS8qDQotCQkJICog QWxsIGl0ZW1zIHByZWNlZGluZyB0aGUgdHVubmVsIGl0ZW0gYmVjb21lIG91dGVyDQotCQkJICog b25lcyBhbmQgd2Ugc2hvdWxkIGRvIGV4dHJhIHZhbGlkYXRpb24gZm9yIHRoZW0NCi0JCQkgKiBk dWUgdG8gdGMgbGltaXRhdGlvbnMgZm9yIHR1bm5lbCBvdXRlciBwYXJhbWV0ZXJzLg0KLQkJCSAq IEN1cnJlbnRseSBvbmx5IG91dGVyIFVEUCBpdGVtIHJlcXVyZXMgZXh0cmEgY2hlY2ssDQotCQkJ ICogdXNlIHRoZSBzYXZlZCBwb2ludGVyIGluc3RlYWQgb2YgaXRlbSBsaXN0IHJlc2Nhbi4NCi0J CQkgKi8NCi0JCQlhc3NlcnQob3V0ZXJfdWRwKTsNCi0JCQlyZXQgPSBmbG93X3RjZl92YWxpZGF0 ZV92eGxhbl9kZWNhcF91ZHANCi0JCQkJCQkob3V0ZXJfdWRwLCBlcnJvcik7DQotCQkJaWYgKHJl dCA8IDApDQotCQkJCXJldHVybiByZXQ7DQotCQkJLyogUmVzZXQgTDQgcHJvdG9jb2wgZm9yIGlu bmVyIHBhcmFtZXRlcnMuICovDQotCQkJbmV4dF9wcm90b2NvbCA9IDB4ZmY7DQotCQkJYnJlYWs7 DQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RT VVAsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sDQotCQkJCQkJICBpdGVtcywg Iml0ZW0gbm90IHN1cHBvcnRlZCIpOw0KLQkJfQ0KLQl9DQotCWlmICgoYWN0aW9uX2ZsYWdzICYg TUxYNV9UQ0ZfUEVESVRfQUNUSU9OUykgJiYNCi0JICAgIChhY3Rpb25fZmxhZ3MgJiBNTFg1X0ZM T1dfQUNUSU9OX0RST1ApKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5P VFNVUCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sDQotCQkJCQkgIGFjdGlv bnMsDQotCQkJCQkgICJzZXQgYWN0aW9uIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggIg0KLQkJCQkJ ICAiZHJvcCBhY3Rpb24iKTsNCi0JaWYgKChhY3Rpb25fZmxhZ3MgJiBNTFg1X1RDRl9QRURJVF9B Q1RJT05TKSAmJg0KLQkgICAgIShhY3Rpb25fZmxhZ3MgJiBNTFg1X0ZMT1dfQUNUSU9OX1BPUlRf SUQpKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJ CSAgUlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sDQotCQkJCQkgIGFjdGlvbnMsDQotCQkJCQkg ICJzZXQgYWN0aW9uIG11c3QgYmUgZm9sbG93ZWQgYnkgIg0KLQkJCQkJICAicG9ydF9pZCBhY3Rp b24iKTsNCi0JaWYgKGFjdGlvbl9mbGFncyAmDQotCSAgIChNTFg1X0ZMT1dfQUNUSU9OX1NFVF9J UFY0X1NSQyB8IE1MWDVfRkxPV19BQ1RJT05fU0VUX0lQVjRfRFNUKSkgew0KLQkJaWYgKCEoaXRl bV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MM19JUFY0KSkNCi0JCQlyZXR1cm4gcnRl X2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9U WVBFX0FDVElPTiwNCi0JCQkJCQkgIGFjdGlvbnMsDQotCQkJCQkJICAibm8gaXB2NCBpdGVtIGZv dW5kIGluIg0KLQkJCQkJCSAgIiBwYXR0ZXJuIik7DQotCX0NCi0JaWYgKGFjdGlvbl9mbGFncyAm DQotCSAgIChNTFg1X0ZMT1dfQUNUSU9OX1NFVF9JUFY2X1NSQyB8IE1MWDVfRkxPV19BQ1RJT05f U0VUX0lQVjZfRFNUKSkgew0KLQkJaWYgKCEoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9P VVRFUl9MM19JUFY2KSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5W QUwsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJCQkgIGFjdGlv bnMsDQotCQkJCQkJICAibm8gaXB2NiBpdGVtIGZvdW5kIGluIg0KLQkJCQkJCSAgIiBwYXR0ZXJu Iik7DQotCX0NCi0JaWYgKGFjdGlvbl9mbGFncyAmDQotCSAgIChNTFg1X0ZMT1dfQUNUSU9OX1NF VF9UUF9TUkMgfCBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9UUF9EU1QpKSB7DQotCQlpZiAoIShpdGVt X2ZsYWdzICYNCi0JCSAgICAgKE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MNF9VRFAgfA0KLQkJICAg ICAgTUxYNV9GTE9XX0xBWUVSX09VVEVSX0w0X1RDUCkpKQ0KLQkJCXJldHVybiBydGVfZmxvd19l cnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNU SU9OLA0KLQkJCQkJCSAgYWN0aW9ucywNCi0JCQkJCQkgICJubyBUQ1AvVURQIGl0ZW0gZm91bmQg aW4iDQotCQkJCQkJICAiIHBhdHRlcm4iKTsNCi0JfQ0KLQkvKg0KLQkgKiBGVyBzeW5kcm9tZSAo MHhBOUMwOTApOg0KLQkgKiAgICAgc2V0X2Zsb3dfdGFibGVfZW50cnk6IHB1c2ggdmxhbiBhY3Rp b24gZnRlIGluIGZkYiBjYW4gT05MWSBiZQ0KLQkgKiAgICAgZm9yd2FyZCB0byB0aGUgdXBsaW5r Lg0KLQkgKi8NCi0JaWYgKChhY3Rpb25fZmxhZ3MgJiBNTFg1X0ZMT1dfQUNUSU9OX09GX1BVU0hf VkxBTikgJiYNCi0JICAgIChhY3Rpb25fZmxhZ3MgJiBNTFg1X0ZMT1dfQUNUSU9OX1BPUlRfSUQp ICYmDQotCSAgICAoKHN0cnVjdCBtbHg1X3ByaXYgKilwb3J0X2lkX2Rldi0+ZGF0YS0+ZGV2X3By aXZhdGUpLT5yZXByZXNlbnRvcikNCi0JCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3Is IEVOT1RTVVAsDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLCBhY3Rpb25zLA0K LQkJCQkJICAidmxhbiBwdXNoIGNhbiBvbmx5IGJlIGFwcGxpZWQiDQotCQkJCQkgICIgd2hlbiBm b3J3YXJkaW5nIHRvIHVwbGluayBwb3J0Iik7DQotCS8qDQotCSAqIEZXIHN5bmRyb21lICgweDI5 NDYwOSk6DQotCSAqICAgICBzZXRfZmxvd190YWJsZV9lbnRyeTogbW9kaWZ5L3BvcC9wdXNoIGFj dGlvbnMgaW4gZmRiIGZsb3cgdGFibGUNCi0JICogICAgIGFyZSBzdXBwb3J0ZWQgb25seSB3aGls ZSBmb3J3YXJkaW5nIHRvIHZwb3J0Lg0KLQkgKi8NCi0JaWYgKChhY3Rpb25fZmxhZ3MgJiBNTFg1 X1RDRl9WTEFOX0FDVElPTlMpICYmDQotCSAgICAhKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19B Q1RJT05fUE9SVF9JRCkpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9U U1VQLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwgYWN0aW9ucywNCi0JCQkJ CSAgInZsYW4gYWN0aW9ucyBhcmUgc3VwcG9ydGVkIg0KLQkJCQkJICAiIG9ubHkgd2l0aCBwb3J0 X2lkIGFjdGlvbiIpOw0KLQlpZiAoKGFjdGlvbl9mbGFncyAmIE1MWDVfVENGX1ZYTEFOX0FDVElP TlMpICYmDQotCSAgICAhKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19BQ1RJT05fUE9SVF9JRCkp DQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJICBS VEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwgTlVMTCwNCi0JCQkJCSAgInZ4bGFuIGFjdGlvbnMg YXJlIHN1cHBvcnRlZCINCi0JCQkJCSAgIiBvbmx5IHdpdGggcG9ydF9pZCBhY3Rpb24iKTsNCi0J aWYgKCEoYWN0aW9uX2ZsYWdzICYgTUxYNV9UQ0ZfRkFURV9BQ1RJT05TKSkNCi0JCXJldHVybiBy dGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJCSAgUlRFX0ZMT1dfRVJST1Jf VFlQRV9BQ1RJT04sIGFjdGlvbnMsDQotCQkJCQkgICJubyBmYXRlIGFjdGlvbiBpcyBmb3VuZCIp Ow0KLQlpZiAoYWN0aW9uX2ZsYWdzICYNCi0JICAgKE1MWDVfRkxPV19BQ1RJT05fU0VUX1RUTCB8 IE1MWDVfRkxPV19BQ1RJT05fREVDX1RUTCkpIHsNCi0JCWlmICghKGl0ZW1fZmxhZ3MgJg0KLQkJ ICAgICAoTUxYNV9GTE9XX0xBWUVSX09VVEVSX0wzX0lQVjQgfA0KLQkJICAgICAgTUxYNV9GTE9X X0xBWUVSX09VVEVSX0wzX0lQVjYpKSkNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBFSU5WQUwsDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJ CQkgIGFjdGlvbnMsDQotCQkJCQkJICAibm8gSVAgZm91bmQgaW4gcGF0dGVybiIpOw0KLQl9DQot CWlmIChhY3Rpb25fZmxhZ3MgJg0KLQkgICAgKE1MWDVfRkxPV19BQ1RJT05fU0VUX01BQ19TUkMg fCBNTFg1X0ZMT1dfQUNUSU9OX1NFVF9NQUNfRFNUKSkgew0KLQkJaWYgKCEoaXRlbV9mbGFncyAm IE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MMikpDQotCQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3Nl dChlcnJvciwgRU5PVFNVUCwNCi0JCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLA0K LQkJCQkJCSAgYWN0aW9ucywNCi0JCQkJCQkgICJubyBldGhlcm5ldCBmb3VuZCBpbiINCi0JCQkJ CQkgICIgcGF0dGVybiIpOw0KLQl9DQotCWlmICgoYWN0aW9uX2ZsYWdzICYgTUxYNV9GTE9XX0FD VElPTl9WWExBTl9ERUNBUCkgJiYNCi0JICAgICEoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlF Ul9WWExBTikpDQotCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFSU5WQUwsDQot CQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZUEVfQUNUSU9OLA0KLQkJCQkJICBOVUxMLA0KLQkJCQkJ ICAibm8gVk5JIHBhdHRlcm4gZm91bmQiDQotCQkJCQkgICIgZm9yIHZ4bGFuIGRlY2FwIGFjdGlv biIpOw0KLQlpZiAoKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19BQ1RJT05fVlhMQU5fRU5DQVAp ICYmDQotCSAgICAoaXRlbV9mbGFncyAmIE1MWDVfRkxPV19MQVlFUl9UVU5ORUwpKQ0KLQkJcmV0 dXJuIHJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRUlOVkFMLA0KLQkJCQkJICBSVEVfRkxPV19F UlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJCSAgTlVMTCwNCi0JCQkJCSAgInZ4bGFuIGVuY2FwIG5v dCBzdXBwb3J0ZWQiDQotCQkJCQkgICIgZm9yIHR1bm5lbGVkIHRyYWZmaWMiKTsNCi0JcmV0dXJu IDA7DQotfQ0KLQ0KLS8qKg0KLSAqIENhbGN1bGF0ZSBtYXhpbXVtIHNpemUgb2YgbWVtb3J5IGZv ciBmbG93IGl0ZW1zIG9mIExpbnV4IFRDIGZsb3dlci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gYXR0 cg0KLSAqICAgUG9pbnRlciB0byB0aGUgZmxvdyBhdHRyaWJ1dGVzLg0KLSAqIEBwYXJhbVtpbl0g aXRlbXMNCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGxpc3Qgb2YgaXRlbXMuDQotICogQHBhcmFtW291 dF0gYWN0aW9uX2ZsYWdzDQotICogICBQb2ludGVyIHRvIHRoZSBkZXRlY3RlZCBhY3Rpb25zLg0K LSAqDQotICogQHJldHVybg0KLSAqICAgTWF4aW11bSBzaXplIG9mIG1lbW9yeSBmb3IgaXRlbXMu DQotICovDQotc3RhdGljIGludA0KLWZsb3dfdGNmX2dldF9pdGVtc19zaXplKGNvbnN0IHN0cnVj dCBydGVfZmxvd19hdHRyICphdHRyLA0KLQkJCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtIGl0 ZW1zW10sDQotCQkJdWludDY0X3QgKmFjdGlvbl9mbGFncykNCi17DQotCWludCBzaXplID0gMDsN Ci0NCi0Jc2l6ZSArPSBTWl9OTEFUVFJfU1RSWl9PRigiZmxvd2VyIikgKw0KLQkJU1pfTkxBVFRS X1RZUEVfT0YodWludDE2X3QpICsgLyogT3V0ZXIgZXRoZXIgdHlwZS4gKi8NCi0JCVNaX05MQVRU Ul9ORVNUICsgLyogVENBX09QVElPTlMuICovDQotCQlTWl9OTEFUVFJfVFlQRV9PRih1aW50MzJf dCk7IC8qIFRDQV9DTFNfRkxBR1NfU0tJUF9TVy4gKi8NCi0JaWYgKGF0dHItPmdyb3VwID4gMCkN Ci0JCXNpemUgKz0gU1pfTkxBVFRSX1RZUEVfT0YodWludDMyX3QpOyAvKiBUQ0FfQ0hBSU4uICov DQotCWZvciAoOyBpdGVtcy0+dHlwZSAhPSBSVEVfRkxPV19JVEVNX1RZUEVfRU5EOyBpdGVtcysr KSB7DQotCQlzd2l0Y2ggKGl0ZW1zLT50eXBlKSB7DQotCQljYXNlIFJURV9GTE9XX0lURU1fVFlQ RV9WT0lEOg0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfUE9SVF9JRDoN Ci0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX0VUSDoNCi0JCQlzaXplICs9 IFNaX05MQVRUUl9EQVRBX09GKEVUSEVSX0FERFJfTEVOKSAqIDQ7DQotCQkJCS8qIGRzdC9zcmMg TUFDIGFkZHIgYW5kIG1hc2suICovDQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0lURU1f VFlQRV9WTEFOOg0KLQkJCXNpemUgKz0JU1pfTkxBVFRSX1RZUEVfT0YodWludDE2X3QpICsNCi0J CQkJLyogVkxBTiBFdGhlciB0eXBlLiAqLw0KLQkJCQlTWl9OTEFUVFJfVFlQRV9PRih1aW50OF90 KSArIC8qIFZMQU4gcHJpby4gKi8NCi0JCQkJU1pfTkxBVFRSX1RZUEVfT0YodWludDE2X3QpOyAv KiBWTEFOIElELiAqLw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfSVBW NDogew0KLQkJCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjQgKmlwdjQgPSBpdGVtcy0+ bWFzazsNCi0NCi0JCQlzaXplICs9CVNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICsgLyogSVAg cHJvdG8uICovDQotCQkJCVNaX05MQVRUUl9UWVBFX09GKHVpbnQzMl90KSAqIDQ7DQotCQkJCS8q IGRzdC9zcmMgSVAgYWRkciBhbmQgbWFzay4gKi8NCi0JCQlpZiAoaXB2NCAmJiBpcHY0LT5oZHIu dGltZV90b19saXZlKQ0KLQkJCQlzaXplICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICog MjsNCi0JCQlpZiAoaXB2NCAmJiBpcHY0LT5oZHIudHlwZV9vZl9zZXJ2aWNlKQ0KLQkJCQlzaXpl ICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICogMjsNCi0JCQlicmVhazsNCi0JCX0NCi0J CWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX0lQVjY6IHsNCi0JCQljb25zdCBzdHJ1Y3QgcnRlX2Zs b3dfaXRlbV9pcHY2ICppcHY2ID0gaXRlbXMtPm1hc2s7DQotDQotCQkJc2l6ZSArPQlTWl9OTEFU VFJfVFlQRV9PRih1aW50OF90KSArIC8qIElQIHByb3RvLiAqLw0KLQkJCQlTWl9OTEFUVFJfREFU QV9PRihJUFY2X0FERFJfTEVOKSAqIDQ7DQotCQkJCS8qIGRzdC9zcmMgSVAgYWRkciBhbmQgbWFz ay4gKi8NCi0JCQlpZiAoaXB2NiAmJiBpcHY2LT5oZHIuaG9wX2xpbWl0cykNCi0JCQkJc2l6ZSAr PSBTWl9OTEFUVFJfVFlQRV9PRih1aW50OF90KSAqIDI7DQotCQkJaWYgKGlwdjYgJiYgKHJ0ZV9i ZV90b19jcHVfMzIoaXB2Ni0+aGRyLnZ0Y19mbG93KSAmDQotCQkJCSAgICAgKDB4ZmZ1bCA8PCBJ UFY2X0hEUl9UQ19TSElGVCkpKQ0KLQkJCQlzaXplICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4 X3QpICogMjsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1VE UDoNCi0JCQlzaXplICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICsgLyogSVAgcHJvdG8u ICovDQotCQkJCVNaX05MQVRUUl9UWVBFX09GKHVpbnQxNl90KSAqIDQ7DQotCQkJCS8qIGRzdC9z cmMgcG9ydCBhbmQgbWFzay4gKi8NCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9U WVBFX1RDUDoNCi0JCQlzaXplICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICsgLyogSVAg cHJvdG8uICovDQotCQkJCVNaX05MQVRUUl9UWVBFX09GKHVpbnQxNl90KSAqIDQ7DQotCQkJCS8q IGRzdC9zcmMgcG9ydCBhbmQgbWFzay4gKi8NCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1df SVRFTV9UWVBFX1ZYTEFOOg0KLQkJCXNpemUgKz0gU1pfTkxBVFRSX1RZUEVfT0YodWludDMyX3Qp Ow0KLQkJCS8qDQotCQkJICogVGhlcmUgbWlnaHQgYmUgbm8gVlhMQU4gZGVjYXAgYWN0aW9uIGlu IHRoZSBhY3Rpb24NCi0JCQkgKiBsaXN0LCBub25ldGhlbGVzcyB0aGUgVlhMQU4gdHVubmVsIGZs b3cgcmVxdWlyZXMNCi0JCQkgKiB0aGUgZGVjYXAgc3RydWN0dXJlIHRvIGJlIGNvcnJlY3RseSBh cHBsaWVkIHRvDQotCQkJICogVlhMQU4gZGV2aWNlLCBzZXQgdGhlIGZsYWcgdG8gY3JlYXRlIHRo ZSBzdHJ1Y3R1cmUuDQotCQkJICogVHJhbnNsYXRpb24gcm91dGluZSB3aWxsIG5vdCBwdXQgdGhl IGRlY2FwIGFjdGlvbg0KLQkJCSAqIGluIHRuZSBOZXRsaW5rIG1lc3NhZ2UgaWYgdGhlcmUgaXMg bm8gYWN0dWFsIGFjdGlvbg0KLQkJCSAqIGluIHRoZSBsaXN0Lg0KLQkJCSAqLw0KLQkJCSphY3Rp b25fZmxhZ3MgfD0gTUxYNV9GTE9XX0FDVElPTl9WWExBTl9ERUNBUDsNCi0JCQlicmVhazsNCi0J CWRlZmF1bHQ6DQotCQkJRFJWX0xPRyhXQVJOSU5HLA0KLQkJCQkidW5zdXBwb3J0ZWQgaXRlbSAl cCB0eXBlICVkLCINCi0JCQkJIiBpdGVtcyBtdXN0IGJlIHZhbGlkYXRlZCBiZWZvcmUgZmxvdyBj cmVhdGlvbiIsDQotCQkJCShjb25zdCB2b2lkICopaXRlbXMsIGl0ZW1zLT50eXBlKTsNCi0JCQli cmVhazsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gc2l6ZTsNCi19DQotDQotLyoqDQotICogQ2FsY3Vs YXRlIHNpemUgb2YgbWVtb3J5IHRvIHN0b3JlIHRoZSBWWExBTiBlbmNhcHN1bHRpb24NCi0gKiBy ZWxhdGVkIGl0ZW1zIGluIHRoZSBOZXRsaW5rIG1lc3NhZ2UgYnVmZmVyLiBJdGVtcyBsaXN0DQot ICogaXMgc3BlY2lmaWVkIGJ5IFJURV9GTE9XX0FDVElPTl9UWVBFX1ZYTEFOX0VOQ0FQIGFjdGlv bi4NCi0gKiBUaGUgaXRlbSBsaXN0IHNob3VsZCBiZSB2YWxpZGF0ZWQuDQotICoNCi0gKiBAcGFy YW1baW5dIGFjdGlvbg0KLSAqICAgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfVlhMQU5fRU5DQVAgYWN0 aW9uIG9iamVjdC4NCi0gKiAgIExpc3Qgb2YgcGF0dGVybiBpdGVtcyB0byBzY2FuIGRhdGEgZnJv bS4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIFRoZSBzaXplIHRoZSBwYXJ0IG9mIE5ldGxpbmsg bWVzc2FnZSBidWZmZXIgdG8gc3RvcmUgdGhlDQotICogICBWWExBTiBlbmNhcHN1bGF0aW9uIGl0 ZW0gYXR0cmlidXRlcy4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfdnhsYW5fZW5jYXBf c2l6ZShjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uICphY3Rpb24pDQotew0KLQljb25zdCBz dHJ1Y3QgcnRlX2Zsb3dfaXRlbSAqaXRlbXM7DQotCWludCBzaXplID0gMDsNCi0NCi0JYXNzZXJ0 KGFjdGlvbi0+dHlwZSA9PSBSVEVfRkxPV19BQ1RJT05fVFlQRV9WWExBTl9FTkNBUCk7DQotCWFz c2VydChhY3Rpb24tPmNvbmYpOw0KLQ0KLQlpdGVtcyA9ICgoY29uc3Qgc3RydWN0IHJ0ZV9mbG93 X2FjdGlvbl92eGxhbl9lbmNhcCAqKQ0KLQkJCQkJYWN0aW9uLT5jb25mKS0+ZGVmaW5pdGlvbjsN Ci0JYXNzZXJ0KGl0ZW1zKTsNCi0JZm9yICg7IGl0ZW1zLT50eXBlICE9IFJURV9GTE9XX0lURU1f VFlQRV9FTkQ7IGl0ZW1zKyspIHsNCi0JCXN3aXRjaCAoaXRlbXMtPnR5cGUpIHsNCi0JCWNhc2Ug UlRFX0ZMT1dfSVRFTV9UWVBFX1ZPSUQ6DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0lU RU1fVFlQRV9FVEg6DQotCQkJLyogVGhpcyBpdGVtIGRvZXMgbm90IHJlcXVpcmUgbWVzc2FnZSBi dWZmZXIuICovDQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0lURU1fVFlQRV9JUFY0OiB7 DQotCQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2NCAqaXB2NCA9IGl0ZW1zLT5tYXNr Ow0KLQ0KLQkJCXNpemUgKz0gU1pfTkxBVFRSX0RBVEFfT0YoSVBWNF9BRERSX0xFTikgKiAyOw0K LQkJCWlmIChpcHY0ICYmIGlwdjQtPmhkci50aW1lX3RvX2xpdmUpDQotCQkJCXNpemUgKz0gU1pf TkxBVFRSX1RZUEVfT0YodWludDhfdCkgKiAyOw0KLQkJCWlmIChpcHY0ICYmIGlwdjQtPmhkci50 eXBlX29mX3NlcnZpY2UpDQotCQkJCXNpemUgKz0gU1pfTkxBVFRSX1RZUEVfT0YodWludDhfdCkg KiAyOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfSVBWNjog ew0KLQkJCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2lwdjYgKmlwdjYgPSBpdGVtcy0+bWFz azsNCi0NCi0JCQlzaXplICs9IFNaX05MQVRUUl9EQVRBX09GKElQVjZfQUREUl9MRU4pICogMjsN Ci0JCQlpZiAoaXB2NiAmJiBpcHY2LT5oZHIuaG9wX2xpbWl0cykNCi0JCQkJc2l6ZSArPSBTWl9O TEFUVFJfVFlQRV9PRih1aW50OF90KSAqIDI7DQotCQkJaWYgKGlwdjYgJiYgKHJ0ZV9iZV90b19j cHVfMzIoaXB2Ni0+aGRyLnZ0Y19mbG93KSAmDQotCQkJCSAgICAgKDB4ZmZ1bCA8PCBJUFY2X0hE Ul9UQ19TSElGVCkpKQ0KLQkJCQlzaXplICs9IFNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpICog MjsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1VEUDogew0K LQkJCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3VkcCAqdWRwID0gaXRlbXMtPm1hc2s7DQot DQotCQkJc2l6ZSArPSBTWl9OTEFUVFJfVFlQRV9PRih1aW50MTZfdCk7DQotCQkJaWYgKCF1ZHAg fHwgdWRwLT5oZHIuc3JjX3BvcnQgIT0gUlRFX0JFMTYoMHgwMDAwKSkNCi0JCQkJc2l6ZSArPSBT Wl9OTEFUVFJfVFlQRV9PRih1aW50MTZfdCk7DQotCQkJYnJlYWs7DQotCQl9DQotCQljYXNlIFJU RV9GTE9XX0lURU1fVFlQRV9WWExBTjoNCi0JCQlzaXplICs9CVNaX05MQVRUUl9UWVBFX09GKHVp bnQzMl90KTsNCi0JCQlicmVhazsNCi0JCWRlZmF1bHQ6DQotCQkJYXNzZXJ0KGZhbHNlKTsNCi0J CQlEUlZfTE9HKFdBUk5JTkcsDQotCQkJCSJ1bnN1cHBvcnRlZCBpdGVtICVwIHR5cGUgJWQsIg0K LQkJCQkiIGl0ZW1zIG11c3QgYmUgdmFsaWRhdGVkIg0KLQkJCQkiIGJlZm9yZSBmbG93IGNyZWF0 aW9uIiwNCi0JCQkJKGNvbnN0IHZvaWQgKilpdGVtcywgaXRlbXMtPnR5cGUpOw0KLQkJCXJldHVy biAwOw0KLQkJfQ0KLQl9DQotCXJldHVybiBzaXplOw0KLX0NCi0NCi0vKioNCi0gKiBDYWxjdWxh dGUgbWF4aW11bSBzaXplIG9mIG1lbW9yeSBmb3IgZmxvdyBhY3Rpb25zIG9mIExpbnV4IFRDIGZs b3dlciBhbmQNCi0gKiBleHRyYWN0IHNwZWNpZmllZCBhY3Rpb25zLg0KLSAqDQotICogQHBhcmFt W2luXSBhY3Rpb25zDQotICogICBQb2ludGVyIHRvIHRoZSBsaXN0IG9mIGFjdGlvbnMuDQotICog QHBhcmFtW291dF0gYWN0aW9uX2ZsYWdzDQotICogICBQb2ludGVyIHRvIHRoZSBkZXRlY3RlZCBh Y3Rpb25zLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgTWF4aW11bSBzaXplIG9mIG1lbW9yeSBm b3IgYWN0aW9ucy4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfZ2V0X2FjdGlvbnNfYW5k X3NpemUoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiBhY3Rpb25zW10sDQotCQkJICAgICAg dWludDY0X3QgKmFjdGlvbl9mbGFncykNCi17DQotCWludCBzaXplID0gMDsNCi0JdWludDY0X3Qg ZmxhZ3MgPSAqYWN0aW9uX2ZsYWdzOw0KLQ0KLQlzaXplICs9IFNaX05MQVRUUl9ORVNUOyAvKiBU Q0FfRkxPV0VSX0FDVC4gKi8NCi0JZm9yICg7IGFjdGlvbnMtPnR5cGUgIT0gUlRFX0ZMT1dfQUNU SU9OX1RZUEVfRU5EOyBhY3Rpb25zKyspIHsNCi0JCXN3aXRjaCAoYWN0aW9ucy0+dHlwZSkgew0K LQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9WT0lEOg0KLQkJCWJyZWFrOw0KLQkJY2FzZSBS VEVfRkxPV19BQ1RJT05fVFlQRV9QT1JUX0lEOg0KLQkJCXNpemUgKz0gU1pfTkxBVFRSX05FU1Qg KyAvKiBuYV9hY3RfaW5kZXguICovDQotCQkJCVNaX05MQVRUUl9TVFJaX09GKCJtaXJyZWQiKSAr DQotCQkJCVNaX05MQVRUUl9ORVNUICsgLyogVENBX0FDVF9PUFRJT05TLiAqLw0KLQkJCQlTWl9O TEFUVFJfVFlQRV9PRihzdHJ1Y3QgdGNfbWlycmVkKTsNCi0JCQlmbGFncyB8PSBNTFg1X0ZMT1df QUNUSU9OX1BPUlRfSUQ7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBF X0pVTVA6DQotCQkJc2l6ZSArPSBTWl9OTEFUVFJfTkVTVCArIC8qIG5hX2FjdF9pbmRleC4gKi8N Ci0JCQkJU1pfTkxBVFRSX1NUUlpfT0YoImdhY3QiKSArDQotCQkJCVNaX05MQVRUUl9ORVNUICsg LyogVENBX0FDVF9PUFRJT05TLiAqLw0KLQkJCQlTWl9OTEFUVFJfVFlQRV9PRihzdHJ1Y3QgdGNf Z2FjdCk7DQotCQkJZmxhZ3MgfD0gTUxYNV9GTE9XX0FDVElPTl9KVU1QOw0KLQkJCWJyZWFrOw0K LQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9EUk9QOg0KLQkJCXNpemUgKz0gU1pfTkxBVFRS X05FU1QgKyAvKiBuYV9hY3RfaW5kZXguICovDQotCQkJCVNaX05MQVRUUl9TVFJaX09GKCJnYWN0 IikgKw0KLQkJCQlTWl9OTEFUVFJfTkVTVCArIC8qIFRDQV9BQ1RfT1BUSU9OUy4gKi8NCi0JCQkJ U1pfTkxBVFRSX1RZUEVfT0Yoc3RydWN0IHRjX2dhY3QpOw0KLQkJCWZsYWdzIHw9IE1MWDVfRkxP V19BQ1RJT05fRFJPUDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVf Q09VTlQ6DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1BPUF9W TEFOOg0KLQkJCWZsYWdzIHw9IE1MWDVfRkxPV19BQ1RJT05fT0ZfUE9QX1ZMQU47DQotCQkJZ290 byBhY3Rpb25fb2ZfdmxhbjsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfT0ZfUFVTSF9W TEFOOg0KLQkJCWZsYWdzIHw9IE1MWDVfRkxPV19BQ1RJT05fT0ZfUFVTSF9WTEFOOw0KLQkJCWdv dG8gYWN0aW9uX29mX3ZsYW47DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1NFVF9W TEFOX1ZJRDoNCi0JCQlmbGFncyB8PSBNTFg1X0ZMT1dfQUNUSU9OX09GX1NFVF9WTEFOX1ZJRDsN Ci0JCQlnb3RvIGFjdGlvbl9vZl92bGFuOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9P Rl9TRVRfVkxBTl9QQ1A6DQotCQkJZmxhZ3MgfD0gTUxYNV9GTE9XX0FDVElPTl9PRl9TRVRfVkxB Tl9QQ1A7DQotCQkJZ290byBhY3Rpb25fb2ZfdmxhbjsNCi1hY3Rpb25fb2ZfdmxhbjoNCi0JCQlz aXplICs9IFNaX05MQVRUUl9ORVNUICsgLyogbmFfYWN0X2luZGV4LiAqLw0KLQkJCQlTWl9OTEFU VFJfU1RSWl9PRigidmxhbiIpICsNCi0JCQkJU1pfTkxBVFRSX05FU1QgKyAvKiBUQ0FfQUNUX09Q VElPTlMuICovDQotCQkJCVNaX05MQVRUUl9UWVBFX09GKHN0cnVjdCB0Y192bGFuKSArDQotCQkJ CVNaX05MQVRUUl9UWVBFX09GKHVpbnQxNl90KSArDQotCQkJCS8qIFZMQU4gcHJvdG9jb2wuICov DQotCQkJCVNaX05MQVRUUl9UWVBFX09GKHVpbnQxNl90KSArIC8qIFZMQU4gSUQuICovDQotCQkJ CVNaX05MQVRUUl9UWVBFX09GKHVpbnQ4X3QpOyAvKiBWTEFOIHByaW8uICovDQotCQkJYnJlYWs7 DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1ZYTEFOX0VOQ0FQOg0KLQkJCXNpemUgKz0g U1pfTkxBVFRSX05FU1QgKyAvKiBuYV9hY3RfaW5kZXguICovDQotCQkJCVNaX05MQVRUUl9TVFJa X09GKCJ0dW5uZWxfa2V5IikgKw0KLQkJCQlTWl9OTEFUVFJfTkVTVCArIC8qIFRDQV9BQ1RfT1BU SU9OUy4gKi8NCi0JCQkJU1pfTkxBVFRSX1RZUEVfT0YodWludDhfdCk7DQotCQkJc2l6ZSArPSBT Wl9OTEFUVFJfVFlQRV9PRihzdHJ1Y3QgdGNfdHVubmVsX2tleSk7DQotCQkJc2l6ZSArPQlmbG93 X3RjZl92eGxhbl9lbmNhcF9zaXplKGFjdGlvbnMpICsNCi0JCQkJUlRFX0FMSUdOX0NFSUwgLyog cHJlY2VkaW5nIGVuY2FwIHBhcmFtcy4gKi8NCi0JCQkJKHNpemVvZihzdHJ1Y3QgZmxvd190Y2Zf dnhsYW5fZW5jYXApLA0KLQkJCQlNTkxfQUxJR05UTyk7DQotCQkJZmxhZ3MgfD0gTUxYNV9GTE9X X0FDVElPTl9WWExBTl9FTkNBUDsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9O X1RZUEVfVlhMQU5fREVDQVA6DQotCQkJc2l6ZSArPSBTWl9OTEFUVFJfTkVTVCArIC8qIG5hX2Fj dF9pbmRleC4gKi8NCi0JCQkJU1pfTkxBVFRSX1NUUlpfT0YoInR1bm5lbF9rZXkiKSArDQotCQkJ CVNaX05MQVRUUl9ORVNUICsgLyogVENBX0FDVF9PUFRJT05TLiAqLw0KLQkJCQlTWl9OTEFUVFJf VFlQRV9PRih1aW50OF90KTsNCi0JCQlzaXplICs9CVNaX05MQVRUUl9UWVBFX09GKHN0cnVjdCB0 Y190dW5uZWxfa2V5KTsNCi0JCQlzaXplICs9CVJURV9BTElHTl9DRUlMIC8qIHByZWNlZGluZyBk ZWNhcCBwYXJhbXMuICovDQotCQkJCShzaXplb2Yoc3RydWN0IGZsb3dfdGNmX3Z4bGFuX2RlY2Fw KSwNCi0JCQkJTU5MX0FMSUdOVE8pOw0KLQkJCWZsYWdzIHw9IE1MWDVfRkxPV19BQ1RJT05fVlhM QU5fREVDQVA7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9J UFY0X1NSQzoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX0lQVjRfRFNUOg0KLQkJ Y2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRfSVBWNl9TUkM6DQotCQljYXNlIFJURV9GTE9X X0FDVElPTl9UWVBFX1NFVF9JUFY2X0RTVDoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVf U0VUX1RQX1NSQzoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX1RQX0RTVDoNCi0J CWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX1RUTDoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNU SU9OX1RZUEVfREVDX1RUTDoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX01BQ19T UkM6DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9NQUNfRFNUOg0KLQkJCXNpemUg Kz0gZmxvd190Y2ZfZ2V0X3BlZGl0X2FjdGlvbnNfc2l6ZSgmYWN0aW9ucywNCi0JCQkJCQkJCSZm bGFncyk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCURSVl9MT0coV0FSTklORywNCi0J CQkJInVuc3VwcG9ydGVkIGFjdGlvbiAlcCB0eXBlICVkLCINCi0JCQkJIiBpdGVtcyBtdXN0IGJl IHZhbGlkYXRlZCBiZWZvcmUgZmxvdyBjcmVhdGlvbiIsDQotCQkJCShjb25zdCB2b2lkICopYWN0 aW9ucywgYWN0aW9ucy0+dHlwZSk7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0JKmFjdGlvbl9m bGFncyA9IGZsYWdzOw0KLQlyZXR1cm4gc2l6ZTsNCi19DQotDQotLyoqDQotICogUHJlcGFyZSBh IGZsb3cgb2JqZWN0IGZvciBMaW51eCBUQyBmbG93ZXIuIEl0IGNhbGN1bGF0ZXMgdGhlIG1heGlt dW0gc2l6ZSBvZg0KLSAqIG1lbW9yeSByZXF1aXJlZCwgYWxsb2NhdGVzIHRoZSBtZW1vcnksIGlu aXRpYWxpemVzIE5ldGxpbmsgbWVzc2FnZSBoZWFkZXJzDQotICogYW5kIHNldCB1bmlxdWUgVEMg bWVzc2FnZSBoYW5kbGUuDQotICoNCi0gKiBAcGFyYW1baW5dIGF0dHINCi0gKiAgIFBvaW50ZXIg dG8gdGhlIGZsb3cgYXR0cmlidXRlcy4NCi0gKiBAcGFyYW1baW5dIGl0ZW1zDQotICogICBQb2lu dGVyIHRvIHRoZSBsaXN0IG9mIGl0ZW1zLg0KLSAqIEBwYXJhbVtpbl0gYWN0aW9ucw0KLSAqICAg UG9pbnRlciB0byB0aGUgbGlzdCBvZiBhY3Rpb25zLg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQot ICogICBQb2ludGVyIHRvIHRoZSBlcnJvciBzdHJ1Y3R1cmUuDQotICoNCi0gKiBAcmV0dXJuDQot ICogICBQb2ludGVyIHRvIG1seDVfZmxvdyBvYmplY3Qgb24gc3VjY2VzcywNCi0gKiAgIG90aGVy d2lzZSBOVUxMIGFuZCBydGVfZXJybm8gaXMgc2V0Lg0KLSAqLw0KLXN0YXRpYyBzdHJ1Y3QgbWx4 NV9mbG93ICoNCi1mbG93X3RjZl9wcmVwYXJlKGNvbnN0IHN0cnVjdCBydGVfZmxvd19hdHRyICph dHRyLA0KLQkJIGNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtIGl0ZW1zW10sDQotCQkgY29uc3Qg c3RydWN0IHJ0ZV9mbG93X2FjdGlvbiBhY3Rpb25zW10sDQotCQkgc3RydWN0IHJ0ZV9mbG93X2Vy cm9yICplcnJvcikNCi17DQotCXNpemVfdCBzaXplID0gUlRFX0FMSUdOX0NFSUwNCi0JCQkoc2l6 ZW9mKHN0cnVjdCBtbHg1X2Zsb3cpLA0KLQkJCSBhbGlnbm9mKHN0cnVjdCBmbG93X3RjZl90dW5u ZWxfaGRyKSkgKw0KLQkJICAgICAgTU5MX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKSAr DQotCQkgICAgICBNTkxfQUxJR04oc2l6ZW9mKHN0cnVjdCB0Y21zZykpOw0KLQlzdHJ1Y3QgbWx4 NV9mbG93ICpkZXZfZmxvdzsNCi0JdWludDY0X3QgYWN0aW9uX2ZsYWdzID0gMDsNCi0Jc3RydWN0 IG5sbXNnaGRyICpubGg7DQotCXN0cnVjdCB0Y21zZyAqdGNtOw0KLQl1aW50OF90ICpzcCwgKnR1 biA9IE5VTEw7DQotDQotCXNpemUgKz0gZmxvd190Y2ZfZ2V0X2l0ZW1zX3NpemUoYXR0ciwgaXRl bXMsICZhY3Rpb25fZmxhZ3MpOw0KLQlzaXplICs9IGZsb3dfdGNmX2dldF9hY3Rpb25zX2FuZF9z aXplKGFjdGlvbnMsICZhY3Rpb25fZmxhZ3MpOw0KLQlkZXZfZmxvdyA9IHJ0ZV96bWFsbG9jKF9f ZnVuY19fLCBzaXplLCBNTkxfQUxJR05UTyk7DQotCWlmICghZGV2X2Zsb3cpIHsNCi0JCXJ0ZV9m bG93X2Vycm9yX3NldChlcnJvciwgRU5PTUVNLA0KLQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBF X1VOU1BFQ0lGSUVELCBOVUxMLA0KLQkJCQkgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRl IEUtU3dpdGNoIGZsb3ciKTsNCi0JCXJldHVybiBOVUxMOw0KLQl9DQotCXNwID0gKHVpbnQ4X3Qg KikoZGV2X2Zsb3cgKyAxKTsNCi0JaWYgKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19BQ1RJT05f VlhMQU5fRU5DQVApIHsNCi0JCXNwID0gUlRFX1BUUl9BTElHTg0KLQkJCShzcCwgYWxpZ25vZihz dHJ1Y3QgZmxvd190Y2ZfdHVubmVsX2hkcikpOw0KLQkJdHVuID0gc3A7DQotCQlzcCArPSBSVEVf QUxJR05fQ0VJTA0KLQkJCShzaXplb2Yoc3RydWN0IGZsb3dfdGNmX3Z4bGFuX2VuY2FwKSwNCi0J CQlNTkxfQUxJR05UTyk7DQotI2lmbmRlZiBOREVCVUcNCi0JCXNpemUgLT0gUlRFX0FMSUdOX0NF SUwNCi0JCQkoc2l6ZW9mKHN0cnVjdCBmbG93X3RjZl92eGxhbl9lbmNhcCksDQotCQkJTU5MX0FM SUdOVE8pOw0KLSNlbmRpZg0KLQl9IGVsc2UgaWYgKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19B Q1RJT05fVlhMQU5fREVDQVApIHsNCi0JCXNwID0gUlRFX1BUUl9BTElHTg0KLQkJCShzcCwgYWxp Z25vZihzdHJ1Y3QgZmxvd190Y2ZfdHVubmVsX2hkcikpOw0KLQkJdHVuID0gc3A7DQotCQlzcCAr PSBSVEVfQUxJR05fQ0VJTA0KLQkJCShzaXplb2Yoc3RydWN0IGZsb3dfdGNmX3Z4bGFuX2RlY2Fw KSwNCi0JCQlNTkxfQUxJR05UTyk7DQotI2lmbmRlZiBOREVCVUcNCi0JCXNpemUgLT0gUlRFX0FM SUdOX0NFSUwNCi0JCQkoc2l6ZW9mKHN0cnVjdCBmbG93X3RjZl92eGxhbl9kZWNhcCksDQotCQkJ TU5MX0FMSUdOVE8pOw0KLSNlbmRpZg0KLQl9IGVsc2Ugew0KLQkJc3AgPSBSVEVfUFRSX0FMSUdO KHNwLCBNTkxfQUxJR05UTyk7DQotCX0NCi0JbmxoID0gbW5sX25sbXNnX3B1dF9oZWFkZXIoc3Ap Ow0KLQl0Y20gPSBtbmxfbmxtc2dfcHV0X2V4dHJhX2hlYWRlcihubGgsIHNpemVvZigqdGNtKSk7 DQotCSpkZXZfZmxvdyA9IChzdHJ1Y3QgbWx4NV9mbG93KXsNCi0JCS50Y2YgPSAoc3RydWN0IG1s eDVfZmxvd190Y2Ypew0KLSNpZm5kZWYgTkRFQlVHDQotCQkJLm5sc2l6ZSA9IHNpemUgLSBSVEVf QUxJR05fQ0VJTA0KLQkJCQkoc2l6ZW9mKHN0cnVjdCBtbHg1X2Zsb3cpLA0KLQkJCQkgYWxpZ25v ZihzdHJ1Y3QgZmxvd190Y2ZfdHVubmVsX2hkcikpLA0KLSNlbmRpZg0KLQkJCS50dW5uZWwgPSAo c3RydWN0IGZsb3dfdGNmX3R1bm5lbF9oZHIgKil0dW4sDQotCQkJLm5saCA9IG5saCwNCi0JCQku dGNtID0gdGNtLA0KLQkJfSwNCi0JfTsNCi0JaWYgKGFjdGlvbl9mbGFncyAmIE1MWDVfRkxPV19B Q1RJT05fVlhMQU5fREVDQVApDQotCQlkZXZfZmxvdy0+dGNmLnR1bm5lbC0+dHlwZSA9IEZMT1df VENGX1RVTkFDVF9WWExBTl9ERUNBUDsNCi0JZWxzZSBpZiAoYWN0aW9uX2ZsYWdzICYgTUxYNV9G TE9XX0FDVElPTl9WWExBTl9FTkNBUCkNCi0JCWRldl9mbG93LT50Y2YudHVubmVsLT50eXBlID0g RkxPV19UQ0ZfVFVOQUNUX1ZYTEFOX0VOQ0FQOw0KLQlyZXR1cm4gZGV2X2Zsb3c7DQotfQ0KLQ0K LS8qKg0KLSAqIE1ha2UgYWRqdXN0bWVudHMgZm9yIHN1cHBvcnRpbmcgY291bnQgYWN0aW9ucy4N Ci0gKg0KLSAqIEBwYXJhbVtpbl0gZGV2DQotICogICBQb2ludGVyIHRvIHRoZSBFdGhlcm5ldCBk ZXZpY2Ugc3RydWN0dXJlLg0KLSAqIEBwYXJhbVtpbl0gZGV2X2Zsb3cNCi0gKiAgIFBvaW50ZXIg dG8gbWx4NV9mbG93Lg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQb2ludGVyIHRvIGVy cm9yIHN0cnVjdHVyZS4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIDAgT24gc3VjY2VzcyBlbHNl IGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaXMgcmV0dXJuZWQgYW5kIHJ0ZV9lcnJubyBpcyBzZXQu DQotICovDQotc3RhdGljIGludA0KLWZsb3dfdGNmX3RyYW5zbGF0ZV9hY3Rpb25fY291bnQoc3Ry dWN0IHJ0ZV9ldGhfZGV2ICpkZXYgX19ydGVfdW51c2VkLA0KLQkJCQkgIHN0cnVjdCBtbHg1X2Zs b3cgKmRldl9mbG93LA0KLQkJCQkgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQotew0K LQlzdHJ1Y3QgcnRlX2Zsb3cgKmZsb3cgPSBkZXZfZmxvdy0+ZmxvdzsNCi0NCi0JaWYgKCFmbG93 LT5jb3VudGVyKSB7DQotCQlmbG93LT5jb3VudGVyID0gZmxvd190Y2ZfY291bnRlcl9uZXcoKTsN Ci0JCWlmICghZmxvdy0+Y291bnRlcikNCi0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVy cm9yLCBydGVfZXJybm8sDQotCQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX0FDVElPTiwNCi0J CQkJCQkgIE5VTEwsDQotCQkJCQkJICAiY2Fubm90IGdldCBjb3VudGVyIg0KLQkJCQkJCSAgIiBj b250ZXh0LiIpOw0KLQl9DQotCXJldHVybiAwOw0KLX0NCi0NCi0vKioNCi0gKiBDb252ZXJ0IFZY TEFOIFZOSSB0byAzMi1iaXQgaW50ZWdlci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdm5pDQotICog ICBWWExBTiBWTkkgaW4gMjQtYml0IHdpcmUgZm9ybWF0Lg0KLSAqDQotICogQHJldHVybg0KLSAq ICAgVlhMQU4gVk5JIGFzIGEgMzItYml0IGludGVnZXIgdmFsdWUgaW4gbmV0d29yayBlbmRpYW5u ZXNzLg0KLSAqLw0KLXN0YXRpYyBpbmxpbmUgcnRlX2JlMzJfdA0KLXZ4bGFuX3ZuaV9hc19iZTMy KGNvbnN0IHVpbnQ4X3Qgdm5pWzNdKQ0KLXsNCi0JdW5pb24gew0KLQkJdWludDhfdCB2bmlbNF07 DQotCQlydGVfYmUzMl90IGR3b3JkOw0KLQl9IHJldCA9IHsNCi0JCS52bmkgPSB7IDAsIHZuaVsw XSwgdm5pWzFdLCB2bmlbMl0gfSwNCi0JfTsNCi0JcmV0dXJuIHJldC5kd29yZDsNCi19DQotDQot LyoqDQotICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgUlRFX0ZMT1dfSVRFTV9UWVBFX0VU SCBlbnRyeSBpbiBjb25maWd1cmF0aW9uDQotICogb2YgYWN0aW9uIFJURV9GTE9XX0FDVElPTl9U WVBFX1ZYTEFOX0VOQ0FQLiBGaWxscyB0aGUgTUFDIGFkZHJlc3MgZmllbGRzDQotICogaW4gdGhl IGVuY2Fwc3VsYXRpb24gcGFyYW1ldGVycyBzdHJ1Y3R1cmUuIFRoZSBpdGVtIG11c3QgYmUgcHJl dmFsaWRhdGVkLA0KLSAqIG5vIGFueSB2YWxpZGF0aW9uIGNoZWNrcyBwZXJmb3JtZWQgYnkgZnVu Y3Rpb24uDQotICoNCi0gKiBAcGFyYW1baW5dIHNwZWMNCi0gKiAgIFJURV9GTE9XX0lURU1fVFlQ RV9FVEggZW50cnkgc3BlY2lmaWNhdGlvbi4NCi0gKiBAcGFyYW1baW5dIG1hc2sNCi0gKiAgIFJU RV9GTE9XX0lURU1fVFlQRV9FVEggZW50cnkgbWFzay4NCi0gKiBAcGFyYW1bb3V0XSBlbmNhcA0K LSAqICAgU3RydWN0dXJlIHRvIGZpbGwgdGhlIGdhdGhlcmVkIE1BQyBhZGRyZXNzIGRhdGEuDQot ICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9wYXJzZV92eGxhbl9lbmNhcF9ldGgoY29uc3Qg c3RydWN0IHJ0ZV9mbG93X2l0ZW1fZXRoICpzcGVjLA0KLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qg cnRlX2Zsb3dfaXRlbV9ldGggKm1hc2ssDQotCQkJICAgICAgIHN0cnVjdCBmbG93X3RjZl92eGxh bl9lbmNhcCAqZW5jYXApDQotew0KLQkvKiBJdGVtIG11c3QgYmUgdmFsaWRhdGVkIGJlZm9yZS4g Tm8gcmVkdW5kYW50IGNoZWNrcy4gKi8NCi0JYXNzZXJ0KHNwZWMpOw0KLQlpZiAoIW1hc2sgfHwg IW1lbWNtcCgmbWFzay0+ZHN0LA0KLQkJCSAgICAgJnJ0ZV9mbG93X2l0ZW1fZXRoX21hc2suZHN0 LA0KLQkJCSAgICAgc2l6ZW9mKHJ0ZV9mbG93X2l0ZW1fZXRoX21hc2suZHN0KSkpIHsNCi0JCS8q DQotCQkgKiBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkNCi0JCSAqIHRj IGFzIHR1bm5lbF9rZXkgcGFyYW1ldGVycy4gRGVzdGluYXRpb24NCi0JCSAqIGFkZHJlc3MgaXMg bmVlZGVkIHRvIGZvcm0gZW5jYXAgcGFja2V0DQotCQkgKiBoZWFkZXIgYW5kIHJldHJpZXZlZCBi eSBrZXJuZWwgZnJvbQ0KLQkJICogaW1wbGljaXQgc291cmNlcyAoQVJQIHRhYmxlLCBldGMpLA0K LQkJICogYWRkcmVzcyBtYXNrcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBhbGwuDQotCQkgKi8NCi0J CWVuY2FwLT5ldGguZHN0ID0gc3BlYy0+ZHN0Ow0KLQkJZW5jYXAtPm1hc2sgfD0gRkxPV19UQ0Zf RU5DQVBfRVRIX0RTVDsNCi0JfQ0KLQlpZiAoIW1hc2sgfHwgIW1lbWNtcCgmbWFzay0+c3JjLA0K LQkJCSAgICAgJnJ0ZV9mbG93X2l0ZW1fZXRoX21hc2suc3JjLA0KLQkJCSAgICAgc2l6ZW9mKHJ0 ZV9mbG93X2l0ZW1fZXRoX21hc2suc3JjKSkpIHsNCi0JCS8qDQotCQkgKiBFdGhlcm5ldCBhZGRy ZXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkNCi0JCSAqIHRjIGFzIHR1bm5lbF9rZXkgcGFyYW1l dGVycy4gU291cmNlIGV0aGVybmV0DQotCQkgKiBhZGRyZXNzIGlzIGlnbm9yZWQgYW55d2F5Lg0K LQkJICovDQotCQllbmNhcC0+ZXRoLnNyYyA9IHNwZWMtPnNyYzsNCi0JCWVuY2FwLT5tYXNrIHw9 IEZMT1dfVENGX0VOQ0FQX0VUSF9TUkM7DQotCX0NCi19DQotDQotLyoqDQotICogSGVscGVyIGZ1 bmN0aW9uIHRvIHByb2Nlc3MgUlRFX0ZMT1dfSVRFTV9UWVBFX0lQVjQgZW50cnkgaW4gY29uZmln dXJhdGlvbg0KLSAqIG9mIGFjdGlvbiBSVEVfRkxPV19BQ1RJT05fVFlQRV9WWExBTl9FTkNBUC4g RmlsbHMgdGhlIElQVjQgYWRkcmVzcyBmaWVsZHMNCi0gKiBpbiB0aGUgZW5jYXBzdWxhdGlvbiBw YXJhbWV0ZXJzIHN0cnVjdHVyZS4gVGhlIGl0ZW0gbXVzdCBiZSBwcmV2YWxpZGF0ZWQsDQotICog bm8gYW55IHZhbGlkYXRpb24gY2hlY2tzIHBlcmZvcm1lZCBieSBmdW5jdGlvbi4NCi0gKg0KLSAq IEBwYXJhbVtpbl0gc3BlYw0KLSAqICAgUlRFX0ZMT1dfSVRFTV9UWVBFX0lQVjQgZW50cnkgc3Bl Y2lmaWNhdGlvbi4NCi0gKiBAcGFyYW1baW5dIG1hc2sNCi0gKiAgUlRFX0ZMT1dfSVRFTV9UWVBF X0lQVjQgZW50cnkgbWFzay4NCi0gKiBAcGFyYW1bb3V0XSBlbmNhcA0KLSAqICAgU3RydWN0dXJl IHRvIGZpbGwgdGhlIGdhdGhlcmVkIElQVjQgYWRkcmVzcyBkYXRhLg0KLSAqLw0KLXN0YXRpYyB2 b2lkDQotZmxvd190Y2ZfcGFyc2VfdnhsYW5fZW5jYXBfaXB2NChjb25zdCBzdHJ1Y3QgcnRlX2Zs b3dfaXRlbV9pcHY0ICpzcGVjLA0KLQkJCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9pcHY0 ICptYXNrLA0KLQkJCQlzdHJ1Y3QgZmxvd190Y2ZfdnhsYW5fZW5jYXAgKmVuY2FwKQ0KLXsNCi0J LyogSXRlbSBtdXN0IGJlIHZhbGlkYXRlZCBiZWZvcmUuIE5vIHJlZHVuZGFudCBjaGVja3MuICov DQotCWFzc2VydChzcGVjKTsNCi0JZW5jYXAtPmlwdjQuZHN0ID0gc3BlYy0+aGRyLmRzdF9hZGRy Ow0KLQllbmNhcC0+aXB2NC5zcmMgPSBzcGVjLT5oZHIuc3JjX2FkZHI7DQotCWVuY2FwLT5tYXNr IHw9IEZMT1dfVENGX0VOQ0FQX0lQVjRfU1JDIHwNCi0JCSAgICAgICBGTE9XX1RDRl9FTkNBUF9J UFY0X0RTVDsNCi0JaWYgKG1hc2sgJiYgbWFzay0+aGRyLnR5cGVfb2Zfc2VydmljZSkgew0KLQkJ ZW5jYXAtPm1hc2sgfD0gRkxPV19UQ0ZfRU5DQVBfSVBfVE9TOw0KLQkJZW5jYXAtPmlwX3RvcyA9 IHNwZWMtPmhkci50eXBlX29mX3NlcnZpY2U7DQotCX0NCi0JaWYgKG1hc2sgJiYgbWFzay0+aGRy LnRpbWVfdG9fbGl2ZSkgew0KLQkJZW5jYXAtPm1hc2sgfD0gRkxPV19UQ0ZfRU5DQVBfSVBfVFRM Ow0KLQkJZW5jYXAtPmlwX3R0bF9ob3AgPSBzcGVjLT5oZHIudGltZV90b19saXZlOw0KLQl9DQot fQ0KLQ0KLS8qKg0KLSAqIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNzIFJURV9GTE9XX0lURU1f VFlQRV9JUFY2IGVudHJ5IGluIGNvbmZpZ3VyYXRpb24NCi0gKiBvZiBhY3Rpb24gUlRFX0ZMT1df QUNUSU9OX1RZUEVfVlhMQU5fRU5DQVAuIEZpbGxzIHRoZSBJUFY2IGFkZHJlc3MgZmllbGRzDQot ICogaW4gdGhlIGVuY2Fwc3VsYXRpb24gcGFyYW1ldGVycyBzdHJ1Y3R1cmUuIFRoZSBpdGVtIG11 c3QgYmUgcHJldmFsaWRhdGVkLA0KLSAqIG5vIGFueSB2YWxpZGF0aW9uIGNoZWNrcyBwZXJmb3Jt ZWQgYnkgZnVuY3Rpb24uDQotICoNCi0gKiBAcGFyYW1baW5dIHNwZWMNCi0gKiAgIFJURV9GTE9X X0lURU1fVFlQRV9JUFY2IGVudHJ5IHNwZWNpZmljYXRpb24uDQotICogQHBhcmFtW2luXSBtYXNr DQotICogIFJURV9GTE9XX0lURU1fVFlQRV9JUFY2IGVudHJ5IG1hc2suDQotICogQHBhcmFtW291 dF0gZW5jYXANCi0gKiAgIFN0cnVjdHVyZSB0byBmaWxsIHRoZSBnYXRoZXJlZCBJUFY2IGFkZHJl c3MgZGF0YS4NCi0gKi8NCi1zdGF0aWMgdm9pZA0KLWZsb3dfdGNmX3BhcnNlX3Z4bGFuX2VuY2Fw X2lwdjYoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2NiAqc3BlYywNCi0JCQkJY29uc3Qg c3RydWN0IHJ0ZV9mbG93X2l0ZW1faXB2NiAqbWFzaywNCi0JCQkJc3RydWN0IGZsb3dfdGNmX3Z4 bGFuX2VuY2FwICplbmNhcCkNCi17DQotCS8qIEl0ZW0gbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3Jl LiBObyByZWR1bmRhbnQgY2hlY2tzLiAqLw0KLQlhc3NlcnQoc3BlYyk7DQotCW1lbWNweShlbmNh cC0+aXB2Ni5kc3QsIHNwZWMtPmhkci5kc3RfYWRkciwgSVBWNl9BRERSX0xFTik7DQotCW1lbWNw eShlbmNhcC0+aXB2Ni5zcmMsIHNwZWMtPmhkci5zcmNfYWRkciwgSVBWNl9BRERSX0xFTik7DQot CWVuY2FwLT5tYXNrIHw9IEZMT1dfVENGX0VOQ0FQX0lQVjZfU1JDIHwNCi0JCSAgICAgICBGTE9X X1RDRl9FTkNBUF9JUFY2X0RTVDsNCi0JaWYgKG1hc2spIHsNCi0JCWlmICgocnRlX2JlX3RvX2Nw dV8zMihtYXNrLT5oZHIudnRjX2Zsb3cpID4+DQotCQkgICAgSVBWNl9IRFJfVENfU0hJRlQpICYg MHhmZikgew0KLQkJCWVuY2FwLT5tYXNrIHw9IEZMT1dfVENGX0VOQ0FQX0lQX1RPUzsNCi0JCQll bmNhcC0+aXBfdG9zID0gKHJ0ZV9iZV90b19jcHVfMzINCi0JCQkJCQkoc3BlYy0+aGRyLnZ0Y19m bG93KSA+Pg0KLQkJCQkJCSBJUFY2X0hEUl9UQ19TSElGVCkgJiAweGZmOw0KLQkJfQ0KLQkJaWYg KG1hc2stPmhkci5ob3BfbGltaXRzKSB7DQotCQkJZW5jYXAtPm1hc2sgfD0gRkxPV19UQ0ZfRU5D QVBfSVBfVFRMOw0KLQkJCWVuY2FwLT5pcF90dGxfaG9wID0gc3BlYy0+aGRyLmhvcF9saW1pdHM7 DQotCQl9DQotCX0NCi19DQotDQotLyoqDQotICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3Mg UlRFX0ZMT1dfSVRFTV9UWVBFX1VEUCBlbnRyeSBpbiBjb25maWd1cmF0aW9uDQotICogb2YgYWN0 aW9uIFJURV9GTE9XX0FDVElPTl9UWVBFX1ZYTEFOX0VOQ0FQLiBGaWxscyB0aGUgVURQIHBvcnQg ZmllbGRzDQotICogaW4gdGhlIGVuY2Fwc3VsYXRpb24gcGFyYW1ldGVycyBzdHJ1Y3R1cmUuIFRo ZSBpdGVtIG11c3QgYmUgcHJldmFsaWRhdGVkLA0KLSAqIG5vIGFueSB2YWxpZGF0aW9uIGNoZWNr cyBwZXJmb3JtZWQgYnkgZnVuY3Rpb24uDQotICoNCi0gKiBAcGFyYW1baW5dIHNwZWMNCi0gKiAg IFJURV9GTE9XX0lURU1fVFlQRV9VRFAgZW50cnkgc3BlY2lmaWNhdGlvbi4NCi0gKiBAcGFyYW1b aW5dIG1hc2sNCi0gKiAgIFJURV9GTE9XX0lURU1fVFlQRV9VRFAgZW50cnkgbWFzay4NCi0gKiBA cGFyYW1bb3V0XSBlbmNhcA0KLSAqICAgU3RydWN0dXJlIHRvIGZpbGwgdGhlIGdhdGhlcmVkIFVE UCBwb3J0IGRhdGEuDQotICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9wYXJzZV92eGxhbl9l bmNhcF91ZHAoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwICpzcGVjLA0KLQkJCSAgICAg ICBjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV91ZHAgKm1hc2ssDQotCQkJICAgICAgIHN0cnVj dCBmbG93X3RjZl92eGxhbl9lbmNhcCAqZW5jYXApDQotew0KLQlhc3NlcnQoc3BlYyk7DQotCWVu Y2FwLT51ZHAuZHN0ID0gc3BlYy0+aGRyLmRzdF9wb3J0Ow0KLQllbmNhcC0+bWFzayB8PSBGTE9X X1RDRl9FTkNBUF9VRFBfRFNUOw0KLQlpZiAoIW1hc2sgfHwgbWFzay0+aGRyLnNyY19wb3J0ICE9 IFJURV9CRTE2KDB4MDAwMCkpIHsNCi0JCWVuY2FwLT51ZHAuc3JjID0gc3BlYy0+aGRyLnNyY19w b3J0Ow0KLQkJZW5jYXAtPm1hc2sgfD0gRkxPV19UQ0ZfRU5DQVBfSVBWNF9TUkM7DQotCX0NCi19 DQotDQotLyoqDQotICogSGVscGVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgUlRFX0ZMT1dfSVRFTV9U WVBFX1ZYTEFOIGVudHJ5IGluIGNvbmZpZ3VyYXRpb24NCi0gKiBvZiBhY3Rpb24gUlRFX0ZMT1df QUNUSU9OX1RZUEVfVlhMQU5fRU5DQVAuIEZpbGxzIHRoZSBWTkkgZmllbGRzDQotICogaW4gdGhl IGVuY2Fwc3VsYXRpb24gcGFyYW1ldGVycyBzdHJ1Y3R1cmUuIFRoZSBpdGVtIG11c3QgYmUgcHJl dmFsaWRhdGVkLA0KLSAqIG5vIGFueSB2YWxpZGF0aW9uIGNoZWNrcyBwZXJmb3JtZWQgYnkgZnVu Y3Rpb24uDQotICoNCi0gKiBAcGFyYW1baW5dIHNwZWMNCi0gKiAgIFJURV9GTE9XX0lURU1fVFlQ RV9WWExBTiBlbnRyeSBzcGVjaWZpY2F0aW9uLg0KLSAqIEBwYXJhbVtvdXRdIGVuY2FwDQotICog ICBTdHJ1Y3R1cmUgdG8gZmlsbCB0aGUgZ2F0aGVyZWQgVk5JIGFkZHJlc3MgZGF0YS4NCi0gKi8N Ci1zdGF0aWMgdm9pZA0KLWZsb3dfdGNmX3BhcnNlX3Z4bGFuX2VuY2FwX3ZuaShjb25zdCBzdHJ1 Y3QgcnRlX2Zsb3dfaXRlbV92eGxhbiAqc3BlYywNCi0JCQkgICAgICAgc3RydWN0IGZsb3dfdGNm X3Z4bGFuX2VuY2FwICplbmNhcCkNCi17DQotCS8qIEl0ZW0gbXVzdCBiZSB2YWxpZGF0ZWQgYmVm b3JlLiBEbyBub3QgcmVkdW5kYW50IGNoZWNrcy4gKi8NCi0JYXNzZXJ0KHNwZWMpOw0KLQltZW1j cHkoZW5jYXAtPnZ4bGFuLnZuaSwgc3BlYy0+dm5pLCBzaXplb2YoZW5jYXAtPnZ4bGFuLnZuaSkp Ow0KLQllbmNhcC0+bWFzayB8PSBGTE9XX1RDRl9FTkNBUF9WWExBTl9WTkk7DQotfQ0KLQ0KLS8q Kg0KLSAqIFBvcHVsYXRlIGNvbnNvbGlkYXRlZCBlbmNhcHN1bGF0aW9uIG9iamVjdCBmcm9tIGxp c3Qgb2YgcGF0dGVybiBpdGVtcy4NCi0gKg0KLSAqIEhlbHBlciBmdW5jdGlvbiB0byBwcm9jZXNz IGNvbmZpZ3VyYXRpb24gb2YgYWN0aW9uIHN1Y2ggYXMNCi0gKiBSVEVfRkxPV19BQ1RJT05fVFlQ RV9WWExBTl9FTkNBUC4gVGhlIGl0ZW0gbGlzdCBzaG91bGQgYmUNCi0gKiB2YWxpZGF0ZWQsIHRo ZXJlIGlzIG5vIHdheSB0byByZXR1cm4gYW4gbWVhbmluZ2Z1bCBlcnJvci4NCi0gKg0KLSAqIEBw YXJhbVtpbl0gYWN0aW9uDQotICogICBSVEVfRkxPV19BQ1RJT05fVFlQRV9WWExBTl9FTkNBUCBh Y3Rpb24gb2JqZWN0Lg0KLSAqICAgTGlzdCBvZiBwYXR0ZXJuIGl0ZW1zIHRvIGdhdGhlciBkYXRh IGZyb20uDQotICogQHBhcmFtW291dF0gc3JjDQotICogICBTdHJ1Y3R1cmUgdG8gZmlsbCBnYXRo ZXJlZCBkYXRhLg0KLSAqLw0KLXN0YXRpYyB2b2lkDQotZmxvd190Y2ZfdnhsYW5fZW5jYXBfcGFy c2UoY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiAqYWN0aW9uLA0KLQkJCSAgIHN0cnVjdCBm bG93X3RjZl92eGxhbl9lbmNhcCAqZW5jYXApDQotew0KLQl1bmlvbiB7DQotCQljb25zdCBzdHJ1 Y3QgcnRlX2Zsb3dfaXRlbV9ldGggKmV0aDsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVt X2lwdjQgKmlwdjQ7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9pcHY2ICppcHY2Ow0K LQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdWRwICp1ZHA7DQotCQljb25zdCBzdHJ1Y3Qg cnRlX2Zsb3dfaXRlbV92eGxhbiAqdnhsYW47DQotCX0gc3BlYywgbWFzazsNCi0JY29uc3Qgc3Ry dWN0IHJ0ZV9mbG93X2l0ZW0gKml0ZW1zOw0KLQ0KLQlhc3NlcnQoYWN0aW9uLT50eXBlID09IFJU RV9GTE9XX0FDVElPTl9UWVBFX1ZYTEFOX0VOQ0FQKTsNCi0JYXNzZXJ0KGFjdGlvbi0+Y29uZik7 DQotDQotCWl0ZW1zID0gKChjb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uX3Z4bGFuX2VuY2Fw ICopDQotCQkJCQlhY3Rpb24tPmNvbmYpLT5kZWZpbml0aW9uOw0KLQlhc3NlcnQoaXRlbXMpOw0K LQlmb3IgKDsgaXRlbXMtPnR5cGUgIT0gUlRFX0ZMT1dfSVRFTV9UWVBFX0VORDsgaXRlbXMrKykg ew0KLQkJc3dpdGNoIChpdGVtcy0+dHlwZSkgew0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVf Vk9JRDoNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX0VUSDoNCi0JCQlt YXNrLmV0aCA9IGl0ZW1zLT5tYXNrOw0KLQkJCXNwZWMuZXRoID0gaXRlbXMtPnNwZWM7DQotCQkJ Zmxvd190Y2ZfcGFyc2VfdnhsYW5fZW5jYXBfZXRoKHNwZWMuZXRoLCBtYXNrLmV0aCwNCi0JCQkJ CQkgICAgICAgZW5jYXApOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVf SVBWNDoNCi0JCQlzcGVjLmlwdjQgPSBpdGVtcy0+c3BlYzsNCi0JCQltYXNrLmlwdjQgPSBpdGVt cy0+bWFzazsNCi0JCQlmbG93X3RjZl9wYXJzZV92eGxhbl9lbmNhcF9pcHY0KHNwZWMuaXB2NCwg bWFzay5pcHY0LA0KLQkJCQkJCQllbmNhcCk7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9X X0lURU1fVFlQRV9JUFY2Og0KLQkJCXNwZWMuaXB2NiA9IGl0ZW1zLT5zcGVjOw0KLQkJCW1hc2su aXB2NiA9IGl0ZW1zLT5tYXNrOw0KLQkJCWZsb3dfdGNmX3BhcnNlX3Z4bGFuX2VuY2FwX2lwdjYo c3BlYy5pcHY2LCBtYXNrLmlwdjYsDQotCQkJCQkJCWVuY2FwKTsNCi0JCQlicmVhazsNCi0JCWNh c2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1VEUDoNCi0JCQltYXNrLnVkcCA9IGl0ZW1zLT5tYXNrOw0K LQkJCXNwZWMudWRwID0gaXRlbXMtPnNwZWM7DQotCQkJZmxvd190Y2ZfcGFyc2VfdnhsYW5fZW5j YXBfdWRwKHNwZWMudWRwLCBtYXNrLnVkcCwNCi0JCQkJCQkgICAgICAgZW5jYXApOw0KLQkJCWJy ZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfVlhMQU46DQotCQkJc3BlYy52eGxhbiA9 IGl0ZW1zLT5zcGVjOw0KLQkJCWZsb3dfdGNmX3BhcnNlX3Z4bGFuX2VuY2FwX3ZuaShzcGVjLnZ4 bGFuLCBlbmNhcCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCWFzc2VydChmYWxzZSk7 DQotCQkJRFJWX0xPRyhXQVJOSU5HLA0KLQkJCQkidW5zdXBwb3J0ZWQgaXRlbSAlcCB0eXBlICVk LCINCi0JCQkJIiBpdGVtcyBtdXN0IGJlIHZhbGlkYXRlZCINCi0JCQkJIiBiZWZvcmUgZmxvdyBj cmVhdGlvbiIsDQotCQkJCShjb25zdCB2b2lkICopaXRlbXMsIGl0ZW1zLT50eXBlKTsNCi0JCQll bmNhcC0+bWFzayA9IDA7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQl9DQotfQ0KLQ0KLS8qKg0KLSAq IFRyYW5zbGF0ZSBmbG93IGZvciBMaW51eCBUQyBmbG93ZXIgYW5kIGNvbnN0cnVjdCBOZXRsaW5r IG1lc3NhZ2UuDQotICoNCi0gKiBAcGFyYW1baW5dIHByaXYNCi0gKiAgIFBvaW50ZXIgdG8gdGhl IHByaXYgc3RydWN0dXJlLg0KLSAqIEBwYXJhbVtpbiwgb3V0XSBmbG93DQotICogICBQb2ludGVy IHRvIHRoZSBzdWIgZmxvdy4NCi0gKiBAcGFyYW1baW5dIGF0dHINCi0gKiAgIFBvaW50ZXIgdG8g dGhlIGZsb3cgYXR0cmlidXRlcy4NCi0gKiBAcGFyYW1baW5dIGl0ZW1zDQotICogICBQb2ludGVy IHRvIHRoZSBsaXN0IG9mIGl0ZW1zLg0KLSAqIEBwYXJhbVtpbl0gYWN0aW9ucw0KLSAqICAgUG9p bnRlciB0byB0aGUgbGlzdCBvZiBhY3Rpb25zLg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICog ICBQb2ludGVyIHRvIHRoZSBlcnJvciBzdHJ1Y3R1cmUuDQotICoNCi0gKiBAcmV0dXJuDQotICog ICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVf ZXJybm8gaXMgc2V0Lg0KLSAqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl90cmFuc2xhdGUoc3Ry dWN0IHJ0ZV9ldGhfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2Zsb3cgKmRldl9mbG93LA0KLQkJICAg Y29uc3Qgc3RydWN0IHJ0ZV9mbG93X2F0dHIgKmF0dHIsDQotCQkgICBjb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfaXRlbSBpdGVtc1tdLA0KLQkJICAgY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbiBh Y3Rpb25zW10sDQotCQkgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0JdW5p b24gew0KLQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fcG9ydF9pZCAqcG9ydF9pZDsNCi0J CWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2V0aCAqZXRoOw0KLQkJY29uc3Qgc3RydWN0IHJ0 ZV9mbG93X2l0ZW1fdmxhbiAqdmxhbjsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX2lw djQgKmlwdjQ7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfaXRlbV9pcHY2ICppcHY2Ow0KLQkJ Y29uc3Qgc3RydWN0IHJ0ZV9mbG93X2l0ZW1fdGNwICp0Y3A7DQotCQljb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfaXRlbV91ZHAgKnVkcDsNCi0JCWNvbnN0IHN0cnVjdCBydGVfZmxvd19pdGVtX3Z4bGFu ICp2eGxhbjsNCi0JfSBzcGVjLCBtYXNrOw0KLQl1bmlvbiB7DQotCQljb25zdCBzdHJ1Y3QgcnRl X2Zsb3dfYWN0aW9uX3BvcnRfaWQgKnBvcnRfaWQ7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3df YWN0aW9uX2p1bXAgKmp1bXA7DQotCQljb25zdCBzdHJ1Y3QgcnRlX2Zsb3dfYWN0aW9uX29mX3B1 c2hfdmxhbiAqb2ZfcHVzaF92bGFuOw0KLQkJY29uc3Qgc3RydWN0IHJ0ZV9mbG93X2FjdGlvbl9v Zl9zZXRfdmxhbl92aWQgKg0KLQkJCW9mX3NldF92bGFuX3ZpZDsNCi0JCWNvbnN0IHN0cnVjdCBy dGVfZmxvd19hY3Rpb25fb2Zfc2V0X3ZsYW5fcGNwICoNCi0JCQlvZl9zZXRfdmxhbl9wY3A7DQot CX0gY29uZjsNCi0JdW5pb24gew0KLQkJc3RydWN0IGZsb3dfdGNmX3R1bm5lbF9oZHIgKmhkcjsN Ci0JCXN0cnVjdCBmbG93X3RjZl92eGxhbl9kZWNhcCAqdnhsYW47DQotCX0gZGVjYXAgPSB7DQot CQkuaGRyID0gTlVMTCwNCi0JfTsNCi0JdW5pb24gew0KLQkJc3RydWN0IGZsb3dfdGNmX3R1bm5l bF9oZHIgKmhkcjsNCi0JCXN0cnVjdCBmbG93X3RjZl92eGxhbl9lbmNhcCAqdnhsYW47DQotCX0g ZW5jYXAgPSB7DQotCQkuaGRyID0gTlVMTCwNCi0JfTsNCi0Jc3RydWN0IGZsb3dfdGNmX3B0b2kg cHRvaVtQVE9JX1RBQkxFX1NaX01BWChkZXYpXTsNCi0Jc3RydWN0IG5sbXNnaGRyICpubGggPSBk ZXZfZmxvdy0+dGNmLm5saDsNCi0Jc3RydWN0IHRjbXNnICp0Y20gPSBkZXZfZmxvdy0+dGNmLnRj bTsNCi0JdWludDMyX3QgbmFfYWN0X2luZGV4X2N1cjsNCi0JcnRlX2JlMTZfdCBpbm5lcl9ldHlw ZSA9IFJURV9CRTE2KEVUSF9QX0FMTCk7DQotCXJ0ZV9iZTE2X3Qgb3V0ZXJfZXR5cGUgPSBSVEVf QkUxNihFVEhfUF9BTEwpOw0KLQlydGVfYmUxNl90IHZsYW5fZXR5cGUgPSBSVEVfQkUxNihFVEhf UF9BTEwpOw0KLQlib29sIGlwX3Byb3RvX3NldCA9IDA7DQotCWJvb2wgdHVubmVsX291dGVyID0g MDsNCi0Jc3RydWN0IG5sYXR0ciAqbmFfZmxvd2VyOw0KLQlzdHJ1Y3QgbmxhdHRyICpuYV9mbG93 ZXJfYWN0Ow0KLQlzdHJ1Y3QgbmxhdHRyICpuYV92bGFuX2lkID0gTlVMTDsNCi0Jc3RydWN0IG5s YXR0ciAqbmFfdmxhbl9wcmlvcml0eSA9IE5VTEw7DQotCXVpbnQ2NF90IGl0ZW1fZmxhZ3MgPSAw Ow0KLQlpbnQgcmV0Ow0KLQ0KLQljbGFpbV9ub256ZXJvKGZsb3dfdGNmX2J1aWxkX3B0b2lfdGFi bGUoZGV2LCBwdG9pLA0KLQkJCQkJCVBUT0lfVEFCTEVfU1pfTUFYKGRldikpKTsNCi0JaWYgKGRl dl9mbG93LT50Y2YudHVubmVsKSB7DQotCQlzd2l0Y2ggKGRldl9mbG93LT50Y2YudHVubmVsLT50 eXBlKSB7DQotCQljYXNlIEZMT1dfVENGX1RVTkFDVF9WWExBTl9ERUNBUDoNCi0JCQlkZWNhcC52 eGxhbiA9IGRldl9mbG93LT50Y2YudnhsYW5fZGVjYXA7DQotCQkJdHVubmVsX291dGVyID0gMTsN Ci0JCQlicmVhazsNCi0JCWNhc2UgRkxPV19UQ0ZfVFVOQUNUX1ZYTEFOX0VOQ0FQOg0KLQkJCWVu Y2FwLnZ4bGFuID0gZGV2X2Zsb3ctPnRjZi52eGxhbl9lbmNhcDsNCi0JCQlicmVhazsNCi0JCS8q IE5ldyB0dW5uZWwgYWN0aW9ucyBjYW4gYmUgYWRkZWQgaGVyZS4gKi8NCi0JCWRlZmF1bHQ6DQot CQkJYXNzZXJ0KGZhbHNlKTsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQlubGggPSBkZXZfZmxv dy0+dGNmLm5saDsNCi0JdGNtID0gZGV2X2Zsb3ctPnRjZi50Y207DQotCS8qIFByZXBhcmUgQVBJ IG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmVoYW5kLiAqLw0KLQlhc3NlcnQobmxoICE9IE5V TEwgJiYgdGNtICE9IE5VTEwpOw0KLQl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7DQotCXRj bS0+dGNtX2lmaW5kZXggPSBwdG9pWzBdLmlmaW5kZXg7DQotCXRjbS0+dGNtX3BhcmVudCA9IFRD X0hfTUFLRShUQ19IX0lOR1JFU1MsIFRDX0hfTUlOX0lOR1JFU1MpOw0KLQkvKg0KLQkgKiBQcmlv cml0eSBjYW5ub3QgYmUgemVybyB0byBwcmV2ZW50IHRoZSBrZXJuZWwgZnJvbSBwaWNraW5nIG9u ZQ0KLQkgKiBhdXRvbWF0aWNhbGx5Lg0KLQkgKi8NCi0JdGNtLT50Y21faW5mbyA9IFRDX0hfTUFL RSgoYXR0ci0+cHJpb3JpdHkgKyAxKSA8PCAxNiwgb3V0ZXJfZXR5cGUpOw0KLQlpZiAoYXR0ci0+ Z3JvdXAgPiAwKQ0KLQkJbW5sX2F0dHJfcHV0X3UzMihubGgsIFRDQV9DSEFJTiwgYXR0ci0+Z3Jv dXApOw0KLQltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRDQV9LSU5ELCAiZmxvd2VyIik7DQotCW5h X2Zsb3dlciA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBUQ0FfT1BUSU9OUyk7DQotCWZvciAo OyBpdGVtcy0+dHlwZSAhPSBSVEVfRkxPV19JVEVNX1RZUEVfRU5EOyBpdGVtcysrKSB7DQotCQl1 bnNpZ25lZCBpbnQgaTsNCi0NCi0JCXN3aXRjaCAoaXRlbXMtPnR5cGUpIHsNCi0JCWNhc2UgUlRF X0ZMT1dfSVRFTV9UWVBFX1ZPSUQ6DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0lURU1f VFlQRV9QT1JUX0lEOg0KLQkJCW1hc2sucG9ydF9pZCA9IGZsb3dfdGNmX2l0ZW1fbWFzaw0KLQkJ CQkoaXRlbXMsICZydGVfZmxvd19pdGVtX3BvcnRfaWRfbWFzaywNCi0JCQkJICZmbG93X3RjZl9t YXNrX3N1cHBvcnRlZC5wb3J0X2lkLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfZW1wdHkucG9ydF9p ZCwNCi0JCQkJIHNpemVvZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC5wb3J0X2lkKSwNCi0JCQkJ IGVycm9yKTsNCi0JCQlhc3NlcnQobWFzay5wb3J0X2lkKTsNCi0JCQlpZiAobWFzay5wb3J0X2lk ID09ICZmbG93X3RjZl9tYXNrX2VtcHR5LnBvcnRfaWQpDQotCQkJCWJyZWFrOw0KLQkJCXNwZWMu cG9ydF9pZCA9IGl0ZW1zLT5zcGVjOw0KLQkJCWlmICghbWFzay5wb3J0X2lkLT5pZCkNCi0JCQkJ aSA9IDA7DQotCQkJZWxzZQ0KLQkJCQlmb3IgKGkgPSAwOyBwdG9pW2ldLmlmaW5kZXg7ICsraSkN Ci0JCQkJCWlmIChwdG9pW2ldLnBvcnRfaWQgPT0gc3BlYy5wb3J0X2lkLT5pZCkNCi0JCQkJCQli cmVhazsNCi0JCQlhc3NlcnQocHRvaVtpXS5pZmluZGV4KTsNCi0JCQl0Y20tPnRjbV9pZmluZGV4 ID0gcHRvaVtpXS5pZmluZGV4Ow0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZ UEVfRVRIOg0KLQkJCWl0ZW1fZmxhZ3MgfD0gKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJf VFVOTkVMKSA/DQotCQkJCSAgICAgIE1MWDVfRkxPV19MQVlFUl9JTk5FUl9MMiA6DQotCQkJCSAg ICAgIE1MWDVfRkxPV19MQVlFUl9PVVRFUl9MMjsNCi0JCQltYXNrLmV0aCA9IGZsb3dfdGNmX2l0 ZW1fbWFzaw0KLQkJCQkoaXRlbXMsICZydGVfZmxvd19pdGVtX2V0aF9tYXNrLA0KLQkJCQkgJmZs b3dfdGNmX21hc2tfc3VwcG9ydGVkLmV0aCwNCi0JCQkJICZmbG93X3RjZl9tYXNrX2VtcHR5LmV0 aCwNCi0JCQkJIHNpemVvZihmbG93X3RjZl9tYXNrX3N1cHBvcnRlZC5ldGgpLA0KLQkJCQkgZXJy b3IpOw0KLQkJCWFzc2VydChtYXNrLmV0aCk7DQotCQkJaWYgKG1hc2suZXRoID09ICZmbG93X3Rj Zl9tYXNrX2VtcHR5LmV0aCkNCi0JCQkJYnJlYWs7DQotCQkJc3BlYy5ldGggPSBpdGVtcy0+c3Bl YzsNCi0JCQlpZiAobWFzay5ldGgtPnR5cGUpIHsNCi0JCQkJaWYgKGl0ZW1fZmxhZ3MgJiBNTFg1 X0ZMT1dfTEFZRVJfVFVOTkVMKQ0KLQkJCQkJaW5uZXJfZXR5cGUgPSBzcGVjLmV0aC0+dHlwZTsN Ci0JCQkJZWxzZQ0KLQkJCQkJb3V0ZXJfZXR5cGUgPSBzcGVjLmV0aC0+dHlwZTsNCi0JCQl9DQot CQkJaWYgKHR1bm5lbF9vdXRlcikgew0KLQkJCQlEUlZfTE9HKFdBUk5JTkcsDQotCQkJCQkib3V0 ZXIgTDIgYWRkcmVzc2VzIGNhbm5vdCBiZSINCi0JCQkJCSIgZm9yY2VkIGlzIG91dGVyIG9uZXMg Zm9yIHR1bm5lbCwiDQotCQkJCQkiIHBhcmFtZXRlciBpcyBpZ25vcmVkIik7DQotCQkJCWJyZWFr Ow0KLQkJCX0NCi0JCQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcigmbWFzay5ldGgtPmRzdCkpIHsN Ci0JCQkJbW5sX2F0dHJfcHV0KG5saCwgVENBX0ZMT1dFUl9LRVlfRVRIX0RTVCwNCi0JCQkJCSAg ICAgRVRIRVJfQUREUl9MRU4sDQotCQkJCQkgICAgIHNwZWMuZXRoLT5kc3QuYWRkcl9ieXRlcyk7 DQotCQkJCW1ubF9hdHRyX3B1dChubGgsIFRDQV9GTE9XRVJfS0VZX0VUSF9EU1RfTUFTSywNCi0J CQkJCSAgICAgRVRIRVJfQUREUl9MRU4sDQotCQkJCQkgICAgIG1hc2suZXRoLT5kc3QuYWRkcl9i eXRlcyk7DQotCQkJfQ0KLQkJCWlmICghaXNfemVyb19ldGhlcl9hZGRyKCZtYXNrLmV0aC0+c3Jj KSkgew0KLQkJCQltbmxfYXR0cl9wdXQobmxoLCBUQ0FfRkxPV0VSX0tFWV9FVEhfU1JDLA0KLQkJ CQkJICAgICBFVEhFUl9BRERSX0xFTiwNCi0JCQkJCSAgICAgc3BlYy5ldGgtPnNyYy5hZGRyX2J5 dGVzKTsNCi0JCQkJbW5sX2F0dHJfcHV0KG5saCwgVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ19NQVNL LA0KLQkJCQkJICAgICBFVEhFUl9BRERSX0xFTiwNCi0JCQkJCSAgICAgbWFzay5ldGgtPnNyYy5h ZGRyX2J5dGVzKTsNCi0JCQl9DQotCQkJYXNzZXJ0KGRldl9mbG93LT50Y2YubmxzaXplID49IG5s aC0+bmxtc2dfbGVuKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1ZM QU46DQotCQkJYXNzZXJ0KCFlbmNhcC5oZHIpOw0KLQkJCWFzc2VydCghZGVjYXAuaGRyKTsNCi0J CQlhc3NlcnQoIXR1bm5lbF9vdXRlcik7DQotCQkJaXRlbV9mbGFncyB8PSBNTFg1X0ZMT1dfTEFZ RVJfT1VURVJfVkxBTjsNCi0JCQltYXNrLnZsYW4gPSBmbG93X3RjZl9pdGVtX21hc2sNCi0JCQkJ KGl0ZW1zLCAmcnRlX2Zsb3dfaXRlbV92bGFuX21hc2ssDQotCQkJCSAmZmxvd190Y2ZfbWFza19z dXBwb3J0ZWQudmxhbiwNCi0JCQkJICZmbG93X3RjZl9tYXNrX2VtcHR5LnZsYW4sDQotCQkJCSBz aXplb2YoZmxvd190Y2ZfbWFza19zdXBwb3J0ZWQudmxhbiksDQotCQkJCSBlcnJvcik7DQotCQkJ YXNzZXJ0KG1hc2sudmxhbik7DQotCQkJaWYgKG1hc2sudmxhbiA9PSAmZmxvd190Y2ZfbWFza19l bXB0eS52bGFuKQ0KLQkJCQlicmVhazsNCi0JCQlzcGVjLnZsYW4gPSBpdGVtcy0+c3BlYzsNCi0J CQlhc3NlcnQob3V0ZXJfZXR5cGUgPT0gUlRFX0JFMTYoRVRIX1BfQUxMKSB8fA0KLQkJCSAgICAg ICBvdXRlcl9ldHlwZSA9PSBSVEVfQkUxNihFVEhfUF84MDIxUSkpOw0KLQkJCW91dGVyX2V0eXBl ID0gUlRFX0JFMTYoRVRIX1BfODAyMVEpOw0KLQkJCWlmIChtYXNrLnZsYW4tPmlubmVyX3R5cGUp DQotCQkJCXZsYW5fZXR5cGUgPSBzcGVjLnZsYW4tPmlubmVyX3R5cGU7DQotCQkJaWYgKG1hc2su dmxhbi0+dGNpICYgUlRFX0JFMTYoMHhlMDAwKSkNCi0JCQkJbW5sX2F0dHJfcHV0X3U4KG5saCwg VENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPLA0KLQkJCQkJCShydGVfYmVfdG9fY3B1XzE2DQotCQkJ CQkJIChzcGVjLnZsYW4tPnRjaSkgPj4gMTMpICYgMHg3KTsNCi0JCQlpZiAobWFzay52bGFuLT50 Y2kgJiBSVEVfQkUxNigweDBmZmYpKQ0KLQkJCQltbmxfYXR0cl9wdXRfdTE2KG5saCwgVENBX0ZM T1dFUl9LRVlfVkxBTl9JRCwNCi0JCQkJCQkgcnRlX2JlX3RvX2NwdV8xNg0KLQkJCQkJCSAoc3Bl Yy52bGFuLT50Y2kgJg0KLQkJCQkJCSAgUlRFX0JFMTYoMHgwZmZmKSkpOw0KLQkJCWFzc2VydChk ZXZfZmxvdy0+dGNmLm5sc2l6ZSA+PSBubGgtPm5sbXNnX2xlbik7DQotCQkJYnJlYWs7DQotCQlj YXNlIFJURV9GTE9XX0lURU1fVFlQRV9JUFY0Og0KLQkJCWl0ZW1fZmxhZ3MgfD0gKGl0ZW1fZmxh Z3MgJiBNTFg1X0ZMT1dfTEFZRVJfVFVOTkVMKSA/DQotCQkJCSAgICAgIE1MWDVfRkxPV19MQVlF Ul9JTk5FUl9MM19JUFY0IDoNCi0JCQkJICAgICAgTUxYNV9GTE9XX0xBWUVSX09VVEVSX0wzX0lQ VjQ7DQotCQkJbWFzay5pcHY0ID0gZmxvd190Y2ZfaXRlbV9tYXNrDQotCQkJCShpdGVtcywgJnJ0 ZV9mbG93X2l0ZW1faXB2NF9tYXNrLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLmlw djQsDQotCQkJCSAmZmxvd190Y2ZfbWFza19lbXB0eS5pcHY0LA0KLQkJCQkgc2l6ZW9mKGZsb3df dGNmX21hc2tfc3VwcG9ydGVkLmlwdjQpLA0KLQkJCQkgZXJyb3IpOw0KLQkJCWFzc2VydChtYXNr LmlwdjQpOw0KLQkJCWlmIChpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgew0K LQkJCQlhc3NlcnQoaW5uZXJfZXR5cGUgPT0gUlRFX0JFMTYoRVRIX1BfQUxMKSB8fA0KLQkJCQkg ICAgICAgaW5uZXJfZXR5cGUgPT0gUlRFX0JFMTYoRVRIX1BfSVApKTsNCi0JCQkJaW5uZXJfZXR5 cGUgPSBSVEVfQkUxNihFVEhfUF9JUCk7DQotCQkJfSBlbHNlIGlmIChvdXRlcl9ldHlwZSA9PSBS VEVfQkUxNihFVEhfUF84MDIxUSkpIHsNCi0JCQkJYXNzZXJ0KHZsYW5fZXR5cGUgPT0gUlRFX0JF MTYoRVRIX1BfQUxMKSB8fA0KLQkJCQkgICAgICAgdmxhbl9ldHlwZSA9PSBSVEVfQkUxNihFVEhf UF9JUCkpOw0KLQkJCQl2bGFuX2V0eXBlID0gUlRFX0JFMTYoRVRIX1BfSVApOw0KLQkJCX0gZWxz ZSB7DQotCQkJCWFzc2VydChvdXRlcl9ldHlwZSA9PSBSVEVfQkUxNihFVEhfUF9BTEwpIHx8DQot CQkJCSAgICAgICBvdXRlcl9ldHlwZSA9PSBSVEVfQkUxNihFVEhfUF9JUCkpOw0KLQkJCQlvdXRl cl9ldHlwZSA9IFJURV9CRTE2KEVUSF9QX0lQKTsNCi0JCQl9DQotCQkJc3BlYy5pcHY0ID0gaXRl bXMtPnNwZWM7DQotCQkJaWYgKCF0dW5uZWxfb3V0ZXIgJiYgbWFzay5pcHY0LT5oZHIubmV4dF9w cm90b19pZCkgew0KLQkJCQkvKg0KLQkJCQkgKiBObyB3YXkgdG8gc2V0IElQIHByb3RvY29sIGZv ciBvdXRlciB0dW5uZWwNCi0JCQkJICogbGF5ZXJzLiBVc3VhbGx5IGl0IGlzIGZpeGVkLCBmb3Ig ZXhhbXBsZSwNCi0JCQkJICogdG8gVURQIGZvciBWWExBTi9HUEUuDQotCQkJCSAqLw0KLQkJCQlh c3NlcnQoc3BlYy5pcHY0KTsgLyogTWFzayBpcyBub3QgZW1wdHkuICovDQotCQkJCW1ubF9hdHRy X3B1dF91OChubGgsIFRDQV9GTE9XRVJfS0VZX0lQX1BST1RPLA0KLQkJCQkJCXNwZWMuaXB2NC0+ aGRyLm5leHRfcHJvdG9faWQpOw0KLQkJCQlpcF9wcm90b19zZXQgPSAxOw0KLQkJCX0NCi0JCQlp ZiAobWFzay5pcHY0ID09ICZmbG93X3RjZl9tYXNrX2VtcHR5LmlwdjQgfHwNCi0JCQkgICAgICgh bWFzay5pcHY0LT5oZHIuc3JjX2FkZHIgJiYNCi0JCQkgICAgICAhbWFzay5pcHY0LT5oZHIuZHN0 X2FkZHIpKSB7DQotCQkJCWlmICghdHVubmVsX291dGVyKQ0KLQkJCQkJYnJlYWs7DQotCQkJCS8q DQotCQkJCSAqIEZvciB0dW5uZWwgb3V0ZXIgd2UgbXVzdCBzZXQgb3V0ZXIgSVAga2V5DQotCQkJ CSAqIGFueXdheSwgZXZlbiBpZiB0aGUgc3BlY2lmaWNhdGlvbi9tYXNrIGlzDQotCQkJCSAqIGVt cHR5LiBUaGVyZSBpcyBubyBhbm90aGVyIHdheSB0byB0ZWxsDQotCQkJCSAqIGtlcm5lbCBhYm91 dCBoZSBvdXRlciBsYXllciBwcm90b2NvbC4NCi0JCQkJICovDQotCQkJCW1ubF9hdHRyX3B1dF91 MzINCi0JCQkJCShubGgsIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQywNCi0JCQkJCSBtYXNr LmlwdjQtPmhkci5zcmNfYWRkcik7DQotCQkJCW1ubF9hdHRyX3B1dF91MzINCi0JCQkJCShubGgs IFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQ19NQVNLLA0KLQkJCQkJIG1hc2suaXB2NC0+aGRy LnNyY19hZGRyKTsNCi0JCQkJYXNzZXJ0KGRldl9mbG93LT50Y2YubmxzaXplID49IG5saC0+bmxt c2dfbGVuKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWlmIChtYXNrLmlwdjQtPmhkci5zcmNf YWRkcikgew0KLQkJCQltbmxfYXR0cl9wdXRfdTMyDQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIg Pw0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQyA6DQotCQkJCQkgVENBX0ZMT1dF Ul9LRVlfSVBWNF9TUkMsDQotCQkJCQkgc3BlYy5pcHY0LT5oZHIuc3JjX2FkZHIpOw0KLQkJCQlt bmxfYXR0cl9wdXRfdTMyDQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRDQV9G TE9XRVJfS0VZX0VOQ19JUFY0X1NSQ19NQVNLIDoNCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9JUFY0 X1NSQ19NQVNLLA0KLQkJCQkJIG1hc2suaXB2NC0+aGRyLnNyY19hZGRyKTsNCi0JCQl9DQotCQkJ aWYgKG1hc2suaXB2NC0+aGRyLmRzdF9hZGRyKSB7DQotCQkJCW1ubF9hdHRyX3B1dF91MzINCi0J CQkJCShubGgsIHR1bm5lbF9vdXRlciA/DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRf RFNUIDoNCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9JUFY0X0RTVCwNCi0JCQkJCSBzcGVjLmlwdjQt Pmhkci5kc3RfYWRkcik7DQotCQkJCW1ubF9hdHRyX3B1dF91MzINCi0JCQkJCShubGgsIHR1bm5l bF9vdXRlciA/DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0sgOg0KLQkJ CQkJIFRDQV9GTE9XRVJfS0VZX0lQVjRfRFNUX01BU0ssDQotCQkJCQkgbWFzay5pcHY0LT5oZHIu ZHN0X2FkZHIpOw0KLQkJCX0NCi0JCQlpZiAobWFzay5pcHY0LT5oZHIudGltZV90b19saXZlKSB7 DQotCQkJCW1ubF9hdHRyX3B1dF91OA0KLQkJCQkJKG5saCwgdHVubmVsX291dGVyID8NCi0JCQkJ CSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBfVFRMIDoNCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9JUF9U VEwsDQotCQkJCQkgc3BlYy5pcHY0LT5oZHIudGltZV90b19saXZlKTsNCi0JCQkJbW5sX2F0dHJf cHV0X3U4DQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZ X0VOQ19JUF9UVExfTUFTSyA6DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfSVBfVFRMX01BU0ssDQot CQkJCQkgbWFzay5pcHY0LT5oZHIudGltZV90b19saXZlKTsNCi0JCQl9DQotCQkJaWYgKG1hc2su aXB2NC0+aGRyLnR5cGVfb2Zfc2VydmljZSkgew0KLQkJCQltbmxfYXR0cl9wdXRfdTgNCi0JCQkJ CShubGgsIHR1bm5lbF9vdXRlciA/DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX0lQX1RPUyA6 DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfSVBfVE9TLA0KLQkJCQkJIHNwZWMuaXB2NC0+aGRyLnR5 cGVfb2Zfc2VydmljZSk7DQotCQkJCW1ubF9hdHRyX3B1dF91OA0KLQkJCQkJKG5saCwgdHVubmVs X291dGVyID8NCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBfVE9TX01BU0sgOg0KLQkJCQkJ IFRDQV9GTE9XRVJfS0VZX0lQX1RPU19NQVNLLA0KLQkJCQkJIG1hc2suaXB2NC0+aGRyLnR5cGVf b2Zfc2VydmljZSk7DQotCQkJfQ0KLQkJCWFzc2VydChkZXZfZmxvdy0+dGNmLm5sc2l6ZSA+PSBu bGgtPm5sbXNnX2xlbik7DQotCQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0lURU1fVFlQRV9J UFY2OiB7DQotCQkJYm9vbCBpcHY2X3NyYywgaXB2Nl9kc3Q7DQotCQkJdWludDhfdCBtc2s2LCB0 b3M2Ow0KLQ0KLQkJCWl0ZW1fZmxhZ3MgfD0gKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJf VFVOTkVMKSA/DQotCQkJCSAgICAgIE1MWDVfRkxPV19MQVlFUl9JTk5FUl9MM19JUFY2IDoNCi0J CQkJICAgICAgTUxYNV9GTE9XX0xBWUVSX09VVEVSX0wzX0lQVjY7DQotCQkJbWFzay5pcHY2ID0g Zmxvd190Y2ZfaXRlbV9tYXNrDQotCQkJCShpdGVtcywgJnJ0ZV9mbG93X2l0ZW1faXB2Nl9tYXNr LA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLmlwdjYsDQotCQkJCSAmZmxvd190Y2Zf bWFza19lbXB0eS5pcHY2LA0KLQkJCQkgc2l6ZW9mKGZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLmlw djYpLA0KLQkJCQkgZXJyb3IpOw0KLQkJCWFzc2VydChtYXNrLmlwdjYpOw0KLQkJCWlmIChpdGVt X2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgew0KLQkJCQlhc3NlcnQoaW5uZXJfZXR5 cGUgPT0gUlRFX0JFMTYoRVRIX1BfQUxMKSB8fA0KLQkJCQkgICAgICAgaW5uZXJfZXR5cGUgPT0g UlRFX0JFMTYoRVRIX1BfSVBWNikpOw0KLQkJCQlpbm5lcl9ldHlwZSA9IFJURV9CRTE2KEVUSF9Q X0lQVjYpOw0KLQkJCX0gZWxzZSBpZiAob3V0ZXJfZXR5cGUgPT0gUlRFX0JFMTYoRVRIX1BfODAy MVEpKSB7DQotCQkJCWFzc2VydCh2bGFuX2V0eXBlID09IFJURV9CRTE2KEVUSF9QX0FMTCkgfHwN Ci0JCQkJICAgICAgIHZsYW5fZXR5cGUgPT0gUlRFX0JFMTYoRVRIX1BfSVBWNikpOw0KLQkJCQl2 bGFuX2V0eXBlID0gUlRFX0JFMTYoRVRIX1BfSVBWNik7DQotCQkJfSBlbHNlIHsNCi0JCQkJYXNz ZXJ0KG91dGVyX2V0eXBlID09IFJURV9CRTE2KEVUSF9QX0FMTCkgfHwNCi0JCQkJICAgICAgIG91 dGVyX2V0eXBlID09IFJURV9CRTE2KEVUSF9QX0lQVjYpKTsNCi0JCQkJb3V0ZXJfZXR5cGUgPSBS VEVfQkUxNihFVEhfUF9JUFY2KTsNCi0JCQl9DQotCQkJc3BlYy5pcHY2ID0gaXRlbXMtPnNwZWM7 DQotCQkJaWYgKCF0dW5uZWxfb3V0ZXIgJiYgbWFzay5pcHY2LT5oZHIucHJvdG8pIHsNCi0JCQkJ LyoNCi0JCQkJICogTm8gd2F5IHRvIHNldCBJUCBwcm90b2NvbCBmb3Igb3V0ZXIgdHVubmVsDQot CQkJCSAqIGxheWVycy4gVXN1YWxseSBpdCBpcyBmaXhlZCwgZm9yIGV4YW1wbGUsDQotCQkJCSAq IHRvIFVEUCBmb3IgVlhMQU4vR1BFLg0KLQkJCQkgKi8NCi0JCQkJYXNzZXJ0KHNwZWMuaXB2Nik7 IC8qIE1hc2sgaXMgbm90IGVtcHR5LiAqLw0KLQkJCQltbmxfYXR0cl9wdXRfdTgobmxoLCBUQ0Ff RkxPV0VSX0tFWV9JUF9QUk9UTywNCi0JCQkJCQlzcGVjLmlwdjYtPmhkci5wcm90byk7DQotCQkJ CWlwX3Byb3RvX3NldCA9IDE7DQotCQkJfQ0KLQkJCWlwdjZfZHN0ID0gIUlONl9JU19BRERSX1VO U1BFQ0lGSUVEDQotCQkJCQkJKG1hc2suaXB2Ni0+aGRyLmRzdF9hZGRyKTsNCi0JCQlpcHY2X3Ny YyA9ICFJTjZfSVNfQUREUl9VTlNQRUNJRklFRA0KLQkJCQkJCShtYXNrLmlwdjYtPmhkci5zcmNf YWRkcik7DQotCQkJaWYgKG1hc2suaXB2NiA9PSAmZmxvd190Y2ZfbWFza19lbXB0eS5pcHY2IHx8 DQotCQkJICAgICAoIWlwdjZfZHN0ICYmICFpcHY2X3NyYykpIHsNCi0JCQkJaWYgKCF0dW5uZWxf b3V0ZXIpDQotCQkJCQlicmVhazsNCi0JCQkJLyoNCi0JCQkJICogRm9yIHR1bm5lbCBvdXRlciB3 ZSBtdXN0IHNldCBvdXRlciBJUCBrZXkNCi0JCQkJICogYW55d2F5LCBldmVuIGlmIHRoZSBzcGVj aWZpY2F0aW9uL21hc2sgaXMNCi0JCQkJICogZW1wdHkuIFRoZXJlIGlzIG5vIGFub3RoZXIgd2F5 IHRvIHRlbGwNCi0JCQkJICoga2VybmVsIGFib3V0IGhlIG91dGVyIGxheWVyIHByb3RvY29sLg0K LQkJCQkgKi8NCi0JCQkJbW5sX2F0dHJfcHV0KG5saCwNCi0JCQkJCSAgICAgVENBX0ZMT1dFUl9L RVlfRU5DX0lQVjZfU1JDLA0KLQkJCQkJICAgICBJUFY2X0FERFJfTEVOLA0KLQkJCQkJICAgICBt YXNrLmlwdjYtPmhkci5zcmNfYWRkcik7DQotCQkJCW1ubF9hdHRyX3B1dChubGgsDQotCQkJCQkg ICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLA0KLQkJCQkJICAgICBJUFY2X0FE RFJfTEVOLA0KLQkJCQkJICAgICBtYXNrLmlwdjYtPmhkci5zcmNfYWRkcik7DQotCQkJCWFzc2Vy dChkZXZfZmxvdy0+dGNmLm5sc2l6ZSA+PSBubGgtPm5sbXNnX2xlbik7DQotCQkJCWJyZWFrOw0K LQkJCX0NCi0JCQlpZiAoaXB2Nl9zcmMpIHsNCi0JCQkJbW5sX2F0dHJfcHV0KG5saCwgdHVubmVs X291dGVyID8NCi0JCQkJCSAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDIDoNCi0JCQkJ CSAgICAgVENBX0ZMT1dFUl9LRVlfSVBWNl9TUkMsDQotCQkJCQkgICAgIElQVjZfQUREUl9MRU4s DQotCQkJCQkgICAgIHNwZWMuaXB2Ni0+aGRyLnNyY19hZGRyKTsNCi0JCQkJbW5sX2F0dHJfcHV0 KG5saCwgdHVubmVsX291dGVyID8NCi0JCQkJCSAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZf U1JDX01BU0sgOg0KLQkJCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9JUFY2X1NSQ19NQVNLLA0KLQkJ CQkJICAgICBJUFY2X0FERFJfTEVOLA0KLQkJCQkJICAgICBtYXNrLmlwdjYtPmhkci5zcmNfYWRk cik7DQotCQkJfQ0KLQkJCWlmIChpcHY2X2RzdCkgew0KLQkJCQltbmxfYXR0cl9wdXQobmxoLCB0 dW5uZWxfb3V0ZXIgPw0KLQkJCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1QgOg0K LQkJCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9JUFY2X0RTVCwNCi0JCQkJCSAgICAgSVBWNl9BRERS X0xFTiwNCi0JCQkJCSAgICAgc3BlYy5pcHY2LT5oZHIuZHN0X2FkZHIpOw0KLQkJCQltbmxfYXR0 cl9wdXQobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNf SVBWNl9EU1RfTUFTSyA6DQotCQkJCQkgICAgIFRDQV9GTE9XRVJfS0VZX0lQVjZfRFNUX01BU0ss DQotCQkJCQkgICAgIElQVjZfQUREUl9MRU4sDQotCQkJCQkgICAgIG1hc2suaXB2Ni0+aGRyLmRz dF9hZGRyKTsNCi0JCQl9DQotCQkJaWYgKG1hc2suaXB2Ni0+aGRyLmhvcF9saW1pdHMpIHsNCi0J CQkJbW5sX2F0dHJfcHV0X3U4DQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRD QV9GTE9XRVJfS0VZX0VOQ19JUF9UVEwgOg0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX0lQX1RUTCwN Ci0JCQkJCSBzcGVjLmlwdjYtPmhkci5ob3BfbGltaXRzKTsNCi0JCQkJbW5sX2F0dHJfcHV0X3U4 DQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19J UF9UVExfTUFTSyA6DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfSVBfVFRMX01BU0ssDQotCQkJCQkg bWFzay5pcHY2LT5oZHIuaG9wX2xpbWl0cyk7DQotCQkJfQ0KLQkJCW1zazYgPSAocnRlX2JlX3Rv X2NwdV8zMihtYXNrLmlwdjYtPmhkci52dGNfZmxvdykgPj4NCi0JCQkJSVBWNl9IRFJfVENfU0hJ RlQpICYgMHhmZjsNCi0JCQlpZiAobXNrNikgew0KLQkJCQl0b3M2ID0gKHJ0ZV9iZV90b19jcHVf MzINCi0JCQkJCShzcGVjLmlwdjYtPmhkci52dGNfZmxvdykgPj4NCi0JCQkJCQlJUFY2X0hEUl9U Q19TSElGVCkgJiAweGZmOw0KLQkJCQltbmxfYXR0cl9wdXRfdTgNCi0JCQkJCShubGgsIHR1bm5l bF9vdXRlciA/DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX0lQX1RPUyA6DQotCQkJCQkgVENB X0ZMT1dFUl9LRVlfSVBfVE9TLCB0b3M2KTsNCi0JCQkJbW5sX2F0dHJfcHV0X3U4DQotCQkJCQko bmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19JUF9UT1NfTUFT SyA6DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfSVBfVE9TX01BU0ssIG1zazYpOw0KLQkJCX0NCi0J CQlhc3NlcnQoZGV2X2Zsb3ctPnRjZi5ubHNpemUgPj0gbmxoLT5ubG1zZ19sZW4pOw0KLQkJCWJy ZWFrOw0KLQkJfQ0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfVURQOg0KLQkJCWl0ZW1fZmxh Z3MgfD0gKGl0ZW1fZmxhZ3MgJiBNTFg1X0ZMT1dfTEFZRVJfVFVOTkVMKSA/DQotCQkJCSAgICAg IE1MWDVfRkxPV19MQVlFUl9JTk5FUl9MNF9VRFAgOg0KLQkJCQkgICAgICBNTFg1X0ZMT1dfTEFZ RVJfT1VURVJfTDRfVURQOw0KLQkJCW1hc2sudWRwID0gZmxvd190Y2ZfaXRlbV9tYXNrDQotCQkJ CShpdGVtcywgJnJ0ZV9mbG93X2l0ZW1fdWRwX21hc2ssDQotCQkJCSAmZmxvd190Y2ZfbWFza19z dXBwb3J0ZWQudWRwLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfZW1wdHkudWRwLA0KLQkJCQkgc2l6 ZW9mKGZsb3dfdGNmX21hc2tfc3VwcG9ydGVkLnVkcCksDQotCQkJCSBlcnJvcik7DQotCQkJYXNz ZXJ0KG1hc2sudWRwKTsNCi0JCQlzcGVjLnVkcCA9IGl0ZW1zLT5zcGVjOw0KLQkJCWlmICghdHVu bmVsX291dGVyKSB7DQotCQkJCWlmICghaXBfcHJvdG9fc2V0KQ0KLQkJCQkJbW5sX2F0dHJfcHV0 X3U4DQotCQkJCQkJKG5saCwgVENBX0ZMT1dFUl9LRVlfSVBfUFJPVE8sDQotCQkJCQkJSVBQUk9U T19VRFApOw0KLQkJCQlpZiAobWFzay51ZHAgPT0gJmZsb3dfdGNmX21hc2tfZW1wdHkudWRwKQ0K LQkJCQkJYnJlYWs7DQotCQkJfSBlbHNlIHsNCi0JCQkJYXNzZXJ0KG1hc2sudWRwICE9ICZmbG93 X3RjZl9tYXNrX2VtcHR5LnVkcCk7DQotCQkJCWRlY2FwLnZ4bGFuLT51ZHBfcG9ydCA9DQotCQkJ CQlydGVfYmVfdG9fY3B1XzE2DQotCQkJCQkJKHNwZWMudWRwLT5oZHIuZHN0X3BvcnQpOw0KLQkJ CX0NCi0JCQlpZiAobWFzay51ZHAtPmhkci5zcmNfcG9ydCkgew0KLQkJCQltbmxfYXR0cl9wdXRf dTE2DQotCQkJCQkobmxoLCB0dW5uZWxfb3V0ZXIgPw0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX0VO Q19VRFBfU1JDX1BPUlQgOg0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkMsDQotCQkJCQkg c3BlYy51ZHAtPmhkci5zcmNfcG9ydCk7DQotCQkJCW1ubF9hdHRyX3B1dF91MTYNCi0JCQkJCShu bGgsIHR1bm5lbF9vdXRlciA/DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX1VEUF9TUkNfUE9S VF9NQVNLIDoNCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssDQotCQkJCQkgbWFz ay51ZHAtPmhkci5zcmNfcG9ydCk7DQotCQkJfQ0KLQkJCWlmIChtYXNrLnVkcC0+aGRyLmRzdF9w b3J0KSB7DQotCQkJCW1ubF9hdHRyX3B1dF91MTYNCi0JCQkJCShubGgsIHR1bm5lbF9vdXRlciA/ DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX1VEUF9EU1RfUE9SVCA6DQotCQkJCQkgVENBX0ZM T1dFUl9LRVlfVURQX0RTVCwNCi0JCQkJCSBzcGVjLnVkcC0+aGRyLmRzdF9wb3J0KTsNCi0JCQkJ bW5sX2F0dHJfcHV0X3UxNg0KLQkJCQkJKG5saCwgdHVubmVsX291dGVyID8NCi0JCQkJCSBUQ0Ff RkxPV0VSX0tFWV9FTkNfVURQX0RTVF9QT1JUX01BU0sgOg0KLQkJCQkJIFRDQV9GTE9XRVJfS0VZ X1VEUF9EU1RfTUFTSywNCi0JCQkJCSBtYXNrLnVkcC0+aGRyLmRzdF9wb3J0KTsNCi0JCQl9DQot CQkJYXNzZXJ0KGRldl9mbG93LT50Y2YubmxzaXplID49IG5saC0+bmxtc2dfbGVuKTsNCi0JCQli cmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfSVRFTV9UWVBFX1RDUDoNCi0JCQlpdGVtX2ZsYWdzIHw9 IChpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgPw0KLQkJCQkgICAgICBNTFg1 X0ZMT1dfTEFZRVJfSU5ORVJfTDRfVENQIDoNCi0JCQkJICAgICAgTUxYNV9GTE9XX0xBWUVSX09V VEVSX0w0X1RDUDsNCi0JCQltYXNrLnRjcCA9IGZsb3dfdGNmX2l0ZW1fbWFzaw0KLQkJCQkoaXRl bXMsICZydGVfZmxvd19pdGVtX3RjcF9tYXNrLA0KLQkJCQkgJmZsb3dfdGNmX21hc2tfc3VwcG9y dGVkLnRjcCwNCi0JCQkJICZmbG93X3RjZl9tYXNrX2VtcHR5LnRjcCwNCi0JCQkJIHNpemVvZihm bG93X3RjZl9tYXNrX3N1cHBvcnRlZC50Y3ApLA0KLQkJCQkgZXJyb3IpOw0KLQkJCWFzc2VydCht YXNrLnRjcCk7DQotCQkJaWYgKCFpcF9wcm90b19zZXQpDQotCQkJCW1ubF9hdHRyX3B1dF91OChu bGgsIFRDQV9GTE9XRVJfS0VZX0lQX1BST1RPLA0KLQkJCQkJCUlQUFJPVE9fVENQKTsNCi0JCQlp ZiAobWFzay50Y3AgPT0gJmZsb3dfdGNmX21hc2tfZW1wdHkudGNwKQ0KLQkJCQlicmVhazsNCi0J CQlzcGVjLnRjcCA9IGl0ZW1zLT5zcGVjOw0KLQkJCWlmIChtYXNrLnRjcC0+aGRyLnNyY19wb3J0 KSB7DQotCQkJCW1ubF9hdHRyX3B1dF91MTYobmxoLCBUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDLA0K LQkJCQkJCSBzcGVjLnRjcC0+aGRyLnNyY19wb3J0KTsNCi0JCQkJbW5sX2F0dHJfcHV0X3UxNihu bGgsDQotCQkJCQkJIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkNfTUFTSywNCi0JCQkJCQkgbWFzay50 Y3AtPmhkci5zcmNfcG9ydCk7DQotCQkJfQ0KLQkJCWlmIChtYXNrLnRjcC0+aGRyLmRzdF9wb3J0 KSB7DQotCQkJCW1ubF9hdHRyX3B1dF91MTYobmxoLCBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNULA0K LQkJCQkJCSBzcGVjLnRjcC0+aGRyLmRzdF9wb3J0KTsNCi0JCQkJbW5sX2F0dHJfcHV0X3UxNihu bGgsDQotCQkJCQkJIFRDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTSywNCi0JCQkJCQkgbWFzay50 Y3AtPmhkci5kc3RfcG9ydCk7DQotCQkJfQ0KLQkJCWlmIChtYXNrLnRjcC0+aGRyLnRjcF9mbGFn cykgew0KLQkJCQltbmxfYXR0cl9wdXRfdTE2DQotCQkJCQkobmxoLA0KLQkJCQkJIFRDQV9GTE9X RVJfS0VZX1RDUF9GTEFHUywNCi0JCQkJCSBydGVfY3B1X3RvX2JlXzE2DQotCQkJCQkJKHNwZWMu dGNwLT5oZHIudGNwX2ZsYWdzKSk7DQotCQkJCW1ubF9hdHRyX3B1dF91MTYNCi0JCQkJCShubGgs DQotCQkJCQkgVENBX0ZMT1dFUl9LRVlfVENQX0ZMQUdTX01BU0ssDQotCQkJCQkgcnRlX2NwdV90 b19iZV8xNg0KLQkJCQkJCShtYXNrLnRjcC0+aGRyLnRjcF9mbGFncykpOw0KLQkJCX0NCi0JCQlh c3NlcnQoZGV2X2Zsb3ctPnRjZi5ubHNpemUgPj0gbmxoLT5ubG1zZ19sZW4pOw0KLQkJCWJyZWFr Ow0KLQkJY2FzZSBSVEVfRkxPV19JVEVNX1RZUEVfVlhMQU46DQotCQkJYXNzZXJ0KGRlY2FwLnZ4 bGFuKTsNCi0JCQl0dW5uZWxfb3V0ZXIgPSAwOw0KLQkJCWl0ZW1fZmxhZ3MgfD0gTUxYNV9GTE9X X0xBWUVSX1ZYTEFOOw0KLQkJCXNwZWMudnhsYW4gPSBpdGVtcy0+c3BlYzsNCi0JCQltbmxfYXR0 cl9wdXRfdTMyKG5saCwNCi0JCQkJCSBUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELA0KLQkJCQkJ IHZ4bGFuX3ZuaV9hc19iZTMyKHNwZWMudnhsYW4tPnZuaSkpOw0KLQkJCWFzc2VydChkZXZfZmxv dy0+dGNmLm5sc2l6ZSA+PSBubGgtPm5sbXNnX2xlbik7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0 Og0KLQkJCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkJ ICBSVEVfRkxPV19FUlJPUl9UWVBFX0lURU0sDQotCQkJCQkJICBOVUxMLCAiaXRlbSBub3Qgc3Vw cG9ydGVkIik7DQotCQl9DQotCX0NCi0JLyoNCi0JICogU2V0IHRoZSBldGhlcl90eXBlIGZsb3dl ciBrZXkgYW5kIHRjIHJ1bGUgcHJvdG9jb2w6DQotCSAqIC0gaWYgdGhlcmUgaXMgbm9yIFZMQU4g bmVpdGhlciBWWExBTiB0aGUga2V5IGlzIHRha2VuIGZyb20NCi0JICogICBldGggaXRlbSBkaXJl Y3RseSBvciBkZWR1Y2VkIGZyb20gTDMgaXRlbXMuDQotCSAqIC0gaWYgdGhlcmUgaXMgdmxhbiBp dGVtIHRoZW4ga2V5IGlzIGZpeGVkIHRvIDgwMi4xcS4NCi0JICogLSBpZiB0aGVyZSBpcyB2eGxh biBpdGVtIHRoZW4ga2V5IGlzIHNldCB0byBpbm5lciB0dW5uZWwgdHlwZS4NCi0JICogLSBzaW11 bHRhbmVvdXMgdmxhbiBhbmQgdnhsYW4gaXRlbXMgYXJlIHByb2hpYml0ZWQuDQotCSAqLw0KLQlp ZiAob3V0ZXJfZXR5cGUgIT0gUlRFX0JFMTYoRVRIX1BfQUxMKSkgew0KLQkJdGNtLT50Y21faW5m byA9IFRDX0hfTUFLRSgoYXR0ci0+cHJpb3JpdHkgKyAxKSA8PCAxNiwNCi0JCQkJCSAgIG91dGVy X2V0eXBlKTsNCi0JCWlmIChpdGVtX2ZsYWdzICYgTUxYNV9GTE9XX0xBWUVSX1RVTk5FTCkgew0K LQkJCWlmIChpbm5lcl9ldHlwZSAhPSBSVEVfQkUxNihFVEhfUF9BTEwpKQ0KLQkJCQltbmxfYXR0 cl9wdXRfdTE2KG5saCwNCi0JCQkJCQkgVENBX0ZMT1dFUl9LRVlfRVRIX1RZUEUsDQotCQkJCQkJ IGlubmVyX2V0eXBlKTsNCi0JCX0gZWxzZSB7DQotCQkJbW5sX2F0dHJfcHV0X3UxNihubGgsDQot CQkJCQkgVENBX0ZMT1dFUl9LRVlfRVRIX1RZUEUsDQotCQkJCQkgb3V0ZXJfZXR5cGUpOw0KLQkJ CWlmIChvdXRlcl9ldHlwZSA9PSBSVEVfQkUxNihFVEhfUF84MDIxUSkgJiYNCi0JCQkgICAgdmxh bl9ldHlwZSAhPSBSVEVfQkUxNihFVEhfUF9BTEwpKQ0KLQkJCQltbmxfYXR0cl9wdXRfdTE2KG5s aCwNCi0JCQkJCQkgVENBX0ZMT1dFUl9LRVlfVkxBTl9FVEhfVFlQRSwNCi0JCQkJCQkgdmxhbl9l dHlwZSk7DQotCQl9DQotCQlhc3NlcnQoZGV2X2Zsb3ctPnRjZi5ubHNpemUgPj0gbmxoLT5ubG1z Z19sZW4pOw0KLQl9DQotCW5hX2Zsb3dlcl9hY3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwg VENBX0ZMT1dFUl9BQ1QpOw0KLQluYV9hY3RfaW5kZXhfY3VyID0gMTsNCi0JZm9yICg7IGFjdGlv bnMtPnR5cGUgIT0gUlRFX0ZMT1dfQUNUSU9OX1RZUEVfRU5EOyBhY3Rpb25zKyspIHsNCi0JCXN0 cnVjdCBubGF0dHIgKm5hX2FjdF9pbmRleDsNCi0JCXN0cnVjdCBubGF0dHIgKm5hX2FjdDsNCi0J CXVuc2lnbmVkIGludCB2bGFuX2FjdDsNCi0JCXVuc2lnbmVkIGludCBpOw0KLQ0KLQkJc3dpdGNo IChhY3Rpb25zLT50eXBlKSB7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1ZPSUQ6DQot CQkJYnJlYWs7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1BPUlRfSUQ6DQotCQkJY29u Zi5wb3J0X2lkID0gYWN0aW9ucy0+Y29uZjsNCi0JCQlpZiAoY29uZi5wb3J0X2lkLT5vcmlnaW5h bCkNCi0JCQkJaSA9IDA7DQotCQkJZWxzZQ0KLQkJCQlmb3IgKGkgPSAwOyBwdG9pW2ldLmlmaW5k ZXg7ICsraSkNCi0JCQkJCWlmIChwdG9pW2ldLnBvcnRfaWQgPT0gY29uZi5wb3J0X2lkLT5pZCkN Ci0JCQkJCQlicmVhazsNCi0JCQlhc3NlcnQocHRvaVtpXS5pZmluZGV4KTsNCi0JCQluYV9hY3Rf aW5kZXggPQ0KLQkJCQltbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgbmFfYWN0X2luZGV4X2N1cisr KTsNCi0JCQlhc3NlcnQobmFfYWN0X2luZGV4KTsNCi0JCQltbmxfYXR0cl9wdXRfc3RyeihubGgs IFRDQV9BQ1RfS0lORCwgIm1pcnJlZCIpOw0KLQkJCW5hX2FjdCA9IG1ubF9hdHRyX25lc3Rfc3Rh cnQobmxoLCBUQ0FfQUNUX09QVElPTlMpOw0KLQkJCWFzc2VydChuYV9hY3QpOw0KLQkJCWlmIChl bmNhcC5oZHIpIHsNCi0JCQkJYXNzZXJ0KGRldl9mbG93LT50Y2YudHVubmVsKTsNCi0JCQkJZGV2 X2Zsb3ctPnRjZi50dW5uZWwtPmlmaW5kZXhfcHRyID0NCi0JCQkJCSYoKHN0cnVjdCB0Y19taXJy ZWQgKikNCi0JCQkJCW1ubF9hdHRyX2dldF9wYXlsb2FkDQotCQkJCQkobW5sX25sbXNnX2dldF9w YXlsb2FkX3RhaWwNCi0JCQkJCQkobmxoKSkpLT5pZmluZGV4Ow0KLQkJCX0gZWxzZSBpZiAoZGVj YXAuaGRyKSB7DQotCQkJCWFzc2VydChkZXZfZmxvdy0+dGNmLnR1bm5lbCk7DQotCQkJCWRldl9m bG93LT50Y2YudHVubmVsLT5pZmluZGV4X3B0ciA9DQotCQkJCQkodW5zaWduZWQgaW50ICopJnRj bS0+dGNtX2lmaW5kZXg7DQotCQkJfQ0KLQkJCW1ubF9hdHRyX3B1dChubGgsIFRDQV9NSVJSRURf UEFSTVMsDQotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB0Y19taXJyZWQpLA0KLQkJCQkgICAgICYo c3RydWN0IHRjX21pcnJlZCl7DQotCQkJCQkuYWN0aW9uID0gVENfQUNUX1NUT0xFTiwNCi0JCQkJ CS5lYWN0aW9uID0gVENBX0VHUkVTU19SRURJUiwNCi0JCQkJCS5pZmluZGV4ID0gcHRvaVtpXS5p ZmluZGV4LA0KLQkJCQkgICAgIH0pOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfYWN0 KTsNCi0JCQltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJYnJlYWs7 DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX0pVTVA6DQotCQkJY29uZi5qdW1wID0gYWN0 aW9ucy0+Y29uZjsNCi0JCQluYV9hY3RfaW5kZXggPQ0KLQkJCQltbmxfYXR0cl9uZXN0X3N0YXJ0 KG5saCwgbmFfYWN0X2luZGV4X2N1cisrKTsNCi0JCQlhc3NlcnQobmFfYWN0X2luZGV4KTsNCi0J CQltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRDQV9BQ1RfS0lORCwgImdhY3QiKTsNCi0JCQluYV9h Y3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVENBX0FDVF9PUFRJT05TKTsNCi0JCQlhc3Nl cnQobmFfYWN0KTsNCi0JCQltbmxfYXR0cl9wdXQobmxoLCBUQ0FfR0FDVF9QQVJNUywNCi0JCQkJ ICAgICBzaXplb2Yoc3RydWN0IHRjX2dhY3QpLA0KLQkJCQkgICAgICYoc3RydWN0IHRjX2dhY3Qp ew0KLQkJCQkJLmFjdGlvbiA9IFRDX0FDVF9HT1RPX0NIQUlOIHwNCi0JCQkJCQkgIGNvbmYuanVt cC0+Z3JvdXAsDQotCQkJCSAgICAgfSk7DQotCQkJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBuYV9h Y3QpOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfYWN0X2luZGV4KTsNCi0JCQlicmVh azsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfRFJPUDoNCi0JCQluYV9hY3RfaW5kZXgg PQ0KLQkJCQltbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgbmFfYWN0X2luZGV4X2N1cisrKTsNCi0J CQlhc3NlcnQobmFfYWN0X2luZGV4KTsNCi0JCQltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRDQV9B Q1RfS0lORCwgImdhY3QiKTsNCi0JCQluYV9hY3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwg VENBX0FDVF9PUFRJT05TKTsNCi0JCQlhc3NlcnQobmFfYWN0KTsNCi0JCQltbmxfYXR0cl9wdXQo bmxoLCBUQ0FfR0FDVF9QQVJNUywNCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IHRjX2dhY3QpLA0K LQkJCQkgICAgICYoc3RydWN0IHRjX2dhY3Qpew0KLQkJCQkJLmFjdGlvbiA9IFRDX0FDVF9TSE9U LA0KLQkJCQkgICAgIH0pOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfYWN0KTsNCi0J CQltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJYnJlYWs7DQotCQlj YXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX0NPVU5UOg0KLQkJCS8qDQotCQkJICogRHJpdmVyIGFk ZHMgdGhlIGNvdW50IGFjdGlvbiBpbXBsaWNpdGx5IGZvcg0KLQkJCSAqIGVhY2ggcnVsZSBpdCBj cmVhdGVzLg0KLQkJCSAqLw0KLQkJCXJldCA9IGZsb3dfdGNmX3RyYW5zbGF0ZV9hY3Rpb25fY291 bnQoZGV2LA0KLQkJCQkJCQkgICAgICBkZXZfZmxvdywgZXJyb3IpOw0KLQkJCWlmIChyZXQgPCAw KQ0KLQkJCQlyZXR1cm4gcmV0Ow0KLQkJCWJyZWFrOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05f VFlQRV9PRl9QT1BfVkxBTjoNCi0JCQljb25mLm9mX3B1c2hfdmxhbiA9IE5VTEw7DQotCQkJdmxh bl9hY3QgPSBUQ0FfVkxBTl9BQ1RfUE9QOw0KLQkJCWdvdG8gYWN0aW9uX29mX3ZsYW47DQotCQlj YXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1BVU0hfVkxBTjoNCi0JCQljb25mLm9mX3B1c2hf dmxhbiA9IGFjdGlvbnMtPmNvbmY7DQotCQkJdmxhbl9hY3QgPSBUQ0FfVkxBTl9BQ1RfUFVTSDsN Ci0JCQlnb3RvIGFjdGlvbl9vZl92bGFuOw0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9P Rl9TRVRfVkxBTl9WSUQ6DQotCQkJY29uZi5vZl9zZXRfdmxhbl92aWQgPSBhY3Rpb25zLT5jb25m Ow0KLQkJCWlmIChuYV92bGFuX2lkKQ0KLQkJCQlnb3RvIG92ZXJyaWRlX25hX3ZsYW5faWQ7DQot CQkJdmxhbl9hY3QgPSBUQ0FfVkxBTl9BQ1RfTU9ESUZZOw0KLQkJCWdvdG8gYWN0aW9uX29mX3Zs YW47DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX09GX1NFVF9WTEFOX1BDUDoNCi0JCQlj b25mLm9mX3NldF92bGFuX3BjcCA9IGFjdGlvbnMtPmNvbmY7DQotCQkJaWYgKG5hX3ZsYW5fcHJp b3JpdHkpDQotCQkJCWdvdG8gb3ZlcnJpZGVfbmFfdmxhbl9wcmlvcml0eTsNCi0JCQl2bGFuX2Fj dCA9IFRDQV9WTEFOX0FDVF9NT0RJRlk7DQotCQkJZ290byBhY3Rpb25fb2ZfdmxhbjsNCi1hY3Rp b25fb2ZfdmxhbjoNCi0JCQluYV9hY3RfaW5kZXggPQ0KLQkJCQltbmxfYXR0cl9uZXN0X3N0YXJ0 KG5saCwgbmFfYWN0X2luZGV4X2N1cisrKTsNCi0JCQlhc3NlcnQobmFfYWN0X2luZGV4KTsNCi0J CQltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRDQV9BQ1RfS0lORCwgInZsYW4iKTsNCi0JCQluYV9h Y3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgVENBX0FDVF9PUFRJT05TKTsNCi0JCQlhc3Nl cnQobmFfYWN0KTsNCi0JCQltbmxfYXR0cl9wdXQobmxoLCBUQ0FfVkxBTl9QQVJNUywNCi0JCQkJ ICAgICBzaXplb2Yoc3RydWN0IHRjX3ZsYW4pLA0KLQkJCQkgICAgICYoc3RydWN0IHRjX3ZsYW4p ew0KLQkJCQkJLmFjdGlvbiA9IFRDX0FDVF9QSVBFLA0KLQkJCQkJLnZfYWN0aW9uID0gdmxhbl9h Y3QsDQotCQkJCSAgICAgfSk7DQotCQkJaWYgKHZsYW5fYWN0ID09IFRDQV9WTEFOX0FDVF9QT1Ap IHsNCi0JCQkJbW5sX2F0dHJfbmVzdF9lbmQobmxoLCBuYV9hY3QpOw0KLQkJCQltbmxfYXR0cl9u ZXN0X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCQlpZiAo dmxhbl9hY3QgPT0gVENBX1ZMQU5fQUNUX1BVU0gpDQotCQkJCW1ubF9hdHRyX3B1dF91MTYobmxo LA0KLQkJCQkJCSBUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJPVE9DT0wsDQotCQkJCQkJIGNvbmYub2Zf cHVzaF92bGFuLT5ldGhlcnR5cGUpOw0KLQkJCW5hX3ZsYW5faWQgPSBtbmxfbmxtc2dfZ2V0X3Bh eWxvYWRfdGFpbChubGgpOw0KLQkJCW1ubF9hdHRyX3B1dF91MTYobmxoLCBUQ0FfVkxBTl9QQUQs IDApOw0KLQkJCW5hX3ZsYW5fcHJpb3JpdHkgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWRfdGFpbChu bGgpOw0KLQkJCW1ubF9hdHRyX3B1dF91OChubGgsIFRDQV9WTEFOX1BBRCwgMCk7DQotCQkJbW5s X2F0dHJfbmVzdF9lbmQobmxoLCBuYV9hY3QpOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwg bmFfYWN0X2luZGV4KTsNCi0JCQlpZiAoYWN0aW9ucy0+dHlwZSA9PQ0KLQkJCSAgICBSVEVfRkxP V19BQ1RJT05fVFlQRV9PRl9TRVRfVkxBTl9WSUQpIHsNCi1vdmVycmlkZV9uYV92bGFuX2lkOg0K LQkJCQluYV92bGFuX2lkLT5ubGFfdHlwZSA9IFRDQV9WTEFOX1BVU0hfVkxBTl9JRDsNCi0JCQkJ Kih1aW50MTZfdCAqKW1ubF9hdHRyX2dldF9wYXlsb2FkKG5hX3ZsYW5faWQpID0NCi0JCQkJCXJ0 ZV9iZV90b19jcHVfMTYNCi0JCQkJCShjb25mLm9mX3NldF92bGFuX3ZpZC0+dmxhbl92aWQpOw0K LQkJCX0gZWxzZSBpZiAoYWN0aW9ucy0+dHlwZSA9PQ0KLQkJCQkgICBSVEVfRkxPV19BQ1RJT05f VFlQRV9PRl9TRVRfVkxBTl9QQ1ApIHsNCi1vdmVycmlkZV9uYV92bGFuX3ByaW9yaXR5Og0KLQkJ CQluYV92bGFuX3ByaW9yaXR5LT5ubGFfdHlwZSA9DQotCQkJCQlUQ0FfVkxBTl9QVVNIX1ZMQU5f UFJJT1JJVFk7DQotCQkJCSoodWludDhfdCAqKW1ubF9hdHRyX2dldF9wYXlsb2FkDQotCQkJCQko bmFfdmxhbl9wcmlvcml0eSkgPQ0KLQkJCQkJY29uZi5vZl9zZXRfdmxhbl9wY3AtPnZsYW5fcGNw Ow0KLQkJCX0NCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfVlhMQU5f REVDQVA6DQotCQkJYXNzZXJ0KGRlY2FwLnZ4bGFuKTsNCi0JCQlhc3NlcnQoZGV2X2Zsb3ctPnRj Zi50dW5uZWwpOw0KLQkJCWRldl9mbG93LT50Y2YudHVubmVsLT5pZmluZGV4X3B0ciA9DQotCQkJ CSh1bnNpZ25lZCBpbnQgKikmdGNtLT50Y21faWZpbmRleDsNCi0JCQluYV9hY3RfaW5kZXggPQ0K LQkJCQltbmxfYXR0cl9uZXN0X3N0YXJ0KG5saCwgbmFfYWN0X2luZGV4X2N1cisrKTsNCi0JCQlh c3NlcnQobmFfYWN0X2luZGV4KTsNCi0JCQltbmxfYXR0cl9wdXRfc3RyeihubGgsIFRDQV9BQ1Rf S0lORCwgInR1bm5lbF9rZXkiKTsNCi0JCQluYV9hY3QgPSBtbmxfYXR0cl9uZXN0X3N0YXJ0KG5s aCwgVENBX0FDVF9PUFRJT05TKTsNCi0JCQlhc3NlcnQobmFfYWN0KTsNCi0JCQltbmxfYXR0cl9w dXQobmxoLCBUQ0FfVFVOTkVMX0tFWV9QQVJNUywNCi0JCQkJc2l6ZW9mKHN0cnVjdCB0Y190dW5u ZWxfa2V5KSwNCi0JCQkJJihzdHJ1Y3QgdGNfdHVubmVsX2tleSl7DQotCQkJCQkuYWN0aW9uID0g VENfQUNUX1BJUEUsDQotCQkJCQkudF9hY3Rpb24gPSBUQ0FfVFVOTkVMX0tFWV9BQ1RfUkVMRUFT RSwNCi0JCQkJCX0pOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfYWN0KTsNCi0JCQlt bmxfYXR0cl9uZXN0X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJYXNzZXJ0KGRldl9mbG93 LT50Y2YubmxzaXplID49IG5saC0+bmxtc2dfbGVuKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRF X0ZMT1dfQUNUSU9OX1RZUEVfVlhMQU5fRU5DQVA6DQotCQkJYXNzZXJ0KGVuY2FwLnZ4bGFuKTsN Ci0JCQlmbG93X3RjZl92eGxhbl9lbmNhcF9wYXJzZShhY3Rpb25zLCBlbmNhcC52eGxhbik7DQot CQkJbmFfYWN0X2luZGV4ID0NCi0JCQkJbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIG5hX2FjdF9p bmRleF9jdXIrKyk7DQotCQkJYXNzZXJ0KG5hX2FjdF9pbmRleCk7DQotCQkJbW5sX2F0dHJfcHV0 X3N0cnoobmxoLCBUQ0FfQUNUX0tJTkQsICJ0dW5uZWxfa2V5Iik7DQotCQkJbmFfYWN0ID0gbW5s X2F0dHJfbmVzdF9zdGFydChubGgsIFRDQV9BQ1RfT1BUSU9OUyk7DQotCQkJYXNzZXJ0KG5hX2Fj dCk7DQotCQkJbW5sX2F0dHJfcHV0KG5saCwgVENBX1RVTk5FTF9LRVlfUEFSTVMsDQotCQkJCXNp emVvZihzdHJ1Y3QgdGNfdHVubmVsX2tleSksDQotCQkJCSYoc3RydWN0IHRjX3R1bm5lbF9rZXkp ew0KLQkJCQkJLmFjdGlvbiA9IFRDX0FDVF9QSVBFLA0KLQkJCQkJLnRfYWN0aW9uID0gVENBX1RV Tk5FTF9LRVlfQUNUX1NFVCwNCi0JCQkJCX0pOw0KLQkJCWlmIChlbmNhcC52eGxhbi0+bWFzayAm IEZMT1dfVENGX0VOQ0FQX1VEUF9EU1QpDQotCQkJCW1ubF9hdHRyX3B1dF91MTYobmxoLA0KLQkJ CQkJIFRDQV9UVU5ORUxfS0VZX0VOQ19EU1RfUE9SVCwNCi0JCQkJCSBlbmNhcC52eGxhbi0+dWRw LmRzdCk7DQotCQkJaWYgKGVuY2FwLnZ4bGFuLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNF9T UkMpDQotCQkJCW1ubF9hdHRyX3B1dF91MzIobmxoLA0KLQkJCQkJIFRDQV9UVU5ORUxfS0VZX0VO Q19JUFY0X1NSQywNCi0JCQkJCSBlbmNhcC52eGxhbi0+aXB2NC5zcmMpOw0KLQkJCWlmIChlbmNh cC52eGxhbi0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjRfRFNUKQ0KLQkJCQltbmxfYXR0cl9w dXRfdTMyKG5saCwNCi0JCQkJCSBUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1QsDQotCQkJCQkg ZW5jYXAudnhsYW4tPmlwdjQuZHN0KTsNCi0JCQlpZiAoZW5jYXAudnhsYW4tPm1hc2sgJiBGTE9X X1RDRl9FTkNBUF9JUFY2X1NSQykNCi0JCQkJbW5sX2F0dHJfcHV0KG5saCwNCi0JCQkJCSBUQ0Ff VFVOTkVMX0tFWV9FTkNfSVBWNl9TUkMsDQotCQkJCQkgc2l6ZW9mKGVuY2FwLnZ4bGFuLT5pcHY2 LnNyYyksDQotCQkJCQkgJmVuY2FwLnZ4bGFuLT5pcHY2LnNyYyk7DQotCQkJaWYgKGVuY2FwLnZ4 bGFuLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9EU1QpDQotCQkJCW1ubF9hdHRyX3B1dChu bGgsDQotCQkJCQkgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfRFNULA0KLQkJCQkJIHNpemVvZihl bmNhcC52eGxhbi0+aXB2Ni5kc3QpLA0KLQkJCQkJICZlbmNhcC52eGxhbi0+aXB2Ni5kc3QpOw0K LQkJCWlmIChlbmNhcC52eGxhbi0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQX1RUTCkNCi0JCQkJ bW5sX2F0dHJfcHV0X3U4KG5saCwNCi0JCQkJCSBUQ0FfVFVOTkVMX0tFWV9FTkNfVFRMLA0KLQkJ CQkJIGVuY2FwLnZ4bGFuLT5pcF90dGxfaG9wKTsNCi0JCQlpZiAoZW5jYXAudnhsYW4tPm1hc2sg JiBGTE9XX1RDRl9FTkNBUF9JUF9UT1MpDQotCQkJCW1ubF9hdHRyX3B1dF91OChubGgsDQotCQkJ CQkgVENBX1RVTk5FTF9LRVlfRU5DX1RPUywNCi0JCQkJCSBlbmNhcC52eGxhbi0+aXBfdG9zKTsN Ci0JCQlpZiAoZW5jYXAudnhsYW4tPm1hc2sgJiBGTE9XX1RDRl9FTkNBUF9WWExBTl9WTkkpDQot CQkJCW1ubF9hdHRyX3B1dF91MzIobmxoLA0KLQkJCQkJIFRDQV9UVU5ORUxfS0VZX0VOQ19LRVlf SUQsDQotCQkJCQkgdnhsYW5fdm5pX2FzX2JlMzINCi0JCQkJCQkoZW5jYXAudnhsYW4tPnZ4bGFu LnZuaSkpOw0KLQkJCW1ubF9hdHRyX3B1dF91OChubGgsIFRDQV9UVU5ORUxfS0VZX05PX0NTVU0s IDApOw0KLQkJCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfYWN0KTsNCi0JCQltbmxfYXR0cl9u ZXN0X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJYXNzZXJ0KGRldl9mbG93LT50Y2Yubmxz aXplID49IG5saC0+bmxtc2dfbGVuKTsNCi0JCQlicmVhazsNCi0JCWNhc2UgUlRFX0ZMT1dfQUNU SU9OX1RZUEVfU0VUX0lQVjRfU1JDOg0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRf SVBWNF9EU1Q6DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1NFVF9JUFY2X1NSQzoNCi0J CWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX0lQVjZfRFNUOg0KLQkJY2FzZSBSVEVfRkxP V19BQ1RJT05fVFlQRV9TRVRfVFBfU1JDOg0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9T RVRfVFBfRFNUOg0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9TRVRfVFRMOg0KLQkJY2Fz ZSBSVEVfRkxPV19BQ1RJT05fVFlQRV9ERUNfVFRMOg0KLQkJY2FzZSBSVEVfRkxPV19BQ1RJT05f VFlQRV9TRVRfTUFDX1NSQzoNCi0JCWNhc2UgUlRFX0ZMT1dfQUNUSU9OX1RZUEVfU0VUX01BQ19E U1Q6DQotCQkJbmFfYWN0X2luZGV4ID0NCi0JCQkJbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIG5h X2FjdF9pbmRleF9jdXIrKyk7DQotCQkJZmxvd190Y2ZfY3JlYXRlX3BlZGl0X21ubF9tc2cobmxo LA0KLQkJCQkJCSAgICAgICZhY3Rpb25zLCBpdGVtX2ZsYWdzKTsNCi0JCQltbmxfYXR0cl9uZXN0 X2VuZChubGgsIG5hX2FjdF9pbmRleCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXJl dHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT1RTVVAsDQotCQkJCQkJICBSVEVfRkxP V19FUlJPUl9UWVBFX0FDVElPTiwNCi0JCQkJCQkgIGFjdGlvbnMsDQotCQkJCQkJICAiYWN0aW9u IG5vdCBzdXBwb3J0ZWQiKTsNCi0JCX0NCi0JfQ0KLQlhc3NlcnQobmFfZmxvd2VyKTsNCi0JYXNz ZXJ0KG5hX2Zsb3dlcl9hY3QpOw0KLQltbmxfYXR0cl9uZXN0X2VuZChubGgsIG5hX2Zsb3dlcl9h Y3QpOw0KLQlkZXZfZmxvdy0+dGNmLnB0Y19mbGFncyA9IG1ubF9hdHRyX2dldF9wYXlsb2FkDQot CQkJCQkobW5sX25sbXNnX2dldF9wYXlsb2FkX3RhaWwobmxoKSk7DQotCW1ubF9hdHRyX3B1dF91 MzIobmxoLCBUQ0FfRkxPV0VSX0ZMQUdTLAlkZWNhcC52eGxhbiA/DQotCQkJCQkJMCA6IFRDQV9D TFNfRkxBR1NfU0tJUF9TVyk7DQotCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfZmxvd2VyKTsN Ci0JaWYgKGRldl9mbG93LT50Y2YudHVubmVsICYmIGRldl9mbG93LT50Y2YudHVubmVsLT5pZmlu ZGV4X3B0cikNCi0JCWRldl9mbG93LT50Y2YudHVubmVsLT5pZmluZGV4X29yZyA9DQotCQkJKmRl dl9mbG93LT50Y2YudHVubmVsLT5pZmluZGV4X3B0cjsNCi0JYXNzZXJ0KGRldl9mbG93LT50Y2Yu bmxzaXplID49IG5saC0+bmxtc2dfbGVuKTsNCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLS8qKg0KLSAq IFNlbmQgTmV0bGluayBtZXNzYWdlIHdpdGggYWNrbm93bGVkZ21lbnQuDQotICoNCi0gKiBAcGFy YW0gdGNmDQotICogICBGbG93IGNvbnRleHQgdG8gdXNlLg0KLSAqIEBwYXJhbSBubGgNCi0gKiAg IE1lc3NhZ2UgdG8gc2VuZC4gVGhpcyBmdW5jdGlvbiBhbHdheXMgcmFpc2VzIHRoZSBOTE1fRl9B Q0sgZmxhZyBiZWZvcmUNCi0gKiAgIHNlbmRpbmcuDQotICogQHBhcmFtW2luXSBjYg0KLSAqICAg Q2FsbGJhY2sgaGFuZGxlciBmb3IgcmVjZWl2ZWQgbWVzc2FnZS4NCi0gKiBAcGFyYW1baW5dIGFy Zw0KLSAqICAgQ29udGV4dCBwb2ludGVyIGZvciBjYWxsYmFjayBoYW5kbGVyLg0KLSAqDQotICog QHJldHVybg0KLSAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVy d2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2Zf bmxfYWNrKHN0cnVjdCBtbHg1X2Zsb3dfdGNmX2NvbnRleHQgKnRjZiwNCi0JCXN0cnVjdCBubG1z Z2hkciAqbmxoLA0KLQkJbW5sX2NiX3QgY2IsIHZvaWQgKmFyZykNCi17DQotCXVuc2lnbmVkIGlu dCBwb3J0aWQgPSBtbmxfc29ja2V0X2dldF9wb3J0aWQodGNmLT5ubCk7DQotCXVpbnQzMl90IHNl cSA9IHRjZi0+c2VxKys7DQotCWludCByZXQsIGVyciA9IDA7DQotDQotCWFzc2VydCh0Y2YtPm5s KTsNCi0JYXNzZXJ0KHRjZi0+YnVmKTsNCi0JaWYgKCFzZXEpIHsNCi0JCS8qIHNlcSAwIGlzIHJl c2VydmVkIGZvciBrZXJuZWwgZXZlbnQtZHJpdmVuIG5vdGlmaWNhdGlvbnMuICovDQotCQlzZXEg PSB0Y2YtPnNlcSsrOw0KLQl9DQotCW5saC0+bmxtc2dfc2VxID0gc2VxOw0KLQlubGgtPm5sbXNn X2ZsYWdzIHw9IE5MTV9GX0FDSzsNCi0JcmV0ID0gbW5sX3NvY2tldF9zZW5kdG8odGNmLT5ubCwg bmxoLCBubGgtPm5sbXNnX2xlbik7DQotCWlmIChyZXQgPD0gMCkgew0KLQkJLyogTWVzc2FnZSBz ZW5kIGVycm9yIG9jY3VycmVkLiAqLw0KLQkJcnRlX2Vycm5vID0gZXJybm87DQotCQlyZXR1cm4g LXJ0ZV9lcnJubzsNCi0JfQ0KLQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopKHRjZi0+YnVmKTsN Ci0JLyoNCi0JICogVGhlIGZvbGxvd2luZyBsb29wIHBvc3Rwb25lcyBub24tZmF0YWwgZXJyb3Jz IHVudGlsIG11bHRpcGFydA0KLQkgKiBtZXNzYWdlcyBhcmUgY29tcGxldGUuDQotCSAqLw0KLQl3 aGlsZSAodHJ1ZSkgew0KLQkJcmV0ID0gbW5sX3NvY2tldF9yZWN2ZnJvbSh0Y2YtPm5sLCB0Y2Yt PmJ1ZiwgdGNmLT5idWZfc2l6ZSk7DQotCQlpZiAocmV0IDwgMCkgew0KLQkJCWVyciA9IGVycm5v Ow0KLQkJCS8qDQotCQkJICogSW4gY2FzZSBvZiBvdmVyZmxvdyBXaWxsIHJlY2VpdmUgdGlsbA0K LQkJCSAqIGVuZCBvZiBtdWx0aXBhcnQgbWVzc2FnZS4gV2UgbWF5IGxvc3QgcGFydA0KLQkJCSAq IG9mIHJlcGx5IG1lc3NhZ2VzIGJ1dCBtYXJrIGFuZCByZXR1cm4gYW4gZXJyb3IuDQotCQkJICov DQotCQkJaWYgKGVyciAhPSBFTk9TUEMgfHwNCi0JCQkgICAgIShubGgtPm5sbXNnX2ZsYWdzICYg TkxNX0ZfTVVMVEkpIHx8DQotCQkJICAgIG5saC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FKQ0K LQkJCQlicmVhazsNCi0JCX0gZWxzZSB7DQotCQkJcmV0ID0gbW5sX2NiX3J1bihubGgsIHJldCwg c2VxLCBwb3J0aWQsIGNiLCBhcmcpOw0KLQkJCWlmICghcmV0KSB7DQotCQkJCS8qDQotCQkJCSAq IGxpYm1ubCByZXR1cm5zIDAgaWYgRE9ORSBvcg0KLQkJCQkgKiBzdWNjZXNzIEFDSyBtZXNzYWdl IGZvdW5kLg0KLQkJCQkgKi8NCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWlmIChyZXQgPCAwKSB7 DQotCQkJCS8qDQotCQkJCSAqIEFDSyBtZXNzYWdlIHdpdGggZXJyb3IgZm91bmQNCi0JCQkJICog b3Igc29tZSBlcnJvciBvY2N1cnJlZC4NCi0JCQkJICovDQotCQkJCWVyciA9IGVycm5vOw0KLQkJ CQlicmVhazsNCi0JCQl9DQotCQkJLyogV2Ugc2hvdWxkIGNvbnRpbnVlIHJlY2VpdmluZy4gKi8N Ci0JCX0NCi0JfQ0KLQlpZiAoIWVycikNCi0JCXJldHVybiAwOw0KLQlydGVfZXJybm8gPSBlcnI7 DQotCXJldHVybiAtZXJyOw0KLX0NCi0NCi0jZGVmaW5lIE1OTF9CVUZfRVhUUkFfU1BBQ0UgMTYN Ci0jZGVmaW5lIE1OTF9SRVFVRVNUX1NJWkVfTUlOIDI1Ng0KLSNkZWZpbmUgTU5MX1JFUVVFU1Rf U0laRV9NQVggMjA0OA0KLSNkZWZpbmUgTU5MX1JFUVVFU1RfU0laRSBSVEVfTUlOKFJURV9NQVgo c3lzY29uZihfU0NfUEFHRVNJWkUpLCBcDQotCQkJCSBNTkxfUkVRVUVTVF9TSVpFX01JTiksIE1O TF9SRVFVRVNUX1NJWkVfTUFYKQ0KLQ0KLS8qIERhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IGZsb3df dGNmX3h4eF9jYigpIHJvdXRpbmVzLiAqLw0KLXN0cnVjdCB0Y2ZfbmxjYl9idWYgew0KLQlMSVNU X0VOVFJZKHRjZl9ubGNiX2J1ZikgbmV4dDsNCi0JdWludDMyX3Qgc2l6ZTsNCi0JYWxpZ25hcyhz dHJ1Y3Qgbmxtc2doZHIpDQotCXVpbnQ4X3QgbXNnW107IC8qKjwgTmV0bGluayBtZXNzYWdlIGRh dGEuICovDQotfTsNCi0NCi1zdHJ1Y3QgdGNmX25sY2JfY29udGV4dCB7DQotCXVuc2lnbmVkIGlu dCBpZmluZGV4OyAvKio8IEJhc2UgaW50ZXJmYWNlIGluZGV4LiAqLw0KLQl1aW50MzJfdCBidWZz aXplOw0KLQlMSVNUX0hFQUQoLCB0Y2ZfbmxjYl9idWYpIG5sYnVmOw0KLX07DQotDQotLyoqDQot ICogQWxsb2NhdGUgc3BhY2UgZm9yIG5ldGxpbmsgY29tbWFuZCBpbiBidWZmZXIgbGlzdA0KLSAq DQotICogQHBhcmFtW2luLCBvdXRdIGN0eA0KLSAqICAgUG9pbnRlciB0byBjYWxsYmFjayBjb250 ZXh0IHdpdGggY29tbWFuZCBidWZmZXJzIGxpc3QuDQotICogQHBhcmFtW2luXSBzaXplDQotICog ICBSZXF1aXJlZCBzaXplIG9mIGRhdGEgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZC4NCi0gKg0KLSAq IEByZXR1cm4NCi0gKiAgIFBvaW50ZXIgdG8gYWxsb2NhdGVkIG1lbW9yeSwgYWxpZ25lZCBhcyBt ZXNzYWdlIGhlYWRlci4NCi0gKiAgIE5VTEwgaWYgc29tZSBlcnJvciBvY2N1cnJlZC4NCi0gKi8N Ci1zdGF0aWMgc3RydWN0IG5sbXNnaGRyICoNCi1mbG93X3RjZl9hbGxvY19ubGNtZChzdHJ1Y3Qg dGNmX25sY2JfY29udGV4dCAqY3R4LCB1aW50MzJfdCBzaXplKQ0KLXsNCi0Jc3RydWN0IHRjZl9u bGNiX2J1ZiAqYnVmOw0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0NCi0Jc2l6ZSA9IE5MTVNH X0FMSUdOKHNpemUpOw0KLQlidWYgPSBMSVNUX0ZJUlNUKCZjdHgtPm5sYnVmKTsNCi0JaWYgKGJ1 ZiAmJiAoYnVmLT5zaXplICsgc2l6ZSkgPD0gY3R4LT5idWZzaXplKSB7DQotCQlubGggPSAoc3Ry dWN0IG5sbXNnaGRyICopJmJ1Zi0+bXNnW2J1Zi0+c2l6ZV07DQotCQlidWYtPnNpemUgKz0gc2l6 ZTsNCi0JCXJldHVybiBubGg7DQotCX0NCi0JaWYgKHNpemUgPiBjdHgtPmJ1ZnNpemUpIHsNCi0J CURSVl9MT0coV0FSTklORywgIm5ldGxpbms6IHRvbyBsb25nIGNvbW1hbmQgYnVmZmVyIHJlcXVl c3RlZCIpOw0KLQkJcmV0dXJuIE5VTEw7DQotCX0NCi0JYnVmID0gcnRlX21hbGxvYyhfX2Z1bmNf XywNCi0JCQljdHgtPmJ1ZnNpemUgKyBzaXplb2Yoc3RydWN0IHRjZl9ubGNiX2J1ZiksDQotCQkJ YWxpZ25vZihzdHJ1Y3QgdGNmX25sY2JfYnVmKSk7DQotCWlmICghYnVmKSB7DQotCQlEUlZfTE9H KFdBUk5JTkcsICJuZXRsaW5rOiBubyBtZW1vcnkgZm9yIGNvbW1hbmQgYnVmZmVyIik7DQotCQly ZXR1cm4gTlVMTDsNCi0JfQ0KLQlMSVNUX0lOU0VSVF9IRUFEKCZjdHgtPm5sYnVmLCBidWYsIG5l eHQpOw0KLQlidWYtPnNpemUgPSBzaXplOw0KLQlubGggPSAoc3RydWN0IG5sbXNnaGRyICopJmJ1 Zi0+bXNnWzBdOw0KLQlyZXR1cm4gbmxoOw0KLX0NCi0NCi0vKioNCi0gKiBTZW5kIHRoZSBidWZm ZXJzIHdpdGggcHJlcGFyZWQgbmV0bGluayBjb21tYW5kcy4gU2NhbnMgdGhlIGxpc3QgYW5kDQot ICogc2VuZHMgYWxsIGZvdW5kIGJ1ZmZlcnMuIEJ1ZmZlcnMgYXJlIHNlbnQgYW5kIGZyZWVkIGFu eXdheSBpbiBvcmRlcg0KLSAqIHRvIHByZXZlbnQgbWVtb3J5IGxlYWthZ2UgaWYgc29tZSBldmVy eSBtZXNzYWdlIGluIHJlY2VpdmVkIHBhY2tldC4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQot ICogICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBieSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRf Y3JlYXRlKCkuDQotICogQHBhcmFtW2luLCBvdXRdIGN0eA0KLSAqICAgUG9pbnRlciB0byBjYWxs YmFjayBjb250ZXh0IHdpdGggY29tbWFuZCBidWZmZXJzIGxpc3QuDQotICoNCi0gKiBAcmV0dXJu DQotICogICBaZXJvIHZhbHVlIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVy d2lzZQ0KLSAqICAgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIGludA0KLWZs b3dfdGNmX3NlbmRfbmxjbWQoc3RydWN0IG1seDVfZmxvd190Y2ZfY29udGV4dCAqdGNmLA0KLQkJ ICAgIHN0cnVjdCB0Y2ZfbmxjYl9jb250ZXh0ICpjdHgpDQotew0KLQlzdHJ1Y3QgdGNmX25sY2Jf YnVmICpiYyA9IExJU1RfRklSU1QoJmN0eC0+bmxidWYpOw0KLQlpbnQgcmV0ID0gMDsNCi0NCi0J d2hpbGUgKGJjKSB7DQotCQlzdHJ1Y3QgdGNmX25sY2JfYnVmICpibiA9IExJU1RfTkVYVChiYywg bmV4dCk7DQotCQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0JCXVpbnQzMl90IG1zZyA9IDA7DQot CQlpbnQgcmM7DQotDQotCQl3aGlsZSAobXNnIDwgYmMtPnNpemUpIHsNCi0JCQkvKg0KLQkJCSAq IFNlbmQgTmV0bGluayBjb21tYW5kcyBmcm9tIGJ1ZmZlciBpbiBvbmUgYnkgb25lDQotCQkJICog ZmFzaGlvbi4gSWYgd2Ugc2VuZCBtdWx0aXBsZSBydWxlIGRlbGV0aW9uIGNvbW1hbmRzDQotCQkJ ICogaW4gb25lIE5ldGxpbmsgbWVzc2FnZSBhbmQgc29tZSBlcnJvciBvY2N1cnMgaXQgbWF5DQot CQkJICogY2F1c2UgbXVsdGlwbGUgQUNLIGVycm9yIG1lc3NhZ2VzIGFuZCBicmVhayBzZXF1ZW5j ZQ0KLQkJCSAqIG51bWJlcnMgb2YgTmV0bGluayBjb21tdW5pY2F0aW9uLCBiZWNhdXNlIHdlIGV4 cGVjdA0KLQkJCSAqIHRoZSBvbmx5IG9uZSBBQ0sgcmVwbHkuDQotCQkJICovDQotCQkJYXNzZXJ0 KChiYy0+c2l6ZSAtIG1zZykgPj0gc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpOw0KLQkJCW5saCA9 IChzdHJ1Y3Qgbmxtc2doZHIgKikmYmMtPm1zZ1ttc2ddOw0KLQkJCWFzc2VydCgoYmMtPnNpemUg LSBtc2cpID49IG5saC0+bmxtc2dfbGVuKTsNCi0JCQltc2cgKz0gbmxoLT5ubG1zZ19sZW47DQot CQkJcmMgPSBmbG93X3RjZl9ubF9hY2sodGNmLCBubGgsIE5VTEwsIE5VTEwpOw0KLQkJCWlmIChy Yykgew0KLQkJCQlEUlZfTE9HKFdBUk5JTkcsDQotCQkJCQkibmV0bGluazogY2xlYW51cCBlcnJv ciAlZCIsIHJjKTsNCi0JCQkJaWYgKCFyZXQpDQotCQkJCQlyZXQgPSByYzsNCi0JCQl9DQotCQl9 DQotCQlydGVfZnJlZShiYyk7DQotCQliYyA9IGJuOw0KLQl9DQotCUxJU1RfSU5JVCgmY3R4LT5u bGJ1Zik7DQotCXJldHVybiByZXQ7DQotfQ0KLQ0KLS8qKg0KLSAqIENvbGxlY3QgbG9jYWwgSVAg YWRkcmVzcyBydWxlcyB3aXRoIHNjb3BlIGxpbmsgYXR0cmlidXRlICBvbiBzcGVjaWZpZWQNCi0g KiBuZXR3b3JrIGRldmljZS4gVGhpcyBpcyBjYWxsYmFjayByb3V0aW5lIGNhbGxlZCBieSBsaWJt bmwgbW5sX2NiX3J1bigpDQotICogaW4gbG9vcCBmb3IgZXZlcnkgbWVzc2FnZSBpbiByZWNlaXZl ZCBwYWNrZXQuDQotICoNCi0gKiBAcGFyYW1baW5dIG5saA0KLSAqICAgUG9pbnRlciB0byByZXBs eSBoZWFkZXIuDQotICogQHBhcmFtW2luLCBvdXRdIGFyZw0KLSAqICAgT3BhcXVlIGRhdGEgcG9p bnRlciBmb3IgdGhpcyBjYWxsYmFjay4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIEEgcG9zaXRp dmUsIG5vbnplcm8gdmFsdWUgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3 aXNlDQotICogICBhbmQgcnRlX2Vycm5vIGlzIHNldC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxv d190Y2ZfY29sbGVjdF9sb2NhbF9jYihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAq YXJnKQ0KLXsNCi0Jc3RydWN0IHRjZl9ubGNiX2NvbnRleHQgKmN0eCA9IGFyZzsNCi0Jc3RydWN0 IG5sbXNnaGRyICpjbWQ7DQotCXN0cnVjdCBpZmFkZHJtc2cgKmlmYTsNCi0Jc3RydWN0IG5sYXR0 ciAqbmE7DQotCXN0cnVjdCBubGF0dHIgKm5hX2xvY2FsID0gTlVMTDsNCi0Jc3RydWN0IG5sYXR0 ciAqbmFfcGVlciA9IE5VTEw7DQotCXVuc2lnbmVkIGNoYXIgZmFtaWx5Ow0KLQl1aW50MzJfdCBz aXplOw0KLQ0KLQlpZiAobmxoLT5ubG1zZ190eXBlICE9IFJUTV9ORVdBRERSKSB7DQotCQlydGVf ZXJybm8gPSBFSU5WQUw7DQotCQlyZXR1cm4gLXJ0ZV9lcnJubzsNCi0JfQ0KLQlpZmEgPSBtbmxf bmxtc2dfZ2V0X3BheWxvYWQobmxoKTsNCi0JZmFtaWx5ID0gaWZhLT5pZmFfZmFtaWx5Ow0KLQlp ZiAoaWZhLT5pZmFfaW5kZXggIT0gY3R4LT5pZmluZGV4IHx8DQotCSAgICBpZmEtPmlmYV9zY29w ZSAhPSBSVF9TQ09QRV9MSU5LIHx8DQotCSAgICAhKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfUEVS TUFORU5UKSB8fA0KLQkgICAgKGZhbWlseSAhPSBBRl9JTkVUICYmIGZhbWlseSAhPSBBRl9JTkVU NikpDQotCQlyZXR1cm4gMTsNCi0JbW5sX2F0dHJfZm9yX2VhY2gobmEsIG5saCwgc2l6ZW9mKCpp ZmEpKSB7DQotCQlzd2l0Y2ggKG1ubF9hdHRyX2dldF90eXBlKG5hKSkgew0KLQkJY2FzZSBJRkFf TE9DQUw6DQotCQkJbmFfbG9jYWwgPSBuYTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSUZBX0FERFJF U1M6DQotCQkJbmFfcGVlciA9IG5hOw0KLQkJCWJyZWFrOw0KLQkJfQ0KLQkJaWYgKG5hX2xvY2Fs ICYmIG5hX3BlZXIpDQotCQkJYnJlYWs7DQotCX0NCi0JaWYgKCFuYV9sb2NhbCB8fCAhbmFfcGVl cikNCi0JCXJldHVybiAxOw0KLQkvKiBMb2NhbCBydWxlIGZvdW5kIHdpdGggc2NvcGUgbGluaywg cGVybWFuZW50IGFuZCBhc3NpZ25lZCBwZWVyLiAqLw0KLQlzaXplID0gTU5MX0FMSUdOKHNpemVv ZihzdHJ1Y3Qgbmxtc2doZHIpKSArDQotCSAgICAgICBNTkxfQUxJR04oc2l6ZW9mKHN0cnVjdCBp ZmFkZHJtc2cpKSArDQotCSAgICAgICAoZmFtaWx5ID09IEFGX0lORVQ2ID8gMiAqIFNaX05MQVRU Ul9EQVRBX09GKElQVjZfQUREUl9MRU4pDQotCQkJCSAgIDogMiAqIFNaX05MQVRUUl9UWVBFX09G KHVpbnQzMl90KSk7DQotCWNtZCA9IGZsb3dfdGNmX2FsbG9jX25sY21kKGN0eCwgc2l6ZSk7DQot CWlmICghY21kKSB7DQotCQlydGVfZXJybm8gPSBFTk9NRU07DQotCQlyZXR1cm4gLXJ0ZV9lcnJu bzsNCi0JfQ0KLQljbWQgPSBtbmxfbmxtc2dfcHV0X2hlYWRlcihjbWQpOw0KLQljbWQtPm5sbXNn X3R5cGUgPSBSVE1fREVMQUREUjsNCi0JY21kLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7 DQotCWlmYSA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVyKGNtZCwgc2l6ZW9mKCppZmEpKTsN Ci0JaWZhLT5pZmFfZmxhZ3MgPSBJRkFfRl9QRVJNQU5FTlQ7DQotCWlmYS0+aWZhX3Njb3BlID0g UlRfU0NPUEVfTElOSzsNCi0JaWZhLT5pZmFfaW5kZXggPSBjdHgtPmlmaW5kZXg7DQotCWlmIChm YW1pbHkgPT0gQUZfSU5FVCkgew0KLQkJaWZhLT5pZmFfZmFtaWx5ID0gQUZfSU5FVDsNCi0JCWlm YS0+aWZhX3ByZWZpeGxlbiA9IDMyOw0KLQkJbW5sX2F0dHJfcHV0X3UzMihjbWQsIElGQV9MT0NB TCwgbW5sX2F0dHJfZ2V0X3UzMihuYV9sb2NhbCkpOw0KLQkJbW5sX2F0dHJfcHV0X3UzMihjbWQs IElGQV9BRERSRVNTLCBtbmxfYXR0cl9nZXRfdTMyKG5hX3BlZXIpKTsNCi0JfSBlbHNlIHsNCi0J CWlmYS0+aWZhX2ZhbWlseSA9IEFGX0lORVQ2Ow0KLQkJaWZhLT5pZmFfcHJlZml4bGVuID0gMTI4 Ow0KLQkJbW5sX2F0dHJfcHV0KGNtZCwgSUZBX0xPQ0FMLCBJUFY2X0FERFJfTEVOLA0KLQkJCW1u bF9hdHRyX2dldF9wYXlsb2FkKG5hX2xvY2FsKSk7DQotCQltbmxfYXR0cl9wdXQoY21kLCBJRkFf QUREUkVTUywgSVBWNl9BRERSX0xFTiwNCi0JCQltbmxfYXR0cl9nZXRfcGF5bG9hZChuYV9wZWVy KSk7DQotCX0NCi0JYXNzZXJ0KHNpemUgPT0gY21kLT5ubG1zZ19sZW4pOw0KLQlyZXR1cm4gMTsN Ci19DQotDQotLyoqDQotICogQ2xlYW51cCB0aGUgbG9jYWwgSVAgYWRkcmVzc2VzIG9uIG91dGVy IGludGVyZmFjZS4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICogICBDb250ZXh0IG9iamVj dCBpbml0aWFsaXplZCBieSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfY3JlYXRlKCkuDQotICogQHBh cmFtW2luXSBpZmluZGV4DQotICogICBOZXR3b3JrIGludGVyZmFjZSBpbmRleCB0byBwZXJmb3Jt IGNsZWFudXAuDQotICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9lbmNhcF9sb2NhbF9jbGVh bnVwKHN0cnVjdCBtbHg1X2Zsb3dfdGNmX2NvbnRleHQgKnRjZiwNCi0JCQkgICAgdW5zaWduZWQg aW50IGlmaW5kZXgpDQotew0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0Jc3RydWN0IGlmYWRk cm1zZyAqaWZhOw0KLQlzdHJ1Y3QgdGNmX25sY2JfY29udGV4dCBjdHggPSB7DQotCQkuaWZpbmRl eCA9IGlmaW5kZXgsDQotCQkuYnVmc2l6ZSA9IE1OTF9SRVFVRVNUX1NJWkUsDQotCQkubmxidWYg PSBMSVNUX0hFQURfSU5JVElBTElaRVIoKSwNCi0JfTsNCi0JaW50IHJldDsNCi0NCi0JYXNzZXJ0 KGlmaW5kZXgpOw0KLQkvKg0KLQkgKiBTZWVrIGFuZCBkZXN0cm95IGxlZnRvdmVycyBvZiBsb2Nh bCBJUCBhZGRyZXNzZXMgd2l0aA0KLQkgKiBtYXRjaGluZyBwcm9wZXJ0aWVzICJzY29wZSBsaW5r Ii4NCi0JICovDQotCW5saCA9IG1ubF9ubG1zZ19wdXRfaGVhZGVyKHRjZi0+YnVmKTsNCi0Jbmxo LT5ubG1zZ190eXBlID0gUlRNX0dFVEFERFI7DQotCW5saC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9S RVFVRVNUIHwgTkxNX0ZfRFVNUDsNCi0JaWZhID0gbW5sX25sbXNnX3B1dF9leHRyYV9oZWFkZXIo bmxoLCBzaXplb2YoKmlmYSkpOw0KLQlpZmEtPmlmYV9mYW1pbHkgPSBBRl9VTlNQRUM7DQotCWlm YS0+aWZhX2luZGV4ID0gaWZpbmRleDsNCi0JaWZhLT5pZmFfc2NvcGUgPSBSVF9TQ09QRV9MSU5L Ow0KLQlyZXQgPSBmbG93X3RjZl9ubF9hY2sodGNmLCBubGgsIGZsb3dfdGNmX2NvbGxlY3RfbG9j YWxfY2IsICZjdHgpOw0KLQlpZiAocmV0KQ0KLQkJRFJWX0xPRyhXQVJOSU5HLCAibmV0bGluazog cXVlcnkgZGV2aWNlIGxpc3QgZXJyb3IgJWQiLCByZXQpOw0KLQlyZXQgPSBmbG93X3RjZl9zZW5k X25sY21kKHRjZiwgJmN0eCk7DQotCWlmIChyZXQpDQotCQlEUlZfTE9HKFdBUk5JTkcsICJuZXRs aW5rOiBkZXZpY2UgZGVsZXRlIGVycm9yICVkIiwgcmV0KTsNCi19DQotDQotLyoqDQotICogQ29s bGVjdCBuZWlnaCBwZXJtYW5lbnQgcnVsZXMgb24gc3BlY2lmaWVkIG5ldHdvcmsgZGV2aWNlLg0K LSAqIFRoaXMgaXMgY2FsbGJhY2sgcm91dGluZSBjYWxsZWQgYnkgbGlibW5sIG1ubF9jYl9ydW4o KSBpbiBsb29wIGZvcg0KLSAqIGV2ZXJ5IG1lc3NhZ2UgaW4gcmVjZWl2ZWQgcGFja2V0Lg0KLSAq DQotICogQHBhcmFtW2luXSBubGgNCi0gKiAgIFBvaW50ZXIgdG8gcmVwbHkgaGVhZGVyLg0KLSAq IEBwYXJhbVtpbiwgb3V0XSBhcmcNCi0gKiAgIE9wYXF1ZSBkYXRhIHBvaW50ZXIgZm9yIHRoaXMg Y2FsbGJhY2suDQotICoNCi0gKiBAcmV0dXJuDQotICogICBBIHBvc2l0aXZlLCBub256ZXJvIHZh bHVlIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZQ0KLSAqICAgYW5k IHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIGludA0KLWZsb3dfdGNmX2NvbGxlY3Rf bmVpZ2hfY2IoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZykNCi17DQotCXN0 cnVjdCB0Y2ZfbmxjYl9jb250ZXh0ICpjdHggPSBhcmc7DQotCXN0cnVjdCBubG1zZ2hkciAqY21k Ow0KLQlzdHJ1Y3QgbmRtc2cgKm5kbTsNCi0Jc3RydWN0IG5sYXR0ciAqbmE7DQotCXN0cnVjdCBu bGF0dHIgKm5hX2lwID0gTlVMTDsNCi0Jc3RydWN0IG5sYXR0ciAqbmFfbWFjID0gTlVMTDsNCi0J dW5zaWduZWQgY2hhciBmYW1pbHk7DQotCXVpbnQzMl90IHNpemU7DQotDQotCWlmIChubGgtPm5s bXNnX3R5cGUgIT0gUlRNX05FV05FSUdIKSB7DQotCQlydGVfZXJybm8gPSBFSU5WQUw7DQotCQly ZXR1cm4gLXJ0ZV9lcnJubzsNCi0JfQ0KLQluZG0gPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxo KTsNCi0JZmFtaWx5ID0gbmRtLT5uZG1fZmFtaWx5Ow0KLQlpZiAobmRtLT5uZG1faWZpbmRleCAh PSAoaW50KWN0eC0+aWZpbmRleCB8fA0KLQkgICAhKG5kbS0+bmRtX3N0YXRlICYgTlVEX1BFUk1B TkVOVCkgfHwNCi0JICAgKGZhbWlseSAhPSBBRl9JTkVUICYmIGZhbWlseSAhPSBBRl9JTkVUNikp DQotCQlyZXR1cm4gMTsNCi0JbW5sX2F0dHJfZm9yX2VhY2gobmEsIG5saCwgc2l6ZW9mKCpuZG0p KSB7DQotCQlzd2l0Y2ggKG1ubF9hdHRyX2dldF90eXBlKG5hKSkgew0KLQkJY2FzZSBOREFfRFNU Og0KLQkJCW5hX2lwID0gbmE7DQotCQkJYnJlYWs7DQotCQljYXNlIE5EQV9MTEFERFI6DQotCQkJ bmFfbWFjID0gbmE7DQotCQkJYnJlYWs7DQotCQl9DQotCQlpZiAobmFfbWFjICYmIG5hX2lwKQ0K LQkJCWJyZWFrOw0KLQl9DQotCWlmICghbmFfbWFjIHx8ICFuYV9pcCkNCi0JCXJldHVybiAxOw0K LQkvKiBOZWlnaCBydWxlIHdpdGggcGVybWFuZW50IGF0dHJpYnV0ZSBmb3VuZC4gKi8NCi0Jc2l6 ZSA9IE1OTF9BTElHTihzaXplb2Yoc3RydWN0IG5sbXNnaGRyKSkgKw0KLQkgICAgICAgTU5MX0FM SUdOKHNpemVvZihzdHJ1Y3QgbmRtc2cpKSArDQotCSAgICAgICBTWl9OTEFUVFJfREFUQV9PRihF VEhFUl9BRERSX0xFTikgKw0KLQkgICAgICAgKGZhbWlseSA9PSBBRl9JTkVUNiA/IFNaX05MQVRU Ul9EQVRBX09GKElQVjZfQUREUl9MRU4pDQotCQkJCSAgIDogU1pfTkxBVFRSX1RZUEVfT0YodWlu dDMyX3QpKTsNCi0JY21kID0gZmxvd190Y2ZfYWxsb2NfbmxjbWQoY3R4LCBzaXplKTsNCi0JaWYg KCFjbWQpIHsNCi0JCXJ0ZV9lcnJubyA9IEVOT01FTTsNCi0JCXJldHVybiAtcnRlX2Vycm5vOw0K LQl9DQotCWNtZCA9IG1ubF9ubG1zZ19wdXRfaGVhZGVyKGNtZCk7DQotCWNtZC0+bmxtc2dfdHlw ZSA9IFJUTV9ERUxORUlHSDsNCi0JY21kLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7DQot CW5kbSA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVyKGNtZCwgc2l6ZW9mKCpuZG0pKTsNCi0J bmRtLT5uZG1faWZpbmRleCA9IGN0eC0+aWZpbmRleDsNCi0JbmRtLT5uZG1fc3RhdGUgPSBOVURf UEVSTUFORU5UOw0KLQluZG0tPm5kbV9mbGFncyA9IDA7DQotCW5kbS0+bmRtX3R5cGUgPSAwOw0K LQlpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsNCi0JCW5kbS0+bmRtX2ZhbWlseSA9IEFGX0lORVQ7 DQotCQltbmxfYXR0cl9wdXRfdTMyKGNtZCwgTkRBX0RTVCwgbW5sX2F0dHJfZ2V0X3UzMihuYV9p cCkpOw0KLQl9IGVsc2Ugew0KLQkJbmRtLT5uZG1fZmFtaWx5ID0gQUZfSU5FVDY7DQotCQltbmxf YXR0cl9wdXQoY21kLCBOREFfRFNULCBJUFY2X0FERFJfTEVOLA0KLQkJCSAgICAgbW5sX2F0dHJf Z2V0X3BheWxvYWQobmFfaXApKTsNCi0JfQ0KLQltbmxfYXR0cl9wdXQoY21kLCBOREFfTExBRERS LCBFVEhFUl9BRERSX0xFTiwNCi0JCSAgICAgbW5sX2F0dHJfZ2V0X3BheWxvYWQobmFfbWFjKSk7 DQotCWFzc2VydChzaXplID09IGNtZC0+bmxtc2dfbGVuKTsNCi0JcmV0dXJuIDE7DQotfQ0KLQ0K LS8qKg0KLSAqIENsZWFudXAgdGhlIG5laWdoIHJ1bGVzIG9uIG91dGVyIGludGVyZmFjZS4NCi0g Kg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICogICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBi eSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfY3JlYXRlKCkuDQotICogQHBhcmFtW2luXSBpZmluZGV4 DQotICogICBOZXR3b3JrIGludGVyZmFjZSBpbmRleCB0byBwZXJmb3JtIGNsZWFudXAuDQotICov DQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9lbmNhcF9uZWlnaF9jbGVhbnVwKHN0cnVjdCBtbHg1 X2Zsb3dfdGNmX2NvbnRleHQgKnRjZiwNCi0JCQkgICAgdW5zaWduZWQgaW50IGlmaW5kZXgpDQot ew0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0Jc3RydWN0IG5kbXNnICpuZG07DQotCXN0cnVj dCB0Y2ZfbmxjYl9jb250ZXh0IGN0eCA9IHsNCi0JCS5pZmluZGV4ID0gaWZpbmRleCwNCi0JCS5i dWZzaXplID0gTU5MX1JFUVVFU1RfU0laRSwNCi0JCS5ubGJ1ZiA9IExJU1RfSEVBRF9JTklUSUFM SVpFUigpLA0KLQl9Ow0KLQlpbnQgcmV0Ow0KLQ0KLQlhc3NlcnQoaWZpbmRleCk7DQotCS8qIFNl ZWsgYW5kIGRlc3Ryb3kgbGVmdG92ZXJzIG9mIG5laWdoIHJ1bGVzLiAqLw0KLQlubGggPSBtbmxf bmxtc2dfcHV0X2hlYWRlcih0Y2YtPmJ1Zik7DQotCW5saC0+bmxtc2dfdHlwZSA9IFJUTV9HRVRO RUlHSDsNCi0JbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBOTE1fRl9EVU1QOw0K LQluZG0gPSBtbmxfbmxtc2dfcHV0X2V4dHJhX2hlYWRlcihubGgsIHNpemVvZigqbmRtKSk7DQot CW5kbS0+bmRtX2ZhbWlseSA9IEFGX1VOU1BFQzsNCi0JbmRtLT5uZG1faWZpbmRleCA9IGlmaW5k ZXg7DQotCW5kbS0+bmRtX3N0YXRlID0gTlVEX1BFUk1BTkVOVDsNCi0JcmV0ID0gZmxvd190Y2Zf bmxfYWNrKHRjZiwgbmxoLCBmbG93X3RjZl9jb2xsZWN0X25laWdoX2NiLCAmY3R4KTsNCi0JaWYg KHJldCkNCi0JCURSVl9MT0coV0FSTklORywgIm5ldGxpbms6IHF1ZXJ5IGRldmljZSBsaXN0IGVy cm9yICVkIiwgcmV0KTsNCi0JcmV0ID0gZmxvd190Y2Zfc2VuZF9ubGNtZCh0Y2YsICZjdHgpOw0K LQlpZiAocmV0KQ0KLQkJRFJWX0xPRyhXQVJOSU5HLCAibmV0bGluazogZGV2aWNlIGRlbGV0ZSBl cnJvciAlZCIsIHJldCk7DQotfQ0KLQ0KLS8qKg0KLSAqIENvbGxlY3QgaW5kaWNlcyBvZiBWWExB TiBlbmNhcC9kZWNhcCBpbnRlcmZhY2VzIGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UuDQotICogVGhp cyBpcyBjYWxsYmFjayByb3V0aW5lIGNhbGxlZCBieSBsaWJtbmwgbW5sX2NiX3J1bigpIGluIGxv b3AgZm9yDQotICogZXZlcnkgbWVzc2FnZSBpbiByZWNlaXZlZCBwYWNrZXQuDQotICoNCi0gKiBA cGFyYW1baW5dIG5saA0KLSAqICAgUG9pbnRlciB0byByZXBseSBoZWFkZXIuDQotICogQHBhcmFt W2luLCBvdXRdIGFyZw0KLSAqICAgT3BhcXVlIGRhdGEgcG9pbnRlciBmb3IgdGhpcyBjYWxsYmFj ay4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIEEgcG9zaXRpdmUsIG5vbnplcm8gdmFsdWUgb24g c3VjY2VzcywgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlDQotICogICBhbmQgcnRlX2Vy cm5vIGlzIHNldC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfY29sbGVjdF92eGxhbl9j Yihjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdm9pZCAqYXJnKQ0KLXsNCi0Jc3RydWN0IHRj Zl9ubGNiX2NvbnRleHQgKmN0eCA9IGFyZzsNCi0Jc3RydWN0IG5sbXNnaGRyICpjbWQ7DQotCXN0 cnVjdCBpZmluZm9tc2cgKmlmbTsNCi0Jc3RydWN0IG5sYXR0ciAqbmE7DQotCXN0cnVjdCBubGF0 dHIgKm5hX2luZm8gPSBOVUxMOw0KLQlzdHJ1Y3QgbmxhdHRyICpuYV92eGxhbiA9IE5VTEw7DQot CWJvb2wgZm91bmQgPSBmYWxzZTsNCi0JdW5zaWduZWQgaW50IHZ4aW5kZXg7DQotCXVpbnQzMl90 IHNpemU7DQotDQotCWlmIChubGgtPm5sbXNnX3R5cGUgIT0gUlRNX05FV0xJTkspIHsNCi0JCXJ0 ZV9lcnJubyA9IEVJTlZBTDsNCi0JCXJldHVybiAtcnRlX2Vycm5vOw0KLQl9DQotCWlmbSA9IG1u bF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOw0KLQlpZiAoIWlmbS0+aWZpX2luZGV4KSB7DQotCQly dGVfZXJybm8gPSBFSU5WQUw7DQotCQlyZXR1cm4gLXJ0ZV9lcnJubzsNCi0JfQ0KLQltbmxfYXR0 cl9mb3JfZWFjaChuYSwgbmxoLCBzaXplb2YoKmlmbSkpDQotCQlpZiAobW5sX2F0dHJfZ2V0X3R5 cGUobmEpID09IElGTEFfTElOS0lORk8pIHsNCi0JCQluYV9pbmZvID0gbmE7DQotCQkJYnJlYWs7 DQotCQl9DQotCWlmICghbmFfaW5mbykNCi0JCXJldHVybiAxOw0KLQltbmxfYXR0cl9mb3JfZWFj aF9uZXN0ZWQobmEsIG5hX2luZm8pIHsNCi0JCXN3aXRjaCAobW5sX2F0dHJfZ2V0X3R5cGUobmEp KSB7DQotCQljYXNlIElGTEFfSU5GT19LSU5EOg0KLQkJCWlmICghc3RybmNtcCgidnhsYW4iLCBt bmxfYXR0cl9nZXRfc3RyKG5hKSwNCi0JCQkJICAgICBtbmxfYXR0cl9nZXRfbGVuKG5hKSkpDQot CQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQlicmVhazsNCi0JCWNhc2UgSUZMQV9JTkZPX0RBVEE6DQot CQkJbmFfdnhsYW4gPSBuYTsNCi0JCQlicmVhazsNCi0JCX0NCi0JCWlmIChmb3VuZCAmJiBuYV92 eGxhbikNCi0JCQlicmVhazsNCi0JfQ0KLQlpZiAoIWZvdW5kIHx8ICFuYV92eGxhbikNCi0JCXJl dHVybiAxOw0KLQlmb3VuZCA9IGZhbHNlOw0KLQltbmxfYXR0cl9mb3JfZWFjaF9uZXN0ZWQobmEs IG5hX3Z4bGFuKSB7DQotCQlpZiAobW5sX2F0dHJfZ2V0X3R5cGUobmEpID09IElGTEFfVlhMQU5f TElOSyAmJg0KLQkJICAgIG1ubF9hdHRyX2dldF91MzIobmEpID09IGN0eC0+aWZpbmRleCkgew0K LQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQlpZiAoIWZvdW5kKQ0K LQkJcmV0dXJuIDE7DQotCS8qIEF0dGFjaGVkIFZYTEFOIGRldmljZSBmb3VuZCwgc3RvcmUgdGhl IGNvbW1hbmQgdG8gZGVsZXRlLiAqLw0KLQl2eGluZGV4ID0gaWZtLT5pZmlfaW5kZXg7DQotCXNp emUgPSBNTkxfQUxJR04oc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpICsNCi0JICAgICAgIE1OTF9B TElHTihzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpOw0KLQljbWQgPSBmbG93X3RjZl9hbGxvY19u bGNtZChjdHgsIHNpemUpOw0KLQlpZiAoIWNtZCkgew0KLQkJcnRlX2Vycm5vID0gRU5PTUVNOw0K LQkJcmV0dXJuIC1ydGVfZXJybm87DQotCX0NCi0JY21kID0gbW5sX25sbXNnX3B1dF9oZWFkZXIo Y21kKTsNCi0JY21kLT5ubG1zZ190eXBlID0gUlRNX0RFTExJTks7DQotCWNtZC0+bmxtc2dfZmxh Z3MgPSBOTE1fRl9SRVFVRVNUOw0KLQlpZm0gPSBtbmxfbmxtc2dfcHV0X2V4dHJhX2hlYWRlcihj bWQsIHNpemVvZigqaWZtKSk7DQotCWlmbS0+aWZpX2ZhbWlseSA9IEFGX1VOU1BFQzsNCi0JaWZt LT5pZmlfaW5kZXggPSB2eGluZGV4Ow0KLQlhc3NlcnQoc2l6ZSA9PSBjbWQtPm5sbXNnX2xlbik7 DQotCXJldHVybiAxOw0KLX0NCi0NCi0vKioNCi0gKiBDbGVhbnVwIHRoZSBvdXRlciBpbnRlcmZh Y2UuIFJlbW92ZXMgYWxsIGZvdW5kIHZ4bGFuIGRldmljZXMNCi0gKiBhdHRhY2hlZCB0byBzcGVj aWZpZWQgaW5kZXgsIGZsdXNoZXMgdGhlIG5laWdoIGFuZCBsb2NhbCBJUA0KLSAqIGRhdGFiYXNl Lg0KLSAqDQotICogQHBhcmFtW2luXSB0Y2YNCi0gKiAgIENvbnRleHQgb2JqZWN0IGluaXRpYWxp emVkIGJ5IG1seDVfZmxvd190Y2ZfY29udGV4dF9jcmVhdGUoKS4NCi0gKiBAcGFyYW1baW5dIGlm aW5kZXgNCi0gKiAgIE5ldHdvcmsgaW5mZXJmYWNlIGluZGV4IHRvIHBlcmZvcm0gY2xlYW51cC4N Ci0gKi8NCi1zdGF0aWMgdm9pZA0KLWZsb3dfdGNmX2VuY2FwX2lmYWNlX2NsZWFudXAoc3RydWN0 IG1seDVfZmxvd190Y2ZfY29udGV4dCAqdGNmLA0KLQkJCSAgICB1bnNpZ25lZCBpbnQgaWZpbmRl eCkNCi17DQotCXN0cnVjdCBubG1zZ2hkciAqbmxoOw0KLQlzdHJ1Y3QgaWZpbmZvbXNnICppZm07 DQotCXN0cnVjdCB0Y2ZfbmxjYl9jb250ZXh0IGN0eCA9IHsNCi0JCS5pZmluZGV4ID0gaWZpbmRl eCwNCi0JCS5idWZzaXplID0gTU5MX1JFUVVFU1RfU0laRSwNCi0JCS5ubGJ1ZiA9IExJU1RfSEVB RF9JTklUSUFMSVpFUigpLA0KLQl9Ow0KLQlpbnQgcmV0Ow0KLQ0KLQlhc3NlcnQoaWZpbmRleCk7 DQotCS8qDQotCSAqIFNlZWsgYW5kIGRlc3Ryb3kgbGVmdG92ZXIgVlhMQU4gZW5jYXAvZGVjYXAg aW50ZXJmYWNlcyB3aXRoDQotCSAqIG1hdGNoaW5nIHByb3BlcnRpZXMuDQotCSAqLw0KLQlubGgg PSBtbmxfbmxtc2dfcHV0X2hlYWRlcih0Y2YtPmJ1Zik7DQotCW5saC0+bmxtc2dfdHlwZSA9IFJU TV9HRVRMSU5LOw0KLQlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0RV TVA7DQotCWlmbSA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVyKG5saCwgc2l6ZW9mKCppZm0p KTsNCi0JaWZtLT5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOw0KLQlyZXQgPSBmbG93X3RjZl9ubF9h Y2sodGNmLCBubGgsIGZsb3dfdGNmX2NvbGxlY3RfdnhsYW5fY2IsICZjdHgpOw0KLQlpZiAocmV0 KQ0KLQkJRFJWX0xPRyhXQVJOSU5HLCAibmV0bGluazogcXVlcnkgZGV2aWNlIGxpc3QgZXJyb3Ig JWQiLCByZXQpOw0KLQlyZXQgPSBmbG93X3RjZl9zZW5kX25sY21kKHRjZiwgJmN0eCk7DQotCWlm IChyZXQpDQotCQlEUlZfTE9HKFdBUk5JTkcsICJuZXRsaW5rOiBkZXZpY2UgZGVsZXRlIGVycm9y ICVkIiwgcmV0KTsNCi19DQotDQotLyoqDQotICogRW1pdCBOZXRsaW5rIG1lc3NhZ2UgdG8gYWRk L3JlbW92ZSBsb2NhbCBhZGRyZXNzIHRvIHRoZSBvdXRlciBkZXZpY2UuDQotICogVGhlIGFkZHJl c3MgYmVpbmcgYWRkZWQgaXMgdmlzaWJsZSB3aXRoaW4gdGhlIGxpbmsgb25seSAoc2NvcGUgbGlu aykuDQotICoNCi0gKiBOb3RlIHRoYXQgYW4gaW1wbGljaXQgcm91dGUgaXMgbWFpbnRhaW5lZCBi eSB0aGUga2VybmVsIGR1ZSB0byB0aGUNCi0gKiBwcmVzZW5jZSBvZiBhIHBlZXIgYWRkcmVzcyAo SUZBX0FERFJFU1MpLg0KLSAqDQotICogVGhlc2UgcnVsZXMgYXJlIHVzZWQgZm9yIGVuY2Fwc3Vs YXRpb24gb25seSBhbmQgYWxsb3cgdG8gYXNzaWduDQotICogdGhlIG91dGVyIHR1bm5lbCBzb3Vy Y2UgSVAgYWRkcmVzcy4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICogICBMaWJtbmwgc29j a2V0IGNvbnRleHQgb2JqZWN0Lg0KLSAqIEBwYXJhbVtpbl0gZW5jYXANCi0gKiAgIEVuY2Fwc3Vs YXRpb24gcHJvcGVydGllcyAoc291cmNlIGFkZHJlc3MgYW5kIGl0cyBwZWVyKS4NCi0gKiBAcGFy YW1baW5dIGlmaW5kZXgNCi0gKiAgIE5ldHdvcmsgaW50ZXJmYWNlIHRvIGFwcGx5IHJ1bGUuDQot ICogQHBhcmFtW2luXSBlbmFibGUNCi0gKiAgIFRvZ2dsZSBiZXR3ZWVuIGFkZCBhbmQgcmVtb3Zl Lg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVw b3J0aW5nIGlmIG5vdCBOVUxMLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgMCBvbiBzdWNjZXNz LCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4N Ci0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfcnVsZV9sb2NhbChzdHJ1Y3QgbWx4NV9mbG93 X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkgICAgY29uc3Qgc3RydWN0IGZsb3dfdGNmX3Z4bGFuX2Vu Y2FwICplbmNhcCwNCi0JCSAgICB1bnNpZ25lZCBpbnQgaWZpbmRleCwNCi0JCSAgICBib29sIGVu YWJsZSwNCi0JCSAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0Jc3RydWN0 IG5sbXNnaGRyICpubGg7DQotCXN0cnVjdCBpZmFkZHJtc2cgKmlmYTsNCi0JYWxpZ25hcyhzdHJ1 Y3Qgbmxtc2doZHIpDQotCXVpbnQ4X3QgYnVmW21ubF9ubG1zZ19zaXplKHNpemVvZigqaWZhKSAr IDEyOCldOw0KLQ0KLQlubGggPSBtbmxfbmxtc2dfcHV0X2hlYWRlcihidWYpOw0KLQlubGgtPm5s bXNnX3R5cGUgPSBlbmFibGUgPyBSVE1fTkVXQUREUiA6IFJUTV9ERUxBRERSOw0KLQlubGgtPm5s bXNnX2ZsYWdzID0NCi0JCU5MTV9GX1JFUVVFU1QgfCAoZW5hYmxlID8gTkxNX0ZfQ1JFQVRFIHwg TkxNX0ZfUkVQTEFDRSA6IDApOw0KLQlubGgtPm5sbXNnX3NlcSA9IDA7DQotCWlmYSA9IG1ubF9u bG1zZ19wdXRfZXh0cmFfaGVhZGVyKG5saCwgc2l6ZW9mKCppZmEpKTsNCi0JaWZhLT5pZmFfZmxh Z3MgPSBJRkFfRl9QRVJNQU5FTlQ7DQotCWlmYS0+aWZhX3Njb3BlID0gUlRfU0NPUEVfTElOSzsN Ci0JaWZhLT5pZmFfaW5kZXggPSBpZmluZGV4Ow0KLQlpZiAoZW5jYXAtPm1hc2sgJiBGTE9XX1RD Rl9FTkNBUF9JUFY0X1NSQykgew0KLQkJaWZhLT5pZmFfZmFtaWx5ID0gQUZfSU5FVDsNCi0JCWlm YS0+aWZhX3ByZWZpeGxlbiA9IDMyOw0KLQkJbW5sX2F0dHJfcHV0X3UzMihubGgsIElGQV9MT0NB TCwgZW5jYXAtPmlwdjQuc3JjKTsNCi0JCWlmIChlbmNhcC0+bWFzayAmIEZMT1dfVENGX0VOQ0FQ X0lQVjRfRFNUKQ0KLQkJCW1ubF9hdHRyX3B1dF91MzIobmxoLCBJRkFfQUREUkVTUywNCi0JCQkJ CSAgICAgIGVuY2FwLT5pcHY0LmRzdCk7DQotCX0gZWxzZSB7DQotCQlhc3NlcnQoZW5jYXAtPm1h c2sgJiBGTE9XX1RDRl9FTkNBUF9JUFY2X1NSQyk7DQotCQlpZmEtPmlmYV9mYW1pbHkgPSBBRl9J TkVUNjsNCi0JCWlmYS0+aWZhX3ByZWZpeGxlbiA9IDEyODsNCi0JCW1ubF9hdHRyX3B1dChubGgs IElGQV9MT0NBTCwNCi0JCQkJICBzaXplb2YoZW5jYXAtPmlwdjYuc3JjKSwNCi0JCQkJICAmZW5j YXAtPmlwdjYuc3JjKTsNCi0JCWlmIChlbmNhcC0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjZf RFNUKQ0KLQkJCW1ubF9hdHRyX3B1dChubGgsIElGQV9BRERSRVNTLA0KLQkJCQkJICBzaXplb2Yo ZW5jYXAtPmlwdjYuZHN0KSwNCi0JCQkJCSAgJmVuY2FwLT5pcHY2LmRzdCk7DQotCX0NCi0JaWYg KCFmbG93X3RjZl9ubF9hY2sodGNmLCBubGgsIE5VTEwsIE5VTEwpKQ0KLQkJcmV0dXJuIDA7DQot CXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIHJ0ZV9lcnJubywNCi0JCQkJICBSVEVf RkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxMLA0KLQkJCQkgICJuZXRsaW5rOiBjYW5u b3QgY29tcGxldGUgSUZBIHJlcXVlc3QiDQotCQkJCSAgIiAoaXAgYWRkciBhZGQpIik7DQotfQ0K LQ0KLS8qKg0KLSAqIEVtaXQgTmV0bGluayBtZXNzYWdlIHRvIGFkZC9yZW1vdmUgbmVpZ2hib3Iu DQotICoNCi0gKiBAcGFyYW1baW5dIHRjZg0KLSAqICAgTGlibW5sIHNvY2tldCBjb250ZXh0IG9i amVjdC4NCi0gKiBAcGFyYW1baW5dIGVuY2FwDQotICogICBFbmNhcHN1bGF0aW9uIHByb3BlcnRp ZXMgKGRlc3RpbmF0aW9uIGFkZHJlc3MpLg0KLSAqIEBwYXJhbVtpbl0gaWZpbmRleA0KLSAqICAg TmV0d29yayBpbnRlcmZhY2UuDQotICogQHBhcmFtW2luXSBlbmFibGUNCi0gKiAgIFRvZ2dsZSBi ZXR3ZWVuIGFkZCBhbmQgcmVtb3ZlLg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQZXJm b3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLg0KLSAqDQotICogQHJldHVy bg0KLSAqICAgMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBh bmQgcnRlX2Vycm5vIGlzIHNldC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfcnVsZV9u ZWlnaChzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkgICAgIGNvbnN0IHN0 cnVjdCBmbG93X3RjZl92eGxhbl9lbmNhcCAqZW5jYXAsDQotCQkgICAgIHVuc2lnbmVkIGludCBp ZmluZGV4LA0KLQkJICAgICBib29sIGVuYWJsZSwNCi0JCSAgICAgc3RydWN0IHJ0ZV9mbG93X2Vy cm9yICplcnJvcikNCi17DQotCXN0cnVjdCBubG1zZ2hkciAqbmxoOw0KLQlzdHJ1Y3QgbmRtc2cg Km5kbTsNCi0JYWxpZ25hcyhzdHJ1Y3Qgbmxtc2doZHIpDQotCXVpbnQ4X3QgYnVmW21ubF9ubG1z Z19zaXplKHNpemVvZigqbmRtKSArIDEyOCldOw0KLQ0KLQlubGggPSBtbmxfbmxtc2dfcHV0X2hl YWRlcihidWYpOw0KLQlubGgtPm5sbXNnX3R5cGUgPSBlbmFibGUgPyBSVE1fTkVXTkVJR0ggOiBS VE1fREVMTkVJR0g7DQotCW5saC0+bmxtc2dfZmxhZ3MgPQ0KLQkJTkxNX0ZfUkVRVUVTVCB8IChl bmFibGUgPyBOTE1fRl9DUkVBVEUgfCBOTE1fRl9SRVBMQUNFIDogMCk7DQotCW5saC0+bmxtc2df c2VxID0gMDsNCi0JbmRtID0gbW5sX25sbXNnX3B1dF9leHRyYV9oZWFkZXIobmxoLCBzaXplb2Yo Km5kbSkpOw0KLQluZG0tPm5kbV9pZmluZGV4ID0gaWZpbmRleDsNCi0JbmRtLT5uZG1fc3RhdGUg PSBOVURfUEVSTUFORU5UOw0KLQluZG0tPm5kbV9mbGFncyA9IDA7DQotCW5kbS0+bmRtX3R5cGUg PSAwOw0KLQlpZiAoZW5jYXAtPm1hc2sgJiBGTE9XX1RDRl9FTkNBUF9JUFY0X0RTVCkgew0KLQkJ bmRtLT5uZG1fZmFtaWx5ID0gQUZfSU5FVDsNCi0JCW1ubF9hdHRyX3B1dF91MzIobmxoLCBOREFf RFNULCBlbmNhcC0+aXB2NC5kc3QpOw0KLQl9IGVsc2Ugew0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNr ICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9EU1QpOw0KLQkJbmRtLT5uZG1fZmFtaWx5ID0gQUZfSU5F VDY7DQotCQltbmxfYXR0cl9wdXQobmxoLCBOREFfRFNULCBzaXplb2YoZW5jYXAtPmlwdjYuZHN0 KSwNCi0JCQkJCQkgJmVuY2FwLT5pcHY2LmRzdCk7DQotCX0NCi0JaWYgKGVuY2FwLT5tYXNrICYg RkxPV19UQ0ZfRU5DQVBfRVRIX1NSQyAmJiBlbmFibGUpDQotCQlEUlZfTE9HKFdBUk5JTkcsDQot CQkJIm91dGVyIGV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGNhbm5vdCBiZSAiDQotCQkJImZvcmNl ZCBmb3IgVlhMQU4gZW5jYXBzdWxhdGlvbiIpOw0KLQlpZiAoZW5jYXAtPm1hc2sgJiBGTE9XX1RD Rl9FTkNBUF9FVEhfRFNUKQ0KLQkJbW5sX2F0dHJfcHV0KG5saCwgTkRBX0xMQUREUiwgc2l6ZW9m KGVuY2FwLT5ldGguZHN0KSwNCi0JCQkJCQkgICAgJmVuY2FwLT5ldGguZHN0KTsNCi0JaWYgKCFm bG93X3RjZl9ubF9hY2sodGNmLCBubGgsIE5VTEwsIE5VTEwpKQ0KLQkJcmV0dXJuIDA7DQotCXJl dHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIHJ0ZV9lcnJubywNCi0JCQkJICBSVEVfRkxP V19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxMLA0KLQkJCQkgICJuZXRsaW5rOiBjYW5ub3Qg Y29tcGxldGUgTkQgcmVxdWVzdCINCi0JCQkJICAiIChpcCBuZWlnaCkiKTsNCi19DQotDQotLyoq DQotICogTWFuYWdlIHRoZSBsb2NhbCBJUCBhZGRyZXNzZXMgYW5kIHRoZWlyIHBlZXJzIElQIGFk ZHJlc3NlcyBvbiB0aGUNCi0gKiBvdXRlciBpbnRlcmZhY2UgZm9yIGVuY2Fwc3VsYXRpb24gcHVy cG9zZXMuIFRoZSBrZXJuZWwgc2VhcmNoZXMgdGhlDQotICogYXBwcm9wcmlhdGUgZGV2aWNlIGZv ciB0dW5uZWwgZWdyZXNzIHRyYWZmaWMgdXNpbmcgdGhlIG91dGVyIHNvdXJjZQ0KLSAqIElQLCB0 aGlzIElQIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgb3V0ZXIgbmV0d29yayBkZXZpY2UsIG90 aGVyd2lzZQ0KLSAqIGtlcm5lbCByZWplY3RzIHRoZSBydWxlLg0KLSAqDQotICogQWRkcyBvciBy ZW1vdmVzIHRoZSBhZGRyZXNzZXMgdXNpbmcgdGhlIE5ldGxpbmsgY29tbWFuZCBsaWtlIHRoaXM6 DQotICogICBpcCBhZGRyIGFkZCA8c3JjX2lwPiBwZWVyIDxkc3RfaXA+IHNjb3BlIGxpbmsgZGV2 IDxpZm91dGVyPg0KLSAqDQotICogVGhlIGFkZHJlc3NlcyBhcmUgbG9jYWwgdG8gdGhlIG5ldGRl diAoInNjb3BlIGxpbmsiKSwgdGhpcyByZWR1Y2VzDQotICogdGhlIHJpc2sgb2YgY29uZmxpY3Rz LiBOb3RlIHRoYXQgYW4gaW1wbGljaXQgcm91dGUgaXMgbWFpbnRhaW5lZCBieQ0KLSAqIHRoZSBr ZXJuZWwgZHVlIHRvIHRoZSBwcmVzZW5jZSBvZiBhIHBlZXIgYWRkcmVzcyAoSUZBX0FERFJFU1Mp Lg0KLSAqDQotICogQHBhcmFtW2luXSB0Y2YNCi0gKiAgIExpYm1ubCBzb2NrZXQgY29udGV4dCBv YmplY3QuDQotICogQHBhcmFtW2luXSBpZmFjZQ0KLSAqICAgT2JqZWN0LCBjb250YWlucyBydWxl IGRhdGFiYXNlIGFuZCBpZm91dGVyIGluZGV4Lg0KLSAqIEBwYXJhbVtpbl0gZGV2X2Zsb3cNCi0g KiAgIEZsb3cgb2JqZWN0LCBjb250YWlucyB0aGUgdHVubmVsIHBhcmFtZXRlcnMgKGZvciBlbmNh cCBvbmx5KS4NCi0gKiBAcGFyYW1baW5dIGVuYWJsZQ0KLSAqICAgVG9nZ2xlIGJldHdlZW4gYWRk IGFuZCByZW1vdmUuDQotICogQHBhcmFtW291dF0gZXJyb3INCi0gKiAgIFBlcmZvcm0gdmVyYm9z ZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuDQotICoNCi0gKiBAcmV0dXJuDQotICogICAw IG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJy bm8gaXMgc2V0Lg0KLSAqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl9lbmNhcF9sb2NhbChzdHJ1 Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkgICAgIHN0cnVjdCB0Y2ZfaXJ1bGUg KmlmYWNlLA0KLQkJICAgICBzdHJ1Y3QgbWx4NV9mbG93ICpkZXZfZmxvdywNCi0JCSAgICAgYm9v bCBlbmFibGUsDQotCQkgICAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQotew0KLQlj b25zdCBzdHJ1Y3QgZmxvd190Y2ZfdnhsYW5fZW5jYXAgKmVuY2FwID0gZGV2X2Zsb3ctPnRjZi52 eGxhbl9lbmNhcDsNCi0Jc3RydWN0IHRjZl9sb2NhbF9ydWxlICpydWxlID0gTlVMTDsNCi0JaW50 IHJldDsNCi0NCi0JYXNzZXJ0KGVuY2FwKTsNCi0JYXNzZXJ0KGVuY2FwLT5oZHIudHlwZSA9PSBG TE9XX1RDRl9UVU5BQ1RfVlhMQU5fRU5DQVApOw0KLQlpZiAoZW5jYXAtPm1hc2sgJiBGTE9XX1RD Rl9FTkNBUF9JUFY0X1NSQykgew0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5D QVBfSVBWNF9EU1QpOw0KLQkJTElTVF9GT1JFQUNIKHJ1bGUsICZpZmFjZS0+bG9jYWwsIG5leHQp IHsNCi0JCQlpZiAocnVsZS0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjRfU1JDICYmDQotCQkJ ICAgIGVuY2FwLT5pcHY0LnNyYyA9PSBydWxlLT5pcHY0LnNyYyAmJg0KLQkJCSAgICBlbmNhcC0+ aXB2NC5kc3QgPT0gcnVsZS0+aXB2NC5kc3QpIHsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0K LQl9IGVsc2Ugew0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9T UkMpOw0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9EU1QpOw0K LQkJTElTVF9GT1JFQUNIKHJ1bGUsICZpZmFjZS0+bG9jYWwsIG5leHQpIHsNCi0JCQlpZiAocnVs ZS0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjZfU1JDICYmDQotCQkJICAgICFtZW1jbXAoJmVu Y2FwLT5pcHY2LnNyYywgJnJ1bGUtPmlwdjYuc3JjLA0KLQkJCQkJICAgIHNpemVvZihlbmNhcC0+ aXB2Ni5zcmMpKSAmJg0KLQkJCSAgICAhbWVtY21wKCZlbmNhcC0+aXB2Ni5kc3QsICZydWxlLT5p cHY2LmRzdCwNCi0JCQkJCSAgICBzaXplb2YoZW5jYXAtPmlwdjYuZHN0KSkpIHsNCi0JCQkJYnJl YWs7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCWlmIChydWxlKSB7DQotCQlpZiAoZW5hYmxlKSB7DQot CQkJcnVsZS0+cmVmY250Kys7DQotCQkJcmV0dXJuIDA7DQotCQl9DQotCQlpZiAoIXJ1bGUtPnJl ZmNudCB8fCAhLS1ydWxlLT5yZWZjbnQpIHsNCi0JCQlMSVNUX1JFTU9WRShydWxlLCBuZXh0KTsN Ci0JCQlyZXR1cm4gZmxvd190Y2ZfcnVsZV9sb2NhbCh0Y2YsIGVuY2FwLA0KLQkJCQkJaWZhY2Ut Pmlmb3V0ZXIsIGZhbHNlLCBlcnJvcik7DQotCQl9DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQlpZiAo IWVuYWJsZSkgew0KLQkJRFJWX0xPRyhXQVJOSU5HLCAiZGlzYWJsaW5nIG5vdCBleGlzdGluZyBs b2NhbCBydWxlIik7DQotCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT0VOVCwNCi0JCQkJ ICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICAgImRpc2Fi bGluZyBub3QgZXhpc3RpbmcgbG9jYWwgcnVsZSIpOw0KLQkJcmV0dXJuIC1FTk9FTlQ7DQotCX0N Ci0JcnVsZSA9IHJ0ZV96bWFsbG9jKF9fZnVuY19fLCBzaXplb2Yoc3RydWN0IHRjZl9sb2NhbF9y dWxlKSwNCi0JCQkJYWxpZ25vZihzdHJ1Y3QgdGNmX2xvY2FsX3J1bGUpKTsNCi0JaWYgKCFydWxl KSB7DQotCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwNCi0JCQkJICAgUlRFX0ZM T1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICAgInVuYWJsZSB0byBhbGxv Y2F0ZSBtZW1vcnkgZm9yIGxvY2FsIHJ1bGUiKTsNCi0JCXJldHVybiAtcnRlX2Vycm5vOw0KLQl9 DQotCSpydWxlID0gKHN0cnVjdCB0Y2ZfbG9jYWxfcnVsZSl7LnJlZmNudCA9IDAsDQotCQkJCQku bWFzayA9IDAsDQotCQkJCQl9Ow0KLQlpZiAoZW5jYXAtPm1hc2sgJiBGTE9XX1RDRl9FTkNBUF9J UFY0X1NSQykgew0KLQkJcnVsZS0+bWFzayA9IEZMT1dfVENGX0VOQ0FQX0lQVjRfU1JDDQotCQkJ ICAgfCBGTE9XX1RDRl9FTkNBUF9JUFY0X0RTVDsNCi0JCXJ1bGUtPmlwdjQuc3JjID0gZW5jYXAt PmlwdjQuc3JjOw0KLQkJcnVsZS0+aXB2NC5kc3QgPSBlbmNhcC0+aXB2NC5kc3Q7DQotCX0gZWxz ZSB7DQotCQlydWxlLT5tYXNrID0gRkxPV19UQ0ZfRU5DQVBfSVBWNl9TUkMNCi0JCQkgICB8IEZM T1dfVENGX0VOQ0FQX0lQVjZfRFNUOw0KLQkJbWVtY3B5KCZydWxlLT5pcHY2LnNyYywgJmVuY2Fw LT5pcHY2LnNyYywgSVBWNl9BRERSX0xFTik7DQotCQltZW1jcHkoJnJ1bGUtPmlwdjYuZHN0LCAm ZW5jYXAtPmlwdjYuZHN0LCBJUFY2X0FERFJfTEVOKTsNCi0JfQ0KLQlyZXQgPSBmbG93X3RjZl9y dWxlX2xvY2FsKHRjZiwgZW5jYXAsIGlmYWNlLT5pZm91dGVyLCB0cnVlLCBlcnJvcik7DQotCWlm IChyZXQpIHsNCi0JCXJ0ZV9mcmVlKHJ1bGUpOw0KLQkJcmV0dXJuIHJldDsNCi0JfQ0KLQlydWxl LT5yZWZjbnQrKzsNCi0JTElTVF9JTlNFUlRfSEVBRCgmaWZhY2UtPmxvY2FsLCBydWxlLCBuZXh0 KTsNCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLS8qKg0KLSAqIE1hbmFnZSB0aGUgZGVzdGluYXRpb24g TUFDL0lQIGFkZHJlc3NlcyBuZWlnaCBkYXRhYmFzZSwga2VybmVsIHVzZXMNCi0gKiB0aGlzIG9u ZSB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzIHdpdGhpbiBlbmNhcHN1 bGF0aW9uDQotICogaGVhZGVyLiBBZGRzIG9yIHJlbW92ZXMgdGhlIGVudHJpZXMgdXNpbmcgdGhl IE5ldGxpbmsgY29tbWFuZCBsaWtlIHRoaXM6DQotICogICBpcCBuZWlnaCBhZGQgZGV2IDxpZm91 dGVyPiBsbGFkZHIgPGRzdF9tYWM+IHRvIDxkc3RfaXA+IG51ZCBwZXJtYW5lbnQNCi0gKg0KLSAq IEBwYXJhbVtpbl0gdGNmDQotICogICBMaWJtbmwgc29ja2V0IGNvbnRleHQgb2JqZWN0Lg0KLSAq IEBwYXJhbVtpbl0gaWZhY2UNCi0gKiAgIE9iamVjdCwgY29udGFpbnMgcnVsZSBkYXRhYmFzZSBh bmQgaWZvdXRlciBpbmRleC4NCi0gKiBAcGFyYW1baW5dIGRldl9mbG93DQotICogICBGbG93IG9i amVjdCwgY29udGFpbnMgdGhlIHR1bm5lbCBwYXJhbWV0ZXJzIChmb3IgZW5jYXAgb25seSkuDQot ICogQHBhcmFtW2luXSBlbmFibGUNCi0gKiAgIFRvZ2dsZSBiZXR3ZWVuIGFkZCBhbmQgcmVtb3Zl Lg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVw b3J0aW5nIGlmIG5vdCBOVUxMLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgMCBvbiBzdWNjZXNz LCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNldC4N Ci0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfZW5jYXBfbmVpZ2goc3RydWN0IG1seDVfZmxv d190Y2ZfY29udGV4dCAqdGNmLA0KLQkJICAgICBzdHJ1Y3QgdGNmX2lydWxlICppZmFjZSwNCi0J CSAgICAgc3RydWN0IG1seDVfZmxvdyAqZGV2X2Zsb3csDQotCQkgICAgIGJvb2wgZW5hYmxlLA0K LQkJICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0JY29uc3Qgc3RydWN0 IGZsb3dfdGNmX3Z4bGFuX2VuY2FwICplbmNhcCA9IGRldl9mbG93LT50Y2YudnhsYW5fZW5jYXA7 DQotCXN0cnVjdCB0Y2ZfbmVpZ2hfcnVsZSAqcnVsZSA9IE5VTEw7DQotCWludCByZXQ7DQotDQot CWFzc2VydChlbmNhcCk7DQotCWFzc2VydChlbmNhcC0+aGRyLnR5cGUgPT0gRkxPV19UQ0ZfVFVO QUNUX1ZYTEFOX0VOQ0FQKTsNCi0JaWYgKGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBW NF9EU1QpIHsNCi0JCWFzc2VydChlbmNhcC0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjRfU1JD KTsNCi0JCUxJU1RfRk9SRUFDSChydWxlLCAmaWZhY2UtPm5laWdoLCBuZXh0KSB7DQotCQkJaWYg KHJ1bGUtPm1hc2sgJiBGTE9XX1RDRl9FTkNBUF9JUFY0X0RTVCAmJg0KLQkJCSAgICBlbmNhcC0+ aXB2NC5kc3QgPT0gcnVsZS0+aXB2NC5kc3QpIHsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0K LQl9IGVsc2Ugew0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9T UkMpOw0KLQkJYXNzZXJ0KGVuY2FwLT5tYXNrICYgRkxPV19UQ0ZfRU5DQVBfSVBWNl9EU1QpOw0K LQkJTElTVF9GT1JFQUNIKHJ1bGUsICZpZmFjZS0+bmVpZ2gsIG5leHQpIHsNCi0JCQlpZiAocnVs ZS0+bWFzayAmIEZMT1dfVENGX0VOQ0FQX0lQVjZfRFNUICYmDQotCQkJICAgICFtZW1jbXAoJmVu Y2FwLT5pcHY2LmRzdCwgJnJ1bGUtPmlwdjYuZHN0LA0KLQkJCQkJCXNpemVvZihlbmNhcC0+aXB2 Ni5kc3QpKSkgew0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCX0NCi0JaWYgKHJ1bGUpIHsN Ci0JCWlmIChtZW1jbXAoJmVuY2FwLT5ldGguZHN0LCAmcnVsZS0+ZXRoLA0KLQkJCSAgIHNpemVv ZihlbmNhcC0+ZXRoLmRzdCkpKSB7DQotCQkJRFJWX0xPRyhXQVJOSU5HLCAiRGVzdGluYXRpb24g TUFDIGRpZmZlcnMiDQotCQkJCQkgIiBpbiBuZWlnaCBydWxlIik7DQotCQkJcnRlX2Zsb3dfZXJy b3Jfc2V0KGVycm9yLCBFRVhJU1QsDQotCQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BF Q0lGSUVELA0KLQkJCQkJICAgTlVMTCwgIkRpZmZlcmVudCBNQUMgYWRkcmVzcyINCi0JCQkJCSAg ICIgbmVpZ2ggcnVsZSBmb3IgdGhlIHNhbWUiDQotCQkJCQkgICAiIGRlc3RpbmF0aW9uIElQIik7 DQotCQkJCQlyZXR1cm4gLUVFWElTVDsNCi0JCX0NCi0JCWlmIChlbmFibGUpIHsNCi0JCQlydWxl LT5yZWZjbnQrKzsNCi0JCQlyZXR1cm4gMDsNCi0JCX0NCi0JCWlmICghcnVsZS0+cmVmY250IHx8 ICEtLXJ1bGUtPnJlZmNudCkgew0KLQkJCUxJU1RfUkVNT1ZFKHJ1bGUsIG5leHQpOw0KLQkJCXJl dHVybiBmbG93X3RjZl9ydWxlX25laWdoKHRjZiwgZW5jYXAsDQotCQkJCQkJICAgaWZhY2UtPmlm b3V0ZXIsDQotCQkJCQkJICAgZmFsc2UsIGVycm9yKTsNCi0JCX0NCi0JCXJldHVybiAwOw0KLQl9 DQotCWlmICghZW5hYmxlKSB7DQotCQlEUlZfTE9HKFdBUk5JTkcsICJEaXNhYmxpbmcgbm90IGV4 aXN0aW5nIG5laWdoIHJ1bGUiKTsNCi0JCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PRU5U LA0KLQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxMLA0KLQkJCQkg ICAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmVpZ2ggcnVsZSIpOw0KLQkJcmV0dXJu IC1FTk9FTlQ7DQotCX0NCi0JcnVsZSA9IHJ0ZV96bWFsbG9jKF9fZnVuY19fLCBzaXplb2Yoc3Ry dWN0IHRjZl9uZWlnaF9ydWxlKSwNCi0JCQkJYWxpZ25vZihzdHJ1Y3QgdGNmX25laWdoX3J1bGUp KTsNCi0JaWYgKCFydWxlKSB7DQotCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVOT01FTSwN Ci0JCQkJICAgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICAg InVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5laWdoIHJ1bGUiKTsNCi0JCXJldHVybiAt cnRlX2Vycm5vOw0KLQl9DQotCSpydWxlID0gKHN0cnVjdCB0Y2ZfbmVpZ2hfcnVsZSl7LnJlZmNu dCA9IDAsDQotCQkJCQkubWFzayA9IDAsDQotCQkJCQl9Ow0KLQlpZiAoZW5jYXAtPm1hc2sgJiBG TE9XX1RDRl9FTkNBUF9JUFY0X0RTVCkgew0KLQkJcnVsZS0+bWFzayA9IEZMT1dfVENGX0VOQ0FQ X0lQVjRfRFNUOw0KLQkJcnVsZS0+aXB2NC5kc3QgPSBlbmNhcC0+aXB2NC5kc3Q7DQotCX0gZWxz ZSB7DQotCQlydWxlLT5tYXNrID0gRkxPV19UQ0ZfRU5DQVBfSVBWNl9EU1Q7DQotCQltZW1jcHko JnJ1bGUtPmlwdjYuZHN0LCAmZW5jYXAtPmlwdjYuZHN0LCBJUFY2X0FERFJfTEVOKTsNCi0JfQ0K LQltZW1jcHkoJnJ1bGUtPmV0aCwgJmVuY2FwLT5ldGguZHN0LCBzaXplb2YocnVsZS0+ZXRoKSk7 DQotCXJldCA9IGZsb3dfdGNmX3J1bGVfbmVpZ2godGNmLCBlbmNhcCwgaWZhY2UtPmlmb3V0ZXIs IHRydWUsIGVycm9yKTsNCi0JaWYgKHJldCkgew0KLQkJcnRlX2ZyZWUocnVsZSk7DQotCQlyZXR1 cm4gcmV0Ow0KLQl9DQotCXJ1bGUtPnJlZmNudCsrOw0KLQlMSVNUX0lOU0VSVF9IRUFEKCZpZmFj ZS0+bmVpZ2gsIHJ1bGUsIG5leHQpOw0KLQlyZXR1cm4gMDsNCi19DQotDQotLyogVlhMQU4gZW5j YXAgcnVsZSBkYXRhYmFzZSBmb3Igb3V0ZXIgaW50ZXJmYWNlcy4gKi8NCi1zdGF0aWMgIExJU1Rf SEVBRCgsIHRjZl9pcnVsZSkgaWZhY2VfbGlzdF92eGxhbiA9IExJU1RfSEVBRF9JTklUSUFMSVpF UigpOw0KLQ0KLS8qIFZURVAgZGV2aWNlIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gUE1EIHBvcnQg aW5zdGFuY2VzLiAqLw0KLXN0YXRpYyBMSVNUX0hFQUQoLCB0Y2ZfdnRlcCkgdnRlcF9saXN0X3Z4 bGFuID0gTElTVF9IRUFEX0lOSVRJQUxJWkVSKCk7DQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB2 dGVwX2xpc3RfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOw0KLQ0KLS8qKg0KLSAq IEFjcXVpcmUgdGhlIFZYTEFOIGVuY2FwIHJ1bGVzIGNvbnRhaW5lciBmb3Igc3BlY2lmaWVkIGlu dGVyZmFjZS4NCi0gKiBGaXJzdCBsb29rcyBmb3IgdGhlIGNvbnRhaW5lciBpbiB0aGUgZXhpc3Rp bmcgb25lcyBsaXN0LCBjcmVhdGVzDQotICogYW5kIGluaXRpYWxpemVzIHRoZSBuZXcgY29udGFp bmVyIGlmIGV4aXN0aW5nIG5vdCBmb3VuZC4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICog ICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBieSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfY3Jl YXRlKCkuDQotICogQHBhcmFtW2luXSBpZm91dGVyDQotICogICBOZXR3b3JrIGludGVyZmFjZSBp bmRleCB0byBjcmVhdGUgVlhMQU4gZW5jYXAgcnVsZXMgb24uDQotICogQHBhcmFtW291dF0gZXJy b3INCi0gKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuDQot ICogQHJldHVybg0KLSAqICAgUnVsZSBjb250YWluZXIgcG9pbnRlciBvbiBzdWNjZXNzLA0KLSAq ICAgTlVMTCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIHN0 cnVjdCB0Y2ZfaXJ1bGUqDQotZmxvd190Y2ZfZW5jYXBfaXJ1bGVfYWNxdWlyZShzdHJ1Y3QgbWx4 NV9mbG93X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkJICAgICB1bnNpZ25lZCBpbnQgaWZvdXRlciwN Ci0JCQkgICAgIHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQotew0KLQlzdHJ1Y3QgdGNm X2lydWxlICppZmFjZTsNCi0NCi0JLyogTG9vayB3aGV0aGVyIHRoZSBjb250YWluZXIgZm9yIGVu Y2FwIHJ1bGVzIGlzIGNyZWF0ZWQuICovDQotCWFzc2VydChpZm91dGVyKTsNCi0JTElTVF9GT1JF QUNIKGlmYWNlLCAmaWZhY2VfbGlzdF92eGxhbiwgbmV4dCkgew0KLQkJaWYgKGlmYWNlLT5pZm91 dGVyID09IGlmb3V0ZXIpDQotCQkJYnJlYWs7DQotCX0NCi0JaWYgKGlmYWNlKSB7DQotCQkvKiBD b250YWluZXIgYWxyZWFkeSBleGlzdHMsIGp1c3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UuICov DQotCQlpZmFjZS0+cmVmY250Kys7DQotCQlyZXR1cm4gaWZhY2U7DQotCX0NCi0JLyogTm90IGZv dW5kLCB3ZSBzaG91bGQgY3JlYXRlIHRoZSBuZXcgY29udGFpbmVyLiAqLw0KLQlpZmFjZSA9IHJ0 ZV96bWFsbG9jKF9fZnVuY19fLCBzaXplb2YoKmlmYWNlKSwNCi0JCQkgICAgYWxpZ25vZihzdHJ1 Y3QgdGNmX2lydWxlKSk7DQotCWlmICghaWZhY2UpIHsNCi0JCXJ0ZV9mbG93X2Vycm9yX3NldChl cnJvciwgRU5PTUVNLA0KLQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBO VUxMLA0KLQkJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGFpbmVyIik7 DQotCQlyZXR1cm4gTlVMTDsNCi0JfQ0KLQkqaWZhY2UgPSAoc3RydWN0IHRjZl9pcnVsZSl7DQot CQkJLmxvY2FsID0gTElTVF9IRUFEX0lOSVRJQUxJWkVSKCksDQotCQkJLm5laWdoID0gTElTVF9I RUFEX0lOSVRJQUxJWkVSKCksDQotCQkJLmlmb3V0ZXIgPSBpZm91dGVyLA0KLQkJCS5yZWZjbnQg PSAxLA0KLQl9Ow0KLQkvKiBJbnRlcmZhY2UgY2xlYW51cCBmb3IgbmV3IGNvbnRhaW5lciBjcmVh dGVkLiAqLw0KLQlmbG93X3RjZl9lbmNhcF9pZmFjZV9jbGVhbnVwKHRjZiwgaWZvdXRlcik7DQot CWZsb3dfdGNmX2VuY2FwX2xvY2FsX2NsZWFudXAodGNmLCBpZm91dGVyKTsNCi0JZmxvd190Y2Zf ZW5jYXBfbmVpZ2hfY2xlYW51cCh0Y2YsIGlmb3V0ZXIpOw0KLQlMSVNUX0lOU0VSVF9IRUFEKCZp ZmFjZV9saXN0X3Z4bGFuLCBpZmFjZSwgbmV4dCk7DQotCXJldHVybiBpZmFjZTsNCi19DQotDQot LyoqDQotICogUmVsZWFzZXMgVlhMQU4gZW5jYXAgcnVsZXMgY29udGFpbmVyIGJ5IHBvaW50ZXIu IERlY3JlbWVudHMgdGhlDQotICogcmVmZXJlbmNlIGNvdW50ZXIgYW5kIGRlbGV0ZXMgdGhlIGNv bnRhaW5lciBpZiBjb3VudGVyIGlzIHplcm8uDQotICoNCi0gKiBAcGFyYW1baW5dIGlydWxlDQot ICogICBWWExBTiBydWxlIGNvbnRhaW5lciBwb2ludGVyIHRvIHJlbGVhc2UuDQotICovDQotc3Rh dGljIHZvaWQNCi1mbG93X3RjZl9lbmNhcF9pcnVsZV9yZWxlYXNlKHN0cnVjdCB0Y2ZfaXJ1bGUg KmlmYWNlKQ0KLXsNCi0JYXNzZXJ0KGlmYWNlLT5yZWZjbnQpOw0KLQlpZiAoLS1pZmFjZS0+cmVm Y250ID09IDApIHsNCi0JCS8qIFJlZmVyZW5jZSBjb3VudGVyIGlzIHplcm8sIGRlbGV0ZSB0aGUg Y29udGFpbmVyLiAqLw0KLQkJYXNzZXJ0KExJU1RfRU1QVFkoJmlmYWNlLT5sb2NhbCkpOw0KLQkJ YXNzZXJ0KExJU1RfRU1QVFkoJmlmYWNlLT5uZWlnaCkpOw0KLQkJTElTVF9SRU1PVkUoaWZhY2Us IG5leHQpOw0KLQkJcnRlX2ZyZWUoaWZhY2UpOw0KLQl9DQotfQ0KLQ0KLS8qKg0KLSAqIERlbGV0 ZXMgVlRFUCBuZXR3b3JrIGRldmljZS4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICogICBD b250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBieSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfY3JlYXRl KCkuDQotICogQHBhcmFtW2luXSB2dGVwDQotICogICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBu ZXR3b3JrIGRldmljZSB0byBkZWxldGUuIE1lbW9yeQ0KLSAqICAgYWxsb2NhdGVkIGZvciB0aGlz IG9iamVjdCBpcyBmcmVlZCBieSByb3V0aW5lLg0KLSAqLw0KLXN0YXRpYyB2b2lkDQotZmxvd190 Y2ZfdnRlcF9kZWxldGUoc3RydWN0IG1seDVfZmxvd190Y2ZfY29udGV4dCAqdGNmLA0KLQkJICAg ICBzdHJ1Y3QgdGNmX3Z0ZXAgKnZ0ZXApDQotew0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0J c3RydWN0IGlmaW5mb21zZyAqaWZtOw0KLQlhbGlnbmFzKHN0cnVjdCBubG1zZ2hkcikNCi0JdWlu dDhfdCBidWZbbW5sX25sbXNnX3NpemUoTU5MX0FMSUdOKHNpemVvZigqaWZtKSkpICsNCi0JCSAg ICBNTkxfQlVGX0VYVFJBX1NQQUNFXTsNCi0JaW50IHJldDsNCi0NCi0JYXNzZXJ0KCF2dGVwLT5y ZWZjbnQpOw0KLQkvKiBEZWxldGUgb25seSBpZmFjZXMgdGhvc2Ugd2UgYWN0dWFsbHkgY3JlYXRl ZC4gKi8NCi0JaWYgKHZ0ZXAtPmNyZWF0ZWQgJiYgdnRlcC0+aWZpbmRleCkgew0KLQkJRFJWX0xP RyhJTkZPLCAiVlRFUCBkZWxldGUgKCVkKSIsIHZ0ZXAtPmlmaW5kZXgpOw0KLQkJbmxoID0gbW5s X25sbXNnX3B1dF9oZWFkZXIoYnVmKTsNCi0JCW5saC0+bmxtc2dfdHlwZSA9IFJUTV9ERUxMSU5L Ow0KLQkJbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7DQotCQlpZm0gPSBtbmxfbmxt c2dfcHV0X2V4dHJhX2hlYWRlcihubGgsIHNpemVvZigqaWZtKSk7DQotCQlpZm0tPmlmaV9mYW1p bHkgPSBBRl9VTlNQRUM7DQotCQlpZm0tPmlmaV9pbmRleCA9IHZ0ZXAtPmlmaW5kZXg7DQotCQlh c3NlcnQoc2l6ZW9mKGJ1ZikgPj0gbmxoLT5ubG1zZ19sZW4pOw0KLQkJcmV0ID0gZmxvd190Y2Zf bmxfYWNrKHRjZiwgbmxoLCBOVUxMLCBOVUxMKTsNCi0JCWlmIChyZXQpDQotCQkJRFJWX0xPRyhX QVJOSU5HLCAibmV0bGluazogZXJyb3IgZGVsZXRpbmcgdnhsYW4iDQotCQkJCQkgIiBlbmNhcC9k ZWNhcCBpZmluZGV4ICV1IiwNCi0JCQkJCSBpZm0tPmlmaV9pbmRleCk7DQotCX0NCi0JcnRlX2Zy ZWUodnRlcCk7DQotfQ0KLQ0KLS8qKg0KLSAqIENyZWF0ZXMgVlRFUCBuZXR3b3JrIGRldmljZS4N Ci0gKg0KLSAqIEBwYXJhbVtpbl0gdGNmDQotICogICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXpl ZCBieSBtbHg1X2Zsb3dfdGNmX2NvbnRleHRfY3JlYXRlKCkuDQotICogQHBhcmFtW2luXSBwb3J0 DQotICogICBVRFAgcG9ydCBvZiBjcmVhdGVkIFZURVAgZGV2aWNlLg0KLSAqIEBwYXJhbVtvdXRd IGVycm9yDQotICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxM Lg0KLSAqDQotICogQHJldHVybg0KLSAqIFBvaW50ZXIgdG8gY3JlYXRlZCBkZXZpY2Ugc3RydWN0 dXJlIG9uIHN1Y2Nlc3MsDQotICogTlVMTCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQu DQotICovDQotc3RhdGljIHN0cnVjdCB0Y2ZfdnRlcCoNCi1mbG93X3RjZl92dGVwX2NyZWF0ZShz dHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkgICAgIHVpbnQxNl90IHBvcnQs IHN0cnVjdCBydGVfZmxvd19lcnJvciAqZXJyb3IpDQotew0KLQlzdHJ1Y3QgdGNmX3Z0ZXAgKnZ0 ZXA7DQotCXN0cnVjdCBubG1zZ2hkciAqbmxoOw0KLQlzdHJ1Y3QgaWZpbmZvbXNnICppZm07DQot CWNoYXIgbmFtZVtzaXplb2YoTUxYNV9WWExBTl9ERVZJQ0VfUEZYKSArIDI0XTsNCi0JYWxpZ25h cyhzdHJ1Y3Qgbmxtc2doZHIpDQotCXVpbnQ4X3QgYnVmW21ubF9ubG1zZ19zaXplKHNpemVvZigq aWZtKSkgKw0KLQkJICAgIFNaX05MQVRUUl9EQVRBX09GKHNpemVvZihuYW1lKSkgKw0KLQkJICAg IFNaX05MQVRUUl9ORVNUICogMiArDQotCQkgICAgU1pfTkxBVFRSX1NUUlpfT0YoInZ4bGFuIikg Kw0KLQkJICAgIFNaX05MQVRUUl9EQVRBX09GKHNpemVvZih1aW50MzJfdCkpICsNCi0JCSAgICBT Wl9OTEFUVFJfREFUQV9PRihzaXplb2YodWludDE2X3QpKSArDQotCQkgICAgU1pfTkxBVFRSX0RB VEFfT0Yoc2l6ZW9mKHVpbnQ4X3QpKSAqIDMgKw0KLQkJICAgIE1OTF9CVUZfRVhUUkFfU1BBQ0Vd Ow0KLQlzdHJ1Y3QgbmxhdHRyICpuYV9pbmZvOw0KLQlzdHJ1Y3QgbmxhdHRyICpuYV92eGxhbjsN Ci0JcnRlX2JlMTZfdCB2eGxhbl9wb3J0ID0gcnRlX2NwdV90b19iZV8xNihwb3J0KTsNCi0JaW50 IHJldDsNCi0NCi0JdnRlcCA9IHJ0ZV96bWFsbG9jKF9fZnVuY19fLCBzaXplb2YoKnZ0ZXApLCBh bGlnbm9mKHN0cnVjdCB0Y2ZfdnRlcCkpOw0KLQlpZiAoIXZ0ZXApIHsNCi0JCXJ0ZV9mbG93X2Vy cm9yX3NldChlcnJvciwgRU5PTUVNLA0KLQkJCQkgICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BF Q0lGSUVELCBOVUxMLA0KLQkJCQkgICAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVlRF UCIpOw0KLQkJcmV0dXJuIE5VTEw7DQotCX0NCi0JKnZ0ZXAgPSAoc3RydWN0IHRjZl92dGVwKXsN Ci0JCQkucG9ydCA9IHBvcnQsDQotCX07DQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsN Ci0JbmxoID0gbW5sX25sbXNnX3B1dF9oZWFkZXIoYnVmKTsNCi0JbmxoLT5ubG1zZ190eXBlID0g UlRNX05FV0xJTks7DQotCW5saC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxNX0Zf Q1JFQVRFICB8IE5MTV9GX0VYQ0w7DQotCWlmbSA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVy KG5saCwgc2l6ZW9mKCppZm0pKTsNCi0JaWZtLT5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOw0KLQlp Zm0tPmlmaV90eXBlID0gMDsNCi0JaWZtLT5pZmlfaW5kZXggPSAwOw0KLQlpZm0tPmlmaV9mbGFn cyA9IElGRl9VUDsNCi0JaWZtLT5pZmlfY2hhbmdlID0gMHhmZmZmZmZmZjsNCi0Jc25wcmludGYo bmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMldSIsIE1MWDVfVlhMQU5fREVWSUNFX1BGWCwgcG9ydCk7 DQotCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgSUZMQV9JRk5BTUUsIG5hbWUpOw0KLQluYV9pbmZv ID0gbW5sX2F0dHJfbmVzdF9zdGFydChubGgsIElGTEFfTElOS0lORk8pOw0KLQlhc3NlcnQobmFf aW5mbyk7DQotCW1ubF9hdHRyX3B1dF9zdHJ6KG5saCwgSUZMQV9JTkZPX0tJTkQsICJ2eGxhbiIp Ow0KLQluYV92eGxhbiA9IG1ubF9hdHRyX25lc3Rfc3RhcnQobmxoLCBJRkxBX0lORk9fREFUQSk7 DQotCWFzc2VydChuYV92eGxhbik7DQotI2lmZGVmIEhBVkVfSUZMQV9WWExBTl9DT0xMRUNUX01F VEFEQVRBDQotCS8qDQotCSAqIFJIIDcuMiBkb2VzIG5vdCBzdXBwb3J0IG1ldGFkYXRhIGZvciB0 dW5uZWwgZGV2aWNlLg0KLQkgKiBJdCBkb2VzIG5vdCBtYXR0ZXIgYmVjYXVzZSB3ZSBhcmUgZ29p bmcgdG8gdXNlIHRoZQ0KLQkgKiBoYXJkd2FyZSBvZmZsb2FkIGJ5IG1seDUgZHJpdmVyLg0KLQkg Ki8NCi0JbW5sX2F0dHJfcHV0X3U4KG5saCwgSUZMQV9WWExBTl9DT0xMRUNUX01FVEFEQVRBLCAx KTsNCi0jZW5kaWYNCi0JbW5sX2F0dHJfcHV0X3U4KG5saCwgSUZMQV9WWExBTl9VRFBfWkVST19D U1VNNl9SWCwgMSk7DQotCW1ubF9hdHRyX3B1dF91OChubGgsIElGTEFfVlhMQU5fTEVBUk5JTkcs IDApOw0KLQltbmxfYXR0cl9wdXRfdTE2KG5saCwgSUZMQV9WWExBTl9QT1JULCB2eGxhbl9wb3J0 KTsNCi0jaWZuZGVmIEhBVkVfSUZMQV9WWExBTl9DT0xMRUNUX01FVEFEQVRBDQotCS8qDQotCSAq ICBXZSBtdXN0IHNwZWNpZnkgVk5JIGV4cGxpY2l0bHkgaWYgbWV0YWRhdGEgbm90IHN1cHBvcnRl ZC4NCi0JICogIE5vdGUsIFZOSSBpcyB0cmFuc2ZlcnJlZCB3aXRoIG5hdGl2ZSBlbmRpYW5uZXNz IGZvcm1hdC4NCi0JICovDQotCW1ubF9hdHRyX3B1dF91MTYobmxoLCBJRkxBX1ZYTEFOX0lELCBN TFg1X1ZYTEFOX0RFRkFVTFRfVk5JKTsNCi0jZW5kaWYNCi0JbW5sX2F0dHJfbmVzdF9lbmQobmxo LCBuYV92eGxhbik7DQotCW1ubF9hdHRyX25lc3RfZW5kKG5saCwgbmFfaW5mbyk7DQotCWFzc2Vy dChzaXplb2YoYnVmKSA+PSBubGgtPm5sbXNnX2xlbik7DQotCXJldCA9IGZsb3dfdGNmX25sX2Fj ayh0Y2YsIG5saCwgTlVMTCwgTlVMTCk7DQotCWlmIChyZXQpIHsNCi0JCURSVl9MT0coV0FSTklO RywNCi0JCQkibmV0bGluazogVlRFUCAlcyBjcmVhdGUgZmFpbHVyZSAoJWQpIiwNCi0JCQluYW1l LCBydGVfZXJybm8pOw0KLQkJaWYgKHJ0ZV9lcnJubyAhPSBFRVhJU1QpDQotCQkJLyoNCi0JCQkg KiBTb21lIHVuaGFuZGxlZCBlcnJvciBvY2N1cnJlZCBvciBkZXZpY2UgaXMNCi0JCQkgKiBmb3Ig ZW5jYXBzdWxhdGlvbiBhbmQgY2Fubm90IGJlIHNoYXJlZC4NCi0JCQkgKi8NCi0JCQlnb3RvIGVy cm9yOw0KLQl9IGVsc2Ugew0KLQkJLyoNCi0JCSAqIE1hcmsgZGV2aWNlIHdlIGFjdHVhbGx5IGNy ZWF0ZWQuDQotCQkgKiBXZSBzaG91bGQgZXhwbGljaXRseSBkZWxldGUNCi0JCSAqIHdoZW4gd2Ug ZG8gbm90IG5lZWQgaXQgYW55bW9yZS4NCi0JCSAqLw0KLQkJdnRlcC0+Y3JlYXRlZCA9IDE7DQot CQl2dGVwLT53YWl0cmVnID0gMTsNCi0JfQ0KLQkvKiBUcnkgdG8gZ2V0IGlmaW5kZXggb2YgY3Jl YXRlZCBvZiBwcmUtZXhpc3RpbmcgZGV2aWNlLiAqLw0KLQlyZXQgPSBpZl9uYW1ldG9pbmRleChu YW1lKTsNCi0JaWYgKCFyZXQpIHsNCi0JCURSVl9MT0coV0FSTklORywNCi0JCQkiVlRFUCAlcyBm YWlsZWQgdG8gZ2V0IGluZGV4ICglZCkiLCBuYW1lLCBlcnJubyk7DQotCQlydGVfZmxvd19lcnJv cl9zZXQNCi0JCQkoZXJyb3IsIC1lcnJubywNCi0JCQkgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQ RUNJRklFRCwgTlVMTCwNCi0JCQkgIm5ldGxpbms6IGZhaWxlZCB0byByZXRyaWV2ZSBWVEVQIGlm aW5kZXgiKTsNCi0JCWdvdG8gZXJyb3I7DQotCX0NCi0JdnRlcC0+aWZpbmRleCA9IHJldDsNCi0J bWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOw0KLQlubGggPSBtbmxfbmxtc2dfcHV0X2hlYWRl cihidWYpOw0KLQlubGgtPm5sbXNnX3R5cGUgPSBSVE1fTkVXTElOSzsNCi0JbmxoLT5ubG1zZ19m bGFncyA9IE5MTV9GX1JFUVVFU1Q7DQotCWlmbSA9IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVy KG5saCwgc2l6ZW9mKCppZm0pKTsNCi0JaWZtLT5pZmlfZmFtaWx5ID0gQUZfVU5TUEVDOw0KLQlp Zm0tPmlmaV90eXBlID0gMDsNCi0JaWZtLT5pZmlfaW5kZXggPSB2dGVwLT5pZmluZGV4Ow0KLQlp Zm0tPmlmaV9mbGFncyA9IElGRl9VUDsNCi0JaWZtLT5pZmlfY2hhbmdlID0gSUZGX1VQOw0KLQly ZXQgPSBmbG93X3RjZl9ubF9hY2sodGNmLCBubGgsIE5VTEwsIE5VTEwpOw0KLQlpZiAocmV0KSB7 DQotCQlydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIC1lcnJubywNCi0JCQkJICAgUlRFX0ZMT1df RVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICAgIm5ldGxpbms6IGZhaWxlZCB0 byBzZXQgVlRFUCBsaW5rIHVwIik7DQotCQlEUlZfTE9HKFdBUk5JTkcsICJuZXRsaW5rOiBWVEVQ ICVzIHNldCBsaW5rIHVwIGZhaWx1cmUgKCVkKSIsDQotCQkJbmFtZSwgcnRlX2Vycm5vKTsNCi0J CWdvdG8gY2xlYW47DQotCX0NCi0JcmV0ID0gbWx4NV9mbG93X3RjZl9pbml0KHRjZiwgdnRlcC0+ aWZpbmRleCwgZXJyb3IpOw0KLQlpZiAocmV0KSB7DQotCQlEUlZfTE9HKFdBUk5JTkcsICJWVEVQ ICVzIGluaXQgZmFpbHVyZSAoJWQpIiwgbmFtZSwgcnRlX2Vycm5vKTsNCi0JCWdvdG8gY2xlYW47 DQotCX0NCi0JRFJWX0xPRyhJTkZPLCAiVlRFUCBjcmVhdGUgKCVkLCAlZCkiLCB2dGVwLT5wb3J0 LCB2dGVwLT5pZmluZGV4KTsNCi0JdnRlcC0+cmVmY250ID0gMTsNCi0JcmV0dXJuIHZ0ZXA7DQot Y2xlYW46DQotCWZsb3dfdGNmX3Z0ZXBfZGVsZXRlKHRjZiwgdnRlcCk7DQotCXJldHVybiBOVUxM Ow0KLWVycm9yOg0KLQlydGVfZnJlZSh2dGVwKTsNCi0JcmV0dXJuIE5VTEw7DQotfQ0KLQ0KLS8q Kg0KLSAqIEFjcXVpcmUgdGFyZ2V0IGludGVyZmFjZSBpbmRleCBmb3IgVlhMQU4gdHVubmVsaW5n IGRlY2Fwc3VsYXRpb24uDQotICogSW4gb3JkZXIgdG8gc2hhcmUgdGhlIFVEUCBwb3J0IHdpdGhp biB0aGUgb3RoZXIgaW50ZXJmYWNlcyB0aGUNCi0gKiBWWExBTiBkZXZpY2UgY3JlYXRlZCBhcyBu b3QgYXR0YWNoZWQgdG8gYW55IGludGVyZmFjZSAoaWYgY3JlYXRlZCkuDQotICoNCi0gKiBAcGFy YW1baW5dIHRjZg0KLSAqICAgQ29udGV4dCBvYmplY3QgaW5pdGlhbGl6ZWQgYnkgbWx4NV9mbG93 X3RjZl9jb250ZXh0X2NyZWF0ZSgpLg0KLSAqIEBwYXJhbVtpbl0gZGV2X2Zsb3cNCi0gKiAgIEZs b3cgdGNmIG9iamVjdCB3aXRoIHR1bm5lbCBzdHJ1Y3R1cmUgcG9pbnRlciBzZXQuDQotICogQHBh cmFtW291dF0gZXJyb3INCi0gKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYg bm90IE5VTEwuDQotICogQHJldHVybg0KLSAqICAgSW50ZXJmYWNlIGRlc2NyaXB0b3IgcG9pbnRl ciBvbiBzdWNjZXNzLA0KLSAqICAgTlVMTCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQu DQotICovDQotc3RhdGljIHN0cnVjdCB0Y2ZfdnRlcCoNCi1mbG93X3RjZl9kZWNhcF92dGVwX2Fj cXVpcmUoc3RydWN0IG1seDVfZmxvd190Y2ZfY29udGV4dCAqdGNmLA0KLQkJCSAgICBzdHJ1Y3Qg bWx4NV9mbG93ICpkZXZfZmxvdywNCi0JCQkgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJv cikNCi17DQotCXN0cnVjdCB0Y2ZfdnRlcCAqdnRlcDsNCi0JdWludDE2X3QgcG9ydCA9IGRldl9m bG93LT50Y2YudnhsYW5fZGVjYXAtPnVkcF9wb3J0Ow0KLQ0KLQlMSVNUX0ZPUkVBQ0godnRlcCwg JnZ0ZXBfbGlzdF92eGxhbiwgbmV4dCkgew0KLQkJaWYgKHZ0ZXAtPnBvcnQgPT0gcG9ydCkNCi0J CQlicmVhazsNCi0JfQ0KLQlpZiAodnRlcCkgew0KLQkJLyogRGV2aWNlIGV4aXN0cywganVzdCBp bmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudGVyLiAqLw0KLQkJdnRlcC0+cmVmY250Kys7DQot CQlhc3NlcnQodnRlcC0+aWZpbmRleCk7DQotCQlyZXR1cm4gdnRlcDsNCi0JfQ0KLQkvKiBObyBk ZWNhcHN1bGF0aW9uIGRldmljZSBleGlzdHMsIHRyeSB0byBjcmVhdGUgdGhlIG5ldyBvbmUuICov DQotCXZ0ZXAgPSBmbG93X3RjZl92dGVwX2NyZWF0ZSh0Y2YsIHBvcnQsIGVycm9yKTsNCi0JaWYg KHZ0ZXApDQotCQlMSVNUX0lOU0VSVF9IRUFEKCZ2dGVwX2xpc3RfdnhsYW4sIHZ0ZXAsIG5leHQp Ow0KLQlyZXR1cm4gdnRlcDsNCi19DQotDQotLyoqDQotICogQWNxdWlyZSB0YXJnZXQgaW50ZXJm YWNlIGluZGV4IGZvciBWWExBTiB0dW5uZWxpbmcgZW5jYXBzdWxhdGlvbi4NCi0gKg0KLSAqIEBw YXJhbVtpbl0gdGNmDQotICogICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBieSBtbHg1X2Zs b3dfdGNmX2NvbnRleHRfY3JlYXRlKCkuDQotICogQHBhcmFtW2luXSBpZm91dGVyDQotICogICBO ZXR3b3JrIGludGVyZmFjZSBpbmRleCB0byBhdHRhY2ggVlhMQU4gZW5jYXAgZGV2aWNlIHRvLg0K LSAqIEBwYXJhbVtpbl0gZGV2X2Zsb3cNCi0gKiAgIEZsb3cgdGNmIG9iamVjdCB3aXRoIHR1bm5l bCBzdHJ1Y3R1cmUgcG9pbnRlciBzZXQuDQotICogQHBhcmFtW291dF0gZXJyb3INCi0gKiAgIFBl cmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90IE5VTEwuDQotICogQHJldHVybg0K LSAqICAgSW50ZXJmYWNlIGRlc2NyaXB0b3IgcG9pbnRlciBvbiBzdWNjZXNzLA0KLSAqICAgTlVM TCBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIHN0cnVjdCB0 Y2ZfdnRlcCoNCi1mbG93X3RjZl9lbmNhcF92dGVwX2FjcXVpcmUoc3RydWN0IG1seDVfZmxvd190 Y2ZfY29udGV4dCAqdGNmLA0KLQkJCSAgICB1bnNpZ25lZCBpbnQgaWZvdXRlciwNCi0JCQkgICAg c3RydWN0IG1seDVfZmxvdyAqZGV2X2Zsb3csDQotCQkJICAgIHN0cnVjdCBydGVfZmxvd19lcnJv ciAqZXJyb3IpDQotew0KLQlzdGF0aWMgdWludDE2X3QgcG9ydDsNCi0Jc3RydWN0IHRjZl92dGVw ICp2dGVwOw0KLQlzdHJ1Y3QgdGNmX2lydWxlICppZmFjZTsNCi0JaW50IHJldDsNCi0NCi0JYXNz ZXJ0KGlmb3V0ZXIpOw0KLQkvKiBMb29rIHdoZXRoZXIgdGhlIFZURVAgZm9yIHNwZWNpZmllZCBw b3J0IGlzIGNyZWF0ZWQuICovDQotCXBvcnQgPSBydGVfYmVfdG9fY3B1XzE2KGRldl9mbG93LT50 Y2YudnhsYW5fZW5jYXAtPnVkcC5kc3QpOw0KLQlMSVNUX0ZPUkVBQ0godnRlcCwgJnZ0ZXBfbGlz dF92eGxhbiwgbmV4dCkgew0KLQkJaWYgKHZ0ZXAtPnBvcnQgPT0gcG9ydCkNCi0JCQlicmVhazsN Ci0JfQ0KLQlpZiAodnRlcCkgew0KLQkJLyogVlRFUCBhbHJlYWR5IGV4aXN0cywganVzdCBpbmNy ZW1lbnQgdGhlIHJlZmVyZW5jZS4gKi8NCi0JCXZ0ZXAtPnJlZmNudCsrOw0KLQl9IGVsc2Ugew0K LQkJLyogTm90IGZvdW5kLCB3ZSBzaG91bGQgY3JlYXRlIHRoZSBuZXcgVlRFUC4gKi8NCi0JCXZ0 ZXAgPSBmbG93X3RjZl92dGVwX2NyZWF0ZSh0Y2YsIHBvcnQsIGVycm9yKTsNCi0JCWlmICghdnRl cCkNCi0JCQlyZXR1cm4gTlVMTDsNCi0JCUxJU1RfSU5TRVJUX0hFQUQoJnZ0ZXBfbGlzdF92eGxh biwgdnRlcCwgbmV4dCk7DQotCX0NCi0JYXNzZXJ0KHZ0ZXAtPmlmaW5kZXgpOw0KLQlpZmFjZSA9 IGZsb3dfdGNmX2VuY2FwX2lydWxlX2FjcXVpcmUodGNmLCBpZm91dGVyLCBlcnJvcik7DQotCWlm ICghaWZhY2UpIHsNCi0JCWlmICgtLXZ0ZXAtPnJlZmNudCA9PSAwKQ0KLQkJCWZsb3dfdGNmX3Z0 ZXBfZGVsZXRlKHRjZiwgdnRlcCk7DQotCQlyZXR1cm4gTlVMTDsNCi0JfQ0KLQlkZXZfZmxvdy0+ dGNmLnZ4bGFuX2VuY2FwLT5pZmFjZSA9IGlmYWNlOw0KLQkvKiBDcmVhdGUgbG9jYWwgaXBhZGRy IHdpdGggcGVlciB0byBzcGVjaWZ5IHRoZSBvdXRlciBJUHMuICovDQotCXJldCA9IGZsb3dfdGNm X2VuY2FwX2xvY2FsKHRjZiwgaWZhY2UsIGRldl9mbG93LCB0cnVlLCBlcnJvcik7DQotCWlmICgh cmV0KSB7DQotCQkvKiBDcmVhdGUgbmVpZ2ggcnVsZSB0byBzcGVjaWZ5IG91dGVyIGRlc3RpbmF0 aW9uIE1BQy4gKi8NCi0JCXJldCA9IGZsb3dfdGNmX2VuY2FwX25laWdoKHRjZiwgaWZhY2UsIGRl dl9mbG93LCB0cnVlLCBlcnJvcik7DQotCQlpZiAocmV0KQ0KLQkJCWZsb3dfdGNmX2VuY2FwX2xv Y2FsKHRjZiwgaWZhY2UsDQotCQkJCQkgICAgIGRldl9mbG93LCBmYWxzZSwgZXJyb3IpOw0KLQl9 DQotCWlmIChyZXQpIHsNCi0JCWRldl9mbG93LT50Y2YudnhsYW5fZW5jYXAtPmlmYWNlID0gTlVM TDsNCi0JCWZsb3dfdGNmX2VuY2FwX2lydWxlX3JlbGVhc2UoaWZhY2UpOw0KLQkJaWYgKC0tdnRl cC0+cmVmY250ID09IDApDQotCQkJZmxvd190Y2ZfdnRlcF9kZWxldGUodGNmLCB2dGVwKTsNCi0J CXJldHVybiBOVUxMOw0KLQl9DQotCXJldHVybiB2dGVwOw0KLX0NCi0NCi0vKioNCi0gKiBBY3F1 aXJlcyB0YXJnZXQgaW50ZXJmYWNlIGluZGV4IGZvciB0dW5uZWxpbmcgb2YgYW55IHR5cGUuDQot ICogQ3JlYXRlcyB0aGUgbmV3IFZURVAgaWYgbmVlZGVkLg0KLSAqDQotICogQHBhcmFtW2luXSB0 Y2YNCi0gKiAgIENvbnRleHQgb2JqZWN0IGluaXRpYWxpemVkIGJ5IG1seDVfZmxvd190Y2ZfY29u dGV4dF9jcmVhdGUoKS4NCi0gKiBAcGFyYW1baW5dIGlmb3V0ZXINCi0gKiAgIE5ldHdvcmsgaW50 ZXJmYWNlIGluZGV4IHRvIGNyZWF0ZSBWWExBTiBlbmNhcCBydWxlcyBvbi4NCi0gKiBAcGFyYW1b aW5dIGRldl9mbG93DQotICogICBGbG93IHRjZiBvYmplY3Qgd2l0aCB0dW5uZWwgc3RydWN0dXJl IHBvaW50ZXIgc2V0Lg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQZXJmb3JtIHZlcmJv c2UgZXJyb3IgcmVwb3J0aW5nIGlmIG5vdCBOVUxMLg0KLSAqIEByZXR1cm4NCi0gKiAgIEludGVy ZmFjZSBkZXNjcmlwdG9yIHBvaW50ZXIgb24gc3VjY2VzcywNCi0gKiAgIE5VTEwgb3RoZXJ3aXNl IGFuZCBydGVfZXJybm8gaXMgc2V0Lg0KLSAqLw0KLXN0YXRpYyBzdHJ1Y3QgdGNmX3Z0ZXAqDQot Zmxvd190Y2ZfdnRlcF9hY3F1aXJlKHN0cnVjdCBtbHg1X2Zsb3dfdGNmX2NvbnRleHQgKnRjZiwN Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpZm91dGVyLA0KLQkJICAgICAgc3RydWN0IG1seDVfZmxv dyAqZGV2X2Zsb3csDQotCQkgICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsN Ci0Jc3RydWN0IHRjZl92dGVwICp2dGVwID0gTlVMTDsNCi0NCi0JYXNzZXJ0KGRldl9mbG93LT50 Y2YudHVubmVsKTsNCi0JcHRocmVhZF9tdXRleF9sb2NrKCZ2dGVwX2xpc3RfbXV0ZXgpOw0KLQlz d2l0Y2ggKGRldl9mbG93LT50Y2YudHVubmVsLT50eXBlKSB7DQotCWNhc2UgRkxPV19UQ0ZfVFVO QUNUX1ZYTEFOX0VOQ0FQOg0KLQkJdnRlcCA9IGZsb3dfdGNmX2VuY2FwX3Z0ZXBfYWNxdWlyZSh0 Y2YsIGlmb3V0ZXIsDQotCQkJCQkJICBkZXZfZmxvdywgZXJyb3IpOw0KLQkJYnJlYWs7DQotCWNh c2UgRkxPV19UQ0ZfVFVOQUNUX1ZYTEFOX0RFQ0FQOg0KLQkJdnRlcCA9IGZsb3dfdGNmX2RlY2Fw X3Z0ZXBfYWNxdWlyZSh0Y2YsIGRldl9mbG93LCBlcnJvcik7DQotCQlicmVhazsNCi0JZGVmYXVs dDoNCi0JCXJ0ZV9mbG93X2Vycm9yX3NldChlcnJvciwgRU5PVFNVUCwNCi0JCQkJICAgUlRFX0ZM T1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICAgInVuc3VwcG9ydGVkIHR1 bm5lbCB0eXBlIik7DQotCQlicmVhazsNCi0JfQ0KLQlwdGhyZWFkX211dGV4X3VubG9jaygmdnRl cF9saXN0X211dGV4KTsNCi0JcmV0dXJuIHZ0ZXA7DQotfQ0KLQ0KLS8qKg0KLSAqIFJlbGVhc2Ug dHVubmVsaW5nIGludGVyZmFjZSBieSBpZmluZGV4LiBEZWNyZW1lbnRzIHJlZmVyZW5jZQ0KLSAq IGNvdW50ZXIgYW5kIGFjdHVhbGx5IHJlbW92ZXMgdGhlIGRldmljZSBpZiBjb3VudGVyIGlzIHpl cm8uDQotICoNCi0gKiBAcGFyYW1baW5dIHRjZg0KLSAqICAgQ29udGV4dCBvYmplY3QgaW5pdGlh bGl6ZWQgYnkgbWx4NV9mbG93X3RjZl9jb250ZXh0X2NyZWF0ZSgpLg0KLSAqIEBwYXJhbVtpbl0g dnRlcA0KLSAqICAgVlRFUCBkZXZpY2UgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuDQotICogQHBhcmFt W2luXSBkZXZfZmxvdw0KLSAqICAgRmxvdyB0Y2Ygb2JqZWN0IHdpdGggdHVubmVsIHN0cnVjdHVy ZSBwb2ludGVyIHNldC4NCi0gKi8NCi1zdGF0aWMgdm9pZA0KLWZsb3dfdGNmX3Z0ZXBfcmVsZWFz ZShzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICp0Y2YsDQotCQkgICAgICBzdHJ1Y3QgdGNm X3Z0ZXAgKnZ0ZXAsDQotCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93ICpkZXZfZmxvdykNCi17DQot CWFzc2VydChkZXZfZmxvdy0+dGNmLnR1bm5lbCk7DQotCXB0aHJlYWRfbXV0ZXhfbG9jaygmdnRl cF9saXN0X211dGV4KTsNCi0Jc3dpdGNoIChkZXZfZmxvdy0+dGNmLnR1bm5lbC0+dHlwZSkgew0K LQljYXNlIEZMT1dfVENGX1RVTkFDVF9WWExBTl9ERUNBUDoNCi0JCWJyZWFrOw0KLQljYXNlIEZM T1dfVENGX1RVTkFDVF9WWExBTl9FTkNBUDogew0KLQkJc3RydWN0IHRjZl9pcnVsZSAqaWZhY2U7 DQotDQotCQkvKiBSZW1vdmUgdGhlIGVuY2FwIGFuY2lsbGFyeSBydWxlcyBmaXJzdC4gKi8NCi0J CWlmYWNlID0gZGV2X2Zsb3ctPnRjZi52eGxhbl9lbmNhcC0+aWZhY2U7DQotCQlhc3NlcnQoaWZh Y2UpOw0KLQkJZmxvd190Y2ZfZW5jYXBfbmVpZ2godGNmLCBpZmFjZSwgZGV2X2Zsb3csIGZhbHNl LCBOVUxMKTsNCi0JCWZsb3dfdGNmX2VuY2FwX2xvY2FsKHRjZiwgaWZhY2UsIGRldl9mbG93LCBm YWxzZSwgTlVMTCk7DQotCQlmbG93X3RjZl9lbmNhcF9pcnVsZV9yZWxlYXNlKGlmYWNlKTsNCi0J CWRldl9mbG93LT50Y2YudnhsYW5fZW5jYXAtPmlmYWNlID0gTlVMTDsNCi0JCWJyZWFrOw0KLQl9 DQotCWRlZmF1bHQ6DQotCQlhc3NlcnQoZmFsc2UpOw0KLQkJRFJWX0xPRyhXQVJOSU5HLCAiVW5z dXBwb3J0ZWQgdHVubmVsIHR5cGUiKTsNCi0JCWJyZWFrOw0KLQl9DQotCWFzc2VydCh2dGVwLT5y ZWZjbnQpOw0KLQlpZiAoLS12dGVwLT5yZWZjbnQgPT0gMCkgew0KLQkJTElTVF9SRU1PVkUodnRl cCwgbmV4dCk7DQotCQlmbG93X3RjZl92dGVwX2RlbGV0ZSh0Y2YsIHZ0ZXApOw0KLQl9DQotCXB0 aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2dGVwX2xpc3RfbXV0ZXgpOw0KLX0NCi0NCi1zdHJ1Y3QgdGNm X25sY2JfcXVlcnkgew0KLQl1aW50MzJfdCBoYW5kbGU7DQotCXVpbnQzMl90IHRjX2ZsYWdzOw0K LQl1aW50MzJfdCBmbGFnc192YWxpZDoxOw0KLX07DQotDQotLyoqDQotICogQ29sbGVjdCBxdWVy aWVkIHJ1bGUgYXR0cmlidXRlcy4gVGhpcyBpcyBjYWxsYmFjayByb3V0aW5lIGNhbGxlZCBieQ0K LSAqIGxpYm1ubCBtbmxfY2JfcnVuKCkgaW4gbG9vcCBmb3IgZXZlcnkgbWVzc2FnZSBpbiByZWNl aXZlZCBwYWNrZXQuDQotICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBjb2xsZWN0cyB0aGUgZmxv d2VyIGZsYWdzIG9ubHkuDQotICoNCi0gKiBAcGFyYW1baW5dIG5saA0KLSAqICAgUG9pbnRlciB0 byByZXBseSBoZWFkZXIuDQotICogQHBhcmFtW2luLCBvdXRdIGFyZw0KLSAqICAgQ29udGV4dCBw b2ludGVyIGZvciB0aGlzIGNhbGxiYWNrLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgQSBwb3Np dGl2ZSwgbm9uemVybyB2YWx1ZSBvbiBzdWNjZXNzIChyZXF1aXJlZCBieSBsaWJtbmwNCi0gKiAg IHRvIGNvbnRpbnVlIG1lc3NhZ2VzIHByb2Nlc3NpbmcpLg0KLSAqLw0KLXN0YXRpYyBpbnQNCi1m bG93X3RjZl9jb2xsZWN0X3F1ZXJ5X2NiKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCB2b2lk ICphcmcpDQotew0KLQlzdHJ1Y3QgdGNmX25sY2JfcXVlcnkgKnF1ZXJ5ID0gYXJnOw0KLQlzdHJ1 Y3QgdGNtc2cgKnRjbSA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOw0KLQlzdHJ1Y3Qgbmxh dHRyICpuYSwgKm5hX29wdDsNCi0JYm9vbCBmbG93ZXIgPSBmYWxzZTsNCi0NCi0JaWYgKG5saC0+ bmxtc2dfdHlwZSAhPSBSVE1fTkVXVEZJTFRFUiB8fA0KLQkgICAgdGNtLT50Y21faGFuZGxlICE9 IHF1ZXJ5LT5oYW5kbGUpDQotCQlyZXR1cm4gMTsNCi0JbW5sX2F0dHJfZm9yX2VhY2gobmEsIG5s aCwgc2l6ZW9mKCp0Y20pKSB7DQotCQlzd2l0Y2ggKG1ubF9hdHRyX2dldF90eXBlKG5hKSkgew0K LQkJY2FzZSBUQ0FfS0lORDoNCi0JCQlpZiAoc3RyY21wKG1ubF9hdHRyX2dldF9wYXlsb2FkKG5h KSwgImZsb3dlciIpKSB7DQotCQkJCS8qIE5vdCBmbG93ZXIgZmlsdGVyLCBkcm9wIGVudGlyZSBt ZXNzYWdlLiAqLw0KLQkJCQlyZXR1cm4gMTsNCi0JCQl9DQotCQkJZmxvd2VyID0gdHJ1ZTsNCi0J CQlicmVhazsNCi0JCWNhc2UgVENBX09QVElPTlM6DQotCQkJaWYgKCFmbG93ZXIpIHsNCi0JCQkJ LyogTm90IGZsb3dlciBvcHRpb25zLCBkcm9wIGVudGlyZSBtZXNzYWdlLiAqLw0KLQkJCQlyZXR1 cm4gMTsNCi0JCQl9DQotCQkJLyogQ2hlY2sgbmVzdGVkIGZsb3dlciBvcHRpb25zLiAqLw0KLQkJ CW1ubF9hdHRyX2Zvcl9lYWNoX25lc3RlZChuYV9vcHQsIG5hKSB7DQotCQkJCXN3aXRjaCAobW5s X2F0dHJfZ2V0X3R5cGUobmFfb3B0KSkgew0KLQkJCQljYXNlIFRDQV9GTE9XRVJfRkxBR1M6DQot CQkJCQlxdWVyeS0+ZmxhZ3NfdmFsaWQgPSAxOw0KLQkJCQkJcXVlcnktPnRjX2ZsYWdzID0NCi0J CQkJCQltbmxfYXR0cl9nZXRfdTMyKG5hX29wdCk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJ CX0NCi0JCQlicmVhazsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gMTsNCi19DQotDQotLyoqDQotICog UXVlcnkgYSBUQyBmbG93ZXIgcnVsZSBmbGFncyB2aWEgbmV0bGluay4NCi0gKg0KLSAqIEBwYXJh bVtpbl0gdGNmDQotICogICBDb250ZXh0IG9iamVjdCBpbml0aWFsaXplZCBieSBtbHg1X2Zsb3df dGNmX2NvbnRleHRfY3JlYXRlKCkuDQotICogQHBhcmFtW2luXSBkZXZfZmxvdw0KLSAqICAgUG9p bnRlciB0byB0aGUgZmxvdy4NCi0gKiBAcGFyYW1bb3V0XSBwZmxhZ3MNCi0gKiAgIHBvaW50ZXIg dG8gdGhlIGRhdGEgcmV0cmlldmVkIGJ5IHRoZSBxdWVyeS4NCi0gKg0KLSAqIEByZXR1cm4NCi0g KiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBvdGhlcndpc2UuDQotICov DQotc3RhdGljIGludA0KLWZsb3dfdGNmX3F1ZXJ5X2ZsYWdzKHN0cnVjdCBtbHg1X2Zsb3dfdGNm X2NvbnRleHQgKnRjZiwNCi0JCSAgICAgc3RydWN0IG1seDVfZmxvdyAqZGV2X2Zsb3csDQotCQkg ICAgIHVpbnQzMl90ICpwZmxhZ3MpDQotew0KLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsNCi0Jc3Ry dWN0IHRjbXNnICp0Y207DQotCXN0cnVjdCB0Y2ZfbmxjYl9xdWVyeSBxdWVyeSA9IHsNCi0JCS5o YW5kbGUgPSBkZXZfZmxvdy0+dGNmLnRjbS0+dGNtX2hhbmRsZSwNCi0JfTsNCi0NCi0JbmxoID0g bW5sX25sbXNnX3B1dF9oZWFkZXIodGNmLT5idWYpOw0KLQlubGgtPm5sbXNnX3R5cGUgPSBSVE1f R0VUVEZJTFRFUjsNCi0JbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7DQotCXRjbSA9 IG1ubF9ubG1zZ19wdXRfZXh0cmFfaGVhZGVyKG5saCwgc2l6ZW9mKCp0Y20pKTsNCi0JbWVtY3B5 KHRjbSwgZGV2X2Zsb3ctPnRjZi50Y20sIHNpemVvZigqdGNtKSk7DQotCS8qDQotCSAqIElnbm9y ZSBOZXRsaW5rIGVycm9yIGZvciBmaWx0ZXIgcXVlcnkgb3BlcmF0aW9ucy4NCi0JICogVGhlIHJl cGx5IGxlbmd0aCBpcyBzZW50IGJ5IGtlcm5lbCBhcyBlcnJuby4NCi0JICogSnVzdCBjaGVjayB3 ZSBnb3QgdGhlIGZsYWdzIG9wdGlvbi4NCi0JICovDQotCWZsb3dfdGNmX25sX2Fjayh0Y2YsIG5s aCwgZmxvd190Y2ZfY29sbGVjdF9xdWVyeV9jYiwgJnF1ZXJ5KTsNCi0JaWYgKCFxdWVyeS5mbGFn c192YWxpZCkgew0KLQkJKnBmbGFncyA9IDA7DQotCQlyZXR1cm4gLUVOT0VOVDsNCi0JfQ0KLQkq cGZsYWdzID0gcXVlcnkudGNfZmxhZ3M7DQotCXJldHVybiAwOw0KLX0NCi0NCi0vKioNCi0gKiBR dWVyeSBhbmQgY2hlY2sgdGhlIGluX2h3IHNldCBmb3Igc3BlY2lmaWVkIHJ1bGUuDQotICoNCi0g KiBAcGFyYW1baW5dIHRjZg0KLSAqICAgQ29udGV4dCBvYmplY3QgaW5pdGlhbGl6ZWQgYnkgbWx4 NV9mbG93X3RjZl9jb250ZXh0X2NyZWF0ZSgpLg0KLSAqIEBwYXJhbVtpbl0gZGV2X2Zsb3cNCi0g KiAgIFBvaW50ZXIgdG8gdGhlIGZsb3cgdG8gY2hlY2suDQotICoNCi0gKiBAcmV0dXJuDQotICog ICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgb3RoZXJ3aXNlLg0KLSAqLw0K LXN0YXRpYyBpbnQNCi1mbG93X3RjZl9jaGVja19pbmh3KHN0cnVjdCBtbHg1X2Zsb3dfdGNmX2Nv bnRleHQgKnRjZiwNCi0JCSAgICBzdHJ1Y3QgbWx4NV9mbG93ICpkZXZfZmxvdykNCi17DQotCXVp bnQzMl90IGZsYWdzOw0KLQlpbnQgcmV0Ow0KLQ0KLQlyZXQgPSBmbG93X3RjZl9xdWVyeV9mbGFn cyh0Y2YsIGRldl9mbG93LCAmZmxhZ3MpOw0KLQlpZiAocmV0KQ0KLQkJcmV0dXJuIHJldDsNCi0J cmV0dXJuICAoZmxhZ3MgJiBUQ0FfQ0xTX0ZMQUdTX0lOX0hXKSA/IDAgOiAtRU5PRU5UOw0KLX0N Ci0NCi0vKioNCi0gKiBSZW1vdmUgZmxvdyBmcm9tIEUtU3dpdGNoIGJ5IHNlbmRpbmcgTmV0bGlu ayBtZXNzYWdlLg0KLSAqDQotICogQHBhcmFtW2luXSBkZXYNCi0gKiAgIFBvaW50ZXIgdG8gRXRo ZXJuZXQgZGV2aWNlLg0KLSAqIEBwYXJhbVtpbiwgb3V0XSBmbG93DQotICogICBQb2ludGVyIHRv IHRoZSBzdWIgZmxvdy4NCi0gKi8NCi1zdGF0aWMgdm9pZA0KLWZsb3dfdGNmX3JlbW92ZShzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmRldiwgc3RydWN0IHJ0ZV9mbG93ICpmbG93KQ0KLXsNCi0Jc3RydWN0 IG1seDVfcHJpdiAqcHJpdiA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQotCXN0cnVjdCBtbHg1 X2Zsb3dfdGNmX2NvbnRleHQgKmN0eCA9IHByaXYtPnRjZl9jb250ZXh0Ow0KLQlzdHJ1Y3QgbWx4 NV9mbG93ICpkZXZfZmxvdzsNCi0Jc3RydWN0IG5sbXNnaGRyICpubGg7DQotCXN0cnVjdCB0Y21z ZyAqdGNtOw0KLQ0KLQlpZiAoIWZsb3cpDQotCQlyZXR1cm47DQotCWRldl9mbG93ID0gTElTVF9G SVJTVCgmZmxvdy0+ZGV2X2Zsb3dzKTsNCi0JaWYgKCFkZXZfZmxvdykNCi0JCXJldHVybjsNCi0J LyogRS1Td2l0Y2ggZmxvdyBjYW4ndCBiZSBleHBhbmRlZC4gKi8NCi0JYXNzZXJ0KCFMSVNUX05F WFQoZGV2X2Zsb3csIG5leHQpKTsNCi0JaWYgKGRldl9mbG93LT50Y2YuYXBwbGllZCkgew0KLQkJ bmxoID0gZGV2X2Zsb3ctPnRjZi5ubGg7DQotCQlubGgtPm5sbXNnX3R5cGUgPSBSVE1fREVMVEZJ TFRFUjsNCi0JCW5saC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOw0KLQkJZmxvd190Y2Zf bmxfYWNrKGN0eCwgbmxoLCBOVUxMLCBOVUxMKTsNCi0JCWlmIChkZXZfZmxvdy0+dGNmLnR1bm5l bCkgew0KLQkJCWFzc2VydChkZXZfZmxvdy0+dGNmLnR1bm5lbC0+dnRlcCk7DQotCQkJZmxvd190 Y2ZfdnRlcF9yZWxlYXNlKGN0eCwNCi0JCQkJZGV2X2Zsb3ctPnRjZi50dW5uZWwtPnZ0ZXAsDQot CQkJCWRldl9mbG93KTsNCi0JCQlkZXZfZmxvdy0+dGNmLnR1bm5lbC0+dnRlcCA9IE5VTEw7DQot CQl9DQotCQkvKiBDbGVhbnVwIHRoZSBydWxlIGhhbmRsZSB2YWx1ZS4gKi8NCi0JCXRjbSA9IG1u bF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOw0KLQkJdGNtLT50Y21faGFuZGxlID0gMDsNCi0JCWRl dl9mbG93LT50Y2YuYXBwbGllZCA9IDA7DQotCX0NCi19DQotDQotLyoqDQotICogRmV0Y2ggdGhl IGFwcGxpZWQgcnVsZSBoYW5kbGUuIFRoaXMgaXMgY2FsbGJhY2sgcm91dGluZSBjYWxsZWQgYnkN Ci0gKiBsaWJtbmwgbW5sX2NiX3J1bigpIGluIGxvb3AgZm9yIGV2ZXJ5IG1lc3NhZ2UgaW4gcmVj ZWl2ZWQgcGFja2V0Lg0KLSAqIFdoZW4gdGhlIE5MTV9GX0VDSE8gZmxhZyBpcyBzcGVjaWZpZWQg dGhlIGtlcm5lbCBzZW5kcyB0aGUgY3JlYXRlZA0KLSAqIHJ1bGUgZGVzY3JpcHRvciBiYWNrIHRv IHRoZSBhcHBsaWNhdGlvbiBhbmQgd2UgY2FuIHJldHJpZXZlIHRoZQ0KLSAqIGFjdHVhbCBydWxl IGhhbmRsZSBmcm9tIHVwZGF0ZWQgZGVzY3JpcHRvci4NCi0gKg0KLSAqIEBwYXJhbVtpbl0gbmxo DQotICogICBQb2ludGVyIHRvIHJlcGx5IGhlYWRlci4NCi0gKiBAcGFyYW1baW4sIG91dF0gYXJn DQotICogICBDb250ZXh0IHBvaW50ZXIgZm9yIHRoaXMgY2FsbGJhY2suDQotICoNCi0gKiBAcmV0 dXJuDQotICogICBBIHBvc2l0aXZlLCBub256ZXJvIHZhbHVlIG9uIHN1Y2Nlc3MgKHJlcXVpcmVk IGJ5IGxpYm1ubA0KLSAqICAgdG8gY29udGludWUgbWVzc2FnZXMgcHJvY2Vzc2luZykuDQotICov DQotc3RhdGljIGludA0KLWZsb3dfdGNmX2NvbGxlY3RfYXBwbHlfY2IoY29uc3Qgc3RydWN0IG5s bXNnaGRyICpubGgsIHZvaWQgKmFyZykNCi17DQotCXN0cnVjdCBubG1zZ2hkciAqbmxocnEgPSBh cmc7DQotCXN0cnVjdCB0Y21zZyAqdGNtcnEgPSBtbmxfbmxtc2dfZ2V0X3BheWxvYWQobmxocnEp Ow0KLQlzdHJ1Y3QgdGNtc2cgKnRjbSA9IG1ubF9ubG1zZ19nZXRfcGF5bG9hZChubGgpOw0KLQlz dHJ1Y3QgbmxhdHRyICpuYTsNCi0NCi0JaWYgKG5saC0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVEZJ TFRFUiB8fA0KLQkgICAgbmxoLT5ubG1zZ19zZXEgIT0gbmxocnEtPm5sbXNnX3NlcSkNCi0JCXJl dHVybiAxOw0KLQltbmxfYXR0cl9mb3JfZWFjaChuYSwgbmxoLCBzaXplb2YoKnRjbSkpIHsNCi0J CXN3aXRjaCAobW5sX2F0dHJfZ2V0X3R5cGUobmEpKSB7DQotCQljYXNlIFRDQV9LSU5EOg0KLQkJ CWlmIChzdHJjbXAobW5sX2F0dHJfZ2V0X3BheWxvYWQobmEpLCAiZmxvd2VyIikpIHsNCi0JCQkJ LyogTm90IGZsb3dlciBmaWx0ZXIsIGRyb3AgZW50aXJlIG1lc3NhZ2UuICovDQotCQkJCXJldHVy biAxOw0KLQkJCX0NCi0JCQl0Y21ycS0+dGNtX2hhbmRsZSA9IHRjbS0+dGNtX2hhbmRsZTsNCi0J CQlyZXR1cm4gMTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gMTsNCi19DQotLyoqDQotICogQXBwbHkg ZmxvdyB0byBFLVN3aXRjaCBieSBzZW5kaW5nIE5ldGxpbmsgbWVzc2FnZS4NCi0gKg0KLSAqIEBw YXJhbVtpbl0gZGV2DQotICogICBQb2ludGVyIHRvIEV0aGVybmV0IGRldmljZS4NCi0gKiBAcGFy YW1baW4sIG91dF0gZmxvdw0KLSAqICAgUG9pbnRlciB0byB0aGUgc3ViIGZsb3cuDQotICogQHBh cmFtW291dF0gZXJyb3INCi0gKiAgIFBvaW50ZXIgdG8gdGhlIGVycm9yIHN0cnVjdHVyZS4NCi0g Kg0KLSAqIEByZXR1cm4NCi0gKiAgIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJubyB2YWx1 ZSBvdGhlcndpc2UgYW5kIHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIGludA0KLWZs b3dfdGNmX2FwcGx5KHN0cnVjdCBydGVfZXRoX2RldiAqZGV2LCBzdHJ1Y3QgcnRlX2Zsb3cgKmZs b3csDQotCSAgICAgICBzdHJ1Y3QgcnRlX2Zsb3dfZXJyb3IgKmVycm9yKQ0KLXsNCi0Jc3RydWN0 IG1seDVfcHJpdiAqcHJpdiA9IGRldi0+ZGF0YS0+ZGV2X3ByaXZhdGU7DQotCXN0cnVjdCBtbHg1 X2Zsb3dfdGNmX2NvbnRleHQgKmN0eCA9IHByaXYtPnRjZl9jb250ZXh0Ow0KLQlzdHJ1Y3QgbWx4 NV9mbG93ICpkZXZfZmxvdzsNCi0Jc3RydWN0IG5sbXNnaGRyICpubGg7DQotCXN0cnVjdCB0Y21z ZyAqdGNtOw0KLQl1aW50NjRfdCBzdGFydCA9IDA7DQotCXVpbnQ2NF90IHR3YWl0ID0gMDsNCi0J aW50IHJldDsNCi0NCi0JZGV2X2Zsb3cgPSBMSVNUX0ZJUlNUKCZmbG93LT5kZXZfZmxvd3MpOw0K LQkvKiBFLVN3aXRjaCBmbG93IGNhbid0IGJlIGV4cGFuZGVkLiAqLw0KLQlhc3NlcnQoIUxJU1Rf TkVYVChkZXZfZmxvdywgbmV4dCkpOw0KLQlpZiAoZGV2X2Zsb3ctPnRjZi5hcHBsaWVkKQ0KLQkJ cmV0dXJuIDA7DQotCW5saCA9IGRldl9mbG93LT50Y2YubmxoOw0KLQlubGgtPm5sbXNnX3R5cGUg PSBSVE1fTkVXVEZJTFRFUjsNCi0JbmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBO TE1fRl9DUkVBVEUgfA0KLQkJCSAgIE5MTV9GX0VYQ0wgfCBOTE1fRl9FQ0hPOw0KLQl0Y20gPSBt bmxfbmxtc2dfZ2V0X3BheWxvYWQobmxoKTsNCi0JLyogQWxsb3cga2VybmVsIHRvIGFzc2lnbiBo YW5kbGUgb24gaXRzIG93bi4gKi8NCi0JdGNtLT50Y21faGFuZGxlID0gMDsNCi0JaWYgKGRldl9m bG93LT50Y2YudHVubmVsKSB7DQotCQkvKg0KLQkJICogUmVwbGFjZSB0aGUgaW50ZXJmYWNlIGlu ZGV4LCB0YXJnZXQgZm9yDQotCQkgKiBlbmNhcHN1bGF0aW9uLCBzb3VyY2UgZm9yIGRlY2Fwc3Vs YXRpb24uDQotCQkgKi8NCi0JCWFzc2VydCghZGV2X2Zsb3ctPnRjZi50dW5uZWwtPnZ0ZXApOw0K LQkJYXNzZXJ0KGRldl9mbG93LT50Y2YudHVubmVsLT5pZmluZGV4X3B0cik7DQotCQkvKiBBY3F1 aXJlIGFjdHVhbCBWVEVQIGRldmljZSB3aGVuIHJ1bGUgaXMgYmVpbmcgYXBwbGllZC4gKi8NCi0J CWRldl9mbG93LT50Y2YudHVubmVsLT52dGVwID0NCi0JCQlmbG93X3RjZl92dGVwX2FjcXVpcmUo Y3R4LA0KLQkJCQkJZGV2X2Zsb3ctPnRjZi50dW5uZWwtPmlmaW5kZXhfb3JnLA0KLQkJCQkJZGV2 X2Zsb3csIGVycm9yKTsNCi0JCWlmICghZGV2X2Zsb3ctPnRjZi50dW5uZWwtPnZ0ZXApDQotCQkJ cmV0dXJuIC1ydGVfZXJybm87DQotCQlEUlZfTE9HKElORk8sICJSZXBsYWNlIGlmaW5kZXg6ICVk LT4lZCIsDQotCQkJCWRldl9mbG93LT50Y2YudHVubmVsLT52dGVwLT5pZmluZGV4LA0KLQkJCQlk ZXZfZmxvdy0+dGNmLnR1bm5lbC0+aWZpbmRleF9vcmcpOw0KLQkJKmRldl9mbG93LT50Y2YudHVu bmVsLT5pZmluZGV4X3B0ciA9DQotCQkJZGV2X2Zsb3ctPnRjZi50dW5uZWwtPnZ0ZXAtPmlmaW5k ZXg7DQotCQlpZiAoZGV2X2Zsb3ctPnRjZi50dW5uZWwtPnZ0ZXAtPndhaXRyZWcpIHsNCi0JCQkv KiBDbGVhciB3YWl0IGZsYWcgZm9yIFZYTEFOIHBvcnQgcmVnaXN0cmF0aW9uLiAqLw0KLQkJCWRl dl9mbG93LT50Y2YudHVubmVsLT52dGVwLT53YWl0cmVnID0gMDsNCi0JCQl0d2FpdCA9IHJ0ZV9n ZXRfdGltZXJfaHooKTsNCi0JCQlhc3NlcnQodHdhaXQgPiBNU19QRVJfUyk7DQotCQkJdHdhaXQg PSB0d2FpdCAqIE1MWDVfVlhMQU5fV0FJVF9QT1JUX1JFR19NUzsNCi0JCQl0d2FpdCA9IHR3YWl0 IC8gTVNfUEVSX1M7DQotCQkJc3RhcnQgPSBydGVfZ2V0X3RpbWVyX2N5Y2xlcygpOw0KLQkJfQ0K LQl9DQotCS8qDQotCSAqIEtlcm5lbCBjcmVhdGVzIHRoZSBWWExBTiBkZXZpY2VzIGFuZCByZWdp c3RlcnMgVURQIHBvcnRzIHRvDQotCSAqIGJlIGhhcmR3YXJlIG9mZmxvYWRlZCB3aXRoaW4gdGhl IE5JQyBrZXJuZWwgZHJpdmVycy4gVGhlDQotCSAqIHJlZ2lzdHJhdGlvbiBwcm9jZXNzIGlzIGJl aW5nIHBlcmZvcm1lZCBpbnRvIGNvbnRleHQgb2YNCi0JICogd29ya2luZyBrZXJuZWwgdGhyZWFk IGFuZCB0aGUgcmFjZSBjb25kaXRpb25zIG1pZ2h0IGhhcHBlbi4NCi0JICogVGhlIFZYTEFOIGRl dmljZSBpcyBjcmVhdGVkIGFuZCBzdWNjZXNzIGlzIHJldHVybmVkIHRvDQotCSAqIGNhbGxpbmcg YXBwbGljYXRpb24sIGJ1dCB0aGUgVURQIHBvcnQgcmVnaXN0cmF0aW9uIHByb2Nlc3MNCi0JICog aXMgbm90IGNvbXBsZXRlZCB5ZXQuIFRoZSBuZXh0IGFwcGxpZWQgcnVsZSBtYXkgYmUgcmVqZWN0 ZWQNCi0JICogYnkgdGhlIGRyaXZlciB3aXRoIEVOT1NVUCBjb2RlLiBXZSBhcmUgZ29pbmcgdG8g d2FpdCBhIGJpdCwNCi0JICogYWxsb3dpbmcgcmVnaXN0cmF0aW9uIHByb2Nlc3MgdG8gYmUgY29t cGxldGVkLiBUaGUgd2FpdGluZw0KLQkgKiBpcyBwZXJmb3JtZWQgb25jZSBhZnRlciBkZXZpY2Ug YmVlbiBjcmVhdGVkLg0KLQkgKi8NCi0JZG8gew0KLQkJc3RydWN0IHRpbWVzcGVjIG9uZW1zOw0K LQ0KLQkJcmV0ID0gZmxvd190Y2ZfbmxfYWNrKGN0eCwgbmxoLA0KLQkJCQkgICAgICBmbG93X3Rj Zl9jb2xsZWN0X2FwcGx5X2NiLCBubGgpOw0KLQkJaWYgKCFyZXQgfHwgcmV0ICE9IC1FTk9UU1VQ IHx8ICF0d2FpdCkNCi0JCQlicmVhazsNCi0JCS8qIFdhaXQgb25lIG1pbGxpc2Vjb25kIGFuZCB0 cnkgYWdhaW4gdGlsbCB0aW1lb3V0LiAqLw0KLQkJb25lbXMudHZfc2VjID0gMDsNCi0JCW9uZW1z LnR2X25zZWMgPSBOU19QRVJfUyAvIE1TX1BFUl9TOw0KLQkJbmFub3NsZWVwKCZvbmVtcywgMCk7 DQotCQlpZiAoKHJ0ZV9nZXRfdGltZXJfY3ljbGVzKCkgLSBzdGFydCkgPiB0d2FpdCkgew0KLQkJ CS8qIFRpbWVvdXQgZWxhcHNlZCwgdHJ5IG9uY2UgbW9yZSBhbmQgZXhpdC4gKi8NCi0JCQl0d2Fp dCA9IDA7DQotCQl9DQotCX0gd2hpbGUgKHRydWUpOw0KLQlpZiAoIXJldCkgew0KLQkJaWYgKCF0 Y20tPnRjbV9oYW5kbGUpIHsNCi0JCQlmbG93X3RjZl9yZW1vdmUoZGV2LCBmbG93KTsNCi0JCQly ZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0DQotCQkJCShlcnJvciwgRU5PRU5ULA0KLQkJCQkgUlRF X0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwgTlVMTCwNCi0JCQkJICJuZXRsaW5rOiBydWxl IHplcm8gaGFuZGxlIHJldHVybmVkIik7DQotCQl9DQotCQlkZXZfZmxvdy0+dGNmLmFwcGxpZWQg PSAxOw0KLQkJaWYgKCpkZXZfZmxvdy0+dGNmLnB0Y19mbGFncyAmIFRDQV9DTFNfRkxBR1NfU0tJ UF9TVykNCi0JCQlyZXR1cm4gMDsNCi0JCS8qDQotCQkgKiBSdWxlIHdhcyBhcHBsaWVkIHdpdGhv dXQgc2tpcF9zdyBmbGFnIHNldC4NCi0JCSAqIFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSBy dWxlIHdhcyBhY2N0dWFsbHkNCi0JCSAqIGFjY2VwdGVkIGJ5IGhhcmR3YXJlIChoYXZlIGxvb2sg YXQgaW5faHcgZmxhZykuDQotCQkgKi8NCi0JCWlmIChmbG93X3RjZl9jaGVja19pbmh3KGN0eCwg ZGV2X2Zsb3cpKSB7DQotCQkJZmxvd190Y2ZfcmVtb3ZlKGRldiwgZmxvdyk7DQotCQkJcmV0dXJu IHJ0ZV9mbG93X2Vycm9yX3NldA0KLQkJCQkoZXJyb3IsIEVOT0VOVCwNCi0JCQkJIFJURV9GTE9X X0VSUk9SX1RZUEVfVU5TUEVDSUZJRUQsIE5VTEwsDQotCQkJCSAibmV0bGluazogcnVsZSBoYXMg bm8gaW5faHcgZmxhZyBzZXQiKTsNCi0JCX0NCi0JCXJldHVybiAwOw0KLQl9DQotCWlmIChkZXZf Zmxvdy0+dGNmLnR1bm5lbCkgew0KLQkJLyogUm9sbGJhY2sgdGhlIFZURVAgY29uZmlndXJhdGlv biBpZiBydWxlIGFwcGx5IGZhaWxlZC4gKi8NCi0JCWFzc2VydChkZXZfZmxvdy0+dGNmLnR1bm5l bC0+dnRlcCk7DQotCQlmbG93X3RjZl92dGVwX3JlbGVhc2UoY3R4LCBkZXZfZmxvdy0+dGNmLnR1 bm5lbC0+dnRlcCwNCi0JCQkJICAgICAgZGV2X2Zsb3cpOw0KLQkJZGV2X2Zsb3ctPnRjZi50dW5u ZWwtPnZ0ZXAgPSBOVUxMOw0KLQl9DQotCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3Is IHJ0ZV9lcnJubywNCi0JCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELCBOVUxM LA0KLQkJCQkgICJuZXRsaW5rOiBmYWlsZWQgdG8gY3JlYXRlIFRDIGZsb3cgcnVsZSIpOw0KLX0N Ci0NCi0vKioNCi0gKiBSZW1vdmUgZmxvdyBmcm9tIEUtU3dpdGNoIGFuZCByZWxlYXNlIHJlc291 cmNlcyBvZiB0aGUgZGV2aWNlIGZsb3cuDQotICoNCi0gKiBAcGFyYW1baW5dIGRldg0KLSAqICAg UG9pbnRlciB0byBFdGhlcm5ldCBkZXZpY2UuDQotICogQHBhcmFtW2luLCBvdXRdIGZsb3cNCi0g KiAgIFBvaW50ZXIgdG8gdGhlIHN1YiBmbG93Lg0KLSAqLw0KLXN0YXRpYyB2b2lkDQotZmxvd190 Y2ZfZGVzdHJveShzdHJ1Y3QgcnRlX2V0aF9kZXYgKmRldiwgc3RydWN0IHJ0ZV9mbG93ICpmbG93 KQ0KLXsNCi0Jc3RydWN0IG1seDVfZmxvdyAqZGV2X2Zsb3c7DQotDQotCWlmICghZmxvdykNCi0J CXJldHVybjsNCi0JZmxvd190Y2ZfcmVtb3ZlKGRldiwgZmxvdyk7DQotCWlmIChmbG93LT5jb3Vu dGVyKSB7DQotCQlpZiAoLS1mbG93LT5jb3VudGVyLT5yZWZfY250ID09IDApIHsNCi0JCQlydGVf ZnJlZShmbG93LT5jb3VudGVyKTsNCi0JCQlmbG93LT5jb3VudGVyID0gTlVMTDsNCi0JCX0NCi0J fQ0KLQlkZXZfZmxvdyA9IExJU1RfRklSU1QoJmZsb3ctPmRldl9mbG93cyk7DQotCWlmICghZGV2 X2Zsb3cpDQotCQlyZXR1cm47DQotCS8qIEUtU3dpdGNoIGZsb3cgY2FuJ3QgYmUgZXhwYW5kZWQu ICovDQotCWFzc2VydCghTElTVF9ORVhUKGRldl9mbG93LCBuZXh0KSk7DQotCUxJU1RfUkVNT1ZF KGRldl9mbG93LCBuZXh0KTsNCi0JcnRlX2ZyZWUoZGV2X2Zsb3cpOw0KLX0NCi0NCi0vKioNCi0g KiBIZWxwZXIgcm91dGluZSBmb3IgZmlndXJpbmcgdGhlIHNwYWNlIHNpemUgcmVxdWlyZWQgZm9y IGEgcGFyc2UgYnVmZmVyLg0KLSAqDQotICogQHBhcmFtIGFycmF5DQotICogICBhcnJheSBvZiB2 YWx1ZXMgdG8gdXNlLg0KLSAqIEBwYXJhbSBpZHgNCi0gKiAgIEN1cnJlbnQgbG9jYXRpb24gaW4g YXJyYXkuDQotICogQHBhcmFtIHZhbHVlDQotICogICBWYWx1ZSB0byBjb21wYXJlIHdpdGguDQot ICoNCi0gKiBAcmV0dXJuDQotICogICBUaGUgbWF4aW11bSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1 ZSBhbmQgdGhlIGFycmF5IHZhbHVlIG9uIGluZGV4Lg0KLSAqLw0KLXN0YXRpYyB1aW50MTZfdA0K LWZsb3dfdGNmX2Fycl92YWxfbWF4KHVpbnQxNl90IGFycmF5W10sIGludCBpZHgsIHVpbnQxNl90 IHZhbHVlKQ0KLXsNCi0JcmV0dXJuIGlkeCA8IDAgPyAodmFsdWUpIDogUlRFX01BWCgoYXJyYXkp W2lkeF0sIHZhbHVlKTsNCi19DQotDQotLyoqDQotICogUGFyc2UgcnRuZXRsaW5rIG1lc3NhZ2Ug YXR0cmlidXRlcyBmaWxsaW5nIHRoZSBhdHRyaWJ1dGUgdGFibGUgd2l0aCB0aGUgaW5mbw0KLSAq IHJldHJpZXZlZC4NCi0gKg0KLSAqIEBwYXJhbSB0Yg0KLSAqICAgQXR0cmlidXRlIHRhYmxlIHRv IGJlIGZpbGxlZC4NCi0gKiBAcGFyYW1bb3V0XSBtYXgNCi0gKiAgIE1heGludW0gZW50cnkgaW4g dGhlIGF0dHJpYnV0ZSB0YWJsZS4NCi0gKiBAcGFyYW0gcnRlDQotICogICBUaGUgYXR0cmlidXRl cyBzZWN0aW9uIGluIHRoZSBtZXNzYWdlIHRvIGJlIHBhcnNlZC4NCi0gKiBAcGFyYW0gbGVuDQot ICogICBUaGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGVzIHNlY3Rpb24gaW4gdGhlIG1lc3NhZ2Uu DQotICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9ubF9wYXJzZV9ydGF0dHIoc3RydWN0IHJ0 YXR0ciAqdGJbXSwgaW50IG1heCwNCi0JCQkgc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbGVuKQ0K LXsNCi0JdW5zaWduZWQgc2hvcnQgdHlwZTsNCi0JbWVtc2V0KHRiLCAwLCBzaXplb2Yoc3RydWN0 IHJ0YXR0ciAqKSAqIChtYXggKyAxKSk7DQotCXdoaWxlIChSVEFfT0socnRhLCBsZW4pKSB7DQot CQl0eXBlID0gcnRhLT5ydGFfdHlwZTsNCi0JCWlmICh0eXBlIDw9IG1heCAmJiAhdGJbdHlwZV0p DQotCQkJdGJbdHlwZV0gPSBydGE7DQotCQlydGEgPSBSVEFfTkVYVChydGEsIGxlbik7DQotCX0N Ci19DQotDQotLyoqDQotICogRXh0cmFjdCBmbG93IGNvdW50ZXJzIGZyb20gZmxvd2VyIGFjdGlv bi4NCi0gKg0KLSAqIEBwYXJhbSBydGENCi0gKiAgIGZsb3dlciBhY3Rpb24gc3RhdHMgcHJvcGVy dGllcyBpbiB0aGUgTmV0bGluayBtZXNzYWdlIHJlY2VpdmVkLg0KLSAqIEBwYXJhbSBydGFfdHlw ZQ0KLSAqICAgVGhlIGJhY2t3YXJkIHNlcXVlbmNlIG9mIHJ0YV90eXBlcywgYXMgd3JpdHRlbiBp biB0aGUgYXR0cmlidXRlIHRhYmxlLA0KLSAqICAgd2UgbmVlZCB0byB0cmF2ZXJzZSBpbiBvcmRl ciB0byBnZXQgdG8gdGhlIHJlcXVlc3RlZCBvYmplY3QuDQotICogQHBhcmFtIGlkeA0KLSAqICAg Q3VycmVudCBsb2NhdGlvbiBpbiBydGFfdHlwZSB0YWJsZS4NCi0gKiBAcGFyYW1bb3V0XSBkYXRh DQotICogICBkYXRhIGhvbGRpbmcgdGhlIGNvdW50IHN0YXRpc3RpY3Mgb2YgdGhlIHJ0ZV9mbG93 IHJldHJpZXZlZCBmcm9tDQotICogICB0aGUgbWVzc2FnZS4NCi0gKg0KLSAqIEByZXR1cm4NCi0g KiAgIDAgaWYgZGF0YSB3YXMgZm91bmQgYW5kIHJldHJpZXZlZCwgLTEgb3RoZXJ3aXNlLg0KLSAq Lw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl9ubF9hY3Rpb25fc3RhdHNfcGFyc2VfYW5kX2dldChz dHJ1Y3QgcnRhdHRyICpydGEsDQotCQkJCSAgICAgICB1aW50MTZfdCBydGFfdHlwZVtdLCBpbnQg aWR4LA0KLQkJCQkgICAgICAgc3RydWN0IGduZXRfc3RhdHNfYmFzaWMgKmRhdGEpDQotew0KLQlp bnQgdGNhX3N0YXRzX21heCA9IGZsb3dfdGNmX2Fycl92YWxfbWF4KHJ0YV90eXBlLCBpZHgsDQot CQkJCQkJIFRDQV9TVEFUU19CQVNJQyk7DQotCXN0cnVjdCBydGF0dHIgKnRic1t0Y2Ffc3RhdHNf bWF4ICsgMV07DQotDQotCWlmIChydGEgPT0gTlVMTCB8fCBpZHggPCAwKQ0KLQkJcmV0dXJuIC0x Ow0KLQlmbG93X3RjZl9ubF9wYXJzZV9ydGF0dHIodGJzLCB0Y2Ffc3RhdHNfbWF4LA0KLQkJCQkg UlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSk7DQotCXN3aXRjaCAocnRhX3R5cGVbaWR4 XSkgew0KLQljYXNlIFRDQV9TVEFUU19CQVNJQzoNCi0JCWlmICh0YnNbVENBX1NUQVRTX0JBU0lD XSkgew0KLQkJCW1lbWNweShkYXRhLCBSVEFfREFUQSh0YnNbVENBX1NUQVRTX0JBU0lDXSksDQot CQkJICAgICAgIFJURV9NSU4oUlRBX1BBWUxPQUQodGJzW1RDQV9TVEFUU19CQVNJQ10pLA0KLQkJ CSAgICAgICBzaXplb2YoKmRhdGEpKSk7DQotCQkJcmV0dXJuIDA7DQotCQl9DQotCQlicmVhazsN Ci0JZGVmYXVsdDoNCi0JCWJyZWFrOw0KLQl9DQotCXJldHVybiAtMTsNCi19DQotDQotLyoqDQot ICogUGFyc2UgZmxvd2VyIHNpbmdsZSBhY3Rpb24gcmV0cmlldmluZyB0aGUgcmVxdWVzdGVkIGFj dGlvbiBhdHRyaWJ1dGUsDQotICogaWYgZm91bmQuDQotICoNCi0gKiBAcGFyYW0gYXJnDQotICog ICBmbG93ZXIgYWN0aW9uIHByb3BlcnRpZXMgaW4gdGhlIE5ldGxpbmsgbWVzc2FnZSByZWNlaXZl ZC4NCi0gKiBAcGFyYW0gcnRhX3R5cGUNCi0gKiAgIFRoZSBiYWNrd2FyZCBzZXF1ZW5jZSBvZiBy dGFfdHlwZXMsIGFzIHdyaXR0ZW4gaW4gdGhlIGF0dHJpYnV0ZSB0YWJsZSwNCi0gKiAgIHdlIG5l ZWQgdG8gdHJhdmVyc2UgaW4gb3JkZXIgdG8gZ2V0IHRvIHRoZSByZXF1ZXN0ZWQgb2JqZWN0Lg0K LSAqIEBwYXJhbSBpZHgNCi0gKiAgIEN1cnJlbnQgbG9jYXRpb24gaW4gcnRhX3R5cGUgdGFibGUu DQotICogQHBhcmFtW291dF0gZGF0YQ0KLSAqICAgQ291bnQgc3RhdGlzdGljcyByZXRyaWV2ZWQg ZnJvbSB0aGUgbWVzc2FnZSBxdWVyeS4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIDAgaWYgZGF0 YSB3YXMgZm91bmQgYW5kIHJldHJpZXZlZCwgLTEgb3RoZXJ3aXNlLg0KLSAqLw0KLXN0YXRpYyBp bnQNCi1mbG93X3RjZl9ubF9wYXJzZV9vbmVfYWN0aW9uX2FuZF9nZXQoc3RydWN0IHJ0YXR0ciAq YXJnLA0KLQkJCQkgICAgIHVpbnQxNl90IHJ0YV90eXBlW10sIGludCBpZHgsIHZvaWQgKmRhdGEp DQotew0KLQlpbnQgdGNhX2FjdF9tYXggPSBmbG93X3RjZl9hcnJfdmFsX21heChydGFfdHlwZSwg aWR4LCBUQ0FfQUNUX1NUQVRTKTsNCi0Jc3RydWN0IHJ0YXR0ciAqdGJbdGNhX2FjdF9tYXggKyAx XTsNCi0NCi0JaWYgKGFyZyA9PSBOVUxMIHx8IGlkeCA8IDApDQotCQlyZXR1cm4gLTE7DQotCWZs b3dfdGNmX25sX3BhcnNlX3J0YXR0cih0YiwgdGNhX2FjdF9tYXgsDQotCQkJCSBSVEFfREFUQShh cmcpLCBSVEFfUEFZTE9BRChhcmcpKTsNCi0JaWYgKHRiW1RDQV9BQ1RfS0lORF0gPT0gTlVMTCkN Ci0JCXJldHVybiAtMTsNCi0Jc3dpdGNoIChydGFfdHlwZVtpZHhdKSB7DQotCWNhc2UgVENBX0FD VF9TVEFUUzoNCi0JCWlmICh0YltUQ0FfQUNUX1NUQVRTXSkNCi0JCQlyZXR1cm4gZmxvd190Y2Zf bmxfYWN0aW9uX3N0YXRzX3BhcnNlX2FuZF9nZXQNCi0JCQkJCSh0YltUQ0FfQUNUX1NUQVRTXSwN Ci0JCQkJCSBydGFfdHlwZSwgLS1pZHgsDQotCQkJCQkgKHN0cnVjdCBnbmV0X3N0YXRzX2Jhc2lj ICopZGF0YSk7DQotCQlicmVhazsNCi0JZGVmYXVsdDoNCi0JCWJyZWFrOw0KLQl9DQotCXJldHVy biAtMTsNCi19DQotDQotLyoqDQotICogUGFyc2UgZmxvd2VyIGFjdGlvbiBzZWN0aW9uIGluIHRo ZSBtZXNzYWdlIHJldHJpZXZpbmcgdGhlIHJlcXVlc3RlZA0KLSAqIGF0dHJpYnV0ZSBmcm9tIHRo ZSBmaXJzdCBhY3Rpb24gdGhhdCBwcm92aWRlcyBpdC4NCi0gKg0KLSAqIEBwYXJhbSBvcHQNCi0g KiAgIGZsb3dlciBzZWN0aW9uIGluIHRoZSBOZXRsaW5rIG1lc3NhZ2UgcmVjZWl2ZWQuDQotICog QHBhcmFtIHJ0YV90eXBlDQotICogICBUaGUgYmFja3dhcmQgc2VxdWVuY2Ugb2YgcnRhX3R5cGVz LCBhcyB3cml0dGVuIGluIHRoZSBhdHRyaWJ1dGUgdGFibGUsDQotICogICB3ZSBuZWVkIHRvIHRy YXZlcnNlIGluIG9yZGVyIHRvIGdldCB0byB0aGUgcmVxdWVzdGVkIG9iamVjdC4NCi0gKiBAcGFy YW0gaWR4DQotICogICBDdXJyZW50IGxvY2F0aW9uIGluIHJ0YV90eXBlIHRhYmxlLg0KLSAqIEBw YXJhbVtvdXRdIGRhdGENCi0gKiAgIGRhdGEgcmV0cmlldmVkIGZyb20gdGhlIG1lc3NhZ2UgcXVl cnkuDQotICoNCi0gKiBAcmV0dXJuDQotICogICAwIGlmIGRhdGEgd2FzIGZvdW5kIGFuZCByZXRy aWV2ZWQsIC0xIG90aGVyd2lzZS4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfbmxfYWN0 aW9uX3BhcnNlX2FuZF9nZXQoc3RydWN0IHJ0YXR0ciAqYXJnLA0KLQkJCQkgdWludDE2X3QgcnRh X3R5cGVbXSwgaW50IGlkeCwgdm9pZCAqZGF0YSkNCi17DQotCXN0cnVjdCBydGF0dHIgKnRiW1RD QV9BQ1RfTUFYX1BSSU8gKyAxXTsNCi0JaW50IGk7DQotDQotCWlmIChhcmcgPT0gTlVMTCB8fCBp ZHggPCAwKQ0KLQkJcmV0dXJuIC0xOw0KLQlmbG93X3RjZl9ubF9wYXJzZV9ydGF0dHIodGIsIFRD QV9BQ1RfTUFYX1BSSU8sDQotCQkJCSBSVEFfREFUQShhcmcpLCBSVEFfUEFZTE9BRChhcmcpKTsN Ci0Jc3dpdGNoIChydGFfdHlwZVtpZHhdKSB7DQotCS8qDQotCSAqIGZsb3cgY291bnRlcnMgYXJl IHN0b3JlZCBpbiB0aGUgYWN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBmbG93DQotCSAqIGFuZCBub3Qg aW4gdGhlIGZsb3cgaXRzZWxmLCB0aGVyZWZvcmUgd2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUNCi0J ICogZmxvd2VyIGNoYWluIG9mIGFjdGlvbnMgaW4gc2VhcmNoIGZvciB0aGVtLg0KLQkgKg0KLQkg KiBOb3RlIHRoYXQgdGhlIGluZGV4IGlzIG5vdCBkZWNyZW1lbnRlZCBoZXJlLg0KLQkgKi8NCi0J Y2FzZSBUQ0FfQUNUX1NUQVRTOg0KLQkJZm9yIChpID0gMDsgaSA8PSBUQ0FfQUNUX01BWF9QUklP OyBpKyspIHsNCi0JCQlpZiAodGJbaV0gJiYNCi0JCQkhZmxvd190Y2ZfbmxfcGFyc2Vfb25lX2Fj dGlvbl9hbmRfZ2V0KHRiW2ldLA0KLQkJCQkJCQkgICAgICBydGFfdHlwZSwNCi0JCQkJCQkJICAg ICAgaWR4LCBkYXRhKSkNCi0JCQkJcmV0dXJuIDA7DQotCQl9DQotCQlicmVhazsNCi0JZGVmYXVs dDoNCi0JCWJyZWFrOw0KLQl9DQotCXJldHVybiAtMTsNCi19DQotDQotLyoqDQotICogUGFyc2Ug Zmxvd2VyIGNsYXNzaWZpZXIgb3B0aW9ucyBpbiB0aGUgbWVzc2FnZSwgcmV0cmlldmluZyB0aGUg cmVxdWVzdGVkDQotICogYXR0cmlidXRlIGlmIGZvdW5kLg0KLSAqDQotICogQHBhcmFtIG9wdA0K LSAqICAgZmxvd2VyIHNlY3Rpb24gaW4gdGhlIE5ldGxpbmsgbWVzc2FnZSByZWNlaXZlZC4NCi0g KiBAcGFyYW0gcnRhX3R5cGUNCi0gKiAgIFRoZSBiYWNrd2FyZCBzZXF1ZW5jZSBvZiBydGFfdHlw ZXMsIGFzIHdyaXR0ZW4gaW4gdGhlIGF0dHJpYnV0ZSB0YWJsZSwNCi0gKiAgIHdlIG5lZWQgdG8g dHJhdmVyc2UgaW4gb3JkZXIgdG8gZ2V0IHRvIHRoZSByZXF1ZXN0ZWQgb2JqZWN0Lg0KLSAqIEBw YXJhbSBpZHgNCi0gKiAgIEN1cnJlbnQgbG9jYXRpb24gaW4gcnRhX3R5cGUgdGFibGUuDQotICog QHBhcmFtW291dF0gZGF0YQ0KLSAqICAgZGF0YSByZXRyaWV2ZWQgZnJvbSB0aGUgbWVzc2FnZSBx dWVyeS4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIDAgaWYgZGF0YSB3YXMgZm91bmQgYW5kIHJl dHJpZXZlZCwgLTEgb3RoZXJ3aXNlLg0KLSAqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl9ubF9v cHRzX3BhcnNlX2FuZF9nZXQoc3RydWN0IHJ0YXR0ciAqb3B0LA0KLQkJCSAgICAgICB1aW50MTZf dCBydGFfdHlwZVtdLCBpbnQgaWR4LCB2b2lkICpkYXRhKQ0KLXsNCi0JaW50IHRjYV9mbG93ZXJf bWF4ID0gZmxvd190Y2ZfYXJyX3ZhbF9tYXgocnRhX3R5cGUsIGlkeCwNCi0JCQkJCQkgIFRDQV9G TE9XRVJfQUNUKTsNCi0Jc3RydWN0IHJ0YXR0ciAqdGJbdGNhX2Zsb3dlcl9tYXggKyAxXTsNCi0N Ci0JaWYgKCFvcHQgfHwgaWR4IDwgMCkNCi0JCXJldHVybiAtMTsNCi0JZmxvd190Y2ZfbmxfcGFy c2VfcnRhdHRyKHRiLCB0Y2FfZmxvd2VyX21heCwNCi0JCQkJIFJUQV9EQVRBKG9wdCksIFJUQV9Q QVlMT0FEKG9wdCkpOw0KLQlzd2l0Y2ggKHJ0YV90eXBlW2lkeF0pIHsNCi0JY2FzZSBUQ0FfRkxP V0VSX0FDVDoNCi0JCWlmICh0YltUQ0FfRkxPV0VSX0FDVF0pDQotCQkJcmV0dXJuIGZsb3dfdGNm X25sX2FjdGlvbl9wYXJzZV9hbmRfZ2V0DQotCQkJCQkJCSh0YltUQ0FfRkxPV0VSX0FDVF0sDQot CQkJCQkJCSBydGFfdHlwZSwgLS1pZHgsIGRhdGEpOw0KLQkJYnJlYWs7DQotCWRlZmF1bHQ6DQot CQlicmVhazsNCi0JfQ0KLQlyZXR1cm4gLTE7DQotfQ0KLQ0KLS8qKg0KLSAqIFBhcnNlIE5ldGxp bmsgcmVwbHkgb24gZmlsdGVyIHF1ZXJ5LCByZXRyaWV2aW5nIHRoZSBmbG93IGNvdW50ZXJzLg0K LSAqDQotICogQHBhcmFtIG5saA0KLSAqICAgTWVzc2FnZSByZWNlaXZlZCBmcm9tIE5ldGxpbmsu DQotICogQHBhcmFtIHJ0YV90eXBlDQotICogICBUaGUgYmFja3dhcmQgc2VxdWVuY2Ugb2YgcnRh X3R5cGVzLCBhcyB3cml0dGVuIGluIHRoZSBhdHRyaWJ1dGUgdGFibGUsDQotICogICB3ZSBuZWVk IHRvIHRyYXZlcnNlIGluIG9yZGVyIHRvIGdldCB0byB0aGUgcmVxdWVzdGVkIG9iamVjdC4NCi0g KiBAcGFyYW0gaWR4DQotICogICBDdXJyZW50IGxvY2F0aW9uIGluIHJ0YV90eXBlIHRhYmxlLg0K LSAqIEBwYXJhbVtvdXRdIGRhdGENCi0gKiAgIGRhdGEgcmV0cmlldmVkIGZyb20gdGhlIG1lc3Nh Z2UgcXVlcnkuDQotICoNCi0gKiBAcmV0dXJuDQotICogICAwIGlmIGRhdGEgd2FzIGZvdW5kIGFu ZCByZXRyaWV2ZWQsIC0xIG90aGVyd2lzZS4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2Zf bmxfZmlsdGVyX3BhcnNlX2FuZF9nZXQoc3RydWN0IG5sbXNnaGRyICpjbmxoLA0KLQkJCQkgdWlu dDE2X3QgcnRhX3R5cGVbXSwgaW50IGlkeCwgdm9pZCAqZGF0YSkNCi17DQotCXN0cnVjdCBubG1z Z2hkciAqbmxoID0gY25saDsNCi0Jc3RydWN0IHRjbXNnICp0ID0gTkxNU0dfREFUQShubGgpOw0K LQlpbnQgbGVuID0gbmxoLT5ubG1zZ19sZW47DQotCWludCB0Y2FfbWF4ID0gZmxvd190Y2ZfYXJy X3ZhbF9tYXgocnRhX3R5cGUsIGlkeCwgVENBX09QVElPTlMpOw0KLQlzdHJ1Y3QgcnRhdHRyICp0 Ylt0Y2FfbWF4ICsgMV07DQotDQotCWlmIChpZHggPCAwKQ0KLQkJcmV0dXJuIC0xOw0KLQlpZiAo bmxoLT5ubG1zZ190eXBlICE9IFJUTV9ORVdURklMVEVSICYmDQotCSAgICBubGgtPm5sbXNnX3R5 cGUgIT0gUlRNX0dFVFRGSUxURVIgJiYNCi0JICAgIG5saC0+bmxtc2dfdHlwZSAhPSBSVE1fREVM VEZJTFRFUikNCi0JCXJldHVybiAtMTsNCi0JbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnQp KTsNCi0JaWYgKGxlbiA8IDApDQotCQlyZXR1cm4gLTE7DQotCWZsb3dfdGNmX25sX3BhcnNlX3J0 YXR0cih0YiwgdGNhX21heCwgVENBX1JUQSh0KSwgbGVuKTsNCi0JLyogTm90IGEgVEMgZmxvd2Vy IGZsb3cgLSBiYWlsIG91dCAqLw0KLQlpZiAoIXRiW1RDQV9LSU5EXSB8fA0KLQkgICAgc3RyY21w KFJUQV9EQVRBKHRiW1RDQV9LSU5EXSksICJmbG93ZXIiKSkNCi0JCXJldHVybiAtMTsNCi0Jc3dp dGNoIChydGFfdHlwZVtpZHhdKSB7DQotCWNhc2UgVENBX09QVElPTlM6DQotCQlpZiAodGJbVENB X09QVElPTlNdKQ0KLQkJCXJldHVybiBmbG93X3RjZl9ubF9vcHRzX3BhcnNlX2FuZF9nZXQodGJb VENBX09QVElPTlNdLA0KLQkJCQkJCQkgICAgICBydGFfdHlwZSwNCi0JCQkJCQkJICAgICAgLS1p ZHgsIGRhdGEpOw0KLQkJYnJlYWs7DQotCWRlZmF1bHQ6DQotCQlicmVhazsNCi0JfQ0KLQlyZXR1 cm4gLTE7DQotfQ0KLQ0KLS8qKg0KLSAqIEEgY2FsbGJhY2sgdG8gcGFyc2UgTmV0bGluayByZXBs eSBvbiBUQyBmbG93ZXIgcXVlcnkuDQotICoNCi0gKiBAcGFyYW0gbmxoDQotICogICBNZXNzYWdl IHJlY2VpdmVkIGZyb20gTmV0bGluay4NCi0gKiBAcGFyYW1bb3V0XSBkYXRhDQotICogICBQb2lu dGVyIHRvIGRhdGEgYXJlYSB0byBiZSBmaWxsZWQgYnkgdGhlIHBhcnNpbmcgcm91dGluZS4NCi0g KiAgIGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyIHRvIHN0cnVjdCBmbG93X3RjZl9zdGF0c19iYXNp Yy4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIE1OTF9DQl9PSyB2YWx1ZS4NCi0gKi8NCi1zdGF0 aWMgaW50DQotZmxvd190Y2ZfbmxfbWVzc2FnZV9nZXRfc3RhdHNfYmFzaWMoY29uc3Qgc3RydWN0 IG5sbXNnaGRyICpubGgsIHZvaWQgKmRhdGEpDQotew0KLQkvKg0KLQkgKiBUaGUgYmFja3dhcmQg c2VxdWVuY2Ugb2YgcnRhX3R5cGVzIHRvIHBhc3MgaW4gb3JkZXIgdG8gZ2V0DQotCSAqICB0byB0 aGUgY291bnRlcnMuDQotCSAqLw0KLQl1aW50MTZfdCBydGFfdHlwZVtdID0geyBUQ0FfU1RBVFNf QkFTSUMsIFRDQV9BQ1RfU1RBVFMsDQotCQkJCVRDQV9GTE9XRVJfQUNULCBUQ0FfT1BUSU9OUyB9 Ow0KLQlzdHJ1Y3QgZmxvd190Y2Zfc3RhdHNfYmFzaWMgKnNiX2RhdGEgPSBkYXRhOw0KLQl1bmlv biB7DQotCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKmM7DQotCQlzdHJ1Y3Qgbmxtc2doZHIgKm5j Ow0KLQl9IHRubGggPSB7IC5jID0gbmxoIH07DQotDQotCWlmICghZmxvd190Y2ZfbmxfZmlsdGVy X3BhcnNlX2FuZF9nZXQodG5saC5uYywgcnRhX3R5cGUsDQotCQkJCQkgICAgICBSVEVfRElNKHJ0 YV90eXBlKSAtIDEsDQotCQkJCQkgICAgICAodm9pZCAqKSZzYl9kYXRhLT5jb3VudGVycykpDQot CQlzYl9kYXRhLT52YWxpZCA9IHRydWU7DQotCXJldHVybiBNTkxfQ0JfT0s7DQotfQ0KLQ0KLS8q Kg0KLSAqIFF1ZXJ5IGEgVEMgZmxvd2VyIHJ1bGUgZm9yIGl0cyBzdGF0aXN0aWNzIHZpYSBuZXRs aW5rLg0KLSAqDQotICogQHBhcmFtW2luXSBkZXYNCi0gKiAgIFBvaW50ZXIgdG8gRXRoZXJuZXQg ZGV2aWNlLg0KLSAqIEBwYXJhbVtpbl0gZmxvdw0KLSAqICAgUG9pbnRlciB0byB0aGUgc3ViIGZs b3cuDQotICogQHBhcmFtW291dF0gZGF0YQ0KLSAqICAgZGF0YSByZXRyaWV2ZWQgYnkgdGhlIHF1 ZXJ5Lg0KLSAqIEBwYXJhbVtvdXRdIGVycm9yDQotICogICBQZXJmb3JtIHZlcmJvc2UgZXJyb3Ig cmVwb3J0aW5nIGlmIG5vdCBOVUxMLg0KLSAqDQotICogQHJldHVybg0KLSAqICAgMCBvbiBzdWNj ZXNzLCBhIG5lZ2F0aXZlIGVycm5vIHZhbHVlIG90aGVyd2lzZSBhbmQgcnRlX2Vycm5vIGlzIHNl dC4NCi0gKi8NCi1zdGF0aWMgaW50DQotZmxvd190Y2ZfcXVlcnlfY291bnQoc3RydWN0IHJ0ZV9l dGhfZGV2ICpkZXYsDQotCQkJICBzdHJ1Y3QgcnRlX2Zsb3cgKmZsb3csDQotCQkJICB2b2lkICpk YXRhLA0KLQkJCSAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikNCi17DQotCXN0cnVjdCBm bG93X3RjZl9zdGF0c19iYXNpYyBzYl9kYXRhOw0KLQlzdHJ1Y3QgcnRlX2Zsb3dfcXVlcnlfY291 bnQgKnFjID0gZGF0YTsNCi0Jc3RydWN0IG1seDVfcHJpdiAqcHJpdiA9IGRldi0+ZGF0YS0+ZGV2 X3ByaXZhdGU7DQotCXN0cnVjdCBtbHg1X2Zsb3dfdGNmX2NvbnRleHQgKmN0eCA9IHByaXYtPnRj Zl9jb250ZXh0Ow0KLQlzdHJ1Y3QgbW5sX3NvY2tldCAqbmwgPSBjdHgtPm5sOw0KLQlzdHJ1Y3Qg bWx4NV9mbG93ICpkZXZfZmxvdzsNCi0Jc3RydWN0IG5sbXNnaGRyICpubGg7DQotCXVpbnQzMl90 IHNlcSA9IHByaXYtPnRjZl9jb250ZXh0LT5zZXErKzsNCi0Jc3NpemVfdCByZXQ7DQotCWFzc2Vy dChxYyk7DQotDQotCW1lbXNldCgmc2JfZGF0YSwgMCwgc2l6ZW9mKHNiX2RhdGEpKTsNCi0JZGV2 X2Zsb3cgPSBMSVNUX0ZJUlNUKCZmbG93LT5kZXZfZmxvd3MpOw0KLQkvKiBFLVN3aXRjaCBmbG93 IGNhbid0IGJlIGV4cGFuZGVkLiAqLw0KLQlhc3NlcnQoIUxJU1RfTkVYVChkZXZfZmxvdywgbmV4 dCkpOw0KLQlpZiAoIWRldl9mbG93LT5mbG93LT5jb3VudGVyKQ0KLQkJZ290byBub3RzdXBfZXhp dDsNCi0JbmxoID0gZGV2X2Zsb3ctPnRjZi5ubGg7DQotCW5saC0+bmxtc2dfdHlwZSA9IFJUTV9H RVRURklMVEVSOw0KLQlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0VD SE87DQotCW5saC0+bmxtc2dfc2VxID0gc2VxOw0KLQlpZiAobW5sX3NvY2tldF9zZW5kdG8obmws IG5saCwgbmxoLT5ubG1zZ19sZW4pID09IC0xKQ0KLQkJZ290byBlcnJvcl9leGl0Ow0KLQlkbyB7 DQotCQlyZXQgPSBtbmxfc29ja2V0X3JlY3Zmcm9tKG5sLCBjdHgtPmJ1ZiwgY3R4LT5idWZfc2l6 ZSk7DQotCQlpZiAocmV0IDw9IDApDQotCQkJYnJlYWs7DQotCQlyZXQgPSBtbmxfY2JfcnVuKGN0 eC0+YnVmLCByZXQsIHNlcSwNCi0JCQkJIG1ubF9zb2NrZXRfZ2V0X3BvcnRpZChubCksDQotCQkJ CSBmbG93X3RjZl9ubF9tZXNzYWdlX2dldF9zdGF0c19iYXNpYywNCi0JCQkJICh2b2lkICopJnNi X2RhdGEpOw0KLQl9IHdoaWxlIChyZXQgPiAwKTsNCi0JLyogUmV0dXJuIHRoZSBkZWx0YSBmcm9t IGxhc3QgcmVzZXQuICovDQotCWlmIChzYl9kYXRhLnZhbGlkKSB7DQotCQkvKiBSZXR1cm4gdGhl IGRlbHRhIGZyb20gbGFzdCByZXNldC4gKi8NCi0JCXFjLT5oaXRzX3NldCA9IDE7DQotCQlxYy0+ Ynl0ZXNfc2V0ID0gMTsNCi0JCXFjLT5oaXRzID0gc2JfZGF0YS5jb3VudGVycy5wYWNrZXRzIC0g Zmxvdy0+Y291bnRlci0+aGl0czsNCi0JCXFjLT5ieXRlcyA9IHNiX2RhdGEuY291bnRlcnMuYnl0 ZXMgLSBmbG93LT5jb3VudGVyLT5ieXRlczsNCi0JCWlmIChxYy0+cmVzZXQpIHsNCi0JCQlmbG93 LT5jb3VudGVyLT5oaXRzID0gc2JfZGF0YS5jb3VudGVycy5wYWNrZXRzOw0KLQkJCWZsb3ctPmNv dW50ZXItPmJ5dGVzID0gc2JfZGF0YS5jb3VudGVycy5ieXRlczsNCi0JCX0NCi0JCXJldHVybiAw Ow0KLQl9DQotCXJldHVybiBydGVfZmxvd19lcnJvcl9zZXQoZXJyb3IsIEVJTlZBTCwNCi0JCQkJ ICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BFQ0lGSUVELA0KLQkJCQkgIE5VTEwsDQotCQkJCSAg ImZsb3cgZG9lcyBub3QgaGF2ZSBjb3VudGVyIik7DQotZXJyb3JfZXhpdDoNCi0JcmV0dXJuIHJ0 ZV9mbG93X2Vycm9yX3NldA0KLQkJCShlcnJvciwgZXJybm8sIFJURV9GTE9XX0VSUk9SX1RZUEVf VU5TUEVDSUZJRUQsDQotCQkJIE5VTEwsICJuZXRsaW5rOiBmYWlsZWQgdG8gcmVhZCBmbG93IHJ1 bGUgY291bnRlcnMiKTsNCi1ub3RzdXBfZXhpdDoNCi0JcmV0dXJuIHJ0ZV9mbG93X2Vycm9yX3Nl dA0KLQkJCShlcnJvciwgRU5PVFNVUCwgUlRFX0ZMT1dfRVJST1JfVFlQRV9VTlNQRUNJRklFRCwN Ci0JCQkgTlVMTCwgImNvdW50ZXJzIGFyZSBub3QgYXZhaWxhYmxlLiIpOw0KLX0NCi0NCi0vKioN Ci0gKiBRdWVyeSBhIGZsb3cuDQotICoNCi0gKiBAc2VlIHJ0ZV9mbG93X3F1ZXJ5KCkNCi0gKiBA c2VlIHJ0ZV9mbG93X29wcw0KLSAqLw0KLXN0YXRpYyBpbnQNCi1mbG93X3RjZl9xdWVyeShzdHJ1 Y3QgcnRlX2V0aF9kZXYgKmRldiwNCi0JICAgICAgIHN0cnVjdCBydGVfZmxvdyAqZmxvdywNCi0J ICAgICAgIGNvbnN0IHN0cnVjdCBydGVfZmxvd19hY3Rpb24gKmFjdGlvbnMsDQotCSAgICAgICB2 b2lkICpkYXRhLA0KLQkgICAgICAgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikNCi17DQot CWludCByZXQgPSAtRUlOVkFMOw0KLQ0KLQlmb3IgKDsgYWN0aW9ucy0+dHlwZSAhPSBSVEVfRkxP V19BQ1RJT05fVFlQRV9FTkQ7IGFjdGlvbnMrKykgew0KLQkJc3dpdGNoIChhY3Rpb25zLT50eXBl KSB7DQotCQljYXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX1ZPSUQ6DQotCQkJYnJlYWs7DQotCQlj YXNlIFJURV9GTE9XX0FDVElPTl9UWVBFX0NPVU5UOg0KLQkJCXJldCA9IGZsb3dfdGNmX3F1ZXJ5 X2NvdW50KGRldiwgZmxvdywgZGF0YSwgZXJyb3IpOw0KLQkJCWJyZWFrOw0KLQkJZGVmYXVsdDoN Ci0JCQlyZXR1cm4gcnRlX2Zsb3dfZXJyb3Jfc2V0KGVycm9yLCBFTk9UU1VQLA0KLQkJCQkJCSAg UlRFX0ZMT1dfRVJST1JfVFlQRV9BQ1RJT04sDQotCQkJCQkJICBhY3Rpb25zLA0KLQkJCQkJCSAg ImFjdGlvbiBub3Qgc3VwcG9ydGVkIik7DQotCQl9DQotCX0NCi0JcmV0dXJuIHJldDsNCi19DQot DQotY29uc3Qgc3RydWN0IG1seDVfZmxvd19kcml2ZXJfb3BzIG1seDVfZmxvd190Y2ZfZHJ2X29w cyA9IHsNCi0JLnZhbGlkYXRlID0gZmxvd190Y2ZfdmFsaWRhdGUsDQotCS5wcmVwYXJlID0gZmxv d190Y2ZfcHJlcGFyZSwNCi0JLnRyYW5zbGF0ZSA9IGZsb3dfdGNmX3RyYW5zbGF0ZSwNCi0JLmFw cGx5ID0gZmxvd190Y2ZfYXBwbHksDQotCS5yZW1vdmUgPSBmbG93X3RjZl9yZW1vdmUsDQotCS5k ZXN0cm95ID0gZmxvd190Y2ZfZGVzdHJveSwNCi0JLnF1ZXJ5ID0gZmxvd190Y2ZfcXVlcnksDQot fTsNCi0NCi0vKioNCi0gKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIGxpYm1ubCBzb2NrZXQgZm9y IE5ldGxpbmsgZmxvdyBydWxlcy4NCi0gKg0KLSAqIEByZXR1cm4NCi0gKiAgIEEgdmFsaWQgbGli bW5sIHNvY2tldCBvYmplY3QgcG9pbnRlciBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZSBhbmQN Ci0gKiAgIHJ0ZV9lcnJubyBpcyBzZXQuDQotICovDQotc3RhdGljIHN0cnVjdCBtbmxfc29ja2V0 ICoNCi1mbG93X3RjZl9tbmxfc29ja2V0X2NyZWF0ZSh2b2lkKQ0KLXsNCi0Jc3RydWN0IG1ubF9z b2NrZXQgKm5sID0gbW5sX3NvY2tldF9vcGVuKE5FVExJTktfUk9VVEUpOw0KLQ0KLQlpZiAobmwp IHsNCi0JCW1ubF9zb2NrZXRfc2V0c29ja29wdChubCwgTkVUTElOS19DQVBfQUNLLCAmKGludCl7 IDEgfSwNCi0JCQkJICAgICAgc2l6ZW9mKGludCkpOw0KLQkJaWYgKCFtbmxfc29ja2V0X2JpbmQo bmwsIDAsIE1OTF9TT0NLRVRfQVVUT1BJRCkpDQotCQkJcmV0dXJuIG5sOw0KLQl9DQotCXJ0ZV9l cnJubyA9IGVycm5vOw0KLQlpZiAobmwpDQotCQltbmxfc29ja2V0X2Nsb3NlKG5sKTsNCi0JcmV0 dXJuIE5VTEw7DQotfQ0KLQ0KLS8qKg0KLSAqIERlc3Ryb3kgYSBsaWJtbmwgc29ja2V0Lg0KLSAq DQotICogQHBhcmFtIG5sDQotICogICBMaWJtbmwgc29ja2V0IG9mIHRoZSBAcCBORVRMSU5LX1JP VVRFIGtpbmQuDQotICovDQotc3RhdGljIHZvaWQNCi1mbG93X3RjZl9tbmxfc29ja2V0X2Rlc3Ry b3koc3RydWN0IG1ubF9zb2NrZXQgKm5sKQ0KLXsNCi0JaWYgKG5sKQ0KLQkJbW5sX3NvY2tldF9j bG9zZShubCk7DQotfQ0KLQ0KLS8qKg0KLSAqIEluaXRpYWxpemUgaW5ncmVzcyBxZGlzYyBvZiBh IGdpdmVuIG5ldHdvcmsgaW50ZXJmYWNlLg0KLSAqDQotICogQHBhcmFtIGN0eA0KLSAqICAgUG9p bnRlciB0byB0Yy1mbG93ZXIgY29udGV4dCB0byB1c2UuDQotICogQHBhcmFtIGlmaW5kZXgNCi0g KiAgIEluZGV4IG9mIG5ldHdvcmsgaW50ZXJmYWNlIHRvIGluaXRpYWxpemUuDQotICogQHBhcmFt W291dF0gZXJyb3INCi0gKiAgIFBlcmZvcm0gdmVyYm9zZSBlcnJvciByZXBvcnRpbmcgaWYgbm90 IE5VTEwuDQotICoNCi0gKiBAcmV0dXJuDQotICogICAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUg ZXJybm8gdmFsdWUgb3RoZXJ3aXNlIGFuZCBydGVfZXJybm8gaXMgc2V0Lg0KLSAqLw0KLWludA0K LW1seDVfZmxvd190Y2ZfaW5pdChzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICpjdHgsDQot CQkgICB1bnNpZ25lZCBpbnQgaWZpbmRleCwgc3RydWN0IHJ0ZV9mbG93X2Vycm9yICplcnJvcikN Ci17DQotCXN0cnVjdCBubG1zZ2hkciAqbmxoOw0KLQlzdHJ1Y3QgdGNtc2cgKnRjbTsNCi0JYWxp Z25hcyhzdHJ1Y3Qgbmxtc2doZHIpDQotCXVpbnQ4X3QgYnVmW21ubF9ubG1zZ19zaXplKHNpemVv ZigqdGNtKSkgKw0KLQkJICAgIFNaX05MQVRUUl9TVFJaX09GKCJpbmdyZXNzIikgKw0KLQkJICAg IE1OTF9CVUZfRVhUUkFfU1BBQ0VdOw0KLQ0KLQkvKiBEZXN0cm95IGV4aXN0aW5nIGluZ3Jlc3Mg cWRpc2MgYW5kIGV2ZXJ5dGhpbmcgYXR0YWNoZWQgdG8gaXQuICovDQotCW5saCA9IG1ubF9ubG1z Z19wdXRfaGVhZGVyKGJ1Zik7DQotCW5saC0+bmxtc2dfdHlwZSA9IFJUTV9ERUxRRElTQzsNCi0J bmxoLT5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7DQotCXRjbSA9IG1ubF9ubG1zZ19wdXRf ZXh0cmFfaGVhZGVyKG5saCwgc2l6ZW9mKCp0Y20pKTsNCi0JdGNtLT50Y21fZmFtaWx5ID0gQUZf VU5TUEVDOw0KLQl0Y20tPnRjbV9pZmluZGV4ID0gaWZpbmRleDsNCi0JdGNtLT50Y21faGFuZGxl ID0gVENfSF9NQUtFKFRDX0hfSU5HUkVTUywgMCk7DQotCXRjbS0+dGNtX3BhcmVudCA9IFRDX0hf SU5HUkVTUzsNCi0JYXNzZXJ0KHNpemVvZihidWYpID49IG5saC0+bmxtc2dfbGVuKTsNCi0JLyog SWdub3JlIGVycm9ycyB3aGVuIHFkaXNjIGlzIGFscmVhZHkgYWJzZW50LiAqLw0KLQlpZiAoZmxv d190Y2ZfbmxfYWNrKGN0eCwgbmxoLCBOVUxMLCBOVUxMKSAmJg0KLQkgICAgcnRlX2Vycm5vICE9 IEVJTlZBTCAmJiBydGVfZXJybm8gIT0gRU5PRU5UKQ0KLQkJcmV0dXJuIHJ0ZV9mbG93X2Vycm9y X3NldChlcnJvciwgcnRlX2Vycm5vLA0KLQkJCQkJICBSVEVfRkxPV19FUlJPUl9UWVBFX1VOU1BF Q0lGSUVELCBOVUxMLA0KLQkJCQkJICAibmV0bGluazogZmFpbGVkIHRvIHJlbW92ZSBpbmdyZXNz Ig0KLQkJCQkJICAiIHFkaXNjIik7DQotCS8qIENyZWF0ZSBmcmVzaCBpbmdyZXNzIHFkaXNjLiAq Lw0KLQlubGggPSBtbmxfbmxtc2dfcHV0X2hlYWRlcihidWYpOw0KLQlubGgtPm5sbXNnX3R5cGUg PSBSVE1fTkVXUURJU0M7DQotCW5saC0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgTkxN X0ZfQ1JFQVRFIHwgTkxNX0ZfRVhDTDsNCi0JdGNtID0gbW5sX25sbXNnX3B1dF9leHRyYV9oZWFk ZXIobmxoLCBzaXplb2YoKnRjbSkpOw0KLQl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7DQot CXRjbS0+dGNtX2lmaW5kZXggPSBpZmluZGV4Ow0KLQl0Y20tPnRjbV9oYW5kbGUgPSBUQ19IX01B S0UoVENfSF9JTkdSRVNTLCAwKTsNCi0JdGNtLT50Y21fcGFyZW50ID0gVENfSF9JTkdSRVNTOw0K LQltbmxfYXR0cl9wdXRfc3Ryel9jaGVjayhubGgsIHNpemVvZihidWYpLCBUQ0FfS0lORCwgImlu Z3Jlc3MiKTsNCi0JYXNzZXJ0KHNpemVvZihidWYpID49IG5saC0+bmxtc2dfbGVuKTsNCi0JaWYg KGZsb3dfdGNmX25sX2FjayhjdHgsIG5saCwgTlVMTCwgTlVMTCkpDQotCQlyZXR1cm4gcnRlX2Zs b3dfZXJyb3Jfc2V0KGVycm9yLCBydGVfZXJybm8sDQotCQkJCQkgIFJURV9GTE9XX0VSUk9SX1RZ UEVfVU5TUEVDSUZJRUQsIE5VTEwsDQotCQkJCQkgICJuZXRsaW5rOiBmYWlsZWQgdG8gY3JlYXRl IGluZ3Jlc3MiDQotCQkJCQkgICIgcWRpc2MiKTsNCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLS8qKg0K LSAqIENyZWF0ZSBsaWJtbmwgY29udGV4dCBmb3IgTmV0bGluayBmbG93IHJ1bGVzLg0KLSAqDQot ICogQHJldHVybg0KLSAqICAgQSB2YWxpZCBsaWJtbmwgc29ja2V0IG9iamVjdCBwb2ludGVyIG9u IHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlIGFuZA0KLSAqICAgcnRlX2Vycm5vIGlzIHNldC4NCi0g Ki8NCi1zdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICoNCi1tbHg1X2Zsb3dfdGNmX2NvbnRl eHRfY3JlYXRlKHZvaWQpDQotew0KLQlzdHJ1Y3QgbWx4NV9mbG93X3RjZl9jb250ZXh0ICpjdHgg PSBydGVfem1hbGxvYyhfX2Z1bmNfXywNCi0JCQkJCQkJc2l6ZW9mKCpjdHgpLA0KLQkJCQkJCQlz aXplb2YodWludDMyX3QpKTsNCi0JaWYgKCFjdHgpDQotCQlnb3RvIGVycm9yOw0KLQljdHgtPm5s ID0gZmxvd190Y2ZfbW5sX3NvY2tldF9jcmVhdGUoKTsNCi0JaWYgKCFjdHgtPm5sKQ0KLQkJZ290 byBlcnJvcjsNCi0JY3R4LT5idWZfc2l6ZSA9IE1OTF9TT0NLRVRfQlVGRkVSX1NJWkU7DQotCWN0 eC0+YnVmID0gcnRlX3ptYWxsb2MoX19mdW5jX18sDQotCQkJICAgICAgIGN0eC0+YnVmX3NpemUs IHNpemVvZih1aW50MzJfdCkpOw0KLQlpZiAoIWN0eC0+YnVmKQ0KLQkJZ290byBlcnJvcjsNCi0J Y3R4LT5zZXEgPSByYW5kb20oKTsNCi0JcmV0dXJuIGN0eDsNCi1lcnJvcjoNCi0JbWx4NV9mbG93 X3RjZl9jb250ZXh0X2Rlc3Ryb3koY3R4KTsNCi0JcmV0dXJuIE5VTEw7DQotfQ0KLQ0KLS8qKg0K LSAqIERlc3Ryb3kgYSBsaWJtbmwgY29udGV4dC4NCi0gKg0KLSAqIEBwYXJhbSBjdHgNCi0gKiAg IExpYm1ubCBzb2NrZXQgb2YgdGhlIEBwIE5FVExJTktfUk9VVEUga2luZC4NCi0gKi8NCi12b2lk DQotbWx4NV9mbG93X3RjZl9jb250ZXh0X2Rlc3Ryb3koc3RydWN0IG1seDVfZmxvd190Y2ZfY29u dGV4dCAqY3R4KQ0KLXsNCi0JaWYgKCFjdHgpDQotCQlyZXR1cm47DQotCWZsb3dfdGNmX21ubF9z b2NrZXRfZGVzdHJveShjdHgtPm5sKTsNCi0JcnRlX2ZyZWUoY3R4LT5idWYpOw0KLQlydGVfZnJl ZShjdHgpOw0KLX0NCmRpZmYgLS1naXQgYS9tay9ydGUuYXBwLm1rIGIvbWsvcnRlLmFwcC5taw0K aW5kZXggN2M5YjRiNS4uMDUxMjZlZSAxMDA2NDQNCi0tLSBhL21rL3J0ZS5hcHAubWsNCisrKyBi L21rL3J0ZS5hcHAubWsNCkBAIC0xNzUsNyArMTc1LDcgQEAgX0xETElCUy0kKENPTkZJR19SVEVf TElCUlRFX1BNRF9LTkkpICAgICAgICArPSAtbHJ0ZV9wbWRfa25pDQogZW5kaWYNCiBfTERMSUJT LSQoQ09ORklHX1JURV9MSUJSVEVfTElPX1BNRCkgICAgICAgICs9IC1scnRlX3BtZF9saW8NCiBf TERMSUJTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNF9QTUQpICAgICAgICs9IC1scnRlX3BtZF9t bHg0DQotX0xETElCUy0kKENPTkZJR19SVEVfTElCUlRFX01MWDVfUE1EKSAgICAgICArPSAtbHJ0 ZV9wbWRfbWx4NSAtbG1ubA0KK19MRExJQlMtJChDT05GSUdfUlRFX0xJQlJURV9NTFg1X1BNRCkg ICAgICAgKz0gLWxydGVfcG1kX21seDUNCiBpZmVxICgkKENPTkZJR19SVEVfSUJWRVJCU19MSU5L X0RMT1BFTikseSkNCiBfTERMSUJTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNF9QTUQpICAgICAg ICs9IC1sZGwNCiBfTERMSUJTLSQoQ09ORklHX1JURV9MSUJSVEVfTUxYNV9QTUQpICAgICAgICs9 IC1sZGwNCi0tIA0KMS44LjMuMQ0KDQo=