From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8400 invoked by alias); 6 Jan 2003 19:24:06 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 8385 invoked from network); 6 Jan 2003 19:24:01 -0000 Received: from unknown (HELO esds.vss.fsi.com) (66.136.174.212) by 209.249.29.67 with SMTP; 6 Jan 2003 19:24:01 -0000 Received: from eos.vss.fsi.com (eos [198.51.27.61]) by esds.vss.fsi.com (8.9.1a/8.9.1) with ESMTP id NAA21312 for ; Mon, 6 Jan 2003 13:23:49 -0600 (CST) Received: from localhost (ford@localhost) by eos.vss.fsi.com (8.11.6+Sun/8.11.6) with ESMTP id h06JNm712450 for ; Mon, 6 Jan 2003 13:23:49 -0600 (CST) X-Authentication-Warning: eos.vss.fsi.com: ford owned process doing -bs Date: Mon, 06 Jan 2003 19:24:00 -0000 From: Brian Ford X-X-Sender: ford@eos To: gdb-patches@sources.redhat.com Subject: Fall back from Windows to Cygwin PIDs Message-ID: MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-162216788-1041881015=:544" X-SW-Source: 2003-01/txt/msg00222.txt.bz2 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---559023410-162216788-1041881015=:544 Content-Type: TEXT/PLAIN; charset=US-ASCII Content-length: 433 The attached patch attempts to fall back from Windows to Cygwin PIDs. This only adds functionality, without changing the previous behavior. As such, I believe it will lessen confusion for those expecting normal Unix like behavior under Cygwin. Thanks and please CC me on replies. -- Brian Ford Senior Realtime Software Engineer VITAL - Visual Simulation Systems FlightSafety International Phone: 314-551-8460 Fax: 314-551-8444 ---559023410-162216788-1041881015=:544 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="win32-nat.c" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="win32-nat.c" Content-length: 87133 LyogVGFyZ2V0LXZlY3RvciBvcGVyYXRpb25zIGZvciBjb250cm9sbGluZyB3 aW4zMiBjaGlsZCBwcm9jZXNzZXMsIGZvciBHREIuDQoNCiAgIENvcHlyaWdo dCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAy MDAyIEZyZWUNCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCg0KICAg Q29udHJpYnV0ZWQgYnkgQ3lnbnVzIFNvbHV0aW9ucywgQSBSZWQgSGF0IENv bXBhbnkuDQoNCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4NCg0KICAg VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkNCiAgIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5DQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KICAgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KICAgVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsDQogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlIG50aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICAgTUVSQ0hBTlRBQklM SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQ0KICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4NCg0KICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w eSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UNCiAgIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl IFNvZnR3YXJlDQogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxh Y2UgLSBTdWl0ZSAzMzAsDQogICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVT QS4gICovDQoNCi8qIE9yaWdpbmFsbHkgYnkgU3RldmUgQ2hhbWJlcmxhaW4s IHNhY0BjeWdudXMuY29tICovDQoNCi8qIFdlIGFzc3VtZSB3ZSdyZSBiZWlu ZyBidWlsdCB3aXRoIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGN5Z3dpbi4gICov DQoNCiNpbmNsdWRlICJkZWZzLmgiDQojaW5jbHVkZSAidG0uaCIJCQkvKiBy ZXF1aXJlZCBmb3IgU1NFIHJlZ2lzdGVycyAqLw0KI2luY2x1ZGUgImZyYW1l LmgiCQkvKiByZXF1aXJlZCBieSBpbmZlcmlvci5oICovDQojaW5jbHVkZSAi aW5mZXJpb3IuaCINCiNpbmNsdWRlICJ0YXJnZXQuaCINCiNpbmNsdWRlICJn ZGJjb3JlLmgiDQojaW5jbHVkZSAiY29tbWFuZC5oIg0KI2luY2x1ZGUgImNv bXBsZXRlci5oIg0KI2luY2x1ZGUgInJlZ2NhY2hlLmgiDQojaW5jbHVkZSAi dG9wLmgiDQojaW5jbHVkZSAiaTM4Ni10ZGVwLmgiDQojaW5jbHVkZSA8c2ln bmFsLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8ZmNu dGwuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDx3aW5kb3dz Lmg+DQojaW5jbHVkZSA8aW1hZ2VobHAuaD4NCiNpbmNsdWRlIDxzeXMvY3ln d2luLmg+DQoNCiNpbmNsdWRlICJidWlsZHN5bS5oIg0KI2luY2x1ZGUgInN5 bWZpbGUuaCINCiNpbmNsdWRlICJvYmpmaWxlcy5oIg0KI2luY2x1ZGUgImdk Yl9zdHJpbmcuaCINCiNpbmNsdWRlICJnZGJ0aHJlYWQuaCINCiNpbmNsdWRl ICJnZGJjbWQuaCINCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4NCiNpbmNsdWRl IDx1bmlzdGQuaD4NCg0KLyogVGhlIHVpJ3MgZXZlbnQgbG9vcC4gKi8NCmV4 dGVybiBpbnQgKCp1aV9sb29wX2hvb2spIChpbnQgc2lnbm8pOw0KDQovKiBJ ZiB3ZSdyZSBub3QgdXNpbmcgdGhlIG9sZCBDeWd3aW4gaGVhZGVyIGZpbGUg c2V0LCBkZWZpbmUgdGhlDQogICBmb2xsb3dpbmcgd2hpY2ggbmV2ZXIgc2hv dWxkIGhhdmUgYmVlbiBpbiB0aGUgZ2VuZXJpYyBXaW4zMiBBUEkNCiAgIGhl YWRlcnMgaW4gdGhlIGZpcnN0IHBsYWNlIHNpbmNlIHRoZXkgd2VyZSBvdXIg b3duIGludmVudGlvbi4uLiAqLw0KI2lmbmRlZiBfR05VX0hfV0lORE9XU19I DQplbnVtDQogIHsNCiAgICBGTEFHX1RSQUNFX0JJVCA9IDB4MTAwLA0KICAg IENPTlRFWFRfREVCVUdHRVIgPSAoQ09OVEVYVF9GVUxMIHwgQ09OVEVYVF9G TE9BVElOR19QT0lOVCkNCiAgfTsNCiNlbmRpZg0KI2luY2x1ZGUgPHN5cy9w cm9jZnMuaD4NCiNpbmNsdWRlIDxwc2FwaS5oPg0KDQojaWZkZWYgSEFWRV9T U0VfUkVHUw0KI2RlZmluZSBDT05URVhUX0RFQlVHR0VSX0RSIENPTlRFWFRf REVCVUdHRVIgfCBDT05URVhUX0RFQlVHX1JFR0lTVEVSUyBcDQoJfCBDT05U RVhUX0VYVEVOREVEX1JFR0lTVEVSUw0KI2Vsc2UNCiNkZWZpbmUgQ09OVEVY VF9ERUJVR0dFUl9EUiBDT05URVhUX0RFQlVHR0VSIHwgQ09OVEVYVF9ERUJV R19SRUdJU1RFUlMNCiNlbmRpZg0KDQpzdGF0aWMgdW5zaWduZWQgZHJbOF07 DQpzdGF0aWMgaW50IGRlYnVnX3JlZ2lzdGVyc19jaGFuZ2VkID0gMDsNCnN0 YXRpYyBpbnQgZGVidWdfcmVnaXN0ZXJzX3VzZWQgPSAwOw0KDQovKiBUaGUg c3RyaW5nIHNlbnQgYnkgY3lnd2luIHdoZW4gaXQgcHJvY2Vzc2VzIGEgc2ln bmFsLg0KICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGluIGEgY3lnd2luIGlu Y2x1ZGUgZmlsZS4gKi8NCiNkZWZpbmUgQ1lHV0lOX1NJR05BTF9TVFJJTkcg ImN5Z3dpbjogc2lnbmFsIg0KDQojZGVmaW5lIENIRUNLKHgpCWNoZWNrICh4 LCBfX0ZJTEVfXyxfX0xJTkVfXykNCiNkZWZpbmUgREVCVUdfRVhFQyh4KQlp ZiAoZGVidWdfZXhlYykJCXByaW50Zl91bmZpbHRlcmVkIHgNCiNkZWZpbmUg REVCVUdfRVZFTlRTKHgpCWlmIChkZWJ1Z19ldmVudHMpCXByaW50Zl91bmZp bHRlcmVkIHgNCiNkZWZpbmUgREVCVUdfTUVNKHgpCWlmIChkZWJ1Z19tZW1v cnkpCXByaW50Zl91bmZpbHRlcmVkIHgNCiNkZWZpbmUgREVCVUdfRVhDRVBU KHgpCWlmIChkZWJ1Z19leGNlcHRpb25zKQlwcmludGZfdW5maWx0ZXJlZCB4 DQoNCi8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8NCmV4dGVybiBzdHJ1Y3Qg dGFyZ2V0X29wcyBjaGlsZF9vcHM7DQoNCnN0YXRpYyB2b2lkIGNoaWxkX3N0 b3AgKHZvaWQpOw0Kc3RhdGljIGludCB3aW4zMl9jaGlsZF90aHJlYWRfYWxp dmUgKHB0aWRfdCk7DQp2b2lkIGNoaWxkX2tpbGxfaW5mZXJpb3IgKHZvaWQp Ow0KDQpzdGF0aWMgZW51bSB0YXJnZXRfc2lnbmFsIGxhc3Rfc2lnID0gVEFS R0VUX1NJR05BTF8wOw0KLyogU2V0IGlmIGEgc2lnbmFsIHdhcyByZWNlaXZl ZCBmcm9tIHRoZSBkZWJ1Z2dlZCBwcm9jZXNzICovDQoNCi8qIFRocmVhZCBp bmZvcm1hdGlvbiBzdHJ1Y3R1cmUgdXNlZCB0byB0cmFjayBpbmZvcm1hdGlv biB0aGF0IGlzDQogICBub3QgYXZhaWxhYmxlIGluIGdkYidzIHRocmVhZCBz dHJ1Y3R1cmUuICovDQp0eXBlZGVmIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1 Y3QNCiAgew0KICAgIHN0cnVjdCB0aHJlYWRfaW5mb19zdHJ1Y3QgKm5leHQ7 DQogICAgRFdPUkQgaWQ7DQogICAgSEFORExFIGg7DQogICAgY2hhciAqbmFt ZTsNCiAgICBpbnQgc3VzcGVuZF9jb3VudDsNCiAgICBDT05URVhUIGNvbnRl eHQ7DQogICAgU1RBQ0tGUkFNRSBzZjsNCiAgfQ0KdGhyZWFkX2luZm87DQoN CnN0YXRpYyB0aHJlYWRfaW5mbyB0aHJlYWRfaGVhZDsNCg0KLyogVGhlIHBy b2Nlc3MgYW5kIHRocmVhZCBoYW5kbGVzIGZvciB0aGUgYWJvdmUgY29udGV4 dC4gKi8NCg0Kc3RhdGljIERFQlVHX0VWRU5UIGN1cnJlbnRfZXZlbnQ7CS8q IFRoZSBjdXJyZW50IGRlYnVnIGV2ZW50IGZyb20NCgkJCQkJICAgV2FpdEZv ckRlYnVnRXZlbnQgKi8NCnN0YXRpYyBIQU5ETEUgY3VycmVudF9wcm9jZXNz X2hhbmRsZTsJLyogQ3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzICovDQpz dGF0aWMgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkOwkvKiBJbmZvIG9u IGN1cnJlbnRseSBzZWxlY3RlZCB0aHJlYWQgKi8NCnN0YXRpYyBEV09SRCBt YWluX3RocmVhZF9pZDsJCS8qIFRocmVhZCBJRCBvZiB0aGUgbWFpbiB0aHJl YWQgKi8NCg0KLyogQ291bnRzIG9mIHRoaW5ncy4gKi8NCnN0YXRpYyBpbnQg ZXhjZXB0aW9uX2NvdW50ID0gMDsNCnN0YXRpYyBpbnQgZXZlbnRfY291bnQg PSAwOw0Kc3RhdGljIGludCBzYXdfY3JlYXRlOw0KDQovKiBVc2VyIG9wdGlv bnMuICovDQpzdGF0aWMgaW50IG5ld19jb25zb2xlID0gMDsNCnN0YXRpYyBp bnQgbmV3X2dyb3VwID0gMTsNCnN0YXRpYyBpbnQgZGVidWdfZXhlYyA9IDA7 CQkvKiBzaG93IGV4ZWN1dGlvbiAqLw0Kc3RhdGljIGludCBkZWJ1Z19ldmVu dHMgPSAwOwkJLyogc2hvdyBldmVudHMgZnJvbSBrZXJuZWwgKi8NCnN0YXRp YyBpbnQgZGVidWdfbWVtb3J5ID0gMDsJCS8qIHNob3cgdGFyZ2V0IG1lbW9y eSBhY2Nlc3NlcyAqLw0Kc3RhdGljIGludCBkZWJ1Z19leGNlcHRpb25zID0g MDsJLyogc2hvdyB0YXJnZXQgZXhjZXB0aW9ucyAqLw0Kc3RhdGljIGludCB1 c2VzaGVsbCA9IDA7CQkvKiB1c2Ugc2hlbGwgZm9yIHN1YnByb2Nlc3NlcyAq Lw0KDQovKiBUaGlzIHZlY3RvciBtYXBzIEdEQidzIGlkZWEgb2YgYSByZWdp c3RlcidzIG51bWJlciBpbnRvIGFuIGFkZHJlc3MNCiAgIGluIHRoZSB3aW4z MiBleGNlcHRpb24gY29udGV4dCB2ZWN0b3IuDQoNCiAgIEl0IGFsc28gY29u dGFpbnMgdGhlIGJpdCBtYXNrIG5lZWRlZCB0byBsb2FkIHRoZSByZWdpc3Rl ciBpbiBxdWVzdGlvbi4NCg0KICAgT25lIGRheSB3ZSBjb3VsZCByZWFkIGEg cmVnLCB3ZSBjb3VsZCBpbnNwZWN0IHRoZSBjb250ZXh0IHdlDQogICBhbHJl YWR5IGhhdmUgbG9hZGVkLCBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlIGJpdCBz ZXQgdGhhdCB3ZSBuZWVkLA0KICAgd2UgcmVhZCB0aGF0IHNldCBvZiByZWdp c3RlcnMgaW4gdXNpbmcgR2V0VGhyZWFkQ29udGV4dC4gIElmIHRoZQ0KICAg Y29udGV4dCBhbHJlYWR5IGNvbnRhaW5zIHdoYXQgd2UgbmVlZCwgd2UganVz dCB1bnBhY2sgaXQuIFRoZW4gdG8NCiAgIHdyaXRlIGEgcmVnaXN0ZXIsIGZp cnN0IHdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgY29udGFp bnMNCiAgIHRoZSBvdGhlciByZWdzIG9mIHRoZSBncm91cCwgYW5kIHRoZW4g d2UgY29weSB0aGUgaW5mbyBpbiBhbmQgc2V0DQogICBvdXQgYml0LiAqLw0K DQojZGVmaW5lIGNvbnRleHRfb2Zmc2V0KHgpICgoaW50KSYoKChDT05URVhU ICopTlVMTCktPngpKQ0Kc3RhdGljIGNvbnN0IGludCBtYXBwaW5nc1tdID0N CnsNCiAgY29udGV4dF9vZmZzZXQgKEVheCksDQogIGNvbnRleHRfb2Zmc2V0 IChFY3gpLA0KICBjb250ZXh0X29mZnNldCAoRWR4KSwNCiAgY29udGV4dF9v ZmZzZXQgKEVieCksDQogIGNvbnRleHRfb2Zmc2V0IChFc3ApLA0KICBjb250 ZXh0X29mZnNldCAoRWJwKSwNCiAgY29udGV4dF9vZmZzZXQgKEVzaSksDQog IGNvbnRleHRfb2Zmc2V0IChFZGkpLA0KICBjb250ZXh0X29mZnNldCAoRWlw KSwNCiAgY29udGV4dF9vZmZzZXQgKEVGbGFncyksDQogIGNvbnRleHRfb2Zm c2V0IChTZWdDcyksDQogIGNvbnRleHRfb2Zmc2V0IChTZWdTcyksDQogIGNv bnRleHRfb2Zmc2V0IChTZWdEcyksDQogIGNvbnRleHRfb2Zmc2V0IChTZWdF cyksDQogIGNvbnRleHRfb2Zmc2V0IChTZWdGcyksDQogIGNvbnRleHRfb2Zm c2V0IChTZWdHcyksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVn aXN0ZXJBcmVhWzAgKiAxMF0pLA0KICBjb250ZXh0X29mZnNldCAoRmxvYXRT YXZlLlJlZ2lzdGVyQXJlYVsxICogMTBdKSwNCiAgY29udGV4dF9vZmZzZXQg KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMiAqIDEwXSksDQogIGNvbnRleHRf b2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0ZXJBcmVhWzMgKiAxMF0pLA0KICBj b250ZXh0X29mZnNldCAoRmxvYXRTYXZlLlJlZ2lzdGVyQXJlYVs0ICogMTBd KSwNCiAgY29udGV4dF9vZmZzZXQgKEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFb NSAqIDEwXSksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuUmVnaXN0 ZXJBcmVhWzYgKiAxMF0pLA0KICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZl LlJlZ2lzdGVyQXJlYVs3ICogMTBdKSwNCiAgY29udGV4dF9vZmZzZXQgKEZs b2F0U2F2ZS5Db250cm9sV29yZCksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9h dFNhdmUuU3RhdHVzV29yZCksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNh dmUuVGFnV29yZCksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuRXJy b3JTZWxlY3RvciksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuRXJy b3JPZmZzZXQpLA0KICBjb250ZXh0X29mZnNldCAoRmxvYXRTYXZlLkRhdGFT ZWxlY3RvciksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuRGF0YU9m ZnNldCksDQogIGNvbnRleHRfb2Zmc2V0IChGbG9hdFNhdmUuRXJyb3JTZWxl Y3RvcikNCiNpZmRlZiBIQVZFX1NTRV9SRUdTDQogIC8qIFhNTTAtNyAqLyAs DQogIGNvbnRleHRfb2Zmc2V0IChFeHRlbmRlZFJlZ2lzdGVyc1sxMCoxNl0p LA0KICBjb250ZXh0X29mZnNldCAoRXh0ZW5kZWRSZWdpc3RlcnNbMTEqMTZd KSwNCiAgY29udGV4dF9vZmZzZXQgKEV4dGVuZGVkUmVnaXN0ZXJzWzEyKjE2 XSksDQogIGNvbnRleHRfb2Zmc2V0IChFeHRlbmRlZFJlZ2lzdGVyc1sxMyox Nl0pLA0KICBjb250ZXh0X29mZnNldCAoRXh0ZW5kZWRSZWdpc3RlcnNbMTQq MTZdKSwNCiAgY29udGV4dF9vZmZzZXQgKEV4dGVuZGVkUmVnaXN0ZXJzWzE1 KjE2XSksDQogIGNvbnRleHRfb2Zmc2V0IChFeHRlbmRlZFJlZ2lzdGVyc1sx NioxNl0pLA0KICBjb250ZXh0X29mZnNldCAoRXh0ZW5kZWRSZWdpc3RlcnNb MTcqMTZdKSwNCiAgLyogTVhDU1IgKi8NCiAgY29udGV4dF9vZmZzZXQgKEV4 dGVuZGVkUmVnaXN0ZXJzWzI0XSkNCiNlbmRpZg0KfTsNCg0KI3VuZGVmIGNv bnRleHRfb2Zmc2V0DQoNCi8qIFRoaXMgdmVjdG9yIG1hcHMgdGhlIHRhcmdl dCdzIGlkZWEgb2YgYW4gZXhjZXB0aW9uIChleHRyYWN0ZWQNCiAgIGZyb20g dGhlIERFQlVHX0VWRU5UIHN0cnVjdHVyZSkgdG8gR0RCJ3MgaWRlYS4gKi8N Cg0Kc3RydWN0IHhsYXRlX2V4Y2VwdGlvbg0KICB7DQogICAgaW50IHRoZW07 DQogICAgZW51bSB0YXJnZXRfc2lnbmFsIHVzOw0KICB9Ow0KDQpzdGF0aWMg Y29uc3Qgc3RydWN0IHhsYXRlX2V4Y2VwdGlvbg0KICB4bGF0ZVtdID0NCnsN CiAge0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCBUQVJHRVRfU0lHTkFM X1NFR1Z9LA0KICB7U1RBVFVTX1NUQUNLX09WRVJGTE9XLCBUQVJHRVRfU0lH TkFMX1NFR1Z9LA0KICB7RVhDRVBUSU9OX0JSRUFLUE9JTlQsIFRBUkdFVF9T SUdOQUxfVFJBUH0sDQogIHtEQkdfQ09OVFJPTF9DLCBUQVJHRVRfU0lHTkFM X0lOVH0sDQogIHtFWENFUFRJT05fU0lOR0xFX1NURVAsIFRBUkdFVF9TSUdO QUxfVFJBUH0sDQogIHtTVEFUVVNfRkxPQVRfRElWSURFX0JZX1pFUk8sIFRB UkdFVF9TSUdOQUxfRlBFfSwNCiAgey0xLCAtMX19Ow0KDQpzdGF0aWMgdm9p ZA0KY2hlY2sgKEJPT0wgb2ssIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5l KQ0Kew0KICBpZiAoIW9rKQ0KICAgIHByaW50Zl9maWx0ZXJlZCAoImVycm9y IHJldHVybiAlczolZCB3YXMgJWx1XG4iLCBmaWxlLCBsaW5lLA0KCQkgICAg IEdldExhc3RFcnJvciAoKSk7DQp9DQoNCg0KLyogRmluZCBhIHRocmVhZCBy ZWNvcmQgZ2l2ZW4gYSB0aHJlYWQgaWQuDQogICBJZiBnZXRfY29udGV4dCB0 aGVuIGFsc28gcmV0cmlldmUgdGhlIGNvbnRleHQgZm9yIHRoaXMNCiAgIHRo cmVhZC4gKi8NCnN0YXRpYyB0aHJlYWRfaW5mbyAqDQp0aHJlYWRfcmVjIChE V09SRCBpZCwgaW50IGdldF9jb250ZXh0KQ0Kew0KICB0aHJlYWRfaW5mbyAq dGg7DQoNCiAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsgKHRoID0gdGgtPm5l eHQpICE9IE5VTEw7KQ0KICAgIGlmICh0aC0+aWQgPT0gaWQpDQogICAgICB7 DQoJaWYgKCF0aC0+c3VzcGVuZF9jb3VudCAmJiBnZXRfY29udGV4dCkNCgkg IHsNCgkgICAgaWYgKGdldF9jb250ZXh0ID4gMCAmJiBpZCAhPSBjdXJyZW50 X2V2ZW50LmR3VGhyZWFkSWQpDQoJICAgICAgdGgtPnN1c3BlbmRfY291bnQg PSBTdXNwZW5kVGhyZWFkICh0aC0+aCkgKyAxOw0KCSAgICBlbHNlIGlmIChn ZXRfY29udGV4dCA8IDApDQoJICAgICAgdGgtPnN1c3BlbmRfY291bnQgPSAt MTsNCg0KCSAgICB0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MgPSBDT05URVhU X0RFQlVHR0VSX0RSOw0KCSAgICBHZXRUaHJlYWRDb250ZXh0ICh0aC0+aCwg JnRoLT5jb250ZXh0KTsNCgkgICAgaWYgKGlkID09IGN1cnJlbnRfZXZlbnQu ZHdUaHJlYWRJZCkNCgkgICAgICB7DQoJCS8qIENvcHkgZHIgdmFsdWVzIGZy b20gdGhhdCB0aHJlYWQuICAqLw0KCQlkclswXSA9IHRoLT5jb250ZXh0LkRy MDsNCgkJZHJbMV0gPSB0aC0+Y29udGV4dC5EcjE7DQoJCWRyWzJdID0gdGgt PmNvbnRleHQuRHIyOw0KCQlkclszXSA9IHRoLT5jb250ZXh0LkRyMzsNCgkJ ZHJbNl0gPSB0aC0+Y29udGV4dC5EcjY7DQoJCWRyWzddID0gdGgtPmNvbnRl eHQuRHI3Ow0KCSAgICAgIH0NCgkgIH0NCglyZXR1cm4gdGg7DQogICAgICB9 DQoNCiAgcmV0dXJuIE5VTEw7DQp9DQoNCi8qIEFkZCBhIHRocmVhZCB0byB0 aGUgdGhyZWFkIGxpc3QgKi8NCnN0YXRpYyB0aHJlYWRfaW5mbyAqDQpjaGls ZF9hZGRfdGhyZWFkIChEV09SRCBpZCwgSEFORExFIGgpDQp7DQogIHRocmVh ZF9pbmZvICp0aDsNCg0KICBpZiAoKHRoID0gdGhyZWFkX3JlYyAoaWQsIEZB TFNFKSkpDQogICAgcmV0dXJuIHRoOw0KDQogIHRoID0gKHRocmVhZF9pbmZv ICopIHhtYWxsb2MgKHNpemVvZiAoKnRoKSk7DQogIG1lbXNldCAodGgsIDAs IHNpemVvZiAoKnRoKSk7DQogIHRoLT5pZCA9IGlkOw0KICB0aC0+aCA9IGg7 DQogIHRoLT5uZXh0ID0gdGhyZWFkX2hlYWQubmV4dDsNCiAgdGhyZWFkX2hl YWQubmV4dCA9IHRoOw0KICBhZGRfdGhyZWFkIChwaWRfdG9fcHRpZCAoaWQp KTsNCiAgLyogU2V0IHRoZSBkZWJ1ZyByZWdpc3RlcnMgZm9yIHRoZSBuZXcg dGhyZWFkIGluIHRoZXkgYXJlIHVzZWQuICAqLw0KICBpZiAoZGVidWdfcmVn aXN0ZXJzX3VzZWQpDQogICAgew0KICAgICAgLyogT25seSBjaGFuZ2UgdGhl IHZhbHVlIG9mIHRoZSBkZWJ1ZyByZWdpc3RlcnMuICAqLw0KICAgICAgdGgt PmNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9ERUJVR19SRUdJU1RF UlM7DQogICAgICBDSEVDSyAoR2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0 aC0+Y29udGV4dCkpOw0KICAgICAgdGgtPmNvbnRleHQuRHIwID0gZHJbMF07 DQogICAgICB0aC0+Y29udGV4dC5EcjEgPSBkclsxXTsNCiAgICAgIHRoLT5j b250ZXh0LkRyMiA9IGRyWzJdOw0KICAgICAgdGgtPmNvbnRleHQuRHIzID0g ZHJbM107DQogICAgICAvKiB0aC0+Y29udGV4dC5EcjYgPSBkcls2XTsNCiAg ICAgIEZJWE1FOiBzaG91bGQgd2Ugc2V0IGRyNiBhbHNvID8/ICovDQogICAg ICB0aC0+Y29udGV4dC5EcjcgPSBkcls3XTsNCiAgICAgIENIRUNLIChTZXRU aHJlYWRDb250ZXh0ICh0aC0+aCwgJnRoLT5jb250ZXh0KSk7DQogICAgICB0 aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MgPSAwOw0KICAgIH0NCiAgcmV0dXJu IHRoOw0KfQ0KDQovKiBDbGVhciBvdXQgYW55IG9sZCB0aHJlYWQgbGlzdCBh bmQgcmVpbnRpYWxpemUgaXQgdG8gYQ0KICAgcHJpc3RpbmUgc3RhdGUuICov DQpzdGF0aWMgdm9pZA0KY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAodm9pZCkN CnsNCiAgdGhyZWFkX2luZm8gKnRoID0gJnRocmVhZF9oZWFkOw0KDQogIERF QlVHX0VWRU5UUyAoKCJnZGI6IGNoaWxkX2luaXRfdGhyZWFkX2xpc3RcbiIp KTsNCiAgaW5pdF90aHJlYWRfbGlzdCAoKTsNCiAgd2hpbGUgKHRoLT5uZXh0 ICE9IE5VTEwpDQogICAgew0KICAgICAgdGhyZWFkX2luZm8gKmhlcmUgPSB0 aC0+bmV4dDsNCiAgICAgIHRoLT5uZXh0ID0gaGVyZS0+bmV4dDsNCiAgICAg ICh2b2lkKSBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7DQogICAgICB4ZnJlZSAo aGVyZSk7DQogICAgfQ0KfQ0KDQovKiBEZWxldGUgYSB0aHJlYWQgZnJvbSB0 aGUgbGlzdCBvZiB0aHJlYWRzICovDQpzdGF0aWMgdm9pZA0KY2hpbGRfZGVs ZXRlX3RocmVhZCAoRFdPUkQgaWQpDQp7DQogIHRocmVhZF9pbmZvICp0aDsN Cg0KICBpZiAoaW5mb192ZXJib3NlKQ0KICAgIHByaW50Zl91bmZpbHRlcmVk ICgiW0RlbGV0aW5nICVzXVxuIiwgdGFyZ2V0X3BpZF90b19zdHIgKHBpZF90 b19wdGlkIChpZCkpKTsNCiAgZGVsZXRlX3RocmVhZCAocGlkX3RvX3B0aWQg KGlkKSk7DQoNCiAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsNCiAgICAgICB0 aC0+bmV4dCAhPSBOVUxMICYmIHRoLT5uZXh0LT5pZCAhPSBpZDsNCiAgICAg ICB0aCA9IHRoLT5uZXh0KQ0KICAgIGNvbnRpbnVlOw0KDQogIGlmICh0aC0+ bmV4dCAhPSBOVUxMKQ0KICAgIHsNCiAgICAgIHRocmVhZF9pbmZvICpoZXJl ID0gdGgtPm5leHQ7DQogICAgICB0aC0+bmV4dCA9IGhlcmUtPm5leHQ7DQog ICAgICBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7DQogICAgICB4ZnJlZSAoaGVy ZSk7DQogICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZA0KZG9fY2hpbGRfZmV0Y2hf aW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikNCnsNCiAgY2hhciAqY29udGV4 dF9vZmZzZXQgPSAoKGNoYXIgKikgJmN1cnJlbnRfdGhyZWFkLT5jb250ZXh0 KSArIG1hcHBpbmdzW3JdOw0KICBsb25nIGw7DQogIGlmIChyID09IEZDU19S RUdOVU0pDQogICAgew0KICAgICAgbCA9ICooKGxvbmcgKikgY29udGV4dF9v ZmZzZXQpICYgMHhmZmZmOw0KICAgICAgc3VwcGx5X3JlZ2lzdGVyIChyLCAo Y2hhciAqKSAmbCk7DQogICAgfQ0KICBlbHNlIGlmIChyID09IEZPUF9SRUdO VU0pDQogICAgew0KICAgICAgbCA9ICgqKChsb25nICopIGNvbnRleHRfb2Zm c2V0KSA+PiAxNikgJiAoKDEgPDwgMTEpIC0gMSk7DQogICAgICBzdXBwbHlf cmVnaXN0ZXIgKHIsIChjaGFyICopICZsKTsNCiAgICB9DQogIGVsc2UgaWYg KHIgPj0gMCkNCiAgICBzdXBwbHlfcmVnaXN0ZXIgKHIsIGNvbnRleHRfb2Zm c2V0KTsNCiAgZWxzZQ0KICAgIHsNCiAgICAgIGZvciAociA9IDA7IHIgPCBO VU1fUkVHUzsgcisrKQ0KCWRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lz dGVycyAocik7DQogICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZA0KY2hpbGRfZmV0 Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikNCnsNCiAgY3VycmVudF90 aHJlYWQgPSB0aHJlYWRfcmVjIChQSURHRVQgKGluZmVyaW9yX3B0aWQpLCBU UlVFKTsNCiAgZG9fY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChy KTsNCn0NCg0Kc3RhdGljIHZvaWQNCmRvX2NoaWxkX3N0b3JlX2luZmVyaW9y X3JlZ2lzdGVycyAoaW50IHIpDQp7DQogIGlmIChyID49IDApDQogICAgZGVw cmVjYXRlZF9yZWFkX3JlZ2lzdGVyX2dlbiAociwgKChjaGFyICopICZjdXJy ZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7DQogIGVsc2UN CiAgICB7DQogICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykN Cglkb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOw0KICAg IH0NCn0NCg0KLyogU3RvcmUgYSBuZXcgcmVnaXN0ZXIgdmFsdWUgaW50byB0 aGUgY3VycmVudCB0aHJlYWQgY29udGV4dCAqLw0Kc3RhdGljIHZvaWQNCmNo aWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpDQp7DQogIGN1 cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoUElER0VUIChpbmZlcmlvcl9w dGlkKSwgVFJVRSk7DQogIGRvX2NoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lz dGVycyAocik7DQp9DQoNCnN0YXRpYyBpbnQgcHNhcGlfbG9hZGVkID0gMDsN CnN0YXRpYyBITU9EVUxFIHBzYXBpX21vZHVsZV9oYW5kbGUgPSBOVUxMOw0K c3RhdGljIEJPT0wgV0lOQVBJICgqcHNhcGlfRW51bVByb2Nlc3NNb2R1bGVz KSAoSEFORExFLCBITU9EVUxFICosIERXT1JELCBMUERXT1JEKSA9IE5VTEw7 DQpzdGF0aWMgQk9PTCBXSU5BUEkgKCpwc2FwaV9HZXRNb2R1bGVJbmZvcm1h dGlvbikgKEhBTkRMRSwgSE1PRFVMRSwgTFBNT0RVTEVJTkZPLCBEV09SRCkg PSBOVUxMOw0Kc3RhdGljIERXT1JEIFdJTkFQSSAoKnBzYXBpX0dldE1vZHVs ZUZpbGVOYW1lRXhBKSAoSEFORExFLCBITU9EVUxFLCBMUFNUUiwgRFdPUkQp ID0gTlVMTDsNCg0KaW50DQpwc2FwaV9nZXRfZGxsX25hbWUgKERXT1JEIEJh c2VBZGRyZXNzLCBjaGFyICpkbGxfbmFtZV9yZXQpDQp7DQogIERXT1JEIGxl bjsNCiAgTU9EVUxFSU5GTyBtaTsNCiAgaW50IGk7DQogIEhNT0RVTEUgZGhf YnVmWzFdOw0KICBITU9EVUxFICpEbGxIYW5kbGUgPSBkaF9idWY7DQogIERX T1JEIGNiTmVlZGVkOw0KICBCT09MIG9rOw0KDQogIGlmICghcHNhcGlfbG9h ZGVkIHx8DQogICAgICBwc2FwaV9FbnVtUHJvY2Vzc01vZHVsZXMgPT0gTlVM TCB8fA0KICAgICAgcHNhcGlfR2V0TW9kdWxlSW5mb3JtYXRpb24gPT0gTlVM TCB8fA0KICAgICAgcHNhcGlfR2V0TW9kdWxlRmlsZU5hbWVFeEEgPT0gTlVM TCkNCiAgICB7DQogICAgICBpZiAocHNhcGlfbG9hZGVkKQ0KCWdvdG8gZmFp bGVkOw0KICAgICAgcHNhcGlfbG9hZGVkID0gMTsNCiAgICAgIHBzYXBpX21v ZHVsZV9oYW5kbGUgPSBMb2FkTGlicmFyeSAoInBzYXBpLmRsbCIpOw0KICAg ICAgaWYgKCFwc2FwaV9tb2R1bGVfaGFuZGxlKQ0KCXsNCgkgIC8qIHByaW50 Zl91bmZpbHRlcmVkICgiZXJyb3IgbG9hZGluZyBwc2FwaS5kbGw6ICV1Iiwg R2V0TGFzdEVycm9yICgpKTsgKi8NCgkgIGdvdG8gZmFpbGVkOw0KCX0NCiAg ICAgIHBzYXBpX0VudW1Qcm9jZXNzTW9kdWxlcyA9IEdldFByb2NBZGRyZXNz IChwc2FwaV9tb2R1bGVfaGFuZGxlLCAiRW51bVByb2Nlc3NNb2R1bGVzIik7 DQogICAgICBwc2FwaV9HZXRNb2R1bGVJbmZvcm1hdGlvbiA9IEdldFByb2NB ZGRyZXNzIChwc2FwaV9tb2R1bGVfaGFuZGxlLCAiR2V0TW9kdWxlSW5mb3Jt YXRpb24iKTsNCiAgICAgIHBzYXBpX0dldE1vZHVsZUZpbGVOYW1lRXhBID0g KHZvaWQgKikgR2V0UHJvY0FkZHJlc3MgKHBzYXBpX21vZHVsZV9oYW5kbGUs DQoJCQkJCQkgICAgIkdldE1vZHVsZUZpbGVOYW1lRXhBIik7DQogICAgICBp ZiAocHNhcGlfRW51bVByb2Nlc3NNb2R1bGVzID09IE5VTEwgfHwNCgkgIHBz YXBpX0dldE1vZHVsZUluZm9ybWF0aW9uID09IE5VTEwgfHwNCgkgIHBzYXBp X0dldE1vZHVsZUZpbGVOYW1lRXhBID09IE5VTEwpDQoJZ290byBmYWlsZWQ7 DQogICAgfQ0KDQogIGNiTmVlZGVkID0gMDsNCiAgb2sgPSAoKnBzYXBpX0Vu dW1Qcm9jZXNzTW9kdWxlcykgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsDQoJ CQkJICAgIERsbEhhbmRsZSwNCgkJCQkgICAgc2l6ZW9mIChITU9EVUxFKSwN CgkJCQkgICAgJmNiTmVlZGVkKTsNCg0KICBpZiAoIW9rIHx8ICFjYk5lZWRl ZCkNCiAgICBnb3RvIGZhaWxlZDsNCg0KICBEbGxIYW5kbGUgPSAoSE1PRFVM RSAqKSBhbGxvY2EgKGNiTmVlZGVkKTsNCiAgaWYgKCFEbGxIYW5kbGUpDQog ICAgZ290byBmYWlsZWQ7DQoNCiAgb2sgPSAoKnBzYXBpX0VudW1Qcm9jZXNz TW9kdWxlcykgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsDQoJCQkJICAgIERs bEhhbmRsZSwNCgkJCQkgICAgY2JOZWVkZWQsDQoJCQkJICAgICZjYk5lZWRl ZCk7DQogIGlmICghb2spDQogICAgZ290byBmYWlsZWQ7DQoNCiAgZm9yIChp ID0gMDsgaSA8IChpbnQpIChjYk5lZWRlZCAvIHNpemVvZiAoSE1PRFVMRSkp OyBpKyspDQogICAgew0KICAgICAgaWYgKCEoKnBzYXBpX0dldE1vZHVsZUlu Zm9ybWF0aW9uKSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwNCgkJCQkJICBE bGxIYW5kbGVbaV0sDQoJCQkJCSAgJm1pLA0KCQkJCQkgIHNpemVvZiAobWkp KSkNCgllcnJvciAoIkNhbid0IGdldCBtb2R1bGUgaW5mbyIpOw0KDQogICAg ICBsZW4gPSAoKnBzYXBpX0dldE1vZHVsZUZpbGVOYW1lRXhBKSAoY3VycmVu dF9wcm9jZXNzX2hhbmRsZSwNCgkJCQkJICAgRGxsSGFuZGxlW2ldLA0KCQkJ CQkgICBkbGxfbmFtZV9yZXQsDQoJCQkJCSAgIE1BWF9QQVRIKTsNCiAgICAg IGlmIChsZW4gPT0gMCkNCgllcnJvciAoIkVycm9yIGdldHRpbmcgZGxsIG5h bWU6ICV1XG4iLCAodW5zaWduZWQpIEdldExhc3RFcnJvciAoKSk7DQoNCiAg ICAgIGlmICgoRFdPUkQpIChtaS5scEJhc2VPZkRsbCkgPT0gQmFzZUFkZHJl c3MpDQoJcmV0dXJuIDE7DQogICAgfQ0KDQpmYWlsZWQ6DQogIGRsbF9uYW1l X3JldFswXSA9ICdcMCc7DQogIHJldHVybiAwOw0KfQ0KDQovKiBFbmNhcHN1 bGF0ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgaW4gYSBjYWxsIHRvDQog ICBzeW1ib2xfZmlsZV9hZGRfYXJncyAqLw0Kc3RydWN0IHNhZmVfc3ltYm9s X2ZpbGVfYWRkX2FyZ3MNCnsNCiAgY2hhciAqbmFtZTsNCiAgaW50IGZyb21f dHR5Ow0KICBzdHJ1Y3Qgc2VjdGlvbl9hZGRyX2luZm8gKmFkZHJzOw0KICBp bnQgbWFpbmxpbmU7DQogIGludCBmbGFnczsNCiAgc3RydWN0IHVpX2ZpbGUg KmVyciwgKm91dDsNCiAgc3RydWN0IG9iamZpbGUgKnJldDsNCn07DQoNCi8q IE1haW50YWluIGEgbGlua2VkIGxpc3Qgb2YgInNvIiBpbmZvcm1hdGlvbi4g Ki8NCnN0cnVjdCBzb19zdHVmZg0Kew0KICBzdHJ1Y3Qgc29fc3R1ZmYgKm5l eHQ7DQogIERXT1JEIGxvYWRfYWRkcjsNCiAgRFdPUkQgZW5kX2FkZHI7DQog IGludCBsb2FkZWQ7DQogIHN0cnVjdCBvYmpmaWxlICpvYmpmaWxlOw0KICBj aGFyIG5hbWVbMV07DQp9IHNvbGliX3N0YXJ0LCAqc29saWJfZW5kOw0KDQov KiBDYWxsIHN5bWJvbF9maWxlX2FkZCB3aXRoIHN0ZGVyciByZWRpcmVjdGVk LiAgV2UgZG9uJ3QgY2FyZSBpZiB0aGVyZQ0KICAgYXJlIGVycm9ycy4gKi8N CnN0YXRpYyBpbnQNCnNhZmVfc3ltYm9sX2ZpbGVfYWRkX3N0dWIgKHZvaWQg KmFyZ3YpDQp7DQojZGVmaW5lIHAgKChzdHJ1Y3Qgc2FmZV9zeW1ib2xfZmls ZV9hZGRfYXJncyAqKWFyZ3YpDQogIHN0cnVjdCBzb19zdHVmZiAqc28gPSAm c29saWJfc3RhcnQ7DQoNCiAgd2hpbGUgKChzbyA9IHNvLT5uZXh0KSkNCiAg ICBpZiAoc28tPmxvYWRlZCAmJiBzdHJjYXNlY21wIChzby0+bmFtZSwgcC0+ bmFtZSkgPT0gMCkNCiAgICAgIHJldHVybiAwOw0KICBwLT5yZXQgPSBzeW1i b2xfZmlsZV9hZGQgKHAtPm5hbWUsIHAtPmZyb21fdHR5LCBwLT5hZGRycywg cC0+bWFpbmxpbmUsIHAtPmZsYWdzKTsNCiAgcmV0dXJuICEhcC0+cmV0Ow0K I3VuZGVmIHANCn0NCg0KLyogUmVzdG9yZSBnZGIncyBzdGRlcnIgYWZ0ZXIg Y2FsbGluZyBzeW1ib2xfZmlsZV9hZGQgKi8NCnN0YXRpYyB2b2lkDQpzYWZl X3N5bWJvbF9maWxlX2FkZF9jbGVhbnVwICh2b2lkICpwKQ0Kew0KI2RlZmlu ZSBzcCAoKHN0cnVjdCBzYWZlX3N5bWJvbF9maWxlX2FkZF9hcmdzICopcCkN CiAgZ2RiX2ZsdXNoIChnZGJfc3RkZXJyKTsNCiAgZ2RiX2ZsdXNoIChnZGJf c3Rkb3V0KTsNCiAgdWlfZmlsZV9kZWxldGUgKGdkYl9zdGRlcnIpOw0KICB1 aV9maWxlX2RlbGV0ZSAoZ2RiX3N0ZG91dCk7DQogIGdkYl9zdGRlcnIgPSBz cC0+ZXJyOw0KICBnZGJfc3Rkb3V0ID0gc3AtPm91dDsNCiN1bmRlZiBzcA0K fQ0KDQovKiBzeW1ib2xfZmlsZV9hZGQgd3JhcHBlciB0aGF0IHByZXZlbnRz IGVycm9ycyBmcm9tIGJlaW5nIGRpc3BsYXllZC4gKi8NCnN0YXRpYyBzdHJ1 Y3Qgb2JqZmlsZSAqDQpzYWZlX3N5bWJvbF9maWxlX2FkZCAoY2hhciAqbmFt ZSwgaW50IGZyb21fdHR5LA0KCQkgICAgICBzdHJ1Y3Qgc2VjdGlvbl9hZGRy X2luZm8gKmFkZHJzLA0KCQkgICAgICBpbnQgbWFpbmxpbmUsIGludCBmbGFn cykNCnsNCiAgc3RydWN0IHNhZmVfc3ltYm9sX2ZpbGVfYWRkX2FyZ3MgcDsN CiAgc3RydWN0IGNsZWFudXAgKmNsZWFudXA7DQoNCiAgY2xlYW51cCA9IG1h a2VfY2xlYW51cCAoc2FmZV9zeW1ib2xfZmlsZV9hZGRfY2xlYW51cCwgJnAp Ow0KDQogIHAuZXJyID0gZ2RiX3N0ZGVycjsNCiAgcC5vdXQgPSBnZGJfc3Rk b3V0Ow0KICBnZGJfZmx1c2ggKGdkYl9zdGRlcnIpOw0KICBnZGJfZmx1c2gg KGdkYl9zdGRvdXQpOw0KICBnZGJfc3RkZXJyID0gdWlfZmlsZV9uZXcgKCk7 DQogIGdkYl9zdGRvdXQgPSB1aV9maWxlX25ldyAoKTsNCiAgcC5uYW1lID0g bmFtZTsNCiAgcC5mcm9tX3R0eSA9IGZyb21fdHR5Ow0KICBwLmFkZHJzID0g YWRkcnM7DQogIHAubWFpbmxpbmUgPSBtYWlubGluZTsNCiAgcC5mbGFncyA9 IGZsYWdzOw0KICBjYXRjaF9lcnJvcnMgKHNhZmVfc3ltYm9sX2ZpbGVfYWRk X3N0dWIsICZwLCAiIiwgUkVUVVJOX01BU0tfRVJST1IpOw0KDQogIGRvX2Ns ZWFudXBzIChjbGVhbnVwKTsNCiAgcmV0dXJuIHAucmV0Ow0KfQ0KDQovKiBS ZW1lbWJlciB0aGUgbWF4aW11bSBETEwgbGVuZ3RoIGZvciBwcmludGluZyBp biBpbmZvIGRsbCBjb21tYW5kLiAqLw0KaW50IG1heF9kbGxfbmFtZV9sZW47 DQoNCnN0YXRpYyB2b2lkDQpyZWdpc3Rlcl9sb2FkZWRfZGxsIChjb25zdCBj aGFyICpuYW1lLCBEV09SRCBsb2FkX2FkZHIpDQp7DQogIHN0cnVjdCBzb19z dHVmZiAqc287DQogIGNoYXIgcHBhdGhbTUFYX1BBVEggKyAxXTsNCiAgY2hh ciBidWZbTUFYX1BBVEggKyAxXTsNCiAgY2hhciBjd2RbTUFYX1BBVEggKyAx XTsNCiAgY2hhciAqcDsNCiAgV0lOMzJfRklORF9EQVRBIHczMl9mZDsNCiAg SEFORExFIGggPSBGaW5kRmlyc3RGaWxlKG5hbWUsICZ3MzJfZmQpOw0KICBN RU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbTsNCiAgc2l6ZV90IGxlbjsNCg0K ICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkNCiAgICBzdHJjcHkg KGJ1ZiwgbmFtZSk7DQogIGVsc2UNCiAgICB7DQogICAgICBGaW5kQ2xvc2Ug KGgpOw0KICAgICAgc3RyY3B5IChidWYsIG5hbWUpOw0KICAgICAgaWYgKEdl dEN1cnJlbnREaXJlY3RvcnkgKE1BWF9QQVRIICsgMSwgY3dkKSkNCgl7DQoJ ICBwID0gc3RycmNociAoYnVmLCAnXFwnKTsNCgkgIGlmIChwKQ0KCSAgICBw WzFdID0gJ1wwJzsNCgkgIFNldEN1cnJlbnREaXJlY3RvcnkgKGJ1Zik7DQoJ ICBHZXRGdWxsUGF0aE5hbWUgKHczMl9mZC5jRmlsZU5hbWUsIE1BWF9QQVRI LCBidWYsICZwKTsNCgkgIFNldEN1cnJlbnREaXJlY3RvcnkgKGN3ZCk7DQoJ fQ0KICAgIH0NCg0KICBjeWd3aW5fY29udl90b19wb3NpeF9wYXRoIChidWYs IHBwYXRoKTsNCiAgc28gPSAoc3RydWN0IHNvX3N0dWZmICopIHhtYWxsb2Mg KHNpemVvZiAoc3RydWN0IHNvX3N0dWZmKSArIHN0cmxlbiAocHBhdGgpICsg OCArIDEpOw0KICBzby0+bG9hZGVkID0gMDsNCiAgc28tPmxvYWRfYWRkciA9 IGxvYWRfYWRkcjsNCiAgaWYgKCFWaXJ0dWFsUXVlcnlFeCAoY3VycmVudF9w cm9jZXNzX2hhbmRsZSwgKHZvaWQgKikgbG9hZF9hZGRyLCAmbSwNCgkJICAg ICAgIHNpemVvZiAobSkpKQ0KICAgIHNvLT5lbmRfYWRkciA9IChEV09SRCkg bS5BbGxvY2F0aW9uQmFzZSArIG0uUmVnaW9uU2l6ZTsNCiAgZWxzZQ0KICAg IHNvLT5lbmRfYWRkciA9IGxvYWRfYWRkciArIDB4MjAwMDsJLyogY29tcGxl dGVseSBhcmJpdHJhcnkgKi8NCg0KICBzby0+bmV4dCA9IE5VTEw7DQogIHNv LT5vYmpmaWxlID0gTlVMTDsNCiAgc3RyY3B5IChzby0+bmFtZSwgcHBhdGgp Ow0KDQogIHNvbGliX2VuZC0+bmV4dCA9IHNvOw0KICBzb2xpYl9lbmQgPSBz bzsNCiAgbGVuID0gc3RybGVuIChwcGF0aCk7DQogIGlmIChsZW4gPiBtYXhf ZGxsX25hbWVfbGVuKQ0KICAgIG1heF9kbGxfbmFtZV9sZW4gPSBsZW47DQp9 DQoNCmNoYXIgKg0KZ2V0X2ltYWdlX25hbWUgKEhBTkRMRSBoLCB2b2lkICph ZGRyZXNzLCBpbnQgdW5pY29kZSkNCnsNCiAgc3RhdGljIGNoYXIgYnVmWygy ICogTUFYX1BBVEgpICsgMV07DQogIERXT1JEIHNpemUgPSB1bmljb2RlID8g c2l6ZW9mIChXQ0hBUikgOiBzaXplb2YgKGNoYXIpOw0KICBjaGFyICphZGRy ZXNzX3B0cjsNCiAgaW50IGxlbiA9IDA7DQogIGNoYXIgYlsyXTsNCiAgRFdP UkQgZG9uZTsNCg0KICAvKiBBdHRlbXB0IHRvIHJlYWQgdGhlIG5hbWUgb2Yg dGhlIGRsbCB0aGF0IHdhcyBkZXRlY3RlZC4NCiAgICAgVGhpcyBpcyBkb2N1 bWVudGVkIHRvIHdvcmsgb25seSB3aGVuIGFjdGl2ZWx5IGRlYnVnZ2luZw0K ICAgICBhIHByb2dyYW0uICBJdCB3aWxsIG5vdCB3b3JrIGZvciBhdHRhY2hl ZCBwcm9jZXNzZXMuICovDQogIGlmIChhZGRyZXNzID09IE5VTEwpDQogICAg cmV0dXJuIE5VTEw7DQoNCiAgUmVhZFByb2Nlc3NNZW1vcnkgKGgsIGFkZHJl c3MsICAmYWRkcmVzc19wdHIsIHNpemVvZiAoYWRkcmVzc19wdHIpLCAmZG9u ZSk7DQoNCiAgLyogU2VlIGlmIHdlIGNvdWxkIHJlYWQgdGhlIGFkZHJlc3Mg b2YgYSBzdHJpbmcsIGFuZCB0aGF0IHRoZQ0KICAgICBhZGRyZXNzIGlzbid0 IG51bGwuICovDQoNCiAgaWYgKGRvbmUgIT0gc2l6ZW9mIChhZGRyZXNzX3B0 cikgfHwgIWFkZHJlc3NfcHRyKQ0KICAgIHJldHVybiBOVUxMOw0KDQogIC8q IEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovDQogIGRvDQogICAg ew0KICAgICAgUmVhZFByb2Nlc3NNZW1vcnkgKGgsIGFkZHJlc3NfcHRyICsg bGVuICogc2l6ZSwgJmIsIHNpemUsICZkb25lKTsNCiAgICAgIGxlbisrOw0K ICAgIH0NCiAgd2hpbGUgKChiWzBdICE9IDAgfHwgYltzaXplIC0gMV0gIT0g MCkgJiYgZG9uZSA9PSBzaXplKTsNCg0KICBpZiAoIXVuaWNvZGUpDQogICAg UmVhZFByb2Nlc3NNZW1vcnkgKGgsIGFkZHJlc3NfcHRyLCBidWYsIGxlbiwg JmRvbmUpOw0KICBlbHNlDQogICAgew0KICAgICAgV0NIQVIgKnVuaWNvZGVf YWRkcmVzcyA9IChXQ0hBUiAqKSBhbGxvY2EgKGxlbiAqIHNpemVvZiAoV0NI QVIpKTsNCiAgICAgIFJlYWRQcm9jZXNzTWVtb3J5IChoLCBhZGRyZXNzX3B0 ciwgdW5pY29kZV9hZGRyZXNzLCBsZW4gKiBzaXplb2YgKFdDSEFSKSwNCgkJ CSAmZG9uZSk7DQoNCiAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX0FD UCwgMCwgdW5pY29kZV9hZGRyZXNzLCBsZW4sIGJ1ZiwgbGVuLCAwLCAwKTsN CiAgICB9DQoNCiAgcmV0dXJuIGJ1ZjsNCn0NCg0KLyogV2FpdCBmb3IgY2hp bGQgdG8gZG8gc29tZXRoaW5nLiAgUmV0dXJuIHBpZCBvZiBjaGlsZCwgb3Ig LTEgaW4gY2FzZQ0KICAgb2YgZXJyb3I7IHN0b3JlIHN0YXR1cyB0aHJvdWdo IGFyZ3VtZW50IHBvaW50ZXIgT1VSU1RBVFVTLiAgKi8NCnN0YXRpYyBpbnQN CmhhbmRsZV9sb2FkX2RsbCAodm9pZCAqZHVtbXkpDQp7DQogIExPQURfRExM X0RFQlVHX0lORk8gKmV2ZW50ID0gJmN1cnJlbnRfZXZlbnQudS5Mb2FkRGxs Ow0KICBjaGFyIGRsbF9idWZbTUFYX1BBVEggKyAxXTsNCiAgY2hhciAqZGxs X25hbWUgPSBOVUxMOw0KICBjaGFyICpwOw0KDQogIGRsbF9idWZbMF0gPSBk bGxfYnVmW3NpemVvZiAoZGxsX2J1ZikgLSAxXSA9ICdcMCc7DQoNCiAgaWYg KCFwc2FwaV9nZXRfZGxsX25hbWUgKChEV09SRCkgKGV2ZW50LT5scEJhc2VP ZkRsbCksIGRsbF9idWYpKQ0KICAgIGRsbF9idWZbMF0gPSBkbGxfYnVmW3Np emVvZiAoZGxsX2J1ZikgLSAxXSA9ICdcMCc7DQoNCiAgZGxsX25hbWUgPSBk bGxfYnVmOw0KDQogIGlmICgqZGxsX25hbWUgPT0gJ1wwJykNCiAgICBkbGxf bmFtZSA9IGdldF9pbWFnZV9uYW1lIChjdXJyZW50X3Byb2Nlc3NfaGFuZGxl LCBldmVudC0+bHBJbWFnZU5hbWUsIGV2ZW50LT5mVW5pY29kZSk7DQogIGlm ICghZGxsX25hbWUpDQogICAgcmV0dXJuIDE7DQoNCiAgcmVnaXN0ZXJfbG9h ZGVkX2RsbCAoZGxsX25hbWUsIChEV09SRCkgZXZlbnQtPmxwQmFzZU9mRGxs ICsgMHgxMDAwKTsNCg0KICByZXR1cm4gMTsNCn0NCg0Kc3RhdGljIGludA0K aGFuZGxlX3VubG9hZF9kbGwgKHZvaWQgKmR1bW15KQ0Kew0KICBEV09SRCBs cEJhc2VPZkRsbCA9IChEV09SRCkgY3VycmVudF9ldmVudC51LlVubG9hZERs bC5scEJhc2VPZkRsbCArIDB4MTAwMDsNCiAgc3RydWN0IHNvX3N0dWZmICpz bzsNCg0KICBmb3IgKHNvID0gJnNvbGliX3N0YXJ0OyBzby0+bmV4dCAhPSBO VUxMOyBzbyA9IHNvLT5uZXh0KQ0KICAgIGlmIChzby0+bmV4dC0+bG9hZF9h ZGRyID09IGxwQmFzZU9mRGxsKQ0KICAgICAgew0KCXN0cnVjdCBzb19zdHVm ZiAqc29kZWwgPSBzby0+bmV4dDsNCglzby0+bmV4dCA9IHNvZGVsLT5uZXh0 Ow0KCWlmICghc28tPm5leHQpDQoJICBzb2xpYl9lbmQgPSBzbzsNCglpZiAo c29kZWwtPm9iamZpbGUpDQoJICBmcmVlX29iamZpbGUgKHNvZGVsLT5vYmpm aWxlKTsNCgl4ZnJlZShzb2RlbCk7DQoJcmV0dXJuIDE7DQogICAgICB9DQog IGVycm9yICgiRXJyb3I6IGRsbCBzdGFydGluZyBhdCAweCVseCBub3QgZm91 bmQuXG4iLCAoRFdPUkQpIGxwQmFzZU9mRGxsKTsNCg0KICByZXR1cm4gMDsN Cn0NCg0KY2hhciAqDQpzb2xpYl9hZGRyZXNzIChDT1JFX0FERFIgYWRkcmVz cykNCnsNCiAgc3RydWN0IHNvX3N0dWZmICpzbzsNCiAgZm9yIChzbyA9ICZz b2xpYl9zdGFydDsgc28tPm5leHQgIT0gTlVMTDsgc28gPSBzby0+bmV4dCkN CiAgICBpZiAoYWRkcmVzcyA+PSBzby0+bG9hZF9hZGRyICYmIGFkZHJlc3Mg PD0gc28tPmVuZF9hZGRyKQ0KICAgICAgcmV0dXJuIHNvLT5uYW1lOw0KICBy ZXR1cm4gTlVMTDsNCn0NCg0KLyogUmV0dXJuIG5hbWUgb2YgbGFzdCBsb2Fk ZWQgRExMLiAqLw0KY2hhciAqDQpjaGlsZF9zb2xpYl9sb2FkZWRfbGlicmFy eV9wYXRobmFtZSAoaW50IHBpZCkNCnsNCiAgcmV0dXJuICFzb2xpYl9lbmQg fHwgIXNvbGliX2VuZC0+bmFtZVswXSA/IE5VTEwgOiBzb2xpYl9lbmQtPm5h bWU7DQp9DQoNCi8qIENsZWFyIGxpc3Qgb2YgbG9hZGVkIERMTHMuICovDQp2 b2lkDQpjaGlsZF9jbGVhcl9zb2xpYnMgKHZvaWQpDQp7DQogIHN0cnVjdCBz b19zdHVmZiAqc28sICpzbzEgPSBzb2xpYl9zdGFydC5uZXh0Ow0KDQogIHdo aWxlICgoc28gPSBzbzEpICE9IE5VTEwpDQogICAgew0KICAgICAgc28xID0g c28tPm5leHQ7DQogICAgICB4ZnJlZSAoc28pOw0KICAgIH0NCg0KICBzb2xp Yl9zdGFydC5uZXh0ID0gTlVMTDsNCiAgc29saWJfc3RhcnQub2JqZmlsZSA9 IE5VTEw7DQogIHNvbGliX2VuZCA9ICZzb2xpYl9zdGFydDsNCiAgbWF4X2Rs bF9uYW1lX2xlbiA9IHNpemVvZiAoIkRMTCBOYW1lIikgLSAxOw0KfQ0KDQov KiBBZGQgRExMIHN5bWJvbCBpbmZvcm1hdGlvbi4gKi8NCnN0YXRpYyBzdHJ1 Y3Qgb2JqZmlsZSAqDQpzb2xpYl9zeW1ib2xzX2FkZCAoY2hhciAqbmFtZSwg aW50IGZyb21fdHR5LCBDT1JFX0FERFIgbG9hZF9hZGRyKQ0Kew0KICBzdHJ1 Y3Qgc2VjdGlvbl9hZGRyX2luZm8gc2VjdGlvbl9hZGRyczsNCg0KICAvKiBU aGUgc3ltYm9scyBpbiBhIGRsbCBhcmUgb2Zmc2V0IGJ5IDB4MTAwMCwgd2hp Y2ggaXMgdGhlDQogICAgIHRoZSBvZmZzZXQgZnJvbSAwIG9mIHRoZSBmaXJz dCBieXRlIGluIGFuIGltYWdlIC0gYmVjYXVzZQ0KICAgICBvZiB0aGUgZmls ZSBoZWFkZXIgYW5kIHRoZSBzZWN0aW9uIGFsaWdubWVudC4gKi8NCg0KICBp ZiAoIW5hbWUgfHwgIW5hbWVbMF0pDQogICAgcmV0dXJuIE5VTEw7DQoNCiAg bWVtc2V0ICgmc2VjdGlvbl9hZGRycywgMCwgc2l6ZW9mIChzZWN0aW9uX2Fk ZHJzKSk7DQogIHNlY3Rpb25fYWRkcnMub3RoZXJbMF0ubmFtZSA9ICIudGV4 dCI7DQogIHNlY3Rpb25fYWRkcnMub3RoZXJbMF0uYWRkciA9IGxvYWRfYWRk cjsNCiAgcmV0dXJuIHNhZmVfc3ltYm9sX2ZpbGVfYWRkIChuYW1lLCBmcm9t X3R0eSwgJnNlY3Rpb25fYWRkcnMsIDAsIE9CSkZfU0hBUkVEKTsNCn0NCg0K LyogTG9hZCBETEwgc3ltYm9sIGluZm8uICovDQp2b2lkDQpkbGxfc3ltYm9s X2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkNCnsNCiAgaW50 IG47DQogIGRvbnRfcmVwZWF0ICgpOw0KDQogIGlmIChhcmdzID09IE5VTEwp DQogICAgZXJyb3IgKCJkbGwtc3ltYm9scyByZXF1aXJlcyBhIGZpbGUgbmFt ZSIpOw0KDQogIG4gPSBzdHJsZW4gKGFyZ3MpOw0KICBpZiAobiA+IDQgJiYg c3RyY2FzZWNtcCAoYXJncyArIG4gLSA0LCAiLmRsbCIpICE9IDApDQogICAg ew0KICAgICAgY2hhciAqbmV3YXJncyA9IChjaGFyICopIGFsbG9jYSAobiAr IDQgKyAxKTsNCiAgICAgIHN0cmNweSAobmV3YXJncywgYXJncyk7DQogICAg ICBzdHJjYXQgKG5ld2FyZ3MsICIuZGxsIik7DQogICAgICBhcmdzID0gbmV3 YXJnczsNCiAgICB9DQoNCiAgc2FmZV9zeW1ib2xfZmlsZV9hZGQgKGFyZ3Ms IGZyb21fdHR5LCBOVUxMLCAwLCBPQkpGX1NIQVJFRCB8IE9CSkZfVVNFUkxP QURFRCk7DQp9DQoNCi8qIExpc3QgY3VycmVudGx5IGxvYWRlZCBETExzLiAq Lw0Kdm9pZA0KaW5mb19kbGxfY29tbWFuZCAoY2hhciAqaWdub3JlLCBpbnQg ZnJvbV90dHkpDQp7DQogIHN0cnVjdCBzb19zdHVmZiAqc28gPSAmc29saWJf c3RhcnQ7DQoNCiAgaWYgKCFzby0+bmV4dCkNCiAgICByZXR1cm47DQoNCiAg cHJpbnRmX2ZpbHRlcmVkICgiJSpzICBMb2FkIEFkZHJlc3NcbiIsIC1tYXhf ZGxsX25hbWVfbGVuLCAiRExMIE5hbWUiKTsNCiAgd2hpbGUgKChzbyA9IHNv LT5uZXh0KSAhPSBOVUxMKQ0KICAgIHByaW50Zl9maWx0ZXJlZCAoIiUqcyAg JTA4bHhcbiIsIC1tYXhfZGxsX25hbWVfbGVuLCBzby0+bmFtZSwgc28tPmxv YWRfYWRkcik7DQoNCiAgcmV0dXJuOw0KfQ0KDQovKiBIYW5kbGUgREVCVUdf U1RSSU5HIG91dHB1dCBmcm9tIGNoaWxkIHByb2Nlc3MuDQogICBDeWd3aW4g cHJlcGVuZHMgaXRzIG1lc3NhZ2VzIHdpdGggYSAiY3lnd2luOiIuICBJbnRl cnByZXQgdGhpcyBhcw0KICAgYSBDeWd3aW4gc2lnbmFsLiAgT3RoZXJ3aXNl IGp1c3QgcHJpbnQgdGhlIHN0cmluZyBhcyBhIHdhcm5pbmcuICovDQpzdGF0 aWMgaW50DQpoYW5kbGVfb3V0cHV0X2RlYnVnX3N0cmluZyAoc3RydWN0IHRh cmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpDQp7DQogIGNoYXIgKnM7DQog IGludCBnb3Rhc2lnID0gRkFMU0U7DQoNCiAgaWYgKCF0YXJnZXRfcmVhZF9z dHJpbmcNCiAgICAoKENPUkVfQUREUikgY3VycmVudF9ldmVudC51LkRlYnVn U3RyaW5nLmxwRGVidWdTdHJpbmdEYXRhLCAmcywgMTAyNCwgMCkNCiAgICAg IHx8ICFzIHx8ICEqcykNCiAgICByZXR1cm4gZ290YXNpZzsNCg0KICBpZiAo c3RybmNtcCAocywgQ1lHV0lOX1NJR05BTF9TVFJJTkcsIHNpemVvZiAoQ1lH V0lOX1NJR05BTF9TVFJJTkcpIC0gMSkgIT0gMCkNCiAgICB7DQogICAgICBp ZiAoc3RybmNtcCAocywgImNZZyIsIDMpICE9IDApDQoJd2FybmluZyAoIiVz Iiwgcyk7DQogICAgfQ0KICBlbHNlDQogICAgew0KICAgICAgY2hhciAqcDsN CiAgICAgIGludCBzaWcgPSBzdHJ0b2wgKHMgKyBzaXplb2YgKENZR1dJTl9T SUdOQUxfU1RSSU5HKSAtIDEsICZwLCAwKTsNCiAgICAgIGdvdGFzaWcgPSB0 YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAoc2lnKTsNCiAgICAgIG91cnN0YXR1 cy0+dmFsdWUuc2lnID0gZ290YXNpZzsNCiAgICAgIGlmIChnb3Rhc2lnKQ0K CW91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9TVE9QUEVEOw0K ICAgIH0NCg0KICB4ZnJlZSAocyk7DQogIHJldHVybiBnb3Rhc2lnOw0KfQ0K DQpzdGF0aWMgaW50DQpkaXNwbGF5X3NlbGVjdG9yIChIQU5ETEUgdGhyZWFk LCBEV09SRCBzZWwpDQp7DQogIExEVF9FTlRSWSBpbmZvOw0KICBpZiAoR2V0 VGhyZWFkU2VsZWN0b3JFbnRyeSAodGhyZWFkLCBzZWwsICZpbmZvKSkNCiAg ICB7DQogICAgICBpbnQgYmFzZSwgbGltaXQ7DQogICAgICBwcmludGZfZmls dGVyZWQgKCIweCUwM2x4OiAiLCBzZWwpOw0KICAgICAgaWYgKCFpbmZvLkhp Z2hXb3JkLkJpdHMuUHJlcykNCiAgICAgICAgew0KICAgICAgICAgIHB1dHNf ZmlsdGVyZWQgKCJTZWdtZW50IG5vdCBwcmVzZW50XG4iKTsNCiAgICAgICAg ICByZXR1cm4gMDsNCiAgICAgICAgfQ0KICAgICAgYmFzZSA9IChpbmZvLkhp Z2hXb3JkLkJpdHMuQmFzZUhpIDw8IDI0KSArDQoJICAgICAoaW5mby5IaWdo V29yZC5CaXRzLkJhc2VNaWQgPDwgMTYpDQoJICAgICArIGluZm8uQmFzZUxv dzsNCiAgICAgIGxpbWl0ID0gKGluZm8uSGlnaFdvcmQuQml0cy5MaW1pdEhp IDw8IDE2KSArIGluZm8uTGltaXRMb3c7DQogICAgICBpZiAoaW5mby5IaWdo V29yZC5CaXRzLkdyYW51bGFyaXR5KQ0KICAgICAgIGxpbWl0ID0gKGxpbWl0 IDw8IDEyKSB8IDB4ZmZmOw0KICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiYmFz ZT0weCUwOHggbGltaXQ9MHglMDh4IiwgYmFzZSwgbGltaXQpOw0KICAgICAg aWYgKGluZm8uSGlnaFdvcmQuQml0cy5EZWZhdWx0X0JpZykNCiAgICAgICAg cHV0c19maWx0ZXJlZCgiIDMyLWJpdCAiKTsNCiAgICAgIGVsc2UNCiAgICAg ICAgcHV0c19maWx0ZXJlZCgiIDE2LWJpdCAiKTsNCiAgICAgIHN3aXRjaCAo KGluZm8uSGlnaFdvcmQuQml0cy5UeXBlICYgMHhmKSA+PiAxKQ0KCXsNCglj YXNlIDA6DQogICAgICAgICAgcHV0c19maWx0ZXJlZCAoIkRhdGEgKFJlYWQt T25seSwgRXhwLXVwIik7DQogICAgICAgICAgYnJlYWs7DQoJY2FzZSAxOg0K ICAgICAgICAgIHB1dHNfZmlsdGVyZWQgKCJEYXRhIChSZWFkL1dyaXRlLCBF eHAtdXAiKTsNCiAgICAgICAgICBicmVhazsNCgljYXNlIDI6DQogICAgICAg ICAgcHV0c19maWx0ZXJlZCAoIlVudXNlZCBzZWdtZW50ICgiKTsNCiAgICAg ICAgICBicmVhazsNCgljYXNlIDM6DQogICAgICAgICAgcHV0c19maWx0ZXJl ZCAoIkRhdGEgKFJlYWQvV3JpdGUsIEV4cC1kb3duIik7DQogICAgICAgICAg YnJlYWs7DQoJY2FzZSA0Og0KICAgICAgICAgIHB1dHNfZmlsdGVyZWQgKCJD b2RlIChFeGVjLU9ubHksIE4uQ29uZiIpOw0KICAgICAgICAgIGJyZWFrOw0K CWNhc2UgNToNCiAgICAgICAgICBwdXRzX2ZpbHRlcmVkICgiQ29kZSAoRXhl Yy9SZWFkLCBOLkNvbmYiKTsNCgkgIGJyZWFrOw0KCWNhc2UgNjoNCiAgICAg ICAgICBwdXRzX2ZpbHRlcmVkICgiQ29kZSAoRXhlYy1Pbmx5LCBDb25mIik7 DQoJICBicmVhazsNCgljYXNlIDc6DQogICAgICAgICAgcHV0c19maWx0ZXJl ZCAoIkNvZGUgKEV4ZWMvUmVhZCwgQ29uZiIpOw0KCSAgYnJlYWs7DQoJZGVm YXVsdDoNCgkgIHByaW50Zl9maWx0ZXJlZCAoIlVua25vd24gdHlwZSAweCV4 IixpbmZvLkhpZ2hXb3JkLkJpdHMuVHlwZSk7DQoJfQ0KICAgICAgaWYgKChp bmZvLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MSkgPT0gMCkNCiAgICAgICAg cHV0c19maWx0ZXJlZCgiLCBOLkFjYyIpOw0KICAgICAgcHV0c19maWx0ZXJl ZCAoIilcbiIpOw0KICAgICAgaWYgKChpbmZvLkhpZ2hXb3JkLkJpdHMuVHlw ZSAmIDB4MTApID09IDApDQoJcHV0c19maWx0ZXJlZCgiU3lzdGVtIHNlbGVj dG9yICIpOw0KICAgICAgcHJpbnRmX2ZpbHRlcmVkICgiUHJpdmlsZWRnZSBs ZXZlbCA9ICVkLiAiLCBpbmZvLkhpZ2hXb3JkLkJpdHMuRHBsKTsNCiAgICAg IGlmIChpbmZvLkhpZ2hXb3JkLkJpdHMuR3JhbnVsYXJpdHkpDQogICAgICAg IHB1dHNfZmlsdGVyZWQgKCJQYWdlIGdyYW51bGFyLlxuIik7DQogICAgICBl bHNlDQoJcHV0c19maWx0ZXJlZCAoIkJ5dGUgZ3JhbnVsYXIuXG4iKTsNCiAg ICAgIHJldHVybiAxOw0KICAgIH0NCiAgZWxzZQ0KICAgIHsNCiAgICAgIHBy aW50Zl9maWx0ZXJlZCAoIkludmFsaWQgc2VsZWN0b3IgMHglbHguXG4iLHNl bCk7DQogICAgICByZXR1cm4gMDsNCiAgICB9DQp9DQoNCnN0YXRpYyB2b2lk DQpkaXNwbGF5X3NlbGVjdG9ycyAoY2hhciAqIGFyZ3MsIGludCBmcm9tX3R0 eSkNCnsNCiAgaWYgKCFjdXJyZW50X3RocmVhZCkNCiAgICB7DQogICAgICBw dXRzX2ZpbHRlcmVkICgiSW1wb3NzaWJsZSB0byBkaXNwbGF5IHNlbGVjdG9y cyBub3cuXG4iKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogIGlmICghYXJn cykNCiAgICB7DQoNCiAgICAgIHB1dHNfZmlsdGVyZWQgKCJTZWxlY3RvciAk Y3NcbiIpOw0KICAgICAgZGlzcGxheV9zZWxlY3RvciAoY3VycmVudF90aHJl YWQtPmgsDQogICAgICAgIGN1cnJlbnRfdGhyZWFkLT5jb250ZXh0LlNlZ0Nz KTsNCiAgICAgIHB1dHNfZmlsdGVyZWQgKCJTZWxlY3RvciAkZHNcbiIpOw0K ICAgICAgZGlzcGxheV9zZWxlY3RvciAoY3VycmVudF90aHJlYWQtPmgsDQog ICAgICAgIGN1cnJlbnRfdGhyZWFkLT5jb250ZXh0LlNlZ0RzKTsNCiAgICAg IHB1dHNfZmlsdGVyZWQgKCJTZWxlY3RvciAkZXNcbiIpOw0KICAgICAgZGlz cGxheV9zZWxlY3RvciAoY3VycmVudF90aHJlYWQtPmgsDQogICAgICAgIGN1 cnJlbnRfdGhyZWFkLT5jb250ZXh0LlNlZ0VzKTsNCiAgICAgIHB1dHNfZmls dGVyZWQgKCJTZWxlY3RvciAkc3NcbiIpOw0KICAgICAgZGlzcGxheV9zZWxl Y3RvciAoY3VycmVudF90aHJlYWQtPmgsDQogICAgICAgIGN1cnJlbnRfdGhy ZWFkLT5jb250ZXh0LlNlZ1NzKTsNCiAgICAgIHB1dHNfZmlsdGVyZWQgKCJT ZWxlY3RvciAkZnNcbiIpOw0KICAgICAgZGlzcGxheV9zZWxlY3RvciAoY3Vy cmVudF90aHJlYWQtPmgsDQoJY3VycmVudF90aHJlYWQtPmNvbnRleHQuU2Vn RnMpOw0KICAgICAgcHV0c19maWx0ZXJlZCAoIlNlbGVjdG9yICRnc1xuIik7 DQogICAgICBkaXNwbGF5X3NlbGVjdG9yIChjdXJyZW50X3RocmVhZC0+aCwN CiAgICAgICAgY3VycmVudF90aHJlYWQtPmNvbnRleHQuU2VnR3MpOw0KICAg IH0NCiAgZWxzZQ0KICAgIHsNCiAgICAgIGludCBzZWw7DQogICAgICBzZWwg PSBwYXJzZV9hbmRfZXZhbF9sb25nIChhcmdzKTsNCiAgICAgIHByaW50Zl9m aWx0ZXJlZCAoIlNlbGVjdG9yIFwiJXNcIlxuIixhcmdzKTsNCiAgICAgIGRp c3BsYXlfc2VsZWN0b3IgKGN1cnJlbnRfdGhyZWFkLT5oLCBzZWwpOw0KICAg IH0NCn0NCg0Kc3RhdGljIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICppbmZv X3czMl9jbWRsaXN0ID0gTlVMTDsNCg0Kc3RhdGljIHZvaWQNCmluZm9fdzMy X2NvbW1hbmQgKGNoYXIgKmFyZ3MsIGludCBmcm9tX3R0eSkNCnsNCiAgaGVs cF9saXN0IChpbmZvX3czMl9jbWRsaXN0LCAiaW5mbyB3MzIgIiwgY2xhc3Nf aW5mbywgZ2RiX3N0ZG91dCk7DQp9DQoNCg0KI2RlZmluZSBERUJVR19FWENF UFRJT05fU0lNUExFKHgpICAgICAgIGlmIChkZWJ1Z19leGNlcHRpb25zKSBc DQogIHByaW50Zl91bmZpbHRlcmVkICgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9u ICVzIGF0IDB4JTA4bHhcbiIsIHgsIFwNCiAgKERXT1JEKSBjdXJyZW50X2V2 ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRy ZXNzKQ0KDQpzdGF0aWMgaW50DQpoYW5kbGVfZXhjZXB0aW9uIChzdHJ1Y3Qg dGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykNCnsNCiAgdGhyZWFkX2lu Zm8gKnRoOw0KICBEV09SRCBjb2RlID0gY3VycmVudF9ldmVudC51LkV4Y2Vw dGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZTsNCg0KICBvdXJz dGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsNCg0KICAv KiBSZWNvcmQgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdGhyZWFkICov DQogIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElk LCAtMSk7DQoNCiAgc3dpdGNoIChjb2RlKQ0KICAgIHsNCiAgICBjYXNlIEVY Q0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOg0KICAgICAgREVCVUdfRVhDRVBU SU9OX1NJTVBMRSAoIkVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OIik7DQog ICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VH VjsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgU1RBVFVTX1NUQUNLX09WRVJG TE9XOg0KICAgICAgREVCVUdfRVhDRVBUSU9OX1NJTVBMRSAoIlNUQVRVU19T VEFDS19PVkVSRkxPVyIpOw0KICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcg PSBUQVJHRVRfU0lHTkFMX1NFR1Y7DQogICAgICBicmVhazsNCiAgICBjYXNl IFNUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5EOg0KICAgICAgREVCVUdf RVhDRVBUSU9OX1NJTVBMRSAoIlNUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVS QU5EIik7DQogICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9T SUdOQUxfRlBFOw0KICAgICAgYnJlYWs7DQogICAgY2FzZSBFWENFUFRJT05f QVJSQVlfQk9VTkRTX0VYQ0VFREVEOg0KICAgICAgREVCVUdfRVhDRVBUSU9O X1NJTVBMRSAoIkVYQ0VQVElPTl9BUlJBWV9CT1VORFNfRVhDRUVERUQiKTsN CiAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9G UEU7DQogICAgICBicmVhazsNCiAgICBjYXNlIFNUQVRVU19GTE9BVF9JTkVY QUNUX1JFU1VMVDoNCiAgICAgIERFQlVHX0VYQ0VQVElPTl9TSU1QTEUgKCJT VEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQiKTsNCiAgICAgIG91cnN0YXR1 cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9GUEU7DQogICAgICBicmVh azsNCiAgICBjYXNlIFNUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTjoN CiAgICAgIERFQlVHX0VYQ0VQVElPTl9TSU1QTEUgKCJTVEFUVVNfRkxPQVRf SU5WQUxJRF9PUEVSQVRJT04iKTsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUu c2lnID0gVEFSR0VUX1NJR05BTF9GUEU7DQogICAgICBicmVhazsNCiAgICBj YXNlIFNUQVRVU19GTE9BVF9PVkVSRkxPVzoNCiAgICAgIERFQlVHX0VYQ0VQ VElPTl9TSU1QTEUgKCJTVEFUVVNfRkxPQVRfT1ZFUkZMT1ciKTsNCiAgICAg IG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9GUEU7DQog ICAgICBicmVhazsNCiAgICBjYXNlIFNUQVRVU19GTE9BVF9TVEFDS19DSEVD SzoNCiAgICAgIERFQlVHX0VYQ0VQVElPTl9TSU1QTEUgKCJTVEFUVVNfRkxP QVRfU1RBQ0tfQ0hFQ0siKTsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2ln ID0gVEFSR0VUX1NJR05BTF9GUEU7DQogICAgICBicmVhazsNCiAgICBjYXNl IFNUQVRVU19GTE9BVF9VTkRFUkZMT1c6DQogICAgICBERUJVR19FWENFUFRJ T05fU0lNUExFICgiU1RBVFVTX0ZMT0FUX1VOREVSRkxPVyIpOw0KICAgICAg b3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0ZQRTsNCiAg ICAgIGJyZWFrOw0KICAgIGNhc2UgU1RBVFVTX0ZMT0FUX0RJVklERV9CWV9a RVJPOg0KICAgICAgREVCVUdfRVhDRVBUSU9OX1NJTVBMRSAoIlNUQVRVU19G TE9BVF9ESVZJREVfQllfWkVSTyIpOw0KICAgICAgb3Vyc3RhdHVzLT52YWx1 ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0ZQRTsNCiAgICAgIGJyZWFrOw0KICAg IGNhc2UgU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk86DQogICAgICBE RUJVR19FWENFUFRJT05fU0lNUExFICgiU1RBVFVTX0lOVEVHRVJfRElWSURF X0JZX1pFUk8iKTsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFS R0VUX1NJR05BTF9GUEU7DQogICAgICBicmVhazsNCiAgICBjYXNlIFNUQVRV U19JTlRFR0VSX09WRVJGTE9XOg0KICAgICAgREVCVUdfRVhDRVBUSU9OX1NJ TVBMRSAoIlNUQVRVU19JTlRFR0VSX09WRVJGTE9XIik7DQogICAgICBvdXJz dGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfRlBFOw0KICAgICAg YnJlYWs7DQogICAgY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoNCiAgICAg IERFQlVHX0VYQ0VQVElPTl9TSU1QTEUgKCJFWENFUFRJT05fQlJFQUtQT0lO VCIpOw0KICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lH TkFMX1RSQVA7DQogICAgICBicmVhazsNCiAgICBjYXNlIERCR19DT05UUk9M X0M6DQogICAgICBERUJVR19FWENFUFRJT05fU0lNUExFICgiREJHX0NPTlRS T0xfQyIpOw0KICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRf U0lHTkFMX0lOVDsNCiAgICAgIGJyZWFrOw0KICAgIGNhc2UgREJHX0NPTlRS T0xfQlJFQUs6DQogICAgICBERUJVR19FWENFUFRJT05fU0lNUExFICgiREJH X0NPTlRST0xfQlJFQUsiKTsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2ln ID0gVEFSR0VUX1NJR05BTF9JTlQ7DQogICAgICBicmVhazsNCiAgICBjYXNl IEVYQ0VQVElPTl9TSU5HTEVfU1RFUDoNCiAgICAgIERFQlVHX0VYQ0VQVElP Tl9TSU1QTEUgKCJFWENFUFRJT05fU0lOR0xFX1NURVAiKTsNCiAgICAgIG91 cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9UUkFQOw0KICAg ICAgYnJlYWs7DQogICAgY2FzZSBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVD VElPTjoNCiAgICAgIERFQlVHX0VYQ0VQVElPTl9TSU1QTEUgKCJFWENFUFRJ T05fSUxMRUdBTF9JTlNUUlVDVElPTiIpOw0KICAgICAgb3Vyc3RhdHVzLT52 YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX0lMTDsNCiAgICAgIGJyZWFrOw0K ICAgIGNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046DQogICAgICBE RUJVR19FWENFUFRJT05fU0lNUExFICgiRVhDRVBUSU9OX1BSSVZfSU5TVFJV Q1RJT04iKTsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VU X1NJR05BTF9JTEw7DQogICAgICBicmVhazsNCiAgICBjYXNlIEVYQ0VQVElP Tl9OT05DT05USU5VQUJMRV9FWENFUFRJT046DQogICAgICBERUJVR19FWENF UFRJT05fU0lNUExFICgiRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQ VElPTiIpOw0KICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRf U0lHTkFMX0lMTDsNCiAgICAgIGJyZWFrOw0KICAgIGRlZmF1bHQ6DQogICAg ICBpZiAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNl KQ0KCXJldHVybiAwOw0KICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6 IHVua25vd24gdGFyZ2V0IGV4Y2VwdGlvbiAweCUwOGx4IGF0IDB4JTA4bHhc biIsDQoJCSAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlv blJlY29yZC5FeGNlcHRpb25Db2RlLA0KCShEV09SRCkgY3VycmVudF9ldmVu dC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVz cyk7DQogICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdO QUxfVU5LTk9XTjsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgZXhjZXB0aW9u X2NvdW50Kys7DQogIGxhc3Rfc2lnID0gb3Vyc3RhdHVzLT52YWx1ZS5zaWc7 DQogIHJldHVybiAxOw0KfQ0KDQovKiBSZXN1bWUgYWxsIGFydGlmaWNpYWxs eSBzdXNwZW5kZWQgdGhyZWFkcyBpZiB3ZSBhcmUgY29udGludWluZw0KICAg ZXhlY3V0aW9uICovDQpzdGF0aWMgQk9PTA0KY2hpbGRfY29udGludWUgKERX T1JEIGNvbnRpbnVlX3N0YXR1cywgaW50IGlkKQ0Kew0KICBpbnQgaTsNCiAg dGhyZWFkX2luZm8gKnRoOw0KICBCT09MIHJlczsNCg0KICBERUJVR19FVkVO VFMgKCgiQ29udGludWVEZWJ1Z0V2ZW50IChjcGlkPSVsZCwgY3RpZD0lbGQs ICVzKTtcbiIsDQoJCSAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3Vy cmVudF9ldmVudC5kd1RocmVhZElkLA0KCQkgIGNvbnRpbnVlX3N0YXR1cyA9 PSBEQkdfQ09OVElOVUUgPw0KCQkgICJEQkdfQ09OVElOVUUiIDogIkRCR19F WENFUFRJT05fTk9UX0hBTkRMRUQiKSk7DQogIHJlcyA9IENvbnRpbnVlRGVi dWdFdmVudCAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwNCgkJCSAgICBj dXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsDQoJCQkgICAgY29udGludWVfc3Rh dHVzKTsNCiAgY29udGludWVfc3RhdHVzID0gMDsNCiAgaWYgKHJlcykNCiAg ICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0g TlVMTDspDQogICAgICBpZiAoKChpZCA9PSAtMSkgfHwgKGlkID09IChpbnQp IHRoLT5pZCkpICYmIHRoLT5zdXNwZW5kX2NvdW50KQ0KCXsNCg0KCSAgZm9y IChpID0gMDsgaSA8IHRoLT5zdXNwZW5kX2NvdW50OyBpKyspDQoJICAgICh2 b2lkKSBSZXN1bWVUaHJlYWQgKHRoLT5oKTsNCgkgIHRoLT5zdXNwZW5kX2Nv dW50ID0gMDsNCgkgIGlmIChkZWJ1Z19yZWdpc3RlcnNfY2hhbmdlZCkNCgkg ICAgew0KCSAgICAgIC8qIE9ubHkgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUg ZGVidWcgcmVpc3RlcnMgKi8NCgkgICAgICB0aC0+Y29udGV4dC5Db250ZXh0 RmxhZ3MgPSBDT05URVhUX0RFQlVHX1JFR0lTVEVSUzsNCgkgICAgICB0aC0+ Y29udGV4dC5EcjAgPSBkclswXTsNCgkgICAgICB0aC0+Y29udGV4dC5EcjEg PSBkclsxXTsNCgkgICAgICB0aC0+Y29udGV4dC5EcjIgPSBkclsyXTsNCgkg ICAgICB0aC0+Y29udGV4dC5EcjMgPSBkclszXTsNCgkgICAgICAvKiB0aC0+ Y29udGV4dC5EcjYgPSBkcls2XTsNCgkJIEZJWE1FOiBzaG91bGQgd2Ugc2V0 IGRyNiBhbHNvID8/ICovDQoJICAgICAgdGgtPmNvbnRleHQuRHI3ID0gZHJb N107DQoJICAgICAgQ0hFQ0sgKFNldFRocmVhZENvbnRleHQgKHRoLT5oLCAm dGgtPmNvbnRleHQpKTsNCgkgICAgICB0aC0+Y29udGV4dC5Db250ZXh0Rmxh Z3MgPSAwOw0KCSAgICB9DQoJfQ0KDQogIGRlYnVnX3JlZ2lzdGVyc19jaGFu Z2VkID0gMDsNCiAgcmV0dXJuIHJlczsNCn0NCg0KLyogR2V0IHRoZSBuZXh0 IGV2ZW50IGZyb20gdGhlIGNoaWxkLiAgUmV0dXJuIDEgaWYgdGhlIGV2ZW50 IHJlcXVpcmVzDQogICBoYW5kbGluZyBieSBXRkkgKG9yIHdoYXRldmVyKS4N CiAqLw0Kc3RhdGljIGludA0KZ2V0X2NoaWxkX2RlYnVnX2V2ZW50IChpbnQg cGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykNCnsN CiAgQk9PTCBkZWJ1Z19ldmVudDsNCiAgRFdPUkQgY29udGludWVfc3RhdHVz LCBldmVudF9jb2RlOw0KICB0aHJlYWRfaW5mbyAqdGggPSBOVUxMOw0KICBz dGF0aWMgdGhyZWFkX2luZm8gZHVtbXlfdGhyZWFkX2luZm87DQogIGludCBy ZXR2YWwgPSAwOw0KDQogIGxhc3Rfc2lnID0gVEFSR0VUX1NJR05BTF8wOw0K DQogIGlmICghKGRlYnVnX2V2ZW50ID0gV2FpdEZvckRlYnVnRXZlbnQgKCZj dXJyZW50X2V2ZW50LCAxMDAwKSkpDQogICAgZ290byBvdXQ7DQoNCiAgZXZl bnRfY291bnQrKzsNCiAgY29udGludWVfc3RhdHVzID0gREJHX0NPTlRJTlVF Ow0KDQogIGV2ZW50X2NvZGUgPSBjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVu dENvZGU7DQogIG91cnN0YXR1cy0+a2luZCA9IFRBUkdFVF9XQUlUS0lORF9T UFVSSU9VUzsNCg0KICBzd2l0Y2ggKGV2ZW50X2NvZGUpDQogICAgew0KICAg IGNhc2UgQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVDoNCiAgICAgIERFQlVH X0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0l eCBjb2RlPSVzKVxuIiwNCgkJICAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZl bnQuZHdQcm9jZXNzSWQsDQoJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2 ZW50LmR3VGhyZWFkSWQsDQoJCSAgICAgIkNSRUFURV9USFJFQURfREVCVUdf RVZFTlQiKSk7DQogICAgICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFr Ow0KICAgICAgLyogUmVjb3JkIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0aHJl YWQgKi8NCiAgICAgIHRoID0gY2hpbGRfYWRkX3RocmVhZCAoY3VycmVudF9l dmVudC5kd1RocmVhZElkLA0KCQkJICAgICBjdXJyZW50X2V2ZW50LnUuQ3Jl YXRlVGhyZWFkLmhUaHJlYWQpOw0KICAgICAgaWYgKGluZm9fdmVyYm9zZSkN CglwcmludGZfdW5maWx0ZXJlZCAoIltOZXcgJXNdXG4iLA0KCQkJICAgdGFy Z2V0X3BpZF90b19zdHIgKA0KCQkJICAgICBwaWRfdG9fcHRpZCAoY3VycmVu dF9ldmVudC5kd1RocmVhZElkKSkpOw0KICAgICAgcmV0dmFsID0gY3VycmVu dF9ldmVudC5kd1RocmVhZElkOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNl IEVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UOg0KICAgICAgREVCVUdfRVZFTlRT ICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9 JXMpXG4iLA0KCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1By b2Nlc3NJZCwNCgkJICAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdU aHJlYWRJZCwNCgkJICAgICAiRVhJVF9USFJFQURfREVCVUdfRVZFTlQiKSk7 DQogICAgICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFrOw0KICAgICAg Y2hpbGRfZGVsZXRlX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElk KTsNCiAgICAgIHRoID0gJmR1bW15X3RocmVhZF9pbmZvOw0KICAgICAgYnJl YWs7DQoNCiAgICBjYXNlIENSRUFURV9QUk9DRVNTX0RFQlVHX0VWRU5UOg0K ICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBw aWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLA0KCQkgICAgICh1bnNpZ25lZCkg Y3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwNCgkJICAgICAodW5zaWduZWQp IGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwNCgkJICAgICAiQ1JFQVRFX1BS T0NFU1NfREVCVUdfRVZFTlQiKSk7DQogICAgICBDbG9zZUhhbmRsZSAoY3Vy cmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhGaWxlKTsNCiAgICAg IGlmICgrK3Nhd19jcmVhdGUgIT0gMSkNCgl7DQoJICBDbG9zZUhhbmRsZSAo Y3VycmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhQcm9jZXNzKTsN CgkgIGJyZWFrOw0KCX0NCg0KICAgICAgY3VycmVudF9wcm9jZXNzX2hhbmRs ZSA9IGN1cnJlbnRfZXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oUHJvY2Vz czsNCiAgICAgIG1haW5fdGhyZWFkX2lkID0gY3VycmVudF9ldmVudC5kd1Ro cmVhZElkOw0KICAgICAgLyogQWRkIHRoZSBtYWluIHRocmVhZCAqLw0KI2lm IDANCiAgICAgIHRoID0gY2hpbGRfYWRkX3RocmVhZCAoY3VycmVudF9ldmVu dC5kd1Byb2Nlc3NJZCwNCgkJCSAgICAgY3VycmVudF9ldmVudC51LkNyZWF0 ZVByb2Nlc3NJbmZvLmhQcm9jZXNzKTsNCiNlbmRpZg0KICAgICAgdGggPSBj aGlsZF9hZGRfdGhyZWFkIChtYWluX3RocmVhZF9pZCwNCgkJCSAgICAgY3Vy cmVudF9ldmVudC51LkNyZWF0ZVByb2Nlc3NJbmZvLmhUaHJlYWQpOw0KICAg ICAgcmV0dmFsID0gb3Vyc3RhdHVzLT52YWx1ZS5yZWxhdGVkX3BpZCA9IGN1 cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsNCiAgICAgIGJyZWFrOw0KDQogICAg Y2FzZSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQ6DQogICAgICBERUJVR19F VkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQg Y29kZT0lcylcbiIsDQoJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50 LmR3UHJvY2Vzc0lkLA0KCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVu dC5kd1RocmVhZElkLA0KCQkgICAgICJFWElUX1BST0NFU1NfREVCVUdfRVZF TlQiKSk7DQogICAgICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFrOw0K ICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRF RDsNCiAgICAgIG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IGN1cnJlbnRf ZXZlbnQudS5FeGl0UHJvY2Vzcy5kd0V4aXRDb2RlOw0KICAgICAgQ2xvc2VI YW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpOw0KICAgICAgcmV0dmFs ID0gbWFpbl90aHJlYWRfaWQ7DQogICAgICBicmVhazsNCg0KICAgIGNhc2Ug TE9BRF9ETExfREVCVUdfRVZFTlQ6DQogICAgICBERUJVR19FVkVOVFMgKCgi Z2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylc biIsDQoJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vz c0lkLA0KCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVh ZElkLA0KCQkgICAgICJMT0FEX0RMTF9ERUJVR19FVkVOVCIpKTsNCiAgICAg IENsb3NlSGFuZGxlIChjdXJyZW50X2V2ZW50LnUuTG9hZERsbC5oRmlsZSk7 DQogICAgICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFrOw0KICAgICAg Y2F0Y2hfZXJyb3JzIChoYW5kbGVfbG9hZF9kbGwsIE5VTEwsIChjaGFyICop ICIiLCBSRVRVUk5fTUFTS19BTEwpOw0KICAgICAgcmVnaXN0ZXJzX2NoYW5n ZWQgKCk7CS8qIG1hcmsgYWxsIHJlZ3MgaW52YWxpZCAqLw0KICAgICAgb3Vy c3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0xPQURFRDsNCiAgICAg IG91cnN0YXR1cy0+dmFsdWUuaW50ZWdlciA9IDA7DQogICAgICByZXR2YWwg PSBtYWluX3RocmVhZF9pZDsNCiAgICAgIHJlX2VuYWJsZV9icmVha3BvaW50 c19pbl9zaGxpYnMgKCk7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgVU5M T0FEX0RMTF9ERUJVR19FVkVOVDoNCiAgICAgIERFQlVHX0VWRU5UUyAoKCJn ZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxu IiwNCgkJICAgICAodW5zaWduZWQpIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNz SWQsDQoJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3VGhyZWFk SWQsDQoJCSAgICAgIlVOTE9BRF9ETExfREVCVUdfRVZFTlQiKSk7DQogICAg ICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFrOw0KICAgICAgY2F0Y2hf ZXJyb3JzIChoYW5kbGVfdW5sb2FkX2RsbCwgTlVMTCwgKGNoYXIgKikgIiIs IFJFVFVSTl9NQVNLX0FMTCk7DQogICAgICByZWdpc3RlcnNfY2hhbmdlZCAo KTsJLyogbWFyayBhbGwgcmVncyBpbnZhbGlkICovDQogICAgICAvKiBvdXJz dGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfVU5MT0FERUQ7DQoJIGRv ZXMgbm90IGV4aXN0IHlldC4gKi8NCiAgICAgIGJyZWFrOw0KDQogICAgY2Fz ZSBFWENFUFRJT05fREVCVUdfRVZFTlQ6DQogICAgICBERUJVR19FVkVOVFMg KCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0l cylcbiIsDQoJCSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJv Y2Vzc0lkLA0KCQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1Ro cmVhZElkLA0KCQkgICAgICJFWENFUFRJT05fREVCVUdfRVZFTlQiKSk7DQog ICAgICBpZiAoc2F3X2NyZWF0ZSAhPSAxKQ0KCWJyZWFrOw0KICAgICAgaWYg KGhhbmRsZV9leGNlcHRpb24gKG91cnN0YXR1cykpDQoJcmV0dmFsID0gY3Vy cmVudF9ldmVudC5kd1RocmVhZElkOw0KICAgICAgYnJlYWs7DQoNCiAgICBj YXNlIE9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQ6CS8qIG1lc3NhZ2UgZnJv bSB0aGUga2VybmVsICovDQogICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBr ZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsDQoJ CSAgICAgKHVuc2lnbmVkKSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLA0K CQkgICAgICh1bnNpZ25lZCkgY3VycmVudF9ldmVudC5kd1RocmVhZElkLA0K CQkgICAgICJPVVRQVVRfREVCVUdfU1RSSU5HX0VWRU5UIikpOw0KICAgICAg aWYgKHNhd19jcmVhdGUgIT0gMSkNCglicmVhazsNCiAgICAgIGlmIChoYW5k bGVfb3V0cHV0X2RlYnVnX3N0cmluZyAob3Vyc3RhdHVzKSkNCglyZXR2YWwg PSBtYWluX3RocmVhZF9pZDsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVs dDoNCiAgICAgIGlmIChzYXdfY3JlYXRlICE9IDEpDQoJYnJlYWs7DQogICAg ICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjoga2VybmVsIGV2ZW50IGZvciBw aWQ9JWxkIHRpZD0lbGRcbiIsDQoJCQkgKERXT1JEKSBjdXJyZW50X2V2ZW50 LmR3UHJvY2Vzc0lkLA0KCQkJIChEV09SRCkgY3VycmVudF9ldmVudC5kd1Ro cmVhZElkKTsNCiAgICAgIHByaW50Zl91bmZpbHRlcmVkICgiICAgICAgICAg ICAgICAgICB1bmtub3duIGV2ZW50IGNvZGUgJWxkXG4iLA0KCQkJIGN1cnJl bnRfZXZlbnQuZHdEZWJ1Z0V2ZW50Q29kZSk7DQogICAgICBicmVhazsNCiAg ICB9DQoNCiAgaWYgKCFyZXR2YWwgfHwgc2F3X2NyZWF0ZSAhPSAxKQ0KICAg IENIRUNLIChjaGlsZF9jb250aW51ZSAoY29udGludWVfc3RhdHVzLCAtMSkp Ow0KICBlbHNlDQogICAgew0KICAgICAgY3VycmVudF90aHJlYWQgPSB0aCA/ IDogdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCBUUlVF KTsNCiAgICAgIGluZmVyaW9yX3B0aWQgPSBwaWRfdG9fcHRpZCAocmV0dmFs KTsNCiAgICB9DQoNCm91dDoNCiAgcmV0dXJuIHJldHZhbDsNCn0NCg0KLyog V2FpdCBmb3IgaW50ZXJlc3RpbmcgZXZlbnRzIHRvIG9jY3VyIGluIHRoZSB0 YXJnZXQgcHJvY2Vzcy4gKi8NCnN0YXRpYyBwdGlkX3QNCmNoaWxkX3dhaXQg KHB0aWRfdCBwdGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0 YXR1cykNCnsNCiAgaW50IHBpZCA9IFBJREdFVCAocHRpZCk7DQoNCiAgLyog V2UgbG9vcCB3aGVuIHdlIGdldCBhIG5vbi1zdGFuZGFyZCBleGNlcHRpb24g cmF0aGVyIHRoYW4gcmV0dXJuDQogICAgIHdpdGggYSBTUFVSSU9VUyBiZWNh dXNlIHJlc3VtZSBjYW4gdHJ5IGFuZCBzdGVwIG9yIG1vZGlmeSB0aGluZ3Ms DQogICAgIHdoaWNoIG5lZWRzIGEgY3VycmVudF90aHJlYWQtPmguICBCdXQg c29tZSBvZiB0aGVzZSBleGNlcHRpb25zIG1hcmsNCiAgICAgdGhlIGJpcnRo IG9yIGRlYXRoIG9mIHRocmVhZHMsIHdoaWNoIG1lYW4gdGhhdCB0aGUgY3Vy cmVudCB0aHJlYWQNCiAgICAgaXNuJ3QgbmVjZXNzYXJpbHkgd2hhdCB5b3Ug dGhpbmsgaXQgaXMuICovDQoNCiAgd2hpbGUgKDEpDQogICAgew0KICAgICAg aW50IHJldHZhbCA9IGdldF9jaGlsZF9kZWJ1Z19ldmVudCAocGlkLCBvdXJz dGF0dXMpOw0KICAgICAgaWYgKHJldHZhbCkNCglyZXR1cm4gcGlkX3RvX3B0 aWQgKHJldHZhbCk7DQogICAgICBlbHNlDQoJew0KCSAgaW50IGRldGFjaCA9 IDA7DQoNCgkgIGlmICh1aV9sb29wX2hvb2sgIT0gTlVMTCkNCgkgICAgZGV0 YWNoID0gdWlfbG9vcF9ob29rICgwKTsNCg0KCSAgaWYgKGRldGFjaCkNCgkg ICAgY2hpbGRfa2lsbF9pbmZlcmlvciAoKTsNCgl9DQogICAgfQ0KfQ0KDQpz dGF0aWMgdm9pZA0KZG9faW5pdGlhbF9jaGlsZF9zdHVmZiAoRFdPUkQgcGlk KQ0Kew0KICBleHRlcm4gaW50IHN0b3BfYWZ0ZXJfdHJhcDsNCiAgaW50IGk7 DQoNCiAgbGFzdF9zaWcgPSBUQVJHRVRfU0lHTkFMXzA7DQogIGV2ZW50X2Nv dW50ID0gMDsNCiAgZXhjZXB0aW9uX2NvdW50ID0gMDsNCiAgZGVidWdfcmVn aXN0ZXJzX2NoYW5nZWQgPSAwOw0KICBkZWJ1Z19yZWdpc3RlcnNfdXNlZCA9 IDA7DQogIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRyKSAvIHNpemVvZiAo ZHJbMF0pOyBpKyspDQogICAgZHJbaV0gPSAwOw0KICBjdXJyZW50X2V2ZW50 LmR3UHJvY2Vzc0lkID0gcGlkOw0KICBtZW1zZXQgKCZjdXJyZW50X2V2ZW50 LCAwLCBzaXplb2YgKGN1cnJlbnRfZXZlbnQpKTsNCiAgcHVzaF90YXJnZXQg KCZjaGlsZF9vcHMpOw0KICBjaGlsZF9pbml0X3RocmVhZF9saXN0ICgpOw0K ICBkaXNhYmxlX2JyZWFrcG9pbnRzX2luX3NobGlicyAoMSk7DQogIGNoaWxk X2NsZWFyX3NvbGlicyAoKTsNCiAgY2xlYXJfcHJvY2VlZF9zdGF0dXMgKCk7 DQogIGluaXRfd2FpdF9mb3JfaW5mZXJpb3IgKCk7DQoNCiAgdGFyZ2V0X3Rl cm1pbmFsX2luaXQgKCk7DQogIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAo KTsNCg0KICB3aGlsZSAoMSkNCiAgICB7DQogICAgICBzdG9wX2FmdGVyX3Ry YXAgPSAxOw0KICAgICAgd2FpdF9mb3JfaW5mZXJpb3IgKCk7DQogICAgICBp ZiAoc3RvcF9zaWduYWwgIT0gVEFSR0VUX1NJR05BTF9UUkFQKQ0KCXJlc3Vt ZSAoMCwgc3RvcF9zaWduYWwpOw0KICAgICAgZWxzZQ0KCWJyZWFrOw0KICAg IH0NCiAgc3RvcF9hZnRlcl90cmFwID0gMDsNCiAgcmV0dXJuOw0KfQ0KDQov KiBTaW5jZSBXaW5kb3dzIFhQLCBkZXRhY2hpbmcgZnJvbSBhIHByb2Nlc3Mg aXMgc3VwcG9ydGVkIGJ5IFdpbmRvd3MuDQogICBUaGUgZm9sbG93aW5nIGNv ZGUgdHJpZXMgbG9hZGluZyB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb25zIGR5 bmFtaWNhbGx5Lg0KICAgSWYgbG9hZGluZyB0aGVzZSBmdW5jdGlvbnMgc3Vj Y2VlZHMgdXNlIHRoZW0gdG8gYWN0dWFsbHkgZGV0YWNoIGZyb20NCiAgIHRo ZSBpbmZlcmlvciBwcm9jZXNzLCBvdGhlcndpc2UgYmVoYXZlIGFzIHVzdWFs LCBwcmV0ZW5kaW5nIHRoYXQNCiAgIGRldGFjaCBoYXMgd29ya2VkLiAqLw0K c3RhdGljIEJPT0wgV0lOQVBJICgqRGVidWdTZXRQcm9jZXNzS2lsbE9uRXhp dCkoQk9PTCk7DQpzdGF0aWMgQk9PTCBXSU5BUEkgKCpEZWJ1Z0FjdGl2ZVBy b2Nlc3NTdG9wKShEV09SRCk7DQoNCnN0YXRpYyBpbnQNCmhhc19kZXRhY2hf YWJpbGl0eSAodm9pZCkNCnsNCiAgc3RhdGljIEhNT0RVTEUga2VybmVsMzIg PSBOVUxMOw0KDQogIGlmICgha2VybmVsMzIpDQogICAga2VybmVsMzIgPSBM b2FkTGlicmFyeSAoImtlcm5lbDMyLmRsbCIpOw0KICBpZiAoa2VybmVsMzIp DQogICAgew0KICAgICAgaWYgKCFEZWJ1Z1NldFByb2Nlc3NLaWxsT25FeGl0 KQ0KCURlYnVnU2V0UHJvY2Vzc0tpbGxPbkV4aXQgPSBHZXRQcm9jQWRkcmVz cyAoa2VybmVsMzIsDQoJCQkJCQkgIkRlYnVnU2V0UHJvY2Vzc0tpbGxPbkV4 aXQiKTsNCiAgICAgIGlmICghRGVidWdBY3RpdmVQcm9jZXNzU3RvcCkNCglE ZWJ1Z0FjdGl2ZVByb2Nlc3NTdG9wID0gR2V0UHJvY0FkZHJlc3MgKGtlcm5l bDMyLA0KCQkJCQkJICJEZWJ1Z0FjdGl2ZVByb2Nlc3NTdG9wIik7DQogICAg ICBpZiAoRGVidWdTZXRQcm9jZXNzS2lsbE9uRXhpdCAmJiBEZWJ1Z0FjdGl2 ZVByb2Nlc3NTdG9wKQ0KCXJldHVybiAxOw0KICAgIH0NCiAgcmV0dXJuIDA7 DQp9DQoNCi8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFs aXplIGZvciBkZWJ1Z2dpbmcgaXQuICAqLw0Kc3RhdGljIHZvaWQNCmNoaWxk X2F0dGFjaCAoY2hhciAqYXJncywgaW50IGZyb21fdHR5KQ0Kew0KICBCT09M IG9rOw0KICBEV09SRCBwaWQ7DQoNCiAgaWYgKCFhcmdzKQ0KICAgIGVycm9y X25vX2FyZyAoInByb2Nlc3MtaWQgdG8gYXR0YWNoIik7DQoNCiAgcGlkID0g c3RydG91bCAoYXJncywgMCwgMCk7IC8qIFdpbmRvd3MgcGlkICovDQogIG9r ID0gRGVidWdBY3RpdmVQcm9jZXNzIChwaWQpOw0KICBzYXdfY3JlYXRlID0g MDsNCg0KICBpZiAoIW9rKQ0KICAgIHsNCiAgICAgIC8qIFRyeSBmYWxsIGJh Y2sgdG8gQ3lnd2luIHBpZCAqLw0KICAgICAgcGlkID0gY3lnd2luX2ludGVy bmFsIChDV19DWUdXSU5fUElEX1RPX1dJTlBJRCwgcGlkKTsNCg0KICAgICAg aWYgKHBpZCA+IDApDQogICAgICAgIG9rID0gRGVidWdBY3RpdmVQcm9jZXNz IChwaWQpOw0KDQogICAgICBpZiAoIW9rKQ0KICAgICAgICBlcnJvciAoIkNh bid0IGF0dGFjaCB0byBwcm9jZXNzLiIpOw0KICAgIH0NCg0KICBpZiAoaGFz X2RldGFjaF9hYmlsaXR5ICgpKQ0KICAgIHsNCiAgICAgIGF0dGFjaF9mbGFn ID0gMTsNCiAgICAgIERlYnVnU2V0UHJvY2Vzc0tpbGxPbkV4aXQgKEZBTFNF KTsNCiAgICB9DQoNCiAgaWYgKGZyb21fdHR5KQ0KICAgIHsNCiAgICAgIGNo YXIgKmV4ZWNfZmlsZSA9IChjaGFyICopIGdldF9leGVjX2ZpbGUgKDApOw0K DQogICAgICBpZiAoZXhlY19maWxlKQ0KCXByaW50Zl91bmZpbHRlcmVkICgi QXR0YWNoaW5nIHRvIHByb2dyYW0gYCVzJywgJXNcbiIsIGV4ZWNfZmlsZSwN CgkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChwaWRfdG9fcHRpZCAocGlkKSkp Ow0KICAgICAgZWxzZQ0KCXByaW50Zl91bmZpbHRlcmVkICgiQXR0YWNoaW5n IHRvICVzXG4iLA0KCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKHBpZF90b19w dGlkIChwaWQpKSk7DQoNCiAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7 DQogICAgfQ0KDQogIGRvX2luaXRpYWxfY2hpbGRfc3R1ZmYgKHBpZCk7DQog IHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOw0KfQ0KDQpzdGF0aWMgdm9pZA0K Y2hpbGRfZGV0YWNoIChjaGFyICphcmdzLCBpbnQgZnJvbV90dHkpDQp7DQog IGludCBkZXRhY2hlZCA9IDE7DQoNCiAgaWYgKGhhc19kZXRhY2hfYWJpbGl0 eSAoKSkNCiAgICB7DQogICAgICBkZWxldGVfY29tbWFuZCAoTlVMTCwgMCk7 DQogICAgICBjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSk7DQog ICAgICBpZiAoIURlYnVnQWN0aXZlUHJvY2Vzc1N0b3AgKGN1cnJlbnRfZXZl bnQuZHdQcm9jZXNzSWQpKQ0KCXsNCgkgIGVycm9yICgiQ2FuJ3QgZGV0YWNo IHByb2Nlc3MgJWx1IChlcnJvciAlbHUpIiwNCgkJIGN1cnJlbnRfZXZlbnQu ZHdQcm9jZXNzSWQsIEdldExhc3RFcnJvciAoKSk7DQoJICBkZXRhY2hlZCA9 IDA7DQoJfQ0KICAgICAgRGVidWdTZXRQcm9jZXNzS2lsbE9uRXhpdCAoRkFM U0UpOw0KICAgIH0NCiAgaWYgKGRldGFjaGVkICYmIGZyb21fdHR5KQ0KICAg IHsNCiAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IGdldF9leGVjX2ZpbGUgKDAp Ow0KICAgICAgaWYgKGV4ZWNfZmlsZSA9PSAwKQ0KCWV4ZWNfZmlsZSA9ICIi Ow0KICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBw cm9ncmFtOiAlcywgUGlkICVsdVxuIiwgZXhlY19maWxlLA0KCQkJIGN1cnJl bnRfZXZlbnQuZHdQcm9jZXNzSWQpOw0KICAgICAgZ2RiX2ZsdXNoIChnZGJf c3Rkb3V0KTsNCiAgICB9DQogIGluZmVyaW9yX3B0aWQgPSBudWxsX3B0aWQ7 DQogIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOw0KfQ0KDQovKiBQcmlu dCBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB3ZSdyZSBhY2Nlc3Np bmcuICAqLw0KDQpzdGF0aWMgdm9pZA0KY2hpbGRfZmlsZXNfaW5mbyAoc3Ry dWN0IHRhcmdldF9vcHMgKmlnbm9yZSkNCnsNCiAgcHJpbnRmX3VuZmlsdGVy ZWQgKCJcdFVzaW5nIHRoZSBydW5uaW5nIGltYWdlIG9mICVzICVzLlxuIiwN CiAgICAgIGF0dGFjaF9mbGFnID8gImF0dGFjaGVkIiA6ICJjaGlsZCIsIHRh cmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9wdGlkKSk7DQp9DQoNCi8qIEFS R1NVU0VEICovDQpzdGF0aWMgdm9pZA0KY2hpbGRfb3BlbiAoY2hhciAqYXJn LCBpbnQgZnJvbV90dHkpDQp7DQogIGVycm9yICgiVXNlIHRoZSBcInJ1blwi IGNvbW1hbmQgdG8gc3RhcnQgYSBVbml4IGNoaWxkIHByb2Nlc3MuIik7DQp9 DQoNCi8qIFN0YXJ0IGFuIGluZmVyaW9yIHdpbjMyIGNoaWxkIHByb2Nlc3Mg YW5kIHNldHMgaW5mZXJpb3JfcHRpZCB0byBpdHMgcGlkLg0KICAgRVhFQ19G SUxFIGlzIHRoZSBmaWxlIHRvIHJ1bi4NCiAgIEFMTEFSR1MgaXMgYSBzdHJp bmcgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHRvIHRoZSBwcm9ncmFtLg0K ICAgRU5WIGlzIHRoZSBlbnZpcm9ubWVudCB2ZWN0b3IgdG8gcGFzcy4gIEVy cm9ycyByZXBvcnRlZCB3aXRoIGVycm9yKCkuICAqLw0KDQpzdGF0aWMgdm9p ZA0KY2hpbGRfY3JlYXRlX2luZmVyaW9yIChjaGFyICpleGVjX2ZpbGUsIGNo YXIgKmFsbGFyZ3MsIGNoYXIgKiplbnYpDQp7DQogIGNoYXIgKndpbmVudjsN CiAgY2hhciAqdGVtcDsNCiAgaW50IGVudmxlbjsNCiAgaW50IGk7DQogIFNU QVJUVVBJTkZPIHNpOw0KICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOw0KICBC T09MIHJldDsNCiAgRFdPUkQgZmxhZ3M7DQogIGNoYXIgKmFyZ3M7DQogIGNo YXIgcmVhbF9wYXRoW01BWFBBVEhMRU5dOw0KICBjaGFyICp0b2V4ZWM7DQog IGNoYXIgc2hlbGxbTUFYX1BBVEggKyAxXTsgLyogUGF0aCB0byBzaGVsbCAq Lw0KICBjb25zdCBjaGFyICpzaDsNCiAgaW50IHR0eTsNCiAgaW50IG9zdGRp biwgb3N0ZG91dCwgb3N0ZGVycjsNCg0KICBpZiAoIWV4ZWNfZmlsZSkNCiAg ICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkLCB1c2UgYHRhcmdl dCBleGVjJy5cbiIpOw0KDQogIG1lbXNldCAoJnNpLCAwLCBzaXplb2YgKHNp KSk7DQogIHNpLmNiID0gc2l6ZW9mIChzaSk7DQoNCiAgaWYgKCF1c2VzaGVs bCkNCiAgICB7DQogICAgICBmbGFncyA9IERFQlVHX09OTFlfVEhJU19QUk9D RVNTOw0KICAgICAgY3lnd2luX2NvbnZfdG9fd2luMzJfcGF0aCAoZXhlY19m aWxlLCByZWFsX3BhdGgpOw0KICAgICAgdG9leGVjID0gcmVhbF9wYXRoOw0K ICAgIH0NCiAgZWxzZQ0KICAgIHsNCiAgICAgIGNoYXIgKm5ld2FsbGFyZ3M7 DQogICAgICBzaCA9IGdldGVudiAoIlNIRUxMIik7DQogICAgICBpZiAoIXNo KQ0KCXNoID0gIi9iaW4vc2giOw0KICAgICAgY3lnd2luX2NvbnZfdG9fd2lu MzJfcGF0aCAoc2gsIHNoZWxsKTsNCiAgICAgIG5ld2FsbGFyZ3MgPSBhbGxv Y2EgKHNpemVvZiAoIiAtYyAnZXhlYyAgJyIpICsgc3RybGVuIChleGVjX2Zp bGUpDQoJCQkgICArIHN0cmxlbiAoYWxsYXJncykgKyAyKTsNCiAgICAgIHNw cmludGYgKG5ld2FsbGFyZ3MsICIgLWMgJ2V4ZWMgJXMgJXMnIiwgZXhlY19m aWxlLCBhbGxhcmdzKTsNCiAgICAgIGFsbGFyZ3MgPSBuZXdhbGxhcmdzOw0K ICAgICAgdG9leGVjID0gc2hlbGw7DQogICAgICBmbGFncyA9IERFQlVHX1BS T0NFU1M7DQogICAgfQ0KDQogIGlmIChuZXdfZ3JvdXApDQogICAgZmxhZ3Mg fD0gQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQOw0KDQogIGlmIChuZXdfY29u c29sZSkNCiAgICBmbGFncyB8PSBDUkVBVEVfTkVXX0NPTlNPTEU7DQoNCiAg YXJncyA9IGFsbG9jYSAoc3RybGVuICh0b2V4ZWMpICsgc3RybGVuIChhbGxh cmdzKSArIDIpOw0KICBzdHJjcHkgKGFyZ3MsIHRvZXhlYyk7DQogIHN0cmNh dCAoYXJncywgIiAiKTsNCiAgc3RyY2F0IChhcmdzLCBhbGxhcmdzKTsNCg0K ICAvKiBQcmVwYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJzIGZvciBDcmVhdGVQ cm9jZXNzLiAgKi8NCiAgew0KICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGFz c3VtZSBhbGwgZW52IHZhcnMgd2VyZSBmaWxlIG5hbWVzIGFuZCB3b3VsZA0K ICAgICAgIHRyYW5zbGF0ZSB0aGVtIGFsbCB0byB3aW4zMiBzdHlsZS4gIFRo YXQgb2J2aW91c2x5IGRvZXNuJ3Qgd29yayBpbiB0aGUNCiAgICAgICBnZW5l cmFsIGNhc2UuICBUaGUgY3VycmVudCBydWxlIGlzIHRoYXQgd2Ugb25seSB0 cmFuc2xhdGUgUEFUSC4NCiAgICAgICBXZSBuZWVkIHRvIGhhbmRsZSBQQVRI IGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gY2FsbCBDcmVhdGVQcm9jZXNzIGFu ZA0KICAgICAgIGl0IHVzZXMgUEFUSCB0byBmaW5kIERMTCdzLiAgRm9ydHVu YXRlbHkgUEFUSCBoYXMgYSB3ZWxsLWRlZmluZWQgdmFsdWUNCiAgICAgICBp biBib3RoIHBvc2l4IGFuZCB3aW4zMiBlbnZpcm9ubWVudHMuICBjeWd3aW4u ZGxsIHdpbGwgY2hhbmdlIGl0IGJhY2sNCiAgICAgICB0byBwb3NpeCBzdHls ZSBpZiBuZWNlc3NhcnkuICAqLw0KDQogICAgc3RhdGljIGNvbnN0IGNoYXIg KmNvbnZfcGF0aF9uYW1lc1tdID0NCiAgICB7DQogICAgICAiUEFUSD0iLA0K ICAgICAgMA0KICAgIH07DQoNCiAgICAvKiBDcmVhdGVQcm9jZXNzIHRha2Vz IHRoZSBlbnZpcm9ubWVudCBsaXN0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHNl dCBvZg0KICAgICAgIHN0cmluZ3MgKGkuZS4gdHdvIG51bGxzIHRlcm1pbmF0 ZSB0aGUgbGlzdCkuICAqLw0KDQogICAgLyogR2V0IHRvdGFsIHNpemUgZm9y IGVudiBzdHJpbmdzLiAgKi8NCiAgICBmb3IgKGVudmxlbiA9IDAsIGkgPSAw OyBlbnZbaV0gJiYgKmVudltpXTsgaSsrKQ0KICAgICAgew0KCWludCBqLCBs ZW47DQoNCglmb3IgKGogPSAwOyBjb252X3BhdGhfbmFtZXNbal07IGorKykN CgkgIHsNCgkgICAgbGVuID0gc3RybGVuIChjb252X3BhdGhfbmFtZXNbal0p Ow0KCSAgICBpZiAoc3RybmNtcCAoY29udl9wYXRoX25hbWVzW2pdLCBlbnZb aV0sIGxlbikgPT0gMCkNCgkgICAgICB7DQoJCWlmIChjeWd3aW5fcG9zaXhf cGF0aF9saXN0X3AgKGVudltpXSArIGxlbikpDQoJCSAgZW52bGVuICs9IGxl bg0KCQkgICAgKyBjeWd3aW5fcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0X2J1 Zl9zaXplIChlbnZbaV0gKyBsZW4pOw0KCQllbHNlDQoJCSAgZW52bGVuICs9 IHN0cmxlbiAoZW52W2ldKSArIDE7DQoJCWJyZWFrOw0KCSAgICAgIH0NCgkg IH0NCglpZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpDQoJICBlbnZs ZW4gKz0gc3RybGVuIChlbnZbaV0pICsgMTsNCiAgICAgIH0NCg0KICAgIHdp bmVudiA9IGFsbG9jYSAoZW52bGVuICsgMSk7DQoNCiAgICAvKiBDb3B5IGVu diBzdHJpbmdzIGludG8gbmV3IGJ1ZmZlci4gICovDQogICAgZm9yICh0ZW1w ID0gd2luZW52LCBpID0gMDsgZW52W2ldICYmICplbnZbaV07IGkrKykNCiAg ICAgIHsNCglpbnQgaiwgbGVuOw0KDQoJZm9yIChqID0gMDsgY29udl9wYXRo X25hbWVzW2pdOyBqKyspDQoJICB7DQoJICAgIGxlbiA9IHN0cmxlbiAoY29u dl9wYXRoX25hbWVzW2pdKTsNCgkgICAgaWYgKHN0cm5jbXAgKGNvbnZfcGF0 aF9uYW1lc1tqXSwgZW52W2ldLCBsZW4pID09IDApDQoJICAgICAgew0KCQlp ZiAoY3lnd2luX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQ0K CQkgIHsNCgkJICAgIG1lbWNweSAodGVtcCwgZW52W2ldLCBsZW4pOw0KCQkg ICAgY3lnd2luX3Bvc2l4X3RvX3dpbjMyX3BhdGhfbGlzdCAoZW52W2ldICsg bGVuLCB0ZW1wICsgbGVuKTsNCgkJICB9DQoJCWVsc2UNCgkJICBzdHJjcHkg KHRlbXAsIGVudltpXSk7DQoJCWJyZWFrOw0KCSAgICAgIH0NCgkgIH0NCglp ZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpDQoJICBzdHJjcHkgKHRl bXAsIGVudltpXSk7DQoNCgl0ZW1wICs9IHN0cmxlbiAodGVtcCkgKyAxOw0K ICAgICAgfQ0KDQogICAgLyogRmluYWwgbmlsIHN0cmluZyB0byB0ZXJtaW5h dGUgbmV3IGVudi4gICovDQogICAgKnRlbXAgPSAwOw0KICB9DQoNCiAgaWYg KCFpbmZlcmlvcl9pb190ZXJtaW5hbCkNCiAgICB0dHkgPSBvc3RkaW4gPSBv c3Rkb3V0ID0gb3N0ZGVyciA9IC0xOw0KICBlbHNlDQogICAgew0KICAgICAg dHR5ID0gb3BlbiAoaW5mZXJpb3JfaW9fdGVybWluYWwsIE9fUkRXUiB8IE9f Tk9DVFRZKTsNCiAgICAgIGlmICh0dHkgPCAwKQ0KCXsNCgkgIHByaW50X3N5 c19lcnJtc2cgKGluZmVyaW9yX2lvX3Rlcm1pbmFsLCBlcnJubyk7DQoJICBv c3RkaW4gPSBvc3Rkb3V0ID0gb3N0ZGVyciA9IC0xOw0KCX0NCiAgICAgIGVs c2UNCgl7DQoJICBvc3RkaW4gPSBkdXAgKDApOw0KCSAgb3N0ZG91dCA9IGR1 cCAoMSk7DQoJICBvc3RkZXJyID0gZHVwICgyKTsNCgkgIGR1cDIgKHR0eSwg MCk7DQoJICBkdXAyICh0dHksIDEpOw0KCSAgZHVwMiAodHR5LCAyKTsNCgl9 DQogICAgfQ0KDQogIHJldCA9IENyZWF0ZVByb2Nlc3MgKDAsDQoJCSAgICAg ICBhcmdzLAkvKiBjb21tYW5kIGxpbmUgKi8NCgkJICAgICAgIE5VTEwsCS8q IFNlY3VyaXR5ICovDQoJCSAgICAgICBOVUxMLAkvKiB0aHJlYWQgKi8NCgkJ ICAgICAgIFRSVUUsCS8qIGluaGVyaXQgaGFuZGxlcyAqLw0KCQkgICAgICAg ZmxhZ3MsCS8qIHN0YXJ0IGZsYWdzICovDQoJCSAgICAgICB3aW5lbnYsDQoJ CSAgICAgICBOVUxMLAkvKiBjdXJyZW50IGRpcmVjdG9yeSAqLw0KCQkgICAg ICAgJnNpLA0KCQkgICAgICAgJnBpKTsNCiAgaWYgKHR0eSA+PSAwKQ0KICAg IHsNCiAgICAgIGNsb3NlICh0dHkpOw0KICAgICAgZHVwMiAob3N0ZGluLCAw KTsNCiAgICAgIGR1cDIgKG9zdGRvdXQsIDEpOw0KICAgICAgZHVwMiAob3N0 ZGVyciwgMik7DQogICAgICBjbG9zZSAob3N0ZGluKTsNCiAgICAgIGNsb3Nl IChvc3Rkb3V0KTsNCiAgICAgIGNsb3NlIChvc3RkZXJyKTsNCiAgICB9DQoN CiAgaWYgKCFyZXQpDQogICAgZXJyb3IgKCJFcnJvciBjcmVhdGluZyBwcm9j ZXNzICVzLCAoZXJyb3IgJWQpXG4iLCBleGVjX2ZpbGUsICh1bnNpZ25lZCkg R2V0TGFzdEVycm9yICgpKTsNCg0KICBDbG9zZUhhbmRsZSAocGkuaFRocmVh ZCk7DQogIENsb3NlSGFuZGxlIChwaS5oUHJvY2Vzcyk7DQoNCiAgaWYgKHVz ZXNoZWxsICYmIHNoZWxsWzBdICE9ICdcMCcpDQogICAgc2F3X2NyZWF0ZSA9 IC0xOw0KICBlbHNlDQogICAgc2F3X2NyZWF0ZSA9IDA7DQoNCiAgZG9faW5p dGlhbF9jaGlsZF9zdHVmZiAocGkuZHdQcm9jZXNzSWQpOw0KDQogIC8qIGNo aWxkX2NvbnRpbnVlIChEQkdfQ09OVElOVUUsIC0xKTsgKi8NCiAgcHJvY2Vl ZCAoKENPUkVfQUREUikgLSAxLCBUQVJHRVRfU0lHTkFMXzAsIDApOw0KfQ0K DQpzdGF0aWMgdm9pZA0KY2hpbGRfbW91cm5faW5mZXJpb3IgKHZvaWQpDQp7 DQogICh2b2lkKSBjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSk7 DQogIGkzODZfY2xlYW51cF9kcmVncygpOw0KICB1bnB1c2hfdGFyZ2V0ICgm Y2hpbGRfb3BzKTsNCiAgZ2VuZXJpY19tb3Vybl9pbmZlcmlvciAoKTsNCn0N Cg0KLyogU2VuZCBhIFNJR0lOVCB0byB0aGUgcHJvY2VzcyBncm91cC4gIFRo aXMgYWN0cyBqdXN0IGxpa2UgdGhlIHVzZXIgdHlwZWQgYQ0KICAgXkMgb24g dGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiAqLw0KDQpzdGF0aWMgdm9pZA0K Y2hpbGRfc3RvcCAodm9pZCkNCnsNCiAgREVCVUdfRVZFTlRTICgoImdkYjog R2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50IChDVFJMQ19FVkVOVCwgMClcbiIp KTsNCiAgQ0hFQ0sgKEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudCAoQ1RSTF9D X0VWRU5ULCBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKSk7DQogIHJlZ2lz dGVyc19jaGFuZ2VkICgpOwkJLyogcmVmcmVzaCByZWdpc3RlciBzdGF0ZSAq Lw0KfQ0KDQppbnQNCmNoaWxkX3hmZXJfbWVtb3J5IChDT1JFX0FERFIgbWVt YWRkciwgY2hhciAqb3VyLCBpbnQgbGVuLA0KCQkgICBpbnQgd3JpdGUsIHN0 cnVjdCBtZW1fYXR0cmliICptZW0sDQoJCSAgIHN0cnVjdCB0YXJnZXRfb3Bz ICp0YXJnZXQpDQp7DQogIERXT1JEIGRvbmU7DQogIGlmICh3cml0ZSkNCiAg ICB7DQogICAgICBERUJVR19NRU0gKCgiZ2RiOiB3cml0ZSB0YXJnZXQgbWVt b3J5LCAlZCBieXRlcyBhdCAweCUwOGx4XG4iLA0KCQkgIGxlbiwgKERXT1JE KSBtZW1hZGRyKSk7DQogICAgICBXcml0ZVByb2Nlc3NNZW1vcnkgKGN1cnJl bnRfcHJvY2Vzc19oYW5kbGUsIChMUFZPSUQpIG1lbWFkZHIsIG91ciwNCgkJ CSAgbGVuLCAmZG9uZSk7DQogICAgICBGbHVzaEluc3RydWN0aW9uQ2FjaGUg KGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENWT0lEKSBtZW1hZGRyLCBs ZW4pOw0KICAgIH0NCiAgZWxzZQ0KICAgIHsNCiAgICAgIERFQlVHX01FTSAo KCJnZGI6IHJlYWQgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDhs eFxuIiwNCgkJICBsZW4sIChEV09SRCkgbWVtYWRkcikpOw0KICAgICAgUmVh ZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENW T0lEKSBtZW1hZGRyLCBvdXIsIGxlbiwNCgkJCSAmZG9uZSk7DQogICAgfQ0K ICByZXR1cm4gZG9uZTsNCn0NCg0Kdm9pZA0KY2hpbGRfa2lsbF9pbmZlcmlv ciAodm9pZCkNCnsNCiAgQ0hFQ0sgKFRlcm1pbmF0ZVByb2Nlc3MgKGN1cnJl bnRfcHJvY2Vzc19oYW5kbGUsIDApKTsNCg0KICBmb3IgKDs7KQ0KICAgIHsN CiAgICAgIGlmICghY2hpbGRfY29udGludWUgKERCR19DT05USU5VRSwgLTEp KQ0KCWJyZWFrOw0KICAgICAgaWYgKCFXYWl0Rm9yRGVidWdFdmVudCAoJmN1 cnJlbnRfZXZlbnQsIElORklOSVRFKSkNCglicmVhazsNCiAgICAgIGlmIChj dXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUgPT0gRVhJVF9QUk9DRVNT X0RFQlVHX0VWRU5UKQ0KCWJyZWFrOw0KICAgIH0NCg0KICBDSEVDSyAoQ2xv c2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpKTsNCg0KICAvKiB0 aGlzIG1heSBmYWlsIGluIGFuIGF0dGFjaGVkIHByb2Nlc3Mgc28gZG9uJ3Qg Y2hlY2suICovDQogICh2b2lkKSBDbG9zZUhhbmRsZSAoY3VycmVudF90aHJl YWQtPmgpOw0KICB0YXJnZXRfbW91cm5faW5mZXJpb3IgKCk7CS8qIG9yIGp1 c3QgY2hpbGRfbW91cm5faW5mZXJpb3I/ICovDQp9DQoNCnZvaWQNCmNoaWxk X3Jlc3VtZSAocHRpZF90IHB0aWQsIGludCBzdGVwLCBlbnVtIHRhcmdldF9z aWduYWwgc2lnKQ0Kew0KICB0aHJlYWRfaW5mbyAqdGg7DQogIERXT1JEIGNv bnRpbnVlX3N0YXR1cyA9IERCR19DT05USU5VRTsNCg0KICBpbnQgcGlkID0g UElER0VUIChwdGlkKTsNCg0KICBpZiAoc2lnICE9IFRBUkdFVF9TSUdOQUxf MCkNCiAgICB7DQogICAgICBpZiAoY3VycmVudF9ldmVudC5kd0RlYnVnRXZl bnRDb2RlICE9IEVYQ0VQVElPTl9ERUJVR19FVkVOVCkNCgl7DQoJICBERUJV R19FWENFUFQoKCJDYW5ub3QgY29udGludWUgd2l0aCBzaWduYWwgJWQgaGVy ZS5cbiIsc2lnKSk7DQoJfQ0KICAgICAgZWxzZSBpZiAoc2lnID09IGxhc3Rf c2lnKQ0KCWNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hB TkRMRUQ7DQogICAgICBlbHNlDQojaWYgMA0KLyogVGhpcyBjb2RlIGRvZXMg bm90IHNlZW0gdG8gd29yaywgYmVjYXVzZQ0KICB0aGUga2VybmVsIGRvZXMg cHJvYmFibHkgbm90IGNvbnNpZGVyIGNoYW5nZXMgaW4gdGhlIEV4Y2VwdGlv blJlY29yZA0KICBzdHJ1Y3R1cmUgd2hlbiBwYXNzaW5nIHRoZSBleGNlcHRp b24gdG8gdGhlIGluZmVyaW9yLg0KICBOb3RlIHRoYXQgdGhpcyBzZWVtcyBw b3NzaWJsZSBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXRzZWxmLiAgKi8N Cgl7DQoJICBpbnQgaTsNCgkgIGZvciAoaSA9IDA7IHhsYXRlW2ldLnRoZW0g IT0gLTE7IGkrKykNCgkgICAgaWYgKHhsYXRlW2ldLnVzID09IHNpZykNCgkg ICAgICB7DQoJCWN1cnJlbnRfZXZlbnQudS5FeGNlcHRpb24uRXhjZXB0aW9u UmVjb3JkLkV4Y2VwdGlvbkNvZGUgPQ0KCQkgIHhsYXRlW2ldLnRoZW07DQoJ CWNvbnRpbnVlX3N0YXR1cyA9IERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQ7 DQoJCWJyZWFrOw0KCSAgICAgIH0NCgkgIGlmIChjb250aW51ZV9zdGF0dXMg PT0gREJHX0NPTlRJTlVFKQ0KCSAgICB7DQoJICAgICAgREVCVUdfRVhDRVBU KCgiQ2Fubm90IGNvbnRpbnVlIHdpdGggc2lnbmFsICVkLlxuIixzaWcpKTsN CgkgICAgfQ0KCX0NCiNlbmRpZg0KCURFQlVHX0VYQ0VQVCgoIkNhbiBvbmx5 IGNvbnRpbnVlIHdpdGggcmVjaWV2ZWQgc2lnbmFsICVkLlxuIiwNCgkgIGxh c3Rfc2lnKSk7DQogICAgfQ0KDQogIGxhc3Rfc2lnID0gVEFSR0VUX1NJR05B TF8wOw0KDQogIERFQlVHX0VYRUMgKCgiZ2RiOiBjaGlsZF9yZXN1bWUgKHBp ZD0lZCwgc3RlcD0lZCwgc2lnPSVkKTtcbiIsDQoJICAgICAgIHBpZCwgc3Rl cCwgc2lnKSk7DQoNCiAgLyogR2V0IGNvbnRleHQgZm9yIGN1cnJlbnRseSBz ZWxlY3RlZCB0aHJlYWQgKi8NCiAgdGggPSB0aHJlYWRfcmVjIChjdXJyZW50 X2V2ZW50LmR3VGhyZWFkSWQsIEZBTFNFKTsNCiAgaWYgKHRoKQ0KICAgIHsN CiAgICAgIGlmIChzdGVwKQ0KCXsNCgkgIC8qIFNpbmdsZSBzdGVwIGJ5IHNl dHRpbmcgdCBiaXQgKi8NCgkgIGNoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lz dGVycyAoUFNfUkVHTlVNKTsNCgkgIHRoLT5jb250ZXh0LkVGbGFncyB8PSBG TEFHX1RSQUNFX0JJVDsNCgl9DQoNCiAgICAgIGlmICh0aC0+Y29udGV4dC5D b250ZXh0RmxhZ3MpDQoJew0KICAgICBpZiAoZGVidWdfcmVnaXN0ZXJzX2No YW5nZWQpDQogICAgICAgew0KCSAgdGgtPmNvbnRleHQuRHIwID0gZHJbMF07 DQoJICB0aC0+Y29udGV4dC5EcjEgPSBkclsxXTsNCgkgIHRoLT5jb250ZXh0 LkRyMiA9IGRyWzJdOw0KCSAgdGgtPmNvbnRleHQuRHIzID0gZHJbM107DQoJ ICAvKiB0aC0+Y29udGV4dC5EcjYgPSBkcls2XTsNCgkgICBGSVhNRTogc2hv dWxkIHdlIHNldCBkcjYgYWxzbyA/PyAqLw0KCSAgdGgtPmNvbnRleHQuRHI3 ID0gZHJbN107DQogICAgICAgfQ0KCSAgQ0hFQ0sgKFNldFRocmVhZENvbnRl eHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpKTsNCgkgIHRoLT5jb250ZXh0LkNv bnRleHRGbGFncyA9IDA7DQoJfQ0KICAgIH0NCg0KICAvKiBBbGxvdyBjb250 aW51aW5nIHdpdGggdGhlIHNhbWUgc2lnbmFsIHRoYXQgaW50ZXJydXB0ZWQg dXMuDQogICAgIE90aGVyd2lzZSBjb21wbGFpbi4gKi8NCg0KICBjaGlsZF9j b250aW51ZSAoY29udGludWVfc3RhdHVzLCBwaWQpOw0KfQ0KDQpzdGF0aWMg dm9pZA0KY2hpbGRfcHJlcGFyZV90b19zdG9yZSAodm9pZCkNCnsNCiAgLyog RG8gbm90aGluZywgc2luY2Ugd2UgY2FuIHN0b3JlIGluZGl2aWR1YWwgcmVn cyAqLw0KfQ0KDQpzdGF0aWMgaW50DQpjaGlsZF9jYW5fcnVuICh2b2lkKQ0K ew0KICByZXR1cm4gMTsNCn0NCg0Kc3RhdGljIHZvaWQNCmNoaWxkX2Nsb3Nl IChpbnQgeCkNCnsNCiAgREVCVUdfRVZFTlRTICgoImdkYjogY2hpbGRfY2xv c2UsIGluZmVyaW9yX3B0aWQ9JWRcbiIsDQoJCVBJREdFVCAoaW5mZXJpb3Jf cHRpZCkpKTsNCn0NCg0Kc3RydWN0IHRhcmdldF9vcHMgY2hpbGRfb3BzOw0K DQpzdGF0aWMgdm9pZA0KaW5pdF9jaGlsZF9vcHMgKHZvaWQpDQp7DQogIGNo aWxkX29wcy50b19zaG9ydG5hbWUgPSAiY2hpbGQiOw0KICBjaGlsZF9vcHMu dG9fbG9uZ25hbWUgPSAiV2luMzIgY2hpbGQgcHJvY2VzcyI7DQogIGNoaWxk X29wcy50b19kb2MgPSAiV2luMzIgY2hpbGQgcHJvY2VzcyAoc3RhcnRlZCBi eSB0aGUgXCJydW5cIiBjb21tYW5kKS4iOw0KICBjaGlsZF9vcHMudG9fb3Bl biA9IGNoaWxkX29wZW47DQogIGNoaWxkX29wcy50b19jbG9zZSA9IGNoaWxk X2Nsb3NlOw0KICBjaGlsZF9vcHMudG9fYXR0YWNoID0gY2hpbGRfYXR0YWNo Ow0KICBjaGlsZF9vcHMudG9fZGV0YWNoID0gY2hpbGRfZGV0YWNoOw0KICBj aGlsZF9vcHMudG9fcmVzdW1lID0gY2hpbGRfcmVzdW1lOw0KICBjaGlsZF9v cHMudG9fd2FpdCA9IGNoaWxkX3dhaXQ7DQogIGNoaWxkX29wcy50b19mZXRj aF9yZWdpc3RlcnMgPSBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnM7 DQogIGNoaWxkX29wcy50b19zdG9yZV9yZWdpc3RlcnMgPSBjaGlsZF9zdG9y ZV9pbmZlcmlvcl9yZWdpc3RlcnM7DQogIGNoaWxkX29wcy50b19wcmVwYXJl X3RvX3N0b3JlID0gY2hpbGRfcHJlcGFyZV90b19zdG9yZTsNCiAgY2hpbGRf b3BzLnRvX3hmZXJfbWVtb3J5ID0gY2hpbGRfeGZlcl9tZW1vcnk7DQogIGNo aWxkX29wcy50b19maWxlc19pbmZvID0gY2hpbGRfZmlsZXNfaW5mbzsNCiAg Y2hpbGRfb3BzLnRvX2luc2VydF9icmVha3BvaW50ID0gbWVtb3J5X2luc2Vy dF9icmVha3BvaW50Ow0KICBjaGlsZF9vcHMudG9fcmVtb3ZlX2JyZWFrcG9p bnQgPSBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7DQogIGNoaWxkX29wcy50 b190ZXJtaW5hbF9pbml0ID0gdGVybWluYWxfaW5pdF9pbmZlcmlvcjsNCiAg Y2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gdGVybWluYWxfaW5m ZXJpb3I7DQogIGNoaWxkX29wcy50b190ZXJtaW5hbF9vdXJzX2Zvcl9vdXRw dXQgPSB0ZXJtaW5hbF9vdXJzX2Zvcl9vdXRwdXQ7DQogIGNoaWxkX29wcy50 b190ZXJtaW5hbF9vdXJzID0gdGVybWluYWxfb3VyczsNCiAgY2hpbGRfb3Bz LnRvX3Rlcm1pbmFsX3NhdmVfb3VycyA9IHRlcm1pbmFsX3NhdmVfb3VyczsN CiAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZm8gPSBjaGlsZF90ZXJtaW5h bF9pbmZvOw0KICBjaGlsZF9vcHMudG9fa2lsbCA9IGNoaWxkX2tpbGxfaW5m ZXJpb3I7DQogIGNoaWxkX29wcy50b19jcmVhdGVfaW5mZXJpb3IgPSBjaGls ZF9jcmVhdGVfaW5mZXJpb3I7DQogIGNoaWxkX29wcy50b19tb3Vybl9pbmZl cmlvciA9IGNoaWxkX21vdXJuX2luZmVyaW9yOw0KICBjaGlsZF9vcHMudG9f Y2FuX3J1biA9IGNoaWxkX2Nhbl9ydW47DQogIGNoaWxkX29wcy50b190aHJl YWRfYWxpdmUgPSB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmU7DQogIGNoaWxk X29wcy50b19waWRfdG9fc3RyID0gY3lnd2luX3BpZF90b19zdHI7DQogIGNo aWxkX29wcy50b19zdG9wID0gY2hpbGRfc3RvcDsNCiAgY2hpbGRfb3BzLnRv X3N0cmF0dW0gPSBwcm9jZXNzX3N0cmF0dW07DQogIGNoaWxkX29wcy50b19o YXNfYWxsX21lbW9yeSA9IDE7DQogIGNoaWxkX29wcy50b19oYXNfbWVtb3J5 ID0gMTsNCiAgY2hpbGRfb3BzLnRvX2hhc19zdGFjayA9IDE7DQogIGNoaWxk X29wcy50b19oYXNfcmVnaXN0ZXJzID0gMTsNCiAgY2hpbGRfb3BzLnRvX2hh c19leGVjdXRpb24gPSAxOw0KICBjaGlsZF9vcHMudG9fbWFnaWMgPSBPUFNf TUFHSUM7DQp9DQoNCnZvaWQNCl9pbml0aWFsaXplX3dpbjMyX25hdCAodm9p ZCkNCnsNCiAgc3RydWN0IGNtZF9saXN0X2VsZW1lbnQgKmM7DQoNCiAgaW5p dF9jaGlsZF9vcHMgKCk7DQoNCiAgYyA9IGFkZF9jb20gKCJkbGwtc3ltYm9s cyIsIGNsYXNzX2ZpbGVzLCBkbGxfc3ltYm9sX2NvbW1hbmQsDQoJICAgICAg ICJMb2FkIGRsbCBsaWJyYXJ5IHN5bWJvbHMgZnJvbSBGSUxFLiIpOw0KICBz ZXRfY21kX2NvbXBsZXRlciAoYywgZmlsZW5hbWVfY29tcGxldGVyKTsNCg0K ICBhZGRfY29tX2FsaWFzICgic2hhcmVkbGlicmFyeSIsICJkbGwtc3ltYm9s cyIsIGNsYXNzX2FsaWFzLCAxKTsNCg0KICBhZGRfc2hvd19mcm9tX3NldCAo YWRkX3NldF9jbWQgKCJzaGVsbCIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29s ZWFuLA0KCQkJCSAgKGNoYXIgKikgJnVzZXNoZWxsLA0KCQkgIlNldCB1c2Ug b2Ygc2hlbGwgdG8gc3RhcnQgc3VicHJvY2Vzcy4iLA0KCQkJCSAgJnNldGxp c3QpLA0KCQkgICAgICZzaG93bGlzdCk7DQoNCiAgYWRkX3Nob3dfZnJvbV9z ZXQgKGFkZF9zZXRfY21kICgibmV3LWNvbnNvbGUiLCBjbGFzc19zdXBwb3J0 LCB2YXJfYm9vbGVhbiwNCgkJCQkgIChjaGFyICopICZuZXdfY29uc29sZSwN CgkJICJTZXQgY3JlYXRpb24gb2YgbmV3IGNvbnNvbGUgd2hlbiBjcmVhdGlu ZyBjaGlsZCBwcm9jZXNzLiIsDQoJCQkJICAmc2V0bGlzdCksDQoJCSAgICAg JnNob3dsaXN0KTsNCg0KICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9j bWQgKCJuZXctZ3JvdXAiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwN CgkJCQkgIChjaGFyICopICZuZXdfZ3JvdXAsDQoJCSAgICJTZXQgY3JlYXRp b24gb2YgbmV3IGdyb3VwIHdoZW4gY3JlYXRpbmcgY2hpbGQgcHJvY2Vzcy4i LA0KCQkJCSAgJnNldGxpc3QpLA0KCQkgICAgICZzaG93bGlzdCk7DQoNCiAg YWRkX3Nob3dfZnJvbV9zZXQgKGFkZF9zZXRfY21kICgiZGVidWdleGVjIiwg Y2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sDQoJCQkJICAoY2hhciAqKSAm ZGVidWdfZXhlYywNCgkJICAgICAgICJTZXQgd2hldGhlciB0byBkaXNwbGF5 IGV4ZWN1dGlvbiBpbiBjaGlsZCBwcm9jZXNzLiIsDQoJCQkJICAmc2V0bGlz dCksDQoJCSAgICAgJnNob3dsaXN0KTsNCg0KICBhZGRfc2hvd19mcm9tX3Nl dCAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V2ZW50cyIsIGNsYXNzX3N1cHBvcnQs IHZhcl9ib29sZWFuLA0KCQkJCSAgKGNoYXIgKikgJmRlYnVnX2V2ZW50cywN CgkJICAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkga2VybmVsIGV2ZW50cyBp biBjaGlsZCBwcm9jZXNzLiIsDQoJCQkJICAmc2V0bGlzdCksDQoJCSAgICAg JnNob3dsaXN0KTsNCg0KICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9j bWQgKCJkZWJ1Z21lbW9yeSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFu LA0KCQkJCSAgKGNoYXIgKikgJmRlYnVnX21lbW9yeSwNCgkJICJTZXQgd2hl dGhlciB0byBkaXNwbGF5IG1lbW9yeSBhY2Nlc3NlcyBpbiBjaGlsZCBwcm9j ZXNzLiIsDQoJCQkJICAmc2V0bGlzdCksDQoJCSAgICAgJnNob3dsaXN0KTsN Cg0KICBhZGRfc2hvd19mcm9tX3NldCAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V4 Y2VwdGlvbnMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwNCgkJCQkg IChjaGFyICopICZkZWJ1Z19leGNlcHRpb25zLA0KCSAgICAgICAiU2V0IHdo ZXRoZXIgdG8gZGlzcGxheSBrZXJuZWwgZXhjZXB0aW9ucyBpbiBjaGlsZCBw cm9jZXNzLiIsDQoJCQkJICAmc2V0bGlzdCksDQoJCSAgICAgJnNob3dsaXN0 KTsNCg0KICBhZGRfaW5mbyAoImRsbCIsIGluZm9fZGxsX2NvbW1hbmQsICJT dGF0dXMgb2YgbG9hZGVkIERMTHMuIik7DQogIGFkZF9pbmZvX2FsaWFzICgi c2hhcmVkbGlicmFyeSIsICJkbGwiLCAxKTsNCg0KICBhZGRfcHJlZml4X2Nt ZCAoInczMiIsIGNsYXNzX2luZm8sIGluZm9fdzMyX2NvbW1hbmQsDQogICAg ICAgICAgICAgICAgICAiUHJpbnQgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8g V2luMzIgZGVidWdnaW5nLiIsDQogICAgICAgICAgICAgICAgICAmaW5mb193 MzJfY21kbGlzdCwgImluZm8gdzMyICIsIDAsICZpbmZvbGlzdCk7DQoNCiAg YWRkX2NtZCAoInNlbGVjdG9yIiwgY2xhc3NfaW5mbywgZGlzcGxheV9zZWxl Y3RvcnMsDQogICAgICAgICAgICJEaXNwbGF5IHNlbGVjdG9ycyBpbmZvcy4i LA0KCSAgICZpbmZvX3czMl9jbWRsaXN0KTsNCg0KICBhZGRfdGFyZ2V0ICgm Y2hpbGRfb3BzKTsNCn0NCg0KLyogSGFyZHdhcmUgd2F0Y2hwb2ludCBzdXBw b3J0LCBhZGFwdGVkIGZyb20gZ28zMi1uYXQuYyBjb2RlLiAgKi8NCg0KLyog UGFzcyB0aGUgYWRkcmVzcyBBRERSIHRvIHRoZSBpbmZlcmlvciBpbiB0aGUg SSd0aCBkZWJ1ZyByZWdpc3Rlci4NCiAgIEhlcmUgd2UganVzdCBzdG9yZSB0 aGUgYWRkcmVzcyBpbiBkciBhcnJheSwgdGhlIHJlZ2lzdGVycyB3aWxsIGJl DQogICBhY3R1YWxseSBzZXQgdXAgd2hlbiBjaGlsZF9jb250aW51ZSBpcyBj YWxsZWQuICAqLw0Kdm9pZA0KY3lnd2luX3NldF9kciAoaW50IGksIENPUkVf QUREUiBhZGRyKQ0Kew0KICBpZiAoaSA8IDAgfHwgaSA+IDMpDQogICAgaW50 ZXJuYWxfZXJyb3IgKF9fRklMRV9fLCBfX0xJTkVfXywNCgkJICAgICJJbnZh bGlkIHJlZ2lzdGVyICVkIGluIGN5Z3dpbl9zZXRfZHIuXG4iLCBpKTsNCiAg ZHJbaV0gPSAodW5zaWduZWQpIGFkZHI7DQogIGRlYnVnX3JlZ2lzdGVyc19j aGFuZ2VkID0gMTsNCiAgZGVidWdfcmVnaXN0ZXJzX3VzZWQgPSAxOw0KfQ0K DQovKiBQYXNzIHRoZSB2YWx1ZSBWQUwgdG8gdGhlIGluZmVyaW9yIGluIHRo ZSBEUjcgZGVidWcgY29udHJvbA0KICAgcmVnaXN0ZXIuICBIZXJlIHdlIGp1 c3Qgc3RvcmUgdGhlIGFkZHJlc3MgaW4gRF9SRUdTLCB0aGUgd2F0Y2hwb2lu dA0KICAgd2lsbCBiZSBhY3R1YWxseSBzZXQgdXAgaW4gY2hpbGRfd2FpdC4g ICovDQp2b2lkDQpjeWd3aW5fc2V0X2RyNyAodW5zaWduZWQgdmFsKQ0Kew0K ICBkcls3XSA9IHZhbDsNCiAgZGVidWdfcmVnaXN0ZXJzX2NoYW5nZWQgPSAx Ow0KICBkZWJ1Z19yZWdpc3RlcnNfdXNlZCA9IDE7DQp9DQoNCi8qIEdldCB0 aGUgdmFsdWUgb2YgdGhlIERSNiBkZWJ1ZyBzdGF0dXMgcmVnaXN0ZXIgZnJv bSB0aGUgaW5mZXJpb3IuDQogICBIZXJlIHdlIGp1c3QgcmV0dXJuIHRoZSB2 YWx1ZSBzdG9yZWQgaW4gZHJbNl0NCiAgIGJ5IHRoZSBsYXN0IGNhbGwgdG8g dGhyZWFkX3JlYyBmb3IgY3VycmVudF9ldmVudC5kd1RocmVhZElkIGlkLiAg Ki8NCnVuc2lnbmVkDQpjeWd3aW5fZ2V0X2RyNiAodm9pZCkNCnsNCiAgcmV0 dXJuIGRyWzZdOw0KfQ0KDQoNCi8qIERldGVybWluZSBpZiB0aGUgdGhyZWFk IHJlZmVyZW5jZWQgYnkgInBpZCIgaXMgYWxpdmUNCiAgIGJ5ICJwb2xsaW5n IiBpdC4gIElmIFdhaXRGb3JTaW5nbGVPYmplY3QgcmV0dXJucyBXQUlUX09C SkVDVF8wDQogICBpdCBtZWFucyB0aGF0IHRoZSBwaWQgaGFzIGRpZWQuICBP dGhlcndpc2UgaXQgaXMgYXNzdW1lZCB0byBiZSBhbGl2ZS4gKi8NCnN0YXRp YyBpbnQNCndpbjMyX2NoaWxkX3RocmVhZF9hbGl2ZSAocHRpZF90IHB0aWQp DQp7DQogIGludCBwaWQgPSBQSURHRVQgKHB0aWQpOw0KDQogIHJldHVybiBX YWl0Rm9yU2luZ2xlT2JqZWN0ICh0aHJlYWRfcmVjIChwaWQsIEZBTFNFKS0+ aCwgMCkgPT0gV0FJVF9PQkpFQ1RfMCA/DQogICAgRkFMU0UgOiBUUlVFOw0K fQ0KDQovKiBDb252ZXJ0IHBpZCB0byBwcmludGFibGUgZm9ybWF0LiAqLw0K Y2hhciAqDQpjeWd3aW5fcGlkX3RvX3N0ciAocHRpZF90IHB0aWQpDQp7DQog IHN0YXRpYyBjaGFyIGJ1Zls4MF07DQogIGludCBwaWQgPSBQSURHRVQgKHB0 aWQpOw0KDQogIGlmICgoRFdPUkQpIHBpZCA9PSBjdXJyZW50X2V2ZW50LmR3 UHJvY2Vzc0lkKQ0KICAgIHNwcmludGYgKGJ1ZiwgInByb2Nlc3MgJWQiLCBw aWQpOw0KICBlbHNlDQogICAgc3ByaW50ZiAoYnVmLCAidGhyZWFkICVsZC4w eCV4IiwgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgcGlkKTsNCiAgcmV0 dXJuIGJ1ZjsNCn0NCg0Kc3RhdGljIGludA0KY29yZV9kbGxfc3ltYm9sc19h ZGQgKGNoYXIgKmRsbF9uYW1lLCBEV09SRCBiYXNlX2FkZHIpDQp7DQogIHN0 cnVjdCBvYmpmaWxlICpvYmpmaWxlOw0KICBjaGFyICpvYmpmaWxlX2Jhc2Vu YW1lOw0KICBjb25zdCBjaGFyICpkbGxfYmFzZW5hbWU7DQoNCiAgaWYgKCEo ZGxsX2Jhc2VuYW1lID0gc3RycmNociAoZGxsX25hbWUsICcvJykpKQ0KICAg IGRsbF9iYXNlbmFtZSA9IGRsbF9uYW1lOw0KICBlbHNlDQogICAgZGxsX2Jh c2VuYW1lKys7DQoNCiAgQUxMX09CSkZJTEVTIChvYmpmaWxlKQ0KICB7DQog ICAgb2JqZmlsZV9iYXNlbmFtZSA9IHN0cnJjaHIgKG9iamZpbGUtPm5hbWUs ICcvJyk7DQoNCiAgICBpZiAob2JqZmlsZV9iYXNlbmFtZSAmJg0KCXN0cmNt cCAoZGxsX2Jhc2VuYW1lLCBvYmpmaWxlX2Jhc2VuYW1lICsgMSkgPT0gMCkN CiAgICAgIHsNCglwcmludGZfdW5maWx0ZXJlZCAoIiUwOGx4OiVzIChzeW1i b2xzIHByZXZpb3VzbHkgbG9hZGVkKVxuIiwNCgkJCSAgIGJhc2VfYWRkciwg ZGxsX25hbWUpOw0KCWdvdG8gb3V0Ow0KICAgICAgfQ0KICB9DQoNCiAgcmVn aXN0ZXJfbG9hZGVkX2RsbCAoZGxsX25hbWUsIGJhc2VfYWRkciArIDB4MTAw MCk7DQogIHNvbGliX3N5bWJvbHNfYWRkIChkbGxfbmFtZSwgMCwgKENPUkVf QUREUikgYmFzZV9hZGRyICsgMHgxMDAwKTsNCg0Kb3V0Og0KICByZXR1cm4g MTsNCn0NCg0KdHlwZWRlZiBzdHJ1Y3QNCnsNCiAgc3RydWN0IHRhcmdldF9v cHMgKnRhcmdldDsNCiAgYmZkX3ZtYSBhZGRyOw0KfQ0KbWFwX2NvZGVfc2Vj dGlvbl9hcmdzOw0KDQpzdGF0aWMgdm9pZA0KbWFwX3NpbmdsZV9kbGxfY29k ZV9zZWN0aW9uIChiZmQgKiBhYmZkLCBhc2VjdGlvbiAqIHNlY3QsIHZvaWQg Km9iaikNCnsNCiAgaW50IG9sZDsNCiAgaW50IHVwZGF0ZV9jb3Jlb3BzOw0K ICBzdHJ1Y3Qgc2VjdGlvbl90YWJsZSAqbmV3X3RhcmdldF9zZWN0X3B0cjsN Cg0KICBtYXBfY29kZV9zZWN0aW9uX2FyZ3MgKmFyZ3MgPSAobWFwX2NvZGVf c2VjdGlvbl9hcmdzICopIG9iajsNCiAgc3RydWN0IHRhcmdldF9vcHMgKnRh cmdldCA9IGFyZ3MtPnRhcmdldDsNCiAgaWYgKHNlY3QtPmZsYWdzICYgU0VD X0NPREUpDQogICAgew0KICAgICAgdXBkYXRlX2NvcmVvcHMgPSBjb3JlX29w cy50b19zZWN0aW9ucyA9PSB0YXJnZXQtPnRvX3NlY3Rpb25zOw0KDQogICAg ICBpZiAodGFyZ2V0LT50b19zZWN0aW9ucykNCgl7DQoJICBvbGQgPSB0YXJn ZXQtPnRvX3NlY3Rpb25zX2VuZCAtIHRhcmdldC0+dG9fc2VjdGlvbnM7DQoJ ICB0YXJnZXQtPnRvX3NlY3Rpb25zID0gKHN0cnVjdCBzZWN0aW9uX3RhYmxl ICopDQoJICAgIHhyZWFsbG9jICgoY2hhciAqKSB0YXJnZXQtPnRvX3NlY3Rp b25zLA0KCQkgICAgICAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl90YWJsZSkp ICogKDEgKyBvbGQpKTsNCgl9DQogICAgICBlbHNlDQoJew0KCSAgb2xkID0g MDsNCgkgIHRhcmdldC0+dG9fc2VjdGlvbnMgPSAoc3RydWN0IHNlY3Rpb25f dGFibGUgKikNCgkgICAgeG1hbGxvYyAoKHNpemVvZiAoc3RydWN0IHNlY3Rp b25fdGFibGUpKSk7DQoJfQ0KICAgICAgdGFyZ2V0LT50b19zZWN0aW9uc19l bmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zICsgKDEgKyBvbGQpOw0KDQogICAg ICAvKiBVcGRhdGUgdGhlIHRvX3NlY3Rpb25zIGZpZWxkIGluIHRoZSBjb3Jl X29wcyBzdHJ1Y3R1cmUNCgkgaWYgbmVlZGVkLiAgKi8NCiAgICAgIGlmICh1 cGRhdGVfY29yZW9wcykNCgl7DQoJICBjb3JlX29wcy50b19zZWN0aW9ucyA9 IHRhcmdldC0+dG9fc2VjdGlvbnM7DQoJICBjb3JlX29wcy50b19zZWN0aW9u c19lbmQgPSB0YXJnZXQtPnRvX3NlY3Rpb25zX2VuZDsNCgl9DQogICAgICBu ZXdfdGFyZ2V0X3NlY3RfcHRyID0gdGFyZ2V0LT50b19zZWN0aW9ucyArIG9s ZDsNCiAgICAgIG5ld190YXJnZXRfc2VjdF9wdHItPmFkZHIgPSBhcmdzLT5h ZGRyICsgYmZkX3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0KTsNCiAgICAgIG5l d190YXJnZXRfc2VjdF9wdHItPmVuZGFkZHIgPSBhcmdzLT5hZGRyICsgYmZk X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0KSArDQoJYmZkX3NlY3Rpb25fc2l6 ZSAoYWJmZCwgc2VjdCk7Ow0KICAgICAgbmV3X3RhcmdldF9zZWN0X3B0ci0+ dGhlX2JmZF9zZWN0aW9uID0gc2VjdDsNCiAgICAgIG5ld190YXJnZXRfc2Vj dF9wdHItPmJmZCA9IGFiZmQ7DQogICAgfQ0KfQ0KDQpzdGF0aWMgaW50DQpk bGxfY29kZV9zZWN0aW9uc19hZGQgKGNvbnN0IGNoYXIgKmRsbF9uYW1lLCBp bnQgYmFzZV9hZGRyLCBzdHJ1Y3QgdGFyZ2V0X29wcyAqdGFyZ2V0KQ0Kew0K ICBiZmQgKmRsbF9iZmQ7DQogIG1hcF9jb2RlX3NlY3Rpb25fYXJncyBtYXBf YXJnczsNCiAgYXNlY3Rpb24gKmxvd2VzdF9zZWN0Ow0KICBjaGFyICpuYW1l Ow0KICBpZiAoZGxsX25hbWUgPT0gTlVMTCB8fCB0YXJnZXQgPT0gTlVMTCkN CiAgICByZXR1cm4gMDsNCiAgbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsN CiAgZGxsX2JmZCA9IGJmZF9vcGVuciAobmFtZSwgInBlaS1pMzg2Iik7DQog IGlmIChkbGxfYmZkID09IE5VTEwpDQogICAgcmV0dXJuIDA7DQoNCiAgaWYg KGJmZF9jaGVja19mb3JtYXQgKGRsbF9iZmQsIGJmZF9vYmplY3QpKQ0KICAg IHsNCiAgICAgIGxvd2VzdF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25h bWUgKGRsbF9iZmQsICIudGV4dCIpOw0KICAgICAgaWYgKGxvd2VzdF9zZWN0 ID09IE5VTEwpDQoJcmV0dXJuIDA7DQogICAgICBtYXBfYXJncy50YXJnZXQg PSB0YXJnZXQ7DQogICAgICBtYXBfYXJncy5hZGRyID0gYmFzZV9hZGRyIC0g YmZkX3NlY3Rpb25fdm1hIChkbGxfYmZkLCBsb3dlc3Rfc2VjdCk7DQoNCiAg ICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZGxsX2JmZCwgJm1hcF9zaW5n bGVfZGxsX2NvZGVfc2VjdGlvbiwgKHZvaWQgKikgKCZtYXBfYXJncykpOw0K ICAgIH0NCg0KICByZXR1cm4gMTsNCn0NCg0Kc3RhdGljIHZvaWQNCmNvcmVf c2VjdGlvbl9sb2FkX2RsbF9zeW1ib2xzIChiZmQgKiBhYmZkLCBhc2VjdGlv biAqIHNlY3QsIHZvaWQgKm9iaikNCnsNCiAgc3RydWN0IHRhcmdldF9vcHMg KnRhcmdldCA9IChzdHJ1Y3QgdGFyZ2V0X29wcyAqKSBvYmo7DQoNCiAgRFdP UkQgYmFzZV9hZGRyOw0KDQogIGludCBkbGxfbmFtZV9zaXplOw0KICBjaGFy ICpkbGxfbmFtZSA9IE5VTEw7DQogIGNoYXIgKmJ1ZiA9IE5VTEw7DQogIHN0 cnVjdCB3aW4zMl9wc3RhdHVzICpwc3RhdHVzOw0KICBjaGFyICpwOw0KDQog IGlmIChzdHJuY21wIChzZWN0LT5uYW1lLCAiLm1vZHVsZSIsIDcpKQ0KICAg IHJldHVybjsNCg0KICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzZWN0LT5f cmF3X3NpemUgKyAxKTsNCiAgaWYgKCFidWYpDQogICAgew0KICAgICAgcHJp bnRmX3VuZmlsdGVyZWQgKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9y ICVzXG4iLCBzZWN0LT5uYW1lKTsNCiAgICAgIGdvdG8gb3V0Ow0KICAgIH0N CiAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Qs IGJ1ZiwgMCwgc2VjdC0+X3Jhd19zaXplKSkNCiAgICBnb3RvIG91dDsNCg0K ICBwc3RhdHVzID0gKHN0cnVjdCB3aW4zMl9wc3RhdHVzICopIGJ1ZjsNCg0K ICBtZW1tb3ZlICgmYmFzZV9hZGRyLCAmKHBzdGF0dXMtPmRhdGEubW9kdWxl X2luZm8uYmFzZV9hZGRyZXNzKSwgc2l6ZW9mIChiYXNlX2FkZHIpKTsNCiAg ZGxsX25hbWVfc2l6ZSA9IHBzdGF0dXMtPmRhdGEubW9kdWxlX2luZm8ubW9k dWxlX25hbWVfc2l6ZTsNCiAgaWYgKG9mZnNldG9mIChzdHJ1Y3Qgd2luMzJf cHN0YXR1cywgZGF0YS5tb2R1bGVfaW5mby5tb2R1bGVfbmFtZSkgKyBkbGxf bmFtZV9zaXplID4gc2VjdC0+X3Jhd19zaXplKQ0KICAgICAgZ290byBvdXQ7 DQoNCiAgZGxsX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChkbGxfbmFtZV9z aXplICsgMSk7DQogIGlmICghZGxsX25hbWUpDQogICAgew0KICAgICAgcHJp bnRmX3VuZmlsdGVyZWQgKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9y ICVzXG4iLCBzZWN0LT5uYW1lKTsNCiAgICAgIGdvdG8gb3V0Ow0KICAgIH0N CiAgc3RybmNweSAoZGxsX25hbWUsIHBzdGF0dXMtPmRhdGEubW9kdWxlX2lu Zm8ubW9kdWxlX25hbWUsIGRsbF9uYW1lX3NpemUpOw0KDQogIHdoaWxlICgo cCA9IHN0cmNociAoZGxsX25hbWUsICdcXCcpKSkNCiAgICAqcCA9ICcvJzsN Cg0KICBpZiAoIWNvcmVfZGxsX3N5bWJvbHNfYWRkIChkbGxfbmFtZSwgKERX T1JEKSBiYXNlX2FkZHIpKQ0KICAgIHByaW50Zl91bmZpbHRlcmVkICgiJXM6 IEZhaWxlZCB0byBsb2FkIGRsbCBzeW1ib2xzLlxuIiwgZGxsX25hbWUpOw0K DQogIGlmICghZGxsX2NvZGVfc2VjdGlvbnNfYWRkIChkbGxfbmFtZSwgKERX T1JEKSBiYXNlX2FkZHIgKyAweDEwMDAsIHRhcmdldCkpDQogICAgcHJpbnRm X3VuZmlsdGVyZWQgKCIlczogRmFpbGVkIHRvIG1hcCBkbGwgY29kZSBzZWN0 aW9ucy5cbiIsIGRsbF9uYW1lKTsNCg0Kb3V0Og0KICBpZiAoYnVmKQ0KICAg IHhmcmVlIChidWYpOw0KICBpZiAoZGxsX25hbWUpDQogICAgeGZyZWUgKGRs bF9uYW1lKTsNCiAgcmV0dXJuOw0KfQ0KDQp2b2lkDQpjaGlsZF9zb2xpYl9h ZGQgKGNoYXIgKmZpbGVuYW1lLCBpbnQgZnJvbV90dHksIHN0cnVjdCB0YXJn ZXRfb3BzICp0YXJnZXQsDQoJCSBpbnQgcmVhZHN5bXMpDQp7DQogIGlmICgh cmVhZHN5bXMpDQogICAgcmV0dXJuOw0KICBpZiAoY29yZV9iZmQpDQogICAg ew0KICAgICAgY2hpbGRfY2xlYXJfc29saWJzICgpOw0KICAgICAgYmZkX21h cF9vdmVyX3NlY3Rpb25zIChjb3JlX2JmZCwgJmNvcmVfc2VjdGlvbl9sb2Fk X2RsbF9zeW1ib2xzLCB0YXJnZXQpOw0KICAgIH0NCiAgZWxzZQ0KICAgIHsN CiAgICAgIGlmIChzb2xpYl9lbmQgJiYgc29saWJfZW5kLT5uYW1lKQ0KCSAg ICAgc29saWJfZW5kLT5vYmpmaWxlID0gc29saWJfc3ltYm9sc19hZGQgKHNv bGliX2VuZC0+bmFtZSwgZnJvbV90dHksDQoJCQkJCQlzb2xpYl9lbmQtPmxv YWRfYWRkcik7DQogICAgfQ0KfQ0KDQpzdGF0aWMgdm9pZA0KZmV0Y2hfZWxm X2NvcmVfcmVnaXN0ZXJzIChjaGFyICpjb3JlX3JlZ19zZWN0LA0KCQkJICB1 bnNpZ25lZCBjb3JlX3JlZ19zaXplLA0KCQkJICBpbnQgd2hpY2gsDQoJCQkg IENPUkVfQUREUiByZWdfYWRkcikNCnsNCiAgaW50IHI7DQogIGlmIChjb3Jl X3JlZ19zaXplIDwgc2l6ZW9mIChDT05URVhUKSkNCiAgICB7DQogICAgICBl cnJvciAoIkNvcmUgZmlsZSByZWdpc3RlciBzZWN0aW9uIHRvbyBzbWFsbCAo JXUgYnl0ZXMpLiIsIGNvcmVfcmVnX3NpemUpOw0KICAgICAgcmV0dXJuOw0K ICAgIH0NCiAgZm9yIChyID0gMDsgciA8IE5VTV9SRUdTOyByKyspDQogICAg c3VwcGx5X3JlZ2lzdGVyIChyLCBjb3JlX3JlZ19zZWN0ICsgbWFwcGluZ3Nb cl0pOw0KfQ0KDQpzdGF0aWMgc3RydWN0IGNvcmVfZm5zIHdpbjMyX2VsZl9j b3JlX2ZucyA9DQp7DQogIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIsDQogIGRl ZmF1bHRfY2hlY2tfZm9ybWF0LA0KICBkZWZhdWx0X2NvcmVfc25pZmZlciwN CiAgZmV0Y2hfZWxmX2NvcmVfcmVnaXN0ZXJzLA0KICBOVUxMDQp9Ow0KDQp2 b2lkDQpfaW5pdGlhbGl6ZV9jb3JlX3dpbjMyICh2b2lkKQ0Kew0KICBhZGRf Y29yZV9mbnMgKCZ3aW4zMl9lbGZfY29yZV9mbnMpOw0KfQ0KDQp2b2lkDQpf aW5pdGlhbGl6ZV9jaGVja19mb3JfZ2RiX2luaSAodm9pZCkNCnsNCiAgY2hh ciAqaG9tZWRpcjsNCiAgaWYgKGluaGliaXRfZ2RiaW5pdCkNCiAgICByZXR1 cm47DQoNCiAgaG9tZWRpciA9IGdldGVudiAoIkhPTUUiKTsNCiAgaWYgKGhv bWVkaXIpDQogICAgew0KICAgICAgY2hhciAqcDsNCiAgICAgIGNoYXIgKm9s ZGluaSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChob21lZGlyKSArDQoJ CQkJICAgICAgc2l6ZW9mICgiL2dkYi5pbmkiKSk7DQogICAgICBzdHJjcHkg KG9sZGluaSwgaG9tZWRpcik7DQogICAgICBwID0gc3RyY2hyIChvbGRpbmks ICdcMCcpOw0KICAgICAgaWYgKHAgPiBvbGRpbmkgJiYgcFstMV0gIT0gJy8n KQ0KCSpwKysgPSAnLyc7DQogICAgICBzdHJjcHkgKHAsICJnZGIuaW5pIik7 DQogICAgICBpZiAoYWNjZXNzIChvbGRpbmksIDApID09IDApDQoJew0KCSAg aW50IGxlbiA9IHN0cmxlbiAob2xkaW5pKTsNCgkgIGNoYXIgKm5ld2luaSA9 IGFsbG9jYSAobGVuICsgMSk7DQoJICBzcHJpbnRmIChuZXdpbmksICIlLipz LmdkYmluaXQiLA0KCSAgICAoaW50KSAobGVuIC0gKHNpemVvZiAoImdkYi5p bmkiKSAtIDEpKSwgb2xkaW5pKTsNCgkgIHdhcm5pbmcgKCJvYnNvbGV0ZSAn JXMnIGZvdW5kLiBSZW5hbWUgdG8gJyVzJy4iLCBvbGRpbmksIG5ld2luaSk7 DQoJfQ0KICAgIH0NCn0NCg== ---559023410-162216788-1041881015=:544--