From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 32A6FC7115B for ; Mon, 23 Jun 2025 17:22:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=BfRy6yvNrp8erByNStrJXmejz0541inprzZxymtgEXA=; b=K9IBYiUYT3EhUr VI8YjcPgczeOv0E+IkHMguLL0ozkCDDlfNYcPinoC0fQ4YMTEfh1Rj5FR5RwcHNgOvDGGbveYgjWe 17wa5RbKft11eb9+WBA53Z72XmdnQ1LSPSxbT50Nd5T8NWwzk1zjrk7JyoEmeKVDlm6n2JWi+qlHz RUlkp2t4v7rxrOU1X9seXFlQmE90sEu+YHBNVZLoiWDxTAJZbnjXgxJeTahZbCDMTdsuE2S2FFz3S Xhsv+ijF0+566RYB0izVrySwSut4/OLakiCvpadWsEvm+18gsVsgPxlAQ4tA7kH3mqU1mS0otH+wg 6hi1W/0pRYP0hMY/epJg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uTksO-00000003XaB-3wxl; Mon, 23 Jun 2025 17:22:36 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1uThlt-00000002y6h-3r2i; Mon, 23 Jun 2025 14:03:43 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1750687398; cv=none; d=zohomail.com; s=zohoarc; b=IrHnhQTrKYO0A/KKitKHEsB3k7n78I710vXzyb83hQ3HSPu8tjD2frA5FVahWfB8/LalO4j79j50rCPQbNFoj0QnoLeBWHjJhROkHx4SHNJaaiZG7aabMtDQTU7J1o6tghJsHLFPnYV6Uw6wH9Rrm+iaim8W/VDn9O5A/jsz8ig= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1750687398; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=tH69hzErNEHwY3DSpnc141pu/Uk6mJ1ByRr7g0Vegmg=; b=e0cBTUaaXx8R5lYgFOH6oAsnSuN93rKdU4Es3D9gzktN1t7W3TbBmrWngUEcUmBbzgExvoEMUYvCWFoz1zpNpu4a5GM8nNdnNbCyiUN0uXaIVotMs55t1NQIFNs/dIdbPGt31niqzdWj1fdt1oo3orXwg4Y+DEqq+oVbmabOWqY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=benjamin.gaignard@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1750687398; s=zohomail; d=collabora.com; i=benjamin.gaignard@collabora.com; h=Message-ID:Date:Date:MIME-Version:Subject:Subject:To:To:Cc:Cc:References:From:From:In-Reply-To:Content-Type:Content-Transfer-Encoding:Message-Id:Reply-To; bh=tH69hzErNEHwY3DSpnc141pu/Uk6mJ1ByRr7g0Vegmg=; b=jVII6JANezBOBgD0TzyYvjQsIphSqaJcANY5PJTMDDnAdnl/E2Ge+xm2/ZgNdoa3 h4ylbtsqN7GdqVKR16IJRSMxiF+PxR00DimOKYweknMaabMe/AeuDsn8q8gw/ozbpof PLJ8x18Y0Psqqg6OQAE35Y6BXhJSd3L3CVqgR1/Q= Received: by mx.zohomail.com with SMTPS id 1750687397015674.8206858168603; Mon, 23 Jun 2025 07:03:17 -0700 (PDT) Message-ID: <4d5a82da-fbaf-42c1-8b89-557c47032c46@collabora.com> Date: Mon, 23 Jun 2025 16:03:12 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 3/5] iommu: Add verisilicon IOMMU driver To: Robin Murphy , joro@8bytes.org, will@kernel.org, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org, heiko@sntech.de, nicolas.dufresne@collabora.com, jgg@ziepe.ca Cc: iommu@lists.linux.dev, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, kernel@collabora.com References: <20250619131232.69208-1-benjamin.gaignard@collabora.com> <20250619131232.69208-4-benjamin.gaignard@collabora.com> <43276c9a-5434-467c-abb2-dd2806ab81d0@arm.com> Content-Language: en-US From: Benjamin Gaignard In-Reply-To: <43276c9a-5434-467c-abb2-dd2806ab81d0@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250623_070342_070448_1FCEFFBC X-CRM114-Status: GOOD ( 47.63 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org CkxlIDIwLzA2LzIwMjUgw6AgMjE6MzcsIFJvYmluIE11cnBoeSBhIMOpY3JpdMKgOgo+IE9uIDE5 LzA2LzIwMjUgMjoxMiBwbSwgQmVuamFtaW4gR2FpZ25hcmQgd3JvdGU6Cj4+IFRoZSBWZXJpc2ls aWNvbiBJT01NVSBoYXJkd2FyZSBibG9jayBjYW4gYmUgZm91bmQgaW4gY29tYmluYXRpb24KPj4g d2l0aCBWZXJpc2lsaWNvbiBoYXJkd2FyZSB2aWRlbyBjb2RlY3MgKGVuY29kZXJzIG9yIGRlY29k ZXJzKSBvbgo+PiBkaWZmZXJlbnQgU29Dcy4KPj4gRW5hYmxlIGl0IHdpbGwgYWxsb3cgdXMgdG8g dXNlIG5vbiBjb250aWd1b3VzIG1lbW9yeSBhbGxvY2F0b3JzCj4+IGZvciBWZXJpc2lsaWNvbiB2 aWRlbyBjb2RlY3MuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IEJlbmphbWluIEdhaWduYXJkIDxiZW5q YW1pbi5nYWlnbmFyZEBjb2xsYWJvcmEuY29tPgo+PiAtLS0KPj4gY2hhbmdlcyBpbiB2ZXJzaW9u IDM6Cj4+IC0gQ2hhbmdlIGNvbXBhdGlibGUgdG8gInJvY2tjaGlwLHJrMzU4OC1pb21tdS0xLjIi Cj4+IC0gQ3JlYXRlIGFuIGlkZW50aXR5IGRvbWFpbiBmb3IgdGhlIGRyaXZlcgo+PiAtIEZpeCBk b3VibGUgZmx1c2ggaXNzdWUKPj4gLSBSZXdvcmsgYXR0YWNoL2RldGFjaCBsb2dpYwo+PiAtIFNp bXBsaWZ5IHhsYXRlIGZ1bmN0aW9uCj4+IC0gRGlzY292ZXIgaW9tbXUgZGV2aWNlIGxpa2UgZG9u ZSBpbiBBUk0gZHJpdmVyCj4+IC0gUmVtb3ZlIEFSTV9ETUFfVVNFX0lPTU1VIGZyb20gS2NvbmZp Zwo+Pgo+PiDCoCBkcml2ZXJzL2lvbW11L0tjb25maWfCoMKgwqDCoCB8wqAgMTEgKwo+PiDCoCBk cml2ZXJzL2lvbW11L01ha2VmaWxlwqDCoMKgIHzCoMKgIDEgKwo+PiDCoCBkcml2ZXJzL2lvbW11 L3ZzaS1pb21tdS5jIHwgODc0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4+IMKgIDMgZmlsZXMgY2hhbmdlZCwgODg2IGluc2VydGlvbnMoKykKPj4gwqAgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvaW9tbXUvdnNpLWlvbW11LmMKPj4KPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvaW9tbXUvS2NvbmZpZyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwo+PiBpbmRleCAwYTMz ZDk5NWQxNWQuLjNlOTVkMWRiNzM3YiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9pb21tdS9LY29u ZmlnCj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUvS2NvbmZpZwo+PiBAQCAtMzgzLDQgKzM4MywxNSBA QCBjb25maWcgU1BSRF9JT01NVQo+PiDCoCDCoMKgwqDCoMKgwqDCoCBTYXkgWSBoZXJlIGlmIHlv dSB3YW50IHRvIHVzZSB0aGUgbXVsdGltZWRpYSBkZXZpY2VzIGxpc3RlZCAKPj4gYWJvdmUuCj4+ IMKgICtjb25maWcgVlNJX0lPTU1VCj4+ICvCoMKgwqAgdHJpc3RhdGUgIlZlcmlzaWxpY29uIElP TU1VIFN1cHBvcnQiCj4+ICvCoMKgwqAgZGVwZW5kcyBvbiBBUk02NAo+Cj4gIihBUkNIX1JPQ0tD SElQICYmIEFSTTY0KSB8fCBDT01QSUxFX1RFU1QiLCBwcm9iYWJseS4gT3RoZXJ3aXNlIHlvdSAK PiBtaWdodCByaXNrIGFubm95aW5nIEdlZXJ0IDopCj4KPj4gK8KgwqDCoCBzZWxlY3QgSU9NTVVf QVBJCj4+ICvCoMKgwqAgaGVscAo+PiArwqDCoMKgwqDCoCBTdXBwb3J0IGZvciBJT01NVXMgdXNl ZCBieSBWZXJpc2lsaWNvbiBzdWItc3lzdGVtcyBsaWtlIHZpZGVvCj4+ICvCoMKgwqDCoMKgIGRl Y29kZXJzIG9yIGVuY29kZXIgaGFyZHdhcmUgYmxvY2tzLgo+PiArCj4+ICvCoMKgwqDCoMKgIFNh eSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgSU9NTVUgaW4gZnJvbnQgb2YgdGhlc2UK Pj4gK8KgwqDCoMKgwqAgaGFyZHdhcmUgYmxvY2tzLgo+PiArCj4+IMKgIGVuZGlmICMgSU9NTVVf U1VQUE9SVAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9NYWtlZmlsZSBiL2RyaXZlcnMv aW9tbXUvTWFrZWZpbGUKPj4gaW5kZXggMzU1Mjk0ZmE5MDMzLi42OGFlZmYzMWFmOGIgMTAwNjQ0 Cj4+IC0tLSBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKPj4gKysrIGIvZHJpdmVycy9pb21tdS9N YWtlZmlsZQo+PiBAQCAtMzQsMyArMzQsNCBAQCBvYmotJChDT05GSUdfSU9NTVVfU1ZBKSArPSBp b21tdS1zdmEubwo+PiDCoCBvYmotJChDT05GSUdfSU9NTVVfSU9QRikgKz0gaW8tcGdmYXVsdC5v Cj4+IMKgIG9iai0kKENPTkZJR19TUFJEX0lPTU1VKSArPSBzcHJkLWlvbW11Lm8KPj4gwqAgb2Jq LSQoQ09ORklHX0FQUExFX0RBUlQpICs9IGFwcGxlLWRhcnQubwo+PiArb2JqLSQoQ09ORklHX1ZT SV9JT01NVSkgKz0gdnNpLWlvbW11Lm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvdnNp LWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L3ZzaS1pb21tdS5jCj4+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uODllNjNhNmE2MGMxCj4+IC0tLSAvZGV2L251bGwK Pj4gKysrIGIvZHJpdmVycy9pb21tdS92c2ktaW9tbXUuYwo+PiBAQCAtMCwwICsxLDg3NCBAQAo+ PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+PiArLyogQ29weXJp Z2h0IChDKSAyMDI1IENvbGxhYm9yYSBMdGQuCj4+ICsgKgo+PiArICogSU9NTVUgQVBJIGZvciBW ZXJpc2lsaWNvbgo+PiArICoKPj4gKyAqIE1vZHVsZSBBdXRob3JzOsKgwqDCoCBZYW5kb25nIExp biA8eWFuZG9uZy5saW5Acm9jay1jaGlwcy5jb20+Cj4+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgU2ltb24gWHVlIDx4eG1Acm9jay1jaGlwcy5jb20+Cj4+ICsgKsKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgQmVuamFtaW4gR2FpZ25hcmQgPGJlbmphbWluLmdhaWduYXJkQGNvbGxhYm9yYS5jb20+ Cj4+ICsgKi8KPj4gKwo+PiArI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgo+PiArI2luY2x1ZGUgPGxp bnV4L2NvbXBpbGVyLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPj4gKyNpbmNsdWRl IDxsaW51eC9kZXZpY2UuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+PiAr I2luY2x1ZGUgPGxpbnV4L2RtYS1tYXAtb3BzLmg+Cj4KPiBUaGlzIHNob3VsZG4ndCBiZSBoZXJl LCBpdCdzIGEgZGV2aWNlIGRyaXZlciBub3QgYSBETUEgQVBJIAo+IGltcGxlbWVudGF0aW9uLgo+ Cj4+ICsjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvaW8u aD4KPj4gKyNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2lvcG9s bC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9tbS5o Pgo+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L29mLmg+ Cj4+ICsjaW5jbHVkZSA8bGludXgvb2ZfaW9tbXUuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9vZl9w bGF0Zm9ybS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+PiArI2lu Y2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+ ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KPj4gKwo+PiArI2luY2x1ZGUgImlvbW11LXBh Z2VzLmgiCj4+ICsKPj4gK3N0cnVjdCB2c2lfaW9tbXUgewo+PiArwqDCoMKgIHN0cnVjdCBkZXZp Y2UgKmRldjsKPj4gK8KgwqDCoCB2b2lkIF9faW9tZW0gKipiYXNlczsKPj4gK8KgwqDCoCBpbnQg bnVtX21tdTsKPgo+IFdoYXQgYXJlIHRoZXNlIGZvciwgZ2l2ZW4gdGhlIGJpbmRpbmcgc3BlY2lm aWVzIGEgc2luZ2xlICJyZWciPwo+Cj4gSWYgeW91IGRvIGFudGljaXBhdGUgc3VwcG9ydGluZyBt dWx0aXBsZSBNTVVzIHBlciBjbGllbnQgZGV2aWNlLCBJIAo+IHdvdWxkIHN0aWxsIHN0cm9uZ2x5 IGNvbnNpZGVyIGZvbGxvd2luZyB0aGUgZXh5bm9zLWlvbW11IGFwcHJvYWNoIG9mIAo+IGxpbmtp bmcgZGlzdGluY3QgaW5zdGFuY2VzIHRvZ2V0aGVyIGludGVybmFsbHkgLSB0aGUgInNpbmdsZSBp bnN0YW5jZSAKPiB3aXRoIG11bHRpcGxlIGludGVyZmFjZXMiIG1vZGVsIGlzIGEgYml0IG9mIGEg Ym9kZ2UsIGFuZCBoYXMgdGhlIGJpZyAKPiB3ZWFrbmVzcyB0aGF0IHlvdSB0ZW5kIHRvIGVuZCB1 cCBmb3JldmVyIGhhdmluZyB0byBldm9sdmUgdGhlIAo+ICJjbG9ja3MiLCAiaW50ZXJydXB0cyIg ZXRjLiBiaW5kaW5ncyBpbiB3ZWlyZCBhbmQgYXJiaXRyYXJ5IHdheXMgZm9yIAo+IGRpZmZlcmVu dCBpbnRlZ3JhdGlvbnMuIEVzcGVjaWFsbHkgaWYgdGhpcyBpcyBhIDNyZC1wYXJ0eSBJUCB0aGF0 J3MgCj4gbGlhYmxlIHRvIGJlIHVzZWQgYnkgbXVsdGlwbGUgZGlmZmVyZW50IFNvQyB2ZW5kb3Jz LgoKTm8sIEkgZG8gbm90IHBsYW4gdG8gc3VwcG9ydCBtdWx0aXBsZSBNTVVzIHBlciBjbGllbnQg ZGV2aWNlLgpJIHdpbGwgc2ltcGxpZnkgaXQgYW5kIHVzZSBvbmx5IHZvaWQgX19pb21lbSAqcmVn cyBpbnN0ZWFkLgoKPgo+PiArwqDCoMKgIGludCBudW1faXJxOwo+PiArwqDCoMKgIHN0cnVjdCBj bGtfYnVsa19kYXRhICpjbG9ja3M7Cj4+ICvCoMKgwqAgaW50IG51bV9jbG9ja3M7Cj4+ICvCoMKg wqAgc3RydWN0IGlvbW11X2RldmljZSBpb21tdTsKPj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFk IG5vZGU7IC8qIGVudHJ5IGluIHZzaV9pb21tdV9kb21haW4uaW9tbXVzICovCj4+ICvCoMKgwqAg c3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluOyAvKiBkb21haW4gdG8gd2hpY2ggaW9tbXUgaXMg Cj4+IGF0dGFjaGVkICovCj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgdnNpX2lvbW11X2RvbWFpbiB7 Cj4+ICvCoMKgwqAgc3RydWN0IGRldmljZSAqZG1hX2RldjsKPj4gK8KgwqDCoCBzdHJ1Y3QgbGlz dF9oZWFkIGlvbW11czsKPj4gK8KgwqDCoCB1MzIgKmR0OyAvKiBwYWdlIGRpcmVjdG9yeSB0YWJs ZSAqLwo+PiArwqDCoMKgIGRtYV9hZGRyX3QgZHRfZG1hOwo+PiArwqDCoMKgIHNwaW5sb2NrX3Qg aW9tbXVzX2xvY2s7IC8qIGxvY2sgZm9yIGlvbW11cyBsaXN0ICovCj4+ICvCoMKgwqAgc3Bpbmxv Y2tfdCBkdF9sb2NrOyAvKiBsb2NrIGZvciBtb2RpZnlpbmcgcGFnZSBkaXJlY3RvcnkgdGFibGUg Ki8KPj4gK8KgwqDCoCBzdHJ1Y3QgaW9tbXVfZG9tYWluIGRvbWFpbjsKPj4gK8KgwqDCoCAvKiBm b3IgdnNpIGlvbW11ICovCj4KPiBXYWl0LCBzbyB3aG8gaXMgdGhlIHJlc3Qgb2YgdGhpcyBkcml2 ZXItcHJpdmF0ZSBzdHJ1Y3R1cmUgZm9yLCBpZiBub3QgCj4gYWxzbyBmb3IgdGhpcyBkcml2ZXI/ IDovCgpJIHdpbGwgcmVtb3ZlIHRoaXMgdXNlbGVzcyBjb21tZW50LgoKPgo+PiArwqDCoMKgIHU2 NCAqcHRhOyAvKiBwYWdlIGRpcmVjdG9yeSB0YWJsZSAqLwo+PiArwqDCoMKgIGRtYV9hZGRyX3Qg cHRhX2RtYTsKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWluIHZzaV9p ZGVudGl0eV9kb21haW47Cj4+ICsKPj4gKyNkZWZpbmUgTlVNX0RUX0VOVFJJRVPCoMKgwqAgMTAy NAo+PiArI2RlZmluZSBOVU1fUFRfRU5UUklFU8KgwqDCoCAxMDI0Cj4+ICsjZGVmaW5lIFBUX1NJ WkXCoMKgwqDCoMKgwqDCoCAoTlVNX1BUX0VOVFJJRVMgKiBzaXplb2YodTMyKSkKPj4gKwo+PiAr I2RlZmluZSBTUEFHRV9TSVpFwqDCoMKgIEJJVCgxMikKPj4gKwo+PiArLyogdnNpIGlvbW11IHJl Z3MgYWRkcmVzcyAqLwo+PiArI2RlZmluZSBWU0lfTU1VX0NPTkZJRzFfQkFTRcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgMHgxYWMKPj4gKyNkZWZpbmUgVlNJX01NVV9BSEJfRVhDRVBUSU9OX0JBU0XC oMKgwqDCoMKgwqDCoCAweDM4MAo+PiArI2RlZmluZSBWU0lfTU1VX0FIQl9DT05UUk9MX0JBU0XC oMKgwqDCoMKgwqDCoCAweDM4OAo+PiArI2RlZmluZSBWU0lfTU1VX0FIQl9UQkxfQVJSQVlfQkFT RV9MX0JBU0XCoMKgwqAgMHgzOEMKPj4gKwo+PiArLyogTU1VIHJlZ2lzdGVyIG9mZnNldHMgKi8K Pj4gKyNkZWZpbmUgVlNJX01NVV9GTFVTSF9CQVNFwqDCoMKgwqDCoMKgwqAgMHgxODQKPj4gKyNk ZWZpbmUgVlNJX01NVV9CSVRfRkxVU0jCoMKgwqDCoMKgwqDCoCBCSVQoNCkKPj4gKwo+PiArI2Rl ZmluZSBWU0lfTU1VX1BBR0VfRkFVTFRfQUREUsKgwqDCoMKgwqDCoMKgIDB4MzgwCj4+ICsjZGVm aW5lIFZTSV9NTVVfU1RBVFVTX0JBU0XCoMKgwqDCoMKgwqDCoCAweDM4NMKgwqDCoCAvKiBJUlEg c3RhdHVzICovCj4+ICsKPj4gKyNkZWZpbmUgVlNJX01NVV9CSVRfRU5BQkxFwqDCoMKgwqDCoMKg wqAgQklUKDApCj4+ICsKPj4gKyNkZWZpbmUgVlNJX01NVV9PVVRfT0ZfQk9VTkTCoMKgwqDCoMKg wqDCoCBCSVQoMjgpCj4+ICsvKiBJcnEgbWFzayAqLwo+PiArI2RlZmluZSBWU0lfTU1VX0lSUV9N QVNLwqDCoMKgwqDCoMKgwqAgMHg3Cj4+ICsKPj4gKyNkZWZpbmUgVlNJX0RURV9QVF9BRERSRVNT X01BU0vCoMKgwqDCoMKgwqDCoCAweGZmZmZmZmMwCj4KPiBJJ20gY3VyaW91cyB3aGF0IHRob3Nl IGxvd2VzdCA2IGJpdHMgYXJlIGZvciAtIGRvZXMgaXQgcmVhbGx5IG9ubHkgCj4gcmVxdWlyZSA2 NC1ieXRlIGFsaWdubWVudCBmb3IgcGFnZXRhYmxlcywgb3IgY2FuIGl0IGFjdHVhbGx5IAo+IGFj Y29tbW9kYXRlIGEgZm9sZGVkID4zMi1iaXQgYWRkcmVzcyBzaW1pbGFyIHRvIHRoZSBQVEUgbGV2 ZWw/CgpJIGRvIG5vdCBoYXZlIHRoZXNlIGluZm8gYmVjYXVzZSB0aGUgaGFyZHdhcmUgaXNuJ3Qg ZG9jdW1lbnRlZC4KVGhlIG9ubHkgaGludHMgYXJlIGluIHRoZSBvcmlnaW5hbCBkcml2ZXIgaGVy ZToKaHR0cHM6Ly9naXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L2tlcm5lbC9ibG9iL2RldmVsb3At Ni4xL2RyaXZlcnMvaW9tbXUvcm9ja2NoaXAtaW9tbXUtYXYxZC5jCklmIHNvbWVvbmUgZnJvbSBy b2NrY2hpcCBvciB2ZXJpc2lsaWNvbiByZWFkIHRoaXMgdGhyZWFkLCB5b3UgYXJlIHdlbGNvbWUK dG8gY29tbWVudCBpdCBhbmQgcHJvdmlkZSB1cyBtb3JlIGluZm8gOi0pCgo+Cj4+ICsjZGVmaW5l IFZTSV9EVEVfUFRfVkFMSUTCoMKgwqDCoMKgwqDCoCBCSVQoMCkKPj4gKwo+PiArI2RlZmluZSBW U0lfUEFHRV9ERVNDX0xPX01BU0vCoMKgwqDCoMKgwqDCoCAweGZmZmZmMDAwCj4+ICsjZGVmaW5l IFZTSV9QQUdFX0RFU0NfSElfTUFTS8KgwqDCoMKgwqDCoMKgIEdFTk1BU0tfVUxMKDM5LCAzMikK Pj4gKyNkZWZpbmUgVlNJX1BBR0VfREVTQ19ISV9TSElGVMKgwqDCoMKgwqDCoMKgICgzMiAtIDQp Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgdnNpX2R0ZV9wdF9hZGRyZXNzKHUz MiBkdGUpCj4+ICt7Cj4+ICvCoMKgwqAgcmV0dXJuIChwaHlzX2FkZHJfdClkdGUgJiBWU0lfRFRF X1BUX0FERFJFU1NfTUFTSzsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB1MzIgdnNpX21r X2R0ZSh1MzIgZHRlKQo+PiArewo+PiArwqDCoMKgIHJldHVybiAocGh5c19hZGRyX3QpZHRlIHwg VlNJX0RURV9QVF9WQUxJRDsKPj4gK30KPj4gKwo+PiArI2RlZmluZSBWU0lfUFRFX1BBR0VfQURE UkVTU19NQVNLwqDCoMKgIDB4ZmZmZmZmZjAKPj4gKyNkZWZpbmUgVlNJX1BURV9QQUdFX1dSSVRB QkxFwqDCoMKgwqDCoMKgwqAgQklUKDIpCj4KPiBBbnkgaWRlYSBpZiB0aGVyZSBhcmUgb3RoZXIg dXNlZnVsIHBlcm1pc3Npb24gYml0cz8KCk5vIChzYW1lIHJlYXNvbiB0aGFuIGFib3ZlKQoKPgo+ PiArI2RlZmluZSBWU0lfUFRFX1BBR0VfVkFMSUTCoMKgwqDCoMKgwqDCoCBCSVQoMCkKPj4gKwo+ PiArc3RhdGljIGlubGluZSBwaHlzX2FkZHJfdCB2c2lfcHRlX3BhZ2VfYWRkcmVzcyh1MzIgcHRl KQo+PiArewo+PiArwqDCoMKgIHU2NCBwdGVfdnNpID0gcHRlOwo+PiArCj4+ICvCoMKgwqAgcHRl X3ZzaSA9ICgocHRlX3ZzaSAmIFZTSV9QQUdFX0RFU0NfSElfTUFTSykgPDwgCj4+IFZTSV9QQUdF X0RFU0NfSElfU0hJRlQpIHwKPgo+ICIocHRlX3ZzaSAmIFZTSV9QQUdFX0RFU0NfSElfTUFTSyki IHdpbGwgYnkgZGVmaW5pdGlvbiBiZSAwLgoKSSB3aWxsIHJlbW92ZSBpdC4KCj4KPj4gK8KgwqDC oMKgwqDCoMKgwqDCoCAocHRlX3ZzaSAmIFZTSV9QQUdFX0RFU0NfTE9fTUFTSyk7Cj4+ICsKPj4g K8KgwqDCoCByZXR1cm4gKHBoeXNfYWRkcl90KXB0ZV92c2k7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyB1MzIgdnNpX21rX3B0ZShwaHlzX2FkZHJfdCBwYWdlLCBpbnQgcHJvdCkKPj4gK3sKPj4gK8Kg wqDCoCB1MzIgZmxhZ3MgPSAwOwo+PiArCj4+ICvCoMKgwqAgZmxhZ3MgfD0gKHByb3QgJiBJT01N VV9XUklURSkgPyBWU0lfUFRFX1BBR0VfV1JJVEFCTEUgOiAwOwo+PiArwqDCoMKgIHBhZ2UgPSAo cGFnZSAmIFZTSV9QQUdFX0RFU0NfTE9fTUFTSykgfAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAg KChwYWdlICYgVlNJX1BBR0VfREVTQ19ISV9NQVNLKSA+PiBWU0lfUEFHRV9ERVNDX0hJX1NISUZU KTsKPj4gK8KgwqDCoCBwYWdlICY9IFZTSV9QVEVfUEFHRV9BRERSRVNTX01BU0s7Cj4KPiBJZiBW U0lfUEFHRV9ERVNDX0xPX01BU0sgYW5kIFZTSV9QQUdFX0RFU0NfSElfTUFTSyBhcmUgY29ycmVj dCB0byAKPiBzdGFydCB3aXRoIHRoZW4gVlNJX1BURV9QQUdFX0FERFJFU1NfTUFTSyBzZXJ2ZXMg bm8gcHVycG9zZS4KCllvdSBhcmUgcmlnaHQgSSB3aWxsIHJlbW92ZSBpdC4KCj4KPj4gK8KgwqDC oCByZXR1cm4gcGFnZSB8IGZsYWdzIHwgVlNJX1BURV9QQUdFX1ZBTElEOwo+PiArfQo+PiArCj4+ ICsjZGVmaW5lIFZTSV9EVEVfUFRfVkFMSUTCoMKgwqAgQklUKDApCj4+ICsKPj4gK3N0YXRpYyBp bmxpbmUgYm9vbCB2c2lfZHRlX2lzX3B0X3ZhbGlkKHUzMiBkdGUpCj4+ICt7Cj4+ICvCoMKgwqAg cmV0dXJuIGR0ZSAmIFZTSV9EVEVfUFRfVkFMSUQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxp bmUgYm9vbCB2c2lfcHRlX2lzX3BhZ2VfdmFsaWQodTMyIHB0ZSkKPj4gK3sKPj4gK8KgwqDCoCBy ZXR1cm4gcHRlICYgVlNJX1BURV9QQUdFX1ZBTElEOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdTMy IHZzaV9ta19wdGVfaW52YWxpZCh1MzIgcHRlKQo+PiArewo+PiArwqDCoMKgIHJldHVybiBwdGUg JiB+VlNJX1BURV9QQUdFX1ZBTElEOwo+PiArfQo+PiArCj4+ICsjZGVmaW5lIFZTSV9NQVNURVJf VExCX01BU0vCoMKgwqAgR0VOTUFTS19VTEwoMzEsIDEwKQo+Cj4gSSBub3RlIHRoYXQgdGhpcyBl bmRzIHVwIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgCj4gVlNJX01NVV9BSEJfVEJMX0FSUkFZ X0JBU0VfTF9CQVNFIHJlZ2lzdGVyIC0gaXMgdGhlICJUTEIiLyJUQkwiIAo+IGRpZmZlcmVuY2Ug YSB0eXBvIG9uZSB3YXkgb3IgdGhlIG90aGVyLCBvciBkZWZpbml0ZWx5IGludGVudGlvbmFsPwo+ Cj4gKEZvciBhbGwgSSBrbm93IG1heWJlIGl0IHJlYWxseSBjb3VsZCBiZSBhIHRhYmxlIG9mIHRy YW5zbGF0aW9uIAo+IGxvb2thc2lkZSBidWZlcnM/KQoKSXQgaXMgdHlwby4KCj4KPj4gKy8qIG1v ZGUgMCA6IDRrICovCj4+ICsjZGVmaW5lIFZTSV9QVEFfNEtfTU9ERcKgwqDCoCAwCj4+ICsKPj4g K3N0YXRpYyB1NjQgdnNpX21rX3B0YShkbWFfYWRkcl90IGR0X2RtYSkKPj4gK3sKPj4gK8KgwqDC oCB1NjQgdmFsID0gKGR0X2RtYSAmIFZTSV9NQVNURVJfVExCX01BU0spIHwgVlNJX1BUQV80S19N T0RFOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHZhbDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHN0 cnVjdCB2c2lfaW9tbXVfZG9tYWluICp0b192c2lfZG9tYWluKHN0cnVjdCBpb21tdV9kb21haW4g KmRvbSkKPj4gK3sKPj4gK8KgwqDCoCByZXR1cm4gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IHZz aV9pb21tdV9kb21haW4sIGRvbWFpbik7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHZzaV9p b21tdV9kaXNhYmxlKHN0cnVjdCB2c2lfaW9tbXUgKmlvbW11KQo+PiArewo+PiArwqDCoMKgIGlu dCBpOwo+PiArCj4+ICvCoMKgwqAgLyogSWdub3JlIGVycm9yIHdoaWxlIGRpc2FibGluZywganVz dCBrZWVwIGdvaW5nICovCj4KPiBGV0lXIEkgdGhvdWdodCB0aGF0IGNvbW1lbnQgd2FzIHdyb25n IGF0IGZpcnN0LCBiZWNhdXNlIHdlJ3JlIGNsZWFybHkgCj4gbm90IGRpc2FibGluZyB0aGUgY2xv Y2tzLi4uCgpUaGUgd2F5IGl0IGhhcyBiZWVuIGRlc2lnbiBpbiB0aGUgb3JpZ2luYWwgZHJpdmVy IGlzIHRvIG11Y2ggY29tcGxleC4KSSB3aWxsIGNvbWUgYmFjayB0byBzb21ldGhpbmcgbW9yZSBz aW1wbGU6Ci0gZW5hYmxlL2Rpc2FibGUgdGhlIGNsb2NrIGluIHBtX3J1bnRpbWUgY2FsbGJhY2tz Ci0gY2FsbCBwbV9ydW50aW1lX3Jlc3VtZV9hbmRfZ2V0KCksIHBtX3J1bnRpbWVfbWFya19sYXN0 X2J1c3koKSBhbmQgcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoKSB3aGVuIG5lZWRlZC4KCj4K Pj4gKyBXQVJOX09OKGNsa19idWxrX2VuYWJsZShpb21tdS0+bnVtX2Nsb2NrcywgaW9tbXUtPmNs b2NrcykpOwo+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBpb21tdS0+bnVtX21tdTsgaSsrKQo+ PiArwqDCoMKgwqDCoMKgwqAgd3JpdGVsKDAsIGlvbW11LT5iYXNlc1tpXSArIFZTSV9NTVVfQUhC X0NPTlRST0xfQkFTRSk7Cj4KPiBIb3dldmVyLCBldmVuIGlmIHRoZSBJT01NVSBpdHNlbGYgaXMg Z29pbmcgYXdheSwgaXMgaXQgcmVhbGx5IHNhZmUgdG8gCj4gaWdub3JlIGFuIGVycm9yIGlmIGl0 IG1lYW5zIHdlIGNvdWxkIHJpc2sgaGFuZ2luZyBvbiBhbiB1bmNsb2NrZWQgCj4gcmVnaXN0ZXIg YWNjZXNzIGhlcmU/Cj4KPj4gKyBjbGtfYnVsa19kaXNhYmxlKGlvbW11LT5udW1fY2xvY2tzLCBp b21tdS0+Y2xvY2tzKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB2c2lfaW9tbXVfZW5hYmxl KHN0cnVjdCB2c2lfaW9tbXUgKmlvbW11KQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBpb21tdV9k b21haW4gKmRvbWFpbiA9IGlvbW11LT5kb21haW47Cj4+ICvCoMKgwqAgc3RydWN0IHZzaV9pb21t dV9kb21haW4gKnZzaV9kb21haW4gPSB0b192c2lfZG9tYWluKGRvbWFpbik7Cj4+ICvCoMKgwqAg aW50IHJldCwgaTsKPj4gKwo+PiArwqDCoMKgIHJldCA9IGNsa19idWxrX2VuYWJsZShpb21tdS0+ bnVtX2Nsb2NrcywgaW9tbXUtPmNsb2Nrcyk7Cj4+ICvCoMKgwqAgaWYgKHJldCkKPj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgaW9t bXUtPm51bV9tbXU7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgdTMyIHZhbCA9IHJlYWRsKGlv bW11LT5iYXNlc1tpXSArIFZTSV9NTVVfQUhCX0NPTlRST0xfQkFTRSk7Cj4+ICsKPj4gK8KgwqDC oMKgwqDCoMKgIGlmICghKHZhbCAmIFZTSV9NTVVfQklUX0VOQUJMRSkpIHsKPgo+IElmIHRoZSBo YXJkd2FyZSBoYXBwZW5zIHRvIGJlIGVuYWJsZWQgYWxyZWFkeSwgY2FuIHlvdSBiZSBzdXJlIGl0 J3MgCj4gZW5hYmxlZCAqd2l0aCB0aGUgZXhwZWN0ZWQgY29uZmlndXJhdGlvbio/CgpJIHdpbGwg cmVtb3ZlIHRoaXMgY2hlY2suCgo+Cj4+ICsgd3JpdGVsKHZzaV9kb21haW4tPnB0YV9kbWEsCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW9tbXUtPmJhc2VzW2ldICsg Cj4+IFZTSV9NTVVfQUhCX1RCTF9BUlJBWV9CQVNFX0xfQkFTRSk7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHdyaXRlbChWU0lfTU1VX09VVF9PRl9CT1VORCwgaW9tbXUtPmJhc2VzW2ldICsg Cj4+IFZTSV9NTVVfQ09ORklHMV9CQVNFKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd3Jp dGVsKFZTSV9NTVVfQklUX0VOQUJMRSwgaW9tbXUtPmJhc2VzW2ldICsgCj4+IFZTSV9NTVVfQUhC X0VYQ0VQVElPTl9CQVNFKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd3JpdGVsKFZTSV9N TVVfQklUX0VOQUJMRSwgaW9tbXUtPmJhc2VzW2ldICsgCj4+IFZTSV9NTVVfQUhCX0NPTlRST0xf QkFTRSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArwqDCoMKgIGNsa19i dWxrX2Rpc2FibGUoaW9tbXUtPm51bV9jbG9ja3MsIGlvbW11LT5jbG9ja3MpOwo+PiArCj4+ICvC oMKgwqAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lkIHZzaV90 YWJsZV9mbHVzaChzdHJ1Y3QgdnNpX2lvbW11X2RvbWFpbiAKPj4gKnZzaV9kb21haW4sIGRtYV9h ZGRyX3QgZG1hLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2ln bmVkIGludCBjb3VudCkKPj4gK3sKPj4gK8KgwqDCoCBzaXplX3Qgc2l6ZSA9IGNvdW50ICogc2l6 ZW9mKHUzMik7IC8qIGNvdW50IG9mIHUzMiBlbnRyeSAqLwo+PiArCj4+ICvCoMKgwqAgZG1hX3N5 bmNfc2luZ2xlX2Zvcl9kZXZpY2UodnNpX2RvbWFpbi0+ZG1hX2RldiwgZG1hLCBzaXplLCAKPj4g RE1BX1RPX0RFVklDRSk7Cj4+ICt9Cj4+ICsKPj4gKyNkZWZpbmUgVlNJX0lPVkFfRFRFX01BU0vC oMKgwqAgMHhmZmMwMDAwMAo+PiArI2RlZmluZSBWU0lfSU9WQV9EVEVfU0hJRlTCoMKgwqAgMjIK Pj4gKyNkZWZpbmUgVlNJX0lPVkFfUFRFX01BU0vCoMKgwqAgMHgwMDNmZjAwMAo+PiArI2RlZmlu ZSBWU0lfSU9WQV9QVEVfU0hJRlTCoMKgwqAgMTIKPj4gKyNkZWZpbmUgVlNJX0lPVkFfUEFHRV9N QVNLwqDCoMKgIDB4MDAwMDBmZmYKPj4gKyNkZWZpbmUgVlNJX0lPVkFfUEFHRV9TSElGVMKgwqDC oCAwCj4+ICsKPj4gK3N0YXRpYyB1MzIgdnNpX2lvdmFfZHRlX2luZGV4KGRtYV9hZGRyX3QgaW92 YSkKPj4gK3sKPj4gK8KgwqDCoCByZXR1cm4gKHUzMikoaW92YSAmIFZTSV9JT1ZBX0RURV9NQVNL KSA+PiBWU0lfSU9WQV9EVEVfU0hJRlQ7Cj4KPiBBcmUgdGhlc2UgdTMyIGNhc3RzIHJlYWxseSBu ZWNlc3Nhcnk/IEF0IHdvcnN0LCB3aHkgbm90IGp1c3QgbWFrZSB0aGUgCj4gImlvdmEiIGFyZ3Vt ZW50IHUzMiB0byBiZWdpbiB3aXRoPwoKSSB3aWxsIGRvIHRoYXQuCgo+Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyB1MzIgdnNpX2lvdmFfcHRlX2luZGV4KGRtYV9hZGRyX3QgaW92YSkKPj4gK3sKPj4g K8KgwqDCoCByZXR1cm4gKHUzMikoaW92YSAmIFZTSV9JT1ZBX1BURV9NQVNLKSA+PiBWU0lfSU9W QV9QVEVfU0hJRlQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1MzIgdnNpX2lvdmFfcGFnZV9vZmZz ZXQoZG1hX2FkZHJfdCBpb3ZhKQo+PiArewo+PiArwqDCoMKgIHJldHVybiAodTMyKShpb3ZhICYg VlNJX0lPVkFfUEFHRV9NQVNLKSA+PiBWU0lfSU9WQV9QQUdFX1NISUZUOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdTMyIHZzaV9pb21tdV9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIG9mZnNl dCkKPj4gK3sKPj4gK8KgwqDCoCByZXR1cm4gcmVhZGwoYmFzZSArIG9mZnNldCk7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyB2b2lkIHZzaV9pb21tdV93cml0ZSh2b2lkIF9faW9tZW0gKmJhc2UsIHUz MiBvZmZzZXQsIHUzMiB2YWx1ZSkKPj4gK3sKPj4gK8KgwqDCoCB3cml0ZWwodmFsdWUsIGJhc2Ug KyBvZmZzZXQpOwo+PiArfQo+Cj4gRGl0Y2ggdGhlc2UgcmVhZC93cml0ZSB3cmFwcGVycywgdGhl eSdyZSB1c2VkIGFsbCBvZiBvbmNlLCBhbmQgdGhleSdyZSAKPiBzdGlsbCBsb25nZXIgdGhhbiBq dXN0IHdyaXRpbmcgb3V0IHRoZSBzdHJhaWdodGZvcndhcmQgcmVhZGwvd3JpdGVsIAo+IGRpcmVj dGx5LiBBYnN0cmFjdGluZyBhIHN0cnVjdHVyZSBtZW1iZXIgZGVyZWZlcmVuY2UgaXMgb25lIHRo aW5nLCBidXQgCj4gYWJzdHJhY3RpbmcgYSBzaW5nbGUgYWRkaXRpb24gaXMgZW50aXJlbHkgdW5u ZWNlc3NhcnkuCgpTdXJlCgo+Cj4+ICtzdGF0aWMgdm9pZCB2c2lfaW9tbXVfZmx1c2hfdGxiX2Fs bChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHZz aV9pb21tdV9kb21haW4gKnZzaV9kb21haW4gPSB0b192c2lfZG9tYWluKGRvbWFpbik7Cj4+ICvC oMKgwqAgc3RydWN0IGxpc3RfaGVhZCAqcG9zOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxh Z3M7Cj4+ICvCoMKgwqAgaW50IGk7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX2xvY2tfaXJxc2F2ZSgm dnNpX2RvbWFpbi0+aW9tbXVzX2xvY2ssIGZsYWdzKTsKPj4gK8KgwqDCoCBsaXN0X2Zvcl9lYWNo KHBvcywgJnZzaV9kb21haW4tPmlvbW11cykgewo+PiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IHZz aV9pb21tdSAqaW9tbXU7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKg wqDCoMKgwqDCoCBpb21tdSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdnNpX2lvbW11LCBub2Rl KTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IHBtX3J1bnRpbWVfZ2V0X2lmX2luX3VzZShpb21t dS0+ZGV2KTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChXQVJOX09OX09OQ0UocmV0IDwgMCkpCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYg KHJldCkgewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBXQVJOX09OKGNsa19idWxrX2VuYWJs ZShpb21tdS0+bnVtX2Nsb2NrcywgaW9tbXUtPmNsb2NrcykpOwo+Cj4gQWdhaW4sIHdvdWxkIGl0 IHJlYWxseSBiZSBPSyB0byBnbyBhaGVhZCBhbmQgYWNjZXNzIGEgcG90ZW50aWFsbHkgCj4gdW5j bG9ja2VkIHJlZ2lzdGVyPwo+Cj4gVEJIIEknZCBkcm9wIGFsbCB0aGlzIGJ1c3l3b3JrIHdpdGgg dGhlIGNsb2NrcyBhbHRvZ2V0aGVyLCBhbmQganVzdCAKPiBlbmFibGUvZGlzYWJsZSB0aGVtIGlu IHRoZSBydW50aW1lIFBNIGNhbGxiYWNrcy4gSSBjYW4ndCBpbWFnaW5lIHRoZSAKPiBJT01NVSB3 b3VsZCBhY3R1YWxseSB3b3JrIHZlcnkgd2VsbCB3aXRoIGl0cyBjb3JlIGNsb2NrIHN0b3BwZWQg YW55d2F5IAo+IC0gcHJlc3VtYWJseSB5b3UncmUgb25seSBnZXR0aW5nIGF3YXkgd2l0aCBpdCBp biB0aGlzIGNhc2UgYmVjYXVzZSB0aGUgCj4gY2xvY2tzIGFyZSBzaGFyZWQgd2l0aCB0aGUgY29k ZWMgc28gdGhhdCdzIGtlZXBpbmcgdGhlbSBlbmFibGVkIHdoaWxlIAo+IHRoZXJlIGlzIHRyYWZm aWMgZm9yIHRoZSBJT01NVSB0byB0cmFuc2xhdGUuIElmIHNvbWVvbmUgcmVhbGx5IHJlYWxseSAK PiByZWFsbHkgd2FudHMgdG8gZ2F0ZSB0aGUgaW50ZXJmYWNlIGNsb2NrIGJldHdlZW4gcmVnaXN0 ZXIgYWNjZXNzZXMgb24gCj4gc29tZSBvdGhlciBwbGF0Zm9ybSB3aGVyZSBpdCB3b3VsZCBoYXZl IGFuIGVmZmVjdCwgdGhleSBjYW4gYWx3YXlzIAo+IGNvbWUgYmFjayBhbmQgYWRkIHRoYXQgbGF0 ZXIuCj4KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpID0gMDsgaSA8IGlvbW11LT5u dW1fbW11OyBpKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB3cml0ZWwo VlNJX01NVV9CSVRfRkxVU0gsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpb21tdS0+YmFzZXNbaV0gKyBWU0lfTU1VX0ZMVVNIX0JBU0UpOwo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdyaXRlbCgwLCBpb21tdS0+YmFzZXNbaV0gKyBW U0lfTU1VX0ZMVVNIX0JBU0UpOwo+Cj4gVGhhdCdzIGN1cmlvdXMgLSB5b3Ugc2V0IHRoZSBiaXQs IHRoZW4gZXhwbGljaXRseSBjbGVhciBpdCBhZ2FpbiAKPiBpbWVtZGlhdGVseSwgYnV0IGRvbid0 IGhhdmUgdG8gd2FpdCBmb3IgYW55IGtpbmQgb2YgY29tcGxldGlvbiBzdGF0dXM/Cj4KPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGtfYnVs a19kaXNhYmxlKGlvbW11LT5udW1fY2xvY2tzLCBpb21tdS0+Y2xvY2tzKTsKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcG1fcnVudGltZV9wdXQoaW9tbXUtPmRldik7Cj4+ICvCoMKgwqDCoMKg wqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArwqDCoMKgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZz aV9kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpcnFy ZXR1cm5fdCB2c2lfaW9tbXVfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKPj4gK3sKPj4gK8Kg wqDCoCBzdHJ1Y3QgdnNpX2lvbW11ICppb21tdSA9IGRldl9pZDsKPj4gK8KgwqDCoCB1MzIgaW50 X3N0YXR1czsKPj4gK8KgwqDCoCBkbWFfYWRkcl90IGlvdmE7Cj4+ICvCoMKgwqAgaXJxcmV0dXJu X3QgcmV0ID0gSVJRX05PTkU7Cj4+ICvCoMKgwqAgaW50IGksIGVycjsKPj4gKwo+PiArwqDCoMKg IGVyciA9IHBtX3J1bnRpbWVfZ2V0X2lmX2luX3VzZShpb21tdS0+ZGV2KTsKPj4gK8KgwqDCoCBp ZiAoIWVyciB8fCBXQVJOX09OX09OQ0UoZXJyIDwgMCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgaWYgKFdBUk5fT04oY2xrX2J1bGtfZW5hYmxlKGlvbW11 LT5udW1fY2xvY2tzLCBpb21tdS0+Y2xvY2tzKSkpCj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91 dDsKPj4gKwo+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBpb21tdS0+bnVtX21tdTsgaSsrKSB7 Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnRfc3RhdHVzID0gdnNpX2lvbW11X3JlYWQoaW9tbXUtPmJh c2VzW2ldLCAKPj4gVlNJX01NVV9TVEFUVVNfQkFTRSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo aW50X3N0YXR1cyAmIFZTSV9NTVVfSVJRX01BU0spIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZGV2X2Vycihpb21tdS0+ZGV2LCAidW5leHBlY3RlZCBpbnRfc3RhdHVzPSUwOHhcbiIsIAo+ PiBpbnRfc3RhdHVzKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW92YSA9IHZzaV9pb21t dV9yZWFkKGlvbW11LT5iYXNlc1tpXSwgCj4+IFZTSV9NTVVfUEFHRV9GQVVMVF9BRERSKTsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoaW9tbXUtPmRvbWFpbikKPgo+IFRoZSBj dXJyZW50IGRvbWFpbiBzaG91bGQgbmV2ZXIgYmUgTlVMTC4gWW91IHNob3VsZCBkZWZhdWx0IHRv IGVpdGhlciAKPiBhIGJsb2NraW5nIG9yIGJ5cGFzcyBkb21haW4gKGRlcGVuZGluZyBvbiB0aGUg aGFyZHdhcmUgYmVoYWlvdXIpLCBhbmQgCj4gaW5pdGlhbGlzZSB0aGF0IGJlZm9yZSB5b3UgZXZl ciBldmVuIHJlcXVlc3QgdGhlIElSUS4KCkphc29uIGFsc28gcmVwb3J0IHRoaXMsIEkgd2lsbCBm aXggdGhhdCBpbiB2NAoKPgo+PiArIHJlcG9ydF9pb21tdV9mYXVsdChpb21tdS0+ZG9tYWluLCBp b21tdS0+ZGV2LCBpb3ZhLCBpbnRfc3RhdHVzKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZWxzZQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRldl9lcnIoaW9tbXUtPmRl diwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJQYWdlIGZhdWx0 IHdoaWxlIGlvbW11IG5vdCBhdHRhY2hlZCB0byAKPj4gZG9tYWluP1xuIik7Cj4+ICvCoMKgwqDC oMKgwqDCoCB9Cj4+ICvCoMKgwqDCoMKgwqDCoCB2c2lfaW9tbXVfd3JpdGUoaW9tbXUtPmJhc2Vz W2ldLCBWU0lfTU1VX1NUQVRVU19CQVNFLCAwKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldCA9IElS UV9IQU5ETEVEOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGNsa19idWxrX2Rpc2FibGUo aW9tbXUtPm51bV9jbG9ja3MsIGlvbW11LT5jbG9ja3MpOwo+PiArCj4+ICtvdXQ6Cj4+ICvCoMKg wqAgcG1fcnVudGltZV9wdXQoaW9tbXUtPmRldik7Cj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4g K30KPj4gKwo+PiArc3RhdGljIHN0cnVjdCB2c2lfaW9tbXUgKnZzaV9pb21tdV9nZXRfZnJvbV9k ZXYoc3RydWN0IGRldmljZSAqZGV2KQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBpb21tdV9md3Nw ZWMgKmZ3c3BlYyA9IGRldl9pb21tdV9md3NwZWNfZ2V0KGRldik7Cj4+ICvCoMKgwqAgc3RydWN0 IGRldmljZSAqaW9tbXVfZGV2ID0gCj4+IGJ1c19maW5kX2RldmljZV9ieV9md25vZGUoJnBsYXRm b3JtX2J1c190eXBlLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmd3NwZWMtPmlvbW11X2Z3bm9kZSk7Cj4+ICsKPj4g K8KgwqDCoCBwdXRfZGV2aWNlKGlvbW11X2Rldik7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gaW9t bXVfZGV2ID8gZGV2X2dldF9kcnZkYXRhKGlvbW11X2RldikgOiBOVUxMOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgc3RydWN0IGlvbW11X2RvbWFpbiAqdnNpX2lvbW11X2RvbWFpbl9hbGxvY19wYWdp bmcoc3RydWN0IAo+PiBkZXZpY2UgKmRldikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgdnNpX2lv bW11ICppb21tdSA9IHZzaV9pb21tdV9nZXRfZnJvbV9kZXYoZGV2KTsKPgo+IFVzZSBkZXZfaW9t bXVfcHJpdl9nZXQoKSAtIHdlIGdldCBoZXJlIHZpYSBhIGRldl9pb21tdV9vcHMoKSBsb29rdXAs IAo+IHNvIGRldiBpcyBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgb25lIG9mIHlvdXIgY2xpZW50 cy4KCm9rCgo+Cj4+ICvCoMKgwqAgc3RydWN0IHZzaV9pb21tdV9kb21haW4gKnZzaV9kb21haW47 Cj4+ICsKPj4gK8KgwqDCoCB2c2lfZG9tYWluID0ga3phbGxvYyhzaXplb2YoKnZzaV9kb21haW4p LCBHRlBfS0VSTkVMKTsKPj4gK8KgwqDCoCBpZiAoIXZzaV9kb21haW4pCj4+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm4gTlVMTDsKPj4gKwo+PiArwqDCoMKgIHZzaV9kb21haW4tPmRtYV9kZXYgPSBp b21tdS0+ZGV2Owo+PiArwqDCoMKgIGlvbW11LT5kb21haW4gPSAmdnNpX2lkZW50aXR5X2RvbWFp bjsKPgo+IE5vcGUsIHRoYXQgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGRvbWFpbiBpcyBh Y3R1YWxseSBhdHRhY2hlZC4KCkkgd2lsbCByZW1vdmUgaXQgaW4gdjQuCgo+Cj4+ICvCoMKgwqAg LyoKPj4gK8KgwqDCoMKgICogaW9tbXUgdXNlIGEgMiBsZXZlbCBwYWdldGFibGUuCj4+ICvCoMKg wqDCoCAqIEVhY2ggbGV2ZWwxIChkdCkgYW5kIGxldmVsMiAocHQpIHRhYmxlIGhhcyAxMDI0IDQt Ynl0ZSBlbnRyaWVzLgo+PiArwqDCoMKgwqAgKiBBbGxvY2F0ZSBvbmUgNCBLaUIgcGFnZSBmb3Ig ZWFjaCB0YWJsZS4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgdnNpX2RvbWFpbi0+ZHQgPSBp b21tdV9hbGxvY19wYWdlc19zeihHRlBfS0VSTkVMIHwgR0ZQX0RNQTMyLAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU1BBR0VfU0laRSk7Cj4+ ICvCoMKgwqAgaWYgKCF2c2lfZG9tYWluLT5kdCkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJy X2ZyZWVfZG9tYWluOwo+PiArCj4+ICvCoMKgwqAgdnNpX2RvbWFpbi0+ZHRfZG1hID0gZG1hX21h cF9zaW5nbGUodnNpX2RvbWFpbi0+ZG1hX2RldiwgCj4+IHZzaV9kb21haW4tPmR0LAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBTUEFHRV9TSVpFLCBE TUFfVE9fREVWSUNFKTsKPj4gK8KgwqDCoCBpZiAoZG1hX21hcHBpbmdfZXJyb3IodnNpX2RvbWFp bi0+ZG1hX2RldiwgdnNpX2RvbWFpbi0+ZHRfZG1hKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2 X2Vycih2c2lfZG9tYWluLT5kbWFfZGV2LCAiRE1BIG1hcCBlcnJvciBmb3IgRFRcbiIpOwo+PiAr wqDCoMKgwqDCoMKgwqAgZ290byBlcnJfZnJlZV9kdDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCB2c2lfZG9tYWluLT5wdGEgPSBpb21tdV9hbGxvY19wYWdlc19zeihHRlBfS0VSTkVMIHwg R0ZQX0RNQTMyLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBTUEFHRV9TSVpFKTsKPj4gK8KgwqDCoCBpZiAoIXZzaV9kb21haW4tPnB0YSkK Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX3VubWFwX2R0Owo+PiArCj4+ICvCoMKgwqAgdnNp X2RvbWFpbi0+cHRhWzBdID0gdnNpX21rX3B0YSh2c2lfZG9tYWluLT5kdF9kbWEpOwo+PiArwqDC oMKgIHZzaV9kb21haW4tPnB0YV9kbWEgPSBkbWFfbWFwX3NpbmdsZSh2c2lfZG9tYWluLT5kbWFf ZGV2LCAKPj4gdnNpX2RvbWFpbi0+cHRhLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIFNQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOwo+PiArwqDC oMKgIGlmIChkbWFfbWFwcGluZ19lcnJvcih2c2lfZG9tYWluLT5kbWFfZGV2LCB2c2lfZG9tYWlu LT5wdGFfZG1hKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZGV2X2Vycih2c2lfZG9tYWluLT5kbWFf ZGV2LCAiRE1BIG1hcCBlcnJvciBmb3IgUFRBXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8g ZXJyX2ZyZWVfcHRhOwo+PiArwqDCoMKgIH0KPgo+IEknbSBlc3BlY2lhbGx5IGN1cmlvdXMgd2hh dCB0aGlzICJwdGEiIHJlYWxseSBpcyAtIGlzIHRoZSBjb21tZW50IAo+IGFib3ZlIGp1c3Qgd3Jv bmcsIGFuZCB5b3UndmUgYWN0dWFsbHkgZ290IGEgMy1sZXZlbCBwYWdldGFibGUgCj4gc3VwcG9y dGluZyBzb21ld2hlcmUgYmV0d2VlbiAzMyBhbmQgNDIgYml0cyBvZiBWQT8gSWYgbm90LCB0aGVu IHRoZSAKPiBhZGRpdGlvbmFsIGxldmVsIG9mIGluZGlyZWN0aW9uIHdvdWxkIHZlcnkgbXVjaCBz ZWVtIHRvIGltcGx5IHNvbWUgCj4ga2luZCBvZiBtZWNoYW5pc20gZm9yIGFjY29tbW9kYXRpbmcg bXVsdGlwbGUgcGFnZXRhYmxlcyBhdCBvbmNlLCBhbmQgCj4gaW4gdGhhdCBjYXNlLCBpcyBpdCBs aWtlIGEgUEFTSUQgdGFibGUgd2hlcmUgdGhlIGNsaWVudCBkZXZpY2UgZ2V0cyB0byAKPiBjaG9v c2Ugd2hpY2ggZW50cnkgdG8gdXNlLCBvciBhIFN0cmVhbUlEIHRhYmxlIHRvIGRpc2FtYmlndWF0 ZSAKPiBtdWx0aXBsZSBjbGllbnQgZGV2aWNlcz8gKFdoZXJlIGluIHRoZSBsYXR0ZXIgY2FzZSBp dCBzaG91bGQgbW9zdCAKPiBsaWtlbHkgYmVsb25nIHRvIHRoZSBJT01NVSByYXRoZXIgdGhhbiB0 aGUgZG9tYWluLCBhbmQgeW91IHByb2JhYmx5IAo+IHdhbnQgbm9uemVybyAjaW9tbXUtY2VsbHMg aW4gdGhlIERUIGJpbmRpbmcgZm9yIHRoZSBjbGllbnQgSURzKS4KPgo+PiArIHNwaW5fbG9ja19p bml0KCZ2c2lfZG9tYWluLT5pb21tdXNfbG9jayk7Cj4+ICvCoMKgwqAgc3Bpbl9sb2NrX2luaXQo JnZzaV9kb21haW4tPmR0X2xvY2spOwo+PiArwqDCoMKgIElOSVRfTElTVF9IRUFEKCZ2c2lfZG9t YWluLT5pb21tdXMpOwo+PiArCj4+ICvCoMKgwqAgdnNpX2RvbWFpbi0+ZG9tYWluLmdlb21ldHJ5 LmFwZXJ0dXJlX3N0YXJ0ID0gMDsKPj4gK8KgwqDCoCB2c2lfZG9tYWluLT5kb21haW4uZ2VvbWV0 cnkuYXBlcnR1cmVfZW5kwqDCoCA9IERNQV9CSVRfTUFTSygzMik7Cj4+ICvCoMKgwqAgdnNpX2Rv bWFpbi0+ZG9tYWluLmdlb21ldHJ5LmZvcmNlX2FwZXJ0dXJlID0gdHJ1ZTsKPj4gK8KgwqDCoCB2 c2lfZG9tYWluLT5kb21haW4ucGdzaXplX2JpdG1hcCA9IFNaXzRLOwo+PiArCj4+ICvCoMKgwqAg cmV0dXJuICZ2c2lfZG9tYWluLT5kb21haW47Cj4+ICsKPj4gK2Vycl9mcmVlX3B0YToKPj4gK8Kg wqDCoCBpb21tdV9mcmVlX3BhZ2VzKHZzaV9kb21haW4tPnB0YSk7Cj4+ICtlcnJfdW5tYXBfZHQ6 Cj4+ICvCoMKgwqAgZG1hX3VubWFwX3NpbmdsZSh2c2lfZG9tYWluLT5kbWFfZGV2LCB2c2lfZG9t YWluLT5kdF9kbWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgU1BBR0VfU0laRSwgRE1B X1RPX0RFVklDRSk7Cj4+ICtlcnJfZnJlZV9kdDoKPj4gK8KgwqDCoCBpb21tdV9mcmVlX3BhZ2Vz KHZzaV9kb21haW4tPmR0KTsKPj4gK2Vycl9mcmVlX2RvbWFpbjoKPj4gK8KgwqDCoCBrZnJlZSh2 c2lfZG9tYWluKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBOVUxMOwo+PiArfQo+PiArCj4+ICtz dGF0aWMgcGh5c19hZGRyX3QgdnNpX2lvbW11X2lvdmFfdG9fcGh5cyhzdHJ1Y3QgaW9tbXVfZG9t YWluICpkb21haW4sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgZG1hX2FkZHJfdCBpb3ZhKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9tbXVfZG9t YWluICp2c2lfZG9tYWluID0gdG9fdnNpX2RvbWFpbihkb21haW4pOwo+PiArwqDCoMKgIHVuc2ln bmVkIGxvbmcgZmxhZ3M7Cj4+ICvCoMKgwqAgcGh5c19hZGRyX3QgcHRfcGh5cywgcGh5cyA9IDA7 Cj4+ICvCoMKgwqAgdTMyIGR0ZSwgcHRlOwo+PiArwqDCoMKgIHUzMiAqcGFnZV90YWJsZTsKPj4g Kwo+PiArwqDCoMKgIHNwaW5fbG9ja19pcnFzYXZlKCZ2c2lfZG9tYWluLT5kdF9sb2NrLCBmbGFn cyk7Cj4+ICsKPj4gK8KgwqDCoCBkdGUgPSB2c2lfZG9tYWluLT5kdFt2c2lfaW92YV9kdGVfaW5k ZXgoaW92YSldOwo+PiArwqDCoMKgIGlmICghdnNpX2R0ZV9pc19wdF92YWxpZChkdGUpKQo+PiAr wqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4+ICsKPj4gK8KgwqDCoCBwdF9waHlzID0gdnNpX2R0 ZV9wdF9hZGRyZXNzKGR0ZSk7Cj4+ICvCoMKgwqAgcGFnZV90YWJsZSA9ICh1MzIgKilwaHlzX3Rv X3ZpcnQocHRfcGh5cyk7Cj4+ICvCoMKgwqAgcHRlID0gcGFnZV90YWJsZVt2c2lfaW92YV9wdGVf aW5kZXgoaW92YSldOwo+PiArwqDCoMKgIGlmICghdnNpX3B0ZV9pc19wYWdlX3ZhbGlkKHB0ZSkp Cj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4gKwo+PiArwqDCoMKgIHBoeXMgPSB2c2lf cHRlX3BhZ2VfYWRkcmVzcyhwdGUpICsgdnNpX2lvdmFfcGFnZV9vZmZzZXQoaW92YSk7Cj4+ICtv dXQ6Cj4+ICvCoMKgwqAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnNpX2RvbWFpbi0+ZHRfbG9j aywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHBoeXM7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyB1MzIgKnZzaV9kdGVfZ2V0X3BhZ2VfdGFibGUoc3RydWN0IHZzaV9pb21tdV9kb21haW4g Cj4+ICp2c2lfZG9tYWluLCBkbWFfYWRkcl90IGlvdmEpCj4+ICt7Cj4+ICvCoMKgwqAgdTMyICpw YWdlX3RhYmxlLCAqZHRlX2FkZHI7Cj4+ICvCoMKgwqAgdTMyIGR0ZV9pbmRleCwgZHRlOwo+PiAr wqDCoMKgIHBoeXNfYWRkcl90IHB0X3BoeXM7Cj4+ICvCoMKgwqAgZG1hX2FkZHJfdCBwdF9kbWE7 Cj4+ICsKPj4gK8KgwqDCoCBhc3NlcnRfc3Bpbl9sb2NrZWQoJnZzaV9kb21haW4tPmR0X2xvY2sp Owo+PiArCj4+ICvCoMKgwqAgZHRlX2luZGV4ID0gdnNpX2lvdmFfZHRlX2luZGV4KGlvdmEpOwo+ PiArwqDCoMKgIGR0ZV9hZGRyID0gJnZzaV9kb21haW4tPmR0W2R0ZV9pbmRleF07Cj4+ICvCoMKg wqAgZHRlID0gKmR0ZV9hZGRyOwo+PiArwqDCoMKgIGlmICh2c2lfZHRlX2lzX3B0X3ZhbGlkKGR0 ZSkpCj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGRvbmU7Cj4+ICsKPj4gK8KgwqDCoCBwYWdlX3Rh YmxlID0gKHUzMiAqKWlvbW11X2FsbG9jX3BhZ2VzX3N6KEdGUF9BVE9NSUMgfCBHRlBfRE1BMzIs IAo+PiBTUEFHRV9TSVpFKTsKPj4gK8KgwqDCoCBpZiAoIXBhZ2VfdGFibGUpCj4+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPj4gKwo+PiArwqDCoMKgIGR0ZSA9IHZz aV9ta19kdGUodmlydF90b19waHlzKHBhZ2VfdGFibGUpKTsKPgo+IE5vIG5vIG5vIG5vIG5vLiBZ b3UncmUgYWxyZWFkeSBnZW5lcmF0aW5nIHB0X2RtYSB0aGUgY29ycmVjdCB3YXkganVzdCAKPiBi ZWxvdywgdXNlIGl0ISBCeSBhbGwgbWVhbnMgKmNoZWNrKiB3aGF0IGRtYV9tYXBfc2luZ2xlKCkg cmV0dXJucyB0byAKPiBtYWtlIHN1cmUgeW91J3JlIG5vdCBnZXR0aW5nIGFueSB1bmV4cGVjdGVk IAo+IHRyYW5zbGF0aW9uL2JvdW5jZS1idWZmZXJpbmcgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0 byByZWx5IG9uIHVzaW5nIAo+IHBoeXNfdG9fdmlydCgpIGFzIGEgc2hvcnRjdXQgbGF0ZXIsIGJ1 dCBuZXZlciBibGluZGx5IGFzc3VtZSB0aGF0IAo+IHZpcnRfdG9fcGh5cygpIGlzIGFwcHJvcHJp YXRlIGZvciBETUEgKGZvciBpbnN0YW5jZSwgd2hhdCBpZiAKPiBDT05GSUdfWk9ORV9ETUEzMiBp c24ndCBlbmFibGVkIHNvIHBhZ2VfdGFibGUgZW5kZWQgdXAgYXQgYSA+MzItYml0IAo+IGFkZHJl c3M/KQoKVGhhbmtzLCBJIHdpbGwgY2hhbmdlIHRoYXQuCgo+Cj4+ICvCoMKgwqAgKmR0ZV9hZGRy ID0gZHRlOwo+PiArCj4+ICvCoMKgwqAgcHRfZG1hID0gZG1hX21hcF9zaW5nbGUodnNpX2RvbWFp bi0+ZG1hX2RldiwgcGFnZV90YWJsZSwgCj4+IFNQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOwo+ PiArwqDCoMKgIGlmIChkbWFfbWFwcGluZ19lcnJvcih2c2lfZG9tYWluLT5kbWFfZGV2LCBwdF9k bWEpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBkZXZfZXJyKHZzaV9kb21haW4tPmRtYV9kZXYsICJE TUEgbWFwcGluZyBlcnJvciB3aGlsZSAKPj4gYWxsb2NhdGluZyBwYWdlIHRhYmxlXG4iKTsKPj4g K8KgwqDCoMKgwqDCoMKgIGlvbW11X2ZyZWVfcGFnZXMocGFnZV90YWJsZSk7Cj4+ICvCoMKgwqDC oMKgwqDCoCByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCB2c2lfdGFibGVfZmx1c2godnNpX2RvbWFpbiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdnNpX2RvbWFpbi0+ZHRfZG1hICsgZHRlX2luZGV4ICogc2l6ZW9mKHUzMiksIDEpOwo+Cj4g VGhlIG9yZWRlciBzZWVtcyBhIGJpdCBqdW1ibGVkIHVwIGhlcmUgYXMgd2VsbCAtIGl0IHdvdWxk IGJlIHNhZmVzdCB0byAKPiBnZXQgZXZlcnl0aGluZyBkb25lIHdpdGggcGFnZV90YWJsZSBpdHNl bGYgZmlyc3QsICp0aGVuKiB3b3JyeSBhYm91dCAKPiB1cGRhdGluZyB0aGUgRFRFIHRvIHBvaW50 IHRvIGl0Lgo+Cj4+ICtkb25lOgo+PiArwqDCoMKgIHB0X3BoeXMgPSB2c2lfZHRlX3B0X2FkZHJl c3MoZHRlKTsKPj4gK8KgwqDCoCByZXR1cm4gKHUzMiAqKXBoeXNfdG9fdmlydChwdF9waHlzKTsK Pj4gK30KPj4gKwo+PiArc3RhdGljIHNpemVfdCB2c2lfaW9tbXVfdW5tYXBfaW92YShzdHJ1Y3Qg dnNpX2lvbW11X2RvbWFpbiAqdnNpX2RvbWFpbiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB1MzIgKnB0ZV9hZGRyLCBkbWFfYWRkcl90IHB0ZV9kbWEsCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZV90IHNpemUpCj4+ICt7Cj4+ICvC oMKgwqAgdW5zaWduZWQgaW50IHB0ZV9jb3VudDsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgcHRl X3RvdGFsID0gc2l6ZSAvIFNQQUdFX1NJWkU7Cj4+ICsKPj4gK8KgwqDCoCBhc3NlcnRfc3Bpbl9s b2NrZWQoJnZzaV9kb21haW4tPmR0X2xvY2spOwo+PiArCj4+ICvCoMKgwqAgZm9yIChwdGVfY291 bnQgPSAwOyBwdGVfY291bnQgPCBwdGVfdG90YWw7IHB0ZV9jb3VudCsrKSB7Cj4+ICvCoMKgwqDC oMKgwqDCoCB1MzIgcHRlID0gcHRlX2FkZHJbcHRlX2NvdW50XTsKPgo+IFdoYXQgcHJldmVudHMg dGhpcyBydW5uaW5nIG9mZiB0aGUgZW5kIG9mIHRoZSBwYWdldGFibGUgcGFnZT8gQUZBSUNTIAo+ IHlvdSdyZSBub3QgY2FwcGluZyAic2l6ZSIgdG8gRFRFIGJvdW5kYXJpZXMgaW4gdGhlIG1haW4g Y2FsbGJhY2sgZWl0aGVyLgoKSSB3aWxsIGxpbWl0IGl0IGJ5IHVzaW5nIE5VTV9QVF9FTlRSSUVT LgoKPgo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXZzaV9wdGVfaXNfcGFnZV92YWxpZChw dGUpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gKwo+PiArwqDCoMKgwqDC oMKgwqAgcHRlX2FkZHJbcHRlX2NvdW50XSA9IHZzaV9ta19wdGVfaW52YWxpZChwdGUpOwo+PiAr wqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHZzaV90YWJsZV9mbHVzaCh2c2lfZG9tYWluLCBwdGVf ZG1hLCBwdGVfY291bnQpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHB0ZV9jb3VudCAqIFNQQUdF X1NJWkU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdnNpX2lvbW11X21hcF9pb3ZhKHN0cnVj dCB2c2lfaW9tbXVfZG9tYWluICp2c2lfZG9tYWluLCAKPj4gdTMyICpwdGVfYWRkciwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZG1hX2FkZHJfdCBwdGVfZG1hLCBkbWFf YWRkcl90IGlvdmEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeXNf YWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QpCj4+ICt7Cj4+ICvCoMKgwqAgdW5z aWduZWQgaW50IHB0ZV9jb3VudDsKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQgcHRlX3RvdGFsID0g c2l6ZSAvIFNQQUdFX1NJWkU7Cj4+ICsKPj4gK8KgwqDCoCBhc3NlcnRfc3Bpbl9sb2NrZWQoJnZz aV9kb21haW4tPmR0X2xvY2spOwo+PiArCj4+ICvCoMKgwqAgZm9yIChwdGVfY291bnQgPSAwOyBw dGVfY291bnQgPCBwdGVfdG90YWw7IHB0ZV9jb3VudCsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCB1 MzIgcHRlID0gcHRlX2FkZHJbcHRlX2NvdW50XTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYg KHZzaV9wdGVfaXNfcGFnZV92YWxpZChwdGUpKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBn b3RvIHVud2luZDsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgcHRlX2FkZHJbcHRlX2NvdW50XSA9 IHZzaV9ta19wdGUocGFkZHIsIHByb3QpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBwYWRkciAr PSBTUEFHRV9TSVpFOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHZzaV90YWJsZV9mbHVz aCh2c2lfZG9tYWluLCBwdGVfZG1hLCBwdGVfdG90YWwpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJu IDA7Cj4+ICt1bndpbmQ6Cj4+ICvCoMKgwqAgLyogVW5tYXAgdGhlIHJhbmdlIG9mIGlvdmFzIHRo YXQgd2UganVzdCBtYXBwZWQgKi8KPj4gK8KgwqDCoCB2c2lfaW9tbXVfdW5tYXBfaW92YSh2c2lf ZG9tYWluLCBwdGVfYWRkciwgcHRlX2RtYSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHB0ZV9jb3VudCAqIFNQQUdFX1NJWkUpOwo+Cj4gSWYgeW91IGZhaWxlZCB0byBtYXAg YW55dGhpbmcsIHJldHVybiBhbiBlcnJvcjsgb3RoZXJ3aXNlLCBqdXN0IHJldHVybiAKPiBob3dl dmVyIG11Y2ggeW91IGRpZCBtYXAgc3VjY2Vzc2Z1bGx5LiBUaGUgSU9NTVUgY29yZSB3aWxsIHRh a2UgY2FyZSAKPiBvZiB0aGUgcmVzdC4Kb2sKPgo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIC1FQURE UklOVVNFOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgc2l6ZV90IHZzaV9pb21tdV91bm1hcChzdHJ1 Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIAo+PiBsb25nIF9pb3ZhLAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGNvdW50 LCBzdHJ1Y3QgCj4+IGlvbW11X2lvdGxiX2dhdGhlciAqZ2F0aGVyKQo+PiArewo+PiArwqDCoMKg IHN0cnVjdCB2c2lfaW9tbXVfZG9tYWluICp2c2lfZG9tYWluID0gdG9fdnNpX2RvbWFpbihkb21h aW4pOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICvCoMKgwqAgZG1hX2FkZHJf dCBwdGVfZG1hLCBpb3ZhID0gKGRtYV9hZGRyX3QpX2lvdmE7Cj4+ICvCoMKgwqAgcGh5c19hZGRy X3QgcHRfcGh5czsKPj4gK8KgwqDCoCB1MzIgZHRlOwo+PiArwqDCoMKgIHUzMiAqcHRlX2FkZHI7 Cj4+ICvCoMKgwqAgc2l6ZV90IHVubWFwX3NpemU7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX2xvY2tf aXJxc2F2ZSgmdnNpX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAgZHRl ID0gdnNpX2RvbWFpbi0+ZHRbdnNpX2lvdmFfZHRlX2luZGV4KGlvdmEpXTsKPj4gK8KgwqDCoCAv KiBKdXN0IHJldHVybiAwIGlmIGlvdmEgaXMgdW5tYXBwZWQgKi8KPj4gK8KgwqDCoCBpZiAoIXZz aV9kdGVfaXNfcHRfdmFsaWQoZHRlKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmdnNpX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOwo+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIDA7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcHRfcGh5cyA9IHZzaV9k dGVfcHRfYWRkcmVzcyhkdGUpOwo+PiArwqDCoMKgIHB0ZV9hZGRyID0gKHUzMiAqKXBoeXNfdG9f dmlydChwdF9waHlzKSArIHZzaV9pb3ZhX3B0ZV9pbmRleChpb3ZhKTsKPj4gK8KgwqDCoCBwdGVf ZG1hID0gcHRfcGh5cyArIHZzaV9pb3ZhX3B0ZV9pbmRleChpb3ZhKSAqIHNpemVvZih1MzIpOwo+ PiArwqDCoMKgIHVubWFwX3NpemUgPSB2c2lfaW9tbXVfdW5tYXBfaW92YSh2c2lfZG9tYWluLCBw dGVfYWRkciwgcHRlX2RtYSwgCj4+IHNpemUpOwo+PiArCj4+ICvCoMKgwqAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmdnNpX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAg cmV0dXJuIHVubWFwX3NpemU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdnNpX2lvbW11X21h cChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgCj4+IF9pb3ZhLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6 ZSwgc2l6ZV90IGNvdW50LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBwcm90LCBn ZnBfdCBnZnAsIHNpemVfdCAqbWFwcGVkKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9t bXVfZG9tYWluICp2c2lfZG9tYWluID0gdG9fdnNpX2RvbWFpbihkb21haW4pOwo+PiArwqDCoMKg IHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICvCoMKgwqAgZG1hX2FkZHJfdCBwdGVfZG1hLCBpb3Zh ID0gKGRtYV9hZGRyX3QpX2lvdmE7Cj4+ICvCoMKgwqAgdTMyICpwYWdlX3RhYmxlLCAqcHRlX2Fk ZHI7Cj4+ICvCoMKgwqAgdTMyIGR0ZSwgcHRlX2luZGV4Owo+PiArwqDCoMKgIGludCByZXQ7Cj4+ ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBJT01NVSBkcml2ZXJzIGFyZSBub3Qgc3Vw cG9zZWQgdG8gbG9jayB0aGUgcGFnZSB0YWJsZSwgCj4+IGhvd2V2ZXIgdGhpcwo+PiArwqDCoMKg wqAgKiBkcml2ZXIgZG9lcyBub3Qgc2FmZWx5IGhhbmRsZSB0aGUgY2FjaGUgZmx1c2hpbmcgb3Ig dGFibGUKPj4gK8KgwqDCoMKgICogaW5zdGFsbGF0aW9uIGFjcm9zcyBjb25jdXJyZW50IHRocmVh ZHMgc28gbG9ja2luZyBpcyB1c2VkIGFzIAo+PiBhIHNpbXBsZQo+PiArwqDCoMKgwqAgKiBzb2x1 dGlvbi4KPj4gK8KgwqDCoMKgICovCj4KPiBObyBuZWVkIGZvciB0aGF0IGNvbW1lbnQgLSBpdCdz IHBlcmZlY3RseSBmaW5lIGZvciBJT01NVSBkcml2ZXJzIHRvIAo+IHNlcmlhbGlzZSBwYWdldGFi bGUgYWNjZXNzZXMgaWYgdGhleSB3YW50IHRvLiBPZiBjb3Vyc2UgaWYgdGhleSdyZSB0aGUgCj4g a2luZCBvZiBJT01NVSB0aGF0IHdpbGwgZmluZCBpdHNlbGYgaW4gYSBiaWcgc2VydmVyIHN5c3Rl bSB3aXRoIAo+IGh1bmRyZWRzIG9uIENQVXMgbWFwcGluZyBhbmQgdW5tYXBwaW5nIHRlbnMgb2Yg dGhvdXNhbmRzIG9mIG5ldHdvcmsgCj4gcGFja2V0cyBwZXIgc2Vjb25kIGluIHBhcmFsbGVsLCB0 aGVuIGZvciBzdXJlIGl0J3MgaW5hZHZpc2FibGUgZnJvbSBhIAo+IHBlcmZvcm1hbmNlIHBlcnNw ZWN0aXZlLCBidXQgZm9yIGEgbGl0dGxlIGVtYmVkZGVkIElPTU1VIHRoYXQncyBvbmx5IAo+IGdv aW5nIHRvIGJlIGhhbmRsaW5nIHJlbGF0aXZlbHkgbG9uZy1saXZlZCBtZWRpYSBidWZmZXJzIHRo ZXJlIGlzIAo+IGFic29sdXRlbHkgbm90aGluZyB3cm9uZyB3aXRoIHNpbXBsZSBhbmQgc3RyYWln aHRmb3J3YXJkLiBJbiBmYWN0IGlmIAo+IHlvdSBoYWQgdHJpZWQgdG8gZG8gY2xldmVyIGxvY2st ZnJlZSBzdHVmZiBoZXJlLCBJIHdvdWxkIGRlZmluaXRlbHkgYmUgCj4gYXNraW5nICJkbyB5b3Ug cmVhbGx5IG5lZWQgdGhpcz8iIDopCj4KPj4gKyBzcGluX2xvY2tfaXJxc2F2ZSgmdnNpX2RvbWFp bi0+ZHRfbG9jaywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAgcGFnZV90YWJsZSA9IHZzaV9kdGVf Z2V0X3BhZ2VfdGFibGUodnNpX2RvbWFpbiwgaW92YSk7Cj4+ICvCoMKgwqAgaWYgKElTX0VSUihw YWdlX3RhYmxlKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm dnNpX2RvbWFpbi0+ZHRfbG9jaywgZmxhZ3MpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIFBU Ul9FUlIocGFnZV90YWJsZSk7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgZHRlID0gdnNp X2RvbWFpbi0+ZHRbdnNpX2lvdmFfZHRlX2luZGV4KGlvdmEpXTsKPj4gK8KgwqDCoCBwdGVfaW5k ZXggPSB2c2lfaW92YV9wdGVfaW5kZXgoaW92YSk7Cj4+ICvCoMKgwqAgcHRlX2FkZHIgPSAmcGFn ZV90YWJsZVtwdGVfaW5kZXhdOwo+PiArwqDCoMKgIHB0ZV9kbWEgPSB2c2lfZHRlX3B0X2FkZHJl c3MoZHRlKSArIHB0ZV9pbmRleCAqIHNpemVvZih1MzIpOwo+PiArwqDCoMKgIHJldCA9IHZzaV9p b21tdV9tYXBfaW92YSh2c2lfZG9tYWluLCBwdGVfYWRkciwgcHRlX2RtYSwgaW92YSwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBhZGRyLCBzaXplLCBwcm90KTsKPj4gKwo+ PiArwqDCoMKgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZzaV9kb21haW4tPmR0X2xvY2ssIGZs YWdzKTsKPj4gK8KgwqDCoCBpZiAoIXJldCkKPj4gK8KgwqDCoMKgwqDCoMKgICptYXBwZWQgPSBz aXplOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCB2c2lfaW9tbXVfaWRlbnRpdHlfYXR0YWNoKHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRldmlj ZSAqZGV2KQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9tbXUgKmlvbW11ID0gZGV2X2lv bW11X3ByaXZfZ2V0KGRldik7Cj4+ICvCoMKgwqAgc3RydWN0IHZzaV9pb21tdV9kb21haW4gKnZz aV9kb21haW4gPSB0b192c2lfZG9tYWluKGRvbWFpbik7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9u ZyBmbGFnczsKPj4gK8KgwqDCoCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAgaWYgKFdBUk5fT04o IWlvbW11KSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PREVWOwo+Cj4gVGhhdCBjYW4g bmV2ZXIgaGFwcGVuLiBUaGUgZG9tYWluIGlzIGFscmVhZHkgdmFsaWRhdGVkIGFnYWluc3QgdGhl IAo+IGRldmljZSBvcHMgaW4gX19pb21tdV9hdHRhY2hfZ3JvdXAoKS4KPgo+PiArCj4+ICvCoMKg wqAgaWYgKGlvbW11LT5kb21haW4gPT0gZG9tYWluKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJu IDA7Cj4+ICsKPj4gK8KgwqDCoCBpb21tdS0+ZG9tYWluID0gZG9tYWluOwo+PiArCj4+ICvCoMKg wqAgc3Bpbl9sb2NrX2lycXNhdmUoJnZzaV9kb21haW4tPmlvbW11c19sb2NrLCBmbGFncyk7Cj4K PiBFcm0sIHdoYXQgbG9jaz8gdnNpX2lkZW50aXR5X2RvbWFpbiBpcyBhIHBsYWluIHN0cnVjdCBp b21tdV9kb21haW4sIHNvIAo+IHRoaXMgdnNpX2RvbWFpbiBwb2ludGVyIGhhcyBjb250YWluZXJf b2YoKWVkIG91dCBpbnRvIG90aGVyIGFkamFjZW50IAo+IHN0YXRpYyBkYXRhLi4uIDpPCgpJIHdp bGwgc2ltcGxpZnkgdGhlIGxvY2sgc2NoZW1hIGFuZCB1c2Ugb25lIGRlY2xhcmVkIGluc2lkZSB2 c2lfaW9tbXUgc3RydWN0dXJlLgoKPgo+PiArwqDCoMKgIGxpc3RfZGVsX2luaXQoJmlvbW11LT5u b2RlKTsKPj4gK8KgwqDCoCBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2c2lfZG9tYWluLT5pb21t dXNfbG9jaywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcG1fcnVudGltZV9nZXRfaWZf aW5fdXNlKGlvbW11LT5kZXYpOwo+PiArwqDCoMKgIFdBUk5fT05fT05DRShyZXQgPCAwKTsKPj4g K8KgwqDCoCBpZiAocmV0ID4gMCkgewo+PiArwqDCoMKgwqDCoMKgwqAgdnNpX2lvbW11X2Rpc2Fi bGUoaW9tbXUpOwo+PiArwqDCoMKgwqDCoMKgwqAgcG1fcnVudGltZV9wdXQoaW9tbXUtPmRldik7 Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyBzdHJ1Y3QgaW9tbXVfZG9tYWluX29wcyB2c2lfaWRlbnRpdHlfb3BzID0gewo+Cj4gQ29u c3QuCj4KPj4gK8KgwqDCoCAuYXR0YWNoX2RldiA9IHZzaV9pb21tdV9pZGVudGl0eV9hdHRhY2gs Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgc3RydWN0IGlvbW11X2RvbWFpbiB2c2lfaWRlbnRpdHlf ZG9tYWluID0gewo+PiArwqDCoMKgIC50eXBlID0gSU9NTVVfRE9NQUlOX0lERU5USVRZLAo+PiAr wqDCoMKgIC5vcHMgPSAmdnNpX2lkZW50aXR5X29wcywKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBp bnQgdnNpX2lvbW11X2F0dGFjaF9kZXZpY2Uoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0cnVjdCBkZXZpY2UgKmRl dikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgdnNpX2lvbW11ICppb21tdSA9IGRldl9pb21tdV9w cml2X2dldChkZXYpOwo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9tbXVfZG9tYWluICp2c2lfZG9t YWluID0gdG9fdnNpX2RvbWFpbihkb21haW4pOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxh Z3M7Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4gKwo+PiArwqDCoMKgIGlmIChXQVJOX09OKCFpb21t dSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0RFVjsKPgo+IFNpbWlsYXJseSBpbXBv c3NpYmxlLgo+Cj4+ICsKPj4gK8KgwqDCoCAvKiBpb21tdSBhbHJlYWR5IGF0dGFjaGVkICovCj4+ ICvCoMKgwqAgaWYgKGlvbW11LT5kb21haW4gPT0gZG9tYWluKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIDA7Cj4+ICsKPj4gK8KgwqDCoCByZXQgPSB2c2lfaW9tbXVfaWRlbnRpdHlfYXR0YWNo KCZ2c2lfaWRlbnRpdHlfZG9tYWluLCBkZXYpOwo+PiArwqDCoMKgIGlmIChyZXQpCj4+ICvCoMKg wqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgaW9tbXUtPmRvbWFpbiA9IGRv bWFpbjsKPj4gKwo+PiArwqDCoMKgIHNwaW5fbG9ja19pcnFzYXZlKCZ2c2lfZG9tYWluLT5pb21t dXNfbG9jaywgZmxhZ3MpOwo+PiArwqDCoMKgIGxpc3RfYWRkX3RhaWwoJmlvbW11LT5ub2RlLCAm dnNpX2RvbWFpbi0+aW9tbXVzKTsKPj4gK8KgwqDCoCBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2 c2lfZG9tYWluLT5pb21tdXNfbG9jaywgZmxhZ3MpOwo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcG1f cnVudGltZV9nZXRfaWZfaW5fdXNlKGlvbW11LT5kZXYpOwo+PiArwqDCoMKgIGlmICghcmV0IHx8 IFdBUk5fT05fT05DRShyZXQgPCAwKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiAr Cj4+ICvCoMKgwqAgcmV0ID0gdnNpX2lvbW11X2VuYWJsZShpb21tdSk7Cj4+ICvCoMKgwqAgaWYg KHJldCkKPj4gKyBXQVJOX09OKHZzaV9pb21tdV9pZGVudGl0eV9hdHRhY2goJnZzaV9pZGVudGl0 eV9kb21haW4sIGRldikpOwo+PiArCj4+ICvCoMKgwqAgcG1fcnVudGltZV9wdXQoaW9tbXUtPmRl dik7Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCB2c2lfaW9tbXVfZG9tYWluX2ZyZWUoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQo+PiAr ewo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9tbXVfZG9tYWluICp2c2lfZG9tYWluID0gdG9fdnNp X2RvbWFpbihkb21haW4pOwo+PiArwqDCoMKgIGludCBpOwo+PiArCj4+ICvCoMKgwqAgV0FSTl9P TighbGlzdF9lbXB0eSgmdnNpX2RvbWFpbi0+aW9tbXVzKSk7Cj4+ICsKPj4gK8KgwqDCoCBmb3Ig KGkgPSAwOyBpIDwgTlVNX0RUX0VOVFJJRVM7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgdTMy IGR0ZSA9IHZzaV9kb21haW4tPmR0W2ldOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAodnNp X2R0ZV9pc19wdF92YWxpZChkdGUpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBoeXNf YWRkcl90IHB0X3BoeXMgPSB2c2lfZHRlX3B0X2FkZHJlc3MoZHRlKTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdTMyICpwYWdlX3RhYmxlID0gcGh5c190b192aXJ0KHB0X3BoeXMpOwo+PiAr Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRtYV91bm1hcF9zaW5nbGUodnNpX2RvbWFpbi0+ ZG1hX2RldiwgcHRfcGh5cywKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgU1BBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlvbW11X2ZyZWVfcGFnZXMocGFnZV90YWJsZSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAgZG1hX3VubWFwX3NpbmdsZSh2c2lfZG9tYWluLT5k bWFfZGV2LCB2c2lfZG9tYWluLT5kdF9kbWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg U1BBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7Cj4+ICvCoMKgwqAgaW9tbXVfZnJlZV9wYWdlcyh2 c2lfZG9tYWluLT5kdCk7Cj4+ICsKPj4gK8KgwqDCoCBkbWFfdW5tYXBfc2luZ2xlKHZzaV9kb21h aW4tPmRtYV9kZXYsIHZzaV9kb21haW4tPnB0YV9kbWEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgU1BBR0VfU0laRSwgRE1BX1RPX0RFVklDRSk7Cj4+ICvCoMKgwqAgaW9tbXVfZnJlZV9w YWdlcyh2c2lfZG9tYWluLT5wdGEpOwo+PiArCj4+ICvCoMKgwqAga2ZyZWUodnNpX2RvbWFpbik7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfZGV2aWNlICp2c2lfaW9tbXVfcHJv YmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgdnNp X2lvbW11ICppb21tdSA9IHZzaV9pb21tdV9nZXRfZnJvbV9kZXYoZGV2KTsKPj4gK8KgwqDCoCBz dHJ1Y3QgZGV2aWNlX2xpbmsgKmxpbms7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoV0FSTl9PTighaW9t bXUpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cj4KPiBFaXRo ZXIgZG9uJ3QgaGF2ZSB0aGlzIGNoZWNrIGF0IGFsbCAoc2luY2UgaXQncyByZWR1bmRhbnQgaWYg eW91J3JlIAo+IHVzaW5nIGZ3c3BlY3MgYW5kIG9mX3hsYXRlKSwgb3IgZG9uJ3QgbWFrZSBpdCBh IFdBUk5fT04gKGlmIHlvdSB3YW50IAo+IHRoZSBpbXByZXNzaW9uIG9mIHN1cHBvcnRpbmcgbm9u LWZ3c3BlYyB1c2FnZSB3aGVyZSBwcm9iZV9kZXZpY2UgaXMgCj4gdGhlIG9uZSBvcCB3aGVyZSB0 aGUgY29yZSAqZG9lcyogZ2l2ZSB5b3UgImlzIHRoaXMgeW91ciBjbGllbnQgCj4gZGV2aWNlPyIg Y2FsbHMpLgo+Cj4+ICvCoMKgwqAgbGluayA9IGRldmljZV9saW5rX2FkZChkZXYsIGlvbW11LT5k ZXYsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRExfRkxBR19TVEFU RUxFU1MgfCBETF9GTEFHX1BNX1JVTlRJTUUpOwo+PiArwqDCoMKgIGlmICghbGluaykKPj4gK8Kg wqDCoMKgwqDCoMKgIGRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGxpbmsgJXNcbiIsIGRldl9uYW1l KGlvbW11LT5kZXYpKTsKPj4gKwo+PiArwqDCoMKgIGRldl9pb21tdV9wcml2X3NldChkZXYsIGlv bW11KTsKPj4gK8KgwqDCoCByZXR1cm4gJmlvbW11LT5pb21tdTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgdnNpX2lvbW11X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKPj4g K3sKPj4gK8KgwqDCoCBzdHJ1Y3QgdnNpX2lvbW11ICppb21tdSA9IGRldl9pb21tdV9wcml2X2dl dChkZXYpOwo+PiArCj4+ICvCoMKgwqAgZGV2aWNlX2xpbmtfcmVtb3ZlKGRldiwgaW9tbXUtPmRl dik7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdnNpX2lvbW11X29mX3hsYXRlKHN0cnVjdCBk ZXZpY2UgKmRldiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qg c3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncykKPj4gK3sKPj4gK8KgwqDCoCByZXR1cm4gaW9t bXVfZndzcGVjX2FkZF9pZHMoZGV2LCBhcmdzLT5hcmdzLCAxKTsKPgo+IFdoYXQgYXJlIHlvdSBh ZGRpbmcgaGVyZT8gUGVyIHRoZSBEVCBiaW5kaW5nIHRoZXJlIGFyZSBubyBJRHMsIHNvIAo+IGFy Z3MtPmFyZ3NfY291bnQgd2lsbCBiZSAwIGFuZCBhcmdzLT5hcmdzIHdpbGwgYmUgbW9zdCBsaWtl bHkgYmUgCj4gdW5pbml0aWFsaXNlZCBzdGFjay4KCkkgd2lsbCByZW1vdmUgdGhpcyBmdW5jdGlv bi4KCj4KPj4gK30KPj4gKwo+PiArc3RhdGljIHN0cnVjdCBpb21tdV9vcHMgdnNpX2lvbW11X29w cyA9IHsKPgo+IENvbnN0Lgo+Cj4+ICvCoMKgwqAgLmlkZW50aXR5X2RvbWFpbiA9ICZ2c2lfaWRl bnRpdHlfZG9tYWluLAo+PiArwqDCoMKgIC5kb21haW5fYWxsb2NfcGFnaW5nID0gdnNpX2lvbW11 X2RvbWFpbl9hbGxvY19wYWdpbmcsCj4+ICvCoMKgwqAgLnByb2JlX2RldmljZSA9IHZzaV9pb21t dV9wcm9iZV9kZXZpY2UsCj4+ICvCoMKgwqAgLnJlbGVhc2VfZGV2aWNlID0gdnNpX2lvbW11X3Jl bGVhc2VfZGV2aWNlLAo+PiArwqDCoMKgIC5kZXZpY2VfZ3JvdXAgPSBnZW5lcmljX3NpbmdsZV9k ZXZpY2VfZ3JvdXAsCj4+ICvCoMKgwqAgLm9mX3hsYXRlID0gdnNpX2lvbW11X29mX3hsYXRlLAo+ PiArwqDCoMKgIC5kZWZhdWx0X2RvbWFpbl9vcHMgPSAmKGNvbnN0IHN0cnVjdCBpb21tdV9kb21h aW5fb3BzKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAuYXR0YWNoX2RldsKgwqDCoMKgwqDCoMKgID0g dnNpX2lvbW11X2F0dGFjaF9kZXZpY2UsCj4+ICvCoMKgwqDCoMKgwqDCoCAubWFwX3BhZ2VzwqDC oMKgwqDCoMKgwqAgPSB2c2lfaW9tbXVfbWFwLAo+PiArwqDCoMKgwqDCoMKgwqAgLnVubWFwX3Bh Z2VzwqDCoMKgwqDCoMKgwqAgPSB2c2lfaW9tbXVfdW5tYXAsCj4+ICvCoMKgwqDCoMKgwqDCoCAu Zmx1c2hfaW90bGJfYWxswqDCoMKgID0gdnNpX2lvbW11X2ZsdXNoX3RsYl9hbGwsCj4+ICvCoMKg wqDCoMKgwqDCoCAuaW92YV90b19waHlzwqDCoMKgwqDCoMKgwqAgPSB2c2lfaW9tbXVfaW92YV90 b19waHlzLAo+PiArwqDCoMKgwqDCoMKgwqAgLmZyZWXCoMKgwqDCoMKgwqDCoMKgwqDCoMKgID0g dnNpX2lvbW11X2RvbWFpbl9mcmVlLAo+PiArwqDCoMKgIH0KPj4gK307Cj4+ICsKPj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZzaV9pb21tdV9kdF9pZHNbXSA9IHsKPj4gK8Kg wqDCoCB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAuY29tcGF0aWJsZSA9ICJ2ZXJpc2lsaWNvbixpb21t dSIsCj4+ICvCoMKgwqAgfSwKPj4gK8KgwqDCoCB7Cj4+ICvCoMKgwqDCoMKgwqDCoCAuY29tcGF0 aWJsZSA9ICJyb2NrY2hpcCxyazM1ODgtaW9tbXUtMS4yIiwKPgo+IFlvdSBjYW4gZHJvcCB0aGlz IC0gaWYgdGhlIGRyaXZlciBkb2Vzbid0IGhhdmUgYW55IFNvQy1zcGVjaWZpYyAKPiBiZWhhdmlv dXIgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gbWF0Y2ggdGhlIGdlbmVyaWMgY29tcGF0aWJsZSBoZXJl LiBBcyAKPiBsb25nIGFzIHRoZSBTb0Mtc3BlY2lmaWMgY29tcGF0aWJsZXMgYXJlIGluIHRoZSBi aW5kaW5nLCBhbmQgdGh1cyBpbiAKPiBkZXBsb3llZCBEVEJzLCB3ZSBjYW4gc3RhcnQgbWFraW5n IHVzZSBvZiB0aGVtIGluIGZ1dHVyZSBhcyBhbmQgd2hlbiAKPiB3ZSBoYXZlIGEgcmVhc29uIHRv LgoKRFQgbWFpbnRhaW5lcnMgaGF2ZSBhc2tlZCB0byBmb3IgaXQgc28gSSB3aWxsIGtlZXAgaXQg YnV0IHJlbmFtZWQgdG8gYmUgRFQgY29tcGxpYW50LgoKPgo+PiArwqDCoMKgIH0sCj4+ICvCoMKg wqAgeyAvKiBzZW50aW5lbCAqLyB9Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50IHZzaV9pb21t dV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiArewo+PiArwqDCoMKgIHN0 cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Cj4+ICvCoMKgwqAgc3RydWN0IHZzaV9pb21t dSAqaW9tbXU7Cj4+ICvCoMKgwqAgc3RydWN0IHJlc291cmNlICpyZXM7Cj4+ICvCoMKgwqAgaW50 IG51bV9yZXMgPSBwZGV2LT5udW1fcmVzb3VyY2VzOwo+PiArwqDCoMKgIGludCBlcnIsIGk7Cj4+ ICsKPj4gK8KgwqDCoCBpb21tdSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW9tbXUpLCBH RlBfS0VSTkVMKTsKPj4gK8KgwqDCoCBpZiAoIWlvbW11KQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FTk9NRU07Cj4+ICsKPj4gK8KgwqDCoCBpb21tdS0+ZGV2ID0gZGV2Owo+PiArwqDCoMKg IGlvbW11LT5udW1fbW11ID0gMDsKPj4gKwo+PiArwqDCoMKgIGlvbW11LT5iYXNlcyA9IGRldm1f a2NhbGxvYyhkZXYsIG51bV9yZXMsIHNpemVvZigqaW9tbXUtPmJhc2VzKSwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwpOwo+PiArwqDCoMKgIGlm ICghaW9tbXUtPmJhc2VzKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07Cj4+ICsK Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlczsgaSsrKSB7Cj4+ICvCoMKgwqDCoMKg wqDCoCByZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIGkp Owo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFyZXMpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGNvbnRpbnVlOwo+PiArwqDCoMKgwqDCoMKgwqAgaW9tbXUtPmJhc2VzW2ldID0gZGV2bV9pb3Jl bWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Cj4KPiBDb25zaWRlciBkZXZtX3BsYXRmb3Jt X2lvcmVtYXBfcmVzb3VyY2UoKS4KPgo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKElTX0VSUihpb21t dS0+YmFzZXNbaV0pKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gK8Kg wqDCoMKgwqDCoMKgIGlvbW11LT5udW1fbW11Kys7Cj4+ICvCoMKgwqAgfQo+PiArwqDCoMKgIGlm IChpb21tdS0+bnVtX21tdSA9PSAwKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIFBUUl9FUlIo aW9tbXUtPmJhc2VzWzBdKTsKPj4gKwo+PiArwqDCoMKgIGlvbW11LT5udW1faXJxID0gcGxhdGZv cm1faXJxX2NvdW50KHBkZXYpOwo+PiArwqDCoMKgIGlmIChpb21tdS0+bnVtX2lycSA8IDApCj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gaW9tbXUtPm51bV9pcnE7Cj4+ICsKPj4gK8KgwqDCoCBl cnIgPSBkZXZtX2Nsa19idWxrX2dldF9hbGwoZGV2LCAmaW9tbXUtPmNsb2Nrcyk7Cj4+ICvCoMKg wqAgaWYgKGVyciA+PSAwKQo+PiArwqDCoMKgwqDCoMKgwqAgaW9tbXUtPm51bV9jbG9ja3MgPSBl cnI7Cj4+ICvCoMKgwqAgZWxzZSBpZiAoZXJyID09IC1FTk9FTlQpCj4+ICvCoMKgwqDCoMKgwqDC oCBpb21tdS0+bnVtX2Nsb2NrcyA9IDA7Cj4+ICvCoMKgwqAgZWxzZQo+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIGVycjsKPj4gKwo+PiArwqDCoMKgIGVyciA9IGNsa19idWxrX3ByZXBhcmUoaW9t bXUtPm51bV9jbG9ja3MsIGlvbW11LT5jbG9ja3MpOwo+PiArwqDCoMKgIGlmIChlcnIpCj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gZXJyOwo+Cj4gSSB3b25kZXIgaWYgZGV2bV9jbGtfYnVsa19n ZXRfYWxsX2VuYWJsZWQoKSBtaWdodCBoZWxwIGhlcmUsIGJ1dCBpZiAKPiB5b3UgZG8gd2FudCB0 byBkbyBhbnkgc3Vic2VxdWVudCBtYW5hZ2VtZW50IHRoZW4gcXVpdGUgcG9zc2libHkgaXQgCj4g anVzdCBzaGlmdHMgdGhlIGNvbXBsZXhpdHkgdG8gbWFraW5nIHN1cmUgdGhleSdyZSByZWVuYWJs ZWQgaW4gYWxsIHRoZSAKPiBwYXRocyB3aGVyZSB0aGV5IGNhbiBiZSByZWxlYXNlZCBhZ2FpbiA6 LwoKSSB3aWxsIHJld29yayB0aGUgcHJvYmUgZnVuY3Rpb24gdG8gdGFrZSBjYXJlIG9mIHlvdXIg cmVtYXJrcy4KCj4KPj4gKwo+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBpb21tdS0+bnVtX2ly cTsgaSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShw ZGV2LCBpKTsKPgo+IEFzIHdpdGggbnVtX21tdSwgYWNjb3JkaW5nIHRvIHlvdXIgYmluZGluZyBu dW1faXJxIG11c3QgYmUgZXhhY3RseSAxLiAKPiBEbyB5b3UgcmVhbGx5IG5lZWQgdGhlIHByZXRl bmNlIG9mIHN1cHBvcnRpbmcgbW9yZSBvciBmZXdlcj8KPgo+PiArCj4+ICvCoMKgwqDCoMKgwqDC oCBpZiAoaXJxIDwgMCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGlycTsKPj4g Kwo+PiArwqDCoMKgwqDCoMKgwqAgZXJyID0gZGV2bV9yZXF1ZXN0X2lycShpb21tdS0+ZGV2LCBp cnEsIHZzaV9pb21tdV9pcnEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBJUlFGX1NIQVJFRCwgZGV2X25hbWUoZGV2KSwgaW9tbXUpOwo+PiArwqDCoMKg wqDCoMKgwqAgaWYgKGVycikKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfdW5w cmVwYXJlX2Nsb2NrczsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBkbWFfc2V0X21hc2tf YW5kX2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Cj4+ICvCoMKgwqAgcGxhdGZvcm1f c2V0X2RydmRhdGEocGRldiwgaW9tbXUpOwo+PiArCj4+ICvCoMKgwqAgcG1fcnVudGltZV9lbmFi bGUoZGV2KTsKPj4gKwo+PiArwqDCoMKgIGVyciA9IGlvbW11X2RldmljZV9zeXNmc19hZGQoJmlv bW11LT5pb21tdSwgZGV2LCBOVUxMLCAKPj4gZGV2X25hbWUoZGV2KSk7Cj4+ICvCoMKgwqAgaWYg KGVycikKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX3J1bnRpbWVfZGlzYWJsZTsKPj4gKwo+ PiArwqDCoMKgIGVyciA9IGlvbW11X2RldmljZV9yZWdpc3RlcigmaW9tbXUtPmlvbW11LCAmdnNp X2lvbW11X29wcywgZGV2KTsKPj4gK8KgwqDCoCBpZiAoZXJyKQo+PiArwqDCoMKgwqDCoMKgwqAg Z290byBlcnJfcmVtb3ZlX3N5c2ZzOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4g K2Vycl9yZW1vdmVfc3lzZnM6Cj4+ICvCoMKgwqAgaW9tbXVfZGV2aWNlX3N5c2ZzX3JlbW92ZSgm aW9tbXUtPmlvbW11KTsKPj4gK2Vycl9ydW50aW1lX2Rpc2FibGU6Cj4+ICvCoMKgwqAgcG1fcnVu dGltZV9kaXNhYmxlKGRldik7Cj4+ICtlcnJfdW5wcmVwYXJlX2Nsb2NrczoKPj4gK8KgwqDCoCBj bGtfYnVsa191bnByZXBhcmUoaW9tbXUtPm51bV9jbG9ja3MsIGlvbW11LT5jbG9ja3MpOwo+PiAr wqDCoMKgIHJldHVybiBlcnI7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHZzaV9pb21tdV9z aHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiArewo+PiArwqDCoMKgIHN0 cnVjdCB2c2lfaW9tbXUgKmlvbW11ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4+ICvC oMKgwqAgaW50IGk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgaW9tbXUtPm51bV9p cnE7IGkrKykgewo+PiArwqDCoMKgwqDCoMKgwqAgaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEo cGRldiwgaSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGRldm1fZnJlZV9pcnEoaW9tbXUtPmRl diwgaXJxLCBpb21tdSk7Cj4KPiBNb3N0IGRldm1fZnJlZSBjYWxscyBhcmUgc3VzcGVjdCBpbiBn ZW5lcmFsLCBhbmQgdGhpcyBvbmUgaXMgY2VydGFpbmx5IAo+IG5vIGV4Y2VwdGlvbi4gRXZlbiBp ZiBpdCBqdXN0aWZpYWJsZSB0byBzdXBwcmVzcyBJUlFzIGR1cmluZyBzaHV0ZG93biwgCj4gY2Fu IHlvdSBub3Qgc2ltcGx5IGRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYXQgdGhlIElPTU1V IGVuZCwgb3IgCj4gYXQgd29yc3QganVzdCBkbyBhIGRpc2FibGVfaXJxKCk/IEluIHRoZSBzaHV0 ZG93biBwYXRoIHdlIHJlYWxseSBkb24ndCAKPiB3YW50IHRvIGJlIGRvaW5nIGFueSBtb3JlIHdv cmsgdGhhbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KClN1cmUKCj4KPj4gK8KgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoCBwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQoJnBkZXYtPmRldik7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgdnNpX2lvbW11X3N1c3BlbmQoc3RydWN0 IGRldmljZSAqZGV2KQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCB2c2lfaW9tbXUgKmlvbW11ID0g ZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoaW9tbXUtPmRvbWFpbiA9 PSAmdnNpX2lkZW50aXR5X2RvbWFpbikKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiAr Cj4+ICvCoMKgwqAgdnNpX2lvbW11X2Rpc2FibGUoaW9tbXUpOwo+Cj4gVGhpcyBzZWVtcyBzaW1s YXJseSBkdWJpb3VzIC0gaWYgc3VzcGVuZCBkb2Vzbid0IG5lZWQgdG8gZXhwbGljaXRseSAKPiBz YXZlIGFueSBhZGRpdGlvbmFsIGNvbnRleHQgZm9yIGEgc3Vic2VxdWVudCByZXN1bWUgdGhlbiBp dCBzaG91bGRuJ3QgCj4gcmVhbGx5IGRvIGFueXRoaW5nLCBjZXJ0YWlubHkgbm90IGNoYW5nZSB0 aGUgc3RhdGUgb2YgSU9NTVUgCj4gdHJhbnNsYXRpb24uIEF0IGJlc3QgdGhhdCdzIGEgd2FzdGUg b2YgdGltZSwgYXQgd29yc3QgaXQgcmlza3MgCj4gdW5leHBlY3RlZCBmYXVsdHMgb3IgbWVtb3J5 IGNvcnJ1cHRpb24gKGlmIGEgbm9taW5hbGx5LXN1c3BlbmRlZCAKPiBjbGllbnQgZGV2aWNlIGlz IGFjdHVhbGx5IHN0aWxsIHJ1bm5pbmcpLgo+Cj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgdnNpX2lvbW11X3Jlc3VtZShzdHJ1Y3Qg ZGV2aWNlICpkZXYpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHZzaV9pb21tdSAqaW9tbXUgPSBk ZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4gKwo+PiArwqDCoMKgIGlmIChpb21tdS0+ZG9tYWluID09 ICZ2c2lfaWRlbnRpdHlfZG9tYWluKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsK Pj4gK8KgwqDCoCByZXR1cm4gdnNpX2lvbW11X2VuYWJsZShpb21tdSk7Cj4+ICt9Cj4+ICsKPj4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB2c2lfaW9tbXVfcG1fb3BzID0gewo+PiAr wqDCoMKgIFNFVF9SVU5USU1FX1BNX09QUyh2c2lfaW9tbXVfc3VzcGVuZCwgdnNpX2lvbW11X3Jl c3VtZSwgTlVMTCkKPj4gK8KgwqDCoCBTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1l X2ZvcmNlX3N1c3BlbmQsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcG1fcnVu dGltZV9mb3JjZV9yZXN1bWUpCj4+ICt9Owo+Cj4gQ29uc2lkZXIgREVGSU5FX1JVTlRJTUVfREVW X1BNX09QUygpLgo+Cj4+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF92 c2lfaW9tbXVfZHJpdmVyID0gewo+PiArwqDCoMKgIC5wcm9iZSA9IHZzaV9pb21tdV9wcm9iZSwK Pj4gK8KgwqDCoCAuc2h1dGRvd24gPSB2c2lfaW9tbXVfc2h1dGRvd24sCj4+ICvCoMKgwqAgLmRy aXZlciA9IHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIC5uYW1lID0gInZzaV9pb21tdSIsCj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCAub2ZfbWF0Y2hfdGFibGUgPSB2c2lfaW9tbXVfZHRfaWRz LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgLnBtID0gJnZzaV9pb21tdV9wbV9vcHMsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoCAuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCj4+ICvCoMKg wqAgfSwKPj4gK307Cj4+ICtidWlsdGluX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF92c2lfaW9t bXVfZHJpdmVyKTsKPgo+IEkgZ3Vlc3MgdGhhdCBkb2VzIHRlY2huaWNhbGx5IHdvcmsgb3V0IHdo ZW4gdGhpcyBpcyBidWlsdCBhcyBhIG1vZHVsZSwgCj4gYXMgdGhlIGRldmljZV9pbml0Y2FsbCgp IGdldHMgcmVkZWZpbmVkIHRvIG1vZHVsZV9pbml0KCkgYW5kIHRoZSBsYWNrIAo+IG9mIG1vZHVs ZV9leGl0KCkganVzdCBwcmV2ZW50cyByZW1vdmFsICh3aGljaCBpbiBwcmFjdGljZSB3b3VsZCBi ZSAKPiBwcmV2ZW50ZWQgYnkgaGVsZCByZWZlcmVuY2VzIGFueXdheSkuLi4gQnV0IGl0IHN0aWxs IGxvb2tzIGEgYml0IG9kZC4KCkkgd2lsbCB0cnkgdG8gZml4IHRoYXQgaW4gdGhlIG5leHQgdmVy c2lvbi4KVGhhbmtzIGZvciB5b3VyIGNvbW1lbnRzLgoKQmVuamFtaW4KCj4KPiBUaGFua3MsCj4g Um9iaW4uCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpM aW51eC1yb2NrY2hpcCBtYWlsaW5nIGxpc3QKTGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJv Y2tjaGlwCg==