From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jordan Crouse Subject: Re: [DPU PATCH 2/3] drm/msm/dp: add displayPort driver support Date: Thu, 11 Oct 2018 11:43:48 -0600 Message-ID: <20181011174348.GH9977@jcrouse-lnx.qualcomm.com> References: <1539191759-14836-1-git-send-email-chandanu@codeaurora.org> <1539191759-14836-3-git-send-email-chandanu@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1539191759-14836-3-git-send-email-chandanu-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: Chandan Uddaraju Cc: linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, nganji-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, abhinavk-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, hoegsberg-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org, jsanka-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-arm-msm@vger.kernel.org T24gV2VkLCBPY3QgMTAsIDIwMTggYXQgMTA6MTU6NThBTSAtMDcwMCwgQ2hhbmRhbiBVZGRhcmFq dSB3cm90ZToKPiBBZGQgdGhlIG5lZWRlZCBkaXNwbGF5UG9ydCBmaWxlcyB0byBlbmFibGUgRFAg ZHJpdmVyCj4gb24gbXNtIHRhcmdldC4KPiAKPiAiZHBfZGlzcGxheSIgbW9kdWxlIGlzIHRoZSBt YWluIG1vZHVsZSB0aGF0IGNhbGxzIGludG8KPiBvdGhlciBzdWItbW9kdWxlcy4gImRwX2RybSIg ZmlsZSByZXByZXNlbnRzIHRoZSBpbnRlcmZhY2UKPiBiZXR3ZWVuIERSTSBmcmFtZXdvcmsgYW5k IERQIGRyaXZlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBDaGFuZGFuIFVkZGFyYWp1IDxjaGFuZGFu dUBjb2RlYXVyb3JhLm9yZz4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnICAg ICAgICAgICAgICAgICB8ICAgIDkgKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxlICAg ICAgICAgICAgICAgIHwgICAxNSArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Rpc3AvZHB1MS9k cHVfaW9fdXRpbC5jIHwgIDIwNiArKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZGlzcC9kcHUx L2RwdV9pb191dGlsLmggfCAgIDQ0ICsKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9hdXgu YyAgICAgICAgICAgICB8ICA1NzAgKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2Rw L2RwX2F1eC5oICAgICAgICAgICAgIHwgICA0NCArCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAv ZHBfY2F0YWxvZy5jICAgICAgICAgfCAxMTg4ICsrKysrKysrKysrKysrKysrKysrCj4gIGRyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfY2F0YWxvZy5oICAgICAgICAgfCAgMTQ0ICsrKwo+ICBkcml2 ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX2N0cmwuYyAgICAgICAgICAgIHwgMTQ3NSArKysrKysrKysr KysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfY3RybC5oICAgICAg ICAgICAgfCAgIDUwICsKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9kZWJ1Zy5jICAgICAg ICAgICB8ICA1MDcgKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGVidWcu aCAgICAgICAgICAgfCAgIDgxICsrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfZGlzcGxh eS5jICAgICAgICAgfCAgOTc3ICsrKysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9t c20vZHAvZHBfZGlzcGxheS5oICAgICAgICAgfCAgIDU1ICsKPiAgZHJpdmVycy9ncHUvZHJtL21z bS9kcC9kcF9kcm0uYyAgICAgICAgICAgICB8ICA1NDIgKysrKysrKysrKwo+ICBkcml2ZXJzL2dw dS9kcm0vbXNtL2RwL2RwX2RybS5oICAgICAgICAgICAgIHwgICA1MiArCj4gIGRyaXZlcnMvZ3B1 L2RybS9tc20vZHAvZHBfZXh0Y29uLmMgICAgICAgICAgfCAgNDAwICsrKysrKysKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9leHRjb24uaCAgICAgICAgICB8ICAxMTEgKysKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9saW5rLmMgICAgICAgICAgICB8IDE1NDkgKysrKysrKysrKysr KysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfbGluay5oICAgICAg ICAgICAgfCAgMTg0ICsrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYW5lbC5jICAg ICAgICAgICB8ICA2MjQgKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9w YW5lbC5oICAgICAgICAgICB8ICAxMjEgKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBf cGFyc2VyLmMgICAgICAgICAgfCAgNjc5ICsrKysrKysrKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0v bXNtL2RwL2RwX3BhcnNlci5oICAgICAgICAgIHwgIDIwNSArKysrCj4gIGRyaXZlcnMvZ3B1L2Ry bS9tc20vZHAvZHBfcG93ZXIuYyAgICAgICAgICAgfCAgNTk5ICsrKysrKysrKysrCj4gIGRyaXZl cnMvZ3B1L2RybS9tc20vZHAvZHBfcG93ZXIuaCAgICAgICAgICAgfCAgIDU3ICsKPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9yZWcuaCAgICAgICAgICAgICB8ICAzNTcgKysrKysrCj4gIGRy aXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5jICAgICAgICAgICAgICAgfCAgICAyICsKPiAgZHJp dmVycy9ncHUvZHJtL21zbS9tc21fZHJ2LmggICAgICAgICAgICAgICB8ICAgMjIgKwo+ICBpbmNs dWRlL2RybS9kcm1fZHBfaGVscGVyLmggICAgICAgICAgICAgICAgIHwgICAxOSArCj4gIDMwIGZp bGVzIGNoYW5nZWQsIDEwODg3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKClRoaXMgaXMg bXkgbGFzdCBnbyAtIHRoZSBlbmQgaXMgaW4gc2lnaHQuCgo8c25pcCBhbGwgdGhlIHdheSB0byBk cF9wYXJzZXIuYz4KCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFy c2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3BhcnNlci5jCj4gbmV3IGZpbGUgbW9k ZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5hMzY2ZGM1Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmMKPiBAQCAtMCwwICsxLDY3OSBAQAo+ ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOCwgVGhlIExpbnV4IEZvdW5kYXRpb24u IEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAy IGFuZAo+ICsgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbi4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK PiArICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoK PiArICovCgpTUERYIHBsZWFzZQoKPiArI2RlZmluZSBwcl9mbXQoZm10KQkiW2RybS1kcF0gJXM6 ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KPiArCj4g KyNpbmNsdWRlICJkcF9wYXJzZXIuaCIKPiArCj4gK3N0YXRpYyB2b2lkIGRwX3BhcnNlcl91bm1h cF9pb19yZXNvdXJjZXMoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlzdHJ1Y3Qg ZHBfaW8gKmlvID0gJnBhcnNlci0+aW87Cj4gKwo+ICsJbXNtX2Rzc19pb3VubWFwKCZpby0+ZHBf YWhiKTsKPiArCW1zbV9kc3NfaW91bm1hcCgmaW8tPmRwX2F1eCk7Cj4gKwltc21fZHNzX2lvdW5t YXAoJmlvLT5kcF9saW5rKTsKPiArCW1zbV9kc3NfaW91bm1hcCgmaW8tPmRwX3AwKTsKPiArCW1z bV9kc3NfaW91bm1hcCgmaW8tPnBoeV9pbyk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT5sbl90 eDBfaW8pOwo+ICsJbXNtX2Rzc19pb3VubWFwKCZpby0+bG5fdHgwX2lvKTsKPiArCW1zbV9kc3Nf aW91bm1hcCgmaW8tPmRwX3BsbF9pbyk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT5kcF9jY19p byk7Cj4gKwltc21fZHNzX2lvdW5tYXAoJmlvLT51c2IzX2RwX2NvbSk7Cj4gKwltc21fZHNzX2lv dW5tYXAoJmlvLT5xZnByb21faW8pOwo+ICt9CgpJZiB5b3UgdXNlIGRldm1fIHRvIGlvcmVtYXAg YXMgc3VnZ2VzdGVkIHByZXZpb3VzbHksIHRoZW4gdGhpcyBhbGwgZW5kcyB1cCBnb2luZwphd2F5 LgoKPiArc3RhdGljIGludCBkcF9wYXJzZXJfY3RybF9yZXMoc3RydWN0IGRwX3BhcnNlciAqcGFy c2VyKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJdTMyIGluZGV4Owo+ICsJc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldiA9IHBhcnNlci0+cGRldjsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAq b2Zfbm9kZSA9IHBhcnNlci0+cGRldi0+ZGV2Lm9mX25vZGU7Cj4gKwlzdHJ1Y3QgZHBfaW8gKmlv ID0gJnBhcnNlci0+aW87Cj4gKwo+ICsJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZl9ub2Rl LCAiY2VsbC1pbmRleCIsICZpbmRleCk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoImNlbGwt aW5kZXggbm90IHNwZWNpZmllZCwgcmM9JWRcbiIsIHJjKTsKPiArCQlnb3RvIGVycjsKPiArCX0K ClRoaXMgdmFsdWUgZG9lc24ndCBhcHBlYXIgdG8gYmUgdXNlZCBhbnl3aGVyZSBpbiB0aGlzIGNv ZGUsIHNvIHdoeSBhcmUgeW91CmdyYWJiaW5nIGl0PwoKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFw X2J5bmFtZShwZGV2LCAmaW8tPmRwX2FoYiwgImRwX2FoYiIpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJ cHJfZXJyKCJ1bmFibGUgdG8gcmVtYXAgZHAgaW8gcmVzb3VyY2VzXG4iKTsKCm1zbV9pb3JlbWFw KCkgaGVscGZ1bGx5IGdpdmVzIGFuIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5n IHRoZSBuYW1lIG9mCnRoZSByZWdpb24gdGhhdCBmYWlsZWQgIHNvIHlvdSBkb24ndCBuZWVkIGEg cmVkdW5kYW50IG1lc3NhZ2UgaGVyZS4KCj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmMg PSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfYXV4LCAiZHBfYXV4Iik7Cj4g KwlpZiAocmMpIHsKPiArCQlwcl9lcnIoInVuYWJsZSB0byByZW1hcCBkcCBpbyByZXNvdXJjZXNc biIpOwo+ICsJCWdvdG8gZXJyOwo+ICsJfQo+ICsKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFwX2J5 bmFtZShwZGV2LCAmaW8tPmRwX2xpbmssICJkcF9saW5rIik7Cj4gKwlpZiAocmMpIHsKPiArCQlw cl9lcnIoInVuYWJsZSB0byByZW1hcCBkcCBpbyByZXNvdXJjZXNcbiIpOwo+ICsJCWdvdG8gZXJy Owo+ICsJfQo+ICsKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8tPmRw X3AwLCAiZHBfcDAiKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigidW5hYmxlIHRvIHJlbWFw IGRwIGlvIHJlc291cmNlc1xuIik7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4gKwo+ICsJcmMgPSBt c21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+cGh5X2lvLCAiZHBfcGh5Iik7Cj4gKwlp ZiAocmMpIHsKPiArCQlwcl9lcnIoInVuYWJsZSB0byByZW1hcCBkcCBQSFkgcmVzb3VyY2VzXG4i KTsKPiArCQlnb3RvIGVycjsKPiArCX0KPiArCj4gKwlyYyA9IG1zbV9kc3NfaW9yZW1hcF9ieW5h bWUocGRldiwgJmlvLT5sbl90eDBfaW8sICJkcF9sbl90eDAiKTsKPiArCWlmIChyYykgewo+ICsJ CXByX2VycigidW5hYmxlIHRvIHJlbWFwIGRwIFRYMCByZXNvdXJjZXNcbiIpOwo+ICsJCWdvdG8g ZXJyOwo+ICsJfQo+ICsKPiArCXJjID0gbXNtX2Rzc19pb3JlbWFwX2J5bmFtZShwZGV2LCAmaW8t PmxuX3R4MV9pbywgImRwX2xuX3R4MSIpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJ1bmFi bGUgdG8gcmVtYXAgZHAgVFgxIHJlc291cmNlc1xuIik7Cj4gKwkJZ290byBlcnI7Cj4gKwl9Cj4g Kwo+ICsJcmMgPSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfcGxsX2lvLCAi ZHBfcGxsIik7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoInVuYWJsZSB0byByZW1hcCBEUCBQ TEwgcmVzb3VyY2VzXG4iKTsKPiArCQlnb3RvIGVycjsKPiArCX0KPiArCj4gKwlyYyA9IG1zbV9k c3NfaW9yZW1hcF9ieW5hbWUocGRldiwgJmlvLT51c2IzX2RwX2NvbSwgInVzYjNfZHBfY29tIik7 Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoInVuYWJsZSB0byByZW1hcCBVU0IzIERQIGNvbSBy ZXNvdXJjZXNcbiIpOwo+ICsJCWdvdG8gZXJyOwo+ICsJfQo+ICsKPiArCWlmIChtc21fZHNzX2lv cmVtYXBfYnluYW1lKHBkZXYsICZpby0+ZHBfY2NfaW8sICJkcF9tbXNzX2NjIikpIHsKPiArCQlw cl9lcnIoInVuYWJsZSB0byByZW1hcCBkcCBNTVNTX0NDIHJlc291cmNlc1xuIik7Cj4gKwkJZ290 byBlcnI7Cj4gKwl9Cj4gKwo+ICsJaWYgKG1zbV9kc3NfaW9yZW1hcF9ieW5hbWUocGRldiwgJmlv LT5xZnByb21faW8sICJxZnByb21fcGh5c2ljYWwiKSkKPiArCQlwcl93YXJuKCJ1bmFibGUgdG8g cmVtYXAgZHAgcWZwcm9tIHJlc291cmNlc1xuIik7Cj4gKwoKSXQgZG9lc24ndCBsb29rIGxpa2Ug eW91IGFyZSB1c2luZyB0aGlzIGluIHRoZSBjdXJyZW50IGNvZGUgc28geW91IGNhbiByZW1vdmUg aXQKYnV0IGlmIHlvdSBkaWQgbmVlZCB0byByZWFkIGZ1c2VzIHVzZSBudnJhbV9jZWxsIGluc3Rl YWQuCgoKPiArCXJldHVybiAwOwo+ICtlcnI6Cj4gKwlkcF9wYXJzZXJfdW5tYXBfaW9fcmVzb3Vy Y2VzKHBhcnNlcik7Cj4gKwlyZXR1cm4gcmM7Cj4gK30KClRoaXMgd2hvbGUgZnVuY3Rpb24gaXMg Y3J5aW5nIG91dCBmb3IgYW4gYXJyYXk6CgpzdHJ1Y3QgewoJdm9pZCBfX2lvbWVtICoqYmFzZTsK CWNvbnN0IGNoYXIgKm5hbWU7Cn0gcmVnaW9uc1tdID0gewoJeyAmaW8tPmRwX2F1eC5iYXNlLCAi ZHBfYXV4IiB9LAoJLi4uCgl7ICZpby0+ZHBfY2NfaW8uYmFzZSwgImRwX21tc19jYyIgfSwKCXsg TlVMTCwgTlVMTCB9Cn07Cgpmb3IoaSA9IDA7IHJlZ2lvbnNbaV0ubmFtZTsgaSsrKSB7CiAgICAg IHZvaWQgX19pb21lbSAqcHRyID0gbXNtX2lvcmVtYXAocGRldiwgcmVnaW9uc1tpXS5uYW1lLCBO VUxMKTsKICAgICAgaWYgKElTX0VSUihwdHIpKQogICAgICAgIHJldHVybiAtRU5PREVWOwogICAg ICoocmVnaW9uc1tpXS5iYXNlKSA9IHB0cjsKfQoKcmV0dXJuIDA7CgoKPiArCj4gK3N0YXRpYyBj b25zdCBjaGFyICpkcF9nZXRfcGh5X2F1eF9jb25maWdfcHJvcGVydHkodTMyIGNmZ190eXBlKQo+ ICt7Cj4gKwlzd2l0Y2ggKGNmZ190eXBlKSB7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHMDoKPiArCQly ZXR1cm4gInFjb20sYXV4LWNmZzAtc2V0dGluZ3MiOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzE6Cj4g KwkJcmV0dXJuICJxY29tLGF1eC1jZmcxLXNldHRpbmdzIjsKPiArCWNhc2UgUEhZX0FVWF9DRkcy Ogo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnMi1zZXR0aW5ncyI7Cj4gKwljYXNlIFBIWV9BVVhf Q0ZHMzoKPiArCQlyZXR1cm4gInFjb20sYXV4LWNmZzMtc2V0dGluZ3MiOwo+ICsJY2FzZSBQSFlf QVVYX0NGRzQ6Cj4gKwkJcmV0dXJuICJxY29tLGF1eC1jZmc0LXNldHRpbmdzIjsKPiArCWNhc2Ug UEhZX0FVWF9DRkc1Ogo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnNS1zZXR0aW5ncyI7Cj4gKwlj YXNlIFBIWV9BVVhfQ0ZHNjoKPiArCQlyZXR1cm4gInFjb20sYXV4LWNmZzYtc2V0dGluZ3MiOwo+ ICsJY2FzZSBQSFlfQVVYX0NGRzc6Cj4gKwkJcmV0dXJuICJxY29tLGF1eC1jZmc3LXNldHRpbmdz IjsKPiArCWNhc2UgUEhZX0FVWF9DRkc4Ogo+ICsJCXJldHVybiAicWNvbSxhdXgtY2ZnOC1zZXR0 aW5ncyI7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHOToKPiArCQlyZXR1cm4gInFjb20sYXV4LWNmZzkt c2V0dGluZ3MiOwo+ICsJZGVmYXVsdDoKPiArCQlyZXR1cm4gInVua25vd24iOwo+ICsJfQo+ICt9 CgpTaW5jZSBDRkcwIGlzIDAgYW5kIENGRzEgaXMgYW5kIHNvIG9uIGluc3RlYWQgb2YgY2FsbGlu ZwphIGZ1bmN0aW9uIHlvdSBjYW4ganVzdCBjb25zdHJ1Y3QgdGhlIHN0cmluZyBpbmxpbmUgd2hl biB5b3UgbmVlZCBpdC4uLi4KCj4gK3N0YXRpYyB2b2lkIGRwX3BhcnNlcl9waHlfYXV4X2NmZ19y ZXNldChzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCBpID0gMDsKPiArCj4g Kwlmb3IgKGkgPSAwOyBpIDwgUEhZX0FVWF9DRkdfTUFYOyBpKyspCj4gKwkJcGFyc2VyLT5hdXhf Y2ZnW2ldID0gKGNvbnN0IHN0cnVjdCBkcF9hdXhfY2ZnKXsgMCB9Owo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGRwX3BhcnNlcl9hdXgoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlz dHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBwYXJzZXItPnBkZXYtPmRldi5vZl9ub2RlOwo+ ICsJaW50IGxlbiA9IDAsIGkgPSAwLCBqID0gMCwgY29uZmlnX2NvdW50ID0gMDsKPiArCWNvbnN0 IGNoYXIgKmRhdGE7Cj4gKwlpbnQgY29uc3QgbWluaW11bV9jb25maWdfY291bnQgPSAxOwo+ICsK PiArCWZvciAoaSA9IDA7IGkgPCBQSFlfQVVYX0NGR19NQVg7IGkrKykgewo+ICsJCWNvbnN0IGNo YXIgKnByb3BlcnR5ID0gZHBfZ2V0X3BoeV9hdXhfY29uZmlnX3Byb3BlcnR5KGkpOwoKSGVyZSwg aW5zdGVhZCBvZiB0aGlzLCBkbwoKY2hhciBwcm9wZXJ0eVsyNF07CnNucHJpbnRmKHByb3BlcnR5 LCBzaXplb2YocHJvcGVydHkpLCAicWNvbSxhdXgtY2ZnJWQtc2V0dGluZ3MiLCBpKTsKCj4gKwkJ ZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShvZl9ub2RlLCBwcm9wZXJ0eSwgJmxlbik7Cj4gKwkJaWYg KCFkYXRhKSB7Cj4gKwkJCXByX2VycigiVW5hYmxlIHRvIHJlYWQgJXNcbiIsIHByb3BlcnR5KTsK PiArCQkJZ290byBlcnJvcjsKPiArCQl9Cj4gKwo+ICsJCWNvbmZpZ19jb3VudCA9IGxlbiAtIDE7 Cj4gKwkJaWYgKChjb25maWdfY291bnQgPCBtaW5pbXVtX2NvbmZpZ19jb3VudCkgfHwKPiArCQkJ KGNvbmZpZ19jb3VudCA+IERQX0FVWF9DRkdfTUFYX1ZBTFVFX0NOVCkpIHsKPiArCQkJcHJfZXJy KCJJbnZhbGlkIGNvbmZpZyBjb3VudCAoJWQpIGNvbmZpZ3MgZm9yICVzXG4iLAo+ICsJCQkJCWNv bmZpZ19jb3VudCwgcHJvcGVydHkpOwo+ICsJCQlnb3RvIGVycm9yOwo+ICsJCX0KPiArCj4gKwkJ cGFyc2VyLT5hdXhfY2ZnW2ldLm9mZnNldCA9IGRhdGFbMF07Cj4gKwkJcGFyc2VyLT5hdXhfY2Zn W2ldLmNmZ19jbnQgPSBjb25maWdfY291bnQ7Cj4gKwkJcHJfZGVidWcoIiVzIG9mZnNldD0weCV4 LCBjZmdfY250PSVkXG4iLAo+ICsJCQkJcHJvcGVydHksCj4gKwkJCQlwYXJzZXItPmF1eF9jZmdb aV0ub2Zmc2V0LAo+ICsJCQkJcGFyc2VyLT5hdXhfY2ZnW2ldLmNmZ19jbnQpOwo+ICsJCWZvciAo aiA9IDE7IGogPCBsZW47IGorKykgewo+ICsJCQlwYXJzZXItPmF1eF9jZmdbaV0ubHV0W2ogLSAx XSA9IGRhdGFbal07Cj4gKwkJCXByX2RlYnVnKCIlcyBsdXRbJWRdPTB4JXhcbiIsCj4gKwkJCQkJ cHJvcGVydHksCj4gKwkJCQkJaSwKPiArCQkJCQlwYXJzZXItPmF1eF9jZmdbaV0ubHV0W2ogLSAx XSk7Cj4gKwkJfQoKcWNvbSxhdXgtY2ZnTi1zZXR0aW5ncyBhcHBlYXJzIHRvIGJlIGFuIGFycmF5 LiAgU2VlbXMgbGlrZSBpdCB3b3VsZCBiZSBlYXNpZXIKanVzdCB0byB1c2Ugb2ZfcHJvcGVydHlf cmVhZF91MzJfYXJyYXkoKT8gIFNlZW1zIGxpa2UgaXQgd291bGQgc2F2ZSB5b3Vyc2VsZiBhCmJp dCBvZiB3b3JrLgoKPiArCX0KPiArCQlyZXR1cm4gMDsKPiArCj4gK2Vycm9yOgo+ICsJZHBfcGFy c2VyX3BoeV9hdXhfY2ZnX3Jlc2V0KHBhcnNlcik7Cj4gKwlyZXR1cm4gLUVJTlZBTDsKPiArfQo+ ICsKPiArc3RhdGljIGludCBkcF9wYXJzZXJfbWlzYyhzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIp Cj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBw YXJzZXItPnBkZXYtPmRldi5vZl9ub2RlOwo+ICsKPiArCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91 MzIob2Zfbm9kZSwKPiArCQkicWNvbSxtYXgtcGNsay1mcmVxdWVuY3kta2h6IiwgJnBhcnNlci0+ bWF4X3BjbGtfa2h6KTsKPiArCWlmIChyYykKPiArCQlwYXJzZXItPm1heF9wY2xrX2toeiA9IERQ X01BWF9QSVhFTF9DTEtfS0haOwoKT24gZXJyb3IsIG9mX3Byb3BlcnR5X3JlYWRfdTMyIGFuZCBm cmllbmRzIHdpbGwgbm90IHRvdWNoIHRoZSBwYXNzZWQgaW4gcG9pbnRlciwKc28geW91IGNhbiBz YWZlbHkgc2V0IHRoZSBwb2ludGVyIHRvIGEgZGVmYXVsdCBhbmQgdGhlbiBub3Qgd29ycnkgYWJv dXQgY2hlY2tpbmcKdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiAtIHNvIHRoaXMgY2FuIGp1c3Qg dHVybiBpbnRvOgoKCXBhcnNlci0+bWF4X3BjbGtfaHogPSBEUF9NQVhfUElYRUxfQ0xLX0tIWjsK CW9mX3Byb3BlcnR5X3JlYWRfdTMyKG9mX25vZGUsICJxY29tLG1heC1wY2xrLWZyZXF1ZW5jeS1r aHoiLAoJJnBhcnNlci0+bWF4X3BjbGtfa2h6KTsKCj4gKwo+ICsJcmV0dXJuIDA7CgpUaGlzIGZ1 bmN0aW9uIGRvZXNuJ3QgbmVlZCB0byByZXR1cm4gYW55dGhpbmcuICBBbmQgdGVjaG5pY2FsbHks IGl0IGRvZXNuJ3QgbmVlZAp0byBiZSBhIGZ1bmN0aW9uLCBidXQgdGhlIHBsYWNlIHdoZXJlIGl0 IGdldHMgY2FsbGVkIGlzIGVudGlyZWx5IGNvbXByaXNlZCBvZgpmdW5jdGlvbnMgc28gdGhhdHMg cHJvYmFibHkgbm90IGEgaHVnZSBkZWFsLgoKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wYXJz ZXJfcGluY3RybChzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCByYyA9IDA7 Cj4gKwlzdHJ1Y3QgZHBfcGluY3RybCAqcGluY3RybCA9ICZwYXJzZXItPnBpbmN0cmw7Cj4gKwo+ ICsJcGluY3RybC0+cGluID0gZGV2bV9waW5jdHJsX2dldCgmcGFyc2VyLT5wZGV2LT5kZXYpOwo+ ICsKPiArCWlmIChJU19FUlJfT1JfTlVMTChwaW5jdHJsLT5waW4pKSB7CgpJdCBsb29rcyB0byBt ZSBsaWtlIHBpbmN0cmxfZ2V0IG9ubHkgcmV0dXJucyBFUlJfUFRSIHNvIHlvdSBjYW4ganVzdCB1 c2UKSVNfRVJSKCkgZm9yIHlvdXIgY2hlY2suCgo+ICsJCXJjID0gUFRSX0VSUihwaW5jdHJsLT5w aW4pOwo+ICsJCXByX2VycigiZmFpbGVkIHRvIGdldCBwaW5jdHJsLCByYz0lZFxuIiwgcmMpOwoK QW5kIHlvdSBjYW4ganVzdCByZXR1cm4gUFRSX0VSUihwaW5jdHJsLT5waW4pIGhlcmUKCj4gKwkJ Z290byBlcnJvcjsKPiArCX0KPiArCj4gKwlwaW5jdHJsLT5zdGF0ZV9hY3RpdmUgPSBwaW5jdHJs X2xvb2t1cF9zdGF0ZShwaW5jdHJsLT5waW4sCj4gKwkJCQkJIm1kc3NfZHBfYWN0aXZlIik7Cj4g KwlpZiAoSVNfRVJSX09SX05VTEwocGluY3RybC0+c3RhdGVfYWN0aXZlKSkgewoKU2FtZS4KCj4g KwkJcmMgPSBQVFJfRVJSKHBpbmN0cmwtPnN0YXRlX2FjdGl2ZSk7Cj4gKwkJcHJfZXJyKCJmYWls ZWQgdG8gZ2V0IHBpbmN0cmwgYWN0aXZlIHN0YXRlLCByYz0lZFxuIiwgcmMpOwo+ICsJCWdvdG8g ZXJyb3I7Cj4gKwl9Cj4gKwo+ICsJcGluY3RybC0+c3RhdGVfc3VzcGVuZCA9IHBpbmN0cmxfbG9v a3VwX3N0YXRlKHBpbmN0cmwtPnBpbiwKPiArCQkJCQkibWRzc19kcF9zbGVlcCIpOwo+ICsJaWYg KElTX0VSUl9PUl9OVUxMKHBpbmN0cmwtPnN0YXRlX3N1c3BlbmQpKSB7ClNhbWUKPiArCQlyYyA9 IFBUUl9FUlIocGluY3RybC0+c3RhdGVfc3VzcGVuZCk7Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8g Z2V0IHBpbmN0cmwgc3VzcGVuZCBzdGF0ZSwgcmM9JWRcbiIsIHJjKTsKPiArCQlnb3RvIGVycm9y Owo+ICsJfQo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKCllvdSBkb24ndCBuZWVkIHRoaXMgbGFi ZWwgaWYgeW91IHJldHVybiBhcyBzb29uIGFzIHlvdSBnZXQgdGhlIGVycm9yLgoKPiArfQo+ICsK PiArc3RhdGljIGludCBkcF9wYXJzZXJfZ3BpbyhzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4g K3sKPiArCWludCBpID0gMDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwYXJzZXItPnBkZXYt PmRldjsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKPiAr CXN0cnVjdCBkc3NfbW9kdWxlX3Bvd2VyICptcCA9ICZwYXJzZXItPm1wW0RQX0NPUkVfUE1dOwo+ ICsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkcF9ncGlvc1tdID0gewo+ICsJCSJxY29tLGF1 eC1lbi1ncGlvIiwKPiArCQkicWNvbSxhdXgtc2VsLWdwaW8iLAo+ICsJCSJxY29tLHVzYnBsdWct Y2MtZ3BpbyIsCj4gKwl9Owo+ICsKPiArCW1wLT5ncGlvX2NvbmZpZyA9IGRldm1fa3phbGxvYyhk ZXYsCj4gKwkJc2l6ZW9mKHN0cnVjdCBkc3NfZ3BpbykgKiBBUlJBWV9TSVpFKGRwX2dwaW9zKSwg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW1wLT5ncGlvX2NvbmZpZykKPiArCQlyZXR1cm4gLUVOT01F TTsKPiArCj4gKwltcC0+bnVtX2dwaW8gPSBBUlJBWV9TSVpFKGRwX2dwaW9zKTsKPiArCj4gKwlm b3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcF9ncGlvcyk7IGkrKykgewo+ICsJCW1wLT5ncGlv X2NvbmZpZ1tpXS5ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ob2Zfbm9kZSwKPiArCQkJZHBfZ3Bp b3NbaV0sIDApOwo+ICsKPiArCQlpZiAoIWdwaW9faXNfdmFsaWQobXAtPmdwaW9fY29uZmlnW2ld LmdwaW8pKSB7Cj4gKwkJCXByX2VycigiJXMgZ3BpbyBub3Qgc3BlY2lmaWVkXG4iLCBkcF9ncGlv c1tpXSk7Cj4gKwkJCXJldHVybiAtRUlOVkFMOwo+ICsJCX0KPiArCj4gKwkJc3RybGNweShtcC0+ Z3Bpb19jb25maWdbaV0uZ3Bpb19uYW1lLCBkcF9ncGlvc1tpXSwKPiArCQkJc2l6ZW9mKG1wLT5n cGlvX2NvbmZpZ1tpXS5ncGlvX25hbWUpKTsKPiArCj4gKwkJbXAtPmdwaW9fY29uZmlnW2ldLnZh bHVlID0gMDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0 IGNoYXIgKmRwX3BhcnNlcl9zdXBwbHlfbm9kZV9uYW1lKGVudW0gZHBfcG1fdHlwZSBtb2R1bGUp Cj4gK3sKPiArCXN3aXRjaCAobW9kdWxlKSB7Cj4gKwljYXNlIERQX0NPUkVfUE06CXJldHVybiAi cWNvbSxjb3JlLXN1cHBseS1lbnRyaWVzIjsKPiArCWNhc2UgRFBfQ1RSTF9QTToJcmV0dXJuICJx Y29tLGN0cmwtc3VwcGx5LWVudHJpZXMiOwo+ICsJY2FzZSBEUF9QSFlfUE06CQlyZXR1cm4gInFj b20scGh5LXN1cHBseS1lbnRyaWVzIjsKPiArCWRlZmF1bHQ6CQlyZXR1cm4gIj8/PyI7CgpUaGlz IGlzbid0IHBvc3NpYmxlLiAgQXQgdGhlIHZlcnkgbGVhc3QgcmV0dXJuIE5VTEwgYW5kIGdpdmUg eW91IHNlbGYgYSBjaGFuY2UKdG8gZGV0ZWN0IHRoZSBlcnJvciAtIG90aGVyd2lzZSB5b3UnbGwg YmUgcmV0dXJuaW5nIG9kZCBlcnJvciBtZXNzYWdlcyB3aXRoID8/Pz8KaW4gaXQgdGhhdCB3b3Vs ZCBiZSBoYXJkZXIgdG8gZGVidWcuCgo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bh cnNlcl9nZXRfdnJlZyhzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIsCj4gKwkJZW51bSBkcF9wbV90 eXBlIG1vZHVsZSkKPiArewo+ICsJaW50IGkgPSAwLCByYyA9IDA7Cj4gKwl1MzIgdG1wID0gMDsK PiArCWNvbnN0IGNoYXIgKnBtX3N1cHBseV9uYW1lID0gTlVMTDsKPiArCXN0cnVjdCBkZXZpY2Vf bm9kZSAqc3VwcGx5X25vZGUgPSBOVUxMOwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2Rl ID0gcGFyc2VyLT5wZGV2LT5kZXYub2Zfbm9kZTsKPiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3Vw cGx5X3Jvb3Rfbm9kZSA9IE5VTEw7Cj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciAqbXAgPSAm cGFyc2VyLT5tcFttb2R1bGVdOwo+ICsKPiArCW1wLT5udW1fdnJlZyA9IDA7Cj4gKwlwbV9zdXBw bHlfbmFtZSA9IGRwX3BhcnNlcl9zdXBwbHlfbm9kZV9uYW1lKG1vZHVsZSk7Cj4gKwlzdXBwbHlf cm9vdF9ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUob2Zfbm9kZSwgcG1fc3VwcGx5X25hbWUp Owo+ICsJaWYgKCFzdXBwbHlfcm9vdF9ub2RlKSB7Cj4gKwkJcHJfZXJyKCJubyBzdXBwbHkgZW50 cnkgcHJlc2VudDogJXNcbiIsIHBtX3N1cHBseV9uYW1lKTsKPiArCQlnb3RvIG5vdnJlZzsKPiAr CX0KPiArCj4gKwltcC0+bnVtX3ZyZWcgPSBvZl9nZXRfYXZhaWxhYmxlX2NoaWxkX2NvdW50KHN1 cHBseV9yb290X25vZGUpOwo+ICsKPiArCWlmIChtcC0+bnVtX3ZyZWcgPT0gMCkgewo+ICsJCXBy X2RlYnVnKCJubyB2cmVnXG4iKTsKPiArCQlnb3RvIG5vdnJlZzsKPiArCX0gZWxzZSB7Cj4gKwkJ cHJfZGVidWcoInZyZWcgZm91bmQuIGNvdW50PSVkXG4iLCBtcC0+bnVtX3ZyZWcpOwo+ICsJfQo+ ICsKPiArCW1wLT52cmVnX2NvbmZpZyA9IGRldm1fa3phbGxvYygmcGFyc2VyLT5wZGV2LT5kZXYs Cj4gKwkJc2l6ZW9mKHN0cnVjdCBkc3NfdnJlZykgKiBtcC0+bnVtX3ZyZWcsIEdGUF9LRVJORUwp Owo+ICsJaWYgKCFtcC0+dnJlZ19jb25maWcpIHsKPiArCQlyYyA9IC1FTk9NRU07Cj4gKwkJZ290 byBlcnJvcjsKPiArCX0KPiArCj4gKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKHN1cHBseV9yb290 X25vZGUsIHN1cHBseV9ub2RlKSB7Cj4gKwkJY29uc3QgY2hhciAqc3QgPSBOVUxMOwo+ICsJCS8q IHZyZWctbmFtZSAqLwo+ICsJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3VwcGx5X25v ZGUsCj4gKwkJCSJxY29tLHN1cHBseS1uYW1lIiwgJnN0KTsKPiArCQlpZiAocmMpIHsKPiArCQkJ cHJfZXJyKCJlcnJvciByZWFkaW5nIG5hbWUuIHJjPSVkXG4iLAo+ICsJCQkJIHJjKTsKPiArCQkJ Z290byBlcnJvcjsKPiArCQl9Cj4gKwkJc25wcmludGYobXAtPnZyZWdfY29uZmlnW2ldLnZyZWdf bmFtZSwKPiArCQkJQVJSQVlfU0laRSgobXAtPnZyZWdfY29uZmlnW2ldLnZyZWdfbmFtZSkpLCAi JXMiLCBzdCk7CgpBUlJBWV9TSVpFIHdvcmtzIGZvciBhIHN0cmluZywgYnV0IHdlIHByZWZlciBz aXplb2YoKSBpbiBtb3N0IGNhc2VzLiBJZiB5b3UKYXJlIGp1c3QgY29weWluZyBhIHN0cmluZywg Y29uc2lkZXIgdXNpbmcgc3RybmNweSgpIGFuZCBmcmllbmRzLiAgSXQgd2lsbCBiZQpmYXN0ZXIg dGhhbiBzbnByaW50Zi4KCj4gKwkJLyogdnJlZy1taW4tdm9sdGFnZSAqLwo+ICsJCXJjID0gb2Zf cHJvcGVydHlfcmVhZF91MzIoc3VwcGx5X25vZGUsCj4gKwkJCSJxY29tLHN1cHBseS1taW4tdm9s dGFnZSIsICZ0bXApOwoKQXMgbWVudGlvbmVkIGFib3ZlLCBvbiBlcnJvciB0aGV5IGRvbid0IHRv dWNoIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBzbyB5b3UKZG9uJ3QgbmVlZCB0byB1c2UgYSB0 ZW1wb3JhcnkgdmFyaWFibGUuCgo+ICsJCWlmIChyYykgewo+ICsJCQlwcl9lcnIoImVycm9yIHJl YWRpbmcgbWluIHZvbHQuIHJjPSVkXG4iLAo+ICsJCQkJcmMpOwo+ICsJCQlnb3RvIGVycm9yOwo+ ICsJCX0KPiArCQltcC0+dnJlZ19jb25maWdbaV0ubWluX3ZvbHRhZ2UgPSB0bXA7Cj4gKwo+ICsJ CS8qIHZyZWctbWF4LXZvbHRhZ2UgKi8KPiArCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHN1 cHBseV9ub2RlLAo+ICsJCQkicWNvbSxzdXBwbHktbWF4LXZvbHRhZ2UiLCAmdG1wKTsKPiArCQlp ZiAocmMpIHsKPiArCQkJcHJfZXJyKCJlcnJvciByZWFkaW5nIG1heCB2b2x0LiByYz0lZFxuIiwK PiArCQkJCXJjKTsKPiArCQkJZ290byBlcnJvcjsKPiArCQl9Cj4gKwkJbXAtPnZyZWdfY29uZmln W2ldLm1heF92b2x0YWdlID0gdG1wOwo+ICsKPiArCQkvKiBlbmFibGUtbG9hZCAqLwo+ICsJCXJj ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoc3VwcGx5X25vZGUsCj4gKwkJCSJxY29tLHN1cHBseS1l bmFibGUtbG9hZCIsICZ0bXApOwo+ICsJCWlmIChyYykgewo+ICsJCQlwcl9lcnIoImVycm9yIHJl YWRpbmcgZW5hYmxlIGxvYWQuIHJjPSVkXG4iLAo+ICsJCQkJcmMpOwo+ICsJCQlnb3RvIGVycm9y Owo+ICsJCX0KPiArCQltcC0+dnJlZ19jb25maWdbaV0uZW5hYmxlX2xvYWQgPSB0bXA7Cj4gKwo+ ICsJCS8qIGRpc2FibGUtbG9hZCAqLwo+ICsJCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoc3Vw cGx5X25vZGUsCj4gKwkJCSJxY29tLHN1cHBseS1kaXNhYmxlLWxvYWQiLCAmdG1wKTsKPiArCQlp ZiAocmMpIHsKPiArCQkJcHJfZXJyKCJlcnJvciByZWFkaW5nIGRpc2FibGUgbG9hZC4gcmM9JWRc biIsCj4gKwkJCQlyYyk7Cj4gKwkJCWdvdG8gZXJyb3I7Cj4gKwkJfQo+ICsJCW1wLT52cmVnX2Nv bmZpZ1tpXS5kaXNhYmxlX2xvYWQgPSB0bXA7Cj4gKwo+ICsJCXByX2RlYnVnKCIlcyBtaW49JWQs IG1heD0lZCwgZW5hYmxlPSVkLCBkaXNhYmxlPSVkXG4iLAo+ICsJCQltcC0+dnJlZ19jb25maWdb aV0udnJlZ19uYW1lLAo+ICsJCQltcC0+dnJlZ19jb25maWdbaV0ubWluX3ZvbHRhZ2UsCj4gKwkJ CW1wLT52cmVnX2NvbmZpZ1tpXS5tYXhfdm9sdGFnZSwKPiArCQkJbXAtPnZyZWdfY29uZmlnW2ld LmVuYWJsZV9sb2FkLAo+ICsJCQltcC0+dnJlZ19jb25maWdbaV0uZGlzYWJsZV9sb2FkCj4gKwkJ CSk7Cj4gKwkJKytpOwo+ICsJfQo+ICsKPiArCXJldHVybiByYzsKPiArCj4gK2Vycm9yOgo+ICsJ aWYgKG1wLT52cmVnX2NvbmZpZykgewoKWW91IGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIE5VTEwg aGVyZS4KCj4gKwkJZGV2bV9rZnJlZSgmcGFyc2VyLT5wZGV2LT5kZXYsIG1wLT52cmVnX2NvbmZp Zyk7Cj4gKwkJbXAtPnZyZWdfY29uZmlnID0gTlVMTDsKPiArCX0KPiArbm92cmVnOgo+ICsJbXAt Pm51bV92cmVnID0gMDsKPiArCj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGRwX3BhcnNlcl9wdXRfdnJlZ19kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCXN0cnVjdCBk c3NfbW9kdWxlX3Bvd2VyICptcCkKPiArewo+ICsJaWYgKCFtcCkgewo+ICsJCURFVl9FUlIoImlu dmFsaWQgaW5wdXRcbiIpOwoKVGhpcyBlcnJvciBtZXNzYWdlIGlzbid0IHVzZWZ1bCB3aGVuIHlv dSBhcmUgdGFraW5nIGRvd24gdGhlIGRldmljZSAtIGp1c3QKcXVpZXRseSBza2lwLgoKPiArCQly ZXR1cm47Cj4gKwl9Cj4gKwo+ICsJaWYgKG1wLT52cmVnX2NvbmZpZykgewo+ICsJCWRldm1fa2Zy ZWUoZGV2LCBtcC0+dnJlZ19jb25maWcpOwoKWW91IGRvbid0IG5lZWQgdG8ga2ZyZWUgbWFuYWdl ZCBtZW1vcnkuCgo+ICsJCW1wLT52cmVnX2NvbmZpZyA9IE5VTEw7Cj4gKwl9Cj4gKwltcC0+bnVt X3ZyZWcgPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3BhcnNlcl9yZWd1bGF0b3Ioc3Ry dWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlpbnQgaSwgcmMgPSAwOwo+ICsJc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHBhcnNlci0+cGRldjsKPiArCj4gKwkvKiBQYXJzZSB0 aGUgcmVndWxhdG9yIGluZm9ybWF0aW9uICovCj4gKwlmb3IgKGkgPSBEUF9DT1JFX1BNOyBpIDwg RFBfTUFYX1BNOyBpKyspIHsKPiArCQlyYyA9IGRwX3BhcnNlcl9nZXRfdnJlZyhwYXJzZXIsIGkp Owo+ICsJCWlmIChyYykgewo+ICsJCQlwcl9lcnIoImdldF9kdF92cmVnX2RhdGEgZmFpbGVkIGZv ciAlcy4gcmM9JWRcbiIsCj4gKwkJCQlkcF9wYXJzZXJfcG1fbmFtZShpKSwgcmMpOwoKZHBfcGFy c2VyX2dldF92cmVnKCkgaXMgdmVyeSBsb3VkIGFib3V0IGVycm9ycyAtIHlvdSBkb24ndCBuZWVk IHRvIHBpbGUgb24uCgo+ICsJCQlpLS07Cj4gKwkJCWZvciAoOyBpID49IERQX0NPUkVfUE07IGkt LSkKPiArCQkJCWRwX3BhcnNlcl9wdXRfdnJlZ19kYXRhKCZwZGV2LT5kZXYsCj4gKwkJCQkJJnBh cnNlci0+bXBbaV0pOwo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJj Owo+ICt9Cj4gKwo+ICtzdGF0aWMgYm9vbCBkcF9wYXJzZXJfY2hlY2tfcHJlZml4KGNvbnN0IGNo YXIgKmNsa19wcmVmaXgsIGNvbnN0IGNoYXIgKmNsa19uYW1lKQo+ICt7Cj4gKwlyZXR1cm4gISFz dHJuc3RyKGNsa19uYW1lLCBjbGtfcHJlZml4LCBzdHJsZW4oY2xrX25hbWUpKTsKClRoaXMgaXNu J3Qgc2F2aW5nIHlvdSBhbnkgbGluZXMgb2YgY29kZSAtIHlvdSBjYW4gZG8gdGhlIHN0cmluZyBj b21wYXJlCmRpcmVjdGx5IGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9ucy4KCj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGRwX3BhcnNlcl9wdXRfY2xrX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAo+ICsJ c3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKm1wKQo+ICt7Cj4gKwlpZiAoIW1wKSB7Cj4gKwkJREVW X0VSUigiJXM6IGludmFsaWQgaW5wdXRcbiIsIF9fZnVuY19fKTsKCllvdSBhcmUgdGFraW5nIGRv d24gdGhlIGRldmljZSBzbyB5b3UgZG9uJ3QgY2FyZSBpZiBhbnl0aGluZyBpcyBpbnZhbGlkLgoK PiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJaWYgKG1wLT5jbGtfY29uZmlnKSB7Cj4gKwkJZGV2 bV9rZnJlZShkZXYsIG1wLT5jbGtfY29uZmlnKTsKCllvdSBkb24ndCBuZWVkIHRvIGZyZWUgbWFu YWdlZCBkZXZpY2UgbWVtb3J5LgoKPiArCQltcC0+Y2xrX2NvbmZpZyA9IE5VTEw7Cj4gKwl9Cj4g Kwo+ICsJbXAtPm51bV9jbGsgPSAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkcF9wYXJzZXJf cHV0X2dwaW9fZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9w b3dlciAqbXApCj4gK3sKPiArCWlmICghbXApIHsKPiArCQlERVZfRVJSKCIlczogaW52YWxpZCBp bnB1dFxuIiwgX19mdW5jX18pOwoKQXMgYWJvdmUuCgo+ICsJCXJldHVybjsKPiArCX0KPiArCj4g KwlpZiAobXAtPmdwaW9fY29uZmlnKSB7Cj4gKwkJZGV2bV9rZnJlZShkZXYsIG1wLT5ncGlvX2Nv bmZpZyk7CgpBbHNvIGFzIGFib3ZlLgoKPiArCQltcC0+Z3Bpb19jb25maWcgPSBOVUxMOwo+ICsJ fQo+ICsKPiArCW1wLT5udW1fZ3BpbyA9IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcGFy c2VyX2luaXRfY2xrX2RhdGEoc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlpbnQg bnVtX2NsayA9IDAsIGkgPSAwLCByYyA9IDA7Cj4gKwlpbnQgY29yZV9jbGtfY291bnQgPSAwLCBj dHJsX2Nsa19jb3VudCA9IDA7Cj4gKwljb25zdCBjaGFyICpjb3JlX2NsayA9ICJjb3JlIjsKPiAr CWNvbnN0IGNoYXIgKmN0cmxfY2xrID0gImN0cmwiOwo+ICsJY29uc3QgY2hhciAqY2xrX25hbWU7 Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGFyc2VyLT5wZGV2LT5kZXY7Cj4gKwlzdHJ1Y3Qg ZHNzX21vZHVsZV9wb3dlciAqY29yZV9wb3dlciA9ICZwYXJzZXItPm1wW0RQX0NPUkVfUE1dOwo+ ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIgKmN0cmxfcG93ZXIgPSAmcGFyc2VyLT5tcFtEUF9D VFJMX1BNXTsKPiArCj4gKwludW1fY2xrID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhkZXYt Pm9mX25vZGUsICJjbG9jay1uYW1lcyIpOwo+ICsJaWYgKG51bV9jbGsgPD0gMCkgewo+ICsJCXBy X2Vycigibm8gY2xvY2tzIGFyZSBkZWZpbmVkXG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJ Z290byBleGl0Owo+ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrOyBpKyspIHsK PiArCQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChkZXYtPm9mX25vZGUsCj4gKwkJCQki Y2xvY2stbmFtZXMiLCBpLCAmY2xrX25hbWUpOwo+ICsKPiArCQlpZiAoZHBfcGFyc2VyX2NoZWNr X3ByZWZpeChjb3JlX2NsaywgY2xrX25hbWUpKQo+ICsJCQljb3JlX2Nsa19jb3VudCsrOwoKQWNj b3JkaW5nIHRvIHlvdXIgYmluZGluZ3MsICdjb3JlJyBvciAnY3RybCcgd2lsbCBiZSB0aGUgcHJl Zml4IGZvciB0aGUgY2xvY2ssCnNvIHdoeSBhcmUgeW91IHVzaW5nIHN0cm5zdHI/ICBzdHJuY21w IHdvcmtzIGp1c3QgYXMgd2VsbC4KCiFzdHJuY21wKCJjb3JlIiwgY2xrX25hbWUsIDQpCgoKPiAr Cj4gKwkJaWYgKGRwX3BhcnNlcl9jaGVja19wcmVmaXgoY3RybF9jbGssIGNsa19uYW1lKSkKCmlm ICghc3RybmNtcCgiY3RybCIsIGNsa19uYW1lLCA0KQoKPiArCQkJY3RybF9jbGtfY291bnQrKzsK PiArCX0KPiArCj4gKwkvKiBJbml0aWFsaXplIHRoZSBDT1JFIHBvd2VyIG1vZHVsZSAqLwo+ICsJ aWYgKGNvcmVfY2xrX2NvdW50IDw9IDApIHsKCmNvcmVfY2xrX2NvdW50IGNsZWFybHkgY2FuJ3Qg YmUgbGVzcyB0aGFuIHplcm8uCgo+ICsJCXByX2Vycigibm8gY29yZSBjbG9ja3MgYXJlIGRlZmlu ZWRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGV4aXQ7Cj4gKwl9Cj4gKwo+ICsJ Y29yZV9wb3dlci0+bnVtX2NsayA9IGNvcmVfY2xrX2NvdW50Owo+ICsJY29yZV9wb3dlci0+Y2xr X2NvbmZpZyA9IGRldm1fa3phbGxvYyhkZXYsCj4gKwkJCXNpemVvZihzdHJ1Y3QgZHNzX2Nsaykg KiBjb3JlX3Bvd2VyLT5udW1fY2xrLAo+ICsJCQlHRlBfS0VSTkVMKTsKPiArCWlmICghY29yZV9w b3dlci0+Y2xrX2NvbmZpZykgewo+ICsJCXJjID0gLUVJTlZBTDsKCnRoZSByZXR1cm4gdmFsdWUg c2hvdWxkIGJlIC1FTk9NRU0gaGVyZS4KCj4gKwkJZ290byBleGl0Owo+ICsJfQo+ICsKPiArCS8q IEluaXRpYWxpemUgdGhlIENUUkwgcG93ZXIgbW9kdWxlICovCj4gKwlpZiAoY3RybF9jbGtfY291 bnQgPD0gMCkgewoKQWdhaW4sIHRoaXMgY2xlYXJseSBjYW4ndCBiZSBsZXNzIHRoYW4gemVyby4K Cj4gKwkJcHJfZXJyKCJubyBjdHJsIGNsb2NrcyBhcmUgZGVmaW5lZFxuIik7Cj4gKwkJcmMgPSAt RUlOVkFMOwo+ICsJCWdvdG8gY3RybF9jbG9ja19lcnJvcjsKPiArCX0KPiArCj4gKwljdHJsX3Bv d2VyLT5udW1fY2xrID0gY3RybF9jbGtfY291bnQ7Cj4gKwljdHJsX3Bvd2VyLT5jbGtfY29uZmln ID0gZGV2bV9remFsbG9jKGRldiwKPiArCQkJc2l6ZW9mKHN0cnVjdCBkc3NfY2xrKSAqIGN0cmxf cG93ZXItPm51bV9jbGssCj4gKwkJCUdGUF9LRVJORUwpOwo+ICsJaWYgKCFjdHJsX3Bvd2VyLT5j bGtfY29uZmlnKSB7Cj4gKwkJY3RybF9wb3dlci0+bnVtX2NsayA9IDA7Cj4gKwkJcmMgPSAtRUlO VkFMOwoKQW5kIC1FTk9NRU0gYWdhaW4uCgo+ICsJCWdvdG8gY3RybF9jbG9ja19lcnJvcjsKPiAr CX0KPiArCj4gKwlyZXR1cm4gcmM7Cj4gKwo+ICtjdHJsX2Nsb2NrX2Vycm9yOgo+ICsJZHBfcGFy c2VyX3B1dF9jbGtfZGF0YShkZXYsIGNvcmVfcG93ZXIpOwo+ICtleGl0Ogo+ICsJcmV0dXJuIHJj OwoKRG9uJ3QgdXNlIHRoaXMgbGFiZWwgLSBqdXN0IHJldHVybiB0aGUgZXJyb3IgY29kZSBkaXJl Y3RseSBpbnN0ZWFkLgoKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wYXJzZXJfY2xvY2soc3Ry dWN0IGRwX3BhcnNlciAqcGFyc2VyKQo+ICt7Cj4gKwlpbnQgcmMgPSAwLCBpID0gMDsKPiArCWlu dCBudW1fY2xrID0gMDsKPiArCWludCBjb3JlX2Nsa19pbmRleCA9IDAsIGN0cmxfY2xrX2luZGV4 ID0gMDsKPiArCWludCBjb3JlX2Nsa19jb3VudCA9IDAsIGN0cmxfY2xrX2NvdW50ID0gMDsKPiAr CWNvbnN0IGNoYXIgKmNsa19uYW1lOwo+ICsJY29uc3QgY2hhciAqY29yZV9jbGsgPSAiY29yZSI7 Cj4gKwljb25zdCBjaGFyICpjdHJsX2NsayA9ICJjdHJsIjsKPiArCXN0cnVjdCBkZXZpY2UgKmRl diA9ICZwYXJzZXItPnBkZXYtPmRldjsKPiArCXN0cnVjdCBkc3NfbW9kdWxlX3Bvd2VyICpjb3Jl X3Bvd2VyID0gJnBhcnNlci0+bXBbRFBfQ09SRV9QTV07Cj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9w b3dlciAqY3RybF9wb3dlciA9ICZwYXJzZXItPm1wW0RQX0NUUkxfUE1dOwo+ICsKPiArCWNvcmVf cG93ZXIgPSAmcGFyc2VyLT5tcFtEUF9DT1JFX1BNXTsKPiArCWN0cmxfcG93ZXIgPSAmcGFyc2Vy LT5tcFtEUF9DVFJMX1BNXTsKPiArCj4gKwlyYyA9ICBkcF9wYXJzZXJfaW5pdF9jbGtfZGF0YShw YXJzZXIpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBw b3dlciBkYXRhXG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBleGl0Owo+ICsJfQo+ ICsKPiArCWNvcmVfY2xrX2NvdW50ID0gY29yZV9wb3dlci0+bnVtX2NsazsKPiArCWN0cmxfY2xr X2NvdW50ID0gY3RybF9wb3dlci0+bnVtX2NsazsKPiArCj4gKwludW1fY2xrID0gY29yZV9jbGtf Y291bnQgKyBjdHJsX2Nsa19jb3VudDsKPiArCgpBY2NvcmRpbmcgdG8geW91ciBiaW5kaW5ncywg bm90IGV2ZXJ5IGNsb2NrIGluIHlvdXIgbGlzdCBpcyBhIGNvcmUgb3IgYSBjdHJsIC0KYXJlIHRo b3NlIGNsb2NrcyBpZ25vcmVkPwoKPiArCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrOyBpKyspIHsK PiArCQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19pbmRleChkZXYtPm9mX25vZGUsICJjbG9jay1u YW1lcyIsCj4gKwkJCQlpLCAmY2xrX25hbWUpOwoKVGhpcyBpbXBsaWVzIHRoYXQgYSBjb3JlXyBv ciBjdHJsXyBjbG9jayBhcmUgZmlyc3QgaW4gdGhlIGxpc3QuICBZb3VyIGJpbmRpbmdzCmRvIG5v dCBzcGVjaWZ5IGFuIG9yZGVyLgoKPiArCj4gKwkJaWYgKGRwX3BhcnNlcl9jaGVja19wcmVmaXgo Y29yZV9jbGssIGNsa19uYW1lKSAmJgoKQWdhaW4sIHlvdSBzaG91bGQgdXNlIHN0cm5jbXAoKSBo ZXJlCgo+ICsJCQkJY29yZV9jbGtfaW5kZXggPCBjb3JlX2Nsa19jb3VudCkgewoKSWYgeW91IGFs cmVhZHkgd2VudCB0byB0aGUgdHJvdWJsZSBvZiBjb3VudGluZyB5b3UgY2FuIGJlIHByZXR0eSBz dXJlIHRoYXQKeW91IHdvbid0IG92ZXJydW4geW91ciBhcnJheS4KCj4gKwkJCXN0cnVjdCBkc3Nf Y2xrICpjbGsgPQo+ICsJCQkJJmNvcmVfcG93ZXItPmNsa19jb25maWdbY29yZV9jbGtfaW5kZXhd Owo+ICsJCQlzdHJsY3B5KGNsay0+Y2xrX25hbWUsIGNsa19uYW1lLCBzaXplb2YoY2xrLT5jbGtf bmFtZSkpOwo+ICsJCQljbGstPnR5cGUgPSBEU1NfQ0xLX0FIQjsKPiArCQkJY29yZV9jbGtfaW5k ZXgrKzsKPiArCQl9IGVsc2UgaWYgKGRwX3BhcnNlcl9jaGVja19wcmVmaXgoY3RybF9jbGssIGNs a19uYW1lKSAmJgo+ICsJCQkgICBjdHJsX2Nsa19pbmRleCA8IGN0cmxfY2xrX2NvdW50KSB7CgpZ b3UgYXJlbid0IGdvaW5nIHRvIG92ZXJydW4geW91ciBhcnJheS4KCj4gKwkJCXN0cnVjdCBkc3Nf Y2xrICpjbGsgPQo+ICsJCQkJJmN0cmxfcG93ZXItPmNsa19jb25maWdbY3RybF9jbGtfaW5kZXhd Owo+ICsJCQlzdHJsY3B5KGNsay0+Y2xrX25hbWUsIGNsa19uYW1lLCBzaXplb2YoY2xrLT5jbGtf bmFtZSkpOwo+ICsJCQljdHJsX2Nsa19pbmRleCsrOwo+ICsKPiArCQkJaWYgKCFzdHJjbXAoY2xr X25hbWUsICJjdHJsX2xpbmtfY2xrIikgfHwKPiArCQkJICAgICFzdHJjbXAoY2xrX25hbWUsICJj dHJsX3BpeGVsX2NsayIpKQo+ICsJCQkJY2xrLT50eXBlID0gRFNTX0NMS19QQ0xLOwo+ICsJCQll bHNlCj4gKwkJCQljbGstPnR5cGUgPSBEU1NfQ0xLX0FIQjsKPiArCQl9Cj4gKwl9CgpUaGVyZSBp cyBhIGxvdCBnb2luZyBvbiBpbiB0aGVzZSB0d28gZnVuY3Rpb25zIGJ1dCBJIGZlZWwgdGhleSBj YW4gYmUgY29tYmluZWQuClRoZSBudW1iZXIgb2YgY2xvY2tzIGluIGVhY2ggYXJyYXkgc2hvdWxk bid0IGJlIGEgbXlzdGVyeSAtIHlvdSBjYW4KcHJlLWFsbG9jYXRlIG9yIHN0YXRpY2FsbHkgYWxs b2NhdGUgdGhlIGFycmF5cy4gIFRoYXQgd2lsbCBzYXZlIHlvdSBmcm9tIHRoZQppbml0aWFsIHN0 ZXAgb2Ygd2Fsa2luZyB0aGUgbGlzdCB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5LiAgVGhlbiB5b3Ug Y2FuIGhhdmUgYQpzaW5nbGUgd2FsayBvZiB0aGUgbGlzdCwgY2hlY2tpbmcgdGhlIGNsb2NrIHR5 cGUgYW5kIGhhbmRsZSBpdCBhY2NvcmRpbmdseS4KCj4gKwo+ICsJcHJfZGVidWcoImNsb2NrIHBh cnNpbmcgc3VjY2Vzc2Z1bFxuIik7Cj4gKwo+ICtleGl0Ogo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50IGRwX3BhcnNlcl9wYXJzZShzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIp Cj4gK3sKPiArCWludCByYyA9IDA7Cj4gKwo+ICsJaWYgKCFwYXJzZXIpIHsKPiArCQlwcl9lcnIo ImludmFsaWQgaW5wdXRcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGVycjsKPiAr CX0KPgpwYXJzZXIgY2FuIG5ldmVyIGJlIG51bGwgaGVyZS4KCgo+ICsJcmMgPSBkcF9wYXJzZXJf Y3RybF9yZXMocGFyc2VyKTsKPiArCWlmIChyYykKPiArCQlnb3RvIGVycjsKCllvdSBjYW4ganVz dCByZXR1cm4gcmMgaGVyZSBhbmQgdGhyb3VnaG91dCB3aXRob3V0IHRoZSBsYWJlbC4KPiArCj4g KwlyYyA9IGRwX3BhcnNlcl9hdXgocGFyc2VyKTsKPiArCWlmIChyYykKPiArCQlnb3RvIGVycjsK PiArCj4gKwlyYyA9IGRwX3BhcnNlcl9taXNjKHBhcnNlcik7Cj4gKwlpZiAocmMpCj4gKwkJZ290 byBlcnI7Cj4gKwo+ICsJcmMgPSBkcF9wYXJzZXJfY2xvY2socGFyc2VyKTsKPiArCWlmIChyYykK PiArCQlnb3RvIGVycjsKPiArCj4gKwlyYyA9IGRwX3BhcnNlcl9yZWd1bGF0b3IocGFyc2VyKTsK PiArCWlmIChyYykKPiArCQlnb3RvIGVycjsKPiArCj4gKwlyYyA9IGRwX3BhcnNlcl9ncGlvKHBh cnNlcik7Cj4gKwlpZiAocmMpCj4gKwkJZ290byBlcnI7Cj4gKwo+ICsJcmMgPSBkcF9wYXJzZXJf cGluY3RybChwYXJzZXIpOwo+ICtlcnI6Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0cnVj dCBkcF9wYXJzZXIgKmRwX3BhcnNlcl9nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK PiArewo+ICsJc3RydWN0IGRwX3BhcnNlciAqcGFyc2VyOwo+ICsKPiArCXBhcnNlciA9IGRldm1f a3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBhcnNlciksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFwYXJzZXIpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gKwo+ICsJcGFyc2VyLT5w YXJzZSA9IGRwX3BhcnNlcl9wYXJzZTsKPiArCXBhcnNlci0+cGRldiA9IHBkZXY7Cj4gKwo+ICsJ cmV0dXJuIHBhcnNlcjsKPiArfQo+ICsKPiArdm9pZCBkcF9wYXJzZXJfcHV0KHN0cnVjdCBkcF9w YXJzZXIgKnBhcnNlcikKPiArewo+ICsJaW50IGkgPSAwOwo+ICsJc3RydWN0IGRzc19tb2R1bGVf cG93ZXIgKnBvd2VyID0gTlVMTDsKPiArCj4gKwlpZiAoIXBhcnNlcikgewo+ICsJCXByX2Vycigi aW52YWxpZCBwYXJzZXIgbW9kdWxlXG4iKTsKCklmIHBhcnNlciBpcyBudWxsLCB5b3UgZG9uJ3Qg Y2FyZS4gIEp1c3QgcXVpZXRseSBleGl0LgoKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJcG93 ZXIgPSBwYXJzZXItPm1wOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBEUF9NQVhfUE07IGkrKykg ewo+ICsJCWRwX3BhcnNlcl9wdXRfY2xrX2RhdGEoJnBhcnNlci0+cGRldi0+ZGV2LCAmcG93ZXJb aV0pOwo+ICsJCWRwX3BhcnNlcl9wdXRfdnJlZ19kYXRhKCZwYXJzZXItPnBkZXYtPmRldiwgJnBv d2VyW2ldKTsKPiArCQlkcF9wYXJzZXJfcHV0X2dwaW9fZGF0YSgmcGFyc2VyLT5wZGV2LT5kZXYs ICZwb3dlcltpXSk7Cj4gKwl9Cj4gKwo+ICsJZGV2bV9rZnJlZSgmcGFyc2VyLT5wZGV2LT5kZXYs IHBhcnNlcik7CgpZb3UgZG9uJ3QgbmVlZCB0byBmcmVlIG1hbmFnZWQgZGV2aWNlIG1lbW9yeS4K Cj4gK30KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuaCBi L2RyaXZlcnMvZ3B1L2RybS9tc20vZHAvZHBfcGFyc2VyLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0 NAo+IGluZGV4IDAwMDAwMDAuLmIzOWVhMDIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9wYXJzZXIuaAo+IEBAIC0wLDAgKzEsMjA1IEBACj4gKy8qCj4g KyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE4LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJp Z2h0cyByZXNlcnZlZC4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCj4g KyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklM SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsgKi8K ClNQRFggcGxlYXNlCgo+ICsjaWZuZGVmIF9EUF9QQVJTRVJfSF8KPiArI2RlZmluZSBfRFBfUEFS U0VSX0hfCj4gKwo+ICsjaW5jbHVkZSAiZHB1X2lvX3V0aWwuaCIKPiArCj4gKyNkZWZpbmUgRFBf TEFCRUwgIk1EU1MgRFAgRElTUExBWSIKPiArI2RlZmluZSBBVVhfQ0ZHX0xFTgkxMAo+ICsjZGVm aW5lIERQX01BWF9QSVhFTF9DTEtfS0haCTY3NTAwMAo+ICsKPiArZW51bSBkcF9wbV90eXBlIHsK PiArCURQX0NPUkVfUE0sCj4gKwlEUF9DVFJMX1BNLAo+ICsJRFBfUEhZX1BNLAo+ICsJRFBfTUFY X1BNCj4gK307Cj4gKwo+ICtzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmRwX3BhcnNlcl9wbV9u YW1lKGVudW0gZHBfcG1fdHlwZSBtb2R1bGUpCj4gK3sKPiArCXN3aXRjaCAobW9kdWxlKSB7Cj4g KwljYXNlIERQX0NPUkVfUE06CXJldHVybiAiRFBfQ09SRV9QTSI7Cj4gKwljYXNlIERQX0NUUkxf UE06CXJldHVybiAiRFBfQ1RSTF9QTSI7Cj4gKwljYXNlIERQX1BIWV9QTToJCXJldHVybiAiRFBf UEhZX1BNIjsKPiArCWRlZmF1bHQ6CQlyZXR1cm4gIj8/PyI7CgpZb3UgZ28gb3V0IG9mIHlvdXIg d2F5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWZhdWx0IGNhc2UgY2FuJ3QgaGFwcGVuIGhlcmUu CmFsc28gdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgb25jZSwgSSBkb24ndCB0aGluayBpdCBu ZWVkcyB0byBiZSBhIHN0YXRpYwppbmxpbmUgaW4gdGhlIGhlYWRlci4KCj4gKwl9Cj4gK30KPiAr Cj4gKy8qKgo+ICsgKiBzdHJ1Y3QgZHBfZGlzcGxheV9kYXRhICAtIGRpc3BsYXkgcmVsYXRlZCBk ZXZpY2UgdHJlZSBkYXRhLgo+ICsgKgo+ICsgKiBAY3RybF9ub2RlOiByZWZlcmVjZSB0byBjb250 cm9sbGVyIGRldmljZQo+ICsgKiBAcGh5X25vZGU6ICByZWZlcmVuY2UgdG8gcGh5IGRldmljZQo+ ICsgKiBAaXNfYWN0aXZlOiBpcyB0aGUgY29udHJvbGxlciBjdXJyZW50bHkgYWN0aXZlCj4gKyAq IEBuYW1lOiBuYW1lIG9mIHRoZSBkaXNwbGF5Cj4gKyAqIEBkaXNwbGF5X3R5cGU6IHR5cGUgb2Yg dGhlIGRpc3BsYXkKPiArICovCj4gK3N0cnVjdCBkcF9kaXNwbGF5X2RhdGEgewo+ICsJc3RydWN0 IGRldmljZV9ub2RlICpjdHJsX25vZGU7Cj4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2Rl Owo+ICsJYm9vbCBpc19hY3RpdmU7Cj4gKwljb25zdCBjaGFyICpuYW1lOwo+ICsJY29uc3QgY2hh ciAqZGlzcGxheV90eXBlOwo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHN0cnVjdCBkcF9jdHJsX3Jl c291cmNlIC0gY29udHJvbGxlcidzIElPIHJlbGF0ZWQgZGF0YQo+ICsgKgo+ICsgKiBAZHBfYWhi OiBjb250cm9sbGVyJ3MgYWhiIG1hcHBlZCBtZW1vcnkgYWRkcmVzcwo+ICsgKiBAZHBfYXV4OiBj b250cm9sbGVyJ3MgYXV4IG1hcHBlZCBtZW1vcnkgYWRkcmVzcwo+ICsgKiBAZHBfbGluazogY29u dHJvbGxlcidzIGxpbmsgbWFwcGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAqIEBkcF9wMDogY29udHJv bGxlcidzIHAwIG1hcHBlZCBtZW1vcnkgYWRkcmVzcwo+ICsgKiBAcGh5X2lvOiBwaHkncyBtYXBw ZWQgbWVtb3J5IGFkZHJlc3MKPiArICogQGxuX3R4MF9pbzogVVNCLURQIGxhbmUgVFgwJ3MgbWFw cGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAqIEBsbl90eDFfaW86IFVTQi1EUCBsYW5lIFRYMSdzIG1h cHBlZCBtZW1vcnkgYWRkcmVzcwo+ICsgKiBAZHBfY2NfaW86IERQIGNjJ3MgbWFwcGVkIG1lbW9y eSBhZGRyZXNzCj4gKyAqIEBxZnByb21faW86IHFmcHJvbSdzIG1hcHBlZCBtZW1vcnkgYWRkcmVz cwo+ICsgKiBAZHBfcGxsX2lvOiBEUCBQTEwgbWFwcGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAqIEB1 c2IzX2RwX2NvbTogVVNCMyBEUCBQSFkgY29tYm8gbWFwcGVkIG1lbW9yeSBhZGRyZXNzCj4gKyAq Lwo+ICtzdHJ1Y3QgZHBfaW8gewo+ICsJc3RydWN0IGRzc19pb19kYXRhIGN0cmxfaW87Cj4gKwlz dHJ1Y3QgZHNzX2lvX2RhdGEgZHBfYWhiOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIGRwX2F1eDsK PiArCXN0cnVjdCBkc3NfaW9fZGF0YSBkcF9saW5rOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIGRw X3AwOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIHBoeV9pbzsKPiArCXN0cnVjdCBkc3NfaW9fZGF0 YSBsbl90eDBfaW87Cj4gKwlzdHJ1Y3QgZHNzX2lvX2RhdGEgbG5fdHgxX2lvOwo+ICsJc3RydWN0 IGRzc19pb19kYXRhIGRwX2NjX2lvOwo+ICsJc3RydWN0IGRzc19pb19kYXRhIHFmcHJvbV9pbzsK PiArCXN0cnVjdCBkc3NfaW9fZGF0YSBkcF9wbGxfaW87Cj4gKwlzdHJ1Y3QgZHNzX2lvX2RhdGEg dXNiM19kcF9jb207Cj4gK307Cj4gKwo+ICsvKioKPiArICogc3RydWN0IGRwX3BpbmN0cmwgLSBE UCdzIHBpbiBjb250cm9sCj4gKyAqCj4gKyAqIEBwaW46IHBpbi1jb250cm9sbGVyJ3MgaW5zdGFu Y2UKPiArICogQHN0YXRlX2FjdGl2ZTogYWN0aXZlIHN0YXRlIHBpbiBjb250cm9sCj4gKyAqIEBz dGF0ZV9ocGRfYWN0aXZlOiBocGQgYWN0aXZlIHN0YXRlIHBpbiBjb250cm9sCj4gKyAqIEBzdGF0 ZV9zdXNwZW5kOiBzdXNwZW5kIHN0YXRlIHBpbiBjb250cm9sCj4gKyAqLwo+ICtzdHJ1Y3QgZHBf cGluY3RybCB7Cj4gKwlzdHJ1Y3QgcGluY3RybCAqcGluOwo+ICsJc3RydWN0IHBpbmN0cmxfc3Rh dGUgKnN0YXRlX2FjdGl2ZTsKPiArCXN0cnVjdCBwaW5jdHJsX3N0YXRlICpzdGF0ZV9ocGRfYWN0 aXZlOwo+ICsJc3RydWN0IHBpbmN0cmxfc3RhdGUgKnN0YXRlX3N1c3BlbmQ7Cj4gK307Cj4gKwo+ ICsjZGVmaW5lIERQX0VOVU1fU1RSKHgpCSN4Cj4gKyNkZWZpbmUgRFBfQVVYX0NGR19NQVhfVkFM VUVfQ05UIDMKPiArLyoqCj4gKyAqIHN0cnVjdCBkcF9hdXhfY2ZnIC0gRFAncyBBVVggY29uZmln dXJhdGlvbiBzZXR0aW5ncwo+ICsgKgo+ICsgKiBAY2ZnX2NudDogY291bnQgb2YgdGhlIGNvbmZp Z3VyYWJsZSBzZXR0aW5ncyBmb3IgdGhlIEFVWCByZWdpc3Rlcgo+ICsgKiBAY3VycmVudF9pbmRl eDogY3VycmVudCBpbmRleCBvZiB0aGUgQVVYIGNvbmZpZyBsdXQKPiArICogQG9mZnNldDogcmVn aXN0ZXIgb2Zmc2V0IG9mIHRoZSBBVVggY29uZmlnIHJlZ2lzdGVyCj4gKyAqIEBsdXQ6IGxvb2sg dXAgdGFibGUgZm9yIHRoZSBBVVggY29uZmlnIHZhbHVlcyBmb3IgdGhpcyByZWdpc3Rlcgo+ICsg Ki8KPiArc3RydWN0IGRwX2F1eF9jZmcgewo+ICsJdTMyIGNmZ19jbnQ7Cj4gKwl1MzIgY3VycmVu dF9pbmRleDsKPiArCXUzMiBvZmZzZXQ7Cj4gKwl1MzIgbHV0W0RQX0FVWF9DRkdfTUFYX1ZBTFVF X0NOVF07Cj4gK307Cj4gKwo+ICsvKiBQSFkgQVVYIGNvbmZpZyByZWdpc3RlcnMgKi8KPiArZW51 bSBkcF9waHlfYXV4X2NvbmZpZ190eXBlIHsKPiArCVBIWV9BVVhfQ0ZHMCwKPiArCVBIWV9BVVhf Q0ZHMSwKPiArCVBIWV9BVVhfQ0ZHMiwKPiArCVBIWV9BVVhfQ0ZHMywKPiArCVBIWV9BVVhfQ0ZH NCwKPiArCVBIWV9BVVhfQ0ZHNSwKPiArCVBIWV9BVVhfQ0ZHNiwKPiArCVBIWV9BVVhfQ0ZHNywK PiArCVBIWV9BVVhfQ0ZHOCwKPiArCVBIWV9BVVhfQ0ZHOSwKPiArCVBIWV9BVVhfQ0ZHX01BWCwK PiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgY2hhciAqZHBfcGh5X2F1eF9jb25maWdfdHlwZV90 b19zdHJpbmcodTMyIGNmZ190eXBlKQo+ICt7Cj4gKwlzd2l0Y2ggKGNmZ190eXBlKSB7Cj4gKwlj YXNlIFBIWV9BVVhfQ0ZHMDoKPiArCQlyZXR1cm4gRFBfRU5VTV9TVFIoUEhZX0FVWF9DRkcwKTsK PiArCWNhc2UgUEhZX0FVWF9DRkcxOgo+ICsJCXJldHVybiBEUF9FTlVNX1NUUihQSFlfQVVYX0NG RzEpOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzI6Cj4gKwkJcmV0dXJuIERQX0VOVU1fU1RSKFBIWV9B VVhfQ0ZHMik7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHMzoKPiArCQlyZXR1cm4gRFBfRU5VTV9TVFIo UEhZX0FVWF9DRkczKTsKPiArCWNhc2UgUEhZX0FVWF9DRkc0Ogo+ICsJCXJldHVybiBEUF9FTlVN X1NUUihQSFlfQVVYX0NGRzQpOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzU6Cj4gKwkJcmV0dXJuIERQ X0VOVU1fU1RSKFBIWV9BVVhfQ0ZHNSk7Cj4gKwljYXNlIFBIWV9BVVhfQ0ZHNjoKPiArCQlyZXR1 cm4gRFBfRU5VTV9TVFIoUEhZX0FVWF9DRkc2KTsKPiArCWNhc2UgUEhZX0FVWF9DRkc3Ogo+ICsJ CXJldHVybiBEUF9FTlVNX1NUUihQSFlfQVVYX0NGRzcpOwo+ICsJY2FzZSBQSFlfQVVYX0NGRzg6 Cj4gKwkJcmV0dXJuIERQX0VOVU1fU1RSKFBIWV9BVVhfQ0ZHOCk7Cj4gKwljYXNlIFBIWV9BVVhf Q0ZHOToKPiArCQlyZXR1cm4gRFBfRU5VTV9TVFIoUEhZX0FVWF9DRkc5KTsKPiArCWRlZmF1bHQ6 Cj4gKwkJcmV0dXJuICJ1bmtub3duIjsKPiArCX0KPiArfQo+ICsKPiArLyoqCj4gKyAqIHN0cnVj dCBkcF9wYXJzZXIgLSBEUCBwYXJzZXIncyBkYXRhIGV4cG9zZWQgdG8gY2xpZW50cwo+ICsgKgo+ ICsgKiBAcGRldjogcGxhdGZvcm0gZGF0YSBvZiB0aGUgY2xpZW50Cj4gKyAqIEBtcDogZ3Bpbywg cmVndWxhdG9yIGFuZCBjbG9jayByZWxhdGVkIGRhdGEKPiArICogQHBpbmN0cmw6IHBpbi1jb250 cm9sIHJlbGF0ZWQgZGF0YQo+ICsgKiBAZGlzcF9kYXRhOiBjb250cm9sbGVyJ3MgZGlzcGxheSBy ZWxhdGVkIGRhdGEKPiArICogQHBhcnNlOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgY2xpZW50 IHRvIHBhcnNlIGRldmljZSB0cmVlLgo+ICsgKi8KPiArc3RydWN0IGRwX3BhcnNlciB7Cj4gKwlz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Owo+ICsJc3RydWN0IGRzc19tb2R1bGVfcG93ZXIg bXBbRFBfTUFYX1BNXTsKPiArCXN0cnVjdCBkcF9waW5jdHJsIHBpbmN0cmw7Cj4gKwlzdHJ1Y3Qg ZHBfaW8gaW87Cj4gKwlzdHJ1Y3QgZHBfZGlzcGxheV9kYXRhIGRpc3BfZGF0YTsKPiArCj4gKwl1 OCBsX21hcFs0XTsKPiArCXN0cnVjdCBkcF9hdXhfY2ZnIGF1eF9jZmdbQVVYX0NGR19MRU5dOwo+ ICsJdTMyIG1heF9wY2xrX2toejsKPiArCj4gKwlpbnQgKCpwYXJzZSkoc3RydWN0IGRwX3BhcnNl ciAqcGFyc2VyKTsKPiArfTsKPiArCj4gKy8qKgo+ICsgKiBkcF9wYXJzZXJfZ2V0KCkgLSBnZXQg dGhlIERQJ3MgZGV2aWNlIHRyZWUgcGFyc2VyIG1vZHVsZQo+ICsgKgo+ICsgKiBAcGRldjogcGxh dGZvcm0gZGF0YSBvZiB0aGUgY2xpZW50Cj4gKyAqIHJldHVybjogcG9pbnRlciB0byBkcF9wYXJz ZXIgc3RydWN0dXJlLgo+ICsgKgo+ICsgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGNsaWVudCBj YXBhYmlsaXR5IHRvIHBhcnNlIHRoZQo+ICsgKiBkZXZpY2UgdHJlZSBhbmQgcG9wdWxhdGUgdGhl IGRhdGEgc3RydWN0dXJlcy4gVGhlIGRhdGEKPiArICogcmVsYXRlZCB0byBjbG9jaywgcmVndWxh dG9ycywgcGluLWNvbnRyb2wgYW5kIG90aGVyCj4gKyAqIGNhbiBiZSBwYXJzZWQgdXNpbmcgdGhp cyBtb2R1bGUuCj4gKyAqLwo+ICtzdHJ1Y3QgZHBfcGFyc2VyICpkcF9wYXJzZXJfZ2V0KHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwo+ICsKPiArLyoqCj4gKyAqIGRwX3BhcnNlcl9wdXQo KSAtIGNsZWFucyB0aGUgZHBfcGFyc2VyIG1vZHVsZQo+ICsgKgo+ICsgKiBAcGFyc2VyOiBwb2lu dGVyIHRvIHRoZSBwYXJzZXIncyBkYXRhLgo+ICsgKi8KPiArdm9pZCBkcF9wYXJzZXJfcHV0KHN0 cnVjdCBkcF9wYXJzZXIgKnBhcnNlcik7Cj4gKyNlbmRpZgo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bv d2VyLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjFkNTg0ODAKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9wb3dlci5jCj4g QEAgLTAsMCArMSw1OTkgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTgsIFRo ZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsg KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCj4gKyAqCj4gKyAqLwoKU1BEWCBwbGVhc2UuCgoKPiArI2RlZmluZSBwcl9m bXQoZm10KQkiW2RybS1kcF0gJXM6ICIgZm10LCBfX2Z1bmNfXwo+ICsKPiArI2luY2x1ZGUgPGxp bnV4L2Nsay5oPgo+ICsjaW5jbHVkZSAiZHBfcG93ZXIuaCIKPiArCj4gKyNkZWZpbmUgRFBfQ0xJ RU5UX05BTUVfU0laRQkyMAo+ICsKPiArc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgewo+ICsJc3Ry dWN0IGRwX3BhcnNlciAqcGFyc2VyOwo+ICsJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsK PiArCXN0cnVjdCBjbGsgKnBpeGVsX2Nsa19yY2c7Cj4gKwlzdHJ1Y3QgY2xrICpwaXhlbF9wYXJl bnQ7Cj4gKwo+ICsJc3RydWN0IGRwX3Bvd2VyIGRwX3Bvd2VyOwo+ICsKPiArCWJvb2wgY29yZV9j bGtzX29uOwo+ICsJYm9vbCBsaW5rX2Nsa3Nfb247Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IGRw X3Bvd2VyX3JlZ3VsYXRvcl9pbml0KHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlcikKPiAr ewo+ICsJaW50IHJjID0gMCwgaSA9IDAsIGogPSAwOwo+ICsJc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldjsKPiArCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcjsKPiArCj4gKwlwYXJzZXIgPSBw b3dlci0+cGFyc2VyOwo+ICsJcGRldiA9IHBvd2VyLT5wZGV2Owo+ICsKPiArCWZvciAoaSA9IERQ X0NPUkVfUE07ICFyYyAmJiAoaSA8IERQX01BWF9QTSk7IGkrKykgewo+ICsJCXJjID0gbXNtX2Rz c19jb25maWdfdnJlZygmcGRldi0+ZGV2LAo+ICsJCQlwYXJzZXItPm1wW2ldLnZyZWdfY29uZmln LAo+ICsJCQlwYXJzZXItPm1wW2ldLm51bV92cmVnLCAxKTsKPiArCQlpZiAocmMpIHsKPiArCQkJ cHJfZXJyKCJmYWlsZWQgdG8gaW5pdCB2cmVncyBmb3IgJXNcbiIsCj4gKwkJCQlkcF9wYXJzZXJf cG1fbmFtZShpKSk7Cgptc21fZHNzX2NvbmZpZ192cmVnKCkgYWxyZWFkeSBwcmludHMgbG90cyBv ZiBlcnJvciBtZXNzYWdlcyBmb3IgeW91LgoKPiArCQkJZm9yIChqID0gaSAtIDE7IGogPj0gRFBf Q09SRV9QTTsgai0tKSB7Cj4gKwkJCQltc21fZHNzX2NvbmZpZ192cmVnKCZwZGV2LT5kZXYsCj4g KwkJCQlwYXJzZXItPm1wW2pdLnZyZWdfY29uZmlnLAo+ICsJCQkJcGFyc2VyLT5tcFtqXS5udW1f dnJlZywgMCk7Cj4gKwkJCX0KPiArCj4gKwkJCWdvdG8gZXJyb3I7CgpqdXN0IHJldHVybiByYzsK Cj4gKwkJfQo+ICsJfQo+ICtlcnJvcjoKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZHBfcG93ZXJfcmVndWxhdG9yX2RlaW5pdChzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSAq cG93ZXIpCj4gK3sKPiArCWludCByYyA9IDAsIGkgPSAwOwo+ICsJc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldjsKPiArCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNlcjsKPiArCj4gKwlwYXJzZXIg PSBwb3dlci0+cGFyc2VyOwo+ICsJcGRldiA9IHBvd2VyLT5wZGV2Owo+ICsKPiArCWZvciAoaSA9 IERQX0NPUkVfUE07IChpIDwgRFBfTUFYX1BNKTsgaSsrKSB7Cj4gKwkJcmMgPSBtc21fZHNzX2Nv bmZpZ192cmVnKCZwZGV2LT5kZXYsCj4gKwkJCXBhcnNlci0+bXBbaV0udnJlZ19jb25maWcsCj4g KwkJCXBhcnNlci0+bXBbaV0ubnVtX3ZyZWcsIDApOwo+ICsJCWlmIChyYykKPiArCQkJcHJfZXJy KCJmYWlsZWQgdG8gZGVpbml0IHZyZWdzIGZvciAlc1xuIiwKPiArCQkJCWRwX3BhcnNlcl9wbV9u YW1lKGkpKTsKClNhbWUuCgo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bvd2VyX3Jl Z3VsYXRvcl9jdHJsKHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlciwgYm9vbCBlbmFibGUp Cj4gK3sKPiArCWludCByYyA9IDAsIGkgPSAwLCBqID0gMDsKPiArCXN0cnVjdCBkcF9wYXJzZXIg KnBhcnNlcjsKPiArCj4gKwlwYXJzZXIgPSBwb3dlci0+cGFyc2VyOwo+ICsKPiArCWZvciAoaSA9 IERQX0NPUkVfUE07IGkgPCBEUF9NQVhfUE07IGkrKykgewo+ICsJCXJjID0gbXNtX2Rzc19lbmFi bGVfdnJlZygKPiArCQkJcGFyc2VyLT5tcFtpXS52cmVnX2NvbmZpZywKPiArCQkJcGFyc2VyLT5t cFtpXS5udW1fdnJlZywgZW5hYmxlKTsKPiArCQlpZiAocmMpIHsKPiArCQkJcHJfZXJyKCJmYWls ZWQgdG8gJyVzJyB2cmVncyBmb3IgJXNcbiIsCj4gKwkJCQkJZW5hYmxlID8gImVuYWJsZSIgOiAi ZGlzYWJsZSIsCj4gKwkJCQkJZHBfcGFyc2VyX3BtX25hbWUoaSkpOwoKbXNtX2Rzc19lbmFibGVf dnJlZygpIGFscmVhZHkgZ2l2ZXMgeW91IHRoZSBlcnJvcnMgeW91IG5lZWQuCgo+ICsJCQlpZiAo ZW5hYmxlKSB7Cj4gKwkJCQlmb3IgKGogPSBpLTE7IGogPj0gRFBfQ09SRV9QTTsgai0tKSB7Cj4g KwkJCQkJbXNtX2Rzc19lbmFibGVfdnJlZygKPiArCQkJCQlwYXJzZXItPm1wW2pdLnZyZWdfY29u ZmlnLAo+ICsJCQkJCXBhcnNlci0+bXBbal0ubnVtX3ZyZWcsIDApOwo+ICsJCQkJfQo+ICsJCQl9 Cj4gKwkJCWdvdG8gZXJyb3I7Cj4gKwkJfQo+ICsJfQo+ICtlcnJvcjoKPiArCXJldHVybiByYzsK CllvdSBkb24ndCBuZWVkIGEgbGFiZWwgd2l0aCBhIHNpbmdsZSByZXR1cm4gaW4gaXQuCgo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGRwX3Bvd2VyX3BpbmN0cmxfc2V0KHN0cnVjdCBkcF9wb3dlcl9w cml2YXRlICpwb3dlciwgYm9vbCBhY3RpdmUpCj4gK3sKPiArCWludCByYyA9IC1FRkFVTFQ7Cj4g KwlzdHJ1Y3QgcGluY3RybF9zdGF0ZSAqcGluX3N0YXRlOwo+ICsJc3RydWN0IGRwX3BhcnNlciAq cGFyc2VyOwo+ICsKPiArCXBhcnNlciA9IHBvd2VyLT5wYXJzZXI7Cj4gKwo+ICsJaWYgKElTX0VS Ul9PUl9OVUxMKHBhcnNlci0+cGluY3RybC5waW4pKQoKUmVjYWxsIHRoYXQgcGluY3RybC5pbiBj YW5ub3QgYmUgTlVMTC4KCj4gKwkJcmV0dXJuIFBUUl9FUlIocGFyc2VyLT5waW5jdHJsLnBpbik7 Cj4gKwo+ICsJcGluX3N0YXRlID0gYWN0aXZlID8gcGFyc2VyLT5waW5jdHJsLnN0YXRlX2FjdGl2 ZQo+ICsJCQkJOiBwYXJzZXItPnBpbmN0cmwuc3RhdGVfc3VzcGVuZDsKPiArCWlmICghSVNfRVJS X09SX05VTEwocGluX3N0YXRlKSkgewoKU2FtZQoKPiArCQlyYyA9IHBpbmN0cmxfc2VsZWN0X3N0 YXRlKHBhcnNlci0+cGluY3RybC5waW4sCj4gKwkJCQlwaW5fc3RhdGUpOwo+ICsJCWlmIChyYykK PiArCQkJcHJfZXJyKCJjYW4gbm90IHNldCAlcyBwaW5zXG4iLAo+ICsJCQkgICAgICAgYWN0aXZl ID8gImRwX2FjdGl2ZSIKPiArCQkJICAgICAgIDogImRwX3NsZWVwIik7Cj4gKwl9IGVsc2Ugewo+ ICsJCXByX2VycigiaW52YWxpZCAnJXMnIHBpbnN0YXRlXG4iLAo+ICsJCSAgICAgICBhY3RpdmUg PyAiZHBfYWN0aXZlIgo+ICsJCSAgICAgICA6ICJkcF9zbGVlcCIpOwoKWW91IGFscmVhZHkgbGV0 IHRoZSB1c2VyIGtub3cgZHVyaW5nIGluaW50IHRoYXQgdGhlIHBpbl9zdGF0ZSB3YXMgbm90CmNv cnJlY3QuICBZb3UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgdGhlbSBhZ2FpbiBldmVyeSB0aW1lIHlv dSB0cnkgdG8gY2hhbmdlIGl0LgoKPiArCX0KPiArCj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgZHBfcG93ZXJfY2xrX2luaXQoc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBv d2VyLCBib29sIGVuYWJsZSkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkc3NfbW9k dWxlX3Bvd2VyICpjb3JlLCAqY3RybDsKPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCj4gKwlj b3JlID0gJnBvd2VyLT5wYXJzZXItPm1wW0RQX0NPUkVfUE1dOwo+ICsJY3RybCA9ICZwb3dlci0+ cGFyc2VyLT5tcFtEUF9DVFJMX1BNXTsKPiArCj4gKwlkZXYgPSAmcG93ZXItPnBkZXYtPmRldjsK PiArCj4gKwlpZiAoIWNvcmUgfHwgIWN0cmwpIHsKPiArCQlwcl9lcnIoImludmFsaWQgcG93ZXJf ZGF0YVxuIik7Cj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KClRoZXNl IGFyZSBib3RoIGltcG9zc2libGUgc2luY2UgeW91IGFyZSBkZXJpdmluZyB0aGUgcG9pbnRlciBh Ym92ZS4KCj4gKwo+ICsJaWYgKGVuYWJsZSkgewo+ICsJCXJjID0gbXNtX2Rzc19nZXRfY2xrKGRl diwgY29yZS0+Y2xrX2NvbmZpZywgY29yZS0+bnVtX2Nsayk7Cgo+ICsJCWlmIChyYykgewo+ICsJ CQlwcl9lcnIoImZhaWxlZCB0byBnZXQgJXMgY2xrLiBlcnI9JWRcbiIsCj4gKwkJCQlkcF9wYXJz ZXJfcG1fbmFtZShEUF9DT1JFX1BNKSwgcmMpOwoKbXNtX2Rzc19nZXRfY2xrIGFscmVhZHkgcHJp bnRzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHlvdS4KCj4gKwkJCWdvdG8gZXhpdDsKPiArCQl9Cj4g Kwo+ICsJCXJjID0gbXNtX2Rzc19nZXRfY2xrKGRldiwgY3RybC0+Y2xrX2NvbmZpZywgY3RybC0+ bnVtX2Nsayk7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCXByX2VycigiZmFpbGVkIHRvIGdldCAlcyBj bGsuIGVycj0lZFxuIiwKPiArCQkJCWRwX3BhcnNlcl9wbV9uYW1lKERQX0NUUkxfUE0pLCByYyk7 CgpTYW1lCj4gKwkJCWdvdG8gY3RybF9nZXRfZXJyb3I7Cj4gKwkJfQo+ICsKPiArCQlwb3dlci0+ cGl4ZWxfY2xrX3JjZyA9IGRldm1fY2xrX2dldChkZXYsICJwaXhlbF9jbGtfcmNnIik7Cj4gKwkJ aWYgKElTX0VSUihwb3dlci0+cGl4ZWxfY2xrX3JjZykpIHsKPiArCQkJcHJfZGVidWcoIlVuYWJs ZSB0byBnZXQgRFAgcGl4ZWwgY2xrIFJDR1xuIik7CgpUaGlzIHNlZW1zIGxpa2UgaXQgc2hvdWxk IGJlIGFuIGVycm9yPwoKPiArCQkJcG93ZXItPnBpeGVsX2Nsa19yY2cgPSBOVUxMOwo+ICsJCX0K PiArCj4gKwkJcG93ZXItPnBpeGVsX3BhcmVudCA9IGRldm1fY2xrX2dldChkZXYsICJwaXhlbF9w YXJlbnQiKTsKPiArCQlpZiAoSVNfRVJSKHBvd2VyLT5waXhlbF9wYXJlbnQpKSB7Cj4gKwkJCXBy X2RlYnVnKCJVbmFibGUgdG8gZ2V0IERQIHBpeGVsIFJDRyBwYXJlbnRcbiIpOwoKU2FtZT8KCj4g KwkJCXBvd2VyLT5waXhlbF9wYXJlbnQgPSBOVUxMOwo+ICsJCX0KPiArCX0gZWxzZSB7CgpUaGlz IGlzIGFub3RoZXIgb25lIG9mIHRob3NlIGZ1bmN0aW9ucyB0aGF0IHNoYXJlcyB2ZXJ5IGxpdHRs ZSB3aXRoIHRoZSBvdGhlcgpzaWRlIGFuZCBjYW4gYmUgZWFzaWx5IHNwbGl0IGludG8gYSBzZXBh cmF0ZSBmdW5jdGlvbiB0aGF0IGlzIGVhc2llciB0bwp1bmRlcnN0YW5kLgoKPiArCQlpZiAocG93 ZXItPnBpeGVsX3BhcmVudCkKPiArCQkJZGV2bV9jbGtfcHV0KGRldiwgcG93ZXItPnBpeGVsX3Bh cmVudCk7Cj4gKwo+ICsJCWlmIChwb3dlci0+cGl4ZWxfY2xrX3JjZykKPiArCQkJZGV2bV9jbGtf cHV0KGRldiwgcG93ZXItPnBpeGVsX2Nsa19yY2cpOwoKWW91IGRvbid0IG5lZWQgdG8gcHV0IG1h bmFnZWQgY2xvY2tzLgoKPiArCj4gKwkJbXNtX2Rzc19wdXRfY2xrKGN0cmwtPmNsa19jb25maWcs IGN0cmwtPm51bV9jbGspOwo+ICsJCW1zbV9kc3NfcHV0X2Nsayhjb3JlLT5jbGtfY29uZmlnLCBj b3JlLT5udW1fY2xrKTsKCj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJjOwo+ICsKPiArY3RybF9nZXRf ZXJyb3I6Cj4gKwltc21fZHNzX3B1dF9jbGsoY29yZS0+Y2xrX2NvbmZpZywgY29yZS0+bnVtX2Ns ayk7Cj4gK2V4aXQ6Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcG93 ZXJfY2xrX3NldF9yYXRlKHN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlciwKPiArCQllbnVt IGRwX3BtX3R5cGUgbW9kdWxlLCBib29sIGVuYWJsZSkKPiArewo+ICsJaW50IHJjID0gMDsKPiAr CXN0cnVjdCBkc3NfbW9kdWxlX3Bvd2VyICptcDsKPiArCj4gKwlpZiAoIXBvd2VyKSB7Cj4gKwkJ cHJfZXJyKCJpbnZhbGlkIHBvd2VyIGRhdGFcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQln b3RvIGV4aXQ7Cj4gKwl9Cgpwb3dlciB3aWxsIGFsd2F5cyBiZSB2YWxpZC4KCj4gKwltcCA9ICZw b3dlci0+cGFyc2VyLT5tcFttb2R1bGVdOwo+ICsKPiArCWlmIChlbmFibGUpIHsKPiArCQlyYyA9 IG1zbV9kc3NfY2xrX3NldF9yYXRlKG1wLT5jbGtfY29uZmlnLCBtcC0+bnVtX2Nsayk7Cj4gKwkJ aWYgKHJjKSB7Cj4gKwkJCXByX2VycigiZmFpbGVkIHRvIHNldCBjbGtzIHJhdGUuXG4iKTsKCm1z bV9kc3NfY2xrX3NldF9yYXRlKCkgYWxyZWFkeSBnaXZlcyB5b3UgYW4gZXJyb3IgbWVzc2FnZTsK Cj4gKwkJCWdvdG8gZXhpdDsKPiArCQl9Cj4gKwo+ICsJCXJjID0gbXNtX2Rzc19lbmFibGVfY2xr KG1wLT5jbGtfY29uZmlnLCBtcC0+bnVtX2NsaywgMSk7Cj4gKwkJaWYgKHJjKSB7Cj4gKwkJCXBy X2VycigiZmFpbGVkIHRvIGVuYWJsZSBjbGtzXG4iKTsKClNhbWUuCgo+ICsJCQlnb3RvIGV4aXQ7 Cj4gKwkJfQo+ICsJfSBlbHNlIHsKPiArCQlyYyA9IG1zbV9kc3NfZW5hYmxlX2NsayhtcC0+Y2xr X2NvbmZpZywgbXAtPm51bV9jbGssIDApOwo+ICsJCWlmIChyYykgewo+ICsJCQlwcl9lcnIoImZh aWxlZCB0byBkaXNhYmxlIGNsa3NcbiIpOwoKU2FtZQoKPiArCQkJCWdvdG8gZXhpdDsKClN1c3Bl Y3QgaW5kZW50YXRpb24sIGJ1dCBhcyB1c3VhbCwgZG9uJ3QgdXNlIGEgc2luZ2xlIHJldHVybiBp biBhIGxhYmVsIC0ganVzdApyZXR1cm4gZGlyZWN0bHkuCgo+ICsJCX0KPiArCX0KPiArZXhpdDoK PiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wb3dlcl9jbGtfZW5hYmxl KHN0cnVjdCBkcF9wb3dlciAqZHBfcG93ZXIsCj4gKwkJZW51bSBkcF9wbV90eXBlIHBtX3R5cGUs IGJvb2wgZW5hYmxlKQo+ICt7Cj4gKwlpbnQgcmMgPSAwOwo+ICsJc3RydWN0IGRzc19tb2R1bGVf cG93ZXIgKm1wOwo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ICsKPiArCWlm ICghZHBfcG93ZXIpIHsKPiArCQlwcl9lcnIoImludmFsaWQgcG93ZXIgZGF0YVxuIik7Cj4gKwkJ cmMgPSAtRUlOVkFMOwo+ICsJCWdvdG8gZXJyb3I7Cj4gKwl9CgpkcF9wb3dlciB3aWxsIGFsd2F5 cyBiZSB2YWxpZC4KCj4gKwlwb3dlciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRw X3Bvd2VyX3ByaXZhdGUsIGRwX3Bvd2VyKTsKPiArCj4gKwltcCA9ICZwb3dlci0+cGFyc2VyLT5t cFtwbV90eXBlXTsKPiArCj4gKwlpZiAoKHBtX3R5cGUgIT0gRFBfQ09SRV9QTSkgJiYgKHBtX3R5 cGUgIT0gRFBfQ1RSTF9QTSkpIHsKPiArCQlwcl9lcnIoInVuc3VwcG9ydGVkIHBvd2VyIG1vZHVs ZTogJXNcbiIsCj4gKwkJCQlkcF9wYXJzZXJfcG1fbmFtZShwbV90eXBlKSk7CgpUaGlzIHNlZW1z IGxpa2UgaXQgd291bGQgYmUgbmV2ZXIgYmUgdHJ1ZSBvdXRzaWRlIG9mIGVncmVnaW91cyBkZXZl bG9wZXIKZXJyb3IuIC0gSSBzdXBwb3NlIHlvdSBjb3VsZCBXQVJOX09OIGhlcmUgYnV0IGl0IGp1 c3QgZG9lc24ndCBzZWVtIGxpa2UgYSB0aGluZy4KCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9 Cj4gKwo+ICsJaWYgKGVuYWJsZSkgewo+ICsJCWlmICgocG1fdHlwZSA9PSBEUF9DT1JFX1BNKQo+ ICsJCQkmJiAocG93ZXItPmNvcmVfY2xrc19vbikpIHsKPiArCQkJcHJfZGVidWcoImNvcmUgY2xr cyBhbHJlYWR5IGVuYWJsZWRcbiIpOwo+ICsJCQlyZXR1cm4gMDsKPiArCQl9Cj4gKwo+ICsJCWlm ICgocG1fdHlwZSA9PSBEUF9DVFJMX1BNKQo+ICsJCQkmJiAocG93ZXItPmxpbmtfY2xrc19vbikp IHsKPiArCQkJcHJfZGVidWcoImxpbmtzIGNsa3MgYWxyZWFkeSBlbmFibGVkXG4iKTsKPiArCQkJ cmV0dXJuIDA7Cj4gKwkJfQo+ICsKPiArCQlpZiAoKHBtX3R5cGUgPT0gRFBfQ1RSTF9QTSkgJiYg KCFwb3dlci0+Y29yZV9jbGtzX29uKSkgewo+ICsJCQlwcl9kZWJ1ZygiTmVlZCB0byBlbmFibGUg Y29yZSBjbGtzIGJlZm9yZSBsaW5rIGNsa3NcbiIpOwo+ICsKPiArCQkJcmMgPSBkcF9wb3dlcl9j bGtfc2V0X3JhdGUocG93ZXIsIERQX0NPUkVfUE0sIGVuYWJsZSk7Cj4gKwkJCWlmIChyYykgewo+ ICsJCQkJcHJfZXJyKCJmYWlsZWQgdG8gZW5hYmxlIGNsa3M6ICVzLiBlcnI9JWRcbiIsCj4gKwkJ CQkJZHBfcGFyc2VyX3BtX25hbWUoRFBfQ09SRV9QTSksIHJjKTsKPiArCQkJCWdvdG8gZXJyb3I7 Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlwb3dlci0+Y29yZV9jbGtzX29uID0gdHJ1ZTsKPiArCQkJ fQo+ICsJCX0KPiArCX0KPiArCj4gKwlyYyA9IGRwX3Bvd2VyX2Nsa19zZXRfcmF0ZShwb3dlciwg cG1fdHlwZSwgZW5hYmxlKTsKPiArCWlmIChyYykgewo+ICsJCXByX2VycigiZmFpbGVkIHRvICcl cycgY2xrcyBmb3I6ICVzLiBlcnI9JWRcbiIsCj4gKwkJCWVuYWJsZSA/ICJlbmFibGUiIDogImRp c2FibGUiLAo+ICsJCQlkcF9wYXJzZXJfcG1fbmFtZShwbV90eXBlKSwgcmMpOwo+ICsJCQlnb3Rv IGVycm9yOwo+ICsJfQo+ICsKPiArCWlmIChwbV90eXBlID09IERQX0NPUkVfUE0pCj4gKwkJcG93 ZXItPmNvcmVfY2xrc19vbiA9IGVuYWJsZTsKPiArCWVsc2UKPiArCQlwb3dlci0+bGlua19jbGtz X29uID0gZW5hYmxlOwoKV2l0aCB0aGUgbnVtYmVyIG9mIGlmIHN0YXRlbWVudHMgaW4gaGVyZSBp dCBhbG1vc3Qgc2VlbXMgbW9yZSBsb2dpY2FsIHRvIGhhdmUgYQpzZXBhcmF0ZSBmdW5jdGlvbiBm b3IgYm90aCBEUF9DT1JFX1BNIGFuZCBEUF9DVFJMX1BNIC0geWVhaCwgaXQgd291bGQgY29weSBh IGJpdApvZiBjb2RlIGJ1dCBpdCB3b3VsZCBiZSBhIGhlY2sgb2YgYSBsb3QgbW9yZSByZWFkYWJs ZS4KCj4gKwlwcl9kZWJ1ZygiJXMgY2xvY2tzIGZvciAlc1xuIiwKPiArCQkJZW5hYmxlID8gImVu YWJsZSIgOiAiZGlzYWJsZSIsCj4gKwkJCWRwX3BhcnNlcl9wbV9uYW1lKHBtX3R5cGUpKTsKPiAr CXByX2RlYnVnKCJsaW5rX2Nsa3M6JXMgY29yZV9jbGtzOiVzXG4iLAo+ICsJCXBvd2VyLT5saW5r X2Nsa3Nfb24gPyAib24iIDogIm9mZiIsCj4gKwkJcG93ZXItPmNvcmVfY2xrc19vbiA/ICJvbiIg OiAib2ZmIik7Cj4gK2Vycm9yOgo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGRwX3Bvd2VyX3JlcXVlc3RfZ3Bpb3Moc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyKQo+ ICt7Cj4gKwlpbnQgcmMgPSAwLCBpOwo+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ICsJc3RydWN0 IGRzc19tb2R1bGVfcG93ZXIgKm1wOwo+ICsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGlv X25hbWVzW10gPSB7Cj4gKwkJImF1eF9lbmFibGUiLCAiYXV4X3NlbCIsICJ1c2JwbHVnX2NjIiwK PiArCX07Cj4gKwo+ICsJaWYgKCFwb3dlcikgewo+ICsJCXByX2VycigiaW52YWxpZCBwb3dlciBk YXRhXG4iKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkZXYgPSAmcG93ZXIt PnBkZXYtPmRldjsKPiArCW1wID0gJnBvd2VyLT5wYXJzZXItPm1wW0RQX0NPUkVfUE1dOwo+ICsK PiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9fbmFtZXMpOyBpKyspIHsKPiArCQl1 bnNpZ25lZCBpbnQgZ3BpbyA9IG1wLT5ncGlvX2NvbmZpZ1tpXS5ncGlvOwo+ICsKPiArCQlpZiAo Z3Bpb19pc192YWxpZChncGlvKSkgewo+ICsJCQlyYyA9IGRldm1fZ3Bpb19yZXF1ZXN0KGRldiwg Z3BpbywgZ3Bpb19uYW1lc1tpXSk7Cj4gKwkJCWlmIChyYykgewo+ICsJCQkJcHJfZXJyKCJyZXF1 ZXN0ICVzIGdwaW8gZmFpbGVkLCByYz0lZFxuIiwKPiArCQkJCQkgICAgICAgZ3Bpb19uYW1lc1tp XSwgcmMpOwo+ICsJCQkJZ290byBlcnJvcjsKPiArCQkJfQo+ICsJCX0KPiArCX0KPiArCXJldHVy biAwOwo+ICtlcnJvcjoKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9fbmFtZXMp OyBpKyspIHsKPiArCQl1bnNpZ25lZCBpbnQgZ3BpbyA9IG1wLT5ncGlvX2NvbmZpZ1tpXS5ncGlv Owo+ICsKPiArCQlpZiAoZ3Bpb19pc192YWxpZChncGlvKSkKPiArCQkJZ3Bpb19mcmVlKGdwaW8p OwoKQ2FuIHlvdSBjYWxsIGdwaW9fZnJlZSgpIG9uIGEgZGV2aWNlIG1hbmFnZWQgcmVzb3VyY2U/ IEkgdGhpbmsgeW91IHByb2JhYmx5IHdhbnQKZGV2bV9ncGlvX2ZyZWUuCgoKPiArCX0KPiArCXJl dHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGJvb2wgZHBfcG93ZXJfZmluZF9ncGlvKGNvbnN0 IGNoYXIgKmdwaW8xLCBjb25zdCBjaGFyICpncGlvMikKPiArewo+ICsJcmV0dXJuICEhc3RybnN0 cihncGlvMSwgZ3BpbzIsIHN0cmxlbihncGlvMSkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBk cF9wb3dlcl9zZXRfZ3BpbyhzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSAqcG93ZXIsIGJvb2wgZmxp cCkKPiArewo+ICsJaW50IGk7Cj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciAqbXAgPSAmcG93 ZXItPnBhcnNlci0+bXBbRFBfQ09SRV9QTV07Cj4gKwlzdHJ1Y3QgZHNzX2dwaW8gKmNvbmZpZyA9 IG1wLT5ncGlvX2NvbmZpZzsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm51bV9ncGlvOyBp KyspIHsKPiArCQlpZiAoZHBfcG93ZXJfZmluZF9ncGlvKGNvbmZpZy0+Z3Bpb19uYW1lLCAiYXV4 LXNlbCIpKQoKSSB0aGluayBjb25maWctPmdwaW9fbmFtZSBpcyB0aGUgbmFtZSBmcm9tIHRoZSBE VCwgYmFzaWNhbGx5IHFjb20sYXV4LXNlbC1ncGlvPwpXaHkgbm90IGp1c3Qgc3RyY21wIG9uIHRo YXQgaW5zdGVhZCBvZiBnb2luZyB0aGUgbXVjaCBoYXJkZXIgcm91dGUKCj4gKwkJCWNvbmZpZy0+ dmFsdWUgPSBmbGlwOwo+ICsKPiArCQlpZiAoZ3Bpb19pc192YWxpZChjb25maWctPmdwaW8pKSB7 Cj4gKwkJCXByX2RlYnVnKCJncGlvICVzLCB2YWx1ZSAlZFxuIiwgY29uZmlnLT5ncGlvX25hbWUs Cj4gKwkJCQljb25maWctPnZhbHVlKTsKPiArCj4gKwkJCWlmIChkcF9wb3dlcl9maW5kX2dwaW8o Y29uZmlnLT5ncGlvX25hbWUsICJhdXgtZW4iKSB8fAo+ICsJCQkgICAgZHBfcG93ZXJfZmluZF9n cGlvKGNvbmZpZy0+Z3Bpb19uYW1lLCAiYXV4LXNlbCIpKQoKU2FtZSBhbmQgc2FtZQoKPiArCQkJ CWdwaW9fZGlyZWN0aW9uX291dHB1dChjb25maWctPmdwaW8sCj4gKwkJCQkJY29uZmlnLT52YWx1 ZSk7Cj4gKwkJCWVsc2UKPiArCQkJCWdwaW9fc2V0X3ZhbHVlKGNvbmZpZy0+Z3BpbywgY29uZmln LT52YWx1ZSk7Cj4gKwo+ICsJCX0KPiArCQljb25maWcrKzsKPiArCX0KPiArfQo+ICsKPiArc3Rh dGljIGludCBkcF9wb3dlcl9jb25maWdfZ3Bpb3Moc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBv d2VyLCBib29sIGZsaXAsCj4gKwkJCQkJYm9vbCBlbmFibGUpCj4gK3sKPiArCWludCByYyA9IDAs IGk7Cj4gKwlzdHJ1Y3QgZHNzX21vZHVsZV9wb3dlciAqbXA7Cj4gKwlzdHJ1Y3QgZHNzX2dwaW8g KmNvbmZpZzsKPiArCj4gKwltcCA9ICZwb3dlci0+cGFyc2VyLT5tcFtEUF9DT1JFX1BNXTsKPiAr CWNvbmZpZyA9IG1wLT5ncGlvX2NvbmZpZzsKPiArCj4gKwlpZiAoZW5hYmxlKSB7Cj4gKwkJcmMg PSBkcF9wb3dlcl9yZXF1ZXN0X2dwaW9zKHBvd2VyKTsKPiArCQlpZiAocmMpIHsKPiArCQkJcHJf ZXJyKCJncGlvIHJlcXVlc3QgZmFpbGVkXG4iKTsKCmRwX3Bvd2VyX3JlcXVlc3RfZ3Bpb3MgcHJp bnRzIGFuIGVycm9yIG1lc3NhZ2Ugb24gZXZlcnkgZmFpbHVyZSBwb2ludC4KCj4gKwkJCXJldHVy biByYzsKPiArCQl9Cj4gKwo+ICsJCWRwX3Bvd2VyX3NldF9ncGlvKHBvd2VyLCBmbGlwKTsKCkl0 IHNlZW1zIGxpa2UgbWF5YmUgZHBfcG93ZXJfcmVxdWVzdF9ncGlvcygpIGFuZCBkcF9wb3dlcl9z ZXRfZ3BpbygpIGNhbiBiZQpjb21iaW5lZCAtIGJvdGggb2YgdGhlbSBvbmx5IGdldCBjYWxsZWQg aGVyZS4KCj4gKwl9IGVsc2UgewoKQWdhaW4sIHRoaXMgZmVlbHMgbGlrZSBpdCBjb3VsZCBzYWZl bHkgYmUgaW4gaXRzIG93biBmdW5jdGlvbiBmb3IgY2xhcml0eS4KCj4gKwkJZm9yIChpID0gMDsg aSA8IG1wLT5udW1fZ3BpbzsgaSsrKSB7Cj4gKwkJCWdwaW9fc2V0X3ZhbHVlKGNvbmZpZ1tpXS5n cGlvLCAwKTsKPiArCQkJZ3Bpb19mcmVlKGNvbmZpZ1tpXS5ncGlvKTsKPiArCQl9Cj4gKwl9Cj4g Kwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHBfcG93ZXJfY2xpZW50X2lu aXQoc3RydWN0IGRwX3Bvd2VyICpkcF9wb3dlcikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0 cnVjdCBkcF9wb3dlcl9wcml2YXRlICpwb3dlcjsKPiArCj4gKwlpZiAoIWRwX3Bvd2VyKSB7Cj4g KwkJcHJfZXJyKCJpbnZhbGlkIHBvd2VyIGRhdGFcbiIpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ ICsJfQoKZHBfcG93ZXIgY2FuIG5ldmVyIGJlIE5VTEwgaGVyZS4KCj4gKwlwb3dlciA9IGNvbnRh aW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUsIGRwX3Bvd2VyKTsKPiAr Cj4gKwlwbV9ydW50aW1lX2VuYWJsZSgmcG93ZXItPnBkZXYtPmRldik7Cj4gKwo+ICsJcmMgPSBk cF9wb3dlcl9yZWd1bGF0b3JfaW5pdChwb3dlcik7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIo ImZhaWxlZCB0byBpbml0IHJlZ3VsYXRvcnNcbiIpOwoKVGhlIHN1YiBmdW5jdGlvbiBhbHJlYWR5 IHByaW50cyBlcnJvciBtZXNzYWdlcy4KCj4gKwkJZ290byBlcnJvcl9wb3dlcjsKPiArCX0KPiAr Cj4gKwlyYyA9IGRwX3Bvd2VyX2Nsa19pbml0KHBvd2VyLCB0cnVlKTsKPiArCWlmIChyYykgewo+ ICsJCXByX2VycigiZmFpbGVkIHRvIGluaXQgY2xvY2tzXG4iKTsKCkFsc28gdGhpcyBvbmUuCgo+ ICsJCWdvdG8gZXJyb3JfY2xrOwo+ICsJfQo+ICsJcmV0dXJuIDA7CgpZb3UgY2FuIGZsaXAgdGhp cyBpZiBzdGF0ZW1lbnQgYW5kIHNhdmUgYSBnb3RvOgoKaWYgKCFyYykKICAgIHJldHVybiAwOwoK ZHBfcG93ZXJfcmVndWxhdG9yX2RlaW5pdChwb3dlcik7Ci4uLgoKPiArCj4gK2Vycm9yX2NsazoK PiArCWRwX3Bvd2VyX3JlZ3VsYXRvcl9kZWluaXQocG93ZXIpOwo+ICtlcnJvcl9wb3dlcjoKPiAr CXBtX3J1bnRpbWVfZGlzYWJsZSgmcG93ZXItPnBkZXYtPmRldik7Cj4gKwlyZXR1cm4gcmM7Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGRwX3Bvd2VyX2NsaWVudF9kZWluaXQoc3RydWN0IGRwX3Bv d2VyICpkcF9wb3dlcikKPiArewo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ ICsKPiArCWlmICghZHBfcG93ZXIpIHsKPiArCQlwcl9lcnIoImludmFsaWQgcG93ZXIgZGF0YVxu Iik7Cj4gKwkJcmV0dXJuOwo+ICsJfQoKZHBfcG93ZXIgaXMgYWx3YXlzIHNldC4KCj4gKwlwb3dl ciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUsIGRwX3Bv d2VyKTsKPiArCj4gKwlkcF9wb3dlcl9jbGtfaW5pdChwb3dlciwgZmFsc2UpOwo+ICsJZHBfcG93 ZXJfcmVndWxhdG9yX2RlaW5pdChwb3dlcik7Cj4gKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBvd2Vy LT5wZGV2LT5kZXYpOwo+ICsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wb3dlcl9zZXRfcGl4 ZWxfY2xrX3BhcmVudChzdHJ1Y3QgZHBfcG93ZXIgKmRwX3Bvd2VyKQo+ICt7Cj4gKwlpbnQgcmMg PSAwOwo+ICsJc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUgKnBvd2VyOwo+ICsKPiArCWlmICghZHBf cG93ZXIpIHsKPiArCQlwcl9lcnIoImludmFsaWQgcG93ZXIgZGF0YVxuIik7Cj4gKwkJcmMgPSAt RUlOVkFMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPgpkcF9wb3dlciBpcyBhbHdheXMgc2V0LgoK PiArCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2VyLCBzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0 ZSwgZHBfcG93ZXIpOwo+ICsKPiArCWlmIChwb3dlci0+cGl4ZWxfY2xrX3JjZyAmJiBwb3dlci0+ cGl4ZWxfcGFyZW50KQo+ICsJCWNsa19zZXRfcGFyZW50KHBvd2VyLT5waXhlbF9jbGtfcmNnLCBw b3dlci0+cGl4ZWxfcGFyZW50KTsKPiArZXhpdDoKPiArCXJldHVybiByYzsKPiArfQo+ICsKPiAr c3RhdGljIGludCBkcF9wb3dlcl9pbml0KHN0cnVjdCBkcF9wb3dlciAqZHBfcG93ZXIsIGJvb2wg ZmxpcCkKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9wb3dlcl9wcml2YXRlICpw b3dlcjsKPiArCj4gKwlpZiAoIWRwX3Bvd2VyKSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIHBvd2Vy IGRhdGFcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGV4aXQ7Cj4gKwl9CgpkcF9w b3dlciBpcyBhbHdheXMgc2V0LgoKPiArCXBvd2VyID0gY29udGFpbmVyX29mKGRwX3Bvd2VyLCBz dHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSwgZHBfcG93ZXIpOwo+ICsKPiArCXBtX3J1bnRpbWVfZ2V0 X3N5bmMoJnBvd2VyLT5wZGV2LT5kZXYpOwo+ICsJcmMgPSBkcF9wb3dlcl9yZWd1bGF0b3JfY3Ry bChwb3dlciwgdHJ1ZSk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoImZhaWxlZCB0byBlbmFi bGUgcmVndWxhdG9yc1xuIik7CgpUaGlzIGFscmVhZHkgcHJpbnRzIHRoZSBlcnJvciBtZXNzYWdl cyB5b3UgbmVlZC4KCj4gKwkJZ290byBleGl0Owo+ICsJfQo+ICsKPiArCXJjID0gZHBfcG93ZXJf cGluY3RybF9zZXQocG93ZXIsIHRydWUpOwo+ICsJaWYgKHJjKSB7Cj4gKwkJcHJfZXJyKCJmYWls ZWQgdG8gc2V0IHBpbmN0cmwgc3RhdGVcbiIpOwoKU2FtZS4KCj4gKwkJZ290byBlcnJfcGluY3Ry bDsKPiArCX0KPiArCj4gKwlyYyA9IGRwX3Bvd2VyX2NvbmZpZ19ncGlvcyhwb3dlciwgZmxpcCwg dHJ1ZSk7Cj4gKwlpZiAocmMpIHsKPiArCQlwcl9lcnIoImZhaWxlZCB0byBlbmFibGUgZ3Bpb3Nc biIpOwoKU2FtZS4KCj4gKwkJZ290byBlcnJfZ3BpbzsKPiArCX0KPiArCj4gKwlyYyA9IGRwX3Bv d2VyX2Nsa19lbmFibGUoZHBfcG93ZXIsIERQX0NPUkVfUE0sIHRydWUpOwo+ICsJaWYgKHJjKSB7 Cj4gKwkJcHJfZXJyKCJmYWlsZWQgdG8gZW5hYmxlIERQIGNvcmUgY2xvY2tzXG4iKTsKClNhbWUu Cgo+ICsJCWdvdG8gZXJyX2NsazsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKCkFzIGFib3ZlLCBm bGlwIHRoZSBpZiBzdGF0ZW1lbnQgYW5kIHNhdmUgYSBnb3RvOgoKaWYgKCFyYykKICAgIHJldHVy biAwOwoKZHBfcG93ZXJfY29uZmlnX2dwaW9zKHBvd2VyLCBmbGlwLCBmYWxzZSk7Ci4uLgoKPiAr Cj4gK2Vycl9jbGs6Cj4gKwlkcF9wb3dlcl9jb25maWdfZ3Bpb3MocG93ZXIsIGZsaXAsIGZhbHNl KTsKPiArZXJyX2dwaW86Cj4gKwlkcF9wb3dlcl9waW5jdHJsX3NldChwb3dlciwgZmFsc2UpOwo+ ICtlcnJfcGluY3RybDoKPiArCWRwX3Bvd2VyX3JlZ3VsYXRvcl9jdHJsKHBvd2VyLCBmYWxzZSk7 Cj4gK2V4aXQ6Cj4gKwlwbV9ydW50aW1lX3B1dF9zeW5jKCZwb3dlci0+cGRldi0+ZGV2KTsKPiAr CXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcF9wb3dlcl9kZWluaXQoc3RydWN0 IGRwX3Bvd2VyICpkcF9wb3dlcikKPiArewo+ICsJaW50IHJjID0gMDsKPiArCXN0cnVjdCBkcF9w b3dlcl9wcml2YXRlICpwb3dlcjsKPiArCj4gKwlpZiAoIWRwX3Bvd2VyKSB7Cj4gKwkJcHJfZXJy KCJpbnZhbGlkIHBvd2VyIGRhdGFcbiIpOwo+ICsJCXJjID0gLUVJTlZBTDsKPiArCQlnb3RvIGV4 aXQ7Cj4gKwl9CgpkcF9wb3dlciBjYW4gbmV2ZXIgYmUgTlVMTDsKCj4gKwlwb3dlciA9IGNvbnRh aW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2VyX3ByaXZhdGUsIGRwX3Bvd2VyKTsKPiAr Cj4gKwlkcF9wb3dlcl9jbGtfZW5hYmxlKGRwX3Bvd2VyLCBEUF9DT1JFX1BNLCBmYWxzZSk7Cj4g KwlkcF9wb3dlcl9jb25maWdfZ3Bpb3MocG93ZXIsIGZhbHNlLCBmYWxzZSk7Cj4gKwlkcF9wb3dl cl9waW5jdHJsX3NldChwb3dlciwgZmFsc2UpOwo+ICsJZHBfcG93ZXJfcmVndWxhdG9yX2N0cmwo cG93ZXIsIGZhbHNlKTsKPiArCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBvd2VyLT5wZGV2LT5kZXYp Owo+ICtleGl0Ogo+ICsJcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgZHBfcG93ZXIgKmRw X3Bvd2VyX2dldChzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpCj4gK3sKPiArCWludCByYyA9IDA7 Cj4gKwlzdHJ1Y3QgZHBfcG93ZXJfcHJpdmF0ZSAqcG93ZXI7Cj4gKwlzdHJ1Y3QgZHBfcG93ZXIg KmRwX3Bvd2VyOwo+ICsKPiArCWlmICghcGFyc2VyKSB7Cj4gKwkJcHJfZXJyKCJpbnZhbGlkIGlu cHV0XG4iKTsKPiArCQlyYyA9IC1FSU5WQUw7Cj4gKwkJZ290byBlcnJvcjsKPiArCX0KCnBhcnNl ciBjYW4gbmV2ZXIgYmUgTlVMTDsKCj4gKwlwb3dlciA9IGRldm1fa3phbGxvYygmcGFyc2VyLT5w ZGV2LT5kZXYsIHNpemVvZigqcG93ZXIpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghcG93ZXIpIHsK PiArCQlyYyA9IC1FTk9NRU07CgpKdXN0IHJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwoKPiArCQln b3RvIGVycm9yOwo+ICsJfQo+ICsKPiArCXBvd2VyLT5wYXJzZXIgPSBwYXJzZXI7Cj4gKwlwb3dl ci0+cGRldiA9IHBhcnNlci0+cGRldjsKPiArCj4gKwlkcF9wb3dlciA9ICZwb3dlci0+ZHBfcG93 ZXI7Cj4gKwo+ICsJZHBfcG93ZXItPmluaXQgPSBkcF9wb3dlcl9pbml0Owo+ICsJZHBfcG93ZXIt PmRlaW5pdCA9IGRwX3Bvd2VyX2RlaW5pdDsKPiArCWRwX3Bvd2VyLT5jbGtfZW5hYmxlID0gZHBf cG93ZXJfY2xrX2VuYWJsZTsKPiArCWRwX3Bvd2VyLT5zZXRfcGl4ZWxfY2xrX3BhcmVudCA9IGRw X3Bvd2VyX3NldF9waXhlbF9jbGtfcGFyZW50Owo+ICsJZHBfcG93ZXItPnBvd2VyX2NsaWVudF9p bml0ID0gZHBfcG93ZXJfY2xpZW50X2luaXQ7Cj4gKwlkcF9wb3dlci0+cG93ZXJfY2xpZW50X2Rl aW5pdCA9IGRwX3Bvd2VyX2NsaWVudF9kZWluaXQ7Cj4gKwo+ICsJcmV0dXJuIGRwX3Bvd2VyOwo+ ICtlcnJvcjoKPiArCXJldHVybiBFUlJfUFRSKHJjKTsKPiArfQo+ICsKPiArdm9pZCBkcF9wb3dl cl9wdXQoc3RydWN0IGRwX3Bvd2VyICpkcF9wb3dlcikKPiArewo+ICsJc3RydWN0IGRwX3Bvd2Vy X3ByaXZhdGUgKnBvd2VyID0gTlVMTDsKPiArCj4gKwlpZiAoIWRwX3Bvd2VyKQo+ICsJCXJldHVy bjsKPiArCj4gKwlwb3dlciA9IGNvbnRhaW5lcl9vZihkcF9wb3dlciwgc3RydWN0IGRwX3Bvd2Vy X3ByaXZhdGUsIGRwX3Bvd2VyKTsKPiArCj4gKwlkZXZtX2tmcmVlKCZwb3dlci0+cGRldi0+ZGV2 LCBwb3dlcik7CgpZb3UgZG9uJ3QgbmVlZCB0byBrZnJlZSBkZXZpY2UgbWFuYWdlZCBtbWVtb3J5 LgoKPiArfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmgg Yi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3Bvd2VyLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0 NAo+IGluZGV4IDAwMDAwMDAuLmQxYWRhYWYKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL21zbS9kcC9kcF9wb3dlci5oCj4gQEAgLTAsMCArMSw1NyBAQAo+ICsvKgo+ICsg KiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxOCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAo+ICsg KiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbi4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPiArICogR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICovCgpT UERYIHBsZWFzZS4KCj4gKwo+ICsjaWZuZGVmIF9EUF9QT1dFUl9IXwo+ICsjZGVmaW5lIF9EUF9Q T1dFUl9IXwo+ICsKPiArI2luY2x1ZGUgImRwX3BhcnNlci5oIgo+ICsjaW5jbHVkZSAiZHB1X3Bv d2VyX2hhbmRsZS5oIgo+ICsKPiArLyoqCj4gKyAqIHNydWN0IGRwX3Bvd2VyIC0gRGlzcGxheVBv cnQncyBwb3dlciByZWxhdGVkIGRhdGEKPiArICoKPiArICogQGluaXQ6IGluaXRpYWxpemVzIHRo ZSByZWd1bGF0b3JzL2NvcmUgY2xvY2tzL0dQSU9zL3BpbmN0cmwKPiArICogQGRlaW5pdDogdHVy bnMgb2ZmIHRoZSByZWd1bGF0b3JzL2NvcmUgY2xvY2tzL0dQSU9zL3BpbmN0cmwKPiArICogQGNs a19lbmFibGU6IGVuYWJsZS9kaXNhYmxlIHRoZSBEUCBjbG9ja3MKPiArICogQHNldF9waXhlbF9j bGtfcGFyZW50OiBzZXQgdGhlIHBhcmVudCBvZiBEUCBwaXhlbCBjbG9jawo+ICsgKi8KPiArc3Ry dWN0IGRwX3Bvd2VyIHsKPiArCWludCAoKmluaXQpKHN0cnVjdCBkcF9wb3dlciAqcG93ZXIsIGJv b2wgZmxpcCk7Cj4gKwlpbnQgKCpkZWluaXQpKHN0cnVjdCBkcF9wb3dlciAqcG93ZXIpOwo+ICsJ aW50ICgqY2xrX2VuYWJsZSkoc3RydWN0IGRwX3Bvd2VyICpwb3dlciwgZW51bSBkcF9wbV90eXBl IHBtX3R5cGUsCj4gKwkJCQlib29sIGVuYWJsZSk7Cj4gKwlpbnQgKCpzZXRfcGl4ZWxfY2xrX3Bh cmVudCkoc3RydWN0IGRwX3Bvd2VyICpwb3dlcik7Cj4gKwlpbnQgKCpwb3dlcl9jbGllbnRfaW5p dCkoc3RydWN0IGRwX3Bvd2VyICpwb3dlcik7Cj4gKwl2b2lkICgqcG93ZXJfY2xpZW50X2RlaW5p dCkoc3RydWN0IGRwX3Bvd2VyICpwb3dlcik7Cj4gK307Cj4gKwo+ICsvKioKPiArICogZHBfcG93 ZXJfZ2V0KCkgLSBjb25maWd1cmUgYW5kIGdldCB0aGUgRGlzcGxheVBvcnQgcG93ZXIgbW9kdWxl IGRhdGEKPiArICoKPiArICogQHBhcnNlcjogaW5zdGFuY2Ugb2YgcGFyc2VyIG1vZHVsZQo+ICsg KiByZXR1cm46IHBvaW50ZXIgdG8gYWxsb2NhdGVkIHBvd2VyIG1vZHVsZSBkYXRhCj4gKyAqCj4g KyAqIFRoaXMgQVBJIHdpbGwgY29uZmlndXJlIHRoZSBEaXNwbGF5UG9ydCdzIHBvd2VyIG1vZHVs ZSBhbmQgcHJvdmlkZXMKPiArICogbWV0aG9kcyB0byBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB0 byBjb25maWd1cmUgdGhlIHBvd2VyIHJlbGF0ZWQKPiArICogbW9kdWVsZXMuCj4gKyAqLwo+ICtz dHJ1Y3QgZHBfcG93ZXIgKmRwX3Bvd2VyX2dldChzdHJ1Y3QgZHBfcGFyc2VyICpwYXJzZXIpOwo+ ICsKPiArLyoqCj4gKyAqIGRwX3Bvd2VyX3B1dCgpIC0gcmVsZWFzZSB0aGUgcG93ZXIgcmVsYXRl ZCByZXNvdXJjZXMKPiArICoKPiArICogQHBvd2VyOiBwb2ludGVyIHRvIHRoZSBwb3dlciBtb2R1 bGUncyBkYXRhCj4gKyAqLwo+ICt2b2lkIGRwX3Bvd2VyX3B1dChzdHJ1Y3QgZHBfcG93ZXIgKnBv d2VyKTsKPiArI2VuZGlmIC8qIF9EUF9QT1dFUl9IXyAqLwo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vbXNtL2RwL2RwX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kcC9kcF9yZWcu aAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNzdiNWMwZQo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RwL2RwX3JlZy5oCj4gQEAgLTAs MCArMSwzNTcgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDE3LTIwMTgsIFRoZSBMaW51 eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBk aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv Zgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCj4gKyAqCj4gKyAqLwoKU1BEWCBwbGVhc2UuCgo8c25pcCB0aGUgcmVzdD4KCkpvcmRh bgoKLS0gClRoZSBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBpcyBhIG1lbWJlciBv ZiBDb2RlIEF1cm9yYSBGb3J1bSwKYSBMaW51eCBGb3VuZGF0aW9uIENvbGxhYm9yYXRpdmUgUHJv amVjdApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpGcmVl ZHJlbm8gbWFpbGluZyBsaXN0CkZyZWVkcmVub0BsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9mcmVlZHJlbm8K