From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eliezer Tamir" Subject: [PATCH 2/8][BNX2X] resubmit as attachments: bnx2x.c Date: Mon, 08 Oct 2007 18:15:45 +0200 Message-ID: <470A57B1.4080707@broadcom.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=------------030701000702050305070806 To: davem@davemloft.net, jeff@garzik.org, "netdev@vger.kernel.org" , "Michael Chan" Return-path: Received: from mms2.broadcom.com ([216.31.210.18]:1493 "EHLO mms2.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752085AbXJHQO3 (ORCPT ); Mon, 8 Oct 2007 12:14:29 -0400 Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org This is a multi-part message in MIME format. --------------030701000702050305070806 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit bnx2x.c - main .c file --------------030701000702050305070806 Content-Type: text/plain; name=0002-add-bnx2x.c.txt Content-Transfer-Encoding: base64 Content-Disposition: inline; filename=0002-add-bnx2x.c.txt RnJvbSA5NjdjZWExYzg4ZDIyOTc3NmRhNWEzYTc4Y2RjN2FjODJmMTE5NmE3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFbGllemVyIFRhbWlyIDxlbGllemVydEBicm9hZGNv bS5jb20+CkRhdGU6IE1vbiwgOCBPY3QgMjAwNyAxMTo1MzoxMiArMDIwMApTdWJqZWN0OiBb UEFUQ0ggMi84XSBhZGQgYm54MnguYwoKU2lnbmVkLW9mZi1ieTogRWxpZXplciBUYW1pciA8 ZWxpZXplcnRAYnJvYWRjb20uY29tPgotLS0KIGRyaXZlcnMvbmV0L2JueDJ4LmMgfCA4ODc5 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog MSBmaWxlcyBjaGFuZ2VkLCA4ODc5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCgpk aWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MnguYyBiL2RyaXZlcnMvbmV0L2JueDJ4LmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyMjNkMAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4LmMKQEAgLTAsMCArMSw4ODc5IEBACisvKiBi bngyeC5jOiBCcm9hZGNvbSBFdmVyZXN0IG5ldHdvcmsgZHJpdmVyLgorICoKKyAqIENvcHly aWdodCAoYykgMjAwNyBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bi4KKyAqCisgKiBXcml0dGVuIGJ5OiBFbGllemVyIFRhbWlyIDxlbGllemVydEBicm9hZGNv bS5jb20+CisgKiBCYXNlZCBvbiBjb2RlIGZyb20gTWljaGFlbCBDaGFuJ3MgYm54MiBkcml2 ZXIKKyAqIFVEUCBDU1VNIGVycmF0YSB3b3JrYXJvdW5kIGJ5IEFyaWsgR2VuZGVsbWFuCisg KiBTbG93cGF0aCByZXdvcmsgYnkgVmxhZGlzbGF2IFpvbG90YXJvdgorICogU3RhdGlzdGlj cyBhbmQgTGluayBtYW5hZ21lbnQgYnkgWWl0Y2hhayBHZXJ0bmVyCisgKgorICovCisKKy8q IGRlZmluZSB0aGlzIHRvIG1ha2UgdGhlIGRyaXZlciBmcmVlemUgb24gZXJyb3IKKyAqIC1m b3Igbm93IHRoaXMgaXMgdGhlIGRlZnVhbHQuCisgKi8KKyNkZWZpbmUgQk5YMlhfU1RPUF9P Tl9FUlJPUgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgv bW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxs aW51eC9kZXZpY2UuaD4gIC8qIGZvciBkZXZfaW5mbygpICovCisjaW5jbHVkZSA8bGludXgv dGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lv cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFs bG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgv cGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRl dmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlu dXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRl IDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxp bnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2J5 dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9l dGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaWZkZWYgTkVUSUZfRl9IV19W TEFOX1RYCisJI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKwkjZGVmaW5lIEJDTV9WTEFO IDEKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4K KyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUu aD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNo Lmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjaW5jbHVkZSAiYm54MnhfaHNpLmgi CisjaW5jbHVkZSAiYm54MnguaCIKKyNpbmNsdWRlICJibngyeF9pbml0LmgiCisjaW5jbHVk ZSAiYm54Mnhfc2VsZl90ZXN0LmgiCisKKworI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04J IjAuNDAuMTAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiJERhdGVUaW1lOiAyMDA3 LzA5LzI0IDA4OjU2OjM2ICQiCisjZGVmaW5lIEJOWDJYX0JDX1ZFUgkJMHgwNDAwMDQKKwor LyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBp cyBodW5nLiAqLworI2RlZmluZSBUWF9USU1FT1VUCQkoNSpIWikKKworc3RhdGljIGNvbnN0 IGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQorCSJCcm9hZGNvbSBOZXRYdHJlbWUg SUkgNTc3eHggMTBHaWdhYml0IEV0aGVybmV0IERyaXZlciAiCisJRFJWX01PRFVMRV9OQU1F ICIgIiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7 CisKK01PRFVMRV9BVVRIT1IoIkVsaWV6ZXIgVGFtaXIgPGVsaWV6ZXJ0QGJyb2FkY29tLmNv bT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gTmV0WHRyZW1lIElJIEJDTTU3 NzEwIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04o RFJWX01PRFVMRV9WRVJTSU9OKTsKK01PRFVMRV9JTkZPKGN2c192ZXJzaW9uLCAiJFJldmlz aW9uOiAjMzAyICQiKTsKKworc3RhdGljIGludCB1c2VfaW50YTsKK3N0YXRpYyBpbnQgcG9s bDsKK3N0YXRpYyBpbnQgb25lZnVuYzsKK3N0YXRpYyBpbnQgbm9tY3A7CitzdGF0aWMgaW50 IGRlYnVnOworbW9kdWxlX3BhcmFtKHVzZV9pbnRhLCBpbnQsIDApOworbW9kdWxlX3BhcmFt KHBvbGwsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob25lZnVuYywgaW50LCAwKTsKK21vZHVs ZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0ModXNlX2ludGEsICJ1 c2UgSU5UI0EgaW5zdGVhZCBvZiBNU0ktWCIpOworTU9EVUxFX1BBUk1fREVTQyhwb2xsLCAi dXNlIHBvbGxpbmcgKGZvciBkZWJ1ZykiKTsKK01PRFVMRV9QQVJNX0RFU0Mob25lZnVuYywg ImVuYWJsZSBvbmx5IGZpcnN0IGZ1bmN0aW9uIik7CitNT0RVTEVfUEFSTV9ERVNDKG5vbWNw LCAiaWdub3JlIG1hbmFnbWVudCBDUFUgKEltcGxpZXMgb25lZnVuYykiKTsKK01PRFVMRV9Q QVJNX0RFU0MoZGVidWcsICJkZWZ1YWx0IGRlYnVnIG1zZ2xldmVsIik7CisKK2VudW0gYm54 MnhfYm9hcmRfdHlwZXsKKwlCQ001NzcxMCA9IDAsCit9OworCisvKiBpbmRleGVkIGJ5IGJv YXJkX3QsIGFib3ZlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljaGFyICpuYW1lOwor fSBib2FyZF9pbmZvW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7ICJCcm9hZGNvbSBOZXRYdHJl bWUgSUkgQkNNNTc3MTAgWEdiIiB9LAorfTsKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX05Y Ml81NzcxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05YMl81NzcxMAkJMHgxNjRlCisjZW5k aWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJueDJ4X3BjaV90Ymxb XSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQlJPQURDT00sIFBDSV9ERVZJQ0VfSURfTlgyXzU3 NzEwLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBCQ001NzcxMCB9LAorCXsg MCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYm54MnhfcGNpX3RibCk7CisK Ky8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMK KyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRvZXMgbm90IG5lZWQgbG9ja2luZyBz aW5jZSBpdCBpcyB1c2VkIG9ubHkgYXQgaW5pdCAqLworc3RhdGljIHZvaWQgYm54MnhfcmVn X3dyX2luZChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwlwY2lf d3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FERFJFU1MsIGFkZHIp OworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFBDSUNGR19HUkNfREFUQSwg dmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0FE RFJFU1MsCisJCQkgICAgICAgUENJQ0ZHX1ZFTkRPUl9JRF9PRkZTRVQpOworfQorCisjaWZk ZWYgQk5YMlhfSU5EX1JECitzdGF0aWMgdTMyIGJueDJ4X3JlZ19yZF9pbmQoc3RydWN0IGJu eDJ4ICpicCwgdTMyIGFkZHIpCit7CisJdTMyIHZhbDsKKworCXBjaV93cml0ZV9jb25maWdf ZHdvcmQoYnAtPnBkZXYsIFBDSUNGR19HUkNfQUREUkVTUywgYWRkcik7CisJcGNpX3JlYWRf Y29uZmlnX2R3b3JkKGJwLT5wZGV2LCBQQ0lDRkdfR1JDX0RBVEEsICZ2YWwpOworCXBjaV93 cml0ZV9jb25maWdfZHdvcmQoYnAtPnBkZXYsIFBDSUNGR19HUkNfQUREUkVTUywKKwkJCSAg ICAgICBQQ0lDRkdfVkVORE9SX0lEX09GRlNFVCk7CisKKwlyZXR1cm4gdmFsOworfQorI2Vu ZGlmCisKKy8qIGNvcHkgY29tbWFuZCBpbnRvIERNQUUgY29tbWFuZCBtZW1vcnkgKi8KK3N0 YXRpYyB2b2lkIGJueDJ4X3Bvc3RfZG1hZShzdHJ1Y3QgYm54MnggKmJwLCBpbnQgaWR4KQor eworCXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPmRtYWU7CisJdTMyIGNtZF9v ZmZzZXQ7CisJaW50IGk7CisKKwljbWRfb2Zmc2V0ID0gKERNQUVfUkVHSVNURVJTX0NNRF9N RU0gKworCQkgICAgICBzaXplb2Yoc3RydWN0IGRtYWVfY29tbWFuZCkgKiBpZHgpOworCWZv ciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBkbWFlX2NvbW1hbmQpLzQpOyBpKyspIHsK KwkJUkVHX1dSMzIoYnAsIEdSQ0JBU0VfRE1BRSwgY21kX29mZnNldCArIGkqNCwKKwkJCSAq KCgodTMyICopZG1hZSkgKyBpKSk7CisKKy8qCQlEUChORVRJRl9NU0dfRE1BRSwgIkRNQUUg Y21kWyVkXS4lZCAoMHglMDh4KSA6IDB4JTA4eFxuIiwKKwkJICAgaWR4LCBpLCBjbWRfb2Zm c2V0ICsgaSo0LCAqKCgodTMyICopZG1hZSkgKyBpKSk7ICovCisJfQorfQorCisvKiBETUFF IGNvbW1hbmQgcG9zaXRpb25zIHVzZWQKKyAqIFBvcnQwIDE0CisgKiBQb3J0MSAxNQorICov CitzdGF0aWMgdm9pZCBibngyeF93cml0ZV9kbWFlKHN0cnVjdCBibngyeCAqYnAsIGRtYV9h ZGRyX3QgZG1hX2FkZHIsCisJCQkgICAgIHUzMiB3Yl9hZGRyLCB1MzIgd2JfbGVuKQorewor CXN0cnVjdCBkbWFlX2NvbW1hbmQgKmRtYWUgPSAmYnAtPmRtYWU7CisJaW50IHBvcnQgPSBi cC0+cG9ydDsKKwl1MzIgKndiX2NvbXAgPSBibngyeF9zcChicCwgd2JfY29tcCk7CisJaW50 IHRpbWVvdXQgPSAyMDA7CisKKwltZW1zZXQoZG1hZSwgMCwgc2l6ZW9mKHN0cnVjdCBkbWFl X2NvbW1hbmQpKTsKKworCWRtYWUtPm9wY29kZSA9IChETUFFX0NNRF9TUkNfUENJIHwgRE1B RV9DTURfRFNUX0dSQyB8CisJCQlETUFFX0NNRF9DX0RTVF9QQ0kgfCBETUFFX0NNRF9DX0VO QUJMRSB8CisJCQlETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQgfAor I2lmZGVmIF9fQklHX0VORElBTgorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dBUCB8 CisjZWxzZQorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAorI2VuZGlmCisJCQko cG9ydCA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkpOworCWRtYWUtPnNy Y19hZGRyX2xvID0gVTY0X0xPKGRtYV9hZGRyKTsKKwlkbWFlLT5zcmNfYWRkcl9oaSA9IFU2 NF9ISShkbWFfYWRkcik7CisJZG1hZS0+ZHN0X2FkZHJfbG8gPSB3Yl9hZGRyID4+IDI7CisJ ZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOworCWRtYWUtPmxlbiA9IHdiX2xlbjsKKwlkbWFlLT5j b21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgd2JfY29tcCkpOwor CWRtYWUtPmNvbXBfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCB3Yl9j b21wKSk7CisJZG1hZS0+Y29tcF92YWwgPSBCTlgyWF9XQl9DT01QX1ZBTDsKKworLyoKKwlE UChORVRJRl9NU0dfRE1BRSwgImRtYWU6IG9wY29kZSAweCUwOHhcbiIKKwkgICBEUF9MRVZF TCAic3JjX2FkZHIgIFsleDolMDh4XSAgbGVuIFslZCAqNF0gICIKKwkJICAgICJkc3RfYWRk ciBbJXg6JTA4eCAoJTA4eCldXG4iCisJICAgRFBfTEVWRUwgImNvbXBfYWRkciBbJXg6JTA4 eF0gIGNvbXBfdmFsIDB4JTA4eFxuIiwKKwkgICBkbWFlLT5vcGNvZGUsIGRtYWUtPnNyY19h ZGRyX2hpLCBkbWFlLT5zcmNfYWRkcl9sbywKKwkgICBkbWFlLT5sZW4sIGRtYWUtPmRzdF9h ZGRyX2hpLCBkbWFlLT5kc3RfYWRkcl9sbywgd2JfYWRkciwKKwkgICBkbWFlLT5jb21wX2Fk ZHJfaGksIGRtYWUtPmNvbXBfYWRkcl9sbywgZG1hZS0+Y29tcF92YWwpOworKi8KKy8qCisJ RFAoTkVUSUZfTVNHX0RNQUUsICJkYXRhIFsweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhd XG4iLAorCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVswXSwgYnAtPnNsb3dwYXRoLT53Yl9k YXRhWzFdLAorCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVsyXSwgYnAtPnNsb3dwYXRoLT53 Yl9kYXRhWzNdKTsKKyovCisKKwkqd2JfY29tcCA9IDA7CisKKwlibngyeF9wb3N0X2RtYWUo YnAsIHBvcnQgPyAxNSA6IDE0KTsKKworCVJFR19XUjMyKGJwLCBHUkNCQVNFX0RNQUUsCisJ CSAoYnAtPnBvcnQgPyBETUFFX1JFR0lTVEVSU19HT19DMTUgOgorCQkJICAgICBETUFFX1JF R0lTVEVSU19HT19DMTQpLCAxKTsKKwl1ZGVsYXkoNSk7CisJd2hpbGUgKCp3Yl9jb21wICE9 IEJOWDJYX1dCX0NPTVBfVkFMKSB7CisvKgkJRFAoTkVUSUZfTVNHX0RNQUUsICJ3Yl9jb21w IDB4JTA4eFxuIiwgKndiX2NvbXApOyAqLworCQl1ZGVsYXkoNSk7CisJCWlmICghdGltZW91 dCkgeworCQkJQk5YMlhfRVJSKCJkbWFlIHRpbWVvdXQhXG4iKTsKKwkJCWJyZWFrOworCQl9 CisJCXRpbWVvdXQtLTsKKwl9Cit9CisKKyNpZmRlZiBCTlgyWF9ETUFFX1JECitzdGF0aWMg dm9pZCBibngyeF9yZWFkX2RtYWUoc3RydWN0IGJueDJ4ICpicCwgdTMyIHdiX2FkZHIsIHUz MiB3Yl9sZW4pCit7CisJc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZSA9ICZicC0+ZG1hZTsK KwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXUzMiAqd2JfY29tcCA9IGJueDJ4X3NwKGJwLCB3 Yl9jb21wKTsKKwlpbnQgdGltZW91dCA9IDIwMDsKKworCW1lbXNldChibngyeF9zcChicCwg d2JfZGF0YVswXSksIDAsIHNpemVvZih1MzIpICogNCk7CisJbWVtc2V0KGRtYWUsIDAsIHNp emVvZihzdHJ1Y3QgZG1hZV9jb21tYW5kKSk7CisKKwlkbWFlLT5vcGNvZGUgPSAoRE1BRV9D TURfU1JDX0dSQyB8IERNQUVfQ01EX0RTVF9QQ0kgfAorCQkJRE1BRV9DTURfQ19EU1RfUENJ IHwgRE1BRV9DTURfQ19FTkFCTEUgfAorCQkJRE1BRV9DTURfU1JDX1JFU0VUIHwgRE1BRV9D TURfRFNUX1JFU0VUIHwKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJCURNQUVfQ01EX0VORElB TklUWV9CX0RXX1NXQVAgfAorI2Vsc2UKKwkJCURNQUVfQ01EX0VORElBTklUWV9EV19TV0FQ IHwKKyNlbmRpZgorCQkJKHBvcnQgPyBETUFFX0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JU XzApKTsKKwlkbWFlLT5zcmNfYWRkcl9sbyA9IHdiX2FkZHIgPj4gMjsKKwlkbWFlLT5zcmNf YWRkcl9oaSA9IDA7CisJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFw cGluZyhicCwgd2JfZGF0YSkpOworCWRtYWUtPmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4 X3NwX21hcHBpbmcoYnAsIHdiX2RhdGEpKTsKKwlkbWFlLT5sZW4gPSB3Yl9sZW47CisJZG1h ZS0+Y29tcF9hZGRyX2xvID0gVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIHdiX2NvbXAp KTsKKwlkbWFlLT5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwg d2JfY29tcCkpOworCWRtYWUtPmNvbXBfdmFsID0gQk5YMlhfV0JfQ09NUF9WQUw7CisKKy8q CisJRFAoTkVUSUZfTVNHX0RNQUUsICJkbWFlOiBvcGNvZGUgMHglMDh4XG4iCisJICAgRFBf TEVWRUwgInNyY19hZGRyICBbJXg6JTA4eF0gIGxlbiBbJWQgKjRdICAiCisJCSAgICAiZHN0 X2FkZHIgWyV4OiUwOHggKCUwOHgpXVxuIgorCSAgIERQX0xFVkVMICJjb21wX2FkZHIgWyV4 OiUwOHhdICBjb21wX3ZhbCAweCUwOHhcbiIsCisJICAgZG1hZS0+b3Bjb2RlLCBkbWFlLT5z cmNfYWRkcl9oaSwgZG1hZS0+c3JjX2FkZHJfbG8sCisJICAgZG1hZS0+bGVuLCBkbWFlLT5k c3RfYWRkcl9oaSwgZG1hZS0+ZHN0X2FkZHJfbG8sIHdiX2FkZHIsCisJICAgZG1hZS0+Y29t cF9hZGRyX2hpLCBkbWFlLT5jb21wX2FkZHJfbG8sIGRtYWUtPmNvbXBfdmFsKTsKKyovCisK Kwkqd2JfY29tcCA9IDA7CisKKwlibngyeF9wb3N0X2RtYWUoYnAsIHBvcnQgPyAxNSA6IDE0 KTsKKworCVJFR19XUjMyKGJwLCBHUkNCQVNFX0RNQUUsCisJCSAoYnAtPnBvcnQgPyBETUFF X1JFR0lTVEVSU19HT19DMTUgOgorCQkJICAgICBETUFFX1JFR0lTVEVSU19HT19DMTQpLCAx KTsKKwl1ZGVsYXkoNSk7CisJd2hpbGUgKCp3Yl9jb21wICE9IEJOWDJYX1dCX0NPTVBfVkFM KSB7CisJCXVkZWxheSg1KTsKKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlCTlgyWF9FUlIoImRt YWUgdGltZW91dCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJdGltZW91dC0tOworCX0KKy8q CisJRFAoTkVUSUZfTVNHX0RNQUUsICJkYXRhIFsweCUwOHggMHglMDh4IDB4JTA4eCAweCUw OHhdXG4iLAorCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVswXSwgYnAtPnNsb3dwYXRoLT53 Yl9kYXRhWzFdLAorCSAgIGJwLT5zbG93cGF0aC0+d2JfZGF0YVsyXSwgYnAtPnNsb3dwYXRo LT53Yl9kYXRhWzNdKTsKKyovCit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYm54MnhfcGFu aWNfZHVtcChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpOworCXUxNiBqLCBzdGFydCwg ZW5kOworCisJQk5YMlhfRVJSKCJiZWdpbiBjcmFzaCBkdW1wIC0tLS0tLS0tLS0tLS0tLS0t XG4iKTsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0 cGF0aCAqZnAgPSAmYnAtPmZwW2ldOworCQlzdHJ1Y3QgZXRoX3R4X2RiX2RhdGEgKmh3X3By b2RzID0gZnAtPmh3X3R4X3Byb2RzOworCisJCUJOWDJYX0VSUigicXVldWVbJWRdOiB0eF9w a3RfcHJvZCgleCkgIHR4X3BrdF9jb25zKCV4KSIKKwkJCSAgIiAgdHhfYmRfcHJvZCgleCkg IHR4X2JkX2NvbnMoJXgpICAqdHhfY29uc19zYigleCkiCisJCQkgICIgICpyeF9jb25zX3Ni KCV4KSAgcnhfY29tcF9wcm9kKCV4KSIKKwkJCSAgIiAgcnhfY29tcF9jb25zKCV4KSAgZnBf Y19pZHgoJXgpICBmcF91X2lkeCgleCkiCisJCQkgICIgIGJkIGRhdGEoJXgsJXgpXG4iLAor CQkJICBpLCBmcC0+dHhfcGt0X3Byb2QsIGZwLT50eF9wa3RfY29ucywgZnAtPnR4X2JkX3By b2QsCisJCQkgIGZwLT50eF9iZF9jb25zLCAqZnAtPnR4X2NvbnNfc2IsICpmcC0+cnhfY29u c19zYiwKKwkJCSAgZnAtPnJ4X2NvbXBfcHJvZCwgZnAtPnJ4X2NvbXBfY29ucywgZnAtPmZw X2NfaWR4LAorCQkJICBmcC0+ZnBfdV9pZHgsIGh3X3Byb2RzLT5wYWNrZXRzX3Byb2QsCisJ CQkgIGh3X3Byb2RzLT5iZHNfcHJvZCk7CisKKwkJc3RhcnQgPSBUWF9CRCgqZnAtPnR4X2Nv bnNfc2IgLSAxMCk7CisJCWVuZCA9IFRYX0JEKCpmcC0+dHhfY29uc19zYiArIDI0NSk7CisJ CWZvciAoaiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKKwkJCXN0cnVjdCBzd190eF9iZCAq c3dfYmQgPSAmZnAtPnR4X2J1Zl9yaW5nW2pdOworCisJCQlCTlgyWF9FUlIoInBhY2tldFsl eF09WyVwLCV4XVxuIiwgaiwKKwkJCQkgIHN3X2JkLT5za2IsIHN3X2JkLT5maXJzdF9iZCk7 CisJCX0KKworCQlzdGFydCA9IFRYX0JEKGZwLT50eF9iZF9jb25zIC0gMTApOworCQllbmQg PSBUWF9CRChmcC0+dHhfYmRfY29ucyArIDI1NCk7CisJCWZvciAoaiA9IHN0YXJ0OyBqIDwg ZW5kOyBqKyspIHsKKwkJCXUzMiAqdHhfYmQgPSAodTMyICopJmZwLT50eF9kZXNjX3Jpbmdb al07CisKKwkJCUJOWDJYX0VSUigidHhfYmRbJXhdPVsleDoleDoleDoleF1cbiIsCisJCQkJ ICBqLCB0eF9iZFswXSwgdHhfYmRbMV0sIHR4X2JkWzJdLCB0eF9iZFszXSk7CisJCX0KKwor CQlzdGFydCA9IFJYX0JEKCpmcC0+cnhfY29uc19zYiAtIDEwKTsKKwkJZW5kID0gUlhfQkQo KmZwLT5yeF9jb25zX3NiICsgNTAzKTsKKwkJZm9yIChqID0gc3RhcnQ7IGogPCBlbmQ7IGor KykgeworCQkJdTMyICpyeF9iZCA9ICh1MzIgKikmZnAtPnJ4X2Rlc2NfcmluZ1tqXTsKKwkJ CXN0cnVjdCBzd19yeF9iZCAqc3dfYmQgPSAmZnAtPnJ4X2J1Zl9yaW5nW2pdOworCisJCQlC TlgyWF9FUlIoInJ4X2JkWyV4XT1bJXg6JXg6JXg6JXhdICBzd19iZD1bJXBdXG4iLAorCQkJ CSAgaiwgcnhfYmRbMF0sIHJ4X2JkWzFdLCByeF9iZFsyXSwgcnhfYmRbM10sCisJCQkJICBz d19iZC0+c2tiKTsKKwkJfQorCisJCXN0YXJ0ID0gUlhfQkQoZnAtPnJ4X2NvbXBfY29ucyAt IDEwKTsKKwkJZW5kID0gUlhfQkQoZnAtPnJ4X2NvbXBfY29ucyArIDUwMyk7CisJCWZvciAo aiA9IHN0YXJ0OyBqIDwgZW5kOyBqKyspIHsKKwkJCXUzMiAqY3FlID0gKHUzMiAqKSZmcC0+ cnhfY29tcF9yaW5nW2pdOworCisJCQlCTlgyWF9FUlIoImNxZVsleF09WyV4OiV4OiV4OiV4 XVxuIiwKKwkJCQkgIGosIGNxZVswXSwgY3FlWzFdLCBjcWVbMl0sIGNxZVszXSk7CisJCX0K Kwl9CisKKwlCTlgyWF9FUlIoImRlZl9jX2lkeCgldSkgIGRlZl91X2lkeCgldSkgIGRlZl90 X2lkeCgldSkiCisJCSAgIiAgZGVmX3hfaWR4KCV1KSAgZGVmX2F0dF9pZHgoJXUpICBhdHRu X3N0YXRlKCV1KSIKKwkJICAiICBzcHFfcHJvZF9pZHgoJXUpICBzcHFfY29uX2lkeCgldSlc biIsCisJCSAgYnAtPmRlZl9jX2lkeCwgYnAtPmRlZl91X2lkeCwgYnAtPmRlZl90X2lkeCwg YnAtPmRlZl94X2lkeCwKKwkJICBicC0+ZGVmX2F0dF9pZHgsIGJwLT5hdHRuX3N0YXRlLCBi cC0+c3BxX3Byb2RfaWR4LAorCQkgIGJwLT5zcHFfY29uX2lkeCk7CisKKwlibngyeF9pZGxl X2NoayhicCk7CisJYm54MnhfbWNfYXNzZXJ0KGJwKTsKKwlCTlgyWF9FUlIoImVuZCBjcmFz aCBkdW1wIC0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWJwLT5zdGF0c19zdGF0ZSA9IFNU QVRTX1NUQVRFX0RJU0FCTEU7CisJRFAoQk5YMlhfTVNHX1NUQVRTLCAic3RhdHNfc3RhdGUg LSBESVNBQkxFXG4iKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZW5hYmxlX2ludChzdHJ1 Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIGFkZHIgPSBw b3J0ID8gSENfUkVHSVNURVJTX0NPTkZJR18xIDogSENfUkVHSVNURVJTX0NPTkZJR18wOwor CXUzMiB2YWwgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfSEMsIGFkZHIpOworCWludCBtc2l4ID0g KGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgPyAxIDogMDsKKworCWlmIChtc2l4KSB7 CisJCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHSVNURVJTX1NJTkdMRV9JU1JfRU5fMDsKKwkJ dmFsIHw9IChIQ19DT05GSUdfMF9SRUdJU1RFUlNfTVNJX01TSVhfSU5UX0VOXzAgfAorCQkJ SENfQ09ORklHXzBfUkVHSVNURVJTX0FUVE5fQklUX0VOXzApOworCX0gZWxzZSB7CisJCXZh bCB8PSAoSENfQ09ORklHXzBfUkVHSVNURVJTX1NJTkdMRV9JU1JfRU5fMCB8CisJCQlIQ19D T05GSUdfMF9SRUdJU1RFUlNfSU5UX0xJTkVfRU5fMCB8CisJCQlIQ19DT05GSUdfMF9SRUdJ U1RFUlNfQVRUTl9CSVRfRU5fMCk7CisJCXZhbCAmPSB+SENfQ09ORklHXzBfUkVHSVNURVJT X01TSV9NU0lYX0lOVF9FTl8wOworCX0KKworCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUg JXggdG8gSEMgJWQgKGFkZHIgMHgleCkgIG1zaSAlZFxuIiwKKwkgICB2YWwsIHBvcnQsIEdS Q0JBU0VfSEMgKyBhZGRyLCBtc2l4KTsKKworCVJFR19XUihicCwgR1JDQkFTRV9IQywgYWRk ciwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZGlzYWJsZV9pbnQoc3RydWN0IGJu eDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXUzMiBhZGRyID0gcG9ydCA/ IEhDX1JFR0lTVEVSU19DT05GSUdfMSA6IEhDX1JFR0lTVEVSU19DT05GSUdfMDsKKwl1MzIg dmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX0hDLCBhZGRyKTsKKworCXZhbCAmPSB+KEhDX0NP TkZJR18wX1JFR0lTVEVSU19TSU5HTEVfSVNSX0VOXzAgfAorCQkgSENfQ09ORklHXzBfUkVH SVNURVJTX01TSV9NU0lYX0lOVF9FTl8wIHwKKwkJIEhDX0NPTkZJR18wX1JFR0lTVEVSU19J TlRfTElORV9FTl8wIHwKKwkJIEhDX0NPTkZJR18wX1JFR0lTVEVSU19BVFROX0JJVF9FTl8w KTsKKworCURQKE5FVElGX01TR19JTlRSLCAid3JpdGUgJXggdG8gSEMgJWQgKGFkZHIgMHgl eClcbiIsCisJICAgdmFsLCBwb3J0LCBHUkNCQVNFX0hDICsgYWRkcik7CisKKwlSRUdfV1Io YnAsIEdSQ0JBU0VfSEMsIGFkZHIsIHZhbCk7CisJaWYgKFJFR19SRChicCwgR1JDQkFTRV9I QywgYWRkcikgIT0gdmFsKSB7CisJCUJOWDJYX0VSUigiQlVHISBwcm9wZXIgdmFsIG5vdCBy ZWFkIGZyb20gSUdVIVxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9kaXNhYmxl X2ludF9zeW5jKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IG1zaXggPSAoYnAtPmZsYWdz ICYgVVNJTkdfTVNJWF9GTEFHKSA/IDEgOiAwOworCWludCBpOworCisJYXRvbWljX2luYygm YnAtPmludHJfc2VtKTsKKwlibngyeF9kaXNhYmxlX2ludChicCk7CisKKwkvKiBEaXNhYmxl IFNQIHRhc2tsZXQgKi8KKwl0YXNrbGV0X2Rpc2FibGUoJmJwLT5zcF90YXNrKTsKKworCWlm IChtc2l4KSB7CisJCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCQlzeW5jaHJvbml6ZV9p cnEoYnAtPm1zaXhfdGFibGVbaV0udmVjdG9yKTsKKwkJfQorCQkvKiBvbmUgbW9yZSBmb3Ig dGhlIFNsb3cgUGF0aCBJUlEgKi8KKwkJc3luY2hyb25pemVfaXJxKGJwLT5tc2l4X3RhYmxl W2ldLnZlY3Rvcik7CisJfSBlbHNlIHsKKwkJc3luY2hyb25pemVfaXJxKGJwLT5wZGV2LT5p cnEpOworCX0KK30KKworLyogZmFzdCBwYXRoICovCisKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9hY2tfc2Ioc3RydWN0IGJueDJ4ICpi cCwgdTggaWQsCisJCQkJdTggc3Rvcm0sIHUxNiBpbmRleCwgdTggb3AsIHU4IHVwZGF0ZSkK K3sKKwl1MTYgZmxhZ3M7CisJdTMyIGlndV9hZGRyID0gKElHVV9BRERSX0lOVF9BQ0sgKyBJ R1VfUE9SVF9CQVNFICogYnAtPnBvcnQpICogODsKKwl1MzIgY29tbWFuZDsKKworCWZsYWdz ID0gKChpZCA8PCBJR1VfQUNLX1JFR0lTVEVSX1NUQVRVU19CTE9DS19JRF9TSElGVCkgfAor CQkgKHN0b3JtIDw8IElHVV9BQ0tfUkVHSVNURVJfU1RPUk1fSURfU0hJRlQpIHwKKwkJICh1 cGRhdGUgPDwgSUdVX0FDS19SRUdJU1RFUl9VUERBVEVfSU5ERVhfU0hJRlQpIHwKKwkJIChv cCA8PCBJR1VfQUNLX1JFR0lTVEVSX0lOVEVSUlVQVF9NT0RFX1NISUZUKSk7CisKKwljb21t YW5kID0gKGZsYWdzIDw8IDE2KSB8IGluZGV4OworCisJUkVHX1dSKGJwLCBCQVJfSUdVX0lO VE1FTSwgaWd1X2FkZHIsIGNvbW1hbmQpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBibngy eF91cGRhdGVfZnBzYl9pZHgoc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwlzdHJ1 Y3QgaG9zdF9zdGF0dXNfYmxvY2sgKmZwc2IgPSBmcC0+c3RhdHVzX2JsazsKKwl1MTYgcmMg PSAwOworCisJaWYgKGZwLT5mcF9jX2lkeCAhPSBmcHNiLT5jX3N0YXR1c19ibG9jay5zdGF0 dXNfYmxvY2tfaW5kZXgpIHsKKwkJZnAtPmZwX2NfaWR4ID0gZnBzYi0+Y19zdGF0dXNfYmxv Y2suc3RhdHVzX2Jsb2NrX2luZGV4OworCQlyYyB8PSAxOworCX0KKwlpZiAoZnAtPmZwX3Vf aWR4ICE9IGZwc2ItPnVfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCkgeworCQlm cC0+ZnBfdV9pZHggPSBmcHNiLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7 CisJCXJjIHw9IDI7CisJfQorCXJtYigpOyAvKiBUQkQgY2hhY2sgdGhpcyAqLworCXJldHVy biByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfaGFzX3dvcmsoc3RydWN0IGJu eDJ4X2Zhc3RwYXRoICpmcCkKK3sKKwl1MTYgcnhfY29uc19zYiA9ICpmcC0+cnhfY29uc19z YjsKKworCWlmICgocnhfY29uc19zYiAmIE1BWF9SWF9ERVNDX0NOVCkgPT0gTUFYX1JYX0RF U0NfQ05UKQorCQlyeF9jb25zX3NiKys7CisKKwlpZiAoKHJ4X2NvbnNfc2IgIT0gZnAtPnJ4 X2NvbXBfY29ucykgfHwKKwkgICAgKCpmcC0+dHhfY29uc19zYiAhPSBmcC0+dHhfcGt0X2Nv bnMpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTE2IGJueDJ4 X2Fja19pbnQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgaWd1X2FkZHIgPSAoSUdVX0FE RFJfU0lNRF9NQVNLICsgSUdVX1BPUlRfQkFTRSAqIGJwLT5wb3J0KSAqIDg7CisJdTMyIHJl c3VsdCA9IFJFR19SRChicCwgQkFSX0lHVV9JTlRNRU0sIGlndV9hZGRyKTsKKworLyoJRFAo TkVUSUZfTVNHX0lOVFIsICJyZWFkIDB4JTA4eCBmcm9tIElHVSBhZGRyIDB4JXhcbiIsIHJl c3VsdCwKKwkgICBCQVJfSUdVX0lOVE1FTSArIGlndV9hZGRyKTsgKi8KKworI2lmZGVmIElH VV9ERUJVRworI3dhcm5pbmcgSUdVX0RFQlVHIGFjdGl2ZQorCWlmIChyZXN1bHQgPT0gMCkg eworCQlCTlgyWF9FUlIoInJlYWQgJXggZnJvbSBJR1VcbiIsIHJlc3VsdCk7CisJCVJFR19X UihicCwgR1JDQkFTRV9USU1FUlMsIFRNX1JFR0lTVEVSU19USU1FUl9TT0ZUX1JTVCwgMCk7 CisJfQorI2VuZGlmCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgorKiBmYXN0IHBhdGggc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisKKy8qIGZyZWUgc2tiIGluIHRoZSBwYWNrZXQgcmluZyBhdCBwb3MgaWR4 CisgICByZXR1cm4gaWR4IG9mIGxhc3QgYmQgZnJlZWQgKi8KK3N0YXRpYyB1MTYgYm54Mnhf ZnJlZV90eF9wa3Qoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpm cCwKKwkJCSAgICAgdTE2IGlkeCkKK3sKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiA9ICZm cC0+dHhfYnVmX3JpbmdbaWR4XTsKKwlzdHJ1Y3QgZXRoX3R4X2JkICp0eF9iZDsKKwlzdHJ1 Y3Qgc2tfYnVmZiAqc2tiID0gdHhfYnVmLT5za2I7CisJdTE2IGJkX2lkeCA9IHR4X2J1Zi0+ Zmlyc3RfYmQ7CisJaW50IG5iZDsKKworCURQKEJOWDJYX01TR19PRkYsICJwa3RfaWR4ICVk ICBidWZmIEAoJXApLT5za2IgJXBcbiIsCisJICAgaWR4LCB0eF9idWYsIHNrYik7CisKKwkv KiB1bm1hcCBmaXJzdCBiZCAqLworCURQKEJOWDJYX01TR19PRkYsICJmcmVlIGJkX2lkeCAl ZFxuIiwgYmRfaWR4KTsKKwl0eF9iZCA9ICZmcC0+dHhfZGVzY19yaW5nW2JkX2lkeF07CisJ cGNpX3VubWFwX3NpbmdsZShicC0+cGRldiwgQkRfVU5NQVBfQUREUih0eF9iZCksCisJCQkg QkRfVU5NQVBfTEVOKHR4X2JkKSwgUENJX0RNQV9UT0RFVklDRSk7CisKKwluYmQgPSB0eF9i ZC0+bmJkIC0gMTsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAobmJkID4g KE1BWF9TS0JfRlJBR1MgKyAyKSkgeworCQlCTlgyWF9FUlIoImJhZCBuYmQhXG4iKTsKKwkJ Ym54MnhfcGFuaWMoKTsKKwl9CisjZW5kaWYKKworCS8qIFNraXAgYSBwYXJzZSBiZCBhbmQg dGhlIFRTTyBzcGxpdCBoZWFkZXIgYmQKKwkgICBzaW5jZSB0aGV5IGhhdmUgbm8gbWFwcGlu ZyAqLworCWlmIChuYmQpCisJCWJkX2lkeCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX2lkeCkp OworCisJaWYgKHR4X2JkLT5iZF9mbGFncy5hc19iaXRmaWVsZCAmIChFVEhfVFhfQkRfRkxB R1NfSVBfQ1NVTSB8CisJCQkJCSAgIEVUSF9UWF9CRF9GTEFHU19UQ1BfQ1NVTSB8CisJCQkJ CSAgIEVUSF9UWF9CRF9GTEFHU19TV19MU08pKSB7CisJCWlmICgtLW5iZCkKKwkJCWJkX2lk eCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX2lkeCkpOworCQl0eF9iZCA9ICZmcC0+dHhfZGVz Y19yaW5nW2JkX2lkeF07CisJCS8qIGlzIHRoaXMgYSBUU08gaGVkZXIgc3BsaXQgYmQ/ICov CisJCWlmICh0eF9iZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgJiBFVEhfVFhfQkRfRkxBR1Nf U1dfTFNPKSB7CisJCQlpZiAoLS1uYmQpCisJCQkJYmRfaWR4ID0gVFhfQkQoTkVYVF9UWF9J RFgoYmRfaWR4KSk7CisJCX0KKwl9CisKKwkvKiBub3cgZnJlZSBmcmFncyAqLworCXdoaWxl IChuYmQgPiAwKSB7CisKKwkJRFAoQk5YMlhfTVNHX09GRiwgImZyZWUgZnJhZyBiZF9pZHgg JWRcbiIsIGJkX2lkeCk7CisJCXR4X2JkID0gJmZwLT50eF9kZXNjX3JpbmdbYmRfaWR4XTsK KwkJcGNpX3VubWFwX3BhZ2UoYnAtPnBkZXYsIEJEX1VOTUFQX0FERFIodHhfYmQpLAorCQkJ ICAgICAgIEJEX1VOTUFQX0xFTih0eF9iZCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpZiAo LS1uYmQpCisJCQliZF9pZHggPSBUWF9CRChORVhUX1RYX0lEWChiZF9pZHgpKTsKKwl9CisK KwkvKiByZWxlYXNlIHNrYiAqLworCUJVR19UUkFQKHNrYik7CisJZGV2X2tmcmVlX3NrYihz a2IpOworCXR4X2J1Zi0+Zmlyc3RfYmQgPSAwOworCXR4X2J1Zi0+c2tiID0gTlVMTDsKKwor CXJldHVybiBiZF9pZHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJueDJ4X3R4X2F2YWls KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCit7CisJdTE2IHVzZWQ7CisJdTMyIHByb2Q7 CisJdTMyIGNvbnM7CisKKwkvKiBUZWxsIGNvbXBpbGVyIHRoYXQgcHJvZCBhbmQgY29ucyBj YW4gY2hhbmdlLiAqLworCWJhcnJpZXIoKTsKKwlwcm9kID0gZnAtPnR4X2JkX3Byb2Q7CisJ Y29ucyA9IGZwLT50eF9iZF9jb25zOworCisJdXNlZCA9IChOVU1fVFhfQkQgLSBOVU1fVFhf UklOR1MgKyBwcm9kIC0gY29ucyArCisJCShjb25zIC8gVFhfREVTQ19DTlQpIC0gKHByb2Qg LyBUWF9ERVNDX0NOVCkpOworCisJaWYgKHByb2QgPj0gY29ucykgeworCQkvKiB1c2VkID0g cHJvZCAtIGNvbnMgLSBwcm9kL3NpemUgKyBjb25zL3NpemUgKi8KKwkJdXNlZCAtPSBOVU1f VFhfQkQgLSBOVU1fVFhfUklOR1M7CisJfQorCisJQlVHX1RSQVAodXNlZCA8PSBmcC0+YnAt PnR4X3Jpbmdfc2l6ZSk7CisJQlVHX1RSQVAoKGZwLT5icC0+dHhfcmluZ19zaXplIC0gdXNl ZCkgPD0gTUFYX1RYX0FWQUlMKTsKKworCXJldHVybiAoZnAtPmJwLT50eF9yaW5nX3NpemUg LSB1c2VkKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfdHhfaW50KHN0cnVjdCBibngyeF9m YXN0cGF0aCAqZnAsIGludCB3b3JrKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7 CisJdTE2IGh3X2NvbnMsIHN3X2NvbnMsIGJkX2NvbnMgPSBmcC0+dHhfYmRfY29uczsKKwlp bnQgZG9uZSA9IDA7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlr ZWx5KGJwLT5wYW5pYykpIHsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJaHdfY29ucyA9 ICpmcC0+dHhfY29uc19zYjsKKwlzd19jb25zID0gZnAtPnR4X3BrdF9jb25zOworCisJd2hp bGUgKHN3X2NvbnMgIT0gaHdfY29ucykgeworCQl1MTYgcGt0X2NvbnM7CisKKwkJcGt0X2Nv bnMgPSBUWF9CRChzd19jb25zKTsKKworCQkvKiBwcmVmZXRjaChicC0+dHhfYnVmX3Jpbmdb cGt0X2NvbnNdLnNrYik7ICovCisKKwkJRFAoTkVUSUZfTVNHX1RYX0RPTkUsICJod19jb25z ICV1ICBzd19jb25zICV1ICBwa3RfY29ucyAlZFxuIiwKKwkJICAgaHdfY29ucywgc3dfY29u cywgcGt0X2NvbnMpOworCisvKgkJaWYgKE5FWFRfVFhfSURYKHN3X2NvbnMpICE9IGh3X2Nv bnMpIHsKKwkJCXJtYigpOworCQkJcHJlZmV0Y2goZnAtPnR4X2J1Zl9yaW5nW05FWFRfVFhf SURYKHN3X2NvbnMpXS5za2IpOworCQl9CisqLworCQliZF9jb25zID0gYm54MnhfZnJlZV90 eF9wa3QoYnAsIGZwLCBwa3RfY29ucyk7CisJCXN3X2NvbnMrKzsKKwkJZG9uZSsrOworCisJ CWlmIChkb25lID09IHdvcmspIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZnAtPnR4X3Br dF9jb25zID0gc3dfY29uczsKKwlmcC0+dHhfYmRfY29ucyA9IGJkX2NvbnM7CisKKwkvKiBO ZWVkIHRvIG1ha2UgdGhlIHR4X2NvbnMgdXBkYXRlIHZpc2libGUgdG8gc3RhcnRfeG1pdCgp CisJICogYmVmb3JlIGNoZWNraW5nIGZvciBuZXRpZl9xdWV1ZV9zdG9wcGVkKCkuICBXaXRo b3V0IHRoZQorCSAqIG1lbW9yeSBiYXJyaWVyLCB0aGVyZSBpcyBhIHNtYWxsIHBvc3NpYmls aXR5IHRoYXQgc3RhcnRfeG1pdCgpCisJICogd2lsbCBtaXNzIGl0IGFuZCBjYXVzZSB0aGUg cXVldWUgdG8gYmUgc3RvcHBlZCBmb3JldmVyLgorCSAqLworCXNtcF9tYigpOworCisJLyog VEJEIG5lZWQgYSB0aHJlc2g/ICovCisJaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3Bw ZWQoYnAtPmRldikpKSB7CisJCW5ldGlmX3R4X2xvY2soYnAtPmRldik7CisJCWlmICgobmV0 aWZfcXVldWVfc3RvcHBlZChicC0+ZGV2KSkgJiYKKwkJICAgIChibngyeF90eF9hdmFpbChm cCkgPj0gTUFYX1NLQl9GUkFHUyArIDMpKSB7CisJCQluZXRpZl93YWtlX3F1ZXVlKGJwLT5k ZXYpOworCQl9CisJCW5ldGlmX3R4X3VubG9jayhicC0+ZGV2KTsKKwl9Cit9CisKK3N0YXRp YyB2b2lkIGJueDJ4X3NwX2V2ZW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkg ICB1bmlvbiBldGhfcnhfY3FlICpycl9jcWUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IGZw LT5icDsKKwlpbnQgY2lkID0gU1dfQ0lEKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2FuZF9j bWRfZGF0YSk7CisJaW50IGNvbW1hbmQgPSAoKHJyX2NxZS0+cmFtcm9kX2NxZS5jb25uX2Fu ZF9jbWRfZGF0YSkgPj4KKwkJICAgICAgIENPTU1PTl9SQU1ST0RfRVRIX1JYX0NRRV9DTURf SURfU0hJRlQpOworCisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKKwkgICAiZnAgJWQgIGNp ZCAlZCAgZ290IHJhbXJvZCAjJWQgIHN0YXRlIGlzICV4ICB0eXBlIGlzICVkXG4iLAorCSAg IGZwLT5pbmRleCwgY2lkLCBjb21tYW5kLCBicC0+c3RhdGUsIHJyX2NxZS0+cmFtcm9kX2Nx ZS50eXBlKTsKKworCWJwLT5zcHFfbGVmdCsrOworCisJc3dpdGNoIChjb21tYW5kIHwgYnAt PnN0YXRlKSB7CisJY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfUE9SVF9TRVRVUCB8IEJOWDJY X1NUQVRFX09QRU5JTkdfV0FJVDRfUE9SVCk6CisJCURQKE5FVElGX01TR19JRlVQLCAiZ290 IHNldHVwIHJhbXJvZFxuIik7CisJCWJwLT5zdGF0ZSA9IEJOWDJYX1NUQVRFX09QRU47CisJ CWJyZWFrOworCisJY2FzZSAoUkFNUk9EX0NNRF9JRF9FVEhfSEFMVCB8IEJOWDJYX1NUQVRF X0NMT1NJTkdfV0FJVDRfSEFMVCk6CisJCURQKE5FVElGX01TR19JRkRPV04sICJnb3QgaGFs dCByYW1yb2RcbiIpOworCQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0 X0RFTEVURTsKKwkJZnAtPnN0YXRlID0gQk5YMlhfRlBfU1RBVEVfSEFMVEVEOworCQlicmVh azsKKworCWNhc2UgKFJBTVJPRF9DTURfSURfRVRIX1BPUlRfREVMIHwgQk5YMlhfU1RBVEVf Q0xPU0lOR19XQUlUNF9ERUxFVEUpOgorCQlEUChORVRJRl9NU0dfSUZET1dOLCAiZ290IGRl bGV0ZSByYW1yb2RcbiIpOworCQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dB SVQ0X1VOTE9BRDsKKwkJYnJlYWs7CisKKwljYXNlIChSQU1ST0RfQ01EX0lEX0VUSF9TRVRf TUFDIHwgQk5YMlhfU1RBVEVfT1BFTik6CisJCURQKE5FVElGX01TR19JRlVQLCAiZ290IHNl dCBtYWMgcmFtcm9kXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCTlgyWF9FUlIo InVuZXhwZWN0ZWQgcmFtcm9kICglZCkgIHN0YXRlIGlzICV4XG4iLAorCQkJICBjb21tYW5k LCBicC0+c3RhdGUpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYm54MnhfYWxsb2Nf cnhfc2tiKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICBzdHJ1Y3QgYm54MnhfZmFzdHBh dGggKmZwLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qg c3dfcnhfYmQgKnJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbaW5kZXhdOworCXN0cnVjdCBl dGhfcnhfYmQgKnJ4YmQgPSAmZnAtPnJ4X2Rlc2NfcmluZ1tpbmRleF07CisJZG1hX2FkZHJf dCBtYXBwaW5nOworCisJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBicC0+cnhf YnVmX3NpemUpOworCWlmICh1bmxpa2VseShza2IgPT0gTlVMTCkpIHsKKwkJcmV0dXJuIC1F Tk9NRU07CisJfQorCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBza2It PmRhdGEsIGJwLT5yeF9idWZfdXNlX3NpemUsCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7 CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKG1hcHBpbmcpKSkgeworCQlkZXZf a2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJ4X2J1Zi0+c2ti ID0gc2tiOworCXBjaV91bm1hcF9hZGRyX3NldChyeF9idWYsIG1hcHBpbmcsIG1hcHBpbmcp OworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlyeGJkLT5yZXNlcnZlZCA9IGZwLT5s YXN0X2FsbG9jKys7CisjZWxzZQorCXJ4YmQtPnJlc2VydmVkID0gMDsKKyNlbmRpZgorCXJ4 YmQtPmxlbiA9IGJwLT5yeF9idWZfdXNlX3NpemU7CisJcnhiZC0+YWRkcl9oaSA9IFU2NF9I SShtYXBwaW5nKTsKKwlyeGJkLT5hZGRyX2xvID0gVTY0X0xPKG1hcHBpbmcpOworCisJcmV0 dXJuIDA7Cit9CisKKy8qIG5vdGUgdGhhdCB3ZSBhcmUgbm90IGFsbG9jYXRpbmcgYSBuZXcg c2tiLAorICogd2UgYXJlIGp1c3QgbW92aW5nIG9uZSBmcm9tIGNvbnMgdG8gcHJvZAorICog d2UgYXJlIG5vdCBjcmVhdGluZyBhIG5ldyBtYXBwaW5nLAorICogc28gdGhlcmUgaXMgbm8g bmVlZCB0byBjaGVjayBmb3IgZG1hX21hcHBpbmdfZXJyb3IoKS4KKyAqLworc3RhdGljIHZv aWQgYm54MnhfcmV1c2Vfcnhfc2tiKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCisJCQkg ICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kKQoreworCXN0 cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CisJc3RydWN0IHN3X3J4X2JkICpjb25zX3J4X2J1 ZiA9ICZmcC0+cnhfYnVmX3JpbmdbY29uc107CisJc3RydWN0IHN3X3J4X2JkICpwcm9kX3J4 X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbcHJvZF07CisJc3RydWN0IGV0aF9yeF9iZCAqY29u c19iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2NvbnNdOworCXN0cnVjdCBldGhfcnhfYmQgKnBy b2RfYmQgPSAmZnAtPnJ4X2Rlc2NfcmluZ1twcm9kXTsKKworCXBjaV9kbWFfc3luY19zaW5n bGVfZm9yX2RldmljZShicC0+cGRldiwKKwkJCQkgICAgICAgcGNpX3VubWFwX2FkZHIoY29u c19yeF9idWYsIG1hcHBpbmcpLAorCQkJCSAgICAgICBicC0+cnhfb2Zmc2V0ICsgUlhfQ09Q WV9USFJFU0gsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlwcm9kX3J4 X2J1Zi0+c2tiID0gY29uc19yeF9idWYtPnNrYjsKKwlwY2lfdW5tYXBfYWRkcl9zZXQocHJv ZF9yeF9idWYsIG1hcHBpbmcsCisJCQkgICBwY2lfdW5tYXBfYWRkcihjb25zX3J4X2J1Ziwg bWFwcGluZykpOworCSpwcm9kX2JkID0gKmNvbnNfYmQ7CisjaWZkZWYgQk5YMlhfU1RPUF9P Tl9FUlJPUgorCXByb2RfYmQtPnJlc2VydmVkID0gZnAtPmxhc3RfYWxsb2MrKzsKKyNlbmRp ZgorfQorCitzdGF0aWMgaW50IGJueDJ4X3J4X2ludChzdHJ1Y3QgYm54MnhfZmFzdHBhdGgg KmZwLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBmcC0+YnA7CisJdTE2 IGJkX2NvbnMsIGJkX3Byb2QsIGNvbXBfcmluZ19wcm9kLCBjb21wX3JpbmdfY29uczsKKwl1 MTYgaHdfY29tcF9jb25zLCBzd19jb21wX2NvbnMsIHN3X2NvbXBfcHJvZDsKKwlpbnQgcnhf cGt0ID0gMDsKKworI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAodW5saWtlbHko YnAtPnBhbmljKSkgeworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCWh3X2NvbXBfY29u cyA9ICpmcC0+cnhfY29uc19zYjsKKwlpZiAoKGh3X2NvbXBfY29ucyAmIE1BWF9SWF9ERVND X0NOVCkgPT0gTUFYX1JYX0RFU0NfQ05UKSB7CisJCWh3X2NvbXBfY29ucysrOworCX0KKwor CWJkX2NvbnMgPSBmcC0+cnhfYmRfY29uczsKKwliZF9wcm9kID0gZnAtPnJ4X2JkX3Byb2Q7 CisJc3dfY29tcF9jb25zID0gZnAtPnJ4X2NvbXBfY29uczsKKwlzd19jb21wX3Byb2QgPSBm cC0+cnhfY29tcF9wcm9kOworCisJLyogTWVtb3J5IGJhcnJpZXIgbmVjZXNzYXJ5IGFzIHNw ZWN1bGF0aXZlIHJlYWRzIG9mIHRoZSByeAorCSAqIGJ1ZmZlciBjYW4gYmUgYWhlYWQgb2Yg dGhlIGluZGV4IGluIHRoZSBzdGF0dXMgYmxvY2sKKwkgKi8KKwlybWIoKTsKKworCURQKE5F VElGX01TR19SWF9TVEFUVVMsCisJICAgInF1ZXVlWyVkXTogIGh3X2NvbXBfY29ucyAldSAg c3dfY29tcF9jb25zICV1XG4iLAorCSAgIGZwLT5pbmRleCwgaHdfY29tcF9jb25zLCBzd19j b21wX2NvbnMpOworCisJd2hpbGUgKHN3X2NvbXBfY29ucyAhPSBod19jb21wX2NvbnMpIHsK KwkJdW5zaWduZWQgaW50IGxlbiwgcGFkOworCQlzdHJ1Y3Qgc3dfcnhfYmQgKnJ4X2J1ZjsK KwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdW5pb24gZXRoX3J4X2NxZSAqY3FlOworCisJ CWNvbXBfcmluZ19wcm9kID0gUlhfQkQoc3dfY29tcF9wcm9kKTsKKwkJY29tcF9yaW5nX2Nv bnMgPSBSWF9CRChzd19jb21wX2NvbnMpOworCQliZF9wcm9kID0gUlhfQkQoYmRfcHJvZCk7 CisJCWJkX2NvbnMgPSBSWF9CRChiZF9jb25zKTsKKworCQljcWUgPSAmZnAtPnJ4X2NvbXBf cmluZ1tjb21wX3JpbmdfY29uc107CisKKwkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgImh3 X2NvbXBfY29ucyAldSAgc3dfY29tcF9jb25zICV1IgorCQkgICAiICBjb21wX3JpbmcgKCV1 LCV1KSAgYmRfcmluZyAoJXUsJXUpXG4iLAorCQkgICBod19jb21wX2NvbnMsIHN3X2NvbXBf Y29ucywgY29tcF9yaW5nX3Byb2QsCisJCSAgIGNvbXBfcmluZ19jb25zLCBiZF9wcm9kLCBi ZF9jb25zKTsKKwkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgIkNRRSB0eXBlICV4ICBlcnIg JXggIHN0YXR1cyAleCIKKwkJICAgIiAgcXVldWUgJXggIHZsYW4gJXggIGxlbiAleCAgY3N1 bSAleFxuIiwKKwkJICAgY3FlLT5mYXN0X3BhdGhfY3FlLnR5cGUsIGNxZS0+ZmFzdF9wYXRo X2NxZS5lcnJvcl9mbGFncywKKwkJICAgY3FlLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFn cywKKwkJICAgY3FlLT5mYXN0X3BhdGhfY3FlLnJzc19oYXNoX3Jlc3VsdCwKKwkJICAgY3Fl LT5mYXN0X3BhdGhfY3FlLnZsYW5fdGFnLAorCQkgICBjcWUtPmZhc3RfcGF0aF9jcWUucGt0 X2xlbiwgY3FlLT5mYXN0X3BhdGhfY3FlLmw0X2NzdW0pOworCisJCS8qIGlzIHRoaXMgYSBz bG93cGF0aCBtc2c/ICovCisJCWlmICh1bmxpa2VseShjcWUtPmZhc3RfcGF0aF9jcWUudHlw ZSkpIHsKKwkJCWJueDJ4X3NwX2V2ZW50KGZwLCBjcWUpOworCQkJZ290byBuZXh0X2NxZTsK KworCQkvKiB0aGlzIGlzIGFuIHJ4IHBhY2tldCAqLworCQl9IGVsc2UgeworCQkJcnhfYnVm ID0gJmZwLT5yeF9idWZfcmluZ1tiZF9jb25zXTsKKwkJCXNrYiA9IHJ4X2J1Zi0+c2tiOwor CisJCQlsZW4gPSBjcWUtPmZhc3RfcGF0aF9jcWUucGt0X2xlbjsKKwkJCXBhZCA9IGNxZS0+ ZmFzdF9wYXRoX2NxZS5wbGFjZW1lbnRfb2Zmc2V0OworCisJCQlwY2lfZG1hX3N5bmNfc2lu Z2xlX2Zvcl9kZXZpY2UoYnAtPnBkZXYsCisJCQkJCXBjaV91bm1hcF9hZGRyKHJ4X2J1Ziwg bWFwcGluZyksCisJCQkJCQkgICAgICAgcGFkICsgUlhfQ09QWV9USFJFU0gsCisJCQkJCQkg ICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCXByZWZldGNoKHNrYik7CisJCQlwcmVm ZXRjaCgoKGNoYXIgKikoc2tiKSkgKyAxMjgpOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9F UlJPUgorCQkJQlVHX1RSQVAoZnAtPnJ4X2Rlc2NfcmluZ1tiZF9jb25zXS5yZXNlcnZlZCA9 PQorCQkJCSBmcC0+bmV4dF9mcmVlKTsKKwkJCWZwLT5uZXh0X2ZyZWUrKzsKKyNlbmRpZgor CQkJLyogaXMgdGhpcyBhbiBlcnJvciBwYWNrZXQ/ICovCisJCQlpZiAodW5saWtlbHkoY3Fl LT5mYXN0X3BhdGhfY3FlLmVycm9yX2ZsYWdzKSkgeworCQkJLyogZG8gd2Ugc29tZXRpbWVz IGZvcndhcmQgZXJyb3IgcGFja2V0cyBhbnl3YXk/ICovCisJCQkJRFAoTkVUSUZfTVNHX1JY X0VSUiwKKwkJCQkgICAiRVJST1IgZmxhZ3MoJXUpIFJ4IHBhY2tldCgldSlcbiIsCisJCQkJ ICAgY3FlLT5mYXN0X3BhdGhfY3FlLmVycm9yX2ZsYWdzLAorCQkJCSAgIHN3X2NvbXBfY29u cyk7CisJCQkJLyogVEJEIG1ha2Ugc3VyZSBNQyBjb3VudHMgdGhpcyBhcyBhIGRyb3AgKi8K KwkJCQlnb3RvIHJldXNlX3J4OworCQkJfQorCisJCQkvKiBTaW5jZSB3ZSBkb24ndCBoYXZl IGEganVtYm8gcmluZworCQkJICogY29weSBzbWFsbCBwYWNrZXRzIGlmIG10dSA+IDE1MDAK KwkJCSAqLworCQkJaWYgKChicC0+ZGV2LT5tdHUgPiAxNTAwKSAmJgorCQkJICAgIChsZW4g PD0gUlhfQ09QWV9USFJFU0gpKSB7CisJCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisK KwkJCQluZXdfc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LAorCQkJCQkJCSAgIGxl biArIHBhZCk7CisJCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgeworCQkJCQlEUChORVRJRl9N U0dfUlhfRVJSLAorCQkJCQkgICAiRVJST1IgcGFja2V0IGRyb3BwZWQgIgorCQkJCQkgICAi YmVjYXVzZSBvZiBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJCQkJLyogVEJEIGNvdW50IHRoaXMg YXMgYSBkcm9wPyAqLworCQkJCQlnb3RvIHJldXNlX3J4OworCQkJCX0KKworCQkJCS8qIGFs aWduZWQgY29weSAqLworCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNr YiwgcGFkLAorCQkJCQkJCQkgbmV3X3NrYi0+ZGF0YQorCQkJCQkJCQkgKyBwYWQsIGxlbik7 CisKKwkJCQlza2JfcmVzZXJ2ZShuZXdfc2tiLCBwYWQpOworCQkJCXNrYl9wdXQobmV3X3Nr YiwgbGVuKTsKKworCQkJCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgc2tiLCBiZF9jb25zLCBi ZF9wcm9kKTsKKworCQkJCXNrYiA9IG5ld19za2I7CisKKwkJCX0gZWxzZSBpZiAoYm54Mnhf YWxsb2Nfcnhfc2tiKGJwLCBmcCwgYmRfcHJvZCkgPT0gMCkgeworCQkJCXBjaV91bm1hcF9z aW5nbGUoYnAtPnBkZXYsCisJCQkJCQkgcGNpX3VubWFwX2FkZHIocnhfYnVmLAorCQkJCQkJ CQltYXBwaW5nKSwKKwkJCQkJCSBicC0+cnhfYnVmX3VzZV9zaXplLAorCQkJCQkJIFBDSV9E TUFfRlJPTURFVklDRSk7CisJCQkJc2tiX3Jlc2VydmUoc2tiLCBwYWQpOworCQkJCXNrYl9w dXQoc2tiLCBsZW4pOworCisJCQl9IGVsc2UgeworCQkJCURQKE5FVElGX01TR19SWF9FUlIs CisJCQkJICAgIkVSUk9SIHBhY2tldCBkcm9wcGVkIGJlY2F1c2UgIgorCQkJCSAgICJvZiBh bGxvYyBmYWlsdXJlXG4iKTsKK3JldXNlX3J4OgorCQkJCWJueDJ4X3JldXNlX3J4X3NrYihm cCwgc2tiLCBiZF9jb25zLCBiZF9wcm9kKTsKKwkJCQlnb3RvIG5leHRfcng7CisJCQl9CisK KwkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCisJ CQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQlpZiAoYnAtPnJ4X2NzdW0g JiYgQk5YMlhfUlhfU1VNX09LKGNxZSkpCisJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NV TV9VTk5FQ0VTU0FSWTsKKworCQkJLyogVEJEIGRvIHdlIHBhc3MgYmFkIGNzdW0gcGFja2V0 cyBvbiBwcm9taXNjPworCQkJICogaWYgKHVubGlrZWx5KGNxZS0+ZmFzdF9wYXRoX2NxZS5l cnJvcl9mbGFncykpCisJCQkgKiAgICAgICAgICAgICAgICAgc2tiLT5pcF9zdW1tZWQgPSBD SEVDS1NVTV9OT05FOworCQkJICovCisJCX0KKworI2lmZGVmIEJDTV9WTEFOCisJCWlmICgo Y3FlLT5mYXN0X3BhdGhfY3FlLnBhcnNfZmxhZ3MuZmxhZ3MKKwkJICAgICAmIFBBUlNJTkdf RkxBR1NfTlVNQkVSX09GX05FU1RFRF9WTEFOUykKKwkJICAgICYmIChicC0+dmxncnAgIT0g MCkpIHsKKwkJCXZsYW5faHdhY2NlbF9yZWNlaXZlX3NrYihza2IsIGJwLT52bGdycCwKKwkJ CQkJCSBjcWUtPmZhc3RfcGF0aF9jcWUudmxhbl90YWcpOworCQl9IGVsc2UKKyNlbmRpZgor CQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKworCQlicC0+ZGV2LT5sYXN0X3J4ID0gamlm ZmllczsKKworbmV4dF9yeDoKKwkJcnhfYnVmLT5za2IgPSBOVUxMOworCisJCWJkX2NvbnMg PSBORVhUX1JYX0lEWChiZF9jb25zKTsKKwkJYmRfcHJvZCA9IE5FWFRfUlhfSURYKGJkX3By b2QpOworbmV4dF9jcWU6CisJCXN3X2NvbXBfcHJvZCA9IE5FWFRfUlhfSURYKHN3X2NvbXBf cHJvZCk7CisJCXN3X2NvbXBfY29ucyA9IE5FWFRfUlhfSURYKHN3X2NvbXBfY29ucyk7CisJ CXJ4X3BrdCsrOworCisJCWlmICgocnhfcGt0ID09IGJ1ZGdldCkpCisJCQlicmVhazsKKwl9 IC8qIHdoaWxlICovCisKKwlmcC0+cnhfYmRfY29ucyA9IGJkX2NvbnM7CisJZnAtPnJ4X2Jk X3Byb2QgPSBiZF9wcm9kOworCWZwLT5yeF9jb21wX2NvbnMgPSBzd19jb21wX2NvbnM7CisJ ZnAtPnJ4X2NvbXBfcHJvZCA9IHN3X2NvbXBfcHJvZDsKKworCVJFR19XUihicCwgQkFSX1RT VFJPUk1fSU5UTUVNLAorCSAgICAgICBUU1RPUk1fUkNRX1BST0RfT0ZGU0VUKGJwLT5wb3J0 LCBmcC0+aW5kZXgpLCBzd19jb21wX3Byb2QpOworCisJbW1pb3diKCk7CisKKwlmcC0+cnhf cGt0ICs9IHJ4X3BrdDsKKwlmcC0+cnhfY2FsbHMrKzsKKworCXJldHVybiByeF9wa3Q7Cit9 CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibngyeF9tc2l4X2ZwX2ludChpbnQgaXJxLCB2b2lk ICpmcF9jb29raWUpCit7CisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9IGZwX2Nvb2tp ZTsKKwlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOworCXN0cnVjdCBuZXRfZGV2aWNlICpk ZXYgPSBicC0+ZGV2OworCisJRFAoTkVUSUZfTVNHX0lOVFIsICJnb3QgYW4gbXNpeCBpbnRl cnJ1cHQgb24gWyVkXVxuIiwgZnAtPmluZGV4KTsKKwlibngyeF9hY2tfc2IoYnAsIGZwLT5p bmRleCwgVVNUT1JNX0lELCAwLCBJR1VfSU5UX0RJU0FCTEUsIDApOworCisjaWZkZWYgQk5Y MlhfU1RPUF9PTl9FUlJPUgorCWlmICh1bmxpa2VseShicC0+cGFuaWMpKSB7CisJCXJldHVy biBJUlFfSEFORExFRDsKKwl9CisjZW5kaWYKKworCXByZWZldGNoKGZwLT5yeF9jb25zX3Ni KTsKKwlwcmVmZXRjaChmcC0+dHhfY29uc19zYik7CisJcHJlZmV0Y2goJmZwLT5zdGF0dXNf YmxrLT5jX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpOworCXByZWZldGNoKCZm cC0+c3RhdHVzX2Jsay0+dV9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4KTsKKwlu ZXRpZl9yeF9zY2hlZHVsZShkZXYsICZibngyeF9mcChicCwgMCwgbmFwaSkpOworCXJldHVy biBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGJueDJ4X2ludGVycnVw dChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCit7CisJc3RydWN0IG5ldF9kZXZpY2Ug KmRldiA9IGRldl9pbnN0YW5jZTsKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYo ZGV2KTsKKwl1MTYgc3RhdHVzID0gYm54MnhfYWNrX2ludChicCk7CisKKwlpZiAodW5saWtl bHkoc3RhdHVzID09IDApKSB7CisJCURQKE5FVElGX01TR19JTlRSLCAibm90IG91ciBpbnRl cnJ1cHQhXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCURQKE5FVElGX01TR19J TlRSLCAiZ290IGFuIGludGVycnVwdCBzdGF0dXMgaXMgJXVcbiIsIHN0YXR1cyk7CisKKyNp ZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpIHsK KwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKyNlbmRpZgorCisJLyogUmV0dXJuIGhlcmUg aWYgaW50ZXJydXB0IGlzIHNoYXJlZCBhbmQgaXMgZGlzYWJsZWQgKi8KKwlpZiAodW5saWtl bHkoYXRvbWljX3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkpIHsKKwkJRFAoTkVUSUZfTVNH X0lOVFIsICJjYWxsZWQgYnV0IGludHJfc2VtIG5vdCAwLCByZXR1cm5pbmdcbiIpOworCQly ZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHN0YXR1cyAmIDB4MikgeworCQlzdHJ1 Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFswXTsKKworCQlwcmVmZXRjaChmcC0+ cnhfY29uc19zYik7CisJCXByZWZldGNoKGZwLT50eF9jb25zX3NiKTsKKwkJcHJlZmV0Y2go JmZwLT5zdGF0dXNfYmxrLT5jX3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpOwor CQlwcmVmZXRjaCgmZnAtPnN0YXR1c19ibGstPnVfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9j a19pbmRleCk7CisKKwkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2LCAmYm54MnhfZnAoYnAsIDAs IG5hcGkpKTsKKworCQlzdGF0dXMgJj0gfjB4MjsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXJl dHVybiBJUlFfSEFORExFRDsKKwkJfQorCX0KKworCWlmICh1bmxpa2VseShzdGF0dXMgJiAw eDEpKSB7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmJwLT5zcF90YXNrKTsKKworCQlzdGF0dXMg Jj0gfjB4MTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJ fQorCX0KKworCURQKE5FVElGX01TR19JTlRSLCAiZ290IGFuIHVua25vd24gaW50ZXJydXB0 ISAoc3RhdHVzIGlzICV1KVxuIiwKKwkgICBzdGF0dXMpOworCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCisvKiBlbmQgb2YgZmFzdCBwYXRoICovCisKKy8qIFBIWS9NQUMgKi8KKwor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKKyogR2VuZXJhbCBzZXJ2aWNlIGZ1bmN0aW9ucwor KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYm54MnhfbGVkc19zZXQo c3RydWN0IGJueDJ4ICpicCwgdW5zaWduZWQgaW50IHNwZWVkKQoreworCXUzMiB2YWw7CisJ aW50IHBvcnQgPSBicC0+cG9ydDsKKworCU5JR19XUihOSUdfUkVHSVNURVJTX0xFRF9NT0RF X1AwICsgcG9ydCo0LAorCSAgICAgICAoKGJwLT5od19jb25maWcgJiBTSEFSRURfSFdfQ0ZH X0xFRF9NT0RFX01BU0spID4+CisJCVNIQVJFRF9IV19DRkdfTEVEX01PREVfU0hJRlQpKTsK KwlOSUdfV1IoTklHX1JFR0lTVEVSU19MRURfQ09OVFJPTF9PVkVSUklERV9UUkFGRklDX1Aw ICsgcG9ydCo0LCAwKTsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwMDA6 CisJCXZhbCA9IDB4M2ZmOworCQlicmVhazsKKworCWNhc2UgU1BFRURfMTAwOgorCQl2YWwg PSAweDdmZjsKKwkJYnJlYWs7CisKKwljYXNlIFNQRUVEXzEwOgorCQl2YWwgPSAweGZmZjsK KwkJYnJlYWs7CisKKwlkZWZhdWx0OgkvKiAyLjVHIGFuZCB1cCAqLworCQl2YWwgPSAweGZm OworCQlicmVhazsKKwl9CisJTklHX1dSKE5JR19SRUdJU1RFUlNfTEVEX0NPTlRST0xfQkxJ TktfUkFURV9QMCArIHBvcnQqNCwgdmFsKTsKKwlOSUdfV1IoTklHX1JFR0lTVEVSU19MRURf Q09OVFJPTF9CTElOS19SQVRFX0VOQV9QMCArIHBvcnQqNCwgMSk7Cit9CisKK3N0YXRpYyB2 b2lkIGJueDJ4X2xlZHNfdW5zZXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9 IGJwLT5wb3J0OworCisJTklHX1dSKE5JR19SRUdJU1RFUlNfTEVEXzEwR19QMCArIHBvcnQq NCwgMCk7CisKKwlOSUdfV1IoTklHX1JFR0lTVEVSU19MRURfTU9ERV9QMCArIHBvcnQqNCwg U0hBUkVEX0hXX0NGR19MRURfTUFDMSk7Cit9CisKK3N0YXRpYyB1MzIgYm54MnhfYml0c19l bihzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYmxvY2ssIHUzMiByZWcsCisJCQkJdTMyIGJpdHMp Cit7CisJdTMyIHZhbCA9IFJFR19SRChicCwgYmxvY2ssIHJlZyk7CisKKwl2YWwgfD0gYml0 czsKKwlSRUdfV1IoYnAsIGJsb2NrLCByZWcsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKwor c3RhdGljIHUzMiBibngyeF9iaXRzX2RpcyhzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYmxvY2ss IHUzMiByZWcsCisJCQkJIHUzMiBiaXRzKQoreworCXUzMiB2YWwgPSBSRUdfUkQoYnAsIGJs b2NrLCByZWcpOworCisJdmFsICY9IH5iaXRzOworCVJFR19XUihicCwgYmxvY2ssIHJlZywg dmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IGJueDJ4X21kaW8yMl93cml0 ZShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCWludCByYzsKKwl1 MzIgdG1wLCBpOworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIGVtYWNfYmFzZSA9IHBv cnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKKworLyoJRFAoTkVUSUZfTVNH X0hXLCAicGh5X2FkZHIgMHgleCAgcmVnIDB4JXggIHZhbCAweCUwOHhcbiIsCisJICAgYnAt PnBoeV9hZGRyLCByZWcsIHZhbCk7ICovCisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9J TlRfTU9ERV9BVVRPX1BPTExJTkdfRkxBRykgeworCisJCXRtcCA9IFJFR19SRChicCwgZW1h Y19iYXNlLCBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJCXRtcCAmPSB+RU1BQ19NRElP X01PREVfQVVUT19QT0xMOworCQlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB0 bXApOworCQlSRUdfUkQoYnAsIGVtYWNfYmFzZSwgRU1BQ19SRUdfRU1BQ19NRElPX01PREUp OworCQl1ZGVsYXkoNDApOworCX0KKworCXRtcCA9ICgoYnAtPnBoeV9hZGRyIDw8IDIxKSB8 IChyZWcgPDwgMTYpIHwKKwkgICAgICAgKHZhbCAmIEVNQUNfTURJT19DT01NX0RBVEEpIHwK KwkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9XUklURV8yMiB8CisJICAgICAgIEVN QUNfTURJT19DT01NX1NUQVJUX0JVU1kpOworCUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NRElP X0NPTU0sIHRtcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgeworCQl1ZGVsYXko MTApOworCisJCXRtcCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX01E SU9fQ09NTSk7CisJCWlmICghKHRtcCAmIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpKSB7 CisJCQl1ZGVsYXkoNSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0bXAgJiBFTUFD X01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7CisJCUJOWDJYX0VSUigid3JpdGUgcGh5IHJlZ2lz dGVyIGZhaWxlZFxuIik7CisKKwkJcmMgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJcmMgPSAw OworCX0KKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElO R19GTEFHKSB7CisKKwkJdG1wID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VN QUNfTURJT19NT0RFKTsKKwkJdG1wIHw9IEVNQUNfTURJT19NT0RFX0FVVE9fUE9MTDsKKwkJ RU1BQ19XUihFTUFDX1JFR19FTUFDX01ESU9fTU9ERSwgdG1wKTsKKwl9CisKKwlyZXR1cm4g cmM7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfbWRpbzIyX3JlYWQoc3RydWN0IGJueDJ4ICpi cCwgdTMyIHJlZywgdTMyICpyZXRfdmFsKQoreworCWludCByYzsKKwl1MzIgdmFsLCBpOwor CWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIGVtYWNfYmFzZSA9IHBvcnQgPyBHUkNCQVNF X0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX0lO VF9NT0RFX0FVVE9fUE9MTElOR19GTEFHKSB7CisKKwkJdmFsID0gUkVHX1JEKGJwLCBlbWFj X2Jhc2UsIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKKwkJdmFsICY9IH5FTUFDX01ESU9f TU9ERV9BVVRPX1BPTEw7CisJCUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHZh bCk7CisJCVJFR19SRChicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7 CisJCXVkZWxheSg0MCk7CisJfQorCisJdmFsID0gKChicC0+cGh5X2FkZHIgPDwgMjEpIHwg KHJlZyA8PCAxNikgfAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9DT01NQU5EX1JFQURfMjIg fAorCSAgICAgICBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKTsKKwlFTUFDX1dSKEVNQUNf UkVHX0VNQUNfTURJT19DT01NLCB2YWwpOworCisJZm9yIChpID0gMDsgaSA8IDUwOyBpKysp IHsKKwkJdWRlbGF5KDEwKTsKKworCQl2YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSwgRU1B Q19SRUdfRU1BQ19NRElPX0NPTU0pOworCQlpZiAoISh2YWwgJiBFTUFDX01ESU9fQ09NTV9T VEFSVF9CVVNZKSkgeworCQkJdmFsICY9IEVNQUNfTURJT19DT01NX0RBVEE7CisJCQlicmVh azsKKwkJfQorCX0KKworCWlmICh2YWwgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7 CisJCUJOWDJYX0VSUigicmVhZCBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworCQkqcmV0 X3ZhbCA9IDB4MDsKKwkJcmMgPSAtRUJVU1k7CisJfSBlbHNlIHsKKwkJKnJldF92YWwgPSB2 YWw7CisJCXJjID0gMDsKKwl9CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9JTlRfTU9E RV9BVVRPX1BPTExJTkdfRkxBRykgeworCisJCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNl LCBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJCXZhbCB8PSBFTUFDX01ESU9fTU9ERV9B VVRPX1BPTEw7CisJCUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHZhbCk7CisJ fQorCisvKglEUChORVRJRl9NU0dfSFcsICJwaHlfYWRkciAweCV4ICByZWcgMHgleCAgcmV0 X3ZhbCAweCUwOHhcbiIsCisJICAgYnAtPnBoeV9hZGRyLCByZWcsICpyZXRfdmFsKTsgKi8K KworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9tZGlvNDVfd3JpdGUoc3Ry dWN0IGJueDJ4ICpicCwgdTMyIHJlZywgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJaW50IHJj ID0gMDsKKwl1MzIgdG1wLCBpOworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIGVtYWNf YmFzZSA9IHBvcnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMDsKKworCWlmIChi cC0+cGh5X2ZsYWdzICYgUEhZX0lOVF9NT0RFX0FVVE9fUE9MTElOR19GTEFHKSB7CisKKwkJ dG1wID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsK KwkJdG1wICY9IH5FTUFDX01ESU9fTU9ERV9BVVRPX1BPTEw7CisJCUVNQUNfV1IoRU1BQ19S RUdfRU1BQ19NRElPX01PREUsIHRtcCk7CisJCVJFR19SRChicCwgZW1hY19iYXNlLCBFTUFD X1JFR19FTUFDX01ESU9fTU9ERSk7CisJCXVkZWxheSg0MCk7CisJfQorCisJLyogc2V0IGNs YXVzZSA0NSBtb2RlICovCisJdG1wID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVH X0VNQUNfTURJT19NT0RFKTsKKwl0bXAgfD0gRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1Owor CUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NRElPX01PREUsIHRtcCk7CisKKwkvKiBhZGRyZXNz ICovCisJdG1wID0gKChicC0+cGh5X2FkZHIgPDwgMjEpIHwgKHJlZyA8PCAxNikgfCBhZGRy IHwKKwkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTIHwKKwkgICAgICAg RU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7CisJRU1BQ19XUihFTUFDX1JFR19FTUFDX01E SU9fQ09NTSwgdG1wKTsKKworCWZvciAoaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisJCXVkZWxh eSgxMCk7CisKKwkJdG1wID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNf TURJT19DT01NKTsKKwkJaWYgKCEodG1wICYgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkp IHsKKwkJCXVkZWxheSg1KTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHRtcCAmIEVN QUNfTURJT19DT01NX1NUQVJUX0JVU1kpIHsKKwkJQk5YMlhfRVJSKCJ3cml0ZSBwaHkgcmVn aXN0ZXIgZmFpbGVkXG4iKTsKKworCQlyYyA9IC1FQlVTWTsKKwl9IGVsc2UgeworCQkvKiBk YXRhICovCisJCXRtcCA9ICgoYnAtPnBoeV9hZGRyIDw8IDIxKSB8IChyZWcgPDwgMTYpIHwg dmFsIHwKKwkJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfV1JJVEVfNDUgfAorCQkg ICAgICAgRU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSk7CisJCUVNQUNfV1IoRU1BQ19SRUdf RU1BQ19NRElPX0NPTU0sIHRtcCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsK KwkJCXVkZWxheSgxMCk7CisKKwkJCXRtcCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBFTUFD X1JFR19FTUFDX01ESU9fQ09NTSk7CisJCQlpZiAoISh0bXAgJiBFTUFDX01ESU9fQ09NTV9T VEFSVF9CVVNZKSkgeworCQkJCXVkZWxheSg1KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQor CisJCWlmICh0bXAgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7CisJCQlCTlgyWF9F UlIoIndyaXRlIHBoeSByZWdpc3RlciBmYWlsZWRcbiIpOworCisJCQlyYyA9IC1FQlVTWTsK KwkJfQorCX0KKworCS8qIHVuc2V0IGNsYXVzZSA0NSBtb2RlICovCisJdG1wID0gUkVHX1JE KGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsKKwl0bXAgJj0gfkVN QUNfTURJT19NT0RFX0NMQVVTRV80NTsKKwlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19N T0RFLCB0bXApOworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5UX01PREVfQVVUT19Q T0xMSU5HX0ZMQUcpIHsKKworCQl0bXAgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSwgRU1BQ19S RUdfRU1BQ19NRElPX01PREUpOworCQl0bXAgfD0gRU1BQ19NRElPX01PREVfQVVUT19QT0xM OworCQlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB0bXApOworCX0KKworCXJl dHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9tZGlvNDVfcmVhZChzdHJ1Y3QgYm54 MnggKmJwLCB1MzIgcmVnLCB1MzIgYWRkciwKKwkJCSAgICAgdTMyICpyZXRfdmFsKQorewor CWludCByYyA9IDA7CisJdTMyIHZhbCwgaTsKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXUz MiBlbWFjX2Jhc2UgPSBwb3J0ID8gR1JDQkFTRV9FTUFDMSA6IEdSQ0JBU0VfRU1BQzA7CisK KwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9JTlRfTU9ERV9BVVRPX1BPTExJTkdfRkxBRykg eworCisJCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX01ESU9f TU9ERSk7CisJCXZhbCAmPSB+RU1BQ19NRElPX01PREVfQVVUT19QT0xMOworCQlFTUFDX1dS KEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB2YWwpOworCQlSRUdfUkQoYnAsIGVtYWNfYmFz ZSwgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOworCQl1ZGVsYXkoNDApOworCX0KKworCS8q IHNldCBjbGF1c2UgNDUgbW9kZSAqLworCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBF TUFDX1JFR19FTUFDX01ESU9fTU9ERSk7CisJdmFsIHw9IEVNQUNfTURJT19NT0RFX0NMQVVT RV80NTsKKwlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB2YWwpOworCisJLyog YWRkcmVzcyAqLworCXZhbCA9ICgoYnAtPnBoeV9hZGRyIDw8IDIxKSB8IChyZWcgPDwgMTYp IHwgYWRkciB8CisJICAgICAgIEVNQUNfTURJT19DT01NX0NPTU1BTkRfQUREUkVTUyB8CisJ ICAgICAgIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpOworCUVNQUNfV1IoRU1BQ19SRUdf RU1BQ19NRElPX0NPTU0sIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykgewor CQl1ZGVsYXkoMTApOworCisJCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBFTUFDX1JF R19FTUFDX01ESU9fQ09NTSk7CisJCWlmICghKHZhbCAmIEVNQUNfTURJT19DT01NX1NUQVJU X0JVU1kpKSB7CisJCQl1ZGVsYXkoNSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh2 YWwgJiBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZKSB7CisJCUJOWDJYX0VSUigicmVhZCBw aHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworCQkqcmV0X3ZhbCA9IDA7CisJCXJjID0gLUVC VVNZOworCX0gZWxzZSB7CisJCS8qIGRhdGEgKi8KKwkJdmFsID0gKChicC0+cGh5X2FkZHIg PDwgMjEpIHwgKHJlZyA8PCAxNikgfAorCQkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFO RF9SRUFEXzQ1IHwKKwkJICAgICAgIEVNQUNfTURJT19DT01NX1NUQVJUX0JVU1kpOworCQlF TUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19DT01NLCB2YWwpOworCisJCWZvciAoaSA9IDA7 IGkgPCA1MDsgaSsrKSB7CisJCQl1ZGVsYXkoMTApOworCisJCQl2YWwgPSBSRUdfUkQoYnAs IGVtYWNfYmFzZSwgRU1BQ19SRUdfRU1BQ19NRElPX0NPTU0pOworCQkJaWYgKCEodmFsICYg RU1BQ19NRElPX0NPTU1fU1RBUlRfQlVTWSkpIHsKKwkJCQl2YWwgJj0gRU1BQ19NRElPX0NP TU1fREFUQTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICh2YWwgJiBFTUFDX01E SU9fQ09NTV9TVEFSVF9CVVNZKSB7CisJCQlCTlgyWF9FUlIoInJlYWQgcGh5IHJlZ2lzdGVy IGZhaWxlZFxuIik7CisKKwkJCXZhbCA9IDA7CisJCQlyYyA9IC1FQlVTWTsKKwkJfQorCisJ CSpyZXRfdmFsID0gdmFsOworCX0KKworCS8qIHVuc2V0IGNsYXVzZSA0NSBtb2RlICovCisJ dmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNfTURJT19NT0RFKTsK Kwl2YWwgJj0gfkVNQUNfTURJT19NT0RFX0NMQVVTRV80NTsKKwlFTUFDX1dSKEVNQUNfUkVH X0VNQUNfTURJT19NT0RFLCB2YWwpOworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfSU5U X01PREVfQVVUT19QT0xMSU5HX0ZMQUcpIHsKKworCQl2YWwgPSBSRUdfUkQoYnAsIGVtYWNf YmFzZSwgRU1BQ19SRUdfRU1BQ19NRElPX01PREUpOworCQl2YWwgfD0gRU1BQ19NRElPX01P REVfQVVUT19QT0xMOworCQlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTURJT19NT0RFLCB2YWwp OworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9tZGlvNDVfdndy aXRlKHN0cnVjdCBibngyeCAqYnAsIHUzMiByZWcsIHUzMiBhZGRyLCB1MzIgdmFsKQorewor CWludCBpOworCXUzMiByZF92YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewor CQlibngyeF9tZGlvNDVfd3JpdGUoYnAsIHJlZywgYWRkciwgdmFsKTsKKwkJbWRlbGF5KDUp OworCQlibngyeF9tZGlvNDVfcmVhZChicCwgcmVnLCBhZGRyLCAmcmRfdmFsKTsKKwkJLyog aWYgdGhlIHJlYWQgdmFsdWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB2YWx1ZSB3ZSB3cm90 ZSwKKwkJICAgd2Ugc2hvdWxkIHdyaXRlIGl0IGFnYWluICovCisJCWlmIChyZF92YWwgPT0g dmFsKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlCTlgyWF9FUlIoIk1ESU8gd3JpdGUg aW4gQ0w0NSBmYWlsZWRcbiIpOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCisqIERlZmVycmVkIEludGVycnVwdCBzZXJ2aWNlIGZ1bmN0aW9ucwor KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYm54MnhfZmxvd19jdHJs X3Jlc29sdmUoc3RydWN0IGJueDJ4ICpicCwgdTMyIGdwX3N0YXR1cykKK3sKKwl1MzIgbGRf cGF1c2U7CS8qIGxvY2FsIGRyaXZlciAqLworCXUzMiBscF9wYXVzZTsJLyogbGluayBwYXJ0 bmVyICovCisJdTMyIHBhdXNlX3Jlc3VsdDsKKworCWJwLT5mbG93X2N0cmwgPSAwOworCisJ LyogcmVvbHZlIGZyb20gZ3Bfc3RhdHVzIGluIGNhc2Ugb2YgQU4gY29tcGxldGUgYW5kIG5v dCBzZ21paSAqLworCWlmICgoYnAtPnJlcV9hdXRvbmVnICYgQVVUT05FR19GTE9XX0NUUkwp ICYmCisJICAgIChncF9zdGF0dXMgJiBNRElPX0FOX0NMNzNfT1JfMzdfQ09NUExFVEUpICYm CisJICAgICghKGJwLT5waHlfZmxhZ3MgJiBQSFlfU0dNSUlfRkxBRykpICYmCisJICAgIChY R1hTX0VYVF9QSFlfVFlQRShicCkgPT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVf RElSRUNUKSkgeworCisJCU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JFR19CQU5LX0NP TUJPX0lFRUUwKTsKKwkJYm54MnhfbWRpbzIyX3JlYWQoYnAsIE1ESU9fQ09NQk9fSUVFRTBf QVVUT19ORUdfQURWLAorCQkJCSAgJmxkX3BhdXNlKTsKKwkJYm54MnhfbWRpbzIyX3JlYWQo YnAsCisJCQlNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0xJTktfUEFSVE5FUl9BQklMSVRZ MSwKKwkJCQkgICZscF9wYXVzZSk7CisJCXBhdXNlX3Jlc3VsdCA9IChsZF9wYXVzZSAmCisJ CQkJTURJT19DT01CT19JRUVFMF9BVVRPX05FR19BRFZfUEFVU0VfTUFTSyk+PjU7CisJCXBh dXNlX3Jlc3VsdCB8PSAobHBfcGF1c2UgJgorCQkJCSBNRElPX0NPTUJPX0lFRUUwX0FVVE9f TkVHX0FEVl9QQVVTRV9NQVNLKT4+NzsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJwYXVzZV9y ZXN1bHQgMHgleFxuIiwgcGF1c2VfcmVzdWx0KTsKKworCQlzd2l0Y2ggKHBhdXNlX3Jlc3Vs dCkgewkJCS8qIEFTWU0gUCBBU1lNIFAgKi8KKwkJY2FzZSAweGI6CQkJCS8qICAgMSAgMCAg IDEgIDEgKi8KKwkJCWJwLT5mbG93X2N0cmwgPSBGTE9XX0NUUkxfVFg7CisJCQlicmVhazsK KworCQljYXNlIDB4ZToJCQkJLyogICAxICAxICAgMSAgMCAqLworCQkJYnAtPmZsb3dfY3Ry bCA9IEZMT1dfQ1RSTF9SWDsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg1OgkJCQkvKiAgIDAg IDEgICAwICAxICovCisJCWNhc2UgMHg3OgkJCQkvKiAgIDAgIDEgICAxICAxICovCisJCWNh c2UgMHhkOgkJCQkvKiAgIDEgIDEgICAwICAxICovCisJCWNhc2UgMHhmOgkJCQkvKiAgIDEg IDEgICAxICAxICovCisJCQlicC0+Zmxvd19jdHJsID0gRkxPV19DVFJMX0JPVEg7CisJCQli cmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCX0gZWxzZSB7IC8qIGZv cmNlZCBtb2RlICovCisJCWJwLT5mbG93X2N0cmwgPSBicC0+cmVxX2Zsb3dfY3RybDsKKwkJ aWYgKGJwLT5yZXFfZmxvd19jdHJsID09IEZMT1dfQ1RSTF9BVVRPKSB7CisJCQlicC0+Zmxv d19jdHJsID0gRkxPV19DVFJMX0JPVEg7CisJCX0KKwl9CisJRFAoTkVUSUZfTVNHX0xJTkss ICJmbG93X2N0cmwgMHgleFxuIiwgYnAtPmZsb3dfY3RybCk7Cit9CisKK3N0YXRpYyB2b2lk IGJueDJ4X2xpbmtfc2V0dGluZ3Nfc3RhdHVzKHN0cnVjdCBibngyeCAqYnAsIHUzMiBncF9z dGF0dXMpCit7CisJYnAtPmxpbmtfc3RhdHVzID0gMDsKKworCWlmIChncF9zdGF0dXMgJiBN RElPX0dQX1NUQVRVU19UT1BfQU5fU1RBVFVTMV9MSU5LX1NUQVRVUykgeworCQlEUChORVRJ Rl9NU0dfTElOSywgImxpbmsgdXBcbiIpOworCisJCWJwLT5saW5rX3VwID0gMTsKKwkJYnAt Pmxpbmtfc3RhdHVzIHw9IExJTktfU1RBVFVTX0xJTktfVVA7CisKKwkJaWYgKGdwX3N0YXR1 cyAmIE1ESU9fR1BfU1RBVFVTX1RPUF9BTl9TVEFUVVMxX0RVUExFWF9TVEFUVVMpIHsKKwkJ CWJwLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJfSBlbHNlIHsKKwkJCWJwLT5kdXBsZXgg PSBEVVBMRVhfSEFMRjsKKwkJfQorCisJCWJueDJ4X2Zsb3dfY3RybF9yZXNvbHZlKGJwLCBn cF9zdGF0dXMpOworCisJCXN3aXRjaCAoZ3Bfc3RhdHVzICYgR1BfU1RBVFVTX1NQRUVEX01B U0spIHsKKwkJY2FzZSBHUF9TVEFUVVNfMTBNOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVF RF8xMDsKKwkJCWlmIChicC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQkJYnAtPmxp bmtfc3RhdHVzIHw9IExJTktfMTBURkQ7CisJCQl9IGVsc2UgeworCQkJCWJwLT5saW5rX3N0 YXR1cyB8PSBMSU5LXzEwVEhEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBHUF9TVEFU VVNfMTAwTToKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTAwOworCQkJaWYgKGJwLT5k dXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCQlicC0+bGlua19zdGF0dXMgfD0gTElOS18x MDBUWEZEOworCQkJfSBlbHNlIHsKKwkJCQlicC0+bGlua19zdGF0dXMgfD0gTElOS18xMDBU WEhEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBHUF9TVEFUVVNfMUc6CisJCWNhc2Ug R1BfU1RBVFVTXzFHX0tYOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwOworCQkJ aWYgKGJwLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJCQlicC0+bGlua19zdGF0dXMg fD0gTElOS18xMDAwVEZEOworCQkJfSBlbHNlIHsKKwkJCQlicC0+bGlua19zdGF0dXMgfD0g TElOS18xMDAwVEhEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBHUF9TVEFUVVNfMl81 RzoKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMjUwMDsKKwkJCWlmIChicC0+ZHVwbGV4 ID09IERVUExFWF9GVUxMKSB7CisJCQkJYnAtPmxpbmtfc3RhdHVzIHw9IExJTktfMjUwMFRG RDsKKwkJCX0gZWxzZSB7CisJCQkJYnAtPmxpbmtfc3RhdHVzIHw9IExJTktfMjUwMFRIRDsK KwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgR1BfU1RBVFVTXzVHOgorCQljYXNlIEdQX1NU QVRVU182RzoKKwkJCUJOWDJYX0VSUigibGluayBzcGVlZCB1bnN1cHBvcnRlZCAgZ3Bfc3Rh dHVzIDB4JXhcbiIsCisJCQkJICBncF9zdGF0dXMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBH UF9TVEFUVVNfMTBHX0tYNDoKKwkJY2FzZSBHUF9TVEFUVVNfMTBHX0hJRzoKKwkJY2FzZSBH UF9TVEFUVVNfMTBHX0NYNDoKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7CisJ CQlicC0+bGlua19zdGF0dXMgfD0gTElOS18xMEdURkQ7CisJCQlicmVhazsKKworCQljYXNl IEdQX1NUQVRVU18xMkdfSElHOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMjAwMDsK KwkJCWJwLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEyR1RGRDsKKwkJCWJyZWFrOworCisJCWNh c2UgR1BfU1RBVFVTXzEyXzVHOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMjUwMDsK KwkJCWJwLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEyXzVHVEZEOworCQkJYnJlYWs7CisKKwkJ Y2FzZSBHUF9TVEFUVVNfMTNHOgorCQkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMzAwMDsK KwkJCWJwLT5saW5rX3N0YXR1cyB8PSBMSU5LXzEzR1RGRDsKKwkJCWJyZWFrOworCisJCWNh c2UgR1BfU1RBVFVTXzE1RzoKKwkJCWJwLT5saW5lX3NwZWVkID0gU1BFRURfMTUwMDA7CisJ CQlicC0+bGlua19zdGF0dXMgfD0gTElOS18xNUdURkQ7CisJCQlicmVhazsKKworCQljYXNl IEdQX1NUQVRVU18xNkc6CisJCQlicC0+bGluZV9zcGVlZCA9IFNQRUVEXzE2MDAwOworCQkJ YnAtPmxpbmtfc3RhdHVzIHw9IExJTktfMTZHVEZEOworCQkJYnJlYWs7CisKKwkJZGVmYXVs dDoKKwkJCUJOWDJYX0VSUigibGluayBzcGVlZCB1bnN1cHBvcnRlZCAgZ3Bfc3RhdHVzIDB4 JXhcbiIsCisJCQkJICBncF9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKworCQlicC0+bGlu a19zdGF0dXMgfD0gTElOS19TVEFUVVNfU0VSREVTX0xJTks7CisKKwkJaWYgKGJwLT5yZXFf YXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpIHsKKwkJCWJwLT5saW5rX3N0YXR1cyB8PSBMSU5L X1NUQVRVU19BVVRPX05FR09USUFURV9FTkFCTEVEOworCisJCQlpZiAoZ3Bfc3RhdHVzICYg TURJT19BTl9DTDczX09SXzM3X0NPTVBMRVRFKSB7CisJCQkJYnAtPmxpbmtfc3RhdHVzIHw9 CisJCQkJCUxJTktfU1RBVFVTX0FVVE9fTkVHT1RJQVRFX0NPTVBMRVRFOworCQkJfQorCQkJ aWYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19QQVJBTExFTCkgeworCQkJCWJwLT5saW5rX3N0 YXR1cyB8PQorCQkJCQlMSU5LX1NUQVRVU19QQVJBTExFTF9ERVRFQ1RJT05fVVNFRDsKKwkJ CX0KKwkJfQorCisJCWlmIChicC0+Zmxvd19jdHJsICYgRkxPV19DVFJMX1RYKSB7CisJCSAg ICAgICBicC0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfVFhfRkxPV19DT05UUk9MX0VO QUJMRUQ7CisJCX0KKwkJaWYgKGJwLT5mbG93X2N0cmwgJiBGTE9XX0NUUkxfUlgpIHsKKwkJ ICAgICAgIGJwLT5saW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19SWF9GTE9XX0NPTlRST0xf RU5BQkxFRDsKKwkJfQorCisJfSBlbHNlIHsgLyogbGlua19kb3duICovCisJCURQKE5FVElG X01TR19MSU5LLCAibGluayBkb3duXG4iKTsKKworCQlicC0+bGlua191cCA9IDA7CisKKwkJ YnAtPmxpbmVfc3BlZWQgPSAwOworCQlicC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJw LT5mbG93X2N0cmwgPSAwOworCX0KKworCURQKE5FVElGX01TR19MSU5LLCAiZ3Bfc3RhdHVz IDB4JXggIGxpbmtfdXAgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBsaW5lX3NwZWVkICVkICBk dXBsZXggJWQgIGZsb3dfY3RybCAweCV4IgorCQkgICAgIiAgbGlua19zdGF0dXMgMHgleFxu IiwKKwkgICBncF9zdGF0dXMsIGJwLT5saW5rX3VwLCBicC0+bGluZV9zcGVlZCwgYnAtPmR1 cGxleCwgYnAtPmZsb3dfY3RybCwKKwkgICBicC0+bGlua19zdGF0dXMpOworfQorCitzdGF0 aWMgdm9pZCBibngyeF9saW5rX2ludF9hY2soc3RydWN0IGJueDJ4ICpicCwgaW50IGlzXzEw ZykKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCisJLyogZmlyc3QgcmVzZXQgYWxsIHN0 YXR1cworCSAqIHdlIGFzdW1lIG9ubHkgb25lIGxpbmUgd2lsbCBiZSBjaGFuZ2UgYXQgYSB0 aW1lICovCisJYm54MnhfYml0c19kaXMoYnAsIEdSQ0JBU0VfTklHLAorCQkgICAgICAgTklH X1JFR0lTVEVSU19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkgICAgICAg KE5JR19YR1hTMF9MSU5LX1NUQVRVUyB8CisJCQlOSUdfU0VSREVTMF9MSU5LX1NUQVRVUyB8 CisJCQlOSUdfU1RBVFVTX0lOVEVSUlVQVF9YR1hTMF9MSU5LMTBHKSk7CisJaWYgKGJwLT5s aW5rX3VwKSB7CisJCWlmIChpc18xMGcpIHsKKwkJCS8qIERpc2FibGUgdGhlIDEwRyBsaW5r IGludGVycnVwdAorCQkJICogYnkgd3JpdGluZyAxIHRvIHRoZSBzdGF0dXMgcmVnaXN0ZXIK KwkJCSAqLworCQkJRFAoTkVUSUZfTVNHX0xJTkssICIxMEcgWEdYUyBsaW5rIHVwXG4iKTsK KwkJCWJueDJ4X2JpdHNfZW4oYnAsIEdSQ0JBU0VfTklHLAorCQkJCSAgICAgIE5JR19SRUdJ U1RFUlNfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMCArCisJCQkJICAgICAgcG9ydCo0LAorCQkJ CSAgICAgIE5JR19TVEFUVVNfSU5URVJSVVBUX1hHWFMwX0xJTksxMEcpOworCisJCX0gZWxz ZSBpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsKKwkJCS8qIERpc2FibGUg dGhlIGxpbmsgaW50ZXJydXB0CisJCQkgKiBieSB3cml0aW5nIDEgdG8gdGhlIHJlbGV2YW50 IGxhbmUKKwkJCSAqIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIKKwkJCSAqLworCQkJRFAoTkVU SUZfTVNHX0xJTkssICIxRyBYR1hTIGxpbmsgdXBcbiIpOworCQkJYm54MnhfYml0c19lbihi cCwgR1JDQkFTRV9OSUcsCisJCQkJICAgICAgTklHX1JFR0lTVEVSU19TVEFUVVNfSU5URVJS VVBUX1BPUlQwICsKKwkJCQkgICAgICBwb3J0KjQsICgoMSA8PCBicC0+c2VyX2xhbmUpIDw8 CisJCQkJCSAgICAgICBOSUdfWEdYUzBfTElOS19TVEFUVVNfU0laRSkpOworCisJCX0gZWxz ZSB7IC8qIFNlckRlcyAqLworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXJEZXMgbGluayB1 cFxuIik7CisJCQkvKiBEaXNhYmxlIHRoZSBsaW5rIGludGVycnVwdAorCQkJICogYnkgd3Jp dGluZyAxIHRvIHRoZSBzdGF0dXMgcmVnaXN0ZXIKKwkJCSAqLworCQkJYm54MnhfYml0c19l bihicCwgR1JDQkFTRV9OSUcsCisJCQkJICAgICAgTklHX1JFR0lTVEVSU19TVEFUVVNfSU5U RVJSVVBUX1BPUlQwICsKKwkJCQkgICAgICBwb3J0KjQsIE5JR19TRVJERVMwX0xJTktfU1RB VFVTKTsKKwkJfQorCisJfSBlbHNlIHsgLyogbGlua19kb3duICovCisJfQorfQorCitzdGF0 aWMgaW50IGJueDJ4X2V4dF9waHlfaXNfbGlua191cChzdHJ1Y3QgYm54MnggKmJwKQorewor CXUzMiBleHRfcGh5X3R5cGU7CisJdTMyIGV4dF9waHlfYWRkcjsKKwl1MzIgbG9jYWxfcGh5 OworCXUzMiB2YWwgPSAwOworCXUzMiByeF9zZCwgcGNzX3N0YXR1czsKKworCWlmIChicC0+ cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQlsb2NhbF9waHkgPSBicC0+cGh5X2Fk ZHI7CisJCWV4dF9waHlfYWRkciA9ICgoYnAtPmV4dF9waHlfY29uZmlnICYKKwkJCQkgUE9S VF9IV19DRkdfWEdYU19FWFRfUEhZX0FERFJfTUFTSykgPj4KKwkJCQlQT1JUX0hXX0NGR19Y R1hTX0VYVF9QSFlfQUREUl9TSElGVCk7CisJCWJwLT5waHlfYWRkciA9ICh1OClleHRfcGh5 X2FkZHI7CisKKwkJZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoYnApOworCQlz d2l0Y2ggKGV4dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BI WV9UWVBFX0RJUkVDVDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyBEaXJlY3RcbiIp OworCQkJdmFsID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19F WFRfUEhZX1RZUEVfQkNNODcwNToKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA1 XG4iKTsKKwkJCWJueDJ4X21kaW80NV9yZWFkKGJwLCBFWFRfUEhZX09QVF9XSVNfREVWQUQs CisJCQkJCSAgRVhUX1BIWV9PUFRfTEFTSV9TVEFUVVMsICZ2YWwpOworCQkJRFAoTkVUSUZf TVNHX0xJTkssICI4NzA1IExBU0kgc3RhdHVzIGlzICVkXG4iLCB2YWwpOworCisJCQlibngy eF9tZGlvNDVfcmVhZChicCwgRVhUX1BIWV9PUFRfV0lTX0RFVkFELAorCQkJCQkgIEVYVF9Q SFlfT1BUX0xBU0lfU1RBVFVTLCAmdmFsKTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcw NSBMQVNJIHN0YXR1cyBpcyAlZFxuIiwgdmFsKTsKKworCQkJYm54MnhfbWRpbzQ1X3JlYWQo YnAsIEVYVF9QSFlfT1BUX1BNQV9QTURfREVWQUQsCisJCQkJCSAgRVhUX1BIWV9PUFRfUE1E X1JYX1NELCAmcnhfc2QpOworCQkJdmFsID0gKHJ4X3NkICYgMHgxKTsKKwkJCWJyZWFrOwor CisJCWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKKwkJCURQ KE5FVElGX01TR19MSU5LLCAiWEdYUyA4NzA2XG4iKTsKKwkJCWJueDJ4X21kaW80NV9yZWFk KGJwLCBFWFRfUEhZX09QVF9QTUFfUE1EX0RFVkFELAorCQkJCQkgIEVYVF9QSFlfT1BUX0xB U0lfU1RBVFVTLCAmdmFsKTsKKwkJCURQKE5FVElGX01TR19MSU5LLCAiODcwNiBMQVNJIHN0 YXR1cyBpcyAlZFxuIiwgdmFsKTsKKworCQkJYm54MnhfbWRpbzQ1X3JlYWQoYnAsIEVYVF9Q SFlfT1BUX1BNQV9QTURfREVWQUQsCisJCQkJCSAgRVhUX1BIWV9PUFRfTEFTSV9TVEFUVVMs ICZ2YWwpOworCQkJRFAoTkVUSUZfTVNHX0xJTkssICI4NzA2IExBU0kgc3RhdHVzIGlzICVk XG4iLCB2YWwpOworCisJCQlibngyeF9tZGlvNDVfcmVhZChicCwgRVhUX1BIWV9PUFRfUE1B X1BNRF9ERVZBRCwKKwkJCQkJICBFWFRfUEhZX09QVF9QTURfUlhfU0QsICZyeF9zZCk7CisJ CQlibngyeF9tZGlvNDVfcmVhZChicCwgRVhUX1BIWV9PUFRfUENTX0RFVkFELAorCQkJCQkg RVhUX1BIWV9PUFRfUENTX1NUQVRVUywgJnBjc19zdGF0dXMpOworCQkJRFAoTkVUSUZfTVNH X0xJTkssICI4NzA2IHJ4X3NkIDB4JXgiCisJCQkgICAiICBwY3Nfc3RhdHVzIDB4JXhcbiIs IHJ4X3NkLCBwY3Nfc3RhdHVzKTsKKwkJCS8qIGxpbmsgaXMgdXAgaWYgYm90aCBiaXQgMCBv ZiBwbWRfcnggYW5kCisJCQkgKiBiaXQgMCBvZiBwY3Nfc3RhdHVzIGFyZSBzZXQKKwkJCSAq LworCQkJdmFsID0gKHJ4X3NkICYgcGNzX3N0YXR1cyk7CisJCQlicmVhazsKKworCQlkZWZh dWx0OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgWEdYUyBleHRfcGh5X2NvbmZpZyAw eCV4XG4iLAorCQkJICAgYnAtPmV4dF9waHlfY29uZmlnKTsKKwkJCXZhbCA9IDA7CisJCQli cmVhazsKKwkJfQorCQlicC0+cGh5X2FkZHIgPSBsb2NhbF9waHk7CisKKwl9IGVsc2UgeyAv KiBTZXJEZXMgKi8KKwkJZXh0X3BoeV90eXBlID0gU0VSREVTX0VYVF9QSFlfVFlQRShicCk7 CisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVT X0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlNlckRlcyBE aXJlY3RcbiIpOworCQkJdmFsID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgUE9SVF9IV19D RkdfU0VSREVTX0VYVF9QSFlfVFlQRV9CQ001NDgyOgorCQkJRFAoTkVUSUZfTVNHX0xJTkss ICJTZXJEZXMgNTQ4MlxuIik7CisJCQl2YWwgPSAxOworCQkJYnJlYWs7CisKKwkJZGVmYXVs dDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiQkFEIFNlckRlcyBleHRfcGh5X2NvbmZpZyAw eCV4XG4iLAorCQkJICAgYnAtPmV4dF9waHlfY29uZmlnKTsKKwkJCXZhbCA9IDA7CisJCQli cmVhazsKKwkJfQorCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4 X2JtYWNfZW5hYmxlKHN0cnVjdCBibngyeCAqYnAsIGludCBpc19sYikKK3sKKwlpbnQgcG9y dCA9IGJwLT5wb3J0OworCXUzMiBibWFjX2FkZHIgPSBwb3J0ID8gTklHX1JFR0lTVEVSU19J TkdSRVNTX0JNQUMxX01FTSA6CisJCQkgICAgICAgTklHX1JFR0lTVEVSU19JTkdSRVNTX0JN QUMwX01FTTsKKwl1MzIgd2Jfd3JpdGVbMl07CisJdTMyIHZhbDsKKworCURQKE5FVElGX01T R19MSU5LLCAiZW5hYmxlaW5nIEJpZ01BQ1xuIik7CisJLyogcmVzZXQgYW5kIHVucmVzZXQg dGhlIEJpZ01hYyAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDLCBNSVNDX1JFR0lTVEVS U19SRVNFVF9SRUdfMl9DTEVBUiwKKwkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JF R18yX1JTVF9CTUFDMCA8PCBwb3J0KSk7CisJbWRlbGF5KDUpOworCVJFR19XUihicCwgR1JD QkFTRV9NSVNDLCBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9TRVQsCisJICAgICAgIChN SVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcG9ydCkpOworCisJLyog ZW5hYmxlIGFjY2VzcyBmb3IgYm1hYyByZWdpc3RlcnMgKi8KKwlOSUdfV1IoTklHX1JFR0lT VEVSU19CTUFDMF9SRUdTX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKKworCS8qIFhHWFMgY29u dHJvbCAqLworCXdiX3dyaXRlWzBdID0gMHgzYzsKKwl3Yl93cml0ZVsxXSA9IDA7CisJUkVH X1dSX0RNQUUoYnAsIEdSQ0JBU0VfTklHLAorCQkgICAgYm1hY19hZGRyICsgQklHTUFDX1JF R0lTVEVSX0JNQUNfWEdYU19DT05UUk9MLAorCQkgICAgd2Jfd3JpdGUsIDIpOworCisJLyog dHggTUFDIFNBICovCisJd2Jfd3JpdGVbMF0gPSAoKGJwLT5kZXYtPmRldl9hZGRyWzJdIDw8 IDI0KSB8CisJCSAgICAgICAoYnAtPmRldi0+ZGV2X2FkZHJbM10gPDwgMTYpIHwKKwkJICAg ICAgIChicC0+ZGV2LT5kZXZfYWRkcls0XSA8PCA4KSB8CisJCQlicC0+ZGV2LT5kZXZfYWRk cls1XSk7CisJd2Jfd3JpdGVbMV0gPSAoKGJwLT5kZXYtPmRldl9hZGRyWzBdIDw8IDgpIHwK KwkJCWJwLT5kZXYtPmRldl9hZGRyWzFdKTsKKwlSRUdfV1JfRE1BRShicCwgR1JDQkFTRV9O SUcsCisJCSAgICBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfVFhfU09VUkNFX0FERFIs IHdiX3dyaXRlLCAyKTsKKworCS8qIHR4IGNvbnRyb2wgKi8KKwl2YWwgPSAweGMwOworCWlm IChicC0+Zmxvd19jdHJsICYgRkxPV19DVFJMX1RYKSB7CisJCXZhbCB8PSAweDgwMDAwMDsK Kwl9CisJd2Jfd3JpdGVbMF0gPSB2YWw7CisJd2Jfd3JpdGVbMV0gPSAwOworCVJFR19XUl9E TUFFKGJwLCBHUkNCQVNFX05JRywKKwkJICAgIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RF Ul9UWF9DT05UUk9MLCB3Yl93cml0ZSwgMik7CisKKwkvKiBzZXQgdHggbXR1ICovCisJd2Jf d3JpdGVbMF0gPSBicC0+cnhfYnVmX3VzZV9zaXplOworCXdiX3dyaXRlWzFdID0gMDsKKwlS RUdfV1JfRE1BRShicCwgR1JDQkFTRV9OSUcsCisJCSAgICBibWFjX2FkZHIgKyBCSUdNQUNf UkVHSVNURVJfVFhfTUFYX1NJWkUsIHdiX3dyaXRlLCAyKTsKKworCS8qIG1hYyBjb250cm9s ICovCisJdmFsID0gMHgzOworCWlmIChpc19sYikgeworCQl2YWwgfD0gMHg0OworCQlEUChO RVRJRl9NU0dfTElOSywgImVuYWJsZSBibWFjIGxvb3BiYWNrXG4iKTsKKwl9CisJd2Jfd3Jp dGVbMF0gPSB2YWw7CisJd2Jfd3JpdGVbMV0gPSAwOworCVJFR19XUl9ETUFFKGJwLCBHUkNC QVNFX05JRywKKwkJICAgIGJtYWNfYWRkciArIEJJR01BQ19SRUdJU1RFUl9CTUFDX0NPTlRS T0wsIHdiX3dyaXRlLCAyKTsKKworCS8qIHJ4IGNvbnRyb2wgc2V0IHRvIGRvbid0IHN0cmlw IGNyYyAqLworCXZhbCA9IDB4MTQ7CisJaWYgKGJwLT5mbG93X2N0cmwgJiBGTE9XX0NUUkxf UlgpIHsKKwkJdmFsIHw9IDB4MjA7CisJfQorCXdiX3dyaXRlWzBdID0gdmFsOworCXdiX3dy aXRlWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgR1JDQkFTRV9OSUcsCisJCSAgICBibWFj X2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfUlhfQ09OVFJPTCwgd2Jfd3JpdGUsIDIpOworCisJ Lyogc2V0IHJ4IG10dSAqLworCXdiX3dyaXRlWzBdID0gYnAtPnJ4X2J1Zl91c2Vfc2l6ZTsK Kwl3Yl93cml0ZVsxXSA9IDA7CisJUkVHX1dSX0RNQUUoYnAsIEdSQ0JBU0VfTklHLAorCQkg ICAgYm1hY19hZGRyICsgQklHTUFDX1JFR0lTVEVSX1JYX01BWF9TSVpFLCB3Yl93cml0ZSwg Mik7CisKKwkvKiBzZXQgY250IG1heCBzaXplICovCisJd2Jfd3JpdGVbMF0gPSBicC0+cnhf YnVmX3VzZV9zaXplOworCXdiX3dyaXRlWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwgR1JD QkFTRV9OSUcsCisJCSAgICBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfQ05UX01BWF9T SVpFLCB3Yl93cml0ZSwgMik7CisKKwkvKiBjb25maWd1cmUgc2FmYyAqLworCXdiX3dyaXRl WzBdID0gMHgxMDAwMjAwOworCXdiX3dyaXRlWzFdID0gMDsKKwlSRUdfV1JfRE1BRShicCwg R1JDQkFTRV9OSUcsCisJCSAgICBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfUlhfTExG Q19NU0dfRkxEUywKKwkJICAgIHdiX3dyaXRlLCAyKTsKKworCS8qIGZpeCBmb3IgZW11bGF0 aW9uICovCisJaWYgKENISVBfUkVWKGJwKSA9PSBDSElQX1JFVl9FTVVMKSB7CisJCXdiX3dy aXRlWzBdID0gMHhmMDAwOworCQl3Yl93cml0ZVsxXSA9IDA7CisJCVJFR19XUl9ETUFFKGJw LCBHUkNCQVNFX05JRywKKwkJCSAgICBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfVFhf UEFVU0VfVEhSRVNIT0xELAorCQkJICAgIHdiX3dyaXRlLCAyKTsKKwl9CisKKwkvKiByZXNl dCBvbGQgYm1hYyBzdGF0cyAqLworCW1lbXNldCgmYnAtPm9sZF9ibWFjLCAwLCBzaXplb2Yo c3RydWN0IGJtYWNfc3RhdHMpKTsKKworCU5JR19XUihOSUdfUkVHSVNURVJTX1hDTTBfT1VU X0VOICsgcG9ydCo0LCAweDApOworCisJLyogc2VsZWN0IFhHWFMgKi8KKwlOSUdfV1IoTklH X1JFR0lTVEVSU19YR1hTX1NFUkRFUzBfTU9ERV9TRUwgKyBwb3J0KjQsIDB4MSk7CisJTklH X1dSKE5JR19SRUdJU1RFUlNfWEdYU19MQU5FX1NFTF9QMCArIHBvcnQqNCwgMHgwKTsKKwor CS8qIGRpc2FibGUgdGhlIE5JRyBpbi9vdXQgdG8gdGhlIGVtYWMgKi8KKwlOSUdfV1IoTklH X1JFR0lTVEVSU19FTUFDMF9JTl9FTiArIHBvcnQqNCwgMHgwKTsKKwlOSUdfV1IoTklHX1JF R0lTVEVSU19FTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7CisJTklHX1dSKE5J R19SRUdJU1RFUlNfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgwKTsKKworCS8q IGVuYWJsZSB0aGUgTklHIGluL291dCB0byB0aGUgYm1hYyAqLworCU5JR19XUihOSUdfUkVH SVNURVJTX0VHUkVTU19FTUFDMF9QT1JUICsgcG9ydCo0LCAweDApOworCisJTklHX1dSKE5J R19SRUdJU1RFUlNfQk1BQzBfSU5fRU4gKyBwb3J0KjQsIDB4MSk7CisJdmFsID0gMDsKKwlp ZiAoYnAtPmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9UWCkgeworCQl2YWwgPSAxOworCX0KKwlO SUdfV1IoTklHX1JFR0lTVEVSU19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIHZhbCk7 CisJTklHX1dSKE5JR19SRUdJU1RFUlNfQk1BQzBfT1VUX0VOICsgcG9ydCo0LCAweDEpOwor CisJYnAtPnBoeV9mbGFncyB8PSBQSFlfQk1BQ19GTEFHOworCisJYnAtPnN0YXRzX3N0YXRl ID0gU1RBVFNfU1RBVEVfRU5BQkxFOworfQorCitzdGF0aWMgdm9pZCBibngyeF9lbWFjX2Vu YWJsZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisJaW50IHBvcnQgPSBicC0+ cG9ydDsKKwl1MzIgZW1hY19iYXNlID0gcG9ydCA/IEdSQ0JBU0VfRU1BQzEgOiBHUkNCQVNF X0VNQUMwOworCWludCB0aW1lb3V0ID0gMjAwOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJl bmFibGVpbmcgRU1BQ1xuIik7CisJLyogcmVzZXQgYW5kIHVucmVzZXQgdGhlIGVtYWMgY29y ZSAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDLCBNSVNDX1JFR0lTVEVSU19SRVNFVF9S RUdfMl9DTEVBUiwKKwkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9F TUFDMF9IQVJEX0NPUkUgPDwgcG9ydCkpOworCW1kZWxheSg1KTsKKwlSRUdfV1IoYnAsIEdS Q0JBU0VfTUlTQywgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfU0VULAorCSAgICAgICAo TUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0VNQUMwX0hBUkRfQ09SRSA8PCBwb3J0 KSk7CisKKwkvKiBlbmFibGUgZW1hYyBhbmQgbm90IGJtYWMgKi8KKwlOSUdfV1IoTklHX1JF R0lTVEVSU19FR1JFU1NfRU1BQzBfUE9SVCArIHBvcnQqNCwgMSk7CisKKwkvKiBmb3IgcGFs YWRpdW0gKi8KKwlpZiAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0VNVUwpIHsKKwkJLyog VXNlIGxhbmUgMSAob2YgbGFuZXMgMC0zKSAqLworCQlOSUdfV1IoTklHX1JFR0lTVEVSU19Y R1hTX0xBTkVfU0VMX1AwICsgcG9ydCo0LCAxKTsKKwkJTklHX1dSKE5JR19SRUdJU1RFUlNf WEdYU19TRVJERVMwX01PREVfU0VMICsgcG9ydCo0LCAxKTsKKwl9CisJLyogZm9yIGZwZ2Eg Ki8KKwllbHNlIGlmIChDSElQX1JFVihicCkgPT0gQ0hJUF9SRVZfRlBHQSkgeworCQkvKiBV c2UgbGFuZSAxIChvZiBsYW5lcyAwLTMpICovCisJCU5JR19XUihOSUdfUkVHSVNURVJTX1hH WFNfTEFORV9TRUxfUDAgKyBwb3J0KjQsIDEpOworCQlOSUdfV1IoTklHX1JFR0lTVEVSU19Y R1hTX1NFUkRFUzBfTU9ERV9TRUwgKyBwb3J0KjQsIDApOworCX0KKwkvKiBBU0lDICovCisJ ZWxzZSB7CisJCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQkJRFAo TkVUSUZfTVNHX0xJTkssICJYR1hTXG4iKTsKKwkJCS8qIHNlbGVjdCB0aGUgbWFzdGVyIGxh bmVzIChvdXQgb2YgMC0zKSAqLworCQkJTklHX1dSKE5JR19SRUdJU1RFUlNfWEdYU19MQU5F X1NFTF9QMCArIHBvcnQqNCwKKwkJCSAgICAgICBicC0+c2VyX2xhbmUpOworCQkJLyogc2Vs ZWN0IFhHWFMgKi8KKwkJCU5JR19XUihOSUdfUkVHSVNURVJTX1hHWFNfU0VSREVTMF9NT0RF X1NFTCArIHBvcnQqNCwKKwkJCSAgICAgICAxKTsKKworCQl9IGVsc2UgeyAvKiBTZXJEZXMg Ki8KKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVzXG4iKTsKKwkJCS8qIHNlbGVjdCBT ZXJEZXMgKi8KKwkJCU5JR19XUihOSUdfUkVHSVNURVJTX1hHWFNfU0VSREVTMF9NT0RFX1NF TCArIHBvcnQqNCwKKwkJCSAgICAgICAwKTsKKwkJfQorCX0KKworCS8qIGVuYWJsZSBlbWFj ICovCisJTklHX1dSKE5JR19SRUdJU1RFUlNfTklHX0VNQUMwX0VOICsgcG9ydCo0LCAxKTsK KworCS8qIGluaXQgZW1hYyAtIHVzZSByZWFkLW1vZGlmeS13cml0ZSAqLworCS8qIHNlbGYg Y2xlYXIgcmVzZXQgKi8KKwl2YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSwgRU1BQ19SRUdf RU1BQ19NT0RFKTsKKwlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTU9ERSwgKHZhbCB8IEVNQUNf TU9ERV9SRVNFVCkpOworCisJd2hpbGUgKHZhbCAmIEVNQUNfTU9ERV9SRVNFVCkgeworCQl2 YWwgPSBSRUdfUkQoYnAsIGVtYWNfYmFzZSwgRU1BQ19SRUdfRU1BQ19NT0RFKTsKKwkJRFAo TkVUSUZfTVNHX0xJTkssICJFTUFDIHJlc2V0IHJlZyBpcyAldVxuIiwgdmFsKTsKKwkJaWYg KCF0aW1lb3V0KSB7CisJCQlCTlgyWF9FUlIoIkVNQUMgdGltZW91dCFcbiIpOworCQkJYnJl YWs7CisJCX0KKwkJdGltZW91dC0tOworCX0KKworCS8qIHJlc2V0IHR4IHBhcnQgKi8KKwlF TUFDX1dSKEVNQUNfUkVHX0VNQUNfVFhfTU9ERSwgRU1BQ19UWF9NT0RFX1JFU0VUKTsKKwor CXdoaWxlICh2YWwgJiBFTUFDX1RYX01PREVfUkVTRVQpIHsKKwkJdmFsID0gUkVHX1JEKGJw LCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNfVFhfTU9ERSk7CisJCURQKE5FVElGX01TR19M SU5LLCAiRU1BQyByZXNldCByZWcgaXMgJXVcbiIsIHZhbCk7CisJCWlmICghdGltZW91dCkg eworCQkJIEJOWDJYX0VSUigiRU1BQyB0aW1lb3V0IVxuIik7CisJCQkgYnJlYWs7CisJCSB9 CisJCSB0aW1lb3V0LS07CisJfQorCisJaWYgKENISVBfUkVWX0lTX1NMT1coYnApKSB7CisJ CS8qIGNvbmZpZyBHTUlJIG1vZGUgKi8KKwkJdmFsID0gUkVHX1JEKGJwLCBlbWFjX2Jhc2Us IEVNQUNfUkVHX0VNQUNfTU9ERSk7CisJCUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NT0RFLCAo dmFsIHwgRU1BQ19NT0RFX1BPUlRfR01JSSkpOworCisJfSBlbHNlIHsgLyogQVNJQyAqLwor CQkvKiBwYXVzZSBlbmFibGUvZGlzYWJsZSAqLworCQlibngyeF9iaXRzX2RpcyhicCwgZW1h Y19iYXNlLCBFTUFDX1JFR19FTUFDX1JYX01PREUsCisJCQkgICAgICAgRU1BQ19SWF9NT0RF X0ZMT1dfRU4pOworCQlpZiAoYnAtPmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9SWCkgeworCQkJ Ym54MnhfYml0c19lbihicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX1JYX01PREUsCisJ CQkJICAgICAgRU1BQ19SWF9NT0RFX0ZMT1dfRU4pOworCQl9CisKKwkJYm54MnhfYml0c19k aXMoYnAsIGVtYWNfYmFzZSwgRU1BQ19SRUdfRU1BQ19UWF9NT0RFLAorCQkJICAgICAgIEVN QUNfVFhfTU9ERV9FWFRfUEFVU0VfRU4pOworCQlpZiAoYnAtPmZsb3dfY3RybCAmIEZMT1df Q1RSTF9UWCkgeworCQkJYm54MnhfYml0c19lbihicCwgZW1hY19iYXNlLCBFTUFDX1JFR19F TUFDX1RYX01PREUsCisJCQkJICAgICAgRU1BQ19UWF9NT0RFX0VYVF9QQVVTRV9FTik7CisJ CX0KKwl9CisKKwkvKiBLRUVQX1ZMQU5fVEFHLCBwcm9taXNjb3VzICovCisJdmFsID0gUkVH X1JEKGJwLCBlbWFjX2Jhc2UsIEVNQUNfUkVHX0VNQUNfUlhfTU9ERSk7CisJdmFsIHw9IEVN QUNfUlhfTU9ERV9LRUVQX1ZMQU5fVEFHIHwgRU1BQ19SWF9NT0RFX1BST01JU0NVT1VTOwor CUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19SWF9NT0RFLCB2YWwpOworCisJLyogaWRlbnRpZnkg bWFnaWMgcGFja2V0cyAqLworCXZhbCA9IFJFR19SRChicCwgZW1hY19iYXNlLCBFTUFDX1JF R19FTUFDX01PREUpOworCUVNQUNfV1IoRU1BQ19SRUdfRU1BQ19NT0RFLCAodmFsIHwgRU1B Q19NT0RFX01QS1QpKTsKKworCS8qIGVuYWJsZSBlbWFjIGZvciBqdW1ibyBwYWNrZXRzICov CisJRU1BQ19XUihFTUFDX1JFR19FTUFDX1JYX01UVV9TSVpFLAorCQkoRU1BQ19SWF9NVFVf U0laRV9KVU1CT19FTkEgfCAoYnAtPnJ4X2J1Zl91c2Vfc2l6ZSkpKTsKKworCS8qIHN0cmlw IENSQyAqLworCU5JR19XUihOSUdfUkVHSVNURVJTX05JR19JTkdSRVNTX0VNQUMwX05PX0NS QyArIHBvcnQqNCwgMHgxKTsKKworCXZhbCA9ICgoYnAtPmRldi0+ZGV2X2FkZHJbMF0gPDwg OCkgfAorCQlicC0+ZGV2LT5kZXZfYWRkclsxXSk7CisJRU1BQ19XUihFTUFDX1JFR19FTUFD X01BQ19NQVRDSCwgdmFsKTsKKworCXZhbCA9ICgoYnAtPmRldi0+ZGV2X2FkZHJbMl0gPDwg MjQpIHwKKwkgICAgICAgKGJwLT5kZXYtPmRldl9hZGRyWzNdIDw8IDE2KSB8CisJICAgICAg IChicC0+ZGV2LT5kZXZfYWRkcls0XSA8PCA4KSB8CisJCWJwLT5kZXYtPmRldl9hZGRyWzVd KTsKKwlFTUFDX1dSKEVNQUNfUkVHX0VNQUNfTUFDX01BVENIICsgNCwgdmFsKTsKKworCS8q IGRpc2FibGUgdGhlIE5JRyBpbi9vdXQgdG8gdGhlIGJtYWMgKi8KKwlOSUdfV1IoTklHX1JF R0lTVEVSU19CTUFDMF9JTl9FTiArIHBvcnQqNCwgMHgwKTsKKwlOSUdfV1IoTklHX1JFR0lT VEVSU19CTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIDB4MCk7CisJTklHX1dSKE5JR19S RUdJU1RFUlNfQk1BQzBfT1VUX0VOICsgcG9ydCo0LCAweDApOworCisJLyogZW5hYmxlIHRo ZSBOSUcgaW4vb3V0IHRvIHRoZSBlbWFjICovCisJTklHX1dSKE5JR19SRUdJU1RFUlNfRU1B QzBfSU5fRU4gKyBwb3J0KjQsIDB4MSk7CisJdmFsID0gMDsKKwlpZiAoYnAtPmZsb3dfY3Ry bCAmIEZMT1dfQ1RSTF9UWCkgeworCQl2YWwgPSAxOworCX0KKwlOSUdfV1IoTklHX1JFR0lT VEVSU19FTUFDMF9QQVVTRV9PVVRfRU4gKyBwb3J0KjQsIHZhbCk7CisJTklHX1dSKE5JR19S RUdJU1RFUlNfRUdSRVNTX0VNQUMwX09VVF9FTiArIHBvcnQqNCwgMHgxKTsKKworCWlmIChD SElQX1JFVihicCkgPT0gQ0hJUF9SRVZfRlBHQSkgeworCQkvKiB0YWtlIHRoZSBCaWdNYWMg b3V0IG9mIHJlc2V0ICovCisJCVJFR19XUihicCwgR1JDQkFTRV9NSVNDLCBNSVNDX1JFR0lT VEVSU19SRVNFVF9SRUdfMl9TRVQsCisJCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRf UkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKKworCQkvKiBlbmFibGUgYWNjZXNzIGZvciBi bWFjIHJlZ2lzdGVycyAqLworCQlOSUdfV1IoTklHX1JFR0lTVEVSU19CTUFDMF9SRUdTX09V VF9FTiArIHBvcnQqNCwgMHgxKTsKKwl9CisKKwlicC0+cGh5X2ZsYWdzIHw9IFBIWV9FTUFD X0ZMQUc7CisKKwlicC0+c3RhdHNfc3RhdGUgPSBTVEFUU19TVEFURV9FTkFCTEU7Cit9CisK K3N0YXRpYyB2b2lkIGJueDJ4X2VtYWNfcHJvZ3JhbShzdHJ1Y3QgYm54MnggKmJwKQorewor CXUxNiBtb2RlID0gMDsKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCisJRFAoTkVUSUZfTVNH X0xJTkssICJzZXR0aW5nIGxpbmsgc3BlZWQgJiBkdXBsZXhcbiIpOworCWJueDJ4X2JpdHNf ZGlzKGJwLCBHUkNCQVNFX0VNQUMwICsgcG9ydCoweDQwMCwgRU1BQ19SRUdfRU1BQ19NT0RF LAorCQkgICAgICAgKEVNQUNfTU9ERV8yNUdfTU9ERSB8CisJCQlFTUFDX01PREVfUE9SVF9N SUlfMTBNIHwKKwkJCUVNQUNfTU9ERV9IQUxGX0RVUExFWCkpOworCXN3aXRjaCAoYnAtPmxp bmVfc3BlZWQpIHsKKwljYXNlIFNQRUVEXzEwOgorCQltb2RlIHw9IEVNQUNfTU9ERV9QT1JU X01JSV8xME07CisJCWJyZWFrOworCisJY2FzZSBTUEVFRF8xMDA6CisJCW1vZGUgfD0gRU1B Q19NT0RFX1BPUlRfTUlJOworCQlicmVhazsKKworCWNhc2UgU1BFRURfMTAwMDoKKwkJbW9k ZSB8PSBFTUFDX01PREVfUE9SVF9HTUlJOworCQlicmVhazsKKworCWNhc2UgU1BFRURfMjUw MDoKKwkJbW9kZSB8PSAoRU1BQ19NT0RFXzI1R19NT0RFIHwgRU1BQ19NT0RFX1BPUlRfR01J SSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogMTBHIG5vdCB2YWxpZCBmb3IgRU1B QyAqLworCQlCTlgyWF9FUlIoIkludmFsaWQgbGluZV9zcGVlZCAweCV4XG4iLCBicC0+bGlu ZV9zcGVlZCk7CisJCWJyZWFrOworCX0KKworCWlmIChicC0+ZHVwbGV4ID09IERVUExFWF9I QUxGKSB7CisJCW1vZGUgfD0gRU1BQ19NT0RFX0hBTEZfRFVQTEVYOworCX0KKwlibngyeF9i aXRzX2VuKGJwLCBHUkNCQVNFX0VNQUMwICsgcG9ydCoweDQwMCwKKwkJICAgICAgRU1BQ19S RUdfRU1BQ19NT0RFLCBtb2RlKTsKKworCWJueDJ4X2xlZHNfc2V0KGJwLCBicC0+bGluZV9z cGVlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9zZ21paV90eF9kcml2ZXIoc3Ry dWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgbHBfdXAyOworCXUzMiB0eF9kcml2ZXI7CisKKwkv KiByZWFkIHByZWNvbXAgKi8KKwlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFO S19PVkVSXzFHKTsKKwlibngyeF9tZGlvMjJfcmVhZChicCwgTURJT19PVkVSXzFHX0xQX1VQ MiwgJmxwX3VwMik7CisKKwlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19U WDApOworCWJueDJ4X21kaW8yMl9yZWFkKGJwLCBNRElPX1RYMF9UWF9EUklWRVIsICZ0eF9k cml2ZXIpOworCisJLyogYml0cyBbMTA6N10gYXQgbHBfdXAyLCBwb3NpdGlvbmVkIGF0IFsx NToxMl0gKi8KKwlscF91cDIgPSAoKChscF91cDIgJiBNRElPX09WRVJfMUdfTFBfVVAyX1BS RUVNUEhBU0lTX01BU0spID4+CisJCSAgIE1ESU9fT1ZFUl8xR19MUF9VUDJfUFJFRU1QSEFT SVNfU0hJRlQpIDw8CisJCSAgTURJT19UWDBfVFhfRFJJVkVSX1BSRUVNUEhBU0lTX1NISUZU KTsKKworCWlmICgobHBfdXAyICE9IDApICYmCisJICAgIChscF91cDIgIT0gKHR4X2RyaXZl ciAmIE1ESU9fVFgwX1RYX0RSSVZFUl9QUkVFTVBIQVNJU19NQVNLKSkpIHsKKwkJLyogcmVw bGFjZSB0eF9kcml2ZXIgYml0cyBbMTU6MTJdICovCisJCXR4X2RyaXZlciAmPSB+TURJT19U WDBfVFhfRFJJVkVSX1BSRUVNUEhBU0lTX01BU0s7CisJCXR4X2RyaXZlciB8PSBscF91cDI7 CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19UWDBfVFhfRFJJVkVSLCB0eF9kcml2 ZXIpOworCX0KK30KKworc3RhdGljIHZvaWQgYm54MnhfcGJmX3VwZGF0ZShzdHJ1Y3QgYm54 MnggKmJwKQoreworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIGluaXRfY3JkLCBjcmQ7 CisJdTMyIGNvdW50ID0gMTAwMDsKKwl1MzIgcGF1c2UgPSAwOworCisJLyogZGlzYWJsZSBw b3J0ICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX1BCRiwKKwkgICAgICAgUEJGX1JFR0lTVEVS U19ESVNBQkxFX05FV19UQVNLX1BST0NfUDAgKyBwb3J0KjQsIDB4MSk7CisKKwkvKiB3YWl0 IGZvciBpbml0IGNyZWRpdCAqLworCWluaXRfY3JkID0gUkVHX1JEKGJwLCBHUkNCQVNFX1BC RiwKKwkJCSAgUEJGX1JFR0lTVEVSU19QMF9JTklUX0NSRCArIHBvcnQqNCk7CisJY3JkID0g UkVHX1JEKGJwLCBHUkNCQVNFX1BCRiwgUEJGX1JFR0lTVEVSU19QMF9DUkVESVQgKyBwb3J0 KjgpOworCURQKE5FVElGX01TR19MSU5LLCAiaW5pdF9jcmQgMHgleCAgY3JkIDB4JXhcbiIs IGluaXRfY3JkLCBjcmQpOworCisJd2hpbGUgKChpbml0X2NyZCAhPSBjcmQpICYmIGNvdW50 KSB7CisJCW1kZWxheSg1KTsKKworCQljcmQgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfUEJGLAor CQkJICAgICBQQkZfUkVHSVNURVJTX1AwX0NSRURJVCArIHBvcnQqOCk7CisJCWNvdW50LS07 CisJfQorCWNyZCA9IFJFR19SRChicCwgR1JDQkFTRV9QQkYsIFBCRl9SRUdJU1RFUlNfUDBf Q1JFRElUICsgcG9ydCo4KTsKKwlpZiAoaW5pdF9jcmQgIT0gY3JkKSB7CisJCS8qIFRCRD8g QXNzZXJ0IGlmIHN0aWxsIGluaXRfY3JkICE9IGNyZCAqLworCQlCTlgyWF9FUlIoIkJVRyEg aW5pdF9jcmQgMHgleCAhPSBjcmQgMHgleFxuIiwgaW5pdF9jcmQsIGNyZCk7CisJfQorCisJ aWYgKGJwLT5mbG93X2N0cmwgJiBGTE9XX0NUUkxfUlgpIHsKKwkJcGF1c2UgPSAxOworCX0K KwlSRUdfV1IoYnAsIEdSQ0JBU0VfUEJGLAorCSAgICAgICBQQkZfUkVHSVNURVJTX1AwX1BB VVNFX0VOQUJMRSArIHBvcnQqNCwgcGF1c2UpOworCWlmIChwYXVzZSkgeworCQkvKiB1cGRh dGUgdGhyZXNob2xkICovCisJCVJFR19XUihicCwgR1JDQkFTRV9QQkYsCisJCSAgICAgICBQ QkZfUkVHSVNURVJTX1AwX0FSQl9USFJTSCArIHBvcnQqNCwgMCk7CisJCS8qIHVwZGF0ZSBp bml0IGNyZWRpdCAqLworCQlpbml0X2NyZCA9IDc3ODsJCS8qICg4MDAtMTgtNCkgKi8KKwor CX0gZWxzZSB7CisJCS8qIHVwZGF0ZSB0aHJlc2hvbGQgKi8KKwkJUkVHX1dSKGJwLCBHUkNC QVNFX1BCRiwKKwkJICAgICAgIFBCRl9SRUdJU1RFUlNfUDBfQVJCX1RIUlNIICsgcG9ydCo0 LAorCQkgICAgICAgYnAtPnJ4X2J1Zl91c2Vfc2l6ZS8xNik7CisJCS8qIHVwZGF0ZSBpbml0 IGNyZWRpdCAqLworCQlzd2l0Y2ggKGJwLT5saW5lX3NwZWVkKSB7CisJCWNhc2UgU1BFRURf MTA6CisJCWNhc2UgU1BFRURfMTAwOgorCQljYXNlIFNQRUVEXzEwMDA6CisJCQlpbml0X2Ny ZCA9IGJwLT5yeF9idWZfdXNlX3NpemUvMTYgKyA1NSAtIDIyOworCQkJYnJlYWs7CisKKwkJ Y2FzZSBTUEVFRF8yNTAwOgorCQkJaW5pdF9jcmQgPSBicC0+cnhfYnVmX3VzZV9zaXplLzE2 ICsgMTM4IC0gMjI7CisJCQlicmVhazsKKworCQljYXNlIFNQRUVEXzEwMDAwOgorCQkJaW5p dF9jcmQgPSBicC0+cnhfYnVmX3VzZV9zaXplLzE2ICsgNTUzIC0gMjI7CisJCQlicmVhazsK KworCQlkZWZhdWx0OgorCQkJQk5YMlhfRVJSKCJJbnZhbGlkIGxpbmVfc3BlZWQgMHgleFxu IiwKKwkJCQkgIGJwLT5saW5lX3NwZWVkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCVJFR19X UihicCwgR1JDQkFTRV9QQkYsIFBCRl9SRUdJU1RFUlNfUDBfSU5JVF9DUkQgKyBwb3J0KjQs IGluaXRfY3JkKTsKKwlEUChORVRJRl9NU0dfTElOSywgIlBCRiB1cGRhdGVkIHRvIHNwZWVk ICVkIGNyZWRpdCAlZFxuIiwKKwkgICBicC0+bGluZV9zcGVlZCwgaW5pdF9jcmQpOworCisJ LyogcHJvYmUgdGhlIGNyZWRpdCBjaGFuZ2VzICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX1BC RiwgUEJGX1JFR0lTVEVSU19JTklUX1AwICsgcG9ydCo0LCAweDEpOworCW1kZWxheSg1KTsK KwlSRUdfV1IoYnAsIEdSQ0JBU0VfUEJGLCBQQkZfUkVHSVNURVJTX0lOSVRfUDAgKyBwb3J0 KjQsIDB4MCk7CisKKwkvKiBlbmFibGUgcG9ydCAqLworCVJFR19XUihicCwgR1JDQkFTRV9Q QkYsCisJICAgICAgIFBCRl9SRUdJU1RFUlNfRElTQUJMRV9ORVdfVEFTS19QUk9DX1AwICsg cG9ydCo0LCAweDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF91cGRhdGVfbW5nKHN0cnVj dCBibngyeCAqYnApCit7CisJaWYgKCFub21jcCkgeworCQlTSE1FTV9XUihicCwgZHJ2X2Z3 X21iW2JwLT5wb3J0XS5saW5rX3N0YXR1cywKKwkJCSBicC0+bGlua19zdGF0dXMpOworCX0K K30KKworc3RhdGljIHZvaWQgYm54MnhfbGlua19yZXBvcnQoc3RydWN0IGJueDJ4ICpicCkK K3sKKwlpZiAoYnAtPmxpbmtfdXApIHsKKwkJbmV0aWZfY2Fycmllcl9vbihicC0+ZGV2KTsK KwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiVzIE5JQyBMaW5rIGlzIFVwLCAiLCBicC0+ZGV2 LT5uYW1lKTsKKworCQlwcmludGsoIiVkIE1icHMgIiwgYnAtPmxpbmVfc3BlZWQpOworCisJ CWlmIChicC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJcHJpbnRrKCJmdWxsIGR1cGxl eCIpOworCQllbHNlCisJCQlwcmludGsoImhhbGYgZHVwbGV4Iik7CisKKwkJaWYgKGJwLT5m bG93X2N0cmwpIHsKKwkJCWlmIChicC0+Zmxvd19jdHJsICYgRkxPV19DVFJMX1JYKSB7CisJ CQkJcHJpbnRrKCIsIHJlY2VpdmUgIik7CisJCQkJaWYgKGJwLT5mbG93X2N0cmwgJiBGTE9X X0NUUkxfVFgpCisJCQkJCXByaW50aygiJiB0cmFuc21pdCAiKTsKKwkJCX0gZWxzZSB7CisJ CQkJcHJpbnRrKCIsIHRyYW5zbWl0ICIpOworCQkJfQorCQkJcHJpbnRrKCJmbG93IGNvbnRy b2wgT04iKTsKKwkJfQorCQlwcmludGsoIlxuIik7CisKKwl9IGVsc2UgeyAvKiBsaW5rX2Rv d24gKi8KKwkJbmV0aWZfY2Fycmllcl9vZmYoYnAtPmRldik7CisJCXByaW50ayhLRVJOX0lO Rk8gUEZYICIlcyBOSUMgTGluayBpcyBEb3duXG4iLCBicC0+ZGV2LT5uYW1lKTsKKwl9Cit9 CisKK3N0YXRpYyB2b2lkIGJueDJ4X2xpbmtfdXAoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlp bnQgcG9ydCA9IGJwLT5wb3J0OworCisJLyogUEJGIC0gbGluayB1cCAqLworCWJueDJ4X3Bi Zl91cGRhdGUoYnApOworCisJLyogZGlzYWJsZSBkcmFpbiAqLworCU5JR19XUihOSUdfUkVH SVNURVJTX0VHUkVTU19EUkFJTjBfTU9ERSArIHBvcnQqNCwgMCk7CisKKwkvKiB1cGRhdGUg c2hhcmUgbWVtb3J5ICovCisJYm54MnhfdXBkYXRlX21uZyhicCk7CisKKwkvKiBpbmRpY2F0 ZSBsaW5rIHVwICovCisJYm54MnhfbGlua19yZXBvcnQoYnApOworfQorCitzdGF0aWMgdm9p ZCBibngyeF9saW5rX2Rvd24oc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJw LT5wb3J0OworCisJLyogbm90aWZ5IHN0YXRzICovCisJaWYgKGJwLT5zdGF0c19zdGF0ZSAh PSBTVEFUU19TVEFURV9ESVNBQkxFKSB7CisJCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NU QVRFX1NUT1A7CisJCURQKEJOWDJYX01TR19TVEFUUywgInN0YXRzX3N0YXRlIC0gU1RPUFxu Iik7CisJfQorCisJLyogaW5kaWNhdGUgbGluayBkb3duICovCisJYnAtPnBoeV9mbGFncyAm PSB+KFBIWV9CTUFDX0ZMQUcgfCBQSFlfRU1BQ19GTEFHKTsKKworCS8qIHJlc2V0IEJpZ01h YyAqLworCVJFR19XUihicCwgR1JDQkFTRV9NSVNDLCBNSVNDX1JFR0lTVEVSU19SRVNFVF9S RUdfMl9DTEVBUiwKKwkgICAgICAgKE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1JTVF9C TUFDMCA8PCBwb3J0KSk7CisKKwkvKiBpZ25vcmUgZHJhaW4gZmxhZyBpbnRlcnJ1cHQgKi8K KwkvKiBhY3RpdmF0ZSBuaWcgZHJhaW4gKi8KKwlOSUdfV1IoTklHX1JFR0lTVEVSU19FR1JF U1NfRFJBSU4wX01PREUgKyBwb3J0KjQsIDEpOworCisJLyogdXBkYXRlIHNoYXJlIG1lbW9y eSAqLworCWJueDJ4X3VwZGF0ZV9tbmcoYnApOworCisJLyogaW5kaWNhdGUgbGluayBkb3du ICovCisJYm54MnhfbGlua19yZXBvcnQoYnApOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCB1cG9uIGxpbmsgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBibngyeF9saW5r X3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBncF9zdGF0dXM7CisJaW50IHBv cnQgPSBicC0+cG9ydDsKKwlpbnQgaTsKKwlpbnQgbGlua18xMGc7CisKKwlEUChORVRJRl9N U0dfTElOSywgInBvcnQgJXgsIGlzIHhneHMgJXgsIHN0YXRfbWFzayAweCV4LCAiCisJICAg ImludF9tYXNrIDB4JXgsIHNhdmVkX21hc2sgMHgleCwgTUlfSU5UICV4LCBTRVJERVNfTElO SyAleCwiCisJICAgIiAxMEcgJXgsIFhHWFNfTElOSyAleFxuIiwKKwkgICBwb3J0LCAoYnAt PnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpLAorCSAgIFJFR19SRChicCwgR1JDQkFTRV9O SUcsCisJCSAgTklHX1JFR0lTVEVSU19TVEFUVVNfSU5URVJSVVBUX1BPUlQwICsgcG9ydCo0 KSwKKwkgICBSRUdfUkQoYnAsIEdSQ0JBU0VfTklHLAorCQkgIE5JR19SRUdJU1RFUlNfTUFT S19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQpLAorCSAgIGJwLT5uaWdfbWFzaywKKwkgICBS RUdfUkQoYnAsIEdSQ0JBU0VfTklHLAorCQkgIE5JR19SRUdJU1RFUlNfRU1BQzBfU1RBVFVT X01JU0NfTUlfSU5UICsgcG9ydCoweDE4KSwKKwkgICBSRUdfUkQoYnAsIEdSQ0JBU0VfTklH LAorCQkgIE5JR19SRUdJU1RFUlNfU0VSREVTMF9TVEFUVVNfTElOS19TVEFUVVMgKyBwb3J0 KjB4M2MpLAorCSAgIFJFR19SRChicCwgR1JDQkFTRV9OSUcsCisJCSAgTklHX1JFR0lTVEVS U19YR1hTMF9TVEFUVVNfTElOSzEwRyArIHBvcnQqMHg2OCksCisJICAgUkVHX1JEKGJwLCBH UkNCQVNFX05JRywKKwkJICBOSUdfUkVHSVNURVJTX1hHWFMwX1NUQVRVU19MSU5LX1NUQVRV UyArIHBvcnQqMHg2OCkKKwkpOworCisJTURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVH X0JBTktfR1BfU1RBVFVTKTsKKwkvKiBhdm9pZCBmYXN0IHRvZ2dsaW5nICovCisJZm9yIChp ID0gMCA7IGkgPCAxMCA7IGkrKykgeworCQltZGVsYXkoMTApOworCQlibngyeF9tZGlvMjJf cmVhZChicCwgTURJT19HUF9TVEFUVVNfVE9QX0FOX1NUQVRVUzEsCisJCQkJICAmZ3Bfc3Rh dHVzKTsKKwl9CisKKwlibngyeF9saW5rX3NldHRpbmdzX3N0YXR1cyhicCwgZ3Bfc3RhdHVz KTsKKworCS8qIGFueXRoaW5nIDEwIGFuZCBvdmVyIHVzZXMgdGhlIGJtYWMgKi8KKwlsaW5r XzEwZyA9ICgoYnAtPmxpbmVfc3BlZWQgPj0gU1BFRURfMTAwMDApICYmCisJCSAgICAoYnAt PmxpbmVfc3BlZWQgPD0gU1BFRURfMTYwMDApKTsKKworCWJueDJ4X2xpbmtfaW50X2Fjayhi cCwgbGlua18xMGcpOworCisJLyogbGluayBpcyB1cCBvbmx5IGlmIGJvdGggbG9jYWwgcGh5 IGFuZCBleHRlcm5hbCBwaHkgYXJlIHVwICovCisJaWYgKGJwLT5saW5rX3VwICYmIGJueDJ4 X2V4dF9waHlfaXNfbGlua191cChicCkpIHsKKwkJaWYgKGxpbmtfMTBnKSB7CisJCQlibngy eF9ibWFjX2VuYWJsZShicCwgMCk7CisJCQlibngyeF9sZWRzX3NldChicCwgU1BFRURfMTAw MDApOworCisJCX0gZWxzZSB7CisJCQlibngyeF9lbWFjX2VuYWJsZShicCk7CisJCQlibngy eF9lbWFjX3Byb2dyYW0oYnApOworCisJCQkvKiBBTiBjb21wbGV0ZT8gKi8KKwkJCWlmIChn cF9zdGF0dXMgJiBNRElPX0FOX0NMNzNfT1JfMzdfQ09NUExFVEUpIHsKKwkJCQlpZiAoIShi cC0+cGh5X2ZsYWdzICYgUEhZX1NHTUlJX0ZMQUcpKSB7CisJCQkJCWJueDJ4X3NldF9zZ21p aV90eF9kcml2ZXIoYnApOworCQkJCX0vKiBOb3QgU0dNSUkgKi8KKwkJCX0KKwkJfQorCQli bngyeF9saW5rX3VwKGJwKTsKKworCX0gZWxzZSB7IC8qIGxpbmsgZG93biAqLworCQlibngy eF9sZWRzX3Vuc2V0KGJwKTsKKwkJYm54MnhfbGlua19kb3duKGJwKTsKKwl9Cit9CisKKy8q KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisqIEluaXQgc2VydmljZSBmdW5jdGlvbnMKKyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9hZXJfbW1kKHN0 cnVjdCBibngyeCAqYnApCit7CisJdTE2IG9mZnNldCA9IChicC0+cGh5X2ZsYWdzICYgUEhZ X1hHWFNfRkxBRykgPworCQkJCQkoYnAtPnBoeV9hZGRyICsgYnAtPnNlcl9sYW5lKSA6IDA7 CisKKwlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19BRVJfQkxPQ0spOwor CWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19BRVJfQkxPQ0tfQUVSX1JFRywgMHgzODAw ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hc3Rlcl9sbihzdHJ1 Y3QgYm54MnggKmJwKQoreworCXUzMiBuZXdfbWFzdGVyX2xuOworCisJLyogc2V0IHRoZSBt YXN0ZXJfbG4gZm9yIEFOICovCisJTURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVHX0JB TktfWEdYU19CTE9DSzIpOworCWJueDJ4X21kaW8yMl9yZWFkKGJwLCBNRElPX1hHWFNfQkxP Q0syX1RFU1RfTU9ERV9MQU5FLAorCQkJICAmbmV3X21hc3Rlcl9sbik7CisJYm54MnhfbWRp bzIyX3dyaXRlKGJwLCBNRElPX1hHWFNfQkxPQ0syX1RFU1RfTU9ERV9MQU5FLAorCQkJICAg KG5ld19tYXN0ZXJfbG4gfCBicC0+c2VyX2xhbmUpKTsKK30KKworc3RhdGljIHZvaWQgYm54 MnhfcmVzZXRfdW5pY29yZShzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBtaWlfY29udHJv bDsKKwlpbnQgaTsKKworCU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JFR19CQU5LX0NP TUJPX0lFRUUwKTsKKwlibngyeF9tZGlvMjJfcmVhZChicCwgTURJT19DT01CT19JRUVFMF9N SUlfQ09OVFJPTCwgJm1paV9jb250cm9sKTsKKwkvKiByZXNldCB0aGUgdW5pY29yZSAqLwor CWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwK KwkJCSAgIChtaWlfY29udHJvbCB8IE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9SRVNF VCkpOworCisJLyogd2FpdCBmb3IgdGhlIHJlc2V0IHRvIHNlbGYgY2xlYXIgKi8KKwlmb3Ig KGkgPSAwOyBpIDwgTURJT19BQ0NFU1NfVElNRU9VVDsgaSsrKSB7CisJCXVkZWxheSg1KTsK KworCQkvKiB0aGUgcmVzZXQgZXJhc2VkIHRoZSBwcmV2aW91cyBiYW5rIHZhbHVlICovCisJ CU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUwKTsKKwkJ Ym54MnhfbWRpbzIyX3JlYWQoYnAsIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsCisJ CQkJICAmbWlpX2NvbnRyb2wpOworCisJCWlmICghKG1paV9jb250cm9sICYgTURJT19DT01C T19JRUVPX01JSV9DT05UUk9MX1JFU0VUKSkgeworCQkJdWRlbGF5KDUpOworCQkJcmV0dXJu OworCQl9CisJfQorCisJLyogVEJEPyBBc3NlcnQgaWYgdGhlIGNvbnRyb2wgaXMgc3RpbGwg aW4gcmVzZXQgKi8KKwlCTlgyWF9FUlIoIkJVRyEgdW5pY29yZSBpcyBzdGlsbCBpbiByZXNl dCFcbiIpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfc3dhcF9sYW5lcyhzdHJ1Y3Qg Ym54MnggKmJwKQoreworCS8qIEVhY2ggdHdvIGJpdHMgcmVwcmVzZW50cyBhIGxhbmUgbnVt YmVyOgorCSAgIE5vIHN3YXAgaXMgMDEyMyA9PiAweDFiIG5vIG5lZWQgdG8gZW5hYmxlIHRo ZSBzd2FwICovCisKKwlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19YR1hT X0JMT0NLMik7CisJaWYgKGJwLT5yeF9sYW5lX3N3YXAgIT0gMHgxYikgeworCQlibngyeF9t ZGlvMjJfd3JpdGUoYnAsIE1ESU9fWEdYU19CTE9DSzJfUlhfTE5fU1dBUCwKKwkJCQkgICAo YnAtPnJ4X2xhbmVfc3dhcCB8CisJCQkJICAgIE1ESU9fWEdYU19CTE9DSzJfUlhfTE5fU1dB UF9FTkFCTEUgfAorCQkJCSAgIE1ESU9fWEdYU19CTE9DSzJfUlhfTE5fU1dBUF9GT1JDRV9F TkFCTEUpKTsKKwl9IGVsc2UgeworCQlibngyeF9tZGlvMjJfd3JpdGUoYnAsIE1ESU9fWEdY U19CTE9DSzJfUlhfTE5fU1dBUCwgMCk7CisJfQorCisJaWYgKGJwLT50eF9sYW5lX3N3YXAg IT0gMHgxYikgeworCQlibngyeF9tZGlvMjJfd3JpdGUoYnAsIE1ESU9fWEdYU19CTE9DSzJf VFhfTE5fU1dBUCwKKwkJCQkgICAoYnAtPnR4X2xhbmVfc3dhcCB8CisJCQkJICAgIE1ESU9f WEdYU19CTE9DSzJfVFhfTE5fU1dBUF9FTkFCTEUpKTsKKwl9IGVsc2UgeworCQlibngyeF9t ZGlvMjJfd3JpdGUoYnAsIE1ESU9fWEdYU19CTE9DSzJfVFhfTE5fU1dBUCwgMCk7CisJfQor fQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfcGFyYWxsZWxfZGV0ZWN0aW9uKHN0cnVjdCBi bngyeCAqYnApCit7CisJdTMyIGNvbnRyb2wyOworCisJTURJT19TRVRfUkVHX0JBTksoYnAs IE1ESU9fUkVHX0JBTktfU0VSREVTX0RJR0lUQUwpOworCWJueDJ4X21kaW8yMl9yZWFkKGJw LCBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDIsCisJCQkgICZjb250cm9s Mik7CisKKwlpZiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1BBUkFMTEVMKSB7CisJCWNvbnRy b2wyIHw9IE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9MMl9QUkxfRFRfRU47 CisJfSBlbHNlIHsKKwkJY29udHJvbDIgJj0gfk1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAw WF9DT05UUk9MMl9QUkxfRFRfRU47CisJfQorCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJ T19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wyLAorCQkJICAgY29udHJvbDIpOwor CisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCURQKE5FVElGX01T R19MSU5LLCAiWEdYU1xuIik7CisJCU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JFR19C QU5LXzEwR19QQVJBTExFTF9ERVRFQ1QpOworCisJCWJueDJ4X21kaW8yMl93cml0ZShicCwK KwkJCQkgICBNRElPXzEwR19QQVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfTElOSywKKwkJ CSAgICAgICBNRElPXzEwR19QQVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfTElOS19DTlQp OworCisJCWJueDJ4X21kaW8yMl9yZWFkKGJwLAorCQkJCSBNRElPXzEwR19QQVJBTExFTF9E RVRFQ1RfUEFSX0RFVF8xMEdfQ09OVFJPTCwKKwkJCQkgICZjb250cm9sMik7CisKKwkJaWYg KGJwLT5hdXRvbmVnICYgQVVUT05FR19QQVJBTExFTCkgeworCQkJY29udHJvbDIgfD0KKwkJ ICAgIE1ESU9fMTBHX1BBUkFMTEVMX0RFVEVDVF9QQVJfREVUXzEwR19DT05UUk9MX1BBUkRF VDEwR19FTjsKKwkJfSBlbHNlIHsKKwkJCWNvbnRyb2wyICY9CisJCSAgIH5NRElPXzEwR19Q QVJBTExFTF9ERVRFQ1RfUEFSX0RFVF8xMEdfQ09OVFJPTF9QQVJERVQxMEdfRU47CisJCX0K KwkJYm54MnhfbWRpbzIyX3dyaXRlKGJwLAorCQkJCSBNRElPXzEwR19QQVJBTExFTF9ERVRF Q1RfUEFSX0RFVF8xMEdfQ09OVFJPTCwKKwkJCQkgICBjb250cm9sMik7CisJfQorfQorCitz dGF0aWMgdm9pZCBibngyeF9zZXRfYXV0b25lZyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXUz MiByZWdfdmFsOworCisJLyogQ0wzNyBBdXRvbmVnICovCisJTURJT19TRVRfUkVHX0JBTkso YnAsIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTApOworCWJueDJ4X21kaW8yMl9yZWFkKGJw LCBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLCAmcmVnX3ZhbCk7CisJaWYgKChicC0+ cmVxX2F1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSAmJgorCSAgICAoYnAtPmF1dG9uZWcgJiBB VVRPTkVHX0NMMzcpKSB7CisJCS8qIENMMzcgQXV0b25lZyBFbmFibGVkICovCisJCXJlZ192 YWwgfD0gTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOOworCX0gZWxzZSB7CisJ CS8qIENMMzcgQXV0b25lZyBEaXNhYmxlZCAqLworCQlyZWdfdmFsICY9IH4oTURJT19DT01C T19JRUVPX01JSV9DT05UUk9MX0FOX0VOIHwKKwkJCSAgICAgTURJT19DT01CT19JRUVPX01J SV9DT05UUk9MX1JFU1RBUlRfQU4pOworCX0KKwlibngyeF9tZGlvMjJfd3JpdGUoYnAsIE1E SU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsIHJlZ192YWwpOworCisJLyogRW5hYmxlL0Rp c2FibGUgQXV0b2RldGVjdGlvbiAqLworCU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JF R19CQU5LX1NFUkRFU19ESUdJVEFMKTsKKwlibngyeF9tZGlvMjJfcmVhZChicCwgTURJT19T RVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxLCAmcmVnX3ZhbCk7CisJcmVnX3ZhbCAm PSB+TURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX1NJR05BTF9ERVRFQ1Rf RU47CisKKwlpZiAoKGJwLT5yZXFfYXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpICYmCisJICAg IChicC0+YXV0b25lZyAmIEFVVE9ORUdfU0dNSUlfRklCRVJfQVVUT0RFVCkpIHsKKwkJcmVn X3ZhbCB8PSBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFfQVVUT0RFVDsK Kwl9IGVsc2UgeworCQlyZWdfdmFsICY9IH5NRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhf Q09OVFJPTDFfQVVUT0RFVDsKKwl9CisJYm54MnhfbWRpbzIyX3dyaXRlKGJwLCBNRElPX1NF UkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsIHJlZ192YWwpOworCisJLyogRW5hYmxl IFRldG9uSUkgYW5kIEJBTSBhdXRvbmVnICovCisJTURJT19TRVRfUkVHX0JBTksoYnAsIE1E SU9fUkVHX0JBTktfQkFNX05FWFRfUEFHRSk7CisJYm54MnhfbWRpbzIyX3JlYWQoYnAsIE1E SU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkwsCisJCQkgICZyZWdfdmFsKTsK KwlpZiAoKGJwLT5yZXFfYXV0b25lZyAmIEFVVE9ORUdfU1BFRUQpICYmCisJICAgIChicC0+ YXV0b25lZyAmIEFVVE9ORUdfQ0wzNykgJiYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19CQU0p KSB7CisJCS8qIEVuYWJsZSBCQU0gYW5lZyBNb2RlIGFuZCBUZXRvbklJIGFuZWcgTW9kZSAq LworCQlyZWdfdmFsIHw9IChNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9DVFJM X0JBTV9NT0RFIHwKKwkJCSAgICBNRElPX0JBTV9ORVhUX1BBR0VfTVA1X05FWFRfUEFHRV9D VFJMX1RFVE9OX0FOKTsKKwl9IGVsc2UgeworCQkvKiBUZXRvbklJIGFuZCBCQU0gQXV0b25l ZyBEaXNhYmxlZCAqLworCQlyZWdfdmFsICY9IH4oTURJT19CQU1fTkVYVF9QQUdFX01QNV9O RVhUX1BBR0VfQ1RSTF9CQU1fTU9ERSB8CisJCQkgICAgIE1ESU9fQkFNX05FWFRfUEFHRV9N UDVfTkVYVF9QQUdFX0NUUkxfVEVUT05fQU4pOworCX0KKwlibngyeF9tZGlvMjJfd3JpdGUo YnAsIE1ESU9fQkFNX05FWFRfUEFHRV9NUDVfTkVYVF9QQUdFX0NUUkwsCisJCQkgICByZWdf dmFsKTsKKworCS8qIEVuYWJsZSBDbGF1c2UgNzMgQW5lZyAqLworCWlmICgoYnAtPnJlcV9h dXRvbmVnICYgQVVUT05FR19TUEVFRCkgJiYKKwkgICAgKGJwLT5hdXRvbmVnICYgQVVUT05F R19DTDczKSkgeworCQkvKiBFbmFibGUgQkFNIFN0YXRpb24gTWFuYWdlciAqLworCQlNRElP X1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19DTDczX1VTRVJCMCk7CisJCWJueDJ4 X21kaW8yMl93cml0ZShicCwgTURJT19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMSwKKwkJ CQkgICAoTURJT19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMV9CQU1fRU4gfAorCQkJTURJ T19DTDczX1VTRVJCMF9DTDczX0JBTV9DVFJMMV9CQU1fU1RBVElPTl9NTkdSX0VOIHwKKwkJ CU1ESU9fQ0w3M19VU0VSQjBfQ0w3M19CQU1fQ1RSTDFfQkFNX05QX0FGVEVSX0JQX0VOKSk7 CisKKwkJLyogTWVyZ2UgQ0w3MyBhbmQgQ0wzNyBhbmVnIHJlc29sdXRpb24gKi8KKwkJYm54 MnhfbWRpbzIyX3JlYWQoYnAsIE1ESU9fQ0w3M19VU0VSQjBfQ0w3M19CQU1fQ1RSTDMsCisJ CQkJICAmcmVnX3ZhbCk7CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19DTDczX1VT RVJCMF9DTDczX0JBTV9DVFJMMywKKwkJCQkgICAocmVnX3ZhbCB8CisJCQlNRElPX0NMNzNf VVNFUkIwX0NMNzNfQkFNX0NUUkwzX1VTRV9DTDczX0hDRF9NUikpOworCisJCS8qIFNldCB0 aGUgQ0w3MyBBTiBzcGVlZCAqLworCQlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdf QkFOS19DTDczX0lFRUVCMSk7CisJCWJueDJ4X21kaW8yMl9yZWFkKGJwLCBNRElPX0NMNzNf SUVFRUIxX0FOX0FEVjIsICZyZWdfdmFsKTsKKwkJLyogSW4gdGhlIFNlckRlcyB3ZSBzdXBw b3J0IG9ubHkgdGhlIDFHLgorCQkgICBJbiB0aGUgWEdYUyB3ZSBzdXBwb3J0IHRoZSAxMEcg S1g0CisJCSAgIGJ1dCB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgdGhlIEtSICovCisJ CWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQkJRFAoTkVUSUZfTVNH X0xJTkssICJYR1hTXG4iKTsKKwkJCS8qIDEwRyBLWDQgKi8KKwkJCXJlZ192YWwgfD0gTURJ T19DTDczX0lFRUVCMV9BTl9BRFYyX0FEVlJfMTBHX0tYNDsKKwkJfSBlbHNlIHsKKwkJCURQ KE5FVElGX01TR19MSU5LLCAiU2VyRGVzXG4iKTsKKwkJCS8qIDEwMDBNIEtYICovCisJCQly ZWdfdmFsIHw9IE1ESU9fQ0w3M19JRUVFQjFfQU5fQURWMl9BRFZSXzEwMDBNX0tYOworCQl9 CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19DTDczX0lFRUVCMV9BTl9BRFYyLCBy ZWdfdmFsKTsKKworCQkvKiBDTDczIEF1dG9uZWcgRW5hYmxlZCAqLworCQlyZWdfdmFsID0g TURJT19DTDczX0lFRUVCMF9DTDczX0FOX0NPTlRST0xfQU5fRU47CisJfSBlbHNlIHsKKwkJ LyogQ0w3MyBBdXRvbmVnIERpc2FibGVkICovCisJCXJlZ192YWwgPSAwOworCX0KKwlNRElP X1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCk7CisJYm54Mnhf bWRpbzIyX3dyaXRlKGJwLCBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwgcmVn X3ZhbCk7Cit9CisKKy8qIHByb2dyYW0gU2VyRGVzLCBmb3JjZWQgbW9kZXMgKi8KK3N0YXRp YyB2b2lkIGJueDJ4X3Byb2dyYW1fc2VyZGVzKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMy IHJlZ192YWw7CisKKwkvKiBwcm9ncmFtIGR1cGxleCwgZGlzYWJsZSBhdXRvbmVnICovCisJ TURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTApOworCWJu eDJ4X21kaW8yMl9yZWFkKGJwLCBNRElPX0NPTUJPX0lFRUUwX01JSV9DT05UUk9MLCAmcmVn X3ZhbCk7CisJcmVnX3ZhbCAmPSB+KE1ESU9fQ09NQk9fSUVFT19NSUlfQ09OVFJPTF9GVUxM X0RVUExFWCB8CisJCSAgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOKTsK KwlpZiAoYnAtPnJlcV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJcmVnX3ZhbCB8PSBN RElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfRlVMTF9EVVBMRVg7CisJfQorCWJueDJ4X21k aW8yMl93cml0ZShicCwgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwgcmVnX3ZhbCk7 CisKKwkvKiBwcm9ncmFtIHNwZWVkCisJICAgLSBuZWVkZWQgb25seSBpZiB0aGUgc3BlZWQg aXMgZ3JlYXRlciB0aGFuIDFHICgyLjVHIG9yIDEwRykgKi8KKwlpZiAoYnAtPnJlcV9saW5l X3NwZWVkID4gU1BFRURfMTAwMCkgeworCQlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19S RUdfQkFOS19TRVJERVNfRElHSVRBTCk7CisJCWJueDJ4X21kaW8yMl9yZWFkKGJwLCBNRElP X1NFUkRFU19ESUdJVEFMX01JU0MxLCAmcmVnX3ZhbCk7CisJCS8qIGNsZWFyaW5nIHRoZSBz cGVlZCB2YWx1ZSBiZWZvcmUgc2V0dGluZyB0aGUgcmlnaHQgc3BlZWQgKi8KKwkJcmVnX3Zh bCAmPSB+TURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF9NQVNLOworCQly ZWdfdmFsIHw9IChNRElPX1NFUkRFU19ESUdJVEFMX01JU0MxX1JFRkNMS19TRUxfMTU2XzI1 TSB8CisJCQkgICAgTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF9TRUwp OworCQlpZiAoYnAtPnJlcV9saW5lX3NwZWVkID09IFNQRUVEXzEwMDAwKSB7CisJCQlyZWdf dmFsIHw9CisJCQkJTURJT19TRVJERVNfRElHSVRBTF9NSVNDMV9GT1JDRV9TUEVFRF8xMEdf Q1g0OworCQl9CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19TRVJERVNfRElHSVRB TF9NSVNDMSwgcmVnX3ZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9zZXRfYnJj bV9jbDM3X2FkdmVydGlzbWVudChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWwgPSAw OworCisJLyogY29uZmlndXJlIHRoZSA0OCBiaXRzIGZvciBCQU0gQU4gKi8KKwlNRElPX1NF VF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19PVkVSXzFHKTsKKworCS8qIHNldCBleHRl bmRlZCBjYXBhYmlsaXRpZXMgKi8KKwlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNF RF8yNTAwYmFzZVRfRnVsbCkgeworCQl2YWwgfD0gTURJT19PVkVSXzFHX1VQMV8yXzVHOwor CX0KKwlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwp IHsKKwkJdmFsIHw9IE1ESU9fT1ZFUl8xR19VUDFfMTBHOworCX0KKwlibngyeF9tZGlvMjJf d3JpdGUoYnAsIE1ESU9fT1ZFUl8xR19VUDEsIHZhbCk7CisKKwlibngyeF9tZGlvMjJfd3Jp dGUoYnAsIE1ESU9fT1ZFUl8xR19VUDMsIDApOworfQorCitzdGF0aWMgdm9pZCBibngyeF9z ZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBh bl9hZHY7CisKKwkvKiBmb3IgQU4sIHdlIGFyZSBhbHdheXMgcHVibGlzaGluZyBmdWxsIGR1 cGxleCAqLworCWFuX2FkdiA9IE1ESU9fQ09NQk9fSUVFRTBfQVVUT19ORUdfQURWX0ZVTExf RFVQTEVYOworCisJLyogc2V0IHBhdXNlICovCisJc3dpdGNoIChicC0+cGF1c2VfbW9kZSkg eworCWNhc2UgUEFVU0VfU1lNTUVUUklDOgorCQlhbl9hZHYgfD0gTURJT19DT01CT19JRUVF MF9BVVRPX05FR19BRFZfUEFVU0VfU1lNTUVUUklDOworCQlicmVhazsKKwljYXNlIFBBVVNF X0FTWU1NRVRSSUM6CisJCWFuX2FkdiB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FE Vl9QQVVTRV9BU1lNTUVUUklDOworCQlicmVhazsKKwljYXNlIFBBVVNFX0JPVEg6CisJCWFu X2FkdiB8PSBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEVl9QQVVTRV9CT1RIOworCQli cmVhazsKKwljYXNlIFBBVVNFX05PTkU6CisJCWFuX2FkdiB8PSBNRElPX0NPTUJPX0lFRUUw X0FVVE9fTkVHX0FEVl9QQVVTRV9OT05FOworCQlicmVhazsKKwl9CisKKwlNRElPX1NFVF9S RUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19DT01CT19JRUVFMCk7CisJYm54MnhfbWRpbzIy X3dyaXRlKGJwLCBNRElPX0NPTUJPX0lFRUUwX0FVVE9fTkVHX0FEViwgYW5fYWR2KTsKK30K Kworc3RhdGljIHZvaWQgYm54MnhfcmVzdGFydF9hdXRvbmVnKHN0cnVjdCBibngyeCAqYnAp Cit7CisJaWYgKGJwLT5hdXRvbmVnICYgQVVUT05FR19DTDczKSB7CisJCS8qIGVuYWJsZSBh bmQgcmVzdGFydCBjbGF1c2UgNzMgYW5lZyAqLworCQl1MzIgYW5fY3RybDsKKworCQlNRElP X1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19DTDczX0lFRUVCMCk7CisJCWJueDJ4 X21kaW8yMl9yZWFkKGJwLCBNRElPX0NMNzNfSUVFRUIwX0NMNzNfQU5fQ09OVFJPTCwKKwkJ CQkgICZhbl9jdHJsKTsKKwkJYm54MnhfbWRpbzIyX3dyaXRlKGJwLCBNRElPX0NMNzNfSUVF RUIwX0NMNzNfQU5fQ09OVFJPTCwKKwkJCQkgICAoYW5fY3RybCB8CisJCQkJICAgIE1ESU9f Q0w3M19JRUVFQjBfQ0w3M19BTl9DT05UUk9MX0FOX0VOIHwKKwkJCQlNRElPX0NMNzNfSUVF RUIwX0NMNzNfQU5fQ09OVFJPTF9SRVNUQVJUX0FOKSk7CisKKwl9IGVsc2UgeworCQkvKiBF bmFibGUgYW5kIHJlc3RhcnQgQkFNL0NMMzcgYW5lZyAqLworCQl1MzIgbWlpX2NvbnRyb2w7 CisKKwkJTURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVFRTAp OworCQlibngyeF9tZGlvMjJfcmVhZChicCwgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJP TCwKKwkJCQkgICZtaWlfY29udHJvbCk7CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJ T19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKKwkJCQkgICAobWlpX2NvbnRyb2wgfAorCQkJ CSAgICBNRElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfQU5fRU4gfAorCQkJCSAgICBNRElP X0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfUkVTVEFSVF9BTikpOworCX0KK30KKworc3RhdGlj IHZvaWQgYm54MnhfaW5pdGlhbGl6ZV9zZ21paV9wcm9jZXNzKHN0cnVjdCBibngyeCAqYnAp Cit7CisJdTMyIGNvbnRyb2wxOworCisJLyogaW4gU0dNSUkgbW9kZSwgdGhlIHVuaWNvcmUg aXMgYWx3YXlzIHNsYXZlICovCisJTURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVHX0JB TktfU0VSREVTX0RJR0lUQUwpOworCWJueDJ4X21kaW8yMl9yZWFkKGJwLCBNRElPX1NFUkRF U19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDEsCisJCQkgICZjb250cm9sMSk7CisJY29udHJv bDEgfD0gTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0lOVkVSVF9TSUdO QUxfREVURUNUOworCS8qIHNldCBzZ21paSBtb2RlIChhbmQgbm90IGZpYmVyKSAqLworCWNv bnRyb2wxICY9IH4oTURJT19TRVJERVNfRElHSVRBTF9BXzEwMDBYX0NPTlRST0wxX0ZJQkVS X01PREUgfAorCQkgICAgICBNRElPX1NFUkRFU19ESUdJVEFMX0FfMTAwMFhfQ09OVFJPTDFf QVVUT0RFVCB8CisJCSAgICAgIE1ESU9fU0VSREVTX0RJR0lUQUxfQV8xMDAwWF9DT05UUk9M MV9NU1RSX01PREUpOworCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19TRVJERVNfRElH SVRBTF9BXzEwMDBYX0NPTlRST0wxLAorCQkJICAgY29udHJvbDEpOworCisJLyogaWYgZm9y Y2VkIG1vZGUgKi8KKwlpZiAoIShicC0+cmVxX2F1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSkg eworCQkvKiBzZXQgc3BlZWQsIGRpc2FibGUgYXV0b25lZyAqLworCQl1MzIgbWlpX2NvbnRy b2w7CisKKwkJTURJT19TRVRfUkVHX0JBTksoYnAsIE1ESU9fUkVHX0JBTktfQ09NQk9fSUVF RTApOworCQlibngyeF9tZGlvMjJfcmVhZChicCwgTURJT19DT01CT19JRUVFMF9NSUlfQ09O VFJPTCwKKwkJCQkgICZtaWlfY29udHJvbCk7CisJCW1paV9jb250cm9sICY9IH4oTURJT19D T01CT19JRUVPX01JSV9DT05UUk9MX0FOX0VOIHwKKwkJCSAgICAgICBNRElPX0NPTUJPX0lF RU9fTUlJX0NPTlRST0xfTUFOX1NHTUlJX1NQX01BU0sgfAorCQkJCSBNRElPX0NPTUJPX0lF RU9fTUlJX0NPTlRST0xfRlVMTF9EVVBMRVgpOworCisJCXN3aXRjaCAoYnAtPnJlcV9saW5l X3NwZWVkKSB7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJbWlpX2NvbnRyb2wgfD0KKwkJCQlN RElPX0NPTUJPX0lFRU9fTUlJX0NPTlRST0xfTUFOX1NHTUlJX1NQXzEwMDsKKwkJCWJyZWFr OworCQljYXNlIFNQRUVEXzEwMDA6CisJCQltaWlfY29udHJvbCB8PQorCQkJCU1ESU9fQ09N Qk9fSUVFT19NSUlfQ09OVFJPTF9NQU5fU0dNSUlfU1BfMTAwMDsKKwkJCWJyZWFrOworCQlj YXNlIFNQRUVEXzEwOgorCQkJLyogdGhlcmUgaXMgbm90aGluZyB0byBzZXQgZm9yIDEwTSAq LworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBpbnZhbGlkIHNwZWVkIGZvciBTR01J SSAqLworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJJbnZhbGlkIHJlcV9saW5lX3NwZWVkIDB4 JXhcbiIsCisJCQkgICBicC0+cmVxX2xpbmVfc3BlZWQpOworCQkJYnJlYWs7CisJCX0KKwor CQkvKiBzZXR0aW5nIHRoZSBmdWxsIGR1cGxleCAqLworCQlpZiAoYnAtPnJlcV9kdXBsZXgg PT0gRFVQTEVYX0ZVTEwpIHsKKwkJCW1paV9jb250cm9sIHw9CisJCQkJTURJT19DT01CT19J RUVPX01JSV9DT05UUk9MX0ZVTExfRFVQTEVYOworCQl9CisJCWJueDJ4X21kaW8yMl93cml0 ZShicCwgTURJT19DT01CT19JRUVFMF9NSUlfQ09OVFJPTCwKKwkJCQkgICBtaWlfY29udHJv bCk7CisKKwl9IGVsc2UgeyAvKiBBTiBtb2RlICovCisJCS8qIGVuYWJsZSBhbmQgcmVzdGFy dCBBTiAqLworCQlibngyeF9yZXN0YXJ0X2F1dG9uZWcoYnApOworCX0KK30KKworc3RhdGlj IHZvaWQgYm54MnhfbGlua19pbnRfZW5hYmxlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50 IHBvcnQgPSBicC0+cG9ydDsKKworCS8qIHNldHRpbmcgdGhlIHN0YXR1cyB0byByZXBvcnQg b24gbGluayB1cAorCSAgIGZvciBlaXRoZXIgWEdYUyBvciBTZXJEZXMgKi8KKwlibngyeF9i aXRzX2RpcyhicCwgR1JDQkFTRV9OSUcsCisJCSAgICAgICBOSUdfUkVHSVNURVJTX1NUQVRV U19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCisJCSAgICAgICAoTklHX1hHWFMwX0xJTktf U1RBVFVTIHwKKwkJCU5JR19TVEFUVVNfSU5URVJSVVBUX1hHWFMwX0xJTksxMEcgfAorCQkJ TklHX1NFUkRFUzBfTElOS19TVEFUVVMpKTsKKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZ X1hHWFNfRkxBRykgeworCQkvKiBUQkQgLQorCQkgKiBpbiBmb3JjZSBtb2RlIChub3QgQU4p IHdlIGNhbiBlbmFibGUganVzdCB0aGUgcmVsZXZhbnQKKwkJICogaW50ZXJydXB0CisJCSAq IEV2ZW4gaW4gQU4gd2UgbWlnaHQgZW5hYmxlIG9ubHkgb25lIGFjY29yZGluZyB0byB0aGUg QU4KKwkJICogc3BlZWQgbWFzaworCQkgKi8KKwkJYm54MnhfYml0c19lbihicCwgR1JDQkFT RV9OSUcsCisJCQkgICAgICBOSUdfUkVHSVNURVJTX01BU0tfSU5URVJSVVBUX1BPUlQwICsg cG9ydCo0LAorCQkJICAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktfU1RBVFVTIHwKKwkJCSAg ICAgICBOSUdfTUFTS19YR1hTMF9MSU5LMTBHKSk7CisJCURQKE5FVElGX01TR19MSU5LLCAi ZW5hYmxlIFhHWFMgaW50ZXJydXB0XG4iKTsKKworCX0gZWxzZSB7IC8qIFNlckRlcyAqLwor CQlibngyeF9iaXRzX2VuKGJwLCBHUkNCQVNFX05JRywKKwkJCSAgICAgIE5JR19SRUdJU1RF UlNfTUFTS19JTlRFUlJVUFRfUE9SVDAgKyBwb3J0KjQsCisJCQkgICAgICBOSUdfTUFTS19T RVJERVMwX0xJTktfU1RBVFVTKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJlbmFibGUgU2Vy RGVzIGludGVycnVwdFxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9leHRfcGh5 X2luaXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXUz MiBleHRfcGh5X3R5cGU7CisJdTMyIGV4dF9waHlfYWRkcjsKKwl1MzIgbG9jYWxfcGh5Owor CisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7CisJCWxvY2FsX3BoeSA9 IGJwLT5waHlfYWRkcjsKKwkJZXh0X3BoeV9hZGRyID0gKChicC0+ZXh0X3BoeV9jb25maWcg JgorCQkJCSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfQUREUl9NQVNLKSA+PgorCQkJCVBP UlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9BRERSX1NISUZUKTsKKworCQlleHRfcGh5X3R5cGUg PSBYR1hTX0VYVF9QSFlfVFlQRShicCk7CisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJ CWNhc2UgUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfRElSRUNUOgorCQkJRFAoTkVU SUZfTVNHX0xJTkssICJYR1hTIERpcmVjdFxuIik7CisJCQlicmVhazsKKworCQljYXNlIFBP UlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6CisJCQlEUChORVRJRl9NU0df TElOSywgIlhHWFMgODcwNVxuIik7CisJCQlibngyeF9iaXRzX2VuKGJwLCBHUkNCQVNFX05J RywKKwkJCQkgICAgICBOSUdfUkVHSVNURVJTX01BU0tfSU5URVJSVVBUX1BPUlQwICsKKwkJ CQkgICAgICBwb3J0KjQsIE5JR19NQVNLX01JX0lOVCk7CisJCQlEUChORVRJRl9NU0dfTElO SywgImVuYWJsZWQgZXh0ZW5hbCBwaHkgaW50XG4iKTsKKworCQkJYnAtPnBoeV9hZGRyID0g ZXh0X3BoeV90eXBlOworCQkJYm54MnhfbWRpbzQ1X3Z3cml0ZShicCwgRVhUX1BIWV9PUFRf UE1BX1BNRF9ERVZBRCwKKwkJCQkJICAgIEVYVF9QSFlfT1BUX1BNRF9NSVNDX0NOVEwsCisJ CQkJCSAgICAweDgyODgpOworCQkJYm54MnhfbWRpbzQ1X3Z3cml0ZShicCwgRVhUX1BIWV9P UFRfUE1BX1BNRF9ERVZBRCwKKwkJCQkJICAgIEVYVF9QSFlfT1BUX1BIWV9JREVOVElGSUVS LAorCQkJCQkgICAgMHg3ZmJmKTsKKwkJCWJueDJ4X21kaW80NV92d3JpdGUoYnAsIEVYVF9Q SFlfT1BUX1BNQV9QTURfREVWQUQsCisJCQkJCSAgICBFWFRfUEhZX09QVF9DTVVfUExMX0JZ UEFTUywKKwkJCQkJICAgIDB4MDEwMCk7CisJCQlibngyeF9tZGlvNDVfdndyaXRlKGJwLCBF WFRfUEhZX09QVF9XSVNfREVWQUQsCisJCQkJCSAgICBFWFRfUEhZX09QVF9MQVNJX0NOVEws IDB4MSk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9U WVBFX0JDTTg3MDY6CisJCQlEUChORVRJRl9NU0dfTElOSywgIlhHWFMgODcwNlxuIik7CisJ CQlibngyeF9iaXRzX2VuKGJwLCBHUkNCQVNFX05JRywKKwkJCQkgICAgICBOSUdfUkVHSVNU RVJTX01BU0tfSU5URVJSVVBUX1BPUlQwICsKKwkJCQkgICAgICBwb3J0KjQsIE5JR19NQVNL X01JX0lOVCk7CisJCQlEUChORVRJRl9NU0dfTElOSywgImVuYWJsZWQgZXh0ZW5hbCBwaHkg aW50XG4iKTsKKworCQkJYnAtPnBoeV9hZGRyID0gZXh0X3BoeV90eXBlOworCQkJYm54Mnhf bWRpbzQ1X3Z3cml0ZShicCwgRVhUX1BIWV9PUFRfUE1BX1BNRF9ERVZBRCwKKwkJCQkJICAg IEVYVF9QSFlfT1BUX1BNRF9ESUdJVEFMX0NOVCwKKwkJCQkJICAgIDB4NDAwKTsKKwkJCWJu eDJ4X21kaW80NV92d3JpdGUoYnAsIEVYVF9QSFlfT1BUX1BNQV9QTURfREVWQUQsCisJCQkJ CSAgICBFWFRfUEhZX09QVF9MQVNJX0NOVEwsIDB4MSk7CisJCQlicmVhazsKKworCQlkZWZh dWx0OgorCQkJRFAoTkVUSUZfTVNHX0xJTkssICJCQUQgWEdYUyBleHRfcGh5X2NvbmZpZyAw eCV4XG4iLAorCQkJICAgYnAtPmV4dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCQl9CisJ CWJwLT5waHlfYWRkciA9IGxvY2FsX3BoeTsKKworCX0gZWxzZSB7IC8qIFNlckRlcyAqLwor LyoJCWV4dF9waHlfYWRkciA9ICgoYnAtPmV4dF9waHlfY29uZmlnICYKKwkJCQkgUE9SVF9I V19DRkdfU0VSREVTX0VYVF9QSFlfQUREUl9NQVNLKSA+PgorCQkJCVBPUlRfSFdfQ0ZHX1NF UkRFU19FWFRfUEhZX0FERFJfU0hJRlQpOworKi8KKwkJZXh0X3BoeV90eXBlID0gU0VSREVT X0VYVF9QSFlfVFlQRShicCk7CisJCXN3aXRjaCAoZXh0X3BoeV90eXBlKSB7CisJCWNhc2Ug UE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlEUChORVRJRl9N U0dfTElOSywgIlNlckRlcyBEaXJlY3RcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQT1JU X0hXX0NGR19TRVJERVNfRVhUX1BIWV9UWVBFX0JDTTU0ODI6CisJCQlEUChORVRJRl9NU0df TElOSywgIlNlckRlcyA1NDgyXG4iKTsKKwkJCWJueDJ4X2JpdHNfZW4oYnAsIEdSQ0JBU0Vf TklHLAorCQkJCSAgICAgIE5JR19SRUdJU1RFUlNfTUFTS19JTlRFUlJVUFRfUE9SVDAgKwor CQkJCSAgICAgIHBvcnQqNCwgTklHX01BU0tfTUlfSU5UKTsKKwkJCURQKE5FVElGX01TR19M SU5LLCAiZW5hYmxlZCBleHRlbmFsIHBoeSBpbnRcbiIpOworCQkJYnJlYWs7CisKKwkJZGVm YXVsdDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiQkFEIFNlckRlcyBleHRfcGh5X2NvbmZp ZyAweCV4XG4iLAorCQkJICAgYnAtPmV4dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCQl9 CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9leHRfcGh5X3Jlc2V0KHN0cnVjdCBibngy eCAqYnApCit7CisJdTMyIGV4dF9waHlfdHlwZTsKKwl1MzIgZXh0X3BoeV9hZGRyOworCXUz MiBsb2NhbF9waHk7CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsK KwkJZXh0X3BoeV90eXBlID0gWEdYU19FWFRfUEhZX1RZUEUoYnApOworCQlzd2l0Y2ggKGV4 dF9waHlfdHlwZSkgeworCQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0RJ UkVDVDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyBEaXJlY3RcbiIpOworCQkJYnJl YWs7CisKKwkJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzA1Ogor CQljYXNlIFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDY6CisJCQlEUChO RVRJRl9NU0dfTElOSywgIlhHWFMgODcwNS82XG4iKTsKKwkJCWxvY2FsX3BoeSA9IGJwLT5w aHlfYWRkcjsKKwkJCWV4dF9waHlfYWRkciA9ICgoYnAtPmV4dF9waHlfY29uZmlnICYKKwkJ CQkJUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX0FERFJfTUFTSykgPj4KKwkJCQkJUE9SVF9I V19DRkdfWEdYU19FWFRfUEhZX0FERFJfU0hJRlQpOworCQkJYnAtPnBoeV9hZGRyID0gKHU4 KWV4dF9waHlfYWRkcjsKKwkJCWJueDJ4X21kaW80NV93cml0ZShicCwgRVhUX1BIWV9PUFRf UE1BX1BNRF9ERVZBRCwKKwkJCQkJICAgRVhUX1BIWV9PUFRfQ05UTCwgMHhhMDQwKTsKKwkJ CWJwLT5waHlfYWRkciA9IGxvY2FsX3BoeTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJ CQlEUChORVRJRl9NU0dfTElOSywgIkJBRCBYR1hTIGV4dF9waHlfY29uZmlnIDB4JXhcbiIs CisJCQkgICBicC0+ZXh0X3BoeV9jb25maWcpOworCQkJYnJlYWs7CisJCX0KKworCX0gZWxz ZSB7IC8qIFNlckRlcyAqLworCQlleHRfcGh5X3R5cGUgPSBTRVJERVNfRVhUX1BIWV9UWVBF KGJwKTsKKwkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKKwkJY2FzZSBQT1JUX0hXX0NGR19T RVJERVNfRVhUX1BIWV9UWVBFX0RJUkVDVDoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2Vy RGVzIERpcmVjdFxuIik7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdfQ0ZHX1NFUkRF U19FWFRfUEhZX1RZUEVfQkNNNTQ4MjoKKwkJCURQKE5FVElGX01TR19MSU5LLCAiU2VyRGVz IDU0ODJcbiIpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCURQKE5FVElGX01TR19M SU5LLCAiQkFEIFNlckRlcyBleHRfcGh5X2NvbmZpZyAweCV4XG4iLAorCQkJICAgYnAtPmV4 dF9waHlfY29uZmlnKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBi bngyeF9saW5rX2luaXRpYWxpemUoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9 IGJwLT5wb3J0OworCisJLyogZGlzYWJsZSBhdHRlbnRpb25zICovCisJYm54MnhfYml0c19k aXMoYnAsIEdSQ0JBU0VfTklHLAorCQkgICAgICAgTklHX1JFR0lTVEVSU19NQVNLX0lOVEVS UlVQVF9QT1JUMCArIHBvcnQqNCwKKwkJICAgICAgIChOSUdfTUFTS19YR1hTMF9MSU5LX1NU QVRVUyB8CisJCQlOSUdfTUFTS19YR1hTMF9MSU5LMTBHIHwKKwkJCU5JR19NQVNLX1NFUkRF UzBfTElOS19TVEFUVVMgfAorCQkJTklHX01BU0tfTUlfSU5UKSk7CisKKwlibngyeF9leHRf cGh5X3Jlc2V0KGJwKTsKKworCWJueDJ4X3NldF9hZXJfbW1kKGJwKTsKKworCWlmIChicC0+ cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykgeworCQlibngyeF9zZXRfbWFzdGVyX2xuKGJw KTsKKwl9CisKKwkvKiByZXNldCB0aGUgU2VyRGVzIGFuZCB3YWl0IGZvciByZXNldCBiaXQg cmV0dXJuIGxvdyAqLworCWJueDJ4X3Jlc2V0X3VuaWNvcmUoYnApOworCisJYm54Mnhfc2V0 X2Flcl9tbWQoYnApOworCisJLyogc2V0dGluZyB0aGUgbWFzdGVyTG5fZGVmIGFnYWluIGFm dGVyIHRoZSByZXNldCAqLworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZX1hHWFNfRkxBRykg eworCQlibngyeF9zZXRfbWFzdGVyX2xuKGJwKTsKKwkJYm54Mnhfc2V0X3N3YXBfbGFuZXMo YnApOworCX0KKworCS8qIFNldCBQYXJhbGxlbCBEZXRlY3QgKi8KKwlpZiAoYnAtPnJlcV9h dXRvbmVnICYgQVVUT05FR19TUEVFRCkgeworCQlibngyeF9zZXRfcGFyYWxsZWxfZGV0ZWN0 aW9uKGJwKTsKKwl9CisKKwlpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpIHsK KwkJaWYgKGJwLT5yZXFfbGluZV9zcGVlZCAmJgorCQkgICAgYnAtPnJlcV9saW5lX3NwZWVk IDwgU1BFRURfMTAwMCkgeworCQkJYnAtPnBoeV9mbGFncyB8PSBQSFlfU0dNSUlfRkxBRzsK KwkJfSBlbHNlIHsKKwkJCWJwLT5waHlfZmxhZ3MgJj0gflBIWV9TR01JSV9GTEFHOworCQl9 CisJfQorCisJaWYgKCEoYnAtPnBoeV9mbGFncyAmIFBIWV9TR01JSV9GTEFHKSkgeworCQl1 MTYgYmFuaywgcnhfZXE7CisKKwkJcnhfZXEgPSAoKGJwLT5zZXJkZXNfY29uZmlnICYKKwkJ CSAgUE9SVF9IV19DRkdfU0VSREVTX1JYX0RSVl9FUVVBTElaRVJfTUFTSykgPj4KKwkJCSBQ T1JUX0hXX0NGR19TRVJERVNfUlhfRFJWX0VRVUFMSVpFUl9TSElGVCk7CisKKwkJRFAoTkVU SUZfTVNHX0xJTkssICJzZXR0aW5nIHJ4IGVxIHRvICVkXG4iLCByeF9lcSk7CisJCWZvciAo YmFuayA9IE1ESU9fUkVHX0JBTktfUlgwOyBiYW5rIDw9IE1ESU9fUkVHX0JBTktfUlhfQUxM OworCQkJICAgIGJhbmsgKz0gKE1ESU9fUkVHX0JBTktfUlgxIC0gTURJT19SRUdfQkFOS19S WDApKSB7CisJCQlNRElPX1NFVF9SRUdfQkFOSyhicCwgYmFuayk7CisJCQlibngyeF9tZGlv MjJfd3JpdGUoYnAsIE1ESU9fUlgwX1JYX0VRX0JPT1NULAorCQkJCQkgICAoKHJ4X2VxICYK KwkJCQlNRElPX1JYMF9SWF9FUV9CT09TVF9FUVVBTElaRVJfQ1RSTF9NQVNLKSB8CisJCQkJ TURJT19SWDBfUlhfRVFfQk9PU1RfT0ZGU0VUX0NUUkwpKTsKKwkJfQorCisJCS8qIGZvcmNl ZCBzcGVlZCByZXF1ZXN0ZWQ/ICovCisJCWlmICghKGJwLT5yZXFfYXV0b25lZyAmIEFVVE9O RUdfU1BFRUQpKSB7CisJCQlEUChORVRJRl9NU0dfTElOSywgIm5vdCBTR01JSSwgbm8gQU5c biIpOworCisJCQkvKiBkaXNhYmxlIGF1dG9uZWcgKi8KKwkJCWJueDJ4X3NldF9hdXRvbmVn KGJwKTsKKworCQkJLyogcHJvZ3JhbSBzcGVlZCBhbmQgZHVwbGV4ICovCisJCQlibngyeF9w cm9ncmFtX3NlcmRlcyhicCk7CisKKwkJfSBlbHNlIHsgLyogQU5fbW9kZSAqLworCQkJRFAo TkVUSUZfTVNHX0xJTkssICJub3QgU0dOSUksIEFOXG4iKTsKKworCQkJLyogQU4gZW5hYmxl ZCAqLworCQkJYm54Mnhfc2V0X2JyY21fY2wzN19hZHZlcnRpc21lbnQoYnApOworCisJCQkv KiBwcm9ncmFtIGR1cGxleCAmIHBhdXNlIGFkdmVydGlzbWVudCAoZm9yIGFuZWcpICovCisJ CQlibngyeF9zZXRfaWVlZV9hbmVnX2FkdmVydGlzbWVudChicCk7CisKKwkJCS8qIGVuYWJs ZSBhdXRvbmVnICovCisJCQlibngyeF9zZXRfYXV0b25lZyhicCk7CisKKwkJCS8qIGVuYWxi ZSBhbmQgcmVzdGFydCBBTiAqLworCQkJYm54MnhfcmVzdGFydF9hdXRvbmVnKGJwKTsKKwkJ fQorCisJfSBlbHNlIHsgLyogU0dNSUkgbW9kZSAqLworCQlEUChORVRJRl9NU0dfTElOSywg IlNHTUlJXG4iKTsKKworCQlibngyeF9pbml0aWFsaXplX3NnbWlpX3Byb2Nlc3MoYnApOwor CX0KKworCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCisJYm54MnhfbGlua19pbnRfZW5h YmxlKGJwKTsKKworCS8qIGluaXQgZXh0IHBoeSBhbmQgZW5hYmxlIGxpbmsgc3RhdGUgaW50 ICovCisJYm54MnhfZXh0X3BoeV9pbml0KGJwKTsKK30KKworc3RhdGljIHZvaWQgYm54Mnhf cGh5X2RlYXNzZXJ0KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IHBvcnQgPSBicC0+cG9y dDsKKwl1MzIgdmFsOworCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFHKSB7 CisJCURQKE5FVElGX01TR19MSU5LLCAiWEdYU1xuIik7CisJCXZhbCA9IFhHWFNfUkVTRVRf QklUUzsKKworCX0gZWxzZSB7IC8qIFNlckRlcyAqLworCQlEUChORVRJRl9NU0dfTElOSywg IlNlckRlc1xuIik7CisJCXZhbCA9IFNFUkRFU19SRVNFVF9CSVRTOworCX0KKworCXZhbCA9 IHZhbCA8PCAocG9ydCoxNik7CisKKwkvKiByZXNldCBhbmQgdW5yZXNldCB0aGUgU2VyRGVz L1hHWFMgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQywgTUlTQ19SRUdJU1RFUlNfUkVT RVRfUkVHXzNfQ0xFQVIsIHZhbCk7CisJbXNsZWVwKDUpOworCVJFR19XUihicCwgR1JDQkFT RV9NSVNDLCBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfM19TRVQsIHZhbCk7Cit9CisKK3N0 YXRpYyBpbnQgYm54MnhfcGh5X2luaXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlEUChORVRJ Rl9NU0dfTElOSywgInN0YXJ0ZWRcbiIpOworCWlmIChDSElQX1JFVihicCkgPT0gQ0hJUF9S RVZfRlBHQSkgeworCQlicC0+cGh5X2ZsYWdzIHw9IFBIWV9FTUFDX0ZMQUc7CisJCWJwLT5s aW5rX3VwID0gMTsKKwkJYnAtPmxpbmVfc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkJYnAtPmR1 cGxleCA9IERVUExFWF9GVUxMOworCQlOSUdfV1IoTklHX1JFR0lTVEVSU19FR1JFU1NfRFJB SU4wX01PREUgKyBicC0+cG9ydCo0LCAwKTsKKwkJYm54MnhfZW1hY19lbmFibGUoYnApOwor CQlibngyeF9saW5rX3JlcG9ydChicCk7CisJCXJldHVybiAwOworCisJfSBlbHNlIGlmIChD SElQX1JFVihicCkgPT0gQ0hJUF9SRVZfRU1VTCkgeworCQlicC0+cGh5X2ZsYWdzIHw9IFBI WV9CTUFDX0ZMQUc7CisJCWJwLT5saW5rX3VwID0gMTsKKwkJYnAtPmxpbmVfc3BlZWQgPSBT UEVFRF8xMDAwMDsKKwkJYnAtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQlOSUdfV1IoTklH X1JFR0lTVEVSU19FR1JFU1NfRFJBSU4wX01PREUgKyBicC0+cG9ydCo0LCAwKTsKKwkJYm54 MnhfYm1hY19lbmFibGUoYnAsIDApOworCQlibngyeF9saW5rX3JlcG9ydChicCk7CisJCXJl dHVybiAwOworCisJfSBlbHNlIHsKKwkJYm54MnhfcGh5X2RlYXNzZXJ0KGJwKTsKKwkJYm54 MnhfbGlua19pbml0aWFsaXplKGJwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IHZvaWQgYm54MnhfbGlua19yZXNldChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBwb3J0 ID0gYnAtPnBvcnQ7CisKKwkvKiBkaXNhYmxlIGF0dGVudGlvbnMgKi8KKwlibngyeF9iaXRz X2RpcyhicCwgR1JDQkFTRV9OSUcsCisJCSAgICAgICBOSUdfUkVHSVNURVJTX01BU0tfSU5U RVJSVVBUX1BPUlQwICsgcG9ydCo0LAorCQkgICAgICAgKE5JR19NQVNLX1hHWFMwX0xJTktf U1RBVFVTIHwKKwkJCU5JR19NQVNLX1hHWFMwX0xJTksxMEcgfAorCQkJTklHX01BU0tfU0VS REVTMF9MSU5LX1NUQVRVUyB8CisJCQlOSUdfTUFTS19NSV9JTlQpKTsKKworCWJueDJ4X2V4 dF9waHlfcmVzZXQoYnApOworCisJLyogcmVzZXQgdGhlIFNlckRlcy9YR1hTICovCisJUkVH X1dSKGJwLCBHUkNCQVNFX01JU0MsIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18zX0NMRUFS LAorCSAgICAgICAoMHgxZmYgPDwgKHBvcnQqMTYpKSk7CisKKwkvKiByZXNldCBFTUFDIC8g Qk1BQyBhbmQgZGlzYWJsZSBOSUcgaW50ZXJmYWNlcyAqLworCU5JR19XUihOSUdfUkVHSVNU RVJTX0JNQUMwX0lOX0VOICsgcG9ydCo0LCAwKTsKKwlOSUdfV1IoTklHX1JFR0lTVEVSU19C TUFDMF9PVVRfRU4gKyBwb3J0KjQsIDApOworCisJTklHX1dSKE5JR19SRUdJU1RFUlNfTklH X0VNQUMwX0VOICsgcG9ydCo0LCAwKTsKKwlOSUdfV1IoTklHX1JFR0lTVEVSU19FTUFDMF9J Tl9FTiArIHBvcnQqNCwgMCk7CisJTklHX1dSKE5JR19SRUdJU1RFUlNfRUdSRVNTX0VNQUMw X09VVF9FTiArIHBvcnQqNCwgMCk7CisKKwlOSUdfV1IoTklHX1JFR0lTVEVSU19FR1JFU1Nf RFJBSU4wX01PREUgKyBwb3J0KjQsIDEpOworfQorCisjaWZkZWYgQk5YMlhfWEdYU19MQgor c3RhdGljIHZvaWQgYm54Mnhfc2V0X3hneHNfbG9vcGJhY2sgKHN0cnVjdCBibngyeCAqYnAs IGludCBpc18xMGcpCit7CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKworCWlmIChpc18xMGcp IHsKKwkJdTMyIG1kX2RldmFkOworCisJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxMEcg bG9vcGJhY2sgZW5hYmxlXG4iKTsKKworCQkvKiBjaGFuZ2UgdGhlIHVuaV9waHlfYWRkciBp biB0aGUgbmlnICovCisJCVJFR19SRChicCwgR1JDQkFTRV9OSUcsCisJCSAgICAgICAoTklH X1JFR0lTVEVSU19YR1hTMF9DVFJMX01EX0RFVkFEICsgKHBvcnQqMHgxOCkpLAorCQkgICAg ICAgJm1kX2RldmFkKTsKKwkJTklHX1dSKE5JR19SRUdJU1RFUlNfWEdYUzBfQ1RSTF9NRF9E RVZBRCArIChwb3J0KjB4MTgpLCAweDUpOworCisJCS8qIGNoYW5nZSB0aGUgYWVyIG1tZCAq LworCQlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19BRVJfQkxPQ0spOwor CQlibngyeF9tZGlvMjJfd3JpdGUoYnAsIE1ESU9fQUVSX0JMT0NLX0FFUl9SRUcsIDB4Mjgw MCk7CisKKwkJLyogY29uZmlnIGNvbWJvIElFRUUwIGNvbnRyb2wgcmVnIGZvciBsb29wYmFj ayAqLworCQlNRElPX1NFVF9SRUdfQkFOSyhicCwgTURJT19SRUdfQkFOS19DTDczX0lFRUVC MCk7CisJCWJueDJ4X21kaW8yMl93cml0ZShicCwgTURJT19DTDczX0lFRUVCMF9DTDczX0FO X0NPTlRST0wsCisJCQkJICAgMHg2MDQxKTsKKworCQkvKiBzZXQgYWVyIG1tZCBiYWNrICov CisJCWJueDJ4X3NldF9hZXJfbW1kKGJwKTsKKworCQkvKiBhbmQgbWRfZGV2YWQgKi8KKwkJ TklHX1dSKE5JR19SRUdJU1RFUlNfWEdYUzBfQ1RSTF9NRF9ERVZBRCArIChwb3J0KjB4MTgp LAorCQkgICAgICAgbWRfZGV2YWQpOworCisJfSBlbHNlIHsKKwkJdTMyIG1paV9jb250cm9s OworCisJCURQKE5FVElGX01TR19MSU5LLCAiWEdYUyAxRyBsb29wYmFjayBlbmFibGVcbiIp OworCisJCU1ESU9fU0VUX1JFR19CQU5LKGJwLCBNRElPX1JFR19CQU5LX0NPTUJPX0lFRUUw KTsKKwkJYm54MnhfbWRpbzIyX3JlYWQoYnAsIE1ESU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRS T0wsCisJCQkJICAmbWlpX2NvbnRyb2wpOworCQlibngyeF9tZGlvMjJfd3JpdGUoYnAsIE1E SU9fQ09NQk9fSUVFRTBfTUlJX0NPTlRST0wsCisJCQkJICAgKG1paV9jb250cm9sIHwKKwkJ CQkgICAgTURJT19DT01CT19JRUVPX01JSV9DT05UUk9MX0xPT1BCQUNLKSk7CisJfQorfQor I2VuZGlmCisKKy8qIGVuZCBvZiBQSFkvTUFDICovCisKKy8qIHNsb3cgcGF0aCAqLworCisv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqLworCisvKiB0aGUgc2xvdyBwYXRoIHF1ZXVlIGlzIG9k ZCBzaW5jZSBjb21wbGV0aW9ucyBhcnJpdmUgb24gdGhlIGZhc3RwYXRoIHJpbmcgKi8KK3N0 YXRpYyBpbnQgYm54Mnhfc3BfcG9zdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgY29tbWFuZCwg aW50IGNpZCwKKwkJCSB1MzIgZGF0YV9oaSwgdTMyIGRhdGFfbG8sIGludCBjb21tb24pCit7 CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKworCURQKE5FVElGX01TR19USU1FUiwKKwkgICAi c3BlICgleDoleCkgIGNvbW1hbmQgJXggIGh3X2NpZCAleCAgZGF0YSAoJXg6JXgpICBsZWZ0 ICV4XG4iLAorCSAgICh1MzIpVTY0X0hJKGJwLT5zcHFfbWFwcGluZyksICh1MzIpKFU2NF9M TyhicC0+c3BxX21hcHBpbmcpICsKKwkgICAodm9pZCAqKWJwLT5zcHFfcHJvZF9iZCAtICh2 b2lkICopYnAtPnNwcSksIGNvbW1hbmQsCisJICAgSFdfQ0lEKGJwLCBjaWQpLCBkYXRhX2hp LCBkYXRhX2xvLCBicC0+c3BxX2xlZnQpOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJP UgorCWlmICh1bmxpa2VseShicC0+cGFuaWMpKSB7CisJCXJldHVybiAtRUlPOworCX0KKyNl bmRpZgorCisJc3Bpbl9sb2NrKCZicC0+c3BxX2xvY2spOworCisJaWYgKCFicC0+c3BxX2xl ZnQgfHwKKwkgICAgKCgoYnAtPnNwcV9wcm9kX2lkeCAtIGJwLT5zcHFfY29uX2lkeCkgJiAw eGZmZikgPT0KKwkJCQkJCQkgICBNQVhfU1BfREVTQ19DTlQpKSB7CisKKwkJQk5YMlhfRVJS KCJCVUchIFNQUSByaW5nIGZ1bGwhXG4iKTsKKwkJc3Bpbl91bmxvY2soJmJwLT5zcHFfbG9j ayk7CisJCWJueDJ4X3BhbmljKCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qIENJRCBu ZWVkcyBwb3J0IG51bWJlciB0byBiZSBlbmNvZGVkIGludCBpdCAqLworCWJwLT5zcHFfcHJv ZF9iZC0+aGRyLmNvbm5fYW5kX2NtZF9kYXRhID0KKwkJKChjb21tYW5kIDw8IFNQRV9IRFJf Q01EX0lEX1NISUZUKSB8IEhXX0NJRChicCwgY2lkKSk7CisJYnAtPnNwcV9wcm9kX2JkLT5o ZHIudHlwZSA9IEVUSF9DT05ORUNUSU9OX1RZUEU7CisJaWYgKGNvbW1vbikKKwkJYnAtPnNw cV9wcm9kX2JkLT5oZHIudHlwZSB8PQorCQkJCQkoMSA8PCBTUEVfSERSX0NPTU1PTl9SQU1S T0RfU0hJRlQpOworCisJYnAtPnNwcV9wcm9kX2JkLT5kYXRhLm1hY19jb25maWdfYWRkci5o aSA9IGRhdGFfaGk7CisJYnAtPnNwcV9wcm9kX2JkLT5kYXRhLm1hY19jb25maWdfYWRkci5s byA9IGRhdGFfbG87CisKKwlicC0+c3BxX2xlZnQtLTsKKworCWlmIChicC0+c3BxX3Byb2Rf YmQgPT0gYnAtPnNwcV9sYXN0X2JkKSB7CisJCWJwLT5zcHFfcHJvZF9iZCA9IGJwLT5zcHE7 CisJCWJwLT5zcHFfcHJvZF9pZHggPSAwOworCQlEUChORVRJRl9NU0dfVElNRVIsICJlbmQg b2Ygc3BxXG4iKTsKKworCX0gZWxzZSB7CisJCWJwLT5zcHFfcHJvZF9iZCsrOworCQlicC0+ c3BxX3Byb2RfaWR4Kys7CisJfQorCisJUkVHX1dSMzIoYnAsIEJBUl9YU1RST1JNX0lOVE1F TSwgWFNUT1JNX1NQUV9QUk9EX09GRlNFVChwb3J0KSwKKwkJIGJwLT5zcHFfcHJvZF9pZHgp OworCisJc3Bpbl91bmxvY2soJmJwLT5zcHFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8q IGFjcXVpcmUgc3BsaXQgTUNQIGFjY2VzcyBsb2NrIHJlZ2lzdGVyICovCitzdGF0aWMgaW50 IGJueDJ4X2xvY2tfYWxyKCBzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCByYyA9IDA7CisJ dTMyIGksIGosIHZhbDsKKworCWkgPSAxMDA7CisKKwlmb3IgKGogPSAwOyBqIDwgaSoxMDsg aisrKSB7CisJdmFsID0gMVVMIDw8IDMxOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUNQLCAw eDljLCB2YWwpOworCQl2YWwgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfTUNQLCAweDljKTsKKwkJ aWYgKHZhbCAmICgxTCA8PCAzMSkpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbWRlbGF5KDUp OworCX0KKworCWlmICghKHZhbCAmICgxTCA8PCAzMSkpKSB7CisJCUJOWDJYX0VSUigiQ2Fu bm90IGFjcXVpcmUgbnZyYW0gaW50ZXJmYWNlXG4iKTsKKworCQlyYyA9IC1FQlVTWTsKKwl9 CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlbGVhc2Ugc3BsaXQgTUNQIGFjY2VzcyBsb2Nr IHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCBibngyeF91bmxvY2tfYWxyKHN0cnVjdCBibngy eCAqYnApCit7CisJdTMyIHZhbCA9IDA7CisKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUNQLCAw eDljLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBibngyeF91cGRhdGVfZHNiX2lk eChzdHJ1Y3QgYm54MnggKmJwKQoreworCXN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2sg KmRzYiA9IGJwLT5kZWZfc3RhdHVzX2JsazsKKwl1MTYgcmMgPSAwOworCisJaWYgKGJwLT5k ZWZfYXR0X2lkeCAhPSBkc2ItPmF0dGVuX3N0YXR1c19ibG9jay5hdHRuX2JpdHNfaW5kZXgp IHsKKwkKKworCQlicC0+ZGVmX2F0dF9pZHggPSBkc2ItPmF0dGVuX3N0YXR1c19ibG9jay5h dHRuX2JpdHNfaW5kZXg7CisJCXJjIHw9IDE7CisJfQorCWlmIChicC0+ZGVmX2NfaWR4ICE9 IGRzYi0+Y19kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleCkgeworCQlicC0+ ZGVmX2NfaWR4ID0gZHNiLT5jX2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2luZGV4 OworCQlyYyB8PSAyOworCX0KKwlpZiAoYnAtPmRlZl91X2lkeCAhPSBkc2ItPnVfZGVmX3N0 YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXgpIHsKKwkJYnAtPmRlZl91X2lkeCA9IGRz Yi0+dV9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRleDsKKwkJcmMgfD0gNDsK Kwl9CisJaWYgKGJwLT5kZWZfeF9pZHggIT0gZHNiLT54X2RlZl9zdGF0dXNfYmxvY2suc3Rh dHVzX2Jsb2NrX2luZGV4KSB7CisJCWJwLT5kZWZfeF9pZHggPSBkc2ItPnhfZGVmX3N0YXR1 c19ibG9jay5zdGF0dXNfYmxvY2tfaW5kZXg7CisJCXJjIHw9IDg7CisJfQorCWlmIChicC0+ ZGVmX3RfaWR4ICE9IGRzYi0+dF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pbmRl eCkgeworCQlicC0+ZGVmX3RfaWR4ID0gZHNiLT50X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVz X2Jsb2NrX2luZGV4OworCQlyYyB8PSAxNjsKKwl9CisJcm1iKCk7IC8qIFRCRCBjaGFjayB0 aGlzICovCisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBz bG93IHBhdGggc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisK K3N0YXRpYyB2b2lkIGJueDJ4X2F0dG5faW50X2Fzc2VydGVkKHN0cnVjdCBibngyeCAqYnAs IHUxNiBhc3NlcnRlZCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXUzMiBpZ3VfYWRk ciA9IChJR1VfQUREUl9BVFROX0JJVFNfU0VUICsgSUdVX1BPUlRfQkFTRSAqIHBvcnQpICog ODsKKwl1MzIgYWV1X2FkZHIgPSBwb3J0ID8gTUlTQ19SRUdJU1RFUlNfQUVVX01BU0tfQVRU Tl9GVU5DXzEgOgorCQkJICAgICAgTUlTQ19SRUdJU1RFUlNfQUVVX01BU0tfQVRUTl9GVU5D XzA7CisJdTMyIG5pZ19tYXNrX2FkZHIgPSBwb3J0ID8gTklHX1JFR0lTVEVSU19NQVNLX0lO VEVSUlVQVF9QT1JUMSA6CisJCQkJICAgTklHX1JFR0lTVEVSU19NQVNLX0lOVEVSUlVQVF9Q T1JUMDsKKworCWlmICh+YnAtPmFldV9tYXNrICYgKGFzc2VydGVkICYgMHhmZikpCisJCUJO WDJYX0VSUigiSUdVIEVSUk9SXG4iKTsKKwlpZiAoYnAtPmF0dG5fc3RhdGUgJiBhc3NlcnRl ZCkKKwkJQk5YMlhfRVJSKCJJR1UgRVJST1JcbiIpOworCisJRFAoTkVUSUZfTVNHX0hXLCAi YWV1X21hc2sgJXggIG5ld2x5IGFzc2VydGVkICV4XG4iLAorCSAgIGJwLT5hZXVfbWFzaywg YXNzZXJ0ZWQpOworCWJwLT5hZXVfbWFzayAmPSB+KGFzc2VydGVkICYgMHhmZik7CisJRFAo TkVUSUZfTVNHX0hXLCAiYWZ0ZXIgbWFza2luZzogYWV1X21hc2sgJXhcbiIsIGJwLT5hZXVf bWFzayk7CisKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQ19BRVUsIGFldV9hZGRyLCBicC0+ YWV1X21hc2spOworCisJYnAtPmF0dG5fc3RhdGUgfD0gYXNzZXJ0ZWQ7CisKKwlpZiAoYXNz ZXJ0ZWQgJiBBVFROX0hBUkRfV0lSRURfTUFTSykgeworCQlpZiAoYXNzZXJ0ZWQgJiBBVFRO X05JR19GT1JfRlVOQzApIHsKKwkJCXUzMiBuaWdfc3RhdHVzX3BvcnQ7CisJCQl1MzIgbmln X2ludF9hZGRyID0gcG9ydCA/CisJCQkJCU5JR19SRUdJU1RFUlNfU1RBVFVTX0lOVEVSUlVQ VF9QT1JUMSA6CisJCQkJCU5JR19SRUdJU1RFUlNfU1RBVFVTX0lOVEVSUlVQVF9QT1JUMDsK KworCQkJYnAtPm5pZ19tYXNrID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywgbmlnX21hc2tf YWRkcik7CisJCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTklHLCBuaWdfbWFza19hZGRyLCAwKTsK KworCQkJbmlnX3N0YXR1c19wb3J0ID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywKKwkJCQkJ CSBuaWdfaW50X2FkZHIpOworCQkJYm54MnhfbGlua191cGRhdGUoYnApOworCQkJLyogaGFu ZGxlIHVuaWNvcmUgYXR0bj8gKi8KKwkJfSAvKiBOSUcgQVRUTiAqLworCQlpZiAoYXNzZXJ0 ZWQgJiBBVFROX1NXX1RJTUVSXzRfRlVOQzApIHsKKwkJCURQKE5FVElGX01TR19IVywgIkFU VE5fU1dfVElNRVJfNF9GVU5DIVxuIik7CisJCX0KKwkJaWYgKGFzc2VydGVkICYgR1BJT18y X0ZVTkMwKSB7CisJCQlEUChORVRJRl9NU0dfSFcsICJHUElPXzJfRlVOQyFcbiIpOworCQl9 CisJCWlmIChhc3NlcnRlZCAmIEdQSU9fM19GVU5DMCkgeworCQkJRFAoTkVUSUZfTVNHX0hX LCAiR1BJT18zX0ZVTkMhXG4iKTsKKwkJfQorCQlpZiAoYXNzZXJ0ZWQgJiBHUElPXzRfRlVO QzApIHsKKwkJCURQKE5FVElGX01TR19IVywgIkdQSU9fNF9GVU5DIVxuIik7CisJCX0KKwkJ aWYgKGFzc2VydGVkICYgQVRUTl9HRU5FUkFMX0FUVE5fMSkgeworCQkJRFAoTkVUSUZfTVNH X0hXLCAiQVRUTl9HRU5FUkFMX0FUVE5fMSFcbiIpOworCQkJUkVHX1dSKGJwLCBHUkNCQVNF X01JU0MsCisJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfQUVVX0dFTkVSQUxfQVRUTl8xLCAw eDApOworCQkJLyogVEJEIGFzc2VydCBhbmQgZHVtcCAqLworCQl9CisJCWlmIChhc3NlcnRl ZCAmIEFUVE5fR0VORVJBTF9BVFROXzIpIHsKKwkJCURQKE5FVElGX01TR19IVywgIkFUVE5f R0VORVJBTF9BVFROXzIhXG4iKTsKKwkJfQorCQlpZiAoYXNzZXJ0ZWQgJiBBVFROX0dFTkVS QUxfQVRUTl8zKSB7CisJCQlEUChORVRJRl9NU0dfSFcsICJBVFROX0dFTkVSQUxfQVRUTl8z IVxuIik7CisJCX0KKwl9IC8qIGlmIGhhcmR3aXJlZCAqLworCisJRFAoTkVUSUZfTVNHX0hX LCAiYWJvdXQgdG8gbWFzayAweCUwOHggYXQgSUdVIGFkZHIgMHgleFxuIiwgYXNzZXJ0ZWQs CisJICAgQkFSX0lHVV9JTlRNRU0gKyBpZ3VfYWRkcik7CisJUkVHX1dSKGJwLCBCQVJfSUdV X0lOVE1FTSwgaWd1X2FkZHIsIGFzc2VydGVkKTsKKworCS8qIG5vdyBzZXQgYmFjayB0aGUg bWFzayAqLworCWlmIChhc3NlcnRlZCAmIChBVFROX05JR19GT1JfRlVOQzAgfCBBVFROX05J R19GT1JfRlVOQzEpKSB7CisJCVJFR19XUihicCwgR1JDQkFTRV9OSUcsIG5pZ19tYXNrX2Fk ZHIsIGJwLT5uaWdfbWFzayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9hdHRuX2lu dF9kZWFzc2VydGVkKHN0cnVjdCBibngyeCAqYnAsIHUxNiBkZWFzc2VydGVkKQoreworCWlu dCBwb3J0ID0gYnAtPnBvcnQ7CisJaW50IGluZGV4OworCXN0cnVjdCBhdHRuX3JvdXRlIGF0 dG47CisJc3RydWN0IGF0dG5fcm91dGUgZ3JvdXBfbWFzazsKKwl1MzIgcmVnX2FkZHI7CisJ dTMyIHZhbDsKKworCS8qIG5lZWQgdG8gdGFrZSBIVyBsb2NrIGJlY2F1c2UgTUNQIG9yIG90 aGVyIHBvcnQgbWlnaHQgYWxzbworCSAgIHRyeSB0byBoYW5kbGUgdGhpcyBldmVudCAqLwor CWJueDJ4X2xvY2tfYWxyKGJwKTsKKworCWF0dG4uc2lnWzBdID0gUkVHX1JEKGJwLCBHUkNC QVNFX01JU0NfQUVVLAorCQkJICAgICBNSVNDX1JFR0lTVEVSU19BRVVfQUZURVJfSU5WRVJU XzFfRlVOQ18wICsKKwkJCSAgICAgcG9ydCo0KTsKKworCWF0dG4uc2lnWzFdID0gUkVHX1JE KGJwLCBHUkNCQVNFX01JU0NfQUVVLAorCQkJICAgICBNSVNDX1JFR0lTVEVSU19BRVVfQUZU RVJfSU5WRVJUXzJfRlVOQ18wICsKKwkJCSAgICAgcG9ydCo0KTsKKworCWF0dG4uc2lnWzJd ID0gUkVHX1JEKGJwLCBHUkNCQVNFX01JU0NfQUVVLAorCQkJICAgICBNSVNDX1JFR0lTVEVS U19BRVVfQUZURVJfSU5WRVJUXzNfRlVOQ18wICsKKwkJCSAgICAgcG9ydCo0KTsKKworCWF0 dG4uc2lnWzNdID0gUkVHX1JEKGJwLCBHUkNCQVNFX01JU0NfQUVVLAorCQkJICAgICBNSVND X1JFR0lTVEVSU19BRVVfQUZURVJfSU5WRVJUXzRfRlVOQ18wICsKKwkJCSAgICAgcG9ydCo0 KTsKKworCURQKE5FVElGX01TR19IVywgImF0dG4gJWxseFxuIiwgKHVuc2lnbmVkIGxvbmcg bG9uZylhdHRuLnNpZ1swXSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfRFlO QU1JQ19BVFROX0dSUFM7IGluZGV4KyspIHsKKwkJaWYgKGRlYXNzZXJ0ZWQgJiAoMSA8PCBp bmRleCkpIHsKKwkJCWdyb3VwX21hc2sgPSBicC0+YXR0bl9ncm91cFtpbmRleF07CisKKwkJ CURQKE5FVElGX01TR19IVywgImdyb3VwWyVkXTogJWxseFxuIiwgaW5kZXgsCisJCQkgICAo dW5zaWduZWQgbG9uZyBsb25nKWdyb3VwX21hc2suc2lnWzBdKTsKKworCQkJaWYgKGF0dG4u c2lnWzNdICYgZ3JvdXBfbWFzay5zaWdbM10gJgorCQkJICAgIEVWRVJFU1RfR0VOX0FUVE5f SU5fVVNFX01BU0spIHsKKworCQkJCWlmIChCTlgyWF9NQ19BU1NFUlRfQklUUyAmIGF0dG4u c2lnWzNdKSB7CisKKwkJCQkJQk5YMlhfRVJSKCJNQyBhc3NlcnQhXG4iKTsKKwkJCQkJYm54 MnhfcGFuaWMoKTsKKworCQkJCX0gZWxzZSBpZiAoQk5YMlhfTUNQX0FTU0VSVCAmIGF0dG4u c2lnWzNdKSB7CisKKwkJCQkJQk5YMlhfRVJSKCJNQ1AgYXNzZXJ0IVxuIik7CisJCQkJCVJF R19XUihicCwgR1JDQkFTRV9NSVNDX0FFVSwKKwkJCQkgICAgICAgTUlTQ19SRUdJU1RFUlNf QUVVX0dFTkVSQUxfQVRUTl8xMSwgMCk7CisJCQkJCWJueDJ4X21jX2Fzc2VydChicCk7CisK KwkJCQl9IGVsc2UgeworCQkJCQlCTlgyWF9FUlIoIlVOS09XRU4gSFcgQVNTRVJUIVxuIik7 CisJCQkJfQorCQkJfQorCisJCQlpZiAoYXR0bi5zaWdbMV0gJiBncm91cF9tYXNrLnNpZ1sx XSAmCisJCQkgICAgQk5YMlhfRE9PUlFfQVNTRVJUKSB7CisKKwkJCQl2YWwgPSBSRUdfUkQo YnAsIEdSQ0JBU0VfRFEsCisJCQkJCSAgICAgRE9SUV9SRUdJU1RFUlNfRE9SUV9JTlRfU1RT X0NMUik7CisJCQkJQk5YMlhfRVJSKCJEQiBodyBhdHRlbnRpb24gMHgleFxuIiwgdmFsKTsK KwkJCQkvKiBET1JRIGRpc2NhcmQgYXR0ZW50aW9uICovCisJCQkJaWYgKHZhbCAmIDB4Mikg eworCQkJCQlCTlgyWF9FUlIoIkZBVEFMIGVycm9yIGZyb20gRE9SUVxuIik7CisJCQkJfQor CQkJfQorCisJCQlpZiAoYXR0bi5zaWdbMl0gJiBncm91cF9tYXNrLnNpZ1syXSAmCisJCQkg ICAgQUVVX0lOUFVUU19BVFROX0JJVFNfUFhQX0hXX0lOVEVSUlVQVCkgeworCisJCQkJdmFs ID0gUkVHX1JEKGJwLCBHUkNCQVNFX1BYUCwKKwkJCQkJICAgICBQWFBfUkVHSVNURVJTX1BY UF9JTlRfU1RTX0NMUl8wKTsKKwkJCQlCTlgyWF9FUlIoIlBYUCBodyBhdHRlbnRpb24gMHgl eFxuIiwgdmFsKTsKKwkJCQkvKiBSUV9VU0RNRFBfRklGT19PVkVSRkxPVyAqLworCQkJCWlm ICh2YWwgJiAweDE4MDAwKSB7CisJCQkJCUJOWDJYX0VSUigiRkFUQUwgZXJyb3IgZnJvbSBQ WFBcbiIpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGF0dG4uc2lnWzNdICYgZ3JvdXBfbWFz ay5zaWdbM10gJgorCQkJICAgIEVWRVJFU1RfTEFUQ0hFRF9BVFROX0lOX1VTRV9NQVNLKSB7 CisKKwkJCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQ19BRVUsCisJCQkJICAgICAgIE1JU0Nf UkVHSVNURVJTX0FFVV9DTFJfTEFUQ0hfU0lHTkFMLAorCQkJCSAgICAgICAweDdmZik7CisJ CQkJRFAoTkVUSUZfTVNHX0hXLCAiZ290IGxhdGNoZWQgYml0cyAweCV4XG4iLAorCQkJCSAg IGF0dG4uc2lnWzNdKTsKKwkJCX0KKwkJfQorCX0KKworCWJueDJ4X3VubG9ja19hbHIoYnAp OworCisJcmVnX2FkZHIgPSAoSUdVX0FERFJfQVRUTl9CSVRTX0NMUiArIElHVV9QT1JUX0JB U0UgKiBwb3J0KSAqIDg7CisKKwl2YWwgPSB+ZGVhc3NlcnRlZDsKKy8qCURQKE5FVElGX01T R19JTlRSLCAid3JpdGUgMHglMDh4IHRvIElHVSBhZGRyIDB4JXhcbiIsIHZhbCwKKwkgICBC QVJfSUdVX0lOVE1FTSArIHJlZ19hZGRyKTsgKi8KKwlSRUdfV1IzMihicCwgQkFSX0lHVV9J TlRNRU0sIHJlZ19hZGRyLCB2YWwpOworCisJaWYgKGJwLT5hZXVfbWFzayAmIChkZWFzc2Vy dGVkICYgMHhmZikpCisJCUJOWDJYX0VSUigiSUdVIEJVR1xuIik7CisJaWYgKH5icC0+YXR0 bl9zdGF0ZSAmIGRlYXNzZXJ0ZWQpCisJCUJOWDJYX0VSUigiSUdVIEJVR1xuIik7CisKKwly ZWdfYWRkciA9IHBvcnQgPyBNSVNDX1JFR0lTVEVSU19BRVVfTUFTS19BVFROX0ZVTkNfMSA6 CisJCQkgIE1JU0NfUkVHSVNURVJTX0FFVV9NQVNLX0FUVE5fRlVOQ18wOworCisJRFAoTkVU SUZfTVNHX0hXLCAiYWV1X21hc2sgJXhcbiIsIGJwLT5hZXVfbWFzayk7CisJYnAtPmFldV9t YXNrIHw9IChkZWFzc2VydGVkICYgMHhmZik7CisKKwlEUChORVRJRl9NU0dfSFcsICJuZXcg bWFzayAleFxuIiwgYnAtPmFldV9tYXNrKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQ19B RVUsIHJlZ19hZGRyLCBicC0+YWV1X21hc2spOworCisJRFAoTkVUSUZfTVNHX0hXLCAiYXR0 bl9zdGF0ZSAleFxuIiwgYnAtPmF0dG5fc3RhdGUpOworCWJwLT5hdHRuX3N0YXRlICY9IH5k ZWFzc2VydGVkOworCURQKE5FVElGX01TR19IVywgIm5ldyBzdGF0ZSAleFxuIiwgYnAtPmF0 dG5fc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9hdHRuX2ludChzdHJ1Y3QgYm54 MnggKmJwKQoreworCS8qIHJlYWQgbG9jYWwgY29weSBvZiBiaXRzICovCisJdTE2IGF0dG5f Yml0cyA9IGJwLT5kZWZfc3RhdHVzX2Jsay0+YXR0ZW5fc3RhdHVzX2Jsb2NrLmF0dG5fYml0 czsKKwl1MTYgYXR0bl9hY2sgPSBicC0+ZGVmX3N0YXR1c19ibGstPmF0dGVuX3N0YXR1c19i bG9jay5hdHRuX2JpdHNfYWNrOworCXUxNiBhdHRuX3N0YXRlID0gYnAtPmF0dG5fc3RhdGU7 CisKKwkvKiBsb29rIGZvciBjaGFuZ2VkIGJpdHMgKi8KKwl1MTYgYXNzZXJ0ZWQgICA9ICBh dHRuX2JpdHMgJiB+YXR0bl9hY2sgJiB+YXR0bl9zdGF0ZTsKKwl1MTYgZGVhc3NlcnRlZCA9 IH5hdHRuX2JpdHMgJiAgYXR0bl9hY2sgJiAgYXR0bl9zdGF0ZTsKKworCURQKE5FVElGX01T R19IVywKKwkgICAiYXR0bl9iaXRzICV4ICBhdHRuX2FjayAleCAgYXNzZXJ0ZWQgJXggIGRl YXNzZXJ0ZWQgJXhcbiIsCisJICAgYXR0bl9iaXRzLCBhdHRuX2FjaywgYXNzZXJ0ZWQsIGRl YXNzZXJ0ZWQpOworCisJaWYgKH4oYXR0bl9iaXRzIF4gYXR0bl9hY2spICYgKGF0dG5fYml0 cyBeIGF0dG5fc3RhdGUpKSB7CisJCUJOWDJYX0VSUigiYmFkIGF0dGVudGlvbiBzdGF0ZVxu Iik7CisJfQorCisJLyogaGFuZGxlIGJpdHMgdGhhdCB3ZXJlIHJhaXNlZCAqLworCWlmIChh c3NlcnRlZCkgeworCQlibngyeF9hdHRuX2ludF9hc3NlcnRlZChicCwgYXNzZXJ0ZWQpOwor CX0KKworCWlmIChkZWFzc2VydGVkKSB7CisJCWJueDJ4X2F0dG5faW50X2RlYXNzZXJ0ZWQo YnAsIGRlYXNzZXJ0ZWQpOworCX0KK30KKworc3RhdGljIHZvaWQgYm54Mnhfc3BfdGFzayh1 bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gKHN0cnVjdCBibngy eCAqKWFyZzsKKwl1MTYgc3RhdHVzOworCisJLyogUmV0dXJuIGhlcmUgaWYgaW50ZXJydXB0 IGlzIGRpc2FibGVkLiAqLworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmYnAtPmludHJf c2VtKSAhPSAwKSkgeworCQlEUChORVRJRl9NU0dfSU5UUiwgImNhbGxlZCBidXQgaW50cl9z ZW0gbm90IDAsIHJldHVybmluZ1xuIik7CisJCXJldHVybjsKKwl9CisKKwlzdGF0dXMgPSBi bngyeF91cGRhdGVfZHNiX2lkeChicCk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCUJOWDJY X0VSUigic3B1cmlvdXMgc2xvd3BhdGggaW50ZXJydXB0IVxuIik7CisJfQorCisJRFAoTkVU SUZfTVNHX0lOVFIsICJnb3QgYSBzbG93cGF0aCBpbnRlcnJ1cHQgKHVwZGF0ZWQgJXgpXG4i LCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIDB4MSkgeworCQkvKiBIVyBhdHRlbnRpb25z ICovCisJCWJueDJ4X2F0dG5faW50KGJwKTsKKwl9CisKKwkvKiBDU3Rvcm0gZXZlbnRzOiBx dWVyeV9zdGF0cywgY2ZjIGRlbGV0ZSByYW1yb2RzICovCisJaWYgKHN0YXR1cyAmIDB4Mikg eworCQlicC0+c3RhdF9wZW5kaW5nID0gMDsKKwl9CisKKwlpZiAoc3RhdHVzICYgMHg4KSB7 ICAvKiBzcHEgY29uc3VtZXIgdXBkYXRlICovCisJCWJwLT5zcHFfY29uX2lkeCA9ICpicC0+ c3BxX2h3X2NvbjsKKwkJRFAoTkVUSUZfTVNHX0lOVFIsICJzcHEgKCVkLCVkKVxuIiwKKwkJ ICAgYnAtPnNwcV9wcm9kX2lkeCwgYnAtPnNwcV9jb25faWR4KTsKKwl9CisKKwlibngyeF9h Y2tfc2IoYnAsIDE2LCBBVFRFTlRJT05fSUQsIGJwLT5kZWZfYXR0X2lkeCwgSUdVX0lOVF9O T1AsIDEpOworCWJueDJ4X2Fja19zYihicCwgMTYsIFVTVE9STV9JRCwgYnAtPmRlZl91X2lk eCwgSUdVX0lOVF9OT1AsIDEpOworCWJueDJ4X2Fja19zYihicCwgMTYsIENTVE9STV9JRCwg YnAtPmRlZl9jX2lkeCwgSUdVX0lOVF9OT1AsIDEpOworCWJueDJ4X2Fja19zYihicCwgMTYs IFhTVE9STV9JRCwgYnAtPmRlZl94X2lkeCwgSUdVX0lOVF9OT1AsIDEpOworCWJueDJ4X2Fj a19zYihicCwgMTYsIFRTVE9STV9JRCwgYnAtPmRlZl90X2lkeCwgSUdVX0lOVF9FTkFCTEUs IDEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYm54MnhfbXNpeF9zcF9pbnQoaW50IGly cSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBk ZXZfaW5zdGFuY2U7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisK KwkvKiBSZXR1cm4gaGVyZSBpZiBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQuICovCisJaWYgKHVu bGlrZWx5KGF0b21pY19yZWFkKCZicC0+aW50cl9zZW0pICE9IDApKSB7CisJCURQKE5FVElG X01TR19JTlRSLCAiY2FsbGVkIGJ1dCBpbnRyX3NlbSBub3QgMCwgcmV0dXJuaW5nXG4iKTsK KwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWJueDJ4X2Fja19zYihicCwgMTYsIFhT VE9STV9JRCwgMCwgSUdVX0lOVF9ESVNBQkxFLCAwKTsKKworI2lmZGVmIEJOWDJYX1NUT1Bf T05fRVJST1IKKwlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkgeworCQlyZXR1cm4gSVJRX0hB TkRMRUQ7CisJfQorI2VuZGlmCisKKwl0YXNrbGV0X3NjaGVkdWxlKCZicC0+c3BfdGFzayk7 CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGVuZCBvZiBzbG93IHBhdGggKi8K KworLyogU3RhdGlzdGljcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBNYWNy b3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVVBEQVRFX1NUQVQocywg dCkgXAorCWRvIHsgXAorCQllc3RhdHMtPnQgKz0gbmV3LT5zIC0gb2xkLT5zOyBcCisJCW9s ZC0+cyA9IG5ldy0+czsgXAorCX0gd2hpbGUgKDApCisKKy8qIHN1bVtoaTpsb10gKz0gYWRk W2hpOmxvXSAqLworI2RlZmluZSBBRERfNjQoc19oaSwgYV9oaSwgc19sbywgYV9sbykgXAor CWRvIHsgXAorCQlzX2xvICs9IGFfbG87IFwKKwkJc19oaSArPSBhX2hpICsgKHNfbG8gPCBh X2xvKSA/IDEgOiAwOyBcCisJfSB3aGlsZSAoMCkKKworLyogZGlmZmVyZW5jZSA9IG1pbnVl bmQgLSBzdWJ0cmFoZW5kICovCisjZGVmaW5lIERJRkZfNjQoZF9oaSwgbV9oaSwgc19oaSwg ZF9sbywgbV9sbywgc19sbykgXAorCWRvIHsgXAorCQlpZiAobV9sbyA8IHNfbG8pIHsJLyog dW5kZXJmbG93ICovIFwKKwkJCWRfaGkgPSBtX2hpIC0gc19oaTsgXAorCQkJaWYgKGRfaGkg PiAwKSB7IC8qIHdlIGNhbiAnbG9hbicgMSAqLyBcCisJCQkJZF9oaS0tOyBcCisJCQkJZF9s byA9IG1fbG8gKyAoVUlOVF9NQVggLSBzX2xvKSArIDE7IFwKKwkJCX0gZWxzZSB7CS8qIG1f aGkgPD0gc19oaSAqLyBcCisJCQkJZF9oaSA9IDA7IFwKKwkJCQlkX2xvID0gMDsgXAorCQkJ fSBcCisJCX0gZWxzZSB7CQkvKiBtX2xvID49IHNfbG8gKi8gXAorCQkJaWYgKG1faGkgPCBz X2hpKSB7IFwKKwkJCSAgICBkX2hpID0gMDsgXAorCQkJICAgIGRfbG8gPSAwOyBcCisJCQl9 IGVsc2UgewkvKiBtX2hpID49IHNfaGkgKi8gXAorCQkJICAgIGRfaGkgPSBtX2hpIC0gc19o aTsgXAorCQkJICAgIGRfbG8gPSBtX2xvIC0gc19sbzsgXAorCQkJfSBcCisJCX0gXAorCX0g d2hpbGUgKDApCisKKy8qIG1pbnVlbmQgLT0gc3VidHJhaGVuZCAqLworI2RlZmluZSBTVUJf NjQobV9oaSwgc19oaSwgbV9sbywgc19sbykgXAorCWRvIHsgXAorCQlESUZGXzY0KG1faGks IG1faGksIHNfaGksIG1fbG8sIG1fbG8sIHNfbG8pOyBcCisJfSB3aGlsZSAoMCkKKworI2Rl ZmluZSBVUERBVEVfU1RBVDY0KHNfaGksIHRfaGksIHNfbG8sIHRfbG8pIFwKKwlkbyB7IFwK KwkJRElGRl82NChkaWZmLmhpLCBuZXctPnNfaGksIG9sZC0+c19oaSwgXAorCQkJZGlmZi5s bywgbmV3LT5zX2xvLCBvbGQtPnNfbG8pOyBcCisJCW9sZC0+c19oaSA9IG5ldy0+c19oaTsg XAorCQlvbGQtPnNfbG8gPSBuZXctPnNfbG87IFwKKwkJQUREXzY0KGVzdGF0cy0+dF9oaSwg ZGlmZi5oaSwgXAorCQkgICAgICAgZXN0YXRzLT50X2xvLCBkaWZmLmxvKTsgXAorCX0gd2hp bGUgKDApCisKKy8qIHN1bVtoaTpsb10gKz0gYWRkICovCisjZGVmaW5lIEFERF9FWFRFTkRf NjQoc19oaSwgc19sbywgYSkgXAorCWRvIHsgXAorCQlzX2xvICs9IGE7IFwKKwkJc19oaSAr PSAoc19sbyA8IGEpID8gMSA6IDA7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFVQREFU RV9FWFRFTkRfU1RBVChzLCB0X2hpLCB0X2xvKSBcCisJZG8geyBcCisJCUFERF9FWFRFTkRf NjQoZXN0YXRzLT50X2hpLCBlc3RhdHMtPnRfbG8sIG5ldy0+cyk7IFwKKwl9IHdoaWxlICgw KQorCisjZGVmaW5lIFVQREFURV9FWFRFTkRfVFNUQVQocywgdF9oaSwgdF9sbykgXAorCWRv IHsgXAorCQlkaWZmID0gdGNsaWVudC0+cyAtIG9sZF90Y2xpZW50LT5zOyBcCisJCW9sZF90 Y2xpZW50LT5zID0gdGNsaWVudC0+czsgXAorCQlBRERfRVhURU5EXzY0KGVzdGF0cy0+dF9o aSwgZXN0YXRzLT50X2xvLCBkaWZmKTsgXAorCX0gd2hpbGUgKDApCisKKy8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCisqIEdlbmVyYWwgc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgbG9uZyBibngyeF9oaWxvKHUzMiAqaGly ZWYpCit7CisJdTMyIGxvID0gKihoaXJlZiArIDEpOworI2lmIChCSVRTX1BFUl9MT05HID09 IDY0KQorCXUzMiBoaSA9ICpoaXJlZjsKKworCXJldHVybiBISUxPX1U2NChoaSwgbG8pOwor I2Vsc2UKKwlyZXR1cm4gbG87CisjZW5kaWYKK30KKworLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKKyogSW5pdCBzZXJ2aWNlIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K KworLyogRE1BRSBjb21tYW5kIHBvc2l0aW9ucyB1c2VkCisgKiBQb3J0MCBCSUdNQUMgMCwx IEVNQUMgMiwzLDQgTklHIDUgTUNQIDEyCisgKiBQb3J0MSBCSUdNQUMgNiw3IEVNQUMgOCw5 LDEwIE5JRyAxMSBNQ1AgMTMKKyAqLworc3RhdGljIHZvaWQgYm54MnhfaW5pdF9tYWNfc3Rh dHMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZG1hZV9jb21tYW5kICpkbWFlID0g JmJwLT5kbWFlOworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTMyIG1hY19hZGRyID0gKEdS Q0JBU0VfTklHICsKKwkJCShwb3J0ID8gTklHX1JFR0lTVEVSU19JTkdSRVNTX0JNQUMxX01F TSA6CisJCQkJTklHX1JFR0lTVEVSU19JTkdSRVNTX0JNQUMwX01FTSkpOworCisJbWVtc2V0 KGRtYWUsIDAsIHNpemVvZihzdHJ1Y3QgZG1hZV9jb21tYW5kKSk7CisKKwkvKiBCSUdNQUNf UkVHSVNURVJfVFhfU1RBVF9HVFBLVCAtIEJJR01BQ19SRUdJU1RFUl9UWF9TVEFUX0dUQllU ICovCisJZG1hZS0+b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19HUkMgfCBETUFFX0NNRF9EU1Rf UENJIHwKKwkJCURNQUVfQ01EX0NfRFNUX0dSQyB8IERNQUVfQ01EX0NfRU5BQkxFIHwKKwkJ CURNQUVfQ01EX1NSQ19SRVNFVCB8IERNQUVfQ01EX0RTVF9SRVNFVCB8CisjaWZkZWYgX19C SUdfRU5ESUFOCisJCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJ CQlETUFFX0NNRF9FTkRJQU5JVFlfRFdfU1dBUCB8CisjZW5kaWYKKwkJCShwb3J0ID8gRE1B RV9DTURfUE9SVF8xIDogRE1BRV9DTURfUE9SVF8wKSk7CisJZG1hZS0+c3JjX2FkZHJfbG8g PSAobWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVFBLVCkgPj4gMjsKKwlk bWFlLT5zcmNfYWRkcl9oaSA9IDA7CisJZG1hZS0+ZHN0X2FkZHJfbG8gPSBVNjRfTE8oYm54 Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7CisJZG1hZS0+ZHN0X2FkZHJfaGkgPSBV NjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7CisJZG1hZS0+bGVuID0g KDggKyBCSUdNQUNfUkVHSVNURVJfVFhfU1RBVF9HVEJZVCAtCisJCSAgICAgQklHTUFDX1JF R0lTVEVSX1RYX1NUQVRfR1RQS1QpID4+IDI7CisJZG1hZS0+Y29tcF9hZGRyX2xvID0gKEdS Q0JBU0VfRE1BRSArCisJCQkgICAgICAocG9ydCA/IERNQUVfUkVHSVNURVJTX0dPX0M3IDoK KwkJCQkgICAgICBETUFFX1JFR0lTVEVSU19HT19DMSkpID4+IDI7CisJZG1hZS0+Y29tcF92 YWwgPSAxOworCWJueDJ4X3Bvc3RfZG1hZShicCwgcG9ydCA/IDYgOiAwKTsKKworCS8qIEJJ R01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSNjQgLSBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9H UklQSiAqLworCS8qIGNvbW1hbmQgdHlwZSBhbmQgY29tcCB2YWwgdGFrZW4gZnJvbSBmaXJz dCBjb21tYW5kICovCisJZG1hZS0+c3JjX2FkZHJfbG8gPSAobWFjX2FkZHIgKyBCSUdNQUNf UkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOworCWRtYWUtPnNyY19hZGRyX2hpID0gMDsK KwlkbWFlLT5kc3RfYWRkcl9sbyA9ICBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFj X3N0YXRzKSArCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBibWFjX3N0YXRzLCByeF9ncjY0 KSk7CisJZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwg bWFjX3N0YXRzKSArCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGJtYWNfc3RhdHMsIHJ4X2dy NjQpKTsKKwlkbWFlLT5sZW4gPSAoOCArIEJJR01BQ19SRUdJU1RFUl9SWF9TVEFUX0dSSVBK IC0KKwkJICAgICBCSUdNQUNfUkVHSVNURVJfUlhfU1RBVF9HUjY0KSA+PiAyOworCWRtYWUt PmNvbXBfYWRkcl9sbyA9IChHUkNCQVNFX0RNQUUgKworCQkJICAgICAgKHBvcnQgPyBETUFF X1JFR0lTVEVSU19HT19DMTEgOgorCQkJCSAgICAgIERNQUVfUkVHSVNURVJTX0dPX0M1KSkg Pj4gMjsKKwlibngyeF9wb3N0X2RtYWUoYnAsIHBvcnQgPyA3IDogMSk7CisKKworCW1hY19h ZGRyID0gKHBvcnQgPyBHUkNCQVNFX0VNQUMxIDogR1JDQkFTRV9FTUFDMCk7CisKKwkvKiBF TUFDX1JFR19FTUFDX1JYX1NUQVRfQUMgKEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQ19DT1VO VCkgKi8KKwlkbWFlLT5zcmNfYWRkcl9sbyA9IChtYWNfYWRkciArIEVNQUNfUkVHX0VNQUNf UlhfU1RBVF9BQykgPj4gMjsKKwlkbWFlLT5zcmNfYWRkcl9oaSA9IDA7CisJZG1hZS0+ZHN0 X2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0YXRzKSk7CisJ ZG1hZS0+ZHN0X2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgbWFjX3N0 YXRzKSk7CisJZG1hZS0+bGVuID0gRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDX0NPVU5UOwor CWRtYWUtPmNvbXBfYWRkcl9sbyA9IChHUkNCQVNFX0RNQUUgKworCQkJICAgICAgKHBvcnQg PyBETUFFX1JFR0lTVEVSU19HT19DOSA6CisJCQkJICAgICAgRE1BRV9SRUdJU1RFUlNfR09f QzMpKSA+PiAyOworCWJueDJ4X3Bvc3RfZG1hZShicCwgcG9ydCA/IDggOiAyKTsKKworCS8q IEVNQUNfUkVHX0VNQUNfUlhfU1RBVF9BQ18yOCAqLworCWRtYWUtPnNyY19hZGRyX2xvID0g KG1hY19hZGRyICsgRU1BQ19SRUdfRU1BQ19SWF9TVEFUX0FDXzI4KSA+PiAyOworCWRtYWUt PnNyY19hZGRyX2hpID0gMDsKKwlkbWFlLT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9z cF9tYXBwaW5nKGJwLCBtYWNfc3RhdHMpICsKKwkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgZW1h Y19zdGF0cywKKwkJCQkJICAgIHJ4X2ZhbHNlY2FycmllcmVycm9ycykpOworCWRtYWUtPmRz dF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKwor CQkJCSAgIG9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLAorCQkJCQkgICAgcnhfZmFsc2Vj YXJyaWVyZXJyb3JzKSk7CisJZG1hZS0+bGVuID0gMTsKKwlkbWFlLT5jb21wX2FkZHJfbG8g PSAoR1JDQkFTRV9ETUFFICsKKwkJCSAgICAgIChwb3J0ID8gRE1BRV9SRUdJU1RFUlNfR09f QzEwIDoKKwkJCQkgICAgICBETUFFX1JFR0lTVEVSU19HT19DNCkpID4+IDI7CisJYm54Mnhf cG9zdF9kbWFlKGJwLCBwb3J0ID8gOSA6IDMpOworCisJLyogRU1BQ19SRUdfRU1BQ19UWF9T VEFUX0FDIChFTUFDX1JFR19FTUFDX1RYX1NUQVRfQUNfQ09VTlQpICovCisJZG1hZS0+c3Jj X2FkZHJfbG8gPSAobWFjX2FkZHIgKyBFTUFDX1JFR19FTUFDX1RYX1NUQVRfQUMpID4+IDI7 CisJZG1hZS0+c3JjX2FkZHJfaGkgPSAwOworCWRtYWUtPmRzdF9hZGRyX2xvID0gVTY0X0xP KGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykgKworCQkJCSAgIG9mZnNldG9mKHN0 cnVjdCBlbWFjX3N0YXRzLAorCQkJCQkgICAgdHhfaWZoY291dG9jdGV0cykpOworCWRtYWUt PmRzdF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19zdGF0cykg KworCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBlbWFjX3N0YXRzLAorCQkJCQkgICAgdHhfaWZo Y291dG9jdGV0cykpOworCWRtYWUtPmxlbiA9IEVNQUNfUkVHX0VNQUNfVFhfU1RBVF9BQ19D T1VOVDsKKwlkbWFlLT5jb21wX2FkZHJfbG8gPSAoR1JDQkFTRV9ETUFFICsKKwkJCSAgICAg IChwb3J0ID8gRE1BRV9SRUdJU1RFUlNfR09fQzExIDoKKwkJCQkgICAgICBETUFFX1JFR0lT VEVSU19HT19DNSkpID4+IDI7CisJYm54MnhfcG9zdF9kbWFlKGJwLCBwb3J0ID8gMTAgOiA0 KTsKKworCS8qIE5JRyAqLworCWRtYWUtPm9wY29kZSA9IChETUFFX0NNRF9TUkNfR1JDIHwg RE1BRV9DTURfRFNUX1BDSSB8CisJCQlETUFFX0NNRF9DX0RTVF9QQ0kgfCBETUFFX0NNRF9D X0VOQUJMRSB8CisJCQlETUFFX0NNRF9TUkNfUkVTRVQgfCBETUFFX0NNRF9EU1RfUkVTRVQg fAorI2lmZGVmIF9fQklHX0VORElBTgorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0JfRFdfU1dB UCB8CisjZWxzZQorCQkJRE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAorI2VuZGlmCisJ CQkocG9ydCA/IERNQUVfQ01EX1BPUlRfMSA6IERNQUVfQ01EX1BPUlRfMCkpOworCWRtYWUt PnNyY19hZGRyX2xvID0gKEdSQ0JBU0VfTklHICsKKwkJCSAgICAgKHBvcnQgPyBOSUdfUkVH SVNURVJTX1NUQVQxX0JSQl9ESVNDQVJEIDoKKwkJCQkgICAgIE5JR19SRUdJU1RFUlNfU1RB VDBfQlJCX0RJU0NBUkQpKSA+PiAyOworCWRtYWUtPnNyY19hZGRyX2hpID0gMDsKKwlkbWFl LT5kc3RfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBuaWcpKTsKKwlk bWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBuaWcpKTsK KwlkbWFlLT5sZW4gPSAoc2l6ZW9mKHN0cnVjdCBuaWdfc3RhdHMpIC0gMipzaXplb2YodTMy KSkgPj4gMjsKKwlkbWFlLT5jb21wX2FkZHJfbG8gPSBVNjRfTE8oYm54Mnhfc3BfbWFwcGlu ZyhicCwgbmlnKSArCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBuaWdfc3RhdHMsIGRvbmUp KTsKKwlkbWFlLT5jb21wX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwg bmlnKSArCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBuaWdfc3RhdHMsIGRvbmUpKTsKKwlk bWFlLT5jb21wX3ZhbCA9IDB4ZmZmZmZmZmY7CisJYm54MnhfcG9zdF9kbWFlKGJwLCBwb3J0 ID8gMTEgOiA1KTsKKworCS8qIE1DUCAqLworCWlmIChicC0+ZndfbWIpIHsKKwkJZG1hZS0+ b3Bjb2RlID0gKERNQUVfQ01EX1NSQ19QQ0kgfCBETUFFX0NNRF9EU1RfR1JDIHwKKwkJCQkv KiBETUFFX0NNRF9DX0RTVF9HUkMgfCBETUFFX0NNRF9DX0VOQUJMRSB8ICovCisJCQkJRE1B RV9DTURfU1JDX1JFU0VUIHwgRE1BRV9DTURfRFNUX1JFU0VUIHwKKyNpZmRlZiBfX0JJR19F TkRJQU4KKwkJCQlETUFFX0NNRF9FTkRJQU5JVFlfQl9EV19TV0FQIHwKKyNlbHNlCisJCQkJ RE1BRV9DTURfRU5ESUFOSVRZX0RXX1NXQVAgfAorI2VuZGlmCisJCQkJKHBvcnQgPyBETUFF X0NNRF9QT1JUXzEgOiBETUFFX0NNRF9QT1JUXzApKTsKKwkJZG1hZS0+c3JjX2FkZHJfbG8g PSBVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgZXRoX3N0YXRzKSArCisJCQkJCSAgIHNp emVvZih1MzIpKTsKKwkJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFw cGluZyhicCwgZXRoX3N0YXRzKSArCisJCQkJCSAgIHNpemVvZih1MzIpKTsKKwkJZG1hZS0+ ZHN0X2FkZHJfbG8gPSBicC0+ZndfbWIgPj4gMjsKKwkJZG1hZS0+ZHN0X2FkZHJfaGkgPSAw OworCQlkbWFlLT5sZW4gPSAob2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2V0aF9zdGF0cywgbWFj X3N0eF9lbmQpIC0KKwkJCSAgICAgc2l6ZW9mKHUzMikpID4+IDI7CisJCWRtYWUtPmNvbXBf YWRkcl9sbyA9IDA7CisJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CisJCWRtYWUtPmNvbXBf dmFsID0gMDsKKwkJYm54MnhfcG9zdF9kbWFlKGJwLCBwb3J0ID8gMTMgOiAxMik7CisJfQor fQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X3N0YXRzKHN0cnVjdCBibngyeCAqYnApCit7 CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKworCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NU QVRFX0RJU0FCTEU7CisKKwlicC0+b2xkX2JyYl9kaXNjYXJkID0gUkVHX1JEKGJwLCBHUkNC QVNFX05JRywKKwkJCQkgICAgIE5JR19SRUdJU1RFUlNfU1RBVDBfQlJCX0RJU0NBUkQgKwor CQkJCSAgICAgcG9ydCoweDM4KTsKKworCW1lbXNldCgmYnAtPm9sZF9ibWFjLCAwLCBzaXpl b2Yoc3RydWN0IGJtYWNfc3RhdHMpKTsKKwltZW1zZXQoJmJwLT5vbGRfdGNsaWVudCwgMCwg c2l6ZW9mKHN0cnVjdCB0c3Rvcm1fcGVyX2NsaWVudF9zdGF0cykpOworCW1lbXNldCgmYnAt Pm5ldF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7CisKKwli bngyeF9pbml0X21hY19zdGF0cyhicCk7CisKKwlSRUdfV1IzMihicCwgQkFSX1hTVFJPUk1f SU5UTUVNLCBYU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBvcnQpLCAxKTsKKwlSRUdfV1Iz MihicCwgQkFSX1hTVFJPUk1fSU5UTUVNLAorCQkgWFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNF VChwb3J0KSArIDQsIDApOworCisJUkVHX1dSMzIoYnAsIEJBUl9UU1RST1JNX0lOVE1FTSwg VFNUT1JNX1NUQVRTX0ZMQUdTX09GRlNFVChwb3J0KSwgMSk7CisJUkVHX1dSMzIoYnAsIEJB Ul9UU1RST1JNX0lOVE1FTSwKKwkJIFRTVE9STV9TVEFUU19GTEFHU19PRkZTRVQocG9ydCkg KyA0LCAwKTsKKworCVJFR19XUjMyKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0sIENTVE9STV9T VEFUU19GTEFHU19PRkZTRVQocG9ydCksIDApOworCVJFR19XUjMyKGJwLCBCQVJfQ1NUUk9S TV9JTlRNRU0sCisJCSBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBvcnQpICsgNCwgMCk7 CisKKwlSRUdfV1IzMihicCwgQkFSX1hTVFJPUk1fSU5UTUVNLAorCQkgWFNUT1JNX0VUSF9T VEFUU19RVUVSWV9BRERSX09GRlNFVChwb3J0KSwKKwkJIFU2NF9MTyhibngyeF9zcF9tYXBw aW5nKGJwLCBmd19zdGF0cykpKTsKKwlSRUdfV1IzMihicCwgQkFSX1hTVFJPUk1fSU5UTUVN LAorCQkgWFNUT1JNX0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChwb3J0KSArIDQsCisJ CSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpKSk7CisKKwlSRUdfV1Iz MihicCwgQkFSX1RTVFJPUk1fSU5UTUVNLAorCQkgVFNUT1JNX0VUSF9TVEFUU19RVUVSWV9B RERSX09GRlNFVChwb3J0KSwKKwkJIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBmd19z dGF0cykpKTsKKwlSRUdfV1IzMihicCwgQkFSX1RTVFJPUk1fSU5UTUVNLAorCQkgVFNUT1JN X0VUSF9TVEFUU19RVUVSWV9BRERSX09GRlNFVChwb3J0KSArIDQsCisJCSBVNjRfSEkoYm54 Mnhfc3BfbWFwcGluZyhicCwgZndfc3RhdHMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4 X3N0b3Bfc3RhdHMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpZiAoYnAtPnN0YXRzX3N0YXRl ICE9IFNUQVRTX1NUQVRFX0RJU0FCTEUpIHsKKwkJYnAtPnN0YXRzX3N0YXRlID0gU1RBVFNf U1RBVEVfU1RPUDsKKwkJRFAoQk5YMlhfTVNHX1NUQVRTLCAic3RhdHNfc3RhdGUgLSBTVE9Q XG4iKTsKKworCQl3aGlsZSAoYnAtPnN0YXRzX3N0YXRlICE9IFNUQVRTX1NUQVRFX0RJU0FC TEUpIHsKKwkJCW1zbGVlcCgxMDApOworCQl9CisJfQorCURQKEJOWDJYX01TR19TVEFUUywg InN0YXRzX3N0YXRlIC0gRElTQUJMRVxuIik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisqIFN0YXRpc3RpY3Mgc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCisKK3N0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9ibWFjX3N0YXRzKHN0cnVjdCBi bngyeCAqYnApCit7CisJc3RydWN0IHJlZ3AgZGlmZjsKKwlzdHJ1Y3QgcmVncCBzdW07CisJ c3RydWN0IGJtYWNfc3RhdHMgKm5ldyA9IGJueDJ4X3NwKGJwLCBtYWNfc3RhdHMuYm1hYyk7 CisJc3RydWN0IGJtYWNfc3RhdHMgKm9sZCA9ICZicC0+b2xkX2JtYWM7CisJc3RydWN0IGJu eDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gYm54Mnhfc3AoYnAsIGV0aF9zdGF0cyk7CisKKwlz dW0uaGkgPSAwOworCXN1bS5sbyA9IDA7CisKKwlVUERBVEVfU1RBVDY0KHR4X2d0Ynl0Lmhp LCB0b3RhbF9ieXRlc190cmFuc21pdHRlZF9oaSwKKwkJICAgICAgdHhfZ3RieXQubG8sIHRv dGFsX2J5dGVzX3RyYW5zbWl0dGVkX2xvKTsKKworCVVQREFURV9TVEFUNjQodHhfZ3RtY2Eu aGksIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICB0 eF9ndG1jYS5sbywgdG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8pOwor CUFERF82NChzdW0uaGksIGRpZmYuaGksIHN1bS5sbywgZGlmZi5sbyk7CisKKwlVUERBVEVf U1RBVDY0KHR4X2d0Z2NhLmhpLCB0b3RhbF9icm9hZGNhc3RfcGFja2V0c190cmFuc21pdHRl ZF9oaSwKKwkJICAgICAgdHhfZ3RnY2EubG8sIHRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3Ry YW5zbWl0dGVkX2xvKTsKKwlBRERfNjQoc3VtLmhpLCBkaWZmLmhpLCBzdW0ubG8sIGRpZmYu bG8pOworCisJVVBEQVRFX1NUQVQ2NCh0eF9ndHBrdC5oaSwgdG90YWxfdW5pY2FzdF9wYWNr ZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkgICAgICB0eF9ndHBrdC5sbywgdG90YWxfdW5pY2Fz dF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvKTsKKwlTVUJfNjQoZXN0YXRzLT50b3RhbF91bmlj YXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksIHN1bS5oaSwKKwkgICAgICAgZXN0YXRzLT50 b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8sIHN1bS5sbyk7CisKKwlVUERB VEVfU1RBVCh0eF9ndHhwZi5sbywgcGF1c2VfeG9mZl9mcmFtZXNfdHJhbnNtaXR0ZWQpOwor CVVQREFURV9TVEFUKHR4X2d0NjQubG8sIGZyYW1lc190cmFuc21pdHRlZF82NF9ieXRlcyk7 CisJVVBEQVRFX1NUQVQodHhfZ3QxMjcubG8sIGZyYW1lc190cmFuc21pdHRlZF82NV8xMjdf Ynl0ZXMpOworCVVQREFURV9TVEFUKHR4X2d0MjU1LmxvLCBmcmFtZXNfdHJhbnNtaXR0ZWRf MTI4XzI1NV9ieXRlcyk7CisJVVBEQVRFX1NUQVQodHhfZ3Q1MTEubG8sIGZyYW1lc190cmFu c21pdHRlZF8yNTZfNTExX2J5dGVzKTsKKwlVUERBVEVfU1RBVCh0eF9ndDEwMjMubG8sIGZy YW1lc190cmFuc21pdHRlZF81MTJfMTAyM19ieXRlcyk7CisJVVBEQVRFX1NUQVQodHhfZ3Qx NTE4LmxvLCBmcmFtZXNfdHJhbnNtaXR0ZWRfMTAyNF8xNTIyX2J5dGVzKTsKKwlVUERBVEVf U1RBVCh0eF9ndDIwNDcubG8sIGZyYW1lc190cmFuc21pdHRlZF8xNTIzXzkwMjJfYnl0ZXMp OworCVVQREFURV9TVEFUKHR4X2d0NDA5NS5sbywgZnJhbWVzX3RyYW5zbWl0dGVkXzE1MjNf OTAyMl9ieXRlcyk7CisJVVBEQVRFX1NUQVQodHhfZ3Q5MjE2LmxvLCBmcmFtZXNfdHJhbnNt aXR0ZWRfMTUyM185MDIyX2J5dGVzKTsKKwlVUERBVEVfU1RBVCh0eF9ndDE2MzgzLmxvLCBm cmFtZXNfdHJhbnNtaXR0ZWRfMTUyM185MDIyX2J5dGVzKTsKKworCisJVVBEQVRFX1NUQVQo cnhfZ3JmY3MubG8sIGNyY19yZWNlaXZlX2Vycm9ycyk7CisJVVBEQVRFX1NUQVQocnhfZ3J1 bmQubG8sIHJ1bnRfcGFja2V0c19yZWNlaXZlZCk7CisJVVBEQVRFX1NUQVQocnhfZ3JvdnIu bG8sIGphYmJlcl9wYWNrZXRzX3JlY2VpdmVkKTsKKwlVUERBVEVfU1RBVChyeF9ncnhwZi5s bywgcGF1c2VfeG9mZl9mcmFtZXNfcmVjZWl2ZWQpOworCVVQREFURV9TVEFUKHJ4X2dyeGNm LmxvLCBjb250cm9sX2ZyYW1lc19yZWNlaXZlZCk7CisJLyogVVBEQVRFX1NUQVQocnhfZ3J4 cGYubG8sIGNvbnRyb2xfZnJhbWVzX3JlY2VpdmVkKTsgKi8KKwlVUERBVEVfU1RBVChyeF9n cmZyZy5sbywgZXJyb3JfcnVudF9wYWNrZXRzX3JlY2VpdmVkKTsKKwlVUERBVEVfU1RBVChy eF9ncmpici5sbywgZXJyb3JfamFiYmVyX3BhY2tldHNfcmVjZWl2ZWQpOworCisJVVBEQVRF X1NUQVQ2NChyeF9ncmVyYi5oaSwgc3RhdF9JZkhDSW5CYWRPY3RldHNfaGksCisJCSAgICAg IHJ4X2dyZXJiLmxvLCBzdGF0X0lmSENJbkJhZE9jdGV0c19sbyk7CisJVVBEQVRFX1NUQVQ2 NCh0eF9ndHVmbC5oaSwgc3RhdF9JZkhDT3V0QmFkT2N0ZXRzX2hpLAorCQkgICAgICB0eF9n dHVmbC5sbywgc3RhdF9JZkhDT3V0QmFkT2N0ZXRzX2xvKTsKKwlVUERBVEVfU1RBVCh0eF9n dGVyci5sbywgc3RhdF9Eb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzKTsKKwkv KiBVUERBVEVfU1RBVChyeF9ncnhwZi5sbywgc3RhdF9Yb2ZmU3RhdGVFbnRlcmVkKTsgKi8K Kwllc3RhdHMtPnN0YXRfWG9mZlN0YXRlRW50ZXJlZCA9IGVzdGF0cy0+cGF1c2VfeG9mZl9m cmFtZXNfcmVjZWl2ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9lbWFjX3N0 YXRzKHN0cnVjdCBibngyeCAqYnApCit7CisJc3RydWN0IGVtYWNfc3RhdHMgKm5ldyA9IGJu eDJ4X3NwKGJwLCBtYWNfc3RhdHMuZW1hYyk7CisJc3RydWN0IGJueDJ4X2V0aF9zdGF0cyAq ZXN0YXRzID0gYm54Mnhfc3AoYnAsIGV0aF9zdGF0cyk7CisKKwlVUERBVEVfRVhURU5EX1NU QVQodHhfaWZoY291dG9jdGV0cywgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGksCisJCQkJ CSAgICAgdG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfbG8pOworCVVQREFURV9FWFRFTkRfU1RB VCh0eF9pZmhjb3V0dWNhc3Rwa3RzLAorCQkJCQl0b3RhbF91bmljYXN0X3BhY2tldHNfdHJh bnNtaXR0ZWRfaGksCisJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9s byk7CisJVVBEQVRFX0VYVEVORF9TVEFUKHR4X2lmaGNvdXRtdWx0aWNhc3Rwa3RzLAorCQkJ CSAgICAgIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpLAorCQkJCSAg ICAgIHRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2xvKTsKKwlVUERBVEVf RVhURU5EX1NUQVQodHhfaWZoY291dGJyb2FkY2FzdHBrdHMsCisJCQkJICAgICAgdG90YWxf YnJvYWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGksCisJCQkJICAgICAgdG90YWxfYnJv YWRjYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfbG8pOworCisJZXN0YXRzLT5wYXVzZV94b25f ZnJhbWVzX3RyYW5zbWl0dGVkICs9IG5ldy0+dHhfb3V0eG9uc2VudDsKKwllc3RhdHMtPnBh dXNlX3hvZmZfZnJhbWVzX3RyYW5zbWl0dGVkICs9IG5ldy0+dHhfb3V0eG9mZnNlbnQ7CisJ ZXN0YXRzLT5zaW5nbGVfY29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyArPQorCQkJCW5ldy0+ dHhfZG90M3N0YXRzc2luZ2xlY29sbGlzaW9uZnJhbWVzOworCWVzdGF0cy0+bXVsdGlwbGVf Y29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyArPQorCQkJCW5ldy0+dHhfZG90M3N0YXRzbXVs dGlwbGVjb2xsaXNpb25mcmFtZXM7CisJZXN0YXRzLT5sYXRlX2NvbGxpc2lvbl9mcmFtZXMg Kz0gbmV3LT50eF9kb3Qzc3RhdHNsYXRlY29sbGlzaW9uczsKKwllc3RhdHMtPmV4Y2Vzc2l2 ZV9jb2xsaXNpb25fZnJhbWVzICs9CisJCQkJbmV3LT50eF9kb3Qzc3RhdHNleGNlc3NpdmVj b2xsaXNpb25zOworCWVzdGF0cy0+ZnJhbWVzX3RyYW5zbWl0dGVkXzY0X2J5dGVzICs9IG5l dy0+dHhfZXRoZXJzdGF0c3BrdHM2NG9jdGV0czsKKwllc3RhdHMtPmZyYW1lc190cmFuc21p dHRlZF82NV8xMjdfYnl0ZXMgKz0KKwkJCQluZXctPnR4X2V0aGVyc3RhdHNwa3RzNjVvY3Rl dHN0bzEyN29jdGV0czsKKwllc3RhdHMtPmZyYW1lc190cmFuc21pdHRlZF8xMjhfMjU1X2J5 dGVzICs9CisJCQkJbmV3LT50eF9ldGhlcnN0YXRzcGt0czEyOG9jdGV0c3RvMjU1b2N0ZXRz OworCWVzdGF0cy0+ZnJhbWVzX3RyYW5zbWl0dGVkXzI1Nl81MTFfYnl0ZXMgKz0KKwkJCQlu ZXctPnR4X2V0aGVyc3RhdHNwa3RzMjU2b2N0ZXRzdG81MTFvY3RldHM7CisJZXN0YXRzLT5m cmFtZXNfdHJhbnNtaXR0ZWRfNTEyXzEwMjNfYnl0ZXMgKz0KKwkJCQluZXctPnR4X2V0aGVy c3RhdHNwa3RzNTEyb2N0ZXRzdG8xMDIzb2N0ZXRzOworCWVzdGF0cy0+ZnJhbWVzX3RyYW5z bWl0dGVkXzEwMjRfMTUyMl9ieXRlcyArPQorCQkJCW5ldy0+dHhfZXRoZXJzdGF0c3BrdHMx MDI0b2N0ZXRzdG8xNTIyb2N0ZXQ7CisJZXN0YXRzLT5mcmFtZXNfdHJhbnNtaXR0ZWRfMTUy M185MDIyX2J5dGVzICs9CisJCQkJbmV3LT50eF9ldGhlcnN0YXRzcGt0c292ZXIxNTIyb2N0 ZXRzOworCisJZXN0YXRzLT5jcmNfcmVjZWl2ZV9lcnJvcnMgKz0gbmV3LT5yeF9kb3Qzc3Rh dHNmY3NlcnJvcnM7CisJZXN0YXRzLT5hbGlnbm1lbnRfZXJyb3JzICs9IG5ldy0+cnhfZG90 M3N0YXRzYWxpZ25tZW50ZXJyb3JzOworCWVzdGF0cy0+ZmFsc2VfY2Fycmllcl9kZXRlY3Rp b25zICs9IG5ldy0+cnhfZmFsc2VjYXJyaWVyZXJyb3JzOworCWVzdGF0cy0+cnVudF9wYWNr ZXRzX3JlY2VpdmVkICs9IG5ldy0+cnhfZXRoZXJzdGF0c3VuZGVyc2l6ZXBrdHM7CisJZXN0 YXRzLT5qYWJiZXJfcGFja2V0c19yZWNlaXZlZCArPSBuZXctPnJ4X2RvdDNzdGF0c2ZyYW1l c3Rvb2xvbmc7CisJZXN0YXRzLT5wYXVzZV94b25fZnJhbWVzX3JlY2VpdmVkICs9IG5ldy0+ cnhfeG9ucGF1c2VmcmFtZXNyZWNlaXZlZDsKKwllc3RhdHMtPnBhdXNlX3hvZmZfZnJhbWVz X3JlY2VpdmVkICs9IG5ldy0+cnhfeG9mZnBhdXNlZnJhbWVzcmVjZWl2ZWQ7CisJZXN0YXRz LT5jb250cm9sX2ZyYW1lc19yZWNlaXZlZCArPSBuZXctPnJ4X21hY2NvbnRyb2xmcmFtZXNy ZWNlaXZlZDsKKwllc3RhdHMtPmVycm9yX3J1bnRfcGFja2V0c19yZWNlaXZlZCArPSBuZXct PnJ4X2V0aGVyc3RhdHNmcmFnbWVudHM7CisJZXN0YXRzLT5lcnJvcl9qYWJiZXJfcGFja2V0 c19yZWNlaXZlZCArPSBuZXctPnJ4X2V0aGVyc3RhdHNqYWJiZXJzOworCisJVVBEQVRFX0VY VEVORF9TVEFUKHJ4X2lmaGNpbmJhZG9jdGV0cywgc3RhdF9JZkhDSW5CYWRPY3RldHNfaGks CisJCQkJCSAgICAgICBzdGF0X0lmSENJbkJhZE9jdGV0c19sbyk7CisJVVBEQVRFX0VYVEVO RF9TVEFUKHR4X2lmaGNvdXRiYWRvY3RldHMsIHN0YXRfSWZIQ091dEJhZE9jdGV0c19oaSwK KwkJCQkJCXN0YXRfSWZIQ091dEJhZE9jdGV0c19sbyk7CisJZXN0YXRzLT5zdGF0X0RvdDNz dGF0c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnMgKz0KKwkJCQluZXctPnR4X2RvdDNzdGF0 c2ludGVybmFsbWFjdHJhbnNtaXRlcnJvcnM7CisJZXN0YXRzLT5zdGF0X0RvdDNTdGF0c0Nh cnJpZXJTZW5zZUVycm9ycyArPQorCQkJCW5ldy0+cnhfZG90M3N0YXRzY2FycmllcnNlbnNl ZXJyb3JzOworCWVzdGF0cy0+c3RhdF9Eb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnMg Kz0KKwkJCQluZXctPnR4X2RvdDNzdGF0c2RlZmVycmVkdHJhbnNtaXNzaW9uczsKKwllc3Rh dHMtPnN0YXRfRmxvd0NvbnRyb2xEb25lICs9IG5ldy0+dHhfZmxvd2NvbnRyb2xkb25lOwor CWVzdGF0cy0+c3RhdF9Yb2ZmU3RhdGVFbnRlcmVkICs9IG5ldy0+cnhfeG9mZnN0YXRlZW50 ZXJlZDsKK30KKworc3RhdGljIGludCBibngyeF91cGRhdGVfc3Rvcm1fc3RhdHMoc3RydWN0 IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3N0YXRzX3F1ZXJ5ICpzdGF0cyA9IGJueDJ4 X3NwKGJwLCBmd19zdGF0cyk7CisJc3RydWN0IHRzdG9ybV9jb21tb25fc3RhdHMgKnRzdGF0 cyA9ICZzdGF0cy0+dHN0b3JtX2NvbW1vbjsKKwlzdHJ1Y3QgdHN0b3JtX3Blcl9jbGllbnRf c3RhdHMgKnRjbGllbnQgPQorCQkJCQkJJnRzdGF0cy0+Y2xpZW50X3N0YXRpc3RpY3NbMF07 CisJc3RydWN0IHRzdG9ybV9wZXJfY2xpZW50X3N0YXRzICpvbGRfdGNsaWVudCA9ICZicC0+ b2xkX3RjbGllbnQ7CisJc3RydWN0IHhzdG9ybV9jb21tb25fc3RhdHMgKnhzdGF0cyA9ICZz dGF0cy0+eHN0b3JtX2NvbW1vbjsKKwlzdHJ1Y3QgbmlnX3N0YXRzICpuc3RhdHMgPSBibngy eF9zcChicCwgbmlnKTsKKwlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSBibngy eF9zcChicCwgZXRoX3N0YXRzKTsKKwl1MzIgZGlmZjsKKworCS8qIGFyZSBETUFFIHN0YXRz IHZhbGlkPyAqLworCWlmIChuc3RhdHMtPmRvbmUgIT0gMHhmZmZmZmZmZikgeworCQlEUChC TlgyWF9NU0dfU1RBVFMsICJzdGF0cyBub3QgdXBkYXRlZCBieSBkbWFlXG4iKTsKKwkJcmV0 dXJuIC0xOworCX0KKworCS8qIGFyZSBzdG9ybSBzdGF0cyB2YWxpZD8gKi8KKwlpZiAodHN0 YXRzLT5kb25lLmhpICE9IDB4ZmZmZmZmZmYpIHsKKwkJRFAoQk5YMlhfTVNHX1NUQVRTLCAi c3RhdHMgbm90IHVwZGF0ZWQgYnkgdHN0b3JtXG4iKTsKKwkJcmV0dXJuIC0yOworCX0KKwlp ZiAoeHN0YXRzLT5kb25lLmhpICE9IDB4ZmZmZmZmZmYpIHsKKwkJRFAoQk5YMlhfTVNHX1NU QVRTLCAic3RhdHMgbm90IHVwZGF0ZWQgYnkgeHN0b3JtXG4iKTsKKwkJcmV0dXJuIC0zOwor CX0KKworCWVzdGF0cy0+dG90YWxfYnl0ZXNfcmVjZWl2ZWRfaGkgPSB0Y2xpZW50LT50b3Rh bF9yY3ZfYnl0ZXMuaGk7CisJZXN0YXRzLT50b3RhbF9ieXRlc19yZWNlaXZlZF9sbyA9IHRj bGllbnQtPnRvdGFsX3Jjdl9ieXRlcy5sbzsKKworCURJRkZfNjQoZXN0YXRzLT52YWxpZF9i eXRlc19yZWNlaXZlZF9oaSwgdGNsaWVudC0+dG90YWxfcmN2X2J5dGVzLmhpLAorCQkJCQkJ IHRjbGllbnQtPnJjdl9lcnJvcl9ieXRlcy5oaSwKKwkJZXN0YXRzLT52YWxpZF9ieXRlc19y ZWNlaXZlZF9sbywgdGNsaWVudC0+dG90YWxfcmN2X2J5dGVzLmxvLAorCQkJCQkJIHRjbGll bnQtPnJjdl9lcnJvcl9ieXRlcy5sbyk7CisKKwlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl91 bmljYXN0X3BrdHMsCisJCQkJCXRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSwK KwkJCQkJdG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvKTsKKwlVUERBVEVfRVhU RU5EX1RTVEFUKHJjdl9tdWx0aWNhc3RfcGt0cywKKwkJCQkJdG90YWxfbXVsdGljYXN0X3Bh Y2tldHNfcmVjZWl2ZWRfaGksCisJCQkJCXRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2Vp dmVkX2xvKTsKKwlVUERBVEVfRVhURU5EX1RTVEFUKHJjdl9icm9hZGNhc3RfcGt0cywKKwkJ CQkJdG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGksCisJCQkJCXRvdGFsX2Jy b2FkY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2xvKTsKKworCWVzdGF0cy0+ZnJhbWVzX3JlY2Vp dmVkXzY0X2J5dGVzID0gdHN0YXRzLT5wa3RzX3RpbGxfNjRCOworCWVzdGF0cy0+ZnJhbWVz X3JlY2VpdmVkXzY1XzEyN19ieXRlcyA9IHRzdGF0cy0+cGt0c182NV90b18xMjdCOworCWVz dGF0cy0+ZnJhbWVzX3JlY2VpdmVkXzEyOF8yNTVfYnl0ZXMgPSB0c3RhdHMtPnBrdHNfMTI4 X3RvXzI1NUI7CisJZXN0YXRzLT5mcmFtZXNfcmVjZWl2ZWRfMjU2XzUxMV9ieXRlcyA9IHRz dGF0cy0+cGt0c18yNTZfdG9fNTExQjsKKwllc3RhdHMtPmZyYW1lc19yZWNlaXZlZF81MTJf MTAyM19ieXRlcyA9IHRzdGF0cy0+cGt0c181MTJfdG9fMTAyM0I7CisJZXN0YXRzLT5mcmFt ZXNfcmVjZWl2ZWRfMTAyNF8xNTIyX2J5dGVzID0gdHN0YXRzLT5wa3RzXzEwMjRfdG9fMTUy MkI7CisJZXN0YXRzLT5mcmFtZXNfcmVjZWl2ZWRfMTUyM185MDIyX2J5dGVzID0gdHN0YXRz LT5wa3RzXzE1MjNfdG9fOTAyMkI7CisKKwllc3RhdHMtPnhfdG90YWxfc2VudF9ieXRlc19o aSA9IHhzdGF0cy0+dG90YWxfc2VudF9ieXRlcy5oaTsKKwllc3RhdHMtPnhfdG90YWxfc2Vu dF9ieXRlc19sbyA9IHhzdGF0cy0+dG90YWxfc2VudF9ieXRlcy5sbzsKKwllc3RhdHMtPnhf dG90YWxfc2VudF9wa3RzID0geHN0YXRzLT50b3RhbF9zZW50X3BrdHM7CisKKwllc3RhdHMt PnRfcmN2X3VuaWNhc3RfYnl0ZXNfaGkgPSB0Y2xpZW50LT5yY3ZfdW5pY2FzdF9ieXRlcy5o aTsKKwllc3RhdHMtPnRfcmN2X3VuaWNhc3RfYnl0ZXNfbG8gPSB0Y2xpZW50LT5yY3ZfdW5p Y2FzdF9ieXRlcy5sbzsKKwllc3RhdHMtPnRfcmN2X2Jyb2FkY2FzdF9ieXRlc19oaSA9IHRj bGllbnQtPnJjdl9icm9hZGNhc3RfYnl0ZXMuaGk7CisJZXN0YXRzLT50X3Jjdl9icm9hZGNh c3RfYnl0ZXNfbG8gPSB0Y2xpZW50LT5yY3ZfYnJvYWRjYXN0X2J5dGVzLmxvOworCWVzdGF0 cy0+dF9yY3ZfbXVsdGljYXN0X2J5dGVzX2hpID0gdGNsaWVudC0+cmN2X211bHRpY2FzdF9i eXRlcy5oaTsKKwllc3RhdHMtPnRfcmN2X211bHRpY2FzdF9ieXRlc19sbyA9IHRjbGllbnQt PnJjdl9tdWx0aWNhc3RfYnl0ZXMubG87CisJZXN0YXRzLT50X3RvdGFsX3Jjdl9wa3QgPSB0 Y2xpZW50LT50b3RhbF9yY3ZfcGt0czsKKworCWVzdGF0cy0+bm9fYnVmZl9kaXNjYXJkID0g dGNsaWVudC0+bm9fYnVmZl9kaXNjYXJkOworCWVzdGF0cy0+ZXJyb3JzX2Rpc2NhcmQgPSB0 Y2xpZW50LT5lcnJvcnNfZGlzY2FyZDsKKwllc3RhdHMtPnR0bDBfZGlzY2FyZCA9IHRjbGll bnQtPnR0bDBfZGlzY2FyZDsKKwllc3RhdHMtPm1hY19maWx0ZXJfZGlzY2FyZCA9IHRzdGF0 cy0+bWFjX2ZpbHRlcl9kaXNjYXJkOworCWVzdGF0cy0+eHhvdmVyZmxvd19kaXNjYXJkID0g dHN0YXRzLT54eG92ZXJmbG93X2Rpc2NhcmQ7CisKKwllc3RhdHMtPmJyYl9kaXNjYXJkICs9 IG5zdGF0cy0+YnJiX2Rpc2NhcmQgLSBicC0+b2xkX2JyYl9kaXNjYXJkOworCWJwLT5vbGRf YnJiX2Rpc2NhcmQgPSBuc3RhdHMtPmJyYl9kaXNjYXJkOworCisJZXN0YXRzLT5icmJfcGFj a2V0ID0gbnN0YXRzLT5icmJfcGFja2V0OworCWVzdGF0cy0+YnJiX3RydW5jYXRlID0gbnN0 YXRzLT5icmJfdHJ1bmNhdGU7CisJZXN0YXRzLT5mbG93X2N0cmxfZGlzY2FyZCA9IG5zdGF0 cy0+Zmxvd19jdHJsX2Rpc2NhcmQ7CisJZXN0YXRzLT5mbG93X2N0cmxfb2N0ZXRzID0gbnN0 YXRzLT5mbG93X2N0cmxfb2N0ZXRzOworCWVzdGF0cy0+Zmxvd19jdHJsX3BhY2tldCA9IG5z dGF0cy0+Zmxvd19jdHJsX3BhY2tldDsKKwllc3RhdHMtPm1uZ19kaXNjYXJkID0gbnN0YXRz LT5tbmdfZGlzY2FyZDsKKwllc3RhdHMtPm1uZ19vY3RldF9pbnAgPSBuc3RhdHMtPm1uZ19v Y3RldF9pbnA7CisJZXN0YXRzLT5tbmdfb2N0ZXRfb3V0ID0gbnN0YXRzLT5tbmdfb2N0ZXRf b3V0OworCWVzdGF0cy0+bW5nX3BhY2tldF9pbnAgPSBuc3RhdHMtPm1uZ19wYWNrZXRfaW5w OworCWVzdGF0cy0+bW5nX3BhY2tldF9vdXQgPSBuc3RhdHMtPm1uZ19wYWNrZXRfb3V0Owor CWVzdGF0cy0+cGJmX29jdGV0cyA9IG5zdGF0cy0+cGJmX29jdGV0czsKKwllc3RhdHMtPnBi Zl9wYWNrZXQgPSBuc3RhdHMtPnBiZl9wYWNrZXQ7CisJZXN0YXRzLT5zYWZjX2lucCA9IG5z dGF0cy0+c2FmY19pbnA7CisKKwl4c3RhdHMtPmRvbmUuaGkgPSAwOworCXRzdGF0cy0+ZG9u ZS5oaSA9IDA7CisJbnN0YXRzLT5kb25lID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBibngyeF91cGRhdGVfbmV0X3N0YXRzKHN0cnVjdCBibngyeCAqYnApCit7CisJ c3RydWN0IGJueDJ4X2V0aF9zdGF0cyAqZXN0YXRzID0gYm54Mnhfc3AoYnAsIGV0aF9zdGF0 cyk7CisKKwlicC0+bmV0X3N0YXRzLnJ4X3BhY2tldHMgPQorCQlibngyeF9oaWxvKCZlc3Rh dHMtPnRvdGFsX3VuaWNhc3RfcGFja2V0c19yZWNlaXZlZF9oaSkgKworCQlibngyeF9oaWxv KCZlc3RhdHMtPnRvdGFsX211bHRpY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSArCisJCWJu eDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfYnJvYWRjYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkp OworCisJYnAtPm5ldF9zdGF0cy50eF9wYWNrZXRzID0KKwkJYm54MnhfaGlsbygmZXN0YXRz LT50b3RhbF91bmljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRfaGkpICsKKwkJYm54MnhfaGls bygmZXN0YXRzLT50b3RhbF9tdWx0aWNhc3RfcGFja2V0c190cmFuc21pdHRlZF9oaSkgKwor CQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX2Jyb2FkY2FzdF9wYWNrZXRzX3RyYW5zbWl0 dGVkX2hpKTsKKworCWJwLT5uZXRfc3RhdHMucnhfYnl0ZXMgPSBibngyeF9oaWxvKCZlc3Rh dHMtPnRvdGFsX2J5dGVzX3JlY2VpdmVkX2hpKTsKKworCWJwLT5uZXRfc3RhdHMudHhfYnl0 ZXMgPQorCQlibngyeF9oaWxvKCZlc3RhdHMtPnRvdGFsX2J5dGVzX3RyYW5zbWl0dGVkX2hp KTsKKworCWJwLT5uZXRfc3RhdHMucnhfZHJvcHBlZCA9IGVzdGF0cy0+bm9fYnVmZl9kaXNj YXJkOworCWJwLT5uZXRfc3RhdHMudHhfZHJvcHBlZCA9IDA7CisKKwlicC0+bmV0X3N0YXRz Lm11bHRpY2FzdCA9CisJCWJueDJ4X2hpbG8oJmVzdGF0cy0+dG90YWxfbXVsdGljYXN0X3Bh Y2tldHNfdHJhbnNtaXR0ZWRfaGkpOworCisJYnAtPm5ldF9zdGF0cy5jb2xsaXNpb25zID0K KwkJZXN0YXRzLT5zaW5nbGVfY29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyArCisJCWVzdGF0 cy0+bXVsdGlwbGVfY29sbGlzaW9uX3RyYW5zbWl0X2ZyYW1lcyArCisJCWVzdGF0cy0+bGF0 ZV9jb2xsaXNpb25fZnJhbWVzICsKKwkJZXN0YXRzLT5leGNlc3NpdmVfY29sbGlzaW9uX2Zy YW1lczsgLypUQkQgY2hlY2sgdGhpcyovCisKKwlicC0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9l cnJvcnMgPSBlc3RhdHMtPnJ1bnRfcGFja2V0c19yZWNlaXZlZCArCisJCQkJCSBlc3RhdHMt PmphYmJlcl9wYWNrZXRzX3JlY2VpdmVkOworCWJwLT5uZXRfc3RhdHMucnhfb3Zlcl9lcnJv cnMgPSBlc3RhdHMtPm5vX2J1ZmZfZGlzY2FyZDsKKwlicC0+bmV0X3N0YXRzLnJ4X2NyY19l cnJvcnMgPSBlc3RhdHMtPmNyY19yZWNlaXZlX2Vycm9yczsKKwlicC0+bmV0X3N0YXRzLnJ4 X2ZyYW1lX2Vycm9ycyA9IGVzdGF0cy0+YWxpZ25tZW50X2Vycm9yczsKKwlicC0+bmV0X3N0 YXRzLnJ4X2ZpZm9fZXJyb3JzID0gZXN0YXRzLT5icmJfZGlzY2FyZCArCisJCQkJICAgICAg IGVzdGF0cy0+ZXJyb3JzX2Rpc2NhcmQ7CisJYnAtPm5ldF9zdGF0cy5yeF9taXNzZWRfZXJy b3JzID0gZXN0YXRzLT54eG92ZXJmbG93X2Rpc2NhcmQ7CisKKwlicC0+bmV0X3N0YXRzLnJ4 X2Vycm9ycyA9IGJwLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycyArCisJCQkJICBicC0+ bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzICsKKwkJCQkgIGJwLT5uZXRfc3RhdHMucnhfY3Jj X2Vycm9ycyArCisJCQkJICBicC0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycyArCisJCQkJ ICBicC0+bmV0X3N0YXRzLnJ4X2ZpZm9fZXJyb3JzOworCisJYnAtPm5ldF9zdGF0cy50eF9h Ym9ydGVkX2Vycm9ycyA9IGVzdGF0cy0+bGF0ZV9jb2xsaXNpb25fZnJhbWVzICsKKwkJCQkJ ICBlc3RhdHMtPmV4Y2Vzc2l2ZV9jb2xsaXNpb25fZnJhbWVzOworCWJwLT5uZXRfc3RhdHMu dHhfY2Fycmllcl9lcnJvcnMgPSBlc3RhdHMtPmZhbHNlX2NhcnJpZXJfZGV0ZWN0aW9uczsK KwlicC0+bmV0X3N0YXRzLnR4X2ZpZm9fZXJyb3JzID0gMDsKKwlicC0+bmV0X3N0YXRzLnR4 X2hlYXJ0YmVhdF9lcnJvcnMgPSAwOworCWJwLT5uZXRfc3RhdHMudHhfd2luZG93X2Vycm9y cyA9IDA7CisKKwlicC0+bmV0X3N0YXRzLnR4X2Vycm9ycyA9IGJwLT5uZXRfc3RhdHMudHhf YWJvcnRlZF9lcnJvcnMgKworCQkJCSAgYnAtPm5ldF9zdGF0cy50eF9jYXJyaWVyX2Vycm9y czsKKworCWVzdGF0cy0+bWFjX3N0eF9zdGFydCA9ICsrZXN0YXRzLT5tYWNfc3R4X2VuZDsK K30KKworc3RhdGljIHZvaWQgYm54MnhfdXBkYXRlX3N0YXRzKHN0cnVjdCBibngyeCAqYnAp Cit7CisJaWYgKCFibngyeF91cGRhdGVfc3Rvcm1fc3RhdHMoYnApKSB7CisKKwkJaWYgKGJw LT5waHlfZmxhZ3MgJiBQSFlfQk1BQ19GTEFHKSB7CisJCQlibngyeF91cGRhdGVfYm1hY19z dGF0cyhicCk7CisKKwkJfSBlbHNlIGlmIChicC0+cGh5X2ZsYWdzICYgUEhZX0VNQUNfRkxB RykgeworCQkJYm54MnhfdXBkYXRlX2VtYWNfc3RhdHMoYnApOworCisJCX0gZWxzZSB7IC8q IHVucmVhY2hlZCAqLworCQkJQk5YMlhfRVJSKCJubyBNQUMgYWN0aXZlXG4iKTsKKwkJCXJl dHVybjsKKwkJfQorCisJCWJueDJ4X3VwZGF0ZV9uZXRfc3RhdHMoYnApOworCX0KKworCWlm IChicC0+bXNnbGV2ZWwgJiBORVRJRl9NU0dfVElNRVIpIHsKKwkJcHJpbnRrKEtFUk5fREVC VUcgIiVzOlxuIgorCQkgICAgICAgS0VSTl9ERUJVRyAiICB0eCBhdmFpbCAoJTR4KSAgdHgg aGMgaWR4ICgleCkiCisJCQkJICAiICB0eCBwa3QgKCVseClcbiIKKwkJICAgICAgIEtFUk5f REVCVUcgIiAgcnggdXNhZ2UgKCU0eCkgIHJ4IGhjIGlkeCAoJXgpIgorCQkJCSAgIiAgcngg cGt0ICglbHgpXG4iCisJCSAgICAgICBLRVJOX0RFQlVHICIgICVzIChYb2ZmIGV2ZW50cyAl dSkgIGJyYiBkcm9wcyAldVxuIgorCQkgICAgICAgS0VSTl9ERUJVRyAiICB0c3RhdHM6IG5v X2J1ZmZfZGlzY2FyZCAldSIKKwkJCQkgICIgIGVycm9yc19kaXNjYXJkICV1ICBtYWNfZmls dGVyX2Rpc2NhcmQgJXUiCisJCQkJICAiICB4eG92cmZsb3dfZGlzY2FyZCAldSAgdHRsMF9k aXNjYXJkICV1XG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFtZSwgYm54MnhfdHhfYXZhaWwo YnAtPmZwKSwKKwkJICAgICAgICpicC0+ZnAtPnR4X2NvbnNfc2IsIGJwLT5uZXRfc3RhdHMu dHhfcGFja2V0cywKKwkJICAgICAgICh1MTYpKCpicC0+ZnAtPnJ4X2NvbnNfc2IgLSBicC0+ ZnAtPnJ4X2NvbXBfY29ucyksCisJCSAgICAgICAqYnAtPmZwLT5yeF9jb25zX3NiLCBicC0+ bmV0X3N0YXRzLnJ4X3BhY2tldHMsCisJCSAgICAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKGJw LT5kZXYpPyAiWG9mZiIgOiAiWG9uIiwKKwkJICAgICAgIGJwLT5zbG93cGF0aC0+ZXRoX3N0 YXRzLmRyaXZlcl94b2ZmLAorCQkgICAgICAgYnAtPnNsb3dwYXRoLT5ldGhfc3RhdHMuYnJi X2Rpc2NhcmQsCisJCSAgICAgICBicC0+c2xvd3BhdGgtPmV0aF9zdGF0cy5ub19idWZmX2Rp c2NhcmQsCisJCSAgICAgICBicC0+c2xvd3BhdGgtPmV0aF9zdGF0cy5lcnJvcnNfZGlzY2Fy ZCwKKwkJICAgICAgIGJwLT5zbG93cGF0aC0+ZXRoX3N0YXRzLm1hY19maWx0ZXJfZGlzY2Fy ZCwKKwkJICAgICAgIGJwLT5zbG93cGF0aC0+ZXRoX3N0YXRzLnh4b3ZlcmZsb3dfZGlzY2Fy ZCwKKwkJICAgICAgIGJwLT5zbG93cGF0aC0+ZXRoX3N0YXRzLnR0bDBfZGlzY2FyZCk7CisJ fQorCisJaWYgKGJwLT5zdGF0ZSAhPSBCTlgyWF9TVEFURV9PUEVOKSB7CisJCURQKEJOWDJY X01TR19TVEFUUywgInN0YXRlIGlzICV4LCByZXR1cm5pbmdcbiIsIGJwLT5zdGF0ZSk7CisJ CXJldHVybjsKKwl9CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlr ZWx5KGJwLT5wYW5pYykpIHsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJaWYgKGJwLT5m d19tYikgeworCQlSRUdfV1IzMihicCwgR1JDQkFTRV9ETUFFLAorCQkJIChicC0+cG9ydCA/ IERNQUVfUkVHSVNURVJTX0dPX0MxMyA6CisJCQkJICAgICBETUFFX1JFR0lTVEVSU19HT19D MTIpLCAxKTsKKwl9CisKKwlpZiAoYnAtPnN0YXRzX3N0YXRlICE9IFNUQVRTX1NUQVRFX0VO QUJMRSkgeworCQlicC0+c3RhdHNfc3RhdGUgPSBTVEFUU19TVEFURV9ESVNBQkxFOworCQly ZXR1cm47CisJfQorCisJaWYgKGJwLT5waHlfZmxhZ3MgJiBQSFlfQk1BQ19GTEFHKSB7CisJ CVJFR19XUjMyKGJwLCBHUkNCQVNFX0RNQUUsCisJCQkgKGJwLT5wb3J0ID8gRE1BRV9SRUdJ U1RFUlNfR09fQzYgOgorCQkJCSAgICAgRE1BRV9SRUdJU1RFUlNfR09fQzApLCAxKTsKKwor CX0gZWxzZSBpZiAoYnAtPnBoeV9mbGFncyAmIFBIWV9FTUFDX0ZMQUcpIHsKKwkJUkVHX1dS MzIoYnAsIEdSQ0JBU0VfRE1BRSwKKwkJCSAoYnAtPnBvcnQgPyBETUFFX1JFR0lTVEVSU19H T19DOCA6CisJCQkJICAgICBETUFFX1JFR0lTVEVSU19HT19DMiksIDEpOworCX0KKworCWlm IChibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0VUSF9TVEFUX1FVRVJZLCAwLCAw LCAwLCAwKSA9PSAwKSB7CisJCS8qIHN0YXRzIHJhbXJvZCBoYXMgaXQncyBvd24gc2xvdCBv biB0aGUgc3BlICovCisJCWJwLT5zcHFfbGVmdCsrOworCQlicC0+c3RhdF9wZW5kaW5nID0g MTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0 YSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gKHN0cnVjdCBibngyeCAqKSBkYXRhOworCisJ aWYgKCFuZXRpZl9ydW5uaW5nKGJwLT5kZXYpKQorCQlyZXR1cm47CisKKwlpZiAoYXRvbWlj X3JlYWQoJmJwLT5pbnRyX3NlbSkgIT0gMCkKKwkJZ290byBibngyeF9yZXN0YXJ0X3RpbWVy OworCisJaWYgKHBvbGwpIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ ZnBbMF07CisJCWludCByYzsKKworCQlibngyeF90eF9pbnQoZnAsIDEwMDApOworCQlyYyA9 IGJueDJ4X3J4X2ludChmcCwgMTAwMCk7CisJfQorCisJaWYgKCFub21jcCAmJiAoYnAtPmJj X3ZlciA+PSAweDA0MDAwMykpIHsKKwkJaW50IHBvcnQgPSBicC0+cG9ydDsKKwkJdTMyIGRy dl9wdWxzZTsKKwkJdTMyIG1jcF9wdWxzZTsKKworCQkrK2JwLT5md19kcnZfcHVsc2Vfd3Jf c2VxOworCQlicC0+ZndfZHJ2X3B1bHNlX3dyX3NlcSAmPSBEUlZfUFVMU0VfU0VRX01BU0s7 CisJCS8qIFRCRCAtIGFkZCBTWVNURU1fVElNRSAqLworCQlkcnZfcHVsc2UgPSBicC0+Zndf ZHJ2X3B1bHNlX3dyX3NlcTsKKwkJU0hNRU1fV1IoYnAsIGRydl9md19tYltwb3J0XS5kcnZf cHVsc2VfbWIsIGRydl9wdWxzZSk7CisKKwkJbWNwX3B1bHNlID0gKFNITUVNX1JEKGJwLCBk cnZfZndfbWJbcG9ydF0ubWNwX3B1bHNlX21iKSAmCisJCQkgICAgIE1DUF9QVUxTRV9TRVFf TUFTSyk7CisJCS8qIFRoZSBkZWx0YSBiZXR3ZWVuIGRyaXZlciBwdWxzZSBhbmQgbWNwIHJl c3BvbnNlCisJCSAqIHNob3VsZCBiZSAxIChiZWZvcmUgbWNwIHJlc3BvbnNlKSBvciAwIChh ZnRlciBtY3AgcmVzcG9uc2UpCisJCSAqLworCQlpZiAoKGRydl9wdWxzZSAhPSBtY3BfcHVs c2UpICYmCisJCSAgICAoZHJ2X3B1bHNlICE9ICgobWNwX3B1bHNlICsgMSkgJiBNQ1BfUFVM U0VfU0VRX01BU0spKSkgeworCQkJQk5YMlhfRVJSKCJkcnZfcHVsc2UgKDB4JXgpICE9IG1j cF9wdWxzZSAoMHgleClcbiIsCisJCQkJICBkcnZfcHVsc2UsIG1jcF9wdWxzZSk7CisJCX0K Kwl9CisKKwlpZiAoYnAtPnN0YXRzX3N0YXRlID09IFNUQVRTX1NUQVRFX0RJU0FCTEUpCisJ CWdvdG8gYm54MnhfcmVzdGFydF90aW1lcjsKKworCWJueDJ4X3VwZGF0ZV9zdGF0cyhicCk7 CisKK2JueDJ4X3Jlc3RhcnRfdGltZXI6CisJbW9kX3RpbWVyKCZicC0+dGltZXIsIGppZmZp ZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbCk7Cit9CisKKy8qIGVuZCBvZiBTdGF0aXN0aWNz ICovCisKKy8qIG5pYyBpbml0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG5p YyBpbml0IHNlcnZpY2UgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitz dGF0aWMgdm9pZCBibngyeF9pbml0X3NiKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBob3N0 X3N0YXR1c19ibG9jayAqc2IsCisJCQkgIGRtYV9hZGRyX3QgbWFwcGluZywgaW50IGlkKQor eworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJdTY0IHNlY3Rpb247CisJaW50IGluZGV4Owor CisJLyogVVNUT1JNICovCisJc2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yo c3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrLAorCQkJCQkgICAgdV9zdGF0dXNfYmxvY2spOwor CXNiLT51X3N0YXR1c19ibG9jay5zdGF0dXNfYmxvY2tfaWQgPSBpZDsKKworCVJFR19XUjMy KGJwLCBCQVJfVVNUUk9STV9JTlRNRU0sCisJCSBVU1RPUk1fU0JfSE9TVF9TQl9BRERSX09G RlNFVChwb3J0LCBpZCksIFU2NF9MTyhzZWN0aW9uKSk7CisJUkVHX1dSMzIoYnAsIEJBUl9V U1RST1JNX0lOVE1FTSwKKwkJICgoVVNUT1JNX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQocG9y dCwgaWQpKSArIDQpLAorCQkgVTY0X0hJKHNlY3Rpb24pKTsKKworCWZvciAoaW5kZXggPSAw OyBpbmRleCA8IEhDX1VTVE9STV9TQl9OVU1fSU5ESUNFUzsgaW5kZXgrKykgeworCQlSRUdf V1IxNihicCwgQkFSX1VTVFJPUk1fSU5UTUVNLAorCQkJIFVTVE9STV9TQl9IQ19ESVNBQkxF X09GRlNFVChwb3J0LCBpZCwgaW5kZXgpLCAweDEpOworCX0KKworCS8qIENTVE9STSAqLwor CXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X3N0YXR1 c19ibG9jaywKKwkJCQkJICAgIGNfc3RhdHVzX2Jsb2NrKTsKKwlzYi0+Y19zdGF0dXNfYmxv Y2suc3RhdHVzX2Jsb2NrX2lkID0gaWQ7CisKKwlSRUdfV1IzMihicCwgQkFSX0NTVFJPUk1f SU5UTUVNLAorCQkgQ1NUT1JNX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQocG9ydCwgaWQpLCBV NjRfTE8oc2VjdGlvbikpOworCVJFR19XUjMyKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0sCisJ CSAoKENTVE9STV9TQl9IT1NUX1NCX0FERFJfT0ZGU0VUKHBvcnQsIGlkKSkgKyA0KSwKKwkJ IFU2NF9ISShzZWN0aW9uKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBIQ19DU1RP Uk1fU0JfTlVNX0lORElDRVM7IGluZGV4KyspIHsKKwkJUkVHX1dSMTYoYnAsIEJBUl9DU1RS T1JNX0lOVE1FTSwKKwkJCSBDU1RPUk1fU0JfSENfRElTQUJMRV9PRkZTRVQocG9ydCwgaWQs IGluZGV4KSwgMHgxKTsKKwl9CisKKwlibngyeF9hY2tfc2IoYnAsIGlkLCBDU1RPUk1fSUQs IDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfaW5pdF9k ZWZfc2Ioc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgICAgIHN0cnVjdCBob3N0X2RlZl9zdGF0 dXNfYmxvY2sgKmRlZl9zYiwKKwkJCSAgICAgIGRtYV9hZGRyX3QgbWFwcGluZywgaW50IGlk KQoreworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisJaW50IGluZGV4LCB2YWwsIHJlZ19vZmZz ZXQ7CisJdTY0IHNlY3Rpb247CisKKwkvKiBBVFROICovCisJc2VjdGlvbiA9ICgodTY0KW1h cHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3RfZGVmX3N0YXR1c19ibG9jaywKKwkJCQkJ ICAgIGF0dGVuX3N0YXR1c19ibG9jayk7CisJZGVmX3NiLT5hdHRlbl9zdGF0dXNfYmxvY2su c3RhdHVzX2Jsb2NrX2lkID0gaWQ7CisKKwlyZWdfb2Zmc2V0ID0gKHBvcnQgPyBNSVNDX1JF R0lTVEVSU19BRVVfRU5BQkxFMV9GVU5DXzFfT1VUXzAgOgorCQkJICAgICBNSVNDX1JFR0lT VEVSU19BRVVfRU5BQkxFMV9GVU5DXzBfT1VUXzApOworCisJZm9yIChpbmRleCA9IDA7IGlu ZGV4IDwgMzsgaW5kZXgrKykgeworCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzBdID0K KwkJCVJFR19SRChicCwgR1JDQkFTRV9NSVNDX0FFVSwgcmVnX29mZnNldCArIDB4MTAqaW5k ZXgpOworCQlicC0+YXR0bl9ncm91cFtpbmRleF0uc2lnWzFdID0KKwkJCVJFR19SRChicCwg R1JDQkFTRV9NSVNDX0FFVSwKKwkJCSAgICAgICByZWdfb2Zmc2V0ICsgMHg0ICsgMHgxMCpp bmRleCk7CisJCWJwLT5hdHRuX2dyb3VwW2luZGV4XS5zaWdbMl0gPQorCQkJUkVHX1JEKGJw LCBHUkNCQVNFX01JU0NfQUVVLAorCQkJICAgICAgIHJlZ19vZmZzZXQgKyAweDggKyAweDEw KmluZGV4KTsKKwkJYnAtPmF0dG5fZ3JvdXBbaW5kZXhdLnNpZ1szXSA9CisJCQlSRUdfUkQo YnAsIEdSQ0JBU0VfTUlTQ19BRVUsCisJCQkgICAgICAgcmVnX29mZnNldCArIDB4YyArIDB4 MTAqaW5kZXgpOworCX0KKworCWJwLT5hZXVfbWFzayA9IFJFR19SRChicCwgR1JDQkFTRV9N SVNDX0FFVSwKKwkJCSAgICAgIChwb3J0ID8gTUlTQ19SRUdJU1RFUlNfQUVVX01BU0tfQVRU Tl9GVU5DXzEgOgorCQkJCSAgICAgIE1JU0NfUkVHSVNURVJTX0FFVV9NQVNLX0FUVE5fRlVO Q18wKSk7CisKKwlyZWdfb2Zmc2V0ID0gKHBvcnQgPyBIQ19SRUdJU1RFUlNfQVRUTl9NU0cx X0FERFJfTCA6CisJCQkgICAgIEhDX1JFR0lTVEVSU19BVFROX01TRzBfQUREUl9MKTsKKwor CVJFR19XUihicCwgR1JDQkFTRV9IQywgcmVnX29mZnNldCwgVTY0X0xPKHNlY3Rpb24pKTsK KwlSRUdfV1IoYnAsIEdSQ0JBU0VfSEMsIHJlZ19vZmZzZXQgKyA0LCBVNjRfSEkoc2VjdGlv bikpOworCisJcmVnX29mZnNldCA9IChwb3J0ID8gSENfUkVHSVNURVJTX0FUVE5fTlVNX1Ax IDoKKwkJCSAgICAgSENfUkVHSVNURVJTX0FUVE5fTlVNX1AwKTsKKworCXZhbCA9IFJFR19S RChicCwgR1JDQkFTRV9IQywgcmVnX29mZnNldCk7CisJdmFsIHw9IGlkOworCVJFR19XUihi cCwgR1JDQkFTRV9IQywgcmVnX29mZnNldCwgdmFsKTsKKworCS8qIFVTVE9STSAqLworCXNl Y3Rpb24gPSAoKHU2NCltYXBwaW5nKSArIG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0 dXNfYmxvY2ssCisJCQkJCSAgICB1X2RlZl9zdGF0dXNfYmxvY2spOworCWRlZl9zYi0+dV9k ZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19ibG9ja19pZCA9IGlkOworCisJUkVHX1dSMzIoYnAs IEJBUl9VU1RST1JNX0lOVE1FTSwKKwkJIFVTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09G RlNFVChwb3J0KSwgVTY0X0xPKHNlY3Rpb24pKTsKKwlSRUdfV1IzMihicCwgQkFSX1VTVFJP Uk1fSU5UTUVNLAorCQkgKChVU1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQocG9y dCkpICsgNCksCisJCSBVNjRfSEkoc2VjdGlvbikpOworCVJFR19XUjMyKGJwLCBCQVJfVVNU Uk9STV9JTlRNRU0sCisJCSBVU1RPUk1fSENfQlRSX09GRlNFVChwb3J0KSwgQk5YMlhfQlRS KTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEhDX1VTVE9STV9ERUZfU0JfTlVNX0lO RElDRVM7IGluZGV4KyspIHsKKwkJUkVHX1dSMTYoYnAsIEJBUl9VU1RST1JNX0lOVE1FTSwK KwkJCSBVU1RPUk1fREVGX1NCX0hDX0RJU0FCTEVfT0ZGU0VUKHBvcnQsIGluZGV4KSwgMHgx KTsKKwl9CisKKwkvKiBDU1RPUk0gKi8KKwlzZWN0aW9uID0gKCh1NjQpbWFwcGluZykgKyBv ZmZzZXRvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrLAorCQkJCQkgICAgY19kZWZf c3RhdHVzX2Jsb2NrKTsKKwlkZWZfc2ItPmNfZGVmX3N0YXR1c19ibG9jay5zdGF0dXNfYmxv Y2tfaWQgPSBpZDsKKworCVJFR19XUjMyKGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0sCisJCSBD U1RPUk1fREVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQocG9ydCksIFU2NF9MTyhzZWN0aW9u KSk7CisJUkVHX1dSMzIoYnAsIEJBUl9DU1RST1JNX0lOVE1FTSwKKwkJICgoQ1NUT1JNX0RF Rl9TQl9IT1NUX1NCX0FERFJfT0ZGU0VUKHBvcnQpKSArIDQpLAorCQkgVTY0X0hJKHNlY3Rp b24pKTsKKwlSRUdfV1IzMihicCwgQkFSX0NTVFJPUk1fSU5UTUVNLAorCQkgQ1NUT1JNX0hD X0JUUl9PRkZTRVQocG9ydCksIEJOWDJYX0JUUik7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5k ZXggPCBIQ19DU1RPUk1fREVGX1NCX05VTV9JTkRJQ0VTOyBpbmRleCsrKSB7CisJCVJFR19X UjE2KGJwLCBCQVJfQ1NUUk9STV9JTlRNRU0sCisJCQkgQ1NUT1JNX0RFRl9TQl9IQ19ESVNB QkxFX09GRlNFVChwb3J0LCBpbmRleCksIDB4MSk7CisJfQorCisJLyogVFNUT1JNICovCisJ c2VjdGlvbiA9ICgodTY0KW1hcHBpbmcpICsgb2Zmc2V0b2Yoc3RydWN0IGhvc3RfZGVmX3N0 YXR1c19ibG9jaywKKwkJCQkJICAgIHRfZGVmX3N0YXR1c19ibG9jayk7CisJZGVmX3NiLT50 X2RlZl9zdGF0dXNfYmxvY2suc3RhdHVzX2Jsb2NrX2lkID0gaWQ7CisKKwlSRUdfV1IzMihi cCwgQkFSX1RTVFJPUk1fSU5UTUVNLAorCQkgVFNUT1JNX0RFRl9TQl9IT1NUX1NCX0FERFJf T0ZGU0VUKHBvcnQpLCBVNjRfTE8oc2VjdGlvbikpOworCVJFR19XUjMyKGJwLCBCQVJfVFNU Uk9STV9JTlRNRU0sCisJCSAoKFRTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09GRlNFVChw b3J0KSkgKyA0KSwKKwkJIFU2NF9ISShzZWN0aW9uKSk7CisJUkVHX1dSMzIoYnAsIEJBUl9U U1RST1JNX0lOVE1FTSwKKwkJIFRTVE9STV9IQ19CVFJfT0ZGU0VUKHBvcnQpLCBCTlgyWF9C VFIpOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSENfVFNUT1JNX0RFRl9TQl9OVU1f SU5ESUNFUzsgaW5kZXgrKykgeworCQlSRUdfV1IxNihicCwgQkFSX1RTVFJPUk1fSU5UTUVN LAorCQkJIFRTVE9STV9ERUZfU0JfSENfRElTQUJMRV9PRkZTRVQocG9ydCwgaW5kZXgpLCAw eDEpOworCX0KKworCS8qIFhTVE9STSAqLworCXNlY3Rpb24gPSAoKHU2NCltYXBwaW5nKSAr IG9mZnNldG9mKHN0cnVjdCBob3N0X2RlZl9zdGF0dXNfYmxvY2ssCisJCQkJCSAgICB4X2Rl Zl9zdGF0dXNfYmxvY2spOworCWRlZl9zYi0+eF9kZWZfc3RhdHVzX2Jsb2NrLnN0YXR1c19i bG9ja19pZCA9IGlkOworCisJUkVHX1dSMzIoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSwKKwkJ IFhTVE9STV9ERUZfU0JfSE9TVF9TQl9BRERSX09GRlNFVChwb3J0KSwgVTY0X0xPKHNlY3Rp b24pKTsKKwlSRUdfV1IzMihicCwgQkFSX1hTVFJPUk1fSU5UTUVNLAorCQkgKChYU1RPUk1f REVGX1NCX0hPU1RfU0JfQUREUl9PRkZTRVQocG9ydCkpICsgNCksCisJCSBVNjRfSEkoc2Vj dGlvbikpOworCVJFR19XUjMyKGJwLCBCQVJfWFNUUk9STV9JTlRNRU0sCisJCSBYU1RPUk1f SENfQlRSX09GRlNFVChwb3J0KSwgQk5YMlhfQlRSKTsKKworCWZvciAoaW5kZXggPSAwOyBp bmRleCA8IEhDX1hTVE9STV9ERUZfU0JfTlVNX0lORElDRVM7IGluZGV4KyspIHsKKwkJUkVH X1dSMTYoYnAsIEJBUl9YU1RST1JNX0lOVE1FTSwKKwkJCSBYU1RPUk1fREVGX1NCX0hDX0RJ U0FCTEVfT0ZGU0VUKHBvcnQsIGluZGV4KSwgMHgxKTsKKwl9CisKKwlibngyeF9hY2tfc2Io YnAsIGlkLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKK30KKworc3RhdGlj IHZvaWQgYm54MnhfdXBkYXRlX2NvYWxlc2NlKHN0cnVjdCBibngyeCAqYnApCit7CisJaW50 IHBvcnQgPSBicC0+cG9ydDsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7 CisJCS8qIFRCRCBpbmRleCBuZWVkIHRvIGJlIGNoYW5nZWQgb24gQkUgbWFjaGluZXMhICov CisKKwkJLyogSENfSU5ERVhfVV9FVEhfUlhfQ1FfQ09OUyAqLworCQlSRUdfV1I4KGJwLCBC QVJfVVNUUk9STV9JTlRNRU0sCisJCQlVU1RPUk1fU0JfSENfVElNRU9VVF9PRkZTRVQocG9y dCwgaSwKKwkJCQkJCSAgIEhDX0lOREVYX1VfRVRIX1JYX0NRX0NPTlMpLAorCQkJYnAtPnJ4 X3RpY2tzX2ludC8xMik7CisJCVJFR19XUjE2KGJwLCBCQVJfVVNUUk9STV9JTlRNRU0sCisJ CQkgVVNUT1JNX1NCX0hDX0RJU0FCTEVfT0ZGU0VUKHBvcnQsIGksCisJCQkJCQkgICBIQ19J TkRFWF9VX0VUSF9SWF9DUV9DT05TKSwKKwkJCSBicC0+cnhfdGlja3NfaW50ID8gMCA6IDEp OworCisJCS8qIEhDX0lOREVYX0NfRVRIX1RYX0NRX0NPTlMgKi8KKwkJUkVHX1dSOChicCwg QkFSX0NTVFJPUk1fSU5UTUVNLAorCQkJQ1NUT1JNX1NCX0hDX1RJTUVPVVRfT0ZGU0VUKHBv cnQsIGksCisJCQkJCQkgICBIQ19JTkRFWF9DX0VUSF9UWF9DUV9DT05TKSwKKwkJCWJwLT50 eF90aWNrc19pbnQvMTIpOworCQlSRUdfV1IxNihicCwgQkFSX0NTVFJPUk1fSU5UTUVNLAor CQkJIENTVE9STV9TQl9IQ19ESVNBQkxFX09GRlNFVChwb3J0LCBpLAorCQkJCQkJICAgSENf SU5ERVhfQ19FVEhfVFhfQ1FfQ09OUyksCisJCQkgYnAtPnR4X3RpY2tzX2ludCA/IDAgOiAx KTsKKwl9CisJLyogVEJEIER5bmFtaWMgSEM/ICovCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4 X2luaXRfcnhfcmluZ3Moc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MTYgcmluZ19wcm9kOwor CWludCBpLCBqOworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisKKwkvKiA4IGZvciBDUkMgYW5k IFZMQU4gKi8KKwlicC0+cnhfYnVmX3VzZV9zaXplID0gYnAtPmRldi0+bXR1ICsgRVRIX0hM RU4gKyBicC0+cnhfb2Zmc2V0ICsgODsKKwkvKiA2NCBmb3IgYWxpZ25tZW50IFRCRCBjaGVj ayAqLworCWJwLT5yeF9idWZfc2l6ZSA9IGJwLT5yeF9idWZfdXNlX3NpemUgKyA2NDsKKwor CWZvcl9lYWNoX3F1ZXVlKGJwLCBqKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAg PSAmYnAtPmZwW2pdOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQlmcC0+bGFz dF9hbGxvYyA9IGZwLT5uZXh0X2ZyZWUgPSAwOworI2VuZGlmCisJCWZwLT5yeF9iZF9jb25z ID0gMDsKKwkJZnAtPnJ4X2NvbnNfc2IgPSBCTlgyWF9SWF9TQl9JTkRFWDsKKworCQlmb3Ig KGkgPSAxOyBpIDw9IE5VTV9SWF9SSU5HUzsgaSsrKSB7CisKKwkJCXN0cnVjdCBldGhfcnhf YmQgKm5leHRiZDsKKworCQkJbmV4dGJkID0gJmZwLT5yeF9kZXNjX3JpbmdbUlhfREVTQ19D TlQgKiBpIC0gMV07CisJCQluZXh0YmQtPmFkZHJfaGkgPQorCQkJCVU2NF9ISShmcC0+cnhf ZGVzY19tYXBwaW5nICsKKwkJCQkgICAgICAgQkNNX1BBR0VfU0laRSooaSAlIE5VTV9SWF9S SU5HUykpOworCQkJbmV4dGJkLT5hZGRyX2xvID0KKwkJCQlVNjRfTE8oZnAtPnJ4X2Rlc2Nf bWFwcGluZyArCisJCQkJICAgICAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fUlhfUklOR1Mp KTsKKworCQkJbmV4dGJkID0gKHN0cnVjdCBldGhfcnhfYmQgKikKKwkJCQkgJmZwLT5yeF9j b21wX3JpbmdbUlhfREVTQ19DTlQgKiBpIC0gMV07CisJCQluZXh0YmQtPmFkZHJfaGkgPQor CQkJCVU2NF9ISShmcC0+cnhfY29tcF9tYXBwaW5nICsKKwkJCQkgICAgICAgQkNNX1BBR0Vf U0laRSooaSAlIE5VTV9SWF9SSU5HUykpOworCQkJbmV4dGJkLT5hZGRyX2xvID0KKwkJCQlV NjRfTE8oZnAtPnJ4X2NvbXBfbWFwcGluZyArCisJCQkJICAgICAgIEJDTV9QQUdFX1NJWkUq KGkgJSBOVU1fUlhfUklOR1MpKTsKKwkJfQorCisJCS8qIHJ4IGNvbXBsZXRpb24gcXVldWUg Ki8KKwkJZnAtPnJ4X2NvbXBfY29ucyA9IHJpbmdfcHJvZCA9IDA7CisKKwkJZm9yIChpID0g MDsgaSA8IGJwLT5yeF9yaW5nX3NpemU7IGkrKykgeworCQkJaWYgKGJueDJ4X2FsbG9jX3J4 X3NrYihicCwgZnAsIHJpbmdfcHJvZCkgPCAwKSB7CisJCQkJQk5YMlhfRVJSKCJ3YXMgb25s eSBhYmxlIHRvIGFsbG9jYXRlICIKKwkJCQkJICAiJWQgcnggc2tic1xuIiwgaSk7CisJCQkJ YnJlYWs7CisJCQl9CisJCQlyaW5nX3Byb2QgPSBORVhUX1JYX0lEWChyaW5nX3Byb2QpOwor CQkJQlVHX1RSQVAocmluZ19wcm9kID4gaSk7CisJCX0KKworCQlmcC0+cnhfYmRfcHJvZCA9 IGZwLT5yeF9jb21wX3Byb2QgPSByaW5nX3Byb2Q7CisJCWZwLT5yeF9wa3QgPSBmcC0+cnhf Y2FsbHMgPSAwOworCisJCS8qIFdhcm5pbmchIHRoaXMgd2lsbCBnZW5yYXRlIGFuIGludGVy cnVwdCAodG8gdGhlIFRTVE9STSkgKi8KKwkJLyogbXVzdCBvbmx5IGJlIGRvbmUgd2hlbiBj aGlwIGlzIGluaXRpYWxpemVkICovCisJCVJFR19XUihicCwgQkFSX1RTVFJPUk1fSU5UTUVN LAorCQkgICAgICAgVFNUT1JNX1JDUV9QUk9EX09GRlNFVChwb3J0LCBqKSwgcmluZ19wcm9k KTsKKwkJaWYgKGogIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCVJFR19XUihicCwgQkFSX1VT VFJPUk1fSU5UTUVNLAorCQkgICAgICAgVVNUT1JNX01FTV9XT1JLQVJPVU5EX0FERFJFU1Nf T0ZGU0VULAorCQkgICAgICAgVTY0X0xPKGZwLT5yeF9jb21wX21hcHBpbmcpKTsKKwkJUkVH X1dSKGJwLCBCQVJfVVNUUk9STV9JTlRNRU0sCisJCSAgICAgICBVU1RPUk1fTUVNX1dPUktB Uk9VTkRfQUREUkVTU19PRkZTRVQgKyA0LAorCQkgICAgICAgVTY0X0hJKGZwLT5yeF9jb21w X21hcHBpbmcpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfdHhfcmluZyhz dHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpLCBqOworCisJZm9yX2VhY2hfcXVldWUoYnAs IGopIHsKKwkJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9ICZicC0+ZnBbal07CisKKwkJ Zm9yIChpID0gMTsgaSA8PSBOVU1fVFhfUklOR1M7IGkrKykgeworCQkJc3RydWN0IGV0aF90 eF9iZCAqbmV4dGJkID0KKwkJCQkmZnAtPnR4X2Rlc2NfcmluZ1tUWF9ERVNDX0NOVCAqIGkg LSAxXTsKKworCQkJbmV4dGJkLT5hZGRyX2hpID0KKwkJCQlVNjRfSEkoZnAtPnR4X2Rlc2Nf bWFwcGluZyArCisJCQkJICAgICAgIEJDTV9QQUdFX1NJWkUqKGkgJSBOVU1fVFhfUklOR1Mp KTsKKwkJCW5leHRiZC0+YWRkcl9sbyA9CisJCQkJVTY0X0xPKGZwLT50eF9kZXNjX21hcHBp bmcgKworCQkJCSAgICAgICBCQ01fUEFHRV9TSVpFKihpICUgTlVNX1RYX1JJTkdTKSk7CisJ CX0KKworCQlmcC0+dHhfcGt0X3Byb2QgPSAwOworCQlmcC0+dHhfcGt0X2NvbnMgPSAwOwor CQlmcC0+dHhfYmRfcHJvZCA9IDA7CisJCWZwLT50eF9iZF9jb25zID0gMDsKKwkJZnAtPnR4 X2NvbnNfc2IgPSBCTlgyWF9UWF9TQl9JTkRFWDsKKwkJZnAtPnR4X3BrdCA9IDA7CisJfQor fQorCitzdGF0aWMgdm9pZCBibngyeF9pbml0X3NwX3Jpbmcoc3RydWN0IGJueDJ4ICpicCkK K3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCisJc3Bpbl9sb2NrX2luaXQoJmJwLT5zcHFf bG9jayk7CisKKwlicC0+c3BxX2xlZnQgPSBNQVhfU1BRX1BFTkRJTkc7CisJYnAtPnNwcV9j b25faWR4ID0gMDsKKwlicC0+c3BxX2h3X2NvbiAgPSBCTlgyWF9TUFFfU0JfSU5ERVg7CisJ YnAtPmRzYl9zcF9wcm9kID0gQk5YMlhfU1BfRFNCX0lOREVYOworCWJwLT5zcHFfcHJvZF9i ZCA9IGJwLT5zcHE7CisJYnAtPnNwcV9sYXN0X2JkID0gYnAtPnNwcV9wcm9kX2JkICsgTUFY X1NQX0RFU0NfQ05UOworCWJwLT5zcHFfcHJvZF9pZHggPSAwOworCisJUkVHX1dSMzIoYnAs IEJBUl9YU1RST1JNX0lOVE1FTSwKKwkJIFhTVE9STV9TUFFfUEFHRV9CQVNFX09GRlNFVChw b3J0KSArIDQsCisJCSBVNjRfSEkoYnAtPnNwcV9tYXBwaW5nKSk7CisJUkVHX1dSMzIoYnAs IEJBUl9YU1RST1JNX0lOVE1FTSwgWFNUT1JNX1NQUV9QQUdFX0JBU0VfT0ZGU0VUKHBvcnQp LAorCQkgVTY0X0xPKGJwLT5zcHFfbWFwcGluZykpOworCisJUkVHX1dSKGJwLCBHUkNCQVNF X1hTRU0sIFhTRU1fUkVHSVNURVJTX0ZBU1RfTUVNT1JZICsKKwkgICAgICAgWFNUT1JNX1NQ UV9QUk9EX09GRlNFVChwb3J0KSwgYnAtPnNwcV9wcm9kX2lkeCk7Cit9CisKK3N0YXRpYyB2 b2lkIGJueDJ4X2luaXRfY29udGV4dChzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBpOwor CisJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJc3RydWN0IGV0aF9jb250ZXh0ICpjb250 ZXh0ID0gYm54Mnhfc3AoYnAsIGNvbnRleHRbaV0uZXRoKTsKKwkJc3RydWN0IGJueDJ4X2Zh c3RwYXRoICpmcCA9ICZicC0+ZnBbaV07CisKKwkJY29udGV4dC0+eHN0b3JtX3N0X2NvbnRl eHQudHhfYmRfcGFnZV9iYXNlX2hpID0KKwkJCQkJCVU2NF9ISShmcC0+dHhfZGVzY19tYXBw aW5nKTsKKwkJY29udGV4dC0+eHN0b3JtX3N0X2NvbnRleHQudHhfYmRfcGFnZV9iYXNlX2xv ID0KKwkJCQkJCVU2NF9MTyhmcC0+dHhfZGVzY19tYXBwaW5nKTsKKwkJY29udGV4dC0+eHN0 b3JtX3N0X2NvbnRleHQuZGJfZGF0YV9hZGRyX2hpID0KKwkJCQkJCVU2NF9ISShmcC0+dHhf cHJvZHNfbWFwcGluZyk7CisJCWNvbnRleHQtPnhzdG9ybV9zdF9jb250ZXh0LmRiX2RhdGFf YWRkcl9sbyA9CisJCQkJCQlVNjRfTE8oZnAtPnR4X3Byb2RzX21hcHBpbmcpOworCisJCWNv bnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LnJ4X2JkX3BhZ2VfYmFzZV9oaSA9CisJCQkJCQlV NjRfSEkoZnAtPnJ4X2Rlc2NfbWFwcGluZyk7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250 ZXh0LnJ4X2JkX3BhZ2VfYmFzZV9sbyA9CisJCQkJCQlVNjRfTE8oZnAtPnJ4X2Rlc2NfbWFw cGluZyk7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LnN0YXR1c19ibG9ja19pZCA9 IGk7CisJCWNvbnRleHQtPnVzdG9ybV9zdF9jb250ZXh0LnNiX2luZGV4X251bWJlciA9CisJ CQkJCQlIQ19JTkRFWF9VX0VUSF9SWF9DUV9DT05TOworCQljb250ZXh0LT51c3Rvcm1fc3Rf Y29udGV4dC5yY3FfYmFzZV9hZGRyZXNzX2hpID0KKwkJCQkJCVU2NF9ISShmcC0+cnhfY29t cF9tYXBwaW5nKTsKKwkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQucmNxX2Jhc2VfYWRk cmVzc19sbyA9CisJCQkJCQlVNjRfTE8oZnAtPnJ4X2NvbXBfbWFwcGluZyk7CisJCWNvbnRl eHQtPnVzdG9ybV9zdF9jb250ZXh0LmZsYWdzID0KKwkJCQlVU1RPUk1fRVRIX1NUX0NPTlRF WFRfRU5BQkxFX01DX0FMSUdOTUVOVDsKKwkJY29udGV4dC0+dXN0b3JtX3N0X2NvbnRleHQu bWNfYWxpZ25tZW50X3NpemUgPSA2NDsKKworCQkvKiBUQkQgZ2V0IHRoZSBvcHRpbWFsIHZh bHVlIGZyb20gdGhlIEFSQ0ggKi8KKwkJY29udGV4dC0+Y3N0b3JtX3N0X2NvbnRleHQuc2Jf aW5kZXhfbnVtYmVyID0KKwkJCQkJCUhDX0lOREVYX0NfRVRIX1RYX0NRX0NPTlM7CisJCWNv bnRleHQtPmNzdG9ybV9zdF9jb250ZXh0LnN0YXR1c19ibG9ja19pZCA9IGk7CisKKwkJY29u dGV4dC0+eHN0b3JtX2FnX2NvbnRleHQuY2R1X3Jlc2VydmVkID0KKwkJCUNEVV9SU1JWRF9W QUxVRV9UWVBFX0EoSFdfQ0lEKGJwLCBpKSwKKwkJCQkJICAgICAgIENEVV9SRUdJT05fTlVN QkVSX1hDTV9BRywKKwkJCQkJICAgICAgIEVUSF9DT05ORUNUSU9OX1RZUEUpOworCQljb250 ZXh0LT51c3Rvcm1fYWdfY29udGV4dC5jZHVfdXNhZ2UgPQorCQkJQ0RVX1JTUlZEX1ZBTFVF X1RZUEVfQShIV19DSUQoYnAsIGkpLAorCQkJCQkgICAgICAgQ0RVX1JFR0lPTl9OVU1CRVJf VUNNX0FHLAorCQkJCQkgICAgICAgRVRIX0NPTk5FQ1RJT05fVFlQRSk7CisJfQorfQorCitz dGF0aWMgdm9pZCBibngyeF9zZXRfc3Rvcm1fcnhfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQor eworCWludCBtb2RlID0gYnAtPnJ4X21vZGU7CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKwlz dHJ1Y3QgdHN0b3JtX2V0aF9tYWNfZmlsdGVyX2NvbmZpZyB0c3Rvcm1fbWFjX2ZpbHRlciA9 IHswfTsKKwlpbnQgaTsKKworCURQKE5FVElGX01TR19SWF9TVEFUVVMsICJyeCBtb2RlIGlz ICVkXG4iLCBtb2RlKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQk5YMlhfUlhfTU9E RV9OT05FOiAvKiBubyBSeCAqLworCQl0c3Rvcm1fbWFjX2ZpbHRlci51Y2FzdF9kcm9wX2Fs bCA9IDE7CisJCXRzdG9ybV9tYWNfZmlsdGVyLm1jYXN0X2Ryb3BfYWxsID0gMTsKKwkJdHN0 b3JtX21hY19maWx0ZXIuYmNhc3RfZHJvcF9hbGwgPSAxOworCQlicmVhazsKKwljYXNlIEJO WDJYX1JYX01PREVfTk9STUFMOgorCQl0c3Rvcm1fbWFjX2ZpbHRlci5iY2FzdF9hY2NlcHRf YWxsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBCTlgyWF9SWF9NT0RFX0FMTE1VTFRJOgorCQl0 c3Rvcm1fbWFjX2ZpbHRlci5tY2FzdF9hY2NlcHRfYWxsID0gMTsKKwkJdHN0b3JtX21hY19m aWx0ZXIuYmNhc3RfYWNjZXB0X2FsbCA9IDE7CisJCWJyZWFrOworCWNhc2UgQk5YMlhfUlhf TU9ERV9QUk9NSVNDOgorCQl0c3Rvcm1fbWFjX2ZpbHRlci51Y2FzdF9hY2NlcHRfYWxsID0g MTsKKwkJdHN0b3JtX21hY19maWx0ZXIubWNhc3RfYWNjZXB0X2FsbCA9IDE7CisJCXRzdG9y bV9tYWNfZmlsdGVyLmJjYXN0X2FjY2VwdF9hbGwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0 OgorCQlCTlgyWF9FUlIoImJhZCByeCBtb2RlICglZClcbiIsIG1vZGUpOworCX0KKworCWZv ciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHRzdG9ybV9ldGhfbWFjX2ZpbHRlcl9jb25m aWcpLzQ7IGkrKykgeworCQlSRUdfV1IzMihicCwgQkFSX1RTVFJPUk1fSU5UTUVNLAorCQkJ IFRTVE9STV9NQUNfRklMVEVSX0NPTkZJR19PRkZTRVQocG9ydCkgKyBpICogNCwKKwkJCSAo KHUzMiAqKSZ0c3Rvcm1fbWFjX2ZpbHRlcilbaV0pOworCisvKgkJRFAoTkVUSUZfTVNHX0lG VVAsICJ0c3Rvcm1fbWFjX2ZpbHRlclslZF06IDB4JTA4eFxuIiwgaSwKKwkJICAgKCh1MzIg KikmdHN0b3JtX21hY19maWx0ZXIpW2ldKTsgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJu eDJ4X3NldF9jbGllbnRfY29uZmlnKHN0cnVjdCBibngyeCAqYnAsIGludCBjbGllbnRfaWQp Cit7CisjaWZkZWYgQkNNX1ZMQU4KKwlpbnQgbW9kZSA9IGJwLT5yeF9tb2RlOworI2VuZGlm CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKwlzdHJ1Y3QgdHN0b3JtX2V0aF9jbGllbnRfY29u ZmlnIHRzdG9ybV9jbGllbnQgPSB7MH07CisKKwl0c3Rvcm1fY2xpZW50Lm1heF9idWZmZXJf c2l6ZSA9IGJwLT5yeF9idWZfdXNlX3NpemU7CisJdHN0b3JtX2NsaWVudC5zdGF0aXN0aWNz X2NvdW50ZXJfaWQgPSAwOworCXRzdG9ybV9jbGllbnQuY29uZmlnX2ZsYWdzID0KKwkJCQlU U1RPUk1fRVRIX0NMSUVOVF9DT05GSUdfU1RBVFNJVElDU19FTkFCTEU7CisjaWZkZWYgQkNN X1ZMQU4KKwlpZiAobW9kZSAmJiBicC0+dmxncnApIHsKKwkJdHN0b3JtX2NsaWVudC5jb25m aWdfZmxhZ3MgfD0KKwkJCQlUU1RPUk1fRVRIX0NMSUVOVF9DT05GSUdfVkxBTl9SRU1PVkFM X0VOQUJMRTsKKwkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgInZsYW4gcmVtb3ZhbCBlbmFi bGVkXG4iKTsKKwl9CisjZWxzZQorLyogVEJEIHRzdG9ybV9jbGllbnQuY29uZmlnX2ZsYWdz IHw9ICovCisvKgkJCVRTVE9STV9FVEhfQ0xJRU5UX0NPTkZJR19WTEFOX1JFTU9WQUxfRU5B QkxFOyAqLworI2VuZGlmCisJdHN0b3JtX2NsaWVudC5kcm9wX2ZsYWdzID0gKFRTVE9STV9F VEhfQ0xJRU5UX0NPTkZJR19EUk9QX0lQX0NTX0VSUiB8CisJCQkJICAgIFRTVE9STV9FVEhf Q0xJRU5UX0NPTkZJR19EUk9QX1RDUF9DU19FUlIgfAorCQkJCSAgICBUU1RPUk1fRVRIX0NM SUVOVF9DT05GSUdfRFJPUF9VRFBfQ1NfRVJSIHwKKwkJCQkgICAgVFNUT1JNX0VUSF9DTElF TlRfQ09ORklHX0RST1BfTUFDX0VSUik7CisKKwlSRUdfV1IzMihicCwgQkFSX1RTVFJPUk1f SU5UTUVNLAorCQkgVFNUT1JNX0NMSUVOVF9DT05GSUdfT0ZGU0VUKHBvcnQsIGNsaWVudF9p ZCksCisJCSAoKHUzMiAqKSZ0c3Rvcm1fY2xpZW50KVswXSk7CisJUkVHX1dSMzIoYnAsIEJB Ul9UU1RST1JNX0lOVE1FTSwKKwkJIFRTVE9STV9DTElFTlRfQ09ORklHX09GRlNFVChwb3J0 LCBjbGllbnRfaWQpICsgNCwKKwkJICgodTMyICopJnRzdG9ybV9jbGllbnQpWzFdKTsKKwor LyoJRFAoTkVUSUZfTVNHX0lGVVAsICJ0c3Rvcm1fY2xpZW50OiAweCUwOHggMHglMDh4XG4i LAorCSAgICgodTMyICopJnRzdG9ybV9jbGllbnQpWzBdLCAoKHUzMiAqKSZ0c3Rvcm1fY2xp ZW50KVsxXSk7ICovCit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2luaXRfaW50ZXJuYWwoc3Ry dWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCXN0cnVjdCB0c3Rv cm1fZXRoX3BvcnRfY29tbW9uX2NvbmZpZyB0c3Rvcm1fcG9ydF9jb25maWcgPSB7MH07CisJ c3RydWN0IHN0YXRzX2luZGljYXRpb25fZmxhZ3Mgc3RhdHNfZmxhZ3MgPSB7MH07CisJaW50 IGk7CisKKwl0c3Rvcm1fcG9ydF9jb25maWcuY29uZmlnX2ZsYWdzID0gMDsKKwl0c3Rvcm1f cG9ydF9jb25maWcucnNzX3Jlc3VsdF9tYXNrID0gMDsKKwl0c3Rvcm1fcG9ydF9jb25maWcu bGVhZGluZ19jbGllbnRfaWQgPSAwOworCisJUkVHX1dSMzIoYnAsIEJBUl9UU1RST1JNX0lO VE1FTSwKKwkJIFRTVE9STV9QT1JUX0NPTU1PTl9DT05GSUdfT0ZGU0VUKHBvcnQpLAorCQkg KCoodTMyICopJnRzdG9ybV9wb3J0X2NvbmZpZykpOworCisvKglEUChORVRJRl9NU0dfSUZV UCwgInRzdG9ybV9wb3J0X2NvbmZpZzogMHglMDh4XG4iLAorCSAgICgqKHUzMiAqKSZ0c3Rv cm1fcG9ydF9jb25maWcpKTsgKi8KKworCWJwLT5yeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9O T05FOyAvKiBubyByeCB1bnRpbGwgbGluayBpcyB1cCAqLworCWJueDJ4X3NldF9zdG9ybV9y eF9tb2RlKGJwKTsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCWJueDJ4X3NldF9j bGllbnRfY29uZmlnKGJwLCBpKTsKKwl9CisKKwlzdGF0c19mbGFncy5jb2xsZWN0X2V0aCA9 IDE7CisKKwlSRUdfV1IzMihicCwgQkFSX1hTVFJPUk1fSU5UTUVNLCBYU1RPUk1fU1RBVFNf RkxBR1NfT0ZGU0VUKHBvcnQpLAorCQkgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBdKTsKKwlS RUdfV1IzMihicCwgQkFSX1hTVFJPUk1fSU5UTUVNLCBYU1RPUk1fU1RBVFNfRkxBR1NfT0ZG U0VUKHBvcnQpICsgNCwKKwkJICgodTMyICopJnN0YXRzX2ZsYWdzKVsxXSk7CisKKwlSRUdf V1IzMihicCwgQkFSX1RTVFJPUk1fSU5UTUVNLCBUU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VU KHBvcnQpLAorCQkgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBdKTsKKwlSRUdfV1IzMihicCwg QkFSX1RTVFJPUk1fSU5UTUVNLCBUU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBvcnQpICsg NCwKKwkJICgodTMyICopJnN0YXRzX2ZsYWdzKVsxXSk7CisKKwlSRUdfV1IzMihicCwgQkFS X0NTVFJPUk1fSU5UTUVNLCBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBvcnQpLAorCQkg KCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBdKTsKKwlSRUdfV1IzMihicCwgQkFSX0NTVFJPUk1f SU5UTUVNLCBDU1RPUk1fU1RBVFNfRkxBR1NfT0ZGU0VUKHBvcnQpICsgNCwKKwkJICgodTMy ICopJnN0YXRzX2ZsYWdzKVsxXSk7CisKKy8qCURQKE5FVElGX01TR19JRlVQLCAic3RhdHNf ZmxhZ3M6IDB4JTA4eCAweCUwOHhcbiIsCisJICAgKCh1MzIgKikmc3RhdHNfZmxhZ3MpWzBd LCAoKHUzMiAqKSZzdGF0c19mbGFncylbMV0pOyAqLworfQorCitzdGF0aWMgaW50IGJueDJ4 X25pY19pbml0KHN0cnVjdCBibngyeCAqYnApCit7CisJaW50IGksIHJjID0gMDsKKworCWZv cl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAm YnAtPmZwW2ldOworCisJCWZwLT5zdGF0ZSA9IEJOWDJYX0ZQX1NUQVRFX0NMT1NFRDsKKwkJ RFAoTkVUSUZfTVNHX0lGVVAsICJibngyeF9pbml0X3NiKCVwLCVwLCVkKTtcbiIsCisJCSAg IGJwLCBmcC0+c3RhdHVzX2JsaywgaSk7CisJCWZwLT5pbmRleCA9IGk7CisJCWJueDJ4X2lu aXRfc2IoYnAsIGZwLT5zdGF0dXNfYmxrLCBmcC0+c3RhdHVzX2Jsa19tYXBwaW5nLCBpKTsK Kwl9CisKKwlibngyeF9pbml0X2RlZl9zYihicCwgYnAtPmRlZl9zdGF0dXNfYmxrLAorCQkJ ICBicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywgMHgxMCk7CisJYm54MnhfdXBkYXRlX2Nv YWxlc2NlKGJwKTsKKwlibngyeF9pbml0X3J4X3JpbmdzKGJwKTsKKwlibngyeF9pbml0X3R4 X3JpbmcoYnApOworCWJueDJ4X2luaXRfc3BfcmluZyhicCk7CisJYm54MnhfaW5pdF9jb250 ZXh0KGJwKTsKKwlibngyeF9pbml0X2ludGVybmFsKGJwKTsKKwlibngyeF9pbml0X3N0YXRz KGJwKTsKKwlibngyeF9lbmFibGVfaW50KGJwKTsKKworCXJldHVybiByYzsKK30KKworLyog ZW5kIG9mIG5pYyBpbml0ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGd6aXAg c2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBp bnQgYm54MnhfZ3VuemlwX2luaXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlicC0+Z3Vuemlw X2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGJwLT5wZGV2LCBGV19CVUZfU0laRSwKKwkJ CQkJICAgICAgJmJwLT5ndW56aXBfbWFwcGluZyk7CisJaWYgKGJwLT5ndW56aXBfYnVmICA9 PSBOVUxMKQorCQlnb3RvIGd1bnppcF9ub21lbTE7CisKKwlicC0+c3RybSA9IGttYWxsb2Mo c2l6ZW9mKCpicC0+c3RybSksIEdGUF9LRVJORUwpOworCWlmIChicC0+c3RybSAgPT0gTlVM TCkKKwkJZ290byBndW56aXBfbm9tZW0yOworCisJYnAtPnN0cm0tPndvcmtzcGFjZSA9IGtt YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSwKKwkJCQkgICAgICBHRlBfS0VS TkVMKTsKKwlpZiAoYnAtPnN0cm0tPndvcmtzcGFjZSA9PSBOVUxMKQorCQlnb3RvIGd1bnpp cF9ub21lbTM7CisKKwlyZXR1cm4gMDsKKworZ3VuemlwX25vbWVtMzoKKwlrZnJlZShicC0+ c3RybSk7CisJYnAtPnN0cm0gPSBOVUxMOworCitndW56aXBfbm9tZW0yOgorCXBjaV9mcmVl X2NvbnNpc3RlbnQoYnAtPnBkZXYsIEZXX0JVRl9TSVpFLCBicC0+Z3VuemlwX2J1ZiwKKwkJ CSAgICBicC0+Z3VuemlwX21hcHBpbmcpOworCWJwLT5ndW56aXBfYnVmID0gTlVMTDsKKwor Z3VuemlwX25vbWVtMToKKwlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQ2Fubm90IGFsbG9j YXRlIGZpcm13YXJlIGJ1ZmZlciBmb3IiCisJICAgICAgICIgdW5jb21wcmVzc2lvblxuIiwg YnAtPmRldi0+bmFtZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIGJu eDJ4X2d1bnppcF9lbmQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlrZnJlZShicC0+c3RybS0+ d29ya3NwYWNlKTsKKworCWtmcmVlKGJwLT5zdHJtKTsKKwlicC0+c3RybSA9IE5VTEw7CisK KwlpZiAoYnAtPmd1bnppcF9idWYpIHsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChicC0+cGRl diwgRldfQlVGX1NJWkUsIGJwLT5ndW56aXBfYnVmLAorCQkJCSAgICBicC0+Z3VuemlwX21h cHBpbmcpOworCQlicC0+Z3VuemlwX2J1ZiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50 IGJueDJ4X2d1bnppcChzdHJ1Y3QgYm54MnggKmJwLCB1OCAqemJ1ZiwgaW50IGxlbikKK3sK KwlpbnQgbiwgcmM7CisKKwkvKiBjaGVjayBnemlwIGhlYWRlciAqLworCWlmICgoemJ1Zlsw XSAhPSAweDFmKSB8fCAoemJ1ZlsxXSAhPSAweDhiKSB8fCAoemJ1ZlsyXSAhPSBaX0RFRkxB VEVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluID0gMTA7CisKKyNkZWZpbmUgRk5BTUUJ CQkJMHg4CisKKwlpZiAoemJ1ZlszXSAmIEZOQU1FKQorCQl3aGlsZSAoKHpidWZbbisrXSAh PSAwKSAmJiAobiA8IGxlbikpOworCisJYnAtPnN0cm0tPm5leHRfaW4gPSB6YnVmICsgbjsK KwlicC0+c3RybS0+YXZhaWxfaW4gPSBsZW4gLSBuOworCWJwLT5zdHJtLT5uZXh0X291dCA9 IGJwLT5ndW56aXBfYnVmOworCWJwLT5zdHJtLT5hdmFpbF9vdXQgPSBGV19CVUZfU0laRTsK KworCXJjID0gemxpYl9pbmZsYXRlSW5pdDIoYnAtPnN0cm0sIC1NQVhfV0JJVFMpOworCWlm IChyYyAhPSBaX09LKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHpsaWJfaW5mbGF0ZShicC0+ c3RybSwgWl9GSU5JU0gpOworCisJYnAtPmd1bnppcF9vdXRsZW4gPSAoRldfQlVGX1NJWkUg LSBicC0+c3RybS0+YXZhaWxfb3V0KSA+PiAyOworCisJaWYgKChyYyAhPSBaX09LKSAmJiAo cmMgIT0gWl9TVFJFQU1fRU5EKSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IEZpcm13 YXJlIGRlY29tcHJlc3Npb24gZXJyb3I6ICVzXG4iLAorCQkgICAgICAgYnAtPmRldi0+bmFt ZSwgYnAtPnN0cm0tPm1zZyk7CisKKwl6bGliX2luZmxhdGVFbmQoYnAtPnN0cm0pOworCisJ aWYgKHJjID09IFpfU1RSRUFNX0VORCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmM7Cit9 CisKKy8qIG5pYyBsb2FkL3VubG9hZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor KiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwor CisvKiBjYXVzZSB0aGUgTklHIHRvIHNlbmQgYSBsb29wYmFjayBkZWJ1ZyBwYWNrZXQgKi8K K3N0YXRpYyB2b2lkIGJueDJ4X2xiX3Bja3Qoc3RydWN0IGJueDJ4ICpicCkKK3sKKyNpZmRl ZiBVU0VfRE1BRQorCXUzMiB3Yl93cml0ZVszXTsKKyNlbmRpZgorCisJLyogRXRoZXJuZXQg c291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KKyNpZmRlZiBVU0VfRE1BRQor CXdiX3dyaXRlWzBdID0gMHg1NTU1NTU1NTsKKwl3Yl93cml0ZVsxXSA9IDB4NTU1NTU1NTU7 CisJd2Jfd3JpdGVbMl0gPSAweDIwOwkJLyogU09QICovCisJUkVHX1dSX0RNQUUoYnAsIEdS Q0JBU0VfTklHLAorCQkgICAgTklHX1JFR0lTVEVSU19ERUJVR19QQUNLRVRfTEIsIHdiX3dy aXRlLCAzKTsKKyNlbHNlCisJUkVHX1dSX0lORChicCwgR1JDQkFTRV9OSUcsCisJCSAgIE5J R19SRUdJU1RFUlNfREVCVUdfUEFDS0VUX0xCLCAweDU1NTU1NTU1KTsKKwlSRUdfV1JfSU5E KGJwLCBHUkNCQVNFX05JRywKKwkJICAgTklHX1JFR0lTVEVSU19ERUJVR19QQUNLRVRfTEIg KyA0LCAweDU1NTU1NTU1KTsKKwkvKiBTT1AgKi8KKwlSRUdfV1JfSU5EKGJwLCBHUkNCQVNF X05JRywgTklHX1JFR0lTVEVSU19ERUJVR19QQUNLRVRfTEIgKyA4LCAweDIwKTsKKyNlbmRp ZgorCisJLyogTk9OLUlQIHByb3RvY29sICovCisjaWZkZWYgVVNFX0RNQUUKKwl3Yl93cml0 ZVswXSA9IDB4MDkwMDAwMDA7CisJd2Jfd3JpdGVbMV0gPSAweDU1NTU1NTU1OworCXdiX3dy aXRlWzJdID0gMHgxMDsJCS8qIEVPUCwgZW9wX2J2YWxpZCA9IDAgKi8KKwlSRUdfV1JfRE1B RShicCwgR1JDQkFTRV9OSUcsCisJCSAgICBOSUdfUkVHSVNURVJTX0RFQlVHX1BBQ0tFVF9M Qiwgd2Jfd3JpdGUsIDMpOworI2Vsc2UKKwlSRUdfV1JfSU5EKGJwLCBHUkNCQVNFX05JRywK KwkJICAgTklHX1JFR0lTVEVSU19ERUJVR19QQUNLRVRfTEIsIDB4MDkwMDAwMDApOworCVJF R19XUl9JTkQoYnAsIEdSQ0JBU0VfTklHLAorCQkgICBOSUdfUkVHSVNURVJTX0RFQlVHX1BB Q0tFVF9MQiArIDQsIDB4NTU1NTU1NTUpOworCS8qIEVPUCwgZW9wX2J2YWxpZCA9IDAgKi8K KwlSRUdfV1JfSU5EKGJwLCBHUkNCQVNFX05JRywgTklHX1JFR0lTVEVSU19ERUJVR19QQUNL RVRfTEIgKyA4LCAweDEwKTsKKyNlbmRpZgorfQorCisvKiBzb21lIG9mIHRoZSBpbnRlcm5h bCBtZW1vcmllcyBhcmUgbm90IGRpcmVjdGx5IHJlYWRhYmxlIGZyb20gdGhlIGRyaXZlcgor ICAgdG8gdGVzdCB0aGVtIHdlIHNlbmQgZGVidWcgcGFja2V0cworICovCitzdGF0aWMgaW50 IGJueDJ4X2ludF9tZW1fdGVzdChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisJ dTMyIGNvdW50OworCXU4IGh3OworCXU4IHBvcnQ7CisJdTggaTsKKwl1MzIgZmFjdG9yOwor CisJc3dpdGNoIChDSElQX1JFVihicCkpIHsKKwljYXNlIENISVBfUkVWX0VNVUw6CisJCWh3 ID0gSU5JVF9FTVVMQVRJT047CisJCWZhY3RvciA9IDIwMDsKKwkJYnJlYWs7CisJY2FzZSBD SElQX1JFVl9GUEdBOgorCQlodyA9IElOSVRfRlBHQTsKKwkJZmFjdG9yID0gMTIwOworCQli cmVhazsKKwlkZWZhdWx0OgorCQlodyA9IElOSVRfQVNJQzsKKwkJZmFjdG9yID0gMTsKKwkJ YnJlYWs7CisJfQorCisJcG9ydCA9IFBPUlQwIDw8IGJwLT5wb3J0OworCisJRFAoTkVUSUZf TVNHX0hXLCAibWVtX3dyayBzdGFydCBwYXJ0MVxuIik7CisKKwkvKiBEaXNhYmxlIGlucHV0 cyBvZiBwYXJzZXIgbmVpZ2hib3IgYmxvY2tzICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX1RT RE0sIFRTRE1fUkVHSVNURVJTX0VOQUJMRV9JTjEsIDB4MCk7CisJUkVHX1dSKGJwLCBHUkNC QVNFX1RDTSwgVENNX1JFR0lTVEVSU19QUlNfSUZFTiwgMHgwKTsKKwlSRUdfV1IoYnAsIEdS Q0JBU0VfQ0ZDLCBDRkNfUkVHSVNURVJTX0RFQlVHMCwgMHgxKTsKKwlOSUdfV1IoTklHX1JF R0lTVEVSU19QUlNfUkVRX0lOX0VOLCAweDApOworCisJLyogIFdyaXRlIDAgdG8gcGFyc2Vy IGNyZWRpdHMgZm9yIENGQyBzZWFyY2ggcmVxdWVzdCAqLworCVJFR19XUihicCwgR1JDQkFT RV9QUlMsIFBSU19SRUdJU1RFUlNfQ0ZDX1NFQVJDSF9JTklUSUFMX0NSRURJVCwgMHgwKTsK KworCS8qIHNlbmQgRXRoZXJuZXQgcGFja2V0ICovCisJYm54MnhfbGJfcGNrdChicCk7CisK KwkvKiBUT0RPIGRvIGkgcmVzZXQgTklHIHN0YXRpc3RpYyA/Ki8KKwkvKiBXYWl0IHVudGls IE5JRyByZWdpc3RlciBzaG93cyAxIHBhY2tldCBvZiBzaXplIDB4MTAgKi8KKwljb3VudCA9 IDEwMDA7CisJd2hpbGUgKGNvdW50KSB7CisjaWZkZWYgQk5YMlhfRE1BRV9SRAorCQlibngy eF9yZWFkX2RtYWUoYnAsCisJCQkoR1JDQkFTRV9OSUcgKyBOSUdfUkVHSVNURVJTX1NUQVQy X0JSQl9PQ1RFVCksIDIpOworCQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwor I2Vsc2UKKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywgTklHX1JFR0lTVEVSU19T VEFUMl9CUkJfT0NURVQpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfTklHLCBOSUdfUkVHSVNU RVJTX1NUQVQyX0JSQl9PQ1RFVCArIDQpOworI2VuZGlmCisJCWlmICh2YWwgPT0gMHgxMCkg eworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEwICogZmFjdG9yKTsKKwkJY291bnQtLTsK Kwl9CisJaWYgKHZhbCAhPSAweDEwKSB7CisJCUJOWDJYX0VSUigiTklHIHRpbWVvdXQgdmFs ID0gMHgleFxuIiwgdmFsKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFdhaXQgdW50aWwg UFJTIHJlZ2lzdGVyIHNob3dzIDEgcGFja2V0ICovCisJY291bnQgPSAxMDAwOworCXdoaWxl IChjb3VudCkgeworCQl2YWwgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfUFJTLCBQUlNfUkVHSVNU RVJTX05VTV9PRl9QQUNLRVRTKTsKKworCQlpZiAodmFsID09IDB4MSkgeworCQkJYnJlYWs7 CisJCX0KKwkJbXNsZWVwKDEwICogZmFjdG9yKTsKKwkJY291bnQtLTsKKwl9CisJaWYgKHZh bCAhPSAweDEpIHsKKwkJQk5YMlhfRVJSKCJQUlMgdGltZW91dCB2YWwgPSAweCV4XG4iLCB2 YWwpOworCQlyZXR1cm4gLTI7CisJfQorCisJLyogUmVzZXQgYW5kIGluaXQgQlJCLCBQUlMg Ki8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQywgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVH XzFfQ0xFQVIsIDB4Myk7CisJbXNsZWVwKDUwKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlT QywgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfU0VULCAweDMpOworCW1zbGVlcCg1MCk7 CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX0JSQjEsIENPTU1PTik7CisJYm54Mnhf aW5pdF9zdGFnZShicCwgQkxDTlVNX1BSUywgQ09NTU9OKTsKKworCURQKE5FVElGX01TR19I VywgInBhcnQyXG4iKTsKKworCS8qIERpc2FibGUgaW5wdXRzIG9mIHBhcnNlciBuZWlnaGJv ciBibG9ja3MgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfVFNETSwgVFNETV9SRUdJU1RFUlNf RU5BQkxFX0lOMSwgMHgwKTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfVENNLCBUQ01fUkVHSVNU RVJTX1BSU19JRkVOLCAweDApOworCVJFR19XUihicCwgR1JDQkFTRV9DRkMsIENGQ19SRUdJ U1RFUlNfREVCVUcwLCAweDEpOworCU5JR19XUihOSUdfUkVHSVNURVJTX1BSU19SRVFfSU5f RU4sIDB4MCk7CisKKwkvKiBXcml0ZSAwIHRvIHBhcnNlciBjcmVkaXRzIGZvciBDRkMgc2Vh cmNoIHJlcXVlc3QgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfUFJTLCBQUlNfUkVHSVNURVJT X0NGQ19TRUFSQ0hfSU5JVElBTF9DUkVESVQsIDB4MCk7CisKKwkvKiBzZW5kIDEwIEV0aGVy bmV0IHBhY2tldHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQlibngyeF9s Yl9wY2t0KGJwKTsKKwl9CisKKwkvKiBXYWl0IHVudGlsIE5JRyByZWdpc3RlciBzaG93cyAx MCArIDEKKwkgICBwYWNrZXRzIG9mIHNpemUgMTEqMHgxMCA9IDB4YjAgKi8KKwljb3VudCA9 IDEwMDA7CisJd2hpbGUgKGNvdW50KSB7CisjaWZkZWYgQk5YMlhfRE1BRV9SRAorCQlibngy eF9yZWFkX2RtYWUoYnAsCisJCQkoR1JDQkFTRV9OSUcgKyBOSUdfUkVHSVNURVJTX1NUQVQy X0JSQl9PQ1RFVCksIDIpOworCQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0pOwor I2Vsc2UKKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywgTklHX1JFR0lTVEVSU19T VEFUMl9CUkJfT0NURVQpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfTklHLCBOSUdfUkVHSVNU RVJTX1NUQVQyX0JSQl9PQ1RFVCArIDQpOworI2VuZGlmCisJCWlmICh2YWwgPT0gMHhiMCkg eworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEwICogZmFjdG9yKTsKKwkJY291bnQtLTsK Kwl9CisJaWYgKHZhbCAhPSAweGIwKSB7CisJCUJOWDJYX0VSUigiTklHIHRpbWVvdXQgdmFs ID0gMHgleFxuIiwgdmFsKTsKKwkJcmV0dXJuIC0zOworCX0KKworCS8qIFdhaXQgdW50aWwg UFJTIHJlZ2lzdGVyIHNob3dzIDIgcGFja2V0ICovCisJdmFsID0gUkVHX1JEKGJwLCBHUkNC QVNFX1BSUywgUFJTX1JFR0lTVEVSU19OVU1fT0ZfUEFDS0VUUyk7CisKKwlpZiAodmFsICE9 IDB4MikgeworCQlCTlgyWF9FUlIoIlBSUyB0aW1lb3V0IHZhbCA9IDB4JXhcbiIsIHZhbCk7 CisJfQorCisJLyogV3JpdGUgMSB0byBwYXJzZXIgY3JlZGl0cyBmb3IgQ0ZDIHNlYXJjaCBy ZXF1ZXN0ICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX1BSUywgUFJTX1JFR0lTVEVSU19DRkNf U0VBUkNIX0lOSVRJQUxfQ1JFRElULCAweDEpOworCisJLyogV2FpdCB1bnRpbCBQUlMgcmVn aXN0ZXIgc2hvd3MgMyBwYWNrZXQgKi8KKwltc2xlZXAoMTAgKiBmYWN0b3IpOworCS8qIFdh aXQgdW50aWwgTklHIHJlZ2lzdGVyIHNob3dzIDEgcGFja2V0IG9mIHNpemUgMHgxMCAqLwor CXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9QUlMsIFBSU19SRUdJU1RFUlNfTlVNX09GX1BB Q0tFVFMpOworCisJaWYgKHZhbCAhPSAweDMpIHsKKwkJQk5YMlhfRVJSKCJQUlMgdGltZW91 dCB2YWwgPSAweCV4XG4iLCB2YWwpOworCX0KKwkvKiBjbGVhciBOSUcgRU9QIEZJRk8gKi8K Kwlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfTklH LCBOSUdfUkVHSVNURVJTX0lOR1JFU1NfRU9QX0xCX0ZJRk8pOworCX0KKwl2YWwgPSBSRUdf UkQoYnAsIEdSQ0JBU0VfTklHLCBOSUdfUkVHSVNURVJTX0lOR1JFU1NfRU9QX0xCX0VNUFRZ KTsKKwlpZiAodmFsICE9IDEpIHsKKwkJQk5YMlhfRVJSKCJjbGVhciBvZiBOSUcgZmFpbGVk XG4iKTsKKwkJcmV0dXJuIC00OworCX0KKworCS8qIFJlc2V0IGFuZCBpbml0IEJSQiwgUFJT LCBOSUcgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQywgTUlTQ19SRUdJU1RFUlNfUkVT RVRfUkVHXzFfQ0xFQVIsIDB4MDMpOworCW1zbGVlcCg1MCk7CisJUkVHX1dSKGJwLCBHUkNC QVNFX01JU0MsIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xX1NFVCwgMHgwMyk7CisJbXNs ZWVwKDUwKTsKKwlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fQlJCMSwgQ09NTU9OKTsK KwlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fUFJTLCBDT01NT04pOworI2lmbmRlZiBC Q01fSVNDU0kKKwkvKiBzZXQgTklDIG1vZGUgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfUFJT LCBQUlNfUkVHSVNURVJTX05JQ19NT0RFLCAxKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIGlu cHV0cyBvZiBwYXJzZXIgbmVpZ2hib3IgYmxvY2tzICovCisJUkVHX1dSKGJwLCBHUkNCQVNF X1RTRE0sIFRTRE1fUkVHSVNURVJTX0VOQUJMRV9JTjEsIDB4N2ZmZmZmZmYpOworCVJFR19X UihicCwgR1JDQkFTRV9UQ00sIFRDTV9SRUdJU1RFUlNfUFJTX0lGRU4sIDB4MSk7CisJUkVH X1dSKGJwLCBHUkNCQVNFX0NGQywgQ0ZDX1JFR0lTVEVSU19ERUJVRzAsIDB4MCk7CisJTklH X1dSKE5JR19SRUdJU1RFUlNfUFJTX1JFUV9JTl9FTiwgMHgxKTsKKworCURQKE5FVElGX01T R19IVywgImRvbmVcbiIpOworCisJcmV0dXJuIDA7IC8qIE9LICovCit9CisKK3N0YXRpYyBp bnQgYm54MnhfZnVuY3Rpb25faW5pdChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgbW9kZSkKK3sK KwlpbnQgdmFsLCBpOworCXUxNiBqLCByX29yZGVyLCB3X29yZGVyOworCWludCBmdW5jID0g YnAtPnBvcnQ7CisJaW50IHBvcnQgPSBmdW5jID8gUE9SVDEgOiBQT1JUMDsKKyNpZmRlZiBV U0VfRE1BRQorCXUzMiB3Yl93cml0ZVsyXTsKKyNlbmRpZgorCisJRFAoQk5YMlhfTVNHX01D UCwgImZ1bmN0aW9uIGlzICVkICBtb2RlIGlzICV4XG4iLCBmdW5jLCBtb2RlKTsKKwlpZiAo KGZ1bmMgIT0gMCkgJiYgKGZ1bmMgIT0gMSkpIHsKKwkJQk5YMlhfRVJSKCJCQUQgZnVuY3Rp b24gbnVtYmVyICglZClcbiIsIGZ1bmMpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwli bngyeF9ndW56aXBfaW5pdChicCk7CisKKwlpZiAobW9kZSAmIDB4MSkgewkvKiBpbml0IGNv bW1vbiAqLworCQlEUChCTlgyWF9NU0dfTUNQLCAic3RhcnRpbmcgY29tbW9uIGluaXQgIGZ1 bmMgJWQgIG1vZGUgJXhcbiIsCisJCSAgIGZ1bmMsIG1vZGUpOworCQlSRUdfV1IoYnAsIEdS Q0JBU0VfTUlTQywKKwkJICAgICAgIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18xLCAweGZm ZmZmZmZmKTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MsIE1JU0NfUkVHSVNURVJTX1JF U0VUX1JFR18yLCAweGZmZmMpOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fTUlT QywgQ09NTU9OKTsKKworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQywKKwkJICAgICAgIE1J U0NfUkVHSVNURVJTX0xDUExMX0NUUkxfUkVHXzIsIDB4MTAwKTsKKwkJbXNsZWVwKDMwKTsK KwkJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MsCisJCSAgICAgICBNSVNDX1JFR0lTVEVSU19M Q1BMTF9DVFJMX1JFR18yLCAweDApOworCisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05V TV9QWFAsIENPTU1PTik7CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9QWFAyLCBD T01NT04pOworCisJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LAorCQkJCSAgICAg YnAtPnBjaWVfY2FwICsgUENJX0VYUF9ERVZDVEwsICZqKTsKKwkJRFAoTkVUSUZfTVNHX0hX LCAicmVhZCAleCBmcm9tIGRldmN0bFxuIiwgaik7CisJCXdfb3JkZXIgPSAoKGogJiBQQ0lf RVhQX0RFVkNUTF9QQVlMT0FEKSA+PiA1KTsJLyogMHgweDAwZTAgKi8KKwkJcl9vcmRlciA9 ICgoaiAmIFBDSV9FWFBfREVWQ1RMX1JFQURSUSkgPj4gMTIpOwkvKiAweDcwMDAgKi8KKwor CQlibngyeF9pbml0X3B4cChicCwgcl9vcmRlciwgd19vcmRlcik7CisKKwkJaWYgKENISVBf UkVWKGJwKSA9PSBDSElQX1JFVl9BeCkgeworCQkJLyogZW5hYmxlIGh3IGludGVycnVwdCBm cm9tIFBYUCBvbiB1c2RtCisJCQkgICBvdmVyZmxvdyBiaXQgMTYgb24gSU5UX01BU0tfMCAq LworCQkJUkVHX1dSKGJwLCBHUkNCQVNFX1BYUCwKKwkJCSAgICAgICBQWFBfUkVHSVNURVJT X1BYUF9JTlRfTUFTS18wLCAwKTsKKwkJfQorCisjaWZkZWYgX19CSUdfRU5ESUFOCisjd2Fy bmluZyBiaWcgZW5kaWFuIGRyaXZlciBiZWluZyBjb21waWxlZAorCQlSRUdfV1IoYnAsIEdS Q0JBU0VfUFhQMiwgUFhQMl9SRUdJU1RFUlNfUlFfUU1fRU5ESUFOX00sIDEpOworLyogUkVH X1dSKGJwLCBHUkNCQVNFX1BYUDIsIFBYUDJfUkVHSVNURVJTX1JRX1RNX0VORElBTl9NLCAx KTsgKi8KKy8qIFJFR19XUihicCwgR1JDQkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SUV9T UkNfRU5ESUFOX00sIDEpOyAqLworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwgUFhQMl9S RUdJU1RFUlNfUlFfQ0RVX0VORElBTl9NLCAxKTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1BY UDIsIFBYUDJfUkVHSVNURVJTX1JRX0RCR19FTkRJQU5fTSwgMSk7CisJCVJFR19XUihicCwg R1JDQkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SUV9IQ19FTkRJQU5fTSwgMSk7CisKKy8q IFJFR19XUihicCwgR1JDQkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SRF9QQkZfU1dBUF9N T0RFLCAxKTsgKi8KKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1BYUDIsIFBYUDJfUkVHSVNURVJT X1JEX1FNX1NXQVBfTU9ERSwgMSk7CisvKiBSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwgUFhQ Ml9SRUdJU1RFUlNfUkRfVE1fU1dBUF9NT0RFLCAxKTsgKi8KKy8qIFJFR19XUihicCwgR1JD QkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SRF9TUkNfU1dBUF9NT0RFLCAxKTsgKi8KKwkJ UkVHX1dSKGJwLCBHUkNCQVNFX1BYUDIsCisJCSAgICAgICBQWFAyX1JFR0lTVEVSU19SRF9D RFVSRF9TV0FQX01PREUsIDEpOworI2VuZGlmIC8qIEJJR19FTkRJQU4gKi8KKworI2lmbmRl ZiBCQ01fSVNDU0kKKwkJLyogc2V0IE5JQyBtb2RlICovCisJCVJFR19XUihicCwgR1JDQkFT RV9QUlMsIFBSU19SRUdJU1RFUlNfTklDX01PREUsIDEpOworI2VuZGlmCisKKwkJUkVHX1dS KGJwLCBHUkNCQVNFX1BYUDIsIFBYUDJfUkVHSVNURVJTX1JRX0NEVV9QX1NJWkUsIDUpOwor I2lmZGVmIEJDTV9JU0NTSQorCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwgUFhQMl9SRUdJ U1RFUlNfUlFfVE1fUF9TSVpFLCA1KTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1BYUDIsIFBY UDJfUkVHSVNURVJTX1JRX1FNX1BfU0laRSwgNSk7CisJCVJFR19XUihicCwgR1JDQkFTRV9Q WFAyLCBQWFAyX1JFR0lTVEVSU19SUV9TUkNfUF9TSVpFLCA1KTsKKyNlbmRpZgorCisJCWJu eDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9ETUFFLCBDT01NT04pOworCisJCS8qIGxldCB0 aGUgSFcgZG8gaXQncyBtYWdpYyAuLi4gKi8KKwkJbXNsZWVwKDEwMCk7IC8qIFRCRCAqLwor CQkvKiBmaW5pc2ggUFhQIGluaXQKKwkJICAgKGNhbiBiZSBtb3ZlZCB1cCBpZiB3ZSB3YW50 IHRvIHVzZSB0aGUgRE1BRSkgKi8KKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX1BYUDIs IFBYUDJfUkVHSVNURVJTX1JRX0NGR19ET05FKTsKKwkJaWYgKHZhbCAhPSAxKSB7CisJCQlC TlgyWF9FUlIoIlBYUDIgQ0ZHIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9 CisKKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX1BYUDIsIFBYUDJfUkVHSVNURVJTX1JE X0lOSVRfRE9ORSk7CisJCWlmICh2YWwgIT0gMSkgeworCQkJQk5YMlhfRVJSKCJQWFAyIFJE X0lOSVQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQlSRUdfV1Io YnAsIEdSQ0JBU0VfUFhQMiwgUFhQMl9SRUdJU1RFUlNfUlFfRElTQUJMRV9JTlBVVFMsIDAp OworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwgUFhQMl9SRUdJU1RFUlNfUkRfRElTQUJM RV9JTlBVVFMsIDApOworCisJCURNQUVfQ0xSKGJwLCBHUkNCQVNFX1RTRU0sIFRTRU1fUkVH SVNURVJTX1BSQU0sIDgpOworCisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9UQ00s IENPTU1PTik7CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9VQ00sIENPTU1PTik7 CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9DQ00sIENPTU1PTik7CisJCWJueDJ4 X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9YQ00sIENPTU1PTik7CisKKwkJLyogVEJEIG1lcmdl IHdpdGggaW5pdCB0b29sPyAqLworI2lmZGVmIEJOWDJYX0RNQUVfUkQKKwkJYm54MnhfcmVh ZF9kbWFlKGJwLAorCQkJKEdSQ0JBU0VfWFNFTSArIFhTRU1fUkVHSVNURVJTX1BBU1NJVkVf QlVGRkVSKSwgMyk7CisJCWJueDJ4X3JlYWRfZG1hZShicCwKKwkJCShHUkNCQVNFX0NTRU0g KyBDU0VNX1JFR0lTVEVSU19QQVNTSVZFX0JVRkZFUiksIDMpOworCQlibngyeF9yZWFkX2Rt YWUoYnAsCisJCQkoR1JDQkFTRV9UU0VNICsgVFNFTV9SRUdJU1RFUlNfUEFTU0lWRV9CVUZG RVIpLCAzKTsKKwkJYm54MnhfcmVhZF9kbWFlKGJwLAorCQkJKEdSQ0JBU0VfVVNFTSArIFVT RU1fUkVHSVNURVJTX1BBU1NJVkVfQlVGRkVSKSwgMyk7CisjZWxzZQorCQlSRUdfUkQoYnAs IEdSQ0JBU0VfWFNFTSwgWFNFTV9SRUdJU1RFUlNfUEFTU0lWRV9CVUZGRVIpOworCQlSRUdf UkQoYnAsIEdSQ0JBU0VfWFNFTSwgWFNFTV9SRUdJU1RFUlNfUEFTU0lWRV9CVUZGRVIgKyA0 KTsKKwkJUkVHX1JEKGJwLCBHUkNCQVNFX1hTRU0sIFhTRU1fUkVHSVNURVJTX1BBU1NJVkVf QlVGRkVSICsgOCk7CisJCVJFR19SRChicCwgR1JDQkFTRV9DU0VNLCBDU0VNX1JFR0lTVEVS U19QQVNTSVZFX0JVRkZFUik7CisJCVJFR19SRChicCwgR1JDQkFTRV9DU0VNLCBDU0VNX1JF R0lTVEVSU19QQVNTSVZFX0JVRkZFUiArIDQpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfQ1NF TSwgQ1NFTV9SRUdJU1RFUlNfUEFTU0lWRV9CVUZGRVIgKyA4KTsKKwkJUkVHX1JEKGJwLCBH UkNCQVNFX1RTRU0sIFRTRU1fUkVHSVNURVJTX1BBU1NJVkVfQlVGRkVSKTsKKwkJUkVHX1JE KGJwLCBHUkNCQVNFX1RTRU0sIFRTRU1fUkVHSVNURVJTX1BBU1NJVkVfQlVGRkVSICsgNCk7 CisJCVJFR19SRChicCwgR1JDQkFTRV9UU0VNLCBUU0VNX1JFR0lTVEVSU19QQVNTSVZFX0JV RkZFUiArIDgpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfVVNFTSwgVVNFTV9SRUdJU1RFUlNf UEFTU0lWRV9CVUZGRVIpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfVVNFTSwgVVNFTV9SRUdJ U1RFUlNfUEFTU0lWRV9CVUZGRVIgKyA0KTsKKwkJUkVHX1JEKGJwLCBHUkNCQVNFX1VTRU0s IFVTRU1fUkVHSVNURVJTX1BBU1NJVkVfQlVGRkVSICsgOCk7CisjZW5kaWYKKwkJYm54Mnhf aW5pdF9zdGFnZShicCwgQkxDTlVNX1FNLCBDT01NT04pOworCQkvKiBzb2Z0cmVzdCBwdWxz ZSAqLworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUU0sIFFNX1JFR0lTVEVSU19TT0ZUX1JFU0VU LCAxKTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1FNLCBRTV9SRUdJU1RFUlNfU09GVF9SRVNF VCwgMCk7CisKKyNpZmRlZiBCQ01fSVNDU0kKKwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxD TlVNX1RJTUVSUywgQ09NTU9OKTsKKyNlbmRpZgorCQlibngyeF9pbml0X3N0YWdlKGJwLCBC TENOVU1fRFEsIENPTU1PTik7CisJCVJFR19XUihicCwgR1JDQkFTRV9EUSwgRE9SUV9SRUdJ U1RFUlNfRFBNX0NJRF9PRlNULAorCQkgICAgICAgQkNNX1BBR0VfQklUUyk7CisJCWlmIChD SElQX1JFVihicCkgPT0gQ0hJUF9SRVZfQXgpIHsKKwkJCS8qIGVuYWJsZSBodyBpbnRlcnJ1 cHQgZnJvbSBkb29yYmVsbCBRICovCisJCQlSRUdfV1IoYnAsIEdSQ0JBU0VfRFEsCisJCQkg ICAgICAgRE9SUV9SRUdJU1RFUlNfRE9SUV9JTlRfTUFTSywgMCk7CisJCX0KKworCQlibngy eF9pbml0X3N0YWdlKGJwLCBCTENOVU1fQlJCMSwgQ09NTU9OKTsKKworCQlpZiAoQ0hJUF9S RVZfSVNfU0xPVyhicCkpIHsKKwkJCS8qIGZpeCBmb3IgZW11bGF0aW9uIGFuZCBGUEdBIGZv ciBubyBwYXVzZSAqLworCQkJUkVHX1dSKGJwLCBHUkNCQVNFX0JSQjEsCisJCQkgICAgICAg QlJCMV9SRUdJU1RFUlNfUEFVU0VfSElHSF9USFJFU0hPTERfMCwgNTEzKTsKKwkJCVJFR19X UihicCwgR1JDQkFTRV9CUkIxLAorCQkJICAgICAgIEJSQjFfUkVHSVNURVJTX1BBVVNFX0hJ R0hfVEhSRVNIT0xEXzEsIDUxMyk7CisJCQlSRUdfV1IoYnAsIEdSQ0JBU0VfQlJCMSwKKwkJ CSAgICAgICBCUkIxX1JFR0lTVEVSU19QQVVTRV9MT1dfVEhSRVNIT0xEXzAsIDApOworCQkJ UkVHX1dSKGJwLCBHUkNCQVNFX0JSQjEsCisJCQkgICAgICAgQlJCMV9SRUdJU1RFUlNfUEFV U0VfTE9XX1RIUkVTSE9MRF8xLCAwKTsKKwkJfQorCisJCWJueDJ4X2luaXRfc3RhZ2UoYnAs IEJMQ05VTV9QUlMsIENPTU1PTik7CisKKwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVN X1RTRE0sIENPTU1PTik7CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9DU0RNLCBD T01NT04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fVVNETSwgQ09NTU9OKTsK KwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1hTRE0sIENPTU1PTik7CisKKwkJYm54 MnhfemVyb19pbnRtZW0oYnApOworCisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9U U0VNLCBDT01NT04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fVVNFTSwgQ09N TU9OKTsKKwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX0NTRU0sIENPTU1PTik7CisJ CWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9YU0VNLCBDT01NT04pOworCisJCS8qIHN5 bmMgc2VtaSBydGMgKi8KKwkJUkVHX1dSKGJwLCBHUkNCQVNFX01JU0MsCisJCSAgICAgICBN SVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMV9DTEVBUiwgMHg4MDAwMDAwMCk7CisJCVJFR19X UihicCwgR1JDQkFTRV9NSVNDLAorCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVH XzFfU0VULCAweDgwMDAwMDAwKTsKKworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1f VVBCLCBDT01NT04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fWFBCLCBDT01N T04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fUEJGLCBDT01NT04pOworCisj aWYgZGVmaW5lZChCQ01fSVNDU0kpIHwgZGVmaW5lZChCQ01fTVVMVEkpCisJCVJFR19XUihi cCwgR1JDQkFTRV9TUkNILCBTUkNfUkVHSVNURVJTX1NPRlRfUlNULCAxKTsKKwkJZm9yIChp ID0gU1JDX1JFR0lTVEVSU19LRVlSU1MwXzA7CisJCSAgICAgaSA8PSBTUkNfUkVHSVNURVJT X0tFWVJTUzFfOTsgaSArPSA0KSB7CisJCQlSRUdfV1IoYnAsIEdSQ0JBU0VfU1JDSCwgaSwg MHhjMGNhYzAxYSk7CisJCQkvKiB0b2RvOiByZXBsZWFjZSB3aXRoIHNvbWV0aGluZyBtZWFu aW5nZnVsbCAqLworCQl9CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9TUkNILCBD T01NT04pOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfU1JDSCwgU1JDX1JFR0lTVEVSU19TT0ZU X1JTVCwgMCk7CisjZW5kaWYKKworCQlpZiAoc2l6ZW9mKHVuaW9uIGNkdV9jb250ZXh0KSAh PSAxMDI0KSB7CisJCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInBsZWFzZSBhZGp1c3QgdGhl IHNpemUgb2YiCisJCQkgICAgICAgIiBjZHVfY29udGV4dCglbGQpXG4iLAorCQkJICAgICAg IChsb25nKXNpemVvZih1bmlvbiBjZHVfY29udGV4dCkpOworCQl9CisJCXZhbCA9ICg0IDw8 IDI0KSArICgwIDw8IDEyKSArIDEwMjQ7CisJCVJFR19XUihicCwgR1JDQkFTRV9DRFUsIENE VV9SRUdJU1RFUlNfQ0RVX0dMT0JBTF9QQVJBTVMsIHZhbCk7CisJCWJueDJ4X2luaXRfc3Rh Z2UoYnAsIEJMQ05VTV9DRFUsIENPTU1PTik7CisKKwkJYm54MnhfaW5pdF9zdGFnZShicCwg QkxDTlVNX0NGQywgQ09NTU9OKTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX0NGQywgQ0ZDX1JF R0lTVEVSU19JTklUX1JFRywgMHg3RkYpOworCisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJM Q05VTV9IQywgQ09NTU9OKTsKKwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX01JU0Nf QUVVLCBDT01NT04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fUFhQQ1MsIENP TU1PTik7CisJCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9FTUFDMCwgQ09NTU9OKTsK KwkJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX0VNQUMxLCBDT01NT04pOworCQlibngy eF9pbml0X3N0YWdlKGJwLCBCTENOVU1fREJVLCBDT01NT04pOworCQlibngyeF9pbml0X3N0 YWdlKGJwLCBCTENOVU1fREJHLCBDT01NT04pOworCQlibngyeF9pbml0X3N0YWdlKGJwLCBC TENOVU1fTklHLCBDT01NT04pOworCisJCWlmIChDSElQX1JFVl9JU19TTE9XKGJwKSkgewor CQkJbXNsZWVwKDIwMCk7CisJCX0KKworCQkvKiBmaW5pc2ggQ0ZDIGluaXQgKi8KKwkJdmFs ID0gUkVHX1JEKGJwLCBHUkNCQVNFX0NGQywgQ0ZDX1JFR0lTVEVSU19MTF9JTklUX0RPTkUp OworCQlpZiAodmFsICE9IDEpIHsKKwkJCUJOWDJYX0VSUigiQ0ZDIExMX0lOSVQgZmFpbGVk XG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl2YWwgPSBSRUdfUkQoYnAsIEdS Q0JBU0VfQ0ZDLCBDRkNfUkVHSVNURVJTX0FDX0lOSVRfRE9ORSk7CisJCWlmICh2YWwgIT0g MSkgeworCQkJQk5YMlhfRVJSKCJDRkMgQUNfSU5JVCBmYWlsZWRcbiIpOworCQkJcmV0dXJu IC1FQlVTWTsKKwkJfQorCisJCXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9DRkMsIENGQ19S RUdJU1RFUlNfQ0FNX0lOSVRfRE9ORSk7CisJCWlmICh2YWwgIT0gMSkgeworCQkJQk5YMlhf RVJSKCJDRkMgQ0FNX0lOSVQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0K KworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfQ0ZDLCBDRkNfUkVHSVNURVJTX0RFQlVHMCwgMCk7 CisKKwkJLyogcmVhZCBOSUcgc3RhdGlzdGljCisJCSAgIHRvIHNlZSBpZiB0aGlzIGlzIG91 ciBmaXJzdCB1cCBzaW5jZSBwb3dlcnVwICovCisjaWZkZWYgQk5YMlhfRE1BRV9SRAorCQli bngyeF9yZWFkX2RtYWUoYnAsCisJCQkoR1JDQkFTRV9OSUcgKyBOSUdfUkVHSVNURVJTX1NU QVQyX0JSQl9PQ1RFVCksIDIpOworCQl2YWwgPSAqYm54Mnhfc3AoYnAsIHdiX2RhdGFbMF0p OworI2Vsc2UKKwkJdmFsID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywgTklHX1JFR0lTVEVS U19TVEFUMl9CUkJfT0NURVQpOworCQlSRUdfUkQoYnAsIEdSQ0JBU0VfTklHLCBOSUdfUkVH SVNURVJTX1NUQVQyX0JSQl9PQ1RFVCArIDQpOworI2VuZGlmCisJCS8qIGRvIGludGVybmFs IG1lbW9yeSBzZWxmIHRlc3QgKi8KKwkJaWYgKHZhbCA9PSAwICYmIGJueDJ4X2ludF9tZW1f dGVzdChicCkpIHsKKwkJCUJOWDJYX0VSUigiaW50ZXJuYWwgbWVtIHNlbGZ0ZXN0IGZhaWxl ZFxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfSAvKiBlbmQgb2YgY29tbW9uIGlu aXQgKi8KKworCS8qIHBlciBwb3J0IGluaXQgKi8KKworCS8qIHRoZSBwaHlzIGFkZHJlc3Mg aXMgc2hpZnRlZCByaWdodCAxMiBiaXRzIGFuZCBoYXMgYW4gYWRkZWQKKwkgICAxPXZhbGlk IGJpdCBhZGRlZCB0byB0aGUgNTNyZCBiaXQKKwkgICB0aGVuIHNpbmNlIHRoaXMgaXMgYSB3 aWRlIHJlZ2lzdGVyKFRNKQorCSAgIHdlIHNwbGl0IGl0IGludG8gdHdvIDMyIGJpdCB3cml0 ZXMKKwkgKi8KKyNkZWZpbmUgT05DSElQX0FERFIxKHgpICAgKCh1MzIpKCh1NjQpeCA+PiAx MiAmIDB4RkZGRkZGRkYpKQorI2RlZmluZSBPTkNISVBfQUREUjIoeCkgICAoKHUzMikoMSA8 PCAyMCB8ICh1NjQpeCA+PiA0NCkpCisjZGVmaW5lIFBYUF9PTkVfSUxUKHgpICAgICgoeCA8 PCAxMCkgfCB4KQorCisJRFAoQk5YMlhfTVNHX01DUCwgInN0YXJ0aW5nIHBlci1mdW5jdGlv biBpbml0IHBvcnQgaXMgJXhcbiIsIGZ1bmMpOworCisJUkVHX1dSKGJwLCBHUkNCQVNFX05J RywKKwkgICAgICAgTklHX1JFR0lTVEVSU19NQVNLX0lOVEVSUlVQVF9QT1JUMCArIGZ1bmMq NCwgMCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1BYUCwgcG9ydCk7CisJYm54 MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1BYUDIsIHBvcnQpOworCisJaWYgKGZ1bmMgPT0g MCkgeworCQkvKiBvZmZzZXQgaXMgMCAqLworI2lmZGVmIFVTRV9ETUFFCisJCXdiX3dyaXRl WzBdID0gT05DSElQX0FERFIxKGJueDJ4X3NwX21hcHBpbmcoYnAsIGNvbnRleHQpKTsKKwkJ d2Jfd3JpdGVbMV0gPSBPTkNISVBfQUREUjIoYm54Mnhfc3BfbWFwcGluZyhicCwgY29udGV4 dCkpOworCQlSRUdfV1JfRE1BRShicCwgR1JDQkFTRV9QWFAyLAorCQkJICAgIFBYUDJfUkVH SVNURVJTX1JRX09OQ0hJUF9BVCwgd2Jfd3JpdGUsIDIpOworI2Vsc2UKKwkJUkVHX1dSX0lO RChicCwgR1JDQkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SUV9PTkNISVBfQVQsCisJCQkg ICBPTkNISVBfQUREUjEoYm54Mnhfc3BfbWFwcGluZyhicCwgY29udGV4dCkpKTsKKwkJUkVH X1dSX0lORChicCwgR1JDQkFTRV9QWFAyLCBQWFAyX1JFR0lTVEVSU19SUV9PTkNISVBfQVQg KyA0LAorCQkJICAgT05DSElQX0FERFIyKGJueDJ4X3NwX21hcHBpbmcoYnAsIGNvbnRleHQp KSk7CisjZW5kaWYKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1BYUDIsCisJCSAgICAgICBQWFAy X1JFR0lTVEVSU19QU1dSUV9DRFUwX0wyUCwgUFhQX09ORV9JTFQoMCkpOworCisjaWZkZWYg QkNNX0lTQ1NJCisJCS8qIG9mZnNldCBpcyAxICovCisJCXdiX3dyaXRlWzBdID0gT05DSElQ X0FERFIxKGJwLT50aW1lcnNfbWFwcGluZyk7CisJCXdiX3dyaXRlWzFdID0gT05DSElQX0FE RFIyKGJwLT50aW1lcnNfbWFwcGluZyk7CisJCVJFR19XUl9ETUFFKGJwLCBHUkNCQVNFX1BY UDIsCisJCQkgICAgUFhQMl9SRUdJU1RFUlNfUlFfT05DSElQX0FUICsgOCwgd2Jfd3JpdGUs IDIpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwKKwkJICAgICAgIFBYUDJfUkVHSVNU RVJTX1BTV1JRX1RNMF9MMlAsIFBYUF9PTkVfSUxUKDEpKTsKKworCQkvKiAzICovCisJCXdi X3dyaXRlWzBdID0gT05DSElQX0FERFIxKGJwLT5xbV9tYXBwaW5nKTsKKwkJd2Jfd3JpdGVb MV0gPSBPTkNISVBfQUREUjIoYnAtPnFtX21hcHBpbmcpOworCQlSRUdfV1JfRE1BRShicCwg R1JDQkFTRV9QWFAyLAorCQkJICAgIFBYUDJfUkVHSVNURVJTX1JRX09OQ0hJUF9BVCArIDIq OCwgd2Jfd3JpdGUsIDIpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwKKwkJICAgICAg IFBYUDJfUkVHSVNURVJTX1BTV1JRX1FNMF9MMlAsIFBYUF9PTkVfSUxUKDIpKTsKKworCQkv KiA0ICovCisJCXdiX3dyaXRlWzBdID0gT05DSElQX0FERFIxKGJwLT50MV9tYXBwaW5nKTsK KwkJd2Jfd3JpdGVbMV0gPSBPTkNISVBfQUREUjIoYnAtPnQxX21hcHBpbmcpOworCQlSRUdf V1JfRE1BRShicCwgR1JDQkFTRV9QWFAyLAorCQkJICAgIFBYUDJfUkVHSVNURVJTX1JRX09O Q0hJUF9BVCArIDMqOCwgd2Jfd3JpdGUsIDIpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQ MiwKKwkJICAgICAgIFBYUDJfUkVHSVNURVJTX1BTV1JRX1NSQzBfTDJQLCBQWFBfT05FX0lM VCgzKSk7CisjZW5kaWYKKworCX0gZWxzZSB7CisJCS8qIHNlY29uZCBmdW5jdGlvbiBhZGRy ZXNzZXMgc3RhcnQgZnJvbSAzODQgKi8KKwkJLyogMzg0ICovCisjaWZkZWYgVVNFX0RNQUUK KwkJd2Jfd3JpdGVbMF0gPSBPTkNISVBfQUREUjEoYm54Mnhfc3BfbWFwcGluZyhicCwgY29u dGV4dCkpOworCQl3Yl93cml0ZVsxXSA9IE9OQ0hJUF9BRERSMihibngyeF9zcF9tYXBwaW5n KGJwLCBjb250ZXh0KSk7CisJCVJFR19XUl9ETUFFKGJwLCBHUkNCQVNFX1BYUDIsCisJCQkg ICAgUFhQMl9SRUdJU1RFUlNfUlFfT05DSElQX0FUICsgMzg0KjgsIHdiX3dyaXRlLCAyKTsK KyNlbHNlCisJCVJFR19XUl9JTkQoYnAsIEdSQ0JBU0VfUFhQMiwKKwkJCSAgIFBYUDJfUkVH SVNURVJTX1JRX09OQ0hJUF9BVCArIDM4NCo4LAorCQkJICAgT05DSElQX0FERFIxKGJueDJ4 X3NwX21hcHBpbmcoYnAsIGNvbnRleHQpKSk7CisJCVJFR19XUl9JTkQoYnAsIEdSQ0JBU0Vf UFhQMiwKKwkJCSAgIFBYUDJfUkVHSVNURVJTX1JRX09OQ0hJUF9BVCArIDM4NCo4ICsgNCwK KwkJCSAgIE9OQ0hJUF9BRERSMihibngyeF9zcF9tYXBwaW5nKGJwLCBjb250ZXh0KSkpOwor I2VuZGlmCisJCVJFR19XUihicCwgR1JDQkFTRV9QWFAyLAorCQkgICAgICAgUFhQMl9SRUdJ U1RFUlNfUFNXUlFfQ0RVMV9MMlAsIFBYUF9PTkVfSUxUKDM4NCkpOworCisjaWZkZWYgQkNN X0lTQ1NJCisJCS8qIDM4NSAqLworCQl3Yl93cml0ZVswXSA9IE9OQ0hJUF9BRERSMShicC0+ dGltZXJzX21hcHBpbmcpOworCQl3Yl93cml0ZVsxXSA9IE9OQ0hJUF9BRERSMihicC0+dGlt ZXJzX21hcHBpbmcpOworCQlSRUdfV1JfRE1BRShicCwgR1JDQkFTRV9QWFAyLAorCQkJICAg IFBYUDJfUkVHSVNURVJTX1JRX09OQ0hJUF9BVCArIDM4NSo4LCB3Yl93cml0ZSwgMik7CisJ CVJFR19XUihicCwgR1JDQkFTRV9QWFAyLAorCQkgICAgICAgUFhQMl9SRUdJU1RFUlNfUFNX UlFfVE0xX0wyUCwgUFhQX09ORV9JTFQoMzg1KSk7CisKKwkJd2Jfd3JpdGVbMF0gPSBPTkNI SVBfQUREUjEoYnAtPnFtX21hcHBpbmcpOworCQl3Yl93cml0ZVsxXSA9IE9OQ0hJUF9BRERS MihicC0+cW1fbWFwcGluZyk7CisJCVJFR19XUl9ETUFFKGJwLCBHUkNCQVNFX1BYUDIsCisJ CQkgICAgUFhQMl9SRUdJU1RFUlNfUlFfT05DSElQX0FUICsgMzg2KjgsIHdiX3dyaXRlLCAy KTsKKwkJUkVHX1dSKGJwLCBHUkNCQVNFX1BYUDIsCisJCSAgICAgICBQWFAyX1JFR0lTVEVS U19QU1dSUV9RTTFfTDJQLCBQWFBfT05FX0lMVCgzODYpKTsKKworCQl3Yl93cml0ZVswXSA9 IE9OQ0hJUF9BRERSMShicC0+dDFfbWFwcGluZyk7CisJCXdiX3dyaXRlWzFdID0gT05DSElQ X0FERFIyKGJwLT50MV9tYXBwaW5nKTsKKwkJUkVHX1dSX0RNQUUoYnAsIEdSQ0JBU0VfUFhQ MiwKKwkJCSAgICBQWFAyX1JFR0lTVEVSU19SUV9PTkNISVBfQVQgKyAzODcqOCwgd2Jfd3Jp dGUsIDIpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfUFhQMiwKKwkJICAgICAgIFBYUDJfUkVH SVNURVJTX1BTV1JRX1NSQzFfTDJQLCBQWFBfT05FX0lMVCgzODcpKTsKKyNlbmRpZgorCX0K KworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9UQ00sIHBvcnQpOworCWJueDJ4X2lu aXRfc3RhZ2UoYnAsIEJMQ05VTV9VQ00sIHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAs IEJMQ05VTV9DQ00sIHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9YQ00s IHBvcnQpOworCisjaWZkZWYgVVNFX0RNQUUKKwl3Yl93cml0ZVswXSA9IDA7CisJd2Jfd3Jp dGVbMV0gPSAwOworI2VuZGlmCisJaWYgKGZ1bmMgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBp IDwgMzI7IGkrKykgeworCQkJUkVHX1dSKGJwLCBHUkNCQVNFX1FNLAorCQkJICAgICAgIFFN X1JFR0lTVEVSU19CQVNFQUREUiArIDQqaSwgMTAyNCAqIDQgKiBpKTsKKyNpZmRlZiBVU0Vf RE1BRQorCQkJUkVHX1dSX0RNQUUoYnAsIEdSQ0JBU0VfUU0sCisJCQkJICAgIFFNX1JFR0lT VEVSU19QVFJUQkwgKyBpKjgsIHdiX3dyaXRlLCAyKTsKKyNlbHNlCisJCQlSRUdfV1JfSU5E KGJwLCBHUkNCQVNFX1FNLAorCQkJCSAgIFFNX1JFR0lTVEVSU19QVFJUQkwgKyBpKjgsIDAp OworCQkJUkVHX1dSX0lORChicCwgR1JDQkFTRV9RTSwKKwkJCQkgICBRTV9SRUdJU1RFUlNf UFRSVEJMICsgaSo4ICsgNCwgMCk7CisjZW5kaWYKKwkJfQorCQlSRUdfV1IoYnAsIEdSQ0JB U0VfUU0sIFFNX1JFR0lTVEVSU19DT05OTlVNXzAsIDEwMjQvMTYgLSAxKTsKKworCX0gZWxz ZSB7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQlSRUdfV1IoYnAsIEdSQ0JB U0VfUU0sCisJCQkgICAgICAgUU1fUkVHSVNURVJTX0JBU0VBRERSICsgNCooMzIgKyBpKSwK KwkJCSAgICAgICAxMDI0ICogNCAqIGkpOworI2lmZGVmIFVTRV9ETUFFCisJCQlSRUdfV1Jf RE1BRShicCwgR1JDQkFTRV9RTSwKKwkJCQkgICAgUU1fUkVHSVNURVJTX1BUUlRCTCArIChp ICsgMzIpKjgsCisJCQkJICAgIHdiX3dyaXRlLCAyKTsKKyNlbHNlCisJCQlSRUdfV1JfSU5E KGJwLCBHUkNCQVNFX1FNLAorCQkJCSAgIFFNX1JFR0lTVEVSU19QVFJUQkwgKyAoaSArIDMy KSo4LCAwKTsKKwkJCVJFR19XUl9JTkQoYnAsIEdSQ0JBU0VfUU0sCisJCQkJICAgUU1fUkVH SVNURVJTX1BUUlRCTCArIChpICsgMzIpKjggKyA0LCAwKTsKKyNlbmRpZgorCQl9CisJCVJF R19XUihicCwgR1JDQkFTRV9RTSwgUU1fUkVHSVNURVJTX0NPTk5OVU1fMSwgMTAyNC8xNiAt IDEpOworCX0KKworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9RTSwgcG9ydCk7CisK KyNpZmRlZiBCQ01fSVNDU0kKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfVElNRVJTLAorCSAgICAg ICBUTV9SRUdJU1RFUlNfTElOMF9TQ0FOX1RJTUUgKyA0KmZ1bmMsIDEwMjQvNjQqMjApOwor CisJUkVHX1dSKGJwLCBHUkNCQVNFX1RJTUVSUywKKwkgICAgICAgVE1fUkVHSVNURVJTX0xJ TjBfTUFYX0FDVElWRV9DSUQgKyA0KmZ1bmMsIDMxKTsKKwlibngyeF9pbml0X3N0YWdlKGJw LCBCTENOVU1fVElNRVJTLCBwb3J0KTsKKyNlbmRpZgorCWJueDJ4X2luaXRfc3RhZ2UoYnAs IEJMQ05VTV9EUSwgcG9ydCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX0JSQjEs IHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9QUlMsIHBvcnQpOworCWJu eDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9UU0RNLCBwb3J0KTsKKwlibngyeF9pbml0X3N0 YWdlKGJwLCBCTENOVU1fQ1NETSwgcG9ydCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxD TlVNX1VTRE0sIHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9YU0RNLCBw b3J0KTsKKwlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fVFNFTSwgcG9ydCk7CisJYm54 MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1VTRU0sIHBvcnQpOworCWJueDJ4X2luaXRfc3Rh Z2UoYnAsIEJMQ05VTV9DU0VNLCBwb3J0KTsKKwlibngyeF9pbml0X3N0YWdlKGJwLCBCTENO VU1fWFNFTSwgcG9ydCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1VQQiwgcG9y dCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX1hQQiwgcG9ydCk7CisJYm54Mnhf aW5pdF9zdGFnZShicCwgQkxDTlVNX1BCRiwgcG9ydCk7CisKKwkvKiBjb25maWd1cmUgUEJG IHRvIHdvcmsgd2l0aG91dCBQQVVTRSBtdHUgOTAwMCAqLworCVJFR19XUihicCwgR1JDQkFT RV9QQkYsIFBCRl9SRUdJU1RFUlNfUDBfUEFVU0VfRU5BQkxFICsgNCpmdW5jLCAwKTsKKwor CS8qIHVwZGF0ZSB0aHJlc2hvbGQgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfUEJGLAorCSAg ICAgICBQQkZfUkVHSVNURVJTX1AwX0FSQl9USFJTSCArIDQqZnVuYywgKDkwNDAvMTYpKTsK KwkvKiB1cGRhdGUgaW5pdCBjcmVkaXQgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfUEJGLAor CSAgICAgICBQQkZfUkVHSVNURVJTX1AwX0lOSVRfQ1JEICsgNCpmdW5jLCAoOTA0MC8xNikg KyA1NTMgLSAyMik7CisKKwkvKiBwcm9iZSBjaGFuZ2VzICovCisJUkVHX1dSKGJwLCBHUkNC QVNFX1BCRiwgUEJGX1JFR0lTVEVSU19JTklUX1AwICsgNCpmdW5jLCAxKTsKKwltc2xlZXAo NSk7CisJUkVHX1dSKGJwLCBHUkNCQVNFX1BCRiwgUEJGX1JFR0lTVEVSU19JTklUX1AwICsg NCpmdW5jLCAwKTsKKworI2lmZGVmIEJDTV9JU0NTSQorCS8qIHRlbGwgdGhlIHNlYXJjaGVy IHdoZXJlIHRoZSBUMiB0YWJsZSBpcyAqLworCVJFR19XUihicCwgR1JDQkFTRV9TUkNILAor CSAgICAgICBTUkNfUkVHSVNURVJTX0NPVU5URlJFRTAgKyA0KmZ1bmMsIDE2KjEwMjQvNjQp OworCisJd2Jfd3JpdGVbMF0gPSBVNjRfTE8oYnAtPnQyX21hcHBpbmcpOworCXdiX3dyaXRl WzFdID0gVTY0X0hJKGJwLT50Ml9tYXBwaW5nKTsKKwlSRUdfV1JfRE1BRShicCwgR1JDQkFT RV9TUkNILAorCQkgICAgU1JDX1JFR0lTVEVSU19GSVJTVEZSRUUwICsgNCpmdW5jLCB3Yl93 cml0ZSwgMik7CisJd2Jfd3JpdGVbMF0gPSBVNjRfTE8oKHU2NClicC0+dDJfbWFwcGluZyAr IDE2KjEwMjQgLSA2NCk7CisJd2Jfd3JpdGVbMV0gPSBVNjRfSEkoKHU2NClicC0+dDJfbWFw cGluZyArIDE2KjEwMjQgLSA2NCk7CisJUkVHX1dSX0RNQUUoYnAsIEdSQ0JBU0VfU1JDSCwK KwkJICAgIFNSQ19SRUdJU1RFUlNfTEFTVEZSRUUwICsgNCpmdW5jLCB3Yl93cml0ZSwgMik7 CisKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfU1JDSCwKKwkgICAgICAgU1JDX1JFR0lTVEVSU19O VU1CRVJfSEFTSF9CSVRTMCArIDQqZnVuYywgMTApOworCWJueDJ4X2luaXRfc3RhZ2UoYnAs IEJMQ05VTV9TUkNILCBwb3J0KTsKKyNlbmRpZgorCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJM Q05VTV9DRFUsIHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9DRkMsIHBv cnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJMQ05VTV9IQywgcG9ydCk7CisJYm54Mnhf aW5pdF9zdGFnZShicCwgQkxDTlVNX01JU0NfQUVVLCBwb3J0KTsKKwlibngyeF9pbml0X3N0 YWdlKGJwLCBCTENOVU1fUFhQQ1MsIHBvcnQpOworCWJueDJ4X2luaXRfc3RhZ2UoYnAsIEJM Q05VTV9FTUFDMCwgcG9ydCk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX0VNQUMx LCBwb3J0KTsKKwlibngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fREJVLCBwb3J0KTsKKwli bngyeF9pbml0X3N0YWdlKGJwLCBCTENOVU1fREJHLCBwb3J0KTsKKwlibngyeF9pbml0X3N0 YWdlKGJwLCBCTENOVU1fTklHLCBwb3J0KTsKKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTklHLAor CSAgICAgICBOSUdfUkVHSVNURVJTX1hHWFNfU0VSREVTMF9NT0RFX1NFTCArIDQqZnVuYywg MSk7CisJYm54MnhfaW5pdF9zdGFnZShicCwgQkxDTlVNX01DUCwgcG9ydCk7CisJYm54Mnhf aW5pdF9zdGFnZShicCwgQkxDTlVNX0RNQUUsIHBvcnQpOworCisJYm54MnhfbGlua19yZXNl dChicCk7CisKKwkvKiBSZXNldCBwY2lleCBlcnJvcnMgZm9yIGRlYnVnICovCisJUkVHX1dS KGJwLCBHUkNCQVNFX1BYUENTLCAweDIxMTQsIDB4ZmZmZmZmZmYpOworCVJFR19XUihicCwg R1JDQkFTRV9QWFBDUywgMHgyMTIwLCAweGZmZmZmZmZmKTsKKwlSRUdfV1IoYnAsIEdSQ0JB U0VfUFhQQ1MsIDB4MjgxNCwgMHhmZmZmZmZmZik7CisKKwlibngyeF9ndW56aXBfZW5kKGJw KTsKKworCWlmICghbm9tY3ApIHsKKwkJcG9ydCA9IGJwLT5wb3J0OworCisJCWJwLT5md19k cnZfcHVsc2Vfd3Jfc2VxID0KKwkJCQkoU0hNRU1fUkQoYnAsIGRydl9md19tYltwb3J0XS5k cnZfcHVsc2VfbWIpICYKKwkJCQkgRFJWX1BVTFNFX1NFUV9NQVNLKTsKKwkJYnAtPmZ3X21i ID0gU0hNRU1fUkQoYnAsIGRydl9md19tYltwb3J0XS5md19tYl9wYXJhbSk7CisJCURQKEJO WDJYX01TR19NQ1AsICJkcnZfcHVsc2UgMHgleCAgZndfbWIgMHgleFxuIiwKKwkJICAgYnAt PmZ3X2Rydl9wdWxzZV93cl9zZXEsIGJwLT5md19tYik7CisJfSBlbHNlIHsKKwkJYnAtPmZ3 X21iID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZndf ZHVtcChzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiBtYXJrLCBvZmZzZXQ7CisJdTMyIGRh dGFbOV07CisJaW50IHdvcmQ7CisKKwltYXJrID0gUkVHX1JEKGJwLCBHUkNCQVNFX01DUCwg TUNQX1JFR19NQ1BSX1NDUkFUQ0ggKyAweGYxMDQpOworCXByaW50ayhLRVJOX0VSUiBQRlgg ImJlZ2luIGZ3IGR1bXAgKG1hcmsgJXgpXG4iLCBtYXJrKTsKKworCWZvciAob2Zmc2V0ID0g MHhGMTA4OyBvZmZzZXQgPD0gMHhGOTAwOyBvZmZzZXQgKz0gMHg4KjQpIHsKKwkJZm9yICh3 b3JkID0gMDsgd29yZCA8IDg7IHdvcmQrKykgeworCQkJZGF0YVt3b3JkXSA9IGh0b25sKFJF R19SRChicCwgR1JDQkFTRV9NQ1AsCisJCQkJCQkgIE1DUF9SRUdfTUNQUl9TQ1JBVENIICsK KwkJCQkJCSAgb2Zmc2V0ICsgNCp3b3JkKSk7CisJCX0KKwkJZGF0YVs4XSA9IDB4MDsKKwkJ aWYgKG9mZnNldCArIDB4MDgwMDAwMDAgPiBtYXJrKSB7CisJCQlwcmludGsoS0VSTl9FUlIg UEZYICJcbioqKioqXG4iKTsKKwkJCW1hcmsgPSBVSU5UX01BWDsKKwkJfQorCQlwcmludGso S0VSTl9FUlIgUEZYICIlcyIsIChjaGFyICopZGF0YSk7CisJfQorCXByaW50aygiXG4iIEtF Uk5fRVJSIFBGWCAiZW5kIG9mIGZ3IGR1bXBcbiIpOworfQorCisvKiBzZW5kIHRoZSBNQ1Ag YSByZXF1ZXN0LCBibG9jayB1bnRpbGwgdGhlcmUgaXMgYSByZXBseSAqLworc3RhdGljIHUz MiBibngyeF9md19jb21tYW5kKHN0cnVjdCBibngyeCAqYnAsIHUzMiBjb21tYW5kKQorewor CXUzMiByYyA9IDA7CisJdTMyIHNlcSA9ICsrYnAtPmZ3X3NlcTsKKwlpbnQgcG9ydCA9IGJw LT5wb3J0OworCisJU0hNRU1fV1IoYnAsIGRydl9md19tYltwb3J0XS5kcnZfbWJfaGVhZGVy LCBjb21tYW5kfHNlcSk7CisJRFAoQk5YMlhfTVNHX01DUCwgIndyb3RlIGNvbW1hbmQgKCV4 KSB0byBGVyBNQlxuIiwgY29tbWFuZHxzZXEpOworCisJLyogbGV0IHRoZSBGVyBkbyBpdCdz IG1hZ2ljIC4uLiAqLworCW1zbGVlcCgxMDApOyAvKiBUQkQgKi8KKworCWlmIChDSElQX1JF Vl9JU19TTE9XKGJwKSkgeworCQltc2xlZXAoOTAwKTsKKwl9CisKKwlyYyA9IFNITUVNX1JE KGJwLCBkcnZfZndfbWJbcG9ydF0uZndfbWJfaGVhZGVyKTsKKworCURQKEJOWDJYX01TR19N Q1AsICJyZWFkICgleCkgc2VxIGlzICgleCkgZnJvbSBGVyBNQlxuIiwgcmMsIHNlcSk7CisK KwkvKiBpcyB0aGlzIGEgcmVwbHkgdG8gb3VyIGNvbW1hbmQ/ICovCisJaWYgKHNlcSA9PSAo cmMgJiBGV19NU0dfU0VRX05VTUJFUl9NQVNLKSkgeworCQlyYyAmPSBGV19NU0dfQ09ERV9N QVNLOworCX0gZWxzZSB7CisJCS8qIEZXIEJVRyEgKi8KKwkJQk5YMlhfRVJSKCJGVyBmYWls ZWQgdG8gcmVzcG9uZCFcbiIpOworCQlibngyeF9md19kdW1wKGJwKTsKKwkJcmMgPSAwOwor CX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfbWVtKHN0cnVj dCBibngyeCAqYnApCit7CisKKyNkZWZpbmUgQk5YMlhfUENJX0ZSRUUoeCwgeSwgc2l6ZSkg XAorCWRvIHsgXAorCQlpZiAoeCkgeyBcCisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJwLT5w ZGV2LCBzaXplLCB4LCB5KTsgXAorCQkJeCA9IE5VTEw7IFwKKwkJCXkgPSAwOyBcCisJCX0g XAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQk5YMlhfS0ZSRUUoeCkgXAorCWRvIHsgXAor CQlpZiAoeCkgeyBcCisJCQl2ZnJlZSh4KTsgXAorCQkJeCA9IE5VTEw7IFwKKwkJfSBcCisJ fSB3aGlsZSAoMCkKKworCWludCBpOworCisJLyogZmFzdHBhdGggKi8KKwlmb3JfZWFjaF9x dWV1ZShicCwgaSkgeworCisJCS8qIFN0YXR1cyBibG9ja3MgKi8KKwkJQk5YMlhfUENJX0ZS RUUoYm54MnhfZnAoYnAsIGksIHN0YXR1c19ibGspLAorCQkJICAgICAgIGJueDJ4X2ZwKGJw LCBpLCBzdGF0dXNfYmxrX21hcHBpbmcpLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaG9z dF9zdGF0dXNfYmxvY2spICsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV0aF90eF9kYl9k YXRhKSk7CisKKwkJLyogZmFzdCBwYXRoIHJpbmdzOiB0eF9idWYgdHhfZGVzYyByeF9idWYg cnhfZGVzYyByeF9jb21wICovCisJCUJOWDJYX0tGUkVFKGJueDJ4X2ZwKGJwLCBpLCB0eF9i dWZfcmluZykpOworCQlCTlgyWF9QQ0lfRlJFRShibngyeF9mcChicCwgaSwgdHhfZGVzY19y aW5nKSwKKwkJCSAgICAgICBibngyeF9mcChicCwgaSwgdHhfZGVzY19tYXBwaW5nKSwKKwkJ CSAgICAgICBzaXplb2Yoc3RydWN0IGV0aF90eF9iZCkgKiBOVU1fVFhfQkQpOworCisJCUJO WDJYX0tGUkVFKGJueDJ4X2ZwKGJwLCBpLCByeF9idWZfcmluZykpOworCQlCTlgyWF9QQ0lf RlJFRShibngyeF9mcChicCwgaSwgcnhfZGVzY19yaW5nKSwKKwkJCSAgICAgICBibngyeF9m cChicCwgaSwgcnhfZGVzY19tYXBwaW5nKSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV0 aF9yeF9iZCkgKiBOVU1fUlhfQkQpOworCisJCUJOWDJYX1BDSV9GUkVFKGJueDJ4X2ZwKGJw LCBpLCByeF9jb21wX3JpbmcpLAorCQkJICAgICAgIGJueDJ4X2ZwKGJwLCBpLCByeF9jb21w X21hcHBpbmcpLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXRoX3J4X2JkKSAqIE5VTV9S WF9CRCk7CisJfQorCisJLyogQk5YMlhfS0ZSRUUoYnAtPmZwKTsgKi8KKwkvKiBlbmQgb2Yg ZmFzdHBhdGggKi8KKworCUJOWDJYX1BDSV9GUkVFKGJwLT5kZWZfc3RhdHVzX2JsaywgYnAt PmRlZl9zdGF0dXNfYmxrX21hcHBpbmcsCisJCSAgICAgICAoc2l6ZW9mKHN0cnVjdCBob3N0 X2RlZl9zdGF0dXNfYmxvY2spKSk7CisKKwlCTlgyWF9QQ0lfRlJFRShicC0+c2xvd3BhdGgs IGJwLT5zbG93cGF0aF9tYXBwaW5nLAorCQkgICAgICAgKHNpemVvZihzdHJ1Y3QgYm54Mnhf c2xvd3BhdGgpKSk7CisKKyNpZmRlZiBCQ01fSVNDU0kKKwlCTlgyWF9QQ0lfRlJFRShicC0+ dDEsIGJwLT50MV9tYXBwaW5nLCA2NCoxMDI0KTsKKwlCTlgyWF9QQ0lfRlJFRShicC0+dDIs IGJwLT50Ml9tYXBwaW5nLCAxNioxMDI0KTsKKwlCTlgyWF9QQ0lfRlJFRShicC0+dGltZXJz LCBicC0+dGltZXJzX21hcHBpbmcsIDgqMTAyNCk7CisJQk5YMlhfUENJX0ZSRUUoYnAtPnFt LCBicC0+cW1fbWFwcGluZywgMTI4KjEwMjQpOworI2VuZGlmCisJQk5YMlhfUENJX0ZSRUUo YnAtPnNwcSwgYnAtPnNwcV9tYXBwaW5nLCBQQUdFX1NJWkUpOworCisjdW5kZWYgQk5YMlhf UENJX0ZSRUUKKyN1bmRlZiBCTlgyWF9LRlJFRQorfQorCitzdGF0aWMgaW50IGJueDJ4X2Fs bG9jX21lbShzdHJ1Y3QgYm54MnggKmJwKQoreworCisjZGVmaW5lIEJOWDJYX1BDSV9BTExP Qyh4LCB5LCBzaXplKSBcCisJZG8geyBcCisJCXggPSBwY2lfYWxsb2NfY29uc2lzdGVudChi cC0+cGRldiwgc2l6ZSwgeSk7IFwKKwkJaWYgKHggPT0gTlVMTCkgXAorCQkJZ290byBhbGxv Y19tZW1fZXJyOyBcCisJCW1lbXNldCh4LCAwLCBzaXplKTsgXAorCX0gd2hpbGUgKDApCisK KyNkZWZpbmUgQk5YMlhfQUxMT0MoeCwgc2l6ZSkgXAorCWRvIHsgXAorCQl4ID0gdm1hbGxv YyhzaXplKTsgXAorCQlpZiAoeCA9PSBOVUxMKSBcCisJCQlnb3RvIGFsbG9jX21lbV9lcnI7 IFwKKwkJbWVtc2V0KHgsIDAsIHNpemUpOyBcCisJfSB3aGlsZSAoMCkKKworCWludCBpOwor CisJLyogZmFzdHBhdGggKi8KKy8qIEJOWDJYX0FMTE9DKGJwLT5mcCwgc2l6ZW9mKHN0cnVj dCBibngyeF9mYXN0cGF0aCkgKiBicC0+bnVtX3F1ZXVlcyk7ICovCisKKwlmb3JfZWFjaF9x dWV1ZShicCwgaSkgeworCQlibngyeF9mcChicCwgaSwgYnApID0gYnA7CisKKwkJLyogU3Rh dHVzIGJsb2NrcyAqLworCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHN0YXR1 c19ibGspLAorCQkJCSZibngyeF9mcChicCwgaSwgc3RhdHVzX2Jsa19tYXBwaW5nKSwKKwkJ CQlzaXplb2Yoc3RydWN0IGhvc3Rfc3RhdHVzX2Jsb2NrKSArCisJCQkJc2l6ZW9mKHN0cnVj dCBldGhfdHhfZGJfZGF0YSkpOworCisJCWJueDJ4X2ZwKGJwLCBpLCBod190eF9wcm9kcykg PQorCQkJCSh2b2lkICopKGJueDJ4X2ZwKGJwLCBpLCBzdGF0dXNfYmxrKSArIDEpOworCisJ CWJueDJ4X2ZwKGJwLCBpLCB0eF9wcm9kc19tYXBwaW5nKSA9CisJCQkJYm54MnhfZnAoYnAs IGksIHN0YXR1c19ibGtfbWFwcGluZykgKworCQkJCXNpemVvZihzdHJ1Y3QgaG9zdF9zdGF0 dXNfYmxvY2spOworCisJCS8qIGZhc3QgcGF0aCByaW5nczogdHhfYnVmIHR4X2Rlc2Mgcnhf YnVmIHJ4X2Rlc2MgcnhfY29tcCAqLworCQlCTlgyWF9BTExPQyhibngyeF9mcChicCwgaSwg dHhfYnVmX3JpbmcpLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3dfdHhfYmQpICogTlVNX1RYX0JE KTsKKwkJQk5YMlhfUENJX0FMTE9DKGJueDJ4X2ZwKGJwLCBpLCB0eF9kZXNjX3JpbmcpLAor CQkJCSZibngyeF9mcChicCwgaSwgdHhfZGVzY19tYXBwaW5nKSwKKwkJCQlzaXplb2Yoc3Ry dWN0IGV0aF90eF9iZCkgKiBOVU1fVFhfQkQpOworCisJCUJOWDJYX0FMTE9DKGJueDJ4X2Zw KGJwLCBpLCByeF9idWZfcmluZyksCisJCQkJc2l6ZW9mKHN0cnVjdCBzd19yeF9iZCkgKiBO VU1fUlhfQkQpOworCQlCTlgyWF9QQ0lfQUxMT0MoYm54MnhfZnAoYnAsIGksIHJ4X2Rlc2Nf cmluZyksCisJCQkJJmJueDJ4X2ZwKGJwLCBpLCByeF9kZXNjX21hcHBpbmcpLAorCQkJCXNp emVvZihzdHJ1Y3QgZXRoX3J4X2JkKSAqIE5VTV9SWF9CRCk7CisKKwkJQk5YMlhfUENJX0FM TE9DKGJueDJ4X2ZwKGJwLCBpLCByeF9jb21wX3JpbmcpLAorCQkJCSZibngyeF9mcChicCwg aSwgcnhfY29tcF9tYXBwaW5nKSwKKwkJCQlzaXplb2Yoc3RydWN0IGV0aF9yeF9iZCkgKiBO VU1fUlhfQkQpOworCX0KKwkvKiBlbmQgb2YgZmFzdHBhdGggKi8KKworCUJOWDJYX1BDSV9B TExPQyhicC0+ZGVmX3N0YXR1c19ibGssICZicC0+ZGVmX3N0YXR1c19ibGtfbWFwcGluZywK KwkJCXNpemVvZihzdHJ1Y3QgaG9zdF9kZWZfc3RhdHVzX2Jsb2NrKSk7CisKKwlCTlgyWF9Q Q0lfQUxMT0MoYnAtPnNsb3dwYXRoLCAmYnAtPnNsb3dwYXRoX21hcHBpbmcsCisJCQlzaXpl b2Yoc3RydWN0IGJueDJ4X3Nsb3dwYXRoKSk7CisKKyNpZmRlZiBCQ01fSVNDU0kKKwlCTlgy WF9QQ0lfQUxMT0MoYnAtPnQxLCAmYnAtPnQxX21hcHBpbmcsIDY0KjEwMjQpOworCisJLyog SW5pdGlhbGl6ZSBUMSAqLworCWZvciAoaSA9IDA7IGkgPCA2NCoxMDI0OyBpICs9IDY0KSB7 CisJCSoodTY0ICopKChjaGFyICopYnAtPnQxICsgaSArIDU2KSA9IDB4MFVMOworCQkqKHU2 NCAqKSgoY2hhciAqKWJwLT50MSArIGkgKyAzKSA9IDB4MFVMOworCX0KKworCS8qIGFsbG9j YXRlIHNlYXJjaGVyIFQyIHRhYmxlCisJICAgd2UgYWxsb2NhdGUgMS80IG9mIGFsbG9jIG51 bSBmb3IgVDIKKwkgICh3aGljaCBpcyBub3QgZW50ZXJlZCBpbnRvIHRoZSBJTFQpICovCisJ Qk5YMlhfUENJX0FMTE9DKGJwLT50MiwgJmJwLT50Ml9tYXBwaW5nLCAxNioxMDI0KTsKKwor CS8qIEluaXRpYWxpemUgVDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTYqMTAyNDsgaSArPSA2 NCkgeworCQkqKHU2NCAqKSgoY2hhciAqKWJwLT50MiArIGkgKyA1NikgPSBicC0+dDJfbWFw cGluZyArIGkgKyA2NDsKKwl9CisKKwkvKiBub3cgc2l4dXAgdGhlIGxhc3QgbGluZSBpbiB0 aGUgYmxvY2sgdG8gcG9pbnQgdG8gdGhlIG5leHQgYmxvY2sgKi8KKwkqKHU2NCAqKSgoY2hh ciAqKWJwLT50MiArIDEwMjQqMTYtOCkgPSBicC0+dDJfbWFwcGluZzsKKworCS8qIFRpbWVy IGJsb2NrIGFycmF5IChNQVhfQ09OTio4KSBwaHlzIHVuY2FjaGVkIGZvciBub3cgMTAyNCBj b25ucyAqLworCUJOWDJYX1BDSV9BTExPQyhicC0+dGltZXJzLCAmYnAtPnRpbWVyc19tYXBw aW5nLCA4KjEwMjQpOworCisJLyogUU0gcXVldWVzICgxMjgqTUFYX0NPTk4pICovCisJQk5Y MlhfUENJX0FMTE9DKGJwLT5xbSwgJmJwLT5xbV9tYXBwaW5nLCAxMjgqMTAyNCk7CisjZW5k aWYKKworCS8qIFNsb3cgcGF0aCByaW5nICovCisJQk5YMlhfUENJX0FMTE9DKGJwLT5zcHEs ICZicC0+c3BxX21hcHBpbmcsIFBBR0VfU0laRSk7CisKKwlyZXR1cm4gMDsKKworYWxsb2Nf bWVtX2VycjoKKwlibngyeF9mcmVlX21lbShicCk7CisJcmV0dXJuIC1FTk9NRU07CisKKyN1 bmRlZiBCTlgyWF9QQ0lfQUxMT0MKKyN1bmRlZiBCTlgyWF9BTExPQworfQorCitzdGF0aWMg dm9pZCBibngyeF9mcmVlX3R4X3NrYnMoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaTsK KworCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCXN0cnVjdCBibngyeF9mYXN0cGF0aCAq ZnAgPSAmYnAtPmZwW2ldOworCisJCXUxNiBiZF9jb25zID0gZnAtPnR4X2JkX2NvbnM7CisJ CXUxNiBzd19wcm9kID0gZnAtPnR4X3BrdF9wcm9kOworCQl1MTYgc3dfY29ucyA9IGZwLT50 eF9wa3RfY29uczsKKworCQlCVUdfVFJBUChmcC0+dHhfYnVmX3JpbmcgIT0gTlVMTCk7CisK KwkJd2hpbGUgKHN3X2NvbnMgIT0gc3dfcHJvZCkgeworCQkJYmRfY29ucyA9IGJueDJ4X2Zy ZWVfdHhfcGt0KGJwLCBmcCwgVFhfQkQoc3dfY29ucykpOworCQkJc3dfY29ucysrOworCQl9 CisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX3J4X3NrYnMoc3RydWN0IGJueDJ4 ICpicCkKK3sKKwlpbnQgaSwgajsKKworCWZvcl9lYWNoX3F1ZXVlKGJwLCBqKSB7CisJCXN0 cnVjdCBibngyeF9mYXN0cGF0aCAqZnAgPSAmYnAtPmZwW2pdOworCisJCUJVR19UUkFQKGZw LT5yeF9idWZfcmluZyAhPSBOVUxMKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JE OyBpKyspIHsKKwkJCXN0cnVjdCBzd19yeF9iZCAqcnhfYnVmID0gJmZwLT5yeF9idWZfcmlu Z1tpXTsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSByeF9idWYtPnNrYjsKKworCQkJaWYg KHNrYiA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKGJw LT5wZGV2LAorCQkJCQkgcGNpX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKKwkJCQkJ IGJwLT5yeF9idWZfdXNlX3NpemUsCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJ CQlyeF9idWYtPnNrYiA9IE5VTEw7CisKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJfQor CX0KK30KKworc3RhdGljIHZvaWQgYm54MnhfZnJlZV9za2JzKHN0cnVjdCBibngyeCAqYnAp Cit7CisJYm54MnhfZnJlZV90eF9za2JzKGJwKTsKKwlibngyeF9mcmVlX3J4X3NrYnMoYnAp OworfQorCitzdGF0aWMgdm9pZCBibngyeF9mcmVlX2lycShzdHJ1Y3QgYm54MnggKmJwKQor eworCWludCBpOworCisJaWYgKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykgeworCisJ CWZyZWVfaXJxKGJwLT5tc2l4X3RhYmxlWzBdLnZlY3RvciwgYnAtPmRldik7CisJCURQKE5F VElGX01TR19JRkRPV04sICJybGVhc2VkIHNwIGlycSAoJWQpXG4iLAorCQkgICBicC0+bXNp eF90YWJsZVswXS52ZWN0b3IpOworCisJCWZvcl9lYWNoX3F1ZXVlKGJwLCBpKSB7CisJCQlE UChORVRJRl9NU0dfSUZET1dOLAorCQkJICAgImFib3V0IHRvIHJsZWFzZSBmcCAjJWQtPiVk IGlycSAgc3RhdGUoJXgpXG4iLCBpLAorCQkJICAgYnAtPm1zaXhfdGFibGVbaSArIDFdLnZl Y3RvciwKKwkJCSAgIGJueDJ4X2ZwKGJwLCBpLCBzdGF0ZSkpOworCisJCQlpZiAoYm54Mnhf ZnAoYnAsIGksIHN0YXRlKSAhPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQpIHsKKwkJCQlmcmVl X2lycShicC0+bXNpeF90YWJsZVtpICsgMV0udmVjdG9yLAorCQkJCQkgJmJwLT5mcFtpXSk7 CisJCQkJYm54MnhfZnAoYnAsIGksIHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX0NMT1NFRDsK KworCQkJfSBlbHNlIHsKKwkJCQlEUChORVRJRl9NU0dfSUZET1dOLCAiaXJxIG5vdCBmcmVl ZFxuIik7CisJCQl9CisJCX0KKwkJcGNpX2Rpc2FibGVfbXNpeChicC0+cGRldik7CisJCWJw LT5mbGFncyAmPSB+VVNJTkdfTVNJWF9GTEFHOworCisJfSBlbHNlIHsKKwkJZnJlZV9pcnEo YnAtPnBkZXYtPmlycSwgYnAtPmRldik7CisJfQorfQorCitzdGF0aWMgaW50IGJueDJ4X3Jl cV9pcnEoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgaSwgcmM7CisKKwlpZiAoIXVzZV9p bnRhKSB7CisJCWJwLT5tc2l4X3RhYmxlWzBdLmVudHJ5ID0gMDsKKwkJZm9yX2VhY2hfcXVl dWUoYnAsIGkpIHsKKwkJCWJwLT5tc2l4X3RhYmxlW2kgKyAxXS5lbnRyeSA9IGkgKyAxOwor CQl9CisKKwkJaWYgKChyYyA9IHBjaV9lbmFibGVfbXNpeChicC0+cGRldiwgJmJwLT5tc2l4 X3RhYmxlWzBdLAorCQkJCQkgIGJwLT5udW1fcXVldWVzICsgMSkpID09IDApIHsKKworCQkJ YnAtPmZsYWdzIHw9IFVTSU5HX01TSVhfRkxBRzsKKworCQkJRFAoTkVUSUZfTVNHX0lGVVAs ICJhYm91dCB0byByZXF1ZXN0IHNwIGlycVxuIik7CisKKwkJCXJjID0gcmVxdWVzdF9pcnEo YnAtPm1zaXhfdGFibGVbMF0udmVjdG9yLAorCQkJCQkgYm54MnhfbXNpeF9zcF9pbnQsIDAs CisJCQkJCSBicC0+ZGV2LT5uYW1lLCBicC0+ZGV2KTsKKwkJCURQKE5FVElGX01TR19JRlVQ LCAicmV0dXJuZWQgJWRcbiIsIHJjKTsKKwkJCWlmIChyYykgeworCQkJCXJldHVybiAtMTsK KwkJCX0KKworCQkJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJCQlEUChORVRJRl9NU0df SUZVUCwKKwkJCQkgICAiYWJvdXQgdG8gcmVxdWVzdCBmcCBpcnEjJWRcbiIsIGkpOworCisJ CQkJcmMgPSByZXF1ZXN0X2lycShicC0+bXNpeF90YWJsZVtpICsgMV0udmVjdG9yLAorCQkJ CQkJIGJueDJ4X21zaXhfZnBfaW50LCAwLAorCQkJCQkJIGJwLT5kZXYtPm5hbWUsICZicC0+ ZnBbaV0pOworCQkJCURQKE5FVElGX01TR19JRlVQLCAicmV0dXJuZWQgJWRcbiIsIHJjKTsK KwkJCQlpZiAocmMpIHsKKwkJCQkJZ290byBvdXRfaXJxOworCQkJCX0KKwkJCQlibngyeF9m cChicCwgaSwgc3RhdGUpID0gQk5YMlhfRlBfU1RBVEVfSVJROworCQkJfQorCQl9CisJfQor CWlmICghKGJwLT5mbGFncyAmIFVTSU5HX01TSVhfRkxBRykpIHsKKwkJcmMgPSByZXF1ZXN0 X2lycShicC0+cGRldi0+aXJxLCBibngyeF9pbnRlcnJ1cHQsCisJCQkJIElSUUZfU0hBUkVE LCBicC0+ZGV2LT5uYW1lLCBicC0+ZGV2KTsKKwkJaWYgKHJjKSB7CisJCQlyZXR1cm4gLTE7 CisJCX0KKwkJYm54MnhfZnAoYnAsIDAsIHN0YXRlKSA9IEJOWDJYX0ZQX1NUQVRFX0lSUTsK Kwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2lycToKKwlpZiAoYnAtPmZsYWdzICYgVVNJTkdf TVNJWF9GTEFHKSB7CisKKwkJZm9yX2VhY2hfcXVldWUoYnAsIGkpIHsKKwkJCURQKE5FVElG X01TR19JRlVQLAorCQkJICAgImZhaWxlZCB0byBsb2FkLiBhYm91dCB0byBybGVhc2UgaXJx IyVkXG4iLCBpKTsKKworCQkJaWYgKGJueDJ4X2ZwKGJwLCBpLCBzdGF0ZSkgIT0gQk5YMlhf RlBfU1RBVEVfQ0xPU0VEKSB7CisJCQkJZnJlZV9pcnEoYnAtPm1zaXhfdGFibGVbaSArIDFd LnZlY3RvciwKKwkJCQkJICZicC0+ZnBbaV0pOworCQkJCWJueDJ4X2ZwKGJwLCBpLCBzdGF0 ZSkgPSBCTlgyWF9GUF9TVEFURV9DTE9TRUQ7CisJCQkJRFAoTkVUSUZfTVNHX0lGVVAsICJy bGVhc2VkIGlycSMlZFxuIiwgaSk7CisJCQl9CisJCX0KKwkJZnJlZV9pcnEoYnAtPm1zaXhf dGFibGVbMF0udmVjdG9yLCBicC0+ZGV2KTsKKwkJcGNpX2Rpc2FibGVfbXNpeChicC0+cGRl dik7CisJCWJwLT5mbGFncyAmPSB+VVNJTkdfTVNJWF9GTEFHOworCisJfSBlbHNlIHsKKwkJ ZnJlZV9pcnEoYnAtPnBkZXYtPmlycSwgYnAtPmRldik7CisJfQorCisJcmV0dXJuIC0xOwor fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJbml0IHNlcnZpY2UgZnVuY3Rpb25z CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBibngyeF9zZXRfbWFj X2FkZHIoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgbWFjX2NvbmZpZ3VyYXRpb25f Y21kICpjb25maWcgPSBibngyeF9zcChicCwgbWFjX2NvbmZpZyk7CisKKwkvKiBDQU0gYWxs b2NhdGlvbgorCSAqIHVuaWNhc3RzIDAtMzE6cG9ydDAgMzItNjM6cG9ydDEKKwkgKiBtdWx0 aWNhc3QgNjQtMTI3OnBvcnQwIDEyOC0xOTE6cG9ydDEKKwkgKi8KKwljb25maWctPmhkci5s ZW5ndGhfNmIgPSAyOworCWNvbmZpZy0+aGRyLm9mZnNldCA9IGJwLT5wb3J0ID8gMzEgOiAw OworCWNvbmZpZy0+aGRyLnJlc2VydmVkMCA9IDA7CisJY29uZmlnLT5oZHIucmVzZXJ2ZWQx ID0gMDsKKworCS8qIHByaW1hcnkgTUFDICovCisJY29uZmlnLT5jb25maWdfdGFibGVbMF0u Y2FtX2VudHJ5Lm1zYl9tYWNfYWRkciA9CisJCQkJYmUxNl90b19jcHUoKih1MTYgKikmYnAt PmRldi0+ZGV2X2FkZHJbMF0pOworCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzBdLmNhbV9lbnRy eS5taWRkbGVfbWFjX2FkZHIgPQorCQkJCWJlMTZfdG9fY3B1KCoodTE2ICopJmJwLT5kZXYt PmRldl9hZGRyWzJdKTsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS5jYW1fZW50cnkubHNi X21hY19hZGRyID0KKwkJCQliZTE2X3RvX2NwdSgqKHUxNiAqKSZicC0+ZGV2LT5kZXZfYWRk cls0XSk7CisJY29uZmlnLT5jb25maWdfdGFibGVbMF0uY2FtX2VudHJ5LmZsYWdzID0gYnAt PnBvcnQ7CisJY29uZmlnLT5jb25maWdfdGFibGVbMF0udGFyZ2V0X3RhYmxlX2VudHJ5LmZs YWdzID0gMDsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS50YXJnZXRfdGFibGVfZW50cnku Y2xpZW50X2lkID0gMDsKKwljb25maWctPmNvbmZpZ190YWJsZVswXS50YXJnZXRfdGFibGVf ZW50cnkudmxhbl9pZCA9IDA7CisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgInNldHRpbmcg TUFDICglMDR4OiUwNHg6JTA0eClcbiIsCisJICAgY29uZmlnLT5jb25maWdfdGFibGVbMF0u Y2FtX2VudHJ5Lm1zYl9tYWNfYWRkciwKKwkgICBjb25maWctPmNvbmZpZ190YWJsZVswXS5j YW1fZW50cnkubWlkZGxlX21hY19hZGRyLAorCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlWzBd LmNhbV9lbnRyeS5sc2JfbWFjX2FkZHIpOworCisJLyogYnJvYWRjYXN0ICovCisJY29uZmln LT5jb25maWdfdGFibGVbMV0uY2FtX2VudHJ5Lm1zYl9tYWNfYWRkciA9IDB4ZmZmZjsKKwlj b25maWctPmNvbmZpZ190YWJsZVsxXS5jYW1fZW50cnkubWlkZGxlX21hY19hZGRyID0gMHhm ZmZmOworCWNvbmZpZy0+Y29uZmlnX3RhYmxlWzFdLmNhbV9lbnRyeS5sc2JfbWFjX2FkZHIg PSAweGZmZmY7CisJY29uZmlnLT5jb25maWdfdGFibGVbMV0uY2FtX2VudHJ5LmZsYWdzID0g YnAtPnBvcnQ7CisJY29uZmlnLT5jb25maWdfdGFibGVbMV0udGFyZ2V0X3RhYmxlX2VudHJ5 LmZsYWdzID0KKwkJCQlUU1RPUk1fQ0FNX1RBUkdFVF9UQUJMRV9FTlRSWV9CUk9BRENBU1Q7 CisJY29uZmlnLT5jb25maWdfdGFibGVbMV0udGFyZ2V0X3RhYmxlX2VudHJ5LmNsaWVudF9p ZCA9IDA7CisJY29uZmlnLT5jb25maWdfdGFibGVbMV0udGFyZ2V0X3RhYmxlX2VudHJ5LnZs YW5faWQgPSAwOworCisJYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfU0VU X01BQywgMCwKKwkJICAgICAgVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25m aWcpKSwKKwkJICAgICAgVTY0X0xPKGJueDJ4X3NwX21hcHBpbmcoYnAsIG1hY19jb25maWcp KSwgMCk7Cit9CisKKy8qIHN0YXRlX3AgaXMgYSBwb2ludGVyIHRvIHN0YXRlIGZpZWxkLCB3 aGljaCBpcyBjaGVja2VkIGZvciBhIGNoYW5nZSAqLworc3RhdGljIGludCBibngyeF93YWl0 X3JhbXJvZChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgc3RhdGUsIGludCBpZHgsCisJCQkgICAg IGludCAqc3RhdGVfcCwgaW50IHBvbGwpCit7CisJaW50IGkgPSAwOworCisJLyogRFAoIndh aXRpbmcgZm9yIHN0YXRlIHRvIGJlY29tZSAlZCBvbiBJRFggWyVkXVxuIiwKKwlzdGF0ZSwg c2JfaWR4KTsgKi8KKworCXdoaWxlICgqc3RhdGVfcCAhPSBzdGF0ZSkgeworCisJCW1zbGVl cCgxKTsKKworCQlpZiAocG9sbCkgeworCQkvKiBHZXQgcmFtcm9kICJzZW5kIiBjb21wbGV0 aW9uICh3aWxsIG9ubHkgdXBkYXRlIHByb2R1Y2VyKSAqLworCQkJYm54MnhfcnhfaW50KGJw LT5mcCwgMTApOworCQkJLyogSWYgaW5kZXggaXMgZGlmZmVyZW50IGZyb20gMCAtCisJCQkg KiBjYWxsIGZvciBpbnRlcnJ1cHQgaGFuZGxpbmcgcm91dGluZSBmb3IgdGhlCisJCQkgKiBh cHByb3ByaWF0ZSBxdWV1ZSB0byBnZXQgdGhlIHJhbXJvZCBjb21wbGV0aW9uICovCisJCX0K KwkJaWYgKGkrKyA9PSA1MDAwKSB7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3NldF9yeF9tb2RlKHN0cnVjdCBu ZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGJueDJ4X25pY19sb2FkKHN0cnVjdCBi bngyeCAqYnAsIGludCByZXFfaXJxKQoreworCWludCByYzsKKwlpbnQgaSA9IDA7CisKKwli cC0+c3RhdGUgPSBCTlgyWF9TVEFURV9PUEVOSU5HX1dBSVQ0X0xPQUQ7CisKKwkvKiBTZW5k IExPQURfUkVRVUVTVCBjb21tYW5kIHRvIE1DUC4KKwkgICBSZXR1cm5zIHRoZSB0eXBlIG9m IExPQUQgY29tbWFuZDogaWYgaXQgaXMgdGhlCisJICAgZmlyc3QgcG9ydCB0byBiZSBpbml0 aWFsaXplZCBjb21tb24gYmxvY2tzIHNob3VsZCBiZQorCSAgIGluaXRpYWxpemVkLCBvdGhl cndpc2UgLSBub3QuCisJKi8KKwlpZiAoIW5vbWNwKSB7CisJCXJjID0gYm54MnhfZndfY29t bWFuZChicCwgRFJWX01TR19DT0RFX0xPQURfUkVRKTsKKwkJaWYgKHJjID09IEZXX01TR19D T0RFX0RSVl9MT0FEX1JFRlVTRUQpIHsKKwkJCXJldHVybiAtRUJVU1k7IC8qIG90aGVyIHBv cnQgaW4gZGlhZ25vc3RpYyBtb2RlICovCisJCX0KKwl9IGVsc2UgeworCQlyYyA9IEZXX01T R19DT0RFX0RSVl9MT0FEX0NPTU1PTjsKKwl9CisKKwlicC0+bnVtX3F1ZXVlcyA9IDE7CisK KwkvKiBBbGxvY2F0ZSBkcml2ZXIncyBtZW1vcmllcyAqLworCWlmIChibngyeF9hbGxvY19t ZW0oYnApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEluaXRpYWxpemUgdGhlIGFwcHJv cHJpYXRlIGJsb2NrcyAqLworCWlmIChibngyeF9mdW5jdGlvbl9pbml0KGJwLCAocmMgPT0g RldfTVNHX0NPREVfRFJWX0xPQURfQ09NTU9OKSkpIHsKKwkJQk5YMlhfRVJSKCJIVyBpbml0 IGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwkvKiBS ZXF1ZXN0IElSUSBpZiBuZWVkZWQgKi8KKwlpZiAocmVxX2lycSkgeworCQlyYyA9IGJueDJ4 X3JlcV9pcnEoYnApOworCQlpZiAocmMpIHsKKwkJCWdvdG8gb3V0X2Vycm9yOworCQl9CisJ fQorCisJYXRvbWljX3NldCgmYnAtPmludHJfc2VtLCAwKTsKKworCS8qIFJlZW5hYmxlIFNQ IHRhc2tsZXQgKi8KKwlpZiAoYnAtPnNwX3Rhc2tfZW4pIHsKKwkJdGFza2xldF9lbmFibGUo JmJwLT5zcF90YXNrKTsKKwl9IGVsc2UgeworCQlicC0+c3BfdGFza19lbiA9IDE7CisJfQor CisJLyogU2V0dXAgTklDIGludGVybmFscyAqLworCXJjID0gYm54MnhfbmljX2luaXQoYnAp OyAvKiBhbHNvIGVuYWJsZXMgaW50ZXJydXB0cyAqLworCWlmIChyYykgeworCQlnb3RvIG91 dF9za2JzOworCX0KKworCS8qIFNlbmQgTE9BRF9ET05FIGNvbW1hbmQgdG8gTUNQICovCisJ aWYgKCFub21jcCkgeworCQlyYyA9IGJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09E RV9MT0FEX0RPTkUpOworCQlEUChORVRJRl9NU0dfSUZVUCwgInJjID0gMHgleFxuIiwgcmMp OworCQlpZiAoIXJjKSB7CisJCQlnb3RvIGludF9kaXNhYmxlOworCQl9CisJfQorCisJYnAt PnN0YXRlID0gQk5YMlhfU1RBVEVfT1BFTklOR19XQUlUNF9QT1JUOworCisJLyogRW5hYmxl IFJ4IGludGVycnVwdCBoYW5kbGluZyBiZWZvcmUgc2VuZGluZyB0aGUgcmFtcm9kCisJICAg YXMgaXQncyBjb21wbGV0ZWQgb24gUnggRlAgcXVldWUgKi8KKwluYXBpX2VuYWJsZSgmYm54 MnhfZnAoYnAsIDAsIG5hcGkpKTsKKworCS8qIE9uIGRlZmF1bHQgc3RhdHVzIGJsb2NrICov CisJYm54MnhfYWNrX3NiKGJwLCAxNiwgQ1NUT1JNX0lELCAwLCBJR1VfSU5UX0VOQUJMRSwg MCk7CisJLyogT24gRlAgKi8KKwlmb3JfZWFjaF9xdWV1ZShicCwgaSkKKwkJYm54MnhfYWNr X3NiKGJwLCBpLCBDU1RPUk1fSUQsIDAsIElHVV9JTlRfRU5BQkxFLCAwKTsKKworCS8qIFNF VFVQIHJhbXJvZCAqLworCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfRVRIX1BP UlRfU0VUVVAsIDAsIDAsIDAsIDApOworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwly YyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9TVEFURV9PUEVOLCAwLCAmKGJwLT5z dGF0ZSksIDApOworCWlmIChyYykgeworCQlnb3RvIHN0b3BfbmV0aWY7CisJfQorCisJLyog Q29uZmlndXJlIENBTSAqLworCWJueDJ4X3NldF9tYWNfYWRkcihicCk7CisKKwlibngyeF9w aHlfaW5pdChicCk7CisKKwkvKiBTdGFydCBmYXN0IHBhdGggKi8KKwlpZiAocmVxX2lycSkg eyAvKiBJUlEgaXMgb25seSByZXF1ZXN0ZWQgZnJvbSBibngyeF9vcGVuIGZ1bmN0aW9uCisJ CQkgIHdoZW4gVHggcXVldWUgaXMgaW5pdGlhbGl6ZWQgZm9yIHRoZSBmaXJzdCB0aW1lICov CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGJwLT5kZXYpOworCQlpZiAoYnAtPmZsYWdzICYgVVNJ TkdfTVNJWF9GTEFHKSB7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IHVzaW5nIE1T SS1YXG4iLAorCQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOworCQl9CisKKwkJLyogT3RoZXJ3 aXNlIFR4IHF1ZXVlIHNob3VsZCBiZSBvbmx5IHJlZW5hYmxlZCAqLworCX0gZWxzZSBpZiAo bmV0aWZfcnVubmluZyhicC0+ZGV2KSkgeworCQluZXRpZl93YWtlX3F1ZXVlKGJwLT5kZXYp OworCQlibngyeF9zZXRfcnhfbW9kZShicC0+ZGV2KTsKKwl9CisKKwkvKiBzdGFydCB0aGUg dGltZXIgKi8KKwltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50 X2ludGVydmFsKTsKKworCXJldHVybiAwOworCitzdG9wX25ldGlmOgorCW5hcGlfZGlzYWJs ZSgmYm54MnhfZnAoYnAsIDAsIG5hcGkpKTsKK2ludF9kaXNhYmxlOgorCWJueDJ4X2Rpc2Fi bGVfaW50X3N5bmMoYnApOworb3V0X3NrYnM6CisJYm54MnhfZnJlZV9za2JzKGJwKTsKKwli bngyeF9mcmVlX2lycShicCk7CisKK291dF9lcnJvcjoKKwlibngyeF9mcmVlX21lbShicCk7 CisKKwkvKiBUQkQgd2UgcmVhbGx5IG5lZWQgdG8gcmVzZXQgdGhlIGNoaXAKKwkgICBpZiB3 ZSB3YW50IHRvIHJlY292ZXIgZnJvbSB0aGlzICovCisJcmV0dXJuIHJjOworfQorCitzdGF0 aWMgdm9pZCBibngyeF9uZXRpZl9zdG9wKHN0cnVjdCBibngyeCAqYnApCit7CisJYnAtPnJ4 X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7CisJYm54Mnhfc2V0X3N0b3JtX3J4X21vZGUo YnApOworCisJYm54MnhfZGlzYWJsZV9pbnRfc3luYyhicCk7CisJYm54MnhfbGlua19yZXNl dChicCk7CisJbmFwaV9kaXNhYmxlKCZibngyeF9mcChicCwgMCwgbmFwaSkpOworCWlmIChu ZXRpZl9ydW5uaW5nKGJwLT5kZXYpKSB7CisJCW5ldGlmX3R4X2Rpc2FibGUoYnAtPmRldik7 CisJCWJwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsJLyogcHJldmVudCB0eCB0aW1l b3V0ICovCisJfQorfQorCitzdGF0aWMgdm9pZCBibngyeF9yZXNldF9jaGlwKHN0cnVjdCBi bngyeCAqYnAsIHUzMiByZXNldF9jb2RlKQoreworCWludCBwb3J0ID0gYnAtPnBvcnQ7CisK KwlEUChORVRJRl9NU0dfSUZET1dOLCAicmVzZXQgY2FsbGVkIHdpdGggY29kZSAleFxuIiwg cmVzZXRfY29kZSk7CisKKwkvKiBEbyBub3QgcmN2IHBhY2tldHMgdG8gQlJCICovCisJUkVH X1dSKGJwLCBHUkNCQVNFX05JRywKKwkgICAgICAgTklHX1JFR0lTVEVSU19MTEgwX0JSQjFf RFJWX01BU0sgKyBwb3J0KjQsIDB4MCk7CisJLyogRG8gbm90IGRpcmVjdCByY3YgcGFja2V0 cyB0aGF0IGFyZSBub3QgZm9yIE1DUCB0byB0aGUgQlJCICovCisJUkVHX1dSKGJwLCBHUkNC QVNFX05JRywKKwkgICAgICAgKHBvcnQgPyBOSUdfUkVHSVNURVJTX0xMSDFfQlJCMV9OT1Rf TUNQIDoKKwkJICAgICAgIE5JR19SRUdJU1RFUlNfTExIMF9CUkIxX05PVF9NQ1ApLCAweDAp OworCisJLyogQ29uZmlndXJlIElHVSBhbmQgQUVVICovCisJUkVHX1dSKGJwLCBHUkNCQVNF X0hDLCBIQ19SRUdJU1RFUlNfQ09ORklHXzAgKyAocG9ydCo0KSwgMHgxMDAwKTsKKwlSRUdf V1IoYnAsIEdSQ0JBU0VfTUlTQ19BRVUsCisJICAgICAgIE1JU0NfUkVHSVNURVJTX0FFVV9N QVNLX0FUVE5fRlVOQ18wICsgKHBvcnQqNCksIDApOworCisJLyogVE9ETyBDbG9zZSBEb29y YmVsbHMgcG9ydCAqLworCisJaWYgKHJlc2V0X2NvZGUgPT0gRldfTVNHX0NPREVfRFJWX1VO TE9BRF9DT01NT04pIHsKKwkJLyogcmVzZXRfY29tbW9uICovCisJCVJFR19XUihicCwgR1JD QkFTRV9NSVNDLAorCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzFfQ0xFQVIs IDB4ZDNmZmZmN2YpOworCQlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQywKKwkJICAgICAgIE1J U0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLCAweDE0MDMpOworCX0KK30KKworc3Rh dGljIGludCBibngyeF9uaWNfdW5sb2FkKHN0cnVjdCBibngyeCAqYnAsIGludCBmcmVfaXJx KQoreworCXUzMiByZXNldF9jb2RlID0gMDsKKwlpbnQgcmMsIHRpbWVvdXQgPSAyMDA7CisK KwlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQ7CisKKwkvKiBD YWxsaW5nIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkgbWF5IGRlYWRsb2NrIGJlY2F1c2UKKwkg KiBsaW5rd2F0Y2hfZXZlbnQoKSBtYXkgYmUgb24gdGhlIHdvcmtxdWV1ZSBhbmQgaXQgd2ls bCB0cnkgdG8gZ2V0CisJICogdGhlIHJ0bmxfbG9jayB3aGljaCB3ZSBhcmUgaG9sZGluZy4K KwkgKi8KKwl3aGlsZSAoYnAtPmluX3Jlc2V0X3Rhc2spCisJCW1zbGVlcCgxKTsKKworCS8q IERlbGV0ZSB0aGUgdGltZXI6IGRvIGl0IGJlZm9yZSBkaXNhYmxpbmcgaW50ZXJydXB0cywg YXMgaXQKKwkgICBtYXkgYmUgc3RpbCBTVEFUX1FVRVJZIHJhbXJvZCBwZW5kaW5nIGFmdGVy IHN0b3BwaW5nIHRoZSB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZicC0+dGltZXIpOwor CisJLyogV2FpdCB1bnRpbCBzdGF0IHJhbXJvZCByZXR1cm5zIGFuZCBhbGwgU1AgdGFza3Mg Y29tcGxldGUgKi8KKwl3aGlsZSAoYnAtPnN0YXRfcGVuZGluZyAmJiAoYnAtPnNwcV9sZWZ0 ICE9IE1BWF9TUFFfUEVORElORykpIHsKKwkJbXNsZWVwKDEpOworCX0KKworCS8qIFN0b3Ag ZmFzdCBwYXRoLCBkaXNhYmxlIE1BQywgZGlzYWJsZSBpbnRlcnJ1cHRzCisJICAgVGhpcyBk b2VzIG5hcGlfZGlzYWJsZSgpIGZvciB1cy4gICovCisJYm54MnhfbmV0aWZfc3RvcChicCk7 CisKKwlpZiAoYnAtPmZsYWdzICYgTk9fV09MX0ZMQUcpCisJCXJlc2V0X2NvZGUgPSBEUlZf TVNHX0NPREVfVU5MT0FEX1JFUV9XT0xfTUNQOworCWVsc2UgaWYgKGJwLT53b2wpIHsKKwkJ dTMyIGVtYWNfYmFzZSA9IGJwLT5wb3J0ID8gR1JDQkFTRV9FTUFDMCA6IEdSQ0JBU0VfRU1B QzE7CisJCXU4ICptYWNfYWRkciA9IGJwLT5kZXYtPmRldl9hZGRyOworCQl1MzIgdmFsID0g KEVNQUNfTU9ERV9NUEtUIHwgRU1BQ19NT0RFX01QS1RfUkNWRCB8CisJCQkgICBFTUFDX01P REVfQUNQSV9SQ1ZEKTsKKworCQlSRUdfV1IoYnAsIGVtYWNfYmFzZSwgRU1BQ19SRUdfRU1B Q19NT0RFLCB2YWwpOworCisJCXZhbCA9IChtYWNfYWRkclswXSA8PCA4KSB8IG1hY19hZGRy WzFdOworCisJCVJFR19XUihicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX01BQ19NQVRD SCwgdmFsKTsKKworCQl2YWwgPSAobWFjX2FkZHJbMl0gPDwgMjQpIHwgKG1hY19hZGRyWzNd IDw8IDE2KSB8CisJCSAgICAgIChtYWNfYWRkcls0XSA8PCA4KSB8IG1hY19hZGRyWzVdOwor CisJCVJFR19XUihicCwgZW1hY19iYXNlLCBFTUFDX1JFR19FTUFDX01BQ19NQVRDSCArIDQs IHZhbCk7CisKKwkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dPTF9F TjsKKwl9IGVsc2UKKwkJcmVzZXRfY29kZSA9IERSVl9NU0dfQ09ERV9VTkxPQURfUkVRX1dP TF9ESVM7CisKKworCS8qIFNlbmQgSEFMVCByYW1yb2QgKi8KKwlicC0+ZnBbMF0uc3RhdGUg PSBCTlgyWF9GUF9TVEFURV9IQUxUSU5HOworCWJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9D TURfSURfRVRIX0hBTFQsIDAsIDAsIDAsIDApOworCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24g Ki8KKwlyYyA9IGJueDJ4X3dhaXRfcmFtcm9kKGJwLCBCTlgyWF9GUF9TVEFURV9IQUxURUQs IDAsCisJCQkgICAgICAgJihicC0+ZnBbMF0uc3RhdGUpLCAxKTsKKwlpZiAocmMpIHsKKwkJ Z290byBlcnJvcjsKKwl9CisKKwkvKiBSZW1lbWJlciBjc3Rvcm0gcHJvZHVjZXIgaW4gRFNC IHRvIHRyYWNrIGl0ICovCisJYnAtPmRzYl9zcF9wcm9kX2lkeCA9ICpicC0+ZHNiX3NwX3By b2Q7CisJLyogU2VuZCBDRkNfREVMRVRFIHJhbXJvZCAqLworCWJueDJ4X3NwX3Bvc3QoYnAs IFJBTVJPRF9DTURfSURfRVRIX1BPUlRfREVMLCAwLCAwLCAwLCAxKTsKKwkvKiBXYWl0IGZv ciBjb21wbGV0aW9uIHRvIGFycml2ZS4gRG8gbm90aGluZyBhcyB3ZSBhcmUgZ29pbmcgdG8g cmVzZXQKKwkgICB0aGUgY2hpcCBhIGZldyBsaW5lcyBsYXRlciAqLworCXdoaWxlIChicC0+ ZHNiX3NwX3Byb2RfaWR4ID09ICpicC0+ZHNiX3NwX3Byb2QpIHsKKwkJaWYgKCF0aW1lb3V0 KSB7CisJCQlCTlgyWF9FUlIoInRpbWVvdXQgd2FpdGluZyBmb3IgRVRIIFBPUlQgREVMXG4i KTsKKwkJCWJyZWFrOworCQl9CisJCXRpbWVvdXQtLTsKKwkJbXNsZWVwKDEpOworCisJfQor CitlcnJvcjoKKwlpZiAoIW5vbWNwKSB7CisJCXJjID0gYm54MnhfZndfY29tbWFuZChicCwg cmVzZXRfY29kZSk7CisJfSBlbHNlIHsKKwkJcmMgPSBGV19NU0dfQ09ERV9EUlZfVU5MT0FE X0NPTU1PTjsKKwl9CisKKwkvKiBSZWxlYXNlIElSUXMgKi8KKwlpZiAoZnJlX2lycSkKKwkJ Ym54MnhfZnJlZV9pcnEoYnApOworCisJLyogUmVzZXQgdGhlIGNoaXAgKi8KKwlibngyeF9y ZXNldF9jaGlwKGJwLCByYyk7CisKKwkvKiBSZXBvcnQgVU5MT0FEX0RPTkUgdG8gTUNQICov CisJaWYgKCFub21jcCkgeworCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVf VU5MT0FEX0RPTkUpOworCX0KKwkvKiBGcmVlIFNLQnMgYW5kIGRyaXZlciBpbnRlcm5hbHMg Ki8KKwlibngyeF9mcmVlX3NrYnMoYnApOworCWJueDJ4X2ZyZWVfbWVtKGJwKTsKKworCWJw LT5zdGF0ZSA9IEJOWDJYX1NUQVRFX0NMT1NFRDsKKwkvKiBTZXQgbGluayBkb3duICovCisJ YnAtPmxpbmtfdXAgPSAwOworCW5ldGlmX2NhcnJpZXJfb2ZmKGJwLT5kZXYpOworCisJcmV0 dXJuIDA7Cit9CisKKy8qIGVuZCBvZiBuaWMgbG9hZC91bmxvYWQgKi8KKworLyogZXRodG9v bF9vcHMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSW5pdCBzZXJ2aWNlIGZ1 bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYm54Mnhf bGlua19zZXR0aW5nc19zdXBwb3J0ZWQoc3RydWN0IGJueDJ4ICpicCwgdTMyIHN3aXRjaF9j ZmcpCit7CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKwl1MzIgZXh0X3BoeV90eXBlOworCisJ YnAtPnBoeV9mbGFncyA9IDA7CisJYnAtPnN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25l ZyB8CisJCQkgU1VQUE9SVEVEX1BhdXNlIHwKKwkJCSBTVVBQT1JURURfQXN5bV9QYXVzZSk7 CisKKwlzd2l0Y2ggKHN3aXRjaF9jZmcpIHsKKwljYXNlIFNXSVRDSF9DRkdfMUc6CisJCUJO WDJYX0RFVl9JTkZPKCJzd2l0Y2hfY2ZnIDB4JXggKDFHKVxuIiwgc3dpdGNoX2NmZyk7CisK KwkJZXh0X3BoeV90eXBlID0gU0VSREVTX0VYVF9QSFlfVFlQRShicCk7CisJCXN3aXRjaCAo ZXh0X3BoeV90eXBlKSB7CisJCWNhc2UgUE9SVF9IV19DRkdfU0VSREVTX0VYVF9QSFlfVFlQ RV9ESVJFQ1Q6CisJCQlCTlgyWF9ERVZfSU5GTygiZXh0X3BoeV90eXBlIDB4JXggKERpcmVj dClcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7CisKKwkJCWJwLT5zdXBwb3J0ZWQg fD0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgIFNVUFBPUlRFRF8xMGJhc2VU X0Z1bGwgfAorCQkJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmIHwKKwkJCQkJICBTVVBQ T1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxs IHwKKwkJCQkJICBTVVBQT1JURURfMjUwMGJhc2VUX0Z1bGwgfAorCQkJCQkgIFNVUFBPUlRF RF9UUCB8IFNVUFBPUlRFRF9GSUJSRSk7CisJCQlicmVhazsKKworCQljYXNlIFBPUlRfSFdf Q0ZHX1NFUkRFU19FWFRfUEhZX1RZUEVfQkNNNTQ4MjoKKwkJCUJOWDJYX0RFVl9JTkZPKCJl eHRfcGh5X3R5cGUgMHgleCAoNTQ4MilcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlwZSk7 CisKKwkJCWJwLT5waHlfZmxhZ3MgfD0gUEhZX1NHTUlJX0ZMQUc7CisKKwkJCWJwLT5zdXBw b3J0ZWQgfD0gKC8qIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgICAgIFNVUFBP UlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgICAgIFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxm IHwKKwkJCQkJICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8Ki8KKwkJCQkJICBTVVBQ T1JURURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgIFNVUFBPUlRFRF9UUCB8IFNVUFBPUlRF RF9GSUJSRSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJQk5YMlhfRVJSKCJOVlJB TSBjb25maWcgZXJyb3IuICIKKwkJCQkgICJCQUQgU2VyRGVzIGV4dF9waHlfY29uZmlnIDB4 JXhcbiIsCisJCQkJICBicC0+ZXh0X3BoeV9jb25maWcpOworCQkJcmV0dXJuOworCQl9CisK KwkJYnAtPnBoeV9hZGRyID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywKKwkJCQkgICAgICBO SUdfUkVHSVNURVJTX1NFUkRFUzBfQ1RSTF9QSFlfQUREUiArCisJCQkJICAgICAgcG9ydCow eDEwKTsKKwkJQk5YMlhfREVWX0lORk8oInBoeV9hZGRyIDB4JXhcbiIsIGJwLT5waHlfYWRk cik7CisJCWJyZWFrOworCisJY2FzZSBTV0lUQ0hfQ0ZHXzEwRzoKKwkJQk5YMlhfREVWX0lO Rk8oInN3aXRjaF9jZmcgMHgleCAoMTBHKVxuIiwgc3dpdGNoX2NmZyk7CisKKwkJYnAtPnBo eV9mbGFncyB8PSBQSFlfWEdYU19GTEFHOworCisJCWV4dF9waHlfdHlwZSA9IFhHWFNfRVhU X1BIWV9UWVBFKGJwKTsKKwkJc3dpdGNoIChleHRfcGh5X3R5cGUpIHsKKwkJY2FzZSBQT1JU X0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1Q6CisJCQlCTlgyWF9ERVZfSU5GTygi ZXh0X3BoeV90eXBlIDB4JXggKERpcmVjdClcbiIsCisJCQkJICAgICAgIGV4dF9waHlfdHlw ZSk7CisKKwkJCWJwLT5zdXBwb3J0ZWQgfD0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAor CQkJCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAorCQkJCQkgIFNVUFBPUlRFRF8xMDBi YXNlVF9IYWxmIHwKKwkJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCSAg U1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICBTVVBQT1JURURfMjUwMGJhc2VU X0Z1bGwgfAorCQkJCQkgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCQkgIFNV UFBPUlRFRF9UUCB8IFNVUFBPUlRFRF9GSUJSRSk7CisJCQlicmVhazsKKworCQljYXNlIFBP UlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDU6CisJCWNhc2UgUE9SVF9IV19D RkdfWEdYU19FWFRfUEhZX1RZUEVfQkNNODcwNjoKKwkJCUJOWDJYX0RFVl9JTkZPKCJleHRf cGh5X3R5cGUgMHgleCAoODcwNS82KVxuIiwKKwkJCQkgICAgICAgZXh0X3BoeV90eXBlKTsK KworCQkJYnAtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8CisJ CQkJCSAgU1VQUE9SVEVEX0ZJQlJFKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlC TlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgIkJBRCBYR1hTIGV4dF9w aHlfY29uZmlnIDB4JXhcbiIsCisJCQkJICBicC0+ZXh0X3BoeV9jb25maWcpOworCQkJcmV0 dXJuOworCQl9CisKKwkJYnAtPnBoeV9hZGRyID0gUkVHX1JEKGJwLCBHUkNCQVNFX05JRywK KwkJCQkgICAgICBOSUdfUkVHSVNURVJTX1hHWFMwX0NUUkxfUEhZX0FERFIgKworCQkJCSAg ICAgIHBvcnQqMHgxOCk7CisJCUJOWDJYX0RFVl9JTkZPKCJwaHlfYWRkciAweCV4XG4iLCBi cC0+cGh5X2FkZHIpOworCisJCWJwLT5zZXJfbGFuZSA9ICgoYnAtPmxhbmVfY29uZmlnICYK KwkJCQkgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfTUFTSykgPj4KKwkJCQlQ T1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX01BU1RFUl9TSElGVCk7CisJCWJwLT5yeF9sYW5l X3N3YXAgPSAoKGJwLT5sYW5lX2NvbmZpZyAmCisJCQkJICAgICBQT1JUX0hXX0NGR19MQU5F X1NXQVBfQ0ZHX1JYX01BU0spID4+CisJCQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9D RkdfUlhfU0hJRlQpOworCQlicC0+dHhfbGFuZV9zd2FwID0gKChicC0+bGFuZV9jb25maWcg JgorCQkJCSAgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19UWF9NQVNLKSA+PgorCQkJ CSAgICBQT1JUX0hXX0NGR19MQU5FX1NXQVBfQ0ZHX1RYX1NISUZUKTsKKwkJQk5YMlhfREVW X0lORk8oInJ4X2xhbmVfc3dhcCAweCV4ICB0eF9sYW5lX3N3YXAgMHgleFxuIiwKKwkJCSAg ICAgICBicC0+cnhfbGFuZV9zd2FwLCBicC0+dHhfbGFuZV9zd2FwKTsKKwkJYnJlYWs7CisK KwlkZWZhdWx0OgorCQlCTlgyWF9FUlIoIkJBRCBzd2l0Y2hfY2ZnIGxpbmtfY29uZmlnIDB4 JXhcbiIsCisJCQkgIGJwLT5saW5rX2NvbmZpZyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBt YXNrIHdoYXQgd2Ugc3VwcG9ydCBhY2NvcmRpbmcgdG8gc3BlZWRfY2FwX21hc2sgKi8KKwlp ZiAoIShicC0+c3BlZWRfY2FwX21hc2sgJgorCSAgICAgIFBPUlRfSFdfQ0ZHX1NQRUVEX0NB UEFCSUxJVFlfRDBfMTBNX0hBTEYpKSB7CisJCWJwLT5zdXBwb3J0ZWQgJj0gflNVUFBPUlRF RF8xMGJhc2VUX0hhbGY7CisJfQorCWlmICghKGJwLT5zcGVlZF9jYXBfbWFzayAmCisJICAg ICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xME1fRlVMTCkpIHsKKwkJYnAt PnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwYmFzZVRfRnVsbDsKKwl9CisJaWYgKCEoYnAt PnNwZWVkX2NhcF9tYXNrICYKKwkgICAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZ X0QwXzEwME1fSEFMRikpIHsKKwkJYnAtPnN1cHBvcnRlZCAmPSB+U1VQUE9SVEVEXzEwMGJh c2VUX0hhbGY7CisJfQorCWlmICghKGJwLT5zcGVlZF9jYXBfbWFzayAmCisJICAgICAgUE9S VF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xMDBNX0ZVTEwpKSB7CisJCWJwLT5zdXBw b3J0ZWQgJj0gflNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOworCX0KKwlpZiAoIShicC0+c3Bl ZWRfY2FwX21hc2sgJiBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzFHKSkgewor CQlicC0+c3VwcG9ydGVkICY9IH4oU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCQkg ICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOworCX0KKwlpZiAoIShicC0+c3BlZWRfY2Fw X21hc2sgJiBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0QwXzJfNUcpKSB7CisJCWJw LT5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8yNTAwYmFzZVRfRnVsbDsKKwl9CisJaWYgKCEo YnAtPnNwZWVkX2NhcF9tYXNrICYgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8x MEcpKSB7CisJCWJwLT5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7 CisJfQorCUJOWDJYX0RFVl9JTkZPKCJzdXBwb3J0ZWQgMHgleFxuIiwgYnAtPnN1cHBvcnRl ZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2xpbmtfc2V0dGluZ3NfcmVxdWVzdGVkKHN0 cnVjdCBibngyeCAqYnApCit7CisJYnAtPnJlcV9hdXRvbmVnID0gMDsKKwlicC0+cmVxX2R1 cGxleCA9IERVUExFWF9GVUxMOworCXN3aXRjaCAoYnAtPmxpbmtfY29uZmlnICYgUE9SVF9G RUFUVVJFX0xJTktfU1BFRURfTUFTSykgeworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BF RURfQVVUTzoKKwkJYnAtPnJlcV9hdXRvbmVnIHw9IEFVVE9ORUdfU1BFRUQ7CisJCWJwLT5y ZXFfbGluZV9zcGVlZCA9IDA7CisJCWJwLT5hZHZlcnRpc2luZyA9IGJwLT5zdXBwb3J0ZWQ7 CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fRlVMTDoK KwkJaWYgKGJwLT5zcGVlZF9jYXBfbWFzayAmCisJCSAgICBQT1JUX0hXX0NGR19TUEVFRF9D QVBBQklMSVRZX0QwXzEwTV9GVUxMKSB7CisJCQlicC0+cmVxX2xpbmVfc3BlZWQgPSBTUEVF RF8xMDsKKwkJCWJwLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8 CisJCQkJCSAgIEFEVkVSVElTRURfVFApOworCQl9IGVsc2UgeworCQkJQk5YMlhfRVJSKCJO VlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQkgICJJbnZhbGlkIGxpbmtfY29uZmlnIDB4JXgi CisJCQkJICAiICBzcGVlZF9jYXBfbWFzayAweCV4XG4iLAorCQkJCSAgYnAtPmxpbmtfY29u ZmlnLCBicC0+c3BlZWRfY2FwX21hc2spOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOwor CisJY2FzZSBQT1JUX0ZFQVRVUkVfTElOS19TUEVFRF8xME1fSEFMRjoKKwkJaWYgKGJwLT5z cGVlZF9jYXBfbWFzayAmCisJCSAgICBQT1JUX0hXX0NGR19TUEVFRF9DQVBBQklMSVRZX0Qw XzEwTV9IQUxGKSB7CisJCQlicC0+cmVxX2xpbmVfc3BlZWQgPSBTUEVFRF8xMDsKKwkJCWJw LT5yZXFfZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisJCQlicC0+YWR2ZXJ0aXNpbmcgPSAoQURW RVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkgICBBRFZFUlRJU0VEX1RQKTsKKwkJfSBl bHNlIHsKKwkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAiSW52 YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxu IiwKKwkJCQkgIGJwLT5saW5rX2NvbmZpZywgYnAtPnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJl dHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURf MTAwTV9GVUxMOgorCQlpZiAoYnAtPnNwZWVkX2NhcF9tYXNrICYKKwkJICAgIFBPUlRfSFdf Q0ZHX1NQRUVEX0NBUEFCSUxJVFlfRDBfMTAwTV9GVUxMKSB7CisJCQlicC0+cmVxX2xpbmVf c3BlZWQgPSBTUEVFRF8xMDA7CisJCQlicC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8x MDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgQURWRVJUSVNFRF9UUCk7CisJCX0gZWxzZSB7CisJ CQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgIkludmFsaWQgbGlu a19jb25maWcgMHgleCIKKwkJCQkgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIsCisJCQkJ ICBicC0+bGlua19jb25maWcsIGJwLT5zcGVlZF9jYXBfbWFzayk7CisJCQlyZXR1cm47CisJ CX0KKwkJYnJlYWs7CisKKwljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwME1fSEFM RjoKKwkJaWYgKGJwLT5zcGVlZF9jYXBfbWFzayAmCisJCSAgICBQT1JUX0hXX0NGR19TUEVF RF9DQVBBQklMSVRZX0QwXzEwME1fSEFMRikgeworCQkJYnAtPnJlcV9saW5lX3NwZWVkID0g U1BFRURfMTAwOworCQkJYnAtPnJlcV9kdXBsZXggPSBEVVBMRVhfSEFMRjsKKwkJCWJwLT5h ZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfAorCQkJCQkgICBBRFZF UlRJU0VEX1RQKTsKKwkJfSBlbHNlIHsKKwkJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVy cm9yLiAiCisJCQkJICAiSW52YWxpZCBsaW5rX2NvbmZpZyAweCV4IgorCQkJCSAgIiAgc3Bl ZWRfY2FwX21hc2sgMHgleFxuIiwKKwkJCQkgIGJwLT5saW5rX2NvbmZpZywgYnAtPnNwZWVk X2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE9SVF9G RUFUVVJFX0xJTktfU1BFRURfMUc6CisJCWlmIChicC0+c3BlZWRfY2FwX21hc2sgJgorCQkg ICAgUE9SVF9IV19DRkdfU1BFRURfQ0FQQUJJTElUWV9EMF8xRykgeworCQkJYnAtPnJlcV9s aW5lX3NwZWVkID0gU1BFRURfMTAwMDsKKwkJCWJwLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJ U0VEXzEwMDBiYXNlVF9GdWxsIHwKKwkJCQkJICAgQURWRVJUSVNFRF9UUCk7CisJCX0gZWxz ZSB7CisJCQlCTlgyWF9FUlIoIk5WUkFNIGNvbmZpZyBlcnJvci4gIgorCQkJCSAgIkludmFs aWQgbGlua19jb25maWcgMHgleCIKKwkJCQkgICIgIHNwZWVkX2NhcF9tYXNrIDB4JXhcbiIs CisJCQkJICBicC0+bGlua19jb25maWcsIGJwLT5zcGVlZF9jYXBfbWFzayk7CisJCQlyZXR1 cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFBPUlRfRkVBVFVSRV9MSU5LX1NQRUVEXzJf NUc6CisJCWlmIChicC0+c3BlZWRfY2FwX21hc2sgJgorCQkgICAgUE9SVF9IV19DRkdfU1BF RURfQ0FQQUJJTElUWV9EMF8yXzVHKSB7CisJCQlicC0+cmVxX2xpbmVfc3BlZWQgPSBTUEVF RF8yNTAwOworCQkJYnAtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMjUwMGJhc2VUX0Z1 bGwgfAorCQkJCQkgICBBRFZFUlRJU0VEX1RQKTsKKwkJfSBlbHNlIHsKKwkJCUJOWDJYX0VS UigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAiSW52YWxpZCBsaW5rX2NvbmZpZyAw eCV4IgorCQkJCSAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKKwkJCQkgIGJwLT5saW5r X2NvbmZpZywgYnAtPnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVh azsKKworCWNhc2UgUE9SVF9GRUFUVVJFX0xJTktfU1BFRURfMTBHX0NYNDoKKwljYXNlIFBP UlRfRkVBVFVSRV9MSU5LX1NQRUVEXzEwR19LWDQ6CisJY2FzZSBQT1JUX0ZFQVRVUkVfTElO S19TUEVFRF8xMEdfS1I6CisJCWlmICghKGJwLT5waHlfZmxhZ3MgJiBQSFlfWEdYU19GTEFH KSkgeworCQkJQk5YMlhfRVJSKCJOVlJBTSBjb25maWcgZXJyb3IuICIKKwkJCQkgICJJbnZh bGlkIGxpbmtfY29uZmlnIDB4JXgiCisJCQkJICAiICBwaHlfZmxhZ3MgMHgleFxuIiwKKwkJ CQkgIGJwLT5saW5rX2NvbmZpZywgYnAtPnBoeV9mbGFncyk7CisJCQlyZXR1cm47CisJCX0K KwkJaWYgKGJwLT5zcGVlZF9jYXBfbWFzayAmCisJCSAgICBQT1JUX0hXX0NGR19TUEVFRF9D QVBBQklMSVRZX0QwXzEwRykgeworCQkJYnAtPnJlcV9saW5lX3NwZWVkID0gU1BFRURfMTAw MDA7CisJCQlicC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwg fAorCQkJCQkgICBBRFZFUlRJU0VEX0ZJQlJFKTsKKwkJfSBlbHNlIHsKKwkJCUJOWDJYX0VS UigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJCQkJICAiSW52YWxpZCBsaW5rX2NvbmZpZyAw eCV4IgorCQkJCSAgIiAgc3BlZWRfY2FwX21hc2sgMHgleFxuIiwKKwkJCQkgIGJwLT5saW5r X2NvbmZpZywgYnAtPnNwZWVkX2NhcF9tYXNrKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVh azsKKworCWRlZmF1bHQ6CisJCUJOWDJYX0VSUigiTlZSQU0gY29uZmlnIGVycm9yLiAiCisJ CQkgICJCQUQgbGluayBzcGVlZCBsaW5rX2NvbmZpZyAweCV4XG4iLAorCQkJICBicC0+bGlu a19jb25maWcpOworCQlicC0+cmVxX2F1dG9uZWcgfD0gQVVUT05FR19TUEVFRDsKKwkJYnAt PnJlcV9saW5lX3NwZWVkID0gMDsKKwkJYnAtPmFkdmVydGlzaW5nID0gYnAtPnN1cHBvcnRl ZDsKKwkJYnJlYWs7CisJfQorCUJOWDJYX0RFVl9JTkZPKCJyZXFfbGluZV9zcGVlZCAlZCAg cmVxX2R1cGxleCAlZFxuIiwKKwkJICAgICAgIGJwLT5yZXFfbGluZV9zcGVlZCwgYnAtPnJl cV9kdXBsZXgpOworCisJYnAtPnJlcV9mbG93X2N0cmwgPSAoYnAtPmxpbmtfY29uZmlnICYK KwkJCSAgICAgUE9SVF9GRUFUVVJFX0ZMT1dfQ09OVFJPTF9NQVNLKTsKKwkvKiBQbGVhc2Ug cmVmZXIgdG8gVGFibGUgMjhCLTMgb2YgdGhlIDgwMi4zYWItMTk5OSBzcGVjICovCisJc3dp dGNoIChicC0+cmVxX2Zsb3dfY3RybCkgeworCWNhc2UgRkxPV19DVFJMX0FVVE86CisJCWJw LT5yZXFfYXV0b25lZyB8PSBBVVRPTkVHX0ZMT1dfQ1RSTDsKKwkJYnAtPnBhdXNlX21vZGUg PSBQQVVTRV9CT1RIOworCQlicC0+YWR2ZXJ0aXNpbmcgfD0gKEFEVkVSVElTRURfUGF1c2Ug fAorCQkJCSAgICBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpOworCQlicmVhazsKKworCWNhc2Ug RkxPV19DVFJMX1RYOgorCQlicC0+cGF1c2VfbW9kZSA9IFBBVVNFX0FTWU1NRVRSSUM7CisJ CWJwLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCWJyZWFrOwor CisJY2FzZSBGTE9XX0NUUkxfUlg6CisJCWJwLT5wYXVzZV9tb2RlID0gUEFVU0VfQk9USDsK KwkJYnAtPmFkdmVydGlzaW5nIHw9IChBRFZFUlRJU0VEX1BhdXNlIHwKKwkJCQkgICAgQURW RVJUSVNFRF9Bc3ltX1BhdXNlKTsKKwkJYnJlYWs7CisKKwljYXNlIEZMT1dfQ1RSTF9CT1RI OgorCQlicC0+cGF1c2VfbW9kZSA9IFBBVVNFX1NZTU1FVFJJQzsKKwkJYnAtPmFkdmVydGlz aW5nIHw9IEFEVkVSVElTRURfUGF1c2U7CisJCWJyZWFrOworCisJY2FzZSBGTE9XX0NUUkxf Tk9ORToKKwlkZWZhdWx0OgorCQlicC0+cGF1c2VfbW9kZSA9IFBBVVNFX05PTkU7CisJCWJw LT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfUGF1c2UgfAorCQkJCSAgICAgQURWRVJU SVNFRF9Bc3ltX1BhdXNlKTsKKwkJYnJlYWs7CisJfQorCUJOWDJYX0RFVl9JTkZPKCJyZXFf YXV0b25lZyAweCV4ICByZXFfZmxvd19jdHJsIDB4JXhcbiIKKwkgICAgIEtFUk5fSU5GTyAi ICBwYXVzZV9tb2RlICVkICBhZHZlcnRpc2luZyAweCV4XG4iLAorCQkgICAgICAgYnAtPnJl cV9hdXRvbmVnLCBicC0+cmVxX2Zsb3dfY3RybCwKKwkJICAgICAgIGJwLT5wYXVzZV9tb2Rl LCBicC0+YWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgdm9pZCBibngyeF9nZXRfaHdpbmZv KHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHZhbCwgdmFsMiwgdmFsMywgdmFsNCwgaWQ7 CisJaW50IHBvcnQgPSBicC0+cG9ydDsKKwl1MzIgc3dpdGNoX2NmZzsKKworCWJwLT5zaG1l bV9iYXNlID0gUkVHX1JEKGJwLCBHUkNCQVNFX01JU0MsCisJCQkJTUlTQ19SRUdJU1RFUlNf U0hBUkVEX01FTV9BRERSKTsKKwlCTlgyWF9ERVZfSU5GTygic2htZW0gb2Zmc2V0IGlzICV4 XG4iLCBicC0+c2htZW1fYmFzZSk7CisKKwkvKiBHZXQgdGhlIGNoaXAgcmV2aXNpb24gaWQg YW5kIG51bWJlci4gKi8KKwkvKiBjaGlwIG51bToxNi0zMSwgcmV2OjEyLTE1LCBtZXRhbDo0 LTExLCBib25kX2lkOjAtMyAqLworCXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9NSVNDLCBN SVNDX1JFR0lTVEVSU19DSElQX05VTSk7CisJaWQgPSAoKHZhbCAmIDB4ZmZmZikgPDwgMTYp OworCXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9NSVNDLCBNSVNDX1JFR0lTVEVSU19DSElQ X1JFVik7CisJaWQgfD0gKCh2YWwgJiAweGYpIDw8IDEyKTsKKwl2YWwgPSBSRUdfUkQoYnAs IEdSQ0JBU0VfTUlTQywgTUlTQ19SRUdJU1RFUlNfQ0hJUF9NRVRBTCk7CisJaWQgfD0gKCh2 YWwgJiAweGZmKSA8PCA0KTsKKwlSRUdfUkQoYnAsIEdSQ0JBU0VfTUlTQywgTUlTQ19SRUdJ U1RFUlNfQk9ORF9JRCk7CisJaWQgfD0gKHZhbCAmIDB4Zik7CisJYnAtPmNoaXBfaWQgPSBp ZDsKKwlCTlgyWF9ERVZfSU5GTygiY2hpcCBJRCBpcyAleFxuIiwgaWQpOworCisJaWYgKCFi cC0+c2htZW1fYmFzZSB8fCAoYnAtPnNobWVtX2Jhc2UgIT0gMHhBRjkwMCkpIHsKKwkJQk5Y MlhfREVWX0lORk8oIk1DUCBub3QgYWN0aXZlXG4iKTsKKwkJbm9tY3AgPSAxOworCQlnb3Rv IHNldF9tYWM7CisJfQorCisJdmFsID0gU0hNRU1fUkQoYnAsIHZhbGlkaXR5X21hcFtwb3J0 XSk7CisJaWYgKCh2YWwgJiAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9NRU1f VkFMSURJVFlfTUIpKQorCQkhPSAoU0hSX01FTV9WQUxJRElUWV9ERVZfSU5GTyB8IFNIUl9N RU1fVkFMSURJVFlfTUIpKSB7CisJCUJOWDJYX0VSUigiTUNQIHZhbGlkaXR5IHNpZ25hdHVy ZSBiYWRcbiIpOworCX0KKworCWJwLT5md19zZXEgPSAoU0hNRU1fUkQoYnAsIGRydl9md19t Yltwb3J0XS5kcnZfbWJfaGVhZGVyKSAmCisJCSAgICAgIERSVl9NU0dfU0VRX05VTUJFUl9N QVNLKTsKKworCWJwLT5od19jb25maWcgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVk X2h3X2NvbmZpZy5jb25maWcpOworCisJYnAtPnNlcmRlc19jb25maWcgPQorCQlTSE1FTV9S RChicCwgZGV2X2luZm8ucG9ydF9od19jb25maWdbYnAtPnBvcnRdLnNlcmRlc19jb25maWcp OworCWJwLT5sYW5lX2NvbmZpZyA9CisJCVNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2h3 X2NvbmZpZ1twb3J0XS5sYW5lX2NvbmZpZyk7CisJYnAtPmV4dF9waHlfY29uZmlnID0KKwkJ U0hNRU1fUkQoYnAsCisJCQkgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uZXh0ZXJu YWxfcGh5X2NvbmZpZyk7CisJYnAtPnNwZWVkX2NhcF9tYXNrID0KKwkJU0hNRU1fUkQoYnAs CisJCQkgZGV2X2luZm8ucG9ydF9od19jb25maWdbcG9ydF0uc3BlZWRfY2FwYWJpbGl0eV9t YXNrKTsKKworCWJwLT5saW5rX2NvbmZpZyA9CisJCVNITUVNX1JEKGJwLCBkZXZfaW5mby5w b3J0X2ZlYXR1cmVfY29uZmlnW3BvcnRdLmxpbmtfY29uZmlnKTsKKworCUJOWDJYX0RFVl9J TkZPKCJod19jb25maWcgKCUwOHgpICBzZXJkZXNfY29uZmlnICglMDh4KVxuIgorCSAgICAg S0VSTl9JTkZPICIgIGxhbmVfY29uZmlnICglMDh4KSAgZXh0X3BoeV9jb25maWcgKCUwOHgp XG4iCisJICAgICBLRVJOX0lORk8gIiAgc3BlZWRfY2FwX21hc2sgKCUwOHgpICBsaW5rX2Nv bmZpZyAoJTA4eCkiCisJCSAgICAgICAiICBmd19zZXEgKCUwOHgpXG4iLAorCQkgICAgICAg YnAtPmh3X2NvbmZpZywgYnAtPnNlcmRlc19jb25maWcsIGJwLT5sYW5lX2NvbmZpZywKKwkJ ICAgICAgIGJwLT5leHRfcGh5X2NvbmZpZywgYnAtPnNwZWVkX2NhcF9tYXNrLAorCQkgICAg ICAgYnAtPmxpbmtfY29uZmlnLCBicC0+Zndfc2VxKTsKKworCXN3aXRjaF9jZmcgPSAoYnAt PmxpbmtfY29uZmlnICYgUE9SVF9GRUFUVVJFX0NPTk5FQ1RFRF9TV0lUQ0hfTUFTSyk7CisJ Ym54MnhfbGlua19zZXR0aW5nc19zdXBwb3J0ZWQoYnAsIHN3aXRjaF9jZmcpOworCisJYnAt PmF1dG9uZWcgPSAoYnAtPmh3X2NvbmZpZyAmIFNIQVJFRF9IV19DRkdfQU5fRU5BQkxFX01B U0spOworCS8qIGZvciBub3cgZGlzYWJsZSBjbDczICovCisJYnAtPmF1dG9uZWcgJj0gflNI QVJFRF9IV19DRkdfQU5fRU5BQkxFX0NMNzM7CisJQk5YMlhfREVWX0lORk8oImF1dG9uZWcg MHgleFxuIiwgYnAtPmF1dG9uZWcpOworCisJYm54MnhfbGlua19zZXR0aW5nc19yZXF1ZXN0 ZWQoYnApOworCisJdmFsMiA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0X2h3X2NvbmZp Z1twb3J0XS5tYWNfdXBwZXIpOworCXZhbCA9IFNITUVNX1JEKGJwLCBkZXZfaW5mby5wb3J0 X2h3X2NvbmZpZ1twb3J0XS5tYWNfbG93ZXIpOworCWJwLT5kZXYtPmRldl9hZGRyWzBdID0g KHU4KSh2YWwyID4+IDggJiAweGZmKTsKKwlicC0+ZGV2LT5kZXZfYWRkclsxXSA9ICh1OCko dmFsMiAmIDB4ZmYpOworCWJwLT5kZXYtPmRldl9hZGRyWzJdID0gKHU4KSh2YWwgPj4gMjQg JiAweGZmKTsKKwlicC0+ZGV2LT5kZXZfYWRkclszXSA9ICh1OCkodmFsID4+IDE2ICYgMHhm Zik7CisJYnAtPmRldi0+ZGV2X2FkZHJbNF0gPSAodTgpKHZhbCA+PiA4ICAmIDB4ZmYpOwor CWJwLT5kZXYtPmRldl9hZGRyWzVdID0gKHU4KSh2YWwgJiAweGZmKTsKKwltZW1jcHkoYnAt PmRldi0+cGVybV9hZGRyLCBicC0+ZGV2LT5kZXZfYWRkciwgNik7CisKKwl2YWwgPSBTSE1F TV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZpZy5wYXJ0X251bSk7CisJdmFsMiA9 IFNITUVNX1JEKGJwLCBkZXZfaW5mby5zaGFyZWRfaHdfY29uZmlnLnBhcnRfbnVtWzRdKTsK Kwl2YWwzID0gU0hNRU1fUkQoYnAsIGRldl9pbmZvLnNoYXJlZF9od19jb25maWcucGFydF9u dW1bOF0pOworCXZhbDQgPSBTSE1FTV9SRChicCwgZGV2X2luZm8uc2hhcmVkX2h3X2NvbmZp Zy5wYXJ0X251bVsxMl0pOworCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggInBhcnQgbnVtYmVy ICVYLSVYLSVYLSVYXG4iLAorCSAgICAgICB2YWwsIHZhbDIsIHZhbDMsIHZhbDQpOworCisJ LyogYmMgdmVyICovCisJaWYgKCFub21jcCkgeworCQlicC0+YmNfdmVyID0gdmFsID0gKChT SE1FTV9SRChicCwgZGV2X2luZm8uYmNfcmV2KSkgPj4gOCk7CisJCUJOWDJYX0RFVl9JTkZP KCJiY192ZXIgJVhcbiIsIHZhbCk7CisJCWlmICh2YWwgPCBCTlgyWF9CQ19WRVIpIHsKKwkJ CS8qIGZvciBub3cgb25seSB3YXJuCisJCQkgKiBsYXRlciB3ZSBtaWdodCBuZWVkIHRvIGVu Zm9yY2UgdGhpcyAqLworCQkJQk5YMlhfRVJSKCJUaGlzIGRyaXZlciBuZWVkcyBiY192ZXIg JVggYnV0IGZvdW5kICVYLCIKKwkJCQkgICIgcGxlYXNlIHVwZ3JhZGUgQkNcbiIsIEJOWDJY X0JDX1ZFUiwgdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCWJwLT5iY192ZXIgPSAwOworCX0K KworCXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1fQ0ZH NCk7CisJYnAtPmZsYXNoX3NpemUgPSAoTlZSQU1fMU1CX1NJWkUgPDwgKHZhbCAmIE1DUFJf TlZNX0NGRzRfRkxBU0hfU0laRSkpOworCUJOWDJYX0RFVl9JTkZPKCJmbGFzaF9zaXplIDB4 JXggKCVkKVxuIiwKKwkJICAgICAgIGJwLT5mbGFzaF9zaXplLCBicC0+Zmxhc2hfc2l6ZSk7 CisKKwlyZXR1cm47CisKK3NldF9tYWM6IC8qIG9ubHkgc3VwcG9zZWQgdG8gaGFwcGVuIG9u IGVtdWxhdGlvbi9GUEdBICovCisJQk5YMlhfRVJSKCJ3YXJuaW5nIGNvbnN0YW50IE1BQyB3 b3JrYXJvdW5kIGFjdGl2ZVxuIik7CisJYnAtPmRldi0+ZGV2X2FkZHJbMF0gPSAwOworCWJw LT5kZXYtPmRldl9hZGRyWzFdID0gMHg1MDsKKwlicC0+ZGV2LT5kZXZfYWRkclsyXSA9IDB4 YzI7CisJYnAtPmRldi0+ZGV2X2FkZHJbM10gPSAweDJjOworCWJwLT5kZXYtPmRldl9hZGRy WzRdID0gMHg3MTsKKwlicC0+ZGV2LT5kZXZfYWRkcls1XSA9IHBvcnQ/IDB4MGQ6MHgwZTsK KworCW1lbWNweShicC0+ZGV2LT5wZXJtX2FkZHIsIGJwLT5kZXYtPmRldl9hZGRyLCA2KTsK K30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBldGh0b29sIHNlcnZpY2UgZnVu Y3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQWxsIGV0aHRvb2wgZnVuY3Rp b25zIGNhbGxlZCB3aXRoIHJ0bmxfbG9jayAqLworCitzdGF0aWMgaW50IGJueDJ4X2dldF9z ZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNt ZCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWNtZC0+ c3VwcG9ydGVkID0gYnAtPnN1cHBvcnRlZDsKKwljbWQtPmFkdmVydGlzaW5nID0gYnAtPmFk dmVydGlzaW5nOworCisJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQljbWQtPnNw ZWVkID0gYnAtPmxpbmVfc3BlZWQ7CisJCWNtZC0+ZHVwbGV4ID0gYnAtPmR1cGxleDsKKwl9 IGVsc2UgeworCQljbWQtPnNwZWVkID0gYnAtPnJlcV9saW5lX3NwZWVkOworCQljbWQtPmR1 cGxleCA9IGJwLT5yZXFfZHVwbGV4OworCX0KKworCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZ X1hHWFNfRkxBRykgeworCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOworCX0gZWxzZSB7CisJ CWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJfQorCisJY21kLT5waHlfYWRkcmVzcyA9IGJwLT5w aHlfYWRkcjsKKwljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKKworCWlmIChi cC0+cmVxX2F1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSB7CisJCWNtZC0+YXV0b25lZyA9IEFV VE9ORUdfRU5BQkxFOworCX0gZWxzZSB7CisJCWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElT QUJMRTsKKwl9CisKKwlEUChORVRJRl9NU0dfTElOSywgImV0aHRvb2xfY21kOiBjbWQgJWRc biIKKwkgICBEUF9MRVZFTCAiICBzdXBwb3J0ZWQgMHgleCAgYWR2ZXJ0aXNpbmcgMHgleCAg c3BlZWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBkdXBsZXggJWQgIHBvcnQgJWQgIHBoeV9h ZGRyZXNzICVkICB0cmFuc2NlaXZlciAlZFxuIgorCSAgIERQX0xFVkVMICIgIGF1dG9uZWcg JWQgIG1heHR4cGt0ICVkICBtYXhyeHBrdCAlZFxuIiwKKwkgICBjbWQtPmNtZCwgY21kLT5z dXBwb3J0ZWQsIGNtZC0+YWR2ZXJ0aXNpbmcsIGNtZC0+c3BlZWQsCisJICAgY21kLT5kdXBs ZXgsIGNtZC0+cG9ydCwgY21kLT5waHlfYWRkcmVzcywgY21kLT50cmFuc2NlaXZlciwKKwkg ICBjbWQtPmF1dG9uZWcsIGNtZC0+bWF4dHhwa3QsIGNtZC0+bWF4cnhwa3QpOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRf ZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCXN0cnVjdCBibngy eCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBhZHZlcnRpc2luZzsKKworCURQKE5F VElGX01TR19MSU5LLCAiZXRodG9vbF9jbWQ6IGNtZCAlZFxuIgorCSAgIERQX0xFVkVMICIg IHN1cHBvcnRlZCAweCV4ICBhZHZlcnRpc2luZyAweCV4ICBzcGVlZCAlZFxuIgorCSAgIERQ X0xFVkVMICIgIGR1cGxleCAlZCAgcG9ydCAlZCAgcGh5X2FkZHJlc3MgJWQgIHRyYW5zY2Vp dmVyICVkXG4iCisJICAgRFBfTEVWRUwgIiAgYXV0b25lZyAlZCAgbWF4dHhwa3QgJWQgIG1h eHJ4cGt0ICVkXG4iLAorCSAgIGNtZC0+Y21kLCBjbWQtPnN1cHBvcnRlZCwgY21kLT5hZHZl cnRpc2luZywgY21kLT5zcGVlZCwKKwkgICBjbWQtPmR1cGxleCwgY21kLT5wb3J0LCBjbWQt PnBoeV9hZGRyZXNzLCBjbWQtPnRyYW5zY2VpdmVyLAorCSAgIGNtZC0+YXV0b25lZywgY21k LT5tYXh0eHBrdCwgY21kLT5tYXhyeHBrdCk7CisKKwlzd2l0Y2ggKGNtZC0+cG9ydCkgewor CWNhc2UgUE9SVF9UUDoKKwkJaWYgKCEoYnAtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF9UUCkp IHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChicC0+cGh5X2ZsYWdzICYgUEhZ X1hHWFNfRkxBRykgeworCQkJYm54MnhfbGlua19yZXNldChicCk7CisJCQlibngyeF9saW5r X3NldHRpbmdzX3N1cHBvcnRlZChicCwgU1dJVENIX0NGR18xRyk7CisJCQlibngyeF9waHlf ZGVhc3NlcnQoYnApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBQT1JUX0ZJQlJFOgorCQlp ZiAoIShicC0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0ZJQlJFKSkgeworCQkJcmV0dXJuIC1F SU5WQUw7CisJCX0KKwkJaWYgKCEoYnAtPnBoeV9mbGFncyAmIFBIWV9YR1hTX0ZMQUcpKSB7 CisJCQlibngyeF9saW5rX3Jlc2V0KGJwKTsKKwkJCWJueDJ4X2xpbmtfc2V0dGluZ3Nfc3Vw cG9ydGVkKGJwLCBTV0lUQ0hfQ0ZHXzEwRyk7CisJCQlibngyeF9waHlfZGVhc3NlcnQoYnAp OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKiBhZHZlcnRp c2UgdGhlIHJlcXVlc3RlZCBzcGVlZCBhbmQgZHVwbGV4IGlmIHN1cHBvcnRlZCAqLworCQlj bWQtPmFkdmVydGlzaW5nICY9IGJwLT5zdXBwb3J0ZWQ7CisKKwkJYnAtPnJlcV9hdXRvbmVn IHw9IEFVVE9ORUdfU1BFRUQ7CisJCWJwLT5yZXFfbGluZV9zcGVlZCA9IDA7CisJCWJwLT5y ZXFfZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CisJCWJwLT5hZHZlcnRpc2luZyB8PSAoQURWRVJU SVNFRF9BdXRvbmVnIHwgY21kLT5hZHZlcnRpc2luZyk7CisKKwl9IGVsc2UgeyAvKiBmb3Jj ZWQgbW9kZSAqLworCQkvKiBhZHZlcnRpc2UgdGhlIHJlcXVlc3RlZCBzcGVlZCBhbmQgZHVw bGV4IGlmIHN1cHBvcnRlZCAqLworCQlzd2l0Y2ggKGNtZC0+c3BlZWQpIHsKKwkJY2FzZSBT UEVFRF8xMDoKKwkJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJCWlm ICghKGJwLT5zdXBwb3J0ZWQgJgorCQkJCQkJU1VQUE9SVEVEXzEwYmFzZVRfRnVsbCkpIHsK KwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWFkdmVydGlzaW5nID0gKEFEVkVS VElTRURfMTBiYXNlVF9GdWxsIHwKKwkJCQkJICAgICAgIEFEVkVSVElTRURfVFApOworCQkJ fSBlbHNlIHsKKwkJCQlpZiAoIShicC0+c3VwcG9ydGVkICYKKwkJCQkJCVNVUFBPUlRFRF8x MGJhc2VUX0hhbGYpKSB7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlhZHZl cnRpc2luZyA9IChBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZiB8CisJCQkJCSAgICAgICBBRFZF UlRJU0VEX1RQKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwOgorCQkJ aWYgKGNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CisJCQkJaWYgKCEoYnAtPnN1cHBv cnRlZCAmCisJCQkJCQlTVVBQT1JURURfMTAwYmFzZVRfRnVsbCkpIHsKKwkJCQkJcmV0dXJu IC1FSU5WQUw7CisJCQkJfQorCQkJCWFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMTAwYmFz ZVRfRnVsbCB8CisJCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCX0gZWxzZSB7CisJ CQkJaWYgKCEoYnAtPnN1cHBvcnRlZCAmCisJCQkJCQlTVVBQT1JURURfMTAwYmFzZVRfSGFs ZikpIHsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCWFkdmVydGlzaW5nID0g KEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQ KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCWlmIChjbWQt PmR1cGxleCAhPSBEVVBMRVhfRlVMTCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQor CQkJaWYgKCEoYnAtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkpIHsK KwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWFkdmVydGlzaW5nID0gKEFEVkVSVElT RURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCWJy ZWFrOworCisJCWNhc2UgU1BFRURfMjUwMDoKKwkJCWlmIChjbWQtPmR1cGxleCAhPSBEVVBM RVhfRlVMTCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKCEoYnAtPnN1 cHBvcnRlZCAmIFNVUFBPUlRFRF8yNTAwYmFzZVRfRnVsbCkpIHsKKwkJCQlyZXR1cm4gLUVJ TlZBTDsKKwkJCX0KKwkJCWFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfMjUwMGJhc2VUX0Z1 bGwgfAorCQkJCSAgICAgICBBRFZFUlRJU0VEX1RQKTsKKwkJCWJyZWFrOworCisJCWNhc2Ug U1BFRURfMTAwMDA6CisJCQlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpIHsKKwkJ CQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICghKGJwLT5zdXBwb3J0ZWQgJiBTVVBQ T1JURURfMTAwMDBiYXNlVF9GdWxsKSkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQor CQkJYWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCSAg ICAgICBBRFZFUlRJU0VEX0ZJQlJFKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQly ZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWJwLT5yZXFfYXV0b25lZyAmPSB+QVVUT05FR19T UEVFRDsKKwkJYnAtPnJlcV9saW5lX3NwZWVkID0gY21kLT5zcGVlZDsKKwkJYnAtPnJlcV9k dXBsZXggPSBjbWQtPmR1cGxleDsKKwkJYnAtPmFkdmVydGlzaW5nID0gYWR2ZXJ0aXNpbmc7 CisJfQorCisJRFAoTkVUSUZfTVNHX0xJTkssICJyZXFfYXV0b25lZyAweCV4ICByZXFfbGlu ZV9zcGVlZCAlZFxuIgorCSAgIERQX0xFVkVMICIgIHJlcV9kdXBsZXggJWQgIGFkdmVydGlz aW5nIDB4JXhcbiIsCisJICAgYnAtPnJlcV9hdXRvbmVnLCBicC0+cmVxX2xpbmVfc3BlZWQs IGJwLT5yZXFfZHVwbGV4LAorCSAgIGJwLT5hZHZlcnRpc2luZyk7CisKKwlibngyeF9zdG9w X3N0YXRzKGJwKTsKKwlibngyeF9saW5rX2luaXRpYWxpemUoYnApOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNl ICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0 cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RyY3B5KGluZm8tPmRy aXZlciwgRFJWX01PRFVMRV9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01P RFVMRV9WRVJTSU9OKTsKKwlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCAzMiwgIiVkLiVk LiVkOiVkIChCQyBWRVIgJXgpIiwKKwkJIEJDTV81NzEwX0ZXX01BSk9SX1ZFUlNJT04sIEJD TV81NzEwX0ZXX01JTk9SX1ZFUlNJT04sCisJCSBCQ01fNTcxMF9GV19SRVZJU0lPTl9WRVJT SU9OLCBCQ01fNTcxMF9GV19DT01QSUxFX0ZMQUdTLAorCQkgYnAtPmJjX3Zlcik7CisJc3Ry Y3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShicC0+cGRldikpOworCWluZm8tPm5fc3Rh dHMgPSBCTlgyWF9OVU1fU1RBVFM7CisJaW5mby0+dGVzdGluZm9fbGVuID0gQk5YMlhfTlVN X1RFU1RTOworCWluZm8tPmVlZHVtcF9sZW4gPSBicC0+Zmxhc2hfc2l6ZTsKKwlpbmZvLT5y ZWdkdW1wX2xlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X2dldF93b2woc3RydWN0 IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0 cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGJwLT5mbGFncyAm IE5PX1dPTF9GTEFHKSB7CisJCXdvbC0+c3VwcG9ydGVkID0gMDsKKwkJd29sLT53b2xvcHRz ID0gMDsKKwl9IGVsc2UgeworCQl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfTUFHSUM7CisJCWlm IChicC0+d29sKQorCQkJd29sLT53b2xvcHRzID0gV0FLRV9NQUdJQzsKKwkJZWxzZQorCQkJ d29sLT53b2xvcHRzID0gMDsKKwl9CisJbWVtc2V0KCZ3b2wtPnNvcGFzcywgMCwgc2l6ZW9m KHdvbC0+c29wYXNzKSk7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X3dvbChzdHJ1Y3Qg bmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3Ry dWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAod29sLT53b2xvcHRz ICYgfldBS0VfTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdvbC0+d29sb3B0 cyAmIFdBS0VfTUFHSUMpIHsKKwkJaWYgKGJwLT5mbGFncyAmIE5PX1dPTF9GTEFHKQorCQkJ cmV0dXJuIC1FSU5WQUw7CisKKwkJYnAtPndvbCA9IDE7CisJfSBlbHNlIHsKKwkJYnAtPndv bCA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGJueDJ4X2dldF9tc2ds ZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBu ZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIGJwLT5tc2dsZXZlbDsKK30KKworc3RhdGlj IHZvaWQgYm54Mnhfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBs ZXZlbCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlm IChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlicC0+bXNnbGV2ZWwgPSBsZXZlbDsKK30K Kworc3RhdGljIGludCBibngyeF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYp Cit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlibngyeF9z dG9wX3N0YXRzKGJwKTsKKwlibngyeF9saW5rX2luaXRpYWxpemUoYnApOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9k ZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsK KworCXJldHVybiBicC0+Zmxhc2hfc2l6ZTsKK30KKworc3RhdGljIGludCBibngyeF9hY3F1 aXJlX252cmFtX2xvY2soc3RydWN0IGJueDJ4ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5w b3J0OworCWludCBjb3VudCwgaTsKKwl1MzIgdmFsID0gMDsKKworCS8qIGFkanVzdCB0aW1l b3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLworCWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VO VDsKKwlpZiAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0VNVUwpCisJCWNvdW50ICo9IDEw MDsKKworCS8qIHJlcXVlc3QgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLworCVJFR19X UihicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCLAorCSAgICAgICAo TUNQUl9OVk1fU1dfQVJCX0FSQl9SRVFfU0VUMSA8PCBwb3J0KSk7CisKKwlmb3IgKGkgPSAw OyBpIDwgY291bnQqMTA7IGkrKykgeworCQl2YWwgPSBSRUdfUkQoYnAsIEdSQ0JBU0VfTUNQ LCBNQ1BfUkVHX01DUFJfTlZNX1NXX0FSQik7CisJCWlmICh2YWwgJiAoTUNQUl9OVk1fU1df QVJCX0FSQl9BUkIxIDw8IHBvcnQpKSB7CisJCQlicmVhazsKKwkJfQorCisJCXVkZWxheSg1 KTsKKwl9CisKKwlpZiAoISh2YWwgJiAoTUNQUl9OVk1fU1dfQVJCX0FSQl9BUkIxIDw8IHBv cnQpKSkgeworCQlEUChORVRJRl9NU0dfTlZNLCAiY2Fubm90IGdldCBhY2Nlc3MgdG8gbnZy YW0gaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBibngyeF9yZWxlYXNlX252cmFtX2xvY2soc3RydWN0IGJueDJ4 ICpicCkKK3sKKwlpbnQgcG9ydCA9IGJwLT5wb3J0OworCWludCBjb3VudCwgaTsKKwl1MzIg dmFsID0gMDsKKworCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLwor CWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKKwlpZiAoQ0hJUF9SRVYoYnApID09IENI SVBfUkVWX0VNVUwpCisJCWNvdW50ICo9IDEwMDsKKworCS8qIHJlbGlucXVpc2ggbnZyYW0g aW50ZXJmYWNlICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01DUCwgTUNQX1JFR19NQ1BSX05W TV9TV19BUkIsCisJICAgICAgIChNQ1BSX05WTV9TV19BUkJfQVJCX1JFUV9DTFIxIDw8IHBv cnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudCoxMDsgaSsrKSB7CisJCXZhbCA9IFJF R19SRChicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1fU1dfQVJCKTsKKwkJaWYg KCEodmFsICYgKE1DUFJfTlZNX1NXX0FSQl9BUkJfQVJCMSA8PCBwb3J0KSkpIHsKKwkJCWJy ZWFrOworCQl9CisKKwkJdWRlbGF5KDUpOworCX0KKworCWlmICh2YWwgJiAoTUNQUl9OVk1f U1dfQVJCX0FSQl9BUkIxIDw8IHBvcnQpKSB7CisJCURQKE5FVElGX01TR19OVk0sICJjYW5u b3QgZnJlZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIC1FQlVT WTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZW5hYmxlX252 cmFtX2FjY2VzcyhzdHJ1Y3QgYm54MnggKmJwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBS RUdfUkQoYnAsIEdSQ0JBU0VfTUNQLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUp OworCisJLyogZW5hYmxlIGJvdGggYml0cywgZXZlbiBvbiByZWFkICovCisJUkVHX1dSKGJw LCBHUkNCQVNFX01DUCwgTUNQX1JFR19NQ1BSX05WTV9BQ0NFU1NfRU5BQkxFLAorCSAgICAg ICAodmFsIHwgTUNQUl9OVk1fQUNDRVNTX0VOQUJMRV9FTiB8CisJCSAgICAgIE1DUFJfTlZN X0FDQ0VTU19FTkFCTEVfV1JfRU4pKTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZGlzYWJs ZV9udnJhbV9hY2Nlc3Moc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MzIgdmFsOworCisJdmFs ID0gUkVHX1JEKGJwLCBHUkNCQVNFX01DUCwgTUNQX1JFR19NQ1BSX05WTV9BQ0NFU1NfRU5B QkxFKTsKKworCS8qIGRpc2FibGUgYm90aCBiaXRzLCBldmVuIGFmdGVyIHJlYWQgKi8KKwlS RUdfV1IoYnAsIEdSQ0JBU0VfTUNQLCBNQ1BfUkVHX01DUFJfTlZNX0FDQ0VTU19FTkFCTEUs CisJICAgICAgICh2YWwgJiB+KE1DUFJfTlZNX0FDQ0VTU19FTkFCTEVfRU4gfAorCQkJTUNQ Ul9OVk1fQUNDRVNTX0VOQUJMRV9XUl9FTikpKTsKK30KKworc3RhdGljIGludCBibngyeF9u dnJhbV9yZWFkX2R3b3JkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHUzMiAqcmV0 X3ZhbCwKKwkJCQkgIHUzMiBjbWRfZmxhZ3MpCit7CisJaW50IHJjOworCWludCBjb3VudCwg aTsKKwl1MzIgdmFsOworCisJLyogYnVpbGQgdGhlIGNvbW1hbmQgd29yZCAqLworCWNtZF9m bGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0RPSVQ7CisKKwkvKiBuZWVkIHRvIGNsZWFyIERP TkUgYml0IHNlcGFyYXRlbHkgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUNQLAorCSAgICAg ICBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQsIE1DUFJfTlZNX0NPTU1BTkRfRE9ORSk7CisK KwkvKiBhZGRyZXNzIG9mIHRoZSBOVlJBTSB0byByZWFkIGZyb20gKi8KKwlSRUdfV1IoYnAs IEdSQ0JBU0VfTUNQLCBNQ1BfUkVHX01DUFJfTlZNX0FERFIsCisJICAgICAgIChvZmZzZXQg JiBNQ1BSX05WTV9BRERSX05WTV9BRERSX1ZBTFVFKSk7CisKKwkvKiBpc3N1ZSBhIHJlYWQg Y29tbWFuZCAqLworCVJFR19XUihicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1f Q09NTUFORCwgY21kX2ZsYWdzKTsKKworCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRp b24vRlBHQSAqLworCWNvdW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKKwlpZiAoQ0hJUF9S RVYoYnApID09IENISVBfUkVWX0VNVUwpCisJCWNvdW50ICo9IDEwMDsKKworCS8qIHdhaXQg Zm9yIGNvbXBsZXRpb24gKi8KKwkqcmV0X3ZhbCA9IDA7CisJcmMgPSAtRUJVU1k7CisJZm9y IChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJdWRlbGF5KDUpOworCQl2YWwgPSBSRUdf UkQoYnAsIEdSQ0JBU0VfTUNQLCBNQ1BfUkVHX01DUFJfTlZNX0NPTU1BTkQpOworCisJCWlm ICh2YWwgJiBNQ1BSX05WTV9DT01NQU5EX0RPTkUpIHsKKwkJCXZhbCA9IFJFR19SRChicCwg R1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1fUkVBRCk7CisJCQlEUChORVRJRl9NU0df TlZNLCAidmFsIDB4JTA4eFxuIiwgdmFsKTsKKwkJCS8qIHdlIHJlYWQgbnZyYW0gZGF0YSBp biBjcHUgb3JkZXIKKwkJCSAqIGJ1dCBldGh0b29sIHNlZXMgaXQgYXMgYW4gYXJyYXkgb2Yg Ynl0ZXMKKwkJCSAqIGNvbnZlcnRpbmcgdG8gYmlnLWVuZGlhbiB3aWxsIGRvIHRoZSB3b3Jr ICovCisJCQl2YWwgPSBjcHVfdG9fYmUzMih2YWwpOworCQkJKnJldF92YWwgPSB2YWw7CisJ CQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3Rh dGljIGludCBibngyeF9udnJhbV9yZWFkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQs IHU4ICpyZXRfYnVmLAorCQkJICAgIGludCBidWZfc2l6ZSkKK3sKKwlpbnQgcmM7CisJdTMy IGNtZF9mbGFnczsKKwl1MzIgdmFsOworCisJaWYgKChvZmZzZXQgJiAweDAzKSB8fCAoYnVm X3NpemUgJiAweDAzKSB8fCAoYnVmX3NpemUgPT0gMCkpIHsKKwkJRFAoTkVUSUZfTVNHX05W TSwKKwkJICAgIkludmFsaWQgcGFyYW10ZXI6IG9mZnNldCAweCV4ICBidWZfc2l6ZSAweCV4 XG4iLAorCQkgICBvZmZzZXQsIGJ1Zl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJaWYgKG9mZnNldCArIGJ1Zl9zaXplID4gYnAtPmZsYXNoX3NpemUpIHsKKwkJRFAoTkVU SUZfTVNHX05WTSwgIkludmFsaWQgcGFyYW10ZXI6IG9mZnNldCAoMHgleCkgKyIKKwkJCQkg ICIgYnVmX3NpemUgKDB4JXgpID4gZmxhc2hfc2l6ZSAoMHgleClcbiIsCisJCSAgIG9mZnNl dCwgYnVmX3NpemUsIGJwLT5mbGFzaF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQor CisJLyogcmVxdWVzdCBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJcmMgPSBibngy eF9hY3F1aXJlX252cmFtX2xvY2soYnApOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJ fQorCisJLyogZW5hYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9l bmFibGVfbnZyYW1fYWNjZXNzKGJwKTsKKworCS8qIHJlYWQgdGhlIGZpcnN0IHdvcmQocykg Ki8KKwljbWRfZmxhZ3MgPSBNQ1BSX05WTV9DT01NQU5EX0ZJUlNUOworCXdoaWxlICgoYnVm X3NpemUgPiBzaXplb2YodTMyKSkgJiYgKHJjID09IDApKSB7CisJCXJjID0gYm54MnhfbnZy YW1fcmVhZF9kd29yZChicCwgb2Zmc2V0LCAmdmFsLCBjbWRfZmxhZ3MpOworCQltZW1jcHko cmV0X2J1ZiwgJnZhbCwgNCk7CisKKwkJLyogYWR2YW5jZSB0byB0aGUgbmV4dCBkd29yZCAq LworCQlvZmZzZXQgKz0gc2l6ZW9mKHUzMik7CisJCXJldF9idWYgKz0gc2l6ZW9mKHUzMik7 CisJCWJ1Zl9zaXplIC09IHNpemVvZih1MzIpOworCQljbWRfZmxhZ3MgPSAwOworCX0KKwor CWlmIChyYyA9PSAwKSB7CisJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0xBU1Q7 CisJCXJjID0gYm54MnhfbnZyYW1fcmVhZF9kd29yZChicCwgb2Zmc2V0LCAmdmFsLCBjbWRf ZmxhZ3MpOworCQltZW1jcHkocmV0X2J1ZiwgJnZhbCwgNCk7CisJfQorCisJLyogZGlzYWJs ZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJYm54MnhfZGlzYWJsZV9udnJhbV9h Y2Nlc3MoYnApOworCWJueDJ4X3JlbGVhc2VfbnZyYW1fbG9jayhicCk7CisKKwlyZXR1cm4g cmM7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZWVi dWYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJj OworCisJRFAoTkVUSUZfTVNHX05WTSwgImV0aHRvb2xfZWVwcm9tOiBjbWQgJWRcbiIKKwkg ICBEUF9MRVZFTCAiICBtYWdpYyAweCV4ICBvZmZzZXQgMHgleCAoJWQpICBsZW4gMHgleCAo JWQpXG4iLAorCSAgIGVlcHJvbS0+Y21kLCBlZXByb20tPm1hZ2ljLCBlZXByb20tPm9mZnNl dCwgZWVwcm9tLT5vZmZzZXQsCisJICAgZWVwcm9tLT5sZW4sIGVlcHJvbS0+bGVuKTsKKwor CS8qIHBhcmFtZXRlcnMgYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXRodG9vbF9nZXRfZWVwcm9t ICovCisKKwlyYyA9IGJueDJ4X252cmFtX3JlYWQoYnAsIGVlcHJvbS0+b2Zmc2V0LCBlZWJ1 ZiwgZWVwcm9tLT5sZW4pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGJueDJ4 X252cmFtX3dyaXRlX2R3b3JkKHN0cnVjdCBibngyeCAqYnAsIHUzMiBvZmZzZXQsIHUzMiB2 YWwsCisJCQkJICAgdTMyIGNtZF9mbGFncykKK3sKKwlpbnQgcmM7CisJaW50IGNvdW50LCBp OworCisJLyogYnVpbGQgdGhlIGNvbW1hbmQgd29yZCAqLworCWNtZF9mbGFncyB8PSBNQ1BS X05WTV9DT01NQU5EX0RPSVQgfCBNQ1BSX05WTV9DT01NQU5EX1dSOworCisJLyogbmVlZCB0 byBjbGVhciBET05FIGJpdCBzZXBhcmF0ZWx5ICovCisJUkVHX1dSKGJwLCBHUkNCQVNFX01D UCwKKwkgICAgICAgTUNQX1JFR19NQ1BSX05WTV9DT01NQU5ELCBNQ1BSX05WTV9DT01NQU5E X0RPTkUpOworCisJLyogd3JpdGUgdGhlIGRhdGEgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0Vf TUNQLCBNQ1BfUkVHX01DUFJfTlZNX1dSSVRFLCB2YWwpOworCisJLyogYWRkcmVzcyBvZiB0 aGUgTlZSQU0gdG8gd3JpdGUgdG8gKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUNQLCBNQ1Bf UkVHX01DUFJfTlZNX0FERFIsCisJICAgICAgIChvZmZzZXQgJiBNQ1BSX05WTV9BRERSX05W TV9BRERSX1ZBTFVFKSk7CisKKwkvKiBpc3N1ZSB0aGUgd3JpdGUgY29tbWFuZCAqLworCVJF R19XUihicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQUl9OVk1fQ09NTUFORCwgY21kX2Zs YWdzKTsKKworCS8qIGFkanVzdCB0aW1lb3V0IGZvciBlbXVsYXRpb24vRlBHQSAqLworCWNv dW50ID0gTlZSQU1fVElNRU9VVF9DT1VOVDsKKwlpZiAoQ0hJUF9SRVYoYnApID09IENISVBf UkVWX0VNVUwpCisJCWNvdW50ICo9IDEwMDsKKworCS8qIHdhaXQgZm9yIGNvbXBsZXRpb24g Ki8KKwlyYyA9IC1FQlVTWTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1 ZGVsYXkoNSk7CisJCXZhbCA9IFJFR19SRChicCwgR1JDQkFTRV9NQ1AsIE1DUF9SRUdfTUNQ Ul9OVk1fQ09NTUFORCk7CisJCWlmICh2YWwgJiBNQ1BSX05WTV9DT01NQU5EX0RPTkUpIHsK KwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisj ZGVmaW5lIEJZVEVfT0ZGU0VUKG9mZnNldCkJCSg4ICogKG9mZnNldCAmIDB4MDMpKQorCitz dGF0aWMgaW50IGJueDJ4X252cmFtX3dyaXRlMShzdHJ1Y3QgYm54MnggKmJwLCB1MzIgb2Zm c2V0LCB1OCAqZGF0YV9idWYsCisJCQkgICAgICBpbnQgYnVmX3NpemUpCit7CisJaW50IHJj OworCXUzMiBjbWRfZmxhZ3M7CisJdTMyIGFsaWduX29mZnNldDsKKwl1MzIgdmFsOworCisJ aWYgKG9mZnNldCArIGJ1Zl9zaXplID4gYnAtPmZsYXNoX3NpemUpIHsKKwkJRFAoTkVUSUZf TVNHX05WTSwgIkludmFsaWQgcGFyYW10ZXI6IG9mZnNldCAoMHgleCkgKyIKKwkJCQkgICIg YnVmX3NpemUgKDB4JXgpID4gZmxhc2hfc2l6ZSAoMHgleClcbiIsCisJCSAgIG9mZnNldCwg YnVmX3NpemUsIGJwLT5mbGFzaF9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ LyogcmVxdWVzdCBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJcmMgPSBibngyeF9h Y3F1aXJlX252cmFtX2xvY2soYnApOworCWlmIChyYykgeworCQlyZXR1cm4gcmM7CisJfQor CisJLyogZW5hYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9lbmFi bGVfbnZyYW1fYWNjZXNzKGJwKTsKKworCWNtZF9mbGFncyA9IChNQ1BSX05WTV9DT01NQU5E X0ZJUlNUIHwgTUNQUl9OVk1fQ09NTUFORF9MQVNUKTsKKwlhbGlnbl9vZmZzZXQgPSAob2Zm c2V0ICYgfjB4MDMpOworCXJjID0gYm54MnhfbnZyYW1fcmVhZF9kd29yZChicCwgYWxpZ25f b2Zmc2V0LCAmdmFsLCBjbWRfZmxhZ3MpOworCisJaWYgKHJjID09IDApIHsKKwkJdmFsICY9 IH4oMHhmZiA8PCBCWVRFX09GRlNFVChvZmZzZXQpKTsKKwkJdmFsIHw9ICgqZGF0YV9idWYg PDwgQllURV9PRkZTRVQob2Zmc2V0KSk7CisKKwkJLyogbnZyYW0gZGF0YSBpcyByZXR1cm5l ZCBhcyBhbiBhcnJheSBvZiBieXRlcworCQkgKiBjb252ZXJ0IGl0IGJhY2sgdG8gY3B1IG9y ZGVyICovCisJCXZhbCA9IGJlMzJfdG9fY3B1KHZhbCk7CisKKwkJRFAoTkVUSUZfTVNHX05W TSwgInZhbCAweCUwOHhcbiIsIHZhbCk7CisKKwkJcmMgPSBibngyeF9udnJhbV93cml0ZV9k d29yZChicCwgYWxpZ25fb2Zmc2V0LCB2YWwsCisJCQkJCSAgICAgY21kX2ZsYWdzKTsKKwl9 CisKKwkvKiBkaXNhYmxlIGFjY2VzcyB0byBudnJhbSBpbnRlcmZhY2UgKi8KKwlibngyeF9k aXNhYmxlX252cmFtX2FjY2VzcyhicCk7CisJYm54MnhfcmVsZWFzZV9udnJhbV9sb2NrKGJw KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9udnJhbV93cml0ZShz dHJ1Y3QgYm54MnggKmJwLCB1MzIgb2Zmc2V0LCB1OCAqZGF0YV9idWYsCisJCQkgICAgIGlu dCBidWZfc2l6ZSkKK3sKKwlpbnQgcmM7CisJdTMyIGNtZF9mbGFnczsKKwl1MzIgdmFsOwor CXUzMiB3cml0dGVuX3NvX2ZhcjsKKworCWlmIChidWZfc2l6ZSA9PSAxKSB7CS8qIGV0aHRv b2wgKi8KKwkJcmV0dXJuIGJueDJ4X252cmFtX3dyaXRlMShicCwgb2Zmc2V0LCBkYXRhX2J1 ZiwgYnVmX3NpemUpOworCX0KKworCWlmICgob2Zmc2V0ICYgMHgwMykgfHwgKGJ1Zl9zaXpl ICYgMHgwMykgfHwgKGJ1Zl9zaXplID09IDApKSB7CisJCURQKE5FVElGX01TR19OVk0sCisJ CSAgICJJbnZhbGlkIHBhcmFtdGVyOiBvZmZzZXQgMHgleCAgYnVmX3NpemUgMHgleFxuIiwK KwkJICAgb2Zmc2V0LCBidWZfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlm IChvZmZzZXQgKyBidWZfc2l6ZSA+IGJwLT5mbGFzaF9zaXplKSB7CisJCURQKE5FVElGX01T R19OVk0sICJJbnZhbGlkIHBhcmFtdGVyOiBvZmZzZXQgKDB4JXgpICsiCisJCQkJICAiIGJ1 Zl9zaXplICgweCV4KSA+IGZsYXNoX3NpemUgKDB4JXgpXG4iLAorCQkgICBvZmZzZXQsIGJ1 Zl9zaXplLCBicC0+Zmxhc2hfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8q IHJlcXVlc3QgYWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLworCXJjID0gYm54MnhfYWNx dWlyZV9udnJhbV9sb2NrKGJwKTsKKwlpZiAocmMpIHsKKwkJcmV0dXJuIHJjOworCX0KKwor CS8qIGVuYWJsZSBhY2Nlc3MgdG8gbnZyYW0gaW50ZXJmYWNlICovCisJYm54MnhfZW5hYmxl X252cmFtX2FjY2VzcyhicCk7CisKKwl3cml0dGVuX3NvX2ZhciA9IDA7CisJY21kX2ZsYWdz ID0gTUNQUl9OVk1fQ09NTUFORF9GSVJTVDsKKwl3aGlsZSAoKHdyaXR0ZW5fc29fZmFyIDwg YnVmX3NpemUpICYmIChyYyA9PSAwKSkgeworCQlpZiAod3JpdHRlbl9zb19mYXIgPT0gKGJ1 Zl9zaXplIC0gc2l6ZW9mKHUzMikpKQorCQkJY21kX2ZsYWdzIHw9IE1DUFJfTlZNX0NPTU1B TkRfTEFTVDsKKwkJZWxzZSBpZiAoKChvZmZzZXQgKyA0KSAlIE5WUkFNX1BBR0VfU0laRSkg PT0gMCkKKwkJCWNtZF9mbGFncyB8PSBNQ1BSX05WTV9DT01NQU5EX0xBU1Q7CisJCWVsc2Ug aWYgKChvZmZzZXQgJSBOVlJBTV9QQUdFX1NJWkUpID09IDApCisJCQljbWRfZmxhZ3MgfD0g TUNQUl9OVk1fQ09NTUFORF9GSVJTVDsKKworCQltZW1jcHkoJnZhbCwgZGF0YV9idWYsIDQp OworCQlEUChORVRJRl9NU0dfTlZNLCAidmFsIDB4JTA4eFxuIiwgdmFsKTsKKworCQlyYyA9 IGJueDJ4X252cmFtX3dyaXRlX2R3b3JkKGJwLCBvZmZzZXQsIHZhbCwgY21kX2ZsYWdzKTsK KworCQkvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGR3b3JkICovCisJCW9mZnNldCArPSBzaXpl b2YodTMyKTsKKwkJZGF0YV9idWYgKz0gc2l6ZW9mKHUzMik7CisJCXdyaXR0ZW5fc29fZmFy ICs9IHNpemVvZih1MzIpOworCQljbWRfZmxhZ3MgPSAwOworCX0KKworCS8qIGRpc2FibGUg YWNjZXNzIHRvIG52cmFtIGludGVyZmFjZSAqLworCWJueDJ4X2Rpc2FibGVfbnZyYW1fYWNj ZXNzKGJwKTsKKwlibngyeF9yZWxlYXNlX252cmFtX2xvY2soYnApOworCisJcmV0dXJuIHJj OworfQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2Ug KmRldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmVlYnVm KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCByYzsK KworCURQKE5FVElGX01TR19OVk0sICJldGh0b29sX2VlcHJvbTogY21kICVkXG4iCisJICAg RFBfTEVWRUwgIiAgbWFnaWMgMHgleCAgb2Zmc2V0IDB4JXggKCVkKSAgbGVuIDB4JXggKCVk KVxuIiwKKwkgICBlZXByb20tPmNtZCwgZWVwcm9tLT5tYWdpYywgZWVwcm9tLT5vZmZzZXQs IGVlcHJvbS0+b2Zmc2V0LAorCSAgIGVlcHJvbS0+bGVuLCBlZXByb20tPmxlbik7CisKKwkv KiBwYXJhbWV0ZXJzIGFscmVhZHkgdmFsaWRhdGVkIGluIGV0aHRvb2xfc2V0X2VlcHJvbSAq LworCisJcmMgPSBibngyeF9udnJhbV93cml0ZShicCwgZWVwcm9tLT5vZmZzZXQsIGVlYnVm LCBlZXByb20tPmxlbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhf Z2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3Qg ZXRodG9vbF9jb2FsZXNjZSAqY29hbCkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2 X3ByaXYoZGV2KTsKKworCW1lbXNldChjb2FsLCAwLCBzaXplb2Yoc3RydWN0IGV0aHRvb2xf Y29hbGVzY2UpKTsKKworCWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzID0gYnAtPnJ4X3RpY2tz OworCWNvYWwtPnR4X2NvYWxlc2NlX3VzZWNzID0gYnAtPnR4X3RpY2tzOworCWNvYWwtPnN0 YXRzX2Jsb2NrX2NvYWxlc2NlX3VzZWNzID0gYnAtPnN0YXRzX3RpY2tzOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2 aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbCkKK3sK KwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWJwLT5yeF90aWNr cyA9ICh1MTYpIGNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzOworCWlmIChicC0+cnhfdGlja3Mg PiAzMDAwKQorCQlicC0+cnhfdGlja3MgPSAzMDAwOworCisJYnAtPnR4X3RpY2tzID0gKHUx NikgY29hbC0+dHhfY29hbGVzY2VfdXNlY3M7CisJaWYgKGJwLT50eF90aWNrcyA+IDB4MzAw MCkKKwkJYnAtPnR4X3RpY2tzID0gMHgzMDAwOworCisJYnAtPnN0YXRzX3RpY2tzID0gY29h bC0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3M7CisJaWYgKGJwLT5zdGF0c190aWNrcyA+ IDB4ZmZmZjAwKQorCQlicC0+c3RhdHNfdGlja3MgPSAweGZmZmYwMDsKKwlicC0+c3RhdHNf dGlja3MgJj0gMHhmZmZmMDA7CisKKwlpZiAobmV0aWZfcnVubmluZyhicC0+ZGV2KSkgewor CQlibngyeF91cGRhdGVfY29hbGVzY2UoYnApOworCX0KKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBibngyeF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYs CisJCQkJc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKK3sKKwlzdHJ1Y3QgYm54 MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9 IE1BWF9SWF9BVkFJTDsKKwllcmluZy0+cnhfbWluaV9tYXhfcGVuZGluZyA9IDA7CisJZXJp bmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKworCWVyaW5nLT5yeF9wZW5kaW5nID0g YnAtPnJ4X3Jpbmdfc2l6ZTsKKwllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwllcmlu Zy0+cnhfanVtYm9fcGVuZGluZyA9IDA7CisKKwllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBN QVhfVFhfQVZBSUw7CisJZXJpbmctPnR4X3BlbmRpbmcgPSBicC0+dHhfcmluZ19zaXplOwor fQorCitzdGF0aWMgaW50IGJueDJ4X3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2Ug KmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKmVyaW5nKQorewor CXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKChlcmluZy0+ cnhfcGVuZGluZyA+IE1BWF9SWF9BVkFJTCkgfHwKKwkgICAgKGVyaW5nLT50eF9wZW5kaW5n ID4gTUFYX1RYX0FWQUlMKSB8fAorCSAgICAoZXJpbmctPnR4X3BlbmRpbmcgPD0gTUFYX1NL Ql9GUkFHUyArIDQpKSB7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJwLT5yeF9yaW5n X3NpemUgPSBlcmluZy0+cnhfcGVuZGluZzsKKwlicC0+dHhfcmluZ19zaXplID0gZXJpbmct PnR4X3BlbmRpbmc7CisKKwlpZiAobmV0aWZfcnVubmluZyhicC0+ZGV2KSkgeworCQlibngy eF9uaWNfdW5sb2FkKGJwLCAwKTsKKwkJYm54MnhfbmljX2xvYWQoYnAsIDApOworCX0KKwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibngyeF9nZXRfcGF1c2VwYXJhbShzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpl cGF1c2UpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwll cGF1c2UtPmF1dG9uZWcgPQorCQkoKGJwLT5yZXFfYXV0b25lZyAmIEFVVE9ORUdfRkxPV19D VFJMKSA9PSBBVVRPTkVHX0ZMT1dfQ1RSTCk7CisJZXBhdXNlLT5yeF9wYXVzZSA9ICgoYnAt PmZsb3dfY3RybCAmIEZMT1dfQ1RSTF9SWCkgPT0gRkxPV19DVFJMX1JYKTsKKwllcGF1c2Ut PnR4X3BhdXNlID0gKChicC0+Zmxvd19jdHJsICYgRkxPV19DVFJMX1RYKSA9PSBGTE9XX0NU UkxfVFgpOworCisJRFAoTkVUSUZfTVNHX0xJTkssICJldGh0b29sX3BhdXNlcGFyYW06IGNt ZCAlZFxuIgorCSAgIERQX0xFVkVMICIgIGF1dG9uZWcgJWQgIHJ4X3BhdXNlICVkICB0eF9w YXVzZSAlZFxuIiwKKwkgICBlcGF1c2UtPmNtZCwgZXBhdXNlLT5hdXRvbmVnLCBlcGF1c2Ut PnJ4X3BhdXNlLCBlcGF1c2UtPnR4X3BhdXNlKTsKK30KKworc3RhdGljIGludCBibngyeF9z ZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0 b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2 X3ByaXYoZGV2KTsKKworCURQKE5FVElGX01TR19MSU5LLCAiZXRodG9vbF9wYXVzZXBhcmFt OiBjbWQgJWRcbiIKKwkgICBEUF9MRVZFTCAiICBhdXRvbmVnICVkICByeF9wYXVzZSAlZCAg dHhfcGF1c2UgJWRcbiIsCisJICAgZXBhdXNlLT5jbWQsIGVwYXVzZS0+YXV0b25lZywgZXBh dXNlLT5yeF9wYXVzZSwgZXBhdXNlLT50eF9wYXVzZSk7CisKKwlicC0+cmVxX2Zsb3dfY3Ry bCA9IEZMT1dfQ1RSTF9BVVRPOworCWlmIChlcGF1c2UtPmF1dG9uZWcpIHsKKwkJYnAtPnJl cV9hdXRvbmVnIHw9IEFVVE9ORUdfRkxPV19DVFJMOworCQlicC0+cGF1c2VfbW9kZSA9IFBB VVNFX0JPVEg7CisJCWJwLT5hZHZlcnRpc2luZyB8PSAoQURWRVJUSVNFRF9QYXVzZSB8CisJ CQkJICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZSk7CisKKwl9IGVsc2UgeworCQlicC0+cmVx X2F1dG9uZWcgJj0gfkFVVE9ORUdfRkxPV19DVFJMOworCisJCWlmIChlcGF1c2UtPnJ4X3Bh dXNlKQorCQkJYnAtPnJlcV9mbG93X2N0cmwgfD0gRkxPV19DVFJMX1JYOworCQlpZiAoZXBh dXNlLT50eF9wYXVzZSkKKwkJCWJwLT5yZXFfZmxvd19jdHJsIHw9IEZMT1dfQ1RSTF9UWDsK KworCQlzd2l0Y2ggKGJwLT5yZXFfZmxvd19jdHJsKSB7CisJCWNhc2UgRkxPV19DVFJMX0FV VE86CisJCQlicC0+cmVxX2Zsb3dfY3RybCA9IEZMT1dfQ1RSTF9OT05FOworCQkJYnAtPnBh dXNlX21vZGUgPSBQQVVTRV9OT05FOworCQkJYnAtPmFkdmVydGlzaW5nICY9IH4oQURWRVJU SVNFRF9QYXVzZSB8CisJCQkJCSAgICAgQURWRVJUSVNFRF9Bc3ltX1BhdXNlKTsKKwkJCWJy ZWFrOworCisJCWNhc2UgRkxPV19DVFJMX1RYOgorCQkJYnAtPnBhdXNlX21vZGUgPSBQQVVT RV9BU1lNTUVUUklDOworCQkJYnAtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9Q YXVzZTsKKwkJCWJyZWFrOworCisJCWNhc2UgRkxPV19DVFJMX1JYOgorCQkJYnAtPnBhdXNl X21vZGUgPSBQQVVTRV9CT1RIOworCQkJYnAtPmFkdmVydGlzaW5nIHw9IChBRFZFUlRJU0VE X1BhdXNlIHwKKwkJCQkJICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZSk7CisJCQlicmVhazsK KworCQljYXNlIEZMT1dfQ1RSTF9CT1RIOgorCQkJYnAtPnBhdXNlX21vZGUgPSBQQVVTRV9T WU1NRVRSSUM7CisJCQlicC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZTsKKwkJ CWJyZWFrOworCQl9CisJfQorCisJRFAoTkVUSUZfTVNHX0xJTkssICJyZXFfYXV0b25lZyAw eCV4ICByZXFfZmxvd19jdHJsIDB4JXhcbiIKKwkgICBEUF9MRVZFTCAiICBwYXVzZV9tb2Rl ICVkICBhZHZlcnRpc2luZyAweCV4XG4iLAorCSAgIGJwLT5yZXFfYXV0b25lZywgYnAtPnJl cV9mbG93X2N0cmwsIGJwLT5wYXVzZV9tb2RlLAorCSAgIGJwLT5hZHZlcnRpc2luZyk7CisK KwlibngyeF9zdG9wX3N0YXRzKGJwKTsKKwlibngyeF9saW5rX2luaXRpYWxpemUoYnApOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYm54MnhfZ2V0X3J4X2NzdW0oc3RydWN0 IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYo ZGV2KTsKKworCXJldHVybiBicC0+cnhfY3N1bTsKK30KKworc3RhdGljIGludCBibngyeF9z ZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sKKwlzdHJ1 Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWJwLT5yeF9jc3VtID0gZGF0 YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBibngyeF9zZXRfdHNvKHN0cnVjdCBu ZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCWlmIChkYXRhKQorCQlkZXYtPmZlYXR1 cmVzIHw9IChORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTik7CisJZWxzZQorCQlkZXYt PmZlYXR1cmVzICY9IH4oTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04pOworCXJldHVy biAwOworfQorCitzdGF0aWMgc3RydWN0IHsKKwljaGFyIHN0cmluZ1tFVEhfR1NUUklOR19M RU5dOworfSBibngyeF90ZXN0c19zdHJfYXJyW0JOWDJYX05VTV9URVNUU10gPSB7CisJeyAi aWRsZSBjaGVjayAob25saW5lKSIgfSwKKwl7ICJNQyBFcnJvcnMgIChvbmxpbmUpIiB9Cit9 OworCitzdGF0aWMgaW50IGJueDJ4X3NlbGZfdGVzdF9jb3VudChzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2KQoreworCXJldHVybiBCTlgyWF9OVU1fVEVTVFM7Cit9CisKK3N0YXRpYyB2b2lk IGJueDJ4X3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVj dCBldGh0b29sX3Rlc3QgKmV0ZXN0LCB1NjQgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm54MnggKmJw ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbXNldChidWYsIDAsIHNpemVvZih1NjQpICog Qk5YMlhfTlVNX1RFU1RTKTsKKworCWlmIChibngyeF9pZGxlX2NoayhicCkgIT0gMCkgewor CQlidWZbMF0gPSAxOworCQlldGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwor CX0KKwlpZiAoYm54MnhfbWNfYXNzZXJ0KGJwKSkgeworCQlidWZbMV0gPSAxOworCQlldGVz dC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOworCX0KKwlibngyeF9wYW5pY19kdW1w KGJwKTsKK30KKworc3RhdGljIHN0cnVjdCB7CisJY2hhciBzdHJpbmdbRVRIX0dTVFJJTkdf TEVOXTsKK30gYm54Mnhfc3RhdHNfc3RyX2FycltCTlgyWF9OVU1fU1RBVFNdID0geworCXsg InJ4X2J5dGVzIn0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDAgKi8KKwl7ICJy eF9lcnJvcl9ieXRlcyJ9LCAgICAgICAgICAgICAgICAgICAgIC8qICAxICovCisJeyAidHhf Ynl0ZXMifSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMiAqLworCXsgInR4X2Vy cm9yX2J5dGVzIn0sICAgICAgICAgICAgICAgICAgICAgLyogIDMgKi8KKwl7ICJyeF91Y2Fz dF9wYWNrZXRzIn0sICAgICAgICAgICAgICAgICAgIC8qICA0ICovCisJeyAicnhfbWNhc3Rf cGFja2V0cyJ9LCAgICAgICAgICAgICAgICAgICAvKiAgNSAqLworCXsgInJ4X2JjYXN0X3Bh Y2tldHMifSwgICAgICAgICAgICAgICAgICAgLyogIDYgKi8KKwl7ICJ0eF91Y2FzdF9wYWNr ZXRzIn0sICAgICAgICAgICAgICAgICAgIC8qICA3ICovCisJeyAidHhfbWNhc3RfcGFja2V0 cyJ9LCAgICAgICAgICAgICAgICAgICAvKiAgOCAqLworCXsgInR4X2JjYXN0X3BhY2tldHMi fSwgICAgICAgICAgICAgICAgICAgLyogIDkgKi8KKwl7ICJ0eF9tYWNfZXJyb3JzIn0sICAg ICAgICAgICAgICAgICAgICAgIC8qIDEwICovCisJeyAidHhfY2Fycmllcl9lcnJvcnMifSwg ICAgICAgICAgICAgICAgICAvKiAxMSAqLworCXsgInJ4X2NyY19lcnJvcnMifSwgICAgICAg ICAgICAgICAgICAgICAgLyogMTIgKi8KKwl7ICJyeF9hbGlnbl9lcnJvcnMifSwgICAgICAg ICAgICAgICAgICAgIC8qIDEzICovCisJeyAidHhfc2luZ2xlX2NvbGxpc2lvbnMifSwgICAg ICAgICAgICAgICAvKiAxNCAqLworCXsgInR4X211bHRpX2NvbGxpc2lvbnMifSwgICAgICAg ICAgICAgICAgLyogMTUgKi8KKwl7ICJ0eF9kZWZlcnJlZCJ9LCAgICAgICAgICAgICAgICAg ICAgICAgIC8qIDE2ICovCisJeyAidHhfZXhjZXNzX2NvbGxpc2lvbnMifSwgICAgICAgICAg ICAgICAvKiAxNyAqLworCXsgInR4X2xhdGVfY29sbGlzaW9ucyJ9LCAgICAgICAgICAgICAg ICAgLyogMTggKi8KKwl7ICJ0eF90b3RhbF9jb2xsaXNpb25zIn0sICAgICAgICAgICAgICAg IC8qIDE5ICovCisJeyAicnhfZnJhZ21lbnRzIn0sICAgICAgICAgICAgICAgICAgICAgICAv KiAyMCAqLworCXsgInJ4X2phYmJlcnMifSwgICAgICAgICAgICAgICAgICAgICAgICAgLyog MjEgKi8KKwl7ICJyeF91bmRlcnNpemVfcGFja2V0cyJ9LCAgICAgICAgICAgICAgIC8qIDIy ICovCisJeyAicnhfb3ZlcnNpemVfcGFja2V0cyJ9LCAgICAgICAgICAgICAgICAvKiAyMyAq LworCXsgInJ4XzY0X2J5dGVfcGFja2V0cyJ9LCAgICAgICAgICAgICAgICAgLyogMjQgKi8K Kwl7ICJyeF82NV90b18xMjdfYnl0ZV9wYWNrZXRzIn0sICAgICAgICAgIC8qIDI1ICovCisJ eyAicnhfMTI4X3RvXzI1NV9ieXRlX3BhY2tldHMifSwgICAgICAgICAvKiAyNiAqLworCXsg InJ4XzI1Nl90b181MTFfYnl0ZV9wYWNrZXRzIn0sICAgICAgICAgLyogMjcgKi8KKwl7ICJy eF81MTJfdG9fMTAyM19ieXRlX3BhY2tldHMifSwgICAgICAgIC8qIDI4ICovCisJeyAicnhf MTAyNF90b18xNTIyX2J5dGVfcGFja2V0cyJ9LCAgICAgICAvKiAyOSAqLworCXsgInJ4XzE1 MjNfdG9fOTAyMl9ieXRlX3BhY2tldHMifSwgICAgICAgLyogMzAgKi8KKwl7ICJ0eF82NF9i eXRlX3BhY2tldHMifSwgICAgICAgICAgICAgICAgIC8qIDMxICovCisJeyAidHhfNjVfdG9f MTI3X2J5dGVfcGFja2V0cyJ9LCAgICAgICAgICAvKiAzMiAqLworCXsgInR4XzEyOF90b18y NTVfYnl0ZV9wYWNrZXRzIn0sICAgICAgICAgLyogMzMgKi8KKwl7ICJ0eF8yNTZfdG9fNTEx X2J5dGVfcGFja2V0cyJ9LCAgICAgICAgIC8qIDM0ICovCisJeyAidHhfNTEyX3RvXzEwMjNf Ynl0ZV9wYWNrZXRzIn0sICAgICAgICAvKiAzNSAqLworCXsgInR4XzEwMjRfdG9fMTUyMl9i eXRlX3BhY2tldHMifSwgICAgICAgLyogMzYgKi8KKwl7ICJ0eF8xNTIzX3RvXzkwMjJfYnl0 ZV9wYWNrZXRzIn0sICAgICAgIC8qIDM3ICovCisJeyAicnhfeG9uX2ZyYW1lcyJ9LCAgICAg ICAgICAgICAgICAgICAgICAvKiAzOCAqLworCXsgInJ4X3hvZmZfZnJhbWVzIn0sICAgICAg ICAgICAgICAgICAgICAgLyogMzkgKi8KKwl7ICJ0eF94b25fZnJhbWVzIn0sICAgICAgICAg ICAgICAgICAgICAgIC8qIDQwICovCisJeyAidHhfeG9mZl9mcmFtZXMifSwgICAgICAgICAg ICAgICAgICAgICAvKiA0MSAqLworCXsgInJ4X21hY19jdHJsX2ZyYW1lcyJ9LCAgICAgICAg ICAgICAgICAgLyogNDQgKi8KKwl7ICJyeF9maWx0ZXJlZF9wYWNrZXRzIn0sICAgICAgICAg ICAgICAgIC8qIDQzICovCisJeyAicnhfZGlzY2FyZHMifSwgICAgICAgICAgICAgICAgICAg ICAgICAvKiA0NCAqLworfTsKKworI2RlZmluZSBTVEFUU19PRkZTRVQzMihvZmZzZXRfbmFt ZSkgXAorCShvZmZzZXRvZihzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzLCBvZmZzZXRfbmFtZSkg LyA0KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBibngyeF9zdGF0c19vZmZzZXRfYXJyW0JO WDJYX05VTV9TVEFUU10gPSB7CisJU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfcmVjZWl2 ZWRfaGkpLCAgICAgICAgICAgICAgICAgICAgIC8qICAwICovCisJU1RBVFNfT0ZGU0VUMzIo c3RhdF9JZkhDSW5CYWRPY3RldHNfaGkpLCAgICAgICAgICAgICAgICAgICAgIC8qICAxICov CisJU1RBVFNfT0ZGU0VUMzIodG90YWxfYnl0ZXNfdHJhbnNtaXR0ZWRfaGkpLCAgICAgICAg ICAgICAgICAgIC8qICAyICovCisJU1RBVFNfT0ZGU0VUMzIoc3RhdF9JZkhDT3V0QmFkT2N0 ZXRzX2hpKSwgICAgICAgICAgICAgICAgICAgIC8qICAzICovCisJU1RBVFNfT0ZGU0VUMzIo dG90YWxfdW5pY2FzdF9wYWNrZXRzX3JlY2VpdmVkX2hpKSwgICAgICAgICAgIC8qICA0ICov CisJU1RBVFNfT0ZGU0VUMzIodG90YWxfbXVsdGljYXN0X3BhY2tldHNfcmVjZWl2ZWRfaGkp LCAgICAgICAgIC8qICA1ICovCisJU1RBVFNfT0ZGU0VUMzIodG90YWxfYnJvYWRjYXN0X3Bh Y2tldHNfcmVjZWl2ZWRfaGkpLCAgICAgICAgIC8qICA2ICovCisJU1RBVFNfT0ZGU0VUMzIo dG90YWxfdW5pY2FzdF9wYWNrZXRzX3RyYW5zbWl0dGVkX2hpKSwgICAgICAgIC8qICA3ICov CisJU1RBVFNfT0ZGU0VUMzIodG90YWxfbXVsdGljYXN0X3BhY2tldHNfdHJhbnNtaXR0ZWRf aGkpLCAgICAgIC8qICA4ICovCisJU1RBVFNfT0ZGU0VUMzIodG90YWxfYnJvYWRjYXN0X3Bh Y2tldHNfdHJhbnNtaXR0ZWRfaGkpLCAgICAgIC8qICA5ICovCisJU1RBVFNfT0ZGU0VUMzIo c3RhdF9Eb3Qzc3RhdHNpbnRlcm5hbG1hY3RyYW5zbWl0ZXJyb3JzKSwgICAgIC8qIDEwICov CisJU1RBVFNfT0ZGU0VUMzIoc3RhdF9Eb3QzU3RhdHNDYXJyaWVyU2Vuc2VFcnJvcnMpLCAg ICAgICAgICAgIC8qIDExICovCisJU1RBVFNfT0ZGU0VUMzIoY3JjX3JlY2VpdmVfZXJyb3Jz KSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEyICovCisJU1RBVFNfT0ZGU0VUMzIo YWxpZ25tZW50X2Vycm9ycyksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzICov CisJU1RBVFNfT0ZGU0VUMzIoc2luZ2xlX2NvbGxpc2lvbl90cmFuc21pdF9mcmFtZXMpLCAg ICAgICAgICAgIC8qIDE0ICovCisJU1RBVFNfT0ZGU0VUMzIobXVsdGlwbGVfY29sbGlzaW9u X3RyYW5zbWl0X2ZyYW1lcyksICAgICAgICAgIC8qIDE1ICovCisJU1RBVFNfT0ZGU0VUMzIo c3RhdF9Eb3QzU3RhdHNEZWZlcnJlZFRyYW5zbWlzc2lvbnMpLCAgICAgICAgIC8qIDE2ICov CisJU1RBVFNfT0ZGU0VUMzIoZXhjZXNzaXZlX2NvbGxpc2lvbl9mcmFtZXMpLCAgICAgICAg ICAgICAgICAgIC8qIDE3ICovCisJU1RBVFNfT0ZGU0VUMzIobGF0ZV9jb2xsaXNpb25fZnJh bWVzKSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE4ICovCisJU1RBVFNfT0ZGU0VUMzIo bnVtYmVyX29mX2J1Z3NfZm91bmRfaW5fc3RhdHNfc3BlYyksICAgICAgICAgIC8qIDE5ICov CisJU1RBVFNfT0ZGU0VUMzIocnVudF9wYWNrZXRzX3JlY2VpdmVkKSwgICAgICAgICAgICAg ICAgICAgICAgIC8qIDIwICovCisJU1RBVFNfT0ZGU0VUMzIoamFiYmVyX3BhY2tldHNfcmVj ZWl2ZWQpLCAgICAgICAgICAgICAgICAgICAgIC8qIDIxICovCisJU1RBVFNfT0ZGU0VUMzIo ZXJyb3JfcnVudF9wYWNrZXRzX3JlY2VpdmVkKSwgICAgICAgICAgICAgICAgIC8qIDIyICov CisJU1RBVFNfT0ZGU0VUMzIoZXJyb3JfamFiYmVyX3BhY2tldHNfcmVjZWl2ZWQpLCAgICAg ICAgICAgICAgIC8qIDIzICovCisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3JlY2VpdmVkXzY0 X2J5dGVzKSwgICAgICAgICAgICAgICAgICAgIC8qIDI0ICovCisJU1RBVFNfT0ZGU0VUMzIo ZnJhbWVzX3JlY2VpdmVkXzY1XzEyN19ieXRlcyksICAgICAgICAgICAgICAgIC8qIDI1ICov CisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3JlY2VpdmVkXzEyOF8yNTVfYnl0ZXMpLCAgICAg ICAgICAgICAgIC8qIDI2ICovCisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3JlY2VpdmVkXzI1 Nl81MTFfYnl0ZXMpLCAgICAgICAgICAgICAgIC8qIDI3ICovCisJU1RBVFNfT0ZGU0VUMzIo ZnJhbWVzX3JlY2VpdmVkXzUxMl8xMDIzX2J5dGVzKSwgICAgICAgICAgICAgIC8qIDI4ICov CisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3JlY2VpdmVkXzEwMjRfMTUyMl9ieXRlcyksICAg ICAgICAgICAgIC8qIDI5ICovCisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3JlY2VpdmVkXzE1 MjNfOTAyMl9ieXRlcyksICAgICAgICAgICAgIC8qIDMwICovCisJU1RBVFNfT0ZGU0VUMzIo ZnJhbWVzX3RyYW5zbWl0dGVkXzY0X2J5dGVzKSwgICAgICAgICAgICAgICAgIC8qIDMxICov CisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3RyYW5zbWl0dGVkXzY1XzEyN19ieXRlcyksICAg ICAgICAgICAgIC8qIDMyICovCisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3RyYW5zbWl0dGVk XzEyOF8yNTVfYnl0ZXMpLCAgICAgICAgICAgIC8qIDMzICovCisJU1RBVFNfT0ZGU0VUMzIo ZnJhbWVzX3RyYW5zbWl0dGVkXzI1Nl81MTFfYnl0ZXMpLCAgICAgICAgICAgIC8qIDM0ICov CisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3RyYW5zbWl0dGVkXzUxMl8xMDIzX2J5dGVzKSwg ICAgICAgICAgIC8qIDM1ICovCisJU1RBVFNfT0ZGU0VUMzIoZnJhbWVzX3RyYW5zbWl0dGVk XzEwMjRfMTUyMl9ieXRlcyksICAgICAgICAgIC8qIDM2ICovCisJU1RBVFNfT0ZGU0VUMzIo ZnJhbWVzX3RyYW5zbWl0dGVkXzE1MjNfOTAyMl9ieXRlcyksICAgICAgICAgIC8qIDM3ICov CisJU1RBVFNfT0ZGU0VUMzIocGF1c2VfeG9uX2ZyYW1lc19yZWNlaXZlZCksICAgICAgICAg ICAgICAgICAgIC8qIDM4ICovCisJU1RBVFNfT0ZGU0VUMzIocGF1c2VfeG9mZl9mcmFtZXNf cmVjZWl2ZWQpLCAgICAgICAgICAgICAgICAgIC8qIDM5ICovCisJU1RBVFNfT0ZGU0VUMzIo cGF1c2VfeG9uX2ZyYW1lc190cmFuc21pdHRlZCksICAgICAgICAgICAgICAgIC8qIDQwICov CisJU1RBVFNfT0ZGU0VUMzIocGF1c2VfeG9mZl9mcmFtZXNfdHJhbnNtaXR0ZWQpLCAgICAg ICAgICAgICAgIC8qIDQxICovCisJU1RBVFNfT0ZGU0VUMzIoY29udHJvbF9mcmFtZXNfcmVj ZWl2ZWQpLCAgICAgICAgICAgICAgICAgICAgIC8qIDQ0ICovCisJU1RBVFNfT0ZGU0VUMzIo bWFjX2ZpbHRlcl9kaXNjYXJkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQzICov CisJU1RBVFNfT0ZGU0VUMzIobm9fYnVmZl9kaXNjYXJkKSwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC8qIDQ0ICovCit9OworCitzdGF0aWMgdTggYm54Mnhfc3RhdHNfbGVuX2Fy cltCTlgyWF9OVU1fU1RBVFNdID0geworCTgsIDAsIDgsIDAsIDgsIDgsIDgsIDgsIDgsIDgs CisJNCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKwk0LCA0LCA0LCA0LCA0LCA0LCA0 LCA0LCA0LCA0LAorCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisJNCwgNCwgNCwg NCwgNCwKK307CisKK3N0YXRpYyB2b2lkIGJueDJ4X2dldF9zdHJpbmdzKHN0cnVjdCBuZXRf ZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCit7CisJc3dpdGNoIChzdHJp bmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJbWVtY3B5KGJ1ZiwgYm54Mnhfc3Rh dHNfc3RyX2Fyciwgc2l6ZW9mKGJueDJ4X3N0YXRzX3N0cl9hcnIpKTsKKwkJYnJlYWs7CisK KwljYXNlIEVUSF9TU19URVNUOgorCQltZW1jcHkoYnVmLCBibngyeF90ZXN0c19zdHJfYXJy LCBzaXplb2YoYm54MnhfdGVzdHNfc3RyX2FycikpOworCQlicmVhazsKKwl9Cit9CisKK3N0 YXRpYyBpbnQgYm54MnhfZ2V0X3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYp Cit7CisJcmV0dXJuIEJOWDJYX05VTV9TVEFUUzsKK30KKworc3RhdGljIHZvaWQgYm54Mnhf Z2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3Ry dWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmJ1ZikKK3sKKwlzdHJ1Y3QgYm54Mngg KmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgKmh3X3N0YXRzID0gKHUzMiAqKWJueDJ4 X3NwX2NoZWNrKGJwLCBldGhfc3RhdHMpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8 IEJOWDJYX05VTV9TVEFUUzsgaSsrKSB7CisJCWlmIChibngyeF9zdGF0c19sZW5fYXJyW2ld ID09IDApIHsKKwkJCS8qIHNraXAgdGhpcyBjb3VudGVyICovCisJCQlidWZbaV0gPSAwOwor CQkJY29udGludWU7CisJCX0KKwkJaWYgKCFod19zdGF0cykgeworCQkJYnVmW2ldID0gMDsK KwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChibngyeF9zdGF0c19sZW5fYXJyW2ldID09IDQp IHsKKwkJCS8qIDQtYnl0ZSBjb3VudGVyICovCisJCSAgICAgICBidWZbaV0gPSAodTY0KSAq KGh3X3N0YXRzICsgYm54Mnhfc3RhdHNfb2Zmc2V0X2FycltpXSk7CisJCQljb250aW51ZTsK KwkJfQorCQkvKiA4LWJ5dGUgY291bnRlciAqLworCQlidWZbaV0gPSBISUxPX1U2NCgqKGh3 X3N0YXRzICsgYm54Mnhfc3RhdHNfb2Zmc2V0X2FycltpXSksCisJCQkJICAqKGh3X3N0YXRz ICsgYm54Mnhfc3RhdHNfb2Zmc2V0X2FycltpXSArIDEpKTsKKwl9Cit9CisKK3N0YXRpYyBp bnQgYm54MnhfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKK3sK KwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlm IChkYXRhID09IDApCisJCWRhdGEgPSAyOworCisJZm9yIChpID0gMDsgaSA8IChkYXRhICog Mik7IGkrKykgeworCQlpZiAoKGkgJSAyKSA9PSAwKSB7CisJCQlibngyeF9sZWRzX3NldChi cCwgU1BFRURfMTAwMCk7CisJCX0gZWxzZSB7CisJCQlibngyeF9sZWRzX3Vuc2V0KGJwKTsK KwkJfQorCQltc2xlZXBfaW50ZXJydXB0aWJsZSg1MDApOworCQlpZiAoc2lnbmFsX3BlbmRp bmcoY3VycmVudCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoYnAtPmxpbmtfdXApIHsKKwkJ Ym54MnhfbGVkc19zZXQoYnAsIGJwLT5saW5lX3NwZWVkKTsKKwl9CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYm54MnhfZXRodG9vbF9vcHMgPSB7CisJ LmdldF9zZXR0aW5ncwkJPSBibngyeF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwkJ PSBibngyeF9zZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGJueDJ4X2dldF9kcnZp bmZvLAorCS5nZXRfd29sCQk9IGJueDJ4X2dldF93b2wsCisJLnNldF93b2wJCT0gYm54Mnhf c2V0X3dvbCwKKwkuZ2V0X21zZ2xldmVsCQk9IGJueDJ4X2dldF9tc2dsZXZlbCwKKwkuc2V0 X21zZ2xldmVsCQk9IGJueDJ4X3NldF9tc2dsZXZlbCwKKwkubndheV9yZXNldAkJPSBibngy eF9ud2F5X3Jlc2V0LAorCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5n ZXRfZWVwcm9tX2xlbgkJPSBibngyeF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQkJ PSBibngyeF9nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IGJueDJ4X3NldF9lZXByb20s CisJLmdldF9jb2FsZXNjZQkJPSBibngyeF9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNj ZQkJPSBibngyeF9zZXRfY29hbGVzY2UsCisJLmdldF9yaW5ncGFyYW0JCT0gYm54MnhfZ2V0 X3JpbmdwYXJhbSwKKwkuc2V0X3JpbmdwYXJhbQkJPSBibngyeF9zZXRfcmluZ3BhcmFtLAor CS5nZXRfcGF1c2VwYXJhbQkJPSBibngyeF9nZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3BhdXNl cGFyYW0JCT0gYm54Mnhfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9yeF9jc3VtCQk9IGJueDJ4 X2dldF9yeF9jc3VtLAorCS5zZXRfcnhfY3N1bQkJPSBibngyeF9zZXRfcnhfY3N1bSwKKwku Z2V0X3R4X2NzdW0JCT0gZXRodG9vbF9vcF9nZXRfdHhfY3N1bSwKKwkuc2V0X3R4X2NzdW0J CT0gZXRodG9vbF9vcF9zZXRfdHhfY3N1bSwKKwkuZ2V0X3NnCQkJPSBldGh0b29sX29wX2dl dF9zZywKKwkuc2V0X3NnCQkJPSBldGh0b29sX29wX3NldF9zZywKKwkuZ2V0X3RzbwkJPSBl dGh0b29sX29wX2dldF90c28sCisJLnNldF90c28JCT0gYm54Mnhfc2V0X3RzbywKKwkuc2Vs Zl90ZXN0X2NvdW50CT0gYm54Mnhfc2VsZl90ZXN0X2NvdW50LAorCS5zZWxmX3Rlc3QJCT0g Ym54Mnhfc2VsZl90ZXN0LAorCS5nZXRfc3RyaW5ncwkJPSBibngyeF9nZXRfc3RyaW5ncywK KwkucGh5c19pZAkJPSBibngyeF9waHlzX2lkLAorCS5nZXRfc3RhdHNfY291bnQJPSBibngy eF9nZXRfc3RhdHNfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzCT0gYm54MnhfZ2V0X2V0 aHRvb2xfc3RhdHMKK307CisKKy8qIGVuZCBvZiBldGh0b29sX29wcyAqLworCisvKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgorKiBHZW5lcmFsIHNlcnZpY2UgZnVuY3Rpb25zCisqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGJueDJ4X3NldF9wb3dlcl9zdGF0ZShz dHJ1Y3QgYm54MnggKmJwLCBwY2lfcG93ZXJfdCBzdGF0ZSkKK3sKKwl1MTYgcG1jc3I7CisK KwlwY2lfcmVhZF9jb25maWdfd29yZChicC0+cGRldiwgYnAtPnBtX2NhcCArIFBDSV9QTV9D VFJMLCAmcG1jc3IpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUENJX0QwOgorCQlw Y2lfd3JpdGVfY29uZmlnX3dvcmQoYnAtPnBkZXYsCisJCQkJICAgICAgYnAtPnBtX2NhcCAr IFBDSV9QTV9DVFJMLAorCQkJCSAgICAgIChwbWNzciAmIH5QQ0lfUE1fQ1RSTF9TVEFURV9N QVNLKSB8CisJCQkJICAgICAgUENJX1BNX0NUUkxfUE1FX1NUQVRVUyk7CisKKwkJaWYgKHBt Y3NyICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSykKKwkJLyogZGVsYXkgcmVxdWlyZWQgZHVy aW5nIHRyYW5zaXRpb24gb3V0IG9mIEQzaG90ICovCisJCQltc2xlZXAoMjApOworCQlicmVh azsKKworCWNhc2UgUENJX0QzaG90OgorCQlwbWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVf TUFTSzsKKwkJcG1jc3IgfD0gMzsKKworCQlpZiAoYnAtPndvbCkgeworCQkJcG1jc3IgfD0g UENJX1BNX0NUUkxfUE1FX0VOQUJMRTsKKwkJfQorCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQo YnAtPnBkZXYsIGJwLT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwKKwkJCQkgICAgICBwbWNzcik7 CisKKwkJLyogTm8gbW9yZSBtZW1vcnkgYWNjZXNzIGFmdGVyIHRoaXMgcG9pbnQgdW50aWwK KwkJKiBkZXZpY2UgaXMgYnJvdWdodCBiYWNrIHRvIEQwLgorCQkqLworCQkvKiB1ZGVsYXko NTApOyBUQkQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsK Kwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG5ldF9k ZXZpY2Ugc2VydmljZSBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8q IENhbGxlZCB3aXRoIHJ0bmxfbG9jayBmcm9tIHZsYW4gZnVuY3Rpb25zIGFuZCBhbHNvIG5l dGlmX3R4X2xvY2sKKyAqIGZyb20gc2V0X211bHRpY2FzdC4KKyAqLworc3RhdGljIHZvaWQg Ym54Mnhfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qg Ym54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgcnhfbW9kZSA9IEJOWDJYX1JY X01PREVfTk9STUFMOworCisJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywgImNhbGxlZCBkZXYt PmZsYWdzID0gJXhcbiIsIGRldi0+ZmxhZ3MpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZf UFJPTUlTQykgeworCQlyeF9tb2RlID0gQk5YMlhfUlhfTU9ERV9QUk9NSVNDOworCisJfSBl bHNlIGlmIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJIHx8CisJCSAgIGRldi0+bWNfY291 bnQgPiBCTlgyWF9NQVhfTVVMVElDQVNUKSB7CisJCXJ4X21vZGUgPSBCTlgyWF9SWF9NT0RF X0FMTE1VTFRJOworCisJfSBlbHNlIHsgLyogc29tZSBtdWx0aWNhc3RzICovCisJCWludCBp LCBvbGQsIG9mZnNldDsKKwkJc3RydWN0IGRldl9tY19saXN0ICptY2xpc3Q7CisJCXN0cnVj dCBtYWNfY29uZmlndXJhdGlvbl9jbWQgKmNvbmZpZyA9CisJCQkJCQlibngyeF9zcChicCwg bWNhc3RfY29uZmlnKTsKKworCQlmb3IgKGkgPSAwLCBtY2xpc3QgPSBkZXYtPm1jX2xpc3Q7 CisJCSAgICAgbWNsaXN0ICYmIChpIDwgZGV2LT5tY19jb3VudCk7CisJCSAgICAgaSsrLCBt Y2xpc3QgPSBtY2xpc3QtPm5leHQpIHsKKworCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0u Y2FtX2VudHJ5Lm1zYl9tYWNfYWRkciA9CisJCQkJCW50b2hzKCoodTE2ICopJm1jbGlzdC0+ ZG1pX2FkZHJbMF0pOworCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uY2FtX2VudHJ5Lm1p ZGRsZV9tYWNfYWRkciA9CisJCQkJCW50b2hzKCoodTE2ICopJm1jbGlzdC0+ZG1pX2FkZHJb Ml0pOworCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0uY2FtX2VudHJ5LmxzYl9tYWNfYWRk ciA9CisJCQkJCW50b2hzKCoodTE2ICopJm1jbGlzdC0+ZG1pX2FkZHJbNF0pOworCQkJY29u ZmlnLT5jb25maWdfdGFibGVbaV0uY2FtX2VudHJ5LmZsYWdzID0gYnAtPnBvcnQ7CisJCQlj b25maWctPmNvbmZpZ190YWJsZVtpXS50YXJnZXRfdGFibGVfZW50cnkuZmxhZ3MgPSAwOwor CQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0udGFyZ2V0X3RhYmxlX2VudHJ5LgorCQkJCQkJ CQljbGllbnRfaWQgPSAwOworCQkJY29uZmlnLT5jb25maWdfdGFibGVbaV0udGFyZ2V0X3Rh YmxlX2VudHJ5LgorCQkJCQkJCQl2bGFuX2lkID0gMDsKKworCQkJRFAoTkVUSUZfTVNHX1JY X1NUQVRVUywKKwkJCSAgICJzZXR0aW5nIE1DQVNUWyVkXSAoJTA0eDolMDR4OiUwNHgpXG4i LAorCQkJICAgaSwgY29uZmlnLT5jb25maWdfdGFibGVbaV0uY2FtX2VudHJ5Lm1zYl9tYWNf YWRkciwKKwkJCSAgIGNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldLmNhbV9lbnRyeS5taWRkbGVf bWFjX2FkZHIsCisJCQkgICBjb25maWctPmNvbmZpZ190YWJsZVtpXS5jYW1fZW50cnkubHNi X21hY19hZGRyKTsKKwkJfQorCQlvbGQgPSBjb25maWctPmhkci5sZW5ndGhfNmI7CisJCWlm IChvbGQgPiBpKSB7CisJCQlmb3IgKDsgaSA8IG9sZDsgaSsrKSB7CisJCQkJaWYgKENBTV9J U19JTlZBTElEKGNvbmZpZy0+Y29uZmlnX3RhYmxlW2ldKSkgeworCQkJCQlpLS07IC8qIGFs cmVhZHkgaW52YWxpZGF0ZWQgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qIGludmFs aWRhdGUgKi8KKwkJCQlDQU1fSU5WQUxJREFURShjb25maWctPmNvbmZpZ190YWJsZVtpXSk7 CisJCQl9CisJCX0KKworCQlpZiAoQ0hJUF9SRVZfSVNfU0xPVyhicCkpCisJCQlvZmZzZXQg PSBCTlgyWF9NQVhfRU1VTF9NVUxUSSooMSArIGJwLT5wb3J0KTsKKwkJZWxzZQorCQkJb2Zm c2V0ID0gQk5YMlhfTUFYX01VTFRJQ0FTVCooMSArIGJwLT5wb3J0KTsKKworCQljb25maWct Pmhkci5sZW5ndGhfNmIgPSBpOworCQljb25maWctPmhkci5vZmZzZXQgPSBvZmZzZXQ7CisJ CWNvbmZpZy0+aGRyLnJlc2VydmVkMCA9IDA7CisJCWNvbmZpZy0+aGRyLnJlc2VydmVkMSA9 IDA7CisKKwkJYm54Mnhfc3BfcG9zdChicCwgUkFNUk9EX0NNRF9JRF9FVEhfU0VUX01BQywg MCwKKwkJCSAgICAgIFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBtY2FzdF9jb25maWcp KSwKKwkJCSAgICAgIFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBtY2FzdF9jb25maWcp KSwgMCk7CisJfQorCisJYnAtPnJ4X21vZGUgPSByeF9tb2RlOworCWJueDJ4X3NldF9zdG9y bV9yeF9tb2RlKGJwKTsKK30KKworc3RhdGljIGludCBibngyeF9wb2xsKHN0cnVjdCBuYXBp X3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgYm54MnhfZmFzdHBhdGgg KmZwID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBibngyeF9mYXN0cGF0aCwKKwkJCQkJ CSBuYXBpKTsKKwlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOworCWludCB3b3JrX2RvbmUg PSAwOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCWlmICh1bmxpa2VseShicC0+ cGFuaWMpKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGJwLT5kZXYsIG5hcGkpOworCQlyZXR1 cm4gMDsKKwl9CisjZW5kaWYKKwlwcmVmZXRjaChmcC0+dHhfYnVmX3JpbmdbVFhfQkQoZnAt PnR4X3BrdF9jb25zKV0uc2tiKTsKKwlwcmVmZXRjaChmcC0+cnhfYnVmX3JpbmdbUlhfQkQo ZnAtPnJ4X2JkX2NvbnMpXS5za2IpOworCXByZWZldGNoKChjaGFyICopKGZwLT5yeF9idWZf cmluZ1tSWF9CRChmcC0+cnhfYmRfY29ucyldLnNrYikgKyAyNTYpOworCisJYm54MnhfdXBk YXRlX2Zwc2JfaWR4KGZwKTsKKworCWlmICgqZnAtPnR4X2NvbnNfc2IgIT0gZnAtPnR4X3Br dF9jb25zKSB7CisJCWJueDJ4X3R4X2ludChmcCwgYnVkZ2V0KTsKKwl9CisKKwlpZiAoKmZw LT5yeF9jb25zX3NiICE9IGZwLT5yeF9jb21wX2NvbnMpIHsKKwkJd29ya19kb25lID0gYm54 MnhfcnhfaW50KGZwLCBidWRnZXQpOworCX0KKworCXJtYigpOyAvKiBUQkQgY2hlY2sgKi8K KworCWlmICghYm54MnhfaGFzX3dvcmsoZnApKSB7CisJCW5ldGlmX3J4X2NvbXBsZXRlKGJw LT5kZXYsIG5hcGkpOworCisJCWJueDJ4X2Fja19zYihicCwgZnAtPmluZGV4LCBVU1RPUk1f SUQsIGZwLT5mcF91X2lkeCwKKwkJCSAgICAgSUdVX0lOVF9OT1AsIDEpOworCQlibngyeF9h Y2tfc2IoYnAsIGZwLT5pbmRleCwgQ1NUT1JNX0lELCBmcC0+ZnBfY19pZHgsCisJCQkgICAg IElHVV9JTlRfRU5BQkxFLCAxKTsKKwl9CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCisv KiBDYWxsZWQgd2l0aCBuZXRpZl90eF9sb2NrLgorICogYm54MnhfdHhfaW50KCkgcnVucyB3 aXRob3V0IG5ldGlmX3R4X2xvY2sgdW5sZXNzIGl0IG5lZWRzIHRvIGNhbGwKKyAqIG5ldGlm X3dha2VfcXVldWUoKS4KKyAqLworc3RhdGljIGludCBibngyeF9zdGFydF94bWl0KHN0cnVj dCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJu eDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpm cDsKKwlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZjsKKwlzdHJ1Y3QgZXRoX3R4X2JkICp0eGJk OworCXN0cnVjdCBldGhfdHhfcGFyc2VfYmQgKnBiZCA9IE5VTEw7CisJdTE2IHBrdF9wcm9k LCBiZF9wcm9kOworCWludCBuYmQsIGZwX2luZGV4ID0gMDsKKwlkbWFfYWRkcl90IG1hcHBp bmc7CisKKyNpZmRlZiBCTlgyWF9TVE9QX09OX0VSUk9SCisJaWYgKHVubGlrZWx5KGJwLT5w YW5pYykpIHsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKyNlbmRpZgorCisJZnAg PSAmYnAtPmZwW2ZwX2luZGV4XTsKKwlpZiAodW5saWtlbHkoYm54MnhfdHhfYXZhaWwoYnAt PmZwKSA8CisJCQkJCShza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMykpKSB7CisJCWJw LT5zbG93cGF0aC0+ZXRoX3N0YXRzLmRyaXZlcl94b2ZmKyssCisJCW5ldGlmX3N0b3BfcXVl dWUoZGV2KTsKKwkJQk5YMlhfRVJSKCJCVUchIFR4IHJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3 YWtlIVxuIik7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwkvKgorCVRoaXMg aXMgYSBiaXQgdWdseS4gRmlyc3Qgd2UgdXNlIG9uZSBCRCB3aGljaCB3ZSBtYXJrIGFzIHN0 YXJ0LAorCXRoZW4gZm9yIFRTTyBvciB4c3VtIHdlIGhhdmUgYSBwYXJzaW5nIGluZm8gQkQs CisJYW5kIG9ubHkgdGhlbiB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBUU08gYmRzLgorCShk b24ndCBmb3JnZXQgdG8gbWFyayB0aGUgbGFzdCBvbmUgYXMgbGFzdCwKKwlhbmQgdG8gdW5t YXAgb25seSBBRlRFUiB5b3Ugd3JpdGUgdG8gdGhlIEJEIC4uLikKKwlJIHdvdWxkIGxpa2Ug dG8gdGhhbmsgRG92IEhpcnNoZmVsZCBmb3IgdGhpcyBtZXNzLgorCSovCisKKwlwa3RfcHJv ZCA9IGZwLT50eF9wa3RfcHJvZCsrOworCWJkX3Byb2QgPSBmcC0+dHhfYmRfcHJvZDsKKwor CXBrdF9wcm9kID0gVFhfQkQocGt0X3Byb2QpOworCWJkX3Byb2QgPSBUWF9CRChiZF9wcm9k KTsKKworCS8qIGdldCBhIHR4X2J1ZmYgYW5kIGZpcnN0IGJkICovCisJdHhfYnVmID0gJmZw LT50eF9idWZfcmluZ1twa3RfcHJvZF07CisJdHhiZCA9ICZmcC0+dHhfZGVzY19yaW5nW2Jk X3Byb2RdOworCisJdHhiZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgPSBFVEhfVFhfQkRfRkxB R1NfU1RBUlRfQkQ7CisJdHhiZC0+Z2VuZXJhbF9kYXRhID0gKFVOSUNBU1RfQUREUkVTUyA8 PAorCQkJICAgICAgRVRIX1RYX0JEX0VUSF9BRERSX1RZUEVfU0hJRlQpOworCXR4YmQtPmdl bmVyYWxfZGF0YSB8PSAxOyAvKiBoZWFkZXIgbmJkICovCisKKwkvKiByZW1lYmVyIHRoZSBm aXJzdCBiZCBvZiB0aGUgcGFja2V0ICovCisJdHhfYnVmLT5maXJzdF9iZCA9IGJkX3Byb2Q7 CisKKwlEUChORVRJRl9NU0dfVFhfUVVFVUVELAorCSAgICJzZW5kaW5nIHBrdCAldSBAJXAg IG5leHRfaWR4ICV1ICBiZCAldSBAJXBcbiIsCisJICAgcGt0X3Byb2QsIHR4X2J1ZiwgZnAt PnR4X3BrdF9wcm9kLCBiZF9wcm9kLCB0eGJkKTsKKworCWlmIChza2ItPmlwX3N1bW1lZCA9 PSBDSEVDS1NVTV9QQVJUSUFMKSB7CisJCXU4IGxlbjsKKwkJc3RydWN0IGlwaGRyICppcGgg PSBpcF9oZHIoc2tiKTsKKworCQl0eGJkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhf VFhfQkRfRkxBR1NfSVBfQ1NVTTsKKworCQkvKiB0dXJuIG9uIHBhcnNpbmcgYW5kIGdldCBh IGJkICovCisJCWJkX3Byb2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisJCXBi ZCA9ICh2b2lkICopJmZwLT50eF9kZXNjX3JpbmdbYmRfcHJvZF07CisKKwkJbGVuID0gKCh1 OCAqKWlwX2hkcihza2IpIC0gKHU4ICopc2tiLT5kYXRhKS8yOworCisJCS8qIGZvciBub3cg TlMgZmxhZyBpcyBub3QgdXNlZCBpbiBMaW51eCAqLworCQlwYmQtPmdsb2JhbF9kYXRhID0g KGxlbiB8CisJCQkJICAgICgoc2tiLT5wcm90b2NvbCA9PSBFVEhfUF84MDIxUSkgPDwKKwkJ CQkgICAgIEVUSF9UWF9QQVJTRV9CRF9MTENfU05BUF9FTl9TSElGVCkpOworCisJCXBiZC0+ aXBfaGxlbiA9IGlwX2hkcmxlbihza2IpLzI7CisJCXBiZC0+dG90YWxfaGxlbiA9IGxlbiAr IHBiZC0+aXBfaGxlbjsKKworCQlpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCkg eworCQkJc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CisJCQl0eGJkLT5iZF9m bGFncy5hc19iaXRmaWVsZCB8PQorCQkJCQkJRVRIX1RYX0JEX0ZMQUdTX1RDUF9DU1VNOwor CQkJcGJkLT50Y3BfZmxhZ3MgPSBodG9ubCh0Y3BfZmxhZ193b3JkKHNrYikpJjB4RkZGRjsK KwkJCXBiZC0+dG90YWxfaGxlbiArPSB0Y3BfaGRybGVuKHNrYikvMjsKKwkJCXBiZC0+dGNw X3BzZXVkb19jc3VtID0gbnRvaHModGgtPmNoZWNrKTsKKworCQl9IGVsc2UgaWYgKGlwaC0+ cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKKwkJCXN0cnVjdCB1ZHBoZHIgKnVoID0gdWRw X2hkcihza2IpOworCQkJdHhiZC0+YmRfZmxhZ3MuYXNfYml0ZmllbGQgfD0KKwkJCQlFVEhf VFhfQkRfRkxBR1NfVENQX0NTVU07CisJCQlwYmQtPnRvdGFsX2hsZW4gKz0gNDsKKwkJCXBi ZC0+Z2xvYmFsX2RhdGEgfD0gRVRIX1RYX1BBUlNFX0JEX0NTX0FOWV9GTEc7CisJCQlwYmQt PmNzX29mZnNldCA9IDU7IC8qIDEwID4+IDEqLworCQkJcGJkLT50Y3BfcHNldWRvX2NzdW0g PSAwOworCQkJLyogSFcgYnVnOiB3ZSBuZWVkIHRvIHN1YnRyYWN0IDEwIGJ5dGVzIGJlZm9y ZSB0aGUKKwkJCSAqIFVEUCBoZWFkZXIgZnJvbSB0aGUgY3N1bQorCQkJICovCisJCQl1aC0+ Y2hlY2sgPSAodTE2KSB+Y3N1bV9mb2xkKGNzdW1fc3ViKHVoLT5jaGVjaywKKwkJCQljc3Vt X3BhcnRpYWwoKCh1OCAqKSh1aCktMTApLCAxMCwgMCkpKTsKKwkJfQorCX0KKworCWlmIChi cC0+dmxncnAgIT0gMCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKKwkJdHhiZC0+ dmxhbiA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCQl0eGJkLT5iZF9mbGFncy5hc19iaXRm aWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfVkxBTl9UQUc7CisJfQorI2lmZGVmIEJOWDJYX1NU T1BfT05fRVJST1IKKwllbHNlIHsKKwkJdHhiZC0+dmxhbiA9IHBrdF9wcm9kOworCX0KKyNl bmRpZgorCisJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGJwLT5wZGV2LCBza2ItPmRhdGEs CisJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCXR4YmQtPmFkZHJfaGkg PSBVNjRfSEkobWFwcGluZyk7CisJdHhiZC0+YWRkcl9sbyA9IFU2NF9MTyhtYXBwaW5nKTsK Kwl0eGJkLT5uYmQgPSBuYmQgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgKChwYmQg PT0gTlVMTCk/IDEgOiAyKTsKKwl0eGJkLT5uYnl0ZXMgPSBza2JfaGVhZGxlbihza2IpOwor CisJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgImZpcnN0IGJkIEAlcCAgYWRkciAoJXg6JXgp ICBuYmQgJWQiCisJICAgIiAgbmJ5dGVzICVkICBmbGFncyAleCAgdmxhbiAldVxuIiwKKwkg ICB0eGJkLCB0eGJkLT5hZGRyX2hpLCB0eGJkLT5hZGRyX2xvLCB0eGJkLT5uYmQsCisJICAg dHhiZC0+bmJ5dGVzLCB0eGJkLT5iZF9mbGFncy5hc19iaXRmaWVsZCwgdHhiZC0+dmxhbik7 CisKKwlpZiAoKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICYmCisJICAgIChza2ItPmxl biA+IChicC0+ZGV2LT5tdHUgKyBFVEhfSExFTikpKSB7CisKKwkJaW50IGhsZW4gPSAyKnBi ZC0+dG90YWxfaGxlbjsKKworCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAorCQkgICAiVFNP IHBhY2tldCBsZW4gJWQgIGhsZW4gJWQgIHRvdGFsIGxlbiAlZCAgdHNvIHNpemUgJWRcbiIs CisJCSAgIHNrYi0+bGVuLCBobGVuLCBza2JfaGVhZGxlbihza2IpLCBza2Jfc2hpbmZvKHNr YiktPmdzb19zaXplKTsKKworCQl0eGJkLT5iZF9mbGFncy5hc19iaXRmaWVsZCB8PSBFVEhf VFhfQkRfRkxBR1NfU1dfTFNPOworCisJCWlmICh0eGJkLT5uYnl0ZXMgPiBobGVuKSB7CisJ CQkvKiB3ZSBzcGxpdCB0aGUgZmlyc3QgYmQgaW50byBoZWFkZXJzIGFuZCBkYXRhIGJkcwor CQkJICogdG8gZWFzZSB0aGUgcGFpbiBvZiBvdXIgZmVsbG93IG1pY29jb2RlIGVuZ2luZWVy cworCQkJICogd2UgdXNlIG9uZSBtYXBwaW5nIGZvciBib3RoIGJkcworCQkJICogU28gZmFy IHRoaXMgaGFzIG9ubHkgYmVlbiBvYnNlcnZlZCB0byBoYXBwZW4KKwkJCSAqIGluIE90aGVy IE9wZXJhdGluZyBTeXN0ZW1zKFRNKQorCQkJICovCisKKwkJCS8qIGZpcnN0IGZpeCBmaXJz dCBiZCAqLworCQkJbmJkKys7CisJCQl0eGJkLT5uYmQrKzsKKwkJCXR4YmQtPm5ieXRlcyA9 IGhsZW47CisKKwkJCS8qIHdlIG9ubHkgcHJpbnQgdGhpcyBhcyBhbiBlcnJvcgorCQkJICog YmVjYXVzZSB3ZSBkb24ndCB0aGluayB0aGlzIHdpbGwgZXZlciBoYXBwZW4uCisJCQkgKi8K KwkJCUJOWDJYX0VSUigiVFNPIHNwbGl0IGhlYWRlciBzaXplIGlzICVkICgleDoleCkiCisJ CQkJICAiICBuYmQgJWRcbiIsIHR4YmQtPm5ieXRlcywgdHhiZC0+YWRkcl9oaSwKKwkJCQkg IHR4YmQtPmFkZHJfbG8sIHR4YmQtPm5iZCk7CisKKwkJCS8qIG5vdyBnZXQgYSBuZXcgZGF0 YSBiZAorCQkJICogKGFmdGVyIHRoZSBwYmQpIGFuZCBmaWxsIGl0ICovCisJCQliZF9wcm9k ID0gVFhfQkQoTkVYVF9UWF9JRFgoYmRfcHJvZCkpOworCQkJdHhiZCA9ICZmcC0+dHhfZGVz Y19yaW5nW2JkX3Byb2RdOworCisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCQkJdHhi ZC0+dmxhbiA9IHBrdF9wcm9kOworI2VuZGlmCisJCQl0eGJkLT5hZGRyX2hpID0gVTY0X0hJ KG1hcHBpbmcpOworCQkJdHhiZC0+YWRkcl9sbyA9IFU2NF9MTyhtYXBwaW5nKSArIGhsZW47 CisJCQl0eGJkLT5uYnl0ZXMgPSBza2JfaGVhZGxlbihza2IpIC0gaGxlbjsKKwkJCS8qIHRo aXMgbWFya3MgdGhlIGJkCisJCQkgKiBhcyBvbmUgdGhhdCBoYXMgbm8gaW5kaXZpZHVhbCBt YXBwaW5nCisJCQkgKiB0aGUgRlcgaWdub3JzIHRoaXMgZmxhZyBpbiBhIGJkIG5vdCBtYWtl ZCBzdGFydAorCQkJICovCisJCQl0eGJkLT5iZF9mbGFncy5hc19iaXRmaWVsZCA9IEVUSF9U WF9CRF9GTEFHU19TV19MU087CisJCQlEUChORVRJRl9NU0dfVFhfUVVFVUVELAorCQkJICAg IlRTTyBzcGxpdCBkYXRhIHNpemUgaXMgJWQgKCV4OiV4KVxuIiwKKwkJCSAgIHR4YmQtPm5i eXRlcywgdHhiZC0+YWRkcl9oaSwgdHhiZC0+YWRkcl9sbyk7CisJCX0KKworCQlpZiAoIXBi ZCkgeworCQkJLyogc3VwcG9zZWQgdG8gYmUgdW5yZWFjaGVkCisJCQkgKiAoYW5kIHRoZXJl Zm9yZSBub3QgaGFuZGxlZCBwcm9wZXJseS4uLikKKwkJCSAqLworCQkJQk5YMlhfRVJSKCJM U08gd2l0aCBubyBQQkRcbiIpOworCQkJQlVHKCk7CisJCX0KKworCQlwYmQtPmxzb19tc3Mg PSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCQlwYmQtPnRjcF9zZW5kX3NlcSA9IG50 b2hsKHRjcF9oZHIoc2tiKS0+c2VxKTsKKwkJcGJkLT5pcF9pZCA9IG50b2hzKGlwX2hkcihz a2IpLT5pZCk7CisJCXBiZC0+dGNwX3BzZXVkb19jc3VtID0KKwkJCW50b2hzKH5jc3VtX3Rj cHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgaXBfaGRyKHNrYiktPmRh ZGRyLAorCQkJCQkJIDAsIElQUFJPVE9fVENQLCAwKSk7CisJCXBiZC0+Z2xvYmFsX2RhdGEg fD0gRVRIX1RYX1BBUlNFX0JEX1BTRVVET19DU19XSVRIT1VUX0xFTjsKKwl9CisKKwl7CisJ CWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdz OyBpKyspIHsKKwkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFn c1tpXTsKKworCQkJYmRfcHJvZCA9IFRYX0JEKE5FWFRfVFhfSURYKGJkX3Byb2QpKTsKKwkJ CXR4YmQgPSAmZnAtPnR4X2Rlc2NfcmluZ1tiZF9wcm9kXTsKKworCQkJbWFwcGluZyA9IHBj aV9tYXBfcGFnZShicC0+cGRldiwgZnJhZy0+cGFnZSwKKwkJCQkJICAgICAgIGZyYWctPnBh Z2Vfb2Zmc2V0LAorCQkJCQkgICAgICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7 CisKKwkJCXR4YmQtPmFkZHJfaGkgPSBVNjRfSEkobWFwcGluZyk7CisJCQl0eGJkLT5hZGRy X2xvID0gVTY0X0xPKG1hcHBpbmcpOworCQkJdHhiZC0+bmJ5dGVzID0gZnJhZy0+c2l6ZTsK KwkJCXR4YmQtPmJkX2ZsYWdzLmFzX2JpdGZpZWxkID0gMDsKKyNpZmRlZiBCTlgyWF9TVE9Q X09OX0VSUk9SCisJCQl0eGJkLT52bGFuID0gcGt0X3Byb2Q7CisjZW5kaWYKKwkJCURQKE5F VElGX01TR19UWF9RVUVVRUQsICJmcmFnICVkICBiZCBAJXAiCisJCQkgICAiICBhZGRyICgl eDoleCkgIG5ieXRlcyAlZCAgZmxhZ3MgJXhcbiIsCisJCQkgICBpLCB0eGJkLCB0eGJkLT5h ZGRyX2hpLCB0eGJkLT5hZGRyX2xvLAorCQkJICAgdHhiZC0+bmJ5dGVzLCB0eGJkLT5iZF9m bGFncy5hc19iaXRmaWVsZCk7CisJCX0gLyogZm9yICovCisJfQorCisJLyogbm93IGF0IGxh c3QgbWFyayB0aGUgYmQgYXMgdGhlIGxhc3QgYmQgKi8KKwl0eGJkLT5iZF9mbGFncy5hc19i aXRmaWVsZCB8PSBFVEhfVFhfQkRfRkxBR1NfRU5EX0JEOworCisJRFAoTkVUSUZfTVNHX1RY X1FVRVVFRCwgImxhc3QgYmQgQCVwICBmbGFncyAleFxuIiwKKwkgICB0eGJkLCB0eGJkLT5i ZF9mbGFncy5hc19iaXRmaWVsZCk7CisKKwl0eF9idWYtPnNrYiA9IHNrYjsKKworCWJkX3By b2QgPSBUWF9CRChORVhUX1RYX0lEWChiZF9wcm9kKSk7CisKKwkvKiBub3cgc2VuZCBhIHR4 IGRvb3JiZWxsLCBjb3VudGluZyB0aGUgbmV4dCBiZAorCSAqIGlmIHRoZSBwYWNrZXQgY29u dGFpbnMgb3IgZW5kcyB3aXRoIGl0CisJICovCisJaWYgKFRYX0JEX1BPRkYoYmRfcHJvZCkg PCBuYmQpCisJCW5iZCsrOworCisJaWYgKHBiZCkgeworCQlEUChORVRJRl9NU0dfVFhfUVVF VUVELAorCQkgICAiUEJEIEAlcCAgaXBfZGF0YSAleCAgaXBfaGxlbiAldSAgaXBfaWQgJXUg IGxzb19tc3MgJXUiCisJCSAgICIgIHRjcF9mbGFncyAleCAgeHN1bSAleCAgc2VxICV1ICBo bGVuICV1XG4iLAorCQkgICBwYmQsIHBiZC0+Z2xvYmFsX2RhdGEsIHBiZC0+aXBfaGxlbiwg cGJkLT5pcF9pZCwKKwkJICAgcGJkLT5sc29fbXNzLCBwYmQtPnRjcF9mbGFncywgcGJkLT50 Y3BfcHNldWRvX2NzdW0sCisJCSAgIHBiZC0+dGNwX3NlbmRfc2VxLCBwYmQtPnRvdGFsX2hs ZW4pOworCX0KKworCURQKE5FVElGX01TR19UWF9RVUVVRUQsICJkb29yYmVsbDogbmJkICV1 ICBiZCAlZFxuIiwgbmJkLCBiZF9wcm9kKTsKKworCWZwLT5od190eF9wcm9kcy0+YmRzX3By b2QgKz0gbmJkOworCWZwLT5od190eF9wcm9kcy0+cGFja2V0c19wcm9kKys7CisJRE9PUkJF TEwoYnAsIGZwX2luZGV4LCAwKTsKKworCW1taW93YigpOworCisJZnAtPnR4X2JkX3Byb2Qg PSBiZF9wcm9kOworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCisJaWYgKHVubGlr ZWx5KGJueDJ4X3R4X2F2YWlsKGZwKSA8IE1BWF9TS0JfRlJBR1MgKyAzKSkgeworCQluZXRp Zl9zdG9wX3F1ZXVlKGRldik7CisJCWJwLT5zbG93cGF0aC0+ZXRoX3N0YXRzLmRyaXZlcl94 b2ZmKys7CisJCWlmIChibngyeF90eF9hdmFpbChmcCkgPj0gTUFYX1NLQl9GUkFHUyArIDMp CisJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJfQorCWZwLT50eF9wa3QrKzsKKworCXJl dHVybiBORVRERVZfVFhfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0 cyAqYm54MnhfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0 IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuICZicC0+bmV0X3N0YXRz OworfQorCisvKiBDYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KK3N0YXRpYyBpbnQgYm54Mnhf b3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBibngyeCAqYnAgPSBu ZXRkZXZfcHJpdihkZXYpOworCisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDAp OworCisJcmV0dXJuIGJueDJ4X25pY19sb2FkKGJwLCAxKTsKKwkvKiBUQkQgZG8gd2UgcmV2 ZXJ0IHBvd2VyIHN0YXRlIGlmIGxvYWQgZmFpbHM/ICovCit9CisKKy8qIENhbGxlZCB3aXRo IHJ0bmxfbG9jayAqLworc3RhdGljIGludCBibngyeF9jbG9zZShzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYo ZGV2KTsKKworCS8qIFVubG9hZCB0aGUgZHJpdmVyLCByZWxlYXNlIElSUXMgKi8KKwlyYyA9 IGJueDJ4X25pY191bmxvYWQoYnAsIDEpOworCWlmIChyYykgeworCQlCTlgyWF9FUlIoImJu eDJ4X25pY191bmxvYWQgZmFpbGVkOiAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQor CWJueDJ4X3NldF9wb3dlcl9zdGF0ZShicCwgUENJX0QzaG90KTsKKworCXJldHVybiAwOwor fQorCisvKiBDYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KK3N0YXRpYyBpbnQgYm54MnhfY2hh bmdlX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKnApCit7CisJc3Ry dWN0IHNvY2thZGRyICphZGRyID0gcDsKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3By aXYoZGV2KTsKKworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2Ff ZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54 Mnhfc2V0X21hY19hZGRyKGJwKTsKKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgd2l0 aCBydG5sX2xvY2sgKi8KK3N0YXRpYyBpbnQgYm54MnhfaW9jdGwoc3RydWN0IG5ldF9kZXZp Y2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCit7CisJc3RydWN0IG1paV9p b2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKGlmcik7CisJc3RydWN0IGJueDJ4ICpicCA9IG5l dGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBT SU9DR01JSVBIWToKKwkJZGF0YS0+cGh5X2lkID0gYnAtPnBoeV9hZGRyOworCisJCS8qIGZh bGx0aHJ1ICovCisJY2FzZSBTSU9DR01JSVJFRzogeworCQl1MzIgbWlpX3JlZ3ZhbDsKKwor CQlzcGluX2xvY2tfYmgoJmJwLT5waHlfbG9jayk7CisJCWlmIChicC0+c3RhdGUgPT0gQk5Y MlhfU1RBVEVfT1BFTikgeworCQkJZXJyID0gYm54MnhfbWRpbzIyX3JlYWQoYnAsIGRhdGEt PnJlZ19udW0gJiAweDFmLAorCQkJCQkJJm1paV9yZWd2YWwpOworCisJCQlkYXRhLT52YWxf b3V0ID0gbWlpX3JlZ3ZhbDsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCX0K KwkJc3Bpbl91bmxvY2tfYmgoJmJwLT5waHlfbG9jayk7CisJCXJldHVybiBlcnI7CisJfQor CisJY2FzZSBTSU9DU01JSVJFRzoKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7 CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZicC0+cGh5X2xv Y2spOworCQlpZiAoYnAtPnN0YXRlID09IEJOWDJYX1NUQVRFX09QRU4pIHsKKwkJCWVyciA9 IGJueDJ4X21kaW8yMl93cml0ZShicCwgZGF0YS0+cmVnX251bSAmIDB4MWYsCisJCQkJCQkg ZGF0YS0+dmFsX2luKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FQUdBSU47CisJCX0KKwkJ c3Bpbl91bmxvY2tfYmgoJmJwLT5waHlfbG9jayk7CisJCXJldHVybiBlcnI7CisKKwlkZWZh dWx0OgorCQkvKiBkbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU9Q Tk9UU1VQUDsKK30KKworLyogQ2FsbGVkIHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgaW50 IGJueDJ4X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUp Cit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoKChu ZXdfbXR1ICsgRVRIX0hMRU4pID4gTUFYX0VUSEVSTkVUX0pVTUJPX1BBQ0tFVF9TSVpFKSB8 fAorCSAgICAoKG5ld19tdHUgKyBFVEhfSExFTikgPCBNSU5fRVRIRVJORVRfUEFDS0VUX1NJ WkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoaXMgZG9lcyBub3QgcmFjZSB3aXRo IHBhY2tldCBhbGxvY2F0aW9uCisJICogYmVjYXVzZSB0aGUgYWN0dWFsbCBhbGxvYyBzaXpl IGlzCisJICogb25seSB1cGRhdGVkIGFzIHBhcnQgb2YgbG9hZAorCSAqLworCWRldi0+bXR1 ID0gbmV3X210dTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJYm54Mnhfbmlj X3VubG9hZChicCwgMCk7CisJCWJueDJ4X25pY19sb2FkKGJwLCAwKTsKKwl9CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJueDJ4X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZp Y2UgKmRldikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwor I2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKKwlpZiAoIWJwLT5wYW5pYykgeworCQlibngy eF9wYW5pYygpOworCX0KKyNlbmRpZgorCS8qIFRoaXMgYWxsb3dzIHRoZSBuZXRpZiB0byBi ZSBzaHV0ZG93biBncmFjZWZ1bGx5IGJlZm9yZSByZXNldHRpbmcgKi8KKwlzY2hlZHVsZV93 b3JrKCZicC0+cmVzZXRfdGFzayk7Cit9CisKKyNpZmRlZiBCQ01fVkxBTgorLyogQ2FsbGVk IHdpdGggcnRubF9sb2NrICovCitzdGF0aWMgdm9pZCBibngyeF92bGFuX3J4X3JlZ2lzdGVy KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHZsYW5fZ3JvdXAgKnZs Z3JwKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYnAt PnZsZ3JwID0gdmxncnA7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJYm54Mnhfc2V0 X3J4X21vZGUoZGV2KTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1BPTExfQ09O VFJPTExFUikgfHwgZGVmaW5lZChDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUikKK3N0YXRp YyB2b2lkIHBvbGxfYm54Mngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qg Ym54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRpc2FibGVfaXJxKGJwLT5wZGV2 LT5pcnEpOworCWJueDJ4X2ludGVycnVwdChicC0+cGRldi0+aXJxLCBkZXYpOworCWVuYWJs ZV9pcnEoYnAtPnBkZXYtPmlycSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYm54Mnhf cmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJueDJ4 ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54MngsIHJlc2V0X3Rhc2spOwor CisjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgorCUJOWDJYX0VSUigicmVzZXQgdGFzayBj YWxsZWQgYnV0IFNUT1BfT05fRVJST1IgZGVmaW5lZCIKKwkJICAiIHNvIHJlc2V0IG5vdCBk b25lIHRvIGFsbG93IGRlYnVnIGR1bXAsXG4iCisJIEtFUk5fRVJSICIgeW91IHdpbGwgbmVl ZCB0byByZWJvb3Qgd2hlbiBkb25lXG4iKTsKKwlyZXR1cm47CisjZW5kaWYKKworCWlmICgh bmV0aWZfcnVubmluZyhicC0+ZGV2KSkKKwkJcmV0dXJuOworCisJYnAtPmluX3Jlc2V0X3Rh c2sgPSAxOworCisJYm54MnhfbmV0aWZfc3RvcChicCk7CisKKwlibngyeF9uaWNfdW5sb2Fk KGJwLCAwKTsKKwlibngyeF9uaWNfbG9hZChicCwgMCk7CisKKwlicC0+aW5fcmVzZXRfdGFz ayA9IDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJueDJ4X2luaXRfYm9hcmQoc3Ry dWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikK K3sKKwlzdHJ1Y3QgYm54MnggKmJwOworCWludCByYzsKKworCVNFVF9ORVRERVZfREVWKGRl diwgJnBkZXYtPmRldik7CisJYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJYnAtPmZsYWdz ID0gMDsKKwlicC0+cG9ydCA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKKworCXJjID0gcGNp X2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQ RlggIkNhbm5vdCBlbmFibGUgUENJIGRldmljZSwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVy cl9vdXQ7CisJfQorCisJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9S RVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBmaW5kIFBD SSBkZXZpY2UgYmFzZSBhZGRyZXNzLCIKKwkJICAgICAgICIgYWJvcnRpbmdcbiIpOworCQly YyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlOworCX0KKworCWlmICghKHBj aV9yZXNvdXJjZV9mbGFncyhwZGV2LCAyKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlwcmlu dGsoS0VSTl9FUlIgUEZYICJDYW5ub3QgZmluZCBzZWNvbmQgUENJIGRldmljZSIKKwkJICAg ICAgICIgYmFzZSBhZGRyZXNzLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJ Z290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25z KHBkZXYsIERSVl9NT0RVTEVfTkFNRSk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VS UiBQRlggIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywiCisJCSAgICAgICAiIGFib3J0 aW5nXG4iKTsKKwkJZ290byBlcnJfb3V0X2Rpc2FibGU7CisJfQorCisJcGNpX3NldF9tYXN0 ZXIocGRldik7CisKKwlicC0+cG1fY2FwID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQ Q0lfQ0FQX0lEX1BNKTsKKwlpZiAoYnAtPnBtX2NhcCA9PSAwKSB7CisJCXByaW50ayhLRVJO X0VSUiBQRlggIkNhbm5vdCBmaW5kIHBvd2VyIG1hbmFnZW1lbnQiCisJCSAgICAgICAiIGNh cGFiaWxpdHksIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9vdXRf cmVsZWFzZTsKKwl9CisKKwlicC0+cGNpZV9jYXAgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBk ZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpZiAoYnAtPnBjaWVfY2FwID09IDApIHsKKwkJcHJp bnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IGZpbmQgUENJIEV4cHJlc3MgY2FwYWJpbGl0eSwi CisJCSAgICAgICAiIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9v dXRfcmVsZWFzZTsKKwl9CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRC SVRfTUFTSykgPT0gMCkgeworCQlicC0+ZmxhZ3MgfD0gVVNJTkdfREFDX0ZMQUc7CisJCWlm IChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spICE9 IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInBjaV9zZXRfY29uc2lzdGVudF9kbWFf bWFzayIKKwkJCSAgICAgICAiIGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQkJcmMgPSAtRUlP OworCQkJZ290byBlcnJfb3V0X3JlbGVhc2U7CisJCX0KKworCX0gZWxzZSBpZiAocGNpX3Nl dF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykgIT0gMCkgeworCQlwcmludGsoS0VS Tl9FUlIgUEZYICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBETUEsIgorCQkgICAgICAgIiBh Ym9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0X3JlbGVhc2U7CisJ fQorCisJYnAtPmRldiA9IGRldjsKKwlicC0+cGRldiA9IHBkZXY7CisKKwlzcGluX2xvY2tf aW5pdCgmYnAtPnBoeV9sb2NrKTsKKworCWJwLT5pbl9yZXNldF90YXNrID0gMDsKKwlJTklU X1dPUksoJmJwLT5yZXNldF90YXNrLCBibngyeF9yZXNldF90YXNrKTsKKworCWJwLT5zcF90 YXNrX2VuID0gMDsKKwl0YXNrbGV0X2luaXQoJmJwLT5zcF90YXNrLCBibngyeF9zcF90YXNr LCAodW5zaWduZWQgbG9uZylicCk7CisKKwlkZXYtPmJhc2VfYWRkciA9IGRldi0+bWVtX3N0 YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWRldi0+bWVtX2VuZCA9IHBj aV9yZXNvdXJjZV9lbmQocGRldiwgMCk7CisKKwlkZXYtPmlycSA9IHBkZXYtPmlycTsKKwor CWJwLT5yZWd2aWV3ID0gaW9yZW1hcF9ub2NhY2hlKGRldi0+YmFzZV9hZGRyLAorCQkJCSAg ICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCWlmICghYnAtPnJlZ3ZpZXcpIHsK KwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2Fubm90IG1hcCByZWdpc3RlciBzcGFjZSwgYWJv cnRpbmdcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9yZWxlYXNlOwor CX0KKworCWJwLT5kb29yYmVsbHMgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0 YXJ0KHBkZXYgLCAyKSwKKwkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSk7CisJaWYg KCFicC0+ZG9vcmJlbGxzKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNhbm5vdCBtYXAg ZG9vcmJlbGwgc3BhY2UsIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3Rv IGVycl9vdXRfdW5tYXA7CisJfQorCisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lf RDApOworCS8qIFRCRCB3aHkgZG9lcyBvcGVuIGFsc28gY2FsbCB0aGlzPyAqLworCisJYm54 MnhfZ2V0X2h3aW5mbyhicCk7CisKKwlpZiAoQ0hJUF9SRVYoYnApID09IENISVBfUkVWX0ZQ R0EpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRlBHQSBkZXRhY3RlZC4gTUNQIGRpc2Fi bGVkLCIKKwkJICAgICAgICIgd2lsbCBvbmx5IGluaXQgZmlyc3QgZGV2aWNlXG4iKTsKKwkJ b25lZnVuYyA9IDE7CisJCW5vbWNwID0gMTsKKwl9CisKKwlpZiAobm9tY3ApIHsKKwkJcHJp bnRrKEtFUk5fRVJSIFBGWCAiTUNQIGRpc2FibGVkLCB3aWxsIG9ubHkiCisJCSAgICAgICAi IGluaXQgZmlyc3QgZGV2aWNlXG4iKTsKKwkJb25lZnVuYyA9IDE7CisJfQorCisJaWYgKG9u ZWZ1bmMgJiYgYnAtPnBvcnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU2Vjb25kIGRl dmljZSBkaXNhYmxlZCwgZXhpdGluZ1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBl cnJfb3V0X3VubWFwOworCX0KKworCWJwLT50eF9yaW5nX3NpemUgPSBNQVhfVFhfQVZBSUw7 CisJYnAtPnJ4X3Jpbmdfc2l6ZSA9IE1BWF9SWF9BVkFJTDsKKworCWJwLT5yeF9jc3VtID0g MTsKKworCWJwLT5yeF9vZmZzZXQgPSAwOworCisJYnAtPnR4X3F1aWNrX2NvbnNfdHJpcF9p bnQgPSAweGZmOworCWJwLT50eF9xdWlja19jb25zX3RyaXAgPSAweGZmOworCWJwLT50eF90 aWNrc19pbnQgPSA1MDsKKwlicC0+dHhfdGlja3MgPSA1MDsKKworCWJwLT5yeF9xdWlja19j b25zX3RyaXBfaW50ID0gMHhmZjsKKwlicC0+cnhfcXVpY2tfY29uc190cmlwID0gMHhmZjsK KwlicC0+cnhfdGlja3NfaW50ID0gMjU7CisJYnAtPnJ4X3RpY2tzID0gMjU7CisKKwlicC0+ c3RhdHNfdGlja3MgPSAxMDAwMDAwICYgMHhmZmZmMDA7CisKKwlicC0+dGltZXJfaW50ZXJ2 YWwgPSBIWjsKKwlicC0+Y3VycmVudF9pbnRlcnZhbCA9IChwb2xsID8gcG9sbCA6IEhaKTsg LypUQkQgZml4bWUqLworCisJaW5pdF90aW1lcigmYnAtPnRpbWVyKTsKKwlicC0+dGltZXIu ZXhwaXJlcyA9IGppZmZpZXMgKyBicC0+Y3VycmVudF9pbnRlcnZhbDsKKwlicC0+dGltZXIu ZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBicDsKKwlicC0+dGltZXIuZnVuY3Rpb24gPSBibngy eF90aW1lcjsKKworCXJldHVybiAwOworCitlcnJfb3V0X3VubWFwOgorCWlmIChicC0+cmVn dmlldykgeworCQlpb3VubWFwKGJwLT5yZWd2aWV3KTsKKwkJYnAtPnJlZ3ZpZXcgPSBOVUxM OworCX0KKworCWlmIChicC0+ZG9vcmJlbGxzKSB7CisJCWlvdW5tYXAoYnAtPmRvb3JiZWxs cyk7CisJCWJwLT5kb29yYmVsbHMgPSBOVUxMOworCX0KKworZXJyX291dF9yZWxlYXNlOgor CXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lf ZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwor CitlcnJfb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYm54 MnhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgIGNvbnN0IHN0cnVj dCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RhdGljIGludCB2ZXJzaW9uX3ByaW50ZWQ7 CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IGJueDJ4ICpicDsK KwlpbnQgcmMsIGk7CisJaW50IHBvcnQgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CisKKwlp ZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2 ZXJzaW9uKTsKKworCS8qIGRldiB6ZXJvZWQgaW4gaW5pdF9ldGhlcmRldiAqLworCWRldiA9 IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqYnApKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1F Tk9NRU07CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCisJYnAgPSBuZXRkZXZfcHJp dihkZXYpOworCWJwLT5tc2dsZXZlbCA9IGRlYnVnOworCisJaWYgKHBvcnQgJiYgb25lZnVu YykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJzZWNvbmQgZnVuY3Rpb24gZGlzYWJsZWQu IGV4aXRpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGJueDJ4X2luaXRfYm9h cmQocGRldiwgZGV2KTsKKwlpZiAocmMgPCAwKSB7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJ CXJldHVybiByYzsKKwl9CisKKwlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJueDJ4X3N0YXJ0 X3htaXQ7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IFRYX1RJTUVPVVQ7CisKKwlkZXYtPmdl dF9zdGF0cyA9IGJueDJ4X2dldF9zdGF0czsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJmJueDJ4 X2V0aHRvb2xfb3BzOworCWRldi0+b3BlbiA9IGJueDJ4X29wZW47CisJZGV2LT5zdG9wID0g Ym54MnhfY2xvc2U7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBibngyeF9zZXRfcnhf bW9kZTsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGJueDJ4X2NoYW5nZV9tYWNfYWRkcjsK KwlkZXYtPmRvX2lvY3RsID0gYm54MnhfaW9jdGw7CisJZGV2LT5jaGFuZ2VfbXR1ID0gYm54 MnhfY2hhbmdlX210dTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBibngyeF90eF90aW1lb3V0Owor I2lmZGVmIEJDTV9WTEFOCisJZGV2LT52bGFuX3J4X3JlZ2lzdGVyID0gYm54Mnhfdmxhbl9y eF9yZWdpc3RlcjsKKyNlbmRpZgorI2lmIGRlZmluZWQoSEFWRV9QT0xMX0NPTlRST0xMRVIp IHx8IGRlZmluZWQoQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIpCisJZGV2LT5wb2xsX2Nv bnRyb2xsZXIgPSBwb2xsX2JueDJ4OworI2VuZGlmCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJ Rl9GX1NHOworCWlmIChicC0+ZmxhZ3MgJiBVU0lOR19EQUNfRkxBRykKKwkJZGV2LT5mZWF0 dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQ X0NTVU07CisjaWZkZWYgQkNNX1ZMQU4KKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdf VkxBTl9UWCB8IE5FVElGX0ZfSFdfVkxBTl9SWDsKKyNlbmRpZgorCWRldi0+ZmVhdHVyZXMg fD0gTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ047CisKKwluZXRpZl9uYXBpX2FkZChk ZXYsICZibngyeF9mcChicCwgMCwgbmFwaSksIGJueDJ4X3BvbGwsIDEyOCo0KTsKKworCXJj ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VS UiBQRlggIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKKwkJaWYgKGJwLT5yZWd2 aWV3KQorCQkJaW91bm1hcChicC0+cmVndmlldyk7CisJCWlmIChicC0+ZG9vcmJlbGxzKQor CQkJaW91bm1hcChicC0+ZG9vcmJlbGxzKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2 KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfc2V0X2RydmRhdGEocGRl diwgTlVMTCk7CisJCWZyZWVfbmV0ZGV2KGRldik7CisJCXJldHVybiByYzsKKwl9CisKKwlw Y2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWJwLT5uYW1lID0gYm9hcmRfaW5mb1tl bnQtPmRyaXZlcl9kYXRhXS5uYW1lOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyAoJWMl ZCkgUENJJXMgJXMgJWRNSHogIgorCSAgICAgICAiZm91bmQgYXQgbWVtICVseCwgSVJRICVk LCAiLAorCSAgICAgICBkZXYtPm5hbWUsIGJwLT5uYW1lLAorCSAgICAgICAoKENISVBfSUQo YnApICYgMHhmMDAwKSA+PiAxMikgKyAnQScsCisJICAgICAgICgoQ0hJUF9JRChicCkgJiAw eDBmZjApID4+IDQpLAorCSAgICAgICAoKGJwLT5mbGFncyAmIFBDSVhfRkxBRykgPyAiLVgi IDogIiIpLAorCSAgICAgICAoKGJwLT5mbGFncyAmIFBDSV8zMkJJVF9GTEFHKSA/ICIzMi1i aXQiIDogIjY0LWJpdCIpLAorCSAgICAgICBicC0+YnVzX3NwZWVkX21oeiwKKwkgICAgICAg ZGV2LT5iYXNlX2FkZHIsCisJICAgICAgIGJwLT5wZGV2LT5pcnEpOworCisJcHJpbnRrKCJu b2RlIGFkZHIgIik7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrKCIlMi4y eCIsIGRldi0+ZGV2X2FkZHJbaV0pOworCXByaW50aygiXG4iKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYm54MnhfcmVtb3ZlX29uZShzdHJ1Y3QgcGNp X2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZk YXRhKHBkZXYpOworCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJ Zmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl0YXNrbGV0X2tpbGwoJmJwLT5zcF90YXNrKTsK Kwl1bnJlZ2lzdGVyX25ldGRldihkZXYpOworCisJaWYgKGJwLT5yZWd2aWV3KQorCQlpb3Vu bWFwKGJwLT5yZWd2aWV3KTsKKworCWlmIChicC0+ZG9vcmJlbGxzKQorCQlpb3VubWFwKGJw LT5kb29yYmVsbHMpOworCisJZnJlZV9uZXRkZXYoZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdp b25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRh dGEocGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYm54Mnhfc3VzcGVuZChzdHJ1Y3Qg cGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2 aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGJueDJ4ICpicCA9 IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRl dikpCisJCXJldHVybiAwOworCisJcmMgPSBibngyeF9uaWNfdW5sb2FkKGJwLCAwKTsKKwlp ZiAoIXJjKSB7CisJCXJldHVybiByYzsKKwl9CisKKwluZXRpZl9kZXZpY2VfZGV0YWNoKGRl dik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJw LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgYm54MnhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVj dCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGJu eDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHJjOworCisJaWYgKCFuZXRpZl9y dW5uaW5nKGRldikpCisJCXJldHVybiAwOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7 CisJYm54Mnhfc2V0X3Bvd2VyX3N0YXRlKGJwLCBQQ0lfRDApOworCW5ldGlmX2RldmljZV9h dHRhY2goZGV2KTsKKworCXJjID0gYm54MnhfbmljX2xvYWQoYnAsIDApOworCWlmIChyYykg eworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBj aV9kcml2ZXIgYm54MnhfcGNpX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICA9IERSVl9NT0RV TEVfTkFNRSwKKwkuaWRfdGFibGUgICA9IGJueDJ4X3BjaV90YmwsCisJLnByb2JlICAgICAg PSBibngyeF9pbml0X29uZSwKKwkucmVtb3ZlICAgICA9IF9fZGV2ZXhpdF9wKGJueDJ4X3Jl bW92ZV9vbmUpLAorCS5zdXNwZW5kICAgID0gYm54Mnhfc3VzcGVuZCwKKwkucmVzdW1lICAg ICA9IGJueDJ4X3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJueDJ4X2luaXQo dm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYm54MnhfcGNpX2RyaXZl cik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBibngyeF9jbGVhbnVwKHZvaWQpCit7CisJ cGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZibngyeF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxl X2luaXQoYm54MnhfaW5pdCk7Cittb2R1bGVfZXhpdChibngyeF9jbGVhbnVwKTsKKwotLSAK MS40LjIKCg== --------------030701000702050305070806--