From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 3/8] drm/i915: Pull all the reset functionality together into i915_reset.c Date: Mon, 14 Jan 2019 21:04:03 +0000 Message-ID: <20190114210408.4561-4-chris@chris-wilson.co.uk> References: <20190114210408.4561-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8260F6E61E for ; Mon, 14 Jan 2019 21:04:29 +0000 (UTC) In-Reply-To: <20190114210408.4561-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: mika.kuoppala@intel.com List-Id: intel-gfx@lists.freedesktop.org Q3VycmVudGx5IHRoZSBjb2RlIHRvIHJlc2V0IHRoZSBHUFUgYW5kIG91ciBzdGF0ZSBpcyBzcHJl YWQgd2lkZWx5CmFjcm9zcyBhIGZldyBmaWxlcy4gUHVsbCB0aGUgbG9naWMgdG9nZXRoZXIgaW50 byBhIGNvbW1vbiBmaWxlLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJp cy13aWxzb24uY28udWs+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAg ICAgICAgICAgIHwgICAgMyArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMg ICAgICAgICAgIHwgICAgMiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jICAgICAg ICAgICAgICAgfCAgMjA2ICstLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCAgICAg ICAgICAgICAgIHwgICAzMyArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyAgICAg ICAgICAgICAgIHwgIDQ0NiArLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0 dC5jICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyAg ICAgICAgICAgICAgIHwgIDIzOCAtLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVxdWVz dC5jICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXNldC5j ICAgICAgICAgICAgIHwgMTM4OSArKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9yZXNldC5oICAgICAgICAgICAgIHwgICA1NiArCiBkcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9kaXNwbGF5LmMgICAgICAgICAgfCAgIDE1ICstCiBkcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9lbmdpbmVfY3MuYyAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2d1Yy5oICAgICAgICAgICAgICB8ICAgIDMgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfaGFuZ2NoZWNrLmMgICAgICAgIHwgICAgMSArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF91Yy5jICAgICAgICAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX3VuY29yZS5jICAgICAgICAgICB8ICA1NTYgLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL2ludGVsX2xyYy5jICAgIHwgICAgMiArCiAuLi4vZHJtL2k5MTUvc2VsZnRl c3RzL2ludGVsX3dvcmthcm91bmRzLmMgICAgfCAgICAxICsKIDE4IGZpbGVzIGNoYW5nZWQsIDE0 ODMgaW5zZXJ0aW9ucygrKSwgMTQ3MiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Jlc2V0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Jlc2V0LmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IGMz NGJlZTE2NzMwZC4uNjExMTE1ZWQwMGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQpAQCAtNDAsOSAr NDAsMTAgQEAgaTkxNS15IDo9IGk5MTVfZHJ2Lm8gXAogCSAgaTkxNV9tbS5vIFwKIAkgIGk5MTVf cGFyYW1zLm8gXAogCSAgaTkxNV9wY2kubyBcCisJICBpOTE1X3Jlc2V0Lm8gXAogCSAgaTkxNV9z dXNwZW5kLm8gXAotCSAgaTkxNV9zeW5jbWFwLm8gXAogCSAgaTkxNV9zd19mZW5jZS5vIFwKKwkg IGk5MTVfc3luY21hcC5vIFwKIAkgIGk5MTVfc3lzZnMubyBcCiAJICBpbnRlbF9jc3IubyBcCiAJ ICBpbnRlbF9kZXZpY2VfaW5mby5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZGVidWdmcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMKaW5k ZXggZGE2ZDI1ODFjYjBlLi5hOTNhYmIyMjc0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZGVi dWdmcy5jCkBAIC0zMiw2ICszMiw4IEBACiAjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCiAjaW5jbHVk ZSAiaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCIKIAorI2luY2x1ZGUgImk5MTVfcmVzZXQuaCIKKwog c3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqbm9kZV90b19pOTE1KHN0cnVj dCBkcm1faW5mb19ub2RlICpub2RlKQogewogCXJldHVybiB0b19pOTE1KG5vZGUtPm1pbm9yLT5k ZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggZGFmYmJmYWRkMWFkLi5mNDYyYTRkMjhh ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUg Imk5MTVfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImk5MTVfcG11 LmgiCisjaW5jbHVkZSAiaTkxNV9yZXNldC5oIgogI2luY2x1ZGUgImk5MTVfcXVlcnkuaCIKICNp bmNsdWRlICJpOTE1X3ZncHUuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKQEAgLTIyMDUsMjEx ICsyMjA2LDYgQEAgc3RhdGljIGludCBpOTE1X3Jlc3VtZV9zd2l0Y2hlcm9vKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCiAJcmV0dXJuIGk5MTVfZHJtX3Jlc3VtZShkZXYpOwogfQogCi0vKioKLSAq IGk5MTVfcmVzZXQgLSByZXNldCBjaGlwIGFmdGVyIGEgaGFuZwotICogQGk5MTU6ICNkcm1faTkx NV9wcml2YXRlIHRvIHJlc2V0Ci0gKiBAc3RhbGxlZF9tYXNrOiBtYXNrIG9mIHRoZSBzdGFsbGVk IGVuZ2luZXMgd2l0aCB0aGUgZ3VpbHR5IHJlcXVlc3RzCi0gKiBAcmVhc29uOiB1c2VyIGVycm9y IG1lc3NhZ2UgZm9yIHdoeSB3ZSBhcmUgcmVzZXR0aW5nCi0gKgotICogUmVzZXQgdGhlIGNoaXAu ICBVc2VmdWwgaWYgYSBoYW5nIGlzIGRldGVjdGVkLiBNYXJrcyB0aGUgZGV2aWNlIGFzIHdlZGdl ZAotICogb24gZmFpbHVyZS4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBzdHJ1Y3RfbXV0 ZXguCi0gKgotICogUHJvY2VkdXJlIGlzIGZhaXJseSBzaW1wbGU6Ci0gKiAgIC0gcmVzZXQgdGhl IGNoaXAgdXNpbmcgdGhlIHJlc2V0IHJlZwotICogICAtIHJlLWluaXQgY29udGV4dCBzdGF0ZQot ICogICAtIHJlLWluaXQgaGFyZHdhcmUgc3RhdHVzIHBhZ2UKLSAqICAgLSByZS1pbml0IHJpbmcg YnVmZmVyCi0gKiAgIC0gcmUtaW5pdCBpbnRlcnJ1cHQgc3RhdGUKLSAqICAgLSByZS1pbml0IGRp c3BsYXkKLSAqLwotdm9pZCBpOTE1X3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 LAotCQl1bnNpZ25lZCBpbnQgc3RhbGxlZF9tYXNrLAotCQljb25zdCBjaGFyICpyZWFzb24pCi17 Ci0Jc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciA9ICZpOTE1LT5ncHVfZXJyb3I7Ci0JaW50 IHJldDsKLQlpbnQgaTsKLQotCUdFTV9UUkFDRSgiZmxhZ3M9JWx4XG4iLCBlcnJvci0+ZmxhZ3Mp OwotCi0JbWlnaHRfc2xlZXAoKTsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpOTE1LT5kcm0uc3Ry dWN0X211dGV4KTsKLQlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQoaTkxNSk7Ci0JR0VNX0JVR19P TighdGVzdF9iaXQoSTkxNV9SRVNFVF9CQUNLT0ZGLCAmZXJyb3ItPmZsYWdzKSk7Ci0KLQlpZiAo IXRlc3RfYml0KEk5MTVfUkVTRVRfSEFORE9GRiwgJmVycm9yLT5mbGFncykpCi0JCXJldHVybjsK LQotCS8qIENsZWFyIGFueSBwcmV2aW91cyBmYWlsZWQgYXR0ZW1wdHMgYXQgcmVjb3ZlcnkuIFRp bWUgdG8gdHJ5IGFnYWluLiAqLwotCWlmICghaTkxNV9nZW1fdW5zZXRfd2VkZ2VkKGk5MTUpKQot CQlnb3RvIHdha2V1cDsKLQotCWlmIChyZWFzb24pCi0JCWRldl9ub3RpY2UoaTkxNS0+ZHJtLmRl diwgIlJlc2V0dGluZyBjaGlwIGZvciAlc1xuIiwgcmVhc29uKTsKLQllcnJvci0+cmVzZXRfY291 bnQrKzsKLQotCXJldCA9IGk5MTVfZ2VtX3Jlc2V0X3ByZXBhcmUoaTkxNSk7Ci0JaWYgKHJldCkg ewotCQlkZXZfZXJyKGk5MTUtPmRybS5kZXYsICJHUFUgcmVjb3ZlcnkgZmFpbGVkXG4iKTsKLQkJ Z290byB0YWludDsKLQl9Ci0KLQlpZiAoIWludGVsX2hhc19ncHVfcmVzZXQoaTkxNSkpIHsKLQkJ aWYgKGk5MTVfbW9kcGFyYW1zLnJlc2V0KQotCQkJZGV2X2VycihpOTE1LT5kcm0uZGV2LCAiR1BV IHJlc2V0IG5vdCBzdXBwb3J0ZWRcbiIpOwotCQllbHNlCi0JCQlEUk1fREVCVUdfRFJJVkVSKCJH UFUgcmVzZXQgZGlzYWJsZWRcbiIpOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWZvciAoaSA9IDA7 IGkgPCAzOyBpKyspIHsKLQkJcmV0ID0gaW50ZWxfZ3B1X3Jlc2V0KGk5MTUsIEFMTF9FTkdJTkVT KTsKLQkJaWYgKHJldCA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJbXNsZWVwKDEwMCk7Ci0JfQotCWlm IChyZXQpIHsKLQkJZGV2X2VycihpOTE1LT5kcm0uZGV2LCAiRmFpbGVkIHRvIHJlc2V0IGNoaXBc biIpOwotCQlnb3RvIHRhaW50OwotCX0KLQotCS8qIE9rLCBub3cgZ2V0IHRoaW5ncyBnb2luZyBh Z2Fpbi4uLiAqLwotCi0JLyoKLQkgKiBFdmVyeXRoaW5nIGRlcGVuZHMgb24gaGF2aW5nIHRoZSBH VFQgcnVubmluZywgc28gd2UgbmVlZCB0byBzdGFydAotCSAqIHRoZXJlLgotCSAqLwotCXJldCA9 IGk5MTVfZ2d0dF9lbmFibGVfaHcoaTkxNSk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoIkZh aWxlZCB0byByZS1lbmFibGUgR0dUVCBmb2xsb3dpbmcgcmVzZXQgKCVkKVxuIiwKLQkJCSAgcmV0 KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpOTE1X2dlbV9yZXNldChpOTE1LCBzdGFsbGVkX21h c2spOwotCWludGVsX292ZXJsYXlfcmVzZXQoaTkxNSk7Ci0KLQkvKgotCSAqIE5leHQgd2UgbmVl ZCB0byByZXN0b3JlIHRoZSBjb250ZXh0LCBidXQgd2UgZG9uJ3QgdXNlIHRob3NlCi0JICogeWV0 IGVpdGhlci4uLgotCSAqCi0JICogUmluZyBidWZmZXIgbmVlZHMgdG8gYmUgcmUtaW5pdGlhbGl6 ZWQgaW4gdGhlIEtNUyBjYXNlLCBvciBpZiBYCi0JICogd2FzIHJ1bm5pbmcgYXQgdGhlIHRpbWUg b2YgdGhlIHJlc2V0IChpLmUuIHdlIHdlcmVuJ3QgVlQKLQkgKiBzd2l0Y2hlZCBhd2F5KS4KLQkg Ki8KLQlyZXQgPSBpOTE1X2dlbV9pbml0X2h3KGk5MTUpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VS Uk9SKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBIVyBmb2xsb3dpbmcgcmVzZXQgKCVkKVxuIiwKLQkJ CSAgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlpOTE1X3F1ZXVlX2hhbmdjaGVjayhpOTE1 KTsKLQotZmluaXNoOgotCWk5MTVfZ2VtX3Jlc2V0X2ZpbmlzaChpOTE1KTsKLXdha2V1cDoKLQlj bGVhcl9iaXQoSTkxNV9SRVNFVF9IQU5ET0ZGLCAmZXJyb3ItPmZsYWdzKTsKLQl3YWtlX3VwX2Jp dCgmZXJyb3ItPmZsYWdzLCBJOTE1X1JFU0VUX0hBTkRPRkYpOwotCXJldHVybjsKLQotdGFpbnQ6 Ci0JLyoKLQkgKiBIaXN0b3J5IHRlbGxzIHVzIHRoYXQgaWYgd2UgY2Fubm90IHJlc2V0IHRoZSBH UFUgbm93LCB3ZQotCSAqIG5ldmVyIHdpbGwuIFRoaXMgdGhlbiBpbXBhY3RzIGV2ZXJ5dGhpbmcg dGhhdCBpcyBydW4KLQkgKiBzdWJzZXF1ZW50bHkuIE9uIGZhaWxpbmcgdGhlIHJlc2V0LCB3ZSBt YXJrIHRoZSBkcml2ZXIKLQkgKiBhcyB3ZWRnZWQsIHByZXZlbnRpbmcgZnVydGhlciBleGVjdXRp b24gb24gdGhlIEdQVS4KLQkgKiBXZSBhbHNvIHdhbnQgdG8gZ28gb25lIHN0ZXAgZnVydGhlciBh bmQgYWRkIGEgdGFpbnQgdG8gdGhlCi0JICoga2VybmVsIHNvIHRoYXQgYW55IHN1YnNlcXVlbnQg ZmF1bHRzIGNhbiBiZSB0cmFjZWQgYmFjayB0bwotCSAqIHRoaXMgZmFpbHVyZS4gVGhpcyBpcyBp bXBvcnRhbnQgZm9yIENJLCB3aGVyZSBpZiB0aGUKLQkgKiBHUFUvZHJpdmVyIGZhaWxzIHdlIHdv dWxkIGxpa2UgdG8gcmVib290IGFuZCByZXN0YXJ0IHRlc3RpbmcKLQkgKiByYXRoZXIgdGhhbiBj b250aW51ZSBvbiBpbnRvIG9ibGl2aW9uLiBGb3IgZXZlcnlvbmUgZWxzZSwKLQkgKiB0aGUgc3lz dGVtIHNob3VsZCBzdGlsbCBwbG9kIGFsb25nLCBidXQgdGhleSBoYXZlIGJlZW4gd2FybmVkIQot CSAqLwotCWFkZF90YWludChUQUlOVF9XQVJOLCBMT0NLREVQX1NUSUxMX09LKTsKLWVycm9yOgot CWk5MTVfZ2VtX3NldF93ZWRnZWQoaTkxNSk7Ci0JaTkxNV9yZXRpcmVfcmVxdWVzdHMoaTkxNSk7 Ci0JZ290byBmaW5pc2g7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGludGVsX2d0X3Jlc2V0X2Vu Z2luZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJCXN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlyZXR1cm4gaW50ZWxfZ3B1X3Jlc2V0KGRldl9wcml2 LCBpbnRlbF9lbmdpbmVfZmxhZyhlbmdpbmUpKTsKLX0KLQotLyoqCi0gKiBpOTE1X3Jlc2V0X2Vu Z2luZSAtIHJlc2V0IEdQVSBlbmdpbmUgdG8gcmVjb3ZlciBmcm9tIGEgaGFuZwotICogQGVuZ2lu ZTogZW5naW5lIHRvIHJlc2V0Ci0gKiBAbXNnOiByZWFzb24gZm9yIEdQVSByZXNldDsgb3IgTlVM TCBmb3Igbm8gZGV2X25vdGljZSgpCi0gKgotICogUmVzZXQgYSBzcGVjaWZpYyBHUFUgZW5naW5l LiBVc2VmdWwgaWYgYSBoYW5nIGlzIGRldGVjdGVkLgotICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nl c3NmdWwgcmVzZXQgb3Igb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCi0gKgotICogUHJvY2VkdXJl IGlzOgotICogIC0gaWRlbnRpZmllcyB0aGUgcmVxdWVzdCB0aGF0IGNhdXNlZCB0aGUgaGFuZyBh bmQgaXQgaXMgZHJvcHBlZAotICogIC0gcmVzZXQgZW5naW5lICh3aGljaCB3aWxsIGZvcmNlIHRo ZSBlbmdpbmUgdG8gaWRsZSkKLSAqICAtIHJlLWluaXQvY29uZmlndXJlIGVuZ2luZQotICovCi1p bnQgaTkxNV9yZXNldF9lbmdpbmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLCBjb25z dCBjaGFyICptc2cpCi17Ci0Jc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciA9ICZlbmdpbmUt Pmk5MTUtPmdwdV9lcnJvcjsKLQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICphY3RpdmVfcmVxdWVzdDsK LQlpbnQgcmV0OwotCi0JR0VNX1RSQUNFKCIlcyBmbGFncz0lbHhcbiIsIGVuZ2luZS0+bmFtZSwg ZXJyb3ItPmZsYWdzKTsKLQlHRU1fQlVHX09OKCF0ZXN0X2JpdChJOTE1X1JFU0VUX0VOR0lORSAr IGVuZ2luZS0+aWQsICZlcnJvci0+ZmxhZ3MpKTsKLQotCWFjdGl2ZV9yZXF1ZXN0ID0gaTkxNV9n ZW1fcmVzZXRfcHJlcGFyZV9lbmdpbmUoZW5naW5lKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYWN0 aXZlX3JlcXVlc3QpKSB7Ci0JCS8qIEVpdGhlciB0aGUgcHJldmlvdXMgcmVzZXQgZmFpbGVkLCBv ciB3ZSBwYXJkb24gdGhlIHJlc2V0LiAqLwotCQlyZXQgPSBQVFJfRVJSKGFjdGl2ZV9yZXF1ZXN0 KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKG1zZykKLQkJZGV2X25vdGljZShlbmdpbmUtPmk5 MTUtPmRybS5kZXYsCi0JCQkgICAiUmVzZXR0aW5nICVzIGZvciAlc1xuIiwgZW5naW5lLT5uYW1l LCBtc2cpOwotCWVycm9yLT5yZXNldF9lbmdpbmVfY291bnRbZW5naW5lLT5pZF0rKzsKLQotCWlm ICghZW5naW5lLT5pOTE1LT5ndWMuZXhlY2J1Zl9jbGllbnQpCi0JCXJldCA9IGludGVsX2d0X3Jl c2V0X2VuZ2luZShlbmdpbmUtPmk5MTUsIGVuZ2luZSk7Ci0JZWxzZQotCQlyZXQgPSBpbnRlbF9n dWNfcmVzZXRfZW5naW5lKCZlbmdpbmUtPmk5MTUtPmd1YywgZW5naW5lKTsKLQlpZiAocmV0KSB7 Ci0JCS8qIElmIHdlIGZhaWwgaGVyZSwgd2UgZXhwZWN0IHRvIGZhbGxiYWNrIHRvIGEgZ2xvYmFs IHJlc2V0ICovCi0JCURSTV9ERUJVR19EUklWRVIoIiVzRmFpbGVkIHRvIHJlc2V0ICVzLCByZXQ9 JWRcbiIsCi0JCQkJIGVuZ2luZS0+aTkxNS0+Z3VjLmV4ZWNidWZfY2xpZW50ID8gIkd1QyAiIDog IiIsCi0JCQkJIGVuZ2luZS0+bmFtZSwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkg KiBUaGUgcmVxdWVzdCB0aGF0IGNhdXNlZCB0aGUgaGFuZyBpcyBzdHVjayBvbiBlbHNwLCB3ZSBr bm93IHRoZQotCSAqIGFjdGl2ZSByZXF1ZXN0IGFuZCBjYW4gZHJvcCBpdCwgYWRqdXN0IGhlYWQg dG8gc2tpcCB0aGUgb2ZmZW5kaW5nCi0JICogcmVxdWVzdCB0byByZXN1bWUgZXhlY3V0aW5nIHJl bWFpbmluZyByZXF1ZXN0cyBpbiB0aGUgcXVldWUuCi0JICovCi0JaTkxNV9nZW1fcmVzZXRfZW5n aW5lKGVuZ2luZSwgYWN0aXZlX3JlcXVlc3QsIHRydWUpOwotCi0JLyoKLQkgKiBUaGUgZW5naW5l IGFuZCBpdHMgcmVnaXN0ZXJzIChhbmQgd29ya2Fyb3VuZHMgaW4gY2FzZSBvZiByZW5kZXIpCi0J ICogaGF2ZSBiZWVuIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBGb2xsb3cgdGhlIGlu aXRfcmluZwotCSAqIHByb2Nlc3MgdG8gcHJvZ3JhbSBSSU5HX01PREUsIEhXU1AgYW5kIHJlLWVu YWJsZSBzdWJtaXNzaW9uLgotCSAqLwotCXJldCA9IGVuZ2luZS0+aW5pdF9odyhlbmdpbmUpOwot CWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi1vdXQ6Ci0JaW50ZWxfZW5naW5lX2NhbmNlbF9zdG9w X2NzKGVuZ2luZSk7Ci0JaTkxNV9nZW1fcmVzZXRfZmluaXNoX2VuZ2luZShlbmdpbmUpOwotCXJl dHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgaTkxNV9wbV9wcmVwYXJlKHN0cnVjdCBkZXZpY2Ug KmtkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGtkZXYpOwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggZmE5OTgyNGY2M2IzLi4yMjRkNDMzYWM3YjYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9kcnYuaApAQCAtMjYxMSwxOSArMjYxMSw3IEBAIGV4dGVybiBjb25zdCBz dHJ1Y3QgZGV2X3BtX29wcyBpOTE1X3BtX29wczsKIGV4dGVybiBpbnQgaTkxNV9kcml2ZXJfbG9h ZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9p ZCAqZW50KTsKIGV4dGVybiB2b2lkIGk5MTVfZHJpdmVyX3VubG9hZChzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2KTsKLWV4dGVybiBpbnQgaW50ZWxfZ3B1X3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiwgdTMyIGVuZ2luZV9tYXNrKTsKLWV4dGVybiBib29sIGludGVsX2hhc19n cHVfcmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLQotZXh0ZXJuIHZv aWQgaTkxNV9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJICAgICAgIHVu c2lnbmVkIGludCBzdGFsbGVkX21hc2ssCi0JCSAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwot ZXh0ZXJuIGludCBpOTE1X3Jlc2V0X2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUsCi0JCQkgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7Ci0KLWV4dGVybiBib29sIGludGVsX2hh c19yZXNldF9lbmdpbmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLWV4dGVy biBpbnQgaW50ZWxfcmVzZXRfZ3VjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7 Ci1leHRlcm4gaW50IGludGVsX2d1Y19yZXNldF9lbmdpbmUoc3RydWN0IGludGVsX2d1YyAqZ3Vj LAotCQkJCSAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKTsKKwogZXh0ZXJuIHZvaWQg aW50ZWxfZW5naW5lX2luaXRfaGFuZ2NoZWNrKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSk7CiBleHRlcm4gdm9pZCBpbnRlbF9oYW5nY2hlY2tfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaTkxNV9jaGlwc2V0X3ZhbChz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwpAQCAtMjY2NiwyMCArMjY1NCwxMSBA QCBzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV9xdWV1ZV9oYW5nY2hlY2soc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2KQogCQkJICAgJmRldl9wcml2LT5ncHVfZXJyb3IuaGFuZ2NoZWNr X3dvcmssIGRlbGF5KTsKIH0KIAotX19wcmludGYoNCwgNSkKLXZvaWQgaTkxNV9oYW5kbGVfZXJy b3Ioc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkgICAgICAgdTMyIGVuZ2lu ZV9tYXNrLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJICAgICAgIGNvbnN0IGNo YXIgKmZtdCwgLi4uKTsKLSNkZWZpbmUgSTkxNV9FUlJPUl9DQVBUVVJFIEJJVCgwKQotCiBleHRl cm4gdm9pZCBpbnRlbF9pcnFfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYp OwogZXh0ZXJuIHZvaWQgaW50ZWxfaXJxX2Zpbmkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2KTsKIGludCBpbnRlbF9pcnFfaW5zdGFsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYpOwogdm9pZCBpbnRlbF9pcnFfdW5pbnN0YWxsKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdik7CiAKLXZvaWQgaTkxNV9jbGVhcl9lcnJvcl9yZWdpc3RlcnMoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLQogc3RhdGljIGlubGluZSBib29sIGludGVs X2d2dF9hY3RpdmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCXJldHVy biBkZXZfcHJpdi0+Z3Z0OwpAQCAtMzA0NCwxOCArMzAyMyw4IEBAIHN0YXRpYyBpbmxpbmUgdTMy IGk5MTVfcmVzZXRfZW5naW5lX2NvdW50KHN0cnVjdCBpOTE1X2dwdV9lcnJvciAqZXJyb3IsCiAJ cmV0dXJuIFJFQURfT05DRShlcnJvci0+cmVzZXRfZW5naW5lX2NvdW50W2VuZ2luZS0+aWRdKTsK IH0KIAotc3RydWN0IGk5MTVfcmVxdWVzdCAqCi1pOTE1X2dlbV9yZXNldF9wcmVwYXJlX2VuZ2lu ZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOwotaW50IGk5MTVfZ2VtX3Jlc2V0X3By ZXBhcmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLXZvaWQgaTkxNV9nZW1f cmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkgICAgdW5zaWduZWQg aW50IHN0YWxsZWRfbWFzayk7Ci12b2lkIGk5MTVfZ2VtX3Jlc2V0X2ZpbmlzaF9lbmdpbmUoc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKTsKLXZvaWQgaTkxNV9nZW1fcmVzZXRfZmluaXNo KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiB2b2lkIGk5MTVfZ2VtX3NldF93 ZWRnZWQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIGJvb2wgaTkxNV9nZW1f dW5zZXRfd2VkZ2VkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Ci12b2lkIGk5 MTVfZ2VtX3Jlc2V0X2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0JCQkg ICBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpyZXF1ZXN0LAotCQkJICAgYm9vbCBzdGFsbGVkKTsKIAog dm9pZCBpOTE1X2dlbV9pbml0X21taW8oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpOwog aW50IF9fbXVzdF9jaGVjayBpOTE1X2dlbV9pbml0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCA5MTBjNDliZWZjNTAuLmE3ZTBk NjFhNDVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCkBAIC0yNywxNSArMjcsNiBAQAogCiAj aW5jbHVkZSA8ZHJtL2RybV92bWFfbWFuYWdlci5oPgogI2luY2x1ZGUgPGRybS9pOTE1X2RybS5o PgotI2luY2x1ZGUgImk5MTVfZHJ2LmgiCi0jaW5jbHVkZSAiaTkxNV9nZW1fY2xmbHVzaC5oIgot I2luY2x1ZGUgImk5MTVfdmdwdS5oIgotI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKLSNpbmNsdWRl ICJpbnRlbF9kcnYuaCIKLSNpbmNsdWRlICJpbnRlbF9mcm9udGJ1ZmZlci5oIgotI2luY2x1ZGUg ImludGVsX21vY3MuaCIKLSNpbmNsdWRlICJpbnRlbF93b3JrYXJvdW5kcy5oIgotI2luY2x1ZGUg Imk5MTVfZ2VtZnMuaCIKICNpbmNsdWRlIDxsaW51eC9kbWEtZmVuY2UtYXJyYXkuaD4KICNpbmNs dWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXJ2YXRpb24uaD4KQEAg LTQ2LDYgKzM3LDE4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgv ZG1hLWJ1Zi5oPgogCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X2dlbV9j bGZsdXNoLmgiCisjaW5jbHVkZSAiaTkxNV9nZW1mcy5oIgorI2luY2x1ZGUgImk5MTVfcmVzZXQu aCIKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisjaW5jbHVkZSAiaTkxNV92Z3B1LmgiCisKKyNp bmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9mcm9udGJ1ZmZlci5oIgorI2lu Y2x1ZGUgImludGVsX21vY3MuaCIKKyNpbmNsdWRlICJpbnRlbF93b3JrYXJvdW5kcy5oIgorCiBz dGF0aWMgdm9pZCBpOTE1X2dlbV9mbHVzaF9mcmVlX29iamVjdHMoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUpOwogCiBzdGF0aWMgYm9vbCBjcHVfd3JpdGVfbmVlZHNfY2xmbHVzaChzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQpAQCAtMjg1OSw2MSArMjg2Miw2IEBAIGk5MTVf Z2VtX29iamVjdF9wd3JpdGVfZ3R0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJ cmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGk5MTVfZ2VtX2NsaWVudF9tYXJrX2d1aWx0eShz dHJ1Y3QgZHJtX2k5MTVfZmlsZV9wcml2YXRlICpmaWxlX3ByaXYsCi0JCQkJCWNvbnN0IHN0cnVj dCBpOTE1X2dlbV9jb250ZXh0ICpjdHgpCi17Ci0JdW5zaWduZWQgaW50IHNjb3JlOwotCXVuc2ln bmVkIGxvbmcgcHJldl9oYW5nOwotCi0JaWYgKGk5MTVfZ2VtX2NvbnRleHRfaXNfYmFubmVkKGN0 eCkpCi0JCXNjb3JlID0gSTkxNV9DTElFTlRfU0NPUkVfQ09OVEVYVF9CQU47Ci0JZWxzZQotCQlz Y29yZSA9IDA7Ci0KLQlwcmV2X2hhbmcgPSB4Y2hnKCZmaWxlX3ByaXYtPmhhbmdfdGltZXN0YW1w LCBqaWZmaWVzKTsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcHJldl9oYW5nICsgSTkxNV9D TElFTlRfRkFTVF9IQU5HX0pJRkZJRVMpKQotCQlzY29yZSArPSBJOTE1X0NMSUVOVF9TQ09SRV9I QU5HX0ZBU1Q7Ci0KLQlpZiAoc2NvcmUpIHsKLQkJYXRvbWljX2FkZChzY29yZSwgJmZpbGVfcHJp di0+YmFuX3Njb3JlKTsKLQotCQlEUk1fREVCVUdfRFJJVkVSKCJjbGllbnQgJXM6IGdhaW5lZCAl dSBiYW4gc2NvcmUsIG5vdyAldVxuIiwKLQkJCQkgY3R4LT5uYW1lLCBzY29yZSwKLQkJCQkgYXRv bWljX3JlYWQoJmZpbGVfcHJpdi0+YmFuX3Njb3JlKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBp OTE1X2dlbV9jb250ZXh0X21hcmtfZ3VpbHR5KHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgp Ci17Ci0JdW5zaWduZWQgaW50IHNjb3JlOwotCWJvb2wgYmFubmVkLCBiYW5uYWJsZTsKLQotCWF0 b21pY19pbmMoJmN0eC0+Z3VpbHR5X2NvdW50KTsKLQotCWJhbm5hYmxlID0gaTkxNV9nZW1fY29u dGV4dF9pc19iYW5uYWJsZShjdHgpOwotCXNjb3JlID0gYXRvbWljX2FkZF9yZXR1cm4oQ09OVEVY VF9TQ09SRV9HVUlMVFksICZjdHgtPmJhbl9zY29yZSk7Ci0JYmFubmVkID0gc2NvcmUgPj0gQ09O VEVYVF9TQ09SRV9CQU5fVEhSRVNIT0xEOwotCi0JLyogQ29vbCBjb250ZXh0cyBkb24ndCBhY2N1 bXVsYXRlIGNsaWVudCBiYW4gc2NvcmUgKi8KLQlpZiAoIWJhbm5hYmxlKQotCQlyZXR1cm47Ci0K LQlpZiAoYmFubmVkKSB7Ci0JCURSTV9ERUJVR19EUklWRVIoImNvbnRleHQgJXM6IGd1aWx0eSAl ZCwgc2NvcmUgJXUsIGJhbm5lZFxuIiwKLQkJCQkgY3R4LT5uYW1lLCBhdG9taWNfcmVhZCgmY3R4 LT5ndWlsdHlfY291bnQpLAotCQkJCSBzY29yZSk7Ci0JCWk5MTVfZ2VtX2NvbnRleHRfc2V0X2Jh bm5lZChjdHgpOwotCX0KLQotCWlmICghSVNfRVJSX09SX05VTEwoY3R4LT5maWxlX3ByaXYpKQot CQlpOTE1X2dlbV9jbGllbnRfbWFya19ndWlsdHkoY3R4LT5maWxlX3ByaXYsIGN0eCk7Ci19Ci0K LXN0YXRpYyB2b2lkIGk5MTVfZ2VtX2NvbnRleHRfbWFya19pbm5vY2VudChzdHJ1Y3QgaTkxNV9n ZW1fY29udGV4dCAqY3R4KQotewotCWF0b21pY19pbmMoJmN0eC0+YWN0aXZlX2NvdW50KTsKLX0K LQogc3RydWN0IGk5MTVfcmVxdWVzdCAqCiBpOTE1X2dlbV9maW5kX2FjdGl2ZV9yZXF1ZXN0KHN0 cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKIHsKQEAgLTI5NDQsMzc2ICsyODkyLDYgQEAg aTkxNV9nZW1fZmluZF9hY3RpdmVfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdp bmUpCiAJcmV0dXJuIGFjdGl2ZTsKIH0KIAotLyoKLSAqIEVuc3VyZSBpcnEgaGFuZGxlciBmaW5p c2hlcywgYW5kIG5vdCBydW4gYWdhaW4uCi0gKiBBbHNvIHJldHVybiB0aGUgYWN0aXZlIHJlcXVl c3Qgc28gdGhhdCB3ZSBvbmx5IHNlYXJjaCBmb3IgaXQgb25jZS4KLSAqLwotc3RydWN0IGk5MTVf cmVxdWVzdCAqCi1pOTE1X2dlbV9yZXNldF9wcmVwYXJlX2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVxdWVzdDsKLQotCS8q Ci0JICogRHVyaW5nIHRoZSByZXNldCBzZXF1ZW5jZSwgd2UgbXVzdCBwcmV2ZW50IHRoZSBlbmdp bmUgZnJvbQotCSAqIGVudGVyaW5nIFJDNi4gQXMgdGhlIGNvbnRleHQgc3RhdGUgaXMgdW5kZWZp bmVkIHVudGlsIHdlIHJlc3RhcnQKLQkgKiB0aGUgZW5naW5lLCBpZiBpdCBkb2VzIGVudGVyIFJD NiBkdXJpbmcgdGhlIHJlc2V0LCB0aGUgc3RhdGUKLQkgKiB3cml0dGVuIHRvIHRoZSBwb3dlcmNv bnRleHQgaXMgdW5kZWZpbmVkIGFuZCBzbyB3ZSBtYXkgbG9zZQotCSAqIEdQVSBzdGF0ZSB1cG9u IHJlc3VtZSwgaS5lLiBmYWlsIHRvIHJlc3RhcnQgYWZ0ZXIgYSByZXNldC4KLQkgKi8KLQlpbnRl bF91bmNvcmVfZm9yY2V3YWtlX2dldChlbmdpbmUtPmk5MTUsIEZPUkNFV0FLRV9BTEwpOwotCi0J cmVxdWVzdCA9IGVuZ2luZS0+cmVzZXQucHJlcGFyZShlbmdpbmUpOwotCWlmIChyZXF1ZXN0ICYm IHJlcXVlc3QtPmZlbmNlLmVycm9yID09IC1FSU8pCi0JCXJlcXVlc3QgPSBFUlJfUFRSKC1FSU8p OyAvKiBQcmV2aW91cyByZXNldCBmYWlsZWQhICovCi0KLQlyZXR1cm4gcmVxdWVzdDsKLX0KLQot aW50IGk5MTVfZ2VtX3Jlc2V0X3ByZXBhcmUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2KQotewotCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQlzdHJ1Y3QgaTkxNV9y ZXF1ZXN0ICpyZXF1ZXN0OwotCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwotCWludCBlcnIgPSAw OwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgZGV2X3ByaXYsIGlkKSB7Ci0JCXJlcXVlc3Qg PSBpOTE1X2dlbV9yZXNldF9wcmVwYXJlX2VuZ2luZShlbmdpbmUpOwotCQlpZiAoSVNfRVJSKHJl cXVlc3QpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKHJlcXVlc3QpOwotCQkJY29udGludWU7Ci0JCX0K LQotCQllbmdpbmUtPmhhbmdjaGVjay5hY3RpdmVfcmVxdWVzdCA9IHJlcXVlc3Q7Ci0JfQotCi0J aTkxNV9nZW1fcmV2b2tlX2ZlbmNlcyhkZXZfcHJpdik7Ci0JaW50ZWxfdWNfc2FuaXRpemUoZGV2 X3ByaXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgZW5naW5lX3NraXBfY29u dGV4dChzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpyZXF1ZXN0KQotewotCXN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSA9IHJlcXVlc3QtPmVuZ2luZTsKLQlzdHJ1Y3QgaTkxNV9nZW1fY29udGV4 dCAqaHVuZ19jdHggPSByZXF1ZXN0LT5nZW1fY29udGV4dDsKLQlzdHJ1Y3QgaTkxNV90aW1lbGlu ZSAqdGltZWxpbmUgPSByZXF1ZXN0LT50aW1lbGluZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwot Ci0JR0VNX0JVR19PTih0aW1lbGluZSA9PSAmZW5naW5lLT50aW1lbGluZSk7Ci0KLQlzcGluX2xv Y2tfaXJxc2F2ZSgmZW5naW5lLT50aW1lbGluZS5sb2NrLCBmbGFncyk7Ci0Jc3Bpbl9sb2NrKCZ0 aW1lbGluZS0+bG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHJlcXVlc3Qs ICZlbmdpbmUtPnRpbWVsaW5lLnJlcXVlc3RzLCBsaW5rKQotCQlpZiAocmVxdWVzdC0+Z2VtX2Nv bnRleHQgPT0gaHVuZ19jdHgpCi0JCQlpOTE1X3JlcXVlc3Rfc2tpcChyZXF1ZXN0LCAtRUlPKTsK LQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxdWVzdCwgJnRpbWVsaW5lLT5yZXF1ZXN0cywgbGlu aykKLQkJaTkxNV9yZXF1ZXN0X3NraXAocmVxdWVzdCwgLUVJTyk7Ci0KLQlzcGluX3VubG9jaygm dGltZWxpbmUtPmxvY2spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+dGltZWxp bmUubG9jaywgZmxhZ3MpOwotfQotCi0vKiBSZXR1cm5zIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBn dWlsdHkgb2YgdGhlIGhhbmcgKi8KLXN0YXRpYyBzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICoKLWk5MTVf Z2VtX3Jlc2V0X3JlcXVlc3Qoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAotCQkgICAg ICAgc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVxdWVzdCwKLQkJICAgICAgIGJvb2wgc3RhbGxlZCkK LXsKLQkvKiBUaGUgZ3VpbHR5IHJlcXVlc3Qgd2lsbCBnZXQgc2tpcHBlZCBvbiBhIGh1bmcgZW5n aW5lLgotCSAqCi0JICogVXNlcnMgb2YgY2xpZW50IGRlZmF1bHQgY29udGV4dHMgZG8gbm90IHJl bHkgb24gbG9naWNhbAotCSAqIHN0YXRlIHByZXNlcnZlZCBiZXR3ZWVuIGJhdGNoZXMgc28gaXQg aXMgc2FmZSB0byBleGVjdXRlCi0JICogcXVldWVkIHJlcXVlc3RzIGZvbGxvd2luZyB0aGUgaGFu Zy4gTm9uIGRlZmF1bHQgY29udGV4dHMKLQkgKiByZWx5IG9uIHByZXNlcnZlZCBzdGF0ZSwgc28g c2tpcHBpbmcgYSBiYXRjaCBsb3NlcyB0aGUKLQkgKiBldm9sdXRpb24gb2YgdGhlIHN0YXRlIGFu ZCBpdCBuZWVkcyB0byBiZSBjb25zaWRlcmVkIGNvcnJ1cHRlZC4KLQkgKiBFeGVjdXRpbmcgbW9y ZSBxdWV1ZWQgYmF0Y2hlcyBvbiB0b3Agb2YgY29ycnVwdGVkIHN0YXRlIGlzCi0JICogcmlza3ku IEJ1dCB3ZSB0YWtlIHRoZSByaXNrIGJ5IHRyeWluZyB0byBhZHZhbmNlIHRocm91Z2gKLQkgKiB0 aGUgcXVldWVkIHJlcXVlc3RzIGluIG9yZGVyIHRvIG1ha2UgdGhlIGNsaWVudCBiZWhhdmlvdXIK LQkgKiBtb3JlIHByZWRpY3RhYmxlIGFyb3VuZCByZXNldHMsIGJ5IG5vdCB0aHJvd2luZyBhd2F5 IHJhbmRvbQotCSAqIGFtb3VudCBvZiBiYXRjaGVzIGl0IGhhcyBwcmVwYXJlZCBmb3IgZXhlY3V0 aW9uLiBTb3BoaXN0aWNhdGVkCi0JICogY2xpZW50cyBjYW4gdXNlIGdlbV9yZXNldF9zdGF0c19p b2N0bCBhbmQgZG1hIGZlbmNlIHN0YXR1cwotCSAqIChleHBvcnRlZCB2aWEgc3luY19maWxlIGlu Zm8gaW9jdGwgb24gZXhwbGljaXQgZmVuY2VzKSB0byBvYnNlcnZlCi0JICogd2hlbiBpdCBsb3Nl cyB0aGUgY29udGV4dCBzdGF0ZSBhbmQgc2hvdWxkIHJlYnVpbGQgYWNjb3JkaW5nbHkuCi0JICoK LQkgKiBUaGUgY29udGV4dCBiYW4sIGFuZCB1bHRpbWF0ZWx5IHRoZSBjbGllbnQgYmFuLCBtZWNo YW5pc20gYXJlIHNhZmV0eQotCSAqIHZhbHZlcyBpZiBjbGllbnQgc3VibWlzc2lvbiBlbmRzIHVw IHJlc3VsdGluZyBpbiBub3RoaW5nIG1vcmUgdGhhbgotCSAqIHN1YnNlcXVlbnQgaGFuZ3MuCi0J ICovCi0KLQlpZiAoaTkxNV9yZXF1ZXN0X2NvbXBsZXRlZChyZXF1ZXN0KSkgewotCQlHRU1fVFJB Q0UoIiVzIHBhcmRvbmVkIGdsb2JhbD0lZCAoZmVuY2UgJWxseDolbGxkKSwgY3VycmVudCAlZFxu IiwKLQkJCSAgZW5naW5lLT5uYW1lLCByZXF1ZXN0LT5nbG9iYWxfc2Vxbm8sCi0JCQkgIHJlcXVl c3QtPmZlbmNlLmNvbnRleHQsIHJlcXVlc3QtPmZlbmNlLnNlcW5vLAotCQkJICBpbnRlbF9lbmdp bmVfZ2V0X3NlcW5vKGVuZ2luZSkpOwotCQlzdGFsbGVkID0gZmFsc2U7Ci0JfQotCi0JaWYgKHN0 YWxsZWQpIHsKLQkJaTkxNV9nZW1fY29udGV4dF9tYXJrX2d1aWx0eShyZXF1ZXN0LT5nZW1fY29u dGV4dCk7Ci0JCWk5MTVfcmVxdWVzdF9za2lwKHJlcXVlc3QsIC1FSU8pOwotCi0JCS8qIElmIHRo aXMgY29udGV4dCBpcyBub3cgYmFubmVkLCBza2lwIGFsbCBwZW5kaW5nIHJlcXVlc3RzLiAqLwot CQlpZiAoaTkxNV9nZW1fY29udGV4dF9pc19iYW5uZWQocmVxdWVzdC0+Z2VtX2NvbnRleHQpKQot CQkJZW5naW5lX3NraXBfY29udGV4dChyZXF1ZXN0KTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBT aW5jZSB0aGlzIGlzIG5vdCB0aGUgaHVuZyBlbmdpbmUsIGl0IG1heSBoYXZlIGFkdmFuY2VkCi0J CSAqIHNpbmNlIHRoZSBoYW5nIGRlY2xhcmF0aW9uLiBEb3VibGUgY2hlY2sgYnkgcmVmaW5kaW5n Ci0JCSAqIHRoZSBhY3RpdmUgcmVxdWVzdCBhdCB0aGUgdGltZSBvZiB0aGUgcmVzZXQuCi0JCSAq LwotCQlyZXF1ZXN0ID0gaTkxNV9nZW1fZmluZF9hY3RpdmVfcmVxdWVzdChlbmdpbmUpOwotCQlp ZiAocmVxdWVzdCkgewotCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQkJaTkxNV9nZW1fY29u dGV4dF9tYXJrX2lubm9jZW50KHJlcXVlc3QtPmdlbV9jb250ZXh0KTsKLQkJCWRtYV9mZW5jZV9z ZXRfZXJyb3IoJnJlcXVlc3QtPmZlbmNlLCAtRUFHQUlOKTsKLQotCQkJLyogUmV3aW5kIHRoZSBl bmdpbmUgdG8gcmVwbGF5IHRoZSBpbmNvbXBsZXRlIHJxICovCi0JCQlzcGluX2xvY2tfaXJxc2F2 ZSgmZW5naW5lLT50aW1lbGluZS5sb2NrLCBmbGFncyk7Ci0JCQlyZXF1ZXN0ID0gbGlzdF9wcmV2 X2VudHJ5KHJlcXVlc3QsIGxpbmspOwotCQkJaWYgKCZyZXF1ZXN0LT5saW5rID09ICZlbmdpbmUt PnRpbWVsaW5lLnJlcXVlc3RzKQotCQkJCXJlcXVlc3QgPSBOVUxMOwotCQkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmZW5naW5lLT50aW1lbGluZS5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0KLQly ZXR1cm4gcmVxdWVzdDsKLX0KLQotdm9pZCBpOTE1X2dlbV9yZXNldF9lbmdpbmUoc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lLAotCQkJICAgc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVxdWVz dCwKLQkJCSAgIGJvb2wgc3RhbGxlZCkKLXsKLQlpZiAocmVxdWVzdCkKLQkJcmVxdWVzdCA9IGk5 MTVfZ2VtX3Jlc2V0X3JlcXVlc3QoZW5naW5lLCByZXF1ZXN0LCBzdGFsbGVkKTsKLQotCS8qIFNl dHVwIHRoZSBDUyB0byByZXN1bWUgZnJvbSB0aGUgYnJlYWRjcnVtYiBvZiB0aGUgaHVuZyByZXF1 ZXN0ICovCi0JZW5naW5lLT5yZXNldC5yZXNldChlbmdpbmUsIHJlcXVlc3QpOwotfQotCi12b2lk IGk5MTVfZ2VtX3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJICAg IHVuc2lnbmVkIGludCBzdGFsbGVkX21hc2spCi17Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAq ZW5naW5lOwotCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVs ZCgmZGV2X3ByaXYtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCi0JaTkxNV9yZXRpcmVfcmVxdWVzdHMo ZGV2X3ByaXYpOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgZGV2X3ByaXYsIGlkKSB7Ci0J CXN0cnVjdCBpbnRlbF9jb250ZXh0ICpjZTsKLQotCQlpOTE1X2dlbV9yZXNldF9lbmdpbmUoZW5n aW5lLAotCQkJCSAgICAgIGVuZ2luZS0+aGFuZ2NoZWNrLmFjdGl2ZV9yZXF1ZXN0LAotCQkJCSAg ICAgIHN0YWxsZWRfbWFzayAmIEVOR0lORV9NQVNLKGlkKSk7Ci0JCWNlID0gZmV0Y2hfYW5kX3pl cm8oJmVuZ2luZS0+bGFzdF9yZXRpcmVkX2NvbnRleHQpOwotCQlpZiAoY2UpCi0JCQlpbnRlbF9j b250ZXh0X3VucGluKGNlKTsKLQotCQkvKgotCQkgKiBPc3RlbnNpYmlseSwgd2UgYWx3YXlzIHdh bnQgYSBjb250ZXh0IGxvYWRlZCBmb3IgcG93ZXJzYXZpbmcsCi0JCSAqIHNvIGlmIHRoZSBlbmdp bmUgaXMgaWRsZSBhZnRlciB0aGUgcmVzZXQsIHNlbmQgYSByZXF1ZXN0Ci0JCSAqIHRvIGxvYWQg b3VyIHNjcmF0Y2gga2VybmVsX2NvbnRleHQuCi0JCSAqCi0JCSAqIE1vcmUgbXlzdGVyaW91c2x5 LCBpZiB3ZSBsZWF2ZSB0aGUgZW5naW5lIGlkbGUgYWZ0ZXIgYSByZXNldCwKLQkJICogdGhlIG5l eHQgdXNlcnNwYWNlIGJhdGNoIG1heSBoYW5nLCB3aXRoIHdoYXQgYXBwZWFycyB0byBiZQotCQkg KiBhbiBpbmNvaGVyZW50IHJlYWQgYnkgdGhlIENTIChwcmVzdW1hYmx5IHN0YWxlIFRMQikuIEFu Ci0JCSAqIGVtcHR5IHJlcXVlc3QgYXBwZWFycyBzdWZmaWNpZW50IHRvIHBhcGVyIG92ZXIgdGhl IGdsaXRjaC4KLQkJICovCi0JCWlmIChpbnRlbF9lbmdpbmVfaXNfaWRsZShlbmdpbmUpKSB7Ci0J CQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKLQotCQkJcnEgPSBpOTE1X3JlcXVlc3RfYWxsb2Mo ZW5naW5lLAotCQkJCQkJZGV2X3ByaXYtPmtlcm5lbF9jb250ZXh0KTsKLQkJCWlmICghSVNfRVJS KHJxKSkKLQkJCQlpOTE1X3JlcXVlc3RfYWRkKHJxKTsKLQkJfQotCX0KLQotCWk5MTVfZ2VtX3Jl c3RvcmVfZmVuY2VzKGRldl9wcml2KTsKLX0KLQotdm9pZCBpOTE1X2dlbV9yZXNldF9maW5pc2hf ZW5naW5lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQllbmdpbmUtPnJlc2V0 LmZpbmlzaChlbmdpbmUpOwotCi0JaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9wdXQoZW5naW5lLT5p OTE1LCBGT1JDRVdBS0VfQUxMKTsKLX0KLQotdm9pZCBpOTE1X2dlbV9yZXNldF9maW5pc2goc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXN0cnVjdCBpbnRlbF9lbmdpbmVf Y3MgKmVuZ2luZTsKLQllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsKLQotCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKLQotCWZvcl9lYWNoX2VuZ2luZShl bmdpbmUsIGRldl9wcml2LCBpZCkgewotCQllbmdpbmUtPmhhbmdjaGVjay5hY3RpdmVfcmVxdWVz dCA9IE5VTEw7Ci0JCWk5MTVfZ2VtX3Jlc2V0X2ZpbmlzaF9lbmdpbmUoZW5naW5lKTsKLQl9Ci19 Ci0KLXN0YXRpYyB2b2lkIG5vcF9zdWJtaXRfcmVxdWVzdChzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpy ZXF1ZXN0KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlHRU1fVFJBQ0UoIiVzIGZlbmNl ICVsbHg6JWxsZCAtPiAtRUlPXG4iLAotCQkgIHJlcXVlc3QtPmVuZ2luZS0+bmFtZSwKLQkJICBy ZXF1ZXN0LT5mZW5jZS5jb250ZXh0LCByZXF1ZXN0LT5mZW5jZS5zZXFubyk7Ci0JZG1hX2ZlbmNl X3NldF9lcnJvcigmcmVxdWVzdC0+ZmVuY2UsIC1FSU8pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUo JnJlcXVlc3QtPmVuZ2luZS0+dGltZWxpbmUubG9jaywgZmxhZ3MpOwotCV9faTkxNV9yZXF1ZXN0 X3N1Ym1pdChyZXF1ZXN0KTsKLQlpbnRlbF9lbmdpbmVfd3JpdGVfZ2xvYmFsX3NlcW5vKHJlcXVl c3QtPmVuZ2luZSwgcmVxdWVzdC0+Z2xvYmFsX3NlcW5vKTsKLQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZyZXF1ZXN0LT5lbmdpbmUtPnRpbWVsaW5lLmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBp OTE1X2dlbV9zZXRfd2VkZ2VkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCXN0 cnVjdCBpOTE1X2dwdV9lcnJvciAqZXJyb3IgPSAmaTkxNS0+Z3B1X2Vycm9yOwotCXN0cnVjdCBp bnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsKLQotCW11 dGV4X2xvY2soJmVycm9yLT53ZWRnZV9tdXRleCk7Ci0JaWYgKHRlc3RfYml0KEk5MTVfV0VER0VE LCAmZXJyb3ItPmZsYWdzKSkgewotCQltdXRleF91bmxvY2soJmVycm9yLT53ZWRnZV9tdXRleCk7 Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoR0VNX1NIT1dfREVCVUcoKSkgewotCQlzdHJ1Y3QgZHJt X3ByaW50ZXIgcCA9IGRybV9kZWJ1Z19wcmludGVyKF9fZnVuY19fKTsKLQotCQlmb3JfZWFjaF9l bmdpbmUoZW5naW5lLCBpOTE1LCBpZCkKLQkJCWludGVsX2VuZ2luZV9kdW1wKGVuZ2luZSwgJnAs ICIlc1xuIiwgZW5naW5lLT5uYW1lKTsKLQl9Ci0KLQlHRU1fVFJBQ0UoInN0YXJ0XG4iKTsKLQot CS8qCi0JICogRmlyc3QsIHN0b3Agc3VibWlzc2lvbiB0byBodywgYnV0IGRvIG5vdCB5ZXQgY29t cGxldGUgcmVxdWVzdHMgYnkKLQkgKiByb2xsaW5nIHRoZSBnbG9iYWwgc2Vxbm8gZm9yd2FyZCAo c2luY2UgdGhpcyB3b3VsZCBjb21wbGV0ZSByZXF1ZXN0cwotCSAqIGZvciB3aGljaCB3ZSBoYXZl bid0IHNldCB0aGUgZmVuY2UgZXJyb3IgdG8gRUlPIHlldCkuCi0JICovCi0JZm9yX2VhY2hfZW5n aW5lKGVuZ2luZSwgaTkxNSwgaWQpCi0JCWk5MTVfZ2VtX3Jlc2V0X3ByZXBhcmVfZW5naW5lKGVu Z2luZSk7Ci0KLQkvKiBFdmVuIGlmIHRoZSBHUFUgcmVzZXQgZmFpbHMsIGl0IHNob3VsZCBzdGls bCBzdG9wIHRoZSBlbmdpbmVzICovCi0JaWYgKElOVEVMX0dFTihpOTE1KSA+PSA1KQotCQlpbnRl bF9ncHVfcmVzZXQoaTkxNSwgQUxMX0VOR0lORVMpOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2lu ZSwgaTkxNSwgaWQpIHsKLQkJZW5naW5lLT5zdWJtaXRfcmVxdWVzdCA9IG5vcF9zdWJtaXRfcmVx dWVzdDsKLQkJZW5naW5lLT5zY2hlZHVsZSA9IE5VTEw7Ci0JfQotCWk5MTUtPmNhcHMuc2NoZWR1 bGVyID0gMDsKLQotCS8qCi0JICogTWFrZSBzdXJlIG5vIHJlcXVlc3QgY2FuIHNsaXAgdGhyb3Vn aCB3aXRob3V0IGdldHRpbmcgY29tcGxldGVkIGJ5Ci0JICogZWl0aGVyIHRoaXMgY2FsbCBoZXJl IHRvIGludGVsX2VuZ2luZV93cml0ZV9nbG9iYWxfc2Vxbm8sIG9yIHRoZSBvbmUKLQkgKiBpbiBu b3Bfc3VibWl0X3JlcXVlc3QuCi0JICovCi0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQkvKiBNYXJr IGFsbCBleGVjdXRpbmcgcmVxdWVzdHMgYXMgc2tpcHBlZCAqLwotCWZvcl9lYWNoX2VuZ2luZShl bmdpbmUsIGk5MTUsIGlkKQotCQllbmdpbmUtPmNhbmNlbF9yZXF1ZXN0cyhlbmdpbmUpOwotCi0J Zm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpIHsKLQkJaTkxNV9nZW1fcmVzZXRfZmlu aXNoX2VuZ2luZShlbmdpbmUpOwotCQlpbnRlbF9lbmdpbmVfd2FrZXVwKGVuZ2luZSk7Ci0JfQot Ci0Jc21wX21iX19iZWZvcmVfYXRvbWljKCk7Ci0Jc2V0X2JpdChJOTE1X1dFREdFRCwgJmVycm9y LT5mbGFncyk7Ci0KLQlHRU1fVFJBQ0UoImVuZFxuIik7Ci0JbXV0ZXhfdW5sb2NrKCZlcnJvci0+ d2VkZ2VfbXV0ZXgpOwotCi0Jd2FrZV91cF9hbGwoJmVycm9yLT5yZXNldF9xdWV1ZSk7Ci19Ci0K LWJvb2wgaTkxNV9nZW1fdW5zZXRfd2VkZ2VkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 KQotewotCXN0cnVjdCBpOTE1X2dwdV9lcnJvciAqZXJyb3IgPSAmaTkxNS0+Z3B1X2Vycm9yOwot CXN0cnVjdCBpOTE1X3RpbWVsaW5lICp0bDsKLQlib29sIHJldCA9IGZhbHNlOwotCi0JbG9ja2Rl cF9hc3NlcnRfaGVsZCgmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0KLQlpZiAoIXRlc3RfYml0 KEk5MTVfV0VER0VELCAmZXJyb3ItPmZsYWdzKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoIWk5 MTUtPmd0LnNjcmF0Y2gpIC8qIE5ldmVyIGZ1bGwgaW5pdGlhbGlzZWQsIHJlY292ZXJ5IGltcG9z c2libGUgKi8KLQkJcmV0dXJuIGZhbHNlOwotCi0JbXV0ZXhfbG9jaygmZXJyb3ItPndlZGdlX211 dGV4KTsKLQotCUdFTV9UUkFDRSgic3RhcnRcbiIpOwotCi0JLyoKLQkgKiBCZWZvcmUgdW53ZWRn aW5nLCBtYWtlIHN1cmUgdGhhdCBhbGwgcGVuZGluZyBvcGVyYXRpb25zCi0JICogYXJlIGZsdXNo ZWQgYW5kIGVycm9yZWQgb3V0IC0gd2UgbWF5IGhhdmUgcmVxdWVzdHMgd2FpdGluZyB1cG9uCi0J ICogdGhpcmQgcGFydHkgZmVuY2VzLiBXZSBtYXJrZWQgYWxsIGluZmxpZ2h0IHJlcXVlc3RzIGFz IEVJTywgYW5kCi0JICogZXZlcnkgZXhlY2J1ZiBzaW5jZSByZXR1cm5lZCBFSU8sIGZvciBjb25z aXN0ZW5jeSB3ZSB3YW50IGFsbAotCSAqIHRoZSBjdXJyZW50bHkgcGVuZGluZyByZXF1ZXN0cyB0 byBhbHNvIGJlIG1hcmtlZCBhcyBFSU8sIHdoaWNoCi0JICogaXMgZG9uZSBpbnNpZGUgb3VyIG5v cF9zdWJtaXRfcmVxdWVzdCAtIGFuZCBzbyB3ZSBtdXN0IHdhaXQuCi0JICoKLQkgKiBObyBtb3Jl IGNhbiBiZSBzdWJtaXR0ZWQgdW50aWwgd2UgcmVzZXQgdGhlIHdlZGdlZCBiaXQuCi0JICovCi0J bGlzdF9mb3JfZWFjaF9lbnRyeSh0bCwgJmk5MTUtPmd0LnRpbWVsaW5lcywgbGluaykgewotCQlz dHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKLQotCQlycSA9IGk5MTVfZ2VtX2FjdGl2ZV9wZWVrKCZ0 bC0+bGFzdF9yZXF1ZXN0LAotCQkJCQkgICZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKLQkJaWYg KCFycSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIFdlIGNhbid0IHVzZSBvdXIgbm9ybWFs IHdhaXRlciBhcyB3ZSB3YW50IHRvCi0JCSAqIGF2b2lkIHJlY3Vyc2l2ZWx5IHRyeWluZyB0byBo YW5kbGUgdGhlIGN1cnJlbnQKLQkJICogcmVzZXQuIFRoZSBiYXNpYyBkbWFfZmVuY2VfZGVmYXVs dF93YWl0KCkgaW5zdGFsbHMKLQkJICogYSBjYWxsYmFjayBmb3IgZG1hX2ZlbmNlX3NpZ25hbCgp LCB3aGljaCBpcwotCQkgKiB0cmlnZ2VyZWQgYnkgb3VyIG5vcCBoYW5kbGVyIChpbmRpcmVjdGx5 LCB0aGUKLQkJICogY2FsbGJhY2sgZW5hYmxlcyB0aGUgc2lnbmFsZXIgdGhyZWFkIHdoaWNoIGlz Ci0JCSAqIHdva2VuIGJ5IHRoZSBub3Bfc3VibWl0X3JlcXVlc3QoKSBhZHZhbmNpbmcgdGhlIHNl cW5vCi0JCSAqIGFuZCB3aGVuIHRoZSBzZXFubyBwYXNzZXMgdGhlIGZlbmNlLCB0aGUgc2lnbmFs ZXIKLQkJICogdGhlbiBzaWduYWxzIHRoZSBmZW5jZSB3YWtpbmcgdXMgdXApLgotCQkgKi8KLQkJ aWYgKGRtYV9mZW5jZV9kZWZhdWx0X3dhaXQoJnJxLT5mZW5jZSwgdHJ1ZSwKLQkJCQkJICAgTUFY X1NDSEVEVUxFX1RJTUVPVVQpIDwgMCkKLQkJCWdvdG8gdW5sb2NrOwotCX0KLQlpOTE1X3JldGly ZV9yZXF1ZXN0cyhpOTE1KTsKLQlHRU1fQlVHX09OKGk5MTUtPmd0LmFjdGl2ZV9yZXF1ZXN0cyk7 Ci0KLQlpbnRlbF9lbmdpbmVzX3Nhbml0aXplKGk5MTUsIGZhbHNlKTsKLQotCS8qCi0JICogVW5k byBub3Bfc3VibWl0X3JlcXVlc3QuIFdlIHByZXZlbnQgYWxsIG5ldyBpOTE1IHJlcXVlc3RzIGZy b20KLQkgKiBiZWluZyBxdWV1ZWQgKGJ5IGRpc2FsbG93aW5nIGV4ZWNidWYgd2hpbHN0IHdlZGdl ZCkgc28gaGF2aW5nCi0JICogd2FpdGVkIGZvciBhbGwgYWN0aXZlIHJlcXVlc3RzIGFib3ZlLCB3 ZSBrbm93IHRoZSBzeXN0ZW0gaXMgaWRsZQotCSAqIGFuZCBkbyBub3QgaGF2ZSB0byB3b3JyeSBh Ym91dCBhIHRocmVhZCBiZWluZyBpbnNpZGUKLQkgKiBlbmdpbmUtPnN1Ym1pdF9yZXF1ZXN0KCkg YXMgd2Ugc3dhcCBvdmVyLiBTbyB1bmxpa2UgaW5zdGFsbGluZwotCSAqIHRoZSBub3Bfc3VibWl0 X3JlcXVlc3Qgb24gcmVzZXQsIHdlIGNhbiBkbyB0aGlzIGZyb20gbm9ybWFsCi0JICogY29udGV4 dCBhbmQgZG8gbm90IHJlcXVpcmUgc3RvcF9tYWNoaW5lKCkuCi0JICovCi0JaW50ZWxfZW5naW5l c19yZXNldF9kZWZhdWx0X3N1Ym1pc3Npb24oaTkxNSk7Ci0JaTkxNV9nZW1fY29udGV4dHNfbG9z dChpOTE1KTsKLQotCUdFTV9UUkFDRSgiZW5kXG4iKTsKLQotCXNtcF9tYl9fYmVmb3JlX2F0b21p YygpOyAvKiBjb21wbGV0ZSB0YWtlb3ZlciBiZWZvcmUgZW5hYmxpbmcgZXhlY2J1ZiAqLwotCWNs ZWFyX2JpdChJOTE1X1dFREdFRCwgJmk5MTUtPmdwdV9lcnJvci5mbGFncyk7Ci0JcmV0ID0gdHJ1 ZTsKLXVubG9jazoKLQltdXRleF91bmxvY2soJmk5MTUtPmdwdV9lcnJvci53ZWRnZV9tdXRleCk7 Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgdm9pZAogaTkxNV9nZW1fcmV0aXJlX3dvcmtf aGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2d0dC5jCmluZGV4IDc0ZTZkMDJkY2JiZi4uNjhlMDJlNDYxODZiIDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSAiaTkxNV9k cnYuaCIKICNpbmNsdWRlICJpOTE1X3ZncHUuaCIKKyNpbmNsdWRlICJpOTE1X3Jlc2V0LmgiCiAj aW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgogI2luY2x1ZGUg ImludGVsX2Zyb250YnVmZmVyLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2lycS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwppbmRleCA5NDE4N2U2 OGQzOWEuLjFjNmNmMDI0YTUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9pcnEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCkBAIC0yOTMwLDQ2 ICsyOTMwLDYgQEAgc3RhdGljIGlycXJldHVybl90IGdlbjhfaXJxX2hhbmRsZXIoaW50IGlycSwg dm9pZCAqYXJnKQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RydWN0IHdlZGdlX21lIHsK LQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTU7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyB2b2lkIHdlZGdlX21lKHN0cnVj dCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgd2VkZ2VfbWUgKncgPSBjb250YWluZXJf b2Yod29yaywgdHlwZW9mKCp3KSwgd29yay53b3JrKTsKLQotCWRldl9lcnIody0+aTkxNS0+ZHJt LmRldiwKLQkJIiVzIHRpbWVkIG91dCwgY2FuY2VsbGluZyBhbGwgaW4tZmxpZ2h0IHJlbmRlcmlu Zy5cbiIsCi0JCXctPm5hbWUpOwotCWk5MTVfZ2VtX3NldF93ZWRnZWQody0+aTkxNSk7Ci19Ci0K LXN0YXRpYyB2b2lkIF9faW5pdF93ZWRnZShzdHJ1Y3Qgd2VkZ2VfbWUgKncsCi0JCQkgc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkgbG9uZyB0aW1lb3V0LAotCQkJIGNvbnN0IGNo YXIgKm5hbWUpCi17Ci0Jdy0+aTkxNSA9IGk5MTU7Ci0Jdy0+bmFtZSA9IG5hbWU7Ci0KLQlJTklU X0RFTEFZRURfV09SS19PTlNUQUNLKCZ3LT53b3JrLCB3ZWRnZV9tZSk7Ci0Jc2NoZWR1bGVfZGVs YXllZF93b3JrKCZ3LT53b3JrLCB0aW1lb3V0KTsKLX0KLQotc3RhdGljIHZvaWQgX19maW5pX3dl ZGdlKHN0cnVjdCB3ZWRnZV9tZSAqdykKLXsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnct PndvcmspOwotCWRlc3Ryb3lfZGVsYXllZF93b3JrX29uX3N0YWNrKCZ3LT53b3JrKTsKLQl3LT5p OTE1ID0gTlVMTDsKLX0KLQotI2RlZmluZSBpOTE1X3dlZGdlX29uX3RpbWVvdXQoVywgREVWLCBU SU1FT1VUKQkJCQlcCi0JZm9yIChfX2luaXRfd2VkZ2UoKFcpLCAoREVWKSwgKFRJTUVPVVQpLCBf X2Z1bmNfXyk7CQlcCi0JICAgICAoVyktPmk5MTU7CQkJCQkJCVwKLQkgICAgIF9fZmluaV93ZWRn ZSgoVykpKQotCiBzdGF0aWMgdTMyCiBnZW4xMV9ndF9lbmdpbmVfaWRlbnRpdHkoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKiBjb25zdCBpOTE1LAogCQkJIGNvbnN0IHVuc2lnbmVkIGludCBiYW5r LCBjb25zdCB1bnNpZ25lZCBpbnQgYml0KQpAQCAtMzE4MCwyMDQgKzMxNDAsNiBAQCBzdGF0aWMg aXJxcmV0dXJuX3QgZ2VuMTFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQogCXJldHVy biBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgaTkxNV9yZXNldF9kZXZpY2Uoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgdTMyIGVuZ2luZV9tYXNrLAot CQkJICAgICAgY29uc3QgY2hhciAqcmVhc29uKQotewotCXN0cnVjdCBpOTE1X2dwdV9lcnJvciAq ZXJyb3IgPSAmZGV2X3ByaXYtPmdwdV9lcnJvcjsKLQlzdHJ1Y3Qga29iamVjdCAqa29iaiA9ICZk ZXZfcHJpdi0+ZHJtLnByaW1hcnktPmtkZXYtPmtvYmo7Ci0JY2hhciAqZXJyb3JfZXZlbnRbXSA9 IHsgSTkxNV9FUlJPUl9VRVZFTlQgIj0xIiwgTlVMTCB9OwotCWNoYXIgKnJlc2V0X2V2ZW50W10g PSB7IEk5MTVfUkVTRVRfVUVWRU5UICI9MSIsIE5VTEwgfTsKLQljaGFyICpyZXNldF9kb25lX2V2 ZW50W10gPSB7IEk5MTVfRVJST1JfVUVWRU5UICI9MCIsIE5VTEwgfTsKLQlzdHJ1Y3Qgd2VkZ2Vf bWUgdzsKLQotCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX0NIQU5HRSwgZXJyb3JfZXZl bnQpOwotCi0JRFJNX0RFQlVHX0RSSVZFUigicmVzZXR0aW5nIGNoaXBcbiIpOwotCWtvYmplY3Rf dWV2ZW50X2Vudihrb2JqLCBLT0JKX0NIQU5HRSwgcmVzZXRfZXZlbnQpOwotCi0JLyogVXNlIGEg d2F0Y2hkb2cgdG8gZW5zdXJlIHRoYXQgb3VyIHJlc2V0IGNvbXBsZXRlcyAqLwotCWk5MTVfd2Vk Z2Vfb25fdGltZW91dCgmdywgZGV2X3ByaXYsIDUqSFopIHsKLQkJaW50ZWxfcHJlcGFyZV9yZXNl dChkZXZfcHJpdik7Ci0KLQkJZXJyb3ItPnJlYXNvbiA9IHJlYXNvbjsKLQkJZXJyb3ItPnN0YWxs ZWRfbWFzayA9IGVuZ2luZV9tYXNrOwotCi0JCS8qIFNpZ25hbCB0aGF0IGxvY2tlZCB3YWl0ZXJz IHNob3VsZCByZXNldCB0aGUgR1BVICovCi0JCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOwotCQlz ZXRfYml0KEk5MTVfUkVTRVRfSEFORE9GRiwgJmVycm9yLT5mbGFncyk7Ci0JCXdha2VfdXBfYWxs KCZlcnJvci0+d2FpdF9xdWV1ZSk7Ci0KLQkJLyogV2FpdCBmb3IgYW55b25lIGhvbGRpbmcgdGhl IGxvY2sgdG8gd2FrZXVwLCB3aXRob3V0Ci0JCSAqIGJsb2NraW5nIGluZGVmaW5pdGVseSBvbiBz dHJ1Y3RfbXV0ZXguCi0JCSAqLwotCQlkbyB7Ci0JCQlpZiAobXV0ZXhfdHJ5bG9jaygmZGV2X3By aXYtPmRybS5zdHJ1Y3RfbXV0ZXgpKSB7Ci0JCQkJaTkxNV9yZXNldChkZXZfcHJpdiwgZW5naW5l X21hc2ssIHJlYXNvbik7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9t dXRleCk7Ci0JCQl9Ci0JCX0gd2hpbGUgKHdhaXRfb25fYml0X3RpbWVvdXQoJmVycm9yLT5mbGFn cywKLQkJCQkJICAgICBJOTE1X1JFU0VUX0hBTkRPRkYsCi0JCQkJCSAgICAgVEFTS19VTklOVEVS UlVQVElCTEUsCi0JCQkJCSAgICAgMSkpOwotCi0JCWVycm9yLT5zdGFsbGVkX21hc2sgPSAwOwot CQllcnJvci0+cmVhc29uID0gTlVMTDsKLQotCQlpbnRlbF9maW5pc2hfcmVzZXQoZGV2X3ByaXYp OwotCX0KLQotCWlmICghdGVzdF9iaXQoSTkxNV9XRURHRUQsICZlcnJvci0+ZmxhZ3MpKQotCQlr b2JqZWN0X3VldmVudF9lbnYoa29iaiwgS09CSl9DSEFOR0UsIHJlc2V0X2RvbmVfZXZlbnQpOwot fQotCi12b2lkIGk5MTVfY2xlYXJfZXJyb3JfcmVnaXN0ZXJzKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdikKLXsKLQl1MzIgZWlyOwotCi0JaWYgKCFJU19HRU4oZGV2X3ByaXYsIDIp KQotCQlJOTE1X1dSSVRFKFBHVEJMX0VSLCBJOTE1X1JFQUQoUEdUQkxfRVIpKTsKLQotCWlmIChJ TlRFTF9HRU4oZGV2X3ByaXYpIDwgNCkKLQkJSTkxNV9XUklURShJUEVJUiwgSTkxNV9SRUFEKElQ RUlSKSk7Ci0JZWxzZQotCQlJOTE1X1dSSVRFKElQRUlSX0k5NjUsIEk5MTVfUkVBRChJUEVJUl9J OTY1KSk7Ci0KLQlJOTE1X1dSSVRFKEVJUiwgSTkxNV9SRUFEKEVJUikpOwotCWVpciA9IEk5MTVf UkVBRChFSVIpOwotCWlmIChlaXIpIHsKLQkJLyoKLQkJICogc29tZSBlcnJvcnMgbWlnaHQgaGF2 ZSBiZWNvbWUgc3R1Y2ssCi0JCSAqIG1hc2sgdGhlbS4KLQkJICovCi0JCURSTV9ERUJVR19EUklW RVIoIkVJUiBzdHVjazogMHglMDh4LCBtYXNraW5nXG4iLCBlaXIpOwotCQlJOTE1X1dSSVRFKEVN UiwgSTkxNV9SRUFEKEVNUikgfCBlaXIpOwotCQlJOTE1X1dSSVRFKElJUiwgSTkxNV9NQVNURVJf RVJST1JfSU5URVJSVVBUKTsKLQl9Ci0KLQlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA4KSB7 Ci0JCUk5MTVfV1JJVEUoR0VOOF9SSU5HX0ZBVUxUX1JFRywKLQkJCSAgIEk5MTVfUkVBRChHRU44 X1JJTkdfRkFVTFRfUkVHKSAmIH5SSU5HX0ZBVUxUX1ZBTElEKTsKLQkJUE9TVElOR19SRUFEKEdF TjhfUklOR19GQVVMVF9SRUcpOwotCX0gZWxzZSBpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA2 KSB7Ci0JCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQkJZW51bSBpbnRlbF9lbmdp bmVfaWQgaWQ7Ci0KLQkJZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgZGV2X3ByaXYsIGlkKSB7Ci0J CQlJOTE1X1dSSVRFKFJJTkdfRkFVTFRfUkVHKGVuZ2luZSksCi0JCQkJICAgSTkxNV9SRUFEKFJJ TkdfRkFVTFRfUkVHKGVuZ2luZSkpICYKLQkJCQkgICB+UklOR19GQVVMVF9WQUxJRCk7Ci0JCX0K LQkJUE9TVElOR19SRUFEKFJJTkdfRkFVTFRfUkVHKGRldl9wcml2LT5lbmdpbmVbUkNTXSkpOwot CX0KLX0KLQotLyoqCi0gKiBpOTE1X2hhbmRsZV9lcnJvciAtIGhhbmRsZSBhIGdwdSBlcnJvcgot ICogQGRldl9wcml2OiBpOTE1IGRldmljZSBwcml2YXRlCi0gKiBAZW5naW5lX21hc2s6IG1hc2sg cmVwcmVzZW50aW5nIGVuZ2luZXMgdGhhdCBhcmUgaHVuZwotICogQGZsYWdzOiBjb250cm9sIGZs YWdzCi0gKiBAZm10OiBFcnJvciBtZXNzYWdlIGZvcm1hdCBzdHJpbmcKLSAqCi0gKiBEbyBzb21l IGJhc2ljIGNoZWNraW5nIG9mIHJlZ2lzdGVyIHN0YXRlIGF0IGVycm9yIHRpbWUgYW5kCi0gKiBk dW1wIGl0IHRvIHRoZSBzeXNsb2cuICBBbHNvIGNhbGwgaTkxNV9jYXB0dXJlX2Vycm9yX3N0YXRl KCkgdG8gbWFrZQotICogc3VyZSB3ZSBnZXQgYSByZWNvcmQgYW5kIG1ha2UgaXQgYXZhaWxhYmxl IGluIGRlYnVnZnMuICBGaXJlIGEgdWV2ZW50Ci0gKiBzbyB1c2Vyc3BhY2Uga25vd3Mgc29tZXRo aW5nIGJhZCBoYXBwZW5lZCAoc2hvdWxkIHRyaWdnZXIgY29sbGVjdGlvbgotICogb2YgYSByaW5n IGR1bXAgZXRjLikuCi0gKi8KLXZvaWQgaTkxNV9oYW5kbGVfZXJyb3Ioc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2LAotCQkgICAgICAgdTMyIGVuZ2luZV9tYXNrLAotCQkgICAgICAg dW5zaWduZWQgbG9uZyBmbGFncywKLQkJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewot CXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJl ZjsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCWNoYXIgZXJyb3JfbXNnWzgwXTsKLQljaGFyICptc2cg PSBOVUxMOwotCi0JaWYgKGZtdCkgewotCQl2YV9saXN0IGFyZ3M7Ci0KLQkJdmFfc3RhcnQoYXJn cywgZm10KTsKLQkJdnNjbnByaW50ZihlcnJvcl9tc2csIHNpemVvZihlcnJvcl9tc2cpLCBmbXQs IGFyZ3MpOwotCQl2YV9lbmQoYXJncyk7Ci0KLQkJbXNnID0gZXJyb3JfbXNnOwotCX0KLQotCS8q Ci0JICogSW4gbW9zdCBjYXNlcyBpdCdzIGd1YXJhbnRlZWQgdGhhdCB3ZSBnZXQgaGVyZSB3aXRo IGFuIFJQTQotCSAqIHJlZmVyZW5jZSBoZWxkLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZXJlIGlz IGEgcGVuZGluZyBHUFUKLQkgKiByZXF1ZXN0IHRoYXQgd29uJ3QgZmluaXNoIHVudGlsIHRoZSBy ZXNldCBpcyBkb25lLiBUaGlzCi0JICogaXNuJ3QgdGhlIGNhc2UgYXQgbGVhc3Qgd2hlbiB3ZSBn ZXQgaGVyZSBieSBkb2luZyBhCi0JICogc2ltdWxhdGVkIHJlc2V0IHZpYSBkZWJ1Z2ZzLCBzbyBn ZXQgYW4gUlBNIHJlZmVyZW5jZS4KLQkgKi8KLQl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9n ZXQoZGV2X3ByaXYpOwotCi0JZW5naW5lX21hc2sgJj0gSU5URUxfSU5GTyhkZXZfcHJpdiktPnJp bmdfbWFzazsKLQotCWlmIChmbGFncyAmIEk5MTVfRVJST1JfQ0FQVFVSRSkgewotCQlpOTE1X2Nh cHR1cmVfZXJyb3Jfc3RhdGUoZGV2X3ByaXYsIGVuZ2luZV9tYXNrLCBtc2cpOwotCQlpOTE1X2Ns ZWFyX2Vycm9yX3JlZ2lzdGVycyhkZXZfcHJpdik7Ci0JfQotCi0JLyoKLQkgKiBUcnkgZW5naW5l IHJlc2V0IHdoZW4gYXZhaWxhYmxlLiBXZSBmYWxsIGJhY2sgdG8gZnVsbCByZXNldCBpZgotCSAq IHNpbmdsZSByZXNldCBmYWlscy4KLQkgKi8KLQlpZiAoaW50ZWxfaGFzX3Jlc2V0X2VuZ2luZShk ZXZfcHJpdikgJiYKLQkgICAgIWk5MTVfdGVybWluYWxseV93ZWRnZWQoJmRldl9wcml2LT5ncHVf ZXJyb3IpKSB7Ci0JCWZvcl9lYWNoX2VuZ2luZV9tYXNrZWQoZW5naW5lLCBkZXZfcHJpdiwgZW5n aW5lX21hc2ssIHRtcCkgewotCQkJQlVJTERfQlVHX09OKEk5MTVfUkVTRVRfTU9ERVNFVCA+PSBJ OTE1X1JFU0VUX0VOR0lORSk7Ci0JCQlpZiAodGVzdF9hbmRfc2V0X2JpdChJOTE1X1JFU0VUX0VO R0lORSArIGVuZ2luZS0+aWQsCi0JCQkJCSAgICAgJmRldl9wcml2LT5ncHVfZXJyb3IuZmxhZ3Mp KQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoaTkxNV9yZXNldF9lbmdpbmUoZW5naW5lLCBtc2cp ID09IDApCi0JCQkJZW5naW5lX21hc2sgJj0gfmludGVsX2VuZ2luZV9mbGFnKGVuZ2luZSk7Ci0K LQkJCWNsZWFyX2JpdChJOTE1X1JFU0VUX0VOR0lORSArIGVuZ2luZS0+aWQsCi0JCQkJICAmZGV2 X3ByaXYtPmdwdV9lcnJvci5mbGFncyk7Ci0JCQl3YWtlX3VwX2JpdCgmZGV2X3ByaXYtPmdwdV9l cnJvci5mbGFncywKLQkJCQkgICAgSTkxNV9SRVNFVF9FTkdJTkUgKyBlbmdpbmUtPmlkKTsKLQkJ fQotCX0KLQotCWlmICghZW5naW5lX21hc2spCi0JCWdvdG8gb3V0OwotCi0JLyogRnVsbCByZXNl dCBuZWVkcyB0aGUgbXV0ZXgsIHN0b3AgYW55IG90aGVyIHVzZXIgdHJ5aW5nIHRvIGRvIHNvLiAq LwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KEk5MTVfUkVTRVRfQkFDS09GRiwgJmRldl9wcml2LT5n cHVfZXJyb3IuZmxhZ3MpKSB7Ci0JCXdhaXRfZXZlbnQoZGV2X3ByaXYtPmdwdV9lcnJvci5yZXNl dF9xdWV1ZSwKLQkJCSAgICF0ZXN0X2JpdChJOTE1X1JFU0VUX0JBQ0tPRkYsCi0JCQkJICAgICAm ZGV2X3ByaXYtPmdwdV9lcnJvci5mbGFncykpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBQcmV2 ZW50IGFueSBvdGhlciByZXNldC1lbmdpbmUgYXR0ZW1wdC4gKi8KLQlmb3JfZWFjaF9lbmdpbmUo ZW5naW5lLCBkZXZfcHJpdiwgdG1wKSB7Ci0JCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KEk5MTVf UkVTRVRfRU5HSU5FICsgZW5naW5lLT5pZCwKLQkJCQkJJmRldl9wcml2LT5ncHVfZXJyb3IuZmxh Z3MpKQotCQkJd2FpdF9vbl9iaXQoJmRldl9wcml2LT5ncHVfZXJyb3IuZmxhZ3MsCi0JCQkJICAg IEk5MTVfUkVTRVRfRU5HSU5FICsgZW5naW5lLT5pZCwKLQkJCQkgICAgVEFTS19VTklOVEVSUlVQ VElCTEUpOwotCX0KLQotCWk5MTVfcmVzZXRfZGV2aWNlKGRldl9wcml2LCBlbmdpbmVfbWFzaywg bXNnKTsKLQotCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGRldl9wcml2LCB0bXApIHsKLQkJY2xl YXJfYml0KEk5MTVfUkVTRVRfRU5HSU5FICsgZW5naW5lLT5pZCwKLQkJCSAgJmRldl9wcml2LT5n cHVfZXJyb3IuZmxhZ3MpOwotCX0KLQotCWNsZWFyX2JpdChJOTE1X1JFU0VUX0JBQ0tPRkYsICZk ZXZfcHJpdi0+Z3B1X2Vycm9yLmZsYWdzKTsKLQl3YWtlX3VwX2FsbCgmZGV2X3ByaXYtPmdwdV9l cnJvci5yZXNldF9xdWV1ZSk7Ci0KLW91dDoKLQlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJp diwgd2FrZXJlZik7Ci19Ci0KIC8qIENhbGxlZCBmcm9tIGRybSBnZW5lcmljIGNvZGUsIHBhc3Nl ZCAnY3J0Yycgd2hpY2gKICAqIHdlIHVzZSBhcyBhIHBpcGUgaW5kZXgKICAqLwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXF1ZXN0LmMgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X3JlcXVlc3QuYwppbmRleCBkMTM1NTE1NDg4NmEuLjU0MDNkNGUyY2VlMCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXF1ZXN0LmMKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9yZXF1ZXN0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRl IDxsaW51eC9zY2hlZC9zaWduYWwuaD4KIAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVk ZSAiaTkxNV9yZXNldC5oIgogCiBzdGF0aWMgY29uc3QgY2hhciAqaTkxNV9mZW5jZV9nZXRfZHJp dmVyX25hbWUoc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X3Jlc2V0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Jl c2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5lMmU0MGI0NGE5 YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3Jlc2V0LmMK QEAgLTAsMCArMSwxMzg5IEBACisvKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAor ICoKKyAqIENvcHlyaWdodCDCqSAyMDA4LTIwMTggSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisj aW5jbHVkZSA8bGludXgvc2NoZWQvbW0uaD4KKworI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5j bHVkZSAiaTkxNV9ncHVfZXJyb3IuaCIKKyNpbmNsdWRlICJpOTE1X3Jlc2V0LmgiCisKKyNpbmNs dWRlICJpbnRlbF9ndWMuaCIKKworc3RhdGljIHZvaWQgZW5naW5lX3NraXBfY29udGV4dChzdHJ1 Y3QgaTkxNV9yZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUg PSBycS0+ZW5naW5lOworCXN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpodW5nX2N0eCA9IHJxLT5n ZW1fY29udGV4dDsKKwlzdHJ1Y3QgaTkxNV90aW1lbGluZSAqdGltZWxpbmUgPSBycS0+dGltZWxp bmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUdFTV9CVUdfT04odGltZWxpbmUgPT0gJmVu Z2luZS0+dGltZWxpbmUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVuZ2luZS0+dGltZWxpbmUu bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmdGltZWxpbmUtPmxvY2spOworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeV9jb250aW51ZShycSwgJmVuZ2luZS0+dGltZWxpbmUucmVxdWVzdHMsIGxpbmsp CisJCWlmIChycS0+Z2VtX2NvbnRleHQgPT0gaHVuZ19jdHgpCisJCQlpOTE1X3JlcXVlc3Rfc2tp cChycSwgLUVJTyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJxLCAmdGltZWxpbmUtPnJlcXVl c3RzLCBsaW5rKQorCQlpOTE1X3JlcXVlc3Rfc2tpcChycSwgLUVJTyk7CisKKwlzcGluX3VubG9j aygmdGltZWxpbmUtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZ2luZS0+dGlt ZWxpbmUubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBjbGllbnRfbWFya19ndWlsdHko c3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZV9wcml2LAorCQkJICAgICAgIGNvbnN0 IHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgaW50IHNjb3JlOwor CXVuc2lnbmVkIGxvbmcgcHJldl9oYW5nOworCisJaWYgKGk5MTVfZ2VtX2NvbnRleHRfaXNfYmFu bmVkKGN0eCkpCisJCXNjb3JlID0gSTkxNV9DTElFTlRfU0NPUkVfQ09OVEVYVF9CQU47CisJZWxz ZQorCQlzY29yZSA9IDA7CisKKwlwcmV2X2hhbmcgPSB4Y2hnKCZmaWxlX3ByaXYtPmhhbmdfdGlt ZXN0YW1wLCBqaWZmaWVzKTsKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgcHJldl9oYW5nICsg STkxNV9DTElFTlRfRkFTVF9IQU5HX0pJRkZJRVMpKQorCQlzY29yZSArPSBJOTE1X0NMSUVOVF9T Q09SRV9IQU5HX0ZBU1Q7CisKKwlpZiAoc2NvcmUpIHsKKwkJYXRvbWljX2FkZChzY29yZSwgJmZp bGVfcHJpdi0+YmFuX3Njb3JlKTsKKworCQlEUk1fREVCVUdfRFJJVkVSKCJjbGllbnQgJXM6IGdh aW5lZCAldSBiYW4gc2NvcmUsIG5vdyAldVxuIiwKKwkJCQkgY3R4LT5uYW1lLCBzY29yZSwKKwkJ CQkgYXRvbWljX3JlYWQoJmZpbGVfcHJpdi0+YmFuX3Njb3JlKSk7CisJfQorfQorCitzdGF0aWMg dm9pZCBjb250ZXh0X21hcmtfZ3VpbHR5KHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgpCit7 CisJdW5zaWduZWQgaW50IHNjb3JlOworCWJvb2wgYmFubmVkLCBiYW5uYWJsZTsKKworCWF0b21p Y19pbmMoJmN0eC0+Z3VpbHR5X2NvdW50KTsKKworCWJhbm5hYmxlID0gaTkxNV9nZW1fY29udGV4 dF9pc19iYW5uYWJsZShjdHgpOworCXNjb3JlID0gYXRvbWljX2FkZF9yZXR1cm4oQ09OVEVYVF9T Q09SRV9HVUlMVFksICZjdHgtPmJhbl9zY29yZSk7CisJYmFubmVkID0gc2NvcmUgPj0gQ09OVEVY VF9TQ09SRV9CQU5fVEhSRVNIT0xEOworCisJLyogQ29vbCBjb250ZXh0cyBkb24ndCBhY2N1bXVs YXRlIGNsaWVudCBiYW4gc2NvcmUgKi8KKwlpZiAoIWJhbm5hYmxlKQorCQlyZXR1cm47CisKKwlp ZiAoYmFubmVkKSB7CisJCURSTV9ERUJVR19EUklWRVIoImNvbnRleHQgJXM6IGd1aWx0eSAlZCwg c2NvcmUgJXUsIGJhbm5lZFxuIiwKKwkJCQkgY3R4LT5uYW1lLCBhdG9taWNfcmVhZCgmY3R4LT5n dWlsdHlfY291bnQpLAorCQkJCSBzY29yZSk7CisJCWk5MTVfZ2VtX2NvbnRleHRfc2V0X2Jhbm5l ZChjdHgpOworCX0KKworCWlmICghSVNfRVJSX09SX05VTEwoY3R4LT5maWxlX3ByaXYpKQorCQlj bGllbnRfbWFya19ndWlsdHkoY3R4LT5maWxlX3ByaXYsIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lk IGNvbnRleHRfbWFya19pbm5vY2VudChzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4KQorewor CWF0b21pY19pbmMoJmN0eC0+YWN0aXZlX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgZ2VuM19z dG9wX2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OworCWNvbnN0IHUzMiBiYXNl ID0gZW5naW5lLT5tbWlvX2Jhc2U7CisKKwlpZiAoaW50ZWxfZW5naW5lX3N0b3BfY3MoZW5naW5l KSkKKwkJRFJNX0RFQlVHX0RSSVZFUigiJXM6IHRpbWVkIG91dCBvbiBTVE9QX1JJTkdcbiIsIGVu Z2luZS0+bmFtZSk7CisKKwlJOTE1X1dSSVRFX0ZXKFJJTkdfSEVBRChiYXNlKSwgSTkxNV9SRUFE X0ZXKFJJTkdfVEFJTChiYXNlKSkpOworCVBPU1RJTkdfUkVBRF9GVyhSSU5HX0hFQUQoYmFzZSkp OyAvKiBwYXJhbm9pYSAqLworCisJSTkxNV9XUklURV9GVyhSSU5HX0hFQUQoYmFzZSksIDApOwor CUk5MTVfV1JJVEVfRlcoUklOR19UQUlMKGJhc2UpLCAwKTsKKwlQT1NUSU5HX1JFQURfRlcoUklO R19UQUlMKGJhc2UpKTsKKworCS8qIFRoZSByaW5nIG11c3QgYmUgZW1wdHkgYmVmb3JlIGl0IGlz IGRpc2FibGVkICovCisJSTkxNV9XUklURV9GVyhSSU5HX0NUTChiYXNlKSwgMCk7CisKKwkvKiBD aGVjayBhY3RzIGFzIGEgcG9zdCAqLworCWlmIChJOTE1X1JFQURfRlcoUklOR19IRUFEKGJhc2Up KSAhPSAwKQorCQlEUk1fREVCVUdfRFJJVkVSKCIlczogcmluZyBoZWFkIG5vdCBwYXJrZWRcbiIs CisJCQkJIGVuZ2luZS0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfc3RvcF9lbmdpbmVz KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAorCQkJICAgICAgdW5zaWduZWQgaW50IGVu Z2luZV9tYXNrKQoreworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKKwllbnVtIGlu dGVsX2VuZ2luZV9pZCBpZDsKKworCWlmIChJTlRFTF9HRU4oaTkxNSkgPCAzKQorCQlyZXR1cm47 CisKKwlmb3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgaTkxNSwgZW5naW5lX21hc2ssIGlk KQorCQlnZW4zX3N0b3BfZW5naW5lKGVuZ2luZSk7Cit9CisKK3N0YXRpYyBib29sIGk5MTVfaW5f cmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTggZ2Ryc3Q7CisKKwlwY2lfcmVhZF9j b25maWdfYnl0ZShwZGV2LCBJOTE1X0dEUlNULCAmZ2Ryc3QpOworCXJldHVybiBnZHJzdCAmIEdS RE9NX1JFU0VUX1NUQVRVUzsKK30KKworc3RhdGljIGludCBpOTE1X2RvX3Jlc2V0KHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1LAorCQkJIHVuc2lnbmVkIGludCBlbmdpbmVfbWFzaywKKwkJ CSB1bnNpZ25lZCBpbnQgcmV0cnkpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBpOTE1LT5k cm0ucGRldjsKKwlpbnQgZXJyOworCisJLyogQXNzZXJ0IHJlc2V0IGZvciBhdCBsZWFzdCAyMCB1 c2VjLCBhbmQgd2FpdCBmb3IgYWNrbm93bGVkZ2VtZW50LiAqLworCXBjaV93cml0ZV9jb25maWdf Ynl0ZShwZGV2LCBJOTE1X0dEUlNULCBHUkRPTV9SRVNFVF9FTkFCTEUpOworCXVzbGVlcF9yYW5n ZSg1MCwgMjAwKTsKKwllcnIgPSB3YWl0X2ZvcihpOTE1X2luX3Jlc2V0KHBkZXYpLCA1MDApOwor CisJLyogQ2xlYXIgdGhlIHJlc2V0IHJlcXVlc3QuICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRl KHBkZXYsIEk5MTVfR0RSU1QsIDApOworCXVzbGVlcF9yYW5nZSg1MCwgMjAwKTsKKwlpZiAoIWVy cikKKwkJZXJyID0gd2FpdF9mb3IoIWk5MTVfaW5fcmVzZXQocGRldiksIDUwMCk7CisKKwlyZXR1 cm4gZXJyOworfQorCitzdGF0aWMgYm9vbCBnNHhfcmVzZXRfY29tcGxldGUoc3RydWN0IHBjaV9k ZXYgKnBkZXYpCit7CisJdTggZ2Ryc3Q7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBJ OTE1X0dEUlNULCAmZ2Ryc3QpOworCXJldHVybiAoZ2Ryc3QgJiBHUkRPTV9SRVNFVF9FTkFCTEUp ID09IDA7Cit9CisKK3N0YXRpYyBpbnQgZzMzX2RvX3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1LAorCQkJdW5zaWduZWQgaW50IGVuZ2luZV9tYXNrLAorCQkJdW5zaWduZWQgaW50 IHJldHJ5KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaTkxNS0+ZHJtLnBkZXY7CisKKwlw Y2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgSTkxNV9HRFJTVCwgR1JET01fUkVTRVRfRU5BQkxF KTsKKwlyZXR1cm4gd2FpdF9mb3IoZzR4X3Jlc2V0X2NvbXBsZXRlKHBkZXYpLCA1MDApOworfQor CitzdGF0aWMgaW50IGc0eF9kb19yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYsCisJCQl1bnNpZ25lZCBpbnQgZW5naW5lX21hc2ssCisJCQl1bnNpZ25lZCBpbnQgcmV0cnkp Cit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7CisJaW50IHJl dDsKKworCS8qIFdhVmNwQ2xrR2F0ZURpc2FibGVGb3JNZWRpYVJlc2V0OmN0ZyxlbGsgKi8KKwlJ OTE1X1dSSVRFKFZERUNDTEtfR0FURV9ELAorCQkgICBJOTE1X1JFQUQoVkRFQ0NMS19HQVRFX0Qp IHwgVkNQX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKwlQT1NUSU5HX1JFQUQoVkRFQ0NMS19H QVRFX0QpOworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIEk5MTVfR0RSU1QsCisJCQkg ICAgICBHUkRPTV9NRURJQSB8IEdSRE9NX1JFU0VUX0VOQUJMRSk7CisJcmV0ID0gIHdhaXRfZm9y KGc0eF9yZXNldF9jb21wbGV0ZShwZGV2KSwgNTAwKTsKKwlpZiAocmV0KSB7CisJCURSTV9ERUJV R19EUklWRVIoIldhaXQgZm9yIG1lZGlhIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gb3V0Owor CX0KKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBJOTE1X0dEUlNULAorCQkJICAgICAg R1JET01fUkVOREVSIHwgR1JET01fUkVTRVRfRU5BQkxFKTsKKwlyZXQgPSAgd2FpdF9mb3IoZzR4 X3Jlc2V0X2NvbXBsZXRlKHBkZXYpLCA1MDApOworCWlmIChyZXQpIHsKKwkJRFJNX0RFQlVHX0RS SVZFUigiV2FpdCBmb3IgcmVuZGVyIHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0K Kworb3V0OgorCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBJOTE1X0dEUlNULCAwKTsKKwor CUk5MTVfV1JJVEUoVkRFQ0NMS19HQVRFX0QsCisJCSAgIEk5MTVfUkVBRChWREVDQ0xLX0dBVEVf RCkgJiB+VkNQX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKKwlQT1NUSU5HX1JFQUQoVkRFQ0NM S19HQVRFX0QpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpcm9ubGFrZV9kb19y ZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgIHVuc2lnbmVk IGludCBlbmdpbmVfbWFzaywKKwkJCSAgICAgdW5zaWduZWQgaW50IHJldHJ5KQoreworCWludCBy ZXQ7CisKKwlJOTE1X1dSSVRFKElMS19HRFNSLCBJTEtfR1JET01fUkVOREVSIHwgSUxLX0dSRE9N X1JFU0VUX0VOQUJMRSk7CisJcmV0ID0gaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYs CisJCQkJICAgICAgSUxLX0dEU1IsIElMS19HUkRPTV9SRVNFVF9FTkFCTEUsIDAsCisJCQkJICAg ICAgNTAwKTsKKwlpZiAocmV0KSB7CisJCURSTV9ERUJVR19EUklWRVIoIldhaXQgZm9yIHJlbmRl ciByZXNldCBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlJOTE1X1dSSVRFKElMS19H RFNSLCBJTEtfR1JET01fTUVESUEgfCBJTEtfR1JET01fUkVTRVRfRU5BQkxFKTsKKwlyZXQgPSBp bnRlbF93YWl0X2Zvcl9yZWdpc3RlcihkZXZfcHJpdiwKKwkJCQkgICAgICBJTEtfR0RTUiwgSUxL X0dSRE9NX1JFU0VUX0VOQUJMRSwgMCwKKwkJCQkgICAgICA1MDApOworCWlmIChyZXQpIHsKKwkJ RFJNX0RFQlVHX0RSSVZFUigiV2FpdCBmb3IgbWVkaWEgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290 byBvdXQ7CisJfQorCitvdXQ6CisJSTkxNV9XUklURShJTEtfR0RTUiwgMCk7CisJUE9TVElOR19S RUFEKElMS19HRFNSKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXNldCB0aGUgaGFyZHdhcmUg ZG9tYWlucyAoR0VOWF9HUkRPTV8qKSBzcGVjaWZpZWQgYnkgbWFzayAqLworc3RhdGljIGludCBn ZW42X2h3X2RvbWFpbl9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJ CQkJdTMyIGh3X2RvbWFpbl9tYXNrKQoreworCWludCBlcnI7CisKKwkvKgorCSAqIEdFTjZfR0RS U1QgaXMgbm90IGluIHRoZSBndCBwb3dlciB3ZWxsLCBubyBuZWVkIHRvIGNoZWNrCisJICogZm9y IGZpZm8gc3BhY2UgZm9yIHRoZSB3cml0ZSBvciBmb3JjZXdha2UgdGhlIGNoaXAgZm9yCisJICog dGhlIHJlYWQKKwkgKi8KKwlJOTE1X1dSSVRFX0ZXKEdFTjZfR0RSU1QsIGh3X2RvbWFpbl9tYXNr KTsKKworCS8qIFdhaXQgZm9yIHRoZSBkZXZpY2UgdG8gYWNrIHRoZSByZXNldCByZXF1ZXN0cyAq LworCWVyciA9IF9faW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXJfZncoZGV2X3ByaXYsCisJCQkJCSAg IEdFTjZfR0RSU1QsIGh3X2RvbWFpbl9tYXNrLCAwLAorCQkJCQkgICA1MDAsIDAsCisJCQkJCSAg IE5VTEwpOworCWlmIChlcnIpCisJCURSTV9ERUJVR19EUklWRVIoIldhaXQgZm9yIDB4JTA4eCBl bmdpbmVzIHJlc2V0IGZhaWxlZFxuIiwKKwkJCQkgaHdfZG9tYWluX21hc2spOworCisJcmV0dXJu IGVycjsKK30KKworc3RhdGljIGludCBnZW42X3Jlc2V0X2VuZ2luZXMoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZW5naW5lX21hc2ssCisJCQkg ICAgICB1bnNpZ25lZCBpbnQgcmV0cnkpCit7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lOworCWNvbnN0IHUzMiBod19lbmdpbmVfbWFza1tJOTE1X05VTV9FTkdJTkVTXSA9IHsKKwkJ W1JDU10gPSBHRU42X0dSRE9NX1JFTkRFUiwKKwkJW0JDU10gPSBHRU42X0dSRE9NX0JMVCwKKwkJ W1ZDU10gPSBHRU42X0dSRE9NX01FRElBLAorCQlbVkNTMl0gPSBHRU44X0dSRE9NX01FRElBMiwK KwkJW1ZFQ1NdID0gR0VONl9HUkRPTV9WRUNTLAorCX07CisJdTMyIGh3X21hc2s7CisKKwlpZiAo ZW5naW5lX21hc2sgPT0gQUxMX0VOR0lORVMpIHsKKwkJaHdfbWFzayA9IEdFTjZfR1JET01fRlVM TDsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgdG1wOworCisJCWh3X21hc2sgPSAwOworCQlm b3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgaTkxNSwgZW5naW5lX21hc2ssIHRtcCkKKwkJ CWh3X21hc2sgfD0gaHdfZW5naW5lX21hc2tbZW5naW5lLT5pZF07CisJfQorCisJcmV0dXJuIGdl bjZfaHdfZG9tYWluX3Jlc2V0KGk5MTUsIGh3X21hc2spOworfQorCitzdGF0aWMgdTMyIGdlbjEx X2xvY2tfc2ZjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXU4IHZkYm94X3NmY19hY2Nlc3MgPSBSVU5U SU1FX0lORk8oZGV2X3ByaXYpLT52ZGJveF9zZmNfYWNjZXNzOworCWk5MTVfcmVnX3Qgc2ZjX2Zv cmNlZF9sb2NrLCBzZmNfZm9yY2VkX2xvY2tfYWNrOworCXUzMiBzZmNfZm9yY2VkX2xvY2tfYml0 LCBzZmNfZm9yY2VkX2xvY2tfYWNrX2JpdDsKKwlpOTE1X3JlZ190IHNmY191c2FnZTsKKwl1MzIg c2ZjX3VzYWdlX2JpdDsKKwl1MzIgc2ZjX3Jlc2V0X2JpdDsKKworCXN3aXRjaCAoZW5naW5lLT5j bGFzcykgeworCWNhc2UgVklERU9fREVDT0RFX0NMQVNTOgorCQlpZiAoKEJJVChlbmdpbmUtPmlu c3RhbmNlKSAmIHZkYm94X3NmY19hY2Nlc3MpID09IDApCisJCQlyZXR1cm4gMDsKKworCQlzZmNf Zm9yY2VkX2xvY2sgPSBHRU4xMV9WQ1NfU0ZDX0ZPUkNFRF9MT0NLKGVuZ2luZSk7CisJCXNmY19m b3JjZWRfbG9ja19iaXQgPSBHRU4xMV9WQ1NfU0ZDX0ZPUkNFRF9MT0NLX0JJVDsKKworCQlzZmNf Zm9yY2VkX2xvY2tfYWNrID0gR0VOMTFfVkNTX1NGQ19MT0NLX1NUQVRVUyhlbmdpbmUpOworCQlz ZmNfZm9yY2VkX2xvY2tfYWNrX2JpdCAgPSBHRU4xMV9WQ1NfU0ZDX0xPQ0tfQUNLX0JJVDsKKwor CQlzZmNfdXNhZ2UgPSBHRU4xMV9WQ1NfU0ZDX0xPQ0tfU1RBVFVTKGVuZ2luZSk7CisJCXNmY191 c2FnZV9iaXQgPSBHRU4xMV9WQ1NfU0ZDX1VTQUdFX0JJVDsKKwkJc2ZjX3Jlc2V0X2JpdCA9IEdF TjExX1ZDU19TRkNfUkVTRVRfQklUKGVuZ2luZS0+aW5zdGFuY2UpOworCQlicmVhazsKKworCWNh c2UgVklERU9fRU5IQU5DRU1FTlRfQ0xBU1M6CisJCXNmY19mb3JjZWRfbG9jayA9IEdFTjExX1ZF Q1NfU0ZDX0ZPUkNFRF9MT0NLKGVuZ2luZSk7CisJCXNmY19mb3JjZWRfbG9ja19iaXQgPSBHRU4x MV9WRUNTX1NGQ19GT1JDRURfTE9DS19CSVQ7CisKKwkJc2ZjX2ZvcmNlZF9sb2NrX2FjayA9IEdF TjExX1ZFQ1NfU0ZDX0xPQ0tfQUNLKGVuZ2luZSk7CisJCXNmY19mb3JjZWRfbG9ja19hY2tfYml0 ICA9IEdFTjExX1ZFQ1NfU0ZDX0xPQ0tfQUNLX0JJVDsKKworCQlzZmNfdXNhZ2UgPSBHRU4xMV9W RUNTX1NGQ19VU0FHRShlbmdpbmUpOworCQlzZmNfdXNhZ2VfYml0ID0gR0VOMTFfVkVDU19TRkNf VVNBR0VfQklUOworCQlzZmNfcmVzZXRfYml0ID0gR0VOMTFfVkVDU19TRkNfUkVTRVRfQklUKGVu Z2luZS0+aW5zdGFuY2UpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0K KworCS8qCisJICogVGVsbCB0aGUgZW5naW5lIHRoYXQgYSBzb2Z0d2FyZSByZXNldCBpcyBnb2lu ZyB0byBoYXBwZW4uIFRoZSBlbmdpbmUKKwkgKiB3aWxsIHRoZW4gdHJ5IHRvIGZvcmNlIGxvY2sg dGhlIFNGQyAoaWYgY3VycmVudGx5IGxvY2tlZCwgaXQgd2lsbAorCSAqIHJlbWFpbiBzbyB1bnRp bCB3ZSB0ZWxsIHRoZSBlbmdpbmUgaXQgaXMgc2FmZSB0byB1bmxvY2s7IGlmIGN1cnJlbnRseQor CSAqIHVubG9ja2VkLCBpdCB3aWxsIGlnbm9yZSB0aGlzIGFuZCBhbGwgbmV3IGxvY2sgcmVxdWVz dHMpLiBJZiBTRkMKKwkgKiBlbmRzIHVwIGJlaW5nIGxvY2tlZCB0byB0aGUgZW5naW5lIHdlIHdh bnQgdG8gcmVzZXQsIHdlIGhhdmUgdG8gcmVzZXQKKwkgKiBpdCBhcyB3ZWxsICh3ZSB3aWxsIHVu bG9jayBpdCBvbmNlIHRoZSByZXNldCBzZXF1ZW5jZSBpcyBjb21wbGV0ZWQpLgorCSAqLworCUk5 MTVfV1JJVEVfRlcoc2ZjX2ZvcmNlZF9sb2NrLAorCQkgICAgICBJOTE1X1JFQURfRlcoc2ZjX2Zv cmNlZF9sb2NrKSB8IHNmY19mb3JjZWRfbG9ja19iaXQpOworCisJaWYgKF9faW50ZWxfd2FpdF9m b3JfcmVnaXN0ZXJfZncoZGV2X3ByaXYsCisJCQkJCSBzZmNfZm9yY2VkX2xvY2tfYWNrLAorCQkJ CQkgc2ZjX2ZvcmNlZF9sb2NrX2Fja19iaXQsCisJCQkJCSBzZmNfZm9yY2VkX2xvY2tfYWNrX2Jp dCwKKwkJCQkJIDEwMDAsIDAsIE5VTEwpKSB7CisJCURSTV9ERUJVR19EUklWRVIoIldhaXQgZm9y IFNGQyBmb3JjZWQgbG9jayBhY2sgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYg KEk5MTVfUkVBRF9GVyhzZmNfdXNhZ2UpICYgc2ZjX3VzYWdlX2JpdCkKKwkJcmV0dXJuIHNmY19y ZXNldF9iaXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuMTFfdW5sb2NrX3Nm YyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgIHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwl1OCB2ZGJveF9zZmNfYWNjZXNzID0gUlVOVElNRV9J TkZPKGRldl9wcml2KS0+dmRib3hfc2ZjX2FjY2VzczsKKwlpOTE1X3JlZ190IHNmY19mb3JjZWRf bG9jazsKKwl1MzIgc2ZjX2ZvcmNlZF9sb2NrX2JpdDsKKworCXN3aXRjaCAoZW5naW5lLT5jbGFz cykgeworCWNhc2UgVklERU9fREVDT0RFX0NMQVNTOgorCQlpZiAoKEJJVChlbmdpbmUtPmluc3Rh bmNlKSAmIHZkYm94X3NmY19hY2Nlc3MpID09IDApCisJCQlyZXR1cm47CisKKwkJc2ZjX2ZvcmNl ZF9sb2NrID0gR0VOMTFfVkNTX1NGQ19GT1JDRURfTE9DSyhlbmdpbmUpOworCQlzZmNfZm9yY2Vk X2xvY2tfYml0ID0gR0VOMTFfVkNTX1NGQ19GT1JDRURfTE9DS19CSVQ7CisJCWJyZWFrOworCisJ Y2FzZSBWSURFT19FTkhBTkNFTUVOVF9DTEFTUzoKKwkJc2ZjX2ZvcmNlZF9sb2NrID0gR0VOMTFf VkVDU19TRkNfRk9SQ0VEX0xPQ0soZW5naW5lKTsKKwkJc2ZjX2ZvcmNlZF9sb2NrX2JpdCA9IEdF TjExX1ZFQ1NfU0ZDX0ZPUkNFRF9MT0NLX0JJVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQly ZXR1cm47CisJfQorCisJSTkxNV9XUklURV9GVyhzZmNfZm9yY2VkX2xvY2ssCisJCSAgICAgIEk5 MTVfUkVBRF9GVyhzZmNfZm9yY2VkX2xvY2spICYgfnNmY19mb3JjZWRfbG9ja19iaXQpOworfQor CitzdGF0aWMgaW50IGdlbjExX3Jlc2V0X2VuZ2luZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGVuZ2luZV9tYXNrLAorCQkJICAgICAgIHVu c2lnbmVkIGludCByZXRyeSkKK3sKKwljb25zdCB1MzIgaHdfZW5naW5lX21hc2tbSTkxNV9OVU1f RU5HSU5FU10gPSB7CisJCVtSQ1NdID0gR0VOMTFfR1JET01fUkVOREVSLAorCQlbQkNTXSA9IEdF TjExX0dSRE9NX0JMVCwKKwkJW1ZDU10gPSBHRU4xMV9HUkRPTV9NRURJQSwKKwkJW1ZDUzJdID0g R0VOMTFfR1JET01fTUVESUEyLAorCQlbVkNTM10gPSBHRU4xMV9HUkRPTV9NRURJQTMsCisJCVtW Q1M0XSA9IEdFTjExX0dSRE9NX01FRElBNCwKKwkJW1ZFQ1NdID0gR0VOMTFfR1JET01fVkVDUywK KwkJW1ZFQ1MyXSA9IEdFTjExX0dSRE9NX1ZFQ1MyLAorCX07CisJc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lOworCXVuc2lnbmVkIGludCB0bXA7CisJdTMyIGh3X21hc2s7CisJaW50IHJl dDsKKworCUJVSUxEX0JVR19PTihWRUNTMiArIDEgIT0gSTkxNV9OVU1fRU5HSU5FUyk7CisKKwlp ZiAoZW5naW5lX21hc2sgPT0gQUxMX0VOR0lORVMpIHsKKwkJaHdfbWFzayA9IEdFTjExX0dSRE9N X0ZVTEw7CisJfSBlbHNlIHsKKwkJaHdfbWFzayA9IDA7CisJCWZvcl9lYWNoX2VuZ2luZV9tYXNr ZWQoZW5naW5lLCBpOTE1LCBlbmdpbmVfbWFzaywgdG1wKSB7CisJCQlod19tYXNrIHw9IGh3X2Vu Z2luZV9tYXNrW2VuZ2luZS0+aWRdOworCQkJaHdfbWFzayB8PSBnZW4xMV9sb2NrX3NmYyhpOTE1 LCBlbmdpbmUpOworCQl9CisJfQorCisJcmV0ID0gZ2VuNl9od19kb21haW5fcmVzZXQoaTkxNSwg aHdfbWFzayk7CisKKwlpZiAoZW5naW5lX21hc2sgIT0gQUxMX0VOR0lORVMpCisJCWZvcl9lYWNo X2VuZ2luZV9tYXNrZWQoZW5naW5lLCBpOTE1LCBlbmdpbmVfbWFzaywgdG1wKQorCQkJZ2VuMTFf dW5sb2NrX3NmYyhpOTE1LCBlbmdpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dCBnZW44X2VuZ2luZV9yZXNldF9wcmVwYXJlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7 CisJaW50IHJldDsKKworCUk5MTVfV1JJVEVfRlcoUklOR19SRVNFVF9DVEwoZW5naW5lLT5tbWlv X2Jhc2UpLAorCQkgICAgICBfTUFTS0VEX0JJVF9FTkFCTEUoUkVTRVRfQ1RMX1JFUVVFU1RfUkVT RVQpKTsKKworCXJldCA9IF9faW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXJfZncoZGV2X3ByaXYsCisJ CQkJCSAgIFJJTkdfUkVTRVRfQ1RMKGVuZ2luZS0+bW1pb19iYXNlKSwKKwkJCQkJICAgUkVTRVRf Q1RMX1JFQURZX1RPX1JFU0VULAorCQkJCQkgICBSRVNFVF9DVExfUkVBRFlfVE9fUkVTRVQsCisJ CQkJCSAgIDcwMCwgMCwKKwkJCQkJICAgTlVMTCk7CisJaWYgKHJldCkKKwkJRFJNX0VSUk9SKCIl czogcmVzZXQgcmVxdWVzdCB0aW1lb3V0XG4iLCBlbmdpbmUtPm5hbWUpOworCisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9lbmdpbmVfcmVzZXRfY2FuY2VsKHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSBlbmdpbmUtPmk5MTU7CisKKwlJOTE1X1dSSVRFX0ZXKFJJTkdfUkVTRVRfQ1RMKGVuZ2lu ZS0+bW1pb19iYXNlKSwKKwkJICAgICAgX01BU0tFRF9CSVRfRElTQUJMRShSRVNFVF9DVExfUkVR VUVTVF9SRVNFVCkpOworfQorCitzdGF0aWMgaW50IGdlbjhfcmVzZXRfZW5naW5lcyhzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBlbmdpbmVfbWFz aywKKwkJCSAgICAgIHVuc2lnbmVkIGludCByZXRyeSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmU7CisJY29uc3QgYm9vbCByZXNldF9ub25fcmVhZHkgPSByZXRyeSA+PSAxOwor CXVuc2lnbmVkIGludCB0bXA7CisJaW50IHJldDsKKworCWZvcl9lYWNoX2VuZ2luZV9tYXNrZWQo ZW5naW5lLCBpOTE1LCBlbmdpbmVfbWFzaywgdG1wKSB7CisJCXJldCA9IGdlbjhfZW5naW5lX3Jl c2V0X3ByZXBhcmUoZW5naW5lKTsKKwkJaWYgKHJldCAmJiAhcmVzZXRfbm9uX3JlYWR5KQorCQkJ Z290byBza2lwX3Jlc2V0OworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBm YWlsZWQgYXR0ZW1wdCB0byBwcmVwYXJlLAorCQkgKiB3ZSBkZWNpZGUgdG8gcHJvY2VlZCBhbnl3 YXkuCisJCSAqCisJCSAqIEJ5IGRvaW5nIHNvIHdlIHJpc2sgY29udGV4dCBjb3JydXB0aW9uIGFu ZCB3aXRoCisJCSAqIHNvbWUgZ2VucyAoa2JsKSwgcG9zc2libGUgc3lzdGVtIGhhbmcgaWYgcmVz ZXQKKwkJICogaGFwcGVucyBkdXJpbmcgYWN0aXZlIGJiIGV4ZWN1dGlvbi4KKwkJICoKKwkJICog V2UgcmF0aGVyIHRha2UgY29udGV4dCBjb3JydXB0aW9uIGluc3RlYWQgb2YKKwkJICogZmFpbGVk IHJlc2V0IHdpdGggYSB3ZWRnZWQgZHJpdmVyL2dwdS4gQW5kCisJCSAqIGFjdGl2ZSBiYiBleGVj dXRpb24gY2FzZSBzaG91bGQgYmUgY292ZXJlZCBieQorCQkgKiBpOTE1X3N0b3BfZW5naW5lcyB3 ZSBoYXZlIGJlZm9yZSB0aGUgcmVzZXQuCisJCSAqLworCX0KKworCWlmIChJTlRFTF9HRU4oaTkx NSkgPj0gMTEpCisJCXJldCA9IGdlbjExX3Jlc2V0X2VuZ2luZXMoaTkxNSwgZW5naW5lX21hc2ss IHJldHJ5KTsKKwllbHNlCisJCXJldCA9IGdlbjZfcmVzZXRfZW5naW5lcyhpOTE1LCBlbmdpbmVf bWFzaywgcmV0cnkpOworCitza2lwX3Jlc2V0OgorCWZvcl9lYWNoX2VuZ2luZV9tYXNrZWQoZW5n aW5lLCBpOTE1LCBlbmdpbmVfbWFzaywgdG1wKQorCQlnZW44X2VuZ2luZV9yZXNldF9jYW5jZWwo ZW5naW5lKTsKKworCXJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgaW50ICgqcmVzZXRfZnVuYyko c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKiwKKwkJCSAgdW5zaWduZWQgaW50IGVuZ2luZV9tYXNr LAorCQkJICB1bnNpZ25lZCBpbnQgcmV0cnkpOworCitzdGF0aWMgcmVzZXRfZnVuYyBpbnRlbF9n ZXRfZ3B1X3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCWlmICghaTkx NV9tb2RwYXJhbXMucmVzZXQpCisJCXJldHVybiBOVUxMOworCisJaWYgKElOVEVMX0dFTihpOTE1 KSA+PSA4KQorCQlyZXR1cm4gZ2VuOF9yZXNldF9lbmdpbmVzOworCWVsc2UgaWYgKElOVEVMX0dF TihpOTE1KSA+PSA2KQorCQlyZXR1cm4gZ2VuNl9yZXNldF9lbmdpbmVzOworCWVsc2UgaWYgKElO VEVMX0dFTihpOTE1KSA+PSA1KQorCQlyZXR1cm4gaXJvbmxha2VfZG9fcmVzZXQ7CisJZWxzZSBp ZiAoSVNfRzRYKGk5MTUpKQorCQlyZXR1cm4gZzR4X2RvX3Jlc2V0OworCWVsc2UgaWYgKElTX0cz MyhpOTE1KSB8fCBJU19QSU5FVklFVyhpOTE1KSkKKwkJcmV0dXJuIGczM19kb19yZXNldDsKKwll bHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPj0gMykKKwkJcmV0dXJuIGk5MTVfZG9fcmVzZXQ7CisJ ZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworaW50IGludGVsX2dwdV9yZXNldChzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSwgdW5zaWduZWQgaW50IGVuZ2luZV9tYXNrKQoreworCXJlc2V0 X2Z1bmMgcmVzZXQgPSBpbnRlbF9nZXRfZ3B1X3Jlc2V0KGk5MTUpOworCWludCByZXRyeTsKKwlp bnQgcmV0OworCisJLyoKKwkgKiBXZSB3YW50IHRvIHBlcmZvcm0gcGVyLWVuZ2luZSByZXNldCBm cm9tIGF0b21pYyBjb250ZXh0IChlLmcuCisJICogc29mdGlycSksIHdoaWNoIGltcG9zZXMgdGhl IGNvbnN0cmFpbnQgdGhhdCB3ZSBjYW5ub3Qgc2xlZXAuCisJICogSG93ZXZlciwgZXhwZXJpZW5j ZSBzdWdnZXN0cyB0aGF0IHNwZW5kaW5nIGEgYml0IG9mIHRpbWUgd2FpdGluZworCSAqIGZvciBh IHJlc2V0IGhlbHBzIGluIHZhcmlvdXMgY2FzZXMsIHNvIGZvciBhIGZ1bGwtZGV2aWNlIHJlc2V0 CisJICogd2UgYXBwbHkgdGhlIG9wcG9zaXRlIHJ1bGUgYW5kIHdhaXQgaWYgd2Ugd2FudCB0by4g QXMgd2Ugc2hvdWxkCisJICogYWx3YXlzIGZvbGxvdyB1cCBhIGZhaWxlZCBwZXItZW5naW5lIHJl c2V0IHdpdGggYSBmdWxsIGRldmljZSByZXNldCwKKwkgKiBiZWluZyBhIGxpdHRsZSBmYXN0ZXIs IHN0cmljdGVyIGFuZCBtb3JlIGVycm9yIHByb25lIGZvciB0aGUKKwkgKiBhdG9taWMgY2FzZSBz ZWVtcyBhbiBhY2NlcHRhYmxlIGNvbXByb21pc2UuCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5IHRo aXMgbGVhZHMgdG8gYSBiaW1vZGFsIHJvdXRpbmUsIHdoZW4gdGhlIGdvYWwgd2FzCisJICogdG8g aGF2ZSBhIHNpbmdsZSByZXNldCBmdW5jdGlvbiB0aGF0IHdvcmtlZCBmb3IgcmVzZXR0aW5nIGFu eQorCSAqIG51bWJlciBvZiBlbmdpbmVzIHNpbXVsdGFuZW91c2x5LgorCSAqLworCW1pZ2h0X3Ns ZWVwX2lmKGVuZ2luZV9tYXNrID09IEFMTF9FTkdJTkVTKTsKKworCS8qCisJICogSWYgdGhlIHBv d2VyIHdlbGwgc2xlZXBzIGR1cmluZyB0aGUgcmVzZXQsIHRoZSByZXNldAorCSAqIHJlcXVlc3Qg bWF5IGJlIGRyb3BwZWQgYW5kIG5ldmVyIGNvbXBsZXRlcyAoY2F1c2luZyAtRUlPKS4KKwkgKi8K KwlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX2dldChpOTE1LCBGT1JDRVdBS0VfQUxMKTsKKwlmb3Ig KHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7CisJCS8qCisJCSAqIFdlIHN0b3AgZW5n aW5lcywgb3RoZXJ3aXNlIHdlIG1pZ2h0IGdldCBmYWlsZWQgcmVzZXQgYW5kIGEKKwkJICogZGVh ZCBncHUgKG9uIGVsaykuIEFsc28gYXMgbW9kZXJuIGdwdSBhcyBrYmwgY2FuIHN1ZmZlcgorCQkg KiBmcm9tIHN5c3RlbSBoYW5nIGlmIGJhdGNoYnVmZmVyIGlzIHByb2dyZXNzaW5nIHdoZW4KKwkJ ICogdGhlIHJlc2V0IGlzIGlzc3VlZCwgcmVnYXJkbGVzcyBvZiBSRUFEWV9UT19SRVNFVCBhY2su CisJCSAqIFRodXMgYXNzdW1lIGl0IGlzIGJlc3QgdG8gc3RvcCBlbmdpbmVzIG9uIGFsbCBnZW5z CisJCSAqIHdoZXJlIHdlIGhhdmUgYSBncHUgcmVzZXQuCisJCSAqCisJCSAqIFdhS0JMVkVDU1Nl bWFwaG9yZVdhaXRQb2xsOmtibCAob24gQUxMX0VOR0lORVMpCisJCSAqCisJCSAqIFdhTWVkaWFS ZXNldE1haW5SaW5nQ2xlYW51cDpjdGcsZWxrIChwcmVzdW1hYmx5KQorCQkgKgorCQkgKiBGSVhN RTogV2EgZm9yIG1vcmUgbW9kZXJuIGdlbnMgbmVlZHMgdG8gYmUgdmFsaWRhdGVkCisJCSAqLwor CQlpOTE1X3N0b3BfZW5naW5lcyhpOTE1LCBlbmdpbmVfbWFzayk7CisKKwkJcmV0ID0gLUVOT0RF VjsKKwkJaWYgKHJlc2V0KSB7CisJCQlHRU1fVFJBQ0UoImVuZ2luZV9tYXNrPSV4XG4iLCBlbmdp bmVfbWFzayk7CisJCQlyZXQgPSByZXNldChpOTE1LCBlbmdpbmVfbWFzaywgcmV0cnkpOworCQl9 CisJCWlmIChyZXQgIT0gLUVUSU1FRE9VVCB8fCBlbmdpbmVfbWFzayAhPSBBTExfRU5HSU5FUykK KwkJCWJyZWFrOworCisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpbnRlbF91bmNvcmVfZm9yY2V3 YWtlX3B1dChpOTE1LCBGT1JDRVdBS0VfQUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK2Jvb2wg aW50ZWxfaGFzX2dwdV9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwly ZXR1cm4gaW50ZWxfZ2V0X2dwdV9yZXNldChpOTE1KTsKK30KKworYm9vbCBpbnRlbF9oYXNfcmVz ZXRfZW5naW5lKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCXJldHVybiBJTlRF TF9JTkZPKGk5MTUpLT5oYXNfcmVzZXRfZW5naW5lICYmIGk5MTVfbW9kcGFyYW1zLnJlc2V0ID49 IDI7Cit9CisKK2ludCBpbnRlbF9yZXNldF9ndWMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUpCit7CisJdTMyIGd1Y19kb21haW4gPQorCQlJTlRFTF9HRU4oaTkxNSkgPj0gMTEgPyBHRU4x MV9HUkRPTV9HVUMgOiBHRU45X0dSRE9NX0dVQzsKKwlpbnQgcmV0OworCisJR0VNX0JVR19PTigh SEFTX0dVQyhpOTE1KSk7CisKKwlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX2dldChpOTE1LCBGT1JD RVdBS0VfQUxMKTsKKwlyZXQgPSBnZW42X2h3X2RvbWFpbl9yZXNldChpOTE1LCBndWNfZG9tYWlu KTsKKwlpbnRlbF91bmNvcmVfZm9yY2V3YWtlX3B1dChpOTE1LCBGT1JDRVdBS0VfQUxMKTsKKwor CXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBFbnN1cmUgaXJxIGhhbmRsZXIgZmluaXNoZXMsIGFu ZCBub3QgcnVuIGFnYWluLgorICogQWxzbyByZXR1cm4gdGhlIGFjdGl2ZSByZXF1ZXN0IHNvIHRo YXQgd2Ugb25seSBzZWFyY2ggZm9yIGl0IG9uY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTkxNV9y ZXF1ZXN0ICoKK3Jlc2V0X3ByZXBhcmVfZW5naW5lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSkKK3sKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKKworCS8qCisJICogRHVyaW5nIHRo ZSByZXNldCBzZXF1ZW5jZSwgd2UgbXVzdCBwcmV2ZW50IHRoZSBlbmdpbmUgZnJvbQorCSAqIGVu dGVyaW5nIFJDNi4gQXMgdGhlIGNvbnRleHQgc3RhdGUgaXMgdW5kZWZpbmVkIHVudGlsIHdlIHJl c3RhcnQKKwkgKiB0aGUgZW5naW5lLCBpZiBpdCBkb2VzIGVudGVyIFJDNiBkdXJpbmcgdGhlIHJl c2V0LCB0aGUgc3RhdGUKKwkgKiB3cml0dGVuIHRvIHRoZSBwb3dlcmNvbnRleHQgaXMgdW5kZWZp bmVkIGFuZCBzbyB3ZSBtYXkgbG9zZQorCSAqIEdQVSBzdGF0ZSB1cG9uIHJlc3VtZSwgaS5lLiBm YWlsIHRvIHJlc3RhcnQgYWZ0ZXIgYSByZXNldC4KKwkgKi8KKwlpbnRlbF91bmNvcmVfZm9yY2V3 YWtlX2dldChlbmdpbmUtPmk5MTUsIEZPUkNFV0FLRV9BTEwpOworCisJcnEgPSBlbmdpbmUtPnJl c2V0LnByZXBhcmUoZW5naW5lKTsKKwlpZiAocnEgJiYgcnEtPmZlbmNlLmVycm9yID09IC1FSU8p CisJCXJxID0gRVJSX1BUUigtRUlPKTsgLyogUHJldmlvdXMgcmVzZXQgZmFpbGVkISAqLworCisJ cmV0dXJuIHJxOworfQorCitzdGF0aWMgaW50IHJlc2V0X3ByZXBhcmUoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUpCit7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOworCXN0 cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOworCWludCBl cnIgPSAwOworCisJZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpIHsKKwkJcnEgPSBy ZXNldF9wcmVwYXJlX2VuZ2luZShlbmdpbmUpOworCQlpZiAoSVNfRVJSKHJxKSkgeworCQkJZXJy ID0gUFRSX0VSUihycSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVuZ2luZS0+aGFuZ2NoZWNr LmFjdGl2ZV9yZXF1ZXN0ID0gcnE7CisJfQorCisJaTkxNV9nZW1fcmV2b2tlX2ZlbmNlcyhpOTE1 KTsKKwlpbnRlbF91Y19zYW5pdGl6ZShpOTE1KTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qIFJl dHVybnMgdGhlIHJlcXVlc3QgaWYgaXQgd2FzIGd1aWx0eSBvZiB0aGUgaGFuZyAqLworc3RhdGlj IHN0cnVjdCBpOTE1X3JlcXVlc3QgKgorcmVzZXRfcmVxdWVzdChzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUsCisJICAgICAgc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEsCisJICAgICAgYm9v bCBzdGFsbGVkKQoreworCS8qCisJICogVGhlIGd1aWx0eSByZXF1ZXN0IHdpbGwgZ2V0IHNraXBw ZWQgb24gYSBodW5nIGVuZ2luZS4KKwkgKgorCSAqIFVzZXJzIG9mIGNsaWVudCBkZWZhdWx0IGNv bnRleHRzIGRvIG5vdCByZWx5IG9uIGxvZ2ljYWwKKwkgKiBzdGF0ZSBwcmVzZXJ2ZWQgYmV0d2Vl biBiYXRjaGVzIHNvIGl0IGlzIHNhZmUgdG8gZXhlY3V0ZQorCSAqIHF1ZXVlZCByZXF1ZXN0cyBm b2xsb3dpbmcgdGhlIGhhbmcuIE5vbiBkZWZhdWx0IGNvbnRleHRzCisJICogcmVseSBvbiBwcmVz ZXJ2ZWQgc3RhdGUsIHNvIHNraXBwaW5nIGEgYmF0Y2ggbG9zZXMgdGhlCisJICogZXZvbHV0aW9u IG9mIHRoZSBzdGF0ZSBhbmQgaXQgbmVlZHMgdG8gYmUgY29uc2lkZXJlZCBjb3JydXB0ZWQuCisJ ICogRXhlY3V0aW5nIG1vcmUgcXVldWVkIGJhdGNoZXMgb24gdG9wIG9mIGNvcnJ1cHRlZCBzdGF0 ZSBpcworCSAqIHJpc2t5LiBCdXQgd2UgdGFrZSB0aGUgcmlzayBieSB0cnlpbmcgdG8gYWR2YW5j ZSB0aHJvdWdoCisJICogdGhlIHF1ZXVlZCByZXF1ZXN0cyBpbiBvcmRlciB0byBtYWtlIHRoZSBj bGllbnQgYmVoYXZpb3VyCisJICogbW9yZSBwcmVkaWN0YWJsZSBhcm91bmQgcmVzZXRzLCBieSBu b3QgdGhyb3dpbmcgYXdheSByYW5kb20KKwkgKiBhbW91bnQgb2YgYmF0Y2hlcyBpdCBoYXMgcHJl cGFyZWQgZm9yIGV4ZWN1dGlvbi4gU29waGlzdGljYXRlZAorCSAqIGNsaWVudHMgY2FuIHVzZSBn ZW1fcmVzZXRfc3RhdHNfaW9jdGwgYW5kIGRtYSBmZW5jZSBzdGF0dXMKKwkgKiAoZXhwb3J0ZWQg dmlhIHN5bmNfZmlsZSBpbmZvIGlvY3RsIG9uIGV4cGxpY2l0IGZlbmNlcykgdG8gb2JzZXJ2ZQor CSAqIHdoZW4gaXQgbG9zZXMgdGhlIGNvbnRleHQgc3RhdGUgYW5kIHNob3VsZCByZWJ1aWxkIGFj Y29yZGluZ2x5LgorCSAqCisJICogVGhlIGNvbnRleHQgYmFuLCBhbmQgdWx0aW1hdGVseSB0aGUg Y2xpZW50IGJhbiwgbWVjaGFuaXNtIGFyZSBzYWZldHkKKwkgKiB2YWx2ZXMgaWYgY2xpZW50IHN1 Ym1pc3Npb24gZW5kcyB1cCByZXN1bHRpbmcgaW4gbm90aGluZyBtb3JlIHRoYW4KKwkgKiBzdWJz ZXF1ZW50IGhhbmdzLgorCSAqLworCisJaWYgKGk5MTVfcmVxdWVzdF9jb21wbGV0ZWQocnEpKSB7 CisJCUdFTV9UUkFDRSgiJXMgcGFyZG9uZWQgZ2xvYmFsPSVkIChmZW5jZSAlbGx4OiVsbGQpLCBj dXJyZW50ICVkXG4iLAorCQkJICBlbmdpbmUtPm5hbWUsIHJxLT5nbG9iYWxfc2Vxbm8sCisJCQkg IHJxLT5mZW5jZS5jb250ZXh0LCBycS0+ZmVuY2Uuc2Vxbm8sCisJCQkgIGludGVsX2VuZ2luZV9n ZXRfc2Vxbm8oZW5naW5lKSk7CisJCXN0YWxsZWQgPSBmYWxzZTsKKwl9CisKKwlpZiAoc3RhbGxl ZCkgeworCQljb250ZXh0X21hcmtfZ3VpbHR5KHJxLT5nZW1fY29udGV4dCk7CisJCWk5MTVfcmVx dWVzdF9za2lwKHJxLCAtRUlPKTsKKworCQkvKiBJZiB0aGlzIGNvbnRleHQgaXMgbm93IGJhbm5l ZCwgc2tpcCBhbGwgcGVuZGluZyByZXF1ZXN0cy4gKi8KKwkJaWYgKGk5MTVfZ2VtX2NvbnRleHRf aXNfYmFubmVkKHJxLT5nZW1fY29udGV4dCkpCisJCQllbmdpbmVfc2tpcF9jb250ZXh0KHJxKTsK Kwl9IGVsc2UgeworCQkvKgorCQkgKiBTaW5jZSB0aGlzIGlzIG5vdCB0aGUgaHVuZyBlbmdpbmUs IGl0IG1heSBoYXZlIGFkdmFuY2VkCisJCSAqIHNpbmNlIHRoZSBoYW5nIGRlY2xhcmF0aW9uLiBE b3VibGUgY2hlY2sgYnkgcmVmaW5kaW5nCisJCSAqIHRoZSBhY3RpdmUgcmVxdWVzdCBhdCB0aGUg dGltZSBvZiB0aGUgcmVzZXQuCisJCSAqLworCQlycSA9IGk5MTVfZ2VtX2ZpbmRfYWN0aXZlX3Jl cXVlc3QoZW5naW5lKTsKKwkJaWYgKHJxKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ CQljb250ZXh0X21hcmtfaW5ub2NlbnQocnEtPmdlbV9jb250ZXh0KTsKKwkJCWRtYV9mZW5jZV9z ZXRfZXJyb3IoJnJxLT5mZW5jZSwgLUVBR0FJTik7CisKKwkJCS8qIFJld2luZCB0aGUgZW5naW5l IHRvIHJlcGxheSB0aGUgaW5jb21wbGV0ZSBycSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVu Z2luZS0+dGltZWxpbmUubG9jaywgZmxhZ3MpOworCQkJcnEgPSBsaXN0X3ByZXZfZW50cnkocnEs IGxpbmspOworCQkJaWYgKCZycS0+bGluayA9PSAmZW5naW5lLT50aW1lbGluZS5yZXF1ZXN0cykK KwkJCQlycSA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmdpbmUtPnRpbWVs aW5lLmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCXJldHVybiBycTsKK30KKworc3RhdGljIHZv aWQgcmVzZXRfZW5naW5lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKKwkJCSBzdHJ1 Y3QgaTkxNV9yZXF1ZXN0ICpycSwKKwkJCSBib29sIHN0YWxsZWQpCit7CisJaWYgKHJxKQorCQly cSA9IHJlc2V0X3JlcXVlc3QoZW5naW5lLCBycSwgc3RhbGxlZCk7CisKKwkvKiBTZXR1cCB0aGUg Q1MgdG8gcmVzdW1lIGZyb20gdGhlIGJyZWFkY3J1bWIgb2YgdGhlIGh1bmcgcmVxdWVzdCAqLwor CWVuZ2luZS0+cmVzZXQucmVzZXQoZW5naW5lLCBycSk7Cit9CisKK3N0YXRpYyB2b2lkIGd0X3Jl c2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LCB1bnNpZ25lZCBpbnQgc3RhbGxlZF9t YXNrKQoreworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKKwllbnVtIGludGVsX2Vu Z2luZV9pZCBpZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmk5MTUtPmRybS5zdHJ1Y3RfbXV0 ZXgpOworCisJaTkxNV9yZXRpcmVfcmVxdWVzdHMoaTkxNSk7CisKKwlmb3JfZWFjaF9lbmdpbmUo ZW5naW5lLCBpOTE1LCBpZCkgeworCQlzdHJ1Y3QgaW50ZWxfY29udGV4dCAqY2U7CisKKwkJcmVz ZXRfZW5naW5lKGVuZ2luZSwKKwkJCSAgICAgZW5naW5lLT5oYW5nY2hlY2suYWN0aXZlX3JlcXVl c3QsCisJCQkgICAgIHN0YWxsZWRfbWFzayAmIEVOR0lORV9NQVNLKGlkKSk7CisJCWNlID0gZmV0 Y2hfYW5kX3plcm8oJmVuZ2luZS0+bGFzdF9yZXRpcmVkX2NvbnRleHQpOworCQlpZiAoY2UpCisJ CQlpbnRlbF9jb250ZXh0X3VucGluKGNlKTsKKworCQkvKgorCQkgKiBPc3RlbnNpYmlseSwgd2Ug YWx3YXlzIHdhbnQgYSBjb250ZXh0IGxvYWRlZCBmb3IgcG93ZXJzYXZpbmcsCisJCSAqIHNvIGlm IHRoZSBlbmdpbmUgaXMgaWRsZSBhZnRlciB0aGUgcmVzZXQsIHNlbmQgYSByZXF1ZXN0CisJCSAq IHRvIGxvYWQgb3VyIHNjcmF0Y2gga2VybmVsX2NvbnRleHQuCisJCSAqCisJCSAqIE1vcmUgbXlz dGVyaW91c2x5LCBpZiB3ZSBsZWF2ZSB0aGUgZW5naW5lIGlkbGUgYWZ0ZXIgYSByZXNldCwKKwkJ ICogdGhlIG5leHQgdXNlcnNwYWNlIGJhdGNoIG1heSBoYW5nLCB3aXRoIHdoYXQgYXBwZWFycyB0 byBiZQorCQkgKiBhbiBpbmNvaGVyZW50IHJlYWQgYnkgdGhlIENTIChwcmVzdW1hYmx5IHN0YWxl IFRMQikuIEFuCisJCSAqIGVtcHR5IHJlcXVlc3QgYXBwZWFycyBzdWZmaWNpZW50IHRvIHBhcGVy IG92ZXIgdGhlIGdsaXRjaC4KKwkJICovCisJCWlmIChpbnRlbF9lbmdpbmVfaXNfaWRsZShlbmdp bmUpKSB7CisJCQlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpycTsKKworCQkJcnEgPSBpOTE1X3JlcXVl c3RfYWxsb2MoZW5naW5lLCBpOTE1LT5rZXJuZWxfY29udGV4dCk7CisJCQlpZiAoIUlTX0VSUihy cSkpCisJCQkJaTkxNV9yZXF1ZXN0X2FkZChycSk7CisJCX0KKwl9CisKKwlpOTE1X2dlbV9yZXN0 b3JlX2ZlbmNlcyhpOTE1KTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfZmluaXNoX2VuZ2luZShz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJZW5naW5lLT5yZXNldC5maW5pc2go ZW5naW5lKTsKKworCWludGVsX3VuY29yZV9mb3JjZXdha2VfcHV0KGVuZ2luZS0+aTkxNSwgRk9S Q0VXQUtFX0FMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2ZpbmlzaChzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7CisJ ZW51bSBpbnRlbF9lbmdpbmVfaWQgaWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpOTE1LT5k cm0uc3RydWN0X211dGV4KTsKKworCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGk5MTUsIGlkKSB7 CisJCWVuZ2luZS0+aGFuZ2NoZWNrLmFjdGl2ZV9yZXF1ZXN0ID0gTlVMTDsKKwkJcmVzZXRfZmlu aXNoX2VuZ2luZShlbmdpbmUpOworCX0KK30KKworc3RhdGljIHZvaWQgbm9wX3N1Ym1pdF9yZXF1 ZXN0KHN0cnVjdCBpOTE1X3JlcXVlc3QgKnJlcXVlc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKworCUdFTV9UUkFDRSgiJXMgZmVuY2UgJWxseDolbGxkIC0+IC1FSU9cbiIsCisJCSAgcmVx dWVzdC0+ZW5naW5lLT5uYW1lLAorCQkgIHJlcXVlc3QtPmZlbmNlLmNvbnRleHQsIHJlcXVlc3Qt PmZlbmNlLnNlcW5vKTsKKwlkbWFfZmVuY2Vfc2V0X2Vycm9yKCZyZXF1ZXN0LT5mZW5jZSwgLUVJ Tyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmVxdWVzdC0+ZW5naW5lLT50aW1lbGluZS5sb2Nr LCBmbGFncyk7CisJX19pOTE1X3JlcXVlc3Rfc3VibWl0KHJlcXVlc3QpOworCWludGVsX2VuZ2lu ZV93cml0ZV9nbG9iYWxfc2Vxbm8ocmVxdWVzdC0+ZW5naW5lLCByZXF1ZXN0LT5nbG9iYWxfc2Vx bm8pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlcXVlc3QtPmVuZ2luZS0+dGltZWxpbmUu bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGk5MTVfZ2VtX3NldF93ZWRnZWQoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUpCit7CisJc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciA9ICZp OTE1LT5ncHVfZXJyb3I7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOworCWVudW0g aW50ZWxfZW5naW5lX2lkIGlkOworCisJbXV0ZXhfbG9jaygmZXJyb3ItPndlZGdlX211dGV4KTsK KwlpZiAodGVzdF9iaXQoSTkxNV9XRURHRUQsICZlcnJvci0+ZmxhZ3MpKSB7CisJCW11dGV4X3Vu bG9jaygmZXJyb3ItPndlZGdlX211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChHRU1fU0hP V19ERUJVRygpKSB7CisJCXN0cnVjdCBkcm1fcHJpbnRlciBwID0gZHJtX2RlYnVnX3ByaW50ZXIo X19mdW5jX18pOworCisJCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGk5MTUsIGlkKQorCQkJaW50 ZWxfZW5naW5lX2R1bXAoZW5naW5lLCAmcCwgIiVzXG4iLCBlbmdpbmUtPm5hbWUpOworCX0KKwor CUdFTV9UUkFDRSgic3RhcnRcbiIpOworCisJLyoKKwkgKiBGaXJzdCwgc3RvcCBzdWJtaXNzaW9u IHRvIGh3LCBidXQgZG8gbm90IHlldCBjb21wbGV0ZSByZXF1ZXN0cyBieQorCSAqIHJvbGxpbmcg dGhlIGdsb2JhbCBzZXFubyBmb3J3YXJkIChzaW5jZSB0aGlzIHdvdWxkIGNvbXBsZXRlIHJlcXVl c3RzCisJICogZm9yIHdoaWNoIHdlIGhhdmVuJ3Qgc2V0IHRoZSBmZW5jZSBlcnJvciB0byBFSU8g eWV0KS4KKwkgKi8KKwlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkKKwkJcmVzZXRf cHJlcGFyZV9lbmdpbmUoZW5naW5lKTsKKworCS8qIEV2ZW4gaWYgdGhlIEdQVSByZXNldCBmYWls cywgaXQgc2hvdWxkIHN0aWxsIHN0b3AgdGhlIGVuZ2luZXMgKi8KKwlpZiAoSU5URUxfR0VOKGk5 MTUpID49IDUpCisJCWludGVsX2dwdV9yZXNldChpOTE1LCBBTExfRU5HSU5FUyk7CisKKwlmb3Jf ZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgeworCQllbmdpbmUtPnN1Ym1pdF9yZXF1ZXN0 ID0gbm9wX3N1Ym1pdF9yZXF1ZXN0OworCQllbmdpbmUtPnNjaGVkdWxlID0gTlVMTDsKKwl9CisJ aTkxNS0+Y2Fwcy5zY2hlZHVsZXIgPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgbm8gcmVxdWVz dCBjYW4gc2xpcCB0aHJvdWdoIHdpdGhvdXQgZ2V0dGluZyBjb21wbGV0ZWQgYnkKKwkgKiBlaXRo ZXIgdGhpcyBjYWxsIGhlcmUgdG8gaW50ZWxfZW5naW5lX3dyaXRlX2dsb2JhbF9zZXFubywgb3Ig dGhlIG9uZQorCSAqIGluIG5vcF9zdWJtaXRfcmVxdWVzdC4KKwkgKi8KKwlzeW5jaHJvbml6ZV9y Y3UoKTsKKworCS8qIE1hcmsgYWxsIGV4ZWN1dGluZyByZXF1ZXN0cyBhcyBza2lwcGVkICovCisJ Zm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpCisJCWVuZ2luZS0+Y2FuY2VsX3JlcXVl c3RzKGVuZ2luZSk7CisKKwlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgeworCQly ZXNldF9maW5pc2hfZW5naW5lKGVuZ2luZSk7CisJCWludGVsX2VuZ2luZV93YWtldXAoZW5naW5l KTsKKwl9CisKKwlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKKwlzZXRfYml0KEk5MTVfV0VER0VE LCAmZXJyb3ItPmZsYWdzKTsKKworCUdFTV9UUkFDRSgiZW5kXG4iKTsKKwltdXRleF91bmxvY2so JmVycm9yLT53ZWRnZV9tdXRleCk7CisKKwl3YWtlX3VwX2FsbCgmZXJyb3ItPnJlc2V0X3F1ZXVl KTsKK30KKworYm9vbCBpOTE1X2dlbV91bnNldF93ZWRnZWQoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUpCit7CisJc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciA9ICZpOTE1LT5ncHVf ZXJyb3I7CisJc3RydWN0IGk5MTVfdGltZWxpbmUgKnRsOworCWJvb2wgcmV0ID0gZmFsc2U7CisK Kwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKworCWlmICgh dGVzdF9iaXQoSTkxNV9XRURHRUQsICZlcnJvci0+ZmxhZ3MpKQorCQlyZXR1cm4gdHJ1ZTsKKwor CWlmICghaTkxNS0+Z3Quc2NyYXRjaCkgLyogTmV2ZXIgZnVsbCBpbml0aWFsaXNlZCwgcmVjb3Zl cnkgaW1wb3NzaWJsZSAqLworCQlyZXR1cm4gZmFsc2U7CisKKwltdXRleF9sb2NrKCZlcnJvci0+ d2VkZ2VfbXV0ZXgpOworCisJR0VNX1RSQUNFKCJzdGFydFxuIik7CisKKwkvKgorCSAqIEJlZm9y ZSB1bndlZGdpbmcsIG1ha2Ugc3VyZSB0aGF0IGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMKKwkgKiBh cmUgZmx1c2hlZCBhbmQgZXJyb3JlZCBvdXQgLSB3ZSBtYXkgaGF2ZSByZXF1ZXN0cyB3YWl0aW5n IHVwb24KKwkgKiB0aGlyZCBwYXJ0eSBmZW5jZXMuIFdlIG1hcmtlZCBhbGwgaW5mbGlnaHQgcmVx dWVzdHMgYXMgRUlPLCBhbmQKKwkgKiBldmVyeSBleGVjYnVmIHNpbmNlIHJldHVybmVkIEVJTywg Zm9yIGNvbnNpc3RlbmN5IHdlIHdhbnQgYWxsCisJICogdGhlIGN1cnJlbnRseSBwZW5kaW5nIHJl cXVlc3RzIHRvIGFsc28gYmUgbWFya2VkIGFzIEVJTywgd2hpY2gKKwkgKiBpcyBkb25lIGluc2lk ZSBvdXIgbm9wX3N1Ym1pdF9yZXF1ZXN0IC0gYW5kIHNvIHdlIG11c3Qgd2FpdC4KKwkgKgorCSAq IE5vIG1vcmUgY2FuIGJlIHN1Ym1pdHRlZCB1bnRpbCB3ZSByZXNldCB0aGUgd2VkZ2VkIGJpdC4K KwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRsLCAmaTkxNS0+Z3QudGltZWxpbmVzLCBsaW5r KSB7CisJCXN0cnVjdCBpOTE1X3JlcXVlc3QgKnJxOworCisJCXJxID0gaTkxNV9nZW1fYWN0aXZl X3BlZWsoJnRsLT5sYXN0X3JlcXVlc3QsCisJCQkJCSAgJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgp OworCQlpZiAoIXJxKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2UgY2FuJ3QgdXNlIG91 ciBub3JtYWwgd2FpdGVyIGFzIHdlIHdhbnQgdG8KKwkJICogYXZvaWQgcmVjdXJzaXZlbHkgdHJ5 aW5nIHRvIGhhbmRsZSB0aGUgY3VycmVudAorCQkgKiByZXNldC4gVGhlIGJhc2ljIGRtYV9mZW5j ZV9kZWZhdWx0X3dhaXQoKSBpbnN0YWxscworCQkgKiBhIGNhbGxiYWNrIGZvciBkbWFfZmVuY2Vf c2lnbmFsKCksIHdoaWNoIGlzCisJCSAqIHRyaWdnZXJlZCBieSBvdXIgbm9wIGhhbmRsZXIgKGlu ZGlyZWN0bHksIHRoZQorCQkgKiBjYWxsYmFjayBlbmFibGVzIHRoZSBzaWduYWxlciB0aHJlYWQg d2hpY2ggaXMKKwkJICogd29rZW4gYnkgdGhlIG5vcF9zdWJtaXRfcmVxdWVzdCgpIGFkdmFuY2lu ZyB0aGUgc2Vxbm8KKwkJICogYW5kIHdoZW4gdGhlIHNlcW5vIHBhc3NlcyB0aGUgZmVuY2UsIHRo ZSBzaWduYWxlcgorCQkgKiB0aGVuIHNpZ25hbHMgdGhlIGZlbmNlIHdha2luZyB1cyB1cCkuCisJ CSAqLworCQlpZiAoZG1hX2ZlbmNlX2RlZmF1bHRfd2FpdCgmcnEtPmZlbmNlLCB0cnVlLAorCQkJ CQkgICBNQVhfU0NIRURVTEVfVElNRU9VVCkgPCAwKQorCQkJZ290byB1bmxvY2s7CisJfQorCWk5 MTVfcmV0aXJlX3JlcXVlc3RzKGk5MTUpOworCUdFTV9CVUdfT04oaTkxNS0+Z3QuYWN0aXZlX3Jl cXVlc3RzKTsKKworCWludGVsX2VuZ2luZXNfc2FuaXRpemUoaTkxNSwgZmFsc2UpOworCisJLyoK KwkgKiBVbmRvIG5vcF9zdWJtaXRfcmVxdWVzdC4gV2UgcHJldmVudCBhbGwgbmV3IGk5MTUgcmVx dWVzdHMgZnJvbQorCSAqIGJlaW5nIHF1ZXVlZCAoYnkgZGlzYWxsb3dpbmcgZXhlY2J1ZiB3aGls c3Qgd2VkZ2VkKSBzbyBoYXZpbmcKKwkgKiB3YWl0ZWQgZm9yIGFsbCBhY3RpdmUgcmVxdWVzdHMg YWJvdmUsIHdlIGtub3cgdGhlIHN5c3RlbSBpcyBpZGxlCisJICogYW5kIGRvIG5vdCBoYXZlIHRv IHdvcnJ5IGFib3V0IGEgdGhyZWFkIGJlaW5nIGluc2lkZQorCSAqIGVuZ2luZS0+c3VibWl0X3Jl cXVlc3QoKSBhcyB3ZSBzd2FwIG92ZXIuIFNvIHVubGlrZSBpbnN0YWxsaW5nCisJICogdGhlIG5v cF9zdWJtaXRfcmVxdWVzdCBvbiByZXNldCwgd2UgY2FuIGRvIHRoaXMgZnJvbSBub3JtYWwKKwkg KiBjb250ZXh0IGFuZCBkbyBub3QgcmVxdWlyZSBzdG9wX21hY2hpbmUoKS4KKwkgKi8KKwlpbnRl bF9lbmdpbmVzX3Jlc2V0X2RlZmF1bHRfc3VibWlzc2lvbihpOTE1KTsKKwlpOTE1X2dlbV9jb250 ZXh0c19sb3N0KGk5MTUpOworCisJR0VNX1RSQUNFKCJlbmRcbiIpOworCisJc21wX21iX19iZWZv cmVfYXRvbWljKCk7IC8qIGNvbXBsZXRlIHRha2VvdmVyIGJlZm9yZSBlbmFibGluZyBleGVjYnVm ICovCisJY2xlYXJfYml0KEk5MTVfV0VER0VELCAmaTkxNS0+Z3B1X2Vycm9yLmZsYWdzKTsKKwly ZXQgPSB0cnVlOwordW5sb2NrOgorCW11dGV4X3VubG9jaygmaTkxNS0+Z3B1X2Vycm9yLndlZGdl X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaTkxNV9yZXNldCAtIHJlc2V0 IGNoaXAgYWZ0ZXIgYSBoYW5nCisgKiBAaTkxNTogI2RybV9pOTE1X3ByaXZhdGUgdG8gcmVzZXQK KyAqIEBzdGFsbGVkX21hc2s6IG1hc2sgb2YgdGhlIHN0YWxsZWQgZW5naW5lcyB3aXRoIHRoZSBn dWlsdHkgcmVxdWVzdHMKKyAqIEByZWFzb246IHVzZXIgZXJyb3IgbWVzc2FnZSBmb3Igd2h5IHdl IGFyZSByZXNldHRpbmcKKyAqCisgKiBSZXNldCB0aGUgY2hpcC4gIFVzZWZ1bCBpZiBhIGhhbmcg aXMgZGV0ZWN0ZWQuIE1hcmtzIHRoZSBkZXZpY2UgYXMgd2VkZ2VkCisgKiBvbiBmYWlsdXJlLgor ICoKKyAqIENhbGxlciBtdXN0IGhvbGQgdGhlIHN0cnVjdF9tdXRleC4KKyAqCisgKiBQcm9jZWR1 cmUgaXMgZmFpcmx5IHNpbXBsZToKKyAqICAgLSByZXNldCB0aGUgY2hpcCB1c2luZyB0aGUgcmVz ZXQgcmVnCisgKiAgIC0gcmUtaW5pdCBjb250ZXh0IHN0YXRlCisgKiAgIC0gcmUtaW5pdCBoYXJk d2FyZSBzdGF0dXMgcGFnZQorICogICAtIHJlLWluaXQgcmluZyBidWZmZXIKKyAqICAgLSByZS1p bml0IGludGVycnVwdCBzdGF0ZQorICogICAtIHJlLWluaXQgZGlzcGxheQorICovCit2b2lkIGk5 MTVfcmVzZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCXVuc2lnbmVkIGludCBz dGFsbGVkX21hc2ssCisJCWNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlzdHJ1Y3QgaTkxNV9ncHVf ZXJyb3IgKmVycm9yID0gJmk5MTUtPmdwdV9lcnJvcjsKKwlpbnQgcmV0OworCWludCBpOworCisJ R0VNX1RSQUNFKCJmbGFncz0lbHhcbiIsIGVycm9yLT5mbGFncyk7CisKKwltaWdodF9zbGVlcCgp OworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCWFzc2Vy dF9ycG1fd2FrZWxvY2tfaGVsZChpOTE1KTsKKwlHRU1fQlVHX09OKCF0ZXN0X2JpdChJOTE1X1JF U0VUX0JBQ0tPRkYsICZlcnJvci0+ZmxhZ3MpKTsKKworCWlmICghdGVzdF9iaXQoSTkxNV9SRVNF VF9IQU5ET0ZGLCAmZXJyb3ItPmZsYWdzKSkKKwkJcmV0dXJuOworCisJLyogQ2xlYXIgYW55IHBy ZXZpb3VzIGZhaWxlZCBhdHRlbXB0cyBhdCByZWNvdmVyeS4gVGltZSB0byB0cnkgYWdhaW4uICov CisJaWYgKCFpOTE1X2dlbV91bnNldF93ZWRnZWQoaTkxNSkpCisJCWdvdG8gd2FrZXVwOworCisJ aWYgKHJlYXNvbikKKwkJZGV2X25vdGljZShpOTE1LT5kcm0uZGV2LCAiUmVzZXR0aW5nIGNoaXAg Zm9yICVzXG4iLCByZWFzb24pOworCWVycm9yLT5yZXNldF9jb3VudCsrOworCisJcmV0ID0gcmVz ZXRfcHJlcGFyZShpOTE1KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoaTkxNS0+ZHJtLmRldiwg IkdQVSByZWNvdmVyeSBmYWlsZWRcbiIpOworCQlnb3RvIHRhaW50OworCX0KKworCWlmICghaW50 ZWxfaGFzX2dwdV9yZXNldChpOTE1KSkgeworCQlpZiAoaTkxNV9tb2RwYXJhbXMucmVzZXQpCisJ CQlkZXZfZXJyKGk5MTUtPmRybS5kZXYsICJHUFUgcmVzZXQgbm90IHN1cHBvcnRlZFxuIik7CisJ CWVsc2UKKwkJCURSTV9ERUJVR19EUklWRVIoIkdQVSByZXNldCBkaXNhYmxlZFxuIik7CisJCWdv dG8gZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXQgPSBpbnRl bF9ncHVfcmVzZXQoaTkxNSwgQUxMX0VOR0lORVMpOworCQlpZiAocmV0ID09IDApCisJCQlicmVh azsKKworCQltc2xlZXAoMTAwKTsKKwl9CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGk5MTUtPmRy bS5kZXYsICJGYWlsZWQgdG8gcmVzZXQgY2hpcFxuIik7CisJCWdvdG8gdGFpbnQ7CisJfQorCisJ LyogT2ssIG5vdyBnZXQgdGhpbmdzIGdvaW5nIGFnYWluLi4uICovCisKKwkvKgorCSAqIEV2ZXJ5 dGhpbmcgZGVwZW5kcyBvbiBoYXZpbmcgdGhlIEdUVCBydW5uaW5nLCBzbyB3ZSBuZWVkIHRvIHN0 YXJ0CisJICogdGhlcmUuCisJICovCisJcmV0ID0gaTkxNV9nZ3R0X2VuYWJsZV9odyhpOTE1KTsK KwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIHJlLWVuYWJsZSBHR1RUIGZvbGxv d2luZyByZXNldCAoJWQpXG4iLAorCQkJICByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCWd0 X3Jlc2V0KGk5MTUsIHN0YWxsZWRfbWFzayk7CisJaW50ZWxfb3ZlcmxheV9yZXNldChpOTE1KTsK KworCS8qCisJICogTmV4dCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRleHQsIGJ1dCB3ZSBk b24ndCB1c2UgdGhvc2UKKwkgKiB5ZXQgZWl0aGVyLi4uCisJICoKKwkgKiBSaW5nIGJ1ZmZlciBu ZWVkcyB0byBiZSByZS1pbml0aWFsaXplZCBpbiB0aGUgS01TIGNhc2UsIG9yIGlmIFgKKwkgKiB3 YXMgcnVubmluZyBhdCB0aGUgdGltZSBvZiB0aGUgcmVzZXQgKGkuZS4gd2Ugd2VyZW4ndCBWVAor CSAqIHN3aXRjaGVkIGF3YXkpLgorCSAqLworCXJldCA9IGk5MTVfZ2VtX2luaXRfaHcoaTkxNSk7 CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBpbml0aWFsaXNlIEhXIGZvbGxv d2luZyByZXNldCAoJWQpXG4iLAorCQkJICByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCWk5 MTVfcXVldWVfaGFuZ2NoZWNrKGk5MTUpOworCitmaW5pc2g6CisJcmVzZXRfZmluaXNoKGk5MTUp Oword2FrZXVwOgorCWNsZWFyX2JpdChJOTE1X1JFU0VUX0hBTkRPRkYsICZlcnJvci0+ZmxhZ3Mp OworCXdha2VfdXBfYml0KCZlcnJvci0+ZmxhZ3MsIEk5MTVfUkVTRVRfSEFORE9GRik7CisJcmV0 dXJuOworCit0YWludDoKKwkvKgorCSAqIEhpc3RvcnkgdGVsbHMgdXMgdGhhdCBpZiB3ZSBjYW5u b3QgcmVzZXQgdGhlIEdQVSBub3csIHdlCisJICogbmV2ZXIgd2lsbC4gVGhpcyB0aGVuIGltcGFj dHMgZXZlcnl0aGluZyB0aGF0IGlzIHJ1bgorCSAqIHN1YnNlcXVlbnRseS4gT24gZmFpbGluZyB0 aGUgcmVzZXQsIHdlIG1hcmsgdGhlIGRyaXZlcgorCSAqIGFzIHdlZGdlZCwgcHJldmVudGluZyBm dXJ0aGVyIGV4ZWN1dGlvbiBvbiB0aGUgR1BVLgorCSAqIFdlIGFsc28gd2FudCB0byBnbyBvbmUg c3RlcCBmdXJ0aGVyIGFuZCBhZGQgYSB0YWludCB0byB0aGUKKwkgKiBrZXJuZWwgc28gdGhhdCBh bnkgc3Vic2VxdWVudCBmYXVsdHMgY2FuIGJlIHRyYWNlZCBiYWNrIHRvCisJICogdGhpcyBmYWls dXJlLiBUaGlzIGlzIGltcG9ydGFudCBmb3IgQ0ksIHdoZXJlIGlmIHRoZQorCSAqIEdQVS9kcml2 ZXIgZmFpbHMgd2Ugd291bGQgbGlrZSB0byByZWJvb3QgYW5kIHJlc3RhcnQgdGVzdGluZworCSAq IHJhdGhlciB0aGFuIGNvbnRpbnVlIG9uIGludG8gb2JsaXZpb24uIEZvciBldmVyeW9uZSBlbHNl LAorCSAqIHRoZSBzeXN0ZW0gc2hvdWxkIHN0aWxsIHBsb2QgYWxvbmcsIGJ1dCB0aGV5IGhhdmUg YmVlbiB3YXJuZWQhCisJICovCisJYWRkX3RhaW50KFRBSU5UX1dBUk4sIExPQ0tERVBfU1RJTExf T0spOworZXJyb3I6CisJaTkxNV9nZW1fc2V0X3dlZGdlZChpOTE1KTsKKwlpOTE1X3JldGlyZV9y ZXF1ZXN0cyhpOTE1KTsKKwlnb3RvIGZpbmlzaDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW50 ZWxfZ3RfcmVzZXRfZW5naW5lKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAorCQkJCQlz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJcmV0dXJuIGludGVsX2dwdV9yZXNl dChpOTE1LCBpbnRlbF9lbmdpbmVfZmxhZyhlbmdpbmUpKTsKK30KKworLyoqCisgKiBpOTE1X3Jl c2V0X2VuZ2luZSAtIHJlc2V0IEdQVSBlbmdpbmUgdG8gcmVjb3ZlciBmcm9tIGEgaGFuZworICog QGVuZ2luZTogZW5naW5lIHRvIHJlc2V0CisgKiBAbXNnOiByZWFzb24gZm9yIEdQVSByZXNldDsg b3IgTlVMTCBmb3Igbm8gZGV2X25vdGljZSgpCisgKgorICogUmVzZXQgYSBzcGVjaWZpYyBHUFUg ZW5naW5lLiBVc2VmdWwgaWYgYSBoYW5nIGlzIGRldGVjdGVkLgorICogUmV0dXJucyB6ZXJvIG9u IHN1Y2Nlc3NmdWwgcmVzZXQgb3Igb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCisgKgorICogUHJv Y2VkdXJlIGlzOgorICogIC0gaWRlbnRpZmllcyB0aGUgcmVxdWVzdCB0aGF0IGNhdXNlZCB0aGUg aGFuZyBhbmQgaXQgaXMgZHJvcHBlZAorICogIC0gcmVzZXQgZW5naW5lICh3aGljaCB3aWxsIGZv cmNlIHRoZSBlbmdpbmUgdG8gaWRsZSkKKyAqICAtIHJlLWluaXQvY29uZmlndXJlIGVuZ2luZQor ICovCitpbnQgaTkxNV9yZXNldF9lbmdpbmUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l LCBjb25zdCBjaGFyICptc2cpCit7CisJc3RydWN0IGk5MTVfZ3B1X2Vycm9yICplcnJvciA9ICZl bmdpbmUtPmk5MTUtPmdwdV9lcnJvcjsKKwlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICphY3RpdmVfcmVx dWVzdDsKKwlpbnQgcmV0OworCisJR0VNX1RSQUNFKCIlcyBmbGFncz0lbHhcbiIsIGVuZ2luZS0+ bmFtZSwgZXJyb3ItPmZsYWdzKTsKKwlHRU1fQlVHX09OKCF0ZXN0X2JpdChJOTE1X1JFU0VUX0VO R0lORSArIGVuZ2luZS0+aWQsICZlcnJvci0+ZmxhZ3MpKTsKKworCWFjdGl2ZV9yZXF1ZXN0ID0g cmVzZXRfcHJlcGFyZV9lbmdpbmUoZW5naW5lKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoYWN0aXZl X3JlcXVlc3QpKSB7CisJCS8qIEVpdGhlciB0aGUgcHJldmlvdXMgcmVzZXQgZmFpbGVkLCBvciB3 ZSBwYXJkb24gdGhlIHJlc2V0LiAqLworCQlyZXQgPSBQVFJfRVJSKGFjdGl2ZV9yZXF1ZXN0KTsK KwkJZ290byBvdXQ7CisJfQorCisJaWYgKG1zZykKKwkJZGV2X25vdGljZShlbmdpbmUtPmk5MTUt PmRybS5kZXYsCisJCQkgICAiUmVzZXR0aW5nICVzIGZvciAlc1xuIiwgZW5naW5lLT5uYW1lLCBt c2cpOworCWVycm9yLT5yZXNldF9lbmdpbmVfY291bnRbZW5naW5lLT5pZF0rKzsKKworCWlmICgh ZW5naW5lLT5pOTE1LT5ndWMuZXhlY2J1Zl9jbGllbnQpCisJCXJldCA9IGludGVsX2d0X3Jlc2V0 X2VuZ2luZShlbmdpbmUtPmk5MTUsIGVuZ2luZSk7CisJZWxzZQorCQlyZXQgPSBpbnRlbF9ndWNf cmVzZXRfZW5naW5lKCZlbmdpbmUtPmk5MTUtPmd1YywgZW5naW5lKTsKKwlpZiAocmV0KSB7CisJ CS8qIElmIHdlIGZhaWwgaGVyZSwgd2UgZXhwZWN0IHRvIGZhbGxiYWNrIHRvIGEgZ2xvYmFsIHJl c2V0ICovCisJCURSTV9ERUJVR19EUklWRVIoIiVzRmFpbGVkIHRvIHJlc2V0ICVzLCByZXQ9JWRc biIsCisJCQkJIGVuZ2luZS0+aTkxNS0+Z3VjLmV4ZWNidWZfY2xpZW50ID8gIkd1QyAiIDogIiIs CisJCQkJIGVuZ2luZS0+bmFtZSwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBU aGUgcmVxdWVzdCB0aGF0IGNhdXNlZCB0aGUgaGFuZyBpcyBzdHVjayBvbiBlbHNwLCB3ZSBrbm93 IHRoZQorCSAqIGFjdGl2ZSByZXF1ZXN0IGFuZCBjYW4gZHJvcCBpdCwgYWRqdXN0IGhlYWQgdG8g c2tpcCB0aGUgb2ZmZW5kaW5nCisJICogcmVxdWVzdCB0byByZXN1bWUgZXhlY3V0aW5nIHJlbWFp bmluZyByZXF1ZXN0cyBpbiB0aGUgcXVldWUuCisJICovCisJcmVzZXRfZW5naW5lKGVuZ2luZSwg YWN0aXZlX3JlcXVlc3QsIHRydWUpOworCisJLyoKKwkgKiBUaGUgZW5naW5lIGFuZCBpdHMgcmVn aXN0ZXJzIChhbmQgd29ya2Fyb3VuZHMgaW4gY2FzZSBvZiByZW5kZXIpCisJICogaGF2ZSBiZWVu IHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBGb2xsb3cgdGhlIGluaXRfcmluZworCSAq IHByb2Nlc3MgdG8gcHJvZ3JhbSBSSU5HX01PREUsIEhXU1AgYW5kIHJlLWVuYWJsZSBzdWJtaXNz aW9uLgorCSAqLworCXJldCA9IGVuZ2luZS0+aW5pdF9odyhlbmdpbmUpOworCWlmIChyZXQpCisJ CWdvdG8gb3V0OworCitvdXQ6CisJaW50ZWxfZW5naW5lX2NhbmNlbF9zdG9wX2NzKGVuZ2luZSk7 CisJcmVzZXRfZmluaXNoX2VuZ2luZShlbmdpbmUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyB2b2lkIGk5MTVfcmVzZXRfZGV2aWNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAor CQkJICAgICAgdTMyIGVuZ2luZV9tYXNrLAorCQkJICAgICAgY29uc3QgY2hhciAqcmVhc29uKQor eworCXN0cnVjdCBpOTE1X2dwdV9lcnJvciAqZXJyb3IgPSAmaTkxNS0+Z3B1X2Vycm9yOworCXN0 cnVjdCBrb2JqZWN0ICprb2JqID0gJmk5MTUtPmRybS5wcmltYXJ5LT5rZGV2LT5rb2JqOworCWNo YXIgKmVycm9yX2V2ZW50W10gPSB7IEk5MTVfRVJST1JfVUVWRU5UICI9MSIsIE5VTEwgfTsKKwlj aGFyICpyZXNldF9ldmVudFtdID0geyBJOTE1X1JFU0VUX1VFVkVOVCAiPTEiLCBOVUxMIH07CisJ Y2hhciAqcmVzZXRfZG9uZV9ldmVudFtdID0geyBJOTE1X0VSUk9SX1VFVkVOVCAiPTAiLCBOVUxM IH07CisJc3RydWN0IGk5MTVfd2VkZ2VfbWUgdzsKKworCWtvYmplY3RfdWV2ZW50X2Vudihrb2Jq LCBLT0JKX0NIQU5HRSwgZXJyb3JfZXZlbnQpOworCisJRFJNX0RFQlVHX0RSSVZFUigicmVzZXR0 aW5nIGNoaXBcbiIpOworCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX0NIQU5HRSwgcmVz ZXRfZXZlbnQpOworCisJLyogVXNlIGEgd2F0Y2hkb2cgdG8gZW5zdXJlIHRoYXQgb3VyIHJlc2V0 IGNvbXBsZXRlcyAqLworCWk5MTVfd2VkZ2Vfb25fdGltZW91dCgmdywgaTkxNSwgNSAqIEhaKSB7 CisJCWludGVsX3ByZXBhcmVfcmVzZXQoaTkxNSk7CisKKwkJZXJyb3ItPnJlYXNvbiA9IHJlYXNv bjsKKwkJZXJyb3ItPnN0YWxsZWRfbWFzayA9IGVuZ2luZV9tYXNrOworCisJCS8qIFNpZ25hbCB0 aGF0IGxvY2tlZCB3YWl0ZXJzIHNob3VsZCByZXNldCB0aGUgR1BVICovCisJCXNtcF9tYl9fYmVm b3JlX2F0b21pYygpOworCQlzZXRfYml0KEk5MTVfUkVTRVRfSEFORE9GRiwgJmVycm9yLT5mbGFn cyk7CisJCXdha2VfdXBfYWxsKCZlcnJvci0+d2FpdF9xdWV1ZSk7CisKKwkJLyoKKwkJICogV2Fp dCBmb3IgYW55b25lIGhvbGRpbmcgdGhlIGxvY2sgdG8gd2FrZXVwLCB3aXRob3V0CisJCSAqIGJs b2NraW5nIGluZGVmaW5pdGVseSBvbiBzdHJ1Y3RfbXV0ZXguCisJCSAqLworCQlkbyB7CisJCQlp ZiAobXV0ZXhfdHJ5bG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCkpIHsKKwkJCQlpOTE1X3Jl c2V0KGk5MTUsIGVuZ2luZV9tYXNrLCByZWFzb24pOworCQkJCW11dGV4X3VubG9jaygmaTkxNS0+ ZHJtLnN0cnVjdF9tdXRleCk7CisJCQl9CisJCX0gd2hpbGUgKHdhaXRfb25fYml0X3RpbWVvdXQo JmVycm9yLT5mbGFncywKKwkJCQkJICAgICBJOTE1X1JFU0VUX0hBTkRPRkYsCisJCQkJCSAgICAg VEFTS19VTklOVEVSUlVQVElCTEUsCisJCQkJCSAgICAgMSkpOworCisJCWVycm9yLT5zdGFsbGVk X21hc2sgPSAwOworCQllcnJvci0+cmVhc29uID0gTlVMTDsKKworCQlpbnRlbF9maW5pc2hfcmVz ZXQoaTkxNSk7CisJfQorCisJaWYgKCF0ZXN0X2JpdChJOTE1X1dFREdFRCwgJmVycm9yLT5mbGFn cykpCisJCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX0NIQU5HRSwgcmVzZXRfZG9uZV9l dmVudCk7Cit9CisKK3ZvaWQgaTkxNV9jbGVhcl9lcnJvcl9yZWdpc3RlcnMoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXUzMiBlaXI7CisKKwlpZiAoIUlTX0dFTihkZXZf cHJpdiwgMikpCisJCUk5MTVfV1JJVEUoUEdUQkxfRVIsIEk5MTVfUkVBRChQR1RCTF9FUikpOwor CisJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPCA0KQorCQlJOTE1X1dSSVRFKElQRUlSLCBJOTE1 X1JFQUQoSVBFSVIpKTsKKwllbHNlCisJCUk5MTVfV1JJVEUoSVBFSVJfSTk2NSwgSTkxNV9SRUFE KElQRUlSX0k5NjUpKTsKKworCUk5MTVfV1JJVEUoRUlSLCBJOTE1X1JFQUQoRUlSKSk7CisJZWly ID0gSTkxNV9SRUFEKEVJUik7CisJaWYgKGVpcikgeworCQkvKgorCQkgKiBzb21lIGVycm9ycyBt aWdodCBoYXZlIGJlY29tZSBzdHVjaywKKwkJICogbWFzayB0aGVtLgorCQkgKi8KKwkJRFJNX0RF QlVHX0RSSVZFUigiRUlSIHN0dWNrOiAweCUwOHgsIG1hc2tpbmdcbiIsIGVpcik7CisJCUk5MTVf V1JJVEUoRU1SLCBJOTE1X1JFQUQoRU1SKSB8IGVpcik7CisJCUk5MTVfV1JJVEUoSUlSLCBJOTE1 X01BU1RFUl9FUlJPUl9JTlRFUlJVUFQpOworCX0KKworCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYp ID49IDgpIHsKKwkJSTkxNV9XUklURShHRU44X1JJTkdfRkFVTFRfUkVHLAorCQkJICAgSTkxNV9S RUFEKEdFTjhfUklOR19GQVVMVF9SRUcpICYgflJJTkdfRkFVTFRfVkFMSUQpOworCQlQT1NUSU5H X1JFQUQoR0VOOF9SSU5HX0ZBVUxUX1JFRyk7CisJfSBlbHNlIGlmIChJTlRFTF9HRU4oZGV2X3By aXYpID49IDYpIHsKKwkJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOworCQllbnVtIGlu dGVsX2VuZ2luZV9pZCBpZDsKKworCQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBkZXZfcHJpdiwg aWQpIHsKKwkJCUk5MTVfV1JJVEUoUklOR19GQVVMVF9SRUcoZW5naW5lKSwKKwkJCQkgICBJOTE1 X1JFQUQoUklOR19GQVVMVF9SRUcoZW5naW5lKSkgJgorCQkJCSAgIH5SSU5HX0ZBVUxUX1ZBTElE KTsKKwkJfQorCQlQT1NUSU5HX1JFQUQoUklOR19GQVVMVF9SRUcoZGV2X3ByaXYtPmVuZ2luZVtS Q1NdKSk7CisJfQorfQorCisvKioKKyAqIGk5MTVfaGFuZGxlX2Vycm9yIC0gaGFuZGxlIGEgZ3B1 IGVycm9yCisgKiBAaTkxNTogaTkxNSBkZXZpY2UgcHJpdmF0ZQorICogQGVuZ2luZV9tYXNrOiBt YXNrIHJlcHJlc2VudGluZyBlbmdpbmVzIHRoYXQgYXJlIGh1bmcKKyAqIEBmbGFnczogY29udHJv bCBmbGFncworICogQGZtdDogRXJyb3IgbWVzc2FnZSBmb3JtYXQgc3RyaW5nCisgKgorICogRG8g c29tZSBiYXNpYyBjaGVja2luZyBvZiByZWdpc3RlciBzdGF0ZSBhdCBlcnJvciB0aW1lIGFuZAor ICogZHVtcCBpdCB0byB0aGUgc3lzbG9nLiAgQWxzbyBjYWxsIGk5MTVfY2FwdHVyZV9lcnJvcl9z dGF0ZSgpIHRvIG1ha2UKKyAqIHN1cmUgd2UgZ2V0IGEgcmVjb3JkIGFuZCBtYWtlIGl0IGF2YWls YWJsZSBpbiBkZWJ1Z2ZzLiAgRmlyZSBhIHVldmVudAorICogc28gdXNlcnNwYWNlIGtub3dzIHNv bWV0aGluZyBiYWQgaGFwcGVuZWQgKHNob3VsZCB0cmlnZ2VyIGNvbGxlY3Rpb24KKyAqIG9mIGEg cmluZyBkdW1wIGV0Yy4pLgorICovCit2b2lkIGk5MTVfaGFuZGxlX2Vycm9yKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1LAorCQkgICAgICAgdTMyIGVuZ2luZV9tYXNrLAorCQkgICAgICAg dW5zaWduZWQgbG9uZyBmbGFncywKKwkJICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorewor CXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJl ZjsKKwl1bnNpZ25lZCBpbnQgdG1wOworCWNoYXIgZXJyb3JfbXNnWzgwXTsKKwljaGFyICptc2cg PSBOVUxMOworCisJaWYgKGZtdCkgeworCQl2YV9saXN0IGFyZ3M7CisKKwkJdmFfc3RhcnQoYXJn cywgZm10KTsKKwkJdnNjbnByaW50ZihlcnJvcl9tc2csIHNpemVvZihlcnJvcl9tc2cpLCBmbXQs IGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisKKwkJbXNnID0gZXJyb3JfbXNnOworCX0KKworCS8q CisJICogSW4gbW9zdCBjYXNlcyBpdCdzIGd1YXJhbnRlZWQgdGhhdCB3ZSBnZXQgaGVyZSB3aXRo IGFuIFJQTQorCSAqIHJlZmVyZW5jZSBoZWxkLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZXJlIGlz IGEgcGVuZGluZyBHUFUKKwkgKiByZXF1ZXN0IHRoYXQgd29uJ3QgZmluaXNoIHVudGlsIHRoZSBy ZXNldCBpcyBkb25lLiBUaGlzCisJICogaXNuJ3QgdGhlIGNhc2UgYXQgbGVhc3Qgd2hlbiB3ZSBn ZXQgaGVyZSBieSBkb2luZyBhCisJICogc2ltdWxhdGVkIHJlc2V0IHZpYSBkZWJ1Z2ZzLCBzbyBn ZXQgYW4gUlBNIHJlZmVyZW5jZS4KKwkgKi8KKwl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9n ZXQoaTkxNSk7CisKKwllbmdpbmVfbWFzayAmPSBJTlRFTF9JTkZPKGk5MTUpLT5yaW5nX21hc2s7 CisKKwlpZiAoZmxhZ3MgJiBJOTE1X0VSUk9SX0NBUFRVUkUpIHsKKwkJaTkxNV9jYXB0dXJlX2Vy cm9yX3N0YXRlKGk5MTUsIGVuZ2luZV9tYXNrLCBtc2cpOworCQlpOTE1X2NsZWFyX2Vycm9yX3Jl Z2lzdGVycyhpOTE1KTsKKwl9CisKKwkvKgorCSAqIFRyeSBlbmdpbmUgcmVzZXQgd2hlbiBhdmFp bGFibGUuIFdlIGZhbGwgYmFjayB0byBmdWxsIHJlc2V0IGlmCisJICogc2luZ2xlIHJlc2V0IGZh aWxzLgorCSAqLworCWlmIChpbnRlbF9oYXNfcmVzZXRfZW5naW5lKGk5MTUpICYmCisJICAgICFp OTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKCZpOTE1LT5ncHVfZXJyb3IpKSB7CisJCWZvcl9lYWNoX2Vu Z2luZV9tYXNrZWQoZW5naW5lLCBpOTE1LCBlbmdpbmVfbWFzaywgdG1wKSB7CisJCQlCVUlMRF9C VUdfT04oSTkxNV9SRVNFVF9NT0RFU0VUID49IEk5MTVfUkVTRVRfRU5HSU5FKTsKKwkJCWlmICh0 ZXN0X2FuZF9zZXRfYml0KEk5MTVfUkVTRVRfRU5HSU5FICsgZW5naW5lLT5pZCwKKwkJCQkJICAg ICAmaTkxNS0+Z3B1X2Vycm9yLmZsYWdzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGk5MTVf cmVzZXRfZW5naW5lKGVuZ2luZSwgbXNnKSA9PSAwKQorCQkJCWVuZ2luZV9tYXNrICY9IH5pbnRl bF9lbmdpbmVfZmxhZyhlbmdpbmUpOworCisJCQljbGVhcl9iaXQoSTkxNV9SRVNFVF9FTkdJTkUg KyBlbmdpbmUtPmlkLAorCQkJCSAgJmk5MTUtPmdwdV9lcnJvci5mbGFncyk7CisJCQl3YWtlX3Vw X2JpdCgmaTkxNS0+Z3B1X2Vycm9yLmZsYWdzLAorCQkJCSAgICBJOTE1X1JFU0VUX0VOR0lORSAr IGVuZ2luZS0+aWQpOworCQl9CisJfQorCisJaWYgKCFlbmdpbmVfbWFzaykKKwkJZ290byBvdXQ7 CisKKwkvKiBGdWxsIHJlc2V0IG5lZWRzIHRoZSBtdXRleCwgc3RvcCBhbnkgb3RoZXIgdXNlciB0 cnlpbmcgdG8gZG8gc28uICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoSTkxNV9SRVNFVF9CQUNL T0ZGLCAmaTkxNS0+Z3B1X2Vycm9yLmZsYWdzKSkgeworCQl3YWl0X2V2ZW50KGk5MTUtPmdwdV9l cnJvci5yZXNldF9xdWV1ZSwKKwkJCSAgICF0ZXN0X2JpdChJOTE1X1JFU0VUX0JBQ0tPRkYsCisJ CQkJICAgICAmaTkxNS0+Z3B1X2Vycm9yLmZsYWdzKSk7CisJCWdvdG8gb3V0OworCX0KKworCS8q IFByZXZlbnQgYW55IG90aGVyIHJlc2V0LWVuZ2luZSBhdHRlbXB0LiAqLworCWZvcl9lYWNoX2Vu Z2luZShlbmdpbmUsIGk5MTUsIHRtcCkgeworCQl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChJOTE1 X1JFU0VUX0VOR0lORSArIGVuZ2luZS0+aWQsCisJCQkJCSZpOTE1LT5ncHVfZXJyb3IuZmxhZ3Mp KQorCQkJd2FpdF9vbl9iaXQoJmk5MTUtPmdwdV9lcnJvci5mbGFncywKKwkJCQkgICAgSTkxNV9S RVNFVF9FTkdJTkUgKyBlbmdpbmUtPmlkLAorCQkJCSAgICBUQVNLX1VOSU5URVJSVVBUSUJMRSk7 CisJfQorCisJaTkxNV9yZXNldF9kZXZpY2UoaTkxNSwgZW5naW5lX21hc2ssIG1zZyk7CisKKwlm b3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCB0bXApIHsKKwkJY2xlYXJfYml0KEk5MTVfUkVT RVRfRU5HSU5FICsgZW5naW5lLT5pZCwKKwkJCSAgJmk5MTUtPmdwdV9lcnJvci5mbGFncyk7CisJ fQorCisJY2xlYXJfYml0KEk5MTVfUkVTRVRfQkFDS09GRiwgJmk5MTUtPmdwdV9lcnJvci5mbGFn cyk7CisJd2FrZV91cF9hbGwoJmk5MTUtPmdwdV9lcnJvci5yZXNldF9xdWV1ZSk7CisKK291dDoK KwlpbnRlbF9ydW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVmKTsKK30KKworc3RhdGljIHZvaWQg aTkxNV93ZWRnZV9tZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGk5MTVf d2VkZ2VfbWUgKncgPSBjb250YWluZXJfb2Yod29yaywgdHlwZW9mKCp3KSwgd29yay53b3JrKTsK KworCWRldl9lcnIody0+aTkxNS0+ZHJtLmRldiwKKwkJIiVzIHRpbWVkIG91dCwgY2FuY2VsbGlu ZyBhbGwgaW4tZmxpZ2h0IHJlbmRlcmluZy5cbiIsCisJCXctPm5hbWUpOworCWk5MTVfZ2VtX3Nl dF93ZWRnZWQody0+aTkxNSk7Cit9CisKK3ZvaWQgX19pOTE1X2luaXRfd2VkZ2Uoc3RydWN0IGk5 MTVfd2VkZ2VfbWUgKncsCisJCSAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwK KwkJICAgICAgIGxvbmcgdGltZW91dCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJ dy0+aTkxNSA9IGk5MTU7CisJdy0+bmFtZSA9IG5hbWU7CisKKwlJTklUX0RFTEFZRURfV09SS19P TlNUQUNLKCZ3LT53b3JrLCBpOTE1X3dlZGdlX21lKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmso JnctPndvcmssIHRpbWVvdXQpOworfQorCit2b2lkIF9faTkxNV9maW5pX3dlZGdlKHN0cnVjdCBp OTE1X3dlZGdlX21lICp3KQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdy0+d29yayk7 CisJZGVzdHJveV9kZWxheWVkX3dvcmtfb25fc3RhY2soJnctPndvcmspOworCXctPmk5MTUgPSBO VUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXNldC5oIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uYjZhNTE5YmRlNjdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9yZXNldC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDgtMjAxOCBJ bnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgSTkxNV9SRVNFVF9ICisjZGVmaW5lIEk5 MTVfUkVTRVRfSAorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51 eC90eXBlcy5oPgorCitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZTsKK3N0cnVjdCBpbnRlbF9lbmdp bmVfY3M7CitzdHJ1Y3QgaW50ZWxfZ3VjOworCitfX3ByaW50Zig0LCA1KQordm9pZCBpOTE1X2hh bmRsZV9lcnJvcihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJICAgICAgIHUzMiBl bmdpbmVfbWFzaywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCSAgICAgICBjb25z dCBjaGFyICpmbXQsIC4uLik7CisjZGVmaW5lIEk5MTVfRVJST1JfQ0FQVFVSRSBCSVQoMCkKKwor dm9pZCBpOTE1X2NsZWFyX2Vycm9yX3JlZ2lzdGVycyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSk7CisKK3ZvaWQgaTkxNV9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwK KwkJdW5zaWduZWQgaW50IHN0YWxsZWRfbWFzaywKKwkJY29uc3QgY2hhciAqcmVhc29uKTsKK2lu dCBpOTE1X3Jlc2V0X2VuZ2luZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCSAg ICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7CisKK2Jvb2wgaW50ZWxfaGFzX2dwdV9yZXNldChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7Citib29sIGludGVsX2hhc19yZXNldF9lbmdpbmUo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpOworCitpbnQgaW50ZWxfZ3B1X3Jlc2V0KHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LCB1MzIgZW5naW5lX21hc2spOworCitpbnQgaW50 ZWxfcmVzZXRfZ3VjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KTsKKworc3RydWN0IGk5 MTVfd2VkZ2VfbWUgeworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKwordm9pZCBfX2k5MTVf aW5pdF93ZWRnZShzdHJ1Y3QgaTkxNV93ZWRnZV9tZSAqdywKKwkJICAgICAgIHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1LAorCQkgICAgICAgbG9uZyB0aW1lb3V0LAorCQkgICAgICAgY29u c3QgY2hhciAqbmFtZSk7Cit2b2lkIF9faTkxNV9maW5pX3dlZGdlKHN0cnVjdCBpOTE1X3dlZGdl X21lICp3KTsKKworI2RlZmluZSBpOTE1X3dlZGdlX29uX3RpbWVvdXQoVywgREVWLCBUSU1FT1VU KQkJCQlcCisJZm9yIChfX2k5MTVfaW5pdF93ZWRnZSgoVyksIChERVYpLCAoVElNRU9VVCksIF9f ZnVuY19fKTsJXAorCSAgICAgKFcpLT5pOTE1OwkJCQkJCQlcCisJICAgICBfX2k5MTVfZmluaV93 ZWRnZSgoVykpKQorCisjZW5kaWYgLyogSTkxNV9SRVNFVF9IICovCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9kaXNwbGF5LmMKaW5kZXggNjRkYmQwNmY0ZmZiLi5mYmUzYzNhM2I2NzUgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTMxLDEzICszMSw3IEBACiAjaW5jbHVkZSA8 bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZnYWFyYi5oPgogI2luY2x1ZGUgPGRybS9k cm1fZWRpZC5oPgotI2luY2x1ZGUgImludGVsX2Rydi5oIgotI2luY2x1ZGUgImludGVsX2Zyb250 YnVmZmVyLmgiCiAjaW5jbHVkZSA8ZHJtL2k5MTVfZHJtLmg+Ci0jaW5jbHVkZSAiaTkxNV9kcnYu aCIKLSNpbmNsdWRlICJpOTE1X2dlbV9jbGZsdXNoLmgiCi0jaW5jbHVkZSAiaW50ZWxfZHNpLmgi Ci0jaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+CiAj aW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9kcF9o ZWxwZXIuaD4KQEAgLTQ4LDYgKzQyLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZWwtaW9tbXUu aD4KICNpbmNsdWRlIDxsaW51eC9yZXNlcnZhdGlvbi5oPgogCisjaW5jbHVkZSAiaW50ZWxfZHJ2 LmgiCisjaW5jbHVkZSAiaW50ZWxfZHNpLmgiCisjaW5jbHVkZSAiaW50ZWxfZnJvbnRidWZmZXIu aCIKKworI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fY2xmbHVzaC5o IgorI2luY2x1ZGUgImk5MTVfcmVzZXQuaCIKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisKIC8q IFByaW1hcnkgcGxhbmUgZm9ybWF0cyBmb3IgZ2VuIDw9IDMgKi8KIHN0YXRpYyBjb25zdCB1aW50 MzJfdCBpOHh4X3ByaW1hcnlfZm9ybWF0c1tdID0gewogCURSTV9GT1JNQVRfQzgsCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2VuZ2luZV9jcy5jCmluZGV4IGJmNGRhZTI2NDlhYi4uOWM5NDNiYjk1 Y2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYwpAQCAtMjUsNiArMjUs NyBAQAogI2luY2x1ZGUgPGRybS9kcm1fcHJpbnQuaD4KIAogI2luY2x1ZGUgImk5MTVfZHJ2Lmgi CisjaW5jbHVkZSAiaTkxNV9yZXNldC5oIgogI2luY2x1ZGUgImludGVsX3JpbmdidWZmZXIuaCIK ICNpbmNsdWRlICJpbnRlbF9scmMuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZ3VjLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9ndWMuaAppbmRleCAw ZjFjNGY5ZWJmZDguLjc0NDIyMDI5NjY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZ3VjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKQEAg LTE5Miw0ICsxOTIsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaW50ZWxfZ3VjX2Rpc2FibGVfbXNn KHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTMyIG1hc2spCiAJc3Bpbl91bmxvY2tfaXJxKCZndWMt PmlycV9sb2NrKTsKIH0KIAoraW50IGludGVsX2d1Y19yZXNldF9lbmdpbmUoc3RydWN0IGludGVs X2d1YyAqZ3VjLAorCQkJICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKTsKKwogI2Vu ZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oYW5nY2hlY2suYyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hhbmdjaGVjay5jCmluZGV4IDUxZTllZmVjNTEx Ni4uN2RjMTFmY2IxM2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9o YW5nY2hlY2suYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oYW5nY2hlY2suYwpA QCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgorI2luY2x1ZGUg Imk5MTVfcmVzZXQuaCIKIAogc3RhdGljIGJvb2wgaW5zdGRvbmVfdW5jaGFuZ2VkKHUzMiBjdXJy ZW50X2luc3Rkb25lLCB1MzIgKm9sZF9pbnN0ZG9uZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX3VjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91Yy5j CmluZGV4IDczMWI4MmFmZTYzNi4uZTcxMWViMzI2OGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF91Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Vj LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJpbnRlbF9ndWNfc3VibWlzc2lvbi5oIgog I2luY2x1ZGUgImludGVsX2d1Yy5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAi aTkxNV9yZXNldC5oIgogCiBzdGF0aWMgdm9pZCBndWNfZnJlZV9sb2FkX2Vycl9sb2coc3RydWN0 IGludGVsX2d1YyAqZ3VjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfdW5jb3JlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91bmNvcmUuYwppbmRleCA2 ODFlYTUzMjU4NWUuLmU4OGYwMjUyZDc3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfdW5jb3JlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdW5jb3Jl LmMKQEAgLTE3MTUsMzcyICsxNzE1LDYgQEAgaW50IGk5MTVfcmVnX3JlYWRfaW9jdGwoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBnZW4zX3N0 b3BfZW5naW5lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JY29uc3QgdTMyIGJhc2Ug PSBlbmdpbmUtPm1taW9fYmFzZTsKLQotCWlmIChpbnRlbF9lbmdpbmVfc3RvcF9jcyhlbmdpbmUp KQotCQlEUk1fREVCVUdfRFJJVkVSKCIlczogdGltZWQgb3V0IG9uIFNUT1BfUklOR1xuIiwgZW5n aW5lLT5uYW1lKTsKLQotCUk5MTVfV1JJVEVfRlcoUklOR19IRUFEKGJhc2UpLCBJOTE1X1JFQURf RlcoUklOR19UQUlMKGJhc2UpKSk7Ci0JUE9TVElOR19SRUFEX0ZXKFJJTkdfSEVBRChiYXNlKSk7 IC8qIHBhcmFub2lhICovCi0KLQlJOTE1X1dSSVRFX0ZXKFJJTkdfSEVBRChiYXNlKSwgMCk7Ci0J STkxNV9XUklURV9GVyhSSU5HX1RBSUwoYmFzZSksIDApOwotCVBPU1RJTkdfUkVBRF9GVyhSSU5H X1RBSUwoYmFzZSkpOwotCi0JLyogVGhlIHJpbmcgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgaXMg ZGlzYWJsZWQgKi8KLQlJOTE1X1dSSVRFX0ZXKFJJTkdfQ1RMKGJhc2UpLCAwKTsKLQotCS8qIENo ZWNrIGFjdHMgYXMgYSBwb3N0ICovCi0JaWYgKEk5MTVfUkVBRF9GVyhSSU5HX0hFQUQoYmFzZSkp ICE9IDApCi0JCURSTV9ERUJVR19EUklWRVIoIiVzOiByaW5nIGhlYWQgbm90IHBhcmtlZFxuIiwK LQkJCQkgZW5naW5lLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9zdG9wX2VuZ2luZXMo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICAgICAgdW5zaWduZWQgaW50 IGVuZ2luZV9tYXNrKQotewotCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKLQllbnVt IGludGVsX2VuZ2luZV9pZCBpZDsKLQotCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpIDwgMykKLQkJ cmV0dXJuOwotCi0JZm9yX2VhY2hfZW5naW5lX21hc2tlZChlbmdpbmUsIGRldl9wcml2LCBlbmdp bmVfbWFzaywgaWQpCi0JCWdlbjNfc3RvcF9lbmdpbmUoZW5naW5lKTsKLX0KLQotc3RhdGljIGJv b2wgaTkxNV9pbl9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQl1OCBnZHJzdDsKLQot CXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEk5MTVfR0RSU1QsICZnZHJzdCk7Ci0JcmV0dXJu IGdkcnN0ICYgR1JET01fUkVTRVRfU1RBVFVTOwotfQotCi1zdGF0aWMgaW50IGk5MTVfZG9fcmVz ZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJIHVuc2lnbmVkIGludCBl bmdpbmVfbWFzaywKLQkJCSB1bnNpZ25lZCBpbnQgcmV0cnkpCi17Ci0Jc3RydWN0IHBjaV9kZXYg KnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JaW50IGVycjsKLQotCS8qIEFzc2VydCByZXNl dCBmb3IgYXQgbGVhc3QgMjAgdXNlYywgYW5kIHdhaXQgZm9yIGFja25vd2xlZGdlbWVudC4gKi8K LQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgSTkxNV9HRFJTVCwgR1JET01fUkVTRVRfRU5B QkxFKTsKLQl1c2xlZXBfcmFuZ2UoNTAsIDIwMCk7Ci0JZXJyID0gd2FpdF9mb3IoaTkxNV9pbl9y ZXNldChwZGV2KSwgNTAwKTsKLQotCS8qIENsZWFyIHRoZSByZXNldCByZXF1ZXN0LiAqLwotCXBj aV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBJOTE1X0dEUlNULCAwKTsKLQl1c2xlZXBfcmFuZ2Uo NTAsIDIwMCk7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IHdhaXRfZm9yKCFpOTE1X2luX3Jlc2V0KHBk ZXYpLCA1MDApOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGJvb2wgZzR4X3Jlc2V0X2Nv bXBsZXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXU4IGdkcnN0OwotCi0JcGNpX3JlYWRf Y29uZmlnX2J5dGUocGRldiwgSTkxNV9HRFJTVCwgJmdkcnN0KTsKLQlyZXR1cm4gKGdkcnN0ICYg R1JET01fUkVTRVRfRU5BQkxFKSA9PSAwOwotfQotCi1zdGF0aWMgaW50IGczM19kb19yZXNldChz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQl1bnNpZ25lZCBpbnQgZW5naW5l X21hc2ssCi0JCQl1bnNpZ25lZCBpbnQgcmV0cnkpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYg PSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgSTkx NV9HRFJTVCwgR1JET01fUkVTRVRfRU5BQkxFKTsKLQlyZXR1cm4gd2FpdF9mb3IoZzR4X3Jlc2V0 X2NvbXBsZXRlKHBkZXYpLCA1MDApOwotfQotCi1zdGF0aWMgaW50IGc0eF9kb19yZXNldChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQl1bnNpZ25lZCBpbnQgZW5naW5lX21h c2ssCi0JCQl1bnNpZ25lZCBpbnQgcmV0cnkpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBk ZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JaW50IHJldDsKLQotCS8qIFdhVmNwQ2xrR2F0ZURpc2FibGVG b3JNZWRpYVJlc2V0OmN0ZyxlbGsgKi8KLQlJOTE1X1dSSVRFKFZERUNDTEtfR0FURV9ELAotCQkg ICBJOTE1X1JFQUQoVkRFQ0NMS19HQVRFX0QpIHwgVkNQX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxF KTsKLQlQT1NUSU5HX1JFQUQoVkRFQ0NMS19HQVRFX0QpOwotCi0JcGNpX3dyaXRlX2NvbmZpZ19i eXRlKHBkZXYsIEk5MTVfR0RSU1QsCi0JCQkgICAgICBHUkRPTV9NRURJQSB8IEdSRE9NX1JFU0VU X0VOQUJMRSk7Ci0JcmV0ID0gIHdhaXRfZm9yKGc0eF9yZXNldF9jb21wbGV0ZShwZGV2KSwgNTAw KTsKLQlpZiAocmV0KSB7Ci0JCURSTV9ERUJVR19EUklWRVIoIldhaXQgZm9yIG1lZGlhIHJlc2V0 IGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXBjaV93cml0ZV9jb25maWdfYnl0ZShw ZGV2LCBJOTE1X0dEUlNULAotCQkJICAgICAgR1JET01fUkVOREVSIHwgR1JET01fUkVTRVRfRU5B QkxFKTsKLQlyZXQgPSAgd2FpdF9mb3IoZzR4X3Jlc2V0X2NvbXBsZXRlKHBkZXYpLCA1MDApOwot CWlmIChyZXQpIHsKLQkJRFJNX0RFQlVHX0RSSVZFUigiV2FpdCBmb3IgcmVuZGVyIHJlc2V0IGZh aWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotb3V0OgotCXBjaV93cml0ZV9jb25maWdfYnl0 ZShwZGV2LCBJOTE1X0dEUlNULCAwKTsKLQotCUk5MTVfV1JJVEUoVkRFQ0NMS19HQVRFX0QsCi0J CSAgIEk5MTVfUkVBRChWREVDQ0xLX0dBVEVfRCkgJiB+VkNQX1VOSVRfQ0xPQ0tfR0FURV9ESVNB QkxFKTsKLQlQT1NUSU5HX1JFQUQoVkRFQ0NMS19HQVRFX0QpOwotCi0JcmV0dXJuIHJldDsKLX0K LQotc3RhdGljIGludCBpcm9ubGFrZV9kb19yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYsCi0JCQkgICAgIHVuc2lnbmVkIGludCBlbmdpbmVfbWFzaywKLQkJCSAgICAgdW5z aWduZWQgaW50IHJldHJ5KQotewotCWludCByZXQ7Ci0KLQlJOTE1X1dSSVRFKElMS19HRFNSLCBJ TEtfR1JET01fUkVOREVSIHwgSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSk7Ci0JcmV0ID0gaW50ZWxf d2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYsCi0JCQkJICAgICAgSUxLX0dEU1IsIElMS19HUkRP TV9SRVNFVF9FTkFCTEUsIDAsCi0JCQkJICAgICAgNTAwKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9E RUJVR19EUklWRVIoIldhaXQgZm9yIHJlbmRlciByZXNldCBmYWlsZWRcbiIpOwotCQlnb3RvIG91 dDsKLQl9Ci0KLQlJOTE1X1dSSVRFKElMS19HRFNSLCBJTEtfR1JET01fTUVESUEgfCBJTEtfR1JE T01fUkVTRVRfRU5BQkxFKTsKLQlyZXQgPSBpbnRlbF93YWl0X2Zvcl9yZWdpc3RlcihkZXZfcHJp diwKLQkJCQkgICAgICBJTEtfR0RTUiwgSUxLX0dSRE9NX1JFU0VUX0VOQUJMRSwgMCwKLQkJCQkg ICAgICA1MDApOwotCWlmIChyZXQpIHsKLQkJRFJNX0RFQlVHX0RSSVZFUigiV2FpdCBmb3IgbWVk aWEgcmVzZXQgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0JSTkxNV9XUklU RShJTEtfR0RTUiwgMCk7Ci0JUE9TVElOR19SRUFEKElMS19HRFNSKTsKLQlyZXR1cm4gcmV0Owot fQotCi0vKiBSZXNldCB0aGUgaGFyZHdhcmUgZG9tYWlucyAoR0VOWF9HUkRPTV8qKSBzcGVjaWZp ZWQgYnkgbWFzayAqLwotc3RhdGljIGludCBnZW42X2h3X2RvbWFpbl9yZXNldChzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJdTMyIGh3X2RvbWFpbl9tYXNrKQotewotCWlu dCBlcnI7Ci0KLQkvKiBHRU42X0dEUlNUIGlzIG5vdCBpbiB0aGUgZ3QgcG93ZXIgd2VsbCwgbm8g bmVlZCB0byBjaGVjawotCSAqIGZvciBmaWZvIHNwYWNlIGZvciB0aGUgd3JpdGUgb3IgZm9yY2V3 YWtlIHRoZSBjaGlwIGZvcgotCSAqIHRoZSByZWFkCi0JICovCi0JX19yYXdfaTkxNV93cml0ZTMy KGRldl9wcml2LCBHRU42X0dEUlNULCBod19kb21haW5fbWFzayk7Ci0KLQkvKiBXYWl0IGZvciB0 aGUgZGV2aWNlIHRvIGFjayB0aGUgcmVzZXQgcmVxdWVzdHMgKi8KLQllcnIgPSBfX2ludGVsX3dh aXRfZm9yX3JlZ2lzdGVyX2Z3KGRldl9wcml2LAotCQkJCQkgICBHRU42X0dEUlNULCBod19kb21h aW5fbWFzaywgMCwKLQkJCQkJICAgNTAwLCAwLAotCQkJCQkgICBOVUxMKTsKLQlpZiAoZXJyKQot CQlEUk1fREVCVUdfRFJJVkVSKCJXYWl0IGZvciAweCUwOHggZW5naW5lcyByZXNldCBmYWlsZWRc biIsCi0JCQkJIGh3X2RvbWFpbl9tYXNrKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICog Z2VuNl9yZXNldF9lbmdpbmVzIC0gcmVzZXQgaW5kaXZpZHVhbCBlbmdpbmVzCi0gKiBAZGV2X3By aXY6IGk5MTUgZGV2aWNlCi0gKiBAZW5naW5lX21hc2s6IG1hc2sgb2YgaW50ZWxfcmluZ19mbGFn KCkgZW5naW5lcyBvciBBTExfRU5HSU5FUyBmb3IgZnVsbCByZXNldAotICogQHJldHJ5OiB0aGUg Y291bnQgb2Ygb2YgcHJldmlvdXMgYXR0ZW1wdHMgdG8gcmVzZXQuCi0gKgotICogVGhpcyBmdW5j dGlvbiB3aWxsIHJlc2V0IHRoZSBpbmRpdmlkdWFsIGVuZ2luZXMgdGhhdCBhcmUgc2V0IGluIGVu Z2luZV9tYXNrLgotICogSWYgeW91IHByb3ZpZGUgQUxMX0VOR0lORVMgYXMgbWFzaywgZnVsbCBn bG9iYWwgZG9tYWluIHJlc2V0IHdpbGwgYmUgaXNzdWVkLgotICoKLSAqIE5vdGU6IEl0IGlzIHJl c3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gaGFuZGxlIHRoZSBkaWZmZXJlbmNlIGJldHdl ZW4KLSAqIGFza2luZyBmdWxsIGRvbWFpbiByZXNldCB2ZXJzdXMgcmVzZXQgZm9yIGFsbCBhdmFp bGFibGUgaW5kaXZpZHVhbCBlbmdpbmVzLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBu b256ZXJvIG9uIGVycm9yLgotICovCi1zdGF0aWMgaW50IGdlbjZfcmVzZXRfZW5naW5lcyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgZW5n aW5lX21hc2ssCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgcmV0cnkpCi17Ci0Jc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lOwotCWNvbnN0IHUzMiBod19lbmdpbmVfbWFza1tJOTE1X05VTV9F TkdJTkVTXSA9IHsKLQkJW1JDU10gPSBHRU42X0dSRE9NX1JFTkRFUiwKLQkJW0JDU10gPSBHRU42 X0dSRE9NX0JMVCwKLQkJW1ZDU10gPSBHRU42X0dSRE9NX01FRElBLAotCQlbVkNTMl0gPSBHRU44 X0dSRE9NX01FRElBMiwKLQkJW1ZFQ1NdID0gR0VONl9HUkRPTV9WRUNTLAotCX07Ci0JdTMyIGh3 X21hc2s7Ci0KLQlpZiAoZW5naW5lX21hc2sgPT0gQUxMX0VOR0lORVMpIHsKLQkJaHdfbWFzayA9 IEdFTjZfR1JET01fRlVMTDsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgdG1wOwotCi0JCWh3 X21hc2sgPSAwOwotCQlmb3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgZGV2X3ByaXYsIGVu Z2luZV9tYXNrLCB0bXApCi0JCQlod19tYXNrIHw9IGh3X2VuZ2luZV9tYXNrW2VuZ2luZS0+aWRd OwotCX0KLQotCXJldHVybiBnZW42X2h3X2RvbWFpbl9yZXNldChkZXZfcHJpdiwgaHdfbWFzayk7 Ci19Ci0KLXN0YXRpYyB1MzIgZ2VuMTFfbG9ja19zZmMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2LAotCQkJICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0JdTgg dmRib3hfc2ZjX2FjY2VzcyA9IFJVTlRJTUVfSU5GTyhkZXZfcHJpdiktPnZkYm94X3NmY19hY2Nl c3M7Ci0JaTkxNV9yZWdfdCBzZmNfZm9yY2VkX2xvY2ssIHNmY19mb3JjZWRfbG9ja19hY2s7Ci0J dTMyIHNmY19mb3JjZWRfbG9ja19iaXQsIHNmY19mb3JjZWRfbG9ja19hY2tfYml0OwotCWk5MTVf cmVnX3Qgc2ZjX3VzYWdlOwotCXUzMiBzZmNfdXNhZ2VfYml0OwotCXUzMiBzZmNfcmVzZXRfYml0 OwotCi0Jc3dpdGNoIChlbmdpbmUtPmNsYXNzKSB7Ci0JY2FzZSBWSURFT19ERUNPREVfQ0xBU1M6 Ci0JCWlmICgoQklUKGVuZ2luZS0+aW5zdGFuY2UpICYgdmRib3hfc2ZjX2FjY2VzcykgPT0gMCkK LQkJCXJldHVybiAwOwotCi0JCXNmY19mb3JjZWRfbG9jayA9IEdFTjExX1ZDU19TRkNfRk9SQ0VE X0xPQ0soZW5naW5lKTsKLQkJc2ZjX2ZvcmNlZF9sb2NrX2JpdCA9IEdFTjExX1ZDU19TRkNfRk9S Q0VEX0xPQ0tfQklUOwotCi0JCXNmY19mb3JjZWRfbG9ja19hY2sgPSBHRU4xMV9WQ1NfU0ZDX0xP Q0tfU1RBVFVTKGVuZ2luZSk7Ci0JCXNmY19mb3JjZWRfbG9ja19hY2tfYml0ICA9IEdFTjExX1ZD U19TRkNfTE9DS19BQ0tfQklUOwotCi0JCXNmY191c2FnZSA9IEdFTjExX1ZDU19TRkNfTE9DS19T VEFUVVMoZW5naW5lKTsKLQkJc2ZjX3VzYWdlX2JpdCA9IEdFTjExX1ZDU19TRkNfVVNBR0VfQklU OwotCQlzZmNfcmVzZXRfYml0ID0gR0VOMTFfVkNTX1NGQ19SRVNFVF9CSVQoZW5naW5lLT5pbnN0 YW5jZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBWSURFT19FTkhBTkNFTUVOVF9DTEFTUzoKLQkJc2Zj X2ZvcmNlZF9sb2NrID0gR0VOMTFfVkVDU19TRkNfRk9SQ0VEX0xPQ0soZW5naW5lKTsKLQkJc2Zj X2ZvcmNlZF9sb2NrX2JpdCA9IEdFTjExX1ZFQ1NfU0ZDX0ZPUkNFRF9MT0NLX0JJVDsKLQotCQlz ZmNfZm9yY2VkX2xvY2tfYWNrID0gR0VOMTFfVkVDU19TRkNfTE9DS19BQ0soZW5naW5lKTsKLQkJ c2ZjX2ZvcmNlZF9sb2NrX2Fja19iaXQgID0gR0VOMTFfVkVDU19TRkNfTE9DS19BQ0tfQklUOwot Ci0JCXNmY191c2FnZSA9IEdFTjExX1ZFQ1NfU0ZDX1VTQUdFKGVuZ2luZSk7Ci0JCXNmY191c2Fn ZV9iaXQgPSBHRU4xMV9WRUNTX1NGQ19VU0FHRV9CSVQ7Ci0JCXNmY19yZXNldF9iaXQgPSBHRU4x MV9WRUNTX1NGQ19SRVNFVF9CSVQoZW5naW5lLT5pbnN0YW5jZSk7Ci0JCWJyZWFrOwotCi0JZGVm YXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBUZWxsIHRoZSBlbmdpbmUgdGhhdCBh IHNvZnR3YXJlIHJlc2V0IGlzIGdvaW5nIHRvIGhhcHBlbi4gVGhlIGVuZ2luZQotCSAqIHdpbGwg dGhlbiB0cnkgdG8gZm9yY2UgbG9jayB0aGUgU0ZDIChpZiBjdXJyZW50bHkgbG9ja2VkLCBpdCB3 aWxsCi0JICogcmVtYWluIHNvIHVudGlsIHdlIHRlbGwgdGhlIGVuZ2luZSBpdCBpcyBzYWZlIHRv IHVubG9jazsgaWYgY3VycmVudGx5Ci0JICogdW5sb2NrZWQsIGl0IHdpbGwgaWdub3JlIHRoaXMg YW5kIGFsbCBuZXcgbG9jayByZXF1ZXN0cykuIElmIFNGQwotCSAqIGVuZHMgdXAgYmVpbmcgbG9j a2VkIHRvIHRoZSBlbmdpbmUgd2Ugd2FudCB0byByZXNldCwgd2UgaGF2ZSB0byByZXNldAotCSAq IGl0IGFzIHdlbGwgKHdlIHdpbGwgdW5sb2NrIGl0IG9uY2UgdGhlIHJlc2V0IHNlcXVlbmNlIGlz IGNvbXBsZXRlZCkuCi0JICovCi0JSTkxNV9XUklURV9GVyhzZmNfZm9yY2VkX2xvY2ssCi0JCSAg ICAgIEk5MTVfUkVBRF9GVyhzZmNfZm9yY2VkX2xvY2spIHwgc2ZjX2ZvcmNlZF9sb2NrX2JpdCk7 Ci0KLQlpZiAoX19pbnRlbF93YWl0X2Zvcl9yZWdpc3Rlcl9mdyhkZXZfcHJpdiwKLQkJCQkJIHNm Y19mb3JjZWRfbG9ja19hY2ssCi0JCQkJCSBzZmNfZm9yY2VkX2xvY2tfYWNrX2JpdCwKLQkJCQkJ IHNmY19mb3JjZWRfbG9ja19hY2tfYml0LAotCQkJCQkgMTAwMCwgMCwgTlVMTCkpIHsKLQkJRFJN X0RFQlVHX0RSSVZFUigiV2FpdCBmb3IgU0ZDIGZvcmNlZCBsb2NrIGFjayBmYWlsZWRcbiIpOwot CQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoSTkxNV9SRUFEX0ZXKHNmY191c2FnZSkgJiBzZmNfdXNh Z2VfYml0KQotCQlyZXR1cm4gc2ZjX3Jlc2V0X2JpdDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgdm9pZCBnZW4xMV91bmxvY2tfc2ZjKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diwKLQkJCSAgICAgc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXU4IHZkYm94 X3NmY19hY2Nlc3MgPSBSVU5USU1FX0lORk8oZGV2X3ByaXYpLT52ZGJveF9zZmNfYWNjZXNzOwot CWk5MTVfcmVnX3Qgc2ZjX2ZvcmNlZF9sb2NrOwotCXUzMiBzZmNfZm9yY2VkX2xvY2tfYml0Owot Ci0Jc3dpdGNoIChlbmdpbmUtPmNsYXNzKSB7Ci0JY2FzZSBWSURFT19ERUNPREVfQ0xBU1M6Ci0J CWlmICgoQklUKGVuZ2luZS0+aW5zdGFuY2UpICYgdmRib3hfc2ZjX2FjY2VzcykgPT0gMCkKLQkJ CXJldHVybjsKLQotCQlzZmNfZm9yY2VkX2xvY2sgPSBHRU4xMV9WQ1NfU0ZDX0ZPUkNFRF9MT0NL KGVuZ2luZSk7Ci0JCXNmY19mb3JjZWRfbG9ja19iaXQgPSBHRU4xMV9WQ1NfU0ZDX0ZPUkNFRF9M T0NLX0JJVDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJREVPX0VOSEFOQ0VNRU5UX0NMQVNTOgotCQlz ZmNfZm9yY2VkX2xvY2sgPSBHRU4xMV9WRUNTX1NGQ19GT1JDRURfTE9DSyhlbmdpbmUpOwotCQlz ZmNfZm9yY2VkX2xvY2tfYml0ID0gR0VOMTFfVkVDU19TRkNfRk9SQ0VEX0xPQ0tfQklUOwotCQli cmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQlJOTE1X1dSSVRFX0ZXKHNmY19m b3JjZWRfbG9jaywKLQkJICAgICAgSTkxNV9SRUFEX0ZXKHNmY19mb3JjZWRfbG9jaykgJiB+c2Zj X2ZvcmNlZF9sb2NrX2JpdCk7Ci19Ci0KLS8qKgotICogZ2VuMTFfcmVzZXRfZW5naW5lcyAtIHJl c2V0IGluZGl2aWR1YWwgZW5naW5lcwotICogQGRldl9wcml2OiBpOTE1IGRldmljZQotICogQGVu Z2luZV9tYXNrOiBtYXNrIG9mIGludGVsX3JpbmdfZmxhZygpIGVuZ2luZXMgb3IgQUxMX0VOR0lO RVMgZm9yIGZ1bGwgcmVzZXQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXQgdGhlIGlu ZGl2aWR1YWwgZW5naW5lcyB0aGF0IGFyZSBzZXQgaW4gZW5naW5lX21hc2suCi0gKiBJZiB5b3Ug cHJvdmlkZSBBTExfRU5HSU5FUyBhcyBtYXNrLCBmdWxsIGdsb2JhbCBkb21haW4gcmVzZXQgd2ls bCBiZSBpc3N1ZWQuCi0gKgotICogTm90ZTogSXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNh bGxlciB0byBoYW5kbGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICogYXNraW5nIGZ1bGwgZG9t YWluIHJlc2V0IHZlcnN1cyByZXNldCBmb3IgYWxsIGF2YWlsYWJsZSBpbmRpdmlkdWFsIGVuZ2lu ZXMuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCi0gKi8K LXN0YXRpYyBpbnQgZ2VuMTFfcmVzZXRfZW5naW5lcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGVuZ2luZV9tYXNrKQotewotCWNvbnN0 IHUzMiBod19lbmdpbmVfbWFza1tJOTE1X05VTV9FTkdJTkVTXSA9IHsKLQkJW1JDU10gPSBHRU4x MV9HUkRPTV9SRU5ERVIsCi0JCVtCQ1NdID0gR0VOMTFfR1JET01fQkxULAotCQlbVkNTXSA9IEdF TjExX0dSRE9NX01FRElBLAotCQlbVkNTMl0gPSBHRU4xMV9HUkRPTV9NRURJQTIsCi0JCVtWQ1Mz XSA9IEdFTjExX0dSRE9NX01FRElBMywKLQkJW1ZDUzRdID0gR0VOMTFfR1JET01fTUVESUE0LAot CQlbVkVDU10gPSBHRU4xMV9HUkRPTV9WRUNTLAotCQlbVkVDUzJdID0gR0VOMTFfR1JET01fVkVD UzIsCi0JfTsKLQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Ci0JdW5zaWduZWQgaW50 IHRtcDsKLQl1MzIgaHdfbWFzazsKLQlpbnQgcmV0OwotCi0JQlVJTERfQlVHX09OKFZFQ1MyICsg MSAhPSBJOTE1X05VTV9FTkdJTkVTKTsKLQotCWlmIChlbmdpbmVfbWFzayA9PSBBTExfRU5HSU5F UykgewotCQlod19tYXNrID0gR0VOMTFfR1JET01fRlVMTDsKLQl9IGVsc2UgewotCQlod19tYXNr ID0gMDsKLQkJZm9yX2VhY2hfZW5naW5lX21hc2tlZChlbmdpbmUsIGRldl9wcml2LCBlbmdpbmVf bWFzaywgdG1wKSB7Ci0JCQlod19tYXNrIHw9IGh3X2VuZ2luZV9tYXNrW2VuZ2luZS0+aWRdOwot CQkJaHdfbWFzayB8PSBnZW4xMV9sb2NrX3NmYyhkZXZfcHJpdiwgZW5naW5lKTsKLQkJfQotCX0K LQotCXJldCA9IGdlbjZfaHdfZG9tYWluX3Jlc2V0KGRldl9wcml2LCBod19tYXNrKTsKLQotCWlm IChlbmdpbmVfbWFzayAhPSBBTExfRU5HSU5FUykKLQkJZm9yX2VhY2hfZW5naW5lX21hc2tlZChl bmdpbmUsIGRldl9wcml2LCBlbmdpbmVfbWFzaywgdG1wKQotCQkJZ2VuMTFfdW5sb2NrX3NmYyhk ZXZfcHJpdiwgZW5naW5lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKgogICogX19pbnRlbF93 YWl0X2Zvcl9yZWdpc3Rlcl9mdyAtIHdhaXQgdW50aWwgcmVnaXN0ZXIgbWF0Y2hlcyBleHBlY3Rl ZCBzdGF0ZQogICogQGRldl9wcml2OiB0aGUgaTkxNSBkZXZpY2UKQEAgLTIxOTEsMTk2ICsxODI1 LDYgQEAgaW50IF9faW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2LAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZ2VuOF9lbmdpbmVf cmVzZXRfcHJlcGFyZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCWludCByZXQ7Ci0K LQlJOTE1X1dSSVRFX0ZXKFJJTkdfUkVTRVRfQ1RMKGVuZ2luZS0+bW1pb19iYXNlKSwKLQkJICAg ICAgX01BU0tFRF9CSVRfRU5BQkxFKFJFU0VUX0NUTF9SRVFVRVNUX1JFU0VUKSk7Ci0KLQlyZXQg PSBfX2ludGVsX3dhaXRfZm9yX3JlZ2lzdGVyX2Z3KGRldl9wcml2LAotCQkJCQkgICBSSU5HX1JF U0VUX0NUTChlbmdpbmUtPm1taW9fYmFzZSksCi0JCQkJCSAgIFJFU0VUX0NUTF9SRUFEWV9UT19S RVNFVCwKLQkJCQkJICAgUkVTRVRfQ1RMX1JFQURZX1RPX1JFU0VULAotCQkJCQkgICA3MDAsIDAs Ci0JCQkJCSAgIE5VTEwpOwotCWlmIChyZXQpCi0JCURSTV9FUlJPUigiJXM6IHJlc2V0IHJlcXVl c3QgdGltZW91dFxuIiwgZW5naW5lLT5uYW1lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRp YyB2b2lkIGdlbjhfZW5naW5lX3Jlc2V0X2NhbmNlbChzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5p OTE1OwotCi0JSTkxNV9XUklURV9GVyhSSU5HX1JFU0VUX0NUTChlbmdpbmUtPm1taW9fYmFzZSks Ci0JCSAgICAgIF9NQVNLRURfQklUX0RJU0FCTEUoUkVTRVRfQ1RMX1JFUVVFU1RfUkVTRVQpKTsK LX0KLQotc3RhdGljIGludCByZXNldF9lbmdpbmVzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1LAotCQkJIHVuc2lnbmVkIGludCBlbmdpbmVfbWFzaywKLQkJCSB1bnNpZ25lZCBpbnQgcmV0 cnkpCi17Ci0JaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMSkKLQkJcmV0dXJuIGdlbjExX3Jlc2V0 X2VuZ2luZXMoaTkxNSwgZW5naW5lX21hc2spOwotCWVsc2UKLQkJcmV0dXJuIGdlbjZfcmVzZXRf ZW5naW5lcyhpOTE1LCBlbmdpbmVfbWFzaywgcmV0cnkpOwotfQotCi1zdGF0aWMgaW50IGdlbjhf cmVzZXRfZW5naW5lcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkgICAg ICB1bnNpZ25lZCBpbnQgZW5naW5lX21hc2ssCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgcmV0cnkp Ci17Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOwotCWNvbnN0IGJvb2wgcmVzZXRf bm9uX3JlYWR5ID0gcmV0cnkgPj0gMTsKLQl1bnNpZ25lZCBpbnQgdG1wOwotCWludCByZXQ7Ci0K LQlmb3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgZGV2X3ByaXYsIGVuZ2luZV9tYXNrLCB0 bXApIHsKLQkJcmV0ID0gZ2VuOF9lbmdpbmVfcmVzZXRfcHJlcGFyZShlbmdpbmUpOwotCQlpZiAo cmV0ICYmICFyZXNldF9ub25fcmVhZHkpCi0JCQlnb3RvIHNraXBfcmVzZXQ7Ci0KLQkJLyoKLQkJ ICogSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGZhaWxlZCBhdHRlbXB0IHRvIHByZXBhcmUsCi0J CSAqIHdlIGRlY2lkZSB0byBwcm9jZWVkIGFueXdheS4KLQkJICoKLQkJICogQnkgZG9pbmcgc28g d2UgcmlzayBjb250ZXh0IGNvcnJ1cHRpb24gYW5kIHdpdGgKLQkJICogc29tZSBnZW5zIChrYmwp LCBwb3NzaWJsZSBzeXN0ZW0gaGFuZyBpZiByZXNldAotCQkgKiBoYXBwZW5zIGR1cmluZyBhY3Rp dmUgYmIgZXhlY3V0aW9uLgotCQkgKgotCQkgKiBXZSByYXRoZXIgdGFrZSBjb250ZXh0IGNvcnJ1 cHRpb24gaW5zdGVhZCBvZgotCQkgKiBmYWlsZWQgcmVzZXQgd2l0aCBhIHdlZGdlZCBkcml2ZXIv Z3B1LiBBbmQKLQkJICogYWN0aXZlIGJiIGV4ZWN1dGlvbiBjYXNlIHNob3VsZCBiZSBjb3ZlcmVk IGJ5Ci0JCSAqIGk5MTVfc3RvcF9lbmdpbmVzIHdlIGhhdmUgYmVmb3JlIHRoZSByZXNldC4KLQkJ ICovCi0JfQotCi0JcmV0ID0gcmVzZXRfZW5naW5lcyhkZXZfcHJpdiwgZW5naW5lX21hc2ssIHJl dHJ5KTsKLQotc2tpcF9yZXNldDoKLQlmb3JfZWFjaF9lbmdpbmVfbWFza2VkKGVuZ2luZSwgZGV2 X3ByaXYsIGVuZ2luZV9tYXNrLCB0bXApCi0JCWdlbjhfZW5naW5lX3Jlc2V0X2NhbmNlbChlbmdp bmUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdHlwZWRlZiBpbnQgKCpyZXNldF9mdW5jKShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqLAotCQkJICB1bnNpZ25lZCBpbnQgZW5naW5lX21hc2ssIHVu c2lnbmVkIGludCByZXRyeSk7Ci0KLXN0YXRpYyByZXNldF9mdW5jIGludGVsX2dldF9ncHVfcmVz ZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCWlmICghaTkxNV9tb2Rw YXJhbXMucmVzZXQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKElOVEVMX0dFTihkZXZfcHJpdikg Pj0gOCkKLQkJcmV0dXJuIGdlbjhfcmVzZXRfZW5naW5lczsKLQllbHNlIGlmIChJTlRFTF9HRU4o ZGV2X3ByaXYpID49IDYpCi0JCXJldHVybiBnZW42X3Jlc2V0X2VuZ2luZXM7Ci0JZWxzZSBpZiAo SVNfR0VOKGRldl9wcml2LCA1KSkKLQkJcmV0dXJuIGlyb25sYWtlX2RvX3Jlc2V0OwotCWVsc2Ug aWYgKElTX0c0WChkZXZfcHJpdikpCi0JCXJldHVybiBnNHhfZG9fcmVzZXQ7Ci0JZWxzZSBpZiAo SVNfRzMzKGRldl9wcml2KSB8fCBJU19QSU5FVklFVyhkZXZfcHJpdikpCi0JCXJldHVybiBnMzNf ZG9fcmVzZXQ7Ci0JZWxzZSBpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSAzKQotCQlyZXR1cm4g aTkxNV9kb19yZXNldDsKLQllbHNlCi0JCXJldHVybiBOVUxMOwotfQotCi1pbnQgaW50ZWxfZ3B1 X3Jlc2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJICAgIGNvbnN0IHVu c2lnbmVkIGludCBlbmdpbmVfbWFzaykKLXsKLQlyZXNldF9mdW5jIHJlc2V0ID0gaW50ZWxfZ2V0 X2dwdV9yZXNldChkZXZfcHJpdik7Ci0JdW5zaWduZWQgaW50IHJldHJ5OwotCWludCByZXQ7Ci0K LQlHRU1fQlVHX09OKCFlbmdpbmVfbWFzayk7Ci0KLQkvKgotCSAqIFdlIHdhbnQgdG8gcGVyZm9y bSBwZXItZW5naW5lIHJlc2V0IGZyb20gYXRvbWljIGNvbnRleHQgKGUuZy4KLQkgKiBzb2Z0aXJx KSwgd2hpY2ggaW1wb3NlcyB0aGUgY29uc3RyYWludCB0aGF0IHdlIGNhbm5vdCBzbGVlcC4KLQkg KiBIb3dldmVyLCBleHBlcmllbmNlIHN1Z2dlc3RzIHRoYXQgc3BlbmRpbmcgYSBiaXQgb2YgdGlt ZSB3YWl0aW5nCi0JICogZm9yIGEgcmVzZXQgaGVscHMgaW4gdmFyaW91cyBjYXNlcywgc28gZm9y IGEgZnVsbC1kZXZpY2UgcmVzZXQKLQkgKiB3ZSBhcHBseSB0aGUgb3Bwb3NpdGUgcnVsZSBhbmQg d2FpdCBpZiB3ZSB3YW50IHRvLiBBcyB3ZSBzaG91bGQKLQkgKiBhbHdheXMgZm9sbG93IHVwIGEg ZmFpbGVkIHBlci1lbmdpbmUgcmVzZXQgd2l0aCBhIGZ1bGwgZGV2aWNlIHJlc2V0LAotCSAqIGJl aW5nIGEgbGl0dGxlIGZhc3Rlciwgc3RyaWN0ZXIgYW5kIG1vcmUgZXJyb3IgcHJvbmUgZm9yIHRo ZQotCSAqIGF0b21pYyBjYXNlIHNlZW1zIGFuIGFjY2VwdGFibGUgY29tcHJvbWlzZS4KLQkgKgot CSAqIFVuZm9ydHVuYXRlbHkgdGhpcyBsZWFkcyB0byBhIGJpbW9kYWwgcm91dGluZSwgd2hlbiB0 aGUgZ29hbCB3YXMKLQkgKiB0byBoYXZlIGEgc2luZ2xlIHJlc2V0IGZ1bmN0aW9uIHRoYXQgd29y a2VkIGZvciByZXNldHRpbmcgYW55Ci0JICogbnVtYmVyIG9mIGVuZ2luZXMgc2ltdWx0YW5lb3Vz bHkuCi0JICovCi0JbWlnaHRfc2xlZXBfaWYoZW5naW5lX21hc2sgPT0gQUxMX0VOR0lORVMpOwot Ci0JLyoKLQkgKiBJZiB0aGUgcG93ZXIgd2VsbCBzbGVlcHMgZHVyaW5nIHRoZSByZXNldCwgdGhl IHJlc2V0Ci0JICogcmVxdWVzdCBtYXkgYmUgZHJvcHBlZCBhbmQgbmV2ZXIgY29tcGxldGVzIChj YXVzaW5nIC1FSU8pLgotCSAqLwotCWludGVsX3VuY29yZV9mb3JjZXdha2VfZ2V0KGRldl9wcml2 LCBGT1JDRVdBS0VfQUxMKTsKLQlmb3IgKHJldHJ5ID0gMDsgcmV0cnkgPCAzOyByZXRyeSsrKSB7 Ci0KLQkJLyoKLQkJICogV2Ugc3RvcCBlbmdpbmVzLCBvdGhlcndpc2Ugd2UgbWlnaHQgZ2V0IGZh aWxlZCByZXNldCBhbmQgYQotCQkgKiBkZWFkIGdwdSAob24gZWxrKS4gQWxzbyBhcyBtb2Rlcm4g Z3B1IGFzIGtibCBjYW4gc3VmZmVyCi0JCSAqIGZyb20gc3lzdGVtIGhhbmcgaWYgYmF0Y2hidWZm ZXIgaXMgcHJvZ3Jlc3Npbmcgd2hlbgotCQkgKiB0aGUgcmVzZXQgaXMgaXNzdWVkLCByZWdhcmRs ZXNzIG9mIFJFQURZX1RPX1JFU0VUIGFjay4KLQkJICogVGh1cyBhc3N1bWUgaXQgaXMgYmVzdCB0 byBzdG9wIGVuZ2luZXMgb24gYWxsIGdlbnMKLQkJICogd2hlcmUgd2UgaGF2ZSBhIGdwdSByZXNl dC4KLQkJICoKLQkJICogV2FLQkxWRUNTU2VtYXBob3JlV2FpdFBvbGw6a2JsIChvbiBBTExfRU5H SU5FUykKLQkJICoKLQkJICogV2FNZWRpYVJlc2V0TWFpblJpbmdDbGVhbnVwOmN0ZyxlbGsgKHBy ZXN1bWFibHkpCi0JCSAqCi0JCSAqIEZJWE1FOiBXYSBmb3IgbW9yZSBtb2Rlcm4gZ2VucyBuZWVk cyB0byBiZSB2YWxpZGF0ZWQKLQkJICovCi0JCWk5MTVfc3RvcF9lbmdpbmVzKGRldl9wcml2LCBl bmdpbmVfbWFzayk7Ci0KLQkJcmV0ID0gLUVOT0RFVjsKLQkJaWYgKHJlc2V0KSB7Ci0JCQlyZXQg PSByZXNldChkZXZfcHJpdiwgZW5naW5lX21hc2ssIHJldHJ5KTsKLQkJCUdFTV9UUkFDRSgiZW5n aW5lX21hc2s9JXgsIHJldD0lZCwgcmV0cnk9JWRcbiIsCi0JCQkJICBlbmdpbmVfbWFzaywgcmV0 LCByZXRyeSk7Ci0JCX0KLQkJaWYgKHJldCAhPSAtRVRJTUVET1VUIHx8IGVuZ2luZV9tYXNrICE9 IEFMTF9FTkdJTkVTKQotCQkJYnJlYWs7Ci0KLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotCWludGVs X3VuY29yZV9mb3JjZXdha2VfcHV0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKLQotCXJldHVy biByZXQ7Ci19Ci0KLWJvb2wgaW50ZWxfaGFzX2dwdV9yZXNldChzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0dXJuIGludGVsX2dldF9ncHVfcmVzZXQoZGV2X3ByaXYp ICE9IE5VTEw7Ci19Ci0KLWJvb2wgaW50ZWxfaGFzX3Jlc2V0X2VuZ2luZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0dXJuIChJTlRFTF9JTkZPKGRldl9wcml2KS0+ aGFzX3Jlc2V0X2VuZ2luZSAmJgotCQlpOTE1X21vZHBhcmFtcy5yZXNldCA+PSAyKTsKLX0KLQot aW50IGludGVsX3Jlc2V0X2d1YyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17 Ci0JdTMyIGd1Y19kb21haW4gPSBJTlRFTF9HRU4oZGV2X3ByaXYpID49IDExID8gR0VOMTFfR1JE T01fR1VDIDoKLQkJCQkJCSAgICAgR0VOOV9HUkRPTV9HVUM7Ci0JaW50IHJldDsKLQotCUdFTV9C VUdfT04oIUhBU19HVUMoZGV2X3ByaXYpKTsKLQotCWludGVsX3VuY29yZV9mb3JjZXdha2VfZ2V0 KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKLQlyZXQgPSBnZW42X2h3X2RvbWFpbl9yZXNldChk ZXZfcHJpdiwgZ3VjX2RvbWFpbik7Ci0JaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9wdXQoZGV2X3By aXYsIEZPUkNFV0FLRV9BTEwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogYm9vbCBpbnRlbF91bmNv cmVfdW5jbGFpbWVkX21taW8oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewog CXJldHVybiBjaGVja19mb3JfdW5jbGFpbWVkX21taW8oZGV2X3ByaXYpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2ludGVsX2xyYy5jIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2ludGVsX2xyYy5jCmluZGV4IGU2MDczY2Q0NzE5Yy4uMmIyZWNk NzZjMmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaW50ZWxf bHJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2ludGVsX2xyYy5jCkBA IC00LDYgKzQsOCBAQAogICogQ29weXJpZ2h0IMKpIDIwMTggSW50ZWwgQ29ycG9yYXRpb24KICAq LwogCisjaW5jbHVkZSAiLi4vaTkxNV9yZXNldC5oIgorCiAjaW5jbHVkZSAiLi4vaTkxNV9zZWxm dGVzdC5oIgogI2luY2x1ZGUgImlndF9mbHVzaF90ZXN0LmgiCiAjaW5jbHVkZSAiaWd0X3NwaW5u ZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF93 b3JrYXJvdW5kcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2ludGVsX3dvcmth cm91bmRzLmMKaW5kZXggOTAwOWQ3YjhiMTM2Li5hOGNhYzU2YmU4MzUgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF93b3JrYXJvdW5kcy5jCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pbnRlbF93b3JrYXJvdW5kcy5jCkBAIC01LDYg KzUsNyBAQAogICovCiAKICNpbmNsdWRlICIuLi9pOTE1X3NlbGZ0ZXN0LmgiCisjaW5jbHVkZSAi Li4vaTkxNV9yZXNldC5oIgogCiAjaW5jbHVkZSAiaWd0X2ZsdXNoX3Rlc3QuaCIKICNpbmNsdWRl ICJpZ3RfcmVzZXQuaCIKLS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vaW50ZWwtZ2Z4Cg==