From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: Re: [PATCH v15 04/11] x86/hvm/ioreq: defer mapping gfns until they are actually requsted Date: Fri, 15 Dec 2017 09:03:14 +0000 Message-ID: <61131b0d0f2a45d2ac2e1b5904bb4ca9@AMSPEX02CL03.citrite.net> References: <20171214174144.27852-1-paul.durrant@citrix.com> <20171214174144.27852-5-paul.durrant@citrix.com> <20171215005018.GA23164@op-computing> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from all-amaz-eas1.inumbo.com ([34.197.232.57]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ePlxd-0006PH-GW for xen-devel@lists.xenproject.org; Fri, 15 Dec 2017 09:07:17 +0000 In-Reply-To: <20171215005018.GA23164@op-computing> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: 'Chao Gao' Cc: Stefano Stabellini , Andrew Cooper , "Tim (Xen.org)" , George Dunlap , Ian Jackson , "xen-devel@lists.xenproject.org" List-Id: xen-devel@lists.xenproject.org PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+IEZyb206IENoYW8gR2FvIFttYWlsdG86Y2hh by5nYW9AaW50ZWwuY29tXQo+IFNlbnQ6IDE1IERlY2VtYmVyIDIwMTcgMDA6NTAKPiBUbzogUGF1 bCBEdXJyYW50IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4KPiBDYzogeGVuLWRldmVsQGxpc3Rz LnhlbnByb2plY3Qub3JnOyBTdGVmYW5vIFN0YWJlbGxpbmkKPiA8c3N0YWJlbGxpbmlAa2VybmVs Lm9yZz47IEdlb3JnZSBEdW5sYXAgPEdlb3JnZS5EdW5sYXBAY2l0cml4LmNvbT47Cj4gQW5kcmV3 IENvb3BlciA8QW5kcmV3LkNvb3BlcjNAY2l0cml4LmNvbT47IElhbiBKYWNrc29uCj4gPElhbi5K YWNrc29uQGNpdHJpeC5jb20+OyBUaW0gKFhlbi5vcmcpIDx0aW1AeGVuLm9yZz4KPiBTdWJqZWN0 OiBSZTogW1hlbi1kZXZlbF0gW1BBVENIIHYxNSAwNC8xMV0geDg2L2h2bS9pb3JlcTogZGVmZXIg bWFwcGluZwo+IGdmbnMgdW50aWwgdGhleSBhcmUgYWN0dWFsbHkgcmVxdXN0ZWQKPiAKPiBPbiBU aHUsIERlYyAxNCwgMjAxNyBhdCAwNTo0MTozN1BNICswMDAwLCBQYXVsIER1cnJhbnQgd3JvdGU6 Cj4gPkEgc3Vic2VxdWVudCBwYXRjaCB3aWxsIGludHJvZHVjZSBhIG5ldyBzY2hlbWUgdG8gYWxs b3cgYW4gZW11bGF0b3IgdG8KPiA+bWFwIGlvcmVxIHNlcnZlciBwYWdlcyBkaXJlY3RseSBmcm9t IFhlbiByYXRoZXIgdGhhbiB0aGUgZ3Vlc3QgUDJNLgo+ID4KPiA+VGhpcyBwYXRjaCBsYXlzIHRo ZSBncm91bmR3b3JrIGZvciB0aGF0IGNoYW5nZSBieSBkZWZlcnJpbmcgbWFwcGluZyBvZgo+ID5n Zm5zIHVudGlsIHRoZWlyIHZhbHVlcyBhcmUgcmVxdWVzdGVkIGJ5IGFuIGVtdWxhdG9yLiBUbyB0 aGF0IGVuZCwgdGhlCj4gPnBhZCBmaWVsZCBvZiB0aGUgeGVuX2RtX29wX2dldF9pb3JlcV9zZXJ2 ZXJfaW5mbyBzdHJ1Y3R1cmUgaXMgcmUtCj4gcHVycG9zZWQKPiA+dG8gYSBmbGFncyBmaWVsZCBh bmQgbmV3IGZsYWcsIFhFTl9ETU9QX25vX2dmbnMsIGRlZmluZWQgd2hpY2ggbW9kaWZpZXMKPiB0 aGUKPiA+YmVoYXZpb3VyIG9mIFhFTl9ETU9QX2dldF9pb3JlcV9zZXJ2ZXJfaW5mbyB0byBhbGxv dyB0aGUgY2FsbGVyIHRvCj4gYXZvaWQKPiA+cmVxdWVzdGluZyB0aGUgZ2ZuIHZhbHVlcy4KPiA+ Cj4gPlNpZ25lZC1vZmYtYnk6IFBhdWwgRHVycmFudCA8cGF1bC5kdXJyYW50QGNpdHJpeC5jb20+ Cj4gPlJldmlld2VkLWJ5OiBSb2dlciBQYXUgTW9ubsOpIDxyb2dlci5wYXVAY2l0cml4LmNvbT4K PiA+QWNrZWQtYnk6IFdlaSBMaXUgPHdlaS5saXUyQGNpdHJpeC5jb20+Cj4gPlJldmlld2VkLWJ5 OiBKYW4gQmV1bGljaCA8amJldWxpY2hAc3VzZS5jb20+Cj4gPi0tLQo+ID5DYzogSWFuIEphY2tz b24gPGlhbi5qYWNrc29uQGV1LmNpdHJpeC5jb20+Cj4gPkNjOiBBbmRyZXcgQ29vcGVyIDxhbmRy ZXcuY29vcGVyM0BjaXRyaXguY29tPgo+ID5DYzogR2VvcmdlIER1bmxhcCA8R2VvcmdlLkR1bmxh cEBldS5jaXRyaXguY29tPgo+ID5DYzogS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxrb25yYWQud2ls a0BvcmFjbGUuY29tPgo+ID5DYzogU3RlZmFubyBTdGFiZWxsaW5pIDxzc3RhYmVsbGluaUBrZXJu ZWwub3JnPgo+ID5DYzogVGltIERlZWdhbiA8dGltQHhlbi5vcmc+Cj4gPgo+ID52ODoKPiA+IC0g Rm9yIHNhZmV0eSBtYWtlIGFsbCBvZiB0aGUgcG9pbnRlcnMgcGFzc2VkIHRvCj4gPiAgIGh2bV9n ZXRfaW9yZXFfc2VydmVyX2luZm8oKSBvcHRpb25hbC4KPiA+IC0gU2hyaW5rIGJ1ZmlvcmVxX2hh bmRsaW5nIGRvd24gdG8gYSB1aW50OF90Lgo+ID4KPiA+djM6Cj4gPiAtIFVwZGF0ZWQgaW4gcmVz cG9uc2UgdG8gcmV2aWV3IGNvbW1lbnRzIGZyb20gV2VpIGFuZCBSb2dlci4KPiA+IC0gQWRkZWQg YSBIQU5ETEVfQlVGSU9SRVEgbWFjcm8gdG8gbWFrZSB0aGUgY29kZSBuZWF0ZXIuCj4gPiAtIFRo aXMgcGF0Y2ggbm8gbG9uZ2VyIGludHJvZHVjZXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IHNp bmNlIHRoZXJlCj4gPiAgIGlzIG5vdyBhbiBleHBsaWNpdCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9m IGlvcmVxIHNlcnZlcnMgdGhhdCBtYXkgYmUKPiA+ICAgY3JlYXRlZCBmb3IgYW55IG9uZSBkb21h aW4uCj4gPi0tLQo+ID4gdG9vbHMvbGlicy9kZXZpY2Vtb2RlbC9jb3JlLmMgICAgICAgICAgICAg ICAgICAgfCAgOCArKysrKwo+ID4gdG9vbHMvbGlicy9kZXZpY2Vtb2RlbC9pbmNsdWRlL3hlbmRl dmljZW1vZGVsLmggfCAgNiArKy0tCj4gPiB4ZW4vYXJjaC94ODYvaHZtL2RtLmMgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICA5ICsrKy0tCj4gPiB4ZW4vYXJjaC94ODYvaHZtL2lvcmVxLmMg ICAgICAgICAgICAgICAgICAgICAgICB8IDQ3ICsrKysrKysrKysrKysrLS0tLS0tLS0tLS0KPiA+ IHhlbi9pbmNsdWRlL2FzbS14ODYvaHZtL2RvbWFpbi5oICAgICAgICAgICAgICAgIHwgIDIgKy0K PiA+IHhlbi9pbmNsdWRlL3B1YmxpYy9odm0vZG1fb3AuaCAgICAgICAgICAgICAgICAgIHwgMzIg KysrKysrKysrKy0tLS0tLS0KPiA+IDYgZmlsZXMgY2hhbmdlZCwgNjMgaW5zZXJ0aW9ucygrKSwg NDEgZGVsZXRpb25zKC0pCj4gPgo+ID5kaWZmIC0tZ2l0IGEvdG9vbHMvbGlicy9kZXZpY2Vtb2Rl bC9jb3JlLmMgYi90b29scy9saWJzL2RldmljZW1vZGVsL2NvcmUuYwo+ID5pbmRleCAzNTViN2Rl YzE4Li5kZjJhOGEwZmU3IDEwMDY0NAo+ID4tLS0gYS90b29scy9saWJzL2RldmljZW1vZGVsL2Nv cmUuYwo+ID4rKysgYi90b29scy9saWJzL2RldmljZW1vZGVsL2NvcmUuYwo+ID5AQCAtMjA0LDYg KzIwNCwxNCBAQCBpbnQgeGVuZGV2aWNlbW9kZWxfZ2V0X2lvcmVxX3NlcnZlcl9pbmZvKAo+ID4K PiA+ICAgICBkYXRhLT5pZCA9IGlkOwo+ID4KPiA+KyAgICAvKgo+ID4rICAgICAqIElmIHRoZSBj YWxsZXIgaXMgbm90IHJlcXVlc3RpbmcgZ2ZuIHZhbHVlcyB0aGVuIGluc3RydWN0IHRoZQo+ID4r ICAgICAqIGh5cGVyY2FsbCBub3QgdG8gcmV0cmlldmUgdGhlbSBhcyB0aGlzIG1heSBjYXVzZSB0 aGVtIHRvIGJlCj4gPisgICAgICogbWFwcGVkLgo+ID4rICAgICAqLwo+ID4rICAgIGlmICghaW9y ZXFfZ2ZuICYmICFidWZpb3JlcV9nZm4pCj4gPisgICAgICAgIGRhdGEtPmZsYWdzIHw9IFhFTl9E TU9QX25vX2dmbnM7Cj4gPisKPiA+ICAgICByYyA9IHhlbmRldmljZW1vZGVsX29wKGRtb2QsIGRv bWlkLCAxLCAmb3AsIHNpemVvZihvcCkpOwo+ID4gICAgIGlmIChyYykKPiA+ICAgICAgICAgcmV0 dXJuIHJjOwo+ID5kaWZmIC0tZ2l0IGEvdG9vbHMvbGlicy9kZXZpY2Vtb2RlbC9pbmNsdWRlL3hl bmRldmljZW1vZGVsLmgKPiBiL3Rvb2xzL2xpYnMvZGV2aWNlbW9kZWwvaW5jbHVkZS94ZW5kZXZp Y2Vtb2RlbC5oCj4gPmluZGV4IGRkYTBiYzc2OTUuLmZmZmVlM2E0YTAgMTAwNjQ0Cj4gPi0tLSBh L3Rvb2xzL2xpYnMvZGV2aWNlbW9kZWwvaW5jbHVkZS94ZW5kZXZpY2Vtb2RlbC5oCj4gPisrKyBi L3Rvb2xzL2xpYnMvZGV2aWNlbW9kZWwvaW5jbHVkZS94ZW5kZXZpY2Vtb2RlbC5oCj4gPkBAIC02 MSwxMSArNjEsMTEgQEAgaW50IHhlbmRldmljZW1vZGVsX2NyZWF0ZV9pb3JlcV9zZXJ2ZXIoCj4g PiAgKiBAcGFybSBkb21pZCB0aGUgZG9tYWluIGlkIHRvIGJlIHNlcnZpY2VkCj4gPiAgKiBAcGFy bSBpZCB0aGUgSU9SRVEgU2VydmVyIGlkLgo+ID4gICogQHBhcm0gaW9yZXFfZ2ZuIHBvaW50ZXIg dG8gYSB4ZW5fcGZuX3QgdG8gcmVjZWl2ZSB0aGUgc3luY2hyb25vdXMKPiBpb3JlcQo+ID4tICog ICAgICAgICAgICAgICAgICBnZm4KPiA+KyAqICAgICAgICAgICAgICAgICAgZ2ZuLiAoTWF5IGJl IE5VTEwgaWYgbm90IHJlcXVpcmVkKQo+ID4gICogQHBhcm0gYnVmaW9yZXFfZ2ZuIHBvaW50ZXIg dG8gYSB4ZW5fcGZuX3QgdG8gcmVjZWl2ZSB0aGUgYnVmZmVyZWQKPiBpb3JlcQo+ID4tICogICAg ICAgICAgICAgICAgICAgIGdmbgo+ID4rICogICAgICAgICAgICAgICAgICAgIGdmbi4gKE1heSBi ZSBOVUxMIGlmIG5vdCByZXF1aXJlZCkKPiA+ICAqIEBwYXJtIGJ1ZmlvcmVxX3BvcnQgcG9pbnRl ciB0byBhIGV2dGNobl9wb3J0X3QgdG8gcmVjZWl2ZSB0aGUKPiBidWZmZXJlZAo+ID4tICogICAg ICAgICAgICAgICAgICAgICBpb3JlcSBldmVudCBjaGFubmVsCj4gPisgKiAgICAgICAgICAgICAg ICAgICAgIGlvcmVxIGV2ZW50IGNoYW5uZWwuIChNYXkgYmUgTlVMTCBpZiBub3QgcmVxdWlyZWQp Cj4gPiAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KPiA+ICAqLwo+ID4g aW50IHhlbmRldmljZW1vZGVsX2dldF9pb3JlcV9zZXJ2ZXJfaW5mbygKPiA+ZGlmZiAtLWdpdCBh L3hlbi9hcmNoL3g4Ni9odm0vZG0uYyBiL3hlbi9hcmNoL3g4Ni9odm0vZG0uYwo+ID5pbmRleCBh Nzg3ZjQzNzM3Li4zYzYxN2JkNzU0IDEwMDY0NAo+ID4tLS0gYS94ZW4vYXJjaC94ODYvaHZtL2Rt LmMKPiA+KysrIGIveGVuL2FyY2gveDg2L2h2bS9kbS5jCj4gPkBAIC00MTYsMTYgKzQxNiwxOSBA QCBzdGF0aWMgaW50IGRtX29wKGNvbnN0IHN0cnVjdCBkbW9wX2FyZ3MKPiAqb3BfYXJncykKPiA+ ICAgICB7Cj4gPiAgICAgICAgIHN0cnVjdCB4ZW5fZG1fb3BfZ2V0X2lvcmVxX3NlcnZlcl9pbmZv ICpkYXRhID0KPiA+ICAgICAgICAgICAgICZvcC51LmdldF9pb3JlcV9zZXJ2ZXJfaW5mbzsKPiA+ KyAgICAgICAgY29uc3QgdWludDE2X3QgdmFsaWRfZmxhZ3MgPSBYRU5fRE1PUF9ub19nZm5zOwo+ ID4KPiA+ICAgICAgICAgY29uc3Rfb3AgPSBmYWxzZTsKPiA+Cj4gPiAgICAgICAgIHJjID0gLUVJ TlZBTDsKPiA+LSAgICAgICAgaWYgKCBkYXRhLT5wYWQgKQo+ID4rICAgICAgICBpZiAoIGRhdGEt PmZsYWdzICYgfnZhbGlkX2ZsYWdzICkKPiA+ICAgICAgICAgICAgIGJyZWFrOwo+ID4KPiA+ICAg ICAgICAgcmMgPSBodm1fZ2V0X2lvcmVxX3NlcnZlcl9pbmZvKGQsIGRhdGEtPmlkLAo+ID4tICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPmlvcmVxX2dmbiwKPiA+ LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5idWZpb3JlcV9n Zm4sCj4gPisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YS0+Zmxh Z3MgJiBYRU5fRE1PUF9ub19nZm5zKSA/Cj4gPisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBOVUxMIDogJmRhdGEtPmlvcmVxX2dmbiwKPiA+KyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChkYXRhLT5mbGFncyAmIFhFTl9ETU9QX25vX2dmbnMpID8K PiA+KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOiAmZGF0YS0+ YnVmaW9yZXFfZ2ZuLAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JmRhdGEtPmJ1ZmlvcmVxX3BvcnQpOwo+ID4gICAgICAgICBicmVhazsKPiA+ICAgICB9Cj4gPmRp ZmYgLS1naXQgYS94ZW4vYXJjaC94ODYvaHZtL2lvcmVxLmMgYi94ZW4vYXJjaC94ODYvaHZtL2lv cmVxLmMKPiA+aW5kZXggZjkxM2VkMzFmYS4uMjg0ZWVmZWFjNSAxMDA2NDQKPiA+LS0tIGEveGVu L2FyY2gveDg2L2h2bS9pb3JlcS5jCj4gPisrKyBiL3hlbi9hcmNoL3g4Ni9odm0vaW9yZXEuYwo+ ID5AQCAtMzUwLDYgKzM1MCw5IEBAIHN0YXRpYyB2b2lkIGh2bV91cGRhdGVfaW9yZXFfZXZ0Y2hu KHN0cnVjdAo+IGh2bV9pb3JlcV9zZXJ2ZXIgKnMsCj4gPiAgICAgfQo+ID4gfQo+ID4KPiA+KyNk ZWZpbmUgSEFORExFX0JVRklPUkVRKHMpIFwKPiA+KyAgICAoKHMpLT5idWZpb3JlcV9oYW5kbGlu ZyAhPSBIVk1fSU9SRVFTUlZfQlVGSU9SRVFfT0ZGKQo+ID4rCj4gPiBzdGF0aWMgaW50IGh2bV9p b3JlcV9zZXJ2ZXJfYWRkX3ZjcHUoc3RydWN0IGh2bV9pb3JlcV9zZXJ2ZXIgKnMsCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKnYpCj4gPiB7Cj4g PkBAIC0zNzEsNyArMzc0LDcgQEAgc3RhdGljIGludCBodm1faW9yZXFfc2VydmVyX2FkZF92Y3B1 KHN0cnVjdAo+IGh2bV9pb3JlcV9zZXJ2ZXIgKnMsCj4gPgo+ID4gICAgIHN2LT5pb3JlcV9ldnRj aG4gPSByYzsKPiA+Cj4gPi0gICAgaWYgKCB2LT52Y3B1X2lkID09IDAgJiYgcy0+YnVmaW9yZXEu dmEgIT0gTlVMTCApCj4gPisgICAgaWYgKCB2LT52Y3B1X2lkID09IDAgJiYgSEFORExFX0JVRklP UkVRKHMpICkKPiA+ICAgICB7Cj4gPiAgICAgICAgIHN0cnVjdCBkb21haW4gKmQgPSBzLT5kb21h aW47Cj4gPgo+ID5AQCAtNDIyLDcgKzQyNSw3IEBAIHN0YXRpYyB2b2lkIGh2bV9pb3JlcV9zZXJ2 ZXJfcmVtb3ZlX3ZjcHUoc3RydWN0Cj4gaHZtX2lvcmVxX3NlcnZlciAqcywKPiA+Cj4gPiAgICAg ICAgIGxpc3RfZGVsKCZzdi0+bGlzdF9lbnRyeSk7Cj4gPgo+ID4tICAgICAgICBpZiAoIHYtPnZj cHVfaWQgPT0gMCAmJiBzLT5idWZpb3JlcS52YSAhPSBOVUxMICkKPiA+KyAgICAgICAgaWYgKCB2 LT52Y3B1X2lkID09IDAgJiYgSEFORExFX0JVRklPUkVRKHMpICkKPiA+ICAgICAgICAgICAgIGZy ZWVfeGVuX2V2ZW50X2NoYW5uZWwodi0+ZG9tYWluLCBzLT5idWZpb3JlcV9ldnRjaG4pOwo+ID4K PiA+ICAgICAgICAgZnJlZV94ZW5fZXZlbnRfY2hhbm5lbCh2LT5kb21haW4sIHN2LT5pb3JlcV9l dnRjaG4pOwo+ID5AQCAtNDQ5LDcgKzQ1Miw3IEBAIHN0YXRpYyB2b2lkCj4gaHZtX2lvcmVxX3Nl cnZlcl9yZW1vdmVfYWxsX3ZjcHVzKHN0cnVjdCBodm1faW9yZXFfc2VydmVyICpzKQo+ID4KPiA+ ICAgICAgICAgbGlzdF9kZWwoJnN2LT5saXN0X2VudHJ5KTsKPiA+Cj4gPi0gICAgICAgIGlmICgg di0+dmNwdV9pZCA9PSAwICYmIHMtPmJ1ZmlvcmVxLnZhICE9IE5VTEwgKQo+ID4rICAgICAgICBp ZiAoIHYtPnZjcHVfaWQgPT0gMCAmJiBIQU5ETEVfQlVGSU9SRVEocykgKQo+ID4gICAgICAgICAg ICAgZnJlZV94ZW5fZXZlbnRfY2hhbm5lbCh2LT5kb21haW4sIHMtPmJ1ZmlvcmVxX2V2dGNobik7 Cj4gPgo+ID4gICAgICAgICBmcmVlX3hlbl9ldmVudF9jaGFubmVsKHYtPmRvbWFpbiwgc3YtPmlv cmVxX2V2dGNobik7Cj4gPkBAIC00NjAsMTQgKzQ2MywxMyBAQCBzdGF0aWMgdm9pZAo+IGh2bV9p b3JlcV9zZXJ2ZXJfcmVtb3ZlX2FsbF92Y3B1cyhzdHJ1Y3QgaHZtX2lvcmVxX3NlcnZlciAqcykK PiA+ICAgICBzcGluX3VubG9jaygmcy0+bG9jayk7Cj4gPiB9Cj4gPgo+ID4tc3RhdGljIGludCBo dm1faW9yZXFfc2VydmVyX21hcF9wYWdlcyhzdHJ1Y3QgaHZtX2lvcmVxX3NlcnZlciAqcywKPiA+ LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYW5kbGVfYnVmaW9y ZXEpCj4gPitzdGF0aWMgaW50IGh2bV9pb3JlcV9zZXJ2ZXJfbWFwX3BhZ2VzKHN0cnVjdCBodm1f aW9yZXFfc2VydmVyICpzKQo+ID4gewo+ID4gICAgIGludCByYzsKPiA+Cj4gPiAgICAgcmMgPSBo dm1fbWFwX2lvcmVxX2dmbihzLCBmYWxzZSk7Cj4gPgo+ID4tICAgIGlmICggIXJjICYmIGhhbmRs ZV9idWZpb3JlcSApCj4gPisgICAgaWYgKCAhcmMgJiYgSEFORExFX0JVRklPUkVRKHMpICkKPiA+ ICAgICAgICAgcmMgPSBodm1fbWFwX2lvcmVxX2dmbihzLCB0cnVlKTsKPiA+Cj4gPiAgICAgaWYg KCByYyApCj4gPkBAIC01OTcsMTMgKzU5OSw3IEBAIHN0YXRpYyBpbnQgaHZtX2lvcmVxX3NlcnZl cl9pbml0KHN0cnVjdAo+IGh2bV9pb3JlcV9zZXJ2ZXIgKnMsCj4gPiAgICAgaWYgKCByYyApCj4g PiAgICAgICAgIHJldHVybiByYzsKPiA+Cj4gPi0gICAgaWYgKCBidWZpb3JlcV9oYW5kbGluZyA9 PSBIVk1fSU9SRVFTUlZfQlVGSU9SRVFfQVRPTUlDICkKPiA+LSAgICAgICAgcy0+YnVmaW9yZXFf YXRvbWljID0gdHJ1ZTsKPiA+LQo+ID4tICAgIHJjID0gaHZtX2lvcmVxX3NlcnZlcl9tYXBfcGFn ZXMoCj4gPi0gICAgICAgICAgICAgcywgYnVmaW9yZXFfaGFuZGxpbmcgIT0gSFZNX0lPUkVRU1JW X0JVRklPUkVRX09GRik7Cj4gCj4gV2h5IG5vdCBzZXQgdXAgbWFwcGluZyBoZXJlIGZvciBkZWZh dWx0IGlvc2VydmVyPwo+IE90aGVyd2lzZSwgb2xkIHFlbXUgd29uJ3QgdHJpZ2dlciB0aGF0LgoK R29vZCBwb2ludCEgTm8gaWRlYSBob3cgSSBtaXNzZWQgdGhhdC4gVGhhbmtzLAoKICBQYXVsCgo+ IAo+IFRoYW5rcwo+IENoYW8KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2pl Y3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4t ZGV2ZWw=