From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Goel, Sameer" Subject: Re: [RFC v2 7/7] xen/iommu: smmu-v3: Add Xen specific code to enable the ported driver Date: Sun, 19 Nov 2017 00:45:30 -0700 Message-ID: References: <1505954230-18892-1-git-send-email-sgoel@codeaurora.org> <1505954230-18892-8-git-send-email-sgoel@codeaurora.org> <4c554d39-4419-07e6-5acc-208ed072744b@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eGKIO-0005Es-FS for xen-devel@lists.xenproject.org; Sun, 19 Nov 2017 07:45:41 +0000 In-Reply-To: <4c554d39-4419-07e6-5acc-208ed072744b@linaro.org> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Julien Grall , xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Cc: sstabellini@kernel.org, wei.liu2@citrix.com, george.dunlap@eu.citrix.com, Andrew.Cooper3@citrix.com, jbeulich@suse.com, Ian.Jackson@citrix.com, nd@arm.com, robin.murphy@arm.com, shankerd@codeaurora.org List-Id: xen-devel@lists.xenproject.org CgpPbiAxMC8xMi8yMDE3IDEwOjM2IEFNLCBKdWxpZW4gR3JhbGwgd3JvdGU6Cj4gSGkgU2FtZWVy LAo+IAo+IEdpdmVuIHRoaXMgaXMgYWxsIEFybSBzcGVjaWZpYy4gSSBhbSBub3Qgc3VyZSB3aHkg cGVvcGxlIGxpa2UgQW5kcmV3LCBKYW4gaGF2ZSBiZWVuIGFkZGVkLgo+IAo+IFBsZWFzZSB1c2Ug c2NyaXB0cy9nZXRfbWFpbnRhaW5lcnMgdG8gZmluZCB0aGUgbGlzdCBvZiBtYWludGFpbmVycyBw ZXIgcGF0Y2hlcyBhbmQgYXZvaWQgdG8gQ0MgYWxsIG9mIHRoZW0gb24gZWFjaCBwYXRjaGVzLgpP ay4KCj4gCj4gT24gMjEvMDkvMTcgMDE6MzcsIFNhbWVlciBHb2VsIHdyb3RlOgo+PiBUaGlzIGRy aXZlciBmb2xsb3dzIGFuIGFwcHJvYWNoIHNpbWlsYXIgdG8gc21tdSBkcml2ZXIuIFRoZSBpbnRl bnQgaGVyZQo+PiBpcyB0byByZXVzZSBhcyBtdWNoIExpbnV4IGNvZGUgYXMgcG9zc2libGUuCj4+ IC0gR2x1ZSBjb2RlIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gYnJpZGdlIHRoZSBBUEkgY2FsbHMu Cj4+IC0gQ2FsbGVkIExpbnV4IGZ1bmN0aW9ucyBmcm9tIHRoZSBYZW4gSU9NTVUgZnVuY3Rpb24g Y2FsbHMuCj4+IC0gWGVuIG1vZGlmaWNhdGlvbnMgYXJlIHByZWNlZGVkIGJ5IC8qWGVuOiBjb21t ZW50ICovCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFNhbWVlciBHb2VsIDxzZ29lbEBjb2RlYXVyb3Jh Lm9yZz4KPj4gLS0tCj4+IMKgIHhlbi9kcml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9NYWtlZmlsZcKg IHzCoMKgIDEgKwo+PiDCoCB4ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jIHwg ODUzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0KPiAKPiBUaGlzIGlzIGJhc2Vk IG9uIGFuIG9sZCBTTU1VdjMgdmVyc2lvbiBhbmQgSSBoYXZlIGJlZW4gdG9sZCB0aGVyZSBhcmUg c29tZSBjaGFuZ2VzIG1heSBiZW5lZml0cyBYZW4gKHN1Y2ggYXMgaW5jcmVhc2luZyB0aGUgdGlt ZW91dCBmb3Igc3luYykgYW5kIHNvbWUgb3B0aW1pc2F0aW9ucyBhbHNvIGV4aXN0IG9uIHRoZSBN TCBhbmQgd2lsbCBiZSBxdWV1ZWQgc29vbi4KPiAKPiBTbyBtYXliZSB5b3Ugd2FudCB0byByZS1z eW5jIGF0IGxlYXN0IHRvIG1hc3Rlci4KPiAKPj4gwqAgMiBmaWxlcyBjaGFuZ2VkLCA3MzggaW5z ZXJ0aW9ucygrKSwgMTE2IGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEveGVuL2RyaXZl cnMvcGFzc3Rocm91Z2gvYXJtL01ha2VmaWxlIGIveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gvYXJt L01ha2VmaWxlCj4+IGluZGV4IGY0Y2QyNmUuLjU3YTZkYTYgMTAwNjQ0Cj4+IC0tLSBhL3hlbi9k cml2ZXJzL3Bhc3N0aHJvdWdoL2FybS9NYWtlZmlsZQo+PiArKysgYi94ZW4vZHJpdmVycy9wYXNz dGhyb3VnaC9hcm0vTWFrZWZpbGUKPj4gQEAgLTEsMiArMSwzIEBACj4+IMKgIG9iai15ICs9IGlv bW11Lm8KPj4gwqAgb2JqLXkgKz0gc21tdS5vCj4+ICtvYmoteSArPSBzbW11LXYzLm8KPiAKPiBE byB3ZSB3YW50IFNNTVV2MyB0byBiZSBidWlsdCBvbiBBcm0zMj8gTWF5YmUgd2Ugc2hvdWxkIGlu dHJvZHVjZSBhIG5ldyBLY29uZmlnIHRvIGxldCB0aGUgdXNlciBzZWxlY3QuCkFncmVlZC4gSSB3 aWxsIGRlZmluZSBhIENPTkZJR19BUk1fU01NVV9WMy4KCj4gCj4+IGRpZmYgLS1naXQgYS94ZW4v ZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jIGIveGVuL2RyaXZlcnMvcGFzc3Rocm91 Z2gvYXJtL3NtbXUtdjMuYwo+PiBpbmRleCAzODA5NjlhLi44ZjNiNDNkIDEwMDY0NAo+PiAtLS0g YS94ZW4vZHJpdmVycy9wYXNzdGhyb3VnaC9hcm0vc21tdS12My5jCj4+ICsrKyBiL3hlbi9kcml2 ZXJzL3Bhc3N0aHJvdWdoL2FybS9zbW11LXYzLmMKPj4gQEAgLTE4LDI4ICsxOCwyNjYgQEAKPj4g wqDCoCAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+Cj4+IMKgwqAg Kgo+PiDCoMKgICogVGhpcyBkcml2ZXIgaXMgcG93ZXJlZCBieSBiYWQgY29mZmVlIGFuZCBib21i YXkgbWl4Lgo+PiArICoKPj4gKyAqCj4+ICsgKiBCYXNlZCBvbiBMaW51eCBkcml2ZXJzL2lvbW11 L2FybS1zbW11LXYzLmMKPj4gKyAqID0+IGNvbW1pdCBiZGY5NTkyMzA4NmZiMzU5Y2NiNDRjODE1 NzI0YzNhY2UxNjExYzkwCj4+ICsgKgo+PiArICogWGVuIG1vZGlmaWNhdGlvbnM6Cj4+ICsgKiBT YW1lZXIgR29lbCA8c2dvZWxAY29kZWF1cm9yYS5vcmc+Cj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MTcsIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBBbGwgcmlnaHRzIHJlc2VydmVkLgo+PiArICoKPj4g wqDCoCAqLwo+PiDCoCAtI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPj4gLSNpbmNsdWRlIDxsaW51 eC9hY3BpX2lvcnQuaD4KPj4gLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+PiAtI2luY2x1ZGUg PGxpbnV4L2RtYS1pb21tdS5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+PiAtI2luY2x1 ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+Cj4+IC0j aW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4+IC0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ IC0jaW5jbHVkZSA8bGludXgvbXNpLmg+Cj4+IC0jaW5jbHVkZSA8bGludXgvb2YuaD4KPj4gLSNp bmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+Cj4+IC0jaW5jbHVkZSA8bGludXgvb2ZfaW9tbXUu aD4KPj4gLSNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4 L3BjaS5oPgo+PiAtI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+PiAtCj4+IC0j aW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KPj4gLQo+PiAtI2luY2x1ZGUgImlvLXBndGFibGUu aCIKPj4gKyNpbmNsdWRlIDx4ZW4vY29uZmlnLmg+Cj4gCj4gVGhpcyBpcyBub3QgbmVjZXNzYXJ5 Lgo+IAo+PiArI2luY2x1ZGUgPHhlbi9kZWxheS5oPgo+PiArI2luY2x1ZGUgPHhlbi9lcnJuby5o Pgo+PiArI2luY2x1ZGUgPHhlbi9lcnIuaD4KPj4gKyNpbmNsdWRlIDx4ZW4vaXJxLmg+Cj4+ICsj aW5jbHVkZSA8eGVuL2xpYi5oPgo+PiArI2luY2x1ZGUgPHhlbi9saXN0Lmg+Cj4+ICsjaW5jbHVk ZSA8eGVuL21tLmg+Cj4+ICsjaW5jbHVkZSA8eGVuL3ZtYXAuaD4KPj4gKyNpbmNsdWRlIDx4ZW4v cmJ0cmVlLmg+Cj4+ICsjaW5jbHVkZSA8eGVuL3NjaGVkLmg+Cj4+ICsjaW5jbHVkZSA8eGVuL3Np emVzLmg+Cj4+ICsjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgo+PiArI2luY2x1ZGUgPGFzbS9kZXZp Y2UuaD4KPj4gKyNpbmNsdWRlIDxhc20vaW8uaD4KPj4gKyNpbmNsdWRlIDxhc20vcGxhdGZvcm0u aD4KPj4gKyNpbmNsdWRlIDx4ZW4vYWNwaS5oPgo+IAo+IFBsZWFzZSBvcmRlciB0aGUgaW5jbHVk ZXMgYWxwaGFiZXRpY2FsbHkgd2l0aCB4ZW4vKiBmaXJzdCB0aGVuIGFzbS8qCgpEb25lLgo+IAo+ PiArCj4+ICt0eXBlZGVmIHBhZGRyX3QgcGh5c19hZGRyX3Q7Cj4+ICt0eXBlZGVmIHBhZGRyX3Qg ZG1hX2FkZHJfdDsKPj4gKwo+PiArLyogQWxpYXMgdG8gWGVuIGRldmljZSB0cmVlIGhlbHBlcnMg Ki8KPj4gKyNkZWZpbmUgZGV2aWNlX25vZGUgZHRfZGV2aWNlX25vZGUKPj4gKyNkZWZpbmUgb2Zf cGhhbmRsZV9hcmdzIGR0X3BoYW5kbGVfYXJncwo+PiArI2RlZmluZSBvZl9kZXZpY2VfaWQgZHRf ZGV2aWNlX21hdGNoCj4+ICsjZGVmaW5lIG9mX21hdGNoX25vZGUgZHRfbWF0Y2hfbm9kZQo+PiAr I2RlZmluZSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgcG5hbWUsIG91dCkgKCFkdF9wcm9wZXJ0 eV9yZWFkX3UzMihucCwgcG5hbWUsIG91dCkpCj4+ICsjZGVmaW5lIG9mX3Byb3BlcnR5X3JlYWRf Ym9vbCBkdF9wcm9wZXJ0eV9yZWFkX2Jvb2wKPj4gKyNkZWZpbmUgb2ZfcGFyc2VfcGhhbmRsZV93 aXRoX2FyZ3MgZHRfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MKPj4gKyNkZWZpbmUgbXV0ZXggc3Bp bmxvY2tfdAo+PiArI2RlZmluZSBtdXRleF9pbml0IHNwaW5fbG9ja19pbml0Cj4+ICsjZGVmaW5l IG11dGV4X2xvY2sgc3Bpbl9sb2NrCj4+ICsjZGVmaW5lIG11dGV4X3VubG9jayBzcGluX3VubG9j awo+IAo+IG11dGV4IGFuZCBzcGlubG9jayBhcmUgbm90IHRoZSBzYW1lLiBUaGUgZm9ybWVyIGlz IHNsZWVwaW5nIHdoaWxzdCB0aGUgbGF0ZXIgaXMgbm90Lgo+IAo+IENhbiB5b3UgcGxlYXNlIGV4 cGxhaW4gd2h5IHRoaXMgaXMgZmluZSBhbmQgcG9zc2libHkgYWRkIHRoYXQgaW4gYSBjb21tZW50 Pwo+IApNdXRleCBpcyB1c2VkIHRvIHByb3RlY3QgdGhlIGFjY2VzcyB0byBzbW11IGRldmljZSBp bnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB3aGVuIHNldHRpbmcgdXAgdGhlIHMyIGNvbmZpZyBhbmQg aW5zdGFsbGluZyBzdGVzIGZvciBhIGdpdmVuIGRldmljZSBpbiBMaW51eC4gVGhlIHN0ZSBwcm9n cmFtbWluZyAgb3BlcmF0aW9uIGNhbiBiZSBjb21wZXRpdGl2ZWx5IGxvbmcgYnV0IGluIHRoZSBj dXJyZW50IHRlc3RpbmcsIEkgZGlkIG5vdCBzZWUgdGhpcyBibG9ja2luZyBmb3IgdG9vIGxvbmcu IEkgd2lsbCBwdXQgaW4gYSBjb21tZW50LiAKCj4+ICsKPj4gKy8qIFhlbjogSGVscGVycyB0byBn ZXQgZGV2aWNlIE1NSU8gYW5kIElSUXMgKi8KPj4gK3N0cnVjdCByZXNvdXJjZSB7Cj4+ICvCoMKg wqAgdTY0IGFkZHI7Cj4+ICvCoMKgwqAgdTY0IHNpemU7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50 IHR5cGU7Cj4+ICt9Owo+IAo+IExpa2VseSB3ZSB3YW50IGEgY29tcGF0IGhlYWRlciBmb3IgZGVm aW5pbmcgTGludXggaGVscGVycy4gVGhpcyB3b3VsZCBhdm9pZCByZXBsaWNhdGluZyBpdCBldmVy eXdoZXJlLgpBZ3JlZWQuCgo+IAo+PiArCj4+ICsjZGVmaW5lIHJlc291cmNlX3NpemUocmVzKSAo KHJlcyktPnNpemUpCj4+ICsKPj4gKyNkZWZpbmUgcGxhdGZvcm1fZGV2aWNlIGRldmljZQo+PiAr Cj4+ICsjZGVmaW5lIElPUkVTT1VSQ0VfTUVNIDAKPj4gKyNkZWZpbmUgSU9SRVNPVVJDRV9JUlEg MQo+PiArCj4+ICtzdGF0aWMgc3RydWN0IHJlc291cmNlICpwbGF0Zm9ybV9nZXRfcmVzb3VyY2Uo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCB0eXBlLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50 IG51bSkKPj4gK3sKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBUaGUgcmVzb3VyY2UgaXMg b25seSB1c2VkIGJldHdlZW4gMiBjYWxscyBvZiBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UuCj4+ICvC oMKgwqDCoCAqIEl0J3MgcXVpdGUgdWdseSBidXQgaXQncyBhdm9pZCB0byBhZGQgdG9vIG11Y2gg Y29kZSBpbiB0aGUgcGFydAo+PiArwqDCoMKgwqAgKiBpbXBvcnRlZCBmcm9tIExpbnV4Cj4+ICvC oMKgwqDCoCAqLwo+PiArwqDCoMKgIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVzOwo+PiArwqDC oMKgIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlOwo+PiArwqDCoMKgIHN0cnVjdCBh Y3BpX2lvcnRfc21tdV92MyAqbm9kZV9zbW11X2RhdGE7Cj4+ICvCoMKgwqAgaW50IHJldCA9IDA7 Cj4+ICsKPj4gK8KgwqDCoCByZXMudHlwZSA9IHR5cGU7Cj4+ICsKPj4gK8KgwqDCoCBzd2l0Y2gg KHR5cGUpIHsKPj4gK8KgwqDCoCBjYXNlIElPUkVTT1VSQ0VfTUVNOgo+PiArwqDCoMKgwqDCoMKg wqAgaWYgKHBkZXYtPnR5cGUgPT0gREVWX0FDUEkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0ID0gMTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9ydF9ub2RlID0gcGRldi0+ YWNwaV9ub2RlOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBub2RlX3NtbXVfZGF0YSA9Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHN0cnVjdCBhY3BpX2lvcnRfc21tdV92 MyAqKWlvcnRfbm9kZS0+bm9kZV9kYXRhOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGlmIChub2RlX3NtbXVfZGF0YSAhPSBOVUxMKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgcmVzLmFkZHIgPSBub2RlX3NtbXVfZGF0YS0+YmFzZV9hZGRyZXNzOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlcy5zaXplID0gU1pfMTI4SzsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXQgPSBkdF9kZXZpY2VfZ2V0X2FkZHJlc3MoZGV2X3RvX2R0KHBkZXYpLCBudW0sCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg JnJlcy5hZGRyLCAmcmVzLnNpemUpOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gKChyZXQpID8gTlVMTCA6ICZyZXMpOwo+PiArCj4+ICvCoMKgwqAg Y2FzZSBJT1JFU09VUkNFX0lSUToKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHBsYXRmb3JtX2dl dF9pcnEoZGV2X3RvX2R0KHBkZXYpLCBudW0pOwo+IAo+IE5vIElSUSBmb3IgQUNQST8KRm9yIElS UXMgdGhlIGNvZGUgY2FsbHMgcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUuIFNvLCB0aGUgSU9SRVNP VVJDRV9JUlEgaW1wbGVtZW50YXRpb24gaXMgbm90IG5lZWRlZCBhdCBhbGwuIChEVCBvciBBQ1BJ KQo+IAo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocmV0IDwgMCkKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlcy5hZGRy ID0gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqAgcmVzLnNpemUgPSAxOwo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gJnJlczsKPj4gKwo+PiArwqDCoMKgIGRlZmF1bHQ6Cj4+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gTlVMTDsKPj4gK8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBp bnQgcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwg Y29uc3QgY2hhciAqbmFtZSkKPj4gK3sKPj4gK8KgwqDCoCBjb25zdCBzdHJ1Y3QgZHRfcHJvcGVy dHkgKmR0cHJvcDsKPj4gK8KgwqDCoCBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfbm9kZTsK Pj4gK8KgwqDCoCBzdHJ1Y3QgYWNwaV9pb3J0X3NtbXVfdjMgKm5vZGVfc21tdV9kYXRhOwo+PiAr wqDCoMKgIGludCByZXQgPSAwOwo+PiArCj4+ICvCoMKgwqAgaWYgKHBkZXYtPnR5cGUgPT0gREVW X0FDUEkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGlvcnRfbm9kZSA9IHBkZXYtPmFjcGlfbm9kZTsK Pj4gK8KgwqDCoMKgwqDCoMKgIG5vZGVfc21tdV9kYXRhID0gKHN0cnVjdCBhY3BpX2lvcnRfc21t dV92MyAqKWlvcnRfbm9kZS0+bm9kZV9kYXRhOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo bm9kZV9zbW11X2RhdGEgIT0gTlVMTCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo IXN0cmNtcChuYW1lLCAiZXZlbnRxIikpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0ID0gbm9kZV9zbW11X2RhdGEtPmV2ZW50X2dzaXY7Cj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByaXEiKSkKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXQgPSBub2RlX3NtbXVfZGF0YS0+cHJpX2dzaXY7Cj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImNtZHEtc3luYyIpKQo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IG5vZGVfc21tdV9kYXRhLT5z eW5jX2dzaXY7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UgaWYgKCFzdHJjbXAobmFt ZSwgImdlcnJvciIpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldCA9IG5v ZGVfc21tdV9kYXRhLT5nZXJyX2dzaXY7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUlOVkFMOwo+PiArwqDC oMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgIH0gZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkdHBy b3AgPSBkdF9maW5kX3Byb3BlcnR5KGRldl90b19kdChwZGV2KSwgImludGVycnVwdC1uYW1lcyIs IE5VTEwpOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFkdHByb3ApCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIWR0 cHJvcC0+dmFsdWUpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PREFUQTsK Pj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICsj ZGVmaW5lIHJlYWR4X3BvbGxfdGltZW91dChvcCwgYWRkciwgdmFsLCBjb25kLCBzbGVlcF91cywg dGltZW91dF91cykgXAo+PiArKHsgXAo+PiArwqDCoMKgIHNfdGltZV90IGRlYWRsaW5lID0gTk9X KCkgKyBNSUNST1NFQ1ModGltZW91dF91cyk7IFwKPj4gK8KgwqDCoCBmb3IgKDs7KSB7IFwKPj4g K8KgwqDCoMKgwqDCoMKgICh2YWwpID0gb3AoYWRkcik7IFwKPj4gK8KgwqDCoMKgwqDCoMKgIGlm IChjb25kKSBcCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOyBcCj4+ICvCoMKgwqDC oMKgwqDCoCBpZiAoTk9XKCkgPiBkZWFkbGluZSkgeyBcCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICh2YWwpID0gb3AoYWRkcik7IFwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 IFwKPj4gK8KgwqDCoMKgwqDCoMKgIH0gXAo+PiArwqDCoMKgwqDCoMKgwqAgY3B1X3JlbGF4KCk7 IFwKPiAKPiBJIGRvbid0IHRoaW5rIGNhbGxpbmcgY3B1X3JlbGF4KCkgaXMgY29ycmVjdCBoZXJl LgpJIHdpbGwgcmVtb3ZlIGNwdV9yZWxheCgpIGZyb20gaGVyZS4gSXQgc2hvdWxkIG5vdCBiZSBu ZWVkZWQuCj4gCj4+ICvCoMKgwqDCoMKgwqDCoCB1ZGVsYXkoc2xlZXBfdXMpOyBcCj4+ICvCoMKg wqAgfSBcCj4+ICvCoMKgwqAgKGNvbmQpID8gMCA6IC1FVElNRURPVVQ7IFwKPj4gK30pCj4+ICsK Pj4gKyNkZWZpbmUgcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXQoYWRkciwgdmFsLCBjb25kLCBk ZWxheV91cywgdGltZW91dF91cykgXAo+PiArwqDCoMKgIHJlYWR4X3BvbGxfdGltZW91dChyZWFk bF9yZWxheGVkLCBhZGRyLCB2YWwsIGNvbmQsIGRlbGF5X3VzLCB0aW1lb3V0X3VzKQo+PiArCj4+ ICsvKiBYZW46IEhlbHBlcnMgZm9yIElSUSBmdW5jdGlvbnMgKi8KPj4gKyNkZWZpbmUgcmVxdWVz dF9pcnEoaXJxLCBmdW5jLCBmbGFncywgbmFtZSwgZGV2KSByZXF1ZXN0X2lycShpcnEsIGZsYWdz LCBmdW5jLCBuYW1lLCBkZXYpCj4+ICsjZGVmaW5lIGZyZWVfaXJxIHJlbGVhc2VfaXJxCj4+ICsK Pj4gK2VudW0gaXJxcmV0dXJuIHsKPj4gK8KgwqDCoCBJUlFfTk9ORcKgwqDCoCA9ICgwIDw8IDAp LAo+PiArwqDCoMKgIElSUV9IQU5ETEVEwqDCoMKgID0gKDEgPDwgMCksCj4+ICt9Owo+PiArCj4+ ICt0eXBlZGVmIGVudW0gaXJxcmV0dXJuIGlycXJldHVybl90Owo+PiArCj4+ICsvKiBEZXZpY2Ug bG9nZ2VyIGZ1bmN0aW9ucyAqLwo+PiArI2RlZmluZSBkZXZfcHJpbnQoZGV2LCBsdmwsIGZtdCwg Li4uKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiAr wqDCoMKgwqAgcHJpbnRrKGx2bCAic21tdTogIiBmbXQsICMjIF9fVkFfQVJHU19fKQo+PiArCj4+ ICsjZGVmaW5lIGRldl9kYmcoZGV2LCBmbXQsIC4uLikgZGV2X3ByaW50KGRldiwgWEVOTE9HX0RF QlVHLCBmbXQsICMjIF9fVkFfQVJHU19fKQo+PiArI2RlZmluZSBkZXZfbm90aWNlKGRldiwgZm10 LCAuLi4pIGRldl9wcmludChkZXYsIFhFTkxPR19JTkZPLCBmbXQsICMjIF9fVkFfQVJHU19fKQo+ PiArI2RlZmluZSBkZXZfd2FybihkZXYsIGZtdCwgLi4uKSBkZXZfcHJpbnQoZGV2LCBYRU5MT0df V0FSTklORywgZm10LCAjIyBfX1ZBX0FSR1NfXykKPj4gKyNkZWZpbmUgZGV2X2VycihkZXYsIGZt dCwgLi4uKSBkZXZfcHJpbnQoZGV2LCBYRU5MT0dfRVJSLCBmbXQsICMjIF9fVkFfQVJHU19fKQo+ PiArI2RlZmluZSBkZXZfaW5mbyhkZXYsIGZtdCwgLi4uKSBkZXZfcHJpbnQoZGV2LCBYRU5MT0df SU5GTywgZm10LCAjIyBfX1ZBX0FSR1NfXykKPj4gKwo+PiArI2RlZmluZSBkZXZfZXJyX3JhdGVs aW1pdGVkKGRldiwgZm10LCAuLi4pwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgXAo+PiArwqDCoMKgwqAgZGV2X3ByaW50KGRldiwgWEVOTE9HX0VSUiwgZm10LCAjIyBfX1ZB X0FSR1NfXykKPj4gKwo+PiArI2RlZmluZSBkZXZfbmFtZShkZXYpIGR0X25vZGVfZnVsbF9uYW1l KGRldl90b19kdChkZXYpKQo+PiArCj4+ICsvKiBBbGlhcyB0byBYZW4gYWxsb2NhdGlvbiBoZWxw ZXJzICovCj4+ICsjZGVmaW5lIGtmcmVlIHhmcmVlCj4+ICsjZGVmaW5lIGttYWxsb2Moc2l6ZSwg ZmxhZ3MpwqDCoMKgwqDCoMKgwqAgX3htYWxsb2Moc2l6ZSwgc2l6ZW9mKHZvaWQgKikpCj4+ICsj ZGVmaW5lIGt6YWxsb2Moc2l6ZSwgZmxhZ3MpwqDCoMKgwqDCoMKgwqAgX3h6YWxsb2Moc2l6ZSwg c2l6ZW9mKHZvaWQgKikpCj4+ICsjZGVmaW5lIGRldm1fa3phbGxvYyhkZXYsIHNpemUsIGZsYWdz KcKgwqDCoCBfeHphbGxvYyhzaXplLCBzaXplb2Yodm9pZCAqKSkKPj4gKyNkZWZpbmUga21hbGxv Y19hcnJheShzaXplLCBuLCBmbGFncynCoMKgwqAgX3htYWxsb2NfYXJyYXkoc2l6ZSwgc2l6ZW9m KHZvaWQgKiksIG4pCj4+ICsKPj4gKy8qIENvbXBhdGliaWxpdHkgZGVmaW5lcyAqLwo+PiArI3Vu ZGVmIFdBUk5fT04KPj4gKyNkZWZpbmUgV0FSTl9PTihjb25kKSAoISFjb25kKQo+IAo+IFdoeSBk byB5b3UgcmVkZWZpbmUgV0FSTl9PTj9OZWVkIGl0IHRvIGJlIGEgc2NhbGFyIHZhbHVlLiBUaGUg WGVuIGltcGxlbWVudGF0aW9uIGlzIGEgZG8uLndoaWxlLiBEaWQgbm90IHdhbnQgYSBsYXJnZSBp bXBhY3QgaGVuY2UgdGhlIGxvY2FsIGRlZmluZS4gSSBjYW4gdHJ5IHByb3Bvc2luZyBhIG5ldyBj b21tb24gZGVmaW5lLgo+IAo+PiArI2RlZmluZSBXQVJOX09OX09OQ0UoY29uZCkgV0FSTl9PTihj b25kKQo+PiBIbW1tLCBjYW4ndCB3ZSBpbXBsZW1lbnQgYSBjb21tb24gV0FSTl9PTl9PTkNFPwpX aWxsIG5vdCByZWFsbHkgYmUgZXhlY3V0ZWQuIERlZmluaW5nIGl0IHRvIG1haW50YWluIGNvbXBh dGliaWxpdHkuIEkgdGhpbmsgdGhpcyBmaWxlIGlzIHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBk ZWZpbmUuIFdlIGNhbiBzZW5kIGl0IHRvIGEgZ2VuZXJpYyBmaWxlIGlmIHNvIG5lZWRlZC4KPiAK Pj4gKwo+PiArc3RhdGljIHZvaWQgX19pb21lbSAqZGV2bV9pb3JlbWFwX3Jlc291cmNlKHN0cnVj dCBkZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQo+PiArewo+PiArwqDCoMKgIHZvaWQgX19pb21l bSAqcHRyOwo+PiArCj4+ICvCoMKgwqAgaWYgKCFyZXMgfHwgcmVzLT50eXBlICE9IElPUkVTT1VS Q0VfTUVNKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKGRldiwgIkludmFsaWQgcmVzb3Vy Y2VcbiIpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4+ICvC oMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcHRyID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+YWRkciwg cmVzLT5zaXplKTsKPj4gK8KgwqDCoCBpZiAoIXB0cikgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2 X2VycihkZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJpb3JlbWFwIGZhaWxlZCAoYWRk ciAweCUiUFJJeDY0IiBzaXplIDB4JSJQUkl4NjQiKVxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmVzLT5hZGRyLCByZXMtPnNpemUpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVS Ul9QVFIoLUVOT01FTSk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHB0cjsK Pj4gK30KPj4gKwo+PiArLyogWGVuOiBEdW1teSBpb21tdV9kb21haW4gKi8KPj4gK3N0cnVjdCBp b21tdV9kb21haW4gewo+PiArwqDCoMKgIC8qIFJ1bnRpbWUgU01NVSBjb25maWd1cmF0aW9uIGZv ciB0aGlzIGlvbW11X2RvbWFpbiAqLwo+PiArwqDCoMKgIHN0cnVjdCBhcm1fc21tdV9kb21haW7C oMKgwqDCoMKgwqDCoCAqcHJpdjsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnTCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHR5cGU7Cj4+ICsKPj4gK8KgwqDCoCBhdG9taWNfdCByZWY7Cj4+ICvCoMKgwqAg LyogVXNlZCB0byBsaW5rIGlvbW11X2RvbWFpbiBjb250ZXh0cyBmb3IgYSBzYW1lIGRvbWFpbi4K Pj4gK8KgwqDCoMKgICogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBlci1TTU1VIHRvIHVzZWQgYnkg dGhlIGRvbWFpbi4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZMKg wqDCoMKgwqDCoMKgIGxpc3Q7Cj4+ICt9Owo+IAo+IFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHRo ZSBTTU1VIHZlcnNpb24uIENvdWxkIHdlIHNoYXJlIHNvbWUgYml0cz8KSSB3aWxsIHByb3Bvc2Ug YSBjb21tb24gaGVhZGVyIGZvciBhcm0tc21tdSBmaWxlcy4KPiAKPj4gKy8qIFhlbjogRG9tYWlu IHR5cGUgZGVmaW5pdGlvbnMuIE5vdCByZWFsbHkgbmVlZGVkIGZvciBYZW4sIGRlZmluaW5nIHRv IHBvcnQKPj4gKyAqIExpbnV4IGNvZGUgYXMtaXMKPj4gKyAqLwo+PiArI2RlZmluZSBJT01NVV9E T01BSU5fVU5NQU5BR0VEIDAKPj4gKyNkZWZpbmUgSU9NTVVfRE9NQUlOX0RNQSAxCj4+ICsjZGVm aW5lIElPTU1VX0RPTUFJTl9JREVOVElUWSAyCj4+ICsKPj4gKy8qIFhlbjogRGVzY3JpYmVzIGlu Zm9ybWF0aW9uIHJlcXVpcmVkIGZvciBhIFhlbiBkb21haW4gKi8KPj4gK3N0cnVjdCBhcm1fc21t dV94ZW5fZG9tYWluIHsKPj4gK8KgwqDCoCBzcGlubG9ja190wqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBsb2NrOwo+PiArwqDCoMKgIC8qIExpc3Qgb2YgaW9tbXUgZG9tYWlucyBhc3NvY2lhdGVkIHRv IHRoaXMgZG9tYWluICovCj4+ICvCoMKgwqAgc3RydWN0IGxpc3RfaGVhZMKgwqDCoMKgwqDCoMKg IGlvbW11X2RvbWFpbnM7Cj4+ICt9Owo+IAo+IERpdG9vLgo+IAo+PiArCj4+ICsvKgo+PiArICog WGVuOiBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIGRldmljZSBzdG9yZWQgaW4gZGV2LT5hcmNoZGF0 YS5pb21tdQo+PiArICoKPj4gKyAqIFRoZSBkZXYtPmFyY2hkYXRhLmlvbW11IHN0b3JlcyB0aGUg aW9tbXVfZG9tYWluIChydW50aW1lIGNvbmZpZ3VyYXRpb24gb2YKPj4gKyAqIHRoZSBTTU1VKS4K Pj4gKyAqLwo+PiArc3RydWN0IGFybV9zbW11X3hlbl9kZXZpY2Ugewo+PiArwqDCoMKgIHN0cnVj dCBpb21tdV9kb21haW4gKmRvbWFpbjsKPj4gK307Cj4gCj4gRGl0dG8uCj4gCj4+IMKgIMKgIC8q IE1NSU8gcmVnaXN0ZXJzICovCj4+IMKgICNkZWZpbmUgQVJNX1NNTVVfSURSMMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgMHgwCj4+IEBAIC00MTIsMTAgKzY1MCwxMiBAQAo+PiDCoCAjZGVmaW5lIE1T SV9JT1ZBX0JBU0XCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4ODAwMDAwMAo+PiDCoCAjZGVmaW5l IE1TSV9JT1ZBX0xFTkdUSMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgxMDAwMDAKPj4gwqAgKyNp ZiAwIC8qIE5vdCBhcHBsaWNhYmxlIGZvciBYZW4gKi8KPiAKPiBXaGlsZSB0aGUgbW9kdWxlX3Bh cmFtX25hbWUoKSBpcyBub3QgYXBwbGljYWJsZSBpbiBYZW4sIEkgZG9uJ3Qgc2VlIGFueSByZWFz b24gdG8gcmVtb3ZlIHRoZSB2YXJpYWJsZS4KCkFncmVlZC4KPiAKPj4gwqAgc3RhdGljIGJvb2wg ZGlzYWJsZV9ieXBhc3M7ID7CoMKgIG1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2J5cGFzcywg ZGlzYWJsZV9ieXBhc3MsIGJvb2wsIFNfSVJVR08pOwo+PiDCoCBNT0RVTEVfUEFSTV9ERVNDKGRp c2FibGVfYnlwYXNzLAo+PiDCoMKgwqDCoMKgICJEaXNhYmxlIGJ5cGFzcyBzdHJlYW1zIHN1Y2gg dGhhdCBpbmNvbWluZyB0cmFuc2FjdGlvbnMgZnJvbSBkZXZpY2VzIHRoYXQgYXJlIG5vdCBhdHRh Y2hlZCB0byBhbiBpb21tdSBkb21haW4gd2lsbCByZXBvcnQgYW4gYWJvcnQgYmFjayB0byB0aGUg ZGV2aWNlIGFuZCB3aWxsIG5vdCBiZSBhbGxvd2VkIHRvIHBhc3MgdGhyb3VnaCB0aGUgU01NVS4i KTsKPj4gKyNlbmRpZgo+PiDCoCDCoCBlbnVtIHByaV9yZXNwIHsKPj4gwqDCoMKgwqDCoCBQUklf UkVTUF9ERU5ZLAo+PiBAQCAtNDIzLDYgKzY2Myw3IEBAIGVudW0gcHJpX3Jlc3Agewo+PiDCoMKg wqDCoMKgIFBSSV9SRVNQX1NVQ0MsCj4+IMKgIH07Cj4+IMKgICsjaWYgMCAvKiBYZW46IE5vIE1T SSBzdXBwb3J0IGluIHRoaXMgaXRlcmF0aW9uICovCj4+IMKgIGVudW0gYXJtX3NtbXVfbXNpX2lu ZGV4IHsKPj4gwqDCoMKgwqDCoCBFVlRRX01TSV9JTkRFWCwKPj4gwqDCoMKgwqDCoCBHRVJST1Jf TVNJX0lOREVYLAo+PiBAQCAtNDQ3LDYgKzY4OCw3IEBAIHN0YXRpYyBwaHlzX2FkZHJfdCBhcm1f c21tdV9tc2lfY2ZnW0FSTV9TTU1VX01BWF9NU0lTXVszXSA9IHsKPj4gwqDCoMKgwqDCoMKgwqDC oMKgIEFSTV9TTU1VX1BSSVFfSVJRX0NGRzIsCj4+IMKgwqDCoMKgwqAgfSwKPj4gwqAgfTsKPj4g KyNlbmRpZgo+PiDCoCDCoCBzdHJ1Y3QgYXJtX3NtbXVfY21kcV9lbnQgewo+PiDCoMKgwqDCoMKg IC8qIENvbW1vbiBmaWVsZHMgKi8KPj4gQEAgLTU1MSw2ICs3OTMsOCBAQCBzdHJ1Y3QgYXJtX3Nt bXVfczJfY2ZnIHsKPj4gwqDCoMKgwqDCoCB1MTbCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdm1pZDsKPj4gwqDCoMKgwqDCoCB1NjTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dnR0YnI7Cj4+IMKgwqDCoMKgwqAgdTY0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZ0 Y3I7Cj4+ICvCoMKgwqAgLyogWGVuOiBEb21haW4gYXNzb2NpYXRlZCB0byB0aGlzIGNvbmZpZ3Vy YXRpb24gKi8KPj4gK8KgwqDCoCBzdHJ1Y3QgZG9tYWluwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAq ZG9tYWluOwo+PiDCoCB9Owo+PiDCoCDCoCBzdHJ1Y3QgYXJtX3NtbXVfc3RydGFiX2VudCB7Cj4+ IEBAIC02MjMsOSArODY3LDIwIEBAIHN0cnVjdCBhcm1fc21tdV9kZXZpY2Ugewo+PiDCoMKgwqDC oMKgIHN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfY2ZnwqDCoMKgIHN0cnRhYl9jZmc7Cj4+IMKgIMKg wqDCoMKgwqAgLyogSU9NTVUgY29yZSBjb2RlIGhhbmRsZSAqLwo+PiAtwqDCoMKgIHN0cnVjdCBp b21tdV9kZXZpY2XCoMKgwqDCoMKgwqDCoCBpb21tdTsKPj4gK8KgwqDCoCAvL3N0cnVjdCBpb21t dV9kZXZpY2XCoMKgwqDCoMKgwqDCoCBpb21tdTsKPiAKPiAjaWYgMCBidXQgbm8gLy8gcGxlYXNl LgpEb25lLgoKPiAKPj4gKwo+PiArwqDCoMKgIC8qIFhlbjogTmVlZCB0byBrZWVwIGEgbGlzdCBv ZiBTTU1VIGRldmljZXMgKi8KPj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGRldmljZXM7Cj4+IMKgIH07Cj4+IMKgICsvKiBYZW46IEtlZXAg YSBsaXN0IG9mIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZHJpdmVyICovCj4+ICtzdGF0 aWMgREVGSU5FX1NQSU5MT0NLKGFybV9zbW11X2RldmljZXNfbG9jayk7Cj4+ICtzdGF0aWMgTElT VF9IRUFEKGFybV9zbW11X2RldmljZXMpOwo+PiArLyogWGVuOiBIZWxwZXIgZm9yIGZpbmRpbmcg YSBkZXZpY2UgdXNpbmcgZndub2RlICovCj4+ICtzdGF0aWMKPj4gK3N0cnVjdCBhcm1fc21tdV9k ZXZpY2UgKmFybV9zbW11X2dldF9ieV9md25vZGUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9k ZSk7Cj4+ICsKPj4gKwo+PiDCoCAvKiBTTU1VIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBtYXN0ZXIg Ki8KPj4gwqAgc3RydWN0IGFybV9zbW11X21hc3Rlcl9kYXRhIHsKPj4gwqDCoMKgwqDCoCBzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlwqDCoMKgwqDCoMKgwqAgKnNtbXU7Cj4+IEBAIC02NDIsNyArODk3 LDcgQEAgZW51bSBhcm1fc21tdV9kb21haW5fc3RhZ2Ugewo+PiDCoCDCoCBzdHJ1Y3QgYXJtX3Nt bXVfZG9tYWluIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlwqDCoMKgwqDC oMKgwqAgKnNtbXU7Cj4+IC3CoMKgwqAgc3RydWN0IG11dGV4wqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpbml0X211dGV4OyAvKiBQcm90ZWN0cyBzbW11IHBvaW50ZXIgKi8KPj4gK8KgwqDCoCBtdXRl eMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5pdF9tdXRleDsgLyogUHJvdGVjdHMgc21tdSBwb2lu dGVyICovCj4+IMKgIMKgwqDCoMKgwqAgc3RydWN0IGlvX3BndGFibGVfb3BzwqDCoMKgwqDCoMKg wqAgKnBndGJsX29wczsKPj4gwqDCoMKgwqDCoCBzcGlubG9ja190wqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBwZ3RibF9sb2NrOwo+PiBAQCAtNzM3LDE1ICs5OTIsMTYgQEAgc3RhdGljIHZvaWQgcXVl dWVfaW5jX3Byb2Qoc3RydWN0IGFybV9zbW11X3F1ZXVlICpxKQo+PiDCoMKgICovCj4+IMKgIHN0 YXRpYyBpbnQgcXVldWVfcG9sbF9jb25zKHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSwgYm9vbCBk cmFpbiwgYm9vbCB3ZmUpCj4+IMKgIHsKPj4gLcKgwqDCoCBrdGltZV90IHRpbWVvdXQgPSBrdGlt ZV9hZGRfdXMoa3RpbWVfZ2V0KCksIEFSTV9TTU1VX1BPTExfVElNRU9VVF9VUyk7Cj4+ICvCoMKg wqAgc190aW1lX3QgZGVhZGxpbmUgPSBOT1coKSArIE1JQ1JPU0VDUyhBUk1fU01NVV9QT0xMX1RJ TUVPVVRfVVMpOwo+IAo+IFBsZWFzZSBpbnRyb2R1Y2UgcHJvcGVyIHdyYXBwZXJzIHRvIGF2b2lk IHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIGNvZGUuCkRvbmUuCgo+IAo+PiDCoCDCoMKgwqDCoMKg IHdoaWxlIChxdWV1ZV9zeW5jX2NvbnMocSksIChkcmFpbiA/ICFxdWV1ZV9lbXB0eShxKSA6IHF1 ZXVlX2Z1bGwocSkpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoa3RpbWVfY29tcGFyZShrdGlt ZV9nZXQoKSwgdGltZW91dCkgPiAwKQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoTk9XKCkg PiBkZWFkbGluZSkKPiAKPiBEaXR0by4KRG9uZS4KCj4gCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAtRVRJTUVET1VUOwo+PiDCoCAtwqDCoMKgwqDCoMKgwqAgaWYgKHdmZSkg ewo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHdmZSkKPiAKPiBQbGVhc2UgYXZvaWQgdG8gZHJvcCB7 Cj4gCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdmZSgpOwo+PiAtwqDCoMKgwqDCoMKg wqAgfSBlbHNlIHsKPiAKPiBEaXR0by4KRG9uZS4KCj4gCj4+ICvCoMKgwqDCoMKgwqDCoCBlbHNl IHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY3B1X3JlbGF4KCk7Cj4gCj4gSG1tbSBJ IG5vdyBzZWUgd2h5IHlvdSBhZGRlZCBjcHVfcmVsYXgoKSBhdCB0aGUgdG9wLiBXZWxsLCBvbiBY ZW4gY3B1X3JlbGF4IGlzIGp1c3QgYSBiYXJyaWVyLiBPbiBMaW51eCBpdCBpcyB1c2VkIHRvIHlp ZWxkLgo+IAo+IEFuZCB0aGF0IGJpdCBpcyB3b3JyeWluZyBtZS4gVGhlIExpbnV4IGNvZGUgd2ls bCBhbGxvdyBjb250ZXh0IHN3aXRjaGluZyB0byBhbm90aGVyIHRhc2tzIGlmIHRoZSBjb2RlIGlz IHRha2luZyB0b28gbXVjaCB0aW1lLgo+IAo+IFhlbiBpcyBub3QgcHJlZW1wdGlibGUsIHNvIGlz IGl0IGZpbmU/ClRoaXMgaXMgdXNlZCB3aGVuIGNvbnN1bWluZyB0aGUgY29tbWFuZCBxdWV1ZSBh bmQgY291bGQgYmUgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaXNzdWUgaWYgdGhlIHF1ZXVlIGlz IGxhcmdlLiAoVGhpcyBpcyBuZXZlciB0aGUgY2FzZSkuCkkgYW0gd29uZGVyaW5nIGlmIHdlIHNo b3VsZCBkZWZpbmUgYSB5ZWlsZCBpbiBsb25nIHJ1bj8gCgo+IAo+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB1ZGVsYXkoMSk7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+IEBAIC05MzEs NyArMTE4Nyw3IEBAIHN0YXRpYyB2b2lkIGFybV9zbW11X2NtZHFfaXNzdWVfY21kKHN0cnVjdCBh cm1fc21tdV9kZXZpY2UgKnNtbXUsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyX3JhdGVs aW1pdGVkKHNtbXUtPmRldiwgIkNNRF9TWU5DIHRpbWVvdXRcbiIpOwo+PiDCoMKgwqDCoMKgIHNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtbXUtPmNtZHEubG9jaywgZmxhZ3MpOwo+PiDCoCB9Cj4+ IC0KPj4gKyNpZiAwCj4gCj4gUGxlYXNlIGF2b2lkIGRyb3BwaW5nIG5ld2xpbmUgYW5kIGV4cGxh aW4gd2h5IHRoZSAjaWYgMC4KRG9uZS4KCj4gCj4+IMKgIC8qIENvbnRleHQgZGVzY3JpcHRvciBt YW5pcHVsYXRpb24gZnVuY3Rpb25zICovCj4+IMKgIHN0YXRpYyB1NjQgYXJtX3NtbXVfY3B1X3Rj cl90b19jZCh1NjQgdGNyKQo+PiDCoCB7Cj4+IEBAIC05NzQsNyArMTIzMCw3IEBAIHN0YXRpYyB2 b2lkIGFybV9zbW11X3dyaXRlX2N0eF9kZXNjKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUs Cj4+IMKgIMKgwqDCoMKgwqAgY2ZnLT5jZHB0clszXSA9IGNwdV90b19sZTY0KGNmZy0+Y2QubWFp ciA8PCBDVFhERVNDX0NEXzNfTUFJUl9TSElGVCk7Cj4+IMKgIH0KPj4gLQo+PiArI2VuZGlmCj4g Cj4gRGl0dG8gZm9yIHRoZSBuZXdsaW5lLgpEb25lLgoKPiAKPj4gwqAgLyogU3RyZWFtIHRhYmxl IG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMgKi8KPj4gwqAgc3RhdGljIHZvaWQKPj4gwqAgYXJtX3Nt bXVfd3JpdGVfc3RydGFiX2wxX2Rlc2MoX19sZTY0ICpkc3QsIHN0cnVjdCBhcm1fc21tdV9zdHJ0 YWJfbDFfZGVzYyAqZGVzYykKPj4gQEAgLTEwNDQsNyArMTMwMCw3IEBAIHN0YXRpYyB2b2lkIGFy bV9zbW11X3dyaXRlX3N0cnRhYl9lbnQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMy IHNpZCwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RlX2xpdmUgPSB0cnVlOwo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGNh c2UgU1RSVEFCX1NURV8wX0NGR19BQk9SVDoKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYg KGRpc2FibGVfYnlwYXNzKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvL05vIGJ5cGFzcyBv dmVycmlkZSBmb3IgWGVuCj4gCj4gV2h5IG5vIGxlYXZpbmcgdGhlIHZhcmlhYmxlIG9uIHRvcCB3 aXRoIGEgY29tbWVudC4gVGhpcyB3b3VsZCBhdm9pZCBzdWNoIGNoYW5nZS4KRG9uZS4KCj4gCj4+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBkZWZhdWx0Ogo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCVUcoKTsgLyog U1RFIGNvcnJ1cHRpb24gKi8KPj4gQEAgLTEwNTYsNyArMTMxMiw3IEBAIHN0YXRpYyB2b2lkIGFy bV9zbW11X3dyaXRlX3N0cnRhYl9lbnQoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTMy IHNpZCwKPj4gwqAgwqDCoMKgwqDCoCAvKiBCeXBhc3MvZmF1bHQgKi8KPj4gwqDCoMKgwqDCoCBp ZiAoIXN0ZS0+YXNzaWduZWQgfHwgIShzdGUtPnMxX2NmZyB8fCBzdGUtPnMyX2NmZykpIHsKPj4g LcKgwqDCoMKgwqDCoMKgIGlmICghc3RlLT5hc3NpZ25lZCAmJiBkaXNhYmxlX2J5cGFzcykKPj4g K8KgwqDCoMKgwqDCoMKgIGlmICghc3RlLT5hc3NpZ25lZCkKPiAKPiBEaXR0by4KRG9uZS4KCj4g Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZhbCB8PSBTVFJUQUJfU1RFXzBfQ0ZHX0FC T1JUOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCB2YWwgfD0gU1RSVEFCX1NURV8wX0NGR19CWVBBU1M7Cj4+IEBAIC0xMTM1LDE2ICsxMzkx LDIwIEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9sMl9zdHJ0YWIoc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSwgdTMyIHNpZCkKPj4gwqDCoMKgwqDCoCB2b2lkICpzdHJ0YWI7Cj4+IMKg wqDCoMKgwqAgc3RydWN0IGFybV9zbW11X3N0cnRhYl9jZmcgKmNmZyA9ICZzbW11LT5zdHJ0YWJf Y2ZnOwo+PiDCoMKgwqDCoMKgIHN0cnVjdCBhcm1fc21tdV9zdHJ0YWJfbDFfZGVzYyAqZGVzYyA9 ICZjZmctPmwxX2Rlc2Nbc2lkID4+IFNUUlRBQl9TUExJVF07Cj4+ICvCoMKgwqAgdTMyIGFsaWdu bWVudCA9IDA7Cj4+IMKgIMKgwqDCoMKgwqAgaWYgKGRlc2MtPmwycHRyKQo+PiDCoMKgwqDCoMKg wqDCoMKgwqAgcmV0dXJuIDA7Cj4+IMKgIC3CoMKgwqAgc2l6ZSA9IDEgPDwgKFNUUlRBQl9TUExJ VCArIGlsb2cyKFNUUlRBQl9TVEVfRFdPUkRTKSArIDMpOwo+PiArwqDCoMKgIHNpemUgPSAxIDw8 IChTVFJUQUJfU1BMSVQgKyBMT0dfMihTVFJUQUJfU1RFX0RXT1JEUykgKyAzKTsKPiAKPiBJIHdv dWxkIHByZWZlciBpZiB5b3UgaW50cm9kdWNlIGlsb2cyLgpEb25lLgoKPiAKPj4gwqDCoMKgwqDC oCBzdHJ0YWIgPSAmY2ZnLT5zdHJ0YWJbKHNpZCA+PiBTVFJUQUJfU1BMSVQpICogU1RSVEFCX0wx X0RFU0NfRFdPUkRTXTsKPj4gwqAgwqDCoMKgwqDCoCBkZXNjLT5zcGFuID0gU1RSVEFCX1NQTElU ICsgMTsKPj4gLcKgwqDCoCBkZXNjLT5sMnB0ciA9IGRtYW1fYWxsb2NfY29oZXJlbnQoc21tdS0+ ZGV2LCBzaXplLCAmZGVzYy0+bDJwdHJfZG1hLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKPj4gKwo+PiArwqDC oMKgIGFsaWdubWVudCA9IDEgPDwgKCg1ICsgKGRlc2MtPnNwYW4gLSAxKSkpOwo+IAo+IERvIHlv dSBtaW5kIGV4cGxhaW5pbmcgdGhlIDU/IEFsc28sIGRvZXMgdGhlIHNoaWZ0IHdpbGwgYWx3YXlz IGJlIDwgMzI/Ckl0cyBmcm9tIHRoZSAiTGV2ZWwgMSBTdHJlYW0gVGFibGUgRGVzY3JpcHRvciIg ZnJvbSBTTU1VIHNwZWMuIEkgY2FuIGFkZCB0aGUgcmVmIHRvIHRoZSBzcGVjLiBZZXMgdGhlIHNw YW4gaXMgaGFyZCBjb2RlZCBpbiB0aGUgZHJpdmVyIGFuZCB3aXRoIGFueSBzcGVjIHZhbGlkIHNw YW4gdmFsdWVzIHRoaXMgY2Fubm90IGV4Y2VlZCAzMi4KSSBoYXZlIGFkZGVkIGEgY29tbWVudCB0 b3QgaGUgY29kZQo+IAo+PiArwqDCoMKgIGRlc2MtPmwycHRyID0gX3h6YWxsb2Moc2l6ZSwgYWxp Z25tZW50KTsKPj4gK8KgwqDCoCBkZXNjLT5sMnB0cl9kbWEgPSB2aXJ0X3RvX21hZGRyKGRlc2Mt PmwycHRyKTsKPiAKPiBfeHphbGxvYyBjYW4gZmFpbCBhbmQgdmlydF90b19tYWRkciB3aWxsIHJl c3VsdCB0byBhIHBhbmljLgo+IApJIHdpbGwgbW92ZSB0aGUgY2hlY2suCj4+ICsKPj4gwqDCoMKg wqDCoCBpZiAoIWRlc2MtPmwycHRyKSB7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHNt bXUtPmRldiwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgImZhaWxlZCB0byBhbGxvY2F0 ZSBsMiBzdHJlYW0gdGFibGUgZm9yIFNJRCAldVxuIiwKPj4gQEAgLTExNTgsNyArMTQxOCw3IEBA IHN0YXRpYyBpbnQgYXJtX3NtbXVfaW5pdF9sMl9zdHJ0YWIoc3RydWN0IGFybV9zbW11X2Rldmlj ZSAqc21tdSwgdTMyIHNpZCkKPj4gwqAgfQo+PiDCoCDCoCAvKiBJUlEgYW5kIGV2ZW50IGhhbmRs ZXJzICovCj4+IC1zdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfZXZ0cV90aHJlYWQoaW50IGly cSwgdm9pZCAqZGV2KQo+PiArc3RhdGljIHZvaWQgYXJtX3NtbXVfZXZ0cV90aHJlYWQoaW50IGly cSwgdm9pZCAqZGV2LCBzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVncykKPiAKPiBDb3VsZCB5b3Ug cGxlYXNlIGludHJvZHVjZSBhIHdyYXBwZXIgaW5zdGVhZCBhcyBpdCB3YXMgZG9uZSBpbiBzbW11 LmM/Cj4gCkRvbmUuCgo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgaW50IGk7Cj4+IMKgwqDCoMKgwqAg c3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSA9IGRldjsKPj4gQEAgLTExODYsNyArMTQ0Niw2 IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9ldnRxX3RocmVhZChpbnQgaXJxLCB2b2lk ICpkZXYpCj4+IMKgIMKgwqDCoMKgwqAgLyogU3luYyBvdXIgb3ZlcmZsb3cgZmxhZywgYXMgd2Ug YmVsaWV2ZSB3ZSdyZSB1cCB0byBzcGVlZCAqLwo+PiDCoMKgwqDCoMKgIHEtPmNvbnMgPSBRX09W RihxLCBxLT5wcm9kKSB8IFFfV1JQKHEsIHEtPmNvbnMpIHwgUV9JRFgocSwgcS0+Y29ucyk7Cj4+ IC3CoMKgwqAgcmV0dXJuIElSUV9IQU5ETEVEOwo+PiDCoCB9Cj4+IMKgIMKgIHN0YXRpYyB2b2lk IGFybV9zbW11X2hhbmRsZV9wcHIoc3RydWN0IGFybV9zbW11X2RldmljZSAqc21tdSwgdTY0ICpl dnQpCj4+IEBAIC0xMjAzLDcgKzE0NjIsNyBAQCBzdGF0aWMgdm9pZCBhcm1fc21tdV9oYW5kbGVf cHByKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUsIHU2NCAqZXZ0KQo+PiDCoCDCoMKgwqDC oMKgIGRldl9pbmZvKHNtbXUtPmRldiwgInVuZXhwZWN0ZWQgUFJJIHJlcXVlc3QgcmVjZWl2ZWQ6 XG4iKTsKPj4gwqDCoMKgwqDCoCBkZXZfaW5mbyhzbW11LT5kZXYsCj4+IC3CoMKgwqDCoMKgwqDC oMKgICJcdHNpZCAweCUwOHguMHglMDV4OiBbJXUlc10gJXNwcml2aWxlZ2VkICVzJXMlcyBhY2Nl c3MgYXQgaW92YSAweCUwMTZsbHhcbiIsCj4+ICvCoMKgwqDCoMKgwqDCoMKgICJcdHNpZCAweCUw OHguMHglMDV4OiBbJXUlc10gJXNwcml2aWxlZ2VkICVzJXMlcyBhY2Nlc3MgYXQgaW92YSAweCUw MTZseFxuIiwKPiAKPiBIbW1tIHdoeT8KVGhlIHZhcmlhYmxlIGlzIGRlZmluZWQgYXMgdW5naW5l ZCBsb25nIGxvbmcgaW4gTGludXguICggdXNlcyBnZW5lcmljIGludC1sbDY0LmgpIEluIFhlbiB0 aGUgZGVmaW5pdGlvbiBjaGFuZ2VzIHRvIHVuc2lnbmVkIGxvbmcgZm9yIEFSTV82NCB3aGljaCBh Y3R1YWxseSBtYWtlcyBzZW5zZS4gCj4gCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpZCwgc3Np ZCwgZ3JwaWQsIGxhc3QgPyAiTCIgOiAiIiwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXZ0WzBd ICYgUFJJUV8wX1BFUk1fUFJJViA/ICIiIDogInVuIiwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZXZ0WzBdICYgUFJJUV8wX1BFUk1fUkVBRCA/ICJSIiA6ICIiLAo+PiBAQCAtMTIyNyw3ICsxNDg2 LDcgQEAgc3RhdGljIHZvaWQgYXJtX3NtbXVfaGFuZGxlX3BwcihzdHJ1Y3QgYXJtX3NtbXVfZGV2 aWNlICpzbW11LCB1NjQgKmV2dCkKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgIH0KPj4gwqAgLXN0YXRp YyBpcnFyZXR1cm5fdCBhcm1fc21tdV9wcmlxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYpCj4+ ICtzdGF0aWMgdm9pZCBhcm1fc21tdV9wcmlxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYsIHN0 cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQo+IAo+IERpdHRvIGFib3V0IHRoZSBwcm90b3R5cGUu CkRvbmUuCj4gCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpz bW11ID0gZGV2Owo+PiDCoMKgwqDCoMKgIHN0cnVjdCBhcm1fc21tdV9xdWV1ZSAqcSA9ICZzbW11 LT5wcmlxLnE7Cj4+IEBAIC0xMjQzLDE4ICsxNTAyLDE2IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCBh cm1fc21tdV9wcmlxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkZXYpCj4+IMKgIMKgwqDCoMKgwqAg LyogU3luYyBvdXIgb3ZlcmZsb3cgZmxhZywgYXMgd2UgYmVsaWV2ZSB3ZSdyZSB1cCB0byBzcGVl ZCAqLwo+PiDCoMKgwqDCoMKgIHEtPmNvbnMgPSBRX09WRihxLCBxLT5wcm9kKSB8IFFfV1JQKHEs IHEtPmNvbnMpIHwgUV9JRFgocSwgcS0+Y29ucyk7Cj4+IC3CoMKgwqAgcmV0dXJuIElSUV9IQU5E TEVEOwo+PiDCoCB9Cj4+IMKgIC1zdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfY21kcV9zeW5j X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQo+PiArc3RhdGljIHZvaWQgYXJtX3NtbXVfY21k cV9zeW5jX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq cmVncykKPiAKPiBEaXR0by4KRG9uZS4KCj4gCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCAvKiBXZSBk b24ndCBhY3R1YWxseSB1c2UgQ01EX1NZTkMgaW50ZXJydXB0cyBmb3IgYW55dGhpbmcgKi8KPj4g LcKgwqDCoCByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+IMKgIH0KPj4gwqAgwqAgc3RhdGljIGludCBh cm1fc21tdV9kZXZpY2VfZGlzYWJsZShzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KTsKPj4g wqAgLXN0YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9nZXJyb3JfaGFuZGxlcihpbnQgaXJxLCB2 b2lkICpkZXYpCj4+ICtzdGF0aWMgdm9pZCBhcm1fc21tdV9nZXJyb3JfaGFuZGxlcihpbnQgaXJx LCB2b2lkICpkZXYsIHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQo+IAo+IERpdHRvCkRvbmUu Cgo+IAo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgdTMyIGdlcnJvciwgZ2Vycm9ybiwgYWN0aXZlOwo+ PiDCoMKgwqDCoMKgIHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNtbXUgPSBkZXY7Cj4+IEBAIC0x MjY0LDcgKzE1MjEsNyBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgYXJtX3NtbXVfZ2Vycm9yX2hhbmRs ZXIoaW50IGlycSwgdm9pZCAqZGV2KQo+PiDCoCDCoMKgwqDCoMKgIGFjdGl2ZSA9IGdlcnJvciBe IGdlcnJvcm47Cj4+IMKgwqDCoMKgwqAgaWYgKCEoYWN0aXZlICYgR0VSUk9SX0VSUl9NQVNLKSkK Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBJUlFfTk9ORTsgLyogTm8gZXJyb3JzIHBlbmRpbmcg Ki8KPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsgLyogTm8gZXJyb3JzIHBlbmRpbmcgKi8KPj4g wqAgwqDCoMKgwqDCoCBkZXZfd2FybihzbW11LT5kZXYsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg ICJ1bmV4cGVjdGVkIGdsb2JhbCBlcnJvciByZXBvcnRlZCAoMHglMDh4KSwgdGhpcyBjb3VsZCBi ZSBzZXJpb3VzXG4iLAo+PiBAQCAtMTI4Niw3ICsxNTQzLDcgQEAgc3RhdGljIGlycXJldHVybl90 IGFybV9zbW11X2dlcnJvcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKPj4gwqAgwqDCoMKg wqDCoCBpZiAoYWN0aXZlICYgR0VSUk9SX01TSV9DTURRX0FCVF9FUlIpIHsKPj4gwqDCoMKgwqDC oMKgwqDCoMKgIGRldl93YXJuKHNtbXUtPmRldiwgIkNNRFEgTVNJIHdyaXRlIGFib3J0ZWRcbiIp Owo+PiAtwqDCoMKgwqDCoMKgwqAgYXJtX3NtbXVfY21kcV9zeW5jX2hhbmRsZXIoaXJxLCBzbW11 LT5kZXYpOwo+PiArwqDCoMKgwqDCoMKgwqAgYXJtX3NtbXVfY21kcV9zeW5jX2hhbmRsZXIoaXJx LCBzbW11LT5kZXYsIE5VTEwpOwo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgwqDCoMKgwqDCoCBpZiAo YWN0aXZlICYgR0VSUk9SX1BSSVFfQUJUX0VSUikKPj4gQEAgLTEyOTksNyArMTU1Niw2IEBAIHN0 YXRpYyBpcnFyZXR1cm5fdCBhcm1fc21tdV9nZXJyb3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk ZXYpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBhcm1fc21tdV9jbWRxX3NraXBfZXJyKHNtbXUpOwo+ PiDCoCDCoMKgwqDCoMKgIHdyaXRlbChnZXJyb3IsIHNtbXUtPmJhc2UgKyBBUk1fU01NVV9HRVJS T1JOKTsKPj4gLcKgwqDCoCByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+IMKgIH0KPj4gwqAgwqAgLyog SU9fUEdUQUJMRSBBUEkgKi8KPj4gQEAgLTEzMTEsMTEgKzE1NjcsMTMgQEAgc3RhdGljIHZvaWQg X19hcm1fc21tdV90bGJfc3luYyhzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQo+PiDCoMKg wqDCoMKgIGFybV9zbW11X2NtZHFfaXNzdWVfY21kKHNtbXUsICZjbWQpOwo+PiDCoCB9Cj4+IMKg ICsjaWYgMCAvKlhlbjogVW51c2VkIGZ1bmN0aW9uICovCj4+IMKgIHN0YXRpYyB2b2lkIGFybV9z bW11X3RsYl9zeW5jKHZvaWQgKmNvb2tpZSkKPj4gwqAgewo+PiDCoMKgwqDCoMKgIHN0cnVjdCBh cm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gY29va2llOwo+PiDCoMKgwqDCoMKgIF9fYXJt X3NtbXVfdGxiX3N5bmMoc21tdV9kb21haW4tPnNtbXUpOwo+PiDCoCB9Cj4+ICsjZW5kaWYKPj4g wqAgwqAgc3RhdGljIHZvaWQgYXJtX3NtbXVfdGxiX2ludl9jb250ZXh0KHZvaWQgKmNvb2tpZSkK Pj4gwqAgewo+PiBAQCAtMTMzNiw2ICsxNTk0LDcgQEAgc3RhdGljIHZvaWQgYXJtX3NtbXVfdGxi X2ludl9jb250ZXh0KHZvaWQgKmNvb2tpZSkKPj4gwqDCoMKgwqDCoCBfX2FybV9zbW11X3RsYl9z eW5jKHNtbXUpOwo+PiDCoCB9Cj4+IMKgICsjaWYgMCAvKlhlbjogVW51c2VkIGZ1bmN0aW9uYWxp dHkgKi8KPj4gwqAgc3RhdGljIHZvaWQgYXJtX3NtbXVfdGxiX2ludl9yYW5nZV9ub3N5bmModW5z aWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qgc2l6ZSwKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplX3QgZ3JhbnVsZSwgYm9vbCBsZWFmLCB2b2lkICpj b29raWUpCj4+IMKgIHsKPj4gQEAgLTEzNjIsNyArMTYyMSw3IEBAIHN0YXRpYyB2b2lkIGFybV9z bW11X3RsYl9pbnZfcmFuZ2Vfbm9zeW5jKHVuc2lnbmVkIGxvbmcgaW92YSwgc2l6ZV90IHNpemUs Cj4+IMKgwqDCoMKgwqAgfSB3aGlsZSAoc2l6ZSAtPSBncmFudWxlKTsKPj4gwqAgfQo+PiDCoCAt c3RhdGljIGNvbnN0IHN0cnVjdCBpb21tdV9nYXRoZXJfb3BzIGFybV9zbW11X2dhdGhlcl9vcHMg PSB7Cj4+ICtzdGF0aWMgc3RydWN0IGlvbW11X2dhdGhlcl9vcHMgYXJtX3NtbXVfZ2F0aGVyX29w cyA9IHsKPj4gwqDCoMKgwqDCoCAudGxiX2ZsdXNoX2FsbMKgwqDCoCA9IGFybV9zbW11X3RsYl9p bnZfY29udGV4dCwKPj4gwqDCoMKgwqDCoCAudGxiX2FkZF9mbHVzaMKgwqDCoCA9IGFybV9zbW11 X3RsYl9pbnZfcmFuZ2Vfbm9zeW5jLAo+PiDCoMKgwqDCoMKgIC50bGJfc3luY8KgwqDCoCA9IGFy bV9zbW11X3RsYl9zeW5jLAo+PiBAQCAtMTM4MCw2ICsxNjM5LDExIEBAIHN0YXRpYyBib29sIGFy bV9zbW11X2NhcGFibGUoZW51bSBpb21tdV9jYXAgY2FwKQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIGZhbHNlOwo+PiDCoMKgwqDCoMKgIH0KPj4gwqAgfQo+PiArI2VuZGlmCj4+ICsvKiBY ZW46IFN0dWIgb3V0IERNQSBkb21haW4gcmVsYXRlZCBmdW5jdGlvbnMgKi8KPj4gKyNkZWZpbmUg aW9tbXVfZ2V0X2RtYV9jb29raWUoZG9tKSAwCj4+ICsjZGVmaW5lIGlvbW11X3B1dF9kbWFfY29v a2llKGRvbSkgMAo+IAo+IFBsZWFzZSBzdHViIHRoZW0gYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4K RG9uZS4KCj4gCj4+ICsKPj4gwqAgwqAgc3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKmFybV9z bW11X2RvbWFpbl9hbGxvYyh1bnNpZ25lZCB0eXBlKQo+PiDCoCB7Cj4+IEBAIC0xNDEwLDYgKzE2 NzQsNyBAQCBzdGF0aWMgc3RydWN0IGlvbW11X2RvbWFpbiAqYXJtX3NtbXVfZG9tYWluX2FsbG9j KHVuc2lnbmVkIHR5cGUpCj4+IMKgwqDCoMKgwqAgcmV0dXJuICZzbW11X2RvbWFpbi0+ZG9tYWlu Owo+PiDCoCB9Cj4+IMKgICsjaWYgMAo+IAo+IFBsZWFzZSBleHBsYWluIHRoZSAjaWYgMAo+IApE b25lLgoKPj4gwqAgc3RhdGljIGludCBhcm1fc21tdV9iaXRtYXBfYWxsb2ModW5zaWduZWQgbG9u ZyAqbWFwLCBpbnQgc3BhbikKPj4gwqAgewo+PiDCoMKgwqDCoMKgIGludCBpZHgsIHNpemUgPSAx IDw8IHNwYW47Cj4+IEBAIC0xNDI3LDM2ICsxNjkyLDIwIEBAIHN0YXRpYyB2b2lkIGFybV9zbW11 X2JpdG1hcF9mcmVlKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IGlkeCkKPj4gwqAgewo+PiDCoMKg wqDCoMKgIGNsZWFyX2JpdChpZHgsIG1hcCk7Cj4+IMKgIH0KPj4gKyNlbmRpZgo+PiDCoCDCoCBz dGF0aWMgdm9pZCBhcm1fc21tdV9kb21haW5fZnJlZShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21h aW4pCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2Rv bWFpbiA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbik7Cj4+IC3CoMKgwqAgc3RydWN0IGFybV9zbW11 X2RldmljZSAqc21tdSA9IHNtbXVfZG9tYWluLT5zbW11Owo+PiAtCj4+IC3CoMKgwqAgaW9tbXVf cHV0X2RtYV9jb29raWUoZG9tYWluKTsKPj4gLcKgwqDCoCBmcmVlX2lvX3BndGFibGVfb3BzKHNt bXVfZG9tYWluLT5wZ3RibF9vcHMpOwo+PiAtCj4+IC3CoMKgwqAgLyogRnJlZSB0aGUgQ0QgYW5k IEFTSUQsIGlmIHdlIGFsbG9jYXRlZCB0aGVtICovCj4+IC3CoMKgwqAgaWYgKHNtbXVfZG9tYWlu LT5zdGFnZSA9PSBBUk1fU01NVV9ET01BSU5fUzEpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHN0cnVj dCBhcm1fc21tdV9zMV9jZmcgKmNmZyA9ICZzbW11X2RvbWFpbi0+czFfY2ZnOwo+PiAtCj4+IC3C oMKgwqDCoMKgwqDCoCBpZiAoY2ZnLT5jZHB0cikgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBkbWFtX2ZyZWVfY29oZXJlbnQoc21tdV9kb21haW4tPnNtbXUtPmRldiwKPj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIENUWERFU0NfQ0RfRFdPUkRTIDw8 IDMsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjZmct PmNkcHRyLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y2ZnLT5jZHB0cl9kbWEpOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFybV9zbW11 X2JpdG1hcF9mcmVlKHNtbXUtPmFzaWRfbWFwLCBjZmctPmNkLmFzaWQpOwo+PiAtwqDCoMKgwqDC oMKgwqAgfQo+PiAtwqDCoMKgIH0gZWxzZSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXJt X3NtbXVfczJfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMyX2NmZzsKPj4gLcKgwqDCoMKgwqDC oMKgIGlmIChjZmctPnZtaWQpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFybV9zbW11X2Jp dG1hcF9mcmVlKHNtbXUtPnZtaWRfbWFwLCBjZmctPnZtaWQpOwo+PiAtwqDCoMKgIH0KPj4gK8Kg wqDCoCAvKgo+PiArwqDCoMKgwqAgKiBYZW46IFJlbW92ZSB0aGUgZnJlZSBmdW5jdGlvbnMgdGhh dCBhcmUgbm90IHVzZWQgYW5kIGNvZGUgcmVsYXRlZAo+PiArwqDCoMKgwqAgKiB0byBTMSB0cmFu c2xhdGlvbi4gV2UganVzdCBuZWVkIHRvIGZyZWUgdGhlIGRvbWFpbiBoZXJlLgo+PiArwqDCoMKg wqAgKi8KPiAKPiBQbGVhc2UgdXNlICNpZiAwIHJhdGhlciB0aGFuIHJlbW92aW5nIHRoZSBjb2Rl ICsgY29tbWVudCBvbiB0b3AuIEJ1dCBJIGFtIG5vdCBzdXJlIHdoeSB5b3UgZHJvcCB0aGUgUzIg ZnJlZSBjb2RlLiBTaG91bGRuJ3Qgd2UgYWxsb2NhdGUgVk1JRCBmcm9tIHRoZSBTTU1VPwpJIGFt IHBpY2tpbmcgdXAgdGhlIHZtaWQgZnJvbSB0aGUgZG9tYWluIEkgYW0gc2hhcmluZyB0aGUgcGFn ZSB0YWJsZXMgd2l0aC4gZG9tYWluLT5hcmNoLnAybS52bWlkLiBUaGlzIHNlZW1lZCB2YWxpZC4g UGxlYXNlIGxldCBtZSBrbm93IGlmIHdlIHdhbnQgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgdm1p ZD8KCgo+IAo+PiDCoCDCoMKgwqDCoMKgIGtmcmVlKHNtbXVfZG9tYWluKTsKPj4gwqAgfQo+PiDC oCArI2lmIDAKPj4gwqAgc3RhdGljIGludCBhcm1fc21tdV9kb21haW5fZmluYWxpc2VfczEoc3Ry dWN0IGFybV9zbW11X2RvbWFpbiAqc21tdV9kb21haW4sCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgaW9fcGd0YWJsZV9jZmcgKnBndGJs X2NmZykKPj4gwqAgewo+PiBAQCAtMTQ4OCwzMyArMTczNywzMCBAQCBvdXRfZnJlZV9hc2lkOgo+ PiDCoMKgwqDCoMKgIGFybV9zbW11X2JpdG1hcF9mcmVlKHNtbXUtPmFzaWRfbWFwLCBhc2lkKTsK Pj4gwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiDCoCB9Cj4+ICsjZW5kaWYKPj4gwqAgLXN0YXRp YyBpbnQgYXJtX3NtbXVfZG9tYWluX2ZpbmFsaXNlX3MyKHN0cnVjdCBhcm1fc21tdV9kb21haW4g KnNtbXVfZG9tYWluLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3RydWN0IGlvX3BndGFibGVfY2ZnICpwZ3RibF9jZmcpCj4+ICtzdGF0aWMgaW50IGFy bV9zbW11X2RvbWFpbl9maW5hbGlzZV9zMihzdHJ1Y3QgYXJtX3NtbXVfZG9tYWluICpzbW11X2Rv bWFpbikKPj4gwqAgewo+PiAtwqDCoMKgIGludCB2bWlkOwo+PiAtwqDCoMKgIHN0cnVjdCBhcm1f c21tdV9kZXZpY2UgKnNtbXUgPSBzbW11X2RvbWFpbi0+c21tdTsKPj4gwqDCoMKgwqDCoCBzdHJ1 Y3QgYXJtX3NtbXVfczJfY2ZnICpjZmcgPSAmc21tdV9kb21haW4tPnMyX2NmZzsKPj4gwqAgLcKg wqDCoCB2bWlkID0gYXJtX3NtbXVfYml0bWFwX2FsbG9jKHNtbXUtPnZtaWRfbWFwLCBzbW11LT52 bWlkX2JpdHMpOwo+PiAtwqDCoMKgIGlmICh2bWlkIDwgMCkKPj4gLcKgwqDCoMKgwqDCoMKgIHJl dHVybiB2bWlkOwo+PiArwqDCoMKgIC8qIFhlbjogU2V0IHRoZSB2YWx1ZXMgYXMgbmVlZGVkICov Cj4+IMKgIC3CoMKgwqAgY2ZnLT52bWlkwqDCoMKgID0gKHUxNil2bWlkOwo+PiAtwqDCoMKgIGNm Zy0+dnR0YnLCoMKgwqAgPSBwZ3RibF9jZmctPmFybV9scGFlX3MyX2NmZy52dHRicjsKPj4gLcKg wqDCoCBjZmctPnZ0Y3LCoMKgwqAgPSBwZ3RibF9jZmctPmFybV9scGFlX3MyX2NmZy52dGNyOwo+ PiArwqDCoMKgIGNmZy0+dm1pZMKgwqDCoCA9IGNmZy0+ZG9tYWluLT5hcmNoLnAybS52bWlkOwo+ IAo+IFNlZSBteSBjb21tZW50IGFib3ZlLgpJIGFtIHdvbmRlcmluZyB3aHkgd2UgYXJlIGNvbnNp ZGVyaW5nIHRoaXMgdmFsdWUgaW52YWxpZD8gU2luY2UgdGhlIHBhZ2UgdGFibGVzIGFyZSBzaGFy ZWQgd2UgY2FuIHVzZSB0aGUgdm1pZCBmcm9tIHRoZSBkb21haW4uIElzIHRoZSBjb25jZXJuIHJl Z2FyZGluZyB0aGUgc2l6ZT8KClRoYW5rcywKU2FtZWVyCj4gCj4+ICvCoMKgwqAgY2ZnLT52dHRi csKgwqDCoCA9IHBhZ2VfdG9fbWFkZHIoY2ZnLT5kb21haW4tPmFyY2gucDJtLnJvb3QpOwo+PiAr wqDCoMKgIGNmZy0+dnRjcsKgwqDCoCA9IFJFQURfU1lTUkVHMzIoVlRDUl9FTDIpOwo+IAo+IFRo aXMgbG9va3MgYSBiaXQgc3VzcGljaW91cy4gTG9va2luZyBhdCB0aGUgc3BlY3MsIHRoZSBiaXRz IGRvZXMgbm90IHNlZW0gdG8gY29ycmVzcG9uZCBoZXJlLgo+IAo+IEkgd2lsbCBsb29rIGF0IHRo ZSByZXN0IGVpdGhlciB0b21vcnJvdyBvciBNb25kYXkuCj4gCj4gQ2hlZXJzLAo+IAoKLS0gCiBR dWFsY29tbSBEYXRhY2VudGVyIFRlY2hub2xvZ2llcyBhcyBhbiBhZmZpbGlhdGUgb2YgUXVhbGNv bW0gVGVjaG5vbG9naWVzLCBJbmMuIFF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jLiBpcyBhIG1l bWJlciBvZiB0aGUgQ29kZSBBdXJvcmEgRm9ydW0sIGEgTGludXggRm91bmRhdGlvbiBDb2xsYWJv cmF0aXZlIFByb2plY3QuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0 dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK