From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: Re: [PATCH 4/4] x86/iommu: add PVH support to the inclusive options Date: Tue, 31 Jul 2018 07:36:02 +0000 Message-ID: References: <20180727153149.25094-1-roger.pau@citrix.com> <20180727153149.25094-5-roger.pau@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fkPCb-0006kP-Tc for xen-devel@lists.xenproject.org; Tue, 31 Jul 2018 07:36:17 +0000 In-Reply-To: <20180727153149.25094-5-roger.pau@citrix.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: "xen-devel@lists.xenproject.org" Cc: Stefano Stabellini , Wei Liu , Andrew Cooper , "Tim (Xen.org)" , George Dunlap , Julien Grall , Jan Beulich , Ian Jackson , Roger Pau Monne List-Id: xen-devel@lists.xenproject.org PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBYZW4tZGV2ZWwgW21haWx0bzp4 ZW4tZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmDQo+IE9mIFJv Z2VyIFBhdSBNb25uZQ0KPiBTZW50OiAyNyBKdWx5IDIwMTggMTY6MzINCj4gVG86IHhlbi1kZXZl bEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBDYzogU3RlZmFubyBTdGFiZWxsaW5pIDxzc3RhYmVs bGluaUBrZXJuZWwub3JnPjsgV2VpIExpdQ0KPiA8d2VpLmxpdTJAY2l0cml4LmNvbT47IEdlb3Jn ZSBEdW5sYXAgPEdlb3JnZS5EdW5sYXBAY2l0cml4LmNvbT47DQo+IEFuZHJldyBDb29wZXIgPEFu ZHJldy5Db29wZXIzQGNpdHJpeC5jb20+OyBJYW4gSmFja3Nvbg0KPiA8SWFuLkphY2tzb25AY2l0 cml4LmNvbT47IFRpbSAoWGVuLm9yZykgPHRpbUB4ZW4ub3JnPjsgSnVsaWVuIEdyYWxsDQo+IDxq dWxpZW4uZ3JhbGxAYXJtLmNvbT47IEphbiBCZXVsaWNoIDxqYmV1bGljaEBzdXNlLmNvbT47IFJv Z2VyIFBhdQ0KPiBNb25uZSA8cm9nZXIucGF1QGNpdHJpeC5jb20+DQo+IFN1YmplY3Q6IFtYZW4t ZGV2ZWxdIFtQQVRDSCA0LzRdIHg4Ni9pb21tdTogYWRkIFBWSCBzdXBwb3J0IHRvIHRoZQ0KPiBp bmNsdXNpdmUgb3B0aW9ucw0KPiANCj4gU2V2ZXJhbCBwZW9wbGUgaGF2ZSByZXBvcnRlZCBoYXJk d2FyZSBpc3N1ZXMgKG1hbGZ1bmN0aW9uaW5nIFVTQg0KPiBjb250cm9sbGVycykgZHVlIHRvIGlv bW11IHBhZ2UgZmF1bHRzLiBUaG9zZSBmYXVsdHMgYXJlIGNhdXNlZCBieQ0KPiBtaXNzaW5nIFJN UlIgKFZUZCkgb3IgSVJWUyAoQU1ELVZpKSBlbnRyaWVzIGluIHRoZSBBQ1BJIHRhYmxlcy4gVGhv c2UNCj4gY2FuIGJlIHdvcmtlZCBhcm91bmQgb24gVlRkIGhhcmR3YXJlIGJ5IG1hbnVhbGx5IGFk ZGluZyBSTVJSIGVudHJpZXMNCj4gb24gdGhlIGNvbW1hbmQgbGluZSwgdGhpcyBpcyBob3dldmVy IGxpbWl0ZWQgdG8gSW50ZWwgaGFyZHdhcmUgYW5kDQo+IHF1aXRlIGN1bWJlcnNvbWUgdG8gZG8u DQo+IA0KPiBJbiBvcmRlciB0byBzb2x2ZSB0aG9zZSBpc3N1ZXMgYWRkIFBWSCBzdXBwb3J0IHRv IHRoZSBpbmNsdXNpdmUgb3B0aW9uDQo+IHRoYXQgaWRlbnRpdHkgbWFwcyBhbGwgcmVnaW9ucyBt YXJrZWQgYXMgcmVzZXJ2ZWQgaW4gdGhlIG1lbW9yeSBtYXAuDQo+IE5vdGUgdGhhdCByZWdpb25z IHVzZWQgYnkgZGV2aWNlcyBlbXVsYXRlZCBieSBYZW4gKExBUElDLCBJTy1BUElDIG9yDQo+IFBD SWUgTUNGRyByZWdpb25zKSBhcmUgc3BlY2lmaWNhbGx5IGF2b2lkZWQuIE5vdGUgdGhhdCB0aGlz IG9wdGlvbg0KPiBjdXJyZW50bHkgcmVsaWVzIG9uIG5vIE1TSVggTU1JTyBhcmVhcyByZXNpZGlu ZyBpbiBhIHJlc2VydmVkIHJlZ2lvbiwNCj4gb3IgZWxzZSBYZW4gd29uJ3QgYmUgYWJsZSB0byB0 cmFwIHRob3NlIGFjY2Vzc2VzLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogUm9nZXIgUGF1IE1vbm7D qSA8cm9nZXIucGF1QGNpdHJpeC5jb20+DQo+IC0tLQ0KPiBDYzogQW5kcmV3IENvb3BlciA8YW5k cmV3LmNvb3BlcjNAY2l0cml4LmNvbT4NCj4gQ2M6IEdlb3JnZSBEdW5sYXAgPEdlb3JnZS5EdW5s YXBAZXUuY2l0cml4LmNvbT4NCj4gQ2M6IElhbiBKYWNrc29uIDxpYW4uamFja3NvbkBldS5jaXRy aXguY29tPg0KPiBDYzogSmFuIEJldWxpY2ggPGpiZXVsaWNoQHN1c2UuY29tPg0KPiBDYzogSnVs aWVuIEdyYWxsIDxqdWxpZW4uZ3JhbGxAYXJtLmNvbT4NCj4gQ2M6IEtvbnJhZCBSemVzenV0ZWsg V2lsayA8a29ucmFkLndpbGtAb3JhY2xlLmNvbT4NCj4gQ2M6IFN0ZWZhbm8gU3RhYmVsbGluaSA8 c3N0YWJlbGxpbmlAa2VybmVsLm9yZz4NCj4gQ2M6IFRpbSBEZWVnYW4gPHRpbUB4ZW4ub3JnPg0K PiBDYzogV2VpIExpdSA8d2VpLmxpdTJAY2l0cml4LmNvbT4NCj4gLS0tDQo+ICBkb2NzL21pc2Mv eGVuLWNvbW1hbmQtbGluZS5tYXJrZG93biB8IDE2ICsrKystLQ0KPiAgeGVuL2RyaXZlcnMvcGFz c3Rocm91Z2gveDg2L2lvbW11LmMgfCA4MiArKysrKysrKysrKysrKysrKysrKysrKy0tDQo+IC0t LS0NCj4gIDIgZmlsZXMgY2hhbmdlZCwgNzcgaW5zZXJ0aW9ucygrKSwgMjEgZGVsZXRpb25zKC0p DQo+IA0KPiBkaWZmIC0tZ2l0IGEvZG9jcy9taXNjL3hlbi1jb21tYW5kLWxpbmUubWFya2Rvd24g Yi9kb2NzL21pc2MveGVuLQ0KPiBjb21tYW5kLWxpbmUubWFya2Rvd24NCj4gaW5kZXggOTFhOGJm YzlhNi4uYzdjOWEzOGMxOSAxMDA2NDQNCj4gLS0tIGEvZG9jcy9taXNjL3hlbi1jb21tYW5kLWxp bmUubWFya2Rvd24NCj4gKysrIGIvZG9jcy9taXNjL3hlbi1jb21tYW5kLWxpbmUubWFya2Rvd24N Cj4gQEAgLTEyMDMsMTEgKzEyMDMsMTcgQEAgZGV0ZWN0aW9uIG9mIHN5c3RlbXMga25vd24gdG8g bWlzYmVoYXZlIHVwb24NCj4gYWNjZXNzZXMgdG8gdGhhdCBwb3J0Lg0KPiAgPiBEZWZhdWx0OiBg dHJ1ZWANCj4gDQo+ICA+PiBVc2UgdGhpcyB0byB3b3JrIGFyb3VuZCBmaXJtd2FyZSBpc3N1ZXMg cHJvdmlkaW5nIGluY29ycmVjdCBSTVJSIG9yDQo+IElWTUQNCj4gLT4+IGVudHJpZXMuIFJhdGhl ciB0aGFuIG9ubHkgbWFwcGluZyBSQU0gcGFnZXMgZm9yIElPTU1VIGFjY2Vzc2VzIGZvcg0KPiBE b20wLA0KPiAtPj4gd2l0aCB0aGlzIG9wdGlvbiBhbGwgcGFnZXMgdXAgdG8gNEdCLCBub3QgbWFy a2VkIGFzIHVudXNhYmxlIGluIHRoZSBFODIwDQo+IC0+PiB0YWJsZSwgd2lsbCBnZXQgYSBtYXBw aW5nIGVzdGFibGlzaGVkLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgb25seQ0KPiAtPj4gYXBw bGljYWJsZSB0byBhIFBWIGRvbTAuIEFsc28gbm90ZSB0aGF0IGlmIGBkb20wLXN0cmljdGAgbW9k ZSBpcyBlbmFibGVkDQo+IC0+PiB0aGVuIGNvbnZlbnRpb25hbCBSQU0gcGFnZXMgbm90IGFzc2ln bmVkIHRvIGRvbTAgd2lsbCBub3QgYmUgbWFwcGVkLg0KPiArPj4gZW50cmllcy4gVGhlIGJlaGF2 aW91ciBvZiB0aGlzIG9wdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYmV0d2VlbiBhIFBWDQo+ IGFuZA0KPiArPj4gYSBQVkggRG9tMDoNCj4gKz4+DQo+ICs+PiAqIEZvciBhIFBWIERvbTAgYWxs IHBhZ2VzIHVwIHRvIDRHQiBub3QgbWFya2VkIGFzIHVudXNhYmxlIGluIHRoZQ0KPiBtZW1vcnkN Cj4gKz4+ICAgbWFwIHdpbGwgZ2V0IGEgbWFwcGluZyBlc3RhYmxpc2hlZC4gTm90ZSB0aGF0IGlm IGBkb20wLXN0cmljdGAgbW9kZSBpcw0KPiArPj4gICBlbmFibGVkIHRoZW4gY29udmVudGlvbmFs IFJBTSBwYWdlcyBub3QgYXNzaWduZWQgdG8gZG9tMCB3aWxsIG5vdCBiZQ0KPiArPj4gICBtYXBw ZWQuDQo+ICs+Pg0KPiArPj4gKiBGb3IgYSBQVkggRG9tMCBhbGwgbWVtb3J5IHJlZ2lvbnMgbWFy a2VkIGFzIHJlc2VydmVkIGluIHRoZQ0KPiBtZW1vcnkgbWFwDQo+ICs+PiAgIHRoYXQgZG9uJ3Qg b3ZlcmxhcCB3aXRoIGFueSBNTUlPIHJlZ2lvbiBmcm9tIGVtdWxhdGVkIGRldmljZXMgd2lsbCBi ZQ0KPiArPj4gICBpZGVudGl0eSBtYXBwZWQuDQo+IA0KPiAgIyMjIGlvbW11XF9kZXZcX2lvdGxi XF90aW1lb3V0DQo+ICA+IGA9IDxpbnRlZ2VyPmANCj4gZGlmZiAtLWdpdCBhL3hlbi9kcml2ZXJz L3Bhc3N0aHJvdWdoL3g4Ni9pb21tdS5jDQo+IGIveGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gveDg2 L2lvbW11LmMNCj4gaW5kZXggMjRjYzU5MWFhNS4uY2ZhZmUxYjU3MiAxMDA2NDQNCj4gLS0tIGEv eGVuL2RyaXZlcnMvcGFzc3Rocm91Z2gveDg2L2lvbW11LmMNCj4gKysrIGIveGVuL2RyaXZlcnMv cGFzc3Rocm91Z2gveDg2L2lvbW11LmMNCj4gQEAgLTIwLDYgKzIwLDggQEANCj4gICNpbmNsdWRl IDx4ZW4vc29mdGlycS5oPg0KPiAgI2luY2x1ZGUgPHhzbS94c20uaD4NCj4gDQo+ICsjaW5jbHVk ZSA8YXNtL2FwaWNkZWYuaD4NCj4gKyNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPg0KPiAgI2luY2x1 ZGUgPGFzbS9zZXR1cC5oPg0KPiANCj4gIHZvaWQgaW9tbXVfdXBkYXRlX2lyZV9mcm9tX2FwaWMo DQo+IEBAIC0xMzQsMTEgKzEzNiw2MiBAQCB2b2lkIGFyY2hfaW9tbXVfZG9tYWluX2Rlc3Ryb3ko c3RydWN0IGRvbWFpbg0KPiAqZCkNCj4gIHsNCj4gIH0NCj4gDQo+ICtzdGF0aWMgYm9vbCBfX2h3 ZG9tX2luaXQgcHZfaW5jbHVzaXZlX21hcCh1bnNpZ25lZCBsb25nIHBmbiwNCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbWF4X3BmbikN Cg0KUGVyaGFwcyBwdl9od2RvbV9pbmNsdXNpdmVfbWFwKCkgKGFuZCBzaW1pbGFybHkgcHZoX2h3 ZG9tX2luY2x1c2l2ZV9tYXAoKSkgdG8gbWFrZSBpdCBvYnZpb3VzIHRoYXQgdGhleSBhcmUgaW50 ZW5kZWQgb25seSBmb3IgdGhlIGhhcmR3YXJlIGRvbWFpbi4gKEkga25vdyB0aGUgYW5ub3RhdGlv biBtYWtlcyB0aGlzIHJlYXNvbmFibHkgb2J2aW91cyBidXQgb3RoZXIgaHdkb20tc3BlY2lmaWMg ZnVuY3Rpb25zIHNlZW0gdG8gY2FycnkgdGhpcyBpbiB0aGVpciBuYW1lKS4NCg0KICBQYXVsDQoN Cj4gK3sNCj4gKyAgICAvKg0KPiArICAgICAqIElmIGRvbTAtc3RyaWN0IG1vZGUgaXMgZW5hYmxl ZCB0aGVuIGV4Y2x1ZGUgY29udmVudGlvbmFsIFJBTQ0KPiArICAgICAqIGFuZCBsZXQgdGhlIGNv bW1vbiBjb2RlIG1hcCBkb20wJ3MgcGFnZXMuDQo+ICsgICAgICovDQo+ICsgICAgaWYgKCBpb21t dV9kb20wX3N0cmljdCAmJiBwYWdlX2lzX3JhbV90eXBlKHBmbiwNCj4gUkFNX1RZUEVfQ09OVkVO VElPTkFMKSApDQo+ICsgICAgICAgIHJldHVybiBmYWxzZTsNCj4gKyAgICBpZiAoIGlvbW11X2lu Y2x1c2l2ZSAmJiBwZm4gPD0gbWF4X3BmbiApDQo+ICsgICAgICAgIHJldHVybiAhcGFnZV9pc19y YW1fdHlwZShwZm4sIFJBTV9UWVBFX1VOVVNBQkxFKTsNCj4gKw0KPiArICAgIHJldHVybiBwYWdl X2lzX3JhbV90eXBlKHBmbiwgUkFNX1RZUEVfQ09OVkVOVElPTkFMKTsNCj4gK30NCj4gKw0KPiAr c3RhdGljIGJvb2wgX19od2RvbV9pbml0IHB2aF9pbmNsdXNpdmVfbWFwKGNvbnN0IHN0cnVjdCBk b21haW4gKmQsDQo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg dW5zaWduZWQgbG9uZyBwZm4pDQo+ICt7DQo+ICsgICAgdW5zaWduZWQgaW50IGk7DQo+ICsNCj4g KyAgICAvKg0KPiArICAgICAqIElnbm9yZSBhbnkgYWRkcmVzcyBiZWxvdyAxTUIsIHRoYXQncyBh bHJlYWR5IGlkZW50aXR5IG1hcHBlZCBieSB0aGUNCj4gKyAgICAgKiBkb21haW4gYnVpbGRlci4N Cj4gKyAgICAgKi8NCj4gKyAgICBpZiAoIHBmbiA8IFBGTl9ET1dOKE1CKDEpKSApDQo+ICsgICAg ICAgIHJldHVybiBmYWxzZTsNCj4gKw0KPiArICAgIC8qIE9ubHkgYWRkIHJlc2VydmVkIHJlZ2lv bnMuICovDQo+ICsgICAgaWYgKCAhcGFnZV9pc19yYW1fdHlwZShwZm4sIFJBTV9UWVBFX1JFU0VS VkVEKSApDQo+ICsgICAgICAgIHJldHVybiBmYWxzZTsNCj4gKw0KPiArICAgIC8qIENoZWNrIHRo YXQgaXQgZG9lc24ndCBvdmVybGFwIHdpdGggdGhlIExBUElDICovDQo+ICsgICAgaWYgKCBwZm4g PT0gUEZOX0RPV04oQVBJQ19ERUZBVUxUX1BIWVNfQkFTRSkgKQ0KPiArICAgICAgICByZXR1cm4g ZmFsc2U7DQo+ICsgICAgLyogLi4uIG9yIHRoZSBJTy1BUElDICovDQo+ICsgICAgZm9yICggaSA9 IDA7IGkgPCBucl9pb2FwaWNzOyBpKysgKQ0KPiArICAgICAgICBpZiAoIHBmbiA9PSBQRk5fRE9X Tihkb21haW5fdmlvYXBpYyhkLCBpKS0+YmFzZV9hZGRyZXNzKSApDQo+ICsgICAgICAgICAgICBy ZXR1cm4gZmFsc2U7DQo+ICsgICAgLyogLi4uIG9yIHRoZSBQQ0llIE1DRkcgcmVnaW9ucy4gKi8N Cj4gKyAgICBmb3IgKCBpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKysgKQ0KPiAr ICAgIHsNCj4gKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gUEZOX0RPV04ocGNpX21tY2Zn X2NvbmZpZ1tpXS5hZGRyZXNzKTsNCj4gKw0KPiArICAgICAgICBpZiAoIHBmbiA+PSBhZGRyICsg KHBjaV9tbWNmZ19jb25maWdbaV0uc3RhcnRfYnVzX251bWJlciA8PCA4KSAmJg0KPiArICAgICAg ICAgICAgIHBmbiA8IGFkZHIgKyAocGNpX21tY2ZnX2NvbmZpZ1tpXS5lbmRfYnVzX251bWJlciA8 PCA4KSApDQo+ICsgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQo+ICsgICAgfQ0KPiArDQo+ICsg ICAgcmV0dXJuIHRydWU7DQo+ICt9DQo+ICsNCj4gIHZvaWQgX19od2RvbV9pbml0IGFyY2hfaW9t bXVfaHdkb21faW5pdChzdHJ1Y3QgZG9tYWluICpkKQ0KPiAgew0KPiAgICAgIHVuc2lnbmVkIGxv bmcgaSwgaiwgdG1wLCB0b3AsIG1heF9wZm47DQo+IA0KPiAtICAgIGlmICggaW9tbXVfcGFzc3Ro cm91Z2ggfHwgIWlzX3B2X2RvbWFpbihkKSApDQo+ICsgICAgaWYgKCBpb21tdV9wYXNzdGhyb3Vn aCApDQo+ICAgICAgICAgIHJldHVybjsNCj4gDQo+ICAgICAgQlVHX09OKCFpc19oYXJkd2FyZV9k b21haW4oZCkpOw0KPiBAQCAtMTQ5LDcgKzIwMiw2IEBAIHZvaWQgX19od2RvbV9pbml0IGFyY2hf aW9tbXVfaHdkb21faW5pdChzdHJ1Y3QNCj4gZG9tYWluICpkKQ0KPiAgICAgIGZvciAoIGkgPSAw OyBpIDwgdG9wOyBpKysgKQ0KPiAgICAgIHsNCj4gICAgICAgICAgdW5zaWduZWQgbG9uZyBwZm4g PSBwZHhfdG9fcGZuKGkpOw0KPiAtICAgICAgICBib29sIG1hcDsNCj4gICAgICAgICAgaW50IHJj ID0gMDsNCj4gDQo+ICAgICAgICAgIC8qDQo+IEBAIC0xNjMsMjUgKzIxNSwyMyBAQCB2b2lkIF9f aHdkb21faW5pdA0KPiBhcmNoX2lvbW11X2h3ZG9tX2luaXQoc3RydWN0IGRvbWFpbiAqZCkNCj4g ICAgICAgICAgICAgICB4ZW5faW5fcmFuZ2UocGZuKSApDQo+ICAgICAgICAgICAgICBjb250aW51 ZTsNCj4gDQo+IC0gICAgICAgIC8qDQo+IC0gICAgICAgICAqIElmIGRvbTAtc3RyaWN0IG1vZGUg aXMgZW5hYmxlZCB0aGVuIGV4Y2x1ZGUgY29udmVudGlvbmFsIFJBTQ0KPiAtICAgICAgICAgKiBh bmQgbGV0IHRoZSBjb21tb24gY29kZSBtYXAgZG9tMCdzIHBhZ2VzLg0KPiAtICAgICAgICAgKi8N Cj4gLSAgICAgICAgaWYgKCBpb21tdV9kb20wX3N0cmljdCAmJg0KPiAtICAgICAgICAgICAgIHBh Z2VfaXNfcmFtX3R5cGUocGZuLCBSQU1fVFlQRV9DT05WRU5USU9OQUwpICkNCj4gLSAgICAgICAg ICAgIG1hcCA9IGZhbHNlOw0KPiAtICAgICAgICBlbHNlIGlmICggaW9tbXVfaW5jbHVzaXZlICYm IHBmbiA8PSBtYXhfcGZuICkNCj4gLSAgICAgICAgICAgIG1hcCA9ICFwYWdlX2lzX3JhbV90eXBl KHBmbiwgUkFNX1RZUEVfVU5VU0FCTEUpOw0KPiAtICAgICAgICBlbHNlDQo+IC0gICAgICAgICAg ICBtYXAgPSBwYWdlX2lzX3JhbV90eXBlKHBmbiwgUkFNX1RZUEVfQ09OVkVOVElPTkFMKTsNCj4g LQ0KPiAtICAgICAgICBpZiAoICFtYXAgKQ0KPiArICAgICAgICBpZiAoIGlzX3B2X2RvbWFpbihk KSA/ICFwdl9pbmNsdXNpdmVfbWFwKHBmbiwgbWF4X3BmbikNCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgOiAhcHZoX2luY2x1c2l2ZV9tYXAoZCwgcGZuKSApDQo+ICAgICAgICAgICAg ICBjb250aW51ZTsNCj4gDQo+ICAgICAgICAgIHRtcCA9IDEgPDwgKFBBR0VfU0hJRlQgLSBQQUdF X1NISUZUXzRLKTsNCj4gICAgICAgICAgZm9yICggaiA9IDA7IGogPCB0bXA7IGorKyApDQo+ICAg ICAgICAgIHsNCj4gLSAgICAgICAgICAgIGludCByZXQgPSBpb21tdV9tYXBfcGFnZShkLCBwZm4g KiB0bXAgKyBqLCBwZm4gKiB0bXAgKyBqLA0KPiArICAgICAgICAgICAgaW50IHJldDsNCj4gKw0K PiArICAgICAgICAgICAgaWYgKCBpb21tdV91c2VfaGFwX3B0KGQpICkNCj4gKyAgICAgICAgICAg IHsNCj4gKyAgICAgICAgICAgICAgICBBU1NFUlQoaXNfaHZtX2RvbWFpbihkKSk7DQo+ICsgICAg ICAgICAgICAgICAgcmV0ID0gc2V0X2lkZW50aXR5X3AybV9lbnRyeShkLCBwZm4gKiB0bXAgKyBq LCBwMm1fYWNjZXNzX3J3LA0KPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgMCk7DQo+ICsgICAgICAgICAgICB9DQo+ICsgICAgICAgICAgICBlbHNlDQo+ICsg ICAgICAgICAgICAgICAgcmV0ID0gaW9tbXVfbWFwX3BhZ2UoZCwgcGZuICogdG1wICsgaiwgcGZu ICogdG1wICsgaiwNCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT01N VUZfcmVhZGFibGV8SU9NTVVGX3dyaXRhYmxlKTsNCj4gDQo+ICAgICAgICAgICAgICBpZiAoICFy YyApDQo+IC0tDQo+IDIuMTguMA0KPiANCj4gDQo+IF9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fDQo+IFhlbi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gWGVuLWRl dmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcv bWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3Rz LnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0 aW5mby94ZW4tZGV2ZWw=