From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulina Szubarczyk Subject: Re: [PATCH v4 2/2] qdisk - hw/block/xen_disk: grant copy implementation Date: Mon, 8 Aug 2016 13:34:47 +0200 Message-ID: <57A86E57.3020606__35631.4565208324$1470656158$gmane$org@gmail.com> References: <1470146790-6168-1-git-send-email-paulinaszubarczyk@gmail.com> <1470146790-6168-3-git-send-email-paulinaszubarczyk@gmail.com> <20160808111103.psksqgqjs4rcxqjd@mac> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bWipZ-0001ji-1z for xen-devel@lists.xenproject.org; Mon, 08 Aug 2016 11:34:53 +0000 Received: by mail-wm0-f68.google.com with SMTP id o80so14877941wme.0 for ; Mon, 08 Aug 2016 04:34:51 -0700 (PDT) In-Reply-To: <20160808111103.psksqgqjs4rcxqjd@mac> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= Cc: sstabellini@kernel.org, wei.liu2@citrix.com, ian.jackson@eu.citrix.com, qemu-devel@nongnu.org, david.vrabel@citrix.com, anthony.perard@citrix.com, xen-devel@lists.xenproject.org List-Id: xen-devel@lists.xenproject.org T24gMDgvMDgvMjAxNiAwMToxMSBQTSwgUm9nZXIgUGF1IE1vbm7DqSB3cm90ZToKPiBPbiBUdWUs IEF1ZyAwMiwgMjAxNiBhdCAwNDowNjozMFBNICswMjAwLCBQYXVsaW5hIFN6dWJhcmN6eWsgd3Jv dGU6Cj4+IENvcHkgZGF0YSBvcGVyYXRlZCBvbiBkdXJpbmcgcmVxdWVzdCBmcm9tL3RvIGxvY2Fs IGJ1ZmZlcnMgdG8vZnJvbQo+PiB0aGUgZ3JhbnQgcmVmZXJlbmNlcy4KPj4KPj4gQmVmb3JlIGdy YW50IGNvcHkgb3BlcmF0aW9uIGxvY2FsIGJ1ZmZlcnMgbXVzdCBiZSBhbGxvY2F0ZWQgd2hhdCBp cwo+PiBkb25lIGJ5IGNhbGxpbmcgaW9yZXFfaW5pdF9jb3B5X2J1ZmZlcnMuIEZvciB0aGUgJ3Jl YWQnIG9wZXJhdGlvbiwKPj4gZmlyc3QsIHRoZSBxZW11IGRldmljZSBpbnZva2VzIHRoZSByZWFk IG9wZXJhdGlvbiBvbiBsb2NhbCBidWZmZXJzCj4+IGFuZCBvbiB0aGUgY29tcGxldGlvbiBncmFu dCBjb3B5IGlzIGNhbGxlZCBhbmQgYnVmZmVycyBhcmUgZnJlZWQuCj4+IEZvciB0aGUgJ3dyaXRl JyBvcGVyYXRpb24gZ3JhbnQgY29weSBpcyBwZXJmb3JtZWQgYmVmb3JlIGludm9raW5nCj4+IHdy aXRlIGJ5IHFlbXUgZGV2aWNlLgo+Pgo+PiBBIG5ldyB2YWx1ZSAnZmVhdHVyZV9ncmFudF9jb3B5 JyBpcyBhZGRlZCB0byByZWNvZ25pemUgd2hlbiB0aGUKPj4gZ3JhbnQgY29weSBvcGVyYXRpb24g aXMgc3VwcG9ydGVkIGJ5IGEgZ3Vlc3QuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IFBhdWxpbmEgU3p1 YmFyY3p5ayA8cGF1bGluYXN6dWJhcmN6eWtAZ21haWwuY29tPgo+Cj4gVGhhbmtzLCB0aGlzIGlz IGxvb2tpbmcgZ29vZCwganVzdCBhIGNvdXBsZSBvZiBtaW5vciBjb21tZW50cyBiZWxvdy4KPgoK VGhhbmsgeW91IGZvciB0aGUgcmV2aWV3LCBJIHdpbGwgYXBwbHkgdGhlIGNvbW1lbnRzLgoKPj4g LS0tCj4+IENoYW5nZXMgc2luY2UgdjM6Cj4+IC0gcWVtdV9tZW1hbGlnbi9xZW11X2ZyZWUgaXMg dXNlZCBpbnN0ZWFkIGZ1bmN0aW9uIGFsbG9jYXRpbmcKPj4gICAgbWVtb3J5IGZyb20geGMuCj4+ IC0gcmVtb3ZlZCB0aGUgZ2V0X2J1ZmZlciBmdW5jdGlvbiBpbnN0ZWFkIHRoZXJlIGlzIGEgZGly ZWN0IGNhbGwKPj4gICAgdG8gcWVtdV9tZW1hbGlnbi4KPj4gLSBtb3ZlZCBpb3JlcV9jb3B5IGZv ciB3cml0ZSBvcGVyYXRpb24gdG8gaW9yZXFfcnVuaW9fcWVtdV9haW8uCj4+IC0gYWRkZWQgc3Ry dWN0IHhlbmdudHRhYl9ncmFudF9jb3B5X3NlZ21lbnRfdCBhbmQgc3R1YiBpbgo+PiAgICB4ZW5f Y29tbW9uLmggZm9yIHZlcnNpb24gb2YgeGVuIGVhcmxpZXIgdGhlbiA0ODAuCj4+IC0gYWRkZWQg Y2hlY2tpbmcgZm9yIHZlcnNpb24gNDgwIHRvIGNvbmZpZ3VyZS4gVGhlIHRlc3QgcmVwZWF0cwo+ PiAgICBhbGwgdGhlIG9wZXJhdGlvbiB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdmVyc2lvbiA8IDQ4 MCBhbmQKPj4gICAgY2hlY2tzIGlmIHhlbmdudHRhYl9ncmFudF9jb3B5KCkgaXMgaW1wbGVtZW50 ZWQuCj4+Cj4+ICogSSBkaWQgbm90IGNoYW5nZSB0aGUgd2F5IG9mIHRlc3RpbmcgaWYgZ3JhbnRf Y29weSBvcGVyYXRpb24gaXMKPj4gICAgaW1wbGVtZW50ZWQuIEFzIGZhciBhcyBJIHVuZGVyc3Rh bmQgaWYgdGhlIGNvZGUgZnJvbQo+PiAgICBnbnR0YWJfdW5pbXAuYyBpcyB1c2VkIHRoZW4gdGhl IGdudHRhYiBkZXZpY2UgaXMgdW5hdmFpbGFibGUKPj4gICAgYW5kIHRoZSBoYW5kbGVyIHRvIGdu dGRldiB3b3VsZCBiZSBpbnZhbGlkLiBCdXQgaWYgdGhlIGhhbmRsZXIKPj4gICAgaXMgdmFsaWQg dGhlbiB0aGUgaW9jdGwgc2hvdWxkIHJldHVybiBvcGVyYXRpb24gdW5pbXBsZW1lbnRlZAo+PiAg ICBpZiB0aGUgZ250ZGV2IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uLgo+PiAtLS0K Pj4gICBjb25maWd1cmUgICAgICAgICAgICAgICAgICAgfCAgNTYgKysrKysrKysrKysrKysrKysK Pj4gICBody9ibG9jay94ZW5fZGlzay5jICAgICAgICAgfCAxNDIgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrLS0KPj4gICBpbmNsdWRlL2h3L3hlbi94ZW5fY29tbW9u LmggfCAgMjUgKysrKysrKysKPj4gICAzIGZpbGVzIGNoYW5nZWQsIDIxOCBpbnNlcnRpb25zKCsp LCA1IGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJl Cj4+IGluZGV4IGY1N2ZjYzYuLmI1YmY3ZDQgMTAwNzU1Cj4+IC0tLSBhL2NvbmZpZ3VyZQo+PiAr KysgYi9jb25maWd1cmUKPj4gQEAgLTE5NTYsNiArMTk1Niw2MiBAQCBFT0YKPj4gICAvKgo+PiAg ICAqIElmIHdlIGhhdmUgc3RhYmxlIGxpYnMgdGhlIHdlIGRvbid0IHdhbnQgdGhlIGxpYnhjIGNv bXBhdAo+PiAgICAqIGxheWVycywgcmVnYXJkbGVzcyBvZiB3aGF0IENGTEFHUyB3ZSBtYXkgaGF2 ZSBiZWVuIGdpdmVuLgo+PiArICoKPj4gKyAqIEFsc28sIGNoZWNrIGlmIHhlbmdudHRhYl9ncmFu dF9jb3B5X3NlZ21lbnRfdCBpcyBkZWZpbmVkIGFuZAo+PiArICogZ3JhbnQgY29weSBvcGVyYXRp b24gaXMgaW1wbGVtZW50ZWQuCj4+ICsgKi8KPj4gKyN1bmRlZiBYQ19XQU5UX0NPTVBBVF9FVlRD SE5fQVBJCj4+ICsjdW5kZWYgWENfV0FOVF9DT01QQVRfR05UVEFCX0FQSQo+PiArI3VuZGVmIFhD X1dBTlRfQ09NUEFUX01BUF9GT1JFSUdOX0FQSQo+PiArI2luY2x1ZGUgPHhlbmN0cmwuaD4KPj4g KyNpbmNsdWRlIDx4ZW5zdG9yZS5oPgo+PiArI2luY2x1ZGUgPHhlbmV2dGNobi5oPgo+PiArI2lu Y2x1ZGUgPHhlbmdudHRhYi5oPgo+PiArI2luY2x1ZGUgPHhlbmZvcmVpZ25tZW1vcnkuaD4KPj4g KyNpbmNsdWRlIDxzdGRpbnQuaD4KPj4gKyNpbmNsdWRlIDx4ZW4vaHZtL2h2bV9pbmZvX3RhYmxl Lmg+Cj4+ICsjaWYgIWRlZmluZWQoSFZNX01BWF9WQ1BVUykKPj4gKyMgZXJyb3IgSFZNX01BWF9W Q1BVUyBub3QgZGVmaW5lZAo+PiArI2VuZGlmCj4+ICtpbnQgbWFpbih2b2lkKSB7Cj4+ICsgIHhj X2ludGVyZmFjZSAqeGMgPSBOVUxMOwo+PiArICB4ZW5mb3JlaWdubWVtb3J5X2hhbmRsZSAqeGZt ZW07Cj4+ICsgIHhlbmV2dGNobl9oYW5kbGUgKnhlOwo+PiArICB4ZW5nbnR0YWJfaGFuZGxlICp4 ZzsKPj4gKyAgeGVuX2RvbWFpbl9oYW5kbGVfdCBoYW5kbGU7Cj4+ICsgIHhlbmdudHRhYl9ncmFu dF9jb3B5X3NlZ21lbnRfdCogc2VnID0gTlVMTDsKPj4gKwo+PiArICB4c19kYWVtb25fb3Blbigp Owo+PiArCj4+ICsgIHhjID0geGNfaW50ZXJmYWNlX29wZW4oMCwgMCwgMCk7Cj4+ICsgIHhjX2h2 bV9zZXRfbWVtX3R5cGUoMCwgMCwgSFZNTUVNX3JhbV9ybywgMCwgMCk7Cj4+ICsgIHhjX2RvbWFp bl9hZGRfdG9fcGh5c21hcCgwLCAwLCBYRU5NQVBTUEFDRV9nbWZuLCAwLCAwKTsKPj4gKyAgeGNf aHZtX2luamVjdF9tc2koeGMsIDAsIDB4ZjAwMDAwMDAsIDB4MDAwMDAwMDApOwo+PiArICB4Y19o dm1fY3JlYXRlX2lvcmVxX3NlcnZlcih4YywgMCwgSFZNX0lPUkVRU1JWX0JVRklPUkVRX0FUT01J QywgTlVMTCk7Cj4+ICsgIHhjX2RvbWFpbl9jcmVhdGUoeGMsIDAsIGhhbmRsZSwgMCwgTlVMTCwg TlVMTCk7Cj4+ICsKPj4gKyAgeGZtZW0gPSB4ZW5mb3JlaWdubWVtb3J5X29wZW4oMCwgMCk7Cj4+ ICsgIHhlbmZvcmVpZ25tZW1vcnlfbWFwKHhmbWVtLCAwLCAwLCAwLCAwLCAwKTsKPj4gKwo+PiAr ICB4ZSA9IHhlbmV2dGNobl9vcGVuKDAsIDApOwo+PiArICB4ZW5ldnRjaG5fZmQoeGUpOwo+PiAr Cj4+ICsgIHhnID0geGVuZ250dGFiX29wZW4oMCwgMCk7Cj4+ICsgIHhlbmdudHRhYl9tYXBfZ3Jh bnRfcmVmKHhnLCAwLCAwLCAwKTsKPgo+IEkgZG9uJ3QgdGhpbmsgeW91IG5lZWQgdG8gY2hlY2sg eGVuZ250dGFiX21hcF9ncmFudF9yZWYsIGp1c3QKPiB4ZW5nbnR0YWJfZ3JhbnRfY29weSBzaG91 bGQgYmUgZW5vdWdoPyBTaW5jZSB4ZW5nbnR0YWJfZ3JhbnRfY29weSB3YXMgYWRkZWQKPiBsYXRl ciB5b3UgY2FuIGFzc3VtZSB4ZW5nbnR0YWJfbWFwX2dyYW50X3JlZiB3aWxsIGJlIHRoZXJlLgo+ Cj4+ICsgIHhlbmdudHRhYl9ncmFudF9jb3B5KHhnLCAwLCBzZWcpOwo+PiArCj4+ICsgIHJldHVy biAwOwo+PiArfQo+PiArRU9GCj4+ICsgICAgICBjb21waWxlX3Byb2cgIiIgIiR4ZW5fbGlicyAk eGVuX3N0YWJsZV9saWJzIgo+PiArICAgIHRoZW4KPj4gKyAgICB4ZW5fY3RybF92ZXJzaW9uPTQ4 MAo+PiArICAgIHhlbj15ZXMKPj4gKyAgZWxpZgo+PiArICAgICAgY2F0ID4gJFRNUEMgPDxFT0Yg JiYKPj4gKy8qCj4+ICsgKiBJZiB3ZSBoYXZlIHN0YWJsZSBsaWJzIHRoZSB3ZSBkb24ndCB3YW50 IHRoZSBsaWJ4YyBjb21wYXQKPj4gKyAqIGxheWVycywgcmVnYXJkbGVzcyBvZiB3aGF0IENGTEFH UyB3ZSBtYXkgaGF2ZSBiZWVuIGdpdmVuLgo+PiAgICAqLwo+PiAgICN1bmRlZiBYQ19XQU5UX0NP TVBBVF9FVlRDSE5fQVBJCj4+ICAgI3VuZGVmIFhDX1dBTlRfQ09NUEFUX0dOVFRBQl9BUEkKPj4g ZGlmZiAtLWdpdCBhL2h3L2Jsb2NrL3hlbl9kaXNrLmMgYi9ody9ibG9jay94ZW5fZGlzay5jCj4+ IGluZGV4IDNiOGFkMzMuLjJkZDE0NjQgMTAwNjQ0Cj4+IC0tLSBhL2h3L2Jsb2NrL3hlbl9kaXNr LmMKPj4gKysrIGIvaHcvYmxvY2sveGVuX2Rpc2suYwo+PiBAQCAtMTE5LDYgKzExOSw5IEBAIHN0 cnVjdCBYZW5CbGtEZXYgewo+PiAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBlcnNpc3RlbnRf Z250X2NvdW50Owo+PiAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1heF9ncmFudHM7Cj4+Cj4+ ICsgICAgLyogR3JhbnQgY29weSAqLwo+PiArICAgIGdib29sZWFuICAgICAgICAgICAgZmVhdHVy ZV9ncmFudF9jb3B5Owo+PiArCj4+ICAgICAgIC8qIHFlbXUgYmxvY2sgZHJpdmVyICovCj4+ICAg ICAgIERyaXZlSW5mbyAgICAgICAgICAgKmRpbmZvOwo+PiAgICAgICBCbG9ja0JhY2tlbmQgICAg ICAgICpibGs7Cj4+IEBAIC00ODksNiArNDkyLDk1IEBAIHN0YXRpYyBpbnQgaW9yZXFfbWFwKHN0 cnVjdCBpb3JlcSAqaW9yZXEpCj4+ICAgICAgIHJldHVybiAwOwo+PiAgIH0KPj4KPj4gK3N0YXRp YyB2b2lkIGZyZWVfYnVmZmVycyhzdHJ1Y3QgaW9yZXEgKmlvcmVxKQo+PiArewo+PiArICAgIGlu dCBpOwo+PiArCj4+ICsgICAgZm9yIChpID0gMDsgaSA8IGlvcmVxLT52Lm5pb3Y7IGkrKykgewo+ PiArICAgICAgICBpb3JlcS0+cGFnZVtpXSA9IE5VTEw7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAg cWVtdV92ZnJlZShpb3JlcS0+cGFnZXMpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGlvcmVx X2luaXRfY29weV9idWZmZXJzKHN0cnVjdCBpb3JlcSAqaW9yZXEpCj4+ICt7Cj4+ICsgICAgaW50 IGk7Cj4+ICsKPj4gKyAgICBpZiAoaW9yZXEtPnYubmlvdiA9PSAwKSB7Cj4+ICsgICAgICAgIHJl dHVybiAwOwo+PiArICAgIH0KPj4gKwo+PiArICAgIGlvcmVxLT5wYWdlcyA9IHFlbXVfbWVtYWxp Z24oWENfUEFHRV9TSVpFLCBpb3JlcS0+di5uaW92ICogWENfUEFHRV9TSVpFKTsKPj4gKyAgICBp ZiAoIWlvcmVxLT5wYWdlcykgewo+PiArICAgICAgICByZXR1cm4gLTE7Cj4+ICsgICAgfQo+PiAr Cj4+ICsgICAgZm9yIChpID0gMDsgaSA8IGlvcmVxLT52Lm5pb3Y7IGkrKykgewo+PiArICAgICAg ICBpb3JlcS0+cGFnZVtpXSA9IGlvcmVxLT5wYWdlcyArIGkgKiBYQ19QQUdFX1NJWkU7Cj4+ICsg ICAgICAgIGlvcmVxLT52LmlvdltpXS5pb3ZfYmFzZSA9IGlvcmVxLT5wYWdlW2ldOwo+PiArICAg IH0KPj4gKwo+PiArICAgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGlvcmVx X2NvcHkoc3RydWN0IGlvcmVxICppb3JlcSkKPj4gK3sKPj4gKyAgICB4ZW5nbnR0YWJfaGFuZGxl ICpnbnQgPSBpb3JlcS0+YmxrZGV2LT54ZW5kZXYuZ250dGFiZGV2Owo+PiArICAgIHhlbmdudHRh Yl9ncmFudF9jb3B5X3NlZ21lbnRfdCBzZWdzW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVT VF07Cj4+ICsgICAgaW50IGksIGNvdW50ID0gMCwgciwgcmM7Cj4KPiBXaHkgZG8geW91IG5lZWQg dG8gaW5pdGlhbGl6ZSBjb3VudCB0byAwIGhlcmU/IEEgY291cGxlIG9mIGxpbmVzIGJlbG93IHlv dQo+IGluY29uZGl0aW9uYWxseSBzZXQgaXQgdG8gaW9yZXEtPnYubmlvdi4KPgo+PiArICAgIGlu dDY0X3QgZmlsZV9ibGsgPSBpb3JlcS0+YmxrZGV2LT5maWxlX2JsazsKPj4gKwo+PiArICAgIGlm IChpb3JlcS0+di5uaW92ID09IDApIHsKPj4gKyAgICAgICAgcmV0dXJuIDA7Cj4+ICsgICAgfQo+ PiArCj4+ICsgICAgY291bnQgPSBpb3JlcS0+di5uaW92Owo+PiArCj4+ICsgICAgZm9yIChpID0g MDsgaSA8IGNvdW50OyBpKyspIHsKPj4gKwo+PiArICAgICAgICBpZiAoaW9yZXEtPnJlcS5vcGVy YXRpb24gPT0gQkxLSUZfT1BfUkVBRCkgewo+PiArICAgICAgICAgICAgc2Vnc1tpXS5mbGFncyA9 IEdOVENPUFlfZGVzdF9ncmVmOwo+PiArICAgICAgICAgICAgc2Vnc1tpXS5kZXN0LmZvcmVpZ24u cmVmID0gaW9yZXEtPnJlZnNbaV07Cj4+ICsgICAgICAgICAgICBzZWdzW2ldLmRlc3QuZm9yZWln bi5kb21pZCA9IGlvcmVxLT5kb21pZHNbaV07Cj4+ICsgICAgICAgICAgICBzZWdzW2ldLmRlc3Qu Zm9yZWlnbi5vZmZzZXQgPSBpb3JlcS0+cmVxLnNlZ1tpXS5maXJzdF9zZWN0ICogZmlsZV9ibGs7 Cj4+ICsgICAgICAgICAgICBzZWdzW2ldLnNvdXJjZS52aXJ0ID0gaW9yZXEtPnYuaW92W2ldLmlv dl9iYXNlOwo+PiArICAgICAgICB9IGVsc2Ugewo+PiArICAgICAgICAgICAgc2Vnc1tpXS5mbGFn cyA9IEdOVENPUFlfc291cmNlX2dyZWY7Cj4+ICsgICAgICAgICAgICBzZWdzW2ldLnNvdXJjZS5m b3JlaWduLnJlZiA9IGlvcmVxLT5yZWZzW2ldOwo+PiArICAgICAgICAgICAgc2Vnc1tpXS5zb3Vy Y2UuZm9yZWlnbi5kb21pZCA9IGlvcmVxLT5kb21pZHNbaV07Cj4+ICsgICAgICAgICAgICBzZWdz W2ldLnNvdXJjZS5mb3JlaWduLm9mZnNldCA9IGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0X3NlY3Qg KiBmaWxlX2JsazsKPj4gKyAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC52aXJ0ID0gaW9yZXEtPnYu aW92W2ldLmlvdl9iYXNlOwo+PiArICAgICAgICB9Cj4+ICsgICAgICAgIHNlZ3NbaV0ubGVuID0g KGlvcmVxLT5yZXEuc2VnW2ldLmxhc3Rfc2VjdAo+PiArICAgICAgICAgICAgICAgICAgICAgICAt IGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0X3NlY3QgKyAxKSAqIGZpbGVfYmxrOwo+PiArCj4+ICsg ICAgfQo+PiArCj4+ICsgICAgcmMgPSB4ZW5nbnR0YWJfZ3JhbnRfY29weShnbnQsIGNvdW50LCBz ZWdzKTsKPj4gKwo+PiArICAgIGlmIChyYykgewo+PiArICAgICAgICB4ZW5fYmVfcHJpbnRmKCZp b3JlcS0+YmxrZGV2LT54ZW5kZXYsIDAsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgImZhaWxl ZCB0byBjb3B5IGRhdGEgJWRcbiIsIHJjKTsKPj4gKyAgICAgICAgaW9yZXEtPmFpb19lcnJvcnMr KzsKPj4gKyAgICAgICAgcmV0dXJuIC0xOwo+PiArICAgIH0gZWxzZSB7Cj4+ICsgICAgICAgIHIg PSAwOwo+PiArICAgIH0KPgo+IERvIHlvdSByZWFsbHkgbmVlZCBib3RoIHIgYW5kIHJjIGhlcmU/ IEkgdGhpbmsgeW91IGNvdWxkIGp1c3QgaGF2ZSByYyBhbmQKPiB1c2UgaXQgYmVsb3cgYWxzby4K Pgo+PiArICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cj4+ICsgICAgICAgIGlmIChz ZWdzW2ldLnN0YXR1cyAhPSBHTlRTVF9va2F5KSB7Cj4+ICsgICAgICAgICAgICB4ZW5fYmVfcHJp bnRmKCZpb3JlcS0+YmxrZGV2LT54ZW5kZXYsIDMsCj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICJmYWlsZWQgdG8gY29weSBkYXRhICVkIGZvciBncmVmICVkLCBkb21pZCAlZFxuIiwgcmMs Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIGlvcmVxLT5yZWZzW2ldLCBpb3JlcS0+ZG9t aWRzW2ldKTsKPj4gKyAgICAgICAgICAgIGlvcmVxLT5haW9fZXJyb3JzKys7Cj4+ICsgICAgICAg ICAgICByID0gLTE7Cj4+ICsgICAgICAgIH0KPj4gKyAgICB9Cj4+ICsKPj4gKyAgICByZXR1cm4g cjsKPj4gK30KPj4gKwo+PiAgIHN0YXRpYyBpbnQgaW9yZXFfcnVuaW9fcWVtdV9haW8oc3RydWN0 IGlvcmVxICppb3JlcSk7Cj4+Cj4+ICAgc3RhdGljIHZvaWQgcWVtdV9haW9fY29tcGxldGUodm9p ZCAqb3BhcXVlLCBpbnQgcmV0KQo+Cj4gUm9nZXIuCj4KClBhdWxpbmEKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QK WGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=