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 A21ADC4345F for ; Fri, 19 Apr 2024 10:20:43 +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:References:Cc:To:From: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=4QFVpwMEZPAdhUXBlw11k2J5YTLqEKnKET+QWnxDw4Q=; b=qf11uz4R2l0WI7 TFtbowjakIr/RX4RReqRj4Cvia9g7TGU/Uu5+L60T+MmJrbx9/BlplH4gQ5oWGcu5bCvi6MpY6XiI SVRccgY+6qXUyLPI7Nfjw0M0bB7Tbru4T+lNDPRj3y04BZsF8/Wb+PjILVZIHICRQL5gL22oR6FQm 2cxIHt2uf2PUyFzVbJAw9ylXy9VTILhVhpD5ibSl+l2zFqID/GsCer2KJVuiZjLdLcZiGuhOL7DzX tT7nyXQNCkmsbbbI8CoHrcRI3NI6iadE57esY5+/B2Pao0RRfdNLb1syjIAhkFaEu9X43/MUrSfwQ gdDU3NT/qoBgpCBUIbHg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxlM6-00000005HYE-06IM; Fri, 19 Apr 2024 10:20:30 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rxlM3-00000005HXF-1EL3 for linux-arm-kernel@lists.infradead.org; Fri, 19 Apr 2024 10:20:29 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9AB8E2F; Fri, 19 Apr 2024 03:20:53 -0700 (PDT) Received: from [10.1.197.1] (ewhatever.cambridge.arm.com [10.1.197.1]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CA49E3F792; Fri, 19 Apr 2024 03:20:22 -0700 (PDT) Message-ID: Date: Fri, 19 Apr 2024 11:20:21 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 17/43] arm64: RME: Allow VMM to set RIPAS From: Suzuki K Poulose To: Steven Price , kvm@vger.kernel.org, kvmarm@lists.linux.dev Cc: Catalin Marinas , Marc Zyngier , Will Deacon , James Morse , Oliver Upton , Zenghui Yu , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Joey Gouly , Alexandru Elisei , Christoffer Dall , Fuad Tabba , linux-coco@lists.linux.dev, Ganapatrao Kulkarni References: <20240412084056.1733704-1-steven.price@arm.com> <20240412084309.1733783-1-steven.price@arm.com> <20240412084309.1733783-18-steven.price@arm.com> Content-Language: en-US In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240419_032027_469472_E6852BEC X-CRM114-Status: GOOD ( 35.26 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: 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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMTkvMDQvMjAyNCAxMDozNCwgU3V6dWtpIEsgUG91bG9zZSB3cm90ZToKPiBPbiAxMi8wNC8y MDI0IDA5OjQyLCBTdGV2ZW4gUHJpY2Ugd3JvdGU6Cj4+IEVhY2ggcGFnZSB3aXRoaW4gdGhlIHBy b3RlY3RlZCByZWdpb24gb2YgdGhlIHJlYWxtIGd1ZXN0IGNhbiBiZSBtYXJrZWQKPj4gYXMgZWl0 aGVyIFJBTSBvciBFTVBUWS4gQWxsb3cgdGhlIFZNTSB0byBjb250cm9sIHRoaXMgYmVmb3JlIHRo ZSBndWVzdAo+PiBoYXMgc3RhcnRlZCBhbmQgcHJvdmlkZSB0aGUgZXF1aXZhbGVudCBmdW5jdGlv bnMgdG8gY2hhbmdlIHRoaXMgKHdpdGgKPj4gdGhlIGd1ZXN0J3MgYXBwcm92YWwpIGF0IHJ1bnRp bWUuCj4+Cj4+IFdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIFJJUEFTIFJBTSAoMSkgdG8gUklQQVMg RU1QVFkgKDApIHRoZSBtZW1vcnkgaXMKPj4gdW5tYXBwZWQgZnJvbSB0aGUgZ3Vlc3QgYW5kIHVu ZGVsZWdhdGVkIGFsbG93aW5nIHRoZSBtZW1vcnkgdG8gYmUgcmV1c2VkCj4+IGJ5IHRoZSBob3N0 LiBXaGVuIHRyYW5zaXRpb25pbmcgdG8gUklQQVMgUkFNIHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBv Zgo+PiB0aGUgbGVhZiBSVFRzIGlzIGRvbmUgbGF0ZXIgb24gc3RhZ2UgMiBmYXVsdCwgaG93ZXZl ciBpdCBtYXkgYmUKPj4gbmVjZXNzYXJ5IHRvIGFsbG9jYXRlIGFkZGl0aW9uYWwgUlRUcyB0byBy ZXByZXNlbnQgdGhlIHJhbmdlIHJlcXVlc3RlZC4KPiAKPiBtaW5vciBuaXQ6IFRvIGdpdmUgYSBi aXQgbW9yZSBjb250ZXh0Ogo+IAo+ICJob3dldmVyIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gYWxs b2NhdGUgYWRkaXRpb25hbCBSVFRzIGluIG9yZGVyIGZvcgo+IHRoZSBSTU0gdG8gdHJhY2sgdGhl IFJJUEFTIGZvciB0aGUgcmVxdWVzdGVkIHJhbmdlIi4KPiAKPj4KPj4gV2hlbiBmcmVlaW5nIGEg YmxvY2sgbWFwcGluZyBpdCBpcyBuZWNlc3NhcnkgdG8gdGVtcG9yYXJpbHkgdW5mb2xkIHRoZQo+ PiBSVFQgd2hpY2ggcmVxdWlyZXMgZGVsZWdhdGluZyBhbiBleHRyYSBwYWdlIHRvIHRoZSBSTU0s IHRoaXMgcGFnZSBjYW4KPj4gdGhlbiBiZSByZWNvdmVyZWQgb25jZSB0aGUgY29udGVudHMgb2Yg dGhlIGJsb2NrIG1hcHBpbmcgaGF2ZSBiZWVuCj4+IGZyZWVkLiBBIHNwYXJlLCBkZWxlZ2F0ZWQg cGFnZSAoc3BhcmVfcGFnZSkgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgo+Pgo+PiBTaWduZWQt b2ZmLWJ5OiBTdGV2ZW4gUHJpY2UgPHN0ZXZlbi5wcmljZUBhcm0uY29tPgo+PiAtLS0KPj4gwqAg YXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcm1lLmggfMKgIDE2ICsrCj4+IMKgIGFyY2gvYXJt NjQva3ZtL21tdS5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDggKy0KPj4gwqAgYXJj aC9hcm02NC9rdm0vcm1lLmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAzOTAgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+PiDCoCAzIGZpbGVzIGNoYW5nZWQsIDQxMSBpbnNlcnRp b25zKCspLCAzIGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNs dWRlL2FzbS9rdm1fcm1lLmggCj4+IGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fcm1lLmgK Pj4gaW5kZXggOTE1ZTc2MDY4YjAwLi5jYzhmODFjZmMzYzAgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gv YXJtNjQvaW5jbHVkZS9hc20va3ZtX3JtZS5oCj4+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20va3ZtX3JtZS5oCj4+IEBAIC05Niw2ICs5NiwxNCBAQCB2b2lkIGt2bV9yZWFsbV9kZXN0cm95 X3J0dHMoc3RydWN0IGt2bSAqa3ZtLCB1MzIgCj4+IGlhX2JpdHMpOwo+PiDCoCBpbnQga3ZtX2Ny ZWF0ZV9yZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKPj4gwqAgdm9pZCBrdm1fZGVzdHJveV9y ZWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKPj4gK3ZvaWQga3ZtX3JlYWxtX3VubWFwX3Jhbmdl KHN0cnVjdCBrdm0gKmt2bSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWdu ZWQgbG9uZyBpcGEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHU2NCBzaXplLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBib29sIHVubWFwX3ByaXZhdGUpOwo+PiAr aW50IHJlYWxtX3NldF9pcGFfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHJpcGFzKTsKPj4gKwo+PiDC oCAjZGVmaW5lIFJNRV9SVFRfQkxPQ0tfTEVWRUzCoMKgwqAgMgo+PiDCoCAjZGVmaW5lIFJNRV9S VFRfTUFYX0xFVkVMwqDCoMKgIDMKPj4gQEAgLTExNCw0ICsxMjIsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBsb25nIAo+PiBybWVfcnR0X2xldmVsX21hcHNpemUoaW50IGxldmVsKQo+PiDC oMKgwqDCoMKgIHJldHVybiAoMVVMIDw8IFJNRV9SVFRfTEVWRUxfU0hJRlQobGV2ZWwpKTsKPj4g wqAgfQo+PiArc3RhdGljIGlubGluZSBib29sIHJlYWxtX2lzX2FkZHJfcHJvdGVjdGVkKHN0cnVj dCByZWFsbSAqcmVhbG0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1bnNpZ25lZCBsb25nIGFkZHIpCj4+ICt7Cj4+ICvCoMKgwqAgdW5zaWduZWQgaW50 IGlhX2JpdHMgPSByZWFsbS0+aWFfYml0czsKPj4gKwo+PiArwqDCoMKgIHJldHVybiAhKGFkZHIg JiB+KEJJVChpYV9iaXRzIC0gMSkgLSAxKSk7Cj4+ICt9Cj4+ICsKPj4gwqAgI2VuZGlmCj4+IGRp ZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9tbXUuYyBiL2FyY2gvYXJtNjQva3ZtL21tdS5jCj4+ IGluZGV4IDQ2ZjBjNGU4MGFjZS4uOGE3YjU0NDk2OTdmIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2Fy bTY0L2t2bS9tbXUuYwo+PiArKysgYi9hcmNoL2FybTY0L2t2bS9tbXUuYwo+PiBAQCAtMzEwLDYg KzMxMCw3IEBAIHN0YXRpYyB2b2lkIGludmFsaWRhdGVfaWNhY2hlX2d1ZXN0X3BhZ2Uodm9pZCAq dmEsIAo+PiBzaXplX3Qgc2l6ZSkKPj4gwqDCoCAqIEBzdGFydDogVGhlIGludGVybWVkaWF0ZSBw aHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJhbmdlIHRvIHVubWFwCj4+IMKgwqAgKiBAc2l6 ZTrCoCBUaGUgc2l6ZSBvZiB0aGUgYXJlYSB0byB1bm1hcAo+PiDCoMKgICogQG1heV9ibG9jazog V2hldGhlciBvciBub3Qgd2UgYXJlIHBlcm1pdHRlZCB0byBibG9jawo+PiArICogQG9ubHlfc2hh cmVkOiBJZiB0cnVlIHRoZW4gcHJvdGVjdGVkIG1hcHBpbmdzIHNob3VsZCBub3QgYmUgdW5tYXBw ZWQKPj4gwqDCoCAqCj4+IMKgwqAgKiBDbGVhciBhIHJhbmdlIG9mIHN0YWdlLTIgbWFwcGluZ3Ms IGxvd2VyaW5nIHRoZSB2YXJpb3VzIAo+PiByZWYtY291bnRzLsKgIE11c3QKPj4gwqDCoCAqIGJl IGNhbGxlZCB3aGlsZSBob2xkaW5nIG1tdV9sb2NrICh1bmxlc3MgZm9yIGZyZWVpbmcgdGhlIHN0 YWdlMiAKPj4gcGdkIGJlZm9yZQo+PiBAQCAtMzE3LDcgKzMxOCw3IEBAIHN0YXRpYyB2b2lkIGlu dmFsaWRhdGVfaWNhY2hlX2d1ZXN0X3BhZ2Uodm9pZCAqdmEsIAo+PiBzaXplX3Qgc2l6ZSkKPj4g wqDCoCAqIHdpdGggdGhpbmdzIGJlaGluZCBvdXIgYmFja3MuCj4+IMKgwqAgKi8KPj4gwqAgc3Rh dGljIHZvaWQgX191bm1hcF9zdGFnZTJfcmFuZ2Uoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgcGh5 c19hZGRyX3QgCj4+IHN0YXJ0LCB1NjQgc2l6ZSwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJvb2wgbWF5X2Jsb2NrKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYm9vbCBtYXlfYmxvY2ssIGJvb2wgb25seV9zaGFyZWQpCj4+IMKgIHsKPj4gwqDCoMKg wqDCoCBzdHJ1Y3Qga3ZtICprdm0gPSBrdm1fczJfbW11X3RvX2t2bShtbXUpOwo+PiDCoMKgwqDC oMKgIHBoeXNfYWRkcl90IGVuZCA9IHN0YXJ0ICsgc2l6ZTsKPj4gQEAgLTMzMCw3ICszMzEsNyBA QCBzdGF0aWMgdm9pZCBfX3VubWFwX3N0YWdlMl9yYW5nZShzdHJ1Y3Qga3ZtX3MyX21tdSAKPj4g Km1tdSwgcGh5c19hZGRyX3Qgc3RhcnQsIHU2NAo+PiDCoCBzdGF0aWMgdm9pZCB1bm1hcF9zdGFn ZTJfcmFuZ2Uoc3RydWN0IGt2bV9zMl9tbXUgKm1tdSwgcGh5c19hZGRyX3QgCj4+IHN0YXJ0LCB1 NjQgc2l6ZSkKPj4gwqAgewo+PiAtwqDCoMKgIF9fdW5tYXBfc3RhZ2UyX3JhbmdlKG1tdSwgc3Rh cnQsIHNpemUsIHRydWUpOwo+PiArwqDCoMKgIF9fdW5tYXBfc3RhZ2UyX3JhbmdlKG1tdSwgc3Rh cnQsIHNpemUsIHRydWUsIGZhbHNlKTsKPj4gwqAgfQo+PiDCoCBzdGF0aWMgdm9pZCBzdGFnZTJf Zmx1c2hfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCj4+IEBAIC0xNzcxLDcgKzE3NzIsOCBAQCBi b29sIGt2bV91bm1hcF9nZm5fcmFuZ2Uoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3QgCj4+IGt2bV9n Zm5fcmFuZ2UgKnJhbmdlKQo+PiDCoMKgwqDCoMKgIF9fdW5tYXBfc3RhZ2UyX3JhbmdlKCZrdm0t PmFyY2gubW11LCByYW5nZS0+c3RhcnQgPDwgUEFHRV9TSElGVCwKPj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIChyYW5nZS0+ZW5kIC0gcmFuZ2UtPnN0YXJ0KSA8PCBQQUdF X1NISUZULAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmFuZ2UtPm1heV9i bG9jayk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByYW5nZS0+bWF5X2Js b2NrLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmFuZ2UtPm9ubHlfc2hh cmVkKTsKPj4gwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+IMKgIH0KPj4gZGlmZiAtLWdpdCBh L2FyY2gvYXJtNjQva3ZtL3JtZS5jIGIvYXJjaC9hcm02NC9rdm0vcm1lLmMKPj4gaW5kZXggNjI5 YTA5NWJlYTYxLi45ZTU5ODNjNTEzOTMgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL3Jt ZS5jCj4+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL3JtZS5jCj4+IEBAIC03OSw2ICs3OSwxMiBAQCBz dGF0aWMgcGh5c19hZGRyX3QgX19hbGxvY19kZWxlZ2F0ZWRfcGFnZShzdHJ1Y3QgCj4+IHJlYWxt ICpyZWFsbSwKPj4gwqDCoMKgwqDCoCByZXR1cm4gcGh5czsKPj4gwqAgfQo+PiArc3RhdGljIHBo eXNfYWRkcl90IGFsbG9jX2RlbGVnYXRlZF9wYWdlKHN0cnVjdCByZWFsbSAqcmVhbG0sCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qga3ZtX21tdV9tZW1v cnlfY2FjaGUgKm1jKQo+PiArewo+PiArwqDCoMKgIHJldHVybiBfX2FsbG9jX2RlbGVnYXRlZF9w YWdlKHJlYWxtLCBtYywgR0ZQX0tFUk5FTCk7Cj4+ICt9Cj4+ICsKPj4gwqAgc3RhdGljIHZvaWQg ZnJlZV9kZWxlZ2F0ZWRfcGFnZShzdHJ1Y3QgcmVhbG0gKnJlYWxtLCBwaHlzX2FkZHJfdCBwaHlz KQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgaWYgKHJlYWxtLT5zcGFyZV9wYWdlID09IFBIWVNfQURE Ul9NQVgpIHsKPj4gQEAgLTk0LDYgKzEwMCwxNTEgQEAgc3RhdGljIHZvaWQgZnJlZV9kZWxlZ2F0 ZWRfcGFnZShzdHJ1Y3QgcmVhbG0gCj4+ICpyZWFsbSwgcGh5c19hZGRyX3QgcGh5cykKPj4gwqDC oMKgwqDCoCBmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHBoeXMpKTsKPj4g wqAgfQo+PiArc3RhdGljIGludCByZWFsbV9ydHRfY3JlYXRlKHN0cnVjdCByZWFsbSAqcmVhbG0s Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyLAo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBsZXZlbCwKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwaHlzX2FkZHJfdCBwaHlzKQo+PiArewo+PiArwqDCoMKg IGFkZHIgPSBBTElHTl9ET1dOKGFkZHIsIHJtZV9ydHRfbGV2ZWxfbWFwc2l6ZShsZXZlbCAtIDEp KTsKPj4gK8KgwqDCoCByZXR1cm4gcm1pX3J0dF9jcmVhdGUodmlydF90b19waHlzKHJlYWxtLT5y ZCksIHBoeXMsIGFkZHIsIGxldmVsKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCByZWFsbV9y dHRfZm9sZChzdHJ1Y3QgcmVhbG0gKnJlYWxtLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgdW5zaWduZWQgbG9uZyBhZGRyLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50 IGxldmVsLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgKnJ0dF9n cmFudWxlKQo+PiArewo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgb3V0X3J0dDsKPj4gK8KgwqDC oCBpbnQgcmV0Owo+PiArCj4+ICvCoMKgwqAgcmV0ID0gcm1pX3J0dF9mb2xkKHZpcnRfdG9fcGh5 cyhyZWFsbS0+cmQpLCBhZGRyLCBsZXZlbCwgJm91dF9ydHQpOwo+PiArCj4+ICvCoMKgwqAgaWYg KFJNSV9SRVRVUk5fU1RBVFVTKHJldCkgPT0gUk1JX1NVQ0NFU1MgJiYgcnR0X2dyYW51bGUpCj4+ ICvCoMKgwqDCoMKgwqDCoCAqcnR0X2dyYW51bGUgPSBvdXRfcnR0Owo+PiArCj4+ICvCoMKgwqAg cmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCByZWFsbV9kZXN0cm95X3Byb3Rl Y3RlZChzdHJ1Y3QgcmVhbG0gKnJlYWxtLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgaXBhLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgKm5leHRfYWRkcikKPj4gK3sKPj4gK8KgwqDCoCB1 bnNpZ25lZCBsb25nIHJkID0gdmlydF90b19waHlzKHJlYWxtLT5yZCk7Cj4+ICvCoMKgwqAgdW5z aWduZWQgbG9uZyBhZGRyOwo+PiArwqDCoMKgIHBoeXNfYWRkcl90IHJ0dDsKPj4gK8KgwqDCoCBp bnQgcmV0Owo+PiArCj4+ICtsb29wOgo+PiArwqDCoMKgIHJldCA9IHJtaV9kYXRhX2Rlc3Ryb3ko cmQsIGlwYSwgJmFkZHIsIG5leHRfYWRkcik7Cj4+ICvCoMKgwqAgaWYgKFJNSV9SRVRVUk5fU1RB VFVTKHJldCkgPT0gUk1JX0VSUk9SX1JUVCkgewo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCpuZXh0 X2FkZHIgPiBpcGEpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAwOyAvKiBVTkFT U0lHTkVEICovCj4+ICvCoMKgwqDCoMKgwqDCoCBydHQgPSBhbGxvY19kZWxlZ2F0ZWRfcGFnZShy ZWFsbSwgTlVMTCk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoV0FSTl9PTihydHQgPT0gUEhZU19B RERSX01BWCkpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gK8KgwqDC oMKgwqDCoMKgIC8qIEFTU0lHTkVEIC0gaXBhIGlzIG1hcHBlZCBhcyBhIGJsb2NrLCBzbyBzcGxp dCAqLwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gcmVhbG1fcnR0X2NyZWF0ZShyZWFsbSwgaXBh LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUk1JX1JF VFVSTl9JTkRFWChyZXQpICsgMSwgcnR0KTsKPiAKPiBDb3VsZCB3ZSBub3QgZ28gYWxsIHRoZSB3 YXkgdG8gTDMgKHJhdGhlciB0aGFuIDEgbGV2ZWwgZGVlcGVyKSBhbmQgdHJ5Cj4gYWdhaW4gPyBU aGF0IHdheSwgd2UgYXJlIGNvdmVyZWQgZm9yIGJsb2NrIG1hcHBpbmdzIGF0IEwxICgxRykuCj4g Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoV0FSTl9PTihyZXQpKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGZyZWVfZGVsZWdhdGVkX3BhZ2UocmVhbG0sIHJ0dCk7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldHVybiAtMTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKg wqDCoMKgIC8qIHJldHJ5ICovCj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGxvb3A7Cj4+ICvCoMKg wqAgfSBlbHNlIGlmIChXQVJOX09OKHJldCkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAt MTsKPj4gK8KgwqDCoCB9Cj4+ICvCoMKgwqAgcmV0ID0gcm1pX2dyYW51bGVfdW5kZWxlZ2F0ZShh ZGRyKTsKPj4gKwo+PiArwqDCoMKgIC8qCj4+ICvCoMKgwqDCoCAqIElmIHRoZSB1bmRlbGVnYXRl IGZhaWxzIHRoZW4gc29tZXRoaW5nIGhhcyBnb25lIHNlcmlvdXNseQo+PiArwqDCoMKgwqAgKiB3 cm9uZzogdGFrZSBhbiBleHRyYSByZWZlcmVuY2UgdG8ganVzdCBsZWFrIHRoZSBwYWdlCj4+ICvC oMKgwqDCoCAqLwo+PiArwqDCoMKgIGlmIChXQVJOX09OKHJldCkpCj4+ICvCoMKgwqDCoMKgwqDC oCBnZXRfcGFnZShwaHlzX3RvX3BhZ2UoYWRkcikpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIDA7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJlYWxtX3VubWFwX3JhbmdlX3NoYXJlZChzdHJ1 Y3Qga3ZtICprdm0sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGludCBsZXZlbCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg dW5zaWduZWQgbG9uZyBzdGFydCwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdW5zaWduZWQgbG9uZyBlbmQpCj4+ICt7Cj4+ICvCoMKgwqAgc3RydWN0IHJlYWxt ICpyZWFsbSA9ICZrdm0tPmFyY2gucmVhbG07Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyByZCA9 IHZpcnRfdG9fcGh5cyhyZWFsbS0+cmQpOwo+PiArwqDCoMKgIHNzaXplX3QgbWFwX3NpemUgPSBy bWVfcnR0X2xldmVsX21hcHNpemUobGV2ZWwpOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4 dF9hZGRyLCBhZGRyOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgc2hhcmVkX2JpdCA9IEJJVChy ZWFsbS0+aWFfYml0cyAtIDEpOwo+PiArCj4+ICvCoMKgwqAgaWYgKFdBUk5fT04obGV2ZWwgPiBS TUVfUlRUX01BWF9MRVZFTCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICsKPj4gK8Kg wqDCoCBzdGFydCB8PSBzaGFyZWRfYml0Owo+PiArwqDCoMKgIGVuZCB8PSBzaGFyZWRfYml0Owo+ PiArCj4+ICvCoMKgwqAgZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgPSBuZXh0 X2FkZHIpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWxpZ25fYWRkciA9IEFM SUdOKGFkZHIsIG1hcF9zaXplKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIG5leHRfYWRkciA9IEFMSUdOKGFkZHIgKyAxLCBtYXBfc2l6ZSk7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChhbGlnbl9hZGRyICE9IGFkZHIgfHwgbmV4dF9hZGRy ID4gZW5kKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIE5lZWQgdG8gcmVjdXJzZSBk ZWVwZXIgKi8KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGFkZHIgPCBhbGlnbl9hZGRy KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG5leHRfYWRkciA9IGFsaWduX2Fk ZHI7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlYWxtX3VubWFwX3JhbmdlX3NoYXJlZChr dm0sIGxldmVsICsgMSwgYWRkciwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBtaW4obmV4dF9hZGRyLCBlbmQpKTsKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgY29udGludWU7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKg wqDCoMKgIHJldCA9IHJtaV9ydHRfdW5tYXBfdW5wcm90ZWN0ZWQocmQsIGFkZHIsIGxldmVsLCAm bmV4dF9hZGRyKTsKPiAKPiBtaW5vciBuaXQ6IFdlIGNvdWxkIHBvdGVudGlhbGx5IHVzZSBybWlf cnR0X2Rlc3Ryb3koKSB0byB0ZWFyIGRvd24KPiBzaGFyZWQgbWFwcGluZ3Mgd2l0aG91dCB1bm1h cHBpbmcgdGhlbSBpbmRpdmlkdWFsbHksIGlmIHRoZSByYW5nZQo+IGlzIGJpZyBlbm91Z2guIEFs bCBzdWNoIG9wdGltaXNhdGlvbnMgY291bGQgY29tZSBsYXRlciB0aG91Z2guCj4gCj4+ICvCoMKg wqDCoMKgwqDCoCBzd2l0Y2ggKFJNSV9SRVRVUk5fU1RBVFVTKHJldCkpIHsKPj4gK8KgwqDCoMKg wqDCoMKgIGNhc2UgUk1JX1NVQ0NFU1M6Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFr Owo+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSBSTUlfRVJST1JfUlRUOgo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBpZiAobmV4dF9hZGRyID09IGFkZHIpIHsKPiAKPiBBdCB0aGlzIHBvaW50IHdl IGhhdmUgYSBibG9jayBhbGlnbmVkIGFkZHJlc3MsIGJ1dCB0aGUgbWFwcGluZyBpcwo+IGZ1cnRo ZXIgZGVlcC4gR2l2ZW4sIHN0YXJ0IGZyb20gdG9wIHRvIGRvd24sIHdlIGltcGxpY2l0bHkgaGFu ZGxlCj4gdGhlIGNhc2Ugb2YgYmxvY2sgbWFwcGluZ3MuIE5vdCBzdXJlIGlmIHRoYXQgbmVlZHMg dG8gYmUgaW4gYSBjb21tZW50Cj4gaGVyZS4KPiAKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBuZXh0X2FkZHIgPSBBTElHTihhZGRyICsgMSwgbWFwX3NpemUpOwo+IAo+IFJlc2V0 IHRvIHRoZSAiYWN0dWFsIG5leHQiIGFzIGl0IHdhcyBvdmVyd3JpdHRlbiBieSB0aGUgUk1JIGNh bGwuCj4gCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVhbG1fdW5tYXBfcmFu Z2Vfc2hhcmVkKGt2bSwgbGV2ZWwgKyAxLCBhZGRyLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbmV4dF9hZGRyKTsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgfQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4g K8KgwqDCoMKgwqDCoMKgIGRlZmF1bHQ6Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFdBUk5f T04oMSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+ICvCoMKgwqAgfQo+PiArfQo+PiArCj4+ICtz dGF0aWMgdm9pZCByZWFsbV91bm1hcF9yYW5nZV9wcml2YXRlKHN0cnVjdCBrdm0gKmt2bSwKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25n IHN0YXJ0LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVu c2lnbmVkIGxvbmcgZW5kKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCByZWFsbSAqcmVhbG0gPSAm a3ZtLT5hcmNoLnJlYWxtOwo+PiArwqDCoMKgIHNzaXplX3QgbWFwX3NpemUgPSBSTUVfUEFHRV9T SVpFOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4dF9hZGRyLCBhZGRyOwo+PiArCj4+ICvC oMKgwqAgZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgPSBuZXh0X2FkZHIpIHsK Pj4gK8KgwqDCoMKgwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIG5leHRf YWRkciA9IEFMSUdOKGFkZHIgKyAxLCBtYXBfc2l6ZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKg IHJldCA9IHJlYWxtX2Rlc3Ryb3lfcHJvdGVjdGVkKHJlYWxtLCBhZGRyLCAmbmV4dF9hZGRyKTsK Pj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKFdBUk5fT04ocmV0KSkKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICvCoMKgwqAgfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCByZWFsbV91bm1hcF9yYW5nZShzdHJ1Y3Qga3ZtICprdm0sCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZW5kLAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBib29sIHVubWFwX3ByaXZhdGUpCj4+ICt7Cj4+ICvCoMKg wqAgcmVhbG1fdW5tYXBfcmFuZ2Vfc2hhcmVkKGt2bSwgUk1FX1JUVF9NQVhfTEVWRUwgLSAxLCBz dGFydCwgZW5kKTsKPiAKPiBtaW5vciBuaXQ6IFdlIGFscmVhZHkgaGF2ZSBhIGhlbHBlciB0byBm aW5kIGEgc3VpdGFibGUgc3RhcnQgbGV2ZWwKPiAoZGVmaW5lZCBiZWxvdyksIG1heSBiZSB3ZSBj b3VsZCB1c2UgdGhhdCA/IEFuZCBldmVuIGRvIHRoZSBydHRfZGVzdHJveSAKPiBvcHRpbWlzYXRp b24gZm9yIHVucHJvdGVjdGVkIHJhbmdlLgo+IAo+PiArwqDCoMKgIGlmICh1bm1hcF9wcml2YXRl KQo+PiArwqDCoMKgwqDCoMKgwqAgcmVhbG1fdW5tYXBfcmFuZ2VfcHJpdmF0ZShrdm0sIHN0YXJ0 LCBlbmQpOwo+PiArfQo+PiArCj4+IMKgIHUzMiBrdm1fcmVhbG1faXBhX2xpbWl0KHZvaWQpCj4+ IMKgIHsKPj4gwqDCoMKgwqDCoCByZXR1cm4gdTY0X2dldF9iaXRzKHJtbV9mZWF0X3JlZzAsIFJN SV9GRUFUVVJFX1JFR0lTVEVSXzBfUzJTWik7Cj4+IEBAIC0xOTAsNiArMzQxLDMwIEBAIHN0YXRp YyBpbnQgcmVhbG1fcnR0X2Rlc3Ryb3koc3RydWN0IHJlYWxtICpyZWFsbSwgCj4+IHVuc2lnbmVk IGxvbmcgYWRkciwKPj4gwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiDCoCB9Cj4+ICtzdGF0aWMg aW50IHJlYWxtX2NyZWF0ZV9ydHRfbGV2ZWxzKHN0cnVjdCByZWFsbSAqcmVhbG0sCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBpcGEsCj4+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGxldmVsLAo+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludCBtYXhfbGV2ZWwsCj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGt2bV9tbXVfbWVtb3J5X2NhY2hl ICptYykKPj4gK3sKPj4gK8KgwqDCoCBpZiAoV0FSTl9PTihsZXZlbCA9PSBtYXhfbGV2ZWwpKQo+ PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4gK8KgwqDCoCB3aGlsZSAobGV2ZWwr KyA8IG1heF9sZXZlbCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgcnR0ID0gYWxs b2NfZGVsZWdhdGVkX3BhZ2UocmVhbG0sIG1jKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYg KHJ0dCA9PSBQSFlTX0FERFJfTUFYKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4g LUVOT01FTTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHJlYWxtX3J0dF9jcmVhdGUocmVh bG0sIGlwYSwgbGV2ZWwsIHJ0dCkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZnJlZV9k ZWxlZ2F0ZWRfcGFnZShyZWFsbSwgcnR0KTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIC1FTlhJTzsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8Kg wqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiDCoCBzdGF0aWMgaW50IHJlYWxtX3RlYXJfZG93 bl9ydHRfbGV2ZWwoc3RydWN0IHJlYWxtICpyZWFsbSwgaW50IGxldmVsLAo+PiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1 bnNpZ25lZCBsb25nIGVuZCkKPj4gwqAgewo+PiBAQCAtMjY1LDYgKzQ0MCw2OCBAQCBzdGF0aWMg aW50IHJlYWxtX3RlYXJfZG93bl9ydHRfcmFuZ2Uoc3RydWN0IHJlYWxtIAo+PiAqcmVhbG0sCj4+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0YXJ0LCBlbmQp Owo+PiDCoCB9Cj4+ICsvKgo+PiArICogUmV0dXJucyAwIG9uIHN1Y2Nlc3NmdWwgZm9sZCwgYSBu ZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvciwgYSAKPj4gcG9zaXRpdmUgdmFsdWUgaWYKPj4gKyAqIHdl IHdlcmUgbm90IGFibGUgdG8gZm9sZCBhbGwgdGFibGVzIGF0IHRoaXMgbGV2ZWwuCj4+ICsgKi8K Pj4gK3N0YXRpYyBpbnQgcmVhbG1fZm9sZF9ydHRfbGV2ZWwoc3RydWN0IHJlYWxtICpyZWFsbSwg aW50IGxldmVsLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxv bmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQo+PiArewo+PiArwqDCoMKgIGludCBub3RfZm9s ZGVkID0gMDsKPj4gK8KgwqDCoCBzc2l6ZV90IG1hcF9zaXplOwo+PiArwqDCoMKgIHVuc2lnbmVk IGxvbmcgYWRkciwgbmV4dF9hZGRyOwo+PiArCj4+ICvCoMKgwqAgaWYgKFdBUk5fT04obGV2ZWwg PiBSTUVfUlRUX01BWF9MRVZFTCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsK Pj4gKwo+PiArwqDCoMKgIG1hcF9zaXplID0gcm1lX3J0dF9sZXZlbF9tYXBzaXplKGxldmVsIC0g MSk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciA9 IG5leHRfYWRkcikgewo+PiArwqDCoMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgcnR0X2dyYW51bGU7 Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnQgcmV0Owo+PiArwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQg bG9uZyBhbGlnbl9hZGRyID0gQUxJR04oYWRkciwgbWFwX3NpemUpOwo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoCBuZXh0X2FkZHIgPSBBTElHTihhZGRyICsgMSwgbWFwX3NpemUpOwo+PiArCj4+ICvC oMKgwqDCoMKgwqDCoCByZXQgPSByZWFsbV9ydHRfZm9sZChyZWFsbSwgYWxpZ25fYWRkciwgbGV2 ZWwsICZydHRfZ3JhbnVsZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHN3aXRjaCAoUk1JX1JF VFVSTl9TVEFUVVMocmV0KSkgewo+PiArwqDCoMKgwqDCoMKgwqAgY2FzZSBSTUlfU1VDQ0VTUzoK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFXQVJOX09OKHJtaV9ncmFudWxlX3VuZGVs ZWdhdGUocnR0X2dyYW51bGUpKSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm cmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHJ0dF9ncmFudWxlKSk7Cj4gCj4g bWlub3Igbml0OiBEbyB3ZSBuZWVkIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpbmdzIGxpa2Ug dGhpcywgYWJkIAo+IGxlYWtpbmcgdGhlIHBhZ2UgaWYgdW5kZWxlZ2F0ZSBmYWlscywgc29tZXRo aW5nIGxpa2UKPiBybWVfcmVjbGFpbV9kZWxlZ2F0ZWRfcGFnZSgpwqAgPwo+IAo+IAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgUk1JX0VS Uk9SX1JUVDoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGxldmVsID09IFJNRV9SVFRf TUFYX0xFVkVMIHx8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgUk1JX1JFVFVS Tl9JTkRFWChyZXQpIDwgbGV2ZWwpIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBub3RfZm9sZGVkKys7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg LyogUmVjdXJzZSBhIGxldmVsIGRlZXBlciAqLwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBy ZXQgPSByZWFsbV9mb2xkX3J0dF9sZXZlbChyZWFsbSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGV2ZWwgKyAxLAo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBhZGRyLAo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZXh0X2Fk ZHIpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0IDwgMCkKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBlbHNlIGlmIChyZXQgPT0gMCkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAvKiBUcnkgYWdhaW4gYXQgdGhpcyBsZXZlbCAqLwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIG5leHRfYWRkciA9IGFkZHI7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJy ZWFrOwo+PiArwqDCoMKgwqDCoMKgwqAgZGVmYXVsdDoKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmV0dXJuIC1FTlhJTzsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoCByZXR1cm4gbm90X2ZvbGRlZDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBy ZWFsbV9mb2xkX3J0dF9yYW5nZShzdHJ1Y3QgcmVhbG0gKnJlYWxtLAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5k KQo+PiArewo+PiArwqDCoMKgIHJldHVybiByZWFsbV9mb2xkX3J0dF9sZXZlbChyZWFsbSwgZ2V0 X3N0YXJ0X2xldmVsKHJlYWxtKSArIDEsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzdGFydCwgZW5kKTsKPj4gK30KPj4gKwo+PiDCoCBzdGF0aWMgdm9pZCBlbnN1 cmVfc3BhcmVfcGFnZShzdHJ1Y3QgcmVhbG0gKnJlYWxtKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAg cGh5c19hZGRyX3QgdG1wX3J0dDsKPj4gQEAgLTI5NSw2ICs1MzIsMTQ3IEBAIHZvaWQga3ZtX3Jl YWxtX2Rlc3Ryb3lfcnR0cyhzdHJ1Y3Qga3ZtICprdm0sIHUzMiAKPj4gaWFfYml0cykKPj4gwqDC oMKgwqDCoCBXQVJOX09OKHJlYWxtX3RlYXJfZG93bl9ydHRfcmFuZ2UocmVhbG0sIDAsICgxVUwg PDwgaWFfYml0cykpKTsKPj4gwqAgfQo+PiArdm9pZCBrdm1fcmVhbG1fdW5tYXBfcmFuZ2Uoc3Ry dWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGlwYSwgdTY0IHNpemUsCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgdW5tYXBfcHJpdmF0ZSkKPj4gK3sKPj4gK8KgwqDCoCB1 bnNpZ25lZCBsb25nIGVuZCA9IGlwYSArIHNpemU7Cj4+ICvCoMKgwqAgc3RydWN0IHJlYWxtICpy ZWFsbSA9ICZrdm0tPmFyY2gucmVhbG07Cj4+ICsKPj4gK8KgwqDCoCBlbmQgPSBtaW4oQklUKHJl YWxtLT5pYV9iaXRzIC0gMSksIGVuZCk7Cj4+ICsKPj4gK8KgwqDCoCBlbnN1cmVfc3BhcmVfcGFn ZShyZWFsbSk7Cj4+ICsKPj4gK8KgwqDCoCByZWFsbV91bm1hcF9yYW5nZShrdm0sIGlwYSwgZW5k LCB1bm1hcF9wcml2YXRlKTsKPj4gKwo+PiArwqDCoMKgIHJlYWxtX2ZvbGRfcnR0X3JhbmdlKHJl YWxtLCBpcGEsIGVuZCk7Cj4gCj4gU2hvdWxkbid0IHRoaXMgYmUgOgo+IAo+ICDCoMKgwqDCoGlm ICh1bm1hcF9wcml2YXRlKQo+ICDCoMKgwqDCoMKgwqDCoCByZWFsbV9mb2xkX3J0dF9yYW5nZShy ZWFsbSwgaXBhLCBlbmQpOwo+IAo+IEFsc28gaXQgaXMgZmluZSB0byByZWNsYWltIFJUVHMgZnJv bSB0aGUgcHJvdGVjdGVkIHNwYWNlLCBub3QgdGhlCj4gdW5wcm90ZWN0ZWQgaGFsZiwgYXMgbG9u ZyBhcyB3ZSB1c2UgUlRUX0RFU1RST1kgaW4gdW5tYXBfc2hhcmVkIHJvdXRpbmUuCgpUaGlua2lu ZyBhYm91dCB0aGlzIGEgYml0IG1vcmUsIHdlIGNvdWxkIDoKMS4gUmVuYW1lIHRoaXMgdG8gcmVh bG1fcmVjbGFpbV9ydHRzX3JhbmdlKCkKMi4gVXNlICJGT0xEIiB2cyAiREVTVFJPWSIgZGVwZW5k aW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgUmVhbG0uIElmIHRoZQogICAgcmVhbG0gaXMgRFlJTkcg KG9yIGFkZCBhIHN0YXRlIGluIHRoZSBrdm1fcGd0YWJsZV9zdGFnZTJfZGVzdHJveSgpIHRvCiAg ICBpbmRpY2F0ZSB0aGF0IHN0YWdlMiBjYW4gbm93IGJlICJkZXN0cm95ZWQiKSAgYW5kIHVzZSBE RVNUUk9ZCiAgICB3aGVyZXZlciBpdCBpcyBzYWZlIHRvIGRvIHNvLgoKU3V6dWtpCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=