From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id A3591F34C5E for ; Mon, 13 Apr 2026 15:25:12 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B1C174021E; Mon, 13 Apr 2026 17:25:11 +0200 (CEST) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id D6F364014F for ; Mon, 13 Apr 2026 17:25:09 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.18.224.150]) by frasgout.his.huawei.com (SkyGuard) with ESMTPS id 4fvWRJ1M78zJ467W; Mon, 13 Apr 2026 23:24:28 +0800 (CST) Received: from dubpeml100001.china.huawei.com (unknown [7.214.144.137]) by mail.maildlp.com (Postfix) with ESMTPS id 31D4A40571; Mon, 13 Apr 2026 23:25:08 +0800 (CST) Received: from dubpeml500001.china.huawei.com (7.214.147.241) by dubpeml100001.china.huawei.com (7.214.144.137) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.36; Mon, 13 Apr 2026 16:25:07 +0100 Received: from dubpeml500001.china.huawei.com ([7.214.147.241]) by dubpeml500001.china.huawei.com ([7.214.147.241]) with mapi id 15.02.1544.011; Mon, 13 Apr 2026 16:25:07 +0100 From: Konstantin Ananyev To: Stephen Hemminger , "vladimir.medvedkin@intel.com" CC: "dev@dpdk.org" Subject: RE: DPDK ipsec security analysis Thread-Topic: DPDK ipsec security analysis Thread-Index: AQHcx4nl0DMIUjCf2USiYKV9jYAu97Xc/MQQ Date: Mon, 13 Apr 2026 15:25:07 +0000 Message-ID: <20e526943c474289ba8467c1629afcd2@huawei.com> References: <20260408115939.69470675@phoenix.local> In-Reply-To: <20260408115939.69470675@phoenix.local> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.48.146.52] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org DQo+IEkgYW0gYmVpbmcgcHJvYWN0aXZlIGFuZCBjaGVja2luZyBhbGwgdGhlIERQREsgbGlicmFy aWVzIHdpdGggQ2xhdWRlIEFJDQo+IGZvciBzZWN1cml0eSBpc3N1ZXM7IGJldHRlciB0aGF0IHdl IGZpbmQgdGhlbSB0aGFuIHNlY3VyaXR5ICJyZXNlYXJjaGVycyIuDQo+IDINCj4gVG9kYXkncyBB SSBoYXJ2ZXN0IG9mIGlzc3VlcyB3YXM6DQo+IA0KPiAgIDEuIEJ1ZmZlciBPdmVyZmxvdyBSaXNr IChNRURJVU0pIC0gaXBzZWMvc2EuYzozNjMNCj4gICAtIFR1bm5lbCBoZWFkZXIgY29weWluZyB3 aXRob3V0IGJvdW5kcyB2YWxpZGF0aW9uDQo+ICAgLSBDb3VsZCBvdmVyZmxvdyBpZiBjYWxsZWQg ZGlyZWN0bHkgd2l0aG91dCB2YWxpZGF0aW9uDQo+IA0KPiAgIDIuIEludGVnZXIgT3ZlcmZsb3cg KE1FRElVTSkgLSBpcHNlYy9zYS5jOjk5LTE1OA0KPiAgIC0gUmVwbGF5IHdpbmRvdyBzaXplIGNh bGN1bGF0aW9ucyBjb3VsZCBvdmVyZmxvdw0KPiAgIC0gQ291bGQgbGVhZCB0byB1bmRlci1hbGxv Y2F0aW9uIHZ1bG5lcmFiaWxpdGllcw0KPiANCj4gICAzLiBSYWNlIENvbmRpdGlvbiAoTUVESVVN KSAtIGlwc2VjL2lwc2VjX3NhZC5jOjEwMy0xMTINCj4gICAtIE5vbi1hdG9taWMgY291bnRlciB1 cGRhdGVzIGluIGNvbmN1cnJlbnQgc2NlbmFyaW9zDQo+ICAgLSBDb3VsZCBsZWFkIHRvIHJlZmVy ZW5jZSBjb3VudCBpbmNvbnNpc3RlbmNpZXMNCj4gDQo+ICAgNC4gTnVsbCBQb2ludGVyIERlcmVm ZXJlbmNlIChNRURJVU0pIC0gaXBzZWMvc2EuYzo1MC04Mg0KPiAgIC0gTG9naWMgZXJyb3IgaW4g Y3J5cHRvIHRyYW5zZm9ybSB2YWxpZGF0aW9uDQo+ICAgLSBDb3VsZCBjcmFzaCB3aXRoIGludmFs aWQgaW5wdXQNCj4gDQo+IA0KPiBNb3JlIGRldGFpbCB3YXM6DQo+IA0KPiAjIERQREsgSVBzZWMg TGlicmFyeSBTZWN1cml0eSBWdWxuZXJhYmlsaXR5IFJlcG9ydA0KPiANCj4gKipSZXBvcnQgRGF0 ZToqKiBBcHJpbCA4LCAyMDI2DQo+ICoqQW5hbHlzaXMgU2NvcGU6KiogRFBESyBJUHNlYyBMaWJy YXJ5IEltcGxlbWVudGF0aW9uDQo+ICoqTG9jYXRpb246Kiogfi9EUERLL3NlY3VyaXR5L2xpYi9p cHNlYy8NCj4gKipBbmFseXplZCBGaWxlczoqKiBzYS5jLCBpcHNlY19zYWQuYywgZXNwX2luYi5j LCBlc3Bfb3V0Yi5jLCBzYS5oDQo+IA0KPiAtLS0NCj4gDQo+ICMjIEVYRUNVVElWRSBTVU1NQVJZ DQo+IA0KPiBUaGlzIHJlcG9ydCBkZXRhaWxzIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBkaXNj b3ZlcmVkIGluIHRoZSBEUERLIElQc2VjIGxpYnJhcnkNCj4gaW1wbGVtZW50YXRpb24uIFRoZSBJ UHNlYyBsaWJyYXJ5IHByb3ZpZGVzIGNvcmUgZnVuY3Rpb25hbGl0eSBmb3IgRVNQDQo+IChFbmNh cHN1bGF0aW5nIFNlY3VyaXR5IFBheWxvYWQpIHByb3RvY29sIHByb2Nlc3NpbmcsIFNlY3VyaXR5 IEFzc29jaWF0aW9uIChTQSkNCj4gbWFuYWdlbWVudCwgYW5kIFNlY3VyaXR5IEFzc29jaWF0aW9u IERhdGFiYXNlIChTQUQpIG9wZXJhdGlvbnMuDQo+IA0KPiAqKktleSBGaW5kaW5nczoqKg0KPiAt ICoqNyBkaXN0aW5jdCB2dWxuZXJhYmlsaXRpZXMqKiBpZGVudGlmaWVkDQo+IC0gKioyIE1FRElV TSBzZXZlcml0eSoqIGlzc3VlcyByZXF1aXJpbmcgaW1tZWRpYXRlIGF0dGVudGlvbg0KPiAtICoq MyBNRURJVU0gc2V2ZXJpdHkqKiBpc3N1ZXMgcmVxdWlyaW5nIHByaW9yaXR5IGZpeGVzDQo+IC0g KioyIExPVyBzZXZlcml0eSoqIGlzc3VlcyBmb3IgaGFyZGVuaW5nDQo+IC0gUHJpbWFyeSBjb25j ZXJuczogQnVmZmVyIG92ZXJmbG93IHJpc2tzLCBpbnRlZ2VyIG92ZXJmbG93LCByYWNlIGNvbmRp dGlvbnMsIGFuZA0KPiBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2VzDQo+IA0KPiAtLS0NCj4gDQo+ ICMjIFRBQkxFIE9GIENPTlRFTlRTDQo+IA0KPiAxLiBbVnVsbmVyYWJpbGl0eSBTdW1tYXJ5XSgj dnVsbmVyYWJpbGl0eS1zdW1tYXJ5KQ0KPiAyLiBbQ3JpdGljYWwgUGF0aCBBbmFseXNpc10oI2Ny aXRpY2FsLXBhdGgtYW5hbHlzaXMpDQo+IDMuIFtEZXRhaWxlZCBWdWxuZXJhYmlsaXR5IFJlcG9y dHNdKCNkZXRhaWxlZC12dWxuZXJhYmlsaXR5LXJlcG9ydHMpDQo+IDQuIFtBdHRhY2sgU2NlbmFy aW9zXSgjYXR0YWNrLXNjZW5hcmlvcykNCj4gNS4gW1JlbWVkaWF0aW9uIFJlY29tbWVuZGF0aW9u c10oI3JlbWVkaWF0aW9uLXJlY29tbWVuZGF0aW9ucykNCj4gNi4gW1NlY3VyaXR5IEhhcmRlbmlu ZyBTdWdnZXN0aW9uc10oI3NlY3VyaXR5LWhhcmRlbmluZy1zdWdnZXN0aW9ucykNCj4gDQo+IC0t LQ0KPiANCj4gIyMgVlVMTkVSQUJJTElUWSBTVU1NQVJZDQo+IA0KPiB8IElEIHwgVnVsbmVyYWJp bGl0eSBUeXBlIHwgU2V2ZXJpdHkgfCBGaWxlIHwgTGluZXMgfCBDVlNTIEVzdC4gfA0KPiB8LS0t LXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS18LS0tLS0tLS0t LS18DQo+IHwgSVBTRUMtMDAxIHwgQnVmZmVyIE92ZXJmbG93IC0gVHVubmVsIEhlYWRlciB8IE1F RElVTSB8IHNhLmMgfCAzNjMtMzY4IHwgNi41IHwNCj4gfCBJUFNFQy0wMDIgfCBJbnRlZ2VyIE92 ZXJmbG93IC0gU2l6ZSBDYWxjdWxhdGlvbiB8IE1FRElVTSB8IHNhLmMgfCAxMDUsIDE1NSwgMTU3 DQo+IHwgNy4wIHwNCj4gfCBJUFNFQy0wMDMgfCBOdWxsIFBvaW50ZXIgRGVyZWZlcmVuY2UgfCBN RURJVU0gfCBzYS5jIHwgNTAtNTYgfCA1LjUgfA0KPiB8IElQU0VDLTAwNCB8IFJhY2UgQ29uZGl0 aW9uIC0gQ291bnRlciBVcGRhdGUgfCBNRURJVU0gfCBpcHNlY19zYWQuYyB8IDExMCwNCj4gMTEy IHwgNC4wIHwNCj4gfCBJUFNFQy0wMDUgfCBOb24tQXRvbWljIFN0YXRpc3RpY3MgVXBkYXRlIHwg TUVESVVNIHwgZXNwXyouYywgc2EuYyB8IE11bHRpcGxlIHwNCj4gMy4wIHwNCj4gfCBJUFNFQy0w MDYgfCBUaW1pbmcgQXR0YWNrIC0gU0FEIExvb2t1cCB8IExPVyB8IGlwc2VjX3NhZC5jIHwgNzct NzggfCAzLjUgfA0KPiB8IElQU0VDLTAwNyB8IE5vbi1Db25zdGFudCBUaW1lIENvbXBhcmlzb24g fCBMT1cgfCBpcHNlY19zYWQuYyB8IDM2MS0zNjIgfA0KPiAyLjAgfA0KDQpJUFNFQy0wMDMgYW5k IElQU0VDLTAwNSBsb29rcyBsaWtlIGEgcmVhbCBvbmVzIHRvIG1lLg0KUmVzdCBvbmVzIEkgYmVs aWV2ZSBhcmUgZmFsc2UtcG9zaXRpdmVzLg0KDQo+IC0tLQ0KPiANCj4gIyMgQ1JJVElDQUwgUEFU SCBBTkFMWVNJUw0KPiANCj4gIyMjIERhdGEgRmxvdyBUaHJvdWdoIElQc2VjIExpYnJhcnkNCj4g DQo+IGBgYA0KDQpUaGF0J3Mgc2NoZW1hIGJlbG93IGlzIGp1c3Qgd3JvbmcgLSBpdCBtaXhlcyBi b3RoIENQIGFuZCBEUCBwYXRocyB0b2dldGhlci4NCg0KPiBQYWNrZXQgSW5wdXQNCj4gICAgIOKG kw0KPiBTQSBJbml0aWFsaXphdGlvbiAoc2EuYykNCj4gICAgIOKUnOKUgOKGkiBUdW5uZWwgTW9k ZTogZXNwX291dGJfdHVuX2luaXQoKSBbVlVMTjogSVBTRUMtMDAxLCBJUFNFQy0wMDJdDQo+ICAg ICDilJTilIDihpIgVHJhbnNwb3J0IE1vZGU6IGVzcF9vdXRiX2luaXQoKQ0KPiAgICAg4oaTDQo+ IFNBRCBPcGVyYXRpb25zIChpcHNlY19zYWQuYykNCj4gICAgIOKUnOKUgOKGkiBTQUQgQWRkL0Rl bGV0ZSBbVlVMTjogSVBTRUMtMDA0XQ0KPiAgICAg4pSU4pSA4oaSIFNBRCBMb29rdXAgW1ZVTE46 IElQU0VDLTAwNl0NCj4gICAgIOKGkw0KPiBFU1AgUHJvY2Vzc2luZyAoZXNwX2luYi5jLCBlc3Bf b3V0Yi5jKQ0KPiAgICAg4pSU4pSA4oaSIFN0YXRpc3RpY3MgVXBkYXRlIFtWVUxOOiBJUFNFQy0w MDVdDQo+ICAgICDihpMNCj4gUGFja2V0IE91dHB1dA0KPiBgYGANCj4gDQo+ICoqQXR0YWNrIFN1 cmZhY2U6KioNCj4gLSBDb250cm9sIHBsYW5lOiBTQSBpbml0aWFsaXphdGlvbiBhbmQgU0FEIG1h bmFnZW1lbnQNCj4gLSBEYXRhIHBsYW5lOiBFU1AgcGFja2V0IHByb2Nlc3NpbmcgYW5kIHN0YXRp c3RpY3MNCj4gLSBDb25jdXJyZW50IGFjY2VzczogTXVsdGktdGhyZWFkZWQgU0Egb3BlcmF0aW9u cw0KPiANCj4gLS0tDQo+IA0KPiAjIyBERVRBSUxFRCBWVUxORVJBQklMSVRZIFJFUE9SVFMNCj4g DQo+ICMjIyBJUFNFQy0wMDE6IEJ1ZmZlciBPdmVyZmxvdyBpbiBUdW5uZWwgSGVhZGVyIENvcHkN Cj4gDQo+ICoqU2V2ZXJpdHk6KiogTUVESVVNDQo+ICoqQ1dFOioqIENXRS0xMjAgKEJ1ZmZlciBD b3B5IHdpdGhvdXQgQ2hlY2tpbmcgU2l6ZSBvZiBJbnB1dCkNCj4gKipGaWxlOioqIGBzYS5jYA0K PiAqKkZ1bmN0aW9uOioqIGBlc3Bfb3V0Yl90dW5faW5pdCgpYA0KPiAqKkxpbmVzOioqIDM2My0z NjgNCj4gDQo+ICMjIyMgVnVsbmVyYWJsZSBDb2RlDQo+IA0KPiBgYGBjDQo+IHN0YXRpYyB2b2lk DQo+IGVzcF9vdXRiX3R1bl9pbml0KHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBjb25zdCBzdHJ1 Y3QgcnRlX2lwc2VjX3NhX3BybSAqcHJtKQ0KPiB7DQo+ICAgICBzYS0+cHJvdG8gPSBwcm0tPnR1 bi5uZXh0X3Byb3RvOw0KPiAgICAgc2EtPmhkcl9sZW4gPSBwcm0tPnR1bi5oZHJfbGVuOw0KPiAg ICAgc2EtPmhkcl9sM19vZmYgPSBwcm0tPnR1bi5oZHJfbDNfb2ZmOw0KPiANCj4gICAgIG1lbWNw eShzYS0+aGRyLCBwcm0tPnR1bi5oZHIsIHBybS0+dHVuLmhkcl9sZW4pOyAgLy8gTElORSAzNjM6 IFVOQ0hFQ0tFRA0KPiBDT1BZDQo+IA0KPiAgICAgLyogaW5zZXJ0IFVEUCBoZWFkZXIgaWYgVURQ IGVuY2Fwc3VsYXRpb24gaXMgZW5hYmxlZCAqLw0KPiAgICAgaWYgKHNhLT50eXBlICYgUlRFX0lQ U0VDX1NBVFBfTkFUVF9FTkFCTEUpIHsNCj4gICAgICAgICBzdHJ1Y3QgcnRlX3VkcF9oZHIgKnVk cGggPSAoc3RydWN0IHJ0ZV91ZHBfaGRyICopDQo+ICAgICAgICAgICAgICAgICAmc2EtPmhkcltw cm0tPnR1bi5oZHJfbGVuXTsgIC8vIExJTkUgMzY4OiBVTkNIRUNLRUQgT0ZGU0VUDQo+ICAgICAg ICAgc2EtPmhkcl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBydGVfdWRwX2hkcik7DQo+ICAgICAgICAg dWRwaC0+c3JjX3BvcnQgPSBydGVfY3B1X3RvX2JlXzE2KHBybS0+aXBzZWNfeGZvcm0udWRwLnNw b3J0KTsNCj4gICAgICAgICB1ZHBoLT5kc3RfcG9ydCA9IHJ0ZV9jcHVfdG9fYmVfMTYocHJtLT5p cHNlY194Zm9ybS51ZHAuZHBvcnQpOw0KPiAgICAgICAgIHVkcGgtPmRncmFtX2Nrc3VtID0gMDsN Cj4gICAgIH0NCj4gfQ0KPiBgYGANCj4gDQo+ICMjIyMgQW5hbHlzaXMNCj4gDQo+ICoqUHJpbWFy eSBJc3N1ZSAoTGluZSAzNjMpOioqDQo+IC0gYG1lbWNweSgpYCBjb3BpZXMgYHBybS0+dHVuLmhk cl9sZW5gIGJ5dGVzIGZyb20gYHBybS0+dHVuLmhkcmAgdG8gYHNhLT5oZHJgDQo+IC0gRGVzdGlu YXRpb24gYnVmZmVyIGBzYS0+aGRyYCBpcyBkZWZpbmVkIGFzIGB1aW50OF90IGhkcltJUFNFQ19N QVhfSERSX1NJWkVdYA0KPiAoNjQgYnl0ZXMpDQo+IC0gTm8gYm91bmRzIGNoZWNrIGJlZm9yZSB0 aGUgY29weSBvcGVyYXRpb24NCj4gLSBJZiBgcHJtLT50dW4uaGRyX2xlbiA+IElQU0VDX01BWF9I RFJfU0laRWAsIGJ1ZmZlciBvdmVyZmxvdyBvY2N1cnMNCj4gDQo+ICoqU2Vjb25kYXJ5IElzc3Vl IChMaW5lIDM2OCk6KioNCj4gLSBQb2ludGVyIGFyaXRobWV0aWM6IGAmc2EtPmhkcltwcm0tPnR1 bi5oZHJfbGVuXWANCj4gLSBXcml0ZXMgVURQIGhlYWRlciBhdCBvZmZzZXQgYHBybS0+dHVuLmhk cl9sZW5gDQo+IC0gQWZ0ZXIgYWRkaW5nIFVEUCBoZWFkZXIsIHRvdGFsIHNpemUgYmVjb21lczog YHBybS0+dHVuLmhkcl9sZW4gKyBzaXplb2Yoc3RydWN0DQo+IHJ0ZV91ZHBfaGRyKWAgKGhkcl9s ZW4gKyA4IGJ5dGVzKQ0KPiAtIE5vIHZhbGlkYXRpb24gdGhhdCBgcHJtLT50dW4uaGRyX2xlbiAr IDggPD0gSVBTRUNfTUFYX0hEUl9TSVpFYA0KPiAtIENvdWxkIHdyaXRlIGJleW9uZCBgc2EtPmhk cmAgYnVmZmVyIGJvdW5kcw0KPiANCj4gKipNaXRpZ2F0aW5nIEZhY3RvcjoqKg0KPiBUaGUgZnVu Y3Rpb24gYHJ0ZV9pcHNlY19zYV9pbml0KClgIChsaW5lIDU4NikgcGVyZm9ybXMgYSBib3VuZHMg Y2hlY2s6DQo+IGBgYGMNCj4gaWYgKHBybS0+aXBzZWNfeGZvcm0ubW9kZSA9PSBSVEVfU0VDVVJJ VFlfSVBTRUNfU0FfTU9ERV9UVU5ORUwpIHsNCj4gICAgIHVpbnQzMl90IGhsZW4gPSBwcm0tPnR1 bi5oZHJfbGVuOw0KPiAgICAgaWYgKHNhLT50eXBlICYgUlRFX0lQU0VDX1NBVFBfTkFUVF9FTkFC TEUpDQo+ICAgICAgICAgaGxlbiArPSBzaXplb2Yoc3RydWN0IHJ0ZV91ZHBfaGRyKTsNCj4gICAg IGlmIChobGVuID4gc2l6ZW9mKHNhLT5oZHIpKSAgLy8gTElORSA1ODY6IEJPVU5EUyBDSEVDSw0K PiAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiB9DQo+IGBgYA0KPiANCj4gSG93ZXZlciwgdGhp cyBwcm90ZWN0aW9uIG9ubHkgYXBwbGllcyBpZiBgcnRlX2lwc2VjX3NhX2luaXQoKWAgaXMgdGhl IHNvbGUgY2FsbGVyIG9mDQo+IGBlc3Bfb3V0Yl90dW5faW5pdCgpYC4NCg0KWWVzLCBydGVfaXBz ZWNfc2FfaW5pdCgpIGlzIHRoZSAqb25seSogY2FsbGVyIG9mIGVzcF9vdXRiX3R1bl9pbml0KCkg Lg0KVGhhdCdzIHdoeSB0aGVyZSBubyBuZWVkIHRvIGV4dHJhIGJvdW5kcyBjaGVja3MgaW4gZXNw X291dGJfdHVuX2luaXQoKSAtDQphbGwgY2hlY2tzIGFscmVhZHkgc3VwcG9zZWQgdG8gYmUgZG9u ZSBhdCBoaWdoZXIgbGV2ZWwuIA0KRmFsc2UgcG9zaXRpdmUuDQoNCj4gDQo+ICMjIyMgRXhwbG9p dGFiaWxpdHkNCj4gDQo+ICoqQXR0YWNrIFZlY3RvcjoqKg0KPiAxLiBBdHRhY2tlciBjb250cm9s cyBTQSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIHRocm91Z2ggY29udHJvbCBwbGFuZSBBUEkN Cj4gMi4gUHJvdmlkZXMgYHBybS0+dHVuLmhkcl9sZW5gID4gNjQgYnl0ZXMNCj4gMy4gSWYgYGVz cF9vdXRiX3R1bl9pbml0KClgIGlzIGNhbGxlZCBkaXJlY3RseSBvciB2YWxpZGF0aW9uIGlzIGJ5 cGFzc2VkLCBidWZmZXINCj4gb3ZlcmZsb3cgb2NjdXJzDQo+IA0KPiAqKkltcGFjdDoqKg0KPiAt IFN0YWNrLWJhc2VkIGJ1ZmZlciBvdmVyZmxvdyAoc3RydWN0IHJ0ZV9pcHNlY19zYSBpcyBjYWNo ZS1hbGlnbmVkKQ0KPiAtIE92ZXJ3cml0ZSBhZGphY2VudCBzdHJ1Y3R1cmUgbWVtYmVyczoNCj4g ICAtIGBzcW5gIHVuaW9uIChzZXF1ZW5jZSBudW1iZXIgc3RhdGUpDQo+ICAgLSBgc3RhdGlzdGlj c2Agc3RydWN0dXJlDQo+IC0gUG90ZW50aWFsIGNvZGUgZXhlY3V0aW9uIGlmIGZ1bmN0aW9uIHBv aW50ZXJzIG9yIHJldHVybiBhZGRyZXNzZXMgYXJlDQo+IG92ZXJ3cml0dGVuDQo+IC0gTWVtb3J5 IGNvcnJ1cHRpb24gbGVhZGluZyB0byBjcmFzaGVzIG9yIHVuZGVmaW5lZCBiZWhhdmlvcg0KPiAN Cj4gKipDVlNTIHYzLjEgU2NvcmU6KiogNi41IChNRURJVU0pDQo+IC0gQXR0YWNrIFZlY3Rvcjog TG9jYWwgKHJlcXVpcmVzIGNvbnRyb2wgcGxhbmUgYWNjZXNzKQ0KPiAtIEF0dGFjayBDb21wbGV4 aXR5OiBMb3cNCj4gLSBQcml2aWxlZ2VzIFJlcXVpcmVkOiBMb3cNCj4gLSBJbXBhY3Q6IEhpZ2gg KG1lbW9yeSBjb3JydXB0aW9uLCBwb3RlbnRpYWwgY29kZSBleGVjdXRpb24pDQo+IA0KPiAjIyMj IFByb29mIG9mIENvbmNlcHQNCj4gDQo+IGBgYGMNCj4gLy8gTWFsaWNpb3VzIFNBIHBhcmFtZXRl cnMNCj4gc3RydWN0IHJ0ZV9pcHNlY19zYV9wcm0gcHJtOw0KPiBwcm0udHVuLmhkcl9sZW4gPSAx Mjg7ICAvLyBFeGNlZWRzIElQU0VDX01BWF9IRFJfU0laRSAoNjQpDQo+IHBybS50eXBlID0gUlRF X0lQU0VDX1NBVFBfTkFUVF9FTkFCTEU7DQo+IA0KPiAvLyBJZiB2YWxpZGF0aW9uIGlzIGJ5cGFz c2VkOg0KPiBlc3Bfb3V0Yl90dW5faW5pdChzYSwgJnBybSk7DQo+IC8vIFJlc3VsdDogT3Zlcndy aXRlIDY0KyBieXRlcyBiZXlvbmQgc2EtPmhkciBidWZmZXINCj4gYGBgDQo+IA0KPiAjIyMjIFJl Y29tbWVuZGVkIEZpeA0KPiANCj4gKipPcHRpb24gMTogQWRkIGV4cGxpY2l0IGJvdW5kcyBjaGVj ayBpbiBlc3Bfb3V0Yl90dW5faW5pdCgpKioNCj4gYGBgYw0KPiBzdGF0aWMgaW50DQo+IGVzcF9v dXRiX3R1bl9pbml0KHN0cnVjdCBydGVfaXBzZWNfc2EgKnNhLCBjb25zdCBzdHJ1Y3QgcnRlX2lw c2VjX3NhX3BybSAqcHJtKQ0KPiB7DQo+ICAgICB1aW50MzJfdCBobGVuID0gcHJtLT50dW4uaGRy X2xlbjsNCj4gDQo+ICAgICAvKiBDYWxjdWxhdGUgdG90YWwgaGVhZGVyIGxlbmd0aCBpbmNsdWRp bmcgVURQIGlmIG5lZWRlZCAqLw0KPiAgICAgaWYgKHBybS0+dHlwZSAmIFJURV9JUFNFQ19TQVRQ X05BVFRfRU5BQkxFKQ0KPiAgICAgICAgIGhsZW4gKz0gc2l6ZW9mKHN0cnVjdCBydGVfdWRwX2hk cik7DQo+IA0KPiAgICAgLyogVmFsaWRhdGUgdG90YWwgc2l6ZSBiZWZvcmUgY29weSAqLw0KPiAg ICAgaWYgKGhsZW4gPiBzaXplb2Yoc2EtPmhkcikpDQo+ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7 DQo+IA0KPiAgICAgc2EtPnByb3RvID0gcHJtLT50dW4ubmV4dF9wcm90bzsNCj4gICAgIHNhLT5o ZHJfbGVuID0gcHJtLT50dW4uaGRyX2xlbjsNCj4gICAgIHNhLT5oZHJfbDNfb2ZmID0gcHJtLT50 dW4uaGRyX2wzX29mZjsNCj4gDQo+ICAgICBtZW1jcHkoc2EtPmhkciwgcHJtLT50dW4uaGRyLCBw cm0tPnR1bi5oZHJfbGVuKTsNCj4gDQo+ICAgICBpZiAocHJtLT50eXBlICYgUlRFX0lQU0VDX1NB VFBfTkFUVF9FTkFCTEUpIHsNCj4gICAgICAgICBzdHJ1Y3QgcnRlX3VkcF9oZHIgKnVkcGggPSAo c3RydWN0IHJ0ZV91ZHBfaGRyICopDQo+ICAgICAgICAgICAgICAgICAmc2EtPmhkcltwcm0tPnR1 bi5oZHJfbGVuXTsNCj4gICAgICAgICBzYS0+aGRyX2xlbiArPSBzaXplb2Yoc3RydWN0IHJ0ZV91 ZHBfaGRyKTsNCj4gICAgICAgICB1ZHBoLT5zcmNfcG9ydCA9IHJ0ZV9jcHVfdG9fYmVfMTYocHJt LT5pcHNlY194Zm9ybS51ZHAuc3BvcnQpOw0KPiAgICAgICAgIHVkcGgtPmRzdF9wb3J0ID0gcnRl X2NwdV90b19iZV8xNihwcm0tPmlwc2VjX3hmb3JtLnVkcC5kcG9ydCk7DQo+ICAgICAgICAgdWRw aC0+ZGdyYW1fY2tzdW0gPSAwOw0KPiAgICAgfQ0KPiANCj4gICAgIHJldHVybiAwOw0KPiB9DQo+ IGBgYA0KPiANCj4gKipPcHRpb24gMjogVXNlIHNhZmUgY29weSBmdW5jdGlvbioqDQo+IGBgYGMN Cj4gLyogVXNlIG1lbWNweV9zIG9yIG1hbnVhbCBib3VuZHMtY2hlY2tlZCBjb3B5ICovDQo+IGlm IChwcm0tPnR1bi5oZHJfbGVuID4gc2l6ZW9mKHNhLT5oZHIpKQ0KPiAgICAgcmV0dXJuIC1FSU5W QUw7DQo+IA0KPiBzaXplX3QgY29weV9sZW4gPSBSVEVfTUlOKHBybS0+dHVuLmhkcl9sZW4sIHNp emVvZihzYS0+aGRyKSk7DQo+IG1lbWNweShzYS0+aGRyLCBwcm0tPnR1bi5oZHIsIGNvcHlfbGVu KTsNCj4gYGBgDQo+IA0KPiAtLS0NCj4gDQo+ICMjIyBJUFNFQy0wMDI6IEludGVnZXIgT3ZlcmZs b3cgaW4gUmVwbGF5IFdpbmRvdyBTaXplIENhbGN1bGF0aW9uDQo+IA0KPiAqKlNldmVyaXR5Oioq IE1FRElVTQ0KPiAqKkNXRToqKiBDV0UtMTkwIChJbnRlZ2VyIE92ZXJmbG93IG9yIFdyYXBhcm91 bmQpDQo+ICoqRmlsZToqKiBgc2EuY2ANCj4gKipGdW5jdGlvbnM6KiogYHJzbl9zaXplKClgLCBg aXBzZWNfc2Ffc2l6ZSgpYA0KPiAqKkxpbmVzOioqIDEwNSwgMTU1LCAxNTcNCj4gDQo+ICMjIyMg VnVsbmVyYWJsZSBDb2RlDQo+IA0KPiBgYGBjDQo+IHN0YXRpYyBzaXplX3QNCj4gcnNuX3NpemUo dWludDMyX3QgbmJfYnVja2V0KQ0KPiB7DQo+ICAgICBzaXplX3Qgc3o7DQo+ICAgICBzdHJ1Y3Qg cmVwbGF5X3NxbiAqcnNuOw0KPiANCj4gICAgIHN6ID0gc2l6ZW9mKCpyc24pICsgbmJfYnVja2V0 ICogc2l6ZW9mKHJzbi0+d2luZG93WzBdKTsgIC8vIExJTkUgMTA1OiBNVUxUSVBMWQ0KPiBPVkVS RkxPVw0KPiAgICAgc3ogPSBSVEVfQUxJR05fQ0VJTChzeiwgUlRFX0NBQ0hFX0xJTkVfU0laRSk7 DQo+ICAgICByZXR1cm4gc3o7DQo+IH0NCj4gDQo+IHN0YXRpYyBpbnQzMl90DQo+IGlwc2VjX3Nh X3NpemUodWludDY0X3QgdHlwZSwgdWludDMyX3QgKnduZF9zeiwgdWludDMyX3QgKm5iX2J1Y2tl dCkNCj4gew0KPiAgICAgdWludDMyX3Qgbiwgc3osIHdzejsNCj4gDQo+ICAgICB3c3ogPSAqd25k X3N6Ow0KPiAgICAgbiA9IDA7DQo+IA0KPiAgICAgaWYgKCh0eXBlICYgUlRFX0lQU0VDX1NBVFBf RElSX01BU0spID09IFJURV9JUFNFQ19TQVRQX0RJUl9JQikgew0KPiAgICAgICAgIHdzeiA9ICgo dHlwZSAmIFJURV9JUFNFQ19TQVRQX0VTTl9NQVNLKSA9PQ0KPiAgICAgICAgICAgICBSVEVfSVBT RUNfU0FUUF9FU05fRElTQUJMRSkgPw0KPiAgICAgICAgICAgICB3c3ogOiBSVEVfTUFYKHdzeiwg KHVpbnQzMl90KSBsaWIvaXBzZWMvc2EuaCk7DQo+ICAgICAgICAgaWYgKHdzeiAhPSAwKQ0KPiAg ICAgICAgICAgICBuID0gcmVwbGF5X251bV9idWNrZXQod3N6KTsNCj4gICAgIH0NCj4gDQo+ICAg ICBpZiAobiA+IFdJTkRPV19CVUNLRVRfTUFYKSAgLy8gTElORSAxNDc6IEJPVU5EUyBDSEVDSw0K PiAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiANCj4gICAgICp3bmRfc3ogPSB3c3o7DQo+ICAg ICAqbmJfYnVja2V0ID0gbjsNCj4gDQo+ICAgICBzeiA9IHJzbl9zaXplKG4pOw0KPiAgICAgaWYg KCh0eXBlICYgUlRFX0lQU0VDX1NBVFBfU1FOX01BU0spID09IFJURV9JUFNFQ19TQVRQX1NRTl9B VE9NKQ0KPiAgICAgICAgIHN6ICo9IFJFUExBWV9TUU5fTlVNOyAgLy8gTElORSAxNTU6IE1VTFRJ UExZIE9WRVJGTE9XDQo+IA0KPiAgICAgc3ogKz0gc2l6ZW9mKHN0cnVjdCBydGVfaXBzZWNfc2Ep OyAgLy8gTElORSAxNTc6IEFERElUSU9OIE9WRVJGTE9XDQo+ICAgICByZXR1cm4gc3o7DQoNCldJ TkRPV19CVUNLRVRfTUFYID09IDJeMTUNClJFUExBWV9TUU5fTlVNID09IDINCnNpemVvZigqcnNu KSA9PSAyNA0Kc2l6ZW9mKHJzbi0+d2luZG93WzBdKSA9PSA4DQpuYl9idWNrZXQgPD0gV0lORE9X X0JVQ0tFVF9NQVgNClNvOg0KTUFYKHNpemVvZigqcnNuKSArIG5iX2J1Y2tldCAqIHNpemVvZihy c24tPndpbmRvd1swXSkpID09ICAgMjYyMTY4DQoyNjIxNjgqMiA9PSA1MjQzMzYgDQpUaGF0J3Mg bXVjaCBsZXNzIHRoZW4gbWF4IG9mIHNpemVfdCwgZXZlbiBpZiB3ZSBhc3N1bWUgdGhhdCBzaXpl b2lmKHNpemVfdCkgPT0gNA0KRmFsc2UgcG9zaXRpdmUuDQoNCj4gfQ0KPiBgYGANCj4gDQo+ICMj IyMgQW5hbHlzaXMNCj4gDQo+ICoqSXNzdWUgMSAoTGluZSAxMDUpOiBNdWx0aXBsaWNhdGlvbiBP dmVyZmxvdyoqDQo+IC0gYG5iX2J1Y2tldCAqIHNpemVvZihyc24tPndpbmRvd1swXSlgIGNhbiBv dmVyZmxvdw0KPiAtIGBzaXplb2YocnNuLT53aW5kb3dbMF0pYCBpcyB0eXBpY2FsbHkgOCBieXRl cyAodWludDY0X3QpDQo+IC0gSWYgYG5iX2J1Y2tldGAgaXMgbGFyZ2UgKG5lYXIgVUlOVDMyX01B WCksIG11bHRpcGxpY2F0aW9uIG92ZXJmbG93cw0KPiAtIE92ZXJmbG93IHdyYXBzIHRvIHNtYWxs IHZhbHVlLCBsZWFkaW5nIHRvIHVuZGVyLWFsbG9jYXRpb24NCj4gDQo+ICoqSXNzdWUgMiAoTGlu ZSAxNTUpOiBNdWx0aXBsaWNhdGlvbiBieSBSRVBMQVlfU1FOX05VTSoqDQo+IC0gYFJFUExBWV9T UU5fTlVNYCBpcyAyIChkZWZpbmVkIGluIHNhLmg6NTYpDQo+IC0gSWYgYHN6YCBmcm9tIGByc25f c2l6ZSgpYCBpcyBhbHJlYWR5IGxhcmdlLCBkb3VibGluZyBpdCBjb3VsZCBvdmVyZmxvdw0KPiAt IGBzemAgaXMgYHVpbnQzMl90YCwgbWF4IHZhbHVlIDQsMjk0LDk2NywyOTUNCj4gLSBPdmVyZmxv dyB3cmFwcyB0byBzbWFsbCB2YWx1ZQ0KPiANCj4gKipJc3N1ZSAzIChMaW5lIDE1Nyk6IEFkZGl0 aW9uIE92ZXJmbG93KioNCj4gLSBBZGRpbmcgYHNpemVvZihzdHJ1Y3QgcnRlX2lwc2VjX3NhKWAg dG8gYHN6YA0KPiAtIElmIGBzemAgaXMgYWxyZWFkeSBuZWFyIFVJTlQzMl9NQVgsIGFkZGl0aW9u IG92ZXJmbG93cw0KPiAtIFJldHVybnMgc21hbGwgd3JhcHBlZCB2YWx1ZSBhcyBhbGxvY2F0aW9u IHNpemUNCj4gDQo+ICoqTWl0aWdhdGluZyBGYWN0b3I6KioNCj4gTGluZSAxNDcgY2hlY2tzIGBp ZiAobiA+IFdJTkRPV19CVUNLRVRfTUFYKWAgd2hpY2ggbGltaXRzIGBuYl9idWNrZXRgLg0KPiBI b3dldmVyLCBgV0lORE9XX0JVQ0tFVF9NQVhgIHZhbHVlIGlzIG5vdCB2aXNpYmxlIGluIHRoaXMg Y29udGV4dC4NCj4gDQo+ICMjIyMgRXhwbG9pdGFiaWxpdHkNCj4gDQo+ICoqQXR0YWNrIFZlY3Rv cjoqKg0KPiAxLiBBdHRhY2tlciByZXF1ZXN0cyBTQSB3aXRoIGxhcmdlIHJlcGxheSB3aW5kb3cg c2l6ZQ0KPiAyLiBgcmVwbGF5X251bV9idWNrZXQoKWAgY2FsY3VsYXRlcyBsYXJnZSBgbmJfYnVj a2V0YCB2YWx1ZQ0KPiAzLiBJbnRlZ2VyIG92ZXJmbG93IGluIHNpemUgY2FsY3VsYXRpb25zDQo+ IDQuIGBydGVfem1hbGxvY19zb2NrZXQoKWAgYWxsb2NhdGVzIHVuZGVyc2l6ZWQgYnVmZmVyDQo+ IDUuIFN1YnNlcXVlbnQgb3BlcmF0aW9ucyB3cml0ZSBiZXlvbmQgYWxsb2NhdGVkIG1lbW9yeQ0K PiANCj4gKipJbXBhY3Q6KioNCj4gLSBIZWFwLWJhc2VkIGJ1ZmZlciBvdmVyZmxvdw0KPiAtIE1l bW9yeSBjb3JydXB0aW9uIGluIFNBIHN0cnVjdHVyZQ0KPiAtIFBvdGVudGlhbCBhcmJpdHJhcnkg Y29kZSBleGVjdXRpb24gdGhyb3VnaCBoZWFwIGV4cGxvaXRhdGlvbg0KPiAtIENyYXNoL0RvUyB0 aHJvdWdoIG1lbW9yeSBjb3JydXB0aW9uDQo+IA0KPiAqKkNWU1MgdjMuMSBTY29yZToqKiA3LjAg KEhJR0gpDQo+IC0gQXR0YWNrIFZlY3RvcjogTG9jYWwNCj4gLSBBdHRhY2sgQ29tcGxleGl0eTog TG93DQo+IC0gSW1wYWN0OiBIaWdoIChoZWFwIGNvcnJ1cHRpb24sIGNvZGUgZXhlY3V0aW9uIHBv dGVudGlhbCkNCj4gDQo+ICMjIyMgUmVjb21tZW5kZWQgRml4DQo+IA0KPiBgYGBjDQo+IHN0YXRp YyBzaXplX3QNCj4gcnNuX3NpemUodWludDMyX3QgbmJfYnVja2V0KQ0KPiB7DQo+ICAgICBzaXpl X3Qgc3o7DQo+ICAgICBzdHJ1Y3QgcmVwbGF5X3NxbiAqcnNuOw0KPiANCj4gICAgIC8qIENoZWNr IGZvciBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyAqLw0KPiAgICAgaWYgKG5iX2J1Y2tldCA+IChT SVpFX01BWCAtIHNpemVvZigqcnNuKSkgLyBzaXplb2YocnNuLT53aW5kb3dbMF0pKQ0KPiAgICAg ICAgIHJldHVybiAwOyAgLy8gU2lnbmFsIGVycm9yDQo+IA0KPiAgICAgc3ogPSBzaXplb2YoKnJz bikgKyBuYl9idWNrZXQgKiBzaXplb2YocnNuLT53aW5kb3dbMF0pOw0KPiANCj4gICAgIC8qIENo ZWNrIGZvciBhbGlnbm1lbnQgb3ZlcmZsb3cgKi8NCj4gICAgIGlmIChzeiA+IFNJWkVfTUFYIC0g UlRFX0NBQ0hFX0xJTkVfU0laRSArIDEpDQo+ICAgICAgICAgcmV0dXJuIDA7DQo+IA0KPiAgICAg c3ogPSBSVEVfQUxJR05fQ0VJTChzeiwgUlRFX0NBQ0hFX0xJTkVfU0laRSk7DQo+ICAgICByZXR1 cm4gc3o7DQo+IH0NCj4gDQo+IHN0YXRpYyBpbnQzMl90DQo+IGlwc2VjX3NhX3NpemUodWludDY0 X3QgdHlwZSwgdWludDMyX3QgKnduZF9zeiwgdWludDMyX3QgKm5iX2J1Y2tldCkNCj4gew0KPiAg ICAgdWludDMyX3Qgbiwgc3osIHdzejsNCj4gDQo+ICAgICAvKiAuLi4gZXhpc3RpbmcgY29kZSAu Li4gKi8NCj4gDQo+ICAgICBzeiA9IHJzbl9zaXplKG4pOw0KPiAgICAgaWYgKHN6ID09IDApICAv LyBDaGVjayBmb3Igb3ZlcmZsb3cNCj4gICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAg ICBpZiAoKHR5cGUgJiBSVEVfSVBTRUNfU0FUUF9TUU5fTUFTSykgPT0gUlRFX0lQU0VDX1NBVFBf U1FOX0FUT00pIHsNCj4gICAgICAgICAvKiBDaGVjayBmb3IgbXVsdGlwbGljYXRpb24gb3ZlcmZs b3cgYmVmb3JlIGRvdWJsaW5nICovDQo+ICAgICAgICAgaWYgKHN6ID4gVUlOVDMyX01BWCAvIFJF UExBWV9TUU5fTlVNKQ0KPiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gICAgICAgICBz eiAqPSBSRVBMQVlfU1FOX05VTTsNCj4gICAgIH0NCj4gDQo+ICAgICAvKiBDaGVjayBmb3IgYWRk aXRpb24gb3ZlcmZsb3cgKi8NCj4gICAgIGlmIChzeiA+IFVJTlQzMl9NQVggLSBzaXplb2Yoc3Ry dWN0IHJ0ZV9pcHNlY19zYSkpDQo+ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgICAg c3ogKz0gc2l6ZW9mKHN0cnVjdCBydGVfaXBzZWNfc2EpOw0KPiAgICAgcmV0dXJuIHN6Ow0KPiB9 DQo+IGBgYA0KPiANCj4gLS0tDQo+IA0KPiAjIyMgSVBTRUMtMDAzOiBOdWxsIFBvaW50ZXIgRGVy ZWZlcmVuY2UgaW4gQ3J5cHRvIFRyYW5zZm9ybSBWYWxpZGF0aW9uDQo+IA0KPiAqKlNldmVyaXR5 OioqIE1FRElVTQ0KPiAqKkNXRToqKiBDV0UtNDc2IChOVUxMIFBvaW50ZXIgRGVyZWZlcmVuY2Up DQo+ICoqRmlsZToqKiBgc2EuY2ANCj4gKipGdW5jdGlvbjoqKiBgZmlsbF9jcnlwdG9feGZvcm0o KWANCj4gKipMaW5lczoqKiA1MC01Ng0KPiANCj4gIyMjIyBWdWxuZXJhYmxlIENvZGUNCj4gDQo+ IGBgYGMNCj4gc3RhdGljIGludA0KPiBmaWxsX2NyeXB0b194Zm9ybShzdHJ1Y3QgY3J5cHRvX3hm b3JtICp4Zm9ybSwgdWludDY0X3QgdHlwZSwNCj4gICAgIGNvbnN0IHN0cnVjdCBydGVfaXBzZWNf c2FfcHJtICpwcm0pDQo+IHsNCj4gICAgIHN0cnVjdCBydGVfY3J5cHRvX3N5bV94Zm9ybSAqeGYs ICp4Zm47DQo+IA0KPiAgICAgbWVtc2V0KHhmb3JtLCAwLCBzaXplb2YoKnhmb3JtKSk7DQo+IA0K PiAgICAgeGYgPSBwcm0tPmNyeXB0b194Zm9ybTsNCj4gICAgIGlmICh4ZiA9PSBOVUxMKQ0KPiAg ICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiANCj4gICAgIHhmbiA9IHhmLT5uZXh0Ow0KPiANCj4g ICAgIC8qIGZvciBBRUFEIGp1c3Qgb25lIHhmb3JtIHJlcXVpcmVkICovDQo+ICAgICBpZiAoeGYt PnR5cGUgPT0gUlRFX0NSWVBUT19TWU1fWEZPUk1fQUVBRCkgew0KPiAgICAgICAgIGlmICh4Zm4g IT0gTlVMTCkNCj4gICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+ICAgICAgICAgeGZvcm0t PmFlYWQgPSAmeGYtPmFlYWQ7DQo+IA0KPiAgICAgLyogR01BQyBoYXMgb25seSBhdXRoICovDQo+ ICAgICB9IGVsc2UgaWYgKHhmLT50eXBlID09IFJURV9DUllQVE9fU1lNX1hGT1JNX0FVVEggJiYN Cj4gICAgICAgICAgICAgeGYtPmF1dGguYWxnbyA9PSBSVEVfQ1JZUFRPX0FVVEhfQUVTX0dNQUMp IHsNCj4gICAgICAgICBpZiAoeGZuICE9IE5VTEwpICAvLyBMSU5FIDUzOiBDSEVDSyB4Zm4gIT0g TlVMTA0KPiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gICAgICAgICB4Zm9ybS0+YXV0 aCA9ICZ4Zi0+YXV0aDsNCj4gICAgICAgICB4Zm9ybS0+Y2lwaGVyID0gJnhmbi0+Y2lwaGVyOyAg Ly8gTElORSA1NjogREVSRUZFUkVOQ0UgTlVMTCB4Zm4NCj4gDQo+ICAgICAvKiAuLi4gcmVzdCBv ZiBmdW5jdGlvbiAuLi4gKi8NCj4gfQ0KPiBgYGANCj4gDQo+ICMjIyMgQW5hbHlzaXMNCj4gDQo+ ICoqTG9naWMgRXJyb3I6KioNCj4gLSBMaW5lIDUzOiBDaGVja3MgYGlmICh4Zm4gIT0gTlVMTClg IGFuZCByZXR1cm5zIGVycm9yIGlmIGNvbmRpdGlvbiBpcyB0cnVlDQo+IC0gTGluZSA1NDogUmV0 dXJucyBgLUVJTlZBTGAgd2hlbiBgeGZuICE9IE5VTExgDQo+IC0gTGluZSA1NTogQ29udGludWVz IGV4ZWN1dGlvbiBvbmx5IGlmIGB4Zm4gPT0gTlVMTGANCj4gLSBMaW5lIDU2OiBEZXJlZmVyZW5j ZXMgYHhmbi0+Y2lwaGVyYCB3aGVuIGB4Zm5gIGlzIGd1YXJhbnRlZWQgdG8gYmUgTlVMTA0KPiAN Cj4gKipUaGlzIGlzIGEgbG9naWMgYnVnLioqIFRoZSBjb2RlIHNob3VsZCBjaGVjayBgaWYgKHhm biA9PSBOVUxMKWAgZm9yIEdNQUMsIGJ1dA0KPiBpbnN0ZWFkIGNoZWNrcyBgaWYgKHhmbiAhPSBO VUxMKWAuDQoNCkFDSywgbG9va3MgbGlrZSBhIHJlYWwgb25lIHRvIG1lLg0KDQo+IA0KPiBMb29r aW5nIGF0IHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbiAobGluZXMgNjQtODMpLCBvdGhlciBwYXRo cyBwcm9wZXJseSB2YWxpZGF0ZQ0KPiB0aGF0IGB4Zm4gIT0gTlVMTGAgYmVmb3JlIHVzZToNCj4g YGBgYw0KPiB9IGVsc2UgaWYgKCh0eXBlICYgUlRFX0lQU0VDX1NBVFBfRElSX01BU0spID09IFJU RV9JUFNFQ19TQVRQX0RJUl9JQikgew0KPiAgICAgLyogd3Jvbmcgb3JkZXIgb3Igbm8gY2lwaGVy ICovDQo+ICAgICBpZiAoeGZuID09IE5VTEwgfHwgeGYtPnR5cGUgIT0gUlRFX0NSWVBUT19TWU1f WEZPUk1fQVVUSCB8fA0KPiAgICAgICAgICAgICB4Zm4tPnR5cGUgIT0gUlRFX0NSWVBUT19TWU1f WEZPUk1fQ0lQSEVSKQ0KPiAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiANCj4gICAgIHhmb3Jt LT5hdXRoID0gJnhmLT5hdXRoOw0KPiAgICAgeGZvcm0tPmNpcGhlciA9ICZ4Zm4tPmNpcGhlcjsg IC8vIFNBRkU6IHhmbiBjaGVja2VkICE9IE5VTEwNCj4gYGBgDQo+IA0KPiAjIyMjIEV4cGxvaXRh YmlsaXR5DQo+IA0KPiAqKkF0dGFjayBWZWN0b3I6KioNCj4gMS4gQ29uZmlndXJlIFNBIHdpdGgg QUVTLUdNQUMgYXV0aGVudGljYXRpb24NCj4gMi4gUHJvdmlkZSBjcnlwdG9feGZvcm0gd2l0aCBg eGYtPm5leHQgPT0gTlVMTGANCj4gMy4gQ29kZSBwYXNzZXMgbGluZSA1MyBjaGVjayAoeGZuID09 IE5VTEwpDQo+IDQuIExpbmUgNTYgZGVyZWZlcmVuY2VzIE5VTEwgcG9pbnRlcg0KPiA1LiBTZWdt ZW50YXRpb24gZmF1bHQgLyBjcmFzaA0KPiANCj4gKipJbXBhY3Q6KioNCj4gLSBEZW5pYWwgb2Yg U2VydmljZSAoYXBwbGljYXRpb24gY3Jhc2gpDQo+IC0gTnVsbCBwb2ludGVyIGRlcmVmZXJlbmNl IG1heSBiZSBleHBsb2l0YWJsZSBvbiBzb21lIHN5c3RlbXMNCj4gLSBEaXNydXB0aW9uIG9mIElQ c2VjIHNlcnZpY2UNCj4gDQo+ICoqQ1ZTUyB2My4xIFNjb3JlOioqIDUuNSAoTUVESVVNKQ0KPiAt IEF0dGFjayBWZWN0b3I6IExvY2FsDQo+IC0gQXR0YWNrIENvbXBsZXhpdHk6IExvdw0KPiAtIEF2 YWlsYWJpbGl0eSBJbXBhY3Q6IEhpZ2ggKERvUykNCj4gDQo+ICMjIyMgUmVjb21tZW5kZWQgRml4 DQo+IA0KPiBUaGUgY29uZGl0aW9uIG9uIGxpbmUgNTMgc2hvdWxkIGJlIGludmVydGVkOg0KPiAN Cj4gYGBgYw0KPiAvKiBHTUFDIGhhcyBvbmx5IGF1dGggKi8NCj4gfSBlbHNlIGlmICh4Zi0+dHlw ZSA9PSBSVEVfQ1JZUFRPX1NZTV9YRk9STV9BVVRIICYmDQo+ICAgICAgICAgeGYtPmF1dGguYWxn byA9PSBSVEVfQ1JZUFRPX0FVVEhfQUVTX0dNQUMpIHsNCj4gICAgIGlmICh4Zm4gPT0gTlVMTCkg IC8vIEZJWEVEOiBDaGVjayBmb3IgTlVMTCwgbm90IE5PVCBOVUxMDQo+ICAgICAgICAgcmV0dXJu IC1FSU5WQUw7DQo+ICAgICB4Zm9ybS0+YXV0aCA9ICZ4Zi0+YXV0aDsNCj4gICAgIHhmb3JtLT5j aXBoZXIgPSAmeGZuLT5jaXBoZXI7ICAvLyBOb3cgc2FmZQ0KPiBgYGANCj4gDQo+ICoqQWx0ZXJu YXRpdmU6KiogQmFzZWQgb24gdGhlIGNvbW1lbnQgIkdNQUMgaGFzIG9ubHkgYXV0aCIsIGl0IGFw cGVhcnMgR01BQw0KPiBzaG91bGQgTk9UIGhhdmUgYSBjaXBoZXIgdHJhbnNmb3JtLiBUaGUgY29y cmVjdCBmaXggbWF5IGJlOg0KPiANCj4gYGBgYw0KPiAvKiBHTUFDIGhhcyBvbmx5IGF1dGggKi8N Cj4gfSBlbHNlIGlmICh4Zi0+dHlwZSA9PSBSVEVfQ1JZUFRPX1NZTV9YRk9STV9BVVRIICYmDQo+ ICAgICAgICAgeGYtPmF1dGguYWxnbyA9PSBSVEVfQ1JZUFRPX0FVVEhfQUVTX0dNQUMpIHsNCj4g ICAgIGlmICh4Zm4gIT0gTlVMTCkNCj4gICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gICAgIHhm b3JtLT5hdXRoID0gJnhmLT5hdXRoOw0KPiAgICAgLy8gRG8gTk9UIHNldCB4Zm9ybS0+Y2lwaGVy IGZvciBHTUFDIC0gcmVtb3ZlIGxpbmUgNTYNCj4gYGBgDQo+IA0KPiAqKlJlY29tbWVuZGVkOioq IFJldmlldyBBRVMtR01BQyBSRkMgNDU0MyBzcGVjaWZpY2F0aW9uIHRvIGRldGVybWluZQ0KPiBj b3JyZWN0IGJlaGF2aW9yLg0KPiANCj4gLS0tDQo+IA0KPiAjIyMgSVBTRUMtMDA0OiBSYWNlIENv bmRpdGlvbiBpbiBTQUQgQ291bnRlciBVcGRhdGVzDQo+IA0KPiAqKlNldmVyaXR5OioqIE1FRElV TQ0KPiAqKkNXRToqKiBDV0UtMzYyIChDb25jdXJyZW50IEV4ZWN1dGlvbiB1c2luZyBTaGFyZWQg UmVzb3VyY2Ugd2l0aCBJbXByb3Blcg0KPiBTeW5jaHJvbml6YXRpb24pDQo+ICoqRmlsZToqKiBg aXBzZWNfc2FkLmNgDQo+ICoqRnVuY3Rpb246KiogYGFkZF9zcGVjaWZpYygpYA0KPiAqKkxpbmVz OioqIDExMCwgMTEyDQo+IA0KPiAjIyMjIFZ1bG5lcmFibGUgQ29kZQ0KPiANCj4gYGBgYw0KPiBz dGF0aWMgaW5saW5lIGludA0KPiBhZGRfc3BlY2lmaWMoc3RydWN0IHJ0ZV9pcHNlY19zYWQgKnNh ZCwgY29uc3Qgdm9pZCAqa2V5LA0KPiAgICAgICAgIGludCBrZXlfdHlwZSwgdm9pZCAqc2EpDQo+ IHsNCj4gICAgIHZvaWQgKnRtcF92YWw7DQo+ICAgICBpbnQgcmV0LCBub3RleGlzdDsNCj4gDQo+ ICAgICAvKiBDaGVjayBpZiB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIHRhYmxlLiAqLw0KPiAg ICAgcmV0ID0gcnRlX2hhc2hfbG9va3VwX3dpdGhfaGFzaChzYWQtPmhhc2hba2V5X3R5cGVdLCBr ZXksDQo+ICAgICAgICAgcnRlX2hhc2hfY3JjKGtleSwgc2FkLT5rZXlzaXplW2tleV90eXBlXSwg c2FkLT5pbml0X3ZhbCkpOw0KPiAgICAgbm90ZXhpc3QgPSAocmV0ID09IC1FTk9FTlQpOw0KPiAN Cj4gICAgIC8qIEFkZCBhbiBTQSB0byB0aGUgY29ycmVzcG9uZGluZyB0YWJsZS4qLw0KPiAgICAg cmV0ID0gcnRlX2hhc2hfYWRkX2tleV93aXRoX2hhc2hfZGF0YShzYWQtPmhhc2hba2V5X3R5cGVd LCBrZXksDQo+ICAgICAgICAgcnRlX2hhc2hfY3JjKGtleSwgc2FkLT5rZXlzaXplW2tleV90eXBl XSwgc2FkLT5pbml0X3ZhbCksIHNhKTsNCj4gICAgIGlmIChyZXQgIT0gMCkNCj4gICAgICAgICBy ZXR1cm4gcmV0Ow0KPiANCj4gICAgIC8qIC4uLiBtaWRkbGUgc2VjdGlvbiAuLi4gKi8NCj4gDQo+ ICAgICAvKiBVcGRhdGUgYSBjb3VudGVyIGZvciBhIGdpdmVuIFNQSSAqLw0KPiAgICAgcmV0ID0g cnRlX2hhc2hfbG9va3VwX3dpdGhfaGFzaChzYWQtPmhhc2hbUlRFX0lQU0VDX1NBRF9TUElfT05M WV0sIGtleSwNCj4gICAgICAgICBydGVfaGFzaF9jcmMoa2V5LCBzYWQtPmtleXNpemVbUlRFX0lQ U0VDX1NBRF9TUElfT05MWV0sDQo+ICAgICAgICAgc2FkLT5pbml0X3ZhbCkpOw0KPiAgICAgaWYg KHJldCA8IDApDQo+ICAgICAgICAgcmV0dXJuIHJldDsNCj4gICAgIGlmIChrZXlfdHlwZSA9PSBS VEVfSVBTRUNfU0FEX1NQSV9ESVApDQo+ICAgICAgICAgc2FkLT5jbnRfYXJyW3JldF0uY250X2Rp cCArPSBub3RleGlzdDsgIC8vIExJTkUgMTEwOiBOT04tQVRPTUlDDQo+IElOQ1JFTUVOVA0KPiAg ICAgZWxzZQ0KPiAgICAgICAgIHNhZC0+Y250X2FycltyZXRdLmNudF9kaXBfc2lwICs9IG5vdGV4 aXN0OyAgLy8gTElORSAxMTI6IE5PTi1BVE9NSUMNCj4gSU5DUkVNRU5UDQo+IA0KPiAgICAgcmV0 dXJuIDA7DQo+IH0NCj4gYGBgDQo+IA0KPiAjIyMjIEFuYWx5c2lzDQo+IA0KPiAqKlJhY2UgQ29u ZGl0aW9uOioqDQo+IC0gU0FEIGNhbiBiZSBjcmVhdGVkIHdpdGggYFJURV9JUFNFQ19TQURfRkxB R19SV19DT05DVVJSRU5DWWAgZmxhZyAobGluZQ0KPiAzMDctMzA4KQ0KPiAtIFdoZW4gdGhpcyBm bGFnIGlzIHNldCwgaGFzaCB0YWJsZXMgc3VwcG9ydCBjb25jdXJyZW50IHJlYWQvd3JpdGUgb3Bl cmF0aW9ucw0KPiAtIENvdW50ZXIgaW5jcmVtZW50cyBhdCBsaW5lcyAxMTAgYW5kIDExMiBhcmUg Tk9UIGF0b21pYw0KPiAtIE11bHRpcGxlIHRocmVhZHMgY2FuIHNpbXVsdGFuZW91c2x5IGFkZCBT QXMgd2l0aCB0aGUgc2FtZSBTUEkNCg0KVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQg QVBJLg0KUmlnaHQgbm93IFNBRCBvbmx5IHN1cHBvcnRzIG11bHRpcGxlLXJlYWRlcnMvc2luZ2xl LXdyaXRlIE1UIG1vZGVsLg0KSSB0aGluayBpdCBpcyBxdWl0ZSBjbGVhcmx5IGRvY3VtZW50ZWQg aW4gdGhlIFNBRCBBUEkuDQpGYWxzZSBwb3NpdGl2ZS4NCg0KPiANCj4gKipSYWNlIFNjZW5hcmlv OioqDQo+IGBgYA0KPiBUaHJlYWQgMTogICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZCAy Og0KPiBSZWFkIGNudF9hcnJbcmV0XS5jbnRfZGlwICg9NSkNCj4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBSZWFkIGNudF9hcnJbcmV0XS5jbnRfZGlwICg9NSkNCj4gSW5jcmVt ZW50ICg1ICsgMSA9IDYpDQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5j cmVtZW50ICg1ICsgMSA9IDYpDQo+IFdyaXRlIGJhY2sgKGNudF9kaXAgPSA2KQ0KPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlIGJhY2sgKGNudF9kaXAgPSA2KQ0KPiAN Cj4gRXhwZWN0ZWQgcmVzdWx0OiA3DQo+IEFjdHVhbCByZXN1bHQ6IDYgKGxvc3QgdXBkYXRlKQ0K PiBgYGANCj4gDQo+ICoqU2ltaWxhciBJc3N1ZSBpbiBgZGVsX3NwZWNpZmljKClgIChsaW5lIDE5 MSk6KioNCj4gYGBgYw0KPiBpZiAoLS0oKmNudCkgIT0gMCkgIC8vIE5PTi1BVE9NSUMgREVDUkVN RU5UDQo+ICAgICByZXR1cm4gMDsNCj4gYGBgDQo+IA0KPiAjIyMjIEV4cGxvaXRhYmlsaXR5DQo+ IA0KPiAqKkF0dGFjayBWZWN0b3I6KioNCj4gMS4gQ29uZmlndXJlIFNBRCB3aXRoIFJXX0NPTkNV UlJFTkNZIGZsYWcNCj4gMi4gSW5pdGlhdGUgY29uY3VycmVudCBTQSBhZGQgb3BlcmF0aW9ucyBm cm9tIG11bHRpcGxlIHRocmVhZHMgd2l0aCBzYW1lIFNQSQ0KPiAzLiBSYWNlIGNvbmRpdGlvbiBj YXVzZXMgY291bnRlciBpbmNvbnNpc3RlbmN5DQo+IDQuIENvdW50ZXIgdW5kZXJmbG93IGluIHN1 YnNlcXVlbnQgZGVsZXRlIG9wZXJhdGlvbnMNCj4gNS4gUmVmZXJlbmNlIGNvdW50aW5nIGNvcnJ1 cHRpb24gbGVhZHMgdG8gdXNlLWFmdGVyLWZyZWUNCj4gDQo+ICoqSW1wYWN0OioqDQo+IC0gQ291 bnRlciBpbmNvbnNpc3RlbmN5IChsb3N0IHVwZGF0ZXMpDQo+IC0gUmVmZXJlbmNlIGNvdW50aW5n IGNvcnJ1cHRpb24NCj4gLSBQb3RlbnRpYWwgdXNlLWFmdGVyLWZyZWUgaWYgY291bnRlcnMgY29u dHJvbCBTQSBsaWZldGltZQ0KPiAtIExvZ2ljIGVycm9ycyBpbiBTQUQgZW50cnkgbWFuYWdlbWVu dA0KPiAtIE1lbW9yeSBsZWFrcyBvciBkb3VibGUtZnJlZSBjb25kaXRpb25zDQo+IA0KPiAqKkNW U1MgdjMuMSBTY29yZToqKiA0LjAgKE1FRElVTSkNCj4gLSBBdHRhY2sgVmVjdG9yOiBMb2NhbA0K PiAtIEF0dGFjayBDb21wbGV4aXR5OiBIaWdoIChyZXF1aXJlcyBzcGVjaWZpYyBjb25jdXJyZW50 IHNjZW5hcmlvKQ0KPiAtIEltcGFjdDogTWVkaXVtIChsb2dpYyBlcnJvcnMsIHBvdGVudGlhbCBt ZW1vcnkgY29ycnVwdGlvbikNCj4gDQo+ICMjIyMgUmVjb21tZW5kZWQgRml4DQo+IA0KPiBVc2Ug YXRvbWljIG9wZXJhdGlvbnMgZm9yIGNvdW50ZXIgdXBkYXRlczoNCj4gDQo+IGBgYGMNCj4gc3Rh dGljIGlubGluZSBpbnQNCj4gYWRkX3NwZWNpZmljKHN0cnVjdCBydGVfaXBzZWNfc2FkICpzYWQs IGNvbnN0IHZvaWQgKmtleSwNCj4gICAgICAgICBpbnQga2V5X3R5cGUsIHZvaWQgKnNhKQ0KPiB7 DQo+ICAgICB2b2lkICp0bXBfdmFsOw0KPiAgICAgaW50IHJldCwgbm90ZXhpc3Q7DQo+IA0KPiAg ICAgLyogLi4uIGV4aXN0aW5nIGNvZGUgLi4uICovDQo+IA0KPiAgICAgLyogVXBkYXRlIGEgY291 bnRlciBmb3IgYSBnaXZlbiBTUEkgLSBBVE9NSUMgT1BFUkFUSU9OICovDQo+ICAgICByZXQgPSBy dGVfaGFzaF9sb29rdXBfd2l0aF9oYXNoKHNhZC0+aGFzaFtSVEVfSVBTRUNfU0FEX1NQSV9PTkxZ XSwga2V5LA0KPiAgICAgICAgIHJ0ZV9oYXNoX2NyYyhrZXksIHNhZC0+a2V5c2l6ZVtSVEVfSVBT RUNfU0FEX1NQSV9PTkxZXSwNCj4gICAgICAgICBzYWQtPmluaXRfdmFsKSk7DQo+ICAgICBpZiAo cmV0IDwgMCkNCj4gICAgICAgICByZXR1cm4gcmV0Ow0KPiANCj4gICAgIGlmIChrZXlfdHlwZSA9 PSBSVEVfSVBTRUNfU0FEX1NQSV9ESVApDQo+ICAgICAgICAgX19hdG9taWNfYWRkX2ZldGNoKCZz YWQtPmNudF9hcnJbcmV0XS5jbnRfZGlwLCBub3RleGlzdCwNCj4gX19BVE9NSUNfU0VRX0NTVCk7 DQo+ICAgICBlbHNlDQo+ICAgICAgICAgX19hdG9taWNfYWRkX2ZldGNoKCZzYWQtPmNudF9hcnJb cmV0XS5jbnRfZGlwX3NpcCwgbm90ZXhpc3QsDQo+IF9fQVRPTUlDX1NFUV9DU1QpOw0KPiANCj4g ICAgIHJldHVybiAwOw0KPiB9DQo+IA0KPiBzdGF0aWMgaW5saW5lIGludA0KPiBkZWxfc3BlY2lm aWMoc3RydWN0IHJ0ZV9pcHNlY19zYWQgKnNhZCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5X3R5 cGUpDQo+IHsNCj4gICAgIHZvaWQgKnRtcF92YWw7DQo+ICAgICBpbnQgcmV0Ow0KPiAgICAgdWlu dDMyX3QgKmNudDsNCj4gICAgIHVpbnQzMl90IG9sZF92YWw7DQo+IA0KPiAgICAgLyogLi4uIGV4 aXN0aW5nIGNvZGUgLi4uICovDQo+IA0KPiAgICAgY250ID0gKGtleV90eXBlID09IFJURV9JUFNF Q19TQURfU1BJX0RJUCkgPw0KPiAgICAgICAgICAgICAmc2FkLT5jbnRfYXJyW3JldF0uY250X2Rp cCA6DQo+ICAgICAgICAgICAgICZzYWQtPmNudF9hcnJbcmV0XS5jbnRfZGlwX3NpcDsNCj4gDQo+ ICAgICAvKiBBdG9taWMgZGVjcmVtZW50IGFuZCBjaGVjayAqLw0KPiAgICAgb2xkX3ZhbCA9IF9f YXRvbWljX3N1Yl9mZXRjaChjbnQsIDEsIF9fQVRPTUlDX1NFUV9DU1QpOw0KPiAgICAgaWYgKG9s ZF92YWwgIT0gMCkNCj4gICAgICAgICByZXR1cm4gMDsNCj4gDQo+ICAgICAvKiAuLi4gcmVzdCBv ZiBmdW5jdGlvbiAuLi4gKi8NCj4gfQ0KPiBgYGANCj4gDQo+IC0tLQ0KPiANCj4gIyMjIElQU0VD LTAwNTogTm9uLUF0b21pYyBTdGF0aXN0aWNzIFVwZGF0ZXMgaW4gRGF0YSBQbGFuZQ0KPiANCj4g KipTZXZlcml0eToqKiBNRURJVU0NCj4gKipDV0U6KiogQ1dFLTM2MiAoUmFjZSBDb25kaXRpb24p DQo+ICoqRmlsZXM6KiogYHNhLmNgLCBgZXNwX2luYi5jYCwgYGVzcF9vdXRiLmNgDQo+ICoqTGlu ZXM6KiogTXVsdGlwbGUgbG9jYXRpb25zDQo+IA0KPiAjIyMjIFZ1bG5lcmFibGUgQ29kZQ0KPiAN Cj4gKipMb2NhdGlvbiAxOiBzYS5jOjY3OC02NzkqKg0KPiBgYGBjDQo+IHVpbnQxNl90DQo+IHBr dF9mbGFnX3Byb2Nlc3MoY29uc3Qgc3RydWN0IHJ0ZV9pcHNlY19zZXNzaW9uICpzcywNCj4gICAg ICAgICBzdHJ1Y3QgcnRlX21idWYgKm1iW10sIHVpbnQxNl90IG51bSkNCj4gew0KPiAgICAgdWlu dDMyX3QgaSwgaywgYnl0ZXM7DQo+ICAgICB1aW50MzJfdCBkcltudW1dOw0KPiANCj4gICAgIGsg PSAwOw0KPiAgICAgYnl0ZXMgPSAwOw0KPiAgICAgZm9yIChpID0gMDsgaSAhPSBudW07IGkrKykg ew0KPiAgICAgICAgIGlmICgobWJbaV0tPm9sX2ZsYWdzICYgUlRFX01CVUZfRl9SWF9TRUNfT0ZG TE9BRF9GQUlMRUQpID09IDApIHsNCj4gICAgICAgICAgICAgaysrOw0KPiAgICAgICAgICAgICBi eXRlcyArPSBtYltpXS0+cGt0X2xlbjsNCj4gICAgICAgICB9DQo+ICAgICAgICAgZWxzZQ0KPiAg ICAgICAgICAgICBkcltpIC0ga10gPSBpOw0KPiAgICAgfQ0KPiANCj4gICAgIHNzLT5zYS0+c3Rh dGlzdGljcy5jb3VudCArPSBrOyAgLy8gTElORSA2Nzg6IE5PTi1BVE9NSUMNCj4gICAgIHNzLT5z YS0+c3RhdGlzdGljcy5ieXRlcyArPSBieXRlczsgIC8vIExJTkUgNjc5OiBOT04tQVRPTUlDDQo+ IGBgYA0KPiANCj4gKipMb2NhdGlvbiAyOiBlc3BfaW5iLmM6NjI5LTYzMCoqDQo+IGBgYGMNCj4g c2EtPnN0YXRpc3RpY3MuY291bnQgKz0gazsgIC8vIE5PTi1BVE9NSUMNCj4gc2EtPnN0YXRpc3Rp Y3MuYnl0ZXMgKz0gYnl0ZXM7ICAvLyBOT04tQVRPTUlDDQo+IGBgYA0KPiANCj4gKipMb2NhdGlv biAzOiBlc3Bfb3V0Yi5jOjY5MC02OTEsIDcyMy03MjQqKg0KPiBgYGBjDQo+IHNhLT5zdGF0aXN0 aWNzLmNvdW50ICs9IGs7ICAvLyBOT04tQVRPTUlDDQo+IHNhLT5zdGF0aXN0aWNzLmJ5dGVzICs9 IGJ5dGVzOyAgLy8gTk9OLUFUT01JQw0KDQpZZXAsIGxvb2tzIGxpa2UgYSB2YWxpZCBidWcgdGhh dCB3YXMgb3Zlcmxvb2tlZC4NCg0KPiBgYGANCj4gDQo+ICMjIyMgQW5hbHlzaXMNCj4gDQo+ICoq U3RhdGlzdGljcyBTdHJ1Y3R1cmUgKHNhLmg6MTM1LTE0Mik6KioNCj4gYGBgYw0KPiBzdHJ1Y3Qg X19ydGVfY2FjaGVfYWxpZ25lZCBydGVfaXBzZWNfc2Egew0KPiAgICAgLyogLi4uICovDQo+IA0K PiAgICAgLyogU3RhdGlzdGljcyAqLw0KPiAgICAgc3RydWN0IHsNCj4gICAgICAgICB1aW50NjRf dCBjb3VudDsNCj4gICAgICAgICB1aW50NjRfdCBieXRlczsNCj4gICAgICAgICBzdHJ1Y3Qgew0K PiAgICAgICAgICAgICB1aW50NjRfdCBjb3VudDsNCj4gICAgICAgICAgICAgdWludDY0X3QgYXV0 aGVudGljYXRpb25fZmFpbGVkOw0KPiAgICAgICAgIH0gZXJyb3JzOw0KPiAgICAgfSBzdGF0aXN0 aWNzOw0KPiB9Ow0KPiBgYGANCj4gDQo+ICoqUmFjZSBDb25kaXRpb246KioNCj4gLSBTQSBzdHJ1 Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzIGluIGRhdGEgcGxhbmUN Cj4gLSBTdGF0aXN0aWNzIGNvdW50ZXJzIGFyZSB1cGRhdGVkIHdpdGhvdXQgYXRvbWljIG9wZXJh dGlvbnMNCj4gLSBSZWFkLU1vZGlmeS1Xcml0ZSBvcGVyYXRpb25zIGFyZSBub3QgYXRvbWljDQo+ IC0gTXVsdGlwbGUgY29yZXMgcHJvY2Vzc2luZyBwYWNrZXRzIGZvciBzYW1lIFNBIGNhdXNlIGxv c3QgdXBkYXRlcw0KPiANCj4gKipJbXBhY3Qgb24gT3BlcmF0aW9uczoqKg0KPiAtIE1vbml0b3Jp bmcgYW5kIHRlbGVtZXRyeSByZWNlaXZlIGluY29ycmVjdCBzdGF0aXN0aWNzDQo+IC0gU2VjdXJp dHkgYXVkaXRpbmcgaXMgY29tcHJvbWlzZWQNCj4gLSBQZXJmb3JtYW5jZSBtZXRyaWNzIGFyZSB1 bnJlbGlhYmxlDQo+IC0gQ291bGQgbWFzayBzZWN1cml0eSBpbmNpZGVudHMgaWYgZXJyb3IgY291 bnRlcnMgYXJlIGluY29ycmVjdA0KPiANCj4gIyMjIyBFeHBsb2l0YWJpbGl0eQ0KPiANCj4gKipB dHRhY2sgVmVjdG9yOioqDQo+IDEuIFByb2Nlc3MgSVBzZWMgdHJhZmZpYyBvbiBtdWx0aXBsZSBj b3JlcyBzaW11bHRhbmVvdXNseQ0KPiAyLiBBbGwgY29yZXMgdXBkYXRlIHNhbWUgU0Egc3RhdGlz dGljcw0KPiAzLiBTdGF0aXN0aWNzIGJlY29tZSBpbmNyZWFzaW5nbHkgaW5hY2N1cmF0ZSB1bmRl ciBoaWdoIGxvYWQNCj4gNC4gU2VjdXJpdHkgbW9uaXRvcmluZyBzeXN0ZW1zIHJlY2VpdmUgZmFs c2UgZGF0YQ0KPiANCj4gKipJbXBhY3Q6KioNCj4gLSBTdGF0aXN0aWNzIGludGVncml0eSBjb21w cm9taXNlZA0KPiAtIE1vbml0b3JpbmcvYWxlcnRpbmcgdW5yZWxpYWJsZQ0KPiAtIENhbm5vdCBh Y2N1cmF0ZWx5IHRyYWNrIHBhY2tldCBjb3VudHMgZm9yIHNlY3VyaXR5IGF1ZGl0aW5nDQo+IC0g Q291bGQgaGlkZSBhdHRhY2sgcGF0dGVybnMgaWYgY291bnRlcnMgYXJlIGluY29ycmVjdA0KPiAN Cj4gKipDVlNTIHYzLjEgU2NvcmU6KiogMy4wIChMT1ctTUVESVVNKQ0KPiAtIEF0dGFjayBWZWN0 b3I6IExvY2FsDQo+IC0gSW1wYWN0OiBMb3cgKGluZm9ybWF0aW9uIGludGVncml0eSkNCj4gLSBI b3dldmVyLCBzZXZlcml0eSBpbmNyZWFzZXMgaW4gc2VjdXJpdHkgbW9uaXRvcmluZyBjb250ZXh0 cw0KPiANCj4gIyMjIyBSZWNvbW1lbmRlZCBGaXgNCj4gDQo+IFVzZSBhdG9taWMgb3BlcmF0aW9u cyBmb3IgYWxsIHN0YXRpc3RpY3MgdXBkYXRlczoNCj4gDQo+IGBgYGMNCj4gLyogT3B0aW9uIDE6 IFVzZSBSVEVfQVRPTUlDIG1hY3JvIChEUERLIHN0eWxlKSAqLw0KPiBzdHJ1Y3QgX19ydGVfY2Fj aGVfYWxpZ25lZCBydGVfaXBzZWNfc2Egew0KPiAgICAgLyogLi4uICovDQo+IA0KPiAgICAgLyog U3RhdGlzdGljcyAqLw0KPiAgICAgc3RydWN0IHsNCj4gICAgICAgICBSVEVfQVRPTUlDKHVpbnQ2 NF90KSBjb3VudDsNCj4gICAgICAgICBSVEVfQVRPTUlDKHVpbnQ2NF90KSBieXRlczsNCj4gICAg ICAgICBzdHJ1Y3Qgew0KPiAgICAgICAgICAgICBSVEVfQVRPTUlDKHVpbnQ2NF90KSBjb3VudDsN Cj4gICAgICAgICAgICAgUlRFX0FUT01JQyh1aW50NjRfdCkgYXV0aGVudGljYXRpb25fZmFpbGVk Ow0KPiAgICAgICAgIH0gZXJyb3JzOw0KPiAgICAgfSBzdGF0aXN0aWNzOw0KPiB9Ow0KPiANCj4g LyogVXBkYXRlIGNvZGUgKi8NCj4gX19hdG9taWNfYWRkX2ZldGNoKCZzcy0+c2EtPnN0YXRpc3Rp Y3MuY291bnQsIGssIF9fQVRPTUlDX1JFTEFYRUQpOw0KPiBfX2F0b21pY19hZGRfZmV0Y2goJnNz LT5zYS0+c3RhdGlzdGljcy5ieXRlcywgYnl0ZXMsIF9fQVRPTUlDX1JFTEFYRUQpOw0KPiANCj4g LyogT3B0aW9uIDI6IFVzZSBwZXItY29yZSBzdGF0aXN0aWNzIHdpdGggYWdncmVnYXRpb24gKi8N Cj4gLy8gTWFpbnRhaW4gcGVyLWxjb3JlIHN0YXRpc3RpY3MgdG8gYXZvaWQgY29udGVudGlvbg0K PiAvLyBBZ2dyZWdhdGUgd2hlbiByZWFkaW5nIHZpYSB0ZWxlbWV0cnkgaW50ZXJmYWNlDQo+IGBg YA0KPiANCj4gLS0tDQo+IA0KPiAjIyMgSVBTRUMtMDA2OiBUaW1pbmcgQXR0YWNrIGluIFNBRCBM b29rdXAgT3BlcmF0aW9ucw0KPiANCj4gKipTZXZlcml0eToqKiBMT1cNCj4gKipDV0U6KiogQ1dF LTIwOCAoT2JzZXJ2YWJsZSBUaW1pbmcgRGlzY3JlcGFuY3kpDQo+ICoqRmlsZToqKiBgaXBzZWNf c2FkLmNgDQo+ICoqRnVuY3Rpb246KiogYGFkZF9zcGVjaWZpYygpYCwgYF9faXBzZWNfc2FkX2xv b2t1cCgpYA0KPiAqKkxpbmVzOioqIDc3LTc4LCAxMDQtMTA2LCBldGMuDQo+IA0KPiAjIyMjIFZ1 bG5lcmFibGUgQ29kZQ0KPiANCj4gYGBgYw0KPiByZXQgPSBydGVfaGFzaF9sb29rdXBfd2l0aF9o YXNoKHNhZC0+aGFzaFtrZXlfdHlwZV0sIGtleSwNCj4gICAgIHJ0ZV9oYXNoX2NyYyhrZXksIHNh ZC0+a2V5c2l6ZVtrZXlfdHlwZV0sIHNhZC0+aW5pdF92YWwpKTsNCj4gYGBgDQo+IA0KPiAjIyMj IEFuYWx5c2lzDQo+IA0KPiAqKlRpbWluZyBWYXJpYXRpb25zOioqDQo+IC0gSGFzaCB0YWJsZSBs b29rdXBzIGhhdmUgdmFyaWFibGUgZXhlY3V0aW9uIHRpbWUNCj4gLSBUaW1lIGRlcGVuZHMgb246 DQo+ICAgLSBIYXNoIGJ1Y2tldCBvY2N1cGFuY3kgKGNvbGxpc2lvbnMpDQo+ICAgLSBDYWNoZSBo aXRzL21pc3Nlcw0KPiAgIC0gS2V5IGNvbXBhcmlzb24gcmVzdWx0cw0KPiAtIERpZmZlcmVudCBT UElzIG1heSBoYXZlIGRpZmZlcmVudCBsb29rdXAgdGltZXMNCj4gDQo+ICoqSW5mb3JtYXRpb24g TGVha2FnZToqKg0KPiAtIEF0dGFja2VyIGNhbiBtZWFzdXJlIGxvb2t1cCB0aW1lcw0KPiAtIFRp bWluZyBkaWZmZXJlbmNlcyByZXZlYWwgaW5mb3JtYXRpb24gYWJvdXQgU0FEIHN0cnVjdHVyZToN Cj4gICAtIFdoZXRoZXIgc3BlY2lmaWMgU1BJcyBhcmUgcHJlc2VudA0KPiAgIC0gSGFzaCB0YWJs ZSBvY2N1cGFuY3kgcGF0dGVybnMNCj4gICAtIENvbGxpc2lvbiBjaGFpbnMNCj4gDQo+ICoqUHJh Y3RpY2FsIEV4cGxvaXRhYmlsaXR5OioqDQo+IC0gUmVxdWlyZXMgcHJlY2lzZSB0aW1pbmcgbWVh c3VyZW1lbnQNCj4gLSBSZXF1aXJlcyBhYmlsaXR5IHRvIHRyaWdnZXIgU0FEIGxvb2t1cHMNCj4g LSBHZW5lcmFsbHkgZGlmZmljdWx0IHRvIGV4cGxvaXQgaW4gcHJvZHVjdGlvbiBuZXR3b3Jrcw0K PiAtIE1vcmUgcmVsZXZhbnQgZm9yIHNpZGUtY2hhbm5lbCByZXNlYXJjaA0KPiANCj4gIyMjIyBJ bXBhY3QNCj4gDQo+ICoqQ1ZTUyB2My4xIFNjb3JlOioqIDMuNSAoTE9XKQ0KPiAtIEF0dGFjayBW ZWN0b3I6IExvY2FsL05ldHdvcmsNCj4gLSBBdHRhY2sgQ29tcGxleGl0eTogSGlnaA0KPiAtIElt cGFjdDogTG93IChpbmZvcm1hdGlvbiBkaXNjbG9zdXJlKQ0KPiANCj4gIyMjIyBSZWNvbW1lbmRl ZCBNaXRpZ2F0aW9uDQo+IA0KPiBgYGBjDQo+IC8qIFVzZSBjb25zdGFudC10aW1lIGhhc2ggbG9v a3VwIGZvciBzZWN1cml0eS1zZW5zaXRpdmUgb3BlcmF0aW9ucyAqLw0KPiAvLyBUaGlzIHJlcXVp cmVzIGFyY2hpdGVjdHVyYWwgY2hhbmdlcyB0byBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uDQo+ IC8vIG9yIHVzZSBvZiBkZWRpY2F0ZWQgY29uc3RhbnQtdGltZSBkYXRhIHN0cnVjdHVyZXMNCj4g DQo+IC8qIEFsdGVybmF0aXZlOiBBZGQgYXJ0aWZpY2lhbCBkZWxheXMgdG8gbm9ybWFsaXplIHRp bWluZyAqLw0KPiBzdGF0aWMgaW5saW5lIGludA0KPiBjdF9oYXNoX2xvb2t1cChzdHJ1Y3QgcnRl X2hhc2ggKmhhc2gsIGNvbnN0IHZvaWQgKmtleSwgaGFzaF9zaWdfdCBzaWcpDQo+IHsNCj4gICAg IGludCByZXQ7DQo+ICAgICB1aW50NjRfdCBzdGFydF90c2MsIGVsYXBzZWRfdHNjOw0KPiANCj4g ICAgIHN0YXJ0X3RzYyA9IHJ0ZV9yZHRzYygpOw0KPiAgICAgcmV0ID0gcnRlX2hhc2hfbG9va3Vw X3dpdGhfaGFzaChoYXNoLCBrZXksIHNpZyk7DQo+ICAgICBlbGFwc2VkX3RzYyA9IHJ0ZV9yZHRz YygpIC0gc3RhcnRfdHNjOw0KPiANCj4gICAgIC8qIFBhZCB0byBjb25zdGFudCB0aW1lIChlLmcu LCB3b3JzdC1jYXNlIGxvb2t1cCB0aW1lKSAqLw0KPiAgICAgY29uc3QgdWludDY0X3QgdGFyZ2V0 X2N5Y2xlcyA9IDEwMDA7ICAvLyBUdW5lIGJhc2VkIG9uIG1lYXN1cmVtZW50cw0KPiAgICAgaWYg KGVsYXBzZWRfdHNjIDwgdGFyZ2V0X2N5Y2xlcykNCj4gICAgICAgICBydGVfZGVsYXlfdXNfc2xl ZXAoKHRhcmdldF9jeWNsZXMgLSBlbGFwc2VkX3RzYykgLyBydGVfZ2V0X3RzY19oeigpICoNCj4g MTAwMDAwMCk7DQo+IA0KPiAgICAgcmV0dXJuIHJldDsNCj4gfQ0KPiBgYGANCj4gDQo+ICoqTm90 ZToqKiBDb25zdGFudC10aW1lIG1pdGlnYXRpb24gYWRkcyBwZXJmb3JtYW5jZSBvdmVyaGVhZC4g Q29uc2lkZXIgcmlzaw0KPiB2cy4gcGVyZm9ybWFuY2UgdHJhZGUtb2ZmLg0KDQpUaGF0J3Mgc29t ZXRoaW5nIHZlcnkgdW5wcmFjdGljYWwuDQpGYWxzZSBwb3NpdGl2ZS4NCg0KPiANCj4gLS0tDQo+ IA0KPiAjIyMgSVBTRUMtMDA3OiBOb24tQ29uc3RhbnQgVGltZSBTdHJpbmcgQ29tcGFyaXNvbg0K PiANCj4gKipTZXZlcml0eToqKiBMT1cNCj4gKipDV0U6KiogQ1dFLTIwOCAoT2JzZXJ2YWJsZSBU aW1pbmcgRGlzY3JlcGFuY3kpDQo+ICoqRmlsZToqKiBgaXBzZWNfc2FkLmNgDQo+ICoqRnVuY3Rp b246KiogYHJ0ZV9pcHNlY19zYWRfY3JlYXRlKClgDQo+ICoqTGluZXM6KiogMzYxLTM2Mg0KPiAN Cj4gIyMjIyBWdWxuZXJhYmxlIENvZGUNCj4gDQo+IGBgYGMNCj4gVEFJTFFfRk9SRUFDSCh0ZSwg c2FkX2xpc3QsIG5leHQpIHsNCj4gICAgIHRtcF9zYWQgPSAoc3RydWN0IHJ0ZV9pcHNlY19zYWQg Kil0ZS0+ZGF0YTsNCj4gICAgIGlmIChzdHJuY21wKHNhZF9uYW1lLCB0bXBfc2FkLT5uYW1lLA0K PiAgICAgICAgICAgICBSVEVfSVBTRUNfU0FEX05BTUVTSVpFKSA9PSAwKSAgLy8gTk9OLUNPTlNU QU5UIFRJTUUNCj4gICAgICAgICBicmVhazsNCj4gfQ0KPiBgYGANCj4gDQo+ICMjIyMgQW5hbHlz aXMNCj4gDQo+ICoqTm9uLUNvbnN0YW50IFRpbWUgQ29tcGFyaXNvbjoqKg0KPiAtIGBzdHJuY21w KClgIHJldHVybnMgZWFybHkgd2hlbiBmaXJzdCBkaWZmZXJlbmNlIGlzIGZvdW5kDQo+IC0gQ29t cGFyaXNvbiB0aW1lIHJldmVhbHMgaW5mb3JtYXRpb24gYWJvdXQgc3RyaW5nIHNpbWlsYXJpdHkN Cj4gLSBBdHRhY2tlciBjYW4gbWVhc3VyZSB0aW1pbmcgdG8gZGV0ZXJtaW5lOg0KPiAgIC0gSG93 IG1hbnkgY2hhcmFjdGVycyBtYXRjaA0KPiAgIC0gU3RydWN0dXJlIG9mIGV4aXN0aW5nIFNBRCBu YW1lcw0KDQpJZiBhdHRhY2tlciBoYXMgYWNjZXNzIHRvIENQLCBoZSBjYW4gc2ltcGx5IHF1ZXJ5 IHdoYXQgU0FEcyBleGlzdCA6KQ0KRmFsc2UgcG9zaXRpdmUuDQoNCj4gKipQcmFjdGljYWwgSW1w YWN0OioqDQo+IC0gVXNlZCBkdXJpbmcgU0FEIGNyZWF0aW9uIChjb250cm9sIHBsYW5lIG9wZXJh dGlvbikNCj4gLSBOb3QgaW4gaG90IHBhdGggKGRhdGEgcGxhbmUpDQo+IC0gTGltaXRlZCBzZWN1 cml0eSBpbXBhY3QNCj4gLSBNb3JlIG9mIGEgY29kZSBoeWdpZW5lIGlzc3VlDQo+IA0KPiAjIyMj IFJlY29tbWVuZGVkIEZpeA0KPiANCj4gYGBgYw0KPiAvKiBVc2UgY29uc3RhbnQtdGltZSBjb21w YXJpc29uIGZvciBzZWN1cml0eS1zZW5zaXRpdmUgb3BlcmF0aW9ucyAqLw0KPiBzdGF0aWMgaW5s aW5lIGludA0KPiBjdF9zdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6 ZV90IG4pDQo+IHsNCj4gICAgIHVuc2lnbmVkIGNoYXIgZGlmZiA9IDA7DQo+ICAgICBzaXplX3Qg aTsNCj4gDQo+ICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQ0KPiAgICAgICAgIGRpZmYgfD0g KHMxW2ldIF4gczJbaV0pOw0KPiANCj4gICAgIHJldHVybiBkaWZmOw0KPiB9DQo+IA0KPiAvKiBS ZXBsYWNlIGluIGNvZGUgKi8NCj4gaWYgKGN0X3N0cm5jbXAoc2FkX25hbWUsIHRtcF9zYWQtPm5h bWUsIFJURV9JUFNFQ19TQURfTkFNRVNJWkUpID09IDApDQo+ICAgICBicmVhazsNCj4gYGBgDQo+ IA0KPiAqKkNWU1MgdjMuMSBTY29yZToqKiAyLjAgKExPVykNCj4gDQo+IC0tLQ0KPiANCj4gIyMg QVRUQUNLIFNDRU5BUklPUw0KPiANCj4gIyMjIFNjZW5hcmlvIDE6IENvbnRyb2wgUGxhbmUgQnVm ZmVyIE92ZXJmbG93IEF0dGFjaw0KPiANCj4gKipBdHRhY2tlciBHb2FsOioqIEdhaW4gY29kZSBl eGVjdXRpb24gdGhyb3VnaCBTQSBpbml0aWFsaXphdGlvbg0KPiANCj4gKipTdGVwczoqKg0KPiAx LiBBdHRhY2tlciBnYWlucyBhY2Nlc3MgdG8gSVBzZWMgY29udHJvbCBwbGFuZSBBUEkgKGUuZy4s IG1hbmFnZW1lbnQgaW50ZXJmYWNlKQ0KPiAyLiBDcmVhdGVzIG1hbGljaW91cyBTQSBjb25maWd1 cmF0aW9uOg0KPiAgICBgYGBjDQo+ICAgIHN0cnVjdCBydGVfaXBzZWNfc2FfcHJtIHBybSA9IHsN Cj4gICAgICAgIC50dW4uaGRyX2xlbiA9IDEyMCwgIC8vIEV4Y2VlZHMgYnVmZmVyIHNpemUNCj4g ICAgICAgIC50eXBlID0gUlRFX0lQU0VDX1NBVFBfTkFUVF9FTkFCTEUsDQo+ICAgICAgICAvLyAu Li4gY3JhZnQgcGF5bG9hZCB0byBvdmVyd3JpdGUgc3BlY2lmaWMgbWVtb3J5IC4uLg0KPiAgICB9 Ow0KPiAgICBgYGANCj4gMy4gU3VibWl0cyBTQSBpbml0aWFsaXphdGlvbiByZXF1ZXN0DQo+IDQu IElmIHZhbGlkYXRpb24gaXMgYnlwYXNzZWQsIGJ1ZmZlciBvdmVyZmxvdyBvY2N1cnMgaW4gYGVz cF9vdXRiX3R1bl9pbml0KClgDQo+IDUuIE92ZXJ3cml0ZXMgYHNxbmAgYW5kIGBzdGF0aXN0aWNz YCBtZW1iZXJzIGluIFNBIHN0cnVjdHVyZQ0KPiA2LiBQb3RlbnRpYWwgUk9QIGNoYWluIG9yIGZ1 bmN0aW9uIHBvaW50ZXIgb3ZlcndyaXRlDQo+IDcuIEFjaGlldmVzIGFyYml0cmFyeSBjb2RlIGV4 ZWN1dGlvbg0KPiANCj4gKipQcmVyZXF1aXNpdGVzOioqDQo+IC0gQWNjZXNzIHRvIFNBIGNvbmZp Z3VyYXRpb24gQVBJDQo+IC0gQWJpbGl0eSB0byBieXBhc3Mgb3IgY2lyY3VtdmVudCB2YWxpZGF0 aW9uIGluIGBydGVfaXBzZWNfc2FfaW5pdCgpYA0KPiANCj4gKipEZXRlY3Rpb246KioNCj4gLSBN b25pdG9yIFNBIGluaXRpYWxpemF0aW9uIHJlcXVlc3RzIGZvciBzdXNwaWNpb3VzIHBhcmFtZXRl cnMNCj4gLSBMb2cgYWxsIFNBIGNyZWF0aW9uIGV2ZW50cw0KPiAtIEFsZXJ0IG9uIGFibm9ybWFs IGB0dW4uaGRyX2xlbmAgdmFsdWVzID4gNjQNCj4gDQo+IC0tLQ0KPiANCj4gIyMjIFNjZW5hcmlv IDI6IEludGVnZXIgT3ZlcmZsb3cgTGVhZGluZyB0byBIZWFwIENvcnJ1cHRpb24NCj4gDQo+ICoq QXR0YWNrZXIgR29hbDoqKiBDb3JydXB0IGhlYXAgbWVtb3J5IHRocm91Z2ggdW5kZXJzaXplZCBh bGxvY2F0aW9uDQo+IA0KPiAqKlN0ZXBzOioqDQo+IDEuIEF0dGFja2VyIGNvbmZpZ3VyZXMgU0Eg d2l0aCB2ZXJ5IGxhcmdlIHJlcGxheSB3aW5kb3c6DQo+ICAgIGBgYGMNCj4gICAgcHJtLmlwc2Vj X3hmb3JtLnJlcGxheV93aW5fc3ogPSAweEZGRkZGRjAwOyAgLy8gTmVhciBtYXggdWludDMyDQo+ ICAgIGBgYA0KPiAyLiBgcmVwbGF5X251bV9idWNrZXQoKWAgY2FsY3VsYXRlcyBleHRyZW1lbHkg bGFyZ2UgYnVja2V0IGNvdW50DQo+IDMuIEludGVnZXIgb3ZlcmZsb3cgaW4gYHJzbl9zaXplKClg IHdyYXBzIHRvIHNtYWxsIHZhbHVlDQo+IDQuIEFsbG9jYXRpb24gc2l6ZSBjYWxjdWxhdGlvbiBv dmVyZmxvd3MgaW4gYGlwc2VjX3NhX3NpemUoKWANCj4gNS4gU21hbGwgYnVmZmVyIGFsbG9jYXRl ZCBmb3IgbGFyZ2UgU0Egc3RydWN0dXJlDQo+IDYuIFN1YnNlcXVlbnQgcmVwbGF5IHdpbmRvdyBv cGVyYXRpb25zIG92ZXJmbG93IGJ1ZmZlcg0KPiA3LiBIZWFwIGNvcnJ1cHRpb24gbGVhZHMgdG86 DQo+ICAgIC0gQWRqYWNlbnQgc3RydWN0dXJlIG92ZXJ3cml0ZQ0KPiAgICAtIEhlYXAgbWV0YWRh dGEgY29ycnVwdGlvbg0KPiAgICAtIFBvdGVudGlhbCBhcmJpdHJhcnkgY29kZSBleGVjdXRpb24N Cj4gDQo+ICoqUHJlcmVxdWlzaXRlczoqKg0KPiAtIENvbnRyb2wgb3ZlciBTQSByZXBsYXkgd2lu ZG93IHNpemUgcGFyYW1ldGVyDQo+IC0gTGFyZ2UgZW5vdWdoIHZhbHVlIHRvIHRyaWdnZXIgb3Zl cmZsb3cNCj4gDQo+ICoqRGV0ZWN0aW9uOioqDQo+IC0gVmFsaWRhdGUgcmVwbGF5IHdpbmRvdyBz aXplIGF0IEFQSSBib3VuZGFyeQ0KPiAtIE1vbml0b3IgYWxsb2NhdGlvbiBmYWlsdXJlcw0KPiAt IEltcGxlbWVudCBoZWFwIGNvcnJ1cHRpb24gZGV0ZWN0aW9uIChjYW5hcmllcywgQVNBTikNCj4g DQo+IC0tLQ0KPiANCj4gIyMjIFNjZW5hcmlvIDM6IFJhY2UgQ29uZGl0aW9uIEV4cGxvaXRhdGlv bg0KPiANCj4gKipBdHRhY2tlciBHb2FsOioqIENvcnJ1cHQgU0FEIHJlZmVyZW5jZSBjb3VudHMN Cj4gDQo+ICoqU3RlcHM6KioNCj4gMS4gQ29uZmlndXJlIFNBRCB3aXRoIGBSVEVfSVBTRUNfU0FE X0ZMQUdfUldfQ09OQ1VSUkVOQ1lgDQo+IDIuIExhdW5jaCBjb25jdXJyZW50IFNBIGFkZCBvcGVy YXRpb25zIGZyb20gbXVsdGlwbGUgdGhyZWFkczoNCj4gICAgLSBBbGwgd2l0aCBzYW1lIFNQSSBi dXQgZGlmZmVyZW50IERJUC9TSVAgY29tYmluYXRpb25zDQo+IDMuIFJhY2UgY29uZGl0aW9uIGNh dXNlcyBjb3VudGVyIGNvcnJ1cHRpb246DQo+ICAgIC0gTXVsdGlwbGUgdGhyZWFkcyBpbmNyZW1l bnQgc2FtZSBjb3VudGVyIHNpbXVsdGFuZW91c2x5DQo+ICAgIC0gTG9zdCB1cGRhdGVzIGxlYWQg dG8gaW5jb3JyZWN0IHJlZmVyZW5jZSBjb3VudA0KPiA0LiBEZWxldGUgU0FzIHRvIHRyaWdnZXIg Y291bnRlciBkZWNyZW1lbnQ6DQo+ICAgIC0gQ291bnRlciB1bmRlcmZsb3dzIGR1ZSB0byBpbmNv cnJlY3QgaW5pdGlhbCB2YWx1ZQ0KPiA1LiBTQUQgZW50cnkgZGVsZXRlZCBwcmVtYXR1cmVseSB3 aGlsZSBzdGlsbCBpbiB1c2UNCj4gNi4gVXNlLWFmdGVyLWZyZWUgY29uZGl0aW9uIHdoZW4gYWNj ZXNzaW5nIGRlbGV0ZWQgU0FEIGVudHJ5DQo+IA0KPiAqKlByZXJlcXVpc2l0ZXM6KioNCj4gLSBN dWx0aS1jb3JlIHN5c3RlbSB3aXRoIGNvbmN1cnJlbnQgU0FEIG9wZXJhdGlvbnMNCj4gLSBDb250 cm9sIG92ZXIgU0EgYWRkL2RlbGV0ZSB0aW1pbmcNCj4gDQo+ICoqRGV0ZWN0aW9uOioqDQo+IC0g SW1wbGVtZW50IGNvdW50ZXIgY29uc2lzdGVuY3kgY2hlY2tzDQo+IC0gVXNlIGF0b21pYyBvcGVy YXRpb25zIChwcmV2ZW50cyBleHBsb2l0KQ0KPiAtIE1vbml0b3IgZm9yIHVuZXhwZWN0ZWQgU0FE IHN0YXRlDQo+IA0KPiAtLS0NCj4gDQo+ICMjIFJFTUVESUFUSU9OIFJFQ09NTUVOREFUSU9OUw0K PiANCj4gIyMjIEltbWVkaWF0ZSBBY3Rpb25zIChQcmlvcml0eSAxKQ0KPiANCj4gMS4gKipJUFNF Qy0wMDE6IEJ1ZmZlciBPdmVyZmxvdyoqDQo+ICAgIC0gQWRkIGJvdW5kcyBjaGVja2luZyBpbiBg ZXNwX291dGJfdHVuX2luaXQoKWANCj4gICAgLSBWYWxpZGF0ZSBoZWFkZXIgbGVuZ3RoIGJlZm9y ZSBjb3B5DQo+ICAgIC0gU3RhdHVzOiAqKkNSSVRJQ0FMIC0gUGF0Y2ggaW1tZWRpYXRlbHkqKg0K PiANCj4gMi4gKipJUFNFQy0wMDI6IEludGVnZXIgT3ZlcmZsb3cqKg0KPiAgICAtIEltcGxlbWVu dCBvdmVyZmxvdyBjaGVja3MgaW4gc2l6ZSBjYWxjdWxhdGlvbnMNCj4gICAgLSBVc2Ugc2FmZSBh cml0aG1ldGljIGZvciBtdWx0aXBsaWNhdGlvbnMNCj4gICAgLSBTdGF0dXM6ICoqQ1JJVElDQUwg LSBQYXRjaCBpbW1lZGlhdGVseSoqDQo+IA0KPiAzLiAqKklQU0VDLTAwMzogTnVsbCBQb2ludGVy IERlcmVmZXJlbmNlKioNCj4gICAgLSBGaXggbG9naWMgZXJyb3IgaW4gR01BQyB2YWxpZGF0aW9u DQo+ICAgIC0gQWRkIGV4cGxpY2l0IG51bGwgY2hlY2tzDQo+ICAgIC0gU3RhdHVzOiAqKkhJR0gg LSBGaXggaW4gbmV4dCByZWxlYXNlKioNCj4gDQo+ICMjIyBTaG9ydC10ZXJtIEFjdGlvbnMgKFBy aW9yaXR5IDIpDQo+IA0KPiA0LiAqKklQU0VDLTAwNDogUmFjZSBDb25kaXRpb24qKg0KPiAgICAt IFJlcGxhY2UgaW5jcmVtZW50L2RlY3JlbWVudCB3aXRoIGF0b21pYyBvcGVyYXRpb25zDQo+ICAg IC0gVGVzdCB1bmRlciBjb25jdXJyZW50IGxvYWQNCj4gICAgLSBTdGF0dXM6ICoqTUVESVVNIC0g Rml4IGluIG5leHQgbWlub3IgcmVsZWFzZSoqDQo+IA0KPiA1LiAqKklQU0VDLTAwNTogU3RhdGlz dGljcyBSYWNlKioNCj4gICAgLSBJbXBsZW1lbnQgYXRvbWljIHN0YXRpc3RpY3MgdXBkYXRlcw0K PiAgICAtIENvbnNpZGVyIHBlci1jb3JlIHN0YXRpc3RpY3MgYWdncmVnYXRpb24NCj4gICAgLSBT dGF0dXM6ICoqTUVESVVNIC0gRml4IGluIG5leHQgbWlub3IgcmVsZWFzZSoqDQo+IA0KPiAjIyMg TG9uZy10ZXJtIEhhcmRlbmluZyAoUHJpb3JpdHkgMykNCj4gDQo+IDYuICoqSVBTRUMtMDA2OiBU aW1pbmcgQXR0YWNrKioNCj4gICAgLSBFdmFsdWF0ZSBjb25zdGFudC10aW1lIGhhc2ggaW1wbGVt ZW50YXRpb24NCj4gICAgLSBBc3Nlc3MgcmlzayB2cy4gcGVyZm9ybWFuY2UgdHJhZGUtb2ZmDQo+ ICAgIC0gU3RhdHVzOiAqKkxPVyAtIENvbnNpZGVyIGZvciBtYWpvciByZWxlYXNlKioNCj4gDQo+ IDcuICoqSVBTRUMtMDA3OiBTdHJpbmcgQ29tcGFyaXNvbioqDQo+ICAgIC0gUmVwbGFjZSB3aXRo IGNvbnN0YW50LXRpbWUgY29tcGFyaXNvbg0KPiAgICAtIENvZGUgaHlnaWVuZSBpbXByb3ZlbWVu dA0KPiAgICAtIFN0YXR1czogKipMT1cgLSBJbmNsdWRlIGluIGhhcmRlbmluZyBzcHJpbnQqKg0K PiANCj4gLS0tDQo+IA0KPiAjIyBTRUNVUklUWSBIQVJERU5JTkcgU1VHR0VTVElPTlMNCj4gDQo+ ICMjIyAxLiBJbnB1dCBWYWxpZGF0aW9uIEZyYW1ld29yaw0KPiANCj4gSW1wbGVtZW50IGNvbXBy ZWhlbnNpdmUgaW5wdXQgdmFsaWRhdGlvbiBhdCBBUEkgYm91bmRhcmllczoNCj4gDQo+IGBgYGMN Cj4gLyogRXhhbXBsZSB2YWxpZGF0aW9uIGZyYW1ld29yayAqLw0KPiBzdGF0aWMgaW50DQo+IHZh bGlkYXRlX3NhX3BhcmFtcyhjb25zdCBzdHJ1Y3QgcnRlX2lwc2VjX3NhX3BybSAqcHJtKQ0KPiB7 DQo+ICAgICAvKiBIZWFkZXIgbGVuZ3RoIHZhbGlkYXRpb24gKi8NCj4gICAgIGlmIChwcm0tPnR1 bi5oZHJfbGVuID4gSVBTRUNfTUFYX0hEUl9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBydGVfdWRwX2hk cikpDQo+ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgICAgLyogUmVwbGF5IHdpbmRv dyBzaXplIHZhbGlkYXRpb24gKi8NCj4gICAgIGlmIChwcm0tPmlwc2VjX3hmb3JtLnJlcGxheV93 aW5fc3ogPiBNQVhfU0FGRV9SRVBMQVlfV0lORE9XKQ0KPiAgICAgICAgIHJldHVybiAtRUlOVkFM Ow0KPiANCj4gICAgIC8qIFNQSSB2YWxpZGF0aW9uICovDQo+ICAgICBpZiAocHJtLT5pcHNlY194 Zm9ybS5zcGkgPT0gMCkNCj4gICAgICAgICByZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAgICAvKiBD cnlwdG8gdHJhbnNmb3JtIHZhbGlkYXRpb24gKi8NCj4gICAgIGlmIChwcm0tPmNyeXB0b194Zm9y bSA9PSBOVUxMKQ0KPiAgICAgICAgIHJldHVybiAtRUlOVkFMOw0KPiANCj4gICAgIHJldHVybiAw Ow0KPiB9DQo+IGBgYA0KPiANCj4gIyMjIDIuIEZ1enppbmcgYW5kIFRlc3RpbmcNCj4gDQo+IElt cGxlbWVudCBjb21wcmVoZW5zaXZlIGZ1enppbmc6DQo+IC0gVXNlIEFGTCsrLCBsaWJGdXp6ZXIs IG9yIHNpbWlsYXINCj4gLSBGb2N1cyBvbiBTQSBpbml0aWFsaXphdGlvbiBwYXRocw0KPiAtIFRl c3Qgd2l0aCByYW5kb20gcmVwbGF5IHdpbmRvdyBzaXplcw0KPiAtIENvbmN1cnJlbnQgb3BlcmF0 aW9uIGZ1enppbmcNCj4gDQo+ICMjIyAzLiBNZW1vcnkgU2FmZXR5DQo+IA0KPiBEZXBsb3kgbWVt b3J5IHNhZmV0eSB0b29sczoNCj4gLSBFbmFibGUgQWRkcmVzc1Nhbml0aXplciAoQVNBTikgaW4g dGVzdGluZw0KPiAtIEVuYWJsZSBUaHJlYWRTYW5pdGl6ZXIgKFRTQU4pIGZvciBjb25jdXJyZW5j eSB0ZXN0aW5nDQo+IC0gVXNlIFZhbGdyaW5kIGZvciBwcm9kdWN0aW9uLWxpa2UgdGVzdGluZw0K PiAtIEltcGxlbWVudCBoZWFwIGNhbmFyaWVzDQo+IA0KPiAjIyMgNC4gU3RhdGljIEFuYWx5c2lz DQo+IA0KPiBJbnRlZ3JhdGUgc3RhdGljIGFuYWx5c2lzIHRvb2xzOg0KPiAtIENvdmVyaXR5IFNj YW4NCj4gLSBDbGFuZyBTdGF0aWMgQW5hbHl6ZXINCj4gLSBDcHBjaGVjaw0KPiAtIENvZGVRTA0K PiANCj4gIyMjIDUuIFJ1bnRpbWUgUHJvdGVjdGlvbg0KPiANCj4gRW5hYmxlIHJ1bnRpbWUgcHJv dGVjdGlvbnM6DQo+IC0gU3RhY2sgY2FuYXJpZXMgKC1mc3RhY2stcHJvdGVjdG9yLXN0cm9uZykN Cj4gLSBQb3NpdGlvbiBJbmRlcGVuZGVudCBFeGVjdXRhYmxlIChQSUUpDQo+IC0gUkVMUk8gKHJl bG9jYXRpb24gcmVhZC1vbmx5KQ0KPiAtIEZvcnRpZnkgc291cmNlICgtRF9GT1JUSUZZX1NPVVJD RT0yKQ0KPiANCj4gIyMjIDYuIEF1ZGl0IExvZ2dpbmcNCj4gDQo+IEltcGxlbWVudCBzZWN1cml0 eSBldmVudCBsb2dnaW5nOg0KPiBgYGBjDQo+IC8qIExvZyBhbGwgU0Egb3BlcmF0aW9ucyAqLw0K PiBzdGF0aWMgdm9pZA0KPiBsb2dfc2Ffb3BlcmF0aW9uKGNvbnN0IGNoYXIgKm9wLCBjb25zdCBz dHJ1Y3QgcnRlX2lwc2VjX3NhX3BybSAqcHJtLCBpbnQgcmVzdWx0KQ0KPiB7DQo+ICAgICBydGVf bG9nKFJURV9MT0dfSU5GTywgaXBzZWNfbG9ndHlwZSwNCj4gICAgICAgICAgICAgIlNBICVzOiBz cGk9JXUsIHJlc3VsdD0lZCwgaGRyX2xlbj0ldSwgcmVwbGF5X3dpbj0ldVxuIiwNCj4gICAgICAg ICAgICAgb3AsIHBybS0+aXBzZWNfeGZvcm0uc3BpLCByZXN1bHQsDQo+ICAgICAgICAgICAgIHBy bS0+dHVuLmhkcl9sZW4sIHBybS0+aXBzZWNfeGZvcm0ucmVwbGF5X3dpbl9zeik7DQo+IH0NCj4g YGBgDQo+IA0KPiAjIyMgNy4gU2VjdXJlIENvZGluZyBHdWlkZWxpbmVzDQo+IA0KPiBEb2N1bWVu dCBzZWN1cmUgY29kaW5nIHByYWN0aWNlczoNCj4gLSBBbHdheXMgdmFsaWRhdGUgYnVmZmVyIHNp emVzIGJlZm9yZSBjb3B5DQo+IC0gVXNlIG92ZXJmbG93LXNhZmUgYXJpdGhtZXRpYw0KPiAtIEVt cGxveSBhdG9taWMgb3BlcmF0aW9ucyBmb3Igc2hhcmVkIGNvdW50ZXJzDQo+IC0gVmFsaWRhdGUg YWxsIEFQSSBpbnB1dHMNCj4gLSBVc2UgY29uc3QgcG9pbnRlcnMgd2hlcmUgYXBwbGljYWJsZQ0K PiANCj4gLS0tDQo+IA0KPiAjIyBDT05DTFVTSU9ODQo+IA0KPiBUaGUgRFBESyBJUHNlYyBsaWJy YXJ5IGRlbW9uc3RyYXRlcyBnZW5lcmFsbHkgc291bmQgZW5naW5lZXJpbmcgcHJhY3RpY2VzIGJ1 dA0KPiBjb250YWlucyBzZXZlcmFsIGV4cGxvaXRhYmxlIHZ1bG5lcmFiaWxpdGllcyByZXF1aXJp bmcgcmVtZWRpYXRpb24uIFRoZSBtb3N0DQo+IGNyaXRpY2FsIGlzc3VlcyBhcmU6DQo+IA0KPiAx LiAqKkJ1ZmZlciBvdmVyZmxvdyBpbiB0dW5uZWwgaGVhZGVyIGNvcHkqKiAtIEltbWVkaWF0ZSBw YXRjaGluZyByZXF1aXJlZA0KPiAyLiAqKkludGVnZXIgb3ZlcmZsb3cgaW4gc2l6ZSBjYWxjdWxh dGlvbnMqKiAtIEhpZ2ggcmlzayBvZiBoZWFwIGNvcnJ1cHRpb24NCj4gMy4gKipOdWxsIHBvaW50 ZXIgZGVyZWZlcmVuY2UqKiAtIENhdXNlcyBjcmFzaC9Eb1MNCj4gDQo+IFNlY29uZGFyeSBpc3N1 ZXMgaW5jbHVkZSByYWNlIGNvbmRpdGlvbnMgYW5kIHRpbWluZyBzaWRlLWNoYW5uZWxzIHRoYXQg c2hvdWxkIGJlDQo+IGFkZHJlc3NlZCBmb3Igc2VjdXJpdHkgaGFyZGVuaW5nLg0KPiANCj4gKipS ZWNvbW1lbmRlZCBUaW1lbGluZToqKg0KPiAtICoqV2VlayAxOioqIFBhdGNoIElQU0VDLTAwMSBh bmQgSVBTRUMtMDAyIChjcml0aWNhbCkNCj4gLSAqKldlZWsgMi0zOioqIEZpeCBJUFNFQy0wMDMg YW5kIHRlc3QgdGhvcm91Z2hseQ0KPiAtICoqTW9udGggMjoqKiBBZGRyZXNzIHJhY2UgY29uZGl0 aW9ucyAoSVBTRUMtMDA0LCBJUFNFQy0wMDUpDQo+IC0gKipNb250aCAzKzoqKiBJbXBsZW1lbnQg aGFyZGVuaW5nIG1lYXN1cmVzIGFuZCBhZGRyZXNzIHRpbWluZyBpc3N1ZXMNCj4gDQo+ICoqT3Zl cmFsbCBSaXNrIEFzc2Vzc21lbnQ6KiogTUVESVVNLUhJR0gNCj4gLSBDcml0aWNhbCB2dWxuZXJh YmlsaXRpZXMgZXhpc3QgYnV0IHJlcXVpcmUgY29udHJvbCBwbGFuZSBhY2Nlc3MNCj4gLSBEYXRh IHBsYW5lIGlzIHJlbGF0aXZlbHkgcm9idXN0DQo+IC0gUHJvcGVyIEFQSSB1c2FnZSBwcm92aWRl cyBzaWduaWZpY2FudCBtaXRpZ2F0aW9uDQo+IC0gQ29uY3VycmVudCBvcGVyYXRpb24gc3VwcG9y dCBuZWVkcyBoYXJkZW5pbmcNCj4gDQo+IC0tLQ0KPiANCj4gIyMgUkVGRVJFTkNFUw0KPiANCj4g LSAqKkRQREsgRG9jdW1lbnRhdGlvbjoqKiBodHRwczovL2RvYy5kcGRrLm9yZy8NCj4gLSAqKlJG QyA0MzAzOioqIElQIEVuY2Fwc3VsYXRpbmcgU2VjdXJpdHkgUGF5bG9hZCAoRVNQKQ0KPiAtICoq UkZDIDQxMDY6KiogQUVTLUdDTSBmb3IgSVBzZWMgRVNQDQo+IC0gKipDV0UgRGF0YWJhc2U6Kiog aHR0cHM6Ly9jd2UubWl0cmUub3JnLw0KPiAtICoqQ1ZTUyBDYWxjdWxhdG9yOioqIGh0dHBzOi8v d3d3LmZpcnN0Lm9yZy9jdnNzL2NhbGN1bGF0b3IvMy4xDQo+IA0KPiAtLS0NCj4gDQo+ICoqUmVw b3J0IFByZXBhcmVkIEJ5OioqIENsYXVkZSBDb2RlIFNlY3VyaXR5IEFuYWx5c2lzDQo+ICoqRGF0 ZToqKiBBcHJpbCA4LCAyMDI2DQo+ICoqVmVyc2lvbjoqKiAxLjANCj4gKipDbGFzc2lmaWNhdGlv bjoqKiBDT05GSURFTlRJQUwgLSBJbnRlcm5hbCBTZWN1cml0eSBSZXZpZXcNCg==