From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [RFC, v2, 5/9] hyper_dmabuf: default backend for XEN hypervisor Date: Tue, 10 Apr 2018 12:27:32 +0300 Message-ID: <590a9e6f-1e04-c832-5fd4-107af94d1ef7__28648.1873984032$1523352385$gmane$org@gmail.com> References: <20180214015008.9513-6-dongwon.kim@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1f5pYz-00074P-Cd for xen-devel@lists.xenproject.org; Tue, 10 Apr 2018 09:27:41 +0000 Received: by mail-lf0-x241.google.com with SMTP id c78-v6so10657924lfh.1 for ; Tue, 10 Apr 2018 02:27:36 -0700 (PDT) In-Reply-To: <20180214015008.9513-6-dongwon.kim@intel.com> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Dongwon Kim , linux-kernel@vger.kernel.org, linaro-mm-sig@lists.linaro.org, xen-devel@lists.xenproject.org Cc: mateuszx.potrola@intel.com, dri-devel@lists.freedesktop.org List-Id: xen-devel@lists.xenproject.org T24gMDIvMTQvMjAxOCAwMzo1MCBBTSwgRG9uZ3dvbiBLaW0gd3JvdGU6Cj4gRnJvbTogIk1hdHVl c3ogUG9scm9sYSIgPG1hdGV1c3p4LnBvdHJvbGFAaW50ZWwuY29tPgo+Cj4gVGhlIGRlZmF1bHQg YmFja2VuZCBmb3IgWEVOIGh5cGVydmlzb3IuIFRoaXMgYmFja2VuZCBjb250YWlucyBhY3R1YWwK PiBpbXBsZW1lbnRhdGlvbiBvZiBpbmRpdmlkdWFsIG1ldGhvZHMgZGVmaW5lZCBpbiAic3RydWN0 IGh5cGVyX2RtYWJ1Zl9ia25kX29wcyIKPiBkZWZpbmVkIGFzOgo+Cj4gc3RydWN0IGh5cGVyX2Rt YWJ1Zl9ia25kX29wcyB7Cj4gICAgICAgICAgLyogYmFja2VuZCBpbml0aWFsaXphdGlvbiByb3V0 aW5lIChvcHRpb25hbCkgKi8KPiAgICAgICAgICBpbnQgKCppbml0KSh2b2lkKTsKPgo+ICAgICAg ICAgIC8qIGJhY2tlbmQgY2xlYW51cCByb3V0aW5lIChvcHRpb25hbCkgKi8KPiAgICAgICAgICBp bnQgKCpjbGVhbnVwKSh2b2lkKTsKPgo+ICAgICAgICAgIC8qIHJldHJlaXZpbmcgaWQgb2YgY3Vy cmVudCB2aXJ0dWFsIG1hY2hpbmUgKi8KPiAgICAgICAgICBpbnQgKCpnZXRfdm1faWQpKHZvaWQp Owo+Cj4gICAgICAgICAgLyogZ2V0IHBhZ2VzIHNoYXJlZCB2aWEgaHlwZXJ2aXNvci1zcGVjaWZp YyBtZXRob2QgKi8KPiAgICAgICAgICBpbnQgKCpzaGFyZV9wYWdlcykoc3RydWN0IHBhZ2UgKios IGludCwgaW50LCB2b2lkICoqKTsKPgo+ICAgICAgICAgIC8qIG1ha2Ugc2hhcmVkIHBhZ2VzIHVu c2hhcmVkIHZpYSBoeXBlcnZpc29yIHNwZWNpZmljIG1ldGhvZCAqLwo+ICAgICAgICAgIGludCAo KnVuc2hhcmVfcGFnZXMpKHZvaWQgKiosIGludCk7Cj4KPiAgICAgICAgICAvKiBtYXAgcmVtb3Rl bHkgc2hhcmVkIHBhZ2VzIG9uIGltcG9ydGVyJ3Mgc2lkZSB2aWEKPiAgICAgICAgICAgKiBoeXBl cnZpc29yLXNwZWNpZmljIG1ldGhvZAo+ICAgICAgICAgICAqLwo+ICAgICAgICAgIHN0cnVjdCBw YWdlICoqICgqbWFwX3NoYXJlZF9wYWdlcykodW5zaWduZWQgbG9uZywgaW50LCBpbnQsIHZvaWQg KiopOwo+Cj4gICAgICAgICAgLyogdW5tYXAgYW5kIGZyZWUgc2hhcmVkIHBhZ2VzIG9uIGltcG9y dGVyJ3Mgc2lkZSB2aWEKPiAgICAgICAgICAgKiBoeXBlcnZpc29yLXNwZWNpZmljIG1ldGhvZAo+ ICAgICAgICAgICAqLwo+ICAgICAgICAgIGludCAoKnVubWFwX3NoYXJlZF9wYWdlcykodm9pZCAq KiwgaW50KTsKPgo+ICAgICAgICAgIC8qIGluaXRpYWxpemUgY29tbXVuaWNhdGlvbiBlbnZpcm9u bWVudCAqLwo+ICAgICAgICAgIGludCAoKmluaXRfY29tbV9lbnYpKHZvaWQpOwo+Cj4gICAgICAg ICAgdm9pZCAoKmRlc3Ryb3lfY29tbSkodm9pZCk7Cj4KPiAgICAgICAgICAvKiB1cHN0cmVhbSBj aCBzZXR1cCAocmVjZWl2aW5nIGFuZCByZXNwb25kaW5nKSAqLwo+ICAgICAgICAgIGludCAoKmlu aXRfcnhfY2gpKGludCk7Cj4KPiAgICAgICAgICAvKiBkb3duc3RyZWFtIGNoIHNldHVwICh0cmFu c21pdHRpbmcgYW5kIHBhcnNpbmcgcmVzcG9uc2VzKSAqLwo+ICAgICAgICAgIGludCAoKmluaXRf dHhfY2gpKGludCk7Cj4KPiAgICAgICAgICBpbnQgKCpzZW5kX3JlcSkoaW50LCBzdHJ1Y3QgaHlw ZXJfZG1hYnVmX3JlcSAqLCBpbnQpOwo+IH07Cj4KPiBGaXJzdCB0d28gbWV0aG9kcyBhcmUgZm9y IGV4dHJhIGluaXRpYWxpemF0aW9uIG9yIGNsZWFuaW5nIHVwIHBvc3NpYmx5Cj4gcmVxdWlyZWQg Zm9yIHRoZSBjdXJyZW50IEh5cGVydmlzb3IgKG9wdGlvbmFsKS4gVGhpcmQgbWV0aG9kCj4gKC5n ZXRfdm1faWQpIHByb3ZpZGVzIGEgd2F5IHRvIGdldCBjdXJyZW50IFZNJ3MgaWQsIHdoaWNoIHdp bGwgYmUgdXNlZAo+IGFzIGFuIGlkZW50aWNhdGlvbiBvZiBzb3VyY2UgVk0gb2Ygc2hhcmVkIGh5 cGVyX0RNQUJVRiBsYXRlci4KPgo+IEFsbCBvdGhlciBtZXRob2RzIGFyZSByZWxhdGVkIHRvIGVp dGhlciBtZW1vcnkgc2hhcmluZyBvciBpbnRlci1WTQo+IGNvbW11bmljYXRpb24sIHdoaWNoIGFy ZSBtaW5pbXVtIHJlcXVpcmVtZW50IGZvciBoeXBlcl9ETUFCVUYgZHJpdmVyLgo+IChCcmllZiBk ZXNjcmlwdGlvbiBvZiByb2xlIG9mIGVhY2ggbWV0aG9kIGlzIGVtYmVkZGVkIGFzIGEgY29tbWVu dCBpbiB0aGUKPiBkZWZpbml0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYWJvdmUgYW5kIGhlYWRlciBm aWxlLikKPgo+IEFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiBlYWNoIG9mIHRoZXNlIG1ldGhvZHMg c3BlY2lmaWMgdG8gWEVOIGlzIHVuZGVyCj4gYmFja2VuZHMveGVuLy4gVGhlaXIgbWFwcGluZ3Mg YXJlIGRvbmUgYXMgZm9sbG93ZWQ6Cj4KPiBzdHJ1Y3QgaHlwZXJfZG1hYnVmX2JrbmRfb3BzIHhl bl9ia25kX29wcyA9IHsKPiAgICAgICAgICAuaW5pdCA9IE5VTEwsIC8qIG5vdCBuZWVkZWQgZm9y IHhlbiAqLwo+ICAgICAgICAgIC5jbGVhbnVwID0gTlVMTCwgLyogbm90IG5lZWRlZCBmb3IgeGVu ICovCj4gICAgICAgICAgLmdldF92bV9pZCA9IHhlbl9iZV9nZXRfZG9taWQsCj4gICAgICAgICAg LnNoYXJlX3BhZ2VzID0geGVuX2JlX3NoYXJlX3BhZ2VzLAo+ICAgICAgICAgIC51bnNoYXJlX3Bh Z2VzID0geGVuX2JlX3Vuc2hhcmVfcGFnZXMsCj4gICAgICAgICAgLm1hcF9zaGFyZWRfcGFnZXMg PSAodm9pZCAqKXhlbl9iZV9tYXBfc2hhcmVkX3BhZ2VzLAo+ICAgICAgICAgIC51bm1hcF9zaGFy ZWRfcGFnZXMgPSB4ZW5fYmVfdW5tYXBfc2hhcmVkX3BhZ2VzLAo+ICAgICAgICAgIC5pbml0X2Nv bW1fZW52ID0geGVuX2JlX2luaXRfY29tbV9lbnYsCj4gICAgICAgICAgLmRlc3Ryb3lfY29tbSA9 IHhlbl9iZV9kZXN0cm95X2NvbW0sCj4gICAgICAgICAgLmluaXRfcnhfY2ggPSB4ZW5fYmVfaW5p dF9yeF9yYnVmLAo+ICAgICAgICAgIC5pbml0X3R4X2NoID0geGVuX2JlX2luaXRfdHhfcmJ1ZiwK PiAgICAgICAgICAuc2VuZF9yZXEgPSB4ZW5fYmVfc2VuZF9yZXEsCj4gfTsKPgo+IEEgc2VjdGlv biBmb3IgSHlwZXJ2aXNvciBCYWNrZW5kIGhhcyBiZWVuIGFkZGVkIHRvCj4KPiAiRG9jdW1lbnRh dGlvbi9oeXBlci1kbWFidWYtc2hhcmluZy50eHQiIGFjY29yZGluZ2x5Cj4KPiBTaWduZWQtb2Zm LWJ5OiBEb25nd29uIEtpbSA8ZG9uZ3dvbi5raW1AaW50ZWwuY29tPgo+IFNpZ25lZC1vZmYtYnk6 IE1hdGV1c3ogUG9scm9sYSA8bWF0ZXVzengucG90cm9sYUBpbnRlbC5jb20+Cj4gLS0tCj4gICBk cml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL0tjb25maWcgICAgICAgICAgICAgICB8ICAgNyAr Cj4gICBkcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL01ha2VmaWxlICAgICAgICAgICAgICB8 ICAgNyArCj4gICAuLi4vYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29tbS5jICAgICAg ICAgICB8IDk0MSArKysrKysrKysrKysrKysrKysrKysKPiAgIC4uLi9iYWNrZW5kcy94ZW4vaHlw ZXJfZG1hYnVmX3hlbl9jb21tLmggICAgICAgICAgIHwgIDc4ICsrCj4gICAuLi4vYmFja2VuZHMv eGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29tbV9saXN0LmMgICAgICB8IDE1OCArKysrCj4gICAuLi4v YmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29tbV9saXN0LmggICAgICB8ICA2NyArKwo+ ICAgLi4uL2JhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2Rydi5jICAgICAgICAgICAgfCAg NDYgKwo+ICAgLi4uL2JhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2Rydi5oICAgICAgICAg ICAgfCAgNTMgKysKPiAgIC4uLi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9zaG0uYyAg ICAgICAgICAgIHwgNTI1ICsrKysrKysrKysrKwo+ICAgLi4uL2JhY2tlbmRzL3hlbi9oeXBlcl9k bWFidWZfeGVuX3NobS5oICAgICAgICAgICAgfCAgNDYgKwo+ICAgZHJpdmVycy9kbWEtYnVmL2h5 cGVyX2RtYWJ1Zi9oeXBlcl9kbWFidWZfZHJ2LmMgICAgfCAgMTAgKwo+ICAgMTEgZmlsZXMgY2hh bmdlZCwgMTkzOCBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9k bWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9jb21tLmMK PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tl bmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2NvbW0uaAo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5f Y29tbV9saXN0LmMKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS1idWYvaHlwZXJf ZG1hYnVmL2JhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2NvbW1fbGlzdC5oCj4gICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4v aHlwZXJfZG1hYnVmX3hlbl9kcnYuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1h LWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fZHJ2LmgKPiAg IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tlbmRz L3hlbi9oeXBlcl9kbWFidWZfeGVuX3NobS5jCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9zaG0u aAo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvS2NvbmZpZyBi L2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvS2NvbmZpZwo+IGluZGV4IDVlYmY1MTZkNjVl Yi4uNjhmM2Q2Y2UyYzFmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFi dWYvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvS2NvbmZpZwo+ IEBAIC0yMCw0ICsyMCwxMSBAQCBjb25maWcgSFlQRVJfRE1BQlVGX1NZU0ZTCj4gICAKPiAgIAkg IFRoZSBsb2NhdGlvbiBvZiBzeXNmcyBpcyB1bmRlciAiLi4uLiIKPiAgIAo+ICtjb25maWcgSFlQ RVJfRE1BQlVGX1hFTgo+ICsgICAgICAgIGJvb2wgIkNvbmZpZ3VyZSBoeXBlcl9kbWFidWYgZm9y IFhFTiBoeXBlcnZpc29yIgo+ICsgICAgICAgIGRlZmF1bHQgeQpuPwo+ICsgICAgICAgIGRlcGVu ZHMgb24gSFlQRVJfRE1BQlVGICYmIFhFTiAmJiBYRU5GUwo+ICsgICAgICAgIGhlbHAKPiArICAg ICAgICAgIEVuYWJsaW5nIEh5cGVyX0RNQUJVRiBCYWNrZW5kIGZvciBYRU4gaHlwZXJ2aXNvcgo+ ICsKPiAgIGVuZG1lbnUKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1 Zi9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvTWFrZWZpbGUKPiBpbmRl eCAzOTA4NTIyYjM5NmEuLmI5YWI0ZWVjYTZmMiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2RtYS1i dWYvaHlwZXJfZG1hYnVmL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2Rt YWJ1Zi9NYWtlZmlsZQo+IEBAIC0xMCw2ICsxMCwxMyBAQCBpZm5lcSAoJChLRVJORUxSRUxFQVNF KSwpCj4gICAJCQkJIGh5cGVyX2RtYWJ1Zl9tc2cubyBcCj4gICAJCQkJIGh5cGVyX2RtYWJ1Zl9p ZC5vIFwKPiAgIAo+ICtpZmVxICgkKENPTkZJR19IWVBFUl9ETUFCVUZfWEVOKSwgeSkKPiArCSQo VEFSR0VUX01PRFVMRSktb2JqcyArPSBiYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9jb21t Lm8gXAo+ICsJCQkJIGJhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2NvbW1fbGlzdC5vIFwK PiArCQkJCSBiYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9zaG0ubyBcCj4gKwkJCQkgYmFj a2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fZHJ2Lm8KPiArZW5kaWYKPiArCj4gICBvYmotJChD T05GSUdfSFlQRVJfRE1BQlVGKSA6PSAkKFRBUkdFVF9NT0RVTEUpLm8KPiAgIAo+ICAgIyBJZiB3 ZSBhcmUgcnVubmluZyB3aXRob3V0IGtlcm5lbCBidWlsZCBzeXN0ZW0KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hl bl9jb21tLmMgYi9kcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tlbmRzL3hlbi9oeXBl cl9kbWFidWZfeGVuX2NvbW0uYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MDAwMDAwLi4zMGJjNGI2MzA0YWMKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9kbWEt YnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9jb21tLmMKPiBA QCAtMCwwICsxLDk0MSBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRlbCBDb3Jw b3JhdGlvbgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LAo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs dWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBt b2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwg RVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4g KyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENM QUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJ T04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9V VCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RI RVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ICsgKiBBdXRob3JzOgo+ ICsgKiAgICBEb25nd29uIEtpbSA8ZG9uZ3dvbi5raW1AaW50ZWwuY29tPgo+ICsgKiAgICBNYXRl dXN6IFBvbHJvbGEgPG1hdGV1c3p4LnBvdHJvbGFAaW50ZWwuY29tPgo+ICsgKgo+ICsgKi8KPiAr Cj4gKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ ICsjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5o Pgo+ICsjaW5jbHVkZSA8eGVuL2dyYW50X3RhYmxlLmg+Cj4gKyNpbmNsdWRlIDx4ZW4vZXZlbnRz Lmg+Cj4gKyNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+Cj4gKyNpbmNsdWRlIDxhc20veGVuL3BhZ2Uu aD4KPiArI2luY2x1ZGUgImh5cGVyX2RtYWJ1Zl94ZW5fY29tbS5oIgo+ICsjaW5jbHVkZSAiaHlw ZXJfZG1hYnVmX3hlbl9jb21tX2xpc3QuaCIKPiArI2luY2x1ZGUgIi4uLy4uL2h5cGVyX2RtYWJ1 Zl9kcnYuaCIKPiArCj4gK3N0YXRpYyBpbnQgZXhwb3J0X3JlcV9pZDsKY2FuIHdlIGF2b2lkIHRo aXM/Cj4gKwo+ICtzdHJ1Y3QgaHlwZXJfZG1hYnVmX3JlcSByZXFfcGVuZGluZyA9IHswfTsKPiAr Cj4gK3N0YXRpYyB2b2lkIHhlbl9nZXRfZG9taWRfZGVsYXllZChzdHJ1Y3Qgd29ya19zdHJ1Y3Qg KnVudXNlZCk7Cj4gK3N0YXRpYyB2b2lkIHhlbl9pbml0X2NvbW1fZW52X2RlbGF5ZWQoc3RydWN0 IHdvcmtfc3RydWN0ICp1bnVzZWQpOwo+ICsKPiArc3RhdGljIERFQ0xBUkVfREVMQVlFRF9XT1JL KGdldF92bV9pZF93b3JrLCB4ZW5fZ2V0X2RvbWlkX2RlbGF5ZWQpOwo+ICtzdGF0aWMgREVDTEFS RV9ERUxBWUVEX1dPUksoeGVuX2luaXRfY29tbV9lbnZfd29yaywgeGVuX2luaXRfY29tbV9lbnZf ZGVsYXllZCk7Cj4gKwo+ICsvKiBDcmVhdGVzIGVudHJ5IGluIHhlbiBzdG9yZSB0aGF0IHdpbGwg a2VlcCBkZXRhaWxzIG9mIGFsbAo+ICsgKiBleHBvcnRlciByaW5ncyBjcmVhdGVkIGJ5IHRoaXMg ZG9tYWluCj4gKyAqLwo+ICtzdGF0aWMgaW50IHhlbl9jb21tX3NldHVwX2RhdGFfZGlyKHZvaWQp Cj4gK3sKPiArCWNoYXIgYnVmWzI1NV07Cj4gKwo+ICsJc3ByaW50ZihidWYsICIvbG9jYWwvZG9t YWluLyVkL2RhdGEvaHlwZXJfZG1hYnVmIiwKPiArCQloeV9kcnZfcHJpdi0+ZG9taWQpOwpIZXJl IGFuZCBiZWxvdzogcGxlYXNlIGhhdmUgYSBzdHJpbmcgY29uc3RhbnQgZm9yIHRoYXQKPiArCj4g KwlyZXR1cm4geGVuYnVzX21rZGlyKFhCVF9OSUwsIGJ1ZiwgIiIpOwpQbGVhc2UgdGhpbmsgb2Yg dXBkYXRpbmcgWGVuQnVzIHdpdGggYSB0cmFuc2FjdGlvbiwgbm90IFhCVF9OSUwKPiArfQo+ICsK PiArLyogUmVtb3ZlcyBlbnRyeSBmcm9tIHhlbnN0b3JlIHdpdGggZXhwb3J0ZXIgcmluZyBkZXRh aWxzLgo+ICsgKiBPdGhlciBkb21haW5zIHRoYXQgaGFzIGNvbm5lY3RlZCB0byBhbnkgb2YgZXhw b3J0ZXIgcmluZ3MKPiArICogY3JlYXRlZCBieSB0aGlzIGRvbWFpbiwgd2lsbCBiZSBub3RpZmll ZCBhYm91dCByZW1vdmFsIG9mCj4gKyAqIHRoaXMgZW50cnkgYW5kIHdpbGwgdHJlYXQgdGhhdCBh cyBzaWduYWwgdG8gY2xlYW51cCBpbXBvcnRlcgo+ICsgKiByaW5ncyBjcmVhdGVkIGZvciB0aGlz IGRvbWFpbgo+ICsgKi8KPiArc3RhdGljIGludCB4ZW5fY29tbV9kZXN0cm95X2RhdGFfZGlyKHZv aWQpCj4gK3sKPiArCWNoYXIgYnVmWzI1NV07Cj4gKwo+ICsJc3ByaW50ZihidWYsICIvbG9jYWwv ZG9tYWluLyVkL2RhdGEvaHlwZXJfZG1hYnVmIiwKPiArCQloeV9kcnZfcHJpdi0+ZG9taWQpOwo+ ICsKPiArCXJldHVybiB4ZW5idXNfcm0oWEJUX05JTCwgYnVmLCAiIik7Cj4gK30KPiArCj4gKy8q IEFkZHMgeGVuc3RvcmUgZW50cmllcyB3aXRoIGRldGFpbHMgb2YgZXhwb3J0ZXIgcmluZyBjcmVh dGVkCj4gKyAqIGZvciBnaXZlbiByZW1vdGUgZG9tYWluLiBJdCByZXF1aXJlcyBzcGVjaWFsIGRh ZW1vbiBydW5uaW5nCndoYXQgaXMgdGhpcyBzcGVjaWFsIGRhZW1vbj8KPiArICogaW4gZG9tMCB0 byBtYWtlIHN1cmUgdGhhdCBnaXZlbiByZW1vdGUgZG9tYWluIHdpbGwgaGF2ZSByaWdodAo+ICsg KiBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhhdCBkYXRhLgo+ICsgKi8KPiArc3RhdGljIGludCB4 ZW5fY29tbV9leHBvc2VfcmluZ19kZXRhaWxzKGludCBkb21pZCwgaW50IHJkb21pZCwKPiArCQkJ CQlpbnQgZ3JlZiwgaW50IHBvcnQpCj4gK3sKPiArCWNoYXIgYnVmWzI1NV07Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCXNwcmludGYoYnVmLCAiL2xvY2FsL2RvbWFpbi8lZC9kYXRhL2h5cGVyX2RtYWJ1 Zi8lZCIsCj4gKwkJZG9taWQsIHJkb21pZCk7Cj4gKwo+ICsJcmV0ID0geGVuYnVzX3ByaW50ZihY QlRfTklMLCBidWYsICJncmVmaWQiLCAiJWQiLCBncmVmKTsKPiArCj4gKwlpZiAocmV0KSB7Cj4g KwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LApQbGVhc2UgZG8gbm90IHRvdWNoIGdsb2JhbCBo eV9kcnZfcHJpdiBkaXJlY3RseQo+ICsJCQkiRmFpbGVkIHRvIHdyaXRlIHhlbmJ1cyBlbnRyeSAl czogJWRcbiIsCj4gKwkJCWJ1ZiwgcmV0KTsKPiArCj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiAr Cj4gKwlyZXQgPSB4ZW5idXNfcHJpbnRmKFhCVF9OSUwsIGJ1ZiwgInBvcnQiLCAiJWQiLCBwb3J0 KTsKPiArCj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJ CQkiRmFpbGVkIHRvIHdyaXRlIHhlbmJ1cyBlbnRyeSAlczogJWRcbiIsCj4gKwkJCWJ1ZiwgcmV0 KTsKPiArCj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsK PiArLyoKPiArICogUXVlcmllcyBkZXRhaWxzIG9mIHJpbmcgZXhwb3NlZCBieSByZW1vdGUgZG9t YWluLgo+ICsgKi8KPiArc3RhdGljIGludCB4ZW5fY29tbV9nZXRfcmluZ19kZXRhaWxzKGludCBk b21pZCwgaW50IHJkb21pZCwKPiArCQkJCSAgICAgaW50ICpncmVmaWQsIGludCAqcG9ydCkKPiAr ewo+ICsJY2hhciBidWZbMjU1XTsKPiArCWludCByZXQ7Cj4gKwo+ICsJc3ByaW50ZihidWYsICIv bG9jYWwvZG9tYWluLyVkL2RhdGEvaHlwZXJfZG1hYnVmLyVkIiwKPiArCQlyZG9taWQsIGRvbWlk KTsKPiArCj4gKwlyZXQgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgYnVmLCAiZ3JlZmlkIiwgIiVk IiwgZ3JlZmlkKTsKWW91J2xsIGhhdmUgYSByYWNlIGNvbmRpdGlvbiBoZXJlIGFzIHlvdSBhcmUg bm90IHVzaW5nIHRyYW5zYWN0aW9ucywKc28geW91IG1pZ2h0IHJlYWQgcGFydGlhbCBkYXRhIGZy b20gWGVuQnVzCj4gKwo+ICsJaWYgKHJldCA8PSAwKSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJp di0+ZGV2LAo+ICsJCQkiRmFpbGVkIHRvIHJlYWQgeGVuYnVzIGVudHJ5ICVzOiAlZFxuIiwKPiAr CQkJYnVmLCByZXQpOwo+ICsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IHhl bmJ1c19zY2FuZihYQlRfTklMLCBidWYsICJwb3J0IiwgIiVkIiwgcG9ydCk7CkRpdHRvCj4gKwo+ ICsJaWYgKHJldCA8PSAwKSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQki RmFpbGVkIHRvIHJlYWQgeGVuYnVzIGVudHJ5ICVzOiAlZFxuIiwKPiArCQkJYnVmLCByZXQpOwo+ ICsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVybiAocmV0IDw9IDAgPyAxIDog MCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHhlbl9nZXRfZG9taWRfZGVsYXllZChzdHJ1Y3Qg d29ya19zdHJ1Y3QgKnVudXNlZCkKPiArewo+ICsJc3RydWN0IHhlbmJ1c190cmFuc2FjdGlvbiB4 YnQ7Cj4gKwlpbnQgZG9taWQsIHJldDsKPiArCj4gKwkvKiBzY2hlZHVsaW5nIGFub3RoZXIgaWYg ZHJpdmVyIGlzIHN0aWxsIHJ1bm5pbmcKPiArCSAqIGFuZCB4ZW5zdG9yZSBoYXMgbm90IGJlZW4g aW5pdGlhbGl6ZWQKPiArCSAqLwpQbGVhc2UgdGhpbmsgb2YgdXNpbmcgWGVuQnVzIGRyaXZlcnMg Zm9yIHRoaXMgKHN0cnVjdCB4ZW5idXNfZHJpdmVyKQpJdCBtaWdodCBhZGQgc29tZSBjb21wbGV4 aXR5IGluIHRoZSBiYWNrZW5kIChieSBkeW5hbWljYWxseSByZWdpc3RlcmluZy8KdW5yZWdpc3Rl cmluZyBYZW5CdXMgZHJpdmVyKSwgYnV0IHdpbGwgYWxzbyBsZXQgeW91IHJ1biBzdWNoIGNvZGUg YXMKeW91IGhhdmUgaGVyZSBzeW5jaHJvbm91c2x5LCBlLmcuIHNlZSBzdHJ1Y3QgeGVuYnVzX2Ry aXZlci5vdGhlcmVuZF9jaGFuZ2VkLgpUaGlzIHdheSB5b3UnbGwgYmUgYWJsZSB0byBpbXBsZW1l bnQgWGVuQnVzIHN0YXRlIG1hY2hpbmUgYXMgb3RoZXIgWGVuCmZyb250L2JhY2sgZHJpdmVycyBk by4KPiArCWlmIChsaWtlbHkoeGVuc3RvcmVkX3JlYWR5ID09IDApKSB7Cj4gKwkJZGV2X2RiZyho eV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiWGVuc3RvcmUgaXMgbm90IHJlYWR5IHlldC4gV2lsbCBy ZXRyeSBpbiA1MDBtc1xuIik7Cj4gKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZnZXRfdm1faWRf d29yaywgbXNlY3NfdG9famlmZmllcyg1MDApKTsKPiArCX0gZWxzZSB7Cj4gKwkJeGVuYnVzX3Ry YW5zYWN0aW9uX3N0YXJ0KCZ4YnQpOwo+ICsKc28sIGZvciBjb25zaXN0ZW5jeSwgcGxlYXNlIHVz ZSB0cmFuc2FjdGlvbnMgZXZlcnl3aGVyZQo+ICsJCXJldCA9IHhlbmJ1c19zY2FuZih4YnQsICJk b21pZCIsICIiLCAiJWQiLCAmZG9taWQpOwo+ICsKPiArCQlpZiAocmV0IDw9IDApCj4gKwkJCWRv bWlkID0gLTE7Cj4gKwo+ICsJCXhlbmJ1c190cmFuc2FjdGlvbl9lbmQoeGJ0LCAwKTsKPiArCj4g KwkJLyogdHJ5IGFnYWluIHNpbmNlIC0xIGlzIGFuIGludmFsaWQgaWQgZm9yIGRvbWFpbgo+ICsJ CSAqIChidXQgb25seSBpZiBkcml2ZXIgaXMgc3RpbGwgcnVubmluZykKPiArCQkgKi8KPiArCQlp ZiAodW5saWtlbHkoZG9taWQgPT0gLTEpKSB7Cj4gKwkJCWRldl9kYmcoaHlfZHJ2X3ByaXYtPmRl diwKPiArCQkJCSJkb21pZD09LTEgaXMgaW52YWxpZC4gV2lsbCByZXRyeSBpdCBpbiA1MDBtc1xu Iik7Cj4gKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZ2V0X3ZtX2lkX3dvcmssCj4gKwkJCQkJ ICAgICAgbXNlY3NfdG9famlmZmllcyg1MDApKTsKVGhpcyBkb2Vzbid0IHNlZW0gdG8gYmUgZGVz aWduZWQgcmlnaHQgYXMgeW91IG5lZWQgdG8gcG9sbCBmb3IgdmFsdWVzCmFuZCBoYXZlIHRoaXMg d29ya2VyCj4gKwkJfSBlbHNlIHsKPiArCQkJZGV2X2luZm8oaHlfZHJ2X3ByaXYtPmRldiwKPiAr CQkJCSAiU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBkb21pZCBmcm9tIFhlbnN0b3JlOiVkXG4iLAo+ ICsJCQkJIGRvbWlkKTsKPiArCQkJaHlfZHJ2X3ByaXYtPmRvbWlkID0gZG9taWQ7Cj4gKwkJfQo+ ICsJfQo+ICt9Cj4gKwo+ICtpbnQgeGVuX2JlX2dldF9kb21pZCh2b2lkKQo+ICt7Cj4gKwlzdHJ1 Y3QgeGVuYnVzX3RyYW5zYWN0aW9uIHhidDsKPiArCWludCBkb21pZDsKPiArCj4gKwlpZiAodW5s aWtlbHkoeGVuc3RvcmVkX3JlYWR5ID09IDApKSB7Cj4gKwkJeGVuX2dldF9kb21pZF9kZWxheWVk KE5VTEwpOwo+ICsJCXJldHVybiAtMTsKPiArCX0KPiArCj4gKwl4ZW5idXNfdHJhbnNhY3Rpb25f c3RhcnQoJnhidCk7Cj4gKwo+ICsJaWYgKCF4ZW5idXNfc2NhbmYoeGJ0LCAiZG9taWQiLCAiIiwg IiVkIiwgJmRvbWlkKSkKPiArCQlkb21pZCA9IC0xOwo+ICsKPiArCXhlbmJ1c190cmFuc2FjdGlv bl9lbmQoeGJ0LCAwKTsKPiArCj4gKwlyZXR1cm4gZG9taWQ7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgeGVuX2NvbW1fbmV4dF9yZXFfaWQodm9pZCkKPiArewo+ICsJZXhwb3J0X3JlcV9pZCsrOwo+ ICsJcmV0dXJuIGV4cG9ydF9yZXFfaWQ7Cj4gK30KPiArCj4gKy8qIEZvciBub3cgY2FjaGUgbGF0 YXN0IHJpbmdzIGFzIGdsb2JhbCB2YXJpYWJsZXMgVE9ETzoga2VlcCB0aGVtIGluIGxpc3QqLwo+ ICtzdGF0aWMgaXJxcmV0dXJuX3QgZnJvbnRfcmluZ19pc3IoaW50IGlycSwgdm9pZCAqaW5mbyk7 Cj4gK3N0YXRpYyBpcnFyZXR1cm5fdCBiYWNrX3JpbmdfaXNyKGludCBpcnEsIHZvaWQgKmluZm8p Owo+ICsKPiArLyogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhbnkg Y2hhbmdlIG9mIHhlbmJ1cyBwYXRoCj4gKyAqIGJlaW5nIHdhdGNoZWQuIFVzZWQgZm9yIGRldGVj dGluZyBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiByZW1vdGUKPiArICogZG9tYWluIGV4cG9ydGVy IHJpbmcuCklmIHlvdSBpbXBsZW1lbnQgeGVuYnVzX2RyaXZlci5vdGhlcmVuZF9jaGFuZ2VkIGFu ZApjb3JyZXNwb25kaW5nIHN0YXRlIG1hY2hpbmUgdGhpcyBtaWdodCBub3QgYmUgbmVlZGVkCj4g KyAqCj4gKyAqIFdoZW4gcmVtb3RlIGRvbWFpbidzIGV4cG9ydGVyIHJpbmcgd2lsbCBiZSBkZXRl Y3RlZCwgaW1wb3J0ZXIgcmluZwo+ICsgKiBvbiB0aGlzIGRvbWFpbiB3aWxsIGJlIGNyZWF0ZWQu Cj4gKyAqCj4gKyAqIFdoZW4gcmVtb3RlIGRvbWFpbidzIGV4cG9ydGVyIHJpbmcgZGVzdHJ1Y3Rp b24gd2lsbCBiZSBkZXRlY3RlZCBpdAo+ICsgKiB3aWxsIGNlbGFudXAgdGhpcyBkb21haW4gaW1w b3J0ZXIgcmluZy4KPiArICoKPiArICogRGVzdHJ1Y3Rpb24gY2FuIGJlIGNhdXNlZCBieSB1bmxv YWRpbmcgbW9kdWxlIGJ5IHJlbW90ZSBkb21haW4gb3IKPiArICogaXQncyBjcmFzaC9mb3JjZSBz aHV0ZG93bi4KPiArICovCj4gK3N0YXRpYyB2b2lkIHJlbW90ZV9kb21fZXhwb3J0ZXJfd2F0Y2hf Y2Ioc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCj4gKwkJCQkJIGNvbnN0IGNoYXIgKnBhdGgs IGNvbnN0IGNoYXIgKnRva2VuKQo+ICt7Cj4gKwlpbnQgcmRvbSwgcmV0Owo+ICsJdWludDMyX3Qg Z3JlZmlkLCBwb3J0Owo+ICsJc3RydWN0IHhlbl9jb21tX3J4X3JpbmdfaW5mbyAqcmluZ19pbmZv Owo+ICsKPiArCS8qIENoZWNrIHdoaWNoIGRvbWFpbiBoYXMgY2hhbmdlZCBpdHMgZXhwb3J0ZXIg cmluZ3MgKi8KPiArCXJldCA9IHNzY2FuZih3YXRjaC0+bm9kZSwgIi9sb2NhbC9kb21haW4vJWQv IiwgJnJkb20pOwo+ICsJaWYgKHJldCA8PSAwKQo+ICsJCXJldHVybjsKPiArCj4gKwkvKiBDaGVj ayBpZiB3ZSBoYXZlIGltcG9ydGVyIHJpbmcgZm9yIGdpdmVuIHJlbW90ZSBkb21haW4gYWxyZWFk eQo+ICsJICogY3JlYXRlZAo+ICsJICovCj4gKwlyaW5nX2luZm8gPSB4ZW5fY29tbV9maW5kX3J4 X3JpbmcocmRvbSk7Cj4gKwo+ICsJLyogVHJ5IHRvIHF1ZXJ5IHJlbW90ZSBkb21haW4gZXhwb3J0 ZXIgcmluZyBkZXRhaWxzIC0gaWYKPiArCSAqIHRoYXQgd2lsbCBmYWlsIGFuZCB3ZSBoYXZlIGlt cG9ydGVyIHJpbmcgdGhhdCBtZWFucyByZW1vdGUKPiArCSAqIGRvbWFpbnMgaGFzIGNsZWFudXAg aXRzIGV4cG9ydGVyIHJpbmcsIHNvIG91ciBpbXBvcnRlciByaW5nCj4gKwkgKiBpcyBubyBsb25n ZXIgdXNlZnVsLgo+ICsJICoKPiArCSAqIElmIHF1ZXJ5aW5nIGRldGFpbHMgd2lsbCBzdWNjZWVk IGFuZCB3ZSBkb24ndCBoYXZlIGltcG9ydGVyIHJpbmcsCj4gKwkgKiBpdCBtZWFucyB0aGF0IHJl bW90ZSBkb21haW4gaGFzIHNldHVwIGl0IGZvciB1cyBhbmQgd2Ugc2hvdWxkCj4gKwkgKiBjb25u ZWN0IHRvIGl0Lgo+ICsJICovCj4gKwo+ICsJcmV0ID0geGVuX2NvbW1fZ2V0X3JpbmdfZGV0YWls cyh4ZW5fYmVfZ2V0X2RvbWlkKCksCj4gKwkJCQkJcmRvbSwgJmdyZWZpZCwgJnBvcnQpOwo+ICsK PiArCWlmIChyaW5nX2luZm8gJiYgcmV0ICE9IDApIHsKPiArCQlkZXZfaW5mbyhoeV9kcnZfcHJp di0+ZGV2LAo+ICsJCQkgIlJlbW90ZSBleHBvcnRlciBjbG9zZWQsIGNsZWFuaW51cCBpbXBvcnRl clxuIik7Cj4gKwkJeGVuX2JlX2NsZWFudXBfcnhfcmJ1ZihyZG9tKTsKPiArCX0gZWxzZSBpZiAo IXJpbmdfaW5mbyAmJiByZXQgPT0gMCkgewo+ICsJCWRldl9pbmZvKGh5X2Rydl9wcml2LT5kZXYs Cj4gKwkJCSAiUmVnaXN0ZXJpbmcgaW1wb3J0ZXJcbiIpOwo+ICsJCXhlbl9iZV9pbml0X3J4X3Ji dWYocmRvbSk7Cj4gKwl9Cj4gK30KPiArCj4gKy8qIGV4cG9ydGVyIG5lZWRzIHRvIGdlbmVyYXRl ZCBpbmZvIGZvciBwYWdlIHNoYXJpbmcgKi8KPiAraW50IHhlbl9iZV9pbml0X3R4X3JidWYoaW50 IGRvbWlkKQo+ICt7Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fdHhfcmluZ19pbmZvICpyaW5nX2luZm87 Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fc3JpbmcgKnNyaW5nOwo+ICsJc3RydWN0IGV2dGNobl9hbGxv Y191bmJvdW5kIGFsbG9jX3VuYm91bmQ7Cj4gKwlzdHJ1Y3QgZXZ0Y2huX2Nsb3NlIGNsb3NlOwo+ ICsKPiArCXZvaWQgKnNoYXJlZF9yaW5nOwo+ICsJaW50IHJldDsKPiArCj4gKwkvKiBjaGVjayBp ZiB0aGVyZSdzIGFueSBleGlzdGluZyB0eCBjaGFubmVsIGluIHRoZSB0YWJsZSAqLwo+ICsJcmlu Z19pbmZvID0geGVuX2NvbW1fZmluZF90eF9yaW5nKGRvbWlkKTsKPiArCj4gKwlpZiAocmluZ19p bmZvKSB7Cj4gKwkJZGV2X2luZm8oaHlfZHJ2X3ByaXYtPmRldiwKPiArCQkJICJ0eCByaW5nIGNo IHRvIGRvbWlkID0gJWQgYWxyZWFkeSBleGlzdFxuZ3JlZiA9ICVkLCBwb3J0ID0gJWRcbiIsCj4g KwkJcmluZ19pbmZvLT5yZG9tYWluLCByaW5nX2luZm8tPmdyZWZfcmluZywgcmluZ19pbmZvLT5w b3J0KTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlyaW5nX2luZm8gPSBrbWFsbG9jKHNp emVvZigqcmluZ19pbmZvKSwgR0ZQX0tFUk5FTCk7Cj4gKwo+ICsJaWYgKCFyaW5nX2luZm8pCj4g KwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJLyogZnJvbSBleHBvcnRlciB0byBpbXBvcnRlciAq Lwo+ICsJc2hhcmVkX3JpbmcgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwg MSk7Cj4gKwlpZiAoc2hhcmVkX3JpbmcgPT0gMCkgewo+ICsJCWtmcmVlKHJpbmdfaW5mbyk7Cj4g KwkJcmV0dXJuIC1FTk9NRU07Cj4gKwl9Cj4gKwo+ICsJc3JpbmcgPSAoc3RydWN0IHhlbl9jb21t X3NyaW5nICopIHNoYXJlZF9yaW5nOwo+ICsKPiArCVNIQVJFRF9SSU5HX0lOSVQoc3JpbmcpOwo+ ICsKPiArCUZST05UX1JJTkdfSU5JVCgmKHJpbmdfaW5mby0+cmluZ19mcm9udCksIHNyaW5nLCBQ QUdFX1NJWkUpOwo+ICsKPiArCXJpbmdfaW5mby0+Z3JlZl9yaW5nID0gZ250dGFiX2dyYW50X2Zv cmVpZ25fYWNjZXNzKGRvbWlkLAo+ICsJCQkJCQl2aXJ0X3RvX21mbihzaGFyZWRfcmluZyksCj4g KwkJCQkJCTApOwo+ICsJaWYgKHJpbmdfaW5mby0+Z3JlZl9yaW5nIDwgMCkgewo+ICsJCS8qIGZh aWwgdG8gZ2V0IGdyZWYgKi8KPiArCQlrZnJlZShyaW5nX2luZm8pOwo+ICsJCXJldHVybiAtRUZB VUxUOwo+ICsJfQo+ICsKPiArCWFsbG9jX3VuYm91bmQuZG9tID0gRE9NSURfU0VMRjsKPiArCWFs bG9jX3VuYm91bmQucmVtb3RlX2RvbSA9IGRvbWlkOwo+ICsJcmV0ID0gSFlQRVJWSVNPUl9ldmVu dF9jaGFubmVsX29wKEVWVENITk9QX2FsbG9jX3VuYm91bmQsCj4gKwkJCQkJICAmYWxsb2NfdW5i b3VuZCk7ClBsZWFzZSBkbyBub3Qgb3Blbi1jb2RlOiB4ZW5idXNfYWxsb2NfZXZ0Y2huCj4gKwlp ZiAocmV0KSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiQ2Fubm90IGFs bG9jYXRlIGV2ZW50IGNoYW5uZWxcbiIpOwo+ICsJCWtmcmVlKHJpbmdfaW5mbyk7Cj4gKwkJcmV0 dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJLyogc2V0dGluZyB1cCBpbnRlcnJ1cHQgKi8KPiArCXJl dCA9IGJpbmRfZXZ0Y2huX3RvX2lycWhhbmRsZXIoYWxsb2NfdW5ib3VuZC5wb3J0LAo+ICsJCQkJ CWZyb250X3JpbmdfaXNyLCAwLAo+ICsJCQkJCU5VTEwsICh2b2lkICopIHJpbmdfaW5mbyk7Cj4g Kwo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJ CSJGYWlsZWQgdG8gc2V0dXAgZXZlbnQgY2hhbm5lbFxuIik7Cj4gKwkJY2xvc2UucG9ydCA9IGFs bG9jX3VuYm91bmQucG9ydDsKPiArCQlIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hO T1BfY2xvc2UsICZjbG9zZSk7ClBsZWFzZSBkbyBub3Qgb3Blbi1jb2RlOiB4ZW5idXNfZnJlZV9l dnRjaG4KPiArCQlnbnR0YWJfZW5kX2ZvcmVpZ25fYWNjZXNzKHJpbmdfaW5mby0+Z3JlZl9yaW5n LCAwLAo+ICsJCQkJCXZpcnRfdG9fbWZuKHNoYXJlZF9yaW5nKSk7Cj4gKwkJa2ZyZWUocmluZ19p bmZvKTsKPiArCQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwlyaW5nX2luZm8tPnJkb21haW4g PSBkb21pZDsKPiArCXJpbmdfaW5mby0+aXJxID0gcmV0Owo+ICsJcmluZ19pbmZvLT5wb3J0ID0g YWxsb2NfdW5ib3VuZC5wb3J0Owo+ICsKPiArCW11dGV4X2luaXQoJnJpbmdfaW5mby0+bG9jayk7 Cj4gKwo+ICsJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCSIlczogYWxsb2NhdGVkIGV2 ZW50Y2hhbm5lbCBncmVmICVkICBwb3J0OiAlZCAgaXJxOiAlZFxuIiwKPiArCQlfX2Z1bmNfXywK PiArCQlyaW5nX2luZm8tPmdyZWZfcmluZywKPiArCQlyaW5nX2luZm8tPnBvcnQsCj4gKwkJcmlu Z19pbmZvLT5pcnEpOwo+ICsKPiArCXJldCA9IHhlbl9jb21tX2FkZF90eF9yaW5nKHJpbmdfaW5m byk7Cj4gKwpBbmQgd2hhdCBpZiB3ZSBmYWlsPwo+ICsJcmV0ID0geGVuX2NvbW1fZXhwb3NlX3Jp bmdfZGV0YWlscyh4ZW5fYmVfZ2V0X2RvbWlkKCksCj4gKwkJCQkJICAgZG9taWQsCj4gKwkJCQkJ ICAgcmluZ19pbmZvLT5ncmVmX3JpbmcsCj4gKwkJCQkJICAgcmluZ19pbmZvLT5wb3J0KTsKPiAr Cj4gKwkvKiBSZWdpc3RlciB3YXRjaCBmb3IgcmVtb3RlIGRvbWFpbiBleHBvcnRlciByaW5nLgo+ ICsJICogV2hlbiByZW1vdGUgZG9tYWluIHdpbGwgc2V0dXAgaXRzIGV4cG9ydGVyIHJpbmcsCj4g KwkgKiB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkgY29ubmVjdCBvdXIgaW1wb3J0ZXIgcmluZyB0byBp dC4KPiArCSAqLwo+ICsJcmluZ19pbmZvLT53YXRjaC5jYWxsYmFjayA9IHJlbW90ZV9kb21fZXhw b3J0ZXJfd2F0Y2hfY2I7Cj4gKwlyaW5nX2luZm8tPndhdGNoLm5vZGUgPSBrbWFsbG9jKDI1NSwg R0ZQX0tFUk5FTCk7Cj4gKwo+ICsJaWYgKCFyaW5nX2luZm8tPndhdGNoLm5vZGUpIHsKPiArCQlr ZnJlZShyaW5nX2luZm8pOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ICsKPiArCXNwcmlu dGYoKGNoYXIgKilyaW5nX2luZm8tPndhdGNoLm5vZGUsCj4gKwkJIi9sb2NhbC9kb21haW4vJWQv ZGF0YS9oeXBlcl9kbWFidWYvJWQvcG9ydCIsCj4gKwkJZG9taWQsIHhlbl9iZV9nZXRfZG9taWQo KSk7Cj4gKwo+ICsJcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZyaW5nX2luZm8tPndhdGNoKTsKPiAr Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKiBjbGVhbnMgdXAgZXhwb3J0ZXIgcmluZyBj cmVhdGVkIGZvciBnaXZlbiByZW1vdGUgZG9tYWluICovCj4gK3ZvaWQgeGVuX2JlX2NsZWFudXBf dHhfcmJ1ZihpbnQgZG9taWQpCj4gK3sKPiArCXN0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2luZm8g KnJpbmdfaW5mbzsKPiArCXN0cnVjdCB4ZW5fY29tbV9yeF9yaW5nX2luZm8gKnJ4X3JpbmdfaW5m bzsKPiArCj4gKwkvKiBjaGVjayBpZiB3ZSBhdCBhbGwgaGF2ZSBleHBvcnRlciByaW5nIGZvciBn aXZlbiByZG9tYWluICovCj4gKwlyaW5nX2luZm8gPSB4ZW5fY29tbV9maW5kX3R4X3JpbmcoZG9t aWQpOwo+ICsKPiArCWlmICghcmluZ19pbmZvKQo+ICsJCXJldHVybjsKPiArCj4gKwl4ZW5fY29t bV9yZW1vdmVfdHhfcmluZyhkb21pZCk7Cj4gKwo+ICsJdW5yZWdpc3Rlcl94ZW5idXNfd2F0Y2go JnJpbmdfaW5mby0+d2F0Y2gpOwo+ICsJa2ZyZWUocmluZ19pbmZvLT53YXRjaC5ub2RlKTsKPiAr Cj4gKwkvKiBObyBuZWVkIHRvIGNsb3NlIGNvbW11bmljYXRpb24gY2hhbm5lbCwgd2lsbCBiZSBk b25lIGJ5Cj4gKwkgKiB0aGlzIGZ1bmN0aW9uCj4gKwkgKi8KPiArCXVuYmluZF9mcm9tX2lycWhh bmRsZXIocmluZ19pbmZvLT5pcnEsICh2b2lkICopIHJpbmdfaW5mbyk7Cj4gKwo+ICsJLyogTm8g bmVlZCB0byBmcmVlIHNyaW5nIHBhZ2UsIHdpbGwgYmUgZnJlZWQgYnkgdGhpcyBmdW5jdGlvbgo+ ICsJICogd2hlbiBvdGhlciBzaWRlIHdpbGwgZW5kIGl0cyBhY2Nlc3MKPiArCSAqLwo+ICsJZ250 dGFiX2VuZF9mb3JlaWduX2FjY2VzcyhyaW5nX2luZm8tPmdyZWZfcmluZywgMCwKPiArCQkJCSAg KHVuc2lnbmVkIGxvbmcpIHJpbmdfaW5mby0+cmluZ19mcm9udC5zcmluZyk7Cj4gKwo+ICsJa2Zy ZWUocmluZ19pbmZvKTsKPiArCj4gKwlyeF9yaW5nX2luZm8gPSB4ZW5fY29tbV9maW5kX3J4X3Jp bmcoZG9taWQpOwo+ICsJaWYgKCFyeF9yaW5nX2luZm8pCj4gKwkJcmV0dXJuOwo+ICsKPiArCUJB Q0tfUklOR19JTklUKCYocnhfcmluZ19pbmZvLT5yaW5nX2JhY2spLAo+ICsJCSAgICAgICByeF9y aW5nX2luZm8tPnJpbmdfYmFjay5zcmluZywKPiArCQkgICAgICAgUEFHRV9TSVpFKTsKd2h5IGlu aXQgb24gY2xlYW51cD8KPiArfQo+ICsKPiArLyogaW1wb3J0ZXIgbmVlZHMgdG8ga25vdyBhYm91 dCBzaGFyZWQgcGFnZSBhbmQgcG9ydCBudW1iZXJzIGZvcgo+ICsgKiByaW5nIGJ1ZmZlciBhbmQg ZXZlbnQgY2hhbm5lbAo+ICsgKi8KPiAraW50IHhlbl9iZV9pbml0X3J4X3JidWYoaW50IGRvbWlk KQo+ICt7Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvICpyaW5nX2luZm87Cj4gKwlz dHJ1Y3QgeGVuX2NvbW1fc3JpbmcgKnNyaW5nOwo+ICsKPiArCXN0cnVjdCBwYWdlICpzaGFyZWRf cmluZzsKPiArCj4gKwlzdHJ1Y3QgZ250dGFiX21hcF9ncmFudF9yZWYgKm1hcF9vcHM7Cj4gKwo+ ICsJaW50IHJldDsKPiArCWludCByeF9ncmVmLCByeF9wb3J0Owo+ICsKPiArCS8qIGNoZWNrIGlm IHRoZXJlJ3MgZXhpc3RpbmcgcnggcmluZyBjaGFubmVsICovCj4gKwlyaW5nX2luZm8gPSB4ZW5f Y29tbV9maW5kX3J4X3JpbmcoZG9taWQpOwo+ICsKPiArCWlmIChyaW5nX2luZm8pIHsKPiArCQlk ZXZfaW5mbyhoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkgInJ4IHJpbmcgY2ggZnJvbSBkb21pZCA9 ICVkIGFscmVhZHkgZXhpc3RcbiIsCj4gKwkJCSByaW5nX2luZm8tPnNkb21haW4pOwo+ICsKPiAr CQlyZXR1cm4gMDsKPiArCX0KPiArCj4gKwlyZXQgPSB4ZW5fY29tbV9nZXRfcmluZ19kZXRhaWxz KHhlbl9iZV9nZXRfZG9taWQoKSwgZG9taWQsCj4gKwkJCQkJJnJ4X2dyZWYsICZyeF9wb3J0KTsK PiArCj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQki RG9tYWluICVkIGhhcyBub3QgY3JlYXRlZCBleHBvcnRlciByaW5nIGZvciBjdXJyZW50IGRvbWFp blxuIiwKPiArCQkJZG9taWQpOwo+ICsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJp bmdfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpyaW5nX2luZm8pLCBHRlBfS0VSTkVMKTsKPiArCj4g KwlpZiAoIXJpbmdfaW5mbykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlyaW5nX2luZm8t PnNkb21haW4gPSBkb21pZDsKPiArCXJpbmdfaW5mby0+ZXZ0Y2huID0gcnhfcG9ydDsKPiArCj4g KwltYXBfb3BzID0ga21hbGxvYyhzaXplb2YoKm1hcF9vcHMpLCBHRlBfS0VSTkVMKTsKPiArCj4g KwlpZiAoIW1hcF9vcHMpIHsKPiArCQlyZXQgPSAtRU5PTUVNOwo+ICsJCWdvdG8gZmFpbF9ub19t YXBfb3BzOwo+ICsJfQo+ICsKPiArCWlmIChnbnR0YWJfYWxsb2NfcGFnZXMoMSwgJnNoYXJlZF9y aW5nKSkgewo+ICsJCXJldCA9IC1FTk9NRU07Cj4gKwkJZ290byBmYWlsX290aGVyczsKPiArCX0K PiArClBsZWFzZSBzZWUgeGVuYnVzX2dyYW50X3JpbmcKPiArCWdudHRhYl9zZXRfbWFwX29wKCZt YXBfb3BzWzBdLAo+ICsJCQkgICh1bnNpZ25lZCBsb25nKXBmbl90b19rYWRkcigKPiArCQkJCQlw YWdlX3RvX3BmbihzaGFyZWRfcmluZykpLAo+ICsJCQkgIEdOVE1BUF9ob3N0X21hcCwgcnhfZ3Jl ZiwgZG9taWQpOwo+ICsKPiArCWdudHRhYl9zZXRfdW5tYXBfb3AoJnJpbmdfaW5mby0+dW5tYXBf b3AsCj4gKwkJCSAgICAodW5zaWduZWQgbG9uZylwZm5fdG9fa2FkZHIoCj4gKwkJCQkJcGFnZV90 b19wZm4oc2hhcmVkX3JpbmcpKSwKPiArCQkJICAgIEdOVE1BUF9ob3N0X21hcCwgLTEpOwo+ICsK PiArCXJldCA9IGdudHRhYl9tYXBfcmVmcyhtYXBfb3BzLCBOVUxMLCAmc2hhcmVkX3JpbmcsIDEp Owo+ICsJaWYgKHJldCA8IDApIHsKPiArCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsICJDYW5u b3QgbWFwIHJpbmdcbiIpOwo+ICsJCXJldCA9IC1FRkFVTFQ7Cj4gKwkJZ290byBmYWlsX290aGVy czsKPiArCX0KPiArCj4gKwlpZiAobWFwX29wc1swXS5zdGF0dXMpIHsKPiArCQlkZXZfZXJyKGh5 X2Rydl9wcml2LT5kZXYsICJSaW5nIG1hcHBpbmcgZmFpbGVkXG4iKTsKPiArCQlyZXQgPSAtRUZB VUxUOwo+ICsJCWdvdG8gZmFpbF9vdGhlcnM7Cj4gKwl9IGVsc2Ugewo+ICsJCXJpbmdfaW5mby0+ dW5tYXBfb3AuaGFuZGxlID0gbWFwX29wc1swXS5oYW5kbGU7Cj4gKwl9Cj4gKwo+ICsJa2ZyZWUo bWFwX29wcyk7Cj4gKwo+ICsJc3JpbmcgPSAoc3RydWN0IHhlbl9jb21tX3NyaW5nICopcGZuX3Rv X2thZGRyKHBhZ2VfdG9fcGZuKHNoYXJlZF9yaW5nKSk7Cj4gKwo+ICsJQkFDS19SSU5HX0lOSVQo JnJpbmdfaW5mby0+cmluZ19iYWNrLCBzcmluZywgUEFHRV9TSVpFKTsKPiArCj4gKwlyZXQgPSBi aW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnEoZG9taWQsIHJ4X3BvcnQpOwo+ICsKPiArCWlm IChyZXQgPCAwKSB7Cj4gKwkJcmV0ID0gLUVJTzsKPiArCQlnb3RvIGZhaWxfb3RoZXJzOwo+ICsJ fQo+ICsKPiArCXJpbmdfaW5mby0+aXJxID0gcmV0Owo+ICsKPiArCWRldl9kYmcoaHlfZHJ2X3By aXYtPmRldiwKPiArCQkiJXM6IGJvdW5kIHRvIGV2ZW50Y2hhbm5lbCBwb3J0OiAlZCAgaXJxOiAl ZFxuIiwgX19mdW5jX18sCj4gKwkJcnhfcG9ydCwKPiArCQlyaW5nX2luZm8tPmlycSk7Cj4gKwo+ ICsJcmV0ID0geGVuX2NvbW1fYWRkX3J4X3JpbmcocmluZ19pbmZvKTsKPiArCj4gKwkvKiBTZXR1 cCBjb21tdW5jYXRpb24gY2hhbm5lbCBpbiBvcHBvc2l0ZSBkaXJlY3Rpb24gKi8KPiArCWlmICgh eGVuX2NvbW1fZmluZF90eF9yaW5nKGRvbWlkKSkKPiArCQlyZXQgPSB4ZW5fYmVfaW5pdF90eF9y YnVmKGRvbWlkKTsKPiArCj4gKwlyZXQgPSByZXF1ZXN0X2lycShyaW5nX2luZm8tPmlycSwKPiAr CQkJICBiYWNrX3JpbmdfaXNyLCAwLAo+ICsJCQkgIE5VTEwsICh2b2lkICopcmluZ19pbmZvKTsK PiArCj4gKwlyZXR1cm4gcmV0Owo+ICsKPiArZmFpbF9vdGhlcnM6Cj4gKwlrZnJlZShtYXBfb3Bz KTsKPiArCj4gK2ZhaWxfbm9fbWFwX29wczoKPiArCWtmcmVlKHJpbmdfaW5mbyk7Cj4gKwo+ICsJ cmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyogY2xlbmFzIHVwIGltcG9ydGVyIHJpbmcgY3JlYXRl IGZvciBnaXZlbiBzb3VyY2UgZG9tYWluICovCj4gK3ZvaWQgeGVuX2JlX2NsZWFudXBfcnhfcmJ1 ZihpbnQgZG9taWQpCj4gK3sKPiArCXN0cnVjdCB4ZW5fY29tbV9yeF9yaW5nX2luZm8gKnJpbmdf aW5mbzsKPiArCXN0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2luZm8gKnR4X3JpbmdfaW5mbzsKPiAr CXN0cnVjdCBwYWdlICpzaGFyZWRfcmluZzsKPiArCj4gKwkvKiBjaGVjayBpZiB3ZSBoYXZlIGlt cG9ydGVyIHJpbmcgY3JlYXRlZCBmb3IgZ2l2ZW4gc2RvbWFpbiAqLwo+ICsJcmluZ19pbmZvID0g eGVuX2NvbW1fZmluZF9yeF9yaW5nKGRvbWlkKTsKPiArCj4gKwlpZiAoIXJpbmdfaW5mbykKPiAr CQlyZXR1cm47Cj4gKwo+ICsJeGVuX2NvbW1fcmVtb3ZlX3J4X3JpbmcoZG9taWQpOwo+ICsKPiAr CS8qIG5vIG5lZWQgdG8gY2xvc2UgZXZlbnQgY2hhbm5lbCwgd2lsbCBiZSBkb25lIGJ5IHRoYXQg ZnVuY3Rpb24gKi8KPiArCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocmluZ19pbmZvLT5pcnEsICh2 b2lkICopcmluZ19pbmZvKTsKPiArCj4gKwkvKiB1bm1hcHBpbmcgc2hhcmVkIHJpbmcgcGFnZSAq Lwo+ICsJc2hhcmVkX3JpbmcgPSB2aXJ0X3RvX3BhZ2UocmluZ19pbmZvLT5yaW5nX2JhY2suc3Jp bmcpOwo+ICsJZ250dGFiX3VubWFwX3JlZnMoJnJpbmdfaW5mby0+dW5tYXBfb3AsIE5VTEwsICZz aGFyZWRfcmluZywgMSk7Cj4gKwlnbnR0YWJfZnJlZV9wYWdlcygxLCAmc2hhcmVkX3JpbmcpOwo+ ICsKPiArCWtmcmVlKHJpbmdfaW5mbyk7Cj4gKwo+ICsJdHhfcmluZ19pbmZvID0geGVuX2NvbW1f ZmluZF90eF9yaW5nKGRvbWlkKTsKPiArCWlmICghdHhfcmluZ19pbmZvKQo+ICsJCXJldHVybjsK PiArCj4gKwlTSEFSRURfUklOR19JTklUKHR4X3JpbmdfaW5mby0+cmluZ19mcm9udC5zcmluZyk7 Cj4gKwlGUk9OVF9SSU5HX0lOSVQoJih0eF9yaW5nX2luZm8tPnJpbmdfZnJvbnQpLAo+ICsJCQl0 eF9yaW5nX2luZm8tPnJpbmdfZnJvbnQuc3JpbmcsCj4gKwkJCVBBR0VfU0laRSk7Cj4gK30KPiAr Cj4gKyNpZmRlZiBDT05GSUdfSFlQRVJfRE1BQlVGX1hFTl9BVVRPX1JYX0NIX0FERAo+ICsKPiAr c3RhdGljIHZvaWQgeGVuX3J4X2NoX2FkZF9kZWxheWVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51 c2VkKTsKPiArCj4gK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyh4ZW5fcnhfY2hfYXV0b19h ZGRfd29yaywgeGVuX3J4X2NoX2FkZF9kZWxheWVkKTsKPiArCj4gKyNkZWZpbmUgRE9NSURfU0NB Tl9TVEFSVAkxCS8qICBkb21pZCA9IDEgKi8KPiArI2RlZmluZSBET01JRF9TQ0FOX0VORAkJMTAJ LyogZG9taWQgPSAxMCAqLwo+ICsKPiArc3RhdGljIHZvaWQgeGVuX3J4X2NoX2FkZF9kZWxheWVk KHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKQo+ICt7Cj4gKwlpbnQgcmV0Owo+ICsJY2hhciBi dWZbMTI4XTsKPiArCWludCBpLCBkdW1teTsKPiArCj4gKwlkZXZfZGJnKGh5X2Rydl9wcml2LT5k ZXYsCj4gKwkJIlNjYW5uaW5nIG5ldyB0eCBjaGFubmVsIGNvbW1pbmcgZnJvbSBhbm90aGVyIGRv bWFpblxuIik7ClRoaXMgc2hvdWxkIGJlIHN5bmNocm9ub3VzIElNTywgbm8gc2Nhbm5lcnMKPiAr Cj4gKwkvKiBjaGVjayBvdGhlciBkb21haW5zIGFuZCBzY2hlZHVsZSBhbm90aGVyIHdvcmsgaWYg ZHJpdmVyCj4gKwkgKiBpcyBzdGlsbCBydW5uaW5nIGFuZCBiYWNrZW5kIGlzIHZhbGlkCj4gKwkg Ki8KPiArCWlmIChoeV9kcnZfcHJpdiAmJgo+ICsJICAgIGh5X2Rydl9wcml2LT5pbml0aWFsaXpl ZCkgewo+ICsJCWZvciAoaSA9IERPTUlEX1NDQU5fU1RBUlQ7IGkgPCBET01JRF9TQ0FOX0VORCAr IDE7IGkrKykgewo+ICsJCQlpZiAoaSA9PSBoeV9kcnZfcHJpdi0+ZG9taWQpCj4gKwkJCQljb250 aW51ZTsKPiArCj4gKwkJCXNwcmludGYoYnVmLCAiL2xvY2FsL2RvbWFpbi8lZC9kYXRhL2h5cGVy X2RtYWJ1Zi8lZCIsCj4gKwkJCQlpLCBoeV9kcnZfcHJpdi0+ZG9taWQpOwo+ICsKPiArCQkJcmV0 ID0geGVuYnVzX3NjYW5mKFhCVF9OSUwsIGJ1ZiwgInBvcnQiLCAiJWQiLCAmZHVtbXkpOwo+ICsK PiArCQkJaWYgKHJldCA+IDApIHsKPiArCQkJCWlmICh4ZW5fY29tbV9maW5kX3J4X3JpbmcoaSkg IT0gTlVMTCkKPiArCQkJCQljb250aW51ZTsKPiArCj4gKwkJCQlyZXQgPSB4ZW5fYmVfaW5pdF9y eF9yYnVmKGkpOwo+ICsKPiArCQkJCWlmICghcmV0KQo+ICsJCQkJCWRldl9pbmZvKGh5X2Rydl9w cml2LT5kZXYsCj4gKwkJCQkJCSAiRG9uZSByeCBjaCBpbml0IGZvciBWTSAlZFxuIiwKPiArCQkJ CQkJIGkpOwo+ICsJCQl9Cj4gKwkJfQo+ICsKPiArCQkvKiBjaGVjayBldmVyeSAxMCBzZWNvbmRz ICovCj4gKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ4ZW5fcnhfY2hfYXV0b19hZGRfd29yaywK PiArCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMDApKTsKPiArCX0KPiArfQo+ICsKPiAr I2VuZGlmIC8qIENPTkZJR19IWVBFUl9ETUFCVUZfWEVOX0FVVE9fUlhfQ0hfQUREICovCj4gKwo+ ICt2b2lkIHhlbl9pbml0X2NvbW1fZW52X2RlbGF5ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp1bnVz ZWQpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJLyogc2NoZWR1bGluZyBhbm90aGVyIHdvcmsg aWYgZHJpdmVyIGlzIHN0aWxsIHJ1bm5pbmcKPiArCSAqIGFuZCB4ZW5zdG9yZSBoYXNuJ3QgYmVl biBpbml0aWFsaXplZCBvciBkb21faWQgaGFzbid0Cj4gKwkgKiBiZWVuIGNvcnJlY3RseSByZXRy aWV2ZWQuCj4gKwkgKi8KPiArCWlmIChsaWtlbHkoeGVuc3RvcmVkX3JlYWR5ID09IDAgfHwKPiAr CSAgICBoeV9kcnZfcHJpdi0+ZG9taWQgPT0gLTEpKSB7Cj4gKwkJZGV2X2RiZyhoeV9kcnZfcHJp di0+ZGV2LAo+ICsJCQkiWGVuc3RvcmUgbm90IHJlYWR5IFdpbGwgcmUtdHJ5IGluIDUwMG1zXG4i KTsKPiArCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnhlbl9pbml0X2NvbW1fZW52X3dvcmssCj4g KwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDUwMCkpOwo+ICsJfSBlbHNlIHsKPiArCQlyZXQg PSB4ZW5fY29tbV9zZXR1cF9kYXRhX2RpcigpOwo+ICsJCWlmIChyZXQgPCAwKSB7Cj4gKwkJCWRl dl9lcnIoaHlfZHJ2X3ByaXYtPmRldiwKPiArCQkJCSJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgZGly IGluIFhlbnN0b3JlXG4iKTsKPiArCQl9IGVsc2Ugewo+ICsJCQlkZXZfaW5mbyhoeV9kcnZfcHJp di0+ZGV2LAo+ICsJCQkJIlN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBjb21tIGVudiBpbml0XG4iKTsK PiArCQkJaHlfZHJ2X3ByaXYtPmluaXRpYWxpemVkID0gdHJ1ZTsKPiArCj4gKyNpZmRlZiBDT05G SUdfSFlQRVJfRE1BQlVGX1hFTl9BVVRPX1JYX0NIX0FERAo+ICsJCQl4ZW5fcnhfY2hfYWRkX2Rl bGF5ZWQoTlVMTCk7Cj4gKyNlbmRpZiAvKiBDT05GSUdfSFlQRVJfRE1BQlVGX1hFTl9BVVRPX1JY X0NIX0FERCAqLwo+ICsJCX0KPiArCX0KPiArfQo+ICsKPiAraW50IHhlbl9iZV9pbml0X2NvbW1f ZW52KHZvaWQpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJeGVuX2NvbW1fcmluZ190YWJsZV9p bml0KCk7Cj4gKwo+ICsJaWYgKHVubGlrZWx5KHhlbnN0b3JlZF9yZWFkeSA9PSAwIHx8Cj4gKwkg ICAgaHlfZHJ2X3ByaXYtPmRvbWlkID09IC0xKSkgewo+ICsJCXhlbl9pbml0X2NvbW1fZW52X2Rl bGF5ZWQoTlVMTCk7Cj4gKwkJcmV0dXJuIC0xOwo+ICsJfQo+ICsKPiArCXJldCA9IHhlbl9jb21t X3NldHVwX2RhdGFfZGlyKCk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWRldl9lcnIoaHlfZHJ2 X3ByaXYtPmRldiwKPiArCQkJIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBkaXIgaW4gWGVuc3RvcmVc biIpOwo+ICsJfSBlbHNlIHsKPiArCQlkZXZfaW5mbyhoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQki U3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIGNvbW0gZW52IGluaXRpYWxpemF0aW9uXG4iKTsKPiArCj4g KwkJaHlfZHJ2X3ByaXYtPmluaXRpYWxpemVkID0gdHJ1ZTsKPiArCX0KPiArCj4gKwlyZXR1cm4g cmV0Owo+ICt9Cj4gKwo+ICsvKiBjbGVhbnMgdXAgYWxsIHR4L3J4IHJpbmdzICovCj4gK3N0YXRp YyB2b2lkIHhlbl9iZV9jbGVhbnVwX2FsbF9yYnVmcyh2b2lkKQo+ICt7Cj4gKwl4ZW5fY29tbV9m b3JlYWNoX3R4X3JpbmcoeGVuX2JlX2NsZWFudXBfdHhfcmJ1Zik7Cj4gKwl4ZW5fY29tbV9mb3Jl YWNoX3J4X3JpbmcoeGVuX2JlX2NsZWFudXBfcnhfcmJ1Zik7Cj4gK30KPiArCj4gK3ZvaWQgeGVu X2JlX2Rlc3Ryb3lfY29tbSh2b2lkKQo+ICt7Cj4gKwl4ZW5fYmVfY2xlYW51cF9hbGxfcmJ1ZnMo KTsKPiArCXhlbl9jb21tX2Rlc3Ryb3lfZGF0YV9kaXIoKTsKPiArfQo+ICsKPiAraW50IHhlbl9i ZV9zZW5kX3JlcShpbnQgZG9taWQsIHN0cnVjdCBoeXBlcl9kbWFidWZfcmVxICpyZXEsCj4gKwkJ CSAgICAgIGludCB3YWl0KQo+ICt7Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fZnJvbnRfcmluZyAqcmlu ZzsKPiArCXN0cnVjdCBoeXBlcl9kbWFidWZfcmVxICpuZXdfcmVxOwo+ICsJc3RydWN0IHhlbl9j b21tX3R4X3JpbmdfaW5mbyAqcmluZ19pbmZvOwo+ICsJaW50IG5vdGlmeTsKPiArCj4gKwlzdHJ1 Y3QgdGltZXZhbCB0dl9zdGFydCwgdHZfZW5kOwo+ICsJc3RydWN0IHRpbWV2YWwgdHZfZGlmZjsK PiArCj4gKwlpbnQgdGltZW91dCA9IDEwMDA7Cj4gKwo+ICsJLyogZmluZCBhIHJpbmcgaW5mbyBm b3IgdGhlIGNoYW5uZWwgKi8KPiArCXJpbmdfaW5mbyA9IHhlbl9jb21tX2ZpbmRfdHhfcmluZyhk b21pZCk7Cj4gKwlpZiAoIXJpbmdfaW5mbykgewo+ICsJCWRldl9lcnIoaHlfZHJ2X3ByaXYtPmRl diwKPiArCQkJIkNhbid0IGZpbmQgcmluZyBpbmZvIGZvciB0aGUgY2hhbm5lbFxuIik7Cj4gKwkJ cmV0dXJuIC1FTk9FTlQ7Cj4gKwl9Cj4gKwo+ICsKPiArCXJpbmcgPSAmcmluZ19pbmZvLT5yaW5n X2Zyb250Owo+ICsKPiArCWRvX2dldHRpbWVvZmRheSgmdHZfc3RhcnQpOwo+ICsKPiArCXdoaWxl IChSSU5HX0ZVTEwocmluZykpIHsKPiArCQlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYsICJSSU5H X0ZVTExcbiIpOwo+ICsKPiArCQlpZiAodGltZW91dCA9PSAwKSB7Cj4gKwkJCWRldl9lcnIoaHlf ZHJ2X3ByaXYtPmRldiwKPiArCQkJCSJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGFuIGVudHJ5 IGluIHRoZSByaW5nXG4iKTsKPiArCQkJcmV0dXJuIC1FSU87Cj4gKwkJfQo+ICsJCXVzbGVlcF9y YW5nZSgxMDAsIDEyMCk7Cj4gKwkJdGltZW91dC0tOwo+ICsJfQpIZWgKPiArCj4gKwl0aW1lb3V0 ID0gMTAwMDsKPiArCj4gKwltdXRleF9sb2NrKCZyaW5nX2luZm8tPmxvY2spOwo+ICsKPiArCW5l d19yZXEgPSBSSU5HX0dFVF9SRVFVRVNUKHJpbmcsIHJpbmctPnJlcV9wcm9kX3B2dCk7Cj4gKwlp ZiAoIW5ld19yZXEpIHsKPiArCQltdXRleF91bmxvY2soJnJpbmdfaW5mby0+bG9jayk7Cj4gKwkJ ZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiTlVMTCBSRVFVRVNUXG4iKTsKPiArCQly ZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwlyZXEtPnJlcV9pZCA9IHhlbl9jb21tX25leHRfcmVx X2lkKCk7Cj4gKwo+ICsJLyogdXBkYXRlIHJlcV9wZW5kaW5nIHdpdGggY3VycmVudCByZXF1ZXN0 ICovCj4gKwltZW1jcHkoJnJlcV9wZW5kaW5nLCByZXEsIHNpemVvZihyZXFfcGVuZGluZykpOwo+ ICsKPiArCS8qIHBhc3MgY3VycmVudCByZXF1ZXN0IHRvIHRoZSByaW5nICovCj4gKwltZW1jcHko bmV3X3JlcSwgcmVxLCBzaXplb2YoKm5ld19yZXEpKTsKPiArCj4gKwlyaW5nLT5yZXFfcHJvZF9w dnQrKzsKPiArCj4gKwlSSU5HX1BVU0hfUkVRVUVTVFNfQU5EX0NIRUNLX05PVElGWShyaW5nLCBu b3RpZnkpOwo+ICsJaWYgKG5vdGlmeSkKPiArCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEocmluZ19p bmZvLT5pcnEpOwo+ICsKPiArCWlmICh3YWl0KSB7Cj4gKwkJd2hpbGUgKHRpbWVvdXQtLSkgewo+ ICsJCQlpZiAocmVxX3BlbmRpbmcuc3RhdCAhPQo+ICsJCQkgICAgSFlQRVJfRE1BQlVGX1JFUV9O T1RfUkVTUE9OREVEKQo+ICsJCQkJYnJlYWs7Cj4gKwkJCXVzbGVlcF9yYW5nZSgxMDAsIDEyMCk7 Cj4gKwkJfQo+ICsKPiArCQlpZiAodGltZW91dCA8IDApIHsKPiArCQkJbXV0ZXhfdW5sb2NrKCZy aW5nX2luZm8tPmxvY2spOwo+ICsJCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCQki cmVxdWVzdCB0aW1lZC1vdXRcbiIpOwo+ICsJCQlyZXR1cm4gLUVCVVNZOwo+ICsJCX0KPiArCj4g KwkJbXV0ZXhfdW5sb2NrKCZyaW5nX2luZm8tPmxvY2spOwo+ICsJCWRvX2dldHRpbWVvZmRheSgm dHZfZW5kKTsKPiArCj4gKwkJLyogY2hlY2tpbmcgdGltZSBkdXJhdGlvbiBmb3Igcm91bmQtdHJp cCBvZiBhIHJlcXVlc3QKPiArCQkgKiBmb3IgZGVidWdnaW5nCj4gKwkJICovCnB1dCBpdCB1bmRl ciBkZWJ1ZyAjaWZkZWYgdGhlbj8KPiArCQlpZiAodHZfZW5kLnR2X3VzZWMgPj0gdHZfc3RhcnQu dHZfdXNlYykgewo+ICsJCQl0dl9kaWZmLnR2X3NlYyA9IHR2X2VuZC50dl9zZWMtdHZfc3RhcnQu dHZfc2VjOwo+ICsJCQl0dl9kaWZmLnR2X3VzZWMgPSB0dl9lbmQudHZfdXNlYy10dl9zdGFydC50 dl91c2VjOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCXR2X2RpZmYudHZfc2VjID0gdHZfZW5kLnR2X3Nl Yy10dl9zdGFydC50dl9zZWMtMTsKPiArCQkJdHZfZGlmZi50dl91c2VjID0gdHZfZW5kLnR2X3Vz ZWMrMTAwMDAwMC0KPiArCQkJCQkgIHR2X3N0YXJ0LnR2X3VzZWM7Cj4gKwkJfQo+ICsKPiArCQlp ZiAodHZfZGlmZi50dl9zZWMgIT0gMCAmJiB0dl9kaWZmLnR2X3VzZWMgPiAxNjAwMCkKPiArCQkJ ZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkJInNlbmRfcmVxOnRpbWUgZGlmZjogJWxk IHNlYywgJWxkIHVzZWNcbiIsCj4gKwkJCQl0dl9kaWZmLnR2X3NlYywgdHZfZGlmZi50dl91c2Vj KTsKPiArCX0KPiArCj4gKwltdXRleF91bmxvY2soJnJpbmdfaW5mby0+bG9jayk7Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qIElTUiBmb3IgaGFuZGxpbmcgcmVxdWVzdCAqLwo+ICtz dGF0aWMgaXJxcmV0dXJuX3QgYmFja19yaW5nX2lzcihpbnQgaXJxLCB2b2lkICppbmZvKQo+ICt7 Cj4gKwlSSU5HX0lEWCByYywgcnA7Cj4gKwlzdHJ1Y3QgaHlwZXJfZG1hYnVmX3JlcSByZXE7Cj4g KwlzdHJ1Y3QgaHlwZXJfZG1hYnVmX3Jlc3AgcmVzcDsKPiArCj4gKwlpbnQgbm90aWZ5LCBtb3Jl X3RvX2RvOwo+ICsJaW50IHJldDsKPiArCj4gKwlzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZv ICpyaW5nX2luZm87Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fYmFja19yaW5nICpyaW5nOwo+ICsKPiAr CXJpbmdfaW5mbyA9IChzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvICopaW5mbzsKPiArCXJp bmcgPSAmcmluZ19pbmZvLT5yaW5nX2JhY2s7Cj4gKwo+ICsJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiArCj4gKwlkbyB7Cj4gKwkJcmMgPSByaW5nLT5yZXFf Y29uczsKPiArCQlycCA9IHJpbmctPnNyaW5nLT5yZXFfcHJvZDsKPiArCQltb3JlX3RvX2RvID0g MDsKPiArCQl3aGlsZSAocmMgIT0gcnApIHsKPiArCQkJaWYgKFJJTkdfUkVRVUVTVF9DT05TX09W RVJGTE9XKHJpbmcsIHJjKSkKPiArCQkJCWJyZWFrOwo+ICsKPiArCQkJbWVtY3B5KCZyZXEsIFJJ TkdfR0VUX1JFUVVFU1QocmluZywgcmMpLCBzaXplb2YocmVxKSk7Cj4gKwkJCXJpbmctPnJlcV9j b25zID0gKytyYzsKPiArCj4gKwkJCXJldCA9IGh5cGVyX2RtYWJ1Zl9tc2dfcGFyc2UocmluZ19p bmZvLT5zZG9tYWluLCAmcmVxKTsKPiArCj4gKwkJCWlmIChyZXQgPiAwKSB7Cj4gKwkJCQkvKiBw cmVwYXJpbmcgYSByZXNwb25zZSBmb3IgdGhlIHJlcXVlc3QgYW5kCj4gKwkJCQkgKiBzZW5kIGl0 IHRvIHRoZSByZXF1ZXN0ZXIKPiArCQkJCSAqLwo+ICsJCQkJbWVtY3B5KCZyZXNwLCAmcmVxLCBz aXplb2YocmVzcCkpOwo+ICsJCQkJbWVtY3B5KFJJTkdfR0VUX1JFU1BPTlNFKHJpbmcsCj4gKwkJ CQkJCQkgcmluZy0+cnNwX3Byb2RfcHZ0KSwKPiArCQkJCQkJCSAmcmVzcCwgc2l6ZW9mKHJlc3Ap KTsKPiArCQkJCXJpbmctPnJzcF9wcm9kX3B2dCsrOwo+ICsKPiArCQkJCWRldl9kYmcoaHlfZHJ2 X3ByaXYtPmRldiwKPiArCQkJCQkicmVzcG9uZGluZyB0byBleHBvcnRlciBmb3IgcmVxOiVkXG4i LAo+ICsJCQkJCXJlc3AucmVzcF9pZCk7Cj4gKwo+ICsJCQkJUklOR19QVVNIX1JFU1BPTlNFU19B TkRfQ0hFQ0tfTk9USUZZKHJpbmcsCj4gKwkJCQkJCQkJICAgICBub3RpZnkpOwo+ICsKPiArCQkJ CWlmIChub3RpZnkpCj4gKwkJCQkJbm90aWZ5X3JlbW90ZV92aWFfaXJxKHJpbmdfaW5mby0+aXJx KTsKPiArCQkJfQo+ICsKPiArCQkJUklOR19GSU5BTF9DSEVDS19GT1JfUkVRVUVTVFMocmluZywg bW9yZV90b19kbyk7Cj4gKwkJfQo+ICsJfSB3aGlsZSAobW9yZV90b19kbyk7Cj4gKwo+ICsJcmV0 dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICsvKiBJU1IgZm9yIGhhbmRsaW5nIHJlc3BvbnNl cyAqLwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgZnJvbnRfcmluZ19pc3IoaW50IGlycSwgdm9pZCAq aW5mbykKPiArewo+ICsJLyogZnJvbnQgcmluZyBvbmx5IGNhcmUgYWJvdXQgcmVzcG9uc2UgZnJv bSBiYWNrICovCj4gKwlzdHJ1Y3QgaHlwZXJfZG1hYnVmX3Jlc3AgKnJlc3A7Cj4gKwlSSU5HX0lE WCBpLCBycDsKPiArCWludCBtb3JlX3RvX2RvLCByZXQ7Cj4gKwo+ICsJc3RydWN0IHhlbl9jb21t X3R4X3JpbmdfaW5mbyAqcmluZ19pbmZvOwo+ICsJc3RydWN0IHhlbl9jb21tX2Zyb250X3Jpbmcg KnJpbmc7Cj4gKwo+ICsJcmluZ19pbmZvID0gKHN0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2luZm8g KilpbmZvOwo+ICsJcmluZyA9ICZyaW5nX2luZm8tPnJpbmdfZnJvbnQ7Cj4gKwo+ICsJZGV2X2Ri ZyhoeV9kcnZfcHJpdi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiArCj4gKwlkbyB7Cj4gKwkJ bW9yZV90b19kbyA9IDA7Cj4gKwkJcnAgPSByaW5nLT5zcmluZy0+cnNwX3Byb2Q7Cj4gKwkJZm9y IChpID0gcmluZy0+cnNwX2NvbnM7IGkgIT0gcnA7IGkrKykgewo+ICsJCQlyZXNwID0gUklOR19H RVRfUkVTUE9OU0UocmluZywgaSk7Cj4gKwo+ICsJCQkvKiB1cGRhdGUgcGVuZGluZyByZXF1ZXN0 J3Mgc3RhdHVzIHdpdGggd2hhdCBpcwo+ICsJCQkgKiBpbiB0aGUgcmVzcG9uc2UKPiArCQkJICov Cj4gKwo+ICsJCQlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCQkiZ2V0dGluZyByZXNw b25zZSBmcm9tIGltcG9ydGVyXG4iKTsKPiArCj4gKwkJCWlmIChyZXFfcGVuZGluZy5yZXFfaWQg PT0gcmVzcC0+cmVzcF9pZCkKPiArCQkJCXJlcV9wZW5kaW5nLnN0YXQgPSByZXNwLT5zdGF0Owo+ ICsKPiArCQkJaWYgKHJlc3AtPnN0YXQgPT0gSFlQRVJfRE1BQlVGX1JFUV9ORUVEU19GT0xMT1df VVApIHsKPiArCQkJCS8qIHBhcnNpbmcgcmVzcG9uc2UgKi8KPiArCQkJCXJldCA9IGh5cGVyX2Rt YWJ1Zl9tc2dfcGFyc2UocmluZ19pbmZvLT5yZG9tYWluLAo+ICsJCQkJCShzdHJ1Y3QgaHlwZXJf ZG1hYnVmX3JlcSAqKXJlc3ApOwo+ICsKPiArCQkJCWlmIChyZXQgPCAwKSB7Cj4gKwkJCQkJZGV2 X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkJCQkiZXJyIHdoaWxlIHBhcnNpbmcgcmVzcFxu Iik7Cj4gKwkJCQl9Cj4gKwkJCX0gZWxzZSBpZiAocmVzcC0+c3RhdCA9PSBIWVBFUl9ETUFCVUZf UkVRX1BST0NFU1NFRCkgewo+ICsJCQkJLyogZm9yIGRlYnVnZ2luZyBkbWFfYnVmIHJlbW90ZSBz eW5jaCAqLwo+ICsJCQkJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkJCSJvcmlnaW5h bCByZXF1ZXN0ID0gMHgleFxuIiwgcmVzcC0+Y21kKTsKPiArCQkJCWRldl9kYmcoaHlfZHJ2X3By aXYtPmRldiwKPiArCQkJCQkiZ290IEhZUEVSX0RNQUJVRl9SRVFfUFJPQ0VTU0VEXG4iKTsKPiAr CQkJfSBlbHNlIGlmIChyZXNwLT5zdGF0ID09IEhZUEVSX0RNQUJVRl9SRVFfRVJST1IpIHsKPiAr CQkJCS8qIGZvciBkZWJ1Z2dpbmcgZG1hX2J1ZiByZW1vdGUgc3luY2ggKi8KPiArCQkJCWRldl9k YmcoaHlfZHJ2X3ByaXYtPmRldiwKPiArCQkJCQkib3JpZ2luYWwgcmVxdWVzdCA9IDB4JXhcbiIs IHJlc3AtPmNtZCk7Cj4gKwkJCQlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCQkJImdv dCBIWVBFUl9ETUFCVUZfUkVRX0VSUk9SXG4iKTsKPiArCQkJfQo+ICsJCX0KPiArCj4gKwkJcmlu Zy0+cnNwX2NvbnMgPSBpOwo+ICsKPiArCQlpZiAoaSAhPSByaW5nLT5yZXFfcHJvZF9wdnQpCj4g KwkJCVJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFU1BPTlNFUyhyaW5nLCBtb3JlX3RvX2RvKTsKPiAr CQllbHNlCj4gKwkJCXJpbmctPnNyaW5nLT5yc3BfZXZlbnQgPSBpKzE7Cj4gKwo+ICsJfSB3aGls ZSAobW9yZV90b19kbyk7Cj4gKwo+ICsJcmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2Rt YWJ1Zl94ZW5fY29tbS5oIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94 ZW4vaHlwZXJfZG1hYnVmX3hlbl9jb21tLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4 IDAwMDAwMDAwMDAwMC4uYzBkMzEzOWFjZTU5Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZl cnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29t bS5oCj4gQEAgLTAsMCArMSw3OCBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRl bCBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBm cmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRo aXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0 d2FyZSIpLAo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsg KiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNv bnMgdG8gd2hvbSB0aGUKPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUg bmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Ig c3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBU SEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkg S0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVE IFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNI QUxMCj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1Ig QU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBB TiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZS T00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0Ug T1IgT1RIRVIgREVBTElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ICsgKi8KPiAr Cj4gKyNpZm5kZWYgX19IWVBFUl9ETUFCVUZfWEVOX0NPTU1fSF9fCj4gKyNkZWZpbmUgX19IWVBF Ul9ETUFCVUZfWEVOX0NPTU1fSF9fCj4gKwo+ICsjaW5jbHVkZSAieGVuL2ludGVyZmFjZS9pby9y aW5nLmgiCj4gKyNpbmNsdWRlICJ4ZW4veGVuYnVzLmgiCj4gKyNpbmNsdWRlICIuLi8uLi9oeXBl cl9kbWFidWZfbXNnLmgiCj4gKwo+ICtleHRlcm4gaW50IHhlbnN0b3JlZF9yZWFkeTsKPiArCj4g K0RFRklORV9SSU5HX1RZUEVTKHhlbl9jb21tLCBzdHJ1Y3QgaHlwZXJfZG1hYnVmX3JlcSwgc3Ry dWN0IGh5cGVyX2RtYWJ1Zl9yZXNwKTsKPiArCj4gK3N0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2lu Zm8gewo+ICsJc3RydWN0IHhlbl9jb21tX2Zyb250X3JpbmcgcmluZ19mcm9udDsKPiArCWludCBy ZG9tYWluOwo+ICsJaW50IGdyZWZfcmluZzsKPiArCWludCBpcnE7Cj4gKwlpbnQgcG9ydDsKPiAr CXN0cnVjdCBtdXRleCBsb2NrOwo+ICsJc3RydWN0IHhlbmJ1c193YXRjaCB3YXRjaDsKPiArfTsK PiArCj4gK3N0cnVjdCB4ZW5fY29tbV9yeF9yaW5nX2luZm8gewo+ICsJaW50IHNkb21haW47Cj4g KwlpbnQgaXJxOwo+ICsJaW50IGV2dGNobjsKPiArCXN0cnVjdCB4ZW5fY29tbV9iYWNrX3Jpbmcg cmluZ19iYWNrOwo+ICsJc3RydWN0IGdudHRhYl91bm1hcF9ncmFudF9yZWYgdW5tYXBfb3A7Cj4g K307Cj4gKwo+ICtpbnQgeGVuX2JlX2dldF9kb21pZCh2b2lkKTsKPiArCj4gK2ludCB4ZW5fYmVf aW5pdF9jb21tX2Vudih2b2lkKTsKPiArCj4gKy8qIGV4cG9ydGVyIG5lZWRzIHRvIGdlbmVyYXRl ZCBpbmZvIGZvciBwYWdlIHNoYXJpbmcgKi8KPiAraW50IHhlbl9iZV9pbml0X3R4X3JidWYoaW50 IGRvbWlkKTsKPiArCj4gKy8qIGltcG9ydGVyIG5lZWRzIHRvIGtub3cgYWJvdXQgc2hhcmVkIHBh Z2UgYW5kIHBvcnQgbnVtYmVycwo+ICsgKiBmb3IgcmluZyBidWZmZXIgYW5kIGV2ZW50IGNoYW5u ZWwKPiArICovCj4gK2ludCB4ZW5fYmVfaW5pdF9yeF9yYnVmKGludCBkb21pZCk7Cj4gKwo+ICsv KiBjbGVhbnMgdXAgZXhwb3J0ZXIgcmluZyBjcmVhdGVkIGZvciBnaXZlbiBkb21haW4gKi8KPiAr dm9pZCB4ZW5fYmVfY2xlYW51cF90eF9yYnVmKGludCBkb21pZCk7Cj4gKwo+ICsvKiBjbGVhbnMg dXAgaW1wb3J0ZXIgcmluZyBjcmVhdGVkIGZvciBnaXZlbiBkb21haW4gKi8KPiArdm9pZCB4ZW5f YmVfY2xlYW51cF9yeF9yYnVmKGludCBkb21pZCk7Cj4gKwo+ICt2b2lkIHhlbl9iZV9kZXN0cm95 X2NvbW0odm9pZCk7Cj4gKwo+ICsvKiBzZW5kIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBkb21haW4g Ki8KPiAraW50IHhlbl9iZV9zZW5kX3JlcShpbnQgZG9taWQsIHN0cnVjdCBoeXBlcl9kbWFidWZf cmVxICpyZXEsCj4gKwkJICAgIGludCB3YWl0KTsKPiArCj4gKyNlbmRpZiAvKiBfX0hZUEVSX0RN QUJVRl9YRU5fQ09NTV9IX18gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL2h5cGVy X2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9jb21tX2xpc3QuYyBiL2RyaXZl cnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29t bV9saXN0LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uNWE4 ZTlkOWI3MzdmCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9k bWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29tbV9saXN0LmMKPiBAQCAtMCww ICsxLDE1OCBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxOCBJbnRlbCBDb3Jwb3JhdGlv bgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJn ZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUg YW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsg KiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcg d2l0aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnks IG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2Vs bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0 aGUKPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBm b2xsb3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBw YXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRI RSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBE QU1BR0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0Yg Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVB TElOR1MKPiArICogSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ICsgKiBBdXRob3JzOgo+ICsgKiAg ICBEb25nd29uIEtpbSA8ZG9uZ3dvbi5raW1AaW50ZWwuY29tPgo+ICsgKiAgICBNYXRldXN6IFBv bHJvbGEgPG1hdGV1c3p4LnBvdHJvbGFAaW50ZWwuY29tPgo+ICsgKgo+ICsgKi8KPiArCj4gKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Cj4gKyNpbmNs dWRlIDxsaW51eC9oYXNodGFibGUuaD4KPiArI2luY2x1ZGUgPHhlbi9ncmFudF90YWJsZS5oPgo+ ICsjaW5jbHVkZSAiLi4vLi4vaHlwZXJfZG1hYnVmX2Rydi5oIgo+ICsjaW5jbHVkZSAiaHlwZXJf ZG1hYnVmX3hlbl9jb21tLmgiCj4gKyNpbmNsdWRlICJoeXBlcl9kbWFidWZfeGVuX2NvbW1fbGlz dC5oIgo+ICsKPiArREVDTEFSRV9IQVNIVEFCTEUoeGVuX2NvbW1fdHhfcmluZ19oYXNoLCBNQVhf RU5UUllfVFhfUklORyk7Cj4gK0RFQ0xBUkVfSEFTSFRBQkxFKHhlbl9jb21tX3J4X3JpbmdfaGFz aCwgTUFYX0VOVFJZX1JYX1JJTkcpOwo+ICsKPiArdm9pZCB4ZW5fY29tbV9yaW5nX3RhYmxlX2lu aXQodm9pZCkKPiArewo+ICsJaGFzaF9pbml0KHhlbl9jb21tX3J4X3JpbmdfaGFzaCk7Cj4gKwlo YXNoX2luaXQoeGVuX2NvbW1fdHhfcmluZ19oYXNoKTsKPiArfQo+ICsKPiAraW50IHhlbl9jb21t X2FkZF90eF9yaW5nKHN0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2luZm8gKnJpbmdfaW5mbykKPiAr ewo+ICsJc3RydWN0IHhlbl9jb21tX3R4X3JpbmdfaW5mb19lbnRyeSAqaW5mb19lbnRyeTsKPiAr Cj4gKwlpbmZvX2VudHJ5ID0ga21hbGxvYyhzaXplb2YoKmluZm9fZW50cnkpLCBHRlBfS0VSTkVM KTsKPiArCj4gKwlpZiAoIWluZm9fZW50cnkpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJ aW5mb19lbnRyeS0+aW5mbyA9IHJpbmdfaW5mbzsKPiArCj4gKwloYXNoX2FkZCh4ZW5fY29tbV90 eF9yaW5nX2hhc2gsICZpbmZvX2VudHJ5LT5ub2RlLAo+ICsJCWluZm9fZW50cnktPmluZm8tPnJk b21haW4pOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtpbnQgeGVuX2NvbW1fYWRkX3J4 X3Jpbmcoc3RydWN0IHhlbl9jb21tX3J4X3JpbmdfaW5mbyAqcmluZ19pbmZvKQo+ICt7Cj4gKwlz dHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvX2VudHJ5ICppbmZvX2VudHJ5Owo+ICsKPiArCWlu Zm9fZW50cnkgPSBrbWFsbG9jKHNpemVvZigqaW5mb19lbnRyeSksIEdGUF9LRVJORUwpOwo+ICsK PiArCWlmICghaW5mb19lbnRyeSkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlpbmZvX2Vu dHJ5LT5pbmZvID0gcmluZ19pbmZvOwo+ICsKPiArCWhhc2hfYWRkKHhlbl9jb21tX3J4X3Jpbmdf aGFzaCwgJmluZm9fZW50cnktPm5vZGUsCj4gKwkJaW5mb19lbnRyeS0+aW5mby0+c2RvbWFpbik7 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2lu Zm8gKnhlbl9jb21tX2ZpbmRfdHhfcmluZyhpbnQgZG9taWQpCj4gK3sKPiArCXN0cnVjdCB4ZW5f Y29tbV90eF9yaW5nX2luZm9fZW50cnkgKmluZm9fZW50cnk7Cj4gKwlpbnQgYmt0Owo+ICsKPiAr CWhhc2hfZm9yX2VhY2goeGVuX2NvbW1fdHhfcmluZ19oYXNoLCBia3QsIGluZm9fZW50cnksIG5v ZGUpCj4gKwkJaWYgKGluZm9fZW50cnktPmluZm8tPnJkb21haW4gPT0gZG9taWQpCj4gKwkJCXJl dHVybiBpbmZvX2VudHJ5LT5pbmZvOwo+ICsKPiArCXJldHVybiBOVUxMOwo+ICt9Cj4gKwo+ICtz dHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvICp4ZW5fY29tbV9maW5kX3J4X3JpbmcoaW50IGRv bWlkKQo+ICt7Cj4gKwlzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvX2VudHJ5ICppbmZvX2Vu dHJ5Owo+ICsJaW50IGJrdDsKPiArCj4gKwloYXNoX2Zvcl9lYWNoKHhlbl9jb21tX3J4X3Jpbmdf aGFzaCwgYmt0LCBpbmZvX2VudHJ5LCBub2RlKQo+ICsJCWlmIChpbmZvX2VudHJ5LT5pbmZvLT5z ZG9tYWluID09IGRvbWlkKQo+ICsJCQlyZXR1cm4gaW5mb19lbnRyeS0+aW5mbzsKPiArCj4gKwly ZXR1cm4gTlVMTDsKPiArfQo+ICsKPiAraW50IHhlbl9jb21tX3JlbW92ZV90eF9yaW5nKGludCBk b21pZCkKPiArewo+ICsJc3RydWN0IHhlbl9jb21tX3R4X3JpbmdfaW5mb19lbnRyeSAqaW5mb19l bnRyeTsKPiArCWludCBia3Q7Cj4gKwo+ICsJaGFzaF9mb3JfZWFjaCh4ZW5fY29tbV90eF9yaW5n X2hhc2gsIGJrdCwgaW5mb19lbnRyeSwgbm9kZSkKPiArCQlpZiAoaW5mb19lbnRyeS0+aW5mby0+ cmRvbWFpbiA9PSBkb21pZCkgewo+ICsJCQloYXNoX2RlbCgmaW5mb19lbnRyeS0+bm9kZSk7Cj4g KwkJCWtmcmVlKGluZm9fZW50cnkpOwo+ICsJCQlyZXR1cm4gMDsKPiArCQl9Cj4gKwo+ICsJcmV0 dXJuIC1FTk9FTlQ7Cj4gK30KPiArCj4gK2ludCB4ZW5fY29tbV9yZW1vdmVfcnhfcmluZyhpbnQg ZG9taWQpCj4gK3sKPiArCXN0cnVjdCB4ZW5fY29tbV9yeF9yaW5nX2luZm9fZW50cnkgKmluZm9f ZW50cnk7Cj4gKwlpbnQgYmt0Owo+ICsKPiArCWhhc2hfZm9yX2VhY2goeGVuX2NvbW1fcnhfcmlu Z19oYXNoLCBia3QsIGluZm9fZW50cnksIG5vZGUpCj4gKwkJaWYgKGluZm9fZW50cnktPmluZm8t PnNkb21haW4gPT0gZG9taWQpIHsKPiArCQkJaGFzaF9kZWwoJmluZm9fZW50cnktPm5vZGUpOwo+ ICsJCQlrZnJlZShpbmZvX2VudHJ5KTsKPiArCQkJcmV0dXJuIDA7Cj4gKwkJfQo+ICsKPiArCXJl dHVybiAtRU5PRU5UOwo+ICt9Cj4gKwo+ICt2b2lkIHhlbl9jb21tX2ZvcmVhY2hfdHhfcmluZyh2 b2lkICgqZnVuYykoaW50IGRvbWlkKSkKPiArewo+ICsJc3RydWN0IHhlbl9jb21tX3R4X3Jpbmdf aW5mb19lbnRyeSAqaW5mb19lbnRyeTsKPiArCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7Cj4gKwlp bnQgYmt0Owo+ICsKPiArCWhhc2hfZm9yX2VhY2hfc2FmZSh4ZW5fY29tbV90eF9yaW5nX2hhc2gs IGJrdCwgdG1wLAo+ICsJCQkgICBpbmZvX2VudHJ5LCBub2RlKSB7Cj4gKwkJZnVuYyhpbmZvX2Vu dHJ5LT5pbmZvLT5yZG9tYWluKTsKPiArCX0KPiArfQo+ICsKPiArdm9pZCB4ZW5fY29tbV9mb3Jl YWNoX3J4X3Jpbmcodm9pZCAoKmZ1bmMpKGludCBkb21pZCkpCj4gK3sKPiArCXN0cnVjdCB4ZW5f Y29tbV9yeF9yaW5nX2luZm9fZW50cnkgKmluZm9fZW50cnk7Cj4gKwlzdHJ1Y3QgaGxpc3Rfbm9k ZSAqdG1wOwo+ICsJaW50IGJrdDsKPiArCj4gKwloYXNoX2Zvcl9lYWNoX3NhZmUoeGVuX2NvbW1f cnhfcmluZ19oYXNoLCBia3QsIHRtcCwKPiArCQkJICAgaW5mb19lbnRyeSwgbm9kZSkgewo+ICsJ CWZ1bmMoaW5mb19lbnRyeS0+aW5mby0+c2RvbWFpbik7Cj4gKwl9Cj4gK30KPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVm X3hlbl9jb21tX2xpc3QuaCBiL2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMv eGVuL2h5cGVyX2RtYWJ1Zl94ZW5fY29tbV9saXN0LmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAwMDAwMC4uOGQ0YjUyYmQ0MWIwCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2RyaXZlcnMvZG1hLWJ1Zi9oeXBlcl9kbWFidWYvYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94 ZW5fY29tbV9saXN0LmgKPiBAQCAtMCwwICsxLDY3IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCDC qSAyMDE4IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQg cmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBw ZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8g ZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBU aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5j bHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxs IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICogU29mdHdhcmUuCj4g KyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4g Tk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUg TElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJ TkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAq Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfX0hZUEVSX0RNQUJVRl9YRU5fQ09NTV9MSVNUX0hfXwo+ ICsjZGVmaW5lIF9fSFlQRVJfRE1BQlVGX1hFTl9DT01NX0xJU1RfSF9fCj4gKwo+ICsvKiBudW1i ZXIgb2YgYml0cyB0byBiZSB1c2VkIGZvciBleHBvcnRlZCBkbWFidWZzIGhhc2ggdGFibGUgKi8K PiArI2RlZmluZSBNQVhfRU5UUllfVFhfUklORyA3Cj4gKy8qIG51bWJlciBvZiBiaXRzIHRvIGJl IHVzZWQgZm9yIGltcG9ydGVkIGRtYWJ1ZnMgaGFzaCB0YWJsZSAqLwo+ICsjZGVmaW5lIE1BWF9F TlRSWV9SWF9SSU5HIDcKPiArCj4gK3N0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2luZm9fZW50cnkg ewo+ICsJc3RydWN0IHhlbl9jb21tX3R4X3JpbmdfaW5mbyAqaW5mbzsKPiArCXN0cnVjdCBobGlz dF9ub2RlIG5vZGU7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvX2Vu dHJ5IHsKPiArCXN0cnVjdCB4ZW5fY29tbV9yeF9yaW5nX2luZm8gKmluZm87Cj4gKwlzdHJ1Y3Qg aGxpc3Rfbm9kZSBub2RlOwo+ICt9Owo+ICsKPiArdm9pZCB4ZW5fY29tbV9yaW5nX3RhYmxlX2lu aXQodm9pZCk7Cj4gKwo+ICtpbnQgeGVuX2NvbW1fYWRkX3R4X3Jpbmcoc3RydWN0IHhlbl9jb21t X3R4X3JpbmdfaW5mbyAqcmluZ19pbmZvKTsKPiArCj4gK2ludCB4ZW5fY29tbV9hZGRfcnhfcmlu ZyhzdHJ1Y3QgeGVuX2NvbW1fcnhfcmluZ19pbmZvICpyaW5nX2luZm8pOwo+ICsKPiAraW50IHhl bl9jb21tX3JlbW92ZV90eF9yaW5nKGludCBkb21pZCk7Cj4gKwo+ICtpbnQgeGVuX2NvbW1fcmVt b3ZlX3J4X3JpbmcoaW50IGRvbWlkKTsKPiArCj4gK3N0cnVjdCB4ZW5fY29tbV90eF9yaW5nX2lu Zm8gKnhlbl9jb21tX2ZpbmRfdHhfcmluZyhpbnQgZG9taWQpOwo+ICsKPiArc3RydWN0IHhlbl9j b21tX3J4X3JpbmdfaW5mbyAqeGVuX2NvbW1fZmluZF9yeF9yaW5nKGludCBkb21pZCk7Cj4gKwo+ ICsvKiBpdGVyYXRlcyBvdmVyIGFsbCBleHBvcnRlciByaW5ncyBhbmQgY2FsbHMgcHJvdmlkZWQK PiArICogZnVuY3Rpb24gZm9yIGVhY2ggb2YgdGhlbQo+ICsgKi8KPiArdm9pZCB4ZW5fY29tbV9m b3JlYWNoX3R4X3Jpbmcodm9pZCAoKmZ1bmMpKGludCBkb21pZCkpOwo+ICsKPiArLyogaXRlcmF0 ZXMgb3ZlciBhbGwgaW1wb3J0ZXIgcmluZ3MgYW5kIGNhbGxzIHByb3ZpZGVkCj4gKyAqIGZ1bmN0 aW9uIGZvciBlYWNoIG9mIHRoZW0KPiArICovCj4gK3ZvaWQgeGVuX2NvbW1fZm9yZWFjaF9yeF9y aW5nKHZvaWQgKCpmdW5jKShpbnQgZG9taWQpKTsKPiArCj4gKyNlbmRpZiAvLyBfX0hZUEVSX0RN QUJVRl9YRU5fQ09NTV9MSVNUX0hfXwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvaHlw ZXJfZG1hYnVmL2JhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2Rydi5jIGIvZHJpdmVycy9k bWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9kcnYuYwo+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi44MTIyZGMxNWI0Y2IK PiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNr ZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9kcnYuYwo+IEBAIC0wLDAgKzEsNDYgQEAKPiArLyoK PiArICogQ29weXJpZ2h0IMKpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24KPiArICoKPiArICogUGVy bWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24g b2J0YWluaW5nIGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRv Y3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv bgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwg ZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBT b2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4gKyAqIFNvZnR3YXJl IGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlv bnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1p c3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPiArICogcGFyYWdyYXBoKSBzaGFsbCBi ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQo+ ICsgKiBTb2Z0d2FyZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElF RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFO VEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05J TkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZ UklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9S IE9USEVSV0lTRSwgQVJJU0lORwo+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCj4gKyAqIElOIFRI RSBTT0ZUV0FSRS4KPiArICoKPiArICogQXV0aG9yczoKPiArICogICAgRG9uZ3dvbiBLaW0gPGRv bmd3b24ua2ltQGludGVsLmNvbT4KPiArICogICAgTWF0ZXVzeiBQb2xyb2xhIDxtYXRldXN6eC5w b3Ryb2xhQGludGVsLmNvbT4KPiArICoKPiArICovCj4gKwo+ICsjaW5jbHVkZSAiLi4vLi4vaHlw ZXJfZG1hYnVmX2Rydi5oIgo+ICsjaW5jbHVkZSAiaHlwZXJfZG1hYnVmX3hlbl9jb21tLmgiCj4g KyNpbmNsdWRlICJoeXBlcl9kbWFidWZfeGVuX3NobS5oIgo+ICsKPiArc3RydWN0IGh5cGVyX2Rt YWJ1Zl9ia25kX29wcyB4ZW5fYmtuZF9vcHMgPSB7Cj4gKwkuaW5pdCA9IE5VTEwsIC8qIG5vdCBu ZWVkZWQgZm9yIHhlbiAqLwo+ICsJLmNsZWFudXAgPSBOVUxMLCAvKiBub3QgbmVlZGVkIGZvciB4 ZW4gKi8KPiArCS5nZXRfdm1faWQgPSB4ZW5fYmVfZ2V0X2RvbWlkLAo+ICsJLnNoYXJlX3BhZ2Vz ID0geGVuX2JlX3NoYXJlX3BhZ2VzLAo+ICsJLnVuc2hhcmVfcGFnZXMgPSB4ZW5fYmVfdW5zaGFy ZV9wYWdlcywKPiArCS5tYXBfc2hhcmVkX3BhZ2VzID0gKHZvaWQgKil4ZW5fYmVfbWFwX3NoYXJl ZF9wYWdlcywKPiArCS51bm1hcF9zaGFyZWRfcGFnZXMgPSB4ZW5fYmVfdW5tYXBfc2hhcmVkX3Bh Z2VzLAo+ICsJLmluaXRfY29tbV9lbnYgPSB4ZW5fYmVfaW5pdF9jb21tX2VudiwKPiArCS5kZXN0 cm95X2NvbW0gPSB4ZW5fYmVfZGVzdHJveV9jb21tLAo+ICsJLmluaXRfcnhfY2ggPSB4ZW5fYmVf aW5pdF9yeF9yYnVmLAo+ICsJLmluaXRfdHhfY2ggPSB4ZW5fYmVfaW5pdF90eF9yYnVmLAo+ICsJ LnNlbmRfcmVxID0geGVuX2JlX3NlbmRfcmVxLAo+ICt9Owo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tlbmRzL3hlbi9oeXBlcl9kbWFidWZfeGVuX2Rydi5o IGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVm X3hlbl9kcnYuaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5j OTdkYzFjNWQwNDIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVy X2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9kcnYuaAo+IEBAIC0wLDAgKzEs NTMgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IMKpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24KPiAr ICoKPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKPiArICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBh c3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKPiArICogdG8g ZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhv dXQgbGltaXRhdGlvbgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJn ZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiArICogYW5kL29yIHNlbGwgY29w aWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCj4g KyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFu ZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKPiArICogcGFyYWdy YXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRp b25zIG9mIHRoZQo+ICsgKiBTb2Z0d2FyZS4KPiArICoKPiArICogVEhFIFNPRlRXQVJFIElTIFBS T1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IK PiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAo+ICsgKiBUSEUgQVVU SE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdF UyBPUiBPVEhFUgo+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRS QUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4g Q09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdT Cj4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPiArICoKPiArICovCj4gKwo+ICsjaWZuZGVmIF9fSFlQ RVJfRE1BQlVGX1hFTl9EUlZfSF9fCj4gKyNkZWZpbmUgX19IWVBFUl9ETUFCVUZfWEVOX0RSVl9I X18KPiArI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvZ3JhbnRfdGFibGUuaD4KPiArCj4gK2V4dGVy biBzdHJ1Y3QgaHlwZXJfZG1hYnVmX2JrbmRfb3BzIHhlbl9ia25kX29wczsKPiArCj4gKy8qIE1h aW4gcHVycG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBpcyB0byBrZWVwCj4gKyAqIGFsbCByZWZlcmVu Y2VzIGNyZWF0ZWQgb3IgYWNxdWlyZWQgZm9yIHNoYXJpbmcKPiArICogcGFnZXMgd2l0aCBhbm90 aGVyIGRvbWFpbiBmb3IgZnJlZWluZyB0aG9zZSBsYXRlcgo+ICsgKiB3aGVuIHVuc2hhcmluZy4K PiArICovCj4gK3N0cnVjdCB4ZW5fc2hhcmVkX3BhZ2VzX2luZm8gewo+ICsJLyogdG9wIGxldmVs IHJlZmlkICovCj4gKwlncmFudF9yZWZfdCBsdmwzX2dyZWY7Cj4gKwo+ICsJLyogcGFnZSBvZiB0 b3AgbGV2ZWwgYWRkcmVzc2luZywgaXQgY29udGFpbnMgcmVmaWRzIG9mIDJuZCBsdmwgcGFnZXMg Ki8KPiArCWdyYW50X3JlZl90ICpsdmwzX3RhYmxlOwo+ICsKPiArCS8qIHRhYmxlIG9mIDJuZCBs ZXZlbCBwYWdlcywgdGhhdCBjb250YWlucyByZWZpZHMgdG8gZGF0YSBwYWdlcyAqLwo+ICsJZ3Jh bnRfcmVmX3QgKmx2bDJfdGFibGU7Cj4gKwo+ICsJLyogdW5tYXAgb3BzIGZvciBtYXBwZWQgcGFn ZXMgKi8KPiArCXN0cnVjdCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmICp1bm1hcF9vcHM7Cj4gKwo+ ICsJLyogZGF0YSBwYWdlcyB0byBiZSB1bm1hcHBlZCAqLwo+ICsJc3RydWN0IHBhZ2UgKipkYXRh X3BhZ2VzOwo+ICt9Owo+ICsKPiArI2VuZGlmIC8vIF9fSFlQRVJfRE1BQlVGX1hFTl9DT01NX0hf Xwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tlbmRzL3hl bi9oeXBlcl9kbWFidWZfeGVuX3NobS5jIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9i YWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9zaG0uYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5iMmRjZWYzNGUxMGYKPiAtLS0gL2Rldi9udWxsCj4gKysr IGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVm X3hlbl9zaG0uYwo+IEBAIC0wLDAgKzEsNTI1IEBACj4gKy8qCj4gKyAqIENvcHlyaWdodCDCqSAy MDE4IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdy YW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCj4gKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICogdGhlIHJpZ2h0cyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8g c28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsgKgo+ICsgKiBUaGUg YWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVk aW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICogU29mdHdhcmUuCj4gKyAq Cj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZ IE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+ICsgKiBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8g RVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElBQklMSVRZLCBXSEVU SEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcK PiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gKyAqCj4g KyAqIEF1dGhvcnM6Cj4gKyAqICAgIERvbmd3b24gS2ltIDxkb25nd29uLmtpbUBpbnRlbC5jb20+ Cj4gKyAqICAgIE1hdGV1c3ogUG9scm9sYSA8bWF0ZXVzengucG90cm9sYUBpbnRlbC5jb20+Cj4g KyAqCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPHhl bi9ncmFudF90YWJsZS5oPgo+ICsjaW5jbHVkZSA8YXNtL3hlbi9wYWdlLmg+Cj4gKyNpbmNsdWRl ICJoeXBlcl9kbWFidWZfeGVuX2Rydi5oIgo+ICsjaW5jbHVkZSAiLi4vLi4vaHlwZXJfZG1hYnVm X2Rydi5oIgo+ICsKPiArI2RlZmluZSBSRUZTX1BFUl9QQUdFIChQQUdFX1NJWkUvc2l6ZW9mKGdy YW50X3JlZl90KSkKPiArCj4gKy8qCj4gKyAqIENyZWF0ZXMgMiBsZXZlbCBwYWdlIGRpcmVjdG9y eSBzdHJ1Y3R1cmUgZm9yIHJlZmVyZW5jaW5nIHNoYXJlZCBwYWdlcy4KPiArICogVG9wIGxldmVs IHBhZ2UgaXMgYSBzaW5nbGUgcGFnZSB0aGF0IGNvbnRhaW5zIHVwIHRvIDEwMjQgcmVmaWRzIHRo YXQKPiArICogcG9pbnQgdG8gMm5kIGxldmVsIHBhZ2VzLgo+ICsgKgo+ICsgKiBFYWNoIDJuZCBs ZXZlbCBwYWdlIGNvbnRhaW5zIHVwIHRvIDEwMjQgcmVmaWRzIHRoYXQgcG9pbnQgdG8gc2hhcmVk Cj4gKyAqIGRhdGEgcGFnZXMuCj4gKyAqCj4gKyAqIFRoZXJlIHdpbGwgYWx3YXlzIGJlIG9uZSB0 b3AgbGV2ZWwgcGFnZSBhbmQgbnVtYmVyIG9mIDJuZCBsZXZlbCBwYWdlcwo+ICsgKiBkZXBlbmRz IG9uIG51bWJlciBvZiBzaGFyZWQgZGF0YSBwYWdlcy4KPiArICoKPiArICogICAgICAzcmQgbGV2 ZWwgcGFnZSAgICAgICAgICAgICAgICAybmQgbGV2ZWwgcGFnZXMgICAgICAgICAgICBEYXRhIHBh Z2VzCj4gKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIOKUjD4rLS0tLS0tLS0tLS0t LS0tLS0tLS0rIOKUjD4rLS0tLS0tLS0tLS0tKwo+ICsgKiB8Mm5kIGxldmVsIHBhZ2UgMCByZWZp ZCAgIHwtLS3ilJggfERhdGEgcGFnZSAwIHJlZmlkICAgfC3ilJggfERhdGEgcGFnZSAwIHwKPiAr ICogfDJuZCBsZXZlbCBwYWdlIDEgcmVmaWQgICB8LS0t4pSQIHxEYXRhIHBhZ2UgMSByZWZpZCAg IHwt4pSQICstLS0tLS0tLS0tLS0rCj4gKyAqIHwgICAgICAgICAgIC4uLiAgICAgICAgICAgfCAg IHwgfCAgICAgLi4uLiAgICAgICAgICAgfCB8Cj4gKyAqIHwybmQgbGV2ZWwgcGFnZSAxMDIzIHJl ZmlkfC3ilJAgfCB8RGF0YSBwYWdlIDEwMjMgcmVmaWR8IOKUlD4rLS0tLS0tLS0tLS0tKwo+ICsg KiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgfCB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLSsg ICB8RGF0YSBwYWdlIDEgfAo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICAg ICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKwo+ICsgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCDilJQ+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgIHxEYXRhIHBhZ2UgMTAyNCByZWZpZHwKPiArICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8RGF0YSBwYWdlIDEwMjUgcmVmaWR8Cj4gKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAuLi4gICAgICAgICAgfAo+ ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHxEYXRhIHBhZ2UgMjA0NyByZWZp ZHwKPiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICArLS0tLS0tLS0tLS0tLS0t LS0tLS0rCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gKyAqICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAuLi4uLgo+ICsgKiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAg4pSULS0+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICsgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHxEYXRhIHBhZ2UgMTA0NzU1MiByZWZpZHwKPiArICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8RGF0YSBwYWdlIDEwNDc1NTMgcmVmaWR8 Cj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAuLi4gICAgICAg ICAgICAgfAo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxEYXRhIHBhZ2Ug MTA0ODU3NSByZWZpZHwKPiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gKyAqCj4gKyAqIFVzaW5nIHN1Y2ggMiBsZXZlbCBzdHJ1 Y3R1cmUgaXQgaXMgcG9zc2libGUgdG8gcmVmZXJlbmNlIHVwIHRvIDRHQiBvZgo+ICsgKiBzaGFy ZWQgZGF0YSB1c2luZyBzaW5nbGUgcmVmaWQgcG9pbnRpbmcgdG8gdG9wIGxldmVsIHBhZ2UuCj4g KyAqCj4gKyAqIFJldHVybnMgcmVmaWQgb2YgdG9wIGxldmVsIHBhZ2UuCj4gKyAqLwpUaGlzIHNl ZW1zIHRvIGJlIG92ZXItZW5naW5lZXJlZCwgSU1PCj4gK2ludCB4ZW5fYmVfc2hhcmVfcGFnZXMo c3RydWN0IHBhZ2UgKipwYWdlcywgaW50IGRvbWlkLCBpbnQgbmVudHMsCj4gKwkJICAgICAgIHZv aWQgKipyZWZzX2luZm8pCj4gK3sKPiArCWdyYW50X3JlZl90IGx2bDNfZ3JlZjsKPiArCWdyYW50 X3JlZl90ICpsdmwyX3RhYmxlOwo+ICsJZ3JhbnRfcmVmX3QgKmx2bDNfdGFibGU7Cj4gKwo+ICsJ LyoKPiArCSAqIENhbGN1bGF0ZSBudW1iZXIgb2YgcGFnZXMgbmVlZGVkIGZvciAybmQgbGV2ZWwg YWRkcmVzaW5nOgo+ICsJICovCj4gKwlpbnQgbl9sdmwyX2dyZWZzID0gKG5lbnRzL1JFRlNfUEVS X1BBR0UgKwo+ICsJCQkgICAoKG5lbnRzICUgUkVGU19QRVJfUEFHRSkgPyAxIDogMCkpOwo+ICsK PiArCXN0cnVjdCB4ZW5fc2hhcmVkX3BhZ2VzX2luZm8gKnNoX3BhZ2VzX2luZm87Cj4gKwlpbnQg aTsKPiArCj4gKwlsdmwzX3RhYmxlID0gKGdyYW50X3JlZl90ICopX19nZXRfZnJlZV9wYWdlcyhH RlBfS0VSTkVMLCAxKTsKPiArCWx2bDJfdGFibGUgPSAoZ3JhbnRfcmVmX3QgKilfX2dldF9mcmVl X3BhZ2VzKEdGUF9LRVJORUwsIG5fbHZsMl9ncmVmcyk7Cj4gKwo+ICsJc2hfcGFnZXNfaW5mbyA9 IGttYWxsb2Moc2l6ZW9mKCpzaF9wYWdlc19pbmZvKSwgR0ZQX0tFUk5FTCk7Cj4gKwo+ICsJaWYg KCFzaF9wYWdlc19pbmZvKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCSpyZWZzX2luZm8g PSAodm9pZCAqKXNoX3BhZ2VzX2luZm87Cj4gKwo+ICsJLyogc2hhcmUgZGF0YSBwYWdlcyBpbiBy ZWFkb25seSBtb2RlIGZvciBzZWN1cml0eSAqLwo+ICsJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBp KyspIHsKPiArCQlsdmwyX3RhYmxlW2ldID0gZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNjZXNzKGRv bWlkLAo+ICsJCQkJCXBmbl90b19tZm4ocGFnZV90b19wZm4ocGFnZXNbaV0pKSwKPiArCQkJCQl0 cnVlIC8qIHJlYWQgb25seSAqLyk7Cj4gKwkJaWYgKGx2bDJfdGFibGVbaV0gPT0gLUVOT1NQQykg ewo+ICsJCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCQkiTm8gbW9yZSBzcGFjZSBs ZWZ0IGluIGdyYW50IHRhYmxlXG4iKTsKPiArCj4gKwkJCS8qIFVuc2hhcmUgYWxsIGFscmVhZHkg c2hhcmVkIHBhZ2VzIGZvciBsdmwyICovCj4gKwkJCXdoaWxlIChpLS0pIHsKPiArCQkJCWdudHRh Yl9lbmRfZm9yZWlnbl9hY2Nlc3NfcmVmKGx2bDJfdGFibGVbaV0sIDApOwo+ICsJCQkJZ250dGFi X2ZyZWVfZ3JhbnRfcmVmZXJlbmNlKGx2bDJfdGFibGVbaV0pOwo+ICsJCQl9Cj4gKwkJCWdvdG8g ZXJyX2NsZWFudXA7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCS8qIFNoYXJlIDJuZCBsZXZlbCBhZGRy ZXNzaW5nIHBhZ2VzIGluIHJlYWRvbmx5IG1vZGUqLwo+ICsJZm9yIChpID0gMDsgaSA8IG5fbHZs Ml9ncmVmczsgaSsrKSB7Cj4gKwkJbHZsM190YWJsZVtpXSA9IGdudHRhYl9ncmFudF9mb3JlaWdu X2FjY2Vzcyhkb21pZCwKPiArCQkJCQl2aXJ0X3RvX21mbigKPiArCQkJCQkodW5zaWduZWQgbG9u ZylsdmwyX3RhYmxlK2kqUEFHRV9TSVpFKSwKPiArCQkJCQl0cnVlKTsKPiArCj4gKwkJaWYgKGx2 bDNfdGFibGVbaV0gPT0gLUVOT1NQQykgewo+ICsJCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYs Cj4gKwkJCQkiTm8gbW9yZSBzcGFjZSBsZWZ0IGluIGdyYW50IHRhYmxlXG4iKTsKPiArCj4gKwkJ CS8qIFVuc2hhcmUgYWxsIGFscmVhZHkgc2hhcmVkIHBhZ2VzIGZvciBsdmwzICovCj4gKwkJCXdo aWxlIChpLS0pIHsKPiArCQkJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3NfcmVmKGx2bDNfdGFi bGVbaV0sIDEpOwo+ICsJCQkJZ250dGFiX2ZyZWVfZ3JhbnRfcmVmZXJlbmNlKGx2bDNfdGFibGVb aV0pOwo+ICsJCQl9Cj4gKwo+ICsJCQkvKiBVbnNoYXJlIGFsbCBwYWdlcyBmb3IgbHZsMiAqLwo+ ICsJCQl3aGlsZSAobmVudHMtLSkgewo+ICsJCQkJZ250dGFiX2VuZF9mb3JlaWduX2FjY2Vzc19y ZWYoCj4gKwkJCQkJCQlsdmwyX3RhYmxlW25lbnRzXSwgMCk7Cj4gKwkJCQlnbnR0YWJfZnJlZV9n cmFudF9yZWZlcmVuY2UobHZsMl90YWJsZVtuZW50c10pOwo+ICsJCQl9Cj4gKwo+ICsJCQlnb3Rv IGVycl9jbGVhbnVwOwo+ICsJCX0KPiArCX0KPiArCj4gKwkvKiBTaGFyZSBsdmwzX3RhYmxlIGlu IHJlYWRvbmx5IG1vZGUqLwo+ICsJbHZsM19ncmVmID0gZ250dGFiX2dyYW50X2ZvcmVpZ25fYWNj ZXNzKGRvbWlkLAo+ICsJCQl2aXJ0X3RvX21mbigodW5zaWduZWQgbG9uZylsdmwzX3RhYmxlKSwK PiArCQkJdHJ1ZSk7Cj4gKwo+ICsJaWYgKGx2bDNfZ3JlZiA9PSAtRU5PU1BDKSB7Cj4gKwkJZGV2 X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiTm8gbW9yZSBzcGFjZSBsZWZ0IGluIGdyYW50 IHRhYmxlXG4iKTsKPiArCj4gKwkJLyogVW5zaGFyZSBhbGwgcGFnZXMgZm9yIGx2bDMgKi8KPiAr CQl3aGlsZSAoaS0tKSB7Cj4gKwkJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3NfcmVmKGx2bDNf dGFibGVbaV0sIDEpOwo+ICsJCQlnbnR0YWJfZnJlZV9ncmFudF9yZWZlcmVuY2UobHZsM190YWJs ZVtpXSk7Cj4gKwkJfQo+ICsKPiArCQkvKiBVbnNoYXJlIGFsbCBwYWdlcyBmb3IgbHZsMiAqLwo+ ICsJCXdoaWxlIChuZW50cy0tKSB7Cj4gKwkJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3NfcmVm KGx2bDJfdGFibGVbbmVudHNdLCAwKTsKPiArCQkJZ250dGFiX2ZyZWVfZ3JhbnRfcmVmZXJlbmNl KGx2bDJfdGFibGVbbmVudHNdKTsKPiArCQl9Cj4gKwo+ICsJCWdvdG8gZXJyX2NsZWFudXA7Cj4g Kwl9Cj4gKwo+ICsJLyogU3RvcmUgbHZsM190YWJsZSBwYWdlIHRvIGJlIGZyZWVkIGxhdGVyICov Cj4gKwlzaF9wYWdlc19pbmZvLT5sdmwzX3RhYmxlID0gbHZsM190YWJsZTsKPiArCj4gKwkvKiBT dG9yZSBsdmwyX3RhYmxlIHBhZ2VzIHRvIGJlIGZyZWVkIGxhdGVyICovCj4gKwlzaF9wYWdlc19p bmZvLT5sdmwyX3RhYmxlID0gbHZsMl90YWJsZTsKPiArCj4gKwo+ICsJLyogU3RvcmUgZXhwb3J0 ZWQgcGFnZXMgcmVmaWQgdG8gYmUgdW5zaGFyZWQgbGF0ZXIgKi8KPiArCXNoX3BhZ2VzX2luZm8t Pmx2bDNfZ3JlZiA9IGx2bDNfZ3JlZjsKPiArCj4gKwlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYs ICIlcyBleGl0XG4iLCBfX2Z1bmNfXyk7Cj4gKwlyZXR1cm4gbHZsM19ncmVmOwo+ICsKPiArZXJy X2NsZWFudXA6Cj4gKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWx2bDJfdGFibGUsIG5fbHZs Ml9ncmVmcyk7Cj4gKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWx2bDNfdGFibGUsIDEpOwo+ ICsKPiArCXJldHVybiAtRU5PU1BDOwo+ICt9Cj4gKwo+ICtpbnQgeGVuX2JlX3Vuc2hhcmVfcGFn ZXModm9pZCAqKnJlZnNfaW5mbywgaW50IG5lbnRzKQo+ICt7Cj4gKwlzdHJ1Y3QgeGVuX3NoYXJl ZF9wYWdlc19pbmZvICpzaF9wYWdlc19pbmZvOwo+ICsJaW50IG5fbHZsMl9ncmVmcyA9IChuZW50 cy9SRUZTX1BFUl9QQUdFICsKPiArCQkJICAgICgobmVudHMgJSBSRUZTX1BFUl9QQUdFKSA/IDEg OiAwKSk7Cj4gKwlpbnQgaTsKPiArCj4gKwlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYsICIlcyBl bnRyeVxuIiwgX19mdW5jX18pOwo+ICsJc2hfcGFnZXNfaW5mbyA9IChzdHJ1Y3QgeGVuX3NoYXJl ZF9wYWdlc19pbmZvICopKCpyZWZzX2luZm8pOwo+ICsKPiArCWlmIChzaF9wYWdlc19pbmZvLT5s dmwzX3RhYmxlID09IE5VTEwgfHwKPiArCSAgICBzaF9wYWdlc19pbmZvLT5sdmwyX3RhYmxlID09 ICBOVUxMIHx8Cj4gKwkgICAgc2hfcGFnZXNfaW5mby0+bHZsM19ncmVmID09IC0xKSB7Cj4gKwkJ ZGV2X3dhcm4oaHlfZHJ2X3ByaXYtPmRldiwKPiArCQkJICJncmVmIHRhYmxlIGZvciBoeXBlcl9k bWFidWYgYWxyZWFkeSBjbGVhbmVkIHVwXG4iKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KPiArCj4g KwkvKiBFbmQgZm9yZWlnbiBhY2Nlc3MgZm9yIGRhdGEgcGFnZXMsIGJ1dCBkbyBub3QgZnJlZSB0 aGVtICovCj4gKwlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKykgewo+ICsJCWlmIChnbnR0YWJf cXVlcnlfZm9yZWlnbl9hY2Nlc3Moc2hfcGFnZXNfaW5mby0+bHZsMl90YWJsZVtpXSkpCj4gKwkJ CWRldl93YXJuKGh5X2Rydl9wcml2LT5kZXYsICJyZWZpZCBub3Qgc2hhcmVkICEhXG4iKTsKPiAr Cj4gKwkJZ250dGFiX2VuZF9mb3JlaWduX2FjY2Vzc19yZWYoc2hfcGFnZXNfaW5mby0+bHZsMl90 YWJsZVtpXSwgMCk7Cj4gKwkJZ250dGFiX2ZyZWVfZ3JhbnRfcmVmZXJlbmNlKHNoX3BhZ2VzX2lu Zm8tPmx2bDJfdGFibGVbaV0pOwo+ICsJfQo+ICsKPiArCS8qIEVuZCBmb3JlaWduIGFjY2VzcyBm b3IgMm5kIGxldmVsIGFkZHJlc3NpbmcgcGFnZXMgKi8KPiArCWZvciAoaSA9IDA7IGkgPCBuX2x2 bDJfZ3JlZnM7IGkrKykgewo+ICsJCWlmIChnbnR0YWJfcXVlcnlfZm9yZWlnbl9hY2Nlc3Moc2hf cGFnZXNfaW5mby0+bHZsM190YWJsZVtpXSkpCj4gKwkJCWRldl93YXJuKGh5X2Rydl9wcml2LT5k ZXYsICJyZWZpZCBub3Qgc2hhcmVkICEhXG4iKTsKPiArCj4gKwkJaWYgKCFnbnR0YWJfZW5kX2Zv cmVpZ25fYWNjZXNzX3JlZigKPiArCQkJCQlzaF9wYWdlc19pbmZvLT5sdmwzX3RhYmxlW2ldLCAx KSkKPiArCQkJZGV2X3dhcm4oaHlfZHJ2X3ByaXYtPmRldiwgInJlZmlkIHN0aWxsIGluIHVzZSEh IVxuIik7Cj4gKwo+ICsJCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZShzaF9wYWdlc19pbmZv LT5sdmwzX3RhYmxlW2ldKTsKPiArCX0KPiArCj4gKwkvKiBFbmQgZm9yZWlnbiBhY2Nlc3MgZm9y IHRvcCBsZXZlbCBhZGRyZXNzaW5nIHBhZ2UgKi8KPiArCWlmIChnbnR0YWJfcXVlcnlfZm9yZWln bl9hY2Nlc3Moc2hfcGFnZXNfaW5mby0+bHZsM19ncmVmKSkKPiArCQlkZXZfd2FybihoeV9kcnZf cHJpdi0+ZGV2LCAiZ3JlZiBub3Qgc2hhcmVkICEhXG4iKTsKPiArCj4gKwlnbnR0YWJfZW5kX2Zv cmVpZ25fYWNjZXNzX3JlZihzaF9wYWdlc19pbmZvLT5sdmwzX2dyZWYsIDEpOwo+ICsJZ250dGFi X2ZyZWVfZ3JhbnRfcmVmZXJlbmNlKHNoX3BhZ2VzX2luZm8tPmx2bDNfZ3JlZik7Cj4gKwo+ICsJ LyogZnJlZWluZyBhbGwgcGFnZXMgdXNlZCBmb3IgMiBsZXZlbCBhZGRyZXNzaW5nICovCj4gKwlm cmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXNoX3BhZ2VzX2luZm8tPmx2bDJfdGFibGUsIG5fbHZs Ml9ncmVmcyk7Cj4gKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXNoX3BhZ2VzX2luZm8tPmx2 bDNfdGFibGUsIDEpOwo+ICsKPiArCXNoX3BhZ2VzX2luZm8tPmx2bDNfZ3JlZiA9IC0xOwo+ICsJ c2hfcGFnZXNfaW5mby0+bHZsMl90YWJsZSA9IE5VTEw7Cj4gKwlzaF9wYWdlc19pbmZvLT5sdmwz X3RhYmxlID0gTlVMTDsKPiArCWtmcmVlKHNoX3BhZ2VzX2luZm8pOwo+ICsJc2hfcGFnZXNfaW5m byA9IE5VTEw7Cj4gKwo+ICsJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2LCAiJXMgZXhpdFxuIiwg X19mdW5jX18pOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gKy8qIE1hcHMgcHJvdmlkZWQgdG9w IGxldmVsIHJlZiBpZCBhbmQgdGhlbiByZXR1cm4gYXJyYXkgb2YgcGFnZXMKPiArICogY29udGFp bmluZyBkYXRhIHJlZnMuCj4gKyAqLwo+ICtzdHJ1Y3QgcGFnZSAqKnhlbl9iZV9tYXBfc2hhcmVk X3BhZ2VzKHVuc2lnbmVkIGxvbmcgbHZsM19ncmVmLCBpbnQgZG9taWQsCj4gKwkJCQkgICAgICBp bnQgbmVudHMsIHZvaWQgKipyZWZzX2luZm8pCj4gK3sKPiArCXN0cnVjdCBwYWdlICpsdmwzX3Rh YmxlX3BhZ2U7Cj4gKwlzdHJ1Y3QgcGFnZSAqKmx2bDJfdGFibGVfcGFnZXM7Cj4gKwlzdHJ1Y3Qg cGFnZSAqKmRhdGFfcGFnZXM7Cj4gKwlzdHJ1Y3QgeGVuX3NoYXJlZF9wYWdlc19pbmZvICpzaF9w YWdlc19pbmZvOwo+ICsKPiArCWdyYW50X3JlZl90ICpsdmwzX3RhYmxlOwo+ICsJZ3JhbnRfcmVm X3QgKmx2bDJfdGFibGU7Cj4gKwo+ICsJc3RydWN0IGdudHRhYl9tYXBfZ3JhbnRfcmVmIGx2bDNf bWFwX29wczsKPiArCXN0cnVjdCBnbnR0YWJfdW5tYXBfZ3JhbnRfcmVmIGx2bDNfdW5tYXBfb3Bz Owo+ICsKPiArCXN0cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqbHZsMl9tYXBfb3BzOwo+ICsJ c3RydWN0IGdudHRhYl91bm1hcF9ncmFudF9yZWYgKmx2bDJfdW5tYXBfb3BzOwo+ICsKPiArCXN0 cnVjdCBnbnR0YWJfbWFwX2dyYW50X3JlZiAqZGF0YV9tYXBfb3BzOwo+ICsJc3RydWN0IGdudHRh Yl91bm1hcF9ncmFudF9yZWYgKmRhdGFfdW5tYXBfb3BzOwo+ICsKPiArCS8qICMgb2YgZ3JlZnMg aW4gdGhlIGxhc3QgcGFnZSBvZiBsdmwyIHRhYmxlICovCj4gKwlpbnQgbmVudHNfbGFzdCA9IChu ZW50cyAtIDEpICUgUkVGU19QRVJfUEFHRSArIDE7Cj4gKwlpbnQgbl9sdmwyX2dyZWZzID0gKG5l bnRzIC8gUkVGU19QRVJfUEFHRSkgKwo+ICsJCQkgICAoKG5lbnRzX2xhc3QgPiAwKSA/IDEgOiAw KSAtCj4gKwkJCSAgIChuZW50c19sYXN0ID09IFJFRlNfUEVSX1BBR0UpOwo+ICsJaW50IGksIGos IGs7Cj4gKwo+ICsJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2LCAiJXMgZW50cnlcbiIsIF9fZnVu Y19fKTsKPiArCj4gKwlzaF9wYWdlc19pbmZvID0ga21hbGxvYyhzaXplb2YoKnNoX3BhZ2VzX2lu Zm8pLCBHRlBfS0VSTkVMKTsKPiArCSpyZWZzX2luZm8gPSAodm9pZCAqKSBzaF9wYWdlc19pbmZv Owo+ICsKPiArCWx2bDJfdGFibGVfcGFnZXMgPSBrY2FsbG9jKG5fbHZsMl9ncmVmcywgc2l6ZW9m KHN0cnVjdCBwYWdlICopLAo+ICsJCQkJICAgR0ZQX0tFUk5FTCk7Cj4gKwo+ICsJZGF0YV9wYWdl cyA9IGtjYWxsb2MobmVudHMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7Cj4g Kwo+ICsJbHZsMl9tYXBfb3BzID0ga2NhbGxvYyhuX2x2bDJfZ3JlZnMsIHNpemVvZigqbHZsMl9t YXBfb3BzKSwKPiArCQkJICAgICAgIEdGUF9LRVJORUwpOwo+ICsKPiArCWx2bDJfdW5tYXBfb3Bz ID0ga2NhbGxvYyhuX2x2bDJfZ3JlZnMsIHNpemVvZigqbHZsMl91bm1hcF9vcHMpLAo+ICsJCQkJ IEdGUF9LRVJORUwpOwo+ICsKPiArCWRhdGFfbWFwX29wcyA9IGtjYWxsb2MobmVudHMsIHNpemVv ZigqZGF0YV9tYXBfb3BzKSwgR0ZQX0tFUk5FTCk7Cj4gKwlkYXRhX3VubWFwX29wcyA9IGtjYWxs b2MobmVudHMsIHNpemVvZigqZGF0YV91bm1hcF9vcHMpLCBHRlBfS0VSTkVMKTsKPiArCj4gKwkv KiBNYXAgdG9wIGxldmVsIGFkZHJlc3NpbmcgcGFnZSAqLwo+ICsJaWYgKGdudHRhYl9hbGxvY19w YWdlcygxLCAmbHZsM190YWJsZV9wYWdlKSkgewo+ICsJCWRldl9lcnIoaHlfZHJ2X3ByaXYtPmRl diwgIkNhbm5vdCBhbGxvY2F0ZSBwYWdlc1xuIik7Cj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwl9Cj4g Kwo+ICsJbHZsM190YWJsZSA9IChncmFudF9yZWZfdCAqKXBmbl90b19rYWRkcihwYWdlX3RvX3Bm bihsdmwzX3RhYmxlX3BhZ2UpKTsKPiArCj4gKwlnbnR0YWJfc2V0X21hcF9vcCgmbHZsM19tYXBf b3BzLCAodW5zaWduZWQgbG9uZylsdmwzX3RhYmxlLAo+ICsJCQkgIEdOVE1BUF9ob3N0X21hcCB8 IEdOVE1BUF9yZWFkb25seSwKPiArCQkJICAoZ3JhbnRfcmVmX3QpbHZsM19ncmVmLCBkb21pZCk7 Cj4gKwo+ICsJZ250dGFiX3NldF91bm1hcF9vcCgmbHZsM191bm1hcF9vcHMsICh1bnNpZ25lZCBs b25nKWx2bDNfdGFibGUsCj4gKwkJCSAgICBHTlRNQVBfaG9zdF9tYXAgfCBHTlRNQVBfcmVhZG9u bHksIC0xKTsKPiArCj4gKwlpZiAoZ250dGFiX21hcF9yZWZzKCZsdmwzX21hcF9vcHMsIE5VTEws ICZsdmwzX3RhYmxlX3BhZ2UsIDEpKSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ ICsJCQkiSFlQRVJWSVNPUiBtYXAgZ3JhbnQgcmVmIGZhaWxlZCIpOwo+ICsJCXJldHVybiBOVUxM Owo+ICsJfQo+ICsKPiArCWlmIChsdmwzX21hcF9vcHMuc3RhdHVzKSB7Cj4gKwkJZGV2X2Vyciho eV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiSFlQRVJWSVNPUiBtYXAgZ3JhbnQgcmVmIGZhaWxlZCBz dGF0dXMgPSAlZCIsCj4gKwkJCWx2bDNfbWFwX29wcy5zdGF0dXMpOwo+ICsKPiArCQlnb3RvIGVy cm9yX2NsZWFudXBfbHZsMzsKPiArCX0gZWxzZSB7Cj4gKwkJbHZsM191bm1hcF9vcHMuaGFuZGxl ID0gbHZsM19tYXBfb3BzLmhhbmRsZTsKPiArCX0KPiArCj4gKwkvKiBNYXAgYWxsIHNlY29uZCBs ZXZlbCBwYWdlcyAqLwo+ICsJaWYgKGdudHRhYl9hbGxvY19wYWdlcyhuX2x2bDJfZ3JlZnMsIGx2 bDJfdGFibGVfcGFnZXMpKSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LCAiQ2Fubm90 IGFsbG9jYXRlIHBhZ2VzXG4iKTsKPiArCQlnb3RvIGVycm9yX2NsZWFudXBfbHZsMzsKPiArCX0K PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbl9sdmwyX2dyZWZzOyBpKyspIHsKPiArCQlsdmwyX3Rh YmxlID0gKGdyYW50X3JlZl90ICopcGZuX3RvX2thZGRyKAo+ICsJCQkJCXBhZ2VfdG9fcGZuKGx2 bDJfdGFibGVfcGFnZXNbaV0pKTsKPiArCQlnbnR0YWJfc2V0X21hcF9vcCgmbHZsMl9tYXBfb3Bz W2ldLAo+ICsJCQkJICAodW5zaWduZWQgbG9uZylsdmwyX3RhYmxlLCBHTlRNQVBfaG9zdF9tYXAg fAo+ICsJCQkJICBHTlRNQVBfcmVhZG9ubHksCj4gKwkJCQkgIGx2bDNfdGFibGVbaV0sIGRvbWlk KTsKPiArCQlnbnR0YWJfc2V0X3VubWFwX29wKCZsdmwyX3VubWFwX29wc1tpXSwKPiArCQkJCSAg ICAodW5zaWduZWQgbG9uZylsdmwyX3RhYmxlLCBHTlRNQVBfaG9zdF9tYXAgfAo+ICsJCQkJICAg IEdOVE1BUF9yZWFkb25seSwgLTEpOwo+ICsJfQo+ICsKPiArCS8qIFVubWFwIHRvcCBsZXZlbCBw YWdlLCBhcyBpdCB3b24ndCBiZSBuZWVkZWQgYW55IGxvbmdlciAqLwo+ICsJaWYgKGdudHRhYl91 bm1hcF9yZWZzKCZsdmwzX3VubWFwX29wcywgTlVMTCwKPiArCQkJICAgICAgJmx2bDNfdGFibGVf cGFnZSwgMSkpIHsKPiArCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCSJ4ZW46IGNh bm5vdCB1bm1hcCB0b3AgbGV2ZWwgcGFnZVxuIik7Cj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwl9Cj4g Kwo+ICsJLyogTWFyayB0aGF0IHBhZ2Ugd2FzIHVubWFwcGVkICovCj4gKwlsdmwzX3VubWFwX29w cy5oYW5kbGUgPSAtMTsKPiArCj4gKwlpZiAoZ250dGFiX21hcF9yZWZzKGx2bDJfbWFwX29wcywg TlVMTCwKPiArCQkJICAgIGx2bDJfdGFibGVfcGFnZXMsIG5fbHZsMl9ncmVmcykpIHsKPiArCQlk ZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCSJIWVBFUlZJU09SIG1hcCBncmFudCByZWYg ZmFpbGVkIik7Cj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwl9Cj4gKwo+ICsJLyogQ2hlY2tzIGlmIHBh Z2VzIHdlcmUgbWFwcGVkIGNvcnJlY3RseSAqLwo+ICsJZm9yIChpID0gMDsgaSA8IG5fbHZsMl9n cmVmczsgaSsrKSB7Cj4gKwkJaWYgKGx2bDJfbWFwX29wc1tpXS5zdGF0dXMpIHsKPiArCQkJZGV2 X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkJIkhZUEVSVklTT1IgbWFwIGdyYW50IHJlZiBm YWlsZWQgc3RhdHVzID0gJWQiLAo+ICsJCQkJbHZsMl9tYXBfb3BzW2ldLnN0YXR1cyk7Cj4gKwkJ CWdvdG8gZXJyb3JfY2xlYW51cF9sdmwyOwo+ICsJCX0gZWxzZSB7Cj4gKwkJCWx2bDJfdW5tYXBf b3BzW2ldLmhhbmRsZSA9IGx2bDJfbWFwX29wc1tpXS5oYW5kbGU7Cj4gKwkJfQo+ICsJfQo+ICsK PiArCWlmIChnbnR0YWJfYWxsb2NfcGFnZXMobmVudHMsIGRhdGFfcGFnZXMpKSB7Cj4gKwkJZGV2 X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ICsJCQkiQ2Fubm90IGFsbG9jYXRlIHBhZ2VzXG4iKTsK PiArCQlnb3RvIGVycm9yX2NsZWFudXBfbHZsMjsKPiArCX0KPiArCj4gKwlrID0gMDsKPiArCj4g Kwlmb3IgKGkgPSAwOyBpIDwgbl9sdmwyX2dyZWZzIC0gMTsgaSsrKSB7Cj4gKwkJbHZsMl90YWJs ZSA9IHBmbl90b19rYWRkcihwYWdlX3RvX3BmbihsdmwyX3RhYmxlX3BhZ2VzW2ldKSk7Cj4gKwkJ Zm9yIChqID0gMDsgaiA8IFJFRlNfUEVSX1BBR0U7IGorKykgewo+ICsJCQlnbnR0YWJfc2V0X21h cF9vcCgmZGF0YV9tYXBfb3BzW2tdLAo+ICsJCQkJKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRy KAo+ICsJCQkJCQlwYWdlX3RvX3BmbihkYXRhX3BhZ2VzW2tdKSksCj4gKwkJCQlHTlRNQVBfaG9z dF9tYXAgfCBHTlRNQVBfcmVhZG9ubHksCj4gKwkJCQlsdmwyX3RhYmxlW2pdLCBkb21pZCk7Cj4g Kwo+ICsJCQlnbnR0YWJfc2V0X3VubWFwX29wKCZkYXRhX3VubWFwX29wc1trXSwKPiArCQkJCSh1 bnNpZ25lZCBsb25nKXBmbl90b19rYWRkcigKPiArCQkJCQkJcGFnZV90b19wZm4oZGF0YV9wYWdl c1trXSkpLAo+ICsJCQkJR05UTUFQX2hvc3RfbWFwIHwgR05UTUFQX3JlYWRvbmx5LCAtMSk7Cj4g KwkJCWsrKzsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJLyogZm9yIGdyZWZzIGluIHRoZSBsYXN0IGx2 bDIgdGFibGUgcGFnZSAqLwo+ICsJbHZsMl90YWJsZSA9IHBmbl90b19rYWRkcihwYWdlX3RvX3Bm bigKPiArCQkJCWx2bDJfdGFibGVfcGFnZXNbbl9sdmwyX2dyZWZzIC0gMV0pKTsKPiArCj4gKwlm b3IgKGogPSAwOyBqIDwgbmVudHNfbGFzdDsgaisrKSB7Cj4gKwkJZ250dGFiX3NldF9tYXBfb3Ao JmRhdGFfbWFwX29wc1trXSwKPiArCQkJKHVuc2lnbmVkIGxvbmcpcGZuX3RvX2thZGRyKHBhZ2Vf dG9fcGZuKGRhdGFfcGFnZXNba10pKSwKPiArCQkJR05UTUFQX2hvc3RfbWFwIHwgR05UTUFQX3Jl YWRvbmx5LAo+ICsJCQlsdmwyX3RhYmxlW2pdLCBkb21pZCk7Cj4gKwo+ICsJCWdudHRhYl9zZXRf dW5tYXBfb3AoJmRhdGFfdW5tYXBfb3BzW2tdLAo+ICsJCQkodW5zaWduZWQgbG9uZylwZm5fdG9f a2FkZHIocGFnZV90b19wZm4oZGF0YV9wYWdlc1trXSkpLAo+ICsJCQlHTlRNQVBfaG9zdF9tYXAg fCBHTlRNQVBfcmVhZG9ubHksIC0xKTsKPiArCQlrKys7Cj4gKwl9Cj4gKwo+ICsJaWYgKGdudHRh Yl9tYXBfcmVmcyhkYXRhX21hcF9vcHMsIE5VTEwsCj4gKwkJCSAgICBkYXRhX3BhZ2VzLCBuZW50 cykpIHsKPiArCQlkZXZfZXJyKGh5X2Rydl9wcml2LT5kZXYsCj4gKwkJCSJIWVBFUlZJU09SIG1h cCBncmFudCByZWYgZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gTlVMTDsKPiArCX0KPiArCj4gKwkv KiB1bm1hcHBpbmcgbHZsMiB0YWJsZSBwYWdlcyAqLwo+ICsJaWYgKGdudHRhYl91bm1hcF9yZWZz KGx2bDJfdW5tYXBfb3BzLAo+ICsJCQkgICAgICBOVUxMLCBsdmwyX3RhYmxlX3BhZ2VzLAo+ICsJ CQkgICAgICBuX2x2bDJfZ3JlZnMpKSB7Cj4gKwkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2LAo+ ICsJCQkiQ2Fubm90IHVubWFwIDJuZCBsZXZlbCByZWZzXG4iKTsKPiArCQlyZXR1cm4gTlVMTDsK PiArCX0KPiArCj4gKwkvKiBNYXJrIHRoYXQgcGFnZXMgd2VyZSB1bm1hcHBlZCAqLwo+ICsJZm9y IChpID0gMDsgaSA8IG5fbHZsMl9ncmVmczsgaSsrKQo+ICsJCWx2bDJfdW5tYXBfb3BzW2ldLmhh bmRsZSA9IC0xOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKSB7Cj4gKwkJaWYg KGRhdGFfbWFwX29wc1tpXS5zdGF0dXMpIHsKPiArCQkJZGV2X2VycihoeV9kcnZfcHJpdi0+ZGV2 LAo+ICsJCQkJIkhZUEVSVklTT1IgbWFwIGdyYW50IHJlZiBmYWlsZWQgc3RhdHVzID0gJWRcbiIs Cj4gKwkJCQlkYXRhX21hcF9vcHNbaV0uc3RhdHVzKTsKPiArCQkJZ290byBlcnJvcl9jbGVhbnVw X2RhdGE7Cj4gKwkJfSBlbHNlIHsKPiArCQkJZGF0YV91bm1hcF9vcHNbaV0uaGFuZGxlID0gZGF0 YV9tYXBfb3BzW2ldLmhhbmRsZTsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJLyogc3RvcmUgdGhlc2Ug cmVmZXJlbmNlcyBmb3IgdW5tYXBwaW5nIGluIHRoZSBmdXR1cmUgKi8KPiArCXNoX3BhZ2VzX2lu Zm8tPnVubWFwX29wcyA9IGRhdGFfdW5tYXBfb3BzOwo+ICsJc2hfcGFnZXNfaW5mby0+ZGF0YV9w YWdlcyA9IGRhdGFfcGFnZXM7Cj4gKwo+ICsJZ250dGFiX2ZyZWVfcGFnZXMoMSwgJmx2bDNfdGFi bGVfcGFnZSk7Cj4gKwlnbnR0YWJfZnJlZV9wYWdlcyhuX2x2bDJfZ3JlZnMsIGx2bDJfdGFibGVf cGFnZXMpOwo+ICsJa2ZyZWUobHZsMl90YWJsZV9wYWdlcyk7Cj4gKwlrZnJlZShsdmwyX21hcF9v cHMpOwo+ICsJa2ZyZWUobHZsMl91bm1hcF9vcHMpOwo+ICsJa2ZyZWUoZGF0YV9tYXBfb3BzKTsK PiArCj4gKwlkZXZfZGJnKGh5X2Rydl9wcml2LT5kZXYsICIlcyBleGl0XG4iLCBfX2Z1bmNfXyk7 Cj4gKwlyZXR1cm4gZGF0YV9wYWdlczsKPiArCj4gK2Vycm9yX2NsZWFudXBfZGF0YToKPiArCWdu dHRhYl91bm1hcF9yZWZzKGRhdGFfdW5tYXBfb3BzLCBOVUxMLCBkYXRhX3BhZ2VzLAo+ICsJCQkg IG5lbnRzKTsKPiArCj4gKwlnbnR0YWJfZnJlZV9wYWdlcyhuZW50cywgZGF0YV9wYWdlcyk7Cj4g Kwo+ICtlcnJvcl9jbGVhbnVwX2x2bDI6Cj4gKwlpZiAobHZsMl91bm1hcF9vcHNbMF0uaGFuZGxl ICE9IC0xKQo+ICsJCWdudHRhYl91bm1hcF9yZWZzKGx2bDJfdW5tYXBfb3BzLCBOVUxMLAo+ICsJ CQkJICBsdmwyX3RhYmxlX3BhZ2VzLCBuX2x2bDJfZ3JlZnMpOwo+ICsJZ250dGFiX2ZyZWVfcGFn ZXMobl9sdmwyX2dyZWZzLCBsdmwyX3RhYmxlX3BhZ2VzKTsKPiArCj4gK2Vycm9yX2NsZWFudXBf bHZsMzoKPiArCWlmIChsdmwzX3VubWFwX29wcy5oYW5kbGUgIT0gLTEpCj4gKwkJZ250dGFiX3Vu bWFwX3JlZnMoJmx2bDNfdW5tYXBfb3BzLCBOVUxMLAo+ICsJCQkJICAmbHZsM190YWJsZV9wYWdl LCAxKTsKPiArCWdudHRhYl9mcmVlX3BhZ2VzKDEsICZsdmwzX3RhYmxlX3BhZ2UpOwo+ICsKPiAr CWtmcmVlKGx2bDJfdGFibGVfcGFnZXMpOwo+ICsJa2ZyZWUobHZsMl9tYXBfb3BzKTsKPiArCWtm cmVlKGx2bDJfdW5tYXBfb3BzKTsKPiArCWtmcmVlKGRhdGFfbWFwX29wcyk7Cj4gKwo+ICsKPiAr CXJldHVybiBOVUxMOwo+ICt9Cj4gKwo+ICtpbnQgeGVuX2JlX3VubWFwX3NoYXJlZF9wYWdlcyh2 b2lkICoqcmVmc19pbmZvLCBpbnQgbmVudHMpCj4gK3sKPiArCXN0cnVjdCB4ZW5fc2hhcmVkX3Bh Z2VzX2luZm8gKnNoX3BhZ2VzX2luZm87Cj4gKwo+ICsJZGV2X2RiZyhoeV9kcnZfcHJpdi0+ZGV2 LCAiJXMgZW50cnlcbiIsIF9fZnVuY19fKTsKPiArCj4gKwlzaF9wYWdlc19pbmZvID0gKHN0cnVj dCB4ZW5fc2hhcmVkX3BhZ2VzX2luZm8gKikoKnJlZnNfaW5mbyk7Cj4gKwo+ICsJaWYgKHNoX3Bh Z2VzX2luZm8tPnVubWFwX29wcyA9PSBOVUxMIHx8Cj4gKwkgICAgc2hfcGFnZXNfaW5mby0+ZGF0 YV9wYWdlcyA9PSBOVUxMKSB7Cj4gKwkJZGV2X3dhcm4oaHlfZHJ2X3ByaXYtPmRldiwKPiArCQkJ ICJwYWdlcyBhbHJlYWR5IGNsZWFuZWQgdXAgb3IgYnVmZmVyIG5vdCBpbXBvcnRlZCB5ZXRcbiIp Owo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCWlmIChnbnR0YWJfdW5tYXBfcmVmcyhzaF9w YWdlc19pbmZvLT51bm1hcF9vcHMsIE5VTEwsCj4gKwkJCSAgICAgIHNoX3BhZ2VzX2luZm8tPmRh dGFfcGFnZXMsIG5lbnRzKSkgewo+ICsJCWRldl9lcnIoaHlfZHJ2X3ByaXYtPmRldiwgIkNhbm5v dCB1bm1hcCBkYXRhIHBhZ2VzXG4iKTsKPiArCQlyZXR1cm4gLUVGQVVMVDsKPiArCX0KPiArCj4g KwlnbnR0YWJfZnJlZV9wYWdlcyhuZW50cywgc2hfcGFnZXNfaW5mby0+ZGF0YV9wYWdlcyk7Cj4g Kwo+ICsJa2ZyZWUoc2hfcGFnZXNfaW5mby0+ZGF0YV9wYWdlcyk7Cj4gKwlrZnJlZShzaF9wYWdl c19pbmZvLT51bm1hcF9vcHMpOwo+ICsJc2hfcGFnZXNfaW5mby0+dW5tYXBfb3BzID0gTlVMTDsK PiArCXNoX3BhZ2VzX2luZm8tPmRhdGFfcGFnZXMgPSBOVUxMOwo+ICsJa2ZyZWUoc2hfcGFnZXNf aW5mbyk7Cj4gKwlzaF9wYWdlc19pbmZvID0gTlVMTDsKPiArCj4gKwlkZXZfZGJnKGh5X2Rydl9w cml2LT5kZXYsICIlcyBleGl0XG4iLCBfX2Z1bmNfXyk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2JhY2tlbmRzL3hlbi9oeXBl cl9kbWFidWZfeGVuX3NobS5oIGIvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5k cy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9zaG0uaAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5k ZXggMDAwMDAwMDAwMDAwLi5jMzlmMjQxMzUxZjgKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJp dmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9iYWNrZW5kcy94ZW4vaHlwZXJfZG1hYnVmX3hlbl9z aG0uaAo+IEBAIC0wLDAgKzEsNDYgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IMKpIDIwMTggSW50 ZWwgQ29ycG9yYXRpb24KPiArICoKPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwg ZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKPiArICogY29weSBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwKPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlv biwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKPiAr ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cj4gKyAqCj4gKyAqIFRoZSBhYm92ZSBj b3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhl IG5leHQKPiArICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQo+ICsgKiBTb2Z0d2FyZS4KPiArICoKPiArICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z IEtJTkQsIEVYUFJFU1MgT1IKPiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCj4gKyAqIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBT SEFMTAo+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9S IEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgo+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+ICsgKiBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SIE9USEVSIERFQUxJTkdTCj4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPiArICoKPiArICovCj4g Kwo+ICsjaWZuZGVmIF9fSFlQRVJfRE1BQlVGX1hFTl9TSE1fSF9fCj4gKyNkZWZpbmUgX19IWVBF Ul9ETUFCVUZfWEVOX1NITV9IX18KPiArCj4gKy8qIFRoaXMgY29sbGVjdHMgYWxsIHJlZmVyZW5j ZSBudW1iZXJzIGZvciAybmQgbGV2ZWwgc2hhcmVkIHBhZ2VzIGFuZAo+ICsgKiBjcmVhdGUgYSB0 YWJsZSB3aXRoIHRob3NlIGluIDFzdCBsZXZlbCBzaGFyZWQgcGFnZXMgdGhlbiByZXR1cm4gcmVm ZXJlbmNlCj4gKyAqIG51bWJlcnMgZm9yIHRoaXMgdG9wIGxldmVsIHRhYmxlLgo+ICsgKi8KPiAr aW50IHhlbl9iZV9zaGFyZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgZG9taWQsIGlu dCBuZW50cywKPiArCQkgICAgdm9pZCAqKnJlZnNfaW5mbyk7Cj4gKwo+ICtpbnQgeGVuX2JlX3Vu c2hhcmVfcGFnZXModm9pZCAqKnJlZnNfaW5mbywgaW50IG5lbnRzKTsKPiArCj4gKy8qIE1hcHMg cHJvdmlkZWQgdG9wIGxldmVsIHJlZiBpZCBhbmQgdGhlbiByZXR1cm4gYXJyYXkgb2YgcGFnZXMg Y29udGFpbmluZwo+ICsgKiBkYXRhIHJlZnMuCj4gKyAqLwo+ICtzdHJ1Y3QgcGFnZSAqKnhlbl9i ZV9tYXBfc2hhcmVkX3BhZ2VzKHVuc2lnbmVkIGxvbmcgbHZsM19ncmVmLCBpbnQgZG9taWQsCj4g KwkJCQkgICAgICBpbnQgbmVudHMsCj4gKwkJCQkgICAgICB2b2lkICoqcmVmc19pbmZvKTsKPiAr Cj4gK2ludCB4ZW5fYmVfdW5tYXBfc2hhcmVkX3BhZ2VzKHZvaWQgKipyZWZzX2luZm8sIGludCBu ZW50cyk7Cj4gKwo+ICsjZW5kaWYgLyogX19IWVBFUl9ETUFCVUZfWEVOX1NITV9IX18gKi8KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL2h5cGVyX2RtYWJ1Zi9oeXBlcl9kbWFidWZfZHJ2 LmMgYi9kcml2ZXJzL2RtYS1idWYvaHlwZXJfZG1hYnVmL2h5cGVyX2RtYWJ1Zl9kcnYuYwo+IGlu ZGV4IDE4YzFjZDczNWVhMi4uMzMyMGY5ZGNjNzY5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZG1h LWJ1Zi9oeXBlcl9kbWFidWYvaHlwZXJfZG1hYnVmX2Rydi5jCj4gKysrIGIvZHJpdmVycy9kbWEt YnVmL2h5cGVyX2RtYWJ1Zi9oeXBlcl9kbWFidWZfZHJ2LmMKPiBAQCAtNDIsNiArNDIsMTAgQEAK PiAgICNpbmNsdWRlICJoeXBlcl9kbWFidWZfbGlzdC5oIgo+ICAgI2luY2x1ZGUgImh5cGVyX2Rt YWJ1Zl9pZC5oIgo+ICAgCj4gKyNpZmRlZiBDT05GSUdfSFlQRVJfRE1BQlVGX1hFTgo+ICsjaW5j bHVkZSAiYmFja2VuZHMveGVuL2h5cGVyX2RtYWJ1Zl94ZW5fZHJ2LmgiCj4gKyNlbmRpZgo+ICsK PiAgIE1PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7Cj4gICBNT0RV TEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOwo+ICAgCj4gQEAgLTE0NSw3ICsxNDksMTMg QEAgc3RhdGljIGludCBfX2luaXQgaHlwZXJfZG1hYnVmX2Rydl9pbml0KHZvaWQpCj4gICAJCXJl dHVybiByZXQ7Cj4gICAJfQo+ICAgCj4gKy8qIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIFhFTiBo eXBlcnZpc29yICovCj4gKyNpZmRlZiBDT05GSUdfSFlQRVJfRE1BQlVGX1hFTgo+ICsJaHlfZHJ2 X3ByaXYtPmJrbmRfb3BzID0gJnhlbl9ia25kX29wczsKPiArI2Vsc2UKPiAgIAloeV9kcnZfcHJp di0+YmtuZF9vcHMgPSBOVUxMOwo+ICsJcHJfZXJyKCJoeXBlcl9kbWFidWYgZHJ2IGN1cnJlbnRs eSBzdXBwb3J0cyBYRU4gb25seS5cbiIpOwo+ICsjZW5kaWYKPiAgIAo+ICAgCWlmIChoeV9kcnZf cHJpdi0+YmtuZF9vcHMgPT0gTlVMTCkgewo+ICAgCQlwcl9lcnIoIkh5cGVyX2RtYWJ1Zjogbm8g YmFja2VuZCBmb3VuZFxuIik7Cj4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5w cm9qZWN0Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8v eGVuLWRldmVs