From mboxrd@z Thu Jan 1 00:00:00 1970 From: Volodymyr Babchuk Subject: Re: [PATCH v2 09/13] optee: add support for arbitrary shared memory Date: Mon, 10 Sep 2018 21:04:18 +0300 Message-ID: References: <1535993677-20816-1-git-send-email-volodymyr_babchuk@epam.com> <1535993677-20816-10-git-send-email-volodymyr_babchuk@epam.com> <4dd245b3-beba-e9fd-5367-f45358b07d8d@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <4dd245b3-beba-e9fd-5367-f45358b07d8d@arm.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: Julien Grall , xen-devel@lists.xenproject.org, xen-devel@lists.xen.org Cc: tee-dev@lists.linaro.org, Stefano Stabellini List-Id: xen-devel@lists.xenproject.org SGksCgpPbiAxMC4wOS4xOCAxNzowMiwgSnVsaWVuIEdyYWxsIHdyb3RlOgo+IEhpLAo+IAo+IE9u IDAzLzA5LzE4IDE3OjU0LCBWb2xvZHlteXIgQmFiY2h1ayB3cm90ZToKPj4gU2hhcmVkIG1lbW9y eSBpcyB3aWRlbHkgdXNlZCBieSBOVyB0byBjb21tdW5pY2F0ZSB3aXRoCj4+IFRBcyBpbiBPUC1U RUUuIE5XIGNhbiBzaGFyZSBwYXJ0IG9mIG93biBtZW1vcnkgd2l0aAo+PiBUQSBvciBPUC1URUUg Y29yZSwgYnkgcmVnaXN0ZXJpbmcgaXQgT1AtVEVFLCBvciBieSBwcm92aWRpbmcKPj4gYSB0ZW1w b3JhbCByZWZlcm5jZS4gQW55d2F5cywgaW5mb3JtYXRpb24gYWJvdXQgc3VjaCBtZW1vcnkKPj4g YnVmZmVycyBhcmUgc2VudCB0byBPUC1URUUgYXMgYSBsaXN0IG9mIHBhZ2VzLiBUaGlzIG1lY2hh bmlzbQo+PiBpcyBkZXNjcmlwdGVkIG9wdGVlX21zZy5oLgo+Pgo+PiBNZWRpYXRvciBzaG91bGQg c3RlcCBpbiB3aGVuIE5XIHRyaWVzIHRvIHNoYXJlIG1lbW9yeSB3aXRoCj4+IE9QLVRFRSBmb3Ig dHdvIHJlYXNvbnM6Cj4+Cj4+IDEuIERvIGFkZHJlc3MgdHJhbnNsYXRpb24gZnJvbSBJUEEgdG8g UEEuCj4+IDIuIFBpbiBkb21haW4gcGFnZXMgdGlsbCB0aGV5IGFyZSBtYXBwZWQgaW50byBPUC1U RUUgb3IgVEEKPj4gwqDCoMKgIGFkZHJlc3Mgc3BhY2UsIHNvIGRvbWFpbiBjYW4ndCB0cmFuc2Zl ciB0aGlzIHBhZ2VzIHRvCj4+IMKgwqDCoCBvdGhlciBkb21haW4gb3IgYmFsb29uIG91dCB0aGVt Lgo+IAo+IHMvYmFsb29uL2JhbGxvb24vCj4gCj4+Cj4+IEFkZHJlc3MgdHJhbnNsYXRpb24gaXMg ZG9uZSBieSB0cmFuc2xhdGVfbm9uY29udGlnKC4uLikgZnVuY3Rpb24uCj4+IEl0IGFsbG9jYXRl cyBuZXcgYnVmZmVyIGZyb20geGVuaGVhcCBhbmQgdGhlbiB3YWxrcyBvbiBndWVzdAo+PiBwcm92 aWRlZCBsaXN0IG9mIHBhZ2VzLCB0cmFuc2xhdGVzIGFkZHJlc3NlcyBhbmQgc3RvcmVzIFBBcyBp bnRvCj4+IG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuIFRoaXMgYnVmZmVyIHdpbGwgYmUgcHJvdmlk ZWQgdG8gT1AtVEVFCj4+IGluc3RlYWQgb2Ygb3JpZ2luYWwgYnVmZmVyIGZyb20gdGhlIGd1ZXN0 LiBUaGlzIGJ1ZmZlciB3aWxsCj4+IGJlIGZyZWUgYXQgdGhlIGVuZCBvZiBzZGFuZGFyZCBjYWxs Lgo+Pgo+PiBJbiB0aGUgc2FtZSB0aW1lIHRoaXMgZnVuY3Rpb24gcGlucyBwYWdlcyBhbmQgc3Rv cmVzIHRoZW0gaW4KPj4gc3RydWN0IHNobV9idWYgb2JqZWN0LiBUaGlzIG9iamVjdCB3aWxsIGxp dmUgYWxsIHRoZSB0aW1lLAo+PiB3aGVuIGdpdmVuIFNITSBidWZmZXIgaXMga25vd24gdG8gT1At VEVFLiBJdCB3aWxsIGJlIGZyZWVkCj4+IGFmdGVyIGd1ZXN0IHVucmVnaXN0ZXJzIHNoYXJlZCBi dWZmZXIuIEF0IHRoaXMgdGltZSBwYWdlcwo+PiB3aWxsIGJlIHVucGlubmVkLgo+Pgo+PiBTaWdu ZWQtb2ZmLWJ5OiBWb2xvZHlteXIgQmFiY2h1ayA8dm9sb2R5bXlyX2JhYmNodWtAZXBhbS5jb20+ Cj4+IC0tLQo+PiDCoCB4ZW4vYXJjaC9hcm0vdGVlL29wdGVlLmMgfCAyNDUgCj4+ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCj4+IMKgIDEgZmlsZSBjaGFu Z2VkLCAyNDQgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEv eGVuL2FyY2gvYXJtL3RlZS9vcHRlZS5jIGIveGVuL2FyY2gvYXJtL3RlZS9vcHRlZS5jCj4+IGlu ZGV4IDZkNmI1MWQuLjhiZmNmZGMgMTAwNjQ0Cj4+IC0tLSBhL3hlbi9hcmNoL2FybS90ZWUvb3B0 ZWUuYwo+PiArKysgYi94ZW4vYXJjaC9hcm0vdGVlL29wdGVlLmMKPj4gQEAgLTIyLDYgKzIyLDgg QEAKPj4gwqAgI2RlZmluZSBNQVhfU1REX0NBTExTwqDCoCAxNgo+PiDCoCAjZGVmaW5lIE1BWF9S UENfU0hNU8KgwqDCoCAxNgo+PiArI2RlZmluZSBNQVhfVE9UQUxfU01IX0JVRl9QR8KgwqDCoCAx NjM4NAo+IAo+IFNvIHRoYXQncyA2NE1CIHdvcnRoIG9mIGd1ZXN0IG1lbW9yeS4gRG8gd2UgZXhw ZWN0IHRoZW0gdG8gYmUgbWFwcGVkIGluIAo+IFhlbj8gT3IganVzdCBwaW5uZWQ/Ckp1c3QgcGlu bmVkLiBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gY29udGVudHMgb2YgdGhpcyBtZW1vcnkuCgo+ PiArI2RlZmluZSBNQVhfTk9OQ09OVElHX0VOVFJJRVPCoMKgIDUKPj4gwqAgLyoKPj4gwqDCoCAq IENhbGwgY29udGV4dC4gT1AtVEVFIGNhbiBpc3N1ZSBtdWx0aXBsZSBSUEMgcmV0dXJucyBkdXJp bmcgb25lIGNhbGwuCj4+IEBAIC0zMSw2ICszMyw5IEBAIHN0cnVjdCBzdGRfY2FsbF9jdHggewo+ PiDCoMKgwqDCoMKgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3Qg b3B0ZWVfbXNnX2FyZyAqZ3Vlc3RfYXJnOwo+PiDCoMKgwqDCoMKgIHN0cnVjdCBvcHRlZV9tc2df YXJnICp4ZW5fYXJnOwo+PiArwqDCoMKgIC8qIEJ1ZmZlciBmb3IgdHJhbnNsYXRlZCBwYWdlIGFk ZHJlc3Nlcywgc2hhcmVkIHdpdGggT1AtVEVFICovCj4+ICvCoMKgwqAgdm9pZCAqbm9uX2NvbnRp Z1tNQVhfTk9OQ09OVElHX0VOVFJJRVNdOwo+PiArwqDCoMKgIGludCBub25fY29udGlnX29yZGVy W01BWF9OT05DT05USUdfRU5UUklFU107Cj4gCj4gQ2FuIHlvdSBwbGVhc2UgaW50cm9kdWNlIGEg c3RydWN0dXJlIHdpdGggdGhlIG9yZGVyIGFuZCBtYXBwaW5nPwo+IAo+PiDCoMKgwqDCoMKgIG1m bl90IGd1ZXN0X2FyZ19tZm47Cj4+IMKgwqDCoMKgwqAgaW50IG9wdGVlX3RocmVhZF9pZDsKPj4g wqDCoMKgwqDCoCBpbnQgcnBjX29wOwo+PiBAQCAtNDUsMTMgKzUwLDI0IEBAIHN0cnVjdCBzaG1f cnBjIHsKPj4gwqDCoMKgwqDCoCB1aW50NjRfdCBjb29raWU7Cj4+IMKgIH07Cj4+ICsvKiBTaGFy ZWQgbWVtb3J5IGJ1ZmZlciBmb3IgYXJiaXRyYXJ5IGRhdGEgKi8KPj4gK3N0cnVjdCBzaG1fYnVm IHsKPj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4+ICvCoMKgwqAgdWludDY0X3Qg Y29va2llOwo+PiArwqDCoMKgIGludCBtYXhfcGFnZV9jbnQ7Cj4+ICvCoMKgwqAgaW50IHBhZ2Vf Y250Owo+IAo+IEFGQUlDVCwgbWF4X3BhZ2VfY250IGFuZCBwYWdlX2NudCBzaG91bGQgbmV2ZXIg YnV0IG5lZ2F0aXZlLiBJZiBzbywgdGhlbiAKPiB0aGV5IHNob3VsZCBiZSB1bnNpZ25lZC4KPiAK Pj4gK8KgwqDCoCBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlc1tdOwo+PiArfTsKPj4gKwo+PiDCoCBz dHJ1Y3QgZG9tYWluX2N0eCB7Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGxpc3RfaGVhZCBsaXN0Owo+ PiDCoMKgwqDCoMKgIHN0cnVjdCBsaXN0X2hlYWQgY2FsbF9jdHhfbGlzdDsKPj4gwqDCoMKgwqDC oCBzdHJ1Y3QgbGlzdF9oZWFkIHNobV9ycGNfbGlzdDsKPj4gK8KgwqDCoCBzdHJ1Y3QgbGlzdF9o ZWFkIHNobV9idWZfbGlzdDsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgZG9tYWluICpkb21haW47Cj4+ IMKgwqDCoMKgwqAgYXRvbWljX3QgY2FsbF9jdHhfY291bnQ7Cj4+IMKgwqDCoMKgwqAgYXRvbWlj X3Qgc2htX3JwY19jb3VudDsKPj4gK8KgwqDCoCBhdG9taWNfdCBzaG1fYnVmX3BhZ2VzOwo+PiDC oMKgwqDCoMKgIHNwaW5sb2NrX3QgbG9jazsKPj4gwqAgfTsKPj4gQEAgLTE1OCw5ICsxNzQsMTIg QEAgc3RhdGljIGludCBvcHRlZV9lbmFibGUoc3RydWN0IGRvbWFpbiAqZCkKPj4gwqDCoMKgwqDC oCBjdHgtPmRvbWFpbiA9IGQ7Cj4+IMKgwqDCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJmN0eC0+Y2Fs bF9jdHhfbGlzdCk7Cj4+IMKgwqDCoMKgwqAgSU5JVF9MSVNUX0hFQUQoJmN0eC0+c2htX3JwY19s aXN0KTsKPj4gK8KgwqDCoCBJTklUX0xJU1RfSEVBRCgmY3R4LT5zaG1fYnVmX2xpc3QpOwo+PiDC oMKgwqDCoMKgIGF0b21pY19zZXQoJmN0eC0+Y2FsbF9jdHhfY291bnQsIDApOwo+PiDCoMKgwqDC oMKgIGF0b21pY19zZXQoJmN0eC0+c2htX3JwY19jb3VudCwgMCk7Cj4+ICvCoMKgwqAgYXRvbWlj X3NldCgmY3R4LT5zaG1fYnVmX3BhZ2VzLCAwKTsKPj4gKwo+PiDCoMKgwqDCoMKgIHNwaW5fbG9j a19pbml0KCZjdHgtPmxvY2spOwo+PiDCoMKgwqDCoMKgIHNwaW5fbG9jaygmZG9tYWluX2N0eF9s aXN0X2xvY2spOwo+PiBAQCAtMzM5LDEyICszNTgsNzYgQEAgc3RhdGljIHZvaWQgZnJlZV9zaG1f cnBjKHN0cnVjdCBkb21haW5fY3R4ICpjdHgsIAo+PiB1aW50NjRfdCBjb29raWUpCj4+IMKgwqDC oMKgwqAgeGZyZWUoc2htX3JwYyk7Cj4+IMKgIH0KPj4gK3N0YXRpYyBzdHJ1Y3Qgc2htX2J1ZiAq YWxsb2NhdGVfc2htX2J1ZihzdHJ1Y3QgZG9tYWluX2N0eCAqY3R4LAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHVpbnQ2NF90IGNvb2tpZSwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQg cGFnZXNfY250KQo+IAo+IERpdHRvLgo+IAo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBzaG1fYnVm ICpzaG1fYnVmOwo+PiArCj4+ICvCoMKgwqAgd2hpbGUoMSkKPj4gK8KgwqDCoCB7Cj4+ICvCoMKg wqDCoMKgwqDCoCBpbnQgb2xkID0gYXRvbWljX3JlYWQoJmN0eC0+c2htX2J1Zl9wYWdlcyk7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBpbnQgbmV3ID0gb2xkICsgcGFnZXNfY250Owo+PiArwqDCoMKgwqDC oMKgwqAgaWYgKCBuZXcgPj0gTUFYX1RPVEFMX1NNSF9CVUZfUEcgKQo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICggbGlrZWx5KG9s ZCA9PSBhdG9taWNfY21weGNoZygmY3R4LT5zaG1fYnVmX3BhZ2VzLCBvbGQsIAo+PiBuZXcpKSAp Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiArwqDCoMKgIH0KPj4gKwo+PiAr wqDCoMKgIHNobV9idWYgPSB4emFsbG9jX2J5dGVzKHNpemVvZihzdHJ1Y3Qgc2htX2J1ZikgKwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBhZ2VzX2NudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSk7Cj4+ICvCoMKgwqAgaWYgKCAhc2ht X2J1ZiApIHsKPiAKPiBDb2Rpbmcgc3R5bGU6Cj4gCj4gaWYgKCAuLi4gKQo+IHsKPiAKPj4gK8Kg wqDCoMKgwqDCoMKgIGF0b21pY19zdWIocGFnZXNfY250LCAmY3R4LT5zaG1fYnVmX3BhZ2VzKTsK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIHNobV9idWYtPmNvb2tpZSA9IGNvb2tpZTsKPj4gK8KgwqDCoCBzaG1fYnVmLT5tYXhfcGFn ZV9jbnQgPSBwYWdlc19jbnQ7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX2xvY2soJmN0eC0+bG9jayk7 Cj4+ICvCoMKgwqAgbGlzdF9hZGRfdGFpbCgmc2htX2J1Zi0+bGlzdCwgJmN0eC0+c2htX2J1Zl9s aXN0KTsKPj4gK8KgwqDCoCBzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKPj4gKwo+PiArwqDCoMKg IHJldHVybiBzaG1fYnVmOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBmcmVlX3NobV9idWYo c3RydWN0IGRvbWFpbl9jdHggKmN0eCwgdWludDY0X3QgY29va2llKQo+PiArewo+PiArwqDCoMKg IHN0cnVjdCBzaG1fYnVmICpzaG1fYnVmOyA+ICvCoMKgwqAgYm9vbCBmb3VuZCA9IGZhbHNlOwo+ PiArCj4+ICvCoMKgwqAgc3Bpbl9sb2NrKCZjdHgtPmxvY2spOwo+PiArwqDCoMKgIGxpc3RfZm9y X2VhY2hfZW50cnkoIHNobV9idWYsICZjdHgtPnNobV9idWZfbGlzdCwgbGlzdCApCj4+ICvCoMKg wqAgewo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCBzaG1fYnVmLT5jb29raWUgPT0gY29va2llICkK PiAKPiBXaGF0IGRvZXMgZ3VhcmFudGVlIHlvdSB0aGUgY29va2llIHdpbGwgYmUgdW5pcT8KPiAK Pj4gK8KgwqDCoMKgwqDCoMKgIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm91bmQgPSB0 cnVlOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsaXN0X2RlbCgmc2htX2J1Zi0+bGlzdCk7 Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+ PiArwqDCoMKgIH0KPj4gK8KgwqDCoCBzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKPiAKPiAKPiBB dCB0aGlzIHBvaW50IHlvdSBoYXZlIGEgc2htX2J1ZiBpbiBoYW5kIHRvIGZyZWUuIEJ1dCB3aGF0 IGRvZXMgCj4gZ3VhcmFudGVlIHlvdSBuby1vbmUgd2lsbCB1c2UgaXQ/Cj4gCj4+ICsKPj4gK8Kg wqDCoCBpZiAoICFmb3VuZCApIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gK8KgwqDC oCB9Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKCBpbnQgaSA9IDA7IGkgPCBzaG1fYnVmLT5wYWdlX2Nu dDsgaSsrICkKPiAKPiBQbGVhc2UgZGVmaW5lIGludCBpIGJlZm9yZSBoYW5kLgo+IAo+PiArwqDC oMKgwqDCoMKgwqAgaWYgKCBzaG1fYnVmLT5wYWdlc1tpXSApCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHB1dF9wYWdlKHNobV9idWYtPnBhZ2VzW2ldKTsKPj4gKwo+PiArwqDCoMKgIGF0b21p Y19zdWIoc2htX2J1Zi0+bWF4X3BhZ2VfY250LCAmY3R4LT5zaG1fYnVmX3BhZ2VzKTsKPj4gKwo+ PiArwqDCoMKgIHhmcmVlKHNobV9idWYpOwo+PiArfQo+PiArCj4+IMKgIHN0YXRpYyB2b2lkIG9w dGVlX2RvbWFpbl9kZXN0cm95KHN0cnVjdCBkb21haW4gKmQpCj4+IMKgIHsKPj4gwqDCoMKgwqDC oCBzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXNwOwo+PiDCoMKgwqDCoMKgIHN0cnVjdCBkb21haW5f Y3R4ICpjdHg7Cj4+IMKgwqDCoMKgwqAgc3RydWN0IHN0ZF9jYWxsX2N0eCAqY2FsbCwgKmNhbGxf dG1wOwo+PiDCoMKgwqDCoMKgIHN0cnVjdCBzaG1fcnBjICpzaG1fcnBjLCAqc2htX3JwY190bXA7 Cj4+ICvCoMKgwqAgc3RydWN0IHNobV9idWYgKnNobV9idWYsICpzaG1fYnVmX3RtcDsKPj4gwqDC oMKgwqDCoCBib29sIGZvdW5kID0gZmFsc2U7Cj4+IMKgwqDCoMKgwqAgLyogQXQgdGhpcyB0aW1l IGFsbCBkb21haW4gVkNQVXMgc2hvdWxkIGJlIHN0b3BwZWQgKi8KPj4gQEAgLTM3NywxMiArNDYw LDE2MyBAQCBzdGF0aWMgdm9pZCBvcHRlZV9kb21haW5fZGVzdHJveShzdHJ1Y3QgZG9tYWluICpk KQo+PiDCoMKgwqDCoMKgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSggc2htX3JwYywgc2htX3Jw Y190bXAsIAo+PiAmY3R4LT5zaG1fcnBjX2xpc3QsIGxpc3QgKQo+PiDCoMKgwqDCoMKgwqDCoMKg wqAgZnJlZV9zaG1fcnBjKGN0eCwgc2htX3JwYy0+Y29va2llKTsKPj4gK8KgwqDCoCBsaXN0X2Zv cl9lYWNoX2VudHJ5X3NhZmUoIHNobV9idWYsIHNobV9idWZfdG1wLCAKPj4gJmN0eC0+c2htX2J1 Zl9saXN0LCBsaXN0ICkKPj4gK8KgwqDCoMKgwqDCoMKgIGZyZWVfc2htX2J1ZihjdHgsIHNobV9i dWYtPmNvb2tpZSk7Cj4+ICsKPj4gwqDCoMKgwqDCoCBBU1NFUlQoIWF0b21pY19yZWFkKCZjdHgt PmNhbGxfY3R4X2NvdW50KSk7Cj4+IMKgwqDCoMKgwqAgQVNTRVJUKCFhdG9taWNfcmVhZCgmY3R4 LT5zaG1fcnBjX2NvdW50KSk7Cj4+ICvCoMKgwqAgQVNTRVJUKCFhdG9taWNfcmVhZCgmY3R4LT5z aG1fYnVmX3BhZ2VzKSk7Cj4+IMKgwqDCoMKgwqAgeGZyZWUoY3R4KTsKPj4gwqAgfQo+PiArI2Rl ZmluZSBQQUdFTElTVF9FTlRSSUVTX1BFUl9QQUdFwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgXAo+PiArwqDCoMKgICgoT1BURUVfTVNHX05PTkNPTlRJR19QQUdF X1NJWkUgLyBzaXplb2YodTY0KSkgLSAxKQo+PiArCj4+ICtzdGF0aWMgc2l6ZV90IGdldF9wYWdl c19saXN0X3NpemUoc2l6ZV90IG51bV9lbnRyaWVzKQo+PiArewo+PiArwqDCoMKgIGludCBwYWdl cyA9IERJVl9ST1VORF9VUChudW1fZW50cmllcywgUEFHRUxJU1RfRU5UUklFU19QRVJfUEFHRSk7 Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gcGFnZXMgKiBPUFRFRV9NU0dfTk9OQ09OVElHX1BBR0Vf U0laRTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGJvb2wgdHJhbnNsYXRlX25vbmNvbnRpZyhzdHJ1 Y3QgZG9tYWluX2N0eCAqY3R4LAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHN0ZF9jYWxsX2N0eCAqY2FsbCwK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHN0cnVjdCBvcHRlZV9tc2dfcGFyYW0gKnBhcmFtLAo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IGlk eCkKPiAKPiBNb3N0IGxpa2VseSB0aGlzIHNob3VsZCBiZSB1bnNpZ25lZC4KPiAKPj4gK3sKPj4g K8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBSZWZlciB0byBPUFRFRV9NU0dfQVRUUl9OT05DT05U SUcgZGVzY3JpcHRpb24gaW4gb3B0ZWVfbXNnLmggCj4+IGZvciBkZXRhaWxzLgo+PiArwqDCoMKg wqAgKi8KPj4gK8KgwqDCoCB1aW50NjRfdCBzaXplOwo+PiArwqDCoMKgIGludCBwYWdlX29mZnNl dDsKPj4gK8KgwqDCoCBpbnQgbnVtX3BhZ2VzOwo+PiArwqDCoMKgIGludCBvcmRlcjsKPj4gK8Kg wqDCoCBpbnQgZW50cmllc19vbl9wYWdlID0gMDsKPj4gK8KgwqDCoCBwYWRkcl90IGdhZGRyOwo+ PiArwqDCoMKgIG1mbl90IGd1ZXN0X21mbjsKPiAKPiBJIGRvbid0IGxpa2UgdGhlIHRlcm1pbm9s b2d5IGd1ZXN0X21mbi4gVGhpcyBpcyBtaXNsZWFkaW5nIGJlY2F1c2Ugb2YgCj4gdGhlIHBhc3Qg dXNhZ2UgaW4gWGVuLiBJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgeW91IGNhbGwgdGhpcyBqdXN0IG1m bi4KT2theSwgd2lsbCBkby4KCj4+ICvCoMKgwqAgc3RydWN0IHsKPj4gK8KgwqDCoMKgwqDCoMKg IHVpbnQ2NF90IHBhZ2VzX2xpc3RbUEFHRUxJU1RfRU5UUklFU19QRVJfUEFHRV07Cj4+ICvCoMKg wqDCoMKgwqDCoCB1aW50NjRfdCBuZXh0X3BhZ2VfZGF0YTsKPj4gK8KgwqDCoCB9ICpwYWdlc19k YXRhX2d1ZXN0LCAqcGFnZXNfZGF0YV94ZW4sICpwYWdlc19kYXRhX3hlbl9zdGFydDsKPj4gK8Kg wqDCoCBzdHJ1Y3Qgc2htX2J1ZiAqc2htX2J1ZjsKPj4gKwo+PiArwqDCoMKgIHBhZ2Vfb2Zmc2V0 ID0gcGFyYW0tPnUudG1lbS5idWZfcHRyICYgCj4+IChPUFRFRV9NU0dfTk9OQ09OVElHX1BBR0Vf U0laRSAtIDEpOwo+PiArCj4+ICvCoMKgwqAgc2l6ZSA9IFJPVU5EVVAocGFyYW0tPnUudG1lbS5z aXplICsgcGFnZV9vZmZzZXQsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgT1BURUVfTVNHX05PTkNPTlRJR19QQUdFX1NJWkUpOwo+PiArCj4+ICvCoMKgwqAgbnVtX3Bh Z2VzID0gRElWX1JPVU5EX1VQKHNpemUsIE9QVEVFX01TR19OT05DT05USUdfUEFHRV9TSVpFKTsK Pj4gKwo+PiArwqDCoMKgIG9yZGVyID0gZ2V0X29yZGVyX2Zyb21fYnl0ZXMoZ2V0X3BhZ2VzX2xp c3Rfc2l6ZShudW1fcGFnZXMpKTsKPj4gKwo+PiArwqDCoMKgIHBhZ2VzX2RhdGFfeGVuX3N0YXJ0 ID0gYWxsb2NfeGVuaGVhcF9wYWdlcyhvcmRlciwgMCk7Cj4gCj4gVGhpcyBjb3VsZCBiZSByZXBs YWNlZCBieSBhIF94bWFsbG9jIGFuZCB3b3VsZCBhdm9pZCB0byBhbGxvY2F0ZSBtb3JlIAo+IG1l bW9yeSB0aGFuIG5lY2Vzc2FyeSB3aGVuIHRoZSBvcmRlciBpcyBnZXR0aW5nIGJpZ2dlci4KVGhh bmtzLiBXb3VsZCBpdCBhbGxvY2F0ZSBwYWdlLWFsaWduZWQgYnVmZmVyPyAgVGhpcyBpcyBjcnVj aWFsIGluIHRoaXMgCmNhc2UuIEkgY2FuJ3QgZmluZCBhbnkgZG9jdW1lbnRhdGlvbiBvbiBpdCBz byBJIGRvbid0IGtub3cgd2hpY2ggCmFsaWdubWVudCBpdCBndWFyYW50ZWVzLgoKPiAKPj4gK8Kg wqDCoCBpZiAoICFwYWdlc19kYXRhX3hlbl9zdGFydCApCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gZmFsc2U7Cj4+ICsKPj4gK8KgwqDCoCBzaG1fYnVmID0gYWxsb2NhdGVfc2htX2J1ZihjdHgs IHBhcmFtLT51LnRtZW0uc2htX3JlZiwgbnVtX3BhZ2VzKTsKPiAKPiBJbiBhbG9jYXRlX3NobV9i dWYgeW91IGFyZSBub3cgZ2xvYmFsbHkgbGltaXRpbmcgdGhlIG51bWJlciBvZiBwYWdlcyAoIAo+ ICgxNjM4NCkgdG8gcGluLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IGxpbWl0IHBlciBjYWxsLgo+ IAo+IFdpdGggdGhlIGN1cnJlbnQgbGltaXQsIHlvdSB3b3VsZCBjb3VsZCBjYWxsIHVwIHRvIDE2 Mzg0IHRpbWVzIAo+IGxvb2t1cF9hbmRfcGluX2d1ZXN0X3JhbV9hZGRyKC4uLikuIE9uIEFybSwg Zm9yIHAybSByZWxhdGVkIG9wZXJhdGlvbiwgCj4gd2UgbGltaXQgdG8gNTEyIGl0ZXJhdGlvbnMg aW4gb25lIGdvIGJlZm9yZSBjaGVja2luZyB0aGUgcHJlZW1wdGlvbi4KPiBTbyBJIHRoaW5rIDE2 Mzg0IHRpbWVzIGlzIGZhciB0b28gbXVjaC4KU28sIGluIG90aGVyIHdvcmRzLCBJIGNhbiB0cmFu c2xhdGUgb25seSAyTUIgYnVmZmVyIChpZiA0MDk2S0IgcGFnZXMgYXJlIAp1c2VkKSwgaXMgaXQg cmlnaHQ/CkkgdGhpbmssIGl0IHdpbGwgYmUgb2theSB0byBpbXBsZW1lbnQgc3VjaCBsaW1pdGF0 aW9uIGZvciB0aGlzIGluaXRpYWwKdmVyc2lvbiBvZiBtZWRpYXRvci4gSW4gdGhlIGZ1dHVyZSwg aXQgd291bGQgYmUgcG9zc2libGUgdG8gZG8gUlBDIApyZXR1cm4gZnJvbSBYRU4gKGFzIE9QLVRF RSBkb2VzKSB0byBmaW5pc2ggdGhpcyByZXF1ZXN0IGxhdGVyLgoKPiAKPj4gK8KgwqDCoCBpZiAo ICFzaG1fYnVmICkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX2ZyZWU7Cj4+ICsKPj4gK8Kg wqDCoCBnYWRkciA9IHBhcmFtLT51LnRtZW0uYnVmX3B0ciAmIH4oT1BURUVfTVNHX05PTkNPTlRJ R19QQUdFX1NJWkUgLSAKPj4gMSk7Cj4+ICvCoMKgwqAgZ3Vlc3RfbWZuID0gbG9va3VwX2FuZF9w aW5fZ3Vlc3RfcmFtX2FkZHIoZ2FkZHIsIE5VTEwpOwo+PiArwqDCoMKgIGlmICggbWZuX2VxKGd1 ZXN0X21mbiwgSU5WQUxJRF9NRk4pICkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gZXJyX2ZyZWU7 Cj4+ICsKPj4gK8KgwqDCoCBwYWdlc19kYXRhX2d1ZXN0ID0gbWFwX2RvbWFpbl9wYWdlKGd1ZXN0 X21mbik7Cj4+ICvCoMKgwqAgaWYgKCAhcGFnZXNfZGF0YV9ndWVzdCApCj4+ICvCoMKgwqDCoMKg wqDCoCBnb3RvIGVycl9mcmVlOwo+PiArCj4+ICvCoMKgwqAgcGFnZXNfZGF0YV94ZW4gPSBwYWdl c19kYXRhX3hlbl9zdGFydDsKPj4gK8KgwqDCoCB3aGlsZSAoIG51bV9wYWdlcyApIHsKPj4gK8Kg wqDCoMKgwqDCoMKgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7Cj4+ICvCoMKgwqDCoMKgwqDCoCBt Zm5fdCBlbnRyeV9tZm4gPSBsb29rdXBfYW5kX3Bpbl9ndWVzdF9yYW1fYWRkcigKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcGFnZXNfZGF0YV9ndWVzdC0+cGFnZXNfbGlzdFtlbnRyaWVzX29u X3BhZ2VdLCAmcGFnZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICggbWZuX2VxKGVudHJ5 X21mbiwgSU5WQUxJRF9NRk4pICkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJf dW5tYXA7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHNobV9idWYtPnBhZ2VzW3NobV9idWYtPnBh Z2VfY250KytdID0gcGFnZTsKPj4gK8KgwqDCoMKgwqDCoMKgIHBhZ2VzX2RhdGFfeGVuLT5wYWdl c19saXN0W2VudHJpZXNfb25fcGFnZV0gPSAKPj4gbWZuX3RvX21hZGRyKGVudHJ5X21mbik7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBlbnRyaWVzX29uX3BhZ2UrKzsKPj4gKwo+PiArwqDCoMKgwqDCoMKg wqAgaWYgKCBlbnRyaWVzX29uX3BhZ2UgPT0gUEFHRUxJU1RfRU5UUklFU19QRVJfUEFHRSApIHsK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGFnZXNfZGF0YV94ZW4tPm5leHRfcGFnZV9kYXRh ID0gCj4+IHZpcnRfdG9fbWFkZHIocGFnZXNfZGF0YV94ZW4gKyAxKTsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgcGFnZXNfZGF0YV94ZW4rKzsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Z2FkZHIgPSBwYWdlc19kYXRhX2d1ZXN0LT5uZXh0X3BhZ2VfZGF0YTsKPiAKPiBuZXh0X3BhZ2Vf ZGF0YSBpcyBub3QgYSBndWVzdCBhZGRyZXNzIGJ1dCBhIG1hY2hpbmUgYWRkcmVzcy4gRm9yIAo+ IGFueXRoaW5nIHJlbGF0ZWQgdG8gYWRkcmVzcywgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBuYW1l ZCBhY2NvcmRpbmdseSB0byAKPiBhdm9pZCBjb25mdXNpb24uCldoeT8gSW4gdGhpcyBjYXNlIGl0 IGlzIElQQSB0aGF0IGNvbWVzIGZyb20gdGhlIGd1ZXN0LgoKPj4gKwo+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCB1bm1hcF9kb21haW5fcGFnZShwYWdlc19kYXRhX2d1ZXN0KTsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdW5waW5fZ3Vlc3RfcmFtX2FkZHIoZ3Vlc3RfbWZuKTsKPj4gKwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBndWVzdF9tZm4gPSBsb29rdXBfYW5kX3Bpbl9ndWVz dF9yYW1fYWRkcihnYWRkciwgTlVMTCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICgg bWZuX2VxKGd1ZXN0X21mbiwgSU5WQUxJRF9NRk4pICkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBnb3RvIGVycl9mcmVlOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHBhZ2VzX2RhdGFfZ3Vlc3QgPSBtYXBfZG9tYWluX3BhZ2UoZ3Vlc3RfbWZuKTsKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKCAhcGFnZXNfZGF0YV9ndWVzdCApCj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfZnJlZTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLyogUm9sbCBvdmVyIHRvIHRoZSBuZXh0IHBhZ2UgKi8KPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZW50cmllc19vbl9wYWdlID0gMDsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8Kg wqDCoMKgwqDCoMKgIG51bV9wYWdlcy0tOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHBh cmFtLT51LnRtZW0uYnVmX3B0ciA9IHZpcnRfdG9fbWFkZHIocGFnZXNfZGF0YV94ZW5fc3RhcnQp IHwgCj4+IHBhZ2Vfb2Zmc2V0Owo+PiArCj4+ICvCoMKgwqAgY2FsbC0+bm9uX2NvbnRpZ1tpZHhd ID0gcGFnZXNfZGF0YV94ZW5fc3RhcnQ7Cj4+ICvCoMKgwqAgY2FsbC0+bm9uX2NvbnRpZ19vcmRl cltpZHhdID0gb3JkZXI7Cj4gCj4gSWYgeW91IHVzZSBfeG1hbGxvYywgdGhlbiB5b3UgZG9uJ3Qg bmVlZCB0byBzdG9yZSB0aGUgb3JkZXIuIEJ1dCwgd2hvIGlzIAo+IGdvaW5nIHRvIGZyZWUgbm9u X2NvbnRpZz8KVGhhbmsgeW91IGZvciBwb2ludGluZyBvdXQuIEl0IHNob3VsZCBiZSBkb25lIGlu IGZyZWVfc3RkX2NhbGxfY3R4KCkgYnV0IApzZWVtcwpJIG1pc3NlZCB0aGlzIHBhcnQgb2YgdGhl IGNvZGUgd2hlbiBzcGxpdCB0aGUgYmlnIHBhdGNoIGludG8gc21hbGxlciBvbmVzLgoKCj4+ICsK Pj4gK8KgwqDCoCB1bm1hcF9kb21haW5fcGFnZShwYWdlc19kYXRhX2d1ZXN0KTsKPj4gK8KgwqDC oCB1bnBpbl9ndWVzdF9yYW1fYWRkcihndWVzdF9tZm4pOwo+PiArwqDCoMKgIHJldHVybiB0cnVl Owo+PiArCj4+ICtlcnJfdW5tYXA6Cj4+ICvCoMKgwqAgdW5tYXBfZG9tYWluX3BhZ2UocGFnZXNf ZGF0YV9ndWVzdCk7Cj4+ICvCoMKgwqAgdW5waW5fZ3Vlc3RfcmFtX2FkZHIoZ3Vlc3RfbWZuKTsK Pj4gK8KgwqDCoCBmcmVlX3NobV9idWYoY3R4LCBzaG1fYnVmLT5jb29raWUpOwo+PiArCj4+ICtl cnJfZnJlZToKPj4gK8KgwqDCoCBmcmVlX3hlbmhlYXBfcGFnZXMocGFnZXNfZGF0YV94ZW5fc3Rh cnQsIG9yZGVyKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIGJvb2wgdHJhbnNsYXRlX3BhcmFtcyhzdHJ1Y3QgZG9tYWluX2N0eCAqY3R4LAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg c3RydWN0IHN0ZF9jYWxsX2N0eCAqY2FsbCkKPj4gK3sKPj4gK8KgwqDCoCB1bnNpZ25lZCBpbnQg aTsKPj4gK8KgwqDCoCB1aW50MzJfdCBhdHRyOwo+PiArCj4+ICvCoMKgwqAgZm9yICggaSA9IDA7 IGkgPCBjYWxsLT54ZW5fYXJnLT5udW1fcGFyYW1zOyBpKysgKSB7Cj4gCj4gUGxlYXNlIHBheSBh dHRlbnRpb24gdG8gWGVuIGNvZGluZyBzdHlsZS4gSSBoYXZlbid0IHBvaW50ZWQgb3V0IAo+IGV2 ZXJ5d2hlcmUsIGJ1dCBJIHdvdWxkIGFsbCBvZiB0aGVtIHRvIGJlIGZpeGVkIGluIHRoZSBuZXh0 IHZlcnNpb24uClllcywgSSdtIHNvcnJ5IGZvciB0aGF0LiBJIHNpbXVsdGFuZW91c2x5IHdvcmsg IHdpdGggZGlmZmVyZW50IHByb2plY3RzCmFuZCBzb21ldGltZXMgaXQgaXMgaGFyZCB0byB0cmFj ayBjb2Rpbmcgc3R5bGUuIEknbGwgZml4IGFsbCBzdWNoCnByb2JsZW1zLgoKCj4+ICvCoMKgwqDC oMKgwqDCoCBhdHRyID0gY2FsbC0+eGVuX2FyZy0+cGFyYW1zW2ldLmF0dHI7Cj4+ICsKPj4gK8Kg wqDCoMKgwqDCoMKgIHN3aXRjaCAoIGF0dHIgJiBPUFRFRV9NU0dfQVRUUl9UWVBFX01BU0sgKSB7 Cj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIE9QVEVFX01TR19BVFRSX1RZUEVfVE1FTV9JTlBVVDoK Pj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJfVFlQRV9UTUVNX09VVFBVVDoK Pj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJfVFlQRV9UTUVNX0lOT1VUOgo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIGF0dHIgJiBPUFRFRV9NU0dfQVRUUl9OT05D T05USUcgKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKCAhdHJhbnNs YXRlX25vbmNvbnRpZyhjdHgsIGNhbGwsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNh bGwtPnhlbl9hcmctPnBhcmFtcyArIGksIAo+PiBpKSApCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZSB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZ3ByaW50ayhYRU5MT0dfV0FSTklORywgIkd1ZXN0IHRyaWVzIHRv IHVzZSBvbGQgdG1lbSAKPj4gYXJnXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByZXR1cm4gZmFsc2U7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIE9QVEVFX01T R19BVFRSX1RZUEVfTk9ORToKPj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJf VFlQRV9WQUxVRV9JTlBVVDoKPj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJf VFlQRV9WQUxVRV9PVVRQVVQ6Cj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIE9QVEVFX01TR19BVFRS X1RZUEVfVkFMVUVfSU5PVVQ6Cj4+ICvCoMKgwqDCoMKgwqDCoCBjYXNlIE9QVEVFX01TR19BVFRS X1RZUEVfUk1FTV9JTlBVVDoKPj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJf VFlQRV9STUVNX09VVFBVVDoKPj4gK8KgwqDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNHX0FUVFJf VFlQRV9STUVNX0lOT1VUOgo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4g K8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICvCoMKgwqAgcmV0dXJuIHRydWU7Cj4+ ICt9Cj4+ICsKPj4gwqAgLyoKPj4gwqDCoCAqIENvcHkgY29tbWFuZCBidWZmZXIgaW50byB4ZW4g bWVtb3J5IHRvOgo+PiDCoMKgICogMSkgSGlkZSB0cmFuc2xhdGVkIGFkZHJlc3NlcyBmcm9tIGd1 ZXN0Cj4+IEBAIC00ODgsNiArNzIyLDE1IEBAIHN0YXRpYyBib29sIGV4ZWN1dGVfc3RkX2NhbGwo c3RydWN0IGRvbWFpbl9jdHggKmN0eCwKPj4gwqDCoMKgwqDCoCBjb3B5X3N0ZF9yZXF1ZXN0X2Jh Y2soY3R4LCByZWdzLCBjYWxsKTsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBJZiBndWVz dCBzdWNjZXNzZnVsbHkgdW5yZWdpc3RlcmVkIG93biBzaGFyZWQgbWVtb3J5LAo+PiArwqDCoMKg wqAgKiB0aGVuIHdlIGNhbiB1bnBpbiBpdCdzIHBhZ2VzCj4+ICvCoMKgwqDCoCAqLwo+PiArwqDC oMKgIGlmICggY2FsbC0+eGVuX2FyZy0+Y21kID09IE9QVEVFX01TR19DTURfVU5SRUdJU1RFUl9T SE0gJiYKPj4gK8KgwqDCoMKgwqDCoMKgwqAgY2FsbC0+eGVuX2FyZy0+cmV0ID09IDAgKSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBmcmVlX3NobV9idWYoY3R4LCBjYWxsLT54ZW5fYXJnLT5wYXJhbXNb MF0udS5ybWVtLnNobV9yZWYpOwo+PiArwqDCoMKgIH0KPj4gKwo+PiDCoMKgwqDCoMKgIGZyZWVf c3RkX2NhbGxfY3R4KGN0eCwgY2FsbCk7Cj4+IMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4+IEBA IC01MjIsNyArNzY1LDcgQEAgc3RhdGljIGJvb2wgaGFuZGxlX3N0ZF9jYWxsKHN0cnVjdCBkb21h aW5fY3R4IAo+PiAqY3R4LCBzdHJ1Y3QgY3B1X3VzZXJfcmVncyAqcmVncykKPj4gwqDCoMKgwqDC oCBjYXNlIE9QVEVFX01TR19DTURfQ0FOQ0VMOgo+PiDCoMKgwqDCoMKgIGNhc2UgT1BURUVfTVNH X0NNRF9SRUdJU1RFUl9TSE06Cj4+IMKgwqDCoMKgwqAgY2FzZSBPUFRFRV9NU0dfQ01EX1VOUkVH SVNURVJfU0hNOgo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gdHJ1ZTsKPj4gK8KgwqDCoMKgwqDC oMKgIHJldCA9IHRyYW5zbGF0ZV9wYXJhbXMoY3R4LCBjYWxsKTsKPj4gwqDCoMKgwqDCoMKgwqDC oMKgIGJyZWFrOwo+PiDCoMKgwqDCoMKgIGRlZmF1bHQ6Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBy ZXQgPSBmYWxzZTsKPj4KPiAKPiBDaGVlcnMsCj4gCgotLSAKVm9sb2R5bXlyIEJhYmNodWsKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBt YWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMu eGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=