From mboxrd@z Thu Jan 1 00:00:00 1970 From: Manasi Navare Subject: Re: [PATCH i-g-t] tools: Add intel_dp_compliance for DisplayPort 1.2 compliance automation Date: Fri, 2 Dec 2016 11:31:00 -0800 Message-ID: <20161202193100.GB23283@intel.com> References: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 58E0D6E96B for ; Fri, 2 Dec 2016 19:28:17 +0000 (UTC) Content-Disposition: inline In-Reply-To: <1479786027-19231-1-git-send-email-manasi.d.navare@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org QWRkaW5nIGJvdGggUGV0cmkgYW5kIE1hcml1cyBpbiBDQy4KClJlZ2FyZHMKTWFuYXNpCgpPbiBN b24sIE5vdiAyMSwgMjAxNiBhdCAwNzo0MDoyN1BNIC0wODAwLCBNYW5hc2kgTmF2YXJlIHdyb3Rl Ogo+IFRoaXMgaXMgdGhlIHVzZXJzcGFjZSBjb21wb25lbnQgb2YgdGhlIERpc3BsYXlwb3J0IENv bXBsaWFuY2UKPiB0ZXN0aW5nIHNvZnR3YXJlIHJlcXVpcmVkIGZvciBjb21wbGlhbmNlIHRlc3Rp bmcgb2YgdGhlIEk5MTUKPiBEaXNwbGF5IFBvcnQgZHJpdmVyLiBUaGlzIG11c3QgYmUgcnVubmlu ZyBpbiBvcmRlciB0byBzdWNjZXNzZnVsbHkKPiBjb21wbGV0ZSBEaXNwbGF5IFBvcnQgY29tcGxp YW5jZSB0ZXN0aW5nLiBUaGlzIGFwcCBhbmQgdGhlIGtlcm5lbAo+IGNvZGUgdGhhdCBhY2NvbXBh bmllcyBpdCBoYXMgYmVlbiB3cml0dGVuIHRvIHNhdGlmeSB0aGUgcmVxdWlyZW1lbnRzCj4gb2Yg dGhlIERpc3BsYXlwb3J0IExpbmsgQ1RTIDEuMiByZXYxLjEgc3BlY2lmaWNhdGlvbiBmcm9tIFZF U0EuCj4gTm90ZSB0aGF0IHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcG9ydCBlRFAgY29t cGxpYW5jZSB0ZXN0aW5nLgo+IFRoaXMgdXRpbGl0eSBoYXMgYW4gYXV0b21hdGlvbiBzdXBwb3J0 IGZvciB0aGUgTGluayB0cmFpbmluZyB0ZXN0cwo+ICg0LjMuMS4xLiAtIDQuMy4yLjMpLCBFRElE IHRlc3RzICg0LjIuMi4zCj4gLSA0LjIuMi42KSBhbmQgVmlkZW8gUGF0dGVybiBnZW5lcmF0aW9u IHRlc3RzICg0LjMuMy4xKSBmcm9tIENUUwo+IHNwZWNpZmljYXRpb24gMS4yIFJldiAxLjEuCj4g Cj4gVGhpcyB0b29sIGhhcyB0aGUgc3VwcG9ydCBmb3IgcmVzcG9uZGluZyB0byB0aGUgaG90cGx1 ZyB1ZXZlbnRzCj4gc2VudCBieSBjb21wbGlhbmNlIHRlc3R0aW5nIHVuaXQgYWZ0ZXIgZWFjaCB0 ZXN0Lgo+IAo+IFRoZSBMaW51eCBEVVQgcnVubmluZyB0aGlzIHV0aWxpdHkgbXVzdCBiZSBpbiB0 ZXh0IChjb25zb2xlKSBtb2RlCj4gYW5kIGNhbm5vdCBoYXZlIGFueSBvdGhlciBkaXNwbGF5IG1h bmFnZXIgcnVubmluZy4gU2luY2UgdGhpcyB1c2VzCj4gc3lzZnMgbm9kZXMgZm9yIGtlcm5lbCBp bnRlcmFjdGlvbiwgdGhpcyB1dGlsaXR5IHNob3VsZCBiZSBydW4gYXMKPiBSb290LiBPbmNlIHRo aXMgdXNlciBhcHBsaWNhdGlvbiBpcyB1cCBhbmQgcnVubmluZywgd2FpdGluZyBmb3IKPiB0ZXN0 IHJlcXVlc3RzLCB0aGUgdGVzdCBhcHBsaWFuY2Ugc29mdHdhcmUgb24gdGhlIHdpbmRvd3MgaG9z dAo+IGNhbiBub3cgYmUgdXNlZCB0byBleGVjdXRlIHRoZSBjb21wbGlhbmNlIHRlc3RzLgo+IAo+ IFRoaXMgYXBwIGlzIGJhc2VkIG9uIHNvbWUgcHJpb3Igd29yayBkb25lIGluIEFwcmlsIDIwMTUg KGJ5Cj4gVG9kZCBQcmV2aXRlIDx0cHJldml0ZUBnbWFpbC5jb20+KQo+IAo+IFNpZ25lZC1vZmYt Ynk6IE1hbmFzaSBOYXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4gLS0tCj4gIHRv b2xzL01ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgIHwgICAgMyArLQo+ICB0b29scy9NYWtl ZmlsZS5zb3VyY2VzICAgICAgICAgICAgICB8ICAgIDcgKwo+ICB0b29scy9pbnRlbF9kcF9jb21w bGlhbmNlLmMgICAgICAgICB8IDEwNDUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKPiAgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5oICAgICAgICAgfCAgIDM1ICsrCj4gIHRv b2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIHwgIDEyMyArKysrKwo+ICA1IGZpbGVz IGNoYW5nZWQsIDEyMTIgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ICBjcmVhdGUgbW9k ZSAxMDA2NDQgdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmgKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xz L2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jCj4gCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL01h a2VmaWxlLmFtIGIvdG9vbHMvTWFrZWZpbGUuYW0KPiBpbmRleCAxOGY4NmY2Li5lYWM2ZDY0IDEw MDY0NAo+IC0tLSBhL3Rvb2xzL01ha2VmaWxlLmFtCj4gKysrIGIvdG9vbHMvTWFrZWZpbGUuYW0K PiBAQCAtMTMsNyArMTMsNyBAQCBBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKSAtSSQodG9w X3NyY2RpcikvbGliCj4gIEFNX0NGTEFHUyA9ICQoREVCVUdfQ0ZMQUdTKSAkKERSTV9DRkxBR1Mp ICQoUENJQUNDRVNTX0NGTEFHUykgJChDV0FSTkZMQUdTKSBcCj4gIAkgICAgJChDQUlST19DRkxB R1MpICQoTElCVU5XSU5EX0NGTEFHUykgLURQS0dEQVRBRElSPVwiJChwa2dkYXRhZGlyKVwiIFwK PiAgCSAgICAkKFdFUlJPUl9DRkxBR1MpCj4gLUxEQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9s aWJpbnRlbF90b29scy5sYQo+ICtMREFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaW50ZWxf dG9vbHMubGEgJChHTElCX0xJQlMpCj4gIEFNX0xERkxBR1MgPSAtV2wsLS1hcy1uZWVkZWQKPiAg Cj4gIAo+IEBAIC0yNCw2ICsyNCw3IEBAIG1vZHVsZWRpciA9ICQobGliZGlyKQo+ICBpbnRlbF9h dWJkdW1wX2xhX0xERkxBR1MgPSAtbW9kdWxlIC1hdm9pZC12ZXJzaW9uIC1uby11bmRlZmluZWQK PiAgaW50ZWxfYXViZHVtcF9sYV9TT1VSQ0VTID0gYXViZHVtcC5jCj4gIGludGVsX2F1YmR1bXBf bGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpbnRlbF90b29scy5sYSAtbGRsCj4g K2ludGVsX2RwX2NvbXBsaWFuY2VfbGFfTElCQUREID0gJChMREFERCkKPiAgCj4gIGJpbl9TQ1JJ UFRTID0gaW50ZWxfYXViZHVtcAo+ICBDTEVBTkZJTEVTID0gJChiaW5fU0NSSVBUUykKPiBkaWZm IC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMK PiBpbmRleCBiZTU4ODcxLi4wOWMwNjY3IDEwMDY0NAo+IC0tLSBhL3Rvb2xzL01ha2VmaWxlLnNv dXJjZXMKPiArKysgYi90b29scy9NYWtlZmlsZS5zb3VyY2VzCj4gQEAgLTEzLDYgKzEzLDcgQEAg dG9vbHNfcHJvZ19saXN0cyA9CQlcCj4gIAlpbnRlbF9iaW9zX3JlYWRlcglcCj4gIAlpbnRlbF9k aXNwbGF5X2NyYwlcCj4gIAlpbnRlbF9kaXNwbGF5X3BvbGxlcglcCj4gKwlpbnRlbF9kcF9jb21w bGlhbmNlCVwKPiAgCWludGVsX2ZvcmNld2FrZWQJXAo+ICAJaW50ZWxfZ3B1X2ZyZXF1ZW5jeQlc Cj4gIAlpbnRlbF9maXJtd2FyZV9kZWNvZGUJXAo+IEBAIC01NSwzICs1Niw5IEBAIGludGVsX2wz X3Bhcml0eV9TT1VSQ0VTID0JXAo+ICAJaW50ZWxfbDNfcGFyaXR5LmgJXAo+ICAJaW50ZWxfbDNf dWRldl9saXN0ZW5lci5jCj4gIAo+ICtpbnRlbF9kcF9jb21wbGlhbmNlX1NPVVJDRVMgPSBcCj4g KyAgICAgICAgaW50ZWxfZHBfY29tcGxpYW5jZS5jIFwKPiArICAgICAgICBpbnRlbF9kcF9jb21w bGlhbmNlLmggXAo+ICsgICAgICAgIGludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1Zy5jIFwKPiAr ICAgICAgICAkKE5VTEwpCj4gKwo+IGRpZmYgLS1naXQgYS90b29scy9pbnRlbF9kcF9jb21wbGlh bmNlLmMgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0 NAo+IGluZGV4IDAwMDAwMDAuLjk2N2QyZjgKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMv aW50ZWxfZHBfY29tcGxpYW5jZS5jCj4gQEAgLTAsMCArMSwxMDQ1IEBACj4gKy8qCj4gKyAqIENv cHlyaWdodCA/IDIwMTQtMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiBQZXJtaXNz aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh aW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0 d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4g KyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0 cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3 YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29mdHdhcmUgaXMg ZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoK PiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lv biBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGlu Y2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4gKyAq IFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwg V0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJ TkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJ TkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdI VCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAq IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RI RVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEgg VEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNP RlRXQVJFLgo+ICsgKgo+ICsgKiBEaXNwbGF5cG9ydCBDb21wbGlhbmNlIFRlc3RpbmcgQXBwbGlj YXRpb24KPiArICoKPiArICogVGhpcyBpcyB0aGUgdXNlcnNwYWNlIGNvbXBvbmVudCBvZiB0aGUg RGlzcGxheXBvcnQgQ29tcGxpYW5jZSB0ZXN0aW5nCj4gKyAqIHNvZnR3YXJlIHJlcXVpcmVkIGZv ciBjb21wbGlhbmNlIHRlc3Rpbmcgb2YgdGhlIEk5MTUgRGlzcGxheSBQb3J0IGRyaXZlci4KPiAr ICogVGhpcyBtdXN0IGJlIHJ1bm5pbmcgaW4gb3JkZXIgdG8gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRl IERpc3BsYXkgUG9ydAo+ICsgKiBjb21wbGlhbmNlIHRlc3RpbmcuIFRoaXMgYXBwIGFuZCB0aGUg a2VybmVsIGNvZGUgdGhhdCBhY2NvbXBhbmllcyBpdCBoYXMgYmVlbgo+ICsgKiB3cml0dGVuIHRv IHNhdGlmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBEaXNwbGF5cG9ydCBMaW5rIENUUyAxLjIg cmV2MS4xCj4gKyAqIHNwZWNpZmljYXRpb24gZnJvbSBWRVNBLiBOb3RlIHRoYXQgdGhpcyBhcHBs aWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGVEUAo+ICsgKiBjb21wbGlhbmNlIHRlc3RpbmcuCj4g KyAqCj4gKyAqIENvbXBsaWFuY2UgVGVzdGluZyByZXF1aXJlcyBzZXZlcmFsIGNvbXBvbmVudHM6 Cj4gKyAqICAgLSBBIGtlcm5lbCBidWlsZCB0aGF0IGNvbnRhaW5zIHRoZSBwYXRjaCBzZXQgZm9y IERQIGNvbXBsaWFuY2Ugc3VwcG9ydAo+ICsgKiAgIC0gQSBEaXNwbGF5cG9ydCBDb21wbGlhbmNl IFRlc3RpbmcgYXBwbGlhbmNlIHN1Y2ggYXMgVW5pZ3JhZi1EUFIxMjAKPiArICogICAtIFRoaXMg dXNlciBhcHBsaWNhdGlvbgo+ICsgKiAgIC0gQSB3aW5kb3dzIGhvc3QgbWFjaGluZSB0byBydW4g dGhlIERQUiB0ZXN0IHNvZnR3YXJlCj4gKyAqICAgLSBSb290IGFjY2VzcyBvbiB0aGUgRFVUIGR1 ZSB0byB0aGUgdXNlIG9mIHN5c2ZzIHV0aWxpdHkKPiArICoKPiArICogVGVzdCBTZXR1cDoKPiAr ICogSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB0aGUgd2luZG93cyBob3N0LCB0ZXN0 IGFwcGxpYW5jZSBhbmQgRFVUCj4gKyAqIGJlIGZyZXNobHkgcmVzdGFydGVkIGJlZm9yZSBhbnkg dGVzdGluZyBiZWdpbnMgdG8gZW5zdXJlIHRoYXQgYW55IHByZXZpb3VzCj4gKyAqIGNvbmZpZ3Vy YXRpb25zIGFuZCBzZXR0aW5ncyB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCB0ZXN0IHByb2Nlc3Mu IFJlZmVyIHRvCj4gKyAqIHRoZSB0ZXN0IGFwcGxpYW5jZSBkb2N1bWVudGF0aW9uIGZvciBzZXR1 cCwgc29mdHdhcmUgaW5zdGFsbGF0aW9uIGFuZAo+ICsgKiBvcGVyYXRpb24gc3BlY2lmaWMgdG8g dGhhdCBkZXZpY2UuCj4gKyAqCj4gKyAqIFRoZSBMaW51eCBEVVQgbXVzdCBiZSBpbiB0ZXh0IChj b25zb2xlKSBtb2RlIGFuZCBjYW5ub3QgaGF2ZSBhbnkgb3RoZXIKPiArICogZGlzcGxheSBtYW5h Z2VyIHJ1bm5pbmcuIFlvdSBtdXN0IGJlIGxvZ2dlZCBpbiBhcyByb290IHRvIHJ1biB0aGlzIHVz ZXIgYXBwLgo+ICsgKiBPbmNlIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGlzIHVwIGFuZCBydW5uaW5n LCB3YWl0aW5nIGZvciB0ZXN0IHJlcXVlc3RzLCB0aGUKPiArICogc29mdHdhcmUgb24gdGhlIHdp bmRvd3MgaG9zdCBjYW4gbm93IGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgY29tcGxpYW5jZSB0ZXN0 cy4KPiArICoKPiArICogVGhpcyB1c2Vyc3BhY2UgYXBwbGljYXRpb24gc3VwcG9ydHMgZm9sbG93 aW5nIHRlc3RzIGZyb20gdGhlIERQIENUUyBTcGVjCj4gKyAqIFJldiAxLjE6Cj4gKyAqICAgLSBF RElEIFRlc3RzOiBTdXBwb3J0cyBFRElEIHJlYWQgKDQuMi4yLjMpLEVESUQgUmVhZCBmYWlsdXJl IGFuZCBjb3JydXB0aW9uCj4gKyAqICAgICBkZXRlY3Rpb24gdGVzdHMgKDQuMi4yLjQsIDQuMi4y LjUsIDQuMi4yLjYpCj4gKyAqICAgLSBWaWRlbyBQYXR0ZXJuIGdlbmVyYXRpb24gdGVzdHM6IFRo aXMgc3VwcG9ydHMgb25seSB0aGUgMjQgYW5kIDE4YnBwIGNvbG9yCj4gKyAqICAgICByYW1wIHRl c3QgcGF0dGVybiAoNC4zLjMuMSkuCj4gKyAqCj4gKyAqIENvbm5lY3Rpb25zIChyZXF1aXJlZCk6 Cj4gKyAqICAgLSBUZXN0IEFwcGxpYW5jZSBjb25uZWN0ZWQgdG8gdGhlIGV4dGVybmFsIERpc3Bs YXlwb3J0IGNvbm5lY3RvciBvbiB0aGUgRFVUCj4gKyAqICAgLSBUZXN0IEFwcGxpYW5jZSBNb25p dG9yIE91dCBjb25uZWN0ZWQgdG8gRGlzcGxheXBvcnQgY29ubmVjdG9yIG9uIHRoZQo+ICsgKiBt b25pdG9yCj4gKyAqICAgLSBUZXN0IGFwcGxpYW5jZSBjb25uZWN0ZWQgdG8gdGhlIFdpbmRvd3Mg SG9zdCB2aWEgVVNCCj4gKyAqCj4gKyAqIERlYnVnZnMgRmlsZXM6Cj4gKyAqIFRoZSBmaWxlIHJv b3QgZm9yIGFsbCAgdGhlIGRlYnVnZnMgZmlsZToKPiArICogL3N5cy9rZXJuZWwvZGVidWcvZHJp LzAvCj4gKyAqCj4gKyAqIFRoZSBzcGVjaWZpYyBmaWxlcyBhcmUgYXMgZm9sbG93czoKPiArICoK PiArICogaTkxNV9kcF90ZXN0X2FjdGl2ZQo+ICsgKiBBIHNpbXBsZSBmbGFnIHRoYXQgaW5kaWNh dGVzIHdoZXRoZXIgb3Igbm90IGNvbXBsaWFuY2UgdGVzdGluZyBpcyBjdXJyZW50bHkKPiArICog YWN0aXZlIGluIHRoZSBrZXJuZWwuIFRoaXMgZmxhZyBpcyBwb2xsZWQgYnkgdXNlcnNwYWNlIGFu ZCBvbmNlIHNldCwgaW52b2tlcwo+ICsgKiB0aGUgdGVzdCBoYW5kbGVyIGluIHRoZSB1c2VyIGFw cC4gVGhpcyBmbGFnIGlzIHNldCBieSB0aGUgdGVzdCBoYW5kbGVyIGluIHRoZQo+ICsgKiBrZXJu ZWwgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXJzIHJlcXVlc3RlZCBieSB0aGUgdGVzdCBhcHBs aWFuY2UuCj4gKyAqCj4gKyAqIGk5MTVfZHBfdGVzdF9kYXRhCj4gKyAqIFRlc3QgZGF0YSBpcyB1 c2VkIGJ5IHRoZSBrZXJuZWwgdG8gcGFzcyBwYXJhbWV0ZXJzIHRvIHRoZSB1c2VyIGFwcC4gRWc6 IEluCj4gKyAqIGNhc2Ugb2YgRURJRCB0ZXN0cywgdGhlIGRhdGEgdGhhdCBpcyBkZWxpdmVyZWQg dG8gdGhlIHVzZXJzcGFjZSBpcyB0aGUgdmlkZW8KPiArICogbW9kZSB0byBiZSBzZXQgZm9yIHRo ZSB0ZXN0Lgo+ICsgKiBJbiBjYXNlIG9mIHZpZGVvIHBhdHRlcm4gdGVzdCwgdGhlIGRhdGEgdGhh dCBpcyBkZWxpdmVyZWQgdG8gdGhlIHVzZXJzcGFjZSBpcwo+ICsgKiB0aGUgd2lkdGggYW5kIGhl aWdodCBvZiB0aGUgdGVzdCBwYXR0ZXJuIGFuZCB0aGUgYml0cyBwZXIgY29sb3IgdmFsdWUuCj4g KyAqCj4gKyAqIGk5MTVfZHBfdGVzdF90eXBlCj4gKyAqIFRoZSB0ZXN0IHR5cGUgdmFyaWFibGUg aW5zdHJ1Y3RzIHRoZSB1c2VyIGFwcCBhcyB0byB3aGF0IHRoZSByZXF1ZXN0ZWQgdGVzdAo+ICsg KiB3YXMgZnJvbSB0aGUgc2luayBkZXZpY2UuIFRoZXNlIHZhbHVlcyBkZWZpbmVkIGF0IHRoZSB0 b3Agb2YgdGhlIGFwcGxpY2F0aW9uJ3MKPiArICogbWFpbiBpbXBsZW1lbnRhdGlvbiBmaWxlIG11 c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBkZWZpbmVkIGluIHRoZQo+ICsgKiBr ZXJuZWwncyBkcm1fZHBfaGVscGVyLmggZmlsZS4KPiArICogVGhpcyBhcHAgaXMgYmFzZWQgb24g c29tZSBwcmlvciB3b3JrIHN1Ym1pdHRlZCBpbiBBcHJpbCAyMDE1IGJ5IFRvZGQgUHJldml0ZQo+ ICsgKiAoPHRwcmV2aXRlQGdtYWlsLmNvbT4pCj4gKyAqCj4gKyAqCj4gKyAqIFRoaXMgdG9vbCBj YW4gYmUgcnVuIGFzOgo+ICsgKiAuL2ludGVsX2RwX2NvbXBsaWFuY2UgIEl0IHdpbGwgd2FpdCB0 aWxsIHlvdSBzdGFydCBjb21wbGlhbmNlIHN1aXRlIGZyb20KPiArICogRFBSIDEyMC4KPiArICog Li9pbnRlbF9kcF9jb21wbGlhbmNlIC1oICBUaGlzIHdpbGwgb3BlbiB0aGUgaGVscAo+ICsgKiAu L2ludGVsX2RwX2NvbXBsaWFuY2UgLWkgIFRoaXMgd2lsbCBwcm92aWRlIGluZm9ybWF0aW9uIGFi b3V0IGN1cnJlbnQKPiArICogY29ubmVjdG9ycy9DUlRDcy4gVGhpcyBjYW4gYmUgdXNlZCBmb3Ig ZGVidWdnaW5nIHB1cnBvc2UuCj4gKyAqCj4gKyAqIEF1dGhvcnM6Cj4gKyAqICAgIE1hbmFzaSBO YXZhcmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4gKyAqCj4gKyAqIEVsZW1lbnRzIG9m IHRoZSBtb2Rlc2V0IGNvZGUgYWRhcHRlZCBmcm9tIERhdmlkIEhlcnJtYW5uJ3MKPiArICogRFJN IG1vZGVzZXQgZXhhbXBsZQo+ICsgKgo+ICsgKi8KPiArI2luY2x1ZGUgImlndC5oIgo+ICsjaW5j bHVkZSA8ZXJybm8uaD4KPiArI2luY2x1ZGUgPGdldG9wdC5oPgo+ICsjaW5jbHVkZSA8bWF0aC5o Pgo+ICsjaW5jbHVkZSA8c3RkaW50Lmg+Cj4gKyNpbmNsdWRlIDxzdGRib29sLmg+Cj4gKyNpbmNs dWRlIDxzdHJpbmdzLmg+Cj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4KPiArI2luY2x1ZGUgPHRlcm1p b3MuaD4KPiArI2luY2x1ZGUgPHN5cy9wb2xsLmg+Cj4gKyNpbmNsdWRlIDxzeXMvdGltZS5oPgo+ ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KPiArI2lu Y2x1ZGUgPHN5cy9zdGF0Lmg+Cj4gKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Cj4gKyNpbmNsdWRl IDxhc3NlcnQuaD4KPiArI2luY2x1ZGUgPHNpZ25hbC5oPgo+ICsjaW5jbHVkZSA8ZmNudGwuaD4K PiArI2luY2x1ZGUgPHRpbWUuaD4KPiArCj4gKyNpbmNsdWRlICJpbnRlbF9kcF9jb21wbGlhbmNl LmgiCj4gKwo+ICsjaW5jbHVkZSA8c3RkbGliLmg+Cj4gKyNpbmNsdWRlIDxzaWduYWwuaD4KPiAr Cj4gKy8qIFVzZXIgSW5wdXQgZGVmaW5pdGlvbnMgKi8KPiArI2RlZmluZSBIRUxQX0RFU0NSSVBU SU9OIDEKPiArCj4gKy8qIERlYnVnZnMgZmlsZSBkZWZpbml0aW9ucyAqLwo+ICsjZGVmaW5lIElO VEVMX0RQX1RFU1RfVFlQRV9GSUxFCQkiaTkxNV9kcF90ZXN0X3R5cGUiCj4gKyNkZWZpbmUgSU5U RUxfRFBfVEVTVF9BQ1RJVkVfRklMRQkiaTkxNV9kcF90ZXN0X2FjdGl2ZSIKPiArI2RlZmluZSBJ TlRFTF9EUF9URVNUX0RBVEFfRklMRQkJImk5MTVfZHBfdGVzdF9kYXRhIgo+ICsKPiArLyogRFJN IGRlZmluaXRpb25zIC0gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgRFJNIGhlYWRlciAq Lwo+ICsjZGVmaW5lIERQX1RFU1RfTElOS19UUkFJTklORwkJKDEgPDwgMCkKPiArI2RlZmluZSBE UF9URVNUX0xJTktfVklERU9fUEFUVEVSTgkoMSA8PCAxKQo+ICsjZGVmaW5lIERQX1RFU1RfTElO S19FRElEX1JFQUQJCSgxIDw8IDIpCj4gKyNkZWZpbmUgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BB VFRFUk4JKDEgPDwgMykgLyogRFBDRCA+PSAxLjEgKi8KPiArCj4gKyNkZWZpbmUgRFBfQ09NUExJ QU5DRV9URVNUX1RZUEVfTUFTSwkoRFBfVEVTVF9MSU5LX1RSQUlOSU5HICAgICAgfAlcCj4gKwkJ CQkJIERQX1RFU1RfTElOS19WSURFT19QQVRURVJOIHwJXAo+ICsJCQkJCSBEUF9URVNUX0xJTktf RURJRF9SRUFEICAgICB8CVwKPiArCQkJCQkgRFBfVEVTVF9MSU5LX1BIWV9URVNUX1BBVFRFUk4p Cj4gKwo+ICsvKiBOT1RFOiBUaGVzZSBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBkZWZp bml0aW9ucyBpbiBpbnRlbF9kcC5jICovCj4gKyNkZWZpbmUgSU5URUxfRFBfRURJRF9TSElGVF9N QVNLCTAKPiArI2RlZmluZSBJTlRFTF9EUF9FRElEX09LCQkoMCA8PCBJTlRFTF9EUF9FRElEX1NI SUZUX01BU0spCj4gKyNkZWZpbmUgSU5URUxfRFBfRURJRF9DT1JSVVBUCQkoMSA8PCBJTlRFTF9E UF9FRElEX1NISUZUX01BU0spCj4gKyNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElPTl9TSElGVF9N QVNLCTAKPiArI2RlZmluZSBJTlRFTF9EUF9SRVNPTFVUSU9OX1BSRUZFUlJFRAkoMSA8PCBJTlRF TF9EUF9SRVNPTFVUSU9OX1NISUZUX01BU0spCj4gKyNkZWZpbmUgSU5URUxfRFBfUkVTT0xVVElP Tl9TVEFOREFSRAkoMiA8PCBJTlRFTF9EUF9SRVNPTFVUSU9OX1NISUZUX01BU0spCj4gKyNkZWZp bmUgSU5URUxfRFBfUkVTT0xVVElPTl9GQUlMU0FGRQkoMyA8PCBJTlRFTF9EUF9SRVNPTFVUSU9O X1NISUZUX01BU0spCj4gKyNkZWZpbmUgRFBfQ09NUExJQU5DRV9WSURFT19NT0RFX01BU0sJKElO VEVMX0RQX1JFU09MVVRJT05fUFJFRkVSUkVECXxcCj4gKwkJCQkJIElOVEVMX0RQX1JFU09MVVRJ T05fU1RBTkRBUkQJfFwKPiArCQkJCQkgSU5URUxfRFBfUkVTT0xVVElPTl9GQUlMU0FGRSkKPiAr Cj4gKy8qIEdsb2JhbCBmaWxlIHBvaW50ZXJzIGZvciB0aGUgc3lzZnMgZmlsZXMgKi8KPiArRklM RSAqdGVzdF9hY3RpdmVfZnAsICp0ZXN0X2RhdGFfZnAsICp0ZXN0X3R5cGVfZnA7Cj4gKwo+ICti b29sIHZpZGVvX3BhdHRlcm5fZmxhZzsKPiArCj4gKy8qIFZpZGVvIHBhdHRlcm4gdGVzdCBnbG9i YWxzICovCj4gK3VpbnQxNl90IGhkaXNwbGF5Owo+ICt1aW50MTZfdCB2ZGlzcGxheTsKPiArdWlu dDhfdCBiaXRkZXB0aDsKPiArCj4gK3N0YXRpYyBpbnQgdGlvX2ZkOwo+ICtzdHJ1Y3QgdGVybWlv cyBzYXZlZF90aW87Cj4gKwo+ICtkcm1Nb2RlUmVzICpyZXNvdXJjZXM7Cj4gK2ludCBkcm1fZmQs IG1vZGVzOwo+ICt1aW50NjRfdCB0aWxpbmcgPSBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FOwo+ ICt1aW50MzJfdCBkZXB0aCA9IDI0LCBzdHJpZGUsIGJwcDsKPiAraW50IHNwZWNpZmllZF9tb2Rl X251bSA9IC0xLCBzcGVjaWZpZWRfZGlzcF9pZCA9IC0xOwo+ICtpbnQgd2lkdGgsIGhlaWdodDsK PiArZW51bSB7Cj4gKwlJTlRFTF9NT0RFX0lOVkFMSUQgPSAtMSwKPiArCUlOVEVMX01PREVfTk9O RSA9IDAsCj4gKwlJTlRFTF9NT0RFX1BSRUZFUlJFRCwKPiArCUlOVEVMX01PREVfU1RBTkRBUkQs Cj4gKwlJTlRFTF9NT0RFX0ZBSUxTQUZFLAo+ICsJSU5URUxfTU9ERV9WSURFT19QQVRURVJOX1RF U1QKPiArfSBpbnRlbF9kaXNwbGF5X21vZGU7Cj4gKwo+ICtzdHJ1Y3QgdGVzdF92aWRlb19wYXR0 ZXJuIHsKPiArCXVpbnQxNl90IGhkaXNwbGF5Owo+ICsJdWludDE2X3QgdmRpc3BsYXk7Cj4gKwl1 aW50OF90IGJpdGRlcHRoOwo+ICsJdWludDMyX3QgZmI7Cj4gKwl1aW50MzJfdCBzaXplOwo+ICsJ c3RydWN0IGlndF9mYiBmYl9wYXR0ZXJuOwo+ICsJZHJtTW9kZU1vZGVJbmZvIG1vZGU7Cj4gKwl1 aW50MzJfdCAqcGl4bWFwOwo+ICt9Owo+ICsKPiArc3RydWN0IGNvbm5lY3RvciB7Cj4gKwl1aW50 MzJfdCBpZDsKPiArCWludCBtb2RlX3ZhbGlkOwo+ICsJZHJtTW9kZU1vZGVJbmZvIG1vZGUsIG1v ZGVfc3RhbmRhcmQsIG1vZGVfcHJlZmVycmVkLCBtb2RlX2ZhaWxzYWZlOwo+ICsJZHJtTW9kZUVu Y29kZXIgKmVuY29kZXI7Cj4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gKwlpbnQg Y3J0YzsKPiArCWludCBwaXBlOwo+ICsJLyogU3RhbmRhcmQgYW5kIHByZWZlcnJlZCBmcmFtZSBi dWZmZXIqLwo+ICsJdWludDMyX3QgZmIsIGZiX3dpZHRoLCBmYl9oZWlnaHQsIGZiX3NpemU7Cj4g Kwl1aW50OF90ICpwaXhtYXA7Cj4gKwlzdHJ1Y3QgaWd0X2ZiIGZiX3ZpZGVvX3BhdHRlcm47Cj4g KwkvKiBGYWlsc2FmZSBmcmFtZWJ1ZmZlciAtIG5vdGUgdGhpcyBpcyBhIDE2LWJpdCBidWZmZXIg Ki8KPiArCXVpbnQzMl90IGZhaWxzYWZlX2ZiLCBmYWlsc2FmZV93aWR0aCwgZmFpbHNhZmVfaGVp Z2h0Owo+ICsJdWludDMyX3QgZmFpbHNhZmVfc2l6ZTsKPiArCXVpbnQ4X3QgKmZhaWxzYWZlX3Bp eG1hcDsKPiArCXN0cnVjdCBpZ3RfZmIgZmJfZmFpbHNhZmVfcGF0dGVybjsKPiArCXN0cnVjdCB0 ZXN0X3ZpZGVvX3BhdHRlcm4gdGVzdF9wYXR0ZXJuOwo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQg Y2xlYXJfdGVzdF9hY3RpdmUodm9pZCkKPiArewo+ICsJcmV3aW5kKHRlc3RfYWN0aXZlX2ZwKTsK PiArCWZwcmludGYodGVzdF9hY3RpdmVfZnAsICIlZCIsIDApOwo+ICsJZmZsdXNoKHRlc3RfYWN0 aXZlX2ZwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgc2V0dXBfZGVidWdmc19maWxlcyh2b2lk KQo+ICt7Cj4gKwl0ZXN0X3R5cGVfZnAgPSBpZ3RfZGVidWdmc19mb3BlbihJTlRFTF9EUF9URVNU X1RZUEVfRklMRSwgInIiKTsKPiArCWlndF9yZXF1aXJlKHRlc3RfdHlwZV9mcCk7Cj4gKwo+ICsJ dGVzdF9kYXRhX2ZwID0gaWd0X2RlYnVnZnNfZm9wZW4oSU5URUxfRFBfVEVTVF9EQVRBX0ZJTEUs ICJyIik7Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X2RhdGFfZnApOwo+ICsKPiArCXRlc3RfYWN0aXZl X2ZwID0gaWd0X2RlYnVnZnNfZm9wZW4oSU5URUxfRFBfVEVTVF9BQ1RJVkVfRklMRSwgIncrIik7 Cj4gKwlpZ3RfcmVxdWlyZSh0ZXN0X2FjdGl2ZV9mcCk7Cj4gKwo+ICsJLyogUmVzZXQgdGhlIGFj dGl2ZSBmbGFnIGZvciBzYWZldHkgKi8KPiArCWNsZWFyX3Rlc3RfYWN0aXZlKCk7Cj4gK30KPiAr Cj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF90ZXN0X3R5cGUodm9pZCkKPiArewo+ICsJdW5z aWduZWQgbG9uZyB0ZXN0X3R5cGU7Cj4gKwo+ICsJaWYgKCF0ZXN0X3R5cGVfZnApCj4gKwkJZnBy aW50ZihzdGRlcnIsICJJbnZhbGlkIFRlc3QgVHlwZSBGaWxlIHBvaW50clxyXG4iKTsKPiArCXJl d2luZCh0ZXN0X3R5cGVfZnApOwo+ICsJZnNjYW5mKHRlc3RfdHlwZV9mcCwgIiUwMmx4IiwgJnRl c3RfdHlwZSk7Cj4gKwlpZiAodGVzdF90eXBlIDw9IDApIHsKPiArCQlpZ3Rfd2FybigiVGVzdCB0 eXBlIHJlYWQgZmFpbGVkIC0gJTAybHhcclxuIiwgdGVzdF90eXBlKTsKPiArCQlyZXR1cm4gMDsK PiArCX0KPiArCj4gKwlyZXR1cm4gdGVzdF90eXBlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdW5zaWdu ZWQgbG9uZyBnZXRfdGVzdF9lZGlkX2RhdGEodm9pZCkKPiArewo+ICsJdW5zaWduZWQgbG9uZyB0 ZXN0X2RhdGE7Cj4gKwo+ICsJaWYgKCF0ZXN0X2RhdGFfZnApCj4gKwkJZnByaW50ZihzdGRlcnIs ICJJbnZhbGlkIFRlc3QgZGF0YSBGaWxlIFBvaW50ZXJcclxuIik7Cj4gKwo+ICsJcmV3aW5kKHRl c3RfZGF0YV9mcCk7Cj4gKwlmc2NhbmYodGVzdF9kYXRhX2ZwLCAiJWx4IiwgJnRlc3RfZGF0YSk7 Cj4gKwlpZiAodGVzdF9kYXRhIDw9IDApIHsKPiArCQlpZ3Rfd2FybigiVGVzdCBkYXRhIHJlYWQg ZmFpbGVkIC0gJWx4XHJcbiIsIHRlc3RfZGF0YSk7Cj4gKwkJcmV0dXJuIDA7Cj4gKwl9Cj4gKwo+ ICsJcmV0dXJuIHRlc3RfZGF0YTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZ2V0X3Rlc3Rfdmlk ZW9wYXR0ZXJuX2RhdGEodm9pZCkKPiArewo+ICsJaW50IGNvdW50ID0gMDsKPiArCXVpbnQxNl90 IHZpZGVvX3BhdHRlcm5fdmFsdWVbM107Cj4gKwljaGFyIHZpZGVvX3BhdHRlcm5fYXR0cmlidXRl WzE1XTsKPiArCj4gKwlpZiAoIXRlc3RfZGF0YV9mcCkKPiArCQlmcHJpbnRmKHN0ZGVyciwgIklu dmFsaWQgVGVzdCBkYXRhIEZpbGUgcG9pbnRlclxyXG4iKTsKPiArCj4gKwlyZXdpbmQodGVzdF9k YXRhX2ZwKTsKPiArCXdoaWxlICghZmVvZih0ZXN0X2RhdGFfZnApICYmIGNvdW50IDwgMykKPiAr CQlmc2NhbmYodGVzdF9kYXRhX2ZwLCAiJXMgJXVcbiIsIHZpZGVvX3BhdHRlcm5fYXR0cmlidXRl LAo+ICsJCSAgICAgICAodW5zaWduZWQgaW50ICopJnZpZGVvX3BhdHRlcm5fdmFsdWVbY291bnQr K10pOwo+ICsKPiArCWhkaXNwbGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVswXTsKPiArCXZkaXNw bGF5ID0gdmlkZW9fcGF0dGVybl92YWx1ZVsxXTsKPiArCWJpdGRlcHRoID0gdmlkZW9fcGF0dGVy bl92YWx1ZVsyXTsKPiArCWlndF9pbmZvKCJIZGlzcGxheSA9ICVkXHJcbiIsIGhkaXNwbGF5KTsK PiArCWlndF9pbmZvKCJWZGlzcGxheSA9ICVkXHJcbiIsIHZkaXNwbGF5KTsKPiArCWlndF9pbmZv KCJCaXREZXB0aCA9ICV1XHJcbiIsIGJpdGRlcHRoKTsKPiArCj4gK30KPiArCj4gK3N0YXRpYyBp bnQgcHJvY2Vzc190ZXN0X3JlcXVlc3QoaW50IHRlc3RfdHlwZSkKPiArewo+ICsJaW50IG1vZGU7 Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfZGF0YV9lZGlkOwo+ICsJaW50IHN0YXR1cyA9IDA7Cj4g Kwo+ICsJc3dpdGNoICh0ZXN0X3R5cGUpIHsKPiArCWNhc2UgRFBfVEVTVF9MSU5LX1ZJREVPX1BB VFRFUk46Cj4gKwkJdmlkZW9fcGF0dGVybl9mbGFnID0gdHJ1ZTsKPiArCQlnZXRfdGVzdF92aWRl b3BhdHRlcm5fZGF0YSgpOwo+ICsJCW1vZGUgPSBJTlRFTF9NT0RFX1ZJREVPX1BBVFRFUk5fVEVT VDsKPiArCQlicmVhazsKPiArCWNhc2UgRFBfVEVTVF9MSU5LX0VESURfUkVBRDoKPiArCQl0ZXN0 X2RhdGFfZWRpZCA9IGdldF90ZXN0X2VkaWRfZGF0YSgpOwo+ICsJCW1vZGUgPSAodGVzdF9kYXRh X2VkaWQgJiBEUF9DT01QTElBTkNFX1ZJREVPX01PREVfTUFTSykgPj4KPiArCQkJSU5URUxfRFBf UkVTT0xVVElPTl9TSElGVF9NQVNLOwo+ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQkvKiBV bmtub3duIHRlc3QgdHlwZSAqLwo+ICsJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0ZXN0IHJl cXVlc3QuIElnbm9yZWQuXHJcbiIpOwo+ICsJCWJyZWFrOwo+ICsJfQo+ICsJc3RhdHVzID0gdXBk YXRlX2Rpc3BsYXkobW9kZSwgdHJ1ZSk7Cj4gKwo+ICsJLyogUmV0dXJuIDAgb24gc3VjY2VzcyBh bmQgLTEgb24gZmFpbHVyZSAqLwo+ICsJcmV0dXJuIHN0YXR1czsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZHVtcF9jb25uZWN0b3JzX2ZkKGludCBkcm1mZCkKPiArewo+ICsJaW50IGksIGo7Cj4g Kwo+ICsJZHJtTW9kZVJlcyAqbW9kZV9yZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRy bWZkKTsKPiArCj4gKwlpZiAoIW1vZGVfcmVzb3VyY2VzKSB7Cj4gKwkJaWd0X3dhcm4oImRybU1v ZGVHZXRSZXNvdXJjZXMgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKPiArCQlyZXR1 cm47Cj4gKwl9Cj4gKwo+ICsJaWd0X2luZm8oIkNvbm5lY3RvcnM6XG4iKTsKPiArCWlndF9pbmZv KCJpZFx0ZW5jb2Rlclx0c3RhdHVzXHRcdHR5cGVcdHNpemUgKG1tKVx0bW9kZXNcbiIpOwo+ICsJ Zm9yIChpID0gMDsgaSA8IG1vZGVfcmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsK PiArCQlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gKwo+ICsJCWNvbm5lY3RvciA9IGRy bU1vZGVHZXRDb25uZWN0b3JDdXJyZW50KGRybWZkLAo+ICsJCQkJCQkgICAgICAgbW9kZV9yZXNv dXJjZXMtPmNvbm5lY3RvcnNbaV0pOwo+ICsJCWlmICghY29ubmVjdG9yKSB7Cj4gKwkJCWlndF93 YXJuKCJjb3VsZCBub3QgZ2V0IGNvbm5lY3RvciAlaTogJXNcbiIsIG1vZGVfcmVzb3VyY2VzLT5j b25uZWN0b3JzW2ldLCBzdHJlcnJvcihlcnJubykpOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4g Kwo+ICsJCWlndF9pbmZvKCIlZFx0JWRcdCVzXHQlc1x0JWR4JWRcdFx0JWRcbiIsIGNvbm5lY3Rv ci0+Y29ubmVjdG9yX2lkLCBjb25uZWN0b3ItPmVuY29kZXJfaWQsIGttc3Rlc3RfY29ubmVjdG9y X3N0YXR1c19zdHIoY29ubmVjdG9yLT5jb25uZWN0aW9uKSwga21zdGVzdF9jb25uZWN0b3JfdHlw ZV9zdHIoY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSksIGNvbm5lY3Rvci0+bW1XaWR0aCwgY29u bmVjdG9yLT5tbUhlaWdodCwgY29ubmVjdG9yLT5jb3VudF9tb2Rlcyk7Cj4gKwo+ICsJCWlmICgh Y29ubmVjdG9yLT5jb3VudF9tb2RlcykKPiArCQkJY29udGludWU7Cj4gKwo+ICsJCWlndF9pbmZv KCIgIG1vZGVzOlxuIik7Cj4gKwkJaWd0X2luZm8oIiAgbmFtZSByZWZyZXNoIChIeikgaGRpc3Ag aHNzIGhzZSBodG90IHZkaXNwICIidnNzIHZzZSB2dG90IGZsYWdzIHR5cGUgY2xvY2tcbiIpOwo+ ICsJCWZvciAoaiA9IDA7IGogPCBjb25uZWN0b3ItPmNvdW50X21vZGVzOyBqKyspIHsKPiArCQkJ aWd0X2luZm8oIlslZF0iLCBqKTsKPiArCQkJa21zdGVzdF9kdW1wX21vZGUoJmNvbm5lY3Rvci0+ bW9kZXNbal0pOwo+ICsJCX0KPiArCj4gKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9y KTsKPiArCX0KPiArCWlndF9pbmZvKCJcbiIpOwo+ICsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2Vz KG1vZGVfcmVzb3VyY2VzKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9jcnRjc19mZChp bnQgZHJtZmQpCj4gK3sKPiArCWludCBpOwo+ICsJZHJtTW9kZVJlcyAqbW9kZV9yZXNvdXJjZXMg PSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybWZkKTsKPiArCj4gKwlpZ3RfaW5mbygiQ1JUQ3M6XG4i KTsKPiArCWlndF9pbmZvKCJpZFx0ZmJcdHBvc1x0c2l6ZVxuIik7Cj4gKwlmb3IgKGkgPSAwOyBp IDwgbW9kZV9yZXNvdXJjZXMtPmNvdW50X2NydGNzOyBpKyspIHsKPiArCQlkcm1Nb2RlQ3J0YyAq Y3J0YzsKPiArCj4gKwkJY3J0YyA9IGRybU1vZGVHZXRDcnRjKGRybWZkLCBtb2RlX3Jlc291cmNl cy0+Y3J0Y3NbaV0pOwo+ICsJCWlmICghY3J0Yykgewo+ICsJCQlpZ3Rfd2FybigiY291bGQgbm90 IGdldCBjcnRjICVpOiAlc1xuIiwgbW9kZV9yZXNvdXJjZXMtPmNydGNzW2ldLCBzdHJlcnJvcihl cnJubykpOwo+ICsJCQljb250aW51ZTsKPiArCQl9Cj4gKwkJaWd0X2luZm8oIiVkXHQlZFx0KCVk LCVkKVx0KCVkeCVkKVxuIiwgY3J0Yy0+Y3J0Y19pZCwgY3J0Yy0+YnVmZmVyX2lkLCBjcnRjLT54 LCBjcnRjLT55LCBjcnRjLT53aWR0aCwgY3J0Yy0+aGVpZ2h0KTsKPiArCQlrbXN0ZXN0X2R1bXBf bW9kZSgmY3J0Yy0+bW9kZSk7Cj4gKwo+ICsJCWRybU1vZGVGcmVlQ3J0YyhjcnRjKTsKPiArCX0K PiArCWlndF9pbmZvKCJcbiIpOwo+ICsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKG1vZGVfcmVz b3VyY2VzKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHVtcF9pbmZvKHZvaWQpCj4gK3sKPiAr CWR1bXBfY29ubmVjdG9yc19mZChkcm1fZmQpOwo+ICsJZHVtcF9jcnRjc19mZChkcm1fZmQpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBjb25uZWN0b3JfZmluZF9wcmVmZXJyZWRfbW9kZSh1aW50 MzJfdCBjb25uZWN0b3JfaWQsCj4gKwkJCQkJICB1bnNpZ25lZCBsb25nIGNydGNfaWR4X21hc2ss Cj4gKwkJCQkJICBzdHJ1Y3QgY29ubmVjdG9yICpjKQo+ICt7Cj4gKwlzdHJ1Y3Qga21zdGVzdF9j b25uZWN0b3JfY29uZmlnIGNvbmZpZzsKPiArCWJvb2wgcmV0Owo+ICsKPiArCXJldCA9IGttc3Rl c3RfcHJvYmVfY29ubmVjdG9yX2NvbmZpZyhkcm1fZmQsIGNvbm5lY3Rvcl9pZCwKPiArCQkJCQkg ICAgIGNydGNfaWR4X21hc2ssICZjb25maWcpOwo+ICsJaWYgKCFyZXQpIHsKPiArCQljLT5tb2Rl X3ZhbGlkID0gMDsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJYy0+Y29ubmVjdG9yID0gY29u ZmlnLmNvbm5lY3RvcjsKPiArCWMtPmVuY29kZXIgPSBjb25maWcuZW5jb2RlcjsKPiArCWMtPmNy dGMgPSBjb25maWcuY3J0Yy0+Y3J0Y19pZDsKPiArCWMtPnBpcGUgPSBjb25maWcucGlwZTsKPiAr Cj4gKwlpZiAoYy0+Y29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05ORUNU T1JfRGlzcGxheVBvcnQgfHwKPiArCSAgICBjLT5jb25uZWN0b3ItPmNvbm5lY3Rpb24gIT0gIERS TV9NT0RFX0NPTk5FQ1RFRCkgewo+ICsJCWMtPm1vZGVfdmFsaWQgPSAwOwo+ICsJCXJldHVybjsK PiArCX0KPiArCj4gKwljLT5tb2RlID0gY29uZmlnLmRlZmF1bHRfbW9kZTsKPiArCWMtPm1vZGVf dmFsaWQgPSAxOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldHVwX2ZyYW1lYnVmZmVycyhzdHJ1 Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+ICt7Cj4gKwo+ICsJZHBfY29ubi0+ZmIgPSBpZ3RfY3Jl YXRlX2ZiKGRybV9mZCwKPiArCQkJCSAgICBkcF9jb25uLT5mYl93aWR0aCwgZHBfY29ubi0+ZmJf aGVpZ2h0LAo+ICsJCQkJICAgIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkgICAgTE9DQUxf RFJNX0ZPUk1BVF9NT0RfTk9ORSwKPiArCQkJCSAgICAmZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVy bik7Cj4gKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPmZiKTsKPiArCj4gKwkvKiBNYXAgdGhlIG1hcHBp bmcgb2YgR0VNIG9iamVjdCBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8KPiArCWRw X2Nvbm4tPnBpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJtX2ZkLAo+ICsJCQkJCWRwX2Nvbm4tPmZi X3ZpZGVvX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkJCQlkcF9jb25uLT5mYl92aWRlb19wYXR0 ZXJuLnNpemUsCj4gKwkJCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Cj4gKwlnZW1fc2V0X2Rv bWFpbihkcm1fZmQsIGRwX2Nvbm4tPmZiX3ZpZGVvX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkg ICAgICAgSTkxNV9HRU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7Cj4gKwlkcF9j b25uLT5mYl9zaXplID0gZHBfY29ubi0+ZmJfdmlkZW9fcGF0dGVybi5zaXplOwo+ICsKPiArCS8q IEFmdGVyIGZpbGxpbmcgdGhlIGRldmljZSBtZW1vcnkgd2l0aCAwcyBpdCBuZWVkcyB0byBiZSB1 bm1hcHBlZCAqLwo+ICsJbWVtc2V0KGRwX2Nvbm4tPnBpeG1hcCwgMCwgZHBfY29ubi0+ZmJfc2l6 ZSk7Cj4gKwltdW5tYXAoZHBfY29ubi0+cGl4bWFwLCBkcF9jb25uLT5mYl9zaXplKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBzZXR1cF9mYWlsc2FmZV9mcmFtZWJ1 ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9jb25uKQo+ICt7Cj4gKwo+ICsJZHBfY29ubi0+ZmFp bHNhZmVfZmIgPSBpZ3RfY3JlYXRlX2ZiKGRybV9mZCwKPiArCQkJCQkgICAgIGRwX2Nvbm4tPmZh aWxzYWZlX3dpZHRoLAo+ICsJCQkJCSAgICAgZHBfY29ubi0+ZmFpbHNhZmVfaGVpZ2h0LAo+ICsJ CQkJCSAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCwKPiArCQkJCQkgICAgIExPQ0FMX0RSTV9GT1JN QVRfTU9EX05PTkUsCj4gKwkJCQkJICAgICAmZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVybik7 Cj4gKwlpZ3RfYXNzZXJ0KGRwX2Nvbm4tPmZhaWxzYWZlX2ZiKTsKPiArCj4gKwkvKiBNYXAgdGhl IG1hcHBpbmcgb2YgR0VNIG9iamVjdCBpbnRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKi8K PiArCWRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCA9IGdlbV9tbWFwX19ndHQoZHJtX2ZkLAo+ICsJ CQkJCQkgZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVybi5nZW1faGFuZGxlLAo+ICsJCQkJCQkg ZHBfY29ubi0+ZmJfZmFpbHNhZmVfcGF0dGVybi5zaXplLAo+ICsJCQkJCQkgUFJPVF9SRUFEIHwg UFJPVF9XUklURSk7Cj4gKwlnZW1fc2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nvbm4tPmZiX2ZhaWxz YWZlX3BhdHRlcm4uZ2VtX2hhbmRsZSwKPiArCQkgICAgICAgSTkxNV9HRU1fRE9NQUlOX0dUVCwg STkxNV9HRU1fRE9NQUlOX0dUVCk7Cj4gKwlkcF9jb25uLT5mYWlsc2FmZV9zaXplID0gZHBfY29u bi0+ZmJfZmFpbHNhZmVfcGF0dGVybi5zaXplOwo+ICsKPiArCS8qIEFmdGVyIGZpbGxpbmcgdGhl IGRldmljZSBmcmFtZWJ1ZmZlciB0aGUgbWFwcGVkIG1lbW9yeSBuZWVkcyB0byBiZSBmcmVlZCAq Lwo+ICsJbWVtc2V0KGRwX2Nvbm4tPmZhaWxzYWZlX3BpeG1hcCwgMCwgZHBfY29ubi0+ZmFpbHNh ZmVfc2l6ZSk7Cj4gKwltdW5tYXAoZHBfY29ubi0+ZmFpbHNhZmVfcGl4bWFwLCBkcF9jb25uLT5m YWlsc2FmZV9zaXplKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK30KPiArCj4gK3N0YXRpYyBp bnQgc2V0dXBfdmlkZW9fcGF0dGVybl9mcmFtZWJ1ZmZlcihzdHJ1Y3QgY29ubmVjdG9yICpkcF9j b25uKQo+ICt7Cj4gKwl1aW50MzJfdCAgdmlkZW9fd2lkdGgsIHZpZGVvX2hlaWdodDsKPiArCj4g Kwl2aWRlb193aWR0aCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheTsKPiArCXZpZGVv X2hlaWdodCA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi52ZGlzcGxheTsKPiArCWRwX2Nvbm4tPnRl c3RfcGF0dGVybi5mYiA9IGlndF9jcmVhdGVfZmIoZHJtX2ZkLAo+ICsJCQkJCQkgdmlkZW9fd2lk dGgsIHZpZGVvX2hlaWdodCwKPiArCQkJCQkJIERSTV9GT1JNQVRfWFJHQjg4ODgsCj4gKwkJCQkJ CSBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+ICsJCQkJCQkgJmRwX2Nvbm4tPnRlc3RfcGF0 dGVybi5mYl9wYXR0ZXJuKTsKPiArCWlndF9hc3NlcnQoZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmZi KTsKPiArCj4gKwkvKiBNYXAgdGhlIG1hcHBpbmcgb2YgR0VNIG9iamVjdCBpbnRvIHRoZSB2aXJ0 dWFsIGFkZHJlc3Mgc3BhY2UgKi8KPiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXAgPSBn ZW1fbW1hcF9fZ3R0KGRybV9mZCwKPiArCQkJCQkJICAgICBkcF9jb25uLT50ZXN0X3BhdHRlcm4u ZmJfcGF0dGVybi5nZW1faGFuZGxlLAo+ICsJCQkJCQkgICAgIGRwX2Nvbm4tPnRlc3RfcGF0dGVy bi5mYl9wYXR0ZXJuLnNpemUsCj4gKwkJCQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7 Cj4gKwlnZW1fc2V0X2RvbWFpbihkcm1fZmQsIGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5mYl9wYXR0 ZXJuLmdlbV9oYW5kbGUsCj4gKwkJICAgICAgIEk5MTVfR0VNX0RPTUFJTl9HVFQsIEk5MTVfR0VN X0RPTUFJTl9HVFQpOwo+ICsKPiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5zaXplID0gZHBfY29u bi0+dGVzdF9wYXR0ZXJuLmZiX3BhdHRlcm4uc2l6ZTsKPiArCj4gKwltZW1zZXQoZHBfY29ubi0+ dGVzdF9wYXR0ZXJuLnBpeG1hcCwgMCwgZHBfY29ubi0+dGVzdF9wYXR0ZXJuLnNpemUpOwo+ICsJ cmV0dXJuIDA7Cj4gKwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGZpbGxfZnJhbWVidWZmZXIoc3Ry dWN0IGNvbm5lY3RvciAqZHBfY29ubikKPiArewo+ICsJdWludDMyX3QgdGlsZV9oZWlnaHQsIHRp bGVfd2lkdGgsIHZpZGVvX3dpZHRoLCB2aWRlb19oZWlnaHQ7Cj4gKwl1aW50MzJfdCAqcmVkX3B0 ciwgKmdyZWVuX3B0ciwgKmJsdWVfcHRyLCAqd2hpdGVfcHRyLCAqc3JjX3B0ciwgKmRzdF9wdHI7 Cj4gKwlpbnQgeCwgeTsKPiArCWludDMyX3QgcGl4ZWxfdmFsOwo+ICsKPiArCXZpZGVvX3dpZHRo ID0gZHBfY29ubi0+dGVzdF9wYXR0ZXJuLmhkaXNwbGF5Owo+ICsJdmlkZW9faGVpZ2h0ID0gZHBf Y29ubi0+dGVzdF9wYXR0ZXJuLnZkaXNwbGF5Owo+ICsKPiArCXRpbGVfaGVpZ2h0ID0gNjQ7Cj4g Kwl0aWxlX3dpZHRoID0gMSA8PCAgKGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5iaXRkZXB0aCk7Cj4g Kwo+ICsJcmVkX3B0ciA9IGRwX2Nvbm4tPnRlc3RfcGF0dGVybi5waXhtYXA7Cj4gKwlncmVlbl9w dHIgPSByZWRfcHRyICsgKHZpZGVvX3dpZHRoICogdGlsZV9oZWlnaHQpOwo+ICsJYmx1ZV9wdHIg PSBncmVlbl9wdHIgKyAodmlkZW9fd2lkdGggKiB0aWxlX2hlaWdodCk7Cj4gKwl3aGl0ZV9wdHIg PSBibHVlX3B0ciArICh2aWRlb193aWR0aCAqIHRpbGVfaGVpZ2h0KTsKPiArCXggPSAwOwo+ICsK PiArCS8qIEZpbGwgdGhlIGZyYW1lIGJ1ZmZlciB3aXRoIHZpZGVvIHBhdHRlcm4gZnJvbSBDVFMg My4xLjUgKi8KPiArCXdoaWxlICh4IDwgdmlkZW9fd2lkdGgpIHsKPiArCQlmb3IgKHBpeGVsX3Zh bCA9IDA7IHBpeGVsX3ZhbCA8IDI1NjsKPiArCQkgICAgIHBpeGVsX3ZhbCA9IHBpeGVsX3ZhbCAr ICgyNTYgLyB0aWxlX3dpZHRoKSkgewo+ICsJCQlyZWRfcHRyW3hdID0gcGl4ZWxfdmFsIDw8IDE2 Owo+ICsJCQlncmVlbl9wdHJbeF0gPSBwaXhlbF92YWwgPDwgODsKPiArCQkJYmx1ZV9wdHJbeF0g PSBwaXhlbF92YWwgPDwgMDsKPiArCQkJd2hpdGVfcHRyW3hdID0gcmVkX3B0clt4XSB8IGdyZWVu X3B0clt4XSB8IGJsdWVfcHRyW3hdOwo+ICsJCQlpZiAoKyt4ID49IHZpZGVvX3dpZHRoKQo+ICsJ CQkJYnJlYWs7Cj4gKwkJfQo+ICsJfQo+ICsJZm9yICh5ID0gMDsgeSA8IHZpZGVvX2hlaWdodDsg eSsrKSB7Cj4gKwkJaWYgKHkgPT0gMCB8fCB5ID09IDY0IHx8IHkgPT0gMTI4IHx8IHkgPT0gMTky KQo+ICsJCQljb250aW51ZTsKPiArCQlzd2l0Y2ggKCh5IC8gdGlsZV9oZWlnaHQpICUgNCkgewo+ ICsJCWNhc2UgMDoKPiArCQkJc3JjX3B0ciA9IHJlZF9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNh c2UgMToKPiArCQkJc3JjX3B0ciA9IGdyZWVuX3B0cjsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAy Ogo+ICsJCQlzcmNfcHRyID0gYmx1ZV9wdHI7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgMzoKPiAr CQkJc3JjX3B0ciA9IHdoaXRlX3B0cjsKPiArCQkJYnJlYWs7Cj4gKwkJfQo+ICsJCWRzdF9wdHIg PSBkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFwICsgKHkgKiB2aWRlb193aWR0aCk7Cj4gKwkJ bWVtY3B5KGRzdF9wdHIsIHNyY19wdHIsICh2aWRlb193aWR0aCAqIDQpKTsKPiArCX0KPiArCW11 bm1hcChkcF9jb25uLT50ZXN0X3BhdHRlcm4ucGl4bWFwLAo+ICsJICAgICAgIGRwX2Nvbm4tPnRl c3RfcGF0dGVybi5zaXplKTsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNl dF90ZXN0X21vZGUoc3RydWN0IGNvbm5lY3RvciAqZHBfY29ubikKPiArewo+ICsJaW50IHJldCA9 IDA7Cj4gKwlpbnQgaTsKPiArCWJvb2wgZm91bmRfc3RkID0gZmFsc2UsIGZvdW5kX2ZzID0gZmFs c2U7Cj4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjID0gZHBfY29ubi0+Y29ubmVjdG9yOwo+ICsKPiAr CS8qIElnbm9yZSBhbnkgZGlzY29ubmVjdGVkIGRldmljZXMgKi8KPiArCWlmIChjLT5jb25uZWN0 aW9uICE9IERSTV9NT0RFX0NPTk5FQ1RFRCkgewo+ICsJCWlndF93YXJuKCJDb25uZWN0b3IgJXUg ZGlzY29ubmVjdGVkXHJcbiIsIGMtPmNvbm5lY3Rvcl9pZCk7Cj4gKwkJcmV0dXJuIC1FTk9FTlQ7 Cj4gKwl9Cj4gKwlpZ3RfaW5mbygiQ29ubmVjdG9yIFNldHVwOlxyXG4iKTsKPiArCS8qIFNldHVw IHByZWZlcnJlZCBtb2RlIC0gc2hvdWxkIGJlIG1vZGVbMF0gaW4gdGhlIGxpc3QgKi8KPiArCWRw X2Nvbm4tPm1vZGVfcHJlZmVycmVkID0gYy0+bW9kZXNbMF07Cj4gKwlkcF9jb25uLT5mYl93aWR0 aCA9IGMtPm1vZGVzWzBdLmhkaXNwbGF5Owo+ICsJZHBfY29ubi0+ZmJfaGVpZ2h0ID0gYy0+bW9k ZXNbMF0udmRpc3BsYXk7Cj4gKwo+ICsJZHBfY29ubi0+dGVzdF9wYXR0ZXJuLm1vZGUgPSBjLT5t b2Rlc1swXTsKPiArCWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5tb2RlLmhkaXNwbGF5ID0gYy0+bW9k ZXNbMF0uaGRpc3BsYXk7Cj4gKwlkcF9jb25uLT50ZXN0X3BhdHRlcm4ubW9kZS52ZGlzcGxheSA9 IGMtPm1vZGVzWzBdLnZkaXNwbGF5Owo+ICsKPiArCWlndF9pbmZvKCJQcmVmZXJyZWQgbW9kZSAo bW9kZSAwKSBmb3IgY29ubmVjdG9yICV1IGlzICV1eCV1XHJcbiIsCj4gKwkJIGRwX2Nvbm4tPmlk LCBjLT5tb2Rlc1swXS5oZGlzcGxheSwgYy0+bW9kZXNbMF0udmRpc3BsYXkpOwo+ICsJZmZsdXNo KHN0ZGluKTsKPiArCj4gKwlmb3IgKGkgPSAxOyBpIDwgYy0+Y291bnRfbW9kZXM7IGkrKykgewo+ ICsJCS8qIFN0YW5kYXJkIG1vZGUgaXMgODAweDYwMEA2MCAqLwo+ICsJCWlmIChjLT5tb2Rlc1tp XS5oZGlzcGxheSA9PSA4MDAgJiYKPiArCQkgICAgYy0+bW9kZXNbaV0udmRpc3BsYXkgPT0gNjAw ICYmCj4gKwkJICAgIGMtPm1vZGVzW2ldLnZyZWZyZXNoID09IDYwICYmCj4gKwkJICAgIGZvdW5k X3N0ZCA9PSBmYWxzZSkgewo+ICsJCQlkcF9jb25uLT5tb2RlX3N0YW5kYXJkID0gYy0+bW9kZXNb aV07Cj4gKwkJCWlndF9pbmZvKCJTdGFuZGFyZCBtb2RlICglZCkgZm9yIGNvbm5lY3RvciAldSBp cyAldXgldVxyXG4iLAo+ICsJCQkJIGksCj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLAo+ICsJCQkJ IGMtPm1vZGVzW2ldLmhkaXNwbGF5LAo+ICsJCQkJIGMtPm1vZGVzW2ldLnZkaXNwbGF5KTsKPiAr CQkJZm91bmRfc3RkID0gdHJ1ZTsKPiArCQl9Cj4gKwkJLyogRmFpbHNhZmUgbW9kZSBpcyA2NDB4 NDgwQDYwICovCj4gKwkJaWYgKGMtPm1vZGVzW2ldLmhkaXNwbGF5ID09IDY0MCAmJgo+ICsJCSAg ICBjLT5tb2Rlc1tpXS52ZGlzcGxheSA9PSA0ODAgJiYKPiArCQkgICAgYy0+bW9kZXNbaV0udnJl ZnJlc2ggPT0gNjAgJiYKPiArCQkgICAgZm91bmRfZnMgPT0gZmFsc2UpIHsKPiArCQkJZHBfY29u bi0+bW9kZV9mYWlsc2FmZSA9IGMtPm1vZGVzW2ldOwo+ICsJCQlkcF9jb25uLT5mYWlsc2FmZV93 aWR0aCA9IGMtPm1vZGVzW2ldLmhkaXNwbGF5Owo+ICsJCQlkcF9jb25uLT5mYWlsc2FmZV9oZWln aHQgPSBjLT5tb2Rlc1tpXS52ZGlzcGxheTsKPiArCQkJaWd0X2luZm8oIkZhaWxzYWZlIG1vZGUg KCVkKSBmb3IgY29ubmVjdG9yICV1IGlzICV1eCV1XHJcbiIsCj4gKwkJCQkgaSwKPiArCQkJCSBj LT5jb25uZWN0b3JfaWQsCj4gKwkJCQkgYy0+bW9kZXNbaV0uaGRpc3BsYXksCj4gKwkJCQkgYy0+ bW9kZXNbaV0udmRpc3BsYXkpOwo+ICsJCQlmb3VuZF9mcyA9IHRydWU7Cj4gKwkJfQo+ICsJfQo+ ICsKPiArCXJldCA9IHNldHVwX2ZyYW1lYnVmZmVycyhkcF9jb25uKTsKPiArCWlmIChyZXQpIHsK PiArCQlpZ3Rfd2FybigiQ3JlYXRlIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVk ICglZClcclxuIiwKPiArCQkJIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiArCQlyZXR1cm4gcmV0 Owo+ICsJfQo+ICsKPiArCWlmIChmb3VuZF9mcykgewo+ICsJCXJldCA9IHNldHVwX2ZhaWxzYWZl X2ZyYW1lYnVmZmVyKGRwX2Nvbm4pOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJaWd0X3dhcm4oIkNy ZWF0ZSBmYWlsc2FmZSBmcmFtZWJ1ZmZlciBmb3IgY29ubmVjdG9yICV1Igo+ICsJCQkJICJmYWls ZWQgKCVkKVxyXG4iLAo+ICsJCQkJIGMtPmNvbm5lY3Rvcl9pZCwgcmV0KTsKPiArCQkJcmV0dXJu IHJldDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJaWYgKHZpZGVvX3BhdHRlcm5fZmxhZykgewo+ICsJ CWRwX2Nvbm4tPnRlc3RfcGF0dGVybi5oZGlzcGxheSA9IGhkaXNwbGF5Owo+ICsJCWRwX2Nvbm4t PnRlc3RfcGF0dGVybi52ZGlzcGxheSA9IHZkaXNwbGF5Owo+ICsJCWRwX2Nvbm4tPnRlc3RfcGF0 dGVybi5iaXRkZXB0aCA9IGJpdGRlcHRoOwo+ICsJCXJldCA9IHNldHVwX3ZpZGVvX3BhdHRlcm5f ZnJhbWVidWZmZXIoZHBfY29ubik7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlpZ3Rfd2FybigiQ3Jl YXRlIGZyYW1lYnVmZmVyIGZvciBjb25uZWN0b3IgJXUgZmFpbGVkICglZClcclxuIiwKPiArCQkJ CSBjLT5jb25uZWN0b3JfaWQsIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJCXJl dCA9IGZpbGxfZnJhbWVidWZmZXIoZHBfY29ubik7Cj4gKwkJaWYgKHJldCkgewo+ICsJCQlpZ3Rf d2FybigiRmlsbCBmcmFtZWJ1ZmZlciBmb3IgY29ubmVjdG9yICV1IGZhaWxlZCAoJWQpXHJcbiIs Cj4gKwkJCQkgYy0+Y29ubmVjdG9yX2lkLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0K PiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHNldF92aWRl byhpbnQgbW9kZSwgc3RydWN0IGNvbm5lY3RvciAqdGVzdF9jb25uZWN0b3IpCj4gK3sKPiArCWRy bU1vZGVNb2RlSW5mbyAqcmVxdWVzdGVkX21vZGU7Cj4gKwl1aW50MzJfdCByZXF1aXJlZF9mYl9p ZDsKPiArCXN0cnVjdCBpZ3RfZmIgcmVxdWlyZWRfZmI7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCj4g Kwlzd2l0Y2ggKG1vZGUpIHsKPiArCWNhc2UgSU5URUxfTU9ERV9OT05FOgo+ICsJCWlndF9pbmZv KCJOT05FXHJcbiIpOwo+ICsJCXJldCA9IGRybU1vZGVTZXRDcnRjKGRybV9mZCwgdGVzdF9jb25u ZWN0b3ItPmNydGMsCj4gKwkJCQkgICAgIC0xLCAwLCAwLCBOVUxMLCAwLCBOVUxMKTsKPiArCQln b3RvIG91dDsKPiArCWNhc2UgSU5URUxfTU9ERV9QUkVGRVJSRUQ6Cj4gKwkJaWd0X2luZm8oIlBS RUZFUlJFRFxyXG4iKTsKPiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1v ZGVfcHJlZmVycmVkOwo+ICsJCXJlcXVpcmVkX2ZiX2lkID0gdGVzdF9jb25uZWN0b3ItPmZiOwo+ ICsJCXJlcXVpcmVkX2ZiID0gdGVzdF9jb25uZWN0b3ItPmZiX3ZpZGVvX3BhdHRlcm47Cj4gKwkJ YnJlYWs7Cj4gKwljYXNlIElOVEVMX01PREVfU1RBTkRBUkQ6Cj4gKwkJaWd0X2luZm8oIlNUQU5E QVJEXHJcbiIpOwo+ICsJCXJlcXVlc3RlZF9tb2RlID0gICZ0ZXN0X2Nvbm5lY3Rvci0+bW9kZV9z dGFuZGFyZDsKPiArCQlyZXF1aXJlZF9mYl9pZCA9IHRlc3RfY29ubmVjdG9yLT5mYjsKPiArCQly ZXF1aXJlZF9mYiA9IHRlc3RfY29ubmVjdG9yLT5mYl92aWRlb19wYXR0ZXJuOwo+ICsJCWJyZWFr Owo+ICsJY2FzZSBJTlRFTF9NT0RFX0ZBSUxTQUZFOgo+ICsJCWlndF9pbmZvKCJGQUlMU0FGRVxy XG4iKTsKPiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICAmdGVzdF9jb25uZWN0b3ItPm1vZGVfZmFpbHNh ZmU7Cj4gKwkJcmVxdWlyZWRfZmJfaWQgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmFpbHNhZmVfZmI7Cj4g KwkJcmVxdWlyZWRfZmIgPSB0ZXN0X2Nvbm5lY3Rvci0+ZmJfZmFpbHNhZmVfcGF0dGVybjsKPiAr CQlicmVhazsKPiArCWNhc2UgSU5URUxfTU9ERV9WSURFT19QQVRURVJOX1RFU1Q6Cj4gKwkJaWd0 X2luZm8oIlZJREVPIFBBVFRFUk4gVEVTVFxyXG4iKTsKPiArCQlyZXF1ZXN0ZWRfbW9kZSA9ICZ0 ZXN0X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLm1vZGU7Cj4gKwkJcmVxdWlyZWRfZmJfaWQgPSB0 ZXN0X2Nvbm5lY3Rvci0+dGVzdF9wYXR0ZXJuLmZiOwo+ICsJCXJlcXVpcmVkX2ZiID0gdGVzdF9j b25uZWN0b3ItPnRlc3RfcGF0dGVybi5mYl9wYXR0ZXJuOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBJ TlRFTF9NT0RFX0lOVkFMSUQ6Cj4gKwlkZWZhdWx0Ogo+ICsJCWlndF93YXJuKCJJTlZBTElEISAo JTA4eCkgTW9kZSBzZXQgYWJvcnRlZCFcclxuIiwgbW9kZSk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJ fQo+ICsKPiArCWlndF9pbmZvKCJDUlRDKCV1KToiLCB0ZXN0X2Nvbm5lY3Rvci0+Y3J0Yyk7Cj4g KwlrbXN0ZXN0X2R1bXBfbW9kZShyZXF1ZXN0ZWRfbW9kZSk7Cj4gKwlyZXQgPSBkcm1Nb2RlU2V0 Q3J0Yyhkcm1fZmQsIHRlc3RfY29ubmVjdG9yLT5jcnRjLCByZXF1aXJlZF9mYl9pZCwgMCwgMCwK PiArCQkJICAgICAmdGVzdF9jb25uZWN0b3ItPmlkLCAxLCByZXF1ZXN0ZWRfbW9kZSk7Cj4gKwlp ZiAocmV0KSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBzZXQgbW9kZSAoJWR4JWRAJWRIeik6 ICVzXG4iLAo+ICsJCQkgcmVxdWVzdGVkX21vZGUtPmhkaXNwbGF5LCByZXF1ZXN0ZWRfbW9kZS0+ dmRpc3BsYXksCj4gKwkJCSByZXF1ZXN0ZWRfbW9kZS0+dnJlZnJlc2gsIHN0cmVycm9yKGVycm5v KSk7Cj4gKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZyZXF1aXJlZF9mYik7Cj4gKwo+ICsJfQo+ ICsJLyogS2VlcCB0aGUgcGF0dGVybiBvbiBvdXRwdXQgbGluZXMgZm9yIGF0bGVhc3QgMC41IHNl Y3MgZm9yCj4gKwkgKiBEUFItMTIwIHRvIGRldGVjdCBpdC4KPiArCSAqLwo+ICsJdXNsZWVwKDEw MDAwMDApOwo+ICsKPiArb3V0Ogo+ICsJaWYgKHJldCkgewo+ICsJCWlndF93YXJuKCJGYWlsZWQg dG8gc2V0IENSVEMgZm9yIGNvbm5lY3RvciAldVxyXG4iLAo+ICsJCQkgdGVzdF9jb25uZWN0b3It PmlkKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50Cj4g K3NldF9kZWZhdWx0X21vZGUoc3RydWN0IGNvbm5lY3RvciAqYykKPiArewo+ICsJdW5zaWduZWQg aW50IGZiX2lkID0gMDsKPiArCXN0cnVjdCBpZ3RfZmIgZmJfaW5mbzsKPiArCWludCByZXQgPSAw Owo+ICsKPiArCWMtPm1vZGUgPSBjLT5jb25uZWN0b3ItPm1vZGVzWzBdOwo+ICsKPiArCWlmICgh Yy0+bW9kZV92YWxpZCkKPiArCQlyZXR1cm4gLTE7Cj4gKwo+ICsJd2lkdGggPSBjLT5tb2RlLmhk aXNwbGF5Owo+ICsJaGVpZ2h0ID0gYy0+bW9kZS52ZGlzcGxheTsKPiArCj4gKwlmYl9pZCA9IGln dF9jcmVhdGVfcGF0dGVybl9mYihkcm1fZmQsIHdpZHRoLCBoZWlnaHQsCj4gKwkJCQkgICAgICBE Uk1fRk9STUFUX1hSR0I4ODg4LAo+ICsJCQkJICAgICAgdGlsaW5nLCAmZmJfaW5mbyk7Cj4gKwo+ ICsJaWd0X2luZm8oIkNSVEMoJXUpOlslZF0iLCBjLT5jcnRjLCAwKTsKPiArCWttc3Rlc3RfZHVt cF9tb2RlKCZjLT5tb2RlKTsKPiArCWRybU1vZGVTZXRDcnRjKGRybV9mZCwgYy0+Y3J0YywgLTEs IDAsIDAsIE5VTEwsIDAsIE5VTEwpOwo+ICsJcmV0ID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBj LT5jcnRjLCBmYl9pZCwgMCwgMCwKPiArCQkJICAgICAmYy0+aWQsIDEsICZjLT5tb2RlKTsKPiAr CWlmIChyZXQpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIHNldCBtb2RlICglZHglZEAlZEh6 KTogJXNcbiIsIHdpZHRoLCBoZWlnaHQsIGMtPm1vZGUudnJlZnJlc2gsIHN0cmVycm9yKGVycm5v KSk7Cj4gKwkJaWd0X3JlbW92ZV9mYihkcm1fZmQsICZmYl9pbmZvKTsKPiArCj4gKwl9Cj4gKwo+ ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoKPiArICogUmUtcHJvYmUgY29ubmVjdG9ycyBh bmQgZG8gYSBtb2Rlc2V0IGJhc2VkIG9uIHRlc3QgcmVxdWVzdCBvcgo+ICsgKiBpbiBjYXNlIG9m IGEgaG90cGx1ZyB1ZXZlbnQuCj4gKyAqCj4gKyAqIEBtb2RlOiBWaWRlbyBtb2RlIHJlcXVlc3Rl ZCBieSB0aGUgdGVzdAo+ICsgKiBAaXNfY29tcGxpYW5jZV90ZXN0OiAxOiBJZiBpdCBpcyBhIGNv bXBsaWFuY2UgdGVzdAo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAwOiBJZiBpdCBpcyBhIGhv dHBsdWcgZXZlbnQKPiArICoKPiArICogUmV0dXJuczoKPiArICogMDogT24gU3VjY2Vzcwo+ICsg KiAtMTogT24gZmFpbHVyZQo+ICsgKi8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGludCBtb2RlLCBi b29sIGlzX2NvbXBsaWFuY2VfdGVzdCkKPiArewo+ICsJc3RydWN0IGNvbm5lY3RvciAqY29ubmVj dG9yczsKPiArCWludCBjLCByZXQgPSAwOwo+ICsJdW5zaWduZWQgbG9uZyBjcnRjX2lkeF9tYXNr ID0gLTFVTDsKPiArCj4gKwlyZXNvdXJjZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRybV9mZCk7 Cj4gKwlpZiAoIXJlc291cmNlcykgewo+ICsJCWlndF93YXJuKCJkcm1Nb2RlR2V0UmVzb3VyY2Vz IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ ICsKPiArCWNvbm5lY3RvcnMgPSBjYWxsb2MocmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzLAo+ ICsJCQkgICAgc2l6ZW9mKHN0cnVjdCBjb25uZWN0b3IpKTsKPiArCWlmICghY29ubmVjdG9ycykK PiArCQlyZXR1cm4gLTE7Cj4gKwo+ICsJLyogRmluZCBhbnkgY29ubmVjdGVkIGRpc3BsYXlzICov Cj4gKwlmb3IgKGMgPSAwOyBjIDwgcmVzb3VyY2VzLT5jb3VudF9jb25uZWN0b3JzOyBjKyspIHsK PiArCj4gKwkJc3RydWN0IGNvbm5lY3RvciAqY29ubmVjdG9yID0gJmNvbm5lY3RvcnNbY107Cj4g Kwo+ICsJCWNvbm5lY3Rvci0+aWQgPSByZXNvdXJjZXMtPmNvbm5lY3RvcnNbY107Cj4gKwkJY29u bmVjdG9yX2ZpbmRfcHJlZmVycmVkX21vZGUoY29ubmVjdG9yLT5pZCwKPiArCQkJCQkgICAgICBj cnRjX2lkeF9tYXNrLAo+ICsJCQkJCSAgICAgIGNvbm5lY3Rvcik7Cj4gKwkJaWYgKCFjb25uZWN0 b3ItPm1vZGVfdmFsaWQpCj4gKwkJCWNvbnRpbnVlOwo+ICsJCWlmIChpc19jb21wbGlhbmNlX3Rl c3QpIHsKPiArCQkJc2V0X3Rlc3RfbW9kZShjb25uZWN0b3IpOwo+ICsJCQlyZXQgPSBzZXRfdmlk ZW8oSU5URUxfTU9ERV9OT05FLCBjb25uZWN0b3IpOwo+ICsJCQlyZXQgPSBzZXRfdmlkZW8obW9k ZSwgY29ubmVjdG9yKTsKPiArCj4gKwkJfSBlbHNlCj4gKwkJCXJldCA9IHNldF9kZWZhdWx0X21v ZGUoY29ubmVjdG9yKTsKPiArCj4gKwkJY3J0Y19pZHhfbWFzayAmPSB+KDEgPDwgY29ubmVjdG9y LT5waXBlKTsKPiArCj4gKwkJZHJtTW9kZUZyZWVFbmNvZGVyKGNvbm5lY3Rvci0+ZW5jb2Rlcik7 Cj4gKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yLT5jb25uZWN0b3IpOwo+ICsKPiAr CX0KPiArCj4gKwkvKiBFcnJvciBjb25kaXRpb24gaWYgbm8gY29ubmVjdGVkIGRpc3BsYXlzICov Cj4gKwo+ICsJZnJlZShjb25uZWN0b3JzKTsKPiArCWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlc291 cmNlcyk7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3QgY2hhciBvcHRz dHJbXSA9ICJoaSI7Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikp IHVzYWdlKGNoYXIgKm5hbWUsIGNoYXIgb3B0KQo+ICt7Cj4gKwlpZ3RfaW5mbygidXNhZ2U6ICVz IFstaGldXG4iLCBuYW1lKTsKPiArCWlndF9pbmZvKCJcdC1pXHRkdW1wIGluZm9cbiIpOwo+ICsJ aWd0X2luZm8oIlx0RGVmYXVsdCBpcyB0byByZXNwb25kIHRvIERQUi0xMjAgdGVzdHMuXG4iKTsK PiArCWV4aXQoKG9wdCAhPSAnaCcpID8gLTEgOiAwKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg Y2xlYW51cF9kZWJ1Z2ZzKHZvaWQpCj4gK3sKPiArCWZjbG9zZSh0ZXN0X2FjdGl2ZV9mcCk7Cj4g KwlmY2xvc2UodGVzdF9kYXRhX2ZwKTsKPiArCWZjbG9zZSh0ZXN0X3R5cGVfZnApOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGNsZWFudXBfYW5kX2V4 aXQoaW50IHJldCkKPiArewo+ICsJY2xlYW51cF9kZWJ1Z2ZzKCk7Cj4gKwljbG9zZShkcm1fZmQp Owo+ICsJaWd0X2luZm8oIkNvbXBsaWFuY2UgdGVzdGluZyBBcHBsaWNhdGlvbiBFeGl0aW5nXG4i KTsKPiArCWV4aXQocmV0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgY2xlYW51cF90ZXN0KHZv aWQpCj4gK3sKPiArCXZpZGVvX3BhdHRlcm5fZmxhZyA9IGZhbHNlOwo+ICsJaGRpc3BsYXkgPSAw Owo+ICsJdmRpc3BsYXkgPSAwOwo+ICsJYml0ZGVwdGggPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCByZWFkX3Rlc3RfcmVxdWVzdCh2b2lkKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3Rf dHlwZTsKPiArCj4gKwl0ZXN0X3R5cGUgPSBnZXRfdGVzdF90eXBlKCk7Cj4gKwlwcm9jZXNzX3Rl c3RfcmVxdWVzdCh0ZXN0X3R5cGUpOwo+ICsJY2xlYW51cF90ZXN0KCk7Cj4gKwljbGVhcl90ZXN0 X2FjdGl2ZSgpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgZ2Jvb2xlYW4gdGVzdF9oYW5kbGVyKEdJT0No YW5uZWwgKnNvdXJjZSwgR0lPQ29uZGl0aW9uIGNvbmRpdGlvbiwKPiArCQkJICAgICBncG9pbnRl ciBkYXRhKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIHRlc3RfYWN0aXZlOwo+ICsKPiArCXJld2lu ZCh0ZXN0X2FjdGl2ZV9mcCk7Cj4gKwlmc2NhbmYodGVzdF9hY3RpdmVfZnAsICIlbHgiLCAmdGVz dF9hY3RpdmUpOwo+ICsJaWYgKHRlc3RfYWN0aXZlKQo+ICsJCXJlYWRfdGVzdF9yZXF1ZXN0KCk7 Cj4gKwlyZXR1cm4gVFJVRTsKPiArfQo+ICsKPiArc3RhdGljIGdib29sZWFuIGlucHV0X2V2ZW50 KEdJT0NoYW5uZWwgKnNvdXJjZSwgR0lPQ29uZGl0aW9uIGNvbmRpdGlvbiwKPiArCQkJCWdwb2lu dGVyIGRhdGEpCj4gK3sKPiArCWdjaGFyIGJ1ZlsyXTsKPiArCWdzaXplIGNvdW50Owo+ICsKPiAr CWNvdW50ID0gcmVhZChnX2lvX2NoYW5uZWxfdW5peF9nZXRfZmQoc291cmNlKSwgYnVmLCBzaXpl b2YoYnVmKSk7Cj4gKwlpZiAoYnVmWzBdID09ICdxJyAmJiAoY291bnQgPT0gMSB8fCBidWZbMV0g PT0gJ1xuJykpIHsKPiArCQljbGVhbnVwX2FuZF9leGl0KDApOwo+ICsJfQo+ICsKPiArCXJldHVy biBUUlVFOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBlbnRlcl9leGVjX3BhdGgoY2hhciAqKmFy Z3YpCj4gK3sKPiArCWNoYXIgKmV4ZWNfcGF0aCA9IE5VTEw7Cj4gKwljaGFyICpwb3MgPSBOVUxM Owo+ICsJc2hvcnQgbGVuX3BhdGggPSAwOwo+ICsJaW50IHJldDsKPiArCj4gKwlsZW5fcGF0aCA9 IHN0cmxlbihhcmd2WzBdKTsKPiArCWV4ZWNfcGF0aCA9IChjaGFyICopIG1hbGxvYyhsZW5fcGF0 aCk7Cj4gKwo+ICsJbWVtY3B5KGV4ZWNfcGF0aCwgYXJndlswXSwgbGVuX3BhdGgpOwo+ICsJcG9z ID0gc3RycmNocihleGVjX3BhdGgsICcvJyk7Cj4gKwlpZiAocG9zICE9IE5VTEwpCj4gKwkJKihw b3MrMSkgPSAnXDAnOwo+ICsKPiArCXJldCA9IGNoZGlyKGV4ZWNfcGF0aCk7Cj4gKwlpZ3RfYXNz ZXJ0X2VxKHJldCwgMCk7Cj4gKwlmcmVlKGV4ZWNfcGF0aCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHJlc3RvcmVfdGVybWlvX21vZGUoaW50IHNpZykKPiArewo+ICsJdGNzZXRhdHRyKHRpb19m ZCwgVENTQU5PVywgJnNhdmVkX3Rpbyk7Cj4gKwljbG9zZSh0aW9fZmQpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBzZXRfdGVybWlvX21vZGUodm9pZCkKPiArewo+ICsJc3RydWN0IHRlcm1pb3Mg dGlvOwo+ICsKPiArCS8qIGRvbid0IGF0dGVtcHQgdG8gc2V0IHRlcm1pbmFsIGF0dHJpYnV0ZXMg aWYgbm90IGluIHRoZSBmb3JlZ3JvdW5kCj4gKwkgKiBwcm9jZXNzIGdyb3VwCj4gKwkgKi8KPiAr CWlmIChnZXRwZ3JwKCkgIT0gdGNnZXRwZ3JwKFNURE9VVF9GSUxFTk8pKQo+ICsJCXJldHVybjsK PiArCj4gKwl0aW9fZmQgPSBkdXAoU1RESU5fRklMRU5PKTsKPiArCXRjZ2V0YXR0cih0aW9fZmQs ICZzYXZlZF90aW8pOwo+ICsJaWd0X2luc3RhbGxfZXhpdF9oYW5kbGVyKHJlc3RvcmVfdGVybWlv X21vZGUpOwo+ICsJdGlvID0gc2F2ZWRfdGlvOwo+ICsJdGlvLmNfbGZsYWcgJj0gfihJQ0FOT04g fCBFQ0hPKTsKPiArCXRjc2V0YXR0cih0aW9fZmQsIFRDU0FOT1csICZ0aW8pOwo+ICt9Cj4gKwo+ ICtpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiArCWludCBjOwo+ICsJaW50 IHJldCA9IDA7Cj4gKwlHSU9DaGFubmVsICpzdGRpbmNoYW5uZWwsICp0ZXN0YWN0aXZlX2NoYW5u ZWw7Cj4gKwlHTWFpbkxvb3AgKm1haW5sb29wOwo+ICsJYm9vbCBvcHRfZHVtcF9pbmZvID0gZmFs c2U7Cj4gKwlzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewo+ICsJCXsiaGVscC1kZXNjcmlw dGlvbiIsIDAsIDAsIEhFTFBfREVTQ1JJUFRJT059LAo+ICsJCXsiaGVscCIsIDAsIDAsICdoJ30s Cj4gKwl9Owo+ICsKPiArCWlndF9za2lwX29uX3NpbXVsYXRpb24oKTsKPiArCj4gKwllbnRlcl9l eGVjX3BhdGgoYXJndik7Cj4gKwo+ICsJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJn diwgb3B0c3RyLCBsb25nX29wdHMsIE5VTEwpKSAhPSAtMSkgewo+ICsJCXN3aXRjaCAoYykgewo+ ICsJCWNhc2UgJ2knOgo+ICsJCQlvcHRfZHVtcF9pbmZvID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4g KwkJY2FzZSBIRUxQX0RFU0NSSVBUSU9OOgo+ICsJCQlpZ3RfaW5mbygiRFAgQ29tcGxpYW5jZSBU ZXN0IFN1aXRlIHVzaW5nIERQUi0xMjBcbiIpOwo+ICsJCQlpZ3RfaW5mbygiRURJRCBUZXN0c1xu Iik7Cj4gKwkJCWlndF9pbmZvKCJWaWRlbyBQYXR0ZXJuIEdlbmVyYXRpb24gVGVzdHNcbiIpOwo+ ICsJCQlleGl0KDApOwo+ICsJCQlicmVhazsKPiArCQlkZWZhdWx0Ogo+ICsJCQkvKiBmYWxsIHRo cm91Z2ggKi8KPiArCQljYXNlICdoJzoKPiArCQkJdXNhZ2UoYXJndlswXSwgYyk7Cj4gKwkJCWJy ZWFrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlzZXRfdGVybWlvX21vZGUoKTsKPiArCj4gKwlpZ3Rf aW5mbygiKioqKioqKioqKioqKkRQIENvbXBsaWFuY2UgVGVzdGluZyB1c2luZyBEUFItMTIwKioq KioqKioqKioqKlxuIik7Cj4gKwlpZ3RfaW5mbygiV2FpdGluZyBmb3IgVGVzdCBSZXF1ZXN0IElu cHV0Li4uLi4uXG4iKTsKPiArCWRybV9mZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfQU5ZKTsK PiArCj4gKwlpZiAob3B0X2R1bXBfaW5mbykgewo+ICsJCWR1bXBfaW5mbygpOwo+ICsJCWdvdG8g b3V0X2Nsb3NlOwo+ICsJfQo+ICsKPiArCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsK PiArCXNldHVwX2RlYnVnZnNfZmlsZXMoKTsKPiArCWNsZWFudXBfdGVzdCgpOwo+ICsKPiArCW1h aW5sb29wID0gZ19tYWluX2xvb3BfbmV3KE5VTEwsIEZBTFNFKTsKPiArCWlmICghbWFpbmxvb3Ap IHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBnbGliIG1haW5sb29wXG4iKTsKPiAr CQlyZXQgPSAtMTsKPiArCQlnb3RvIG91dF9jbG9zZTsKPiArCX0KPiArCj4gKwlpZiAoIWludGVs X2RwX2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1ZygpKSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0 byBpbml0aWFsaXplIGhvdHBsdWcgc3VwcG9ydFxuIik7Cj4gKwkJZ290byBvdXRfbWFpbmxvb3A7 Cj4gKwl9Cj4gKwo+ICsJdGVzdGFjdGl2ZV9jaGFubmVsID0gZ19pb19jaGFubmVsX3VuaXhfbmV3 KGZpbGVubyh0ZXN0X2FjdGl2ZV9mcCkpOwo+ICsJaWYgKCF0ZXN0YWN0aXZlX2NoYW5uZWwpIHsK PiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSBUZXN0IEFjdGl2ZSBHSU8gY2hhbm5lbFxu Iik7Cj4gKwkJZ290byBvdXRfY2xvc2U7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZ19pb19hZGRfd2F0 Y2godGVzdGFjdGl2ZV9jaGFubmVsLCBHX0lPX0lOIHwgR19JT19FUlIsIHRlc3RfaGFuZGxlciwK PiArCQkJICAgICBOVUxMKTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJaWd0X3dhcm4oImZhaWxl ZCB0byBhZGQgd2F0Y2ggb24gdWRldiBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290byBvdXRfY2xv c2U7Cj4gKwl9Cj4gKwo+ICsJc3RkaW5jaGFubmVsID0gZ19pb19jaGFubmVsX3VuaXhfbmV3KDAp Owo+ICsJaWYgKCFzdGRpbmNoYW5uZWwpIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0 ZSBzdGRpbiBHSU8gY2hhbm5lbFxuIik7Cj4gKwkJZ290byBvdXRfaG90cGx1ZzsKPiArCX0KPiAr Cj4gKwlyZXQgPSBnX2lvX2FkZF93YXRjaChzdGRpbmNoYW5uZWwsIEdfSU9fSU4gfCBHX0lPX0VS UiwgaW5wdXRfZXZlbnQsCj4gKwkJCSAgICAgTlVMTCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJ CWlndF93YXJuKCJmYWlsZWQgdG8gYWRkIHdhdGNoIG9uIHN0ZGluIEdJTyBjaGFubmVsXG4iKTsK PiArCQlnb3RvIG91dF9zdGRpbzsKPiArCX0KPiArCj4gKwlyZXQgPSAwOwo+ICsKPiArCWdfbWFp bl9sb29wX3J1bihtYWlubG9vcCk7Cj4gKwo+ICtvdXRfc3RkaW86Cj4gKwlnX2lvX2NoYW5uZWxf c2h1dGRvd24oc3RkaW5jaGFubmVsLCBUUlVFLCBOVUxMKTsKPiArb3V0X2hvdHBsdWc6Cj4gKwlp bnRlbF9kcF9jb21wbGlhbmNlX2NsZWFudXBfaG90cGx1ZygpOwo+ICtvdXRfbWFpbmxvb3A6Cj4g KwlnX21haW5fbG9vcF91bnJlZihtYWlubG9vcCk7Cj4gK291dF9jbG9zZToKPiArCWNsZWFudXBf ZGVidWdmcygpOwo+ICsJY2xvc2UoZHJtX2ZkKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2VxKHJldCwg MCk7Cj4gKwo+ICsJaWd0X2luZm8oIkNvbXBsaWFuY2UgdGVzdGluZyBhcHBsaWNhdGlvbiBleGl0 aW5nLlxuIik7Cj4gKwlpZ3RfZXhpdCgpOwo+ICt9Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVs X2RwX2NvbXBsaWFuY2UuaCBiL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2UuaAo+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uYWRlMWUyZgo+IC0tLSAvZGV2L251bGwKPiAr KysgYi90b29scy9pbnRlbF9kcF9jb21wbGlhbmNlLmgKPiBAQCAtMCwwICsxLDM1IEBACj4gKy8q Cj4gKyAqIENvcHlyaWdodCAyMDEwIEludGVsIENvcnBvcmF0aW9uCj4gKyAqIE1hbmFzaSBOYXZh cmUgPG1hbmFzaS5kLm5hdmFyZUBpbnRlbC5jb20+Cj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh Cj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdp dGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhl IHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUs IHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu ZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNo ZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+ICsgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiAr ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF IEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQo+ICsgKiBBVVRIT1JT IE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9S IE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKPiAr ICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ICsj aW5jbHVkZSA8c3RyaW5nLmg+Cj4gKyNpbmNsdWRlIDxzdGRsaWIuaD4KPiArI2luY2x1ZGUgPGds aWIuaD4KPiArCj4gK2V4dGVybiBpbnQgZHJtX2ZkOwo+ICsKPiArZ2Jvb2xlYW4gaW50ZWxfZHBf Y29tcGxpYW5jZV9zZXR1cF9ob3RwbHVnKHZvaWQpOwo+ICt2b2lkIGludGVsX2RwX2NvbXBsaWFu Y2VfY2xlYW51cF9ob3RwbHVnKHZvaWQpOwo+ICsKPiArLyogY2FsbGVkIGJ5IHRoZSBob3RwbHVn IGNvZGUgKi8KPiAraW50IHVwZGF0ZV9kaXNwbGF5KGludCBtb2RlLCBib29sIGlzX2NvbXBsaWFu Y2VfdGVzdCk7Cj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2RwX2NvbXBsaWFuY2VfaG90cGx1 Zy5jIGIvdG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKPiBuZXcgZmlsZSBtb2Rl IDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmQ0ODkwMjYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIv dG9vbHMvaW50ZWxfZHBfY29tcGxpYW5jZV9ob3RwbHVnLmMKPiBAQCAtMCwwICsxLDEyMyBAQAo+ ICsvKgo+ICsgKiBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKiAgIEplc3Nl IEJhcm5lcyA8amVzc2UuYmFybmVzQGludGVsLmNvbT4KPiArICoKPiArICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRp b24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUg d2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+ICsgKiB0 aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0 ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwg YW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5p c2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gKyAq Cj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90 aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCj4gKyAqIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKPiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFD VCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENP Tk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImlndC5oIgo+ICsj aW5jbHVkZSA8c3RkaW8uaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8c3Rk bGliLmg+Cj4gKwo+ICsjaW5jbHVkZSA8c3lzL3N0YXQuaD4KPiArCj4gKyNpbmNsdWRlICJpbnRl bF9kcF9jb21wbGlhbmNlLmgiCj4gKyNpbmNsdWRlIDxsaWJ1ZGV2Lmg+Cj4gK3N0YXRpYyBzdHJ1 Y3QgdWRldl9tb25pdG9yICp1ZXZlbnRfbW9uaXRvcjsKPiArc3RhdGljIHN0cnVjdCB1ZGV2ICp1 ZGV2Owo+ICtzdGF0aWMgR0lPQ2hhbm5lbCAqdWRldmNoYW5uZWw7Cj4gKwo+ICtzdGF0aWMgZ2Jv b2xlYW4gaG90cGx1Z19ldmVudChHSU9DaGFubmVsICpzb3VyY2UsIEdJT0NvbmRpdGlvbiBjb25k aXRpb24sCj4gKwkJCSAgICAgIGdwb2ludGVyIGRhdGEpCj4gK3sKPiArCXN0cnVjdCB1ZGV2X2Rl dmljZSAqZGV2Owo+ICsJZGV2X3QgdWRldl9kZXZudW07Cj4gKwlzdHJ1Y3Qgc3RhdCBzOwo+ICsJ Y29uc3QgY2hhciAqaG90cGx1ZzsKPiArCj4gKwlkZXYgPSB1ZGV2X21vbml0b3JfcmVjZWl2ZV9k ZXZpY2UodWV2ZW50X21vbml0b3IpOwo+ICsJaWYgKCFkZXYpCj4gKwkJZ290byBvdXQ7Cj4gKwo+ ICsJdWRldl9kZXZudW0gPSB1ZGV2X2RldmljZV9nZXRfZGV2bnVtKGRldik7Cj4gKwlmc3RhdChk cm1fZmQsICZzKTsKPiArCj4gKwlob3RwbHVnID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnR5X3Zh bHVlKGRldiwgIkhPVFBMVUciKTsKPiArCj4gKwlpZiAobWVtY21wKCZzLnN0X3JkZXYsICZ1ZGV2 X2Rldm51bSwgc2l6ZW9mKGRldl90KSkgPT0gMCAmJgo+ICsJICAgIGhvdHBsdWcgJiYgYXRvaSho b3RwbHVnKSA9PSAxKQo+ICsJCXVwZGF0ZV9kaXNwbGF5KDAsIGZhbHNlKTsKPiArCj4gKwl1ZGV2 X2RldmljZV91bnJlZihkZXYpOwo+ICtvdXQ6Cj4gKwlyZXR1cm4gVFJVRTsKPiArfQo+ICsKPiAr Cj4gK2dib29sZWFuIGludGVsX2RwX2NvbXBsaWFuY2Vfc2V0dXBfaG90cGx1Zyh2b2lkKQo+ICt7 Cj4gKwlpbnQgcmV0Owo+ICsKPiArCXVkZXYgPSB1ZGV2X25ldygpOwo+ICsJaWYgKCF1ZGV2KSB7 Cj4gKwkJaWd0X3dhcm4oImZhaWxlZCB0byBjcmVhdGUgdWRldiBvYmplY3RcbiIpOwo+ICsJCWdv dG8gb3V0Owo+ICsJfQo+ICsKPiArCXVldmVudF9tb25pdG9yID0gdWRldl9tb25pdG9yX25ld19m cm9tX25ldGxpbmsodWRldiwgInVkZXYiKTsKPiArCWlmICghdWV2ZW50X21vbml0b3IpIHsKPiAr CQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IGV2ZW50IG1vbml0b3JcbiIpOwo+ICsJ CWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCXJldCA9IHVkZXZfbW9uaXRvcl9maWx0ZXJfYWRkX21h dGNoX3N1YnN5c3RlbV9kZXZ0eXBlKHVldmVudF9tb25pdG9yLAo+ICsJCQkJCQkJICAgICAgImRy bSIsCj4gKwkJCQkJCQkgICAgICAiZHJtX21pbm9yIik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJ CWlndF93YXJuKCJmYWlsZWQgdG8gZmlsdGVyIGZvciBkcm0gZXZlbnRzXG4iKTsKPiArCQlnb3Rv IG91dDsKPiArCX0KPiArCj4gKwlyZXQgPSB1ZGV2X21vbml0b3JfZW5hYmxlX3JlY2VpdmluZyh1 ZXZlbnRfbW9uaXRvcik7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWlndF93YXJuKCJmYWlsZWQg dG8gZW5hYmxlIHVkZXYgZXZlbnQgcmVjZXB0aW9uXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0K PiArCj4gKwl1ZGV2Y2hhbm5lbCA9Cj4gKwkJZ19pb19jaGFubmVsX3VuaXhfbmV3KHVkZXZfbW9u aXRvcl9nZXRfZmQodWV2ZW50X21vbml0b3IpKTsKPiArCWlmICghdWRldmNoYW5uZWwpIHsKPiAr CQlpZ3Rfd2FybigiZmFpbGVkIHRvIGNyZWF0ZSB1ZGV2IEdJTyBjaGFubmVsXG4iKTsKPiArCQln b3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXQgPSBnX2lvX2FkZF93YXRjaCh1ZGV2Y2hhbm5lbCwg R19JT19JTiB8IEdfSU9fRVJSLCBob3RwbHVnX2V2ZW50LAo+ICsJCQkgICAgIHVkZXYpOwo+ICsJ aWYgKHJldCA8IDApIHsKPiArCQlpZ3Rfd2FybigiZmFpbGVkIHRvIGFkZCB3YXRjaCBvbiB1ZGV2 IEdJTyBjaGFubmVsXG4iKTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKwlyZXR1cm4gVFJV RTsKPiArCj4gK291dDoKPiArCWludGVsX2RwX2NvbXBsaWFuY2VfY2xlYW51cF9ob3RwbHVnKCk7 Cj4gKwlyZXR1cm4gRkFMU0U7Cj4gK30KPiArCj4gK3ZvaWQgaW50ZWxfZHBfY29tcGxpYW5jZV9j bGVhbnVwX2hvdHBsdWcodm9pZCkKPiArewo+ICsJaWYgKHVkZXZjaGFubmVsKQo+ICsJCWdfaW9f Y2hhbm5lbF9zaHV0ZG93bih1ZGV2Y2hhbm5lbCwgVFJVRSwgTlVMTCk7Cj4gKwlpZiAodWV2ZW50 X21vbml0b3IpCj4gKwkJdWRldl9tb25pdG9yX3VucmVmKHVldmVudF9tb25pdG9yKTsKPiArCWlm ICh1ZGV2KQo+ICsJCXVkZXZfdW5yZWYodWRldik7Cj4gK30KPiAtLSAKPiAxLjkuMQo+IApfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFp bGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK