From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Nagarjuna Kristam Message-Id: <03f20cd2-c3b6-1a05-52bf-2420dea9a41d@nvidia.com> Date: Thu, 14 Feb 2019 20:22:34 +0530 To: Thierry Reding Cc: balbi@kernel.org, gregkh@linuxfoundation.org, jonathanh@nvidia.com, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org List-ID: T24gMDQtMDItMjAxOSAxOToyNiwgVGhpZXJyeSBSZWRpbmcgd3JvdGU6Cj4gT24gVGh1LCBKYW4g MDMsIDIwMTkgYXQgMDM6MzQ6NThQTSArMDUzMCwgTmFnYXJqdW5hIEtyaXN0YW0gd3JvdGU6Cj4+ IFRoaXMgcGF0Y2ggYWRkcyBVREMgZHJpdmVyIGZvciB0ZWdyYSBYVVNCIDMuMCBkZXZpY2UgbW9k ZSBjb250cm9sbGVyLgo+PiBYVVNCIGRldmljZSBtb2RlIGNvbnRyb2xsZXIgc3VwcG9ydCBTUywg SFMgYW5kIEZTIG1vZGVzCj4+Cj4+IEJhc2VkIG9uIHdvcmsgYnk6Cj4+ICAgTWFyayBLdW8gPG1r dW9AbnZpZGlhLmNvbT4KPj4gICBBbmRyZXcgQnJlc3RpY2tlciA8YWJyZXN0aWNAY2hyb21pdW0u b3JnPgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBOYWdhcmp1bmEgS3Jpc3RhbSA8bmtyaXN0YW1AbnZp ZGlhLmNvbT4KPj4gLS0tCj4+ICBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgICAgICB8 ICAgMTEgKwo+PiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZSAgICAgfCAgICAxICsK Pj4gIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvdGVncmFfeHVkYy5jIHwgMzgyMSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwo+PiAgMyBmaWxlcyBjaGFuZ2VkLCAzODMzIGluc2Vy dGlvbnMoKykKPj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3Rl Z3JhX3h1ZGMuYwo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29u ZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnCj4+IGluZGV4IDBhMTZjYmQuLjMx NjY1ZTcgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwo+PiAr KysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKPj4gQEAgLTQzOSw2ICs0MzksMTcg QEAgY29uZmlnIFVTQl9HQURHRVRfWElMSU5YCj4+ICAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9k dWxlIGNhbGxlZCAidWRjLXhpbGlueCIgYW5kIGZvcmNlIGFsbAo+PiAgCSAgZ2FkZ2V0IGRyaXZl cnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCj4+ICAKPj4gK2NvbmZpZyBVU0JfVEVH UkFfWFVEQwo+PiArCXRyaXN0YXRlICJOVklESUEgU3VwZXJzcGVlZCBVU0IgMy4wIERldmljZSBD b250cm9sbGVyIgo+PiArCWRlcGVuZHMgb24gQVJDSF9URUdSQQo+PiArCWRlZmF1bHQgbgo+IAo+ ICJkZWZhdWx0IG4iIGlzIHRoZSBkZWZhdWx0LCBzbyB5b3UgY2FuIGRyb3AgdGhpcyBsaW5lLgo+ IAo+PiArCWhlbHAKPj4gKwkgRW5hYmxlcyBURUdSQSBVU0IgMy4wIGRldmljZSBtb2RlIGNvbnRy b2xsZXIgZHJpdmVyLgo+PiArCj4+ICsJIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRp Y2FsbHksIG9yICJtIiB0byBidWlsZCBhCj4+ICsJIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUg Y2FsbGVkICJ0ZWdyYV94dWRjIiBhbmQgZm9yY2UgYWxsCj4gCj4gInRlZ3JhLXh1ZGMiLCBzZWUg YmVsb3cuCj4gCgphbGwgZmlsZXMgaW4gdWRjIGZvbGRlciB1c2VzIF8gYW5kIGhlbmNlIHVzZWQg Xy4gSWYgcG9saWN5IGZvciB0ZWdyYSBvdmVycmlkZXMKZm9sZGVyIG5hbWluZyBjb252ZW50aW9u LCB3aWxsIHJlbmFtZSBhY2NvcmRpbmdseS4gUGxlYXNlIHNoYXJlIHlvdXIgdmlld3MuCgo+PiAr CSBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KPj4gKwo+PiAg c291cmNlICJkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWciCj4+ICAK Pj4gICMKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb24oc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gKwlpbnQg ZXJyOwo+PiArCj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4g KwlpZiAoeHVkYy0+ZGV2aWNlX21vZGUpIHsKPj4gKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm eHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCQlyZXR1cm47Cj4+ICsJfQo+PiArCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiAKPiBJJ20gbm90IHN1cmUgSSB1bmRl cnN0YW5kIHdoYXQgeW91J3JlIHRyeWluZyB0byBhY2hpdmUgaGVyZS4gVGhpcwo+IGxvY2tpbmcg ZG9lc24ndCBidXkgeW91IGFueXRoaW5nIGF0IGFsbC4gRmlyc3QsIHlvdSdyZSBub3QgcHJvdGVj dGluZyBhCj4gcmFjZSBjb25kaXRpb24gaGVyZSBzaW5jZSB5b3UncmUgbm90IG1vZGlmeWluZyB4 dWRjLT5kZXZpY2VfbW9kZSBpbiB0aGUKPiBjcml0aWNhbCBzZWN0aW9uLgo+IAo+IE9uY2UgeW91 IHVubG9jayBoZXJlLCB4dWRjLT5kZXZpY2VfbW9kZSBjb3VsZCBiZSBtb2RpZmllZCB3aGlsZSB5 b3UncmUKPiBleGVjdXRpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvZGUsIGV4cG9zaW5nIHlvdSB0byBh IHBvdGVudGlhbCByYWNlCj4gY29uZGl0aW9uLiBTbyBlaXRoZXIgeW91IGFscmVhZHkgaGF2ZSBw cm9wZXIgbG9ja2luZyBpbiBwbGFjZSBhbmQgY2FuCj4gZHJvcCB0aGUgbG9ja2luZyBmcm9tIGhl cmUsIG9yIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBrZWVwIHRoZSBsb2NrCj4gdW50aWwgeW91 IGFyZSBpbiBkZXZpY2UgbW9kZSBhbmQgc2V0IHh1ZGMtPmRldmljZV9tb2RlIGxhdGVyIG9uLgo+ IAoKcmVhc29uIGZvciBzcGxpdCBzcGluX2xvY2sgdXNhZ2UgaXMgdG8gYXZvaWQgY3JlYXRpbmcg ZGVhZCBsb2NrLAp3aGVyZSBwbV9ydW50aW1lX2dldF9zeW5jIGFsc28gdGFrZXMgdGhlIHNhbWUg bG9jay4KV2lsbCByZS1jaGVjayBhbmQgdXBkYXRlIHRoZSBsb2dpYyBhY2NvcmRpbmdseSwgIG1h eWJlIHVzZSBtdXRleCB0byBzeW5jcm9uaXplCmRldmljZV9tb2RlIG9uIGFuZCBvZmYgZnVuY3Rp b25hbGl0eS4KCj4+ICsKPj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4+ICsK Pj4gKwllcnIgPSBwaHlfcG93ZXJfb24oeHVkYy0+dXRtaV9waHkpOwo+PiArCWlmIChlcnIgPCAw KQo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgInV0bWkgcG93ZXIgb24gZmFpbGVkICVkXG4iLCBl cnIpOwo+PiArCWVyciA9IHBoeV9wb3dlcl9vbih4dWRjLT51c2IzX3BoeSk7Cj4+ICsJaWYgKGVy ciA8IDApCj4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXNiMyBwaHkgcG93ZXIgb24gZmFpbGVk ICVkXG4iLCBlcnIpOwo+PiArCj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZs YWdzKTsKPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJkZXZpY2UgbW9kZSBvblxuIik7Cj4gCj4g ZGV2X2RiZygpPwo+IAo+PiArCXRlZ3JhX3h1c2JfcGFkY3RsX3NldF92YnVzX292ZXJyaWRlKHh1 ZGMtPnBhZGN0bCk7Cj4gCj4gV2hhdCBleGFjdGx5IGRvZXMgdGhhdCBkbyBoZXJlPyBDb3VsZCB3 ZSBhdXRvbWF0aWNhbGx5IHJ1biB0aGlzIGFzIHBhcnQKPiBvZiBwaHlfcG93ZXJfb24oeHVkYy0+ dXRtaV9waHkpPyBQZXJoYXBzIHdlIG5lZWQgdG8gY29tYmluZSB0aGlzIHdpdGggYQo+IHBoeV9j b25maWd1cmUoKSBjYWxsIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBQSFkgaW50 byBkZXZpY2UKPiBtb2RlPyBCYXNlZCBvbiB0aGUgbW9kZSwgcGh5X3Bvd2VyX29uKCkgY291bGQg dGhlbiBzZXQgb3IgY2xlYXIgdGhlIFZCVVMKPiBvdmVycmlkZS4KPiAKPiBPciBJIHN1cHBvc2Ug cGh5X2NvbmZpZ3VyZSgpIGl0c2VsZiBjb3VsZCBzZXQgb3IgY2xlYXIgdGhlIFZCVVMKPiBvdmVy cmlkZSBpZiB0aGUgc2VxdWVuY2luZyBpcyBpbXBvcnRhbnQuCj4gCgpBcyBkaXNjdXNzZWQgb3Zl ciBvdGhlciBwYXRjaCBkaXNjdXNzaW9uLCB3ZSB3aWxsIGtlZXAgdmJ1cyBvdmVycmlkZSBmdW5j dGlvbmFsaXR5Cgo+PiArCj4+ICsJeHVkYy0+ZGV2aWNlX21vZGUgPSB0cnVlOwo+PiArCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwl0ZWdyYV9waHlfeHVz Yl91dG1pX3BhZF9wb3dlcl9vbih4dWRjLT51dG1pX3BoeSk7Cj4gCj4gVGhlIHdheSB0aGlzIGlz IHVzZWQgSSdtIHdvbmRlcmluZyBpZiB0aGlzIHNob3VsZG4ndCBiZSBwYXJ0IG9mIHRoZQo+IHh1 ZGMtPnV0bWlfcGh5IC0+cG93ZXJfb24oKSBpbXBsZW1lbnRhdGlvbi4KPiAKCldpbGwgaGFuZGxl IGFzIHBhcnQgb2YgcGh5X3Bvd2VyX29uCgo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdy YV94dWRjX2RldmljZV9tb2RlX29mZihzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4g Kwlib29sIGNvbm5lY3RlZCA9IGZhbHNlOwo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJ dTMyIHBscywgdmFsOwo+PiArCWludCBlcnI7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgm eHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCWlmICgheHVkYy0+ZGV2aWNlX21vZGUpIHsKPj4gKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCQlyZXR1cm47 Cj4+ICsJfQo+PiArCj4+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZGV2aWNlIG1vZGUgb2ZmXG4i KTsKPiAKPiBkZXZfZGJnKCkKPiAKCk1hcmtlZCBpbmZvIHRvIGdldCBydW4gdGltZSB1cGRhdGUg b24gbW9kZSBjaGFuZ2VzLgoKPj4gKwo+PiArCWNvbm5lY3RlZCA9ICEhKHh1ZGNfcmVhZGwoeHVk YywgUE9SVFNDKSAmIFBPUlRTQ19DQ1MpOwo+PiArCXJlaW5pdF9jb21wbGV0aW9uKCZ4dWRjLT5k aXNjb25uZWN0X2NvbXBsZXRlKTsKPj4gKwo+PiArCXRlZ3JhX3h1c2JfcGFkY3RsX2NsZWFyX3Zi dXNfb3ZlcnJpZGUoeHVkYy0+cGFkY3RsKTsKPj4gKwo+PiArCXBscyA9ICh4dWRjX3JlYWRsKHh1 ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BMU19TSElGVCkgJgo+PiArCQlQT1JUU0NfUExTX01BU0s7 Cj4+ICsKPj4gKwkvKiBEaXJlY3QgbGluayB0byBVMCBpZiBkaXNjb25uZWN0ZWQgaW4gUkVTVU1F IG9yIFUyLiAqLwo+PiArCWlmICh4dWRjLT5zb2MtPnBsc19xdWlyayAmJiB4dWRjLT5nYWRnZXQu c3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSICYmCj4+ICsJICAgIChwbHMgPT0gUE9SVFNDX1BMU19S RVNVTUUgfHwgcGxzID09IFBPUlRTQ19QTFNfVTIpKSB7Cj4+ICsJCXZhbCA9IHh1ZGNfcmVhZGwo eHVkYywgUE9SVFBNKTsKPj4gKwkJdmFsIHw9IFBPUlRQTV9GUldFOwo+PiArCQl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFBPUlRQTSk7Cj4+ICsKPj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQ T1JUU0MpOwo+PiArCQl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01BU0sgfAo+PiArCQkJIChQT1JU U0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwo+PiArCQl2YWwgfD0gUE9SVFNDX0xX UyB8IChQT1JUU0NfUExTX1UwIDw8IFBPUlRTQ19QTFNfU0hJRlQpOwo+PiArCQl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFBPUlRTQyk7Cj4+ICsJfQo+PiArCj4+ICsJeHVkYy0+ZGV2aWNlX21vZGUg PSBmYWxzZTsKPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7 Cj4gCj4gVGhlIGxvY2tpbmcgaXMgYWdhaW4gc29tZXdoYXQgd2VpcmQgaGVyZS4gVGVjaG5pY2Fs bHkgc29tZW9uZSBlbHNlIGNvdWxkCj4ganVtcCByaWdodCBpbiBhdCB0aGlzIHBvaW50IGFuZCBy ZWNvbmZpZ3VyZSB0byBkZXZpY2UgbW9kZSBhZ2Fpbi4gV291bGQKPiB0aGF0IG5vdCBpbnRlcmZl cmUgd2l0aCB0aGUgb3BlcmF0aW9ucyBiZWxvdz8KPiAKCkFzIG1lbnRpb25lZCBhYm92ZSwgd2ls bCBjaGVjayBwb3NzaWJpbGl0eSB0byBwcm90ZWN0IHRoaXMgdXNpbmcgYSBtdXRleCBpbnN0ZWFk LgoKPj4gKwl0ZWdyYV9waHlfeHVzYl91dG1pX3BhZF9wb3dlcl9kb3duKHh1ZGMtPnV0bWlfcGh5 KTsKPiAKPiBBZ2FpbiwgaWYgc2VxdWVuY2luZyBpc24ndCBjcnVjaWFsIGhlcmUsIGNvdWxkbid0 IHRoaXMgYmUgbW92ZWQgaW50bwo+IHBoeV9wb3dlcl9vZmYoKT8KPiAKPj4gKwo+PiArCS8qIFdh aXQgZm9yIGRpc2Nvbm5lY3QgZXZlbnQuICovCj4+ICsJaWYgKGNvbm5lY3RlZCkKPj4gKwkJd2Fp dF9mb3JfY29tcGxldGlvbigmeHVkYy0+ZGlzY29ubmVjdF9jb21wbGV0ZSk7Cj4+ICsKPj4gKwkv KiBNYWtlIHN1cmUgaW50ZXJydXB0IGhhbmRsZXIgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcG93ZXJn YXRpbmcuICovCj4+ICsJc3luY2hyb25pemVfaXJxKHh1ZGMtPmlycSk7Cj4+ICsJZXJyID0gcGh5 X3Bvd2VyX29mZih4dWRjLT51dG1pX3BoeSk7Cj4+ICsJaWYgKGVyciA8IDApCj4+ICsJCWRldl9l cnIoeHVkYy0+ZGV2LCAidXRtaV9waHkgcG93ZXIgb2ZmIGZhaWxlZCAlZFxuIiwgZXJyKTsKPj4g Kwo+PiArCWVyciA9IHBoeV9wb3dlcl9vZmYoeHVkYy0+dXNiM19waHkpOwo+PiArCWlmIChlcnIg PCAwKQo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgInVzYjNfcGh5IHBvd2VyIG9mZiBmYWlsZWQg JWRcbiIsIGVycik7Cj4+ICsKPj4gKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOwo+PiArfQo+ IAo+IEFsc28sIHlvdSBzZWVtIHRvIGJlIHVzaW5nIHBoeV9wb3dlcl9vbigpIGFuZCBwaHlfcG93 ZXJfb2ZmKCkKPiBzeW1tZXRyaWNhbGx5IHdpdGggcG1fcnVudGltZV9nZXQoKSBhbmQgcG1fcnVu dGltZV9wdXQoKSwgc28gSSdtCj4gd29uZGVyaW5nIGlmIHBoeV9wb3dlcl9vbigpIGFuZCBwaHlf cG93ZXJfb2ZmKCkgY2FuJ3QgYmUgbW92ZWQgaW50byB0aGUKPiBydW50aW1lIFBNIGNhbGxiYWNr cy4KPiAKCnBoeV9wb3dlciBpcyBjb3VwbGVkIHdpdGggZGV2aWNlX21vZGUgb24vb2ZmIHNlcXVl bmNlIGFuZCBydW50aW1lX2dldCBhbmQgcHV0CmFyZSBpbnRlcm1pdHRlbnRseSBjYWxsZWQgYWxv bmcgd2l0aCBnYWRnZXQgZHJpdmVyIGNhbGxiYWNrcyBhbHNvIGFuZCBoZW5jZSB0aGV5CmFyZSBz ZXBhcmF0ZWQgb3V0Cgo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3VwZGF0ZV9kYXRh X3JvbGUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJaWYgKGV4dGNvbl9nZXRf c3RhdGUoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09OX1VTQikpCj4+ICsJCXRlZ3JhX3h1 ZGNfZGV2aWNlX21vZGVfb24oeHVkYyk7Cj4+ICsJZWxzZQo+PiArCQl0ZWdyYV94dWRjX2Rldmlj ZV9tb2RlX29mZih4dWRjKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19k YXRhX3JvbGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCj4+ICt7Cj4+ICsJc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRlZ3JhX3h1ZGMs Cj4+ICsJCQkJCSAgICAgICBkYXRhX3JvbGVfd29yayk7Cj4+ICsKPj4gKwl0ZWdyYV94dWRjX3Vw ZGF0ZV9kYXRhX3JvbGUoeHVkYyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVk Y19kYXRhX3JvbGVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKPj4gKwkJCQkJ IHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnVudXNlZCkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYyA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHRlZ3JhX3h1ZGMsCj4+ICsJ CQkJCSAgICAgICBkYXRhX3JvbGVfbmIpOwo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsK Pj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCWlmICgheHVk Yy0+c3VzcGVuZGVkKQo+PiArCQlzY2hlZHVsZV93b3JrKCZ4dWRjLT5kYXRhX3JvbGVfd29yayk7 Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCj4+ ICsJcmV0dXJuIE5PVElGWV9ET05FOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94 dWRjX3BsY19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4gK3sKPj4gKwlz dHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKPj4gKwlz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRlZ3Jh X3h1ZGMsCj4+ICsJCQkJCSAgICAgICBwbGNfcmVzZXRfd29yayk7Cj4+ICsJdW5zaWduZWQgbG9u ZyBmbGFnczsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7 Cj4+ICsJaWYgKHh1ZGMtPndhaXRfY3NjKSB7Cj4+ICsJCXUzMiBwbHMgPSAoeHVkY19yZWFkbCh4 dWRjLCBQT1JUU0MpID4+IFBPUlRTQ19QTFNfU0hJRlQpICYKPj4gKwkJCSAgUE9SVFNDX1BMU19N QVNLOwo+PiArCQlpZiAocGxzID09IFBPUlRTQ19QTFNfSU5BQ1RJVkUpIHsKPj4gKwkJCWRldl9p bmZvKHh1ZGMtPmRldiwgIlBMUyA9IEluYWN0aXZlLiBUb2dnbGUgVkJVU1xuIik7Cj4+ICsJCQl0 ZWdyYV94dXNiX3BhZGN0bF9jbGVhcl92YnVzX292ZXJyaWRlKHh1ZGMtPnBhZGN0bCk7Cj4+ICsJ CQl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVycmlkZSh4dWRjLT5wYWRjdGwpOwo+IAo+ IElzbid0IHRoaXMgdGhlIHNhbWUgYXMgdGhlIHJlc2V0IHF1aXJrPwo+IApCb3RoIHBsYyByZXNl dCBhbmQgcG9ydCByZXNldCBxdWlyayBhcmUgdHJpZ2dlcmVkIG9uIGRpZmZlcmVudCBwb3J0IHN0 YXR1cy4KRXZlbiB0aG91Z2ggdGhleSBuZWVkIHRvIHRvZ2dsZSB2YnVzLCBjb25kaXRpb25zIG9u IHdoaWNoIHRoZXkgZG8gaGF2ZSBkaWZmZXJlbnQKY29uZGl0aW9ucyBhbmQgaGVuY2Ugc2VwYXJh dGVkIG91dAoKPj4gKwkJCXh1ZGMtPndhaXRfY3NjID0gZmFsc2U7Cj4+ICsJCX0KPj4gKwl9Cj4+ ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXRfd2FyX3dvcmsoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQo+PiArewo+PiArCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0g dG9fZGVsYXllZF93b3JrKHdvcmspOwo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0KPj4g KwkJY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgdGVncmFfeHVkYywgcG9ydF9yZXNldF93YXJf d29yayk7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gKwl1MzIgcGxzOwo+PiArCWludCBy ZXQ7Cj4+ICsKPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJwb3J0X3Jlc2V0X3dhcl93b3JrXG4i KTsKPiAKPiBkZXZfZGJnKCksIHRob3VnaCB5b3UgbWF5IGFsc28gd2FudCB0byByZXdvcmQgdGhp cyB0byBiZSBtb3JlIHVzZWZ1bC4KPiAKV2lsbCB1ZHBhdGUKPj4gKwlzcGluX2xvY2tfaXJxc2F2 ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCWlmICh4dWRjLT5kYXRhX3JvbGVfZXh0Y29uICYm Cj4+ICsJCWV4dGNvbl9nZXRfc3RhdGUoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09OX1VT QikgJiYKPj4gKwkJeHVkYy0+d2FpdF9mb3Jfc2VjX3ByYykgewo+IAo+IFRoaXMgY291bGQgdXNl IGEgbG9jYWwgdmFyaWFibGUgdG8gbWFrZSB0aGUgY29uZGl0aW9uYWwgZWFzaWVyIHRvIHJlYWQu Cj4gCldpbGwgdWRwYXRlCj4+ICsJCXBscyA9ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4g UE9SVFNDX1BMU19TSElGVCkgJgo+PiArCQkJUE9SVFNDX1BMU19NQVNLOwo+PiArCQlkZXZfaW5m byh4dWRjLT5kZXYsICJwbHMgPSAleFxuIiwgcGxzKTsKPiAKPiBkZXZfZGJnKCkKPiAKV2lsbCB1 ZHBhdGUKPj4gKwo+PiArCQlpZiAocGxzID09IFBPUlRTQ19QTFNfRElTQUJMRUQpIHsKPj4gKwkJ CWRldl9pbmZvKHh1ZGMtPmRldiwgInRvZ2dsZSB2YnVzXG4iKTsKPiAKPiBkZXZfZGJnKCkKPiAK V2lsbCB1ZHBhdGUKPj4gKwkJCS8qIFBSQyBkb2Vzbid0IGNvbXBsZXRlIGluIDEwMG1zLCB0b2dn bGUgdGhlIHZidXMgKi8KPj4gKwkJCXJldCA9Cj4+ICsJCQl0ZWdyYV9waHlfeHVzYl91dG1pX3Bv cnRfcmVzZXRfcXVpcmsoeHVkYy0+dXRtaV9waHkpOwo+IAo+IFdvdWxkIHBoeV9yZXNldCgpIHdv cmsgaW4gdGhpcyBjYXNlPyBUaGF0IHdvdWxkIGhhdmUgdGhlIG5pY2UKPiBzaWRlLWVmZmVjdCBv ZiBtYWtpbmcgdGhlIGV4cHJlc3Npb24gc2hvcnQgZW5vdWdoIGZvciBpdCBhbGwgdG8gZml0IG9u Cj4gb25lIGxpbmUuCj4gCgpBcyBkaXNjdXNzZWQgZWFybGllciwgcGh5X3Jlc2V0IGFuZCBwb3J0 IHJlc2V0IG5lZWQgdG8gYmUgc2VwYXJhdGVkIG91dAoKPj4gKwkJCWlmIChyZXQgPT0gMSkKPj4g KwkJCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMDsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiAr CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gK30KPj4gKwo+ PiArc3RhdGljIGRtYV9hZGRyX3QgdHJiX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgdGVncmFfeHVkY19l cCAqZXAsCj4+ICsJCQkJICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCj4+ICt7Cj4+ICsJ dW5zaWduZWQgaW50IGluZGV4Owo+PiArCWRtYV9hZGRyX3QgcGh5czsKPj4gKwo+PiArCWluZGV4 ID0gdHJiIC0gZXAtPnRyYW5zZmVyX3Jpbmc7Cj4+ICsJaWYgKFdBUk5fT04oaW5kZXggPj0gWFVE Q19UUkFOU0ZFUl9SSU5HX1NJWkUpKQo+PiArCQlyZXR1cm4gMDsKPiAKPiAwIGlzIGEgdmFsaWQg dmFsdWUgZm9yIGEgZG1hX2FkZHJfdC4gVXNlIERNQV9NQVBQSU5HX0VSUk9SLiBPciByZXR1cm4g YW4KPiBpbnQgYW5kIHBhc3MgZG1hX2FkZHJfdCBhcyBwYXJhbWV0ZXIuCj4gCndpbGwgZG8KPj4g KwlwaHlzID0gZXAtPnRyYW5zZmVyX3JpbmdfcGh5cyArIGluZGV4ICogc2l6ZW9mKCp0cmIpOwo+ PiArCj4+ICsJcmV0dXJuIHBoeXM7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgdGVncmFf eHVkY190cmIgKnRyYl9waHlzX3RvX3ZpcnQoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAo+PiAr CQkJCQkgICAgICAgZG1hX2FkZHJfdCBhZGRyKQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRj X3RyYiAqdHJiOwo+PiArCXVuc2lnbmVkIGludCBpbmRleDsKPj4gKwo+PiArCWluZGV4ID0gKGFk ZHIgLSBlcC0+dHJhbnNmZXJfcmluZ19waHlzKSAvIHNpemVvZigqdHJiKTsKPj4gKwlpZiAoV0FS Tl9PTihpbmRleCA+PSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSkpCj4+ICsJCXJldHVybiBOVUxM Owo+PiArCXRyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tpbmRleF07Cj4+ICsKPj4gKwlyZXR1cm4g dHJiOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBlcF9yZWxvYWQoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkKPj4gK3sKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCBC SVQoZXApLCBFUF9SRUxPQUQpOwo+PiArCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9SRUxPQUQs IEJJVChlcCksIDApOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBlcF9wYXVzZShzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGVwKQo+PiArewo+PiArCXUzMiB2YWw7Cj4+ ICsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKPj4gKwlpZiAodmFsICYg QklUKGVwKSkKPj4gKwkJcmV0dXJuOwo+PiArCXZhbCB8PSBCSVQoZXApOwo+PiArCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgRVBfUEFVU0UpOwo+PiArCj4+ICsJeHVkY19yZWFkbF9wb2xsKHh1ZGMs IEVQX1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKPj4gKwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMs IEJJVChlcCksIEVQX1NUQ0hHKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZXBfdW5wYXVz ZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGVwKQo+PiArewo+PiArCXUz MiB2YWw7Cj4+ICsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKPj4gKwlp ZiAoISh2YWwgJiBCSVQoZXApKSkKPj4gKwkJcmV0dXJuOwo+PiArCXZhbCAmPSB+QklUKGVwKTsK Pj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQX1BBVVNFKTsKPj4gKwo+PiArCXh1ZGNfcmVh ZGxfcG9sbCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklUKGVwKSk7Cj4+ICsKPj4gKwl4dWRj X3dyaXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2 b2lkIGVwX3VucGF1c2VfYWxsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+PiArewo+PiArCXUz MiB2YWw7Cj4+ICsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKPj4gKwl4 dWRjX3dyaXRlbCh4dWRjLCAwLCBFUF9QQVVTRSk7Cj4+ICsKPj4gKwl4dWRjX3JlYWRsX3BvbGwo eHVkYywgRVBfU1RDSEcsIHZhbCwgdmFsKTsKPj4gKwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZh bCwgRVBfU1RDSEcpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBlcF9oYWx0KHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCj4+ICt7Cj4+ICsJdTMyIHZhbDsKPj4g Kwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7Cj4+ICsJaWYgKHZhbCAmIEJJ VChlcCkpCj4+ICsJCXJldHVybjsKPj4gKwl2YWwgfD0gQklUKGVwKTsKPj4gKwl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIEVQX0hBTFQpOwo+PiArCj4+ICsJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQ X1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKPj4gKwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIEJJ VChlcCksIEVQX1NUQ0hHKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZXBfdW5oYWx0KHN0 cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCj4+ICt7Cj4+ICsJdTMyIHZh bDsKPj4gKwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7Cj4+ICsJaWYgKCEo dmFsICYgQklUKGVwKSkpCj4+ICsJCXJldHVybjsKPj4gKwl2YWwgJj0gfkJJVChlcCk7Cj4+ICsJ eHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9IQUxUKTsKPj4gKwo+PiArCXh1ZGNfcmVhZGxfcG9s bCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklUKGVwKSk7Cj4+ICsKPj4gKwl4dWRjX3dyaXRl bCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGVw X3VuaGFsdF9hbGwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdTMyIHZhbDsK Pj4gKwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7Cj4+ICsJaWYgKCF2YWwp Cj4+ICsJCXJldHVybjsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCAwLCBFUF9IQUxUKTsKPj4gKwo+ PiArCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9TVENIRywgdmFsLCB2YWwpOwo+PiArCj4+ICsJ eHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9TVENIRyk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2 b2lkIGVwX3dhaXRfZm9yX3N0b3BwZWQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVk IGludCBlcCkKPj4gK3sKPj4gKwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RPUFBFRCwgQklU KGVwKSwgQklUKGVwKSk7Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgQklUKGVwKSwgRVBfU1RPUFBF RCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGVwX3dhaXRfZm9yX2luYWN0aXZlKHN0cnVj dCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCj4+ICt7Cj4+ICsJeHVkY19yZWFk bF9wb2xsKHh1ZGMsIEVQX1RIUkVBRF9BQ1RJVkUsIEJJVChlcCksIDApOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3JlcV9kb25lKHN0cnVjdCB0ZWdyYV94dWRjX2VwICpl cCwKPj4gKwkJCQlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXEsIGludCBzdGF0dXMpCj4+ ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKPj4gKwo+PiArCWRl dl9kYmcoeHVkYy0+ZGV2LCAiY29tcGxldGluZyByZXF1ZXN0ICVwIG9uIGVwICV1IHdpdGggc3Rh dHVzICVkXG4iLAo+PiArCQkgcmVxLCBlcC0+aW5kZXgsIHN0YXR1cyk7Cj4+ICsKPj4gKwlpZiAo bGlrZWx5KHJlcS0+dXNiX3JlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKPj4gKwkJcmVxLT51 c2JfcmVxLnN0YXR1cyA9IHN0YXR1czsKPj4gKwo+PiArCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlz dCk7Cj4+ICsKPj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykpIHsK Pj4gKwkJdXNiX2dhZGdldF91bm1hcF9yZXF1ZXN0KCZ4dWRjLT5nYWRnZXQsICZyZXEtPnVzYl9y ZXEsCj4+ICsJCQkJCSAoeHVkYy0+c2V0dXBfc3RhdGUgPT0KPj4gKwkJCQkJICBEQVRBX1NUQUdF X1hGRVIpKTsKPj4gKwl9IGVsc2Ugewo+PiArCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJnh1 ZGMtPmdhZGdldCwgJnJlcS0+dXNiX3JlcSwKPj4gKwkJCQkJIHVzYl9lbmRwb2ludF9kaXJfaW4o ZXAtPmRlc2MpKTsKPj4gKwl9Cj4+ICsKPj4gKwlzcGluX3VubG9jaygmeHVkYy0+bG9jayk7Cj4+ ICsJdXNiX2dhZGdldF9naXZlYmFja19yZXF1ZXN0KCZlcC0+dXNiX2VwLCAmcmVxLT51c2JfcmVx KTsKPj4gKwlzcGluX2xvY2soJnh1ZGMtPmxvY2spOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCB0ZWdyYV94dWRjX2VwX251a2Uoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLCBpbnQgc3RhdHVz KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKPj4gKwo+PiArCXdo aWxlICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewo+PiArCQlyZXEgPSBsaXN0X2ZpcnN0X2Vu dHJ5KCZlcC0+cXVldWUsIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QsCj4+ICsJCQkJICAgICAg IGxpc3QpOwo+PiArCQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIHN0YXR1cyk7Cj4+ICsJ fQo+PiArfQo+PiArCj4+ICtzdGF0aWMgdW5zaWduZWQgaW50IGVwX2F2YWlsYWJsZV90cmJzKHN0 cnVjdCB0ZWdyYV94dWRjX2VwICplcCkKPj4gK3sKPj4gKwlpZiAoZXAtPnJpbmdfZnVsbCkKPj4g KwkJcmV0dXJuIDA7Cj4+ICsJaWYgKGVwLT5kZXFfcHRyID4gZXAtPmVucV9wdHIpCj4+ICsJCXJl dHVybiBlcC0+ZGVxX3B0ciAtIGVwLT5lbnFfcHRyIC0gMTsKPj4gKwlyZXR1cm4gWFVEQ19UUkFO U0ZFUl9SSU5HX1NJWkUgLSAoZXAtPmVucV9wdHIgLSBlcC0+ZGVxX3B0cikgLSAyOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3F1ZXVlX29uZV90cmIoc3RydWN0IHRlZ3Jh X3h1ZGNfZXAgKmVwLAo+PiArCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVx LAo+PiArCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIsCj4+ICsJCQkJICAgICBi b29sIGlvYykKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwo+ PiArCWRtYV9hZGRyX3QgYnVmX2FkZHI7Cj4+ICsJc2l6ZV90IGxlbjsKPj4gKwo+PiArCWxlbiA9 IG1pbl90KHNpemVfdCwgWFVEQ19UUkJfTUFYX0JVRkZFUl9TSVpFLCByZXEtPnVzYl9yZXEubGVu Z3RoIC0KPj4gKwkJICAgIHJlcS0+YnVmX3F1ZXVlZCk7Cj4+ICsJaWYgKGxlbiA+IDApCj4+ICsJ CWJ1Zl9hZGRyID0gcmVxLT51c2JfcmVxLmRtYSArIHJlcS0+YnVmX3F1ZXVlZDsKPj4gKwllbHNl Cj4+ICsJCWJ1Zl9hZGRyID0gMDsKPj4gKwo+PiArCXRyYl93cml0ZV9kYXRhX3B0cih0cmIsIGJ1 Zl9hZGRyKTsKPj4gKwo+PiArCXRyYl93cml0ZV90cmFuc2Zlcl9sZW4odHJiLCBsZW4pOwo+PiAr CXRyYl93cml0ZV90ZF9zaXplKHRyYiwgcmVxLT50cmJzX25lZWRlZCAtIHJlcS0+dHJic19xdWV1 ZWQgLSAxKTsKPj4gKwo+PiArCWlmIChyZXEtPnRyYnNfcXVldWVkID09IHJlcS0+dHJic19uZWVk ZWQgLSAxIHx8Cj4+ICsJCShyZXEtPm5lZWRfemxwICYmIHJlcS0+dHJic19xdWV1ZWQgPT0gcmVx LT50cmJzX25lZWRlZCAtIDIpKQo+PiArCQl0cmJfd3JpdGVfY2hhaW4odHJiLCAwKTsKPj4gKwll bHNlCj4+ICsJCXRyYl93cml0ZV9jaGFpbih0cmIsIDEpOwo+PiArCXRyYl93cml0ZV9pb2ModHJi LCBpb2MpOwo+PiArCj4+ICsJaWYgKHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwLT5kZXNjKSB8fAo+ PiArCSAgICAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykgJiYKPj4gKwkgICAg ICh4dWRjLT5zZXR1cF9zdGF0ZSA9PSBEQVRBX1NUQUdFX1JFQ1YpKSkKPj4gKwkJdHJiX3dyaXRl X2lzcCh0cmIsIDEpOwo+PiArCWVsc2UKPj4gKwkJdHJiX3dyaXRlX2lzcCh0cmIsIDApOwo+PiAr Cj4+ICsJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRlc2MpKSB7Cj4+ICsJCWlm ICh4dWRjLT5zZXR1cF9zdGF0ZSA9PSBEQVRBX1NUQUdFX1hGRVIgfHwKPj4gKwkJICAgIHh1ZGMt PnNldHVwX3N0YXRlID09IERBVEFfU1RBR0VfUkVDVikKPj4gKwkJCXRyYl93cml0ZV90eXBlKHRy YiwgVFJCX1RZUEVfREFUQV9TVEFHRSk7Cj4+ICsJCWVsc2UKPj4gKwkJCXRyYl93cml0ZV90eXBl KHRyYiwgVFJCX1RZUEVfU1RBVFVTX1NUQUdFKTsKPj4gKwkJaWYgKHh1ZGMtPnNldHVwX3N0YXRl ID09IERBVEFfU1RBR0VfWEZFUiB8fAo+PiArCQkgICAgeHVkYy0+c2V0dXBfc3RhdGUgPT0gU1RB VFVTX1NUQUdFX1hGRVIpCj4+ICsJCQl0cmJfd3JpdGVfZGF0YV9zdGFnZV9kaXIodHJiLCAxKTsK Pj4gKwkJZWxzZQo+PiArCQkJdHJiX3dyaXRlX2RhdGFfc3RhZ2VfZGlyKHRyYiwgMCk7Cj4+ICsJ fSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgewo+PiArCQl0cmJf d3JpdGVfdHlwZSh0cmIsIFRSQl9UWVBFX0lTT0NIKTsKPj4gKwkJdHJiX3dyaXRlX3NpYSh0cmIs IDEpOwo+PiArCQl0cmJfd3JpdGVfZnJhbWVfaWQodHJiLCAwKTsKPj4gKwkJdHJiX3dyaXRlX3Rs YnBjKHRyYiwgMCk7Cj4+ICsJfSBlbHNlIGlmICh1c2Jfc3NfbWF4X3N0cmVhbXMoZXAtPmNvbXBf ZGVzYykpIHsKPj4gKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9TVFJFQU0pOwo+PiAr CQl0cmJfd3JpdGVfc3RyZWFtX2lkKHRyYiwgcmVxLT51c2JfcmVxLnN0cmVhbV9pZCk7Cj4+ICsJ fSBlbHNlIHsKPj4gKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9OT1JNQUwpOwo+PiAr CQl0cmJfd3JpdGVfc3RyZWFtX2lkKHRyYiwgMCk7Cj4+ICsJfQo+PiArCj4+ICsJdHJiX3dyaXRl X2N5Y2xlKHRyYiwgZXAtPnBjcyk7Cj4+ICsKPj4gKwlyZXEtPnRyYnNfcXVldWVkKys7Cj4+ICsJ cmVxLT5idWZfcXVldWVkICs9IGxlbjsKPj4gKwo+PiArCWR1bXBfdHJiKHh1ZGMsICJUUkFOU0ZF UiIsIHRyYik7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfeHVkY19x dWV1ZV90cmJzKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKPj4gKwkJCQkJICBzdHJ1Y3QgdGVn cmFfeHVkY19yZXF1ZXN0ICpyZXEpCj4+ICt7Cj4+ICsJdW5zaWduZWQgaW50IGksIGNvdW50LCBh dmFpbGFibGU7Cj4+ICsJYm9vbCB3YWl0X3RkID0gZmFsc2U7Cj4+ICsKPj4gKwlhdmFpbGFibGUg PSBlcF9hdmFpbGFibGVfdHJicyhlcCk7Cj4+ICsJY291bnQgPSByZXEtPnRyYnNfbmVlZGVkIC0g cmVxLT50cmJzX3F1ZXVlZDsKPj4gKwlpZiAoYXZhaWxhYmxlIDwgY291bnQpIHsKPj4gKwkJY291 bnQgPSBhdmFpbGFibGU7Cj4+ICsJCWVwLT5yaW5nX2Z1bGwgPSB0cnVlOwo+PiArCX0KPj4gKwo+ PiArCS8qCj4+ICsJICogVG8gZ2VuZXJhdGUgemVyby1sZW5ndGggcGFja2V0IG9uIFVTQiBidXMs IFNXIG5lZWRzIHNjaGVkdWxlIGEKPj4gKwkgKiBzdGFuZGFsb25lIHplcm8tbGVuZ3RoIFRELiBB Y2NvcmRpbmcgdG8gSFcncyBiZWhhdmlvciwgU1cgbmVlZHMKPj4gKwkgKiB0byBzY2hlZHVsZSBU RHMgaW4gZGlmZmVyZW50IHdheXMgZm9yIGRpZmZlcmVudCBlbmRwb2ludCB0eXBlcy4KPj4gKwkg Kgo+PiArCSAqIEZvciBjb250cm9sIGVuZHBvaW50Ogo+PiArCSAqIC0gRGF0YSBzdGFnZSBURCAo SU9DID0gMSwgQ0ggPSAwKQo+PiArCSAqIC0gUmluZyBkb29yYmVsbCBhbmQgd2FpdCB0cmFuc2Zl ciBldmVudAo+PiArCSAqIC0gRGF0YSBzdGFnZSBURCBmb3IgWkxQIChJT0MgPSAxLCBDSCA9IDAp Cj4+ICsJICogLSBSaW5nIGRvb3JiZWxsCj4+ICsJICoKPj4gKwkgKiBGb3IgYnVsayBhbmQgaW50 ZXJydXB0IGVuZHBvaW50czoKPj4gKwkgKiAtIE5vcm1hbCB0cmFuc2ZlciBURCAoSU9DID0gMCwg Q0ggPSAwKQo+PiArCSAqIC0gTm9ybWFsIHRyYW5zZmVyIFREIGZvciBaTFAgKElPQyA9IDEsIENI ID0gMCkKPj4gKwkgKiAtIFJpbmcgZG9vcmJlbGwKPj4gKwkgKi8KPj4gKwo+PiArCWlmIChyZXEt Pm5lZWRfemxwICYmIHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRlc2MpICYmIGNvdW50 ID4gMSkKPj4gKwkJd2FpdF90ZCA9IHRydWU7Cj4+ICsKPj4gKwlpZiAoIXJlcS0+Zmlyc3RfdHJi KQo+PiArCQlyZXEtPmZpcnN0X3RyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07 Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewo+PiArCQlzdHJ1Y3QgdGVn cmFfeHVkY190cmIgKnRyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07Cj4+ICsJ CWJvb2wgaW9jID0gZmFsc2U7Cj4+ICsKPj4gKwkJaWYgKChpID09IGNvdW50IC0gMSkgfHwgKHdh aXRfdGQgJiYgaSA9PSBjb3VudCAtIDIpKQo+PiArCQkJaW9jID0gdHJ1ZTsKPj4gKwo+PiArCQl0 ZWdyYV94dWRjX3F1ZXVlX29uZV90cmIoZXAsIHJlcSwgdHJiLCBpb2MpOwo+PiArCQlyZXEtPmxh c3RfdHJiID0gdHJiOwo+PiArCj4+ICsJCWVwLT5lbnFfcHRyKys7Cj4+ICsJCWlmIChlcC0+ZW5x X3B0ciA9PSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAtIDEpIHsKPj4gKwkJCXRyYiA9ICZlcC0+ dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07Cj4+ICsJCQl0cmJfd3JpdGVfY3ljbGUodHJiLCBl cC0+cGNzKTsKPj4gKwkJCWVwLT5wY3MgPSAhZXAtPnBjczsKPj4gKwkJCWVwLT5lbnFfcHRyID0g MDsKPj4gKwkJfQo+PiArCj4+ICsJCWlmIChpb2MpCj4+ICsJCQlicmVhazsKPj4gKwl9Cj4+ICsK Pj4gKwlyZXR1cm4gY291bnQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNf ZXBfcmluZ19kb29yYmVsbChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXApCj4+ICt7Cj4+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKPj4gKwl1MzIgdmFsOwo+PiArCj4+ICsJ aWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCj4+ICsJCXJldHVybjsKPj4gKwo+PiArCXZhbCA9 IGVwLT5pbmRleCA8PCBEQl9UQVJHRVRfU0hJRlQ7Cj4+ICsJaWYgKHVzYl9lbmRwb2ludF94ZmVy X2NvbnRyb2woZXAtPmRlc2MpKSB7Cj4+ICsJCXZhbCB8PSB4dWRjLT5zZXR1cF9zZXFfbnVtIDw8 IERCX1NUUkVBTUlEX1NISUZUOwo+PiArCX0gZWxzZSBpZiAodXNiX3NzX21heF9zdHJlYW1zKGVw LT5jb21wX2Rlc2MpID4gMCkgewo+PiArCQlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXE7 Cj4+ICsKPj4gKwkJLyogRG9uJ3QgcmluZyBkb29yYmVsbCBpZiB0aGUgc3RyZWFtIGhhcyBiZWVu IHJlamVjdGVkLiAqLwo+PiArCQlpZiAoZXAtPnN0cmVhbV9yZWplY3RlZCkKPj4gKwkJCXJldHVy bjsKPj4gKwkJcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmZXAtPnF1ZXVlLCBzdHJ1Y3QgdGVncmFf eHVkY19yZXF1ZXN0LAo+PiArCQkJCSAgICAgICBsaXN0KTsKPj4gKwkJdmFsIHw9IHJlcS0+dXNi X3JlcS5zdHJlYW1faWQgPDwgREJfU1RSRUFNSURfU0hJRlQ7Cj4+ICsJfQo+PiArCWRldl9kYmco eHVkYy0+ZGV2LCAicmluZyBkb29yYmVsbDogJSN4XG4iLCB2YWwpOwo+PiArCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgREIpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2Vw X2tpY2tfcXVldWUoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwKQo+PiArewo+PiArCXN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKPj4gKwlib29sIHRyYnNfcXVldWVkID0gZmFsc2U7Cj4+ ICsKPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmVwLT5xdWV1ZSwgbGlzdCkgewo+PiAr CQlpZiAoZXAtPnJpbmdfZnVsbCkKPj4gKwkJCWJyZWFrOwo+PiArCQlpZiAodGVncmFfeHVkY19x dWV1ZV90cmJzKGVwLCByZXEpID4gMCkKPj4gKwkJCXRyYnNfcXVldWVkID0gdHJ1ZTsKPj4gKwl9 Cj4+ICsKPj4gKwlpZiAodHJic19xdWV1ZWQpCj4+ICsJCXRlZ3JhX3h1ZGNfZXBfcmluZ19kb29y YmVsbChlcCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQKPj4gK19fdGVncmFfeHVkY19lcF9x dWV1ZShzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3Qg KnJlcSkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwo+PiAr CWludCBlcnI7Cj4+ICsKPj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVz YykgJiYgIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKPj4gKwkJZGV2X2Vycih4dWRjLT5kZXYs ICJjb250cm9sIGVwIGhhcyBwZW5kaW5nIHRyYW5zZmVyc1xuIik7Cj4+ICsJCXJldHVybiAtRUlO VkFMOwo+PiArCX0KPj4gKwo+PiArCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGVwLT5k ZXNjKSkgewo+PiArCQllcnIgPSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0KCZ4dWRjLT5nYWRnZXQs ICZyZXEtPnVzYl9yZXEsCj4+ICsJCQkJCSAgICAgKHh1ZGMtPnNldHVwX3N0YXRlID09Cj4+ICsJ CQkJCSAgICAgIERBVEFfU1RBR0VfWEZFUikpOwo+PiArCX0gZWxzZSB7Cj4+ICsJCWVyciA9IHVz Yl9nYWRnZXRfbWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwgJnJlcS0+dXNiX3JlcSwKPj4gKwkJ CQkJICAgICB1c2JfZW5kcG9pbnRfZGlyX2luKGVwLT5kZXNjKSk7Cj4+ICsJfQo+PiArCWlmIChl cnIgPCAwKSB7Cj4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIG1hcCByZXF1ZXN0 OiAlZFxuIiwgZXJyKTsKPj4gKwkJcmV0dXJuIGVycjsKPj4gKwl9Cj4+ICsKPj4gKwlyZXEtPmZp cnN0X3RyYiA9IE5VTEw7Cj4+ICsJcmVxLT5sYXN0X3RyYiA9IE5VTEw7Cj4+ICsJcmVxLT5idWZf cXVldWVkID0gMDsKPj4gKwlyZXEtPnRyYnNfcXVldWVkID0gMDsKPj4gKwlyZXEtPm5lZWRfemxw ID0gZmFsc2U7Cj4+ICsJcmVxLT50cmJzX25lZWRlZCA9IERJVl9ST1VORF9VUChyZXEtPnVzYl9y ZXEubGVuZ3RoLAo+PiArCQkJCQlYVURDX1RSQl9NQVhfQlVGRkVSX1NJWkUpOwo+PiArCWlmIChy ZXEtPnVzYl9yZXEubGVuZ3RoID09IDApCj4+ICsJCXJlcS0+dHJic19uZWVkZWQrKzsKPj4gKwlp ZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXAtPmRlc2MpICYmCj4+ICsJICAgIHJlcS0+dXNi X3JlcS56ZXJvICYmIChyZXEtPnVzYl9yZXEubGVuZ3RoICE9IDApICYmCj4+ICsJICAgICgocmVx LT51c2JfcmVxLmxlbmd0aCAlIGVwLT51c2JfZXAubWF4cGFja2V0KSA9PSAwKSkgewo+PiArCQly ZXEtPnRyYnNfbmVlZGVkKys7Cj4+ICsJCXJlcS0+bmVlZF96bHAgPSB0cnVlOwo+PiArCX0KPj4g Kwo+PiArCXJlcS0+dXNiX3JlcS5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7Cj4+ICsJcmVxLT51c2Jf cmVxLmFjdHVhbCA9IDA7Cj4+ICsKPj4gKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZlcC0+ cXVldWUpOwo+PiArCj4+ICsJdGVncmFfeHVkY19lcF9raWNrX3F1ZXVlKGVwKTsKPj4gKwo+PiAr CXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50Cj4+ICt0ZWdyYV94dWRjX2VwX3F1 ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLAo+ PiArCQkgICAgZ2ZwX3QgZ2ZwKQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3Qg KnJlcTsKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGM7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ ICsJaWYgKCF1c2JfZXAgfHwgIXVzYl9yZXEpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCWVw ID0gdG9feHVkY19lcCh1c2JfZXApOwo+PiArCXJlcSA9IHRvX3h1ZGNfcmVxKHVzYl9yZXEpOwo+ PiArCXh1ZGMgPSBlcC0+eHVkYzsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5s b2NrLCBmbGFncyk7Cj4+ICsJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQgfHwgIWVwLT5kZXNjKSB7Cj4g Cj4gRG9lcyB0aGlzIGV2ZW4gaGFwcGVuPyBTaG91bGRuJ3Qgd2UgbWFrZSBzdXJlIHRoYXQgdGhp cyBjYW4gbmV2ZXIgYmUKPiBjYWxsZWQgd2hlbiBwb3dlcmdhdGVkPwo+IAoKRHVyaW5nIGZhc3Qg cGx1ZyBhbmQgdW5wbHVnLCBJbiB0aGUgZGlzY29ubmVjdCBwYXRoLAp0aGVyZSBjYW4gYmUgYSBy YWNlIGJldHdlZW4gWFVEQyBlbnRlcmluZyBydW50aW1lIHN1c3BlbmQKYW5kIHRoZSBnYWRnZXQg Y29yZSByZXNldHRpbmcgKHVuYmluZGluZyBhbmQgcmUtYmluZGluZyksIHJlc3VsdGluZyBpbiB0 aGlzIGFjY2Vzcy4KCj4+ICsJCXJldCA9IC1FU0hVVERPV047Cj4+ICsJCWdvdG8gdW5sb2NrOwo+ PiArCX0KPj4gKwlyZXQgPSBfX3RlZ3JhX3h1ZGNfZXBfcXVldWUoZXAsIHJlcSk7Cj4+ICt1bmxv Y2s6Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiAr Cj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgc3F1ZWV6ZV90cmFu c2Zlcl9yaW5nKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKPj4gKwkJCQkgIHN0cnVjdCB0ZWdy YV94dWRjX3JlcXVlc3QgKnJlcSkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRy YiA9IHJlcS0+Zmlyc3RfdHJiOwo+PiArCWJvb2wgcGNzX2VucSA9IHRyYl9yZWFkX2N5Y2xlKHRy Yik7Cj4+ICsJYm9vbCBwY3M7Cj4+ICsKPj4gKwo+IAo+IEdyYXR1aXRvdXMgYmxhbmsgbGluZS4K PiAKd2lsbCByZW1vdmUKPj4gKwkvKgo+PiArCSAqIENsZWFyIG91dCBhbGwgdGhlIFRSQnMgcGFy dCBvZiBvciBhZnRlciB0aGUgY2FuY2VsbGVkIHJlcXVlc3QsCj4+ICsJICogYW5kIG11c3QgY29y cmVjdCB0cmIgY3ljbGUgYml0IHRvIHRoZSBsYXN0IHVuLWVucXVldWVkIHN0YXRlLgo+PiArCSAq Lwo+PiArCXdoaWxlICh0cmIgIT0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXSkgewo+ PiArCQlwY3MgPSB0cmJfcmVhZF9jeWNsZSh0cmIpOwo+PiArCQltZW1zZXQodHJiLCAwLCBzaXpl b2YoKnRyYikpOwo+PiArCQl0cmJfd3JpdGVfY3ljbGUodHJiLCAhcGNzKTsKPj4gKwkJdHJiKys7 Cj4+ICsKPj4gKwkJaWYgKHRyYl9yZWFkX3R5cGUodHJiKSA9PSBUUkJfVFlQRV9MSU5LKQo+PiAr CQkJdHJiID0gZXAtPnRyYW5zZmVyX3Jpbmc7Cj4+ICsJfQo+PiArCj4+ICsJLyogUmVxdWVzdHMg d2lsbCBiZSByZS1xdWV1ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjYW5jZWxsZWQgcmVxdWVzdC4g Ki8KPj4gKwllcC0+ZW5xX3B0ciA9IHJlcS0+Zmlyc3RfdHJiIC0gZXAtPnRyYW5zZmVyX3Jpbmc7 Cj4+ICsJLyoKPj4gKwkgKiBSZXRyaWV2ZSB0aGUgY29ycmVjdCBjeWNsZSBiaXQgc3RhdGUgZnJv bSB0aGUgZmlyc3QgdHJiIG9mCj4+ICsJICogdGhlIGNhbmNlbGxlZCByZXF1ZXN0Lgo+PiArCSAq Lwo+PiArCWVwLT5wY3MgPSBwY3NfZW5xOwo+PiArCWVwLT5yaW5nX2Z1bGwgPSBmYWxzZTsKPj4g KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHJlcSwgJmVwLT5xdWV1ZSwgbGlzdCkgewo+ PiArCQlyZXEtPnVzYl9yZXEuc3RhdHVzID0gLUVJTlBST0dSRVNTOwo+PiArCQlyZXEtPnVzYl9y ZXEuYWN0dWFsID0gMDsKPj4gKwo+PiArCQlyZXEtPmZpcnN0X3RyYiA9IE5VTEw7Cj4+ICsJCXJl cS0+bGFzdF90cmIgPSBOVUxMOwo+PiArCQlyZXEtPmJ1Zl9xdWV1ZWQgPSAwOwo+PiArCQlyZXEt PnRyYnNfcXVldWVkID0gMDsKPj4gKwl9Cj4+ICt9Cj4+ICsKPj4gKy8qCj4+ICsgKiBEZXRlcm1p bmUgaWYgdGhlIGdpdmVuIFRSQiBpcyBpbiB0aGUgcmFuZ2UgW2ZpcnN0IHRyYiwgbGFzdCB0cmJd IGZvciB0aGUKPj4gKyAqIGdpdmVuIHJlcXVlc3QuCj4+ICsgKi8KPj4gK3N0YXRpYyBib29sIHRy Yl9pbl9yZXF1ZXN0KHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKPj4gKwkJCSAgIHN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcSwKPj4gKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAq dHJiKQo+PiArewo+PiArCWRldl9kYmcoZXAtPnh1ZGMtPmRldiwgIiVzOiByZXF1ZXN0ICVwIC0+ ICVwOyB0cmIgJXBcbiIsIF9fZnVuY19fLAo+PiArCQlyZXEtPmZpcnN0X3RyYiwgcmVxLT5sYXN0 X3RyYiwgdHJiKTsKPj4gKwo+PiArCWlmICh0cmIgPj0gcmVxLT5maXJzdF90cmIgJiYgKHRyYiA8 PSByZXEtPmxhc3RfdHJiIHx8Cj4+ICsJCQkJICAgICAgcmVxLT5sYXN0X3RyYiA8IHJlcS0+Zmly c3RfdHJiKSkKPj4gKwkJcmV0dXJuIHRydWU7Cj4+ICsJaWYgKHRyYiA8IHJlcS0+Zmlyc3RfdHJi ICYmIHRyYiA8PSByZXEtPmxhc3RfdHJiICYmCj4+ICsJICAgIHJlcS0+bGFzdF90cmIgPCByZXEt PmZpcnN0X3RyYikKPj4gKwkJcmV0dXJuIHRydWU7Cj4+ICsJcmV0dXJuIGZhbHNlOwo+PiArfQo+ PiArCj4+ICsvKgo+PiArICogRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBUUkIgaXMgaW4gdGhlIHJh bmdlIFtFUCBlbnF1ZXVlIHBvaW50ZXIsIGZpcnN0IFRSQikKPj4gKyAqIGZvciB0aGUgZ2l2ZW4g ZW5kcG9pbnQgYW5kIHJlcXVlc3QuCj4+ICsgKi8KPj4gK3N0YXRpYyBib29sIHRyYl9iZWZvcmVf cmVxdWVzdChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCj4+ICsJCQkgICAgICAgc3RydWN0IHRl Z3JhX3h1ZGNfcmVxdWVzdCAqcmVxLAo+PiArCQkJICAgICAgIHN0cnVjdCB0ZWdyYV94dWRjX3Ry YiAqdHJiKQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZW5xX3RyYiA9ICZlcC0+ dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07Cj4+ICsKPj4gKwlkZXZfZGJnKGVwLT54dWRjLT5k ZXYsICIlczogcmVxdWVzdCAlcCAtPiAlcDsgZW5xIHB0cjogJXA7IHRyYiAlcFxuIiwKPj4gKwkJ X19mdW5jX18sIHJlcS0+Zmlyc3RfdHJiLCByZXEtPmxhc3RfdHJiLCBlbnFfdHJiLCB0cmIpOwo+ PiArCj4+ICsJaWYgKHRyYiA8IHJlcS0+Zmlyc3RfdHJiICYmIChlbnFfdHJiIDw9IHRyYiB8fAo+ PiArCQkJCSAgICAgcmVxLT5maXJzdF90cmIgPCBlbnFfdHJiKSkKPj4gKwkJcmV0dXJuIHRydWU7 Cj4+ICsJaWYgKHRyYiA+IHJlcS0+Zmlyc3RfdHJiICYmIHJlcS0+Zmlyc3RfdHJiIDwgZW5xX3Ry YiAmJiBlbnFfdHJiIDw9IHRyYikKPj4gKwkJcmV0dXJuIHRydWU7Cj4+ICsJcmV0dXJuIGZhbHNl Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50Cj4+ICtfX3RlZ3JhX3h1ZGNfZXBfZGVxdWV1ZShz dHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCj4+ICsJCQlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0 ICpyZXEpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKPj4g KwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyOwo+PiArCXN0cnVjdCB0ZWdyYV94dWRjX3Ry YiAqZGVxX3RyYjsKPj4gKwlib29sIGJ1c3ksIGtpY2tfcXVldWUgPSBmYWxzZTsKPj4gKwlpbnQg cmV0ID0gMDsKPj4gKwo+PiArCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBpcyBhY3R1YWxseSBx dWV1ZWQgdG8gdGhpcyBlbmRwb2ludC4gKi8KPj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHIsICZl cC0+cXVldWUsIGxpc3QpIHsKPj4gKwkJaWYgKHIgPT0gcmVxKQo+PiArCQkJYnJlYWs7Cj4+ICsJ fQo+PiArCWlmIChyICE9IHJlcSkKPj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKwkvKiBS ZXF1ZXN0IGhhc24ndCBiZWVuIHF1ZXVlZCBpbiB0aGUgdHJhbnNmZXIgcmluZyB5ZXQuICovCj4+ ICsJaWYgKCFyZXEtPnRyYnNfcXVldWVkKSB7Cj4+ICsJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAs IHJlcSwgLUVDT05OUkVTRVQpOwo+PiArCQlyZXR1cm4gMDsKPj4gKwl9Cj4+ICsKPj4gKwkvKiBI YWx0IERNQSBmb3IgdGhpcyBlbmRwaW9udC4gKi8KPj4gKwlpZiAoZXBfY3R4X3JlYWRfc3RhdGUo ZXAtPmNvbnRleHQpID09IEVQX1NUQVRFX1JVTk5JTkcpIHsKPj4gKwkJZXBfcGF1c2UoeHVkYywg ZXAtPmluZGV4KTsKPj4gKwkJZXBfd2FpdF9mb3JfaW5hY3RpdmUoeHVkYywgZXAtPmluZGV4KTsK Pj4gKwl9Cj4+ICsKPj4gKwlkZXFfdHJiID0gdHJiX3BoeXNfdG9fdmlydChlcCwgZXBfY3R4X3Jl YWRfZGVxX3B0cihlcC0+Y29udGV4dCkpOwo+PiArCS8qIElzIHRoZSBoYXJkd2FyZSBwcm9jZXNz aW5nIHRoZSBUUkIgYXQgdGhlIGRlcXVldWUgcG9pbnRlcj8gKi8KPj4gKwlidXN5ID0gKHRyYl9y ZWFkX2N5Y2xlKGRlcV90cmIpID09IGVwX2N0eF9yZWFkX2RjcyhlcC0+Y29udGV4dCkpOwo+PiAr Cj4+ICsJaWYgKHRyYl9pbl9yZXF1ZXN0KGVwLCByZXEsIGRlcV90cmIpICYmIGJ1c3kpIHsKPj4g KwkJLyoKPj4gKwkJICogUmVxdWVzdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29tcGxldGVkIG9yIGl0 IGhhc24ndAo+PiArCQkgKiBzdGFydGVkIHByb2Nlc3NpbmcgeWV0Lgo+PiArCQkgKi8KPj4gKwkJ ZG1hX2FkZHJfdCBkZXFfcHRyOwo+PiArCj4+ICsJCXNxdWVlemVfdHJhbnNmZXJfcmluZyhlcCwg cmVxKTsKPj4gKwo+PiArCQlyZXEtPnVzYl9yZXEuYWN0dWFsID0gZXBfY3R4X3JlYWRfZWR0bGEo ZXAtPmNvbnRleHQpOwo+PiArCQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIC1FQ09OTlJF U0VUKTsKPj4gKwkJa2lja19xdWV1ZSA9IHRydWU7Cj4+ICsKPj4gKwkJLyogRURUTEEgaXMgPiAw OiByZXF1ZXN0IGhhcyBiZWVuIHBhcnRpYWxseSBjb21wbGV0ZWQgKi8KPj4gKwkJaWYgKHJlcS0+ dXNiX3JlcS5hY3R1YWwgPiAwKSB7Cj4+ICsJCQkvKgo+PiArCQkJICogQWJvcnQgdGhlIHBlbmRp bmcgdHJhbnNmZXIgYW5kIHVwZGF0ZSB0aGUgZGVxdWV1ZQo+PiArCQkJICogcG9pbnRlcgo+PiAr CQkJICovCj4+ICsJCQllcF9jdHhfd3JpdGVfZWR0bGEoZXAtPmNvbnRleHQsIDApOwo+PiArCQkJ ZXBfY3R4X3dyaXRlX3BhcnRpYWxfdGQoZXAtPmNvbnRleHQsIDApOwo+PiArCQkJZXBfY3R4X3dy aXRlX2RhdGFfb2Zmc2V0KGVwLT5jb250ZXh0LCAwKTsKPj4gKwo+PiArCQkJZGVxX3B0ciA9IHRy Yl92aXJ0X3RvX3BoeXMoZXAsCj4+ICsJCQkJCSZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0 cl0pOwo+PiArCQkJZXBfY3R4X3dyaXRlX2RlcV9wdHIoZXAtPmNvbnRleHQsIGRlcV9wdHIpOwo+ PiArCQkJZXBfY3R4X3dyaXRlX2RjcyhlcC0+Y29udGV4dCwgZXAtPnBjcyk7Cj4+ICsKPj4gKwkJ CWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOwo+PiArCQl9Cj4+ICsJfSBlbHNlIGlmICh0cmJf YmVmb3JlX3JlcXVlc3QoZXAsIHJlcSwgZGVxX3RyYikgJiYgYnVzeSkgewo+PiArCQkvKiBSZXF1 ZXN0IGhhc24ndCBzdGFydGVkIHByb2Nlc3NpbmcgeWV0LiAqLwo+PiArCQlzcXVlZXplX3RyYW5z ZmVyX3JpbmcoZXAsIHJlcSk7Cj4+ICsKPj4gKwkJdGVncmFfeHVkY19yZXFfZG9uZShlcCwgcmVx LCAtRUNPTk5SRVNFVCk7Cj4+ICsJCWtpY2tfcXVldWUgPSB0cnVlOwo+PiArCX0gZWxzZSB7Cj4+ ICsJCS8qCj4+ICsJCSAqIFJlcXVlc3QgaGFzIGNvbXBsZXRlZCwgYnV0IHdlIGhhdmVuJ3QgcHJv Y2Vzc2VkIHRoZQo+PiArCQkgKiBjb21wbGV0aW9uIGV2ZW50IHlldC4KPj4gKwkJICovCj4+ICsJ CXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOwo+PiArCQlyZXQgPSAt RUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCS8qIFJlc3VtZSB0aGUgZW5kcG9pbnQuICovCj4+ICsJ ZXBfdW5wYXVzZSh4dWRjLCBlcC0+aW5kZXgpOwo+PiArCj4+ICsJaWYgKGtpY2tfcXVldWUpCj4+ ICsJCXRlZ3JhX3h1ZGNfZXBfa2lja19xdWV1ZShlcCk7Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+ PiArfQo+PiArCj4+ICtzdGF0aWMgaW50Cj4+ICt0ZWdyYV94dWRjX2VwX2RlcXVldWUoc3RydWN0 IHVzYl9lcCAqdXNiX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEpCj4+ICt7Cj4+ICsJ c3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+PiArCXN0cnVjdCB0ZWdyYV94dWRjX2Vw ICplcDsKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKPj4gKwl1bnNpZ25lZCBsb25nIGZs YWdzOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlpZiAoIXVzYl9lcCB8fCAhdXNiX3JlcSkKPj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsJZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7Cj4+ICsJcmVx ID0gdG9feHVkY19yZXEodXNiX3JlcSk7Cj4+ICsJeHVkYyA9IGVwLT54dWRjOwo+PiArCj4+ICsJ c3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwlpZiAoeHVkYy0+cG93 ZXJnYXRlZCB8fCAhZXAtPmRlc2MpIHsKPj4gKwkJcmV0ID0gLUVTSFVURE9XTjsKPj4gKwkJZ290 byB1bmxvY2s7Cj4+ICsJfQo+PiArCXJldCA9IF9fdGVncmFfeHVkY19lcF9kZXF1ZXVlKGVwLCBy ZXEpOwo+PiArdW5sb2NrOgo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQg X190ZWdyYV94dWRjX2VwX3NldF9oYWx0KHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwgYm9vbCBo YWx0KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZXAtPnh1ZGM7Cj4+ICsK Pj4gKwlpZiAoIWVwLT5kZXNjKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArCWlmICh1 c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRl diwgImNhbid0IGhhbHQgaXNjb2ggZXBcbiIpOwo+IAo+IEVQIGlzIGFuIGFiYnJldmlhdGlvbiwg c28gc2hvdWxkIGJlIGFsbC1jYXBzLiBBbHNvLCAiaXNjb2giIC0+ICJpc29jLiI/CldpbGwgdWRw YXRlCj4gCj4+ICsJCXJldHVybiAtRU5PVFNVUFA7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKCEhKHh1 ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCkgJiBCSVQoZXAtPmluZGV4KSkgPT0gaGFsdCkgewo+PiAr CQlkZXZfZGJnKHh1ZGMtPmRldiwgImVwICV1IGFscmVhZHkgJXNcbiIsIGVwLT5pbmRleCwKPj4g KwkJCWhhbHQgPyAiaGFsdGVkIiA6ICJub3QgaGFsdGVkIik7Cj4gCj4gVGhpcyBpcyBwZXJoYXBz IG5vdCBhcyBpbXBvcnRhbnQgYXMgZm9yIGVycm9yIG1lc3NhZ2VzLCBidXQgbWF5YmUgd29ydGgK PiBjYXBpdGFsaXppbmcgRVAgaGVyZSBhcyB3ZWxsIGZvciBjb25zaXN0ZW5jeS4gVGhpcyBtYXkg c291bmQgbGlrZSBuaXQtCj4gcGlja2luZywgYnV0IEkgZmluZCBpdCB2ZXJ5IGNvbmZ1c2luZyB0 byBkZWJ1ZyBieSByZWFkaW5nIGVycm9yIGFuZAo+IGRlYnVnIG1lc3NhZ2VzIGlmIHRoZXkgY2Fw aXRhbGl6ZSBvciBzcGVsbCB0aGUgc2FtZSB3b3JkcyBkaWZmZXJlbnRseS4KPiAKV2lsbCB1ZHBh dGUKPj4gKwkJcmV0dXJuIDA7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKGhhbHQpIHsKPj4gKwkJZXBf aGFsdCh4dWRjLCBlcC0+aW5kZXgpOwo+PiArCX0gZWxzZSB7Cj4+ICsJCWVwX2N0eF93cml0ZV9z dGF0ZShlcC0+Y29udGV4dCwgRVBfU1RBVEVfRElTQUJMRUQpOwo+PiArCj4+ICsJCWVwX3JlbG9h ZCh4dWRjLCBlcC0+aW5kZXgpOwo+PiArCj4+ICsJCWVwX2N0eF93cml0ZV9zdGF0ZShlcC0+Y29u dGV4dCwgRVBfU1RBVEVfUlVOTklORyk7Cj4+ICsJCWVwX2N0eF93cml0ZV9zZXFfbnVtKGVwLT5j b250ZXh0LCAwKTsKPj4gKwo+PiArCQllcF9yZWxvYWQoeHVkYywgZXAtPmluZGV4KTsKPj4gKwkJ ZXBfdW5wYXVzZSh4dWRjLCBlcC0+aW5kZXgpOwo+PiArCQllcF91bmhhbHQoeHVkYywgZXAtPmlu ZGV4KTsKPj4gKwo+PiArCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoZXApOwo+PiArCX0K Pj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNf ZXBfc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBpbnQgdmFsdWUpCj4+ICt7Cj4+ICsJ c3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwOwo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOwo+ PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCWlmICghdXNi X2VwKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArCWVwID0gdG9feHVkY19lcCh1c2Jf ZXApOwo+PiArCXh1ZGMgPSBlcC0+eHVkYzsKPj4gKwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQpIHsKPj4gKwkJcmV0 ID0gLUVTSFVURE9XTjsKPj4gKwkJZ290byB1bmxvY2s7Cj4+ICsJfQo+PiArCWlmICh2YWx1ZSAm JiB1c2JfZW5kcG9pbnRfZGlyX2luKGVwLT5kZXNjKSAmJgo+PiArCSAgICAhbGlzdF9lbXB0eSgm ZXAtPnF1ZXVlKSkgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImNhbid0IGhhbHQgZXAgd2l0 aCByZXF1ZXN0cyBwZW5kaW5nXG4iKTsKPj4gKwkJcmV0ID0gLUVBR0FJTjsKPj4gKwkJZ290byB1 bmxvY2s7Cj4+ICsJfQo+PiArCXJldCA9IF9fdGVncmFfeHVkY19lcF9zZXRfaGFsdChlcCwgdmFs dWUpOwo+PiArdW5sb2NrOgo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IHRlZ3JhX3h1ZGNfZXBfY29udGV4dF9zZXR1cChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXApCj4+ ICt7Cj4+ICsJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjID0gZXAt PmRlc2M7Cj4+ICsJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNvbXBf ZGVzYyA9IGVwLT5jb21wX2Rlc2M7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+ eHVkYzsKPj4gKwl1MTYgbWF4cGFja2V0LCBtYXhidXJzdCA9IDAsIGVzaXQgPSAwOwo+PiArCXUz MiB2YWw7Cj4+ICsKPj4gKwltYXhwYWNrZXQgPSB1c2JfZW5kcG9pbnRfbWF4cChkZXNjKSAmIDB4 N2ZmOwo+PiArCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7Cj4+ ICsJCWlmICghdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChkZXNjKSkKPj4gKwkJCW1heGJ1cnN0 ID0gY29tcF9kZXNjLT5iTWF4QnVyc3Q7Cj4+ICsJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQo ZGVzYykgfHwgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkKPj4gKwkJCWVzaXQgPSBsZTE2 X3RvX2NwdShjb21wX2Rlc2MtPndCeXRlc1BlckludGVydmFsKTsKPj4gKwl9IGVsc2UgaWYgKCh4 dWRjLT5nYWRnZXQuc3BlZWQgPCBVU0JfU1BFRURfU1VQRVIpICYmCj4+ICsJCSAgICh1c2JfZW5k cG9pbnRfeGZlcl9pbnQoZGVzYykgfHwKPj4gKwkJICAgIHVzYl9lbmRwb2ludF94ZmVyX2lzb2Mo ZGVzYykpKSB7Cj4+ICsJCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gp IHsKPj4gKwkJCW1heGJ1cnN0ID0gKHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpID4+IDExKSAmIDB4 MzsKPj4gKwkJCWlmIChtYXhidXJzdCA9PSAweDMpIHsKPj4gKwkJCQlkZXZfd2Fybih4dWRjLT5k ZXYsCj4+ICsJCQkJCSAiaW52YWxpZCBlbmRwb2ludCBtYXhidXJzdFxuIik7Cj4+ICsJCQkJbWF4 YnVyc3QgPSAweDI7Cj4+ICsJCQl9Cj4+ICsJCX0KPj4gKwkJZXNpdCA9IG1heHBhY2tldCAqICht YXhidXJzdCArIDEpOwo+PiArCX0KPj4gKwo+PiArCW1lbXNldChlcC0+Y29udGV4dCwgMCwgc2l6 ZW9mKCplcC0+Y29udGV4dCkpOwo+PiArCj4+ICsJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5jb250 ZXh0LCBFUF9TVEFURV9SVU5OSU5HKTsKPj4gKwllcF9jdHhfd3JpdGVfaW50ZXJ2YWwoZXAtPmNv bnRleHQsIGRlc2MtPmJJbnRlcnZhbCk7Cj4+ICsJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBV U0JfU1BFRURfU1VQRVIpIHsKPj4gKwkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykp IHsKPj4gKwkJCWVwX2N0eF93cml0ZV9tdWx0KGVwLT5jb250ZXh0LAo+PiArCQkJCQkgIGNvbXBf ZGVzYy0+Ym1BdHRyaWJ1dGVzICYgMHgzKTsKPj4gKwkJfQo+PiArCQlpZiAodXNiX2VuZHBvaW50 X3hmZXJfYnVsayhkZXNjKSkgewo+PiArCQkJZXBfY3R4X3dyaXRlX21heF9wc3RyZWFtcyhlcC0+ Y29udGV4dCwKPj4gKwkJCQkJCSAgY29tcF9kZXNjLT5ibUF0dHJpYnV0ZXMgJgo+PiArCQkJCQkJ ICAweDFmKTsKPj4gKwkJCWVwX2N0eF93cml0ZV9sc2EoZXAtPmNvbnRleHQsIDEpOwo+PiArCQl9 Cj4+ICsJfQo+PiArCj4+ICsJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRlc2MpICYm IHVzYl9lbmRwb2ludF9kaXJfb3V0KGRlc2MpKQo+PiArCQl2YWwgPSB1c2JfZW5kcG9pbnRfdHlw ZShkZXNjKTsKPj4gKwllbHNlCj4+ICsJCXZhbCA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpICsg RVBfVFlQRV9DT05UUk9MOwo+PiArCWVwX2N0eF93cml0ZV90eXBlKGVwLT5jb250ZXh0LCB2YWwp Owo+PiArCWVwX2N0eF93cml0ZV9jZXJyKGVwLT5jb250ZXh0LCAweDMpOwo+PiArCWVwX2N0eF93 cml0ZV9tYXhfcGFja2V0X3NpemUoZXAtPmNvbnRleHQsIG1heHBhY2tldCk7Cj4+ICsJZXBfY3R4 X3dyaXRlX21heF9idXJzdF9zaXplKGVwLT5jb250ZXh0LCBtYXhidXJzdCk7Cj4+ICsKPj4gKwll cF9jdHhfd3JpdGVfZGVxX3B0cihlcC0+Y29udGV4dCwgZXAtPnRyYW5zZmVyX3JpbmdfcGh5cyk7 Cj4+ICsJZXBfY3R4X3dyaXRlX2RjcyhlcC0+Y29udGV4dCwgZXAtPnBjcyk7Cj4+ICsKPj4gKwkv KiBTZWxlY3QgYSByZWFzb25hYmxlIGF2ZXJhZ2UgVFJCIGxlbmd0aCBiYXNlZCBvbiBlbmRwb2lu dCB0eXBlLiAqLwo+PiArCXN3aXRjaCAodXNiX2VuZHBvaW50X3R5cGUoZGVzYykpIHsKPj4gKwlj YXNlIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0w6Cj4+ICsJCXZhbCA9IDg7Cj4+ICsJCWJyZWFr Owo+PiArCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgo+PiArCQl2YWwgPSAxMDI0Owo+PiAr CQlicmVhazsKPj4gKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6Cj4+ICsJY2FzZSBVU0Jf RU5EUE9JTlRfWEZFUl9JU09DOgo+PiArCWRlZmF1bHQ6Cj4+ICsJCXZhbCA9IDMwNzI7Cj4+ICsJ CWJyZWFrOwo+PiArCX0KPj4gKwllcF9jdHhfd3JpdGVfYXZnX3RyYl9sZW4oZXAtPmNvbnRleHQs IHZhbCk7Cj4+ICsJZXBfY3R4X3dyaXRlX21heF9lc2l0X3BheWxvYWQoZXAtPmNvbnRleHQsIGVz aXQpOwo+PiArCj4+ICsJZXBfY3R4X3dyaXRlX2NlcnJjbnQoZXAtPmNvbnRleHQsIDB4Myk7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHNldHVwX2xpbmtfdHJiKHN0cnVjdCB0ZWdyYV94dWRj X2VwICplcCwKPj4gKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQo+PiArewo+PiAr CXRyYl93cml0ZV9kYXRhX3B0cih0cmIsIGVwLT50cmFuc2Zlcl9yaW5nX3BoeXMpOwo+PiArCXRy Yl93cml0ZV90eXBlKHRyYiwgVFJCX1RZUEVfTElOSyk7Cj4+ICsJdHJiX3dyaXRlX3RvZ2dsZV9j eWNsZSh0cmIsIDEpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IF9fdGVncmFfeHVkY19lcF9k aXNhYmxlKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYyA9IGVwLT54dWRjOwo+PiArCj4+ICsJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVw LT5jb250ZXh0KSA9PSBFUF9TVEFURV9ESVNBQkxFRCkgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRl diwgImVuZHBvaW50ICV1IGFscmVhZHkgZGlzYWJsZWRcbiIsCj4+ICsJCQllcC0+aW5kZXgpOwo+ PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5j b250ZXh0LCBFUF9TVEFURV9ESVNBQkxFRCk7Cj4+ICsKPj4gKwllcF9yZWxvYWQoeHVkYywgZXAt PmluZGV4KTsKPj4gKwo+PiArCXRlZ3JhX3h1ZGNfZXBfbnVrZShlcCwgLUVTSFVURE9XTik7Cj4+ ICsKPj4gKwl4dWRjLT5ucl9lbmFibGVkX2Vwcy0tOwo+PiArCWlmICh1c2JfZW5kcG9pbnRfeGZl cl9pc29jKGVwLT5kZXNjKSkKPj4gKwkJeHVkYy0+bnJfaXNvY2hfZXBzLS07Cj4+ICsKPj4gKwll cC0+ZGVzYyA9IE5VTEw7Cj4+ICsJZXAtPmNvbXBfZGVzYyA9IE5VTEw7Cj4+ICsKPj4gKwltZW1z ZXQoZXAtPmNvbnRleHQsIDAsIHNpemVvZigqZXAtPmNvbnRleHQpKTsKPj4gKwo+PiArCWVwX3Vu cGF1c2UoeHVkYywgZXAtPmluZGV4KTsKPj4gKwllcF91bmhhbHQoeHVkYywgZXAtPmluZGV4KTsK Pj4gKwlpZiAoeHVkY19yZWFkbCh4dWRjLCBFUF9TVE9QUEVEKSAmIEJJVChlcC0+aW5kZXgpKQo+ PiArCQl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXAtPmluZGV4KSwgRVBfU1RPUFBFRCk7Cj4+ICsK Pj4gKwkvKgo+PiArCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgZW5kcG9pbnQgZGlzYWJsZWQgaW4g YSBkZS1jb25maWd1cmUgcmVxdWVzdCwKPj4gKwkgKiBzd2l0Y2ggYmFjayB0byBhZGRyZXNzIHN0 YXRlLgo+PiArCSAqLwo+PiArCWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9D T05GSUdVUkVEKSAmJgo+PiArCSAgICAoeHVkYy0+bnJfZW5hYmxlZF9lcHMgPT0gMSkpIHsKPj4g KwkJdTMyIHZhbDsKPj4gKwo+PiArCQl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfQURE UkVTUzsKPj4gKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2 aWNlX3N0YXRlKTsKPj4gKwo+PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+PiAr CQl2YWwgJj0gfkNUUkxfUlVOOwo+PiArCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOwo+ PiArCX0KPj4gKwo+PiArCWRldl9pbmZvKHh1ZGMtPmRldiwgImVwICV1IGRpc2FibGVkXG4iLCBl cC0+aW5kZXgpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQg dGVncmFfeHVkY19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKPj4gK3sKPj4gKwlz dHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7Cj4+ ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJaWYgKCF1c2Jf ZXApCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJZXAgPSB0b194dWRjX2VwKHVzYl9l cCk7Cj4+ICsJeHVkYyA9IGVwLT54dWRjOwo+PiArCj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1 ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwlpZiAoeHVkYy0+cG93ZXJnYXRlZCkgewo+PiArCQlyZXQg PSAtRVNIVVRET1dOOwo+PiArCQlnb3RvIHVubG9jazsKPj4gKwl9Cj4+ICsJcmV0ID0gX190ZWdy YV94dWRjX2VwX2Rpc2FibGUoZXApOwo+PiArdW5sb2NrOgo+PiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgX190ZWdyYV94dWRjX2VwX2VuYWJsZShzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXAsCj4+ICsJCQkJICBjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Ig KmRlc2MpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKPj4g Kwl1bnNpZ25lZCBpbnQgaTsKPj4gKwl1MzIgdmFsOwo+PiArCj4+ICsJaWYgKHh1ZGMtPmdhZGdl dC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIgJiYKPj4gKwkJIXVzYl9lbmRwb2ludF94ZmVyX2Nv bnRyb2woZGVzYykgJiYgIWVwLT51c2JfZXAuY29tcF9kZXNjKQo+PiArCQlyZXR1cm4gLUVJTlZB TDsKPj4gKwo+PiArCS8qIERpc2FibGUgdGhlIEVQIGlmIGl0IGlzIG5vdCBkaXNhYmxlZCAqLwo+ PiArCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShlcC0+Y29udGV4dCkgIT0gRVBfU1RBVEVfRElTQUJM RUQpCj4+ICsJCV9fdGVncmFfeHVkY19lcF9kaXNhYmxlKGVwKTsKPj4gKwo+PiArCWVwLT5kZXNj ID0gZGVzYzsKPj4gKwllcC0+Y29tcF9kZXNjID0gZXAtPnVzYl9lcC5jb21wX2Rlc2M7Cj4+ICsK Pj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgewo+PiArCQlpZiAoeHVkYy0+ bnJfaXNvY2hfZXBzID4gWFVEQ19NQVhfSVNPQ0hfRVBTKSB7Cj4+ICsJCQlkZXZfZXJyKHh1ZGMt PmRldiwgInRvbyBtYW55IGlzb2NoIGVuZHBvaW50c1xuIik7Cj4+ICsJCQlyZXR1cm4gLUVCVVNZ Owo+PiArCQl9Cj4+ICsJCXh1ZGMtPm5yX2lzb2NoX2VwcysrOwo+PiArCX0KPj4gKwo+PiArCW1l bXNldChlcC0+dHJhbnNmZXJfcmluZywgMCwgWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgKgo+PiAr CSAgICAgICBzaXplb2YoKmVwLT50cmFuc2Zlcl9yaW5nKSk7Cj4+ICsJc2V0dXBfbGlua190cmIo ZXAsICZlcC0+dHJhbnNmZXJfcmluZ1tYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAtIDFdKTsKPj4g Kwo+PiArCWVwLT5lbnFfcHRyID0gMDsKPj4gKwllcC0+ZGVxX3B0ciA9IDA7Cj4+ICsJZXAtPnBj cyA9IHRydWU7Cj4+ICsJZXAtPnJpbmdfZnVsbCA9IGZhbHNlOwo+PiArCXh1ZGMtPm5yX2VuYWJs ZWRfZXBzKys7Cj4+ICsKPj4gKwl0ZWdyYV94dWRjX2VwX2NvbnRleHRfc2V0dXAoZXApOwo+PiAr Cj4+ICsJLyoKPj4gKwkgKiBObyBuZWVkIHRvIHJlbG9hZCBhbmQgdW4taGFsdCBFUDAuICBUaGlz IHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5Cj4+ICsJICogb25jZSBhIHZhbGlkIFNFVFVQIHBh Y2tldCBpcyByZWNlaXZlZC4KPj4gKwkgKi8KPj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29u dHJvbChkZXNjKSkKPj4gKwkJZ290byBvdXQ7Cj4+ICsKPj4gKwkvKgo+PiArCSAqIFRyYW5zaXRp b24gdG8gY29uZmlndXJlZCBzdGF0ZSBvbmNlIHRoZSBmaXJzdCBub24tY29udHJvbAo+PiArCSAq IGVuZHBvaW50IGlzIGVuYWJsZWQuCj4+ICsJICovCj4+ICsJaWYgKHh1ZGMtPmRldmljZV9zdGF0 ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgewo+PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENU UkwpOwo+PiArCQl2YWwgfD0gQ1RSTF9SVU47Cj4+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwg Q1RSTCk7Cj4+ICsKPj4gKwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0NPTkZJR1VS RUQ7Cj4+ICsJCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmlj ZV9zdGF0ZSk7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVz YykpIHsKPj4gKwkJLyoKPj4gKwkJICogUGF1c2UgYWxsIGJ1bGsgZW5kcG9pbnRzIHdoZW4gZW5h YmxpbmcgYW4gaXNvY2ggZW5kcG9pbnQKPj4gKwkJICogdG8gZW5zdXJlIHRoZSBpc29jaCBlbmRw b2ludCBpcyBhbGxvY2F0ZWQgZW5vdWdoIGJhbmR3aWR0aC4KPj4gKwkJICovCj4+ICsJCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKSB7Cj4+ICsJCQlpZiAoeHVkYy0+ ZXBbaV0uZGVzYyAmJgo+PiArCQkJICAgIHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoeHVkYy0+ZXBb aV0uZGVzYykpCj4+ICsJCQkJZXBfcGF1c2UoeHVkYywgaSk7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsK Pj4gKwllcF9yZWxvYWQoeHVkYywgZXAtPmluZGV4KTsKPj4gKwllcF91bnBhdXNlKHh1ZGMsIGVw LT5pbmRleCk7Cj4+ICsJZXBfdW5oYWx0KHh1ZGMsIGVwLT5pbmRleCk7Cj4+ICsKPj4gKwlpZiAo dXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgewo+PiArCQlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRSh4dWRjLT5lcCk7IGkrKykgewo+PiArCQkJaWYgKHh1ZGMtPmVwW2ldLmRlc2MgJiYK Pj4gKwkJCSAgICB1c2JfZW5kcG9pbnRfeGZlcl9idWxrKHh1ZGMtPmVwW2ldLmRlc2MpKQo+PiAr CQkJCWVwX3VucGF1c2UoeHVkYywgaSk7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gK291dDoKPj4g KwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlcCAldSAodHlwZTogJWQsIGRpcjogJXMpIGVuYWJsZWRc biIsIGVwLT5pbmRleCwKPj4gKwkJIHVzYl9lbmRwb2ludF90eXBlKGVwLT5kZXNjKSwKPj4gKwkJ IHVzYl9lbmRwb2ludF9kaXJfaW4oZXAtPmRlc2MpID8gImluIiA6ICJvdXQiKTsKPiAKPiBkZXZf ZGJnKCkKPiAKCk1ha2VkIGluZm8sIHRvIGdldCBydW4gdGltZSB1ZHBhdGVkIG9uIGVuYWJsZWQg ZW5kIHBvaW50cwoKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50 IHRlZ3JhX3h1ZGNfZXBfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwKPj4gKwkJCQljb25z dCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCj4+ICt7Cj4+ICsJc3RydWN0 IHRlZ3JhX3h1ZGNfZXAgKmVwOwo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOwo+PiArCXVu c2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCWlmICAoIXVzYl9lcCB8 fCAhZGVzYyB8fCAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkpCj4+ ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7Cj4+ ICsJeHVkYyA9IGVwLT54dWRjOwo+PiArCj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxv Y2ssIGZsYWdzKTsKPj4gKwlpZiAoeHVkYy0+cG93ZXJnYXRlZCkgewo+PiArCQlyZXQgPSAtRVNI VVRET1dOOwo+PiArCQlnb3RvIHVubG9jazsKPj4gKwl9Cj4+ICsJcmV0ID0gX190ZWdyYV94dWRj X2VwX2VuYWJsZShlcCwgZGVzYyk7Cj4+ICt1bmxvY2s6Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4g Kwo+PiArc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCj4+ICt0ZWdyYV94dWRjX2VwX2FsbG9j X3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBnZnBfdCBnZnApCj4+ICt7Cj4+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+PiArCj4+ICsJcmVxID0ga3phbGxvYyhzaXpl b2YoKnJlcSksIGdmcCk7Cj4+ICsJaWYgKCFyZXEpCj4+ICsJCXJldHVybiBOVUxMOwo+PiArCj4+ ICsJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bGlzdCk7Cj4+ICsKPj4gKwlyZXR1cm4gJnJlcS0+dXNi X3JlcTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcF9mcmVlX3JlcXVl c3Qoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAo+PiArCQkJCSAgICAgICBzdHJ1Y3QgdXNiX3JlcXVl c3QgKnVzYl9yZXEpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxID0g dG9feHVkY19yZXEodXNiX3JlcSk7Cj4+ICsKPj4gKwlrZnJlZShyZXEpOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgdGVncmFfeHVkY19lcF9vcHMgPSB7Cj4+ICsJLmVu YWJsZSA9IHRlZ3JhX3h1ZGNfZXBfZW5hYmxlLAo+PiArCS5kaXNhYmxlID0gdGVncmFfeHVkY19l cF9kaXNhYmxlLAo+PiArCS5hbGxvY19yZXF1ZXN0ID0gdGVncmFfeHVkY19lcF9hbGxvY19yZXF1 ZXN0LAo+PiArCS5mcmVlX3JlcXVlc3QgPSB0ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdCwKPj4g KwkucXVldWUgPSB0ZWdyYV94dWRjX2VwX3F1ZXVlLAo+PiArCS5kZXF1ZXVlID0gdGVncmFfeHVk Y19lcF9kZXF1ZXVlLAo+PiArCS5zZXRfaGFsdCA9IHRlZ3JhX3h1ZGNfZXBfc2V0X2hhbHQsCj4+ ICt9Owo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX2VuYWJsZShzdHJ1Y3QgdXNi X2VwICp1c2JfZXAsCj4+ICsJCQkJIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRv ciAqZGVzYykKPj4gK3sKPj4gKwlyZXR1cm4gLUVJTlZBTDsKPj4gK30KPj4gKwo+PiArc3RhdGlj IGludCB0ZWdyYV94dWRjX2VwMF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKPj4gK3sK Pj4gKwlyZXR1cm4gLUVJTlZBTDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHN0cnVjdCB1c2JfZXBf b3BzIHRlZ3JhX3h1ZGNfZXAwX29wcyA9IHsKPj4gKwkuZW5hYmxlID0gdGVncmFfeHVkY19lcDBf ZW5hYmxlLAo+PiArCS5kaXNhYmxlID0gdGVncmFfeHVkY19lcDBfZGlzYWJsZSwKPj4gKwkuYWxs b2NfcmVxdWVzdCA9IHRlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdCwKPj4gKwkuZnJlZV9yZXF1 ZXN0ID0gdGVncmFfeHVkY19lcF9mcmVlX3JlcXVlc3QsCj4+ICsJLnF1ZXVlID0gdGVncmFfeHVk Y19lcF9xdWV1ZSwKPj4gKwkuZGVxdWV1ZSA9IHRlZ3JhX3h1ZGNfZXBfZGVxdWV1ZSwKPj4gKwku c2V0X2hhbHQgPSB0ZWdyYV94dWRjX2VwX3NldF9oYWx0LAo+PiArfTsKPiAKPiBXaGF0IG1ha2Vz IEVQMCBzcGVjaWFsPwo+IAoKRVAwIGlzIGFsd2F5cyBlbmFibGVkIGFuZCBoZW5jZSBhbnkgY2Fs bHMgdG8gZW5hYmxlL2Rpc2FibGUgYXJlIG5vdCBoYW5kbGVkCmhlbmNlIHNlcGFyYXRlIG9wcyBm b3IgRVAwIHRvIHJlamVjdCByZXF1ZXN0IGlmIGFueQoKPj4gKwo+PiArc3RhdGljIGludCB0ZWdy YV94dWRjX2dhZGdldF9nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKPj4gK3sK Pj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKPj4gKwl1bnNp Z25lZCBsb25nIGZsYWdzOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2 ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7Cj4+ICsJ CXJldCA9IC1FU0hVVERPV047Cj4+ICsJCWdvdG8gdW5sb2NrOwo+PiArCX0KPj4gKwlyZXQgPSAo eHVkY19yZWFkbCh4dWRjLCBNRklOREVYKSA+PiBNRklOREVYX0ZSQU1FX1NISUZUKSAmCj4+ICsJ CU1GSU5ERVhfRlJBTUVfTUFTSzsKPj4gK3VubG9jazoKPj4gKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3Jlc3VtZV9kZXZpY2Vfc3RhdGUoc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdW5zaWduZWQgaW50IGk7Cj4+ICsJdTMyIHZhbDsK Pj4gKwo+PiArCWVwX3VucGF1c2VfYWxsKHh1ZGMpOwo+PiArCj4+ICsJLyogRGlyZWN0IGxpbmsg dG8gVTAuICovCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOwo+PiArCWlmICgo KHZhbCA+PiBQT1JUU0NfUExTX1NISUZUKSAmIFBPUlRTQ19QTFNfTUFTSykgIT0gUE9SVFNDX1BM U19VMCkgewo+PiArCQl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01BU0sgfAo+PiArCQkJIChQT1JU U0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwo+PiArCQl2YWwgfD0gUE9SVFNDX0xX UyB8IChQT1JUU0NfUExTX1UwIDw8IFBPUlRTQ19QTFNfU0hJRlQpOwo+PiArCQl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFBPUlRTQyk7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKHh1ZGMtPmRldmljZV9z dGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Cj4+ICsJCXh1ZGMtPmRldmljZV9zdGF0ZSA9 IHh1ZGMtPnJlc3VtZV9zdGF0ZTsKPj4gKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdh ZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKPj4gKwkJeHVkYy0+cmVzdW1lX3N0YXRlID0gMDsK Pj4gKwl9Cj4+ICsKPj4gKwkvKgo+PiArCSAqIERvb3JiZWxscyBtYXkgYmUgZHJvcHBlZCBpZiB0 aGV5IGFyZSBzZW50IHRvbyBzb29uICg8IH4yMDBucykKPj4gKwkgKiBhZnRlciB1bnBhdXNpbmcg dGhlIGVuZHBvaW50LiAgV2FpdCBmb3IgNTAwbnMganVzdCB0byBiZSBzYWZlLgo+PiArCSAqLwo+ PiArCW5kZWxheSg1MDApOwo+PiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVw KTsgaSsrKQo+PiArCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoJnh1ZGMtPmVwW2ldKTsK Pj4gK30KPj4gKwo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF93YWtldXAoc3RydWN0 IHVzYl9nYWRnZXQgKmdhZGdldCkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9 IHRvX3h1ZGMoZ2FkZ2V0KTsKPj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCWludCByZXQg PSAwOwo+PiArCXUzMiB2YWw7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOwo+PiArCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7Cj4+ICsJCXJldCA9IC1FU0hV VERPV047Cj4+ICsJCWdvdG8gdW5sb2NrOwo+PiArCX0KPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1 ZGMsIFBPUlRQTSk7Cj4+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICIlczogUE9SVFBNPSUjeCwgc3Bl ZWQ9JXhcbiIsIF9fZnVuY19fLAo+PiArCQkJdmFsLCBnYWRnZXQtPnNwZWVkKTsKPj4gKwlpZiAo KCh4dWRjLT5nYWRnZXQuc3BlZWQgPD0gVVNCX1NQRUVEX0hJR0gpICYmCj4+ICsJICAgICAodmFs ICYgUE9SVFBNX1JXRSkpIHx8Cj4+ICsJICAgICgoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9T UEVFRF9TVVBFUikgJiYKPj4gKwkgICAgICh2YWwgJiBQT1JUUE1fRlJXRSkpKSB7Cj4+ICsJCXRl Z3JhX3h1ZGNfcmVzdW1lX2RldmljZV9zdGF0ZSh4dWRjKTsKPj4gKwo+PiArCQkvKiBTZW5kIERl dmljZSBOb3RpZmljYXRpb24gcGFja2V0LiAqLwo+PiArCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVk ID09IFVTQl9TUEVFRF9TVVBFUikgewo+PiArCQkJdmFsID0gKERFVk5PVElGX0xPX1RZUEVfRlVO Q1RJT05fV0FLRSA8PAo+PiArCQkJICAgICAgIERFVk5PVElGX0xPX1RZUEVfU0hJRlQpIHwgREVW Tk9USUZfTE9fVFJJRzsKPj4gKwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIDAsIERFVk5PVElGX0hJKTsK Pj4gKwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgREVWTk9USUZfTE8pOwo+PiArCQl9Cj4+ICsJ fQo+PiArdW5sb2NrOgo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZs YWdzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVn cmFfeHVkY19nYWRnZXRfcHVsbHVwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBpc19v bikKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsK Pj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCXUzMiB2YWw7Cj4+ICsKPj4gKwlwbV9ydW50 aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxv Y2ssIGZsYWdzKTsKPj4gKwlpZiAoaXNfb24gIT0geHVkYy0+cHVsbHVwKSB7Cj4+ICsJCXZhbCA9 IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7Cj4+ICsJCWlmIChpc19vbikKPj4gKwkJCXZhbCB8PSBD VFJMX0VOQUJMRTsKPj4gKwkJZWxzZQo+PiArCQkJdmFsICY9IH5DVFJMX0VOQUJMRTsKPj4gKwkJ eHVkY193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsKPj4gKwl9Cj4+ICsJeHVkYy0+cHVsbHVwID0g aXNfb247Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ PiArCXBtX3J1bnRpbWVfcHV0KHh1ZGMtPmRldik7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF9zdGFydChzdHJ1Y3QgdXNiX2dh ZGdldCAqZ2FkZ2V0LAo+PiArCQkJCSAgIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVy KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOwo+ PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJdTMyIHZhbDsKPj4gKwlpbnQgcmV0Owo+PiAr Cj4+ICsJaWYgKCFkcml2ZXIpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJZGV2X2Ri Zyh4dWRjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwo+IAo+IFRoZXNlIGRvbid0IHNlZW0gdG8g YmUgZ2VuZXJhbGx5IHVzZWZ1bCBkZWJ1ZyBtZXNzYWdlcy4gVGhlIHNhbWUKPiBmdW5jdGlvbmFs aXR5IGNhbiBiZSBlbmFibGVkIHVzaW5nIHRoZSBmdW5jdGlvbiB0cmFjZXIuCj4gCldpbGwgdWRw YXRlCj4+ICsKPj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4+ICsJc3Bpbl9s b2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwlpZiAoeHVkYy0+ZHJpdmVyKSB7 Cj4+ICsJCXJldCA9IC1FQlVTWTsKPj4gKwkJZ290byB1bmxvY2s7Cj4+ICsJfQo+PiArCj4+ICsJ eHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKPj4gKwl4dWRjLT5kZXZpY2Vfc3Rh dGUgPSBVU0JfU1RBVEVfREVGQVVMVDsKPj4gKwl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+ Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+PiArCj4+ICsJcmV0ID0gX190ZWdyYV94dWRj X2VwX2VuYWJsZSgmeHVkYy0+ZXBbMF0sICZ0ZWdyYV94dWRjX2VwMF9kZXNjKTsKPj4gKwlpZiAo cmV0IDwgMCkKPj4gKwkJZ290byB1bmxvY2s7Cj4+ICsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1 ZGMsIENUUkwpOwo+PiArCXZhbCB8PSBDVFJMX0lFIHwgQ1RSTF9MU0U7Cj4+ICsJeHVkY193cml0 ZWwoeHVkYywgdmFsLCBDVFJMKTsKPj4gKwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9S VEhBTFQpOwo+PiArCXZhbCB8PSBQT1JUSEFMVF9TVENIR19JTlRSX0VOOwo+PiArCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgUE9SVEhBTFQpOwo+PiArCj4+ICsJaWYgKHh1ZGMtPnB1bGx1cCkgewo+ PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+PiArCQl2YWwgfD0gQ1RSTF9FTkFC TEU7Cj4+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7Cj4+ICsJfQo+PiArCj4+ICsJ eHVkYy0+ZHJpdmVyID0gZHJpdmVyOwo+PiArdW5sb2NrOgo+PiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYp Owo+PiArCWRldl9kYmcoeHVkYy0+ZGV2LCAiJXMgZG9uZVxuIiwgX19mdW5jX18pOwo+IAo+IFNh bWUgaGVyZS4KPiAKV2lsbCB1ZHBhdGUKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtz dGF0aWMgaW50IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdl dCkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsK Pj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCXUzMiB2YWw7Cj4+ICsKPj4gKwlwbV9ydW50 aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxv Y2ssIGZsYWdzKTsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+PiArCXZhbCAm PSB+KENUUkxfSUUgfCBDVFJMX0VOQUJMRSk7Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBD VFJMKTsKPj4gKwo+PiArCV9fdGVncmFfeHVkY19lcF9kaXNhYmxlKCZ4dWRjLT5lcFswXSk7Cj4+ ICsKPj4gKwl4dWRjLT5kcml2ZXIgPSBOVUxMOwo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOwo+PiAr Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19zZXRf c2VsZnBvd2VyZWQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQo+PiArewo+ PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOwo+PiArCj4+ICsJ ZGV2X2RiZyh4dWRjLT5kZXYsICIlczogJWRcbiIsIF9fZnVuY19fLCBpc19vbik7Cj4+ICsJeHVk Yy0+c2VsZnBvd2VyZWQgPSAhIWlzX29uOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgdGVncmFfeHVkY19nYWRnZXRfb3BzID0g ewo+PiArCS5nZXRfZnJhbWUgPSB0ZWdyYV94dWRjX2dhZGdldF9nZXRfZnJhbWUsCj4+ICsJLndh a2V1cCA9IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3dha2V1cCwKPj4gKwkucHVsbHVwID0gdGVncmFfeHVk Y19nYWRnZXRfcHVsbHVwLAo+PiArCS51ZGNfc3RhcnQgPSB0ZWdyYV94dWRjX2dhZGdldF9zdGFy dCwKPj4gKwkudWRjX3N0b3AgPSB0ZWdyYV94dWRjX2dhZGdldF9zdG9wLAo+PiArCS5zZXRfc2Vs ZnBvd2VyZWQgPSB0ZWdyYV94dWRjX3NldF9zZWxmcG93ZXJlZCwKPj4gK307Cj4+ICsKPj4gK3N0 YXRpYyB2b2lkIG5vX29wX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3Jl cXVlc3QgKnJlcSkKPj4gK3sKPj4gK30KPj4gKwo+PiArc3RhdGljIGludAo+PiArdGVncmFfeHVk Y19lcDBfcXVldWVfc3RhdHVzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+PiArCQl2b2lkICgq Y21wbCkoc3RydWN0IHVzYl9lcCAqLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKikpCj4+ICt7Cj4+ICsJ eHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5idWYgPSBOVUxMOwo+PiArCXh1ZGMtPmVwMF9yZXEtPnVz Yl9yZXEuZG1hID0gMDsKPj4gKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVxLmxlbmd0aCA9IDA7Cj4+ ICsJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb21wbGV0ZSA9IGNtcGw7Cj4+ICsJeHVkYy0+ZXAw X3JlcS0+dXNiX3JlcS5jb250ZXh0ID0geHVkYzsKPj4gKwo+PiArCXJldHVybiBfX3RlZ3JhX3h1 ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4dWRjLT5lcDBfcmVxKTsKPj4gK30KPj4gKwo+PiAr c3RhdGljIGludAo+PiArdGVncmFfeHVkY19lcDBfcXVldWVfZGF0YShzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYywgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAo+PiArCQl2b2lkICgqY21wbCkoc3RydWN0 IHVzYl9lcCAqLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKikpCj4+ICt7Cj4+ICsJeHVkYy0+ZXAwX3Jl cS0+dXNiX3JlcS5idWYgPSBidWY7Cj4+ICsJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5sZW5ndGgg PSBsZW47Cj4+ICsJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb21wbGV0ZSA9IGNtcGw7Cj4+ICsJ eHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb250ZXh0ID0geHVkYzsKPj4gKwo+PiArCXJldHVybiBf X3RlZ3JhX3h1ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4dWRjLT5lcDBfcmVxKTsKPj4gK30K Pj4gKwo+PiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcDBfcmVxX2RvbmUoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJc3dpdGNoICh4dWRjLT5zZXR1cF9zdGF0ZSkgewo+PiAr CWNhc2UgREFUQV9TVEFHRV9YRkVSOgo+PiArCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFNUQVRVU19T VEFHRV9SRUNWOwo+PiArCQl0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgbm9fb3Bf Y29tcGxldGUpOwo+PiArCQlicmVhazsKPj4gKwljYXNlIERBVEFfU1RBR0VfUkVDVjoKPj4gKwkJ eHVkYy0+c2V0dXBfc3RhdGUgPSBTVEFUVVNfU1RBR0VfWEZFUjsKPj4gKwkJdGVncmFfeHVkY19l cDBfcXVldWVfc3RhdHVzKHh1ZGMsIG5vX29wX2NvbXBsZXRlKTsKPj4gKwkJYnJlYWs7Cj4+ICsJ ZGVmYXVsdDoKPj4gKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKPj4gKwkJ YnJlYWs7Cj4+ICsJfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX2Rl bGVnYXRlX3JlcShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPj4gKwkJCQkgICAgICAgc3RydWN0 IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKPj4gK3sKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJc3Bp bl91bmxvY2soJnh1ZGMtPmxvY2spOwo+PiArCXJldCA9IHh1ZGMtPmRyaXZlci0+c2V0dXAoJnh1 ZGMtPmdhZGdldCwgY3RybCk7Cj4+ICsJc3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKPj4gKwo+PiAr CXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHNldF9mZWF0dXJlX2NvbXBs ZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKPj4gK3sKPj4g KwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHJlcS0+Y29udGV4dDsKPj4gKwo+PiArCWlmICh4 dWRjLT50ZXN0X21vZGVfcGF0dGVybikgewo+PiArCQl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT50 ZXN0X21vZGVfcGF0dGVybiwgUE9SVF9UTSk7Cj4+ICsJCXh1ZGMtPnRlc3RfbW9kZV9wYXR0ZXJu ID0gMDsKPj4gKwl9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfc2V0 X2ZlYXR1cmUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCj4+ICsJCQkJICAgICAgc3RydWN0IHVz Yl9jdHJscmVxdWVzdCAqY3RybCkKPj4gK3sKPj4gKwlib29sIHNldCA9IChjdHJsLT5iUmVxdWVz dCA9PSBVU0JfUkVRX1NFVF9GRUFUVVJFKTsKPj4gKwl1MzIgZmVhdHVyZSA9IGxlMTZfdG9fY3B1 KGN0cmwtPndWYWx1ZSk7Cj4+ICsJdTMyIGluZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4 KTsKPj4gKwl1MzIgdmFsLCBlcDsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJaWYgKGxlMTZfdG9f Y3B1KGN0cmwtPndMZW5ndGgpICE9IDApCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJ c3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgewo+PiArCWNhc2Ug VVNCX1JFQ0lQX0RFVklDRToKPj4gKwkJc3dpdGNoIChmZWF0dXJlKSB7Cj4+ICsJCWNhc2UgVVNC X0RFVklDRV9SRU1PVEVfV0FLRVVQOgo+PiArCQkJaWYgKCh4dWRjLT5nYWRnZXQuc3BlZWQgPT0g VVNCX1NQRUVEX1NVUEVSKSB8fAo+PiArCQkJICAgICh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNC X1NUQVRFX0RFRkFVTFQpKQo+PiArCQkJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJCQl2YWwg PSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7Cj4+ICsJCQlpZiAoc2V0KQo+PiArCQkJCXZhbCB8 PSBQT1JUUE1fUldFOwo+PiArCQkJZWxzZQo+PiArCQkJCXZhbCAmPSB+UE9SVFBNX1JXRTsKPj4g KwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKPj4gKwkJCWJyZWFrOwo+PiArCQlj YXNlIFVTQl9ERVZJQ0VfVTFfRU5BQkxFOgo+PiArCQljYXNlIFVTQl9ERVZJQ0VfVTJfRU5BQkxF Ogo+PiArCQkJaWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQp IHx8Cj4+ICsJCQkgICAgKHh1ZGMtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfU1VQRVIpKQo+ PiArCQkJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMs IFBPUlRQTSk7Cj4+ICsJCQlpZiAoKGZlYXR1cmUgPT0gVVNCX0RFVklDRV9VMV9FTkFCTEUpICYm IHUxX2VuYWJsZSkgewo+PiArCQkJCWlmIChzZXQpCj4+ICsJCQkJCXZhbCB8PSBQT1JUUE1fVTFF Owo+PiArCQkJCWVsc2UKPj4gKwkJCQkJdmFsICY9IH5QT1JUUE1fVTFFOwo+PiArCQkJfQo+PiAr CQkJaWYgKChmZWF0dXJlID09IFVTQl9ERVZJQ0VfVTJfRU5BQkxFKSAmJiB1Ml9lbmFibGUpIHsK Pj4gKwkJCQlpZiAoc2V0KQo+PiArCQkJCQl2YWwgfD0gUE9SVFBNX1UyRTsKPj4gKwkJCQllbHNl Cj4+ICsJCQkJCXZhbCAmPSB+UE9SVFBNX1UyRTsKPj4gKwkJCX0KPj4gKwkJCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgUE9SVFBNKTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIFVTQl9ERVZJQ0Vf VEVTVF9NT0RFOgo+PiArCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfSElH SCkKPj4gKwkJCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwkJCWlmICghc2V0KQo+PiArCQkJCXJldHVy biAtRUlOVkFMOwo+PiArCj4+ICsJCQl4dWRjLT50ZXN0X21vZGVfcGF0dGVybiA9IGluZGV4ID4+ IDg7Cj4+ICsJCQlicmVhazsKPj4gKwkJZGVmYXVsdDoKPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ PiArCQl9Cj4+ICsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgo+ PiArCQlpZiAoeHVkYy0+ZGV2aWNlX3N0YXRlICE9IFVTQl9TVEFURV9DT05GSUdVUkVEKQo+PiAr CQkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKwkJc3dpdGNoIChmZWF0dXJlKSB7Cj4+ICsJCWNh c2UgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORDoKPj4gKwkJCWlmIChzZXQpIHsKPj4gKwkJCQl2YWwg PSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7Cj4+ICsJCQkJaWYgKGluZGV4ICYgVVNCX0lOVFJG X0ZVTkNfU1VTUEVORF9SVykKPj4gKwkJCQkJdmFsIHw9IFBPUlRQTV9GUldFOwo+PiArCQkJCWVs c2UKPj4gKwkJCQkJdmFsICY9IH5QT1JUUE1fRlJXRTsKPj4gKwkJCQl4dWRjX3dyaXRlbCh4dWRj LCB2YWwsIFBPUlRQTSk7Cj4+ICsJCQl9Cj4+ICsJCQlyZXR1cm4gdGVncmFfeHVkY19lcDBfZGVs ZWdhdGVfcmVxKHh1ZGMsIGN0cmwpOwo+PiArCQlkZWZhdWx0Ogo+PiArCQkJcmV0dXJuIC1FSU5W QUw7Cj4+ICsJCX0KPj4gKwo+PiArCQlicmVhazsKPj4gKwljYXNlIFVTQl9SRUNJUF9FTkRQT0lO VDoKPj4gKwkJZXAgPSAoaW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spICogMiArCj4+ ICsJCQkoKGluZGV4ICYgVVNCX0RJUl9JTikgPyAxIDogMCk7Cj4+ICsKPj4gKwkJaWYgKCh4dWRj LT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQpIHx8Cj4+ICsJCSAgICAoKHh1ZGMt PmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgJiYKPj4gKwkJICAgICAoaW5kZXgg IT0gMCkpKQo+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKwkJcmV0ID0gX190ZWdyYV94 dWRjX2VwX3NldF9oYWx0KCZ4dWRjLT5lcFtlcF0sIHNldCk7Cj4+ICsJCWlmIChyZXQgPCAwKQo+ PiArCQkJcmV0dXJuIHJldDsKPj4gKwkJYnJlYWs7Cj4+ICsJZGVmYXVsdDoKPj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAwX3F1ZXVlX3N0 YXR1cyh4dWRjLCBzZXRfZmVhdHVyZV9jb21wbGV0ZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBp bnQgdGVncmFfeHVkY19lcDBfZ2V0X3N0YXR1cyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKPj4g KwkJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCj4+ICt7Cj4+ICsJc3RydWN0 IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqZXBfY3R4Owo+PiArCXUzMiB2YWwsIGVwLCBpbmRleCA9 IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7Cj4+ICsJdTE2IHN0YXR1cyA9IDA7Cj4+ICsKPj4g KwlpZiAoIShjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSkKPj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4+ICsKPj4gKwlpZiAoKGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSkgIT0gMCkgfHwK Pj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDIpKQo+PiArCQlyZXR1cm4g LUVJTlZBTDsKPj4gKwo+PiArCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQ X01BU0spIHsKPj4gKwljYXNlIFVTQl9SRUNJUF9ERVZJQ0U6Cj4+ICsJCXZhbCA9IHh1ZGNfcmVh ZGwoeHVkYywgUE9SVFBNKTsKPj4gKwo+PiArCQlpZiAoeHVkYy0+c2VsZnBvd2VyZWQpCj4+ICsJ CQlzdGF0dXMgfD0gQklUKFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEKTsKPj4gKwo+PiArCQlpZiAo KHh1ZGMtPmdhZGdldC5zcGVlZCA8IFVTQl9TUEVFRF9TVVBFUikgJiYKPj4gKwkJICAgICh2YWwg JiBQT1JUUE1fUldFKSkKPj4gKwkJCXN0YXR1cyB8PSBCSVQoVVNCX0RFVklDRV9SRU1PVEVfV0FL RVVQKTsKPj4gKwo+PiArCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBF Uikgewo+PiArCQkJaWYgKHZhbCAmIFBPUlRQTV9VMUUpCj4+ICsJCQkJc3RhdHVzIHw9IEJJVChV U0JfREVWX1NUQVRfVTFfRU5BQkxFRCk7Cj4+ICsJCQlpZiAodmFsICYgUE9SVFBNX1UyRSkKPj4g KwkJCQlzdGF0dXMgfD0gQklUKFVTQl9ERVZfU1RBVF9VMl9FTkFCTEVEKTsKPj4gKwkJfQo+PiAr CQlicmVhazsKPj4gKwljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6Cj4+ICsJCWlmICh4dWRjLT5n YWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7Cj4+ICsJCQlzdGF0dXMgfD0gVVNCX0lO VFJGX1NUQVRfRlVOQ19SV19DQVA7Cj4+ICsJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQ TSk7Cj4+ICsJCQlpZiAodmFsICYgUE9SVFBNX0ZSV0UpCj4+ICsJCQkJc3RhdHVzIHw9IFVTQl9J TlRSRl9TVEFUX0ZVTkNfUlc7Cj4+ICsJCX0KPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVD SVBfRU5EUE9JTlQ6Cj4+ICsJCWVwID0gKGluZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNL KSAqIDIgKwo+PiArCQkJKChpbmRleCAmIFVTQl9ESVJfSU4pID8gMSA6IDApOwo+PiArCQllcF9j dHggPSAmeHVkYy0+ZXBfY29udGV4dFtlcF07Cj4+ICsKPj4gKwkJaWYgKCh4dWRjLT5kZXZpY2Vf c3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpICYmCj4+ICsJCSAgICAoKHh1ZGMtPmRldmlj ZV9zdGF0ZSAhPSBVU0JfU1RBVEVfQUREUkVTUykgfHwgKGVwICE9IDApKSkKPj4gKwkJCXJldHVy biAtRUlOVkFMOwo+PiArCj4+ICsJCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShlcF9jdHgpID09IEVQ X1NUQVRFX0RJU0FCTEVEKQo+PiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKwkJaWYgKHh1 ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCkgJiBCSVQoZXApKQo+PiArCQkJc3RhdHVzIHw9IEJJVChV U0JfRU5EUE9JTlRfSEFMVCk7Cj4+ICsJCWJyZWFrOwo+PiArCWRlZmF1bHQ6Cj4+ICsJCXJldHVy biAtRUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCXh1ZGMtPnN0YXR1c19idWYgPSBjcHVfdG9fbGUx NihzdGF0dXMpOwo+PiArCXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9kYXRhKHh1ZGMsICZ4 dWRjLT5zdGF0dXNfYnVmLAo+PiArCQkJCQkgc2l6ZW9mKHh1ZGMtPnN0YXR1c19idWYpLAo+PiAr CQkJCQkgbm9fb3BfY29tcGxldGUpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBzZXRfc2Vs X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKPj4g K3sKPj4gKwkvKiBOb3RoaW5nIHRvIGRvIHdpdGggU0VMIHZhbHVlcyAqLwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX3NldF9zZWwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMsCj4+ICsJCQkJICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQo+PiArewo+PiArCWlm IChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSB8 Cj4+ICsJCQkJICAgICBVU0JfVFlQRV9TVEFOREFSRCkpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+ PiArCj4+ICsJaWYgKHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfREVGQVVMVCkKPj4g KwkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsKPj4gKwlpZiAoKGxlMTZfdG9fY3B1KGN0cmwtPndJbmRl eCkgIT0gMCkgfHwKPj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSkgIT0gMCkgfHwK Pj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDYpKQo+PiArCQlyZXR1cm4g LUVJTlZBTDsKPj4gKwo+PiArCXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9kYXRhKHh1ZGMs ICZ4dWRjLT5zZWxfdGltaW5nLAo+PiArCQkJCQkgc2l6ZW9mKHh1ZGMtPnNlbF90aW1pbmcpLAo+ PiArCQkJCQkgc2V0X3NlbF9jb21wbGV0ZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHNl dF9pc29jaF9kZWxheV9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1 ZXN0ICpyZXEpCj4+ICt7Cj4+ICsJLyogTm90aGluZyB0byBkbyB3aXRoIGlzb2NoIGRlbGF5ICov Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfc2V0X2lzb2NoX2RlbGF5 KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+PiArCQkJCQkgIHN0cnVjdCB1c2JfY3RybHJlcXVl c3QgKmN0cmwpCj4+ICt7Cj4+ICsJdTMyIGRlbGF5ID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVl KTsKPj4gKwo+PiArCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9ESVJfT1VUIHwgVVNC X1JFQ0lQX0RFVklDRSB8Cj4+ICsJCQkJICAgVVNCX1RZUEVfU1RBTkRBUkQpKQo+PiArCQlyZXR1 cm4gLUVJTlZBTDsKPj4gKwo+PiArCWlmICgoZGVsYXkgPiA2NTUzNSkgfHwgKGxlMTZfdG9fY3B1 KGN0cmwtPndJbmRleCkgIT0gMCkgfHwKPj4gKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5n dGgpICE9IDApKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArCXh1ZGMtPmlzb2NoX2Rl bGF5ID0gZGVsYXk7Cj4+ICsKPj4gKwlyZXR1cm4gdGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVz KHh1ZGMsIHNldF9pc29jaF9kZWxheV9jb21wbGV0ZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2 b2lkIHNldF9hZGRyZXNzX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3Jl cXVlc3QgKnJlcSkKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHJlcS0+Y29u dGV4dDsKPj4gKwo+PiArCWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9ERUZB VUxUKSAmJgo+PiArCSAgICAoeHVkYy0+ZGV2X2FkZHIgIT0gMCkpIHsKPj4gKwkJeHVkYy0+ZGV2 aWNlX3N0YXRlID0gVVNCX1NUQVRFX0FERFJFU1M7Cj4+ICsJCXVzYl9nYWRnZXRfc2V0X3N0YXRl KCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7Cj4+ICsJfSBlbHNlIGlmICgoeHVk Yy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9BRERSRVNTKSAmJgo+PiArCQkgICAoeHVkYy0+ ZGV2X2FkZHIgPT0gMCkpIHsKPj4gKwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RF RkFVTFQ7Cj4+ICsJCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRl dmljZV9zdGF0ZSk7Cj4+ICsJfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNf ZXAwX3NldF9hZGRyZXNzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+PiArCQkJCSAgICAgIHN0 cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGNf ZXAgKmVwMCA9ICZ4dWRjLT5lcFswXTsKPj4gKwl1MzIgdmFsLCBhZGRyID0gbGUxNl90b19jcHUo Y3RybC0+d1ZhbHVlKTsKPj4gKwo+PiArCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9E SVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSB8Cj4+ICsJCQkJICAgICBVU0JfVFlQRV9TVEFOREFS RCkpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJaWYgKChhZGRyID4gMTI3KSB8fCAo bGUxNl90b19jcHUoY3RybC0+d0luZGV4KSAhPSAwKSB8fAo+PiArCSAgICAobGUxNl90b19jcHUo Y3RybC0+d0xlbmd0aCkgIT0gMCkpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCj4+ICsJaWYg KHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKPj4gKwkJcmV0dXJu IC1FSU5WQUw7Cj4+ICsKPj4gKwlkZXZfZGJnKHh1ZGMtPmRldiwgInNldCBhZGRyZXNzOiAldVxu IiwgYWRkcik7Cj4+ICsKPj4gKwl4dWRjLT5kZXZfYWRkciA9IGFkZHI7Cj4+ICsJdmFsID0geHVk Y19yZWFkbCh4dWRjLCBDVFJMKTsKPj4gKwl2YWwgJj0gfihDVFJMX0RFVkFERFJfTUFTSyA8PCBD VFJMX0RFVkFERFJfU0hJRlQpOwo+PiArCXZhbCB8PSBhZGRyIDw8IENUUkxfREVWQUREUl9TSElG VDsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOwo+PiArCj4+ICsJZXBfY3R4X3dy aXRlX2RldmFkZHIoZXAwLT5jb250ZXh0LCBhZGRyKTsKPj4gKwo+PiArCXJldHVybiB0ZWdyYV94 dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgc2V0X2FkZHJlc3NfY29tcGxldGUpOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX3N0YW5kYXJkX3JlcShzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYywKPj4gKwkJCQkgICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJs KQo+PiArewo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7 Cj4+ICsJY2FzZSBVU0JfUkVRX0dFVF9TVEFUVVM6Cj4+ICsJCWRldl9kYmcoeHVkYy0+ZGV2LCAi VVNCX1JFUV9HRVRfU1RBVFVTXG4iKTsKPj4gKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfZ2V0X3N0 YXR1cyh4dWRjLCBjdHJsKTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVRX1NFVF9BRERS RVNTOgo+PiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFfU0VUX0FERFJFU1NcbiIpOwo+ PiArCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfYWRkcmVzcyh4dWRjLCBjdHJsKTsKPj4gKwkJ YnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVRX1NFVF9TRUw6Cj4+ICsJCWRldl9kYmcoeHVkYy0+ZGV2 LCAiVVNCX1JFUV9TRVRfU0VMXG4iKTsKPj4gKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfc2V0X3Nl bCh4dWRjLCBjdHJsKTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVRX1NFVF9JU09DSF9E RUxBWToKPj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJVU0JfUkVRX1NFVF9JU09DSF9ERUxBWVxu Iik7Cj4+ICsJCXJldCA9IHRlZ3JhX3h1ZGNfZXAwX3NldF9pc29jaF9kZWxheSh4dWRjLCBjdHJs KTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6Cj4+ICsJY2Fz ZSBVU0JfUkVRX1NFVF9GRUFUVVJFOgo+PiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFf Q0xFQVIvU0VUX0ZFQVRVUkVcbiIpOwo+PiArCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfZmVh dHVyZSh4dWRjLCBjdHJsKTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBVU0JfUkVRX1NFVF9DT05G SUdVUkFUSU9OOgo+PiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFfU0VUX0NPTkZJR1VS QVRJT05cbiIpOwo+PiArCQkvKgo+PiArCQkgKiBJbiB0aGVvcnkgd2UgbmVlZCB0byBjbGVhciBS VU4gYml0IGJlZm9yZSBzdGF0dXMgc3RhZ2Ugb2YKPj4gKwkJICogZGVjb25maWcgcmVxdWVzdCBz ZW50LCBidXQgdGhpcyBzZWVtcyB0byBiZSBjYXVzaW5nIHByb2JsZW1zLgo+PiArCQkgKiBDbGVh ciBSVU4gb25jZSBhbGwgZW5kcG9pbnRzIGFyZSBkaXNhYmxlZCBpbnN0ZWFkLgo+PiArCQkgKi8K Pj4gKwlkZWZhdWx0Ogo+PiArCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9kZWxlZ2F0ZV9yZXEoeHVk YywgY3RybCk7Cj4+ICsJCWJyZWFrOwo+PiArCX0KPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9zZXR1cF9wYWNrZXQo c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCj4+ICsJCQkJCSAgICAgICBzdHJ1Y3QgdXNiX2N0cmxy ZXF1ZXN0ICpjdHJsLAo+PiArCQkJCQkgICAgICAgdTE2IHNlcV9udW0pCj4+ICt7Cj4+ICsJaW50 IHJldDsKPj4gKwo+PiArCXh1ZGMtPnNldHVwX3NlcV9udW0gPSBzZXFfbnVtOwo+PiArCj4+ICsJ LyogRW5zdXJlIEVQMCBpcyB1bmhhbHRlZC4gKi8KPj4gKwllcF91bmhhbHQoeHVkYywgMCk7Cj4+ ICsKPj4gKwkvKgo+PiArCSAqIE9uIFRlZ3JhMjEwLCBzZXR1cCBwYWNrZXRzIHdpdGggc2VxdWVu Y2UgbnVtYmVycyAweGZmZmUgb3IgMHhmZmZmCj4+ICsJICogYXJlIGludmFsaWQuICBIYWx0IEVQ MCB1bnRpbCB3ZSBnZXQgYSB2YWxpZCBwYWNrZXQuCj4+ICsJICovCj4+ICsJaWYgKHh1ZGMtPnNv Yy0+aW52YWxpZF9zZXFfbnVtICYmCj4+ICsJICAgIChzZXFfbnVtID09IDB4ZmZmZSB8fCBzZXFf bnVtID09IDB4ZmZmZikpIHsKPj4gKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAiaW52YWxpZCBzZXF1 ZW5jZSBudW1iZXIgZGV0ZWN0ZWRcbiIpOwo+PiArCQllcF9oYWx0KHh1ZGMsIDApOwo+PiArCQly ZXR1cm47Cj4+ICsJfQo+PiArCj4+ICsJaWYgKGN0cmwtPndMZW5ndGgpCj4+ICsJCXh1ZGMtPnNl dHVwX3N0YXRlID0gKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pID8KPj4gKwkJCURB VEFfU1RBR0VfWEZFUiA6ICBEQVRBX1NUQUdFX1JFQ1Y7Cj4+ICsJZWxzZQo+PiArCQl4dWRjLT5z ZXR1cF9zdGF0ZSA9IFNUQVRVU19TVEFHRV9YRkVSOwo+PiArCj4+ICsJaWYgKChjdHJsLT5iUmVx dWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKPj4gKwkJcmV0 ID0gdGVncmFfeHVkY19lcDBfc3RhbmRhcmRfcmVxKHh1ZGMsIGN0cmwpOwo+PiArCWVsc2UKPj4g KwkJcmV0ID0gdGVncmFfeHVkY19lcDBfZGVsZWdhdGVfcmVxKHh1ZGMsIGN0cmwpOwo+PiArCj4+ ICsJaWYgKHJldCA8IDApIHsKPj4gKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAic2V0dXAgcmVxdWVz dCBmYWlsZWQ6ICVkXG4iLCByZXQpOwo+PiArCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFdBSVRfRk9S X1NFVFVQOwo+PiArCQllcF9oYWx0KHh1ZGMsIDApOwo+PiArCX0KPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgdGVncmFfeHVkY19oYW5kbGVfZXAwX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjLAo+PiArCQkJCQlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmV2ZW50KQo+PiArewo+PiArCXN0 cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwgPSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKWV2 ZW50Owo+PiArCXUxNiBzZXFfbnVtID0gdHJiX3JlYWRfc2VxX251bShldmVudCk7Cj4+ICsKPj4g KwlpZiAoeHVkYy0+c2V0dXBfc3RhdGUgIT0gV0FJVF9GT1JfU0VUVVApIHsKPj4gKwkJLyoKPj4g KwkJICogVGhlIGNvbnRyb2xsZXIgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgaGFuZGxpbmcgYW5vdGhl cgo+PiArCQkgKiBzZXR1cCByZXF1ZXN0LiAgUXVldWUgc3Vic2VxdWVudCByZXF1ZXN0cyBhbmQg aGFuZGxlCj4+ICsJCSAqIHRoZSBsYXN0IG9uZSBvbmNlIHRoZSBjb250cm9sbGVyIHJlcG9ydHMg YSBzZXF1ZW5jZQo+PiArCQkgKiBudW1iZXIgZXJyb3IuCj4+ICsJCSAqLwo+PiArCQltZW1jcHko Jnh1ZGMtPnNldHVwX3BhY2tldC5jdHJsX3JlcSwgY3RybCwgc2l6ZW9mKCpjdHJsKSk7Cj4+ICsJ CXh1ZGMtPnNldHVwX3BhY2tldC5zZXFfbnVtID0gc2VxX251bTsKPj4gKwkJeHVkYy0+cXVldWVk X3NldHVwX3BhY2tldCA9IHRydWU7Cj4+ICsJfSBlbHNlIHsKPj4gKwkJdGVncmFfeHVkY19oYW5k bGVfZXAwX3NldHVwX3BhY2tldCh4dWRjLCBjdHJsLCBzZXFfbnVtKTsKPj4gKwl9Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICoKPj4gK3RyYl90b19yZXF1 ZXN0KHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIp Cj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+PiArCj4+ICsJbGlz dF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIGxpc3QpIHsKPj4gKwkJaWYgKCFyZXEt PnRyYnNfcXVldWVkKQo+PiArCQkJYnJlYWs7Cj4+ICsKPj4gKwkJaWYgKHRyYl9pbl9yZXF1ZXN0 KGVwLCByZXEsIHRyYikpCj4+ICsJCQlyZXR1cm4gcmVxOwo+PiArCX0KPj4gKwo+PiArCXJldHVy biBOVUxMOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV90cmFu c2Zlcl9jb21wbGV0aW9uKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+PiArCQkJCQkJICBzdHJ1 Y3QgdGVncmFfeHVkY19lcCAqZXAsCj4+ICsJCQkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAq ZXZlbnQpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwo+PiArCXN0 cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiOwo+PiArCWJvb2wgc2hvcnRfcGFja2V0Owo+PiArCj4+ ICsJc2hvcnRfcGFja2V0ID0gKHRyYl9yZWFkX2NtcGxfY29kZShldmVudCkgPT0KPj4gKwkJCVRS Ql9DTVBMX0NPREVfU0hPUlRfUEFDS0VUKTsKPj4gKwo+PiArCXRyYiA9IHRyYl9waHlzX3RvX3Zp cnQoZXAsIHRyYl9yZWFkX2RhdGFfcHRyKGV2ZW50KSk7Cj4+ICsJcmVxID0gdHJiX3RvX3JlcXVl c3QoZXAsIHRyYik7Cj4+ICsJLyoKPj4gKwkgKiBURHMgYXJlIGNvbXBsZXRlIG9uIHNob3J0IHBh Y2tldCBvciB3aGVuIHRoZSBjb21wbGV0ZWQgVFJCIGlzIHRoZQo+PiArCSAqIGxhc3QgVFJCIGlu IHRoZSBURCAodGhlIENIQUlOIGJpdCBpcyB1bnNldCkuCj4+ICsJICovCj4+ICsJaWYgKHJlcSAm JiAoc2hvcnRfcGFja2V0IHx8ICghdHJiX3JlYWRfY2hhaW4odHJiKSAmJgo+PiArCQkocmVxLT50 cmJzX25lZWRlZCA9PSByZXEtPnRyYnNfcXVldWVkKSkpKSB7Cj4+ICsJCXN0cnVjdCB0ZWdyYV94 dWRjX3RyYiAqbGFzdCA9IHJlcS0+bGFzdF90cmI7Cj4+ICsJCXVuc2lnbmVkIGludCByZXNpZHVh bDsKPj4gKwo+PiArCQlyZXNpZHVhbCA9IHRyYl9yZWFkX3RyYW5zZmVyX2xlbihldmVudCk7Cj4+ ICsJCXJlcS0+dXNiX3JlcS5hY3R1YWwgPSByZXEtPnVzYl9yZXEubGVuZ3RoIC0gcmVzaWR1YWw7 Cj4+ICsKPj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJieXRlcyB0cmFuc2ZlcnJlZCAldSAvICV1 XG4iLAo+PiArCQkJcmVxLT51c2JfcmVxLmFjdHVhbCwgcmVxLT51c2JfcmVxLmxlbmd0aCk7Cj4+ ICsKPj4gKwkJdGVncmFfeHVkY19yZXFfZG9uZShlcCwgcmVxLCAwKTsKPj4gKwo+PiArCQlpZiAo ZXAtPmRlc2MgJiYgdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykpCj4+ICsJCQl0 ZWdyYV94dWRjX2VwMF9yZXFfZG9uZSh4dWRjKTsKPj4gKwo+PiArCQkvKgo+PiArCQkgKiBBZHZh bmNlIHRoZSBkZXF1ZXVlIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IFRECj4+ ICsJCSAqIG9uIHNob3J0IHBhY2tldCBjb21wbGV0aW9uLgo+PiArCQkgKi8KPj4gKwkJaWYgKHNo b3J0X3BhY2tldCkgewo+PiArCQkJZXAtPmRlcV9wdHIgPSAobGFzdCAtIGVwLT50cmFuc2Zlcl9y aW5nKSArIDE7Cj4+ICsJCQlpZiAoZXAtPmRlcV9wdHIgPT0gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJ WkUgLSAxKQo+PiArCQkJCWVwLT5kZXFfcHRyID0gMDsKPj4gKwkJfQo+PiArCX0gZWxzZSBpZiAo IXJlcSkgewo+PiArCQlkZXZfd2Fybih4dWRjLT5kZXYsICJ0cmFuc2ZlciBldmVudCBvbiBkZXF1 ZXVlZCByZXF1ZXN0XG4iKTsKPj4gKwl9Cj4+ICsKPj4gKwlpZiAoZXAtPmRlc2MpCj4+ICsJCXRl Z3JhX3h1ZGNfZXBfa2lja19xdWV1ZShlcCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAo+ PiArCQkJCQkgICAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQpCj4+ICt7Cj4+ICsJdW5z aWduZWQgaW50IGVwX2luZGV4ID0gdHJiX3JlYWRfZW5kcG9pbnRfaWQoZXZlbnQpOwo+PiArCXN0 cnVjdCB0ZWdyYV94dWRjX2VwICplcCA9ICZ4dWRjLT5lcFtlcF9pbmRleF07Cj4+ICsJc3RydWN0 IHRlZ3JhX3h1ZGNfdHJiICp0cmI7Cj4+ICsJdTE2IGNvbXBfY29kZTsKPj4gKwo+PiArCWlmIChl cF9jdHhfcmVhZF9zdGF0ZShlcC0+Y29udGV4dCkgPT0gRVBfU1RBVEVfRElTQUJMRUQpIHsKPj4g KwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAidHJhbnNmZXIgZXZlbnQgb24gZGlzYWJsZWQgZXAgJXVc biIsCj4+ICsJCQkgZXBfaW5kZXgpOwo+PiArCQlyZXR1cm47Cj4+ICsJfQo+PiArCj4+ICsJLyog VXBkYXRlIHRyYW5zZmVyIHJpbmcgZGVxdWV1ZSBwb2ludGVyLiAqLwo+PiArCXRyYiA9IHRyYl9w aHlzX3RvX3ZpcnQoZXAsIHRyYl9yZWFkX2RhdGFfcHRyKGV2ZW50KSk7Cj4+ICsJZXAtPmRlcV9w dHIgPSAodHJiIC0gZXAtPnRyYW5zZmVyX3JpbmcpICsgMTsKPj4gKwlpZiAoZXAtPmRlcV9wdHIg PT0gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAxKQo+PiArCQllcC0+ZGVxX3B0ciA9IDA7Cj4+ ICsJZXAtPnJpbmdfZnVsbCA9IGZhbHNlOwo+PiArCj4+ICsJY29tcF9jb2RlID0gdHJiX3JlYWRf Y21wbF9jb2RlKGV2ZW50KTsKPj4gKwlzd2l0Y2ggKGNvbXBfY29kZSkgewo+PiArCWNhc2UgVFJC X0NNUExfQ09ERV9TVUNDRVNTOgo+PiArCWNhc2UgVFJCX0NNUExfQ09ERV9TSE9SVF9QQUNLRVQ6 Cj4+ICsJCXRlZ3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2NvbXBsZXRpb24oeHVkYywgZXAsIGV2 ZW50KTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBUUkJfQ01QTF9DT0RFX0hPU1RfUkVKRUNURUQ6 Cj4+ICsJCWRldl9pbmZvKHh1ZGMtPmRldiwgInN0cmVhbSByZWplY3RlZCBvbiBlcCAldVxuIiwg ZXBfaW5kZXgpOwo+PiArCj4+ICsJCWVwLT5zdHJlYW1fcmVqZWN0ZWQgPSB0cnVlOwo+PiArCQli cmVhazsKPj4gKwljYXNlIFRSQl9DTVBMX0NPREVfUFJJTUVfUElQRV9SRUNFSVZFRDoKPj4gKwkJ ZGV2X2luZm8oeHVkYy0+ZGV2LCAicHJpbWUgcGlwZSByZWNlaXZlZCBvbiBlcCAldVxuIiwgZXBf aW5kZXgpOwo+PiArCj4+ICsJCWlmIChlcC0+c3RyZWFtX3JlamVjdGVkKSB7Cj4+ICsJCQllcC0+ c3RyZWFtX3JlamVjdGVkID0gZmFsc2U7Cj4+ICsJCQkvKgo+PiArCQkJICogQW4gRVAgaXMgc3Rv cHBlZCB3aGVuIGEgc3RyZWFtIGlzIHJlamVjdGVkLiAgV2FpdAo+PiArCQkJICogZm9yIHRoZSBF UCB0byByZXBvcnQgdGhhdCBpdCBpcyBzdG9wcGVkIGFuZCB0aGVuCj4+ICsJCQkgKiB1bi1zdG9w IGl0Lgo+PiArCQkJICovCj4+ICsJCQllcF93YWl0X2Zvcl9zdG9wcGVkKHh1ZGMsIGVwX2luZGV4 KTsKPj4gKwkJfQo+PiArCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoZXApOwo+PiArCQli cmVhazsKPj4gKwljYXNlIFRSQl9DTVBMX0NPREVfQkFCQkxFX0RFVEVDVEVEX0VSUjoKPj4gKwkJ LyoKPj4gKwkJICogV2FpdCBmb3IgdGhlIEVQIHRvIGJlIHN0b3BwZWQgc28gdGhlIGNvbnRyb2xs ZXIgc3RvcHMKPj4gKwkJICogcHJvY2Vzc2luZyBkb29yYmVsbHMuCj4+ICsJCSAqLwo+PiArCQll cF93YWl0X2Zvcl9zdG9wcGVkKHh1ZGMsIGVwX2luZGV4KTsKPj4gKwljYXNlIFRSQl9DTVBMX0NP REVfU1RSRUFNX05VTVBfRVJST1I6Cj4+ICsJY2FzZSBUUkJfQ01QTF9DT0RFX0NUUkxfRElSX0VS UjoKPj4gKwljYXNlIFRSQl9DTVBMX0NPREVfSU5WQUxJRF9TVFJFQU1fVFlQRV9FUlI6Cj4+ICsJ Y2FzZSBUUkJfQ01QTF9DT0RFX1JJTkdfVU5ERVJSVU46Cj4+ICsJY2FzZSBUUkJfQ01QTF9DT0RF X1JJTkdfT1ZFUlJVTjoKPj4gKwljYXNlIFRSQl9DTVBMX0NPREVfSVNPQ0hfQlVGRkVSX09WRVJS VU46Cj4+ICsJY2FzZSBUUkJfQ01QTF9DT0RFX1VTQl9UUkFOU19FUlI6Cj4+ICsJY2FzZSBUUkJf Q01QTF9DT0RFX1RSQl9FUlI6Cj4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiY29tcGxldGlvbiBl cnJvciAlI3ggb24gZXAgJXVcbiIsCj4+ICsJCQljb21wX2NvZGUsIGVwX2luZGV4KTsKPj4gKwo+ PiArCQllcF9oYWx0KHh1ZGMsIGVwX2luZGV4KTsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBUUkJf Q01QTF9DT0RFX0NUUkxfU0VRTlVNX0VSUjoKPj4gKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAic2Vx dWVuY2UgbnVtYmVyIGVycm9yXG4iKTsKPj4gKwo+PiArCQkvKgo+PiArCQkgKiBLaWxsIGFueSBx dWV1ZWQgY29udHJvbCByZXF1ZXN0IGFuZCBza2lwIHRvIHRoZSBsYXN0Cj4+ICsJCSAqIHNldHVw IHBhY2tldCB3ZSByZWNlaXZlZC4KPj4gKwkJICovCj4+ICsJCXRlZ3JhX3h1ZGNfZXBfbnVrZShl cCwgLUVJTlZBTCk7Cj4+ICsJCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7Cj4+ ICsJCWlmICgheHVkYy0+cXVldWVkX3NldHVwX3BhY2tldCkKPj4gKwkJCWJyZWFrOwo+PiArCj4+ ICsJCXRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9zZXR1cF9wYWNrZXQoeHVkYywKPj4gKwkJCQkJCSAg ICZ4dWRjLT5zZXR1cF9wYWNrZXQuY3RybF9yZXEsCj4+ICsJCQkJCQkgICB4dWRjLT5zZXR1cF9w YWNrZXQuc2VxX251bSk7Cj4+ICsJCXh1ZGMtPnF1ZXVlZF9zZXR1cF9wYWNrZXQgPSBmYWxzZTsK Pj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBUUkJfQ01QTF9DT0RFX1NUT1BQRUQ6Cj4+ICsJCWRldl9k YmcoeHVkYy0+ZGV2LCAic3RvcCBjb21wbGV0aW9uIGNvZGUgb24gZXAgJXVcbiIsCj4+ICsJCQll cF9pbmRleCk7Cj4+ICsKPj4gKwkJLyogRGlzY29ubmVjdGVkLiAqLwo+PiArCQl0ZWdyYV94dWRj X2VwX251a2UoZXAsIC1FQ09OTlJFRlVTRUQpOwo+PiArCQlicmVhazsKPj4gKwlkZWZhdWx0Ogo+ PiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgImNvbXBsZXRpb24gZXZlbnQgJSN4IG9uIGVwICV1XG4i LAo+PiArCQkJY29tcF9jb2RlLCBlcF9pbmRleCk7Cj4+ICsJCWJyZWFrOwo+PiArCX0KPj4gK30K Pj4gKwo+PiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19yZXNldChzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYykKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAwID0gJnh1ZGMtPmVwWzBd Owo+PiArCWRtYV9hZGRyX3QgZGVxX3B0cjsKPj4gKwl1bnNpZ25lZCBpbnQgaTsKPj4gKwo+PiAr CXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7Cj4+ICsJeHVkYy0+ZGV2aWNlX3N0 YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7Cj4+ICsJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMt PmdhZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKPj4gKwo+PiArCWVwX3VucGF1c2VfYWxsKHh1 ZGMpOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXApOyBpKysp Cj4+ICsJCXRlZ3JhX3h1ZGNfZXBfbnVrZSgmeHVkYy0+ZXBbaV0sIC1FU0hVVERPV04pOwo+PiAr Cj4+ICsJLyoKPj4gKwkgKiBSZXNldCBzZXF1ZW5jZSBudW1iZXIgYW5kIGRlcXVldWUgcG9pbnRl ciB0byBmbHVzaCB0aGUgdHJhbnNmZXIKPj4gKwkgKiByaW5nLgo+PiArCSAqLwo+PiArCWVwMC0+ ZGVxX3B0ciA9IGVwMC0+ZW5xX3B0cjsKPj4gKwllcDAtPnJpbmdfZnVsbCA9IGZhbHNlOwo+PiAr Cj4+ICsJeHVkYy0+c2V0dXBfc2VxX251bSA9IDA7Cj4+ICsJeHVkYy0+cXVldWVkX3NldHVwX3Bh Y2tldCA9IGZhbHNlOwo+PiArCj4+ICsJZXBfY3R4X3dyaXRlX3NlcV9udW0oZXAwLT5jb250ZXh0 LCB4dWRjLT5zZXR1cF9zZXFfbnVtKTsKPj4gKwo+PiArCWRlcV9wdHIgPSB0cmJfdmlydF90b19w aHlzKGVwMCwgJmVwMC0+dHJhbnNmZXJfcmluZ1tlcDAtPmRlcV9wdHJdKTsKPj4gKwllcF9jdHhf d3JpdGVfZGVxX3B0cihlcDAtPmNvbnRleHQsIGRlcV9wdHIpOwo+PiArCWVwX2N0eF93cml0ZV9k Y3MoZXAwLT5jb250ZXh0LCBlcDAtPnBjcyk7Cj4+ICsKPj4gKwllcF91bmhhbHRfYWxsKHh1ZGMp Owo+PiArCWVwX3JlbG9hZCh4dWRjLCAwKTsKPj4gKwllcF91bnBhdXNlKHh1ZGMsIDApOwo+PiAr fQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfY29ubmVjdChzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAwID0gJnh1 ZGMtPmVwWzBdOwo+PiArCXUxNiBtYXhwYWNrZXQ7Cj4+ICsJdTMyIHZhbDsKPj4gKwo+PiArCXZh bCA9ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BTX1NISUZUKSAmIFBPUlRT Q19QU19NQVNLOwo+PiArCXN3aXRjaCAodmFsKSB7Cj4+ICsJY2FzZSBQT1JUU0NfUFNfTFM6Cj4+ ICsJCXh1ZGMtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9MT1c7Cj4+ICsJCWJyZWFrOwo+PiAr CWNhc2UgUE9SVFNDX1BTX0ZTOgo+PiArCQl4dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURf RlVMTDsKPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBQT1JUU0NfUFNfSFM6Cj4+ICsJCXh1ZGMtPmdh ZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOwo+PiArCQlicmVhazsKPj4gKwljYXNlIFBPUlRT Q19QU19TUzoKPj4gKwkJeHVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1NVUEVSOwo+PiAr CQlicmVhazsKPj4gKwlkZWZhdWx0Ogo+PiArCQl4dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BF RURfVU5LTk9XTjsKPj4gKwkJYnJlYWs7Cj4+ICsJfQo+PiArCj4+ICsJeHVkYy0+ZGV2aWNlX3N0 YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7Cj4+ICsJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMt PmdhZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKPj4gKwo+PiArCXh1ZGMtPnNldHVwX3N0YXRl ID0gV0FJVF9GT1JfU0VUVVA7Cj4+ICsKPj4gKwlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVT Ql9TUEVFRF9TVVBFUikKPj4gKwkJbWF4cGFja2V0ID0gNTEyOwo+PiArCWVsc2UKPj4gKwkJbWF4 cGFja2V0ID0gNjQ7Cj4+ICsJZXBfY3R4X3dyaXRlX21heF9wYWNrZXRfc2l6ZShlcDAtPmNvbnRl eHQsIG1heHBhY2tldCk7Cj4+ICsJdGVncmFfeHVkY19lcDBfZGVzYy53TWF4UGFja2V0U2l6ZSA9 IGNwdV90b19sZTE2KG1heHBhY2tldCk7Cj4+ICsJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQo JmVwMC0+dXNiX2VwLCBtYXhwYWNrZXQpOwo+PiArCj4+ICsJaWYgKCF1MV9lbmFibGUpIHsKPj4g KwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+PiArCQl2YWwgJj0gfihQT1JUUE1f VTFUSU1FT1VUX01BU0sgPDwgUE9SVFBNX1UxVElNRU9VVF9TSElGVCk7Cj4+ICsJCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKPj4gKwl9Cj4+ICsJaWYgKCF1Ml9lbmFibGUpIHsKPj4g KwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+PiArCQl2YWwgJj0gfihQT1JUUE1f VTJUSU1FT1VUX01BU0sgPDwgUE9SVFBNX1UyVElNRU9VVF9TSElGVCk7Cj4+ICsJCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKPj4gKwl9Cj4+ICsJaWYgKHh1ZGMtPmdhZGdldC5zcGVl ZCA8PSBVU0JfU1BFRURfSElHSCkgewo+PiArCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQ TSk7Cj4+ICsJCXZhbCAmPSB+KFBPUlRQTV9MMVNfTUFTSyA8PCBQT1JUUE1fTDFTX1NISUZUKTsK Pj4gKwkJaWYgKGxwbV9lbmFibGUpCj4+ICsJCQl2YWwgfD0gUE9SVFBNX0wxU19BQ0NFUFQgPDwg UE9SVFBNX0wxU19TSElGVDsKPj4gKwkJZWxzZQo+PiArCQkJdmFsIHw9IFBPUlRQTV9MMVNfTllF VCA8PCBQT1JUUE1fTDFTX1NISUZUOwo+PiArCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRQ TSk7Cj4+ICsJfQo+PiArCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTVCk7Cj4+ICsJaWYg KHZhbCAmIFNUX1JDKQo+PiArCQl4dWRjX3dyaXRlbCh4dWRjLCBTVF9SQywgU1QpOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfZGlzY29ubmVjdChzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwl0ZWdyYV94dWRjX3Jlc2V0KHh1ZGMpOwo+PiArCWlm ICh4dWRjLT5kcml2ZXIgJiYgeHVkYy0+ZHJpdmVyLT5kaXNjb25uZWN0KSB7Cj4+ICsJCXNwaW5f dW5sb2NrKCZ4dWRjLT5sb2NrKTsKPj4gKwkJeHVkYy0+ZHJpdmVyLT5kaXNjb25uZWN0KCZ4dWRj LT5nYWRnZXQpOwo+PiArCQlzcGluX2xvY2soJnh1ZGMtPmxvY2spOwo+PiArCX0KPj4gKwo+PiAr CXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRDsKPj4gKwl1c2JfZ2Fk Z2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+PiArCj4+ ICsJY29tcGxldGUoJnh1ZGMtPmRpc2Nvbm5lY3RfY29tcGxldGUpOwo+PiArfQo+PiArCj4+ICtz dGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMp Cj4+ICt7Cj4+ICsJdGVncmFfeHVkY19yZXNldCh4dWRjKTsKPj4gKwlpZiAoeHVkYy0+ZHJpdmVy KSB7Cj4+ICsJCXNwaW5fdW5sb2NrKCZ4dWRjLT5sb2NrKTsKPj4gKwkJdXNiX2dhZGdldF91ZGNf cmVzZXQoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZHJpdmVyKTsKPj4gKwkJc3Bpbl9sb2NrKCZ4dWRj LT5sb2NrKTsKPj4gKwl9Cj4+ICsJdGVncmFfeHVkY19wb3J0X2Nvbm5lY3QoeHVkYyk7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcG9ydF9zdXNwZW5kKHN0cnVjdCB0ZWdy YV94dWRjICp4dWRjKQo+PiArewo+PiArCWRldl9kYmcoeHVkYy0+ZGV2LCAicG9ydCBzdXNwZW5k XG4iKTsKPj4gKwl4dWRjLT5yZXN1bWVfc3RhdGUgPSB4dWRjLT5kZXZpY2Vfc3RhdGU7Cj4+ICsJ eHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX1NVU1BFTkRFRDsKPj4gKwl1c2JfZ2FkZ2V0 X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwo+PiArCWlmICh4 dWRjLT5kcml2ZXItPnN1c3BlbmQpIHsKPj4gKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOwo+ PiArCQl4dWRjLT5kcml2ZXItPnN1c3BlbmQoJnh1ZGMtPmdhZGdldCk7Cj4+ICsJCXNwaW5fbG9j aygmeHVkYy0+bG9jayk7Cj4+ICsJfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94 dWRjX3BvcnRfcmVzdW1lKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+PiArewo+PiArCWRldl9k YmcoeHVkYy0+ZGV2LCAicG9ydCByZXN1bWVcbiIpOwo+PiArCXRlZ3JhX3h1ZGNfcmVzdW1lX2Rl dmljZV9zdGF0ZSh4dWRjKTsKPj4gKwlpZiAoeHVkYy0+ZHJpdmVyLT5yZXN1bWUpIHsKPj4gKwkJ c3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOwo+PiArCQl4dWRjLT5kcml2ZXItPnJlc3VtZSgmeHVk Yy0+Z2FkZ2V0KTsKPj4gKwkJc3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKPj4gKwl9Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9wb3J0X2NoYW5nZShzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYywgdTMyIGZsYWcpCj4+ICt7Cj4+ICsJdTMyIHZhbDsKPj4gKwo+PiArCXZhbCA9 IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKPj4gKwl2YWwgJj0gflBPUlRTQ19DSEFOR0VfTUFT SzsKPj4gKwl2YWwgfD0gZmxhZzsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIF9fdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0 dXMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdTMyIHBvcnRzYywgcG9ydGhh bHQ7Cj4+ICsKPj4gKwlwb3J0aGFsdCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVEhBTFQpOwo+PiAr CWlmICgocG9ydGhhbHQgJiBQT1JUSEFMVF9TVENIR19SRVEpICYmCj4+ICsJICAgIChwb3J0aGFs dCAmIFBPUlRIQUxUX0hBTFRfTFRTU00pKSB7Cj4+ICsJCWRldl9kYmcoeHVkYy0+ZGV2LCAiU1RD SEdfUkVRLCBQT1JUSEFMVCA9ICUjeFxuIiwgcG9ydGhhbHQpOwo+PiArCQlwb3J0aGFsdCAmPSB+ UE9SVEhBTFRfSEFMVF9MVFNTTTsKPj4gKwkJeHVkY193cml0ZWwoeHVkYywgcG9ydGhhbHQsIFBP UlRIQUxUKTsKPj4gKwl9Cj4+ICsKPj4gKwlwb3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRT Qyk7Cj4+ICsJaWYgKChwb3J0c2MgJiBQT1JUU0NfUFJDKSAmJiAocG9ydHNjICYgUE9SVFNDX1BS KSkgewo+PiArCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlBSQywgUFIsIFBPUlRTQyA9ICUjeFxuIiwg cG9ydHNjKTsKPj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1BSQyB8IFBPUlRT Q19QRUQpOwo+PiArI2RlZmluZSBUT0dHTEVfVkJVU19XQUlUX01TIDEwMAo+PiArCQlpZiAoeHVk Yy0+c29jLT5wb3J0X3Jlc2V0X3F1aXJrKSB7Cj4+ICsJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmso Jnh1ZGMtPnBvcnRfcmVzZXRfd2FyX3dvcmssCj4+ICsJCQkJbXNlY3NfdG9famlmZmllcyhUT0dH TEVfVkJVU19XQUlUX01TKSk7Cj4+ICsJCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMTsKPj4g KwkJfQo+PiArCX0KPj4gKwo+PiArCWlmICgocG9ydHNjICYgUE9SVFNDX1BSQykgJiYgIShwb3J0 c2MgJiBQT1JUU0NfUFIpKSB7Cj4+ICsJCWRldl9kYmcoeHVkYy0+ZGV2LCAiUFJDLCBOb3QgUFIs IFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKPj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywg UE9SVFNDX1BSQyB8IFBPUlRTQ19QRUQpOwo+PiArCQl0ZWdyYV94dWRjX3BvcnRfcmVzZXQoeHVk Yyk7Cj4+ICsJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnh1ZGMtPnBvcnRfcmVzZXRfd2FyX3dvcmsp Owo+PiArCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMDsKPj4gKwl9Cj4+ICsKPj4gKwlwb3J0 c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4+ICsJaWYgKHBvcnRzYyAmIFBPUlRTQ19X UkMpIHsKPj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJXUkMsIFBPUlRTQyA9ICUjeFxuIiwgcG9y dHNjKTsKPj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1dSQyB8IFBPUlRTQ19Q RUQpOwo+PiArCQlpZiAoISh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JUU0NfV1BSKSkK Pj4gKwkJCXRlZ3JhX3h1ZGNfcG9ydF9yZXNldCh4dWRjKTsKPj4gKwl9Cj4+ICsKPj4gKwlwb3J0 c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4+ICsJaWYgKHBvcnRzYyAmIFBPUlRTQ19D U0MpIHsKPj4gKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJDU0MsIFBPUlRTQyA9ICUjeFxuIiwgcG9y dHNjKTsKPj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX0NTQyk7Cj4+ICsJCWlm IChwb3J0c2MgJiBQT1JUU0NfQ0NTKQo+PiArCQkJdGVncmFfeHVkY19wb3J0X2Nvbm5lY3QoeHVk Yyk7Cj4+ICsJCWVsc2UKPj4gKwkJCXRlZ3JhX3h1ZGNfcG9ydF9kaXNjb25uZWN0KHh1ZGMpOwo+ PiArCQlpZiAoeHVkYy0+d2FpdF9jc2MpIHsKPj4gKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnh1 ZGMtPnBsY19yZXNldF93b3JrKTsKPj4gKwkJCXh1ZGMtPndhaXRfY3NjID0gZmFsc2U7Cj4+ICsJ CX0KPj4gKwl9Cj4+ICsKPj4gKwlwb3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4+ ICsJaWYgKHBvcnRzYyAmIFBPUlRTQ19QTEMpIHsKPj4gKwkJdTMyIHBscyA9IChwb3J0c2MgPj4g UE9SVFNDX1BMU19TSElGVCkgJiBQT1JUU0NfUExTX01BU0s7Cj4+ICsKPj4gKwkJZGV2X2RiZyh4 dWRjLT5kZXYsICJQTEMsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKPj4gKwkJY2xlYXJfcG9y dF9jaGFuZ2UoeHVkYywgUE9SVFNDX1BMQyk7Cj4+ICsJCXN3aXRjaCAocGxzKSB7Cj4+ICsJCWNh c2UgUE9SVFNDX1BMU19VMzoKPj4gKwkJCXRlZ3JhX3h1ZGNfcG9ydF9zdXNwZW5kKHh1ZGMpOwo+ PiArCQkJYnJlYWs7Cj4+ICsJCWNhc2UgUE9SVFNDX1BMU19VMDoKPj4gKwkJCWlmICh4dWRjLT5n YWRnZXQuc3BlZWQgPCBVU0JfU1BFRURfU1VQRVIpCj4+ICsJCQkJdGVncmFfeHVkY19wb3J0X3Jl c3VtZSh4dWRjKTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIFBPUlRTQ19QTFNfUkVTVU1FOgo+ PiArCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCj4+ICsJCQkJ dGVncmFfeHVkY19wb3J0X3Jlc3VtZSh4dWRjKTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIFBP UlRTQ19QTFNfSU5BQ1RJVkU6Cj4+ICsJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnh1ZGMtPnBs Y19yZXNldF93b3JrLAo+PiArCQkJCQltc2Vjc190b19qaWZmaWVzKFRPR0dMRV9WQlVTX1dBSVRf TVMpKTsKPj4gKwkJCXh1ZGMtPndhaXRfY3NjID0gdHJ1ZTsKPj4gKwkJCWJyZWFrOwo+PiArCQlk ZWZhdWx0Ogo+PiArCQkJYnJlYWs7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwlpZiAocG9ydHNj ICYgUE9SVFNDX0NFQykgewo+PiArCQlkZXZfd2Fybih4dWRjLT5kZXYsICJDRUMsIFBPUlRTQyA9 ICUjeFxuIiwgcG9ydHNjKTsKPj4gKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX0NF Qyk7Cj4+ICsJfQo+PiArCj4+ICsJZGV2X2RiZyh4dWRjLT5kZXYsICJQT1JUU0MgPSAlI3hcbiIs IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+PiAr ewo+PiArCXdoaWxlICgoeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpICYgUE9SVFNDX0NIQU5HRV9N QVNLKSB8fAo+PiArCSAgICAgICAoeHVkY19yZWFkbCh4dWRjLCBQT1JUSEFMVCkgJiBQT1JUSEFM VF9TVENIR19SRVEpKQo+PiArCQlfX3RlZ3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHh1ZGMp Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV9ldmVudChzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYywKPj4gKwkJCQkgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpl dmVudCkKPj4gK3sKPj4gKwl1MzIgdHlwZSA9IHRyYl9yZWFkX3R5cGUoZXZlbnQpOwo+PiArCj4+ ICsJZHVtcF90cmIoeHVkYywgIkVWRU5UIiwgZXZlbnQpOwo+PiArCj4+ICsJc3dpdGNoICh0eXBl KSB7Cj4+ICsJY2FzZSBUUkJfVFlQRV9QT1JUX1NUQVRVU19DSEFOR0VfRVZFTlQ6Cj4+ICsJCXRl Z3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHh1ZGMpOwo+PiArCQlicmVhazsKPj4gKwljYXNl IFRSQl9UWVBFX1RSQU5TRkVSX0VWRU5UOgo+PiArCQl0ZWdyYV94dWRjX2hhbmRsZV90cmFuc2Zl cl9ldmVudCh4dWRjLCBldmVudCk7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgVFJCX1RZUEVfU0VU VVBfUEFDS0VUX0VWRU5UOgo+PiArCQl0ZWdyYV94dWRjX2hhbmRsZV9lcDBfZXZlbnQoeHVkYywg ZXZlbnQpOwo+PiArCQlicmVhazsKPj4gKwlkZWZhdWx0Ogo+PiArCQlkZXZfaW5mbyh4dWRjLT5k ZXYsICJVbnJlY29nbml6ZWQgVFJCIHR5cGUgPSAlI3hcbiIsIHR5cGUpOwo+PiArCQlicmVhazsK Pj4gKwl9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcHJvY2Vzc19ldmVu dF9yaW5nKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94 dWRjX3RyYiAqZXZlbnQ7Cj4+ICsJZG1hX2FkZHJfdCBlcmRwOwo+PiArCj4+ICsJd2hpbGUgKHRy dWUpIHsKPj4gKwkJZXZlbnQgPSB4dWRjLT5ldmVudF9yaW5nW3h1ZGMtPmV2ZW50X3JpbmdfaW5k ZXhdICsKPj4gKwkJCXh1ZGMtPmV2ZW50X3JpbmdfZGVxX3B0cjsKPj4gKwo+PiArCQlpZiAodHJi X3JlYWRfY3ljbGUoZXZlbnQpICE9IHh1ZGMtPmNjcykKPj4gKwkJCWJyZWFrOwo+PiArCj4+ICsJ CXRlZ3JhX3h1ZGNfaGFuZGxlX2V2ZW50KHh1ZGMsIGV2ZW50KTsKPj4gKwo+PiArCQl4dWRjLT5l dmVudF9yaW5nX2RlcV9wdHIrKzsKPj4gKwkJaWYgKHh1ZGMtPmV2ZW50X3JpbmdfZGVxX3B0ciA9 PSBYVURDX0VWRU5UX1JJTkdfU0laRSkgewo+PiArCQkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRy ID0gMDsKPj4gKwkJCXh1ZGMtPmV2ZW50X3JpbmdfaW5kZXgrKzsKPj4gKwkJfQo+PiArCQlpZiAo eHVkYy0+ZXZlbnRfcmluZ19pbmRleCA9PSBYVURDX05SX0VWRU5UX1JJTkdTKSB7Cj4+ICsJCQl4 dWRjLT5ldmVudF9yaW5nX2luZGV4ID0gMDsKPj4gKwkJCXh1ZGMtPmNjcyA9ICF4dWRjLT5jY3M7 Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwllcmRwID0geHVkYy0+ZXZlbnRfcmluZ19waHlzW3h1 ZGMtPmV2ZW50X3JpbmdfaW5kZXhdICsKPj4gKwkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRyICog c2l6ZW9mKCpldmVudCk7Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgdXBwZXJfMzJfYml0cyhlcmRw KSwgRVJEUEhJKTsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCBsb3dlcl8zMl9iaXRzKGVyZHApIHwg RVJEUExPX0VIQiwgRVJEUExPKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlycXJldHVybl90IHRl Z3JhX3h1ZGNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMgPSBkYXRhOwo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJdTMyIHZh bDsKPj4gKwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1QpOwo+PiArCWlmICghKHZhbCAm IFNUX0lQKSkKPj4gKwkJcmV0dXJuIElSUV9OT05FOwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIFNU X0lQLCBTVCk7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3Mp Owo+PiArCXRlZ3JhX3h1ZGNfcHJvY2Vzc19ldmVudF9yaW5nKHh1ZGMpOwo+PiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCXJldHVybiBJUlFf SEFORExFRDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2FsbG9jX2VwKHN0 cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgaW5kZXgpCj4+ICt7Cj4+ICsJc3Ry dWN0IHRlZ3JhX3h1ZGNfZXAgKmVwID0gJnh1ZGMtPmVwW2luZGV4XTsKPj4gKwo+PiArCWVwLT54 dWRjID0geHVkYzsKPj4gKwllcC0+aW5kZXggPSBpbmRleDsKPj4gKwllcC0+Y29udGV4dCA9ICZ4 dWRjLT5lcF9jb250ZXh0W2luZGV4XTsKPj4gKwlJTklUX0xJU1RfSEVBRCgmZXAtPnF1ZXVlKTsK Pj4gKwo+PiArCS8qCj4+ICsJICogRVAxIHdvdWxkIGJlIHRoZSBpbnB1dCBlbmRwb2ludCBjb3Jy ZXNwb25kaW5nIHRvIEVQMCwgYnV0IHNpbmNlCj4+ICsJICogRVAwIGlzIGJpLWRpcmVjdGlvbmFs LCBFUDEgaXMgdW51c2VkLgo+PiArCSAqLwo+PiArCWlmIChpbmRleCA9PSAxKQo+PiArCQlyZXR1 cm4gMDsKPj4gKwo+PiArCWVwLT50cmFuc2Zlcl9yaW5nID0gZG1hX3Bvb2xfYWxsb2MoeHVkYy0+ dHJhbnNmZXJfcmluZ19wb29sLAo+PiArCQkJCQkgICBHRlBfS0VSTkVMLAo+PiArCQkJCQkgICAm ZXAtPnRyYW5zZmVyX3JpbmdfcGh5cyk7Cj4+ICsJaWYgKCFlcC0+dHJhbnNmZXJfcmluZykKPj4g KwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4gKwlpZiAoaW5kZXgpIHsKPj4gKwkJc25wcmludGYo ZXAtPm5hbWUsIHNpemVvZihlcC0+bmFtZSksICJlcCV1JXMiLCBpbmRleCAvIDIsCj4+ICsJCQkg KGluZGV4ICUgMiA9PSAwKSA/ICJvdXQiIDogImluIik7Cj4+ICsJCWVwLT51c2JfZXAubmFtZSA9 IGVwLT5uYW1lOwo+PiArCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAtPnVzYl9lcCwg MTAyNCk7Cj4+ICsJCWVwLT51c2JfZXAubWF4X3N0cmVhbXMgPSAxNjsKPj4gKwkJZXAtPnVzYl9l cC5vcHMgPSAmdGVncmFfeHVkY19lcF9vcHM7Cj4+ICsJCWVwLT51c2JfZXAuY2Fwcy50eXBlX2J1 bGsgPSB0cnVlOwo+PiArCQllcC0+dXNiX2VwLmNhcHMudHlwZV9pbnQgPSB0cnVlOwo+PiArCQlp ZiAoaW5kZXggJiAxKQo+PiArCQkJZXAtPnVzYl9lcC5jYXBzLmRpcl9pbiA9IHRydWU7Cj4+ICsJ CWVsc2UKPj4gKwkJCWVwLT51c2JfZXAuY2Fwcy5kaXJfb3V0ID0gdHJ1ZTsKPj4gKwkJbGlzdF9h ZGRfdGFpbCgmZXAtPnVzYl9lcC5lcF9saXN0LCAmeHVkYy0+Z2FkZ2V0LmVwX2xpc3QpOwo+PiAr CX0gZWxzZSB7Cj4+ICsJCXN0cmNweShlcC0+bmFtZSwgImVwMCIpOwo+PiArCQllcC0+dXNiX2Vw Lm5hbWUgPSBlcC0+bmFtZTsKPj4gKwkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT51 c2JfZXAsIDY0KTsKPj4gKwkJZXAtPnVzYl9lcC5vcHMgPSAmdGVncmFfeHVkY19lcDBfb3BzOwo+ PiArCQllcC0+dXNiX2VwLmNhcHMudHlwZV9jb250cm9sID0gdHJ1ZTsKPj4gKwkJZXAtPnVzYl9l cC5jYXBzLmRpcl9pbiA9IHRydWU7Cj4+ICsJCWVwLT51c2JfZXAuY2Fwcy5kaXJfb3V0ID0gdHJ1 ZTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQg dGVncmFfeHVkY19mcmVlX2VwKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQg aW5kZXgpCj4+ICt7Cj4+ICsJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwID0gJnh1ZGMtPmVwW2lu ZGV4XTsKPj4gKwo+PiArCS8qCj4+ICsJICogRVAxIHdvdWxkIGJlIHRoZSBpbnB1dCBlbmRwb2lu dCBjb3JyZXNwb25kaW5nIHRvIEVQMCwgYnV0IHNpbmNlCj4+ICsJICogRVAwIGlzIGJpLWRpcmVj dGlvbmFsLCBFUDEgaXMgdW51c2VkLgo+PiArCSAqLwo+PiArCWlmIChpbmRleCA9PSAxKQo+PiAr CQlyZXR1cm47Cj4+ICsKPj4gKwlkbWFfcG9vbF9mcmVlKHh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9v bCwgZXAtPnRyYW5zZmVyX3JpbmcsCj4+ICsJCSAgICAgIGVwLT50cmFuc2Zlcl9yaW5nX3BoeXMp Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfYWxsb2NfZXBzKHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjKQo+PiArewo+PiArCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOwo+PiAr CXVuc2lnbmVkIGludCBpOwo+PiArCWludCBlcnI7Cj4+ICsKPj4gKwl4dWRjLT5lcF9jb250ZXh0 ID0KPj4gKwkJZG1hX3phbGxvY19jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfTlJfRVBTICoKPj4g KwkJCQkgICAgc2l6ZW9mKCp4dWRjLT5lcF9jb250ZXh0KSwKPj4gKwkJCQkgICAgJnh1ZGMtPmVw X2NvbnRleHRfcGh5cywgR0ZQX0tFUk5FTCk7Cj4+ICsJaWYgKCF4dWRjLT5lcF9jb250ZXh0KQo+ PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCXh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9vbCA9 Cj4+ICsJCWRtYW1fcG9vbF9jcmVhdGUoZGV2X25hbWUoeHVkYy0+ZGV2KSwgeHVkYy0+ZGV2LAo+ PiArCQkJCSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAqCj4+ICsJCQkJIHNpemVvZihzdHJ1Y3Qg dGVncmFfeHVkY190cmIpLAo+PiArCQkJCSBzaXplb2Yoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiKSwg MCk7Cj4+ICsJaWYgKCF4dWRjLT50cmFuc2Zlcl9yaW5nX3Bvb2wpIHsKPj4gKwkJZXJyID0gLUVO T01FTTsKPj4gKwkJZ290byBmcmVlX2VwX2NvbnRleHQ7Cj4+ICsJfQo+PiArCj4+ICsJSU5JVF9M SVNUX0hFQUQoJnh1ZGMtPmdhZGdldC5lcF9saXN0KTsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRSh4dWRjLT5lcCk7IGkrKykgewo+PiArCQllcnIgPSB0ZWdyYV94dWRjX2FsbG9jX2Vw KHh1ZGMsIGkpOwo+PiArCQlpZiAoZXJyIDwgMCkKPj4gKwkJCWdvdG8gZnJlZV9lcHM7Cj4+ICsJ fQo+PiArCj4+ICsJcmVxID0gdGVncmFfeHVkY19lcF9hbGxvY19yZXF1ZXN0KCZ4dWRjLT5lcFsw XS51c2JfZXAsIEdGUF9LRVJORUwpOwo+PiArCWlmICghcmVxKSB7Cj4+ICsJCWVyciA9IC1FTk9N RU07Cj4+ICsJCWdvdG8gZnJlZV9lcHM7Cj4+ICsJfQo+PiArCXh1ZGMtPmVwMF9yZXEgPSB0b194 dWRjX3JlcShyZXEpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICsKPj4gK2ZyZWVfZXBzOgo+PiAr CWZvciAoOyBpID4gMDsgaS0tKQo+PiArCQl0ZWdyYV94dWRjX2ZyZWVfZXAoeHVkYywgaSAtIDEp Owo+PiArZnJlZV9lcF9jb250ZXh0Ogo+PiArCWRtYV9mcmVlX2NvaGVyZW50KHh1ZGMtPmRldiwg WFVEQ19OUl9FUFMgKiBzaXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAo+PiArCQkJICB4dWRjLT5l cF9jb250ZXh0LCB4dWRjLT5lcF9jb250ZXh0X3BoeXMpOwo+PiArCXJldHVybiBlcnI7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaW5pdF9lcHMoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgbG93ZXJfMzJfYml0cyh4dWRj LT5lcF9jb250ZXh0X3BoeXMpLCBFQ1BMTyk7Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgdXBwZXJf MzJfYml0cyh4dWRjLT5lcF9jb250ZXh0X3BoeXMpLCBFQ1BISSk7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZnJlZV9lcHMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4+ ICt7Cj4+ICsJdW5zaWduZWQgaW50IGk7Cj4+ICsKPj4gKwl0ZWdyYV94dWRjX2VwX2ZyZWVfcmVx dWVzdCgmeHVkYy0+ZXBbMF0udXNiX2VwLAo+PiArCQkJCSAgICZ4dWRjLT5lcDBfcmVxLT51c2Jf cmVxKTsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsr KQo+PiArCQl0ZWdyYV94dWRjX2ZyZWVfZXAoeHVkYywgaSk7Cj4+ICsKPj4gKwlkbWFfZnJlZV9j b2hlcmVudCh4dWRjLT5kZXYsIFhVRENfTlJfRVBTICogc2l6ZW9mKCp4dWRjLT5lcF9jb250ZXh0 KSwKPj4gKwkJCSAgeHVkYy0+ZXBfY29udGV4dCwgeHVkYy0+ZXBfY29udGV4dF9waHlzKTsKPj4g K30KPj4gKwo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2FsbG9jX2V2ZW50X3Jpbmcoc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdW5zaWduZWQgaW50IGk7Cj4+ICsKPj4gKwlm b3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4dWRjLT5ldmVudF9yaW5nKTsgaSsrKSB7Cj4+ICsJ CXh1ZGMtPmV2ZW50X3JpbmdbaV0gPQo+PiArCQkJZG1hX2FsbG9jX2NvaGVyZW50KHh1ZGMtPmRl diwgWFVEQ19FVkVOVF9SSU5HX1NJWkUgKgo+PiArCQkJCQkgICBzaXplb2YoKnh1ZGMtPmV2ZW50 X3JpbmdbaV0pLAo+PiArCQkJCQkgICAmeHVkYy0+ZXZlbnRfcmluZ19waHlzW2ldLAo+PiArCQkJ CQkgICBHRlBfS0VSTkVMKTsKPj4gKwkJaWYgKCF4dWRjLT5ldmVudF9yaW5nW2ldKQo+PiArCQkJ Z290byBmcmVlX2RtYTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gKwo+PiArZnJlZV9k bWE6Cj4+ICsJZm9yICg7IGkgPiAwOyBpLS0pIHsKPj4gKwkJZG1hX2ZyZWVfY29oZXJlbnQoeHVk Yy0+ZGV2LCBYVURDX0VWRU5UX1JJTkdfU0laRSAqCj4+ICsJCQkJICBzaXplb2YoKnh1ZGMtPmV2 ZW50X3JpbmdbaSAtIDFdKSwKPj4gKwkJCQkgIHh1ZGMtPmV2ZW50X3JpbmdbaSAtIDFdLAo+PiAr CQkJCSAgeHVkYy0+ZXZlbnRfcmluZ19waHlzW2kgLSAxXSk7Cj4+ICsJfQo+PiArCXJldHVybiAt RU5PTUVNOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2luaXRfZXZlbnRf cmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwl1bnNpZ25lZCBpbnQgaTsK Pj4gKwl1MzIgdmFsOwo+PiArCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTUEFSQU0pOwo+ PiArCXZhbCAmPSB+KFNQQVJBTV9FUlNUTUFYX01BU0sgPDwgU1BBUkFNX0VSU1RNQVhfU0hJRlQp Owo+PiArCXZhbCB8PSBYVURDX05SX0VWRU5UX1JJTkdTIDw8IFNQQVJBTV9FUlNUTUFYX1NISUZU Owo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1BBUkFNKTsKPj4gKwo+PiArCWZvciAoaSA9 IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmV2ZW50X3JpbmcpOyBpKyspIHsKPj4gKwkJbWVtc2V0 KHh1ZGMtPmV2ZW50X3JpbmdbaV0sIDAsIFhVRENfRVZFTlRfUklOR19TSVpFICoKPj4gKwkJICAg ICAgIHNpemVvZigqeHVkYy0+ZXZlbnRfcmluZ1tpXSkpOwo+PiArCj4+ICsJCXZhbCA9IHh1ZGNf cmVhZGwoeHVkYywgRVJTVFNaKTsKPj4gKwkJdmFsICY9IH4oRVJTVFNaX0VSU1RYU1pfTUFTSyA8 PCBFUlNUU1pfRVJTVFhTWl9TSElGVChpKSk7Cj4+ICsJCXZhbCB8PSBYVURDX0VWRU5UX1JJTkdf U0laRSA8PCBFUlNUU1pfRVJTVFhTWl9TSElGVChpKTsKPj4gKwkJeHVkY193cml0ZWwoeHVkYywg dmFsLCBFUlNUU1opOwo+PiArCj4+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIGxvd2VyXzMyX2JpdHMo eHVkYy0+ZXZlbnRfcmluZ19waHlzW2ldKSwKPj4gKwkJCSAgICBFUlNUWEJBTE8oaSkpOwo+PiAr CQl4dWRjX3dyaXRlbCh4dWRjLCB1cHBlcl8zMl9iaXRzKHh1ZGMtPmV2ZW50X3JpbmdfcGh5c1tp XSksCj4+ICsJCQkgICAgRVJTVFhCQUhJKGkpKTsKPj4gKwl9Cj4+ICsKPj4gKwl2YWwgPSBsb3dl cl8zMl9iaXRzKHh1ZGMtPmV2ZW50X3JpbmdfcGh5c1swXSk7Cj4+ICsJeHVkY193cml0ZWwoeHVk YywgdmFsLCBFUkRQTE8pOwo+PiArCXZhbCB8PSBFUkVQTE9fRUNTOwo+PiArCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgRVJFUExPKTsKPj4gKwo+PiArCXZhbCA9IHVwcGVyXzMyX2JpdHMoeHVkYy0+ ZXZlbnRfcmluZ19waHlzWzBdKTsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVSRFBISSk7 Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUkVQSEkpOwo+PiArCj4+ICsJeHVkYy0+Y2Nz ID0gdHJ1ZTsKPj4gKwl4dWRjLT5ldmVudF9yaW5nX2luZGV4ID0gMDsKPj4gKwl4dWRjLT5ldmVu dF9yaW5nX2RlcV9wdHIgPSAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRj X2ZyZWVfZXZlbnRfcmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwl1bnNp Z25lZCBpbnQgaTsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmV2 ZW50X3JpbmcpOyBpKyspIHsKPj4gKwkJZG1hX2ZyZWVfY29oZXJlbnQoeHVkYy0+ZGV2LCBYVURD X0VWRU5UX1JJTkdfU0laRSAqCj4+ICsJCQkJICBzaXplb2YoKnh1ZGMtPmV2ZW50X3JpbmdbaV0p LAo+PiArCQkJCSAgeHVkYy0+ZXZlbnRfcmluZ1tpXSwKPj4gKwkJCQkgIHh1ZGMtPmV2ZW50X3Jp bmdfcGh5c1tpXSk7Cj4+ICsJfQo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRj X2ZwY2lfaXBmc19pbml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQo+PiArewo+PiArCXUzMiB2 YWw7Cj4+ICsKPj4gKwlpZiAoWFVEQ19JU19UMjEwKHh1ZGMpKSB7Cj4+ICsJCXZhbCA9IGlwZnNf cmVhZGwoeHVkYywgWFVTQl9ERVZfQ09ORklHVVJBVElPTl8wKTsKPj4gKwkJdmFsIHw9IFhVU0Jf REVWX0NPTkZJR1VSQVRJT05fMF9FTl9GUENJOwo+PiArCQlpcGZzX3dyaXRlbCh4dWRjLCB2YWws IFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMCk7Cj4+ICsJCXVkZWxheSgxMCk7Cj4+ICsJfQo+PiAr Cj4+ICsJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgKi8KPj4gKwl2YWwgPSBYVVNCX0RFVl9DRkdfMV9J T19TUEFDRV9FTiB8IFhVU0JfREVWX0NGR18xX01FTU9SWV9TUEFDRV9FTiB8Cj4+ICsJCVhVU0Jf REVWX0NGR18xX0JVU19NQVNURVJfRU47Cj4+ICsJZnBjaV93cml0ZWwoeHVkYywgdmFsLCBYVVNC X0RFVl9DRkdfMSk7Cj4+ICsKPj4gKwkvKiBQcm9ncmFtIEJBUjAgc3BhY2UgKi8KPj4gKwl2YWwg PSBmcGNpX3JlYWRsKHh1ZGMsIFhVU0JfREVWX0NGR180KTsKPj4gKwl2YWwgJj0gfihYVVNCX0RF Vl9DRkdfNF9CQVNFX0FERFJfTUFTSyA8PAo+PiArCQkgWFVTQl9ERVZfQ0ZHXzRfQkFTRV9BRERS X1NISUZUKTsKPj4gKwl2YWwgfD0geHVkYy0+cGh5c19iYXNlICYgKFhVU0JfREVWX0NGR180X0JB U0VfQUREUl9NQVNLIDw8Cj4+ICsJCQkJICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQp Owo+PiArCWZwY2lfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZfQ0ZHXzQpOwo+PiArCWZwY2lf d3JpdGVsKHh1ZGMsIHVwcGVyXzMyX2JpdHMoeHVkYy0+cGh5c19iYXNlKSwgWFVTQl9ERVZfQ0ZH XzUpOwo+PiArCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7Cj4+ICsKPj4gKwlpZiAoWFVEQ19JU19U MjEwKHh1ZGMpKSB7Cj4+ICsJCS8qIEVuYWJsZSBpbnRlcnJ1cHQgYXNzZXJ0aW9uICovCj4+ICsJ CXZhbCA9IGlwZnNfcmVhZGwoeHVkYywgWFVTQl9ERVZfSU5UUl9NQVNLXzApOwo+PiArCQl2YWwg fD0gWFVTQl9ERVZfSU5UUl9NQVNLXzBfSVBfSU5UX01BU0s7Cj4+ICsJCWlwZnNfd3JpdGVsKHh1 ZGMsIHZhbCwgWFVTQl9ERVZfSU5UUl9NQVNLXzApOwo+PiArCX0KPj4gK30KPj4gKwo+PiArc3Rh dGljIHZvaWQgdGVncmFfeHVkY19kZXZpY2VfcGFyYW1zX2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMg Knh1ZGMpCj4+ICt7Cj4+ICsJdTMyIHZhbCwgaW1vZDsKPj4gKwo+PiArCWlmIChYVURDX0lTX1Qy MTAoeHVkYykpIHsKPj4gKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBCTENHKTsKPj4gKwkJdmFs IHw9IEJMQ0dfQUxMOwo+PiArCQl2YWwgJj0gfihCTENHX0RGUENJIHwgQkxDR19VRlBDSSB8IEJM Q0dfRkUgfAo+PiArCQkJCUJMQ0dfQ09SRVBMTF9QV1JETik7Cj4+ICsJCXZhbCB8PSBCTENHX0lP UExMXzBfUFdSRE47Cj4+ICsJCXZhbCB8PSBCTENHX0lPUExMXzFfUFdSRE47Cj4+ICsJCXZhbCB8 PSBCTENHX0lPUExMXzJfUFdSRE47Cj4+ICsJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQkxDRyk7 Cj4+ICsJfQo+PiArCj4+ICsJLyogU2V0IGEgcmVhc29uYWJsZSBVMyBleGl0IHRpbWVyIHZhbHVl LiAqLwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQWF9DT1JFX1BBRENUTDQpOwo+PiAr CXZhbCAmPSB+KFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1UzX01BU0sgPDwK Pj4gKwkJIFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1UzX1NISUZUKTsKPj4g Kwl2YWwgfD0gMHg1ZGMwIDw8IFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1Uz X1NISUZUOwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX1BBRENUTDQpOwo+ PiArCj4+ICsJLyogRGVmYXVsdCBwaW5nIExGUFMgdEJ1cnN0IGlzIHRvbyBsYXJnZS4gKi8KPj4g Kwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFNTUFhfQ09SRV9DTlQwKTsKPj4gKwl2YWwgJj0gfihT U1BYX0NPUkVfQ05UMF9QSU5HX1RCVVJTVF9NQVNLIDw8Cj4+ICsJCSBTU1BYX0NPUkVfQ05UMF9Q SU5HX1RCVVJTVF9TSElGVCk7Cj4+ICsJdmFsIHw9IDB4YSA8PCBTU1BYX0NPUkVfQ05UMF9QSU5H X1RCVVJTVF9TSElGVDsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFNTUFhfQ09SRV9DTlQw KTsKPj4gKwo+PiArCS8qIERlZmF1bHQgdFBvcnRDb25maWd1cmF0aW9uIHRpbWVvdXQgaXMgdG9v IHNtYWxsLiAqLwo+PiArCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQWF9DT1JFX0NOVDMwKTsK Pj4gKwl2YWwgJj0gfihTU1BYX0NPUkVfQ05UMzBfTE1QSVRQX1RJTUVSX01BU0sgPDwKPj4gKwkJ IFNTUFhfQ09SRV9DTlQzMF9MTVBJVFBfVElNRVJfU0hJRlQpOwo+PiArCXZhbCB8PSAweDk3OCA8 PCBTU1BYX0NPUkVfQ05UMzBfTE1QSVRQX1RJTUVSX1NISUZUOwo+PiArCXh1ZGNfd3JpdGVsKHh1 ZGMsIHZhbCwgU1NQWF9DT1JFX0NOVDMwKTsKPj4gKwo+PiArCWlmIChscG1fZW5hYmxlKSB7Cj4+ ICsJCS8qIFNldCBMMSByZXN1bWUgZHVyYXRpb24gdG8gOTUgdXMuICovCj4+ICsJCXZhbCA9IHh1 ZGNfcmVhZGwoeHVkYywgSFNGU1BJX0NPVU5UMTMpOwo+PiArCQl2YWwgJj0gfihIU0ZTUElfQ09V TlQxM19VMl9SRVNVTUVfS19EVVJBVElPTl9NQVNLIDw8Cj4+ICsJCQkJSFNGU1BJX0NPVU5UMTNf VTJfUkVTVU1FX0tfRFVSQVRJT05fU0hJRlQpOwo+PiArCQl2YWwgfD0gMHgyYzg4IDw8IEhTRlNQ SV9DT1VOVDEzX1UyX1JFU1VNRV9LX0RVUkFUSU9OX1NISUZUOwo+PiArCQl4dWRjX3dyaXRlbCh4 dWRjLCB2YWwsIEhTRlNQSV9DT1VOVDEzKTsKPj4gKwl9Cj4+ICsKPj4gKwkvKgo+PiArCSAqIENv bXBsaWFjbmUgc3VpdGUgYXBwZWFycyB0byBiZSB2aW9sYXRpbmcgcG9sbGluZyBMRlBTIHRCdXJz dCBtYXgKPj4gKwkgKiBvZiAxLjR1cy4gIFNlbmQgMS40NXVzIGluc3RlYWQuCj4+ICsJICovCj4+ ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTU1BYX0NPUkVfQ05UMzIpOwo+PiArCXZhbCAmPSB+ KFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfTUFTSyA8PAo+PiArCQkgU1NQWF9DT1JF X0NOVDMyX1BPTExfVEJVUlNUX01BWF9TSElGVCk7Cj4+ICsJdmFsIHw9IDB4YjAgPDwgU1NQWF9D T1JFX0NOVDMyX1BPTExfVEJVUlNUX01BWF9TSElGVDsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2 YWwsIFNTUFhfQ09SRV9DTlQzMik7Cj4+ICsKPj4gKwkvKiBEaXJlY3QgSFMvRlMgcG9ydCBpbnN0 YW5jZSB0byBSeERldGVjdC4gKi8KPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENGR19ERVZf RkUpOwo+PiArCXZhbCAmPSB+KENGR19ERVZfRkVfUE9SVFJFR1NFTF9NQVNLIDw8IENGR19ERVZf RkVfUE9SVFJFR1NFTF9TSElGVCk7Cj4+ICsJdmFsIHw9IENGR19ERVZfRkVfUE9SVFJFR1NFTF9I U0ZTX1BJIDw8IENGR19ERVZfRkVfUE9SVFJFR1NFTF9TSElGVDsKPj4gKwl4dWRjX3dyaXRlbCh4 dWRjLCB2YWwsIENGR19ERVZfRkUpOwo+PiArCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQ T1JUU0MpOwo+PiArCXZhbCAmPSB+KFBPUlRTQ19DSEFOR0VfTUFTSyB8IChQT1JUU0NfUExTX01B U0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwo+PiArCXZhbCB8PSBQT1JUU0NfTFdTIHwgKFBPUlRT Q19QTFNfUlhERVRFQ1QgPDwgUE9SVFNDX1BMU19TSElGVCk7Cj4+ICsJeHVkY193cml0ZWwoeHVk YywgdmFsLCBQT1JUU0MpOwo+PiArCj4+ICsJLyogRGlyZWN0IFNTIHBvcnQgaW5zdGFuY2UgdG8g UnhEZXRlY3QuICovCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKPj4g Kwl2YWwgJj0gfihDRkdfREVWX0ZFX1BPUlRSRUdTRUxfTUFTSyA8PCBDRkdfREVWX0ZFX1BPUlRS RUdTRUxfU0hJRlQpOwo+PiArCXZhbCB8PSBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU1NfUEkgPDwg Q0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NISUZUOwo+PiArCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwg Q0ZHX0RFVl9GRSk7Cj4+ICsKPj4gKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7Cj4+ ICsJdmFsICY9IH4oUE9SVFNDX0NIQU5HRV9NQVNLIHwgKFBPUlRTQ19QTFNfTUFTSyA8PCBQT1JU U0NfUExTX1NISUZUKSk7Cj4+ICsJdmFsIHw9IFBPUlRTQ19MV1MgfCAoUE9SVFNDX1BMU19SWERF VEVDVCA8PCBQT1JUU0NfUExTX1NISUZUKTsKPj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBP UlRTQyk7Cj4+ICsKPj4gKwkvKiBSZXN0b3JlIHBvcnQgaW5zdGFuY2UuICovCj4+ICsJdmFsID0g eHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKPj4gKwl2YWwgJj0gfihDRkdfREVWX0ZFX1BP UlRSRUdTRUxfTUFTSyA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQpOwo+PiArCXh1ZGNf d3JpdGVsKHh1ZGMsIHZhbCwgQ0ZHX0RFVl9GRSk7Cj4+ICsKPj4gKwkvKgo+PiArCSAqIEVuYWJs ZSBJTkZJTklURV9TU19SRVRSWSB0byBwcmV2ZW50IGRldmljZSBmcm9tIGVudGVyaW5nCj4+ICsJ ICogRGlzYWJsZWQuRXJyb3Igd2hlbiBhdHRhY2hlZCB0byBidWdneSBTdXBlclNwZWVkIGh1YnMu Cj4+ICsJICovCj4+ICsJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKPj4gKwl2 YWwgfD0gQ0ZHX0RFVl9GRV9JTkZJTklURV9TU19SRVRSWTsKPj4gKwl4dWRjX3dyaXRlbCh4dWRj LCB2YWwsIENGR19ERVZfRkUpOwo+PiArCj4+ICsJLyogU2V0IGludGVycnVwdCBtb2RlcmF0aW9u LiAqLwo+PiArCWltb2QgPSBYVURDX0lOVEVSUlVQVF9NT0RFUkFUSU9OX1VTICogNDsKPj4gKwl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFJUX0lNT0QpOwo+PiArCXZhbCAmPSB+KChSVF9JTU9EX0lN T0RJX01BU0sgPDwgUlRfSU1PRF9JTU9ESV9TSElGVCkgfAo+PiArCQkgKFJUX0lNT0RfSU1PRENf TUFTSyA8PCBSVF9JTU9EX0lNT0RDX1NISUZUKSk7Cj4+ICsJdmFsIHw9IChpbW9kIDw8IFJUX0lN T0RfSU1PRElfU0hJRlQpIHwgKGltb2QgPDwgUlRfSU1PRF9JTU9EQ19TSElGVCk7Cj4+ICsJeHVk Y193cml0ZWwoeHVkYywgdmFsLCBSVF9JTU9EKTsKPj4gKwo+PiArCS8qIGluY3JlYXNlIFNTUEkg dHJhbnNhY3Rpb24gdGltZW91dCBmcm9tIDMydXMgdG8gNTEydXMgKi8KPj4gKwl2YWwgPSB4dWRj X3JlYWRsKHh1ZGMsIENGR19ERVZfU1NQSV9YRkVSKTsKPj4gKwl2YWwgJj0gfihDRkdfREVWX1NT UElfWEZFUl9BQ0tUSU1FT1VUX01BU0sgPDwKPj4gKwkJQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElN RU9VVF9TSElGVCk7Cj4+ICsJdmFsIHw9ICgweGYwMDAgJiBDRkdfREVWX1NTUElfWEZFUl9BQ0tU SU1FT1VUX01BU0spIDw8Cj4+ICsJCUNGR19ERVZfU1NQSV9YRkVSX0FDS1RJTUVPVVRfU0hJRlQ7 Cj4+ICsJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDRkdfREVWX1NTUElfWEZFUik7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19waHlfaW5pdChzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYykKPj4gK3sKPj4gKwlpbnQgZXJyOwo+PiArCj4+ICsJZXJyID0gcGh5X2luaXQoeHVkYy0+ dXRtaV9waHkpOwo+PiArCWlmIChlcnIgPCAwKQo+PiArCQlyZXR1cm4gZXJyOwo+PiArCWVyciA9 IHBoeV9pbml0KHh1ZGMtPnVzYjNfcGh5KTsKPj4gKwlpZiAoZXJyIDwgMCkKPj4gKwkJZ290byBl eGl0X3V0bWlfcGh5Owo+PiArCXJldHVybiAwOwo+PiArCj4+ICtleGl0X3V0bWlfcGh5Ogo+PiAr CXBoeV9leGl0KHh1ZGMtPnV0bWlfcGh5KTsKPj4gKwlyZXR1cm4gZXJyOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BoeV9leGl0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRj KQo+PiArewo+PiArCXBoeV9leGl0KHh1ZGMtPnVzYjNfcGh5KTsKPj4gKwlwaHlfZXhpdCh4dWRj LT51dG1pX3BoeSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19jbGtfaW5p dChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYg PSB4dWRjLT5kZXY7Cj4+ICsJaW50IHJldCA9IDA7Cj4+ICsJdW5zaWduZWQgaW50IGk7Cj4+ICsK Pj4gKwl4dWRjLT5udW1fY2xrcyA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zf bm9kZSwgImNsb2NrcyIsCj4+ICsJCQkJCQkgICAgIiNjbG9jay1jZWxscyIpOwo+PiArCWlmICh4 dWRjLT5udW1fY2xrcyA8PSAwKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPiAKPiBUaGUgZGV2aWNl IHRyZWUgYmluZGluZ3Mgc2hvdWxkIGNvbnRhaW5zIGFuIGV4cGxpY2l0IGxpc3Qgb2YgY2xvY2tz Cj4gcmVxdWlyZWQgYW5kIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHVzZSB0aGVtLiBTZWUgYWxzbyB0 aGUgY2xrX2J1bGtfKigpCj4gQVBJIHRvIGF2b2lkIG9wZW4tY29kaW5nIG1vc3Qgb2YgdGhlIGJl bG93Lgo+IApXaWxsIHVkcGF0ZQo+PiArCj4+ICsJeHVkYy0+Y2xrcyA9IGRldm1fa2NhbGxvYyhk ZXYsIHh1ZGMtPm51bV9jbGtzLCBzaXplb2YoKnh1ZGMtPmNsa3MpLAo+PiArCQkJCSAgR0ZQX0tF Uk5FTCk7Cj4+ICsJaWYgKCF4dWRjLT5jbGtzKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+ PiArCWZvciAoaSA9IDA7IGkgPCB4dWRjLT5udW1fY2xrczsgaSsrKSB7Cj4+ICsJCXh1ZGMtPmNs a3NbaV0gPSBvZl9jbGtfZ2V0KGRldi0+b2Zfbm9kZSwgaSk7Cj4+ICsJCWlmIChJU19FUlIoeHVk Yy0+Y2xrc1tpXSkpIHsKPj4gKwkJCXJldCA9IFBUUl9FUlIoeHVkYy0+Y2xrc1tpXSk7Cj4+ICsJ CQlnb3RvIGVycm9yOwo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICsKPj4g K2Vycm9yOgo+PiArCXdoaWxlIChpLS0pCj4+ICsJCWNsa19wdXQoeHVkYy0+Y2xrc1tpXSk7Cj4+ ICsJeHVkYy0+bnVtX2Nsa3MgPSAwOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+ PiArc3RhdGljIHZvaWQgdGVncmFfeHVkY19jbGtfZGVpbml0KHN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjKQo+PiArewo+PiArCXVuc2lnbmVkIGludCBpOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8 IHh1ZGMtPm51bV9jbGtzOyBpKyspCj4+ICsJCWNsa19wdXQoeHVkYy0+Y2xrc1tpXSk7Cj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19jbGtfZW5hYmxlKHN0cnVjdCB0ZWdyYV94 dWRjICp4dWRjKQo+PiArewo+PiArCXVuc2lnbmVkIGludCBpOwo+PiArCWludCByZXQgPSAwOwo+ PiArCj4+ICsJaWYgKHh1ZGMtPmNsa19lbmFibGVkKQo+PiArCQlyZXR1cm4gMDsKPj4gKwo+PiAr CWZvciAoaSA9IDA7IGkgPCB4dWRjLT5udW1fY2xrczsgaSsrKSB7Cj4+ICsJCXJldCA9IGNsa19w cmVwYXJlX2VuYWJsZSh4dWRjLT5jbGtzW2ldKTsKPj4gKwkJaWYgKHJldCkKPj4gKwkJCWdvdG8g ZXJyb3I7Cj4+ICsJfQo+PiArCj4+ICsJeHVkYy0+Y2xrX2VuYWJsZWQgPSB0cnVlOwo+PiArCj4+ ICsJcmV0dXJuIDA7Cj4+ICsKPj4gK2Vycm9yOgo+PiArCXdoaWxlIChpLS0pCj4+ICsJCWNsa19k aXNhYmxlX3VucHJlcGFyZSh4dWRjLT5jbGtzW2ldKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfY2xrX2Rpc2FibGUoc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJdW5zaWduZWQgaW50IGk7Cj4+ICsKPj4gKwlpZiAo IXh1ZGMtPmNsa19lbmFibGVkKQo+PiArCQlyZXR1cm47Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBp IDwgeHVkYy0+bnVtX2Nsa3M7IGkrKykKPj4gKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHh1ZGMt PmNsa3NbaV0pOwo+PiArCj4+ICsJeHVkYy0+Y2xrX2VuYWJsZWQgPSBmYWxzZTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZWdyYTIxMF94dWRjX3N1cHBseV9uYW1l c1tdID0gewo+PiArCSJodmRkX3VzYiIsCj4+ICsJImF2ZGRpb191c2IiLAo+PiArCSJhdmRkX3Bs bF91dG1pcCIsCj4gCj4gXyAtPiAtIGluIHRoZSBhYm92ZS4KPiAKV2lsbCB1ZHBhdGUKPj4gK307 Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgdGVncmFfeHVkY19zb2NfZGF0YSB0ZWdyYTIxMF94dWRj X3NvY19kYXRhID0gewo+PiArCS5kZXZpY2VfaWQgPSBYVURDX0RFVklDRV9JRF9UMjEwLAo+PiAr CS5zdXBwbHlfbmFtZXMgPSB0ZWdyYTIxMF94dWRjX3N1cHBseV9uYW1lcywKPj4gKwkubnVtX3N1 cHBsaWVzID0gQVJSQVlfU0laRSh0ZWdyYTIxMF94dWRjX3N1cHBseV9uYW1lcyksCj4+ICsJLnUx X2VuYWJsZSA9IGZhbHNlLAo+PiArCS51Ml9lbmFibGUgPSB0cnVlLAo+PiArCS5scG1fZW5hYmxl ID0gZmFsc2UsCj4+ICsJLmludmFsaWRfc2VxX251bSA9IHRydWUsCj4+ICsJLnBsc19xdWlyayA9 IHRydWUsCj4+ICsJLnBvcnRfcmVzZXRfcXVpcmsgPSB0cnVlLAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfeHVkY19vZl9tYXRjaFtdID0gewo+ PiArCXsKPj4gKwkJLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjEwLXh1ZGMiLAo+PiArCQku ZGF0YSA9ICZ0ZWdyYTIxMF94dWRjX3NvY19kYXRhCj4+ICsJfSwKPj4gKwl7IH0KPj4gK307Cj4+ ICtNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0ZWdyYV94dWRjX29mX21hdGNoKTsKPj4gKwo+PiAr c3RhdGljIHZvaWQgdGVncmFfeHVkY19wb3dlcmRvbWFpbl9yZW1vdmUoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCj4+ICt7Cj4+ICsJaWYgKHh1ZGMtPmdlbnBkX2RsX3NzKQo+PiArCQlkZXZpY2Vf bGlua19kZWwoeHVkYy0+Z2VucGRfZGxfc3MpOwo+PiArCWlmICh4dWRjLT5nZW5wZF9kbF9kZXZp Y2UpCj4+ICsJCWRldmljZV9saW5rX2RlbCh4dWRjLT5nZW5wZF9kbF9kZXZpY2UpOwo+PiArCWlm ICh4dWRjLT5nZW5wZF9kZXZfc3MpCj4+ICsJCWRldl9wbV9kb21haW5fZGV0YWNoKHh1ZGMtPmdl bnBkX2Rldl9zcywgdHJ1ZSk7Cj4+ICsJaWYgKHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UpCj4+ICsJ CWRldl9wbV9kb21haW5fZGV0YWNoKHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UsIHRydWUpOwo+PiAr fQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcG93ZXJkb21haW5faW5pdChzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB4dWRjLT5k ZXY7Cj4+ICsJaW50IGVycjsKPj4gKwo+PiArCXh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UgPSBkZXZf cG1fZG9tYWluX2F0dGFjaF9ieV9uYW1lKGRldiwKPj4gKwkJCQkJCQkJInh1c2JfZGV2aWNlIik7 Cj4gCj4gSSB0aG91Z2h0IHRoaXMgd2FzIGRvY3VtZW50ZWQgYXMgInh1c2JfZGV2IiBpbiB0aGUg YmluZGluZ3M/Cj4gCgpEb2N1bWVudGVkIGFzIHh1c2JfZGV2aWNlIG9ubHkKCj4+ICsJaWYgKElT X0VSUih4dWRjLT5nZW5wZF9kZXZfZGV2aWNlKSkgewo+PiArCQllcnIgPSBQVFJfRVJSKHh1ZGMt PmdlbnBkX2Rldl9kZXZpY2UpOwo+PiArCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgZGV2 aWNlIHBtLWRvbWFpbjogJWRcbiIsIGVycik7Cj4+ICsJCXJldHVybiBlcnI7Cj4+ICsJfQo+PiAr Cj4+ICsJeHVkYy0+Z2VucGRfZGV2X3NzID0gZGV2X3BtX2RvbWFpbl9hdHRhY2hfYnlfbmFtZShk ZXYsICJ4dXNiX3NzIik7Cj4+ICsJaWYgKElTX0VSUih4dWRjLT5nZW5wZF9kZXZfc3MpKSB7Cj4+ ICsJCWVyciA9IFBUUl9FUlIoeHVkYy0+Z2VucGRfZGV2X3NzKTsKPj4gKwkJZGV2X2VycihkZXYs ICJmYWlsZWQgdG8gZ2V0IHN1cGVyc3BlZWQgcG0tZG9tYWluOiAlZFxuIiwgZXJyKTsKPj4gKwkJ cmV0dXJuIGVycjsKPj4gKwl9Cj4+ICsKPj4gKwl4dWRjLT5nZW5wZF9kbF9kZXZpY2UgPSBkZXZp Y2VfbGlua19hZGQoZGV2LCB4dWRjLT5nZW5wZF9kZXZfZGV2aWNlLAo+PiArCQkJCQkgICAgICAg RExfRkxBR19QTV9SVU5USU1FIHwKPj4gKwkJCQkJICAgICAgIERMX0ZMQUdfU1RBVEVMRVNTKTsK Pj4gKwlpZiAoIXh1ZGMtPmdlbnBkX2RsX2RldmljZSkgewo+PiArCQlkZXZfZXJyKGRldiwgImFk ZGluZyB1c2IgZGV2aWNlIGRldmljZSBsaW5rIGZhaWxlZCFcbiIpOwo+PiArCQlyZXR1cm4gLUVO T0RFVjsKPj4gKwl9Cj4+ICsKPj4gKwl4dWRjLT5nZW5wZF9kbF9zcyA9IGRldmljZV9saW5rX2Fk ZChkZXYsIHh1ZGMtPmdlbnBkX2Rldl9zcywKPj4gKwkJCQkJICAgICBETF9GTEFHX1BNX1JVTlRJ TUUgfAo+PiArCQkJCQkgICAgIERMX0ZMQUdfU1RBVEVMRVNTKTsKPj4gKwlpZiAoIXh1ZGMtPmdl bnBkX2RsX3NzKSB7Cj4+ICsJCWRldl9lcnIoZGV2LCAiYWRkaW5nIHN1cGVyc3BlZWQgZGV2aWNl IGxpbmsgZmFpbGVkIVxuIik7Cj4+ICsJCXJldHVybiAtRU5PREVWOwo+PiArCX0KPj4gKwo+PiAr CXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sKPj4gKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2 aWNlX2lkICptYXRjaDsKPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKPj4gKwlzdHJ1Y3Qg cmVzb3VyY2UgKnJlczsKPj4gKwl1bnNpZ25lZCBpbnQgaTsKPj4gKwlpbnQgZXJyOwo+PiArCj4+ ICsJeHVkYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnh1ZGMpLCBHRlBfQVRP TUlDKTsKPj4gKwlpZiAoIXh1ZGMpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCXh1ZGMtPmRl diA9ICZwZGV2LT5kZXY7Cj4+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgeHVkYyk7Cj4+ ICsKPj4gKwltYXRjaCA9IG9mX21hdGNoX2RldmljZSh0ZWdyYV94dWRjX29mX21hdGNoLCAmcGRl di0+ZGV2KTsKPj4gKwlpZiAoIW1hdGNoKQo+PiArCQlyZXR1cm4gLUVOT0RFVjsKPj4gKwl4dWRj LT5zb2MgPSBtYXRjaC0+ZGF0YTsKPiAKPiBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoKT8gSWYg eW91IGRvIHRoYXQgeW8gY2FuIGFsc28gbW92ZSB0aGUKPiB0ZWdyYV94dWRjX29mX21hdGNoIHRh YmxlIHNvbWV3aGVyZSBiZWxvdyBhbmQgZG9uJ3QgbmVlZCB0byAicHJlZGVjbGFyZSIKPiBpdC4K PiAKV2lsbCB1ZHBhdGUKPj4gKwo+PiArCS8qIHNldCBtb2R1bGUgcGFyYW1ldGVyIGRlZmF1bHQg dmFsdWVzIGZyb20gc29jIGRhdGEgKi8KPj4gKwl1MV9lbmFibGUgPSB4dWRjLT5zb2MtPnUxX2Vu YWJsZTsKPj4gKwl1Ml9lbmFibGUgPSB4dWRjLT5zb2MtPnUyX2VuYWJsZTsKPj4gKwlscG1fZW5h YmxlID0geHVkYy0+c29jLT5scG1fZW5hYmxlOwo+PiArCj4+ICsJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKPj4gKwlpZiAoIXJlcykgewo+PiAr CQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlIDBcbiIpOwo+ PiArCQlyZXR1cm4gLUVOWElPOwo+PiArCX0KPiAKPiBObyBuZWVkIGZvciB0aGlzIGV4cGxpY2l0 IGVycm9yIGNoZWNrLCBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoKSBkb2VzIHRoYXQKPiBhbHJlYWR5 Lgo+IAp3aWxsIHJlbW92ZQo+PiArCXh1ZGMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2Uo JnBkZXYtPmRldiwgcmVzKTsKPj4gKwlpZiAoSVNfRVJSKHh1ZGMtPmJhc2UpKQo+PiArCQlyZXR1 cm4gUFRSX0VSUih4dWRjLT5iYXNlKTsKPj4gKwl4dWRjLT5waHlzX2Jhc2UgPSByZXMtPnN0YXJ0 Owo+PiArCj4+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0Vf TUVNLCAxKTsKPj4gKwlpZiAoIXJlcykgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxl ZCB0byBnZXQgbWVtIHJlc291cmNlIDFcbiIpOwo+PiArCQlyZXR1cm4gLUVOWElPOwo+PiArCX0K PiAKPiBTYW1lIGhlcmUuCj4gCldpbGwgcmVtb3ZlCj4+ICsJeHVkYy0+ZnBjaSA9IGRldm1faW9y ZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+PiArCWlmIChJU19FUlIoeHVkYy0+ZnBj aSkpCj4+ICsJCXJldHVybiBQVFJfRVJSKHh1ZGMtPmZwY2kpOwo+PiArCj4+ICsJaWYgKFhVRENf SVNfVDIxMCh4dWRjKSkgewo+PiArCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwg SU9SRVNPVVJDRV9NRU0sIDIpOwo+PiArCQlpZiAoIXJlcykgewo+PiArCQkJZGV2X2Vycih4dWRj LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZSAyXG4iKTsKPj4gKwkJCXJldHVybiAt RU5YSU87Cj4+ICsJCX0KPiAKPiBBbmQgaGVyZS4KPiAKV2lsbCByZW1vdmUKPj4gKwkJeHVkYy0+ aXBmcyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+PiArCQlpZiAo SVNfRVJSKHh1ZGMtPmlwZnMpKQo+PiArCQkJcmV0dXJuIFBUUl9FUlIoeHVkYy0+aXBmcyk7Cj4+ ICsJfQo+PiArCj4+ICsJeHVkYy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKPj4g KwlpZiAoeHVkYy0+aXJxIDwgMCkgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0 byBnZXQgaXJxIHJlc291cmNlIDA6ICVkXG4iLAo+PiArCQkJCXh1ZGMtPmlycSk7Cj4gCj4gaXJx IC0+IElSUSwgYW5kIEkgd291bGQgcHJvYmFibHkgbGVhdmUgb3V0ICJyZXNvdXJjZSAwIiwgYmVj YXVzZSB0aGVyZSdzCj4gb25seSBvbmUgSVJRIGhlcmUuCj4gCldpbGwgdWRwYXRlCj4+ICsJCXJl dHVybiB4dWRjLT5pcnE7Cj4+ICsJfQo+PiArCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYt PmRldiwgeHVkYy0+aXJxLCB0ZWdyYV94dWRjX2lycSwgMCwKPj4gKwkJCSAgICAgICBkZXZfbmFt ZSgmcGRldi0+ZGV2KSwgeHVkYyk7Cj4+ICsJaWYgKGVyciA8IDApIHsKPj4gKwkJZGV2X2Vycih4 dWRjLT5kZXYsICJmYWlsZWQgdG8gY2xhaW0gaXJxICVkXG4iLCBlcnIpOwo+IAo+IEkgZmluZCB0 aGVzZSBraW5kcyBvZiBlcnJvciBtZXNzYWdlcyBjb25mdXNpbmcuIFRvIG1lIHRoaXMgcmVhZHMg YXM6Cj4gCj4gCSJmYWlsZWQgdG8gY2xhaW0gSVJRICNkXG4iLCBlcnIKPiAKPiB3aGVyZWFzIGlu IHJlYWxpdHkgdGhpcyBtZWFuczoKPiAKPiAJImZhaWxlZCB0byBjbGFpbSBzb21lIElSUSB3aXRo IGVycm9yICVkXG4iLCBlcnIKPiAKPiBTbyBJJ2QgcmV3cml0ZSB0aGlzIGVycm9yIG1lc3NhZ2Ug YXM6Cj4gCj4gCSJmYWlsZWQgdG8gY2xhaW0gSVJRIyV1OiAlZFxuIiwgeHVkYy0+aXJxLCBlcnIK PiAKPiB0aGF0J3MgY29uc2lzdGVudCB3aXRoIHlvdXIgb3RoZXIgZXJyb3IgbWVzc2FnZXMgYWJv dmUuCj4gCldpbGwgdWRwYXRlIGFjY29yZGluZ2x5Cj4+ICsJCXJldHVybiBlcnI7Cj4+ICsJfQo+ PiArCj4+ICsJZXJyID0gdGVncmFfeHVkY19jbGtfaW5pdCh4dWRjKTsKPj4gKwlpZiAoZXJyIDwg MCkgewo+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBpbml0IGNsb2NrcyAlZFxu IiwgZXJyKTsKPj4gKwkJcmV0dXJuIGVycjsKPj4gKwl9Cj4+ICsKPj4gKwl4dWRjLT5zdXBwbGll cyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9zdXBwbGllcywKPj4g KwkJCQkgICAgICBzaXplb2YoKnh1ZGMtPnN1cHBsaWVzKSwgR0ZQX0tFUk5FTCk7Cj4+ICsJaWYg KCF4dWRjLT5zdXBwbGllcykKPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsJZm9yIChpID0gMDsg aSA8IHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzOyBpKyspCj4+ICsJCXh1ZGMtPnN1cHBsaWVzW2ld LnN1cHBseSA9IHh1ZGMtPnNvYy0+c3VwcGx5X25hbWVzW2ldOwo+PiArCWVyciA9IGRldm1fcmVn dWxhdG9yX2J1bGtfZ2V0KCZwZGV2LT5kZXYsIHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzLAo+PiAr CQkJCSAgICAgIHh1ZGMtPnN1cHBsaWVzKTsKPj4gKwlpZiAoZXJyKSB7Cj4+ICsJCWRldl9lcnIo eHVkYy0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgcmVndWxhdG9ycyAlZFxuIiwgZXJyKTsKPj4g KwkJcmV0dXJuIGVycjsKPj4gKwl9Cj4+ICsKPj4gKwl4dWRjLT5wYWRjdGwgPSB0ZWdyYV94dXNi X3BhZGN0bF9nZXQoJnBkZXYtPmRldik7Cj4+ICsJaWYgKElTX0VSUih4dWRjLT5wYWRjdGwpKQo+ PiArCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5wYWRjdGwpOwo+IAo+IEl0IHNlZW1zIGxpa2Ugd2Ug b25seSBuZWVkIHRoaXMgZm9yIHRoZSBWQlVTIG92ZXJyaWRlIGZ1bmN0aW9uYWxpdHkuIElmCj4g d2UgY2FuIGdldCByaWQgb2YgdGhhdCBieSBpbmNvcnBvcmF0aW5nIGl0IGludG8gcGh5IEFQSSBm dW5jdGlvbnMsIHdlCj4gY291bGQgcmVtb3ZlIHRoZSBuZWVkIHRvIGdldCBhIHJlZmVyZW5jZSB0 byBpdCBoZXJlLgo+IAoKQXMgbWVudGlvbmVkIGVhcmxpZXIsIHdlIG5lZWQgdGhpcyBmb3IgcG9y dCBvcGVyYXRpb25zCgo+PiArCj4+ICsJZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKHh1ZGMt PnNvYy0+bnVtX3N1cHBsaWVzLCB4dWRjLT5zdXBwbGllcyk7Cj4+ICsJaWYgKGVycikgewo+PiAr CQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9ycyAlZFxuIiwg ZXJyKTsKPj4gKwkJZ290byBwdXRfcGFkY3RsOwo+PiArCX0KPj4gKwo+PiArCXh1ZGMtPnVzYjNf cGh5ID0gZGV2bV9waHlfb3B0aW9uYWxfZ2V0KCZwZGV2LT5kZXYsICJ1c2IzIik7Cj4+ICsJaWYg KElTX0VSUih4dWRjLT51c2IzX3BoeSkpIHsKPj4gKwkJZXJyID0gUFRSX0VSUih4dWRjLT51c2Iz X3BoeSk7Cj4+ICsJCWlmIChlcnIgPT0gLUVQUk9CRV9ERUZFUikKPj4gKwkJCWRldl9pbmZvKHh1 ZGMtPmRldiwgInVzYjMgcGh5IGlzIG5vdCBhdmFpbGFibGUgeWV0XG4iKTsKPiAKPiBEb24ndCBw cmludCBhbiBlcnJvciBvbiBFUFJPQkVfREVGRVIsIHlvdSdsbCBqdXN0IG1ha2UgdGhlIGJvb3Qg bG9nIHZlcnkKPiBub2lzeS4KPiAKV2lsbCB1ZHBhdGUKPj4gKwkJZWxzZQo+PiArCQkJZGV2X2Vy cih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYjMgcGh5ICVkXG4iLCBlcnIpOwo+IAo+IFNh bWUgY29tbWVudCByZWdhcmRpbmcgZXJyb3IgbWVzc2FnZXMgYXMgZm9yIHBsYXRmb3JtX2dldF9p cnEoKSBlcnJvcgo+IGhhbmRsaW5nLgo+IApXaWxsIHVkcGF0ZQo+PiArCQlnb3RvIGRpc2FibGVf cmVndWxhdG9yOwo+PiArCX0KPj4gKwl4dWRjLT51dG1pX3BoeSA9IGRldm1fcGh5X29wdGlvbmFs X2dldCgmcGRldi0+ZGV2LCAidXNiMiIpOwo+PiArCWlmIChJU19FUlIoeHVkYy0+dXRtaV9waHkp KSB7Cj4+ICsJCWVyciA9IFBUUl9FUlIoeHVkYy0+dXRtaV9waHkpOwo+PiArCQlpZiAoZXJyID09 IC1FUFJPQkVfREVGRVIpCj4+ICsJCQlkZXZfaW5mbyh4dWRjLT5kZXYsICJ1c2IyIHBoeSBpcyBu b3QgYXZhaWxhYmxlIHlldFxuIik7Cj4+ICsJCWVsc2UKPj4gKwkJCWRldl9lcnIoeHVkYy0+ZGV2 LCAiZmFpbGVkIHRvIGdldCB1c2IyIHBoeSAlZFxuIiwgZXJyKTsKPiAKPiBTYW1lIGhlcmUuCj4g CldpbGwgdWRwYXRlCj4+ICsJCWdvdG8gZGlzYWJsZV9yZWd1bGF0b3I7Cj4+ICsJfQo+PiArCj4+ ICsJeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiA9IGV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlKCZw ZGV2LT5kZXYsIDApOwo+PiArCWlmIChJU19FUlIoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbikpIHsK Pj4gKwkJZXJyID0gUFRSX0VSUih4dWRjLT5kYXRhX3JvbGVfZXh0Y29uKTsKPj4gKwkJaWYgKGVy ciAhPSAtRVBST0JFX0RFRkVSKQo+PiArCQkJZGV2X2Vycih4dWRjLT5kZXYsCj4+ICsJCQkJImV4 dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlIGZhaWxlZCAlZFxuIiwKPj4gKwkJCQllcnIpOwo+PiAr CQlkZXZfZXJyKHh1ZGMtPmRldiwgImV4dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlIGZhaWxlZCAl ZFxuIiwKPj4gKwkJCQllcnIpOwo+IAo+IFNvIGZvciBldmVyeXRoaW5nIG90aGVyIHRoYW4gRVBS T0JFX0RFRkVSIHlvdSdsbCBwcmludCB0aGUgZXJyb3IgdHdpY2U/Cj4gCgpXaWxsIHN5bmMgd2l0 aCBwcmV2aW91cyBlcnJvciBtZXNzYWdlcwoKPj4gKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsK Pj4gKwl9Cj4+ICsKPj4gKwo+PiArCWVyciA9IHRlZ3JhX3h1ZGNfcG93ZXJkb21haW5faW5pdCh4 dWRjKTsKPj4gKwlpZiAoZXJyKQo+PiArCQlnb3RvIHB1dF9wb3dlcmRvbWFpbnM7Cj4+ICsKPj4g KwllcnIgPSB0ZWdyYV94dWRjX3BoeV9pbml0KHh1ZGMpOwo+PiArCWlmIChlcnIpIHsKPj4gKwkJ ZGV2X2Vycih4dWRjLT5kZXYsICJwaHkgaW5pdCBmYWlsZWQgJWRcbiIsIGVycik7Cj4+ICsJCWdv dG8gcHV0X3Bvd2VyZG9tYWluczsKPj4gKwl9Cj4gCj4gUGVyaGFwcyBpdCdkIGJlIGEgZ29vZCBp ZGVhIHRvIG1vdmUgdGhlIGVycm9yIG1lc3NhZ2UgaW50bwo+IHRlZ3JhX3h1ZGNfcGh5X2luaXQo KSBzbyB0aGF0IHlvdSBjYW4gcmVwb3J0IGV4YWN0bHkgd2hpY2ggUEhZIGZhaWxlZCB0bwo+IGlu aXRpYWxpemU/Cj4gCgpXaWxsIGRvCgo+PiArCj4+ICsJZXJyID0gdGVncmFfeHVkY19hbGxvY19l dmVudF9yaW5nKHh1ZGMpOwo+PiArCWlmIChlcnIpCj4+ICsJCWdvdG8gZGlzYWJsZV9waHk7Cj4+ ICsKPj4gKwllcnIgPSB0ZWdyYV94dWRjX2FsbG9jX2Vwcyh4dWRjKTsKPj4gKwlpZiAoZXJyKQo+ PiArCQlnb3RvIGZyZWVfZXZlbnRfcmluZzsKPj4gKwo+PiArCXNwaW5fbG9ja19pbml0KCZ4dWRj LT5sb2NrKTsKPj4gKwlpbml0X2NvbXBsZXRpb24oJnh1ZGMtPmRpc2Nvbm5lY3RfY29tcGxldGUp Owo+PiArCj4+ICsJSU5JVF9XT1JLKCZ4dWRjLT5kYXRhX3JvbGVfd29yaywgdGVncmFfeHVkY19k YXRhX3JvbGVfd29yayk7Cj4+ICsJeHVkYy0+ZGF0YV9yb2xlX25iLm5vdGlmaWVyX2NhbGwgPSB0 ZWdyYV94dWRjX2RhdGFfcm9sZV9ub3RpZmllcjsKPj4gKwlleHRjb25fcmVnaXN0ZXJfbm90aWZp ZXIoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09OX1VTQiwKPj4gKwkJCQkgJnh1ZGMtPmRh dGFfcm9sZV9uYik7Cj4+ICsKPj4gKwlJTklUX0RFTEFZRURfV09SSygmeHVkYy0+cGxjX3Jlc2V0 X3dvcmssIHRlZ3JhX3h1ZGNfcGxjX3Jlc2V0X3dvcmspOwo+PiArCj4+ICsJSU5JVF9ERUxBWUVE X1dPUksoJnh1ZGMtPnBvcnRfcmVzZXRfd2FyX3dvcmssCj4+ICsJCQkJdGVncmFfeHVkY19wb3J0 X3Jlc2V0X3dhcl93b3JrKTsKPj4gKwo+PiArCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYp Owo+PiArCj4+ICsJeHVkYy0+Z2FkZ2V0Lm9wcyA9ICZ0ZWdyYV94dWRjX2dhZGdldF9vcHM7Cj4+ ICsJeHVkYy0+Z2FkZ2V0LmVwMCA9ICZ4dWRjLT5lcFswXS51c2JfZXA7Cj4+ICsJeHVkYy0+Z2Fk Z2V0Lm5hbWUgPSAidGVncmEteHVkYyI7Cj4+ICsJeHVkYy0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVT Ql9TUEVFRF9TVVBFUjsKPj4gKwo+PiArCWVyciA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ ZGV2LCAmeHVkYy0+Z2FkZ2V0KTsKPj4gKwlpZiAoZXJyKSB7Cj4+ICsJCWRldl9lcnIoJnBkZXYt PmRldiwgImZhaWxlZCB0byB1c2JfYWRkX2dhZGdldF91ZGNcbiIpOwo+IAo+IEJldHRlciB0byB3 b3JkIGVycm9ycyBzdWNoIGFzIHRoaXMgYXM6Cj4gCj4gCSJmYWlsZWQgdG8gYWRkIFVTQiBnYWRn ZXQ6ICVkXG4iLCBlcnIKPiAKPiBBbmQgYWx3YXlzIG1ha2Ugc3VyZSB0byBpbmNsdWRlIGFuIGVy cm9yIGNvZGUgaW4gdGhlIGVycm9yIG1lc3NhZ2VzLAo+IHRoYXQgbWFrZXMgdGhpbmdzIGEgbG90 IGVhc2llciB0byBkZWJ1ZyBzaG91bGQgeW91IGV2ZXIgcnVuIGludG8gdGhpcy4KPiBUaGlzIGlz IG1heWJlIG5vdCBhcyBjcnVjaWFsIGlmIHlvdSdyZSBydW5uaW5nIGludG8gaXQgeW91cnNlbGYg YmVjYXVzZQo+IHlvdSBjYW4gbW9kaWZ5IHRoZSBjb2RlIGFuZCByZXByb2R1Y2UsIGJ1dCBpZiB1 c2VycyByZXBvcnQgYW4gZXJyb3IsIGl0Cj4gaXMgdGVkaW91cyBmb3IgdGhlbSB0byBoYXZlIHRv IHJlYnVpbGQgdGhlIGtlcm5lbCBvbmx5IHRvIGdldCBhdCB0aGUKPiBlcnJvci4gQmV0dGVyIHRv IG1ha2Ugc3VyZSB0aGUgZXJyb3IgY29kZSBpcyByZXBvcnRlZCBpbiB0aGUgZmlyc3QgcGxhY2UK PiBzbyB0aGF0IHRoaW5ncyBjYW4gYmUgbmFycm93ZWQgZG93bi4KPiAKClRoYW5rcyBmb3IgZGV0 YWlscywgd2lsbCB1cGRhdGUKCj4+ICsJCWdvdG8gZnJlZV9lcHM7Cj4+ICsJfQo+PiArCj4+ICsJ dGVncmFfeHVkY191cGRhdGVfZGF0YV9yb2xlKHh1ZGMpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ ICsKPj4gK2ZyZWVfZXBzOgo+PiArCXRlZ3JhX3h1ZGNfZnJlZV9lcHMoeHVkYyk7Cj4+ICtmcmVl X2V2ZW50X3Jpbmc6Cj4+ICsJdGVncmFfeHVkY19mcmVlX2V2ZW50X3JpbmcoeHVkYyk7Cj4+ICtk aXNhYmxlX3BoeToKPj4gKwl0ZWdyYV94dWRjX3BoeV9leGl0KHh1ZGMpOwo+PiArcHV0X3Bvd2Vy ZG9tYWluczoKPj4gKwl0ZWdyYV94dWRjX3Bvd2VyZG9tYWluX3JlbW92ZSh4dWRjKTsKPj4gK2Rp c2FibGVfcmVndWxhdG9yOgo+PiArCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoeHVkYy0+c29jLT5u dW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKPj4gK3B1dF9wYWRjdGw6Cj4+ICsJdGVncmFf eHVzYl9wYWRjdGxfcHV0KHh1ZGMtPnBhZGN0bCk7Cj4+ICsJdGVncmFfeHVkY19jbGtfZGVpbml0 KHh1ZGMpOwo+PiArCj4+ICsJcmV0dXJuIGVycjsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB0 ZWdyYV94dWRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+PiArewo+PiAr CXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Cj4+ ICsKPj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4+ICsKPj4gKwljYW5jZWxf ZGVsYXllZF93b3JrKCZ4dWRjLT5wbGNfcmVzZXRfd29yayk7Cj4+ICsJaWYgKHh1ZGMtPmRhdGFf cm9sZV9leHRjb24pIHsKPj4gKwkJZXh0Y29uX3VucmVnaXN0ZXJfbm90aWZpZXIoeHVkYy0+ZGF0 YV9yb2xlX2V4dGNvbiwgRVhUQ09OX1VTQiwKPj4gKwkJCQkmeHVkYy0+ZGF0YV9yb2xlX25iKTsK Pj4gKwkJY2FuY2VsX3dvcmtfc3luYygmeHVkYy0+ZGF0YV9yb2xlX3dvcmspOwo+PiArCX0KPj4g Kwl1c2JfZGVsX2dhZGdldF91ZGMoJnh1ZGMtPmdhZGdldCk7Cj4+ICsJdGVncmFfeHVkY19mcmVl X2Vwcyh4dWRjKTsKPj4gKwl0ZWdyYV94dWRjX2ZyZWVfZXZlbnRfcmluZyh4dWRjKTsKPj4gKwl0 ZWdyYV94dWRjX3Bvd2VyZG9tYWluX3JlbW92ZSh4dWRjKTsKPj4gKwo+PiArCXJlZ3VsYXRvcl9i dWxrX2Rpc2FibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKPj4g Kwo+PiArCXBoeV9wb3dlcl9vZmYoeHVkYy0+dXRtaV9waHkpOwo+PiArCXBoeV9wb3dlcl9vZmYo eHVkYy0+dXNiM19waHkpOwo+PiArCXRlZ3JhX3h1ZGNfcGh5X2V4aXQoeHVkYyk7Cj4+ICsJcG1f cnVudGltZV9kaXNhYmxlKHh1ZGMtPmRldik7Cj4+ICsJcG1fcnVudGltZV9wdXQoeHVkYy0+ZGV2 KTsKPj4gKwl0ZWdyYV94dWRjX2Nsa19kZWluaXQoeHVkYyk7Cj4+ICsKPj4gKwl0ZWdyYV94dXNi X3BhZGN0bF9wdXQoeHVkYy0+cGFkY3RsKTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiAr Cj4+ICsjaWYgSVNfRU5BQkxFRChDT05GSUdfUE1fU0xFRVApIHx8IElTX0VOQUJMRUQoQ09ORklH X1BNKQo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX3Bvd2VyZ2F0ZShzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYykKPj4gK3sKPj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCj4+ICsJZGV2X2lu Zm8oeHVkYy0+ZGV2LCAiZW50ZXJpbmcgRUxQR1xuIik7Cj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwl4dWRjLT5wb3dlcmdhdGVkID0gdHJ1ZTsKPj4gKwl4 dWRjLT5zYXZlZF9yZWdzLmN0cmwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOwo+PiArCXh1ZGMt PnNhdmVkX3JlZ3MucG9ydHBtID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOwo+PiArCXh1ZGNf d3JpdGVsKHh1ZGMsIDAsIENUUkwpOwo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMt PmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCXRlZ3JhX3h1ZGNfY2xrX2Rpc2FibGUoeHVkYyk7Cj4+ ICsJdGVncmFfcG93ZXJnYXRlX3Bvd2VyX29mZihURUdSQV9QT1dFUkdBVEVfWFVTQkEpOwo+PiAr CXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1 cHBsaWVzKTsKPj4gKwo+PiArCWRldl9pbmZvKHh1ZGMtPmRldiwgImVudGVyaW5nIEVMUEcgZG9u ZVxuIik7Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVk Y191bnBvd2VyZ2F0ZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPj4gK3sKPj4gKwl1bnNpZ25l ZCBsb25nIGZsYWdzOwo+PiArCWludCBlcnI7Cj4+ICsKPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYs ICJleGl0aW5nIEVMUEdcbiIpOwo+PiArCj4+ICsJZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxl KHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzLAo+PiArCQkJeHVkYy0+c3VwcGxpZXMpOwo+PiArCWlm IChlcnIgPCAwKQo+PiArCQlyZXR1cm4gZXJyOwo+PiArCj4+ICsKPj4gKwllcnIgPSB0ZWdyYV94 dWRjX2Nsa19lbmFibGUoeHVkYyk7Cj4+ICsJaWYgKGVyciA8IDApCj4+ICsJCXJldHVybiBlcnI7 Cj4+ICsKPj4gKwl0ZWdyYV94dWRjX2ZwY2lfaXBmc19pbml0KHh1ZGMpOwo+PiArCXRlZ3JhX3h1 ZGNfZGV2aWNlX3BhcmFtc19pbml0KHh1ZGMpOwo+PiArCj4+ICsJdGVncmFfeHVkY19pbml0X2V2 ZW50X3JpbmcoeHVkYyk7Cj4+ICsJdGVncmFfeHVkY19pbml0X2Vwcyh4dWRjKTsKPj4gKwo+PiAr CXh1ZGNfd3JpdGVsKHh1ZGMsIHh1ZGMtPnNhdmVkX3JlZ3MucG9ydHBtLCBQT1JUUE0pOwo+PiAr CXh1ZGNfd3JpdGVsKHh1ZGMsIHh1ZGMtPnNhdmVkX3JlZ3MuY3RybCwgQ1RSTCk7Cj4+ICsKPj4g KwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCXh1ZGMtPnBvd2Vy Z2F0ZWQgPSBmYWxzZTsKPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBm bGFncyk7Cj4+ICsKPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJleGl0aW5nIEVMUEcgZG9uZVxu Iik7Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsjZW5kaWYKPj4gKwo+PiArI2lmZGVmIENPTkZJ R19QTV9TTEVFUAo+PiArc3RhdGljIGludCB0ZWdyYV94dWRjX3N1c3BlbmQoc3RydWN0IGRldmlj ZSAqZGV2KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZGV2X2dldF9kcnZk YXRhKGRldik7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4gKwo+PiArCXNwaW5fbG9ja19p cnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsJeHVkYy0+c3VzcGVuZGVkID0gdHJ1ZTsK Pj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsKPj4g KwlpZiAoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbikKPj4gKwkJZmx1c2hfd29yaygmeHVkYy0+ZGF0 YV9yb2xlX3dvcmspOwo+PiArCj4+ICsJLyogRm9yY2libHkgZGlzY29ubmVjdCBiZWZvcmUgcG93 ZXJnYXRpbmcuICovCj4+ICsJdGVncmFfeHVkY19kZXZpY2VfbW9kZV9vZmYoeHVkYyk7Cj4+ICsK Pj4gKwlpZiAoIXBtX3J1bnRpbWVfc3RhdHVzX3N1c3BlbmRlZChkZXYpKQo+PiArCQl0ZWdyYV94 dWRjX3Bvd2VyZ2F0ZSh4dWRjKTsKPj4gKwo+PiArCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwo+ PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19y ZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4g KwlpbnQgZXJyOwo+PiArCj4+ICsJZXJyID0gdGVncmFfeHVkY191bnBvd2VyZ2F0ZSh4dWRjKTsK Pj4gKwlpZiAoZXJyIDwgMCkKPj4gKwkJcmV0dXJuIGVycjsKPj4gKwo+PiArCXNwaW5fbG9ja19p cnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsJeHVkYy0+c3VzcGVuZGVkID0gZmFsc2U7 Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+PiArCj4+ ICsJdGVncmFfeHVkY191cGRhdGVfZGF0YV9yb2xlKHh1ZGMpOwo+PiArCj4+ICsJcG1fcnVudGlt ZV9lbmFibGUoZGV2KTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArI2VuZGlmCj4+ICsK Pj4gKyNpZmRlZiBDT05GSUdfUE0KPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19ydW50aW1lX3N1 c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+PiArewo+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4g Kwo+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4+ICsJaWYgKFdB Uk5fT04oeHVkYy0+ZGV2aWNlX21vZGUpKSB7Cj4+ICsJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKPj4gKwkJcmV0dXJuIC1FQlVTWTsKPj4gKwl9Cj4+ICsJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+IAo+IFRoaXMgc2VlbXMg b3Zlcmx5IHJlc3RyaWN0aXZlLiBXaHkgcmVqZWN0IHN1c3BlbmQgbW9kZSB3aGVuIHdlJ3JlIGlu Cj4gZGV2aWNlIG1vZGU/Cj4gCj4gQWxzbywgaXQgc2VlbXMgdG8gbWUgbGlrZSB0aGVyZSByZWFs bHkgYXJlbid0IGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuCj4gc3lzdGVtIHNsZWVwIGFuZCBydW50 aW1lIFBNLCBzbyB3aHkgbm90IGp1c3QgbGVhdmUgYXdheSB0aGUgc3lzdGVtIHNsZWVwCj4gZnVu Y3Rpb25zIGFuZCBqdXN0IGxldCBydW50aW1lIFBNIGRlYWwgd2l0aCBldmVyeXRoaW5nPwo+IApE dXJpbmcgc3lzdGVtIHNsZWVwIHdlIGZvcmNlIG9mZiB0aGUgZGV2aWNlIG1vZGUgYW5kIG5vdCBp biBydW50aW1lIHN1c3BlbmQKYW5kIHZpY2V2ZXJzYSBkdXJpbmcgcmVzdW1lLCBpbiBydW50aW1l LCBpdHMgbW9yZSBvZiBwb3dlcmdhcmluZwo+IFRoaWVycnkKPiAKPj4gKwo+PiArCXJldHVybiB0 ZWdyYV94dWRjX3Bvd2VyZ2F0ZSh4dWRjKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB0ZWdy YV94dWRjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPj4gK3sKPj4gKwlzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+PiArCj4+ICsJcmV0 dXJuIHRlZ3JhX3h1ZGNfdW5wb3dlcmdhdGUoeHVkYyk7Cj4+ICt9Cj4+ICsjZW5kaWYKPj4gKwo+ PiArc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRlZ3JhX3h1ZGNfcG1fb3BzID0gewo+ PiArCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHRlZ3JhX3h1ZGNfc3VzcGVuZCwgdGVncmFfeHVk Y19yZXN1bWUpCj4+ICsJU0VUX1JVTlRJTUVfUE1fT1BTKHRlZ3JhX3h1ZGNfcnVudGltZV9zdXNw ZW5kLAo+PiArCQkJICAgdGVncmFfeHVkY19ydW50aW1lX3Jlc3VtZSwgTlVMTCkKPj4gK307Cj4+ ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3h1ZGNfZHJpdmVyID0g ewo+PiArCS5wcm9iZSA9IHRlZ3JhX3h1ZGNfcHJvYmUsCj4+ICsJLnJlbW92ZSA9IHRlZ3JhX3h1 ZGNfcmVtb3ZlLAo+PiArCS5kcml2ZXIgPSB7Cj4+ICsJCS5uYW1lID0gInRlZ3JhLXh1ZGMiLAo+ PiArCQkucG0gPSAmdGVncmFfeHVkY19wbV9vcHMsCj4+ICsJCS5vZl9tYXRjaF90YWJsZSA9IHRl Z3JhX3h1ZGNfb2ZfbWF0Y2gsCj4+ICsJfSwKPj4gK307Cj4+ICttb2R1bGVfcGxhdGZvcm1fZHJp dmVyKHRlZ3JhX3h1ZGNfZHJpdmVyKTsKPj4gKwo+PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJOVklE SUEgVGVncmEgWFVTQiBEZXZpY2UgQ29udHJvbGxlciIpOwo+PiArTU9EVUxFX0FVVEhPUigiQW5k cmV3IEJyZXN0aWNrZXIgPGFicmVzdGljQGNocm9taXVtLm9yZz4iKTsKPj4gK01PRFVMRV9BVVRI T1IoIkh1aSBGdSIpOwo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+PiAtLSAKPj4gMi43 LjQKPj4K