From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Tvrtko Ursulin Date: Tue, 3 Apr 2018 10:14:37 +0100 Message-Id: <20180403091437.2456-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: <1522437301.774767662@f417.i.mail.ru> References: <1522437301.774767662@f417.i.mail.ru> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH i-g-t v4] intel-gpu-top: Rewrite the tool to be safe to use List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: igt-dev@lists.freedesktop.org Cc: Rinat Ibragimov , Eero Tamminen , Intel-gfx@lists.freedesktop.org List-ID: RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KCnYyOgogKiBTb3J0IGVuZ2luZXMgYnkgY2xhc3MgYW5kIGluc3Rh bmNlLgogKiBEbyBub3Qgd2FpdCBmb3Igb25lIHNhbXBsaW5nIHBlcmlvZCB0byBkaXNwbGF5IHNv bWV0aGluZyBvbiBzY3JlZW4uCiAqIE1vdmUgY29kZSBvdXQgb2YgdGhlIGFzc2VydHMuIChSaW5h dCBJYnJhZ2ltb3YpCiAqIENvbnRpbnVvdXNseSBhZGFwdCB0byB0ZXJtaW5hbCBzaXplLiAoUmlu YXQgSWJyYWdpbW92KQoKdjM6CiAqIENoYW5nZSBsYXlvdXQgYW5kIHByZWNpc2lvbiBvZiBzb21l IGZpZWxkLiAoQ2hyaXMgV2lsc29uKQogRWVybyBUYW1taW5lbjoKICogVXNlIG1vcmUgdXNlciBm cmllbmRseSBlbmdpbmUgbmFtZXMuCiAqIERvbid0IGVycm9yIG91dCBpZiBhIGNvdW50ZXIgaXMg bWlzc2luZy4KICogQWRkIElNQyByZWFkL3dyaXRlIGJhbmR3aWR0aC4KICogUmVwb3J0IG1pbmlt dW0gcmVxdWlyZWQga2VybmVsIHZlcnNpb24uCgp2NDoKICogUmVhbGx5IHN1cHBvcnQgNC4xNiBi eSBza2lwcGluZyBvZiBtaXNzaW5nIGVuZ2luZXMuCiAqIFNpbXBsZXIgYW5kIGxlc3MgaGFja3kg ZmxvYXQgcHJpbnRpbmcuCiAqIFByZXNlcnZlIGNvcHlyaWdodCBoZWFkZXIuIChBbnRvbmlvIEFy Z2Vuemlhbm8pCiAqIFNpbXBsaWZ5IGVuZ2luZXNfcHRyIG1hY3JvLiAoUmluYXQgSWJyYWdpbW92 KQoKU2lnbmVkLW9mZi1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNv bT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzogTGlvbmVs IExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJsaW5AaW50ZWwuY29tPgpDYzogUGV0cmkgTGF0 dmFsYSA8cGV0cmkubGF0dmFsYUBpbnRlbC5jb20+CkNjOiBFZXJvIFRhbW1pbmVuIDxlZXJvLnQu dGFtbWluZW5AaW50ZWwuY29tPgpDYzogUmluYXQgSWJyYWdpbW92IDxpYnJhZ2ltb3ZyaW5hdEBt YWlsLnJ1PgpSZXZpZXdlZC1ieTogTGlvbmVsIExhbmR3ZXJsaW4gPGxpb25lbC5nLmxhbmR3ZXJs aW5AaW50ZWwuY29tPiAjIHYxClJldmlld2VkLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlz LXdpbHNvbi5jby51az4gIyB2MC41Ci0tLQogbGliL2lndF9wZXJmLmMgICAgICAgIHwgICAgNiAr CiBsaWIvaWd0X3BlcmYuaCAgICAgICAgfCAgICAxICsKIHRvb2xzL01ha2VmaWxlLmFtICAgICB8 ICAgIDIgKwogdG9vbHMvaW50ZWxfZ3B1X3RvcC5jIHwgMTIxMyArKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB0b29scy9tZXNvbi5idWlsZCAgICAgfCAg ICA2ICstCiA1IGZpbGVzIGNoYW5nZWQsIDY2NCBpbnNlcnRpb25zKCspLCA1NjQgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9wZXJmLmMgYi9saWIvaWd0X3BlcmYuYwppbmRleCA5 OWQ4MmVhNTFjOWIuLmUzZGVjMmNjMjljNyAxMDA2NDQKLS0tIGEvbGliL2lndF9wZXJmLmMKKysr IGIvbGliL2lndF9wZXJmLmMKQEAgLTY5LDMgKzY5LDkgQEAgaW50IGlndF9wZXJmX29wZW4odWlu dDY0X3QgdHlwZSwgdWludDY0X3QgY29uZmlnKQogCXJldHVybiBfcGVyZl9vcGVuKHR5cGUsIGNv bmZpZywgLTEsCiAJCQkgIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCk7CiB9CisKK2lu dCBpZ3RfcGVyZl9vcGVuX2dyb3VwKHVpbnQ2NF90IHR5cGUsIHVpbnQ2NF90IGNvbmZpZywgaW50 IGdyb3VwKQoreworCXJldHVybiBfcGVyZl9vcGVuKHR5cGUsIGNvbmZpZywgZ3JvdXAsCisJCQkg IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8IFBFUkZfRk9STUFUX0dST1VQKTsKK30K ZGlmZiAtLWdpdCBhL2xpYi9pZ3RfcGVyZi5oIGIvbGliL2lndF9wZXJmLmgKaW5kZXggNjE0ZWE1 ZDIzZmE2Li5lMDA3MThmNDc2OWEgMTAwNjQ0Ci0tLSBhL2xpYi9pZ3RfcGVyZi5oCisrKyBiL2xp Yi9pZ3RfcGVyZi5oCkBAIC01NSw1ICs1NSw2IEBAIHVpbnQ2NF90IGk5MTVfdHlwZV9pZCh2b2lk KTsKIGludCBwZXJmX2k5MTVfb3Blbih1aW50NjRfdCBjb25maWcpOwogaW50IHBlcmZfaTkxNV9v cGVuX2dyb3VwKHVpbnQ2NF90IGNvbmZpZywgaW50IGdyb3VwKTsKIGludCBpZ3RfcGVyZl9vcGVu KHVpbnQ2NF90IHR5cGUsIHVpbnQ2NF90IGNvbmZpZyk7CitpbnQgaWd0X3BlcmZfb3Blbl9ncm91 cCh1aW50NjRfdCB0eXBlLCB1aW50NjRfdCBjb25maWcsIGludCBncm91cCk7CiAKICNlbmRpZiAv KiBJOTE1X1BFUkZfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUuYW0gYi90b29scy9N YWtlZmlsZS5hbQppbmRleCAwOWI2ZGJjYzNlY2UuLmEwYjAxNmRkZDdmZiAxMDA2NDQKLS0tIGEv dG9vbHMvTWFrZWZpbGUuYW0KKysrIGIvdG9vbHMvTWFrZWZpbGUuYW0KQEAgLTI4LDYgKzI4LDgg QEAgaW50ZWxfYXViZHVtcF9sYV9MREZMQUdTID0gLW1vZHVsZSAtYXZvaWQtdmVyc2lvbiAtbm8t dW5kZWZpbmVkCiBpbnRlbF9hdWJkdW1wX2xhX1NPVVJDRVMgPSBhdWJkdW1wLmMKIGludGVsX2F1 YmR1bXBfbGFfTElCQUREID0gJCh0b3BfYnVpbGRkaXIpL2xpYi9saWJpbnRlbF90b29scy5sYSAt bGRsCiAKK2ludGVsX2dwdV90b3BfTERBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2xpYmlndF9w ZXJmLmxhCisKIGJpbl9TQ1JJUFRTID0gaW50ZWxfYXViZHVtcAogQ0xFQU5GSUxFUyA9ICQoYmlu X1NDUklQVFMpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2dwdV90b3AuYyBiL3Rvb2xzL2lu dGVsX2dwdV90b3AuYwppbmRleCAwOThlNmNlM2ZmODYuLjJmNWI3YmFkYmJhZCAxMDA2NDQKLS0t IGEvdG9vbHMvaW50ZWxfZ3B1X3RvcC5jCisrKyBiL3Rvb2xzL2ludGVsX2dwdV90b3AuYwpAQCAt MSw2ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgwqkgMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgot ICogQ29weXJpZ2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCDCqSAy MDA3LTIwMTggSW50ZWwgQ29ycG9yYXRpb24KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKQEAgLTI0LDY5NSArMjMsNzgzIEBACiAgKiBBdXRob3JzOgogICogICAg RXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KICAqICAgIEV1Z2VuaSBEb2Rvbm92IDxldWdl bmkuZG9kb25vdkBpbnRlbC5jb20+Ci0gKgogICovCiAKLSNpbmNsdWRlICJjb25maWcuaCIKLQot I2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3Rk bGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnIuaD4KLSNpbmNsdWRlIDxz eXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+ CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8 c3RkaW50Lmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZk ZWYgSEFWRV9URVJNSU9TX0gKLSNpbmNsdWRlIDx0ZXJtaW9zLmg+Ci0jZW5kaWYKLSNpbmNsdWRl ICJpbnRlbF9pby5oIgotI2luY2x1ZGUgImluc3Rkb25lLmgiCi0jaW5jbHVkZSAiaW50ZWxfcmVn LmgiCi0jaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgotI2luY2x1ZGUgImRybXRlc3QuaCIKLQot I2RlZmluZSAgRk9SQ0VXQUtFCSAgICAweEExOEMKLSNkZWZpbmUgIEZPUkNFV0FLRV9BQ0sJICAg IDB4MTMwMDkwCi0KLSNkZWZpbmUgU0FNUExFU19QRVJfU0VDICAgICAgICAgICAgIDEwMDAwCi0j ZGVmaW5lIFNBTVBMRVNfVE9fUEVSQ0VOVF9SQVRJTyAgICAoU0FNUExFU19QRVJfU0VDIC8gMTAw KQotCi0jZGVmaW5lIE1BWF9OVU1fVE9QX0JJVFMgICAgICAgICAgICAxMDAKLQotI2RlZmluZSBI QVNfU1RBVFNfUkVHUyhkZXZpZCkJCUlTXzk2NShkZXZpZCkKLQotc3RydWN0IHRvcF9iaXQgewot CXN0cnVjdCBpbnN0ZG9uZV9iaXQgKmJpdDsKLQlpbnQgY291bnQ7Ci19IHRvcF9iaXRzW01BWF9O VU1fVE9QX0JJVFNdOwotc3RydWN0IHRvcF9iaXQgKnRvcF9iaXRzX3NvcnRlZFtNQVhfTlVNX1RP UF9CSVRTXTsKLQotc3RhdGljIHVpbnQzMl90IGluc3Rkb25lLCBpbnN0ZG9uZTE7Ci0KLXN0YXRp YyBjb25zdCBjaGFyICpiYXJzW10gPSB7Ci0JIiAiLAotCSLilo8iLAotCSLilo4iLAotCSLilo0i LAotCSLilowiLAotCSLilosiLAotCSLilooiLAotCSLilokiLAotCSLilogiCi19OworI2luY2x1 ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+Cisj aW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5 cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNs dWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CiAKLWVudW0gc3RhdHNfY291bnRzIHsK LQlJQV9WRVJUSUNFUywKLQlJQV9QUklNSVRJVkVTLAotCVZTX0lOVk9DQVRJT04sCi0JR1NfSU5W T0NBVElPTiwKLQlHU19QUklNSVRJVkVTLAotCUNMX0lOVk9DQVRJT04sCi0JQ0xfUFJJTUlUSVZF UywKLQlQU19JTlZPQ0FUSU9OLAotCVBTX0RFUFRILAotCVNUQVRTX0NPVU5UCisjaW5jbHVkZSAi aWd0X3BlcmYuaCIKKworc3RydWN0IHBtdV9wYWlyIHsKKwl1aW50NjRfdCBjdXI7CisJdWludDY0 X3QgcHJldjsKIH07CiAKLWNvbnN0IHVpbnQzMl90IHN0YXRzX3JlZ3NbU1RBVFNfQ09VTlRdID0g ewotCUlBX1ZFUlRJQ0VTX0NPVU5UX1FXLAotCUlBX1BSSU1JVElWRVNfQ09VTlRfUVcsCi0JVlNf SU5WT0NBVElPTl9DT1VOVF9RVywKLQlHU19JTlZPQ0FUSU9OX0NPVU5UX1FXLAotCUdTX1BSSU1J VElWRVNfQ09VTlRfUVcsCi0JQ0xfSU5WT0NBVElPTl9DT1VOVF9RVywKLQlDTF9QUklNSVRJVkVT X0NPVU5UX1FXLAotCVBTX0lOVk9DQVRJT05fQ09VTlRfUVcsCi0JUFNfREVQVEhfQ09VTlRfUVcs CitzdHJ1Y3QgcG11X2NvdW50ZXIgeworCWJvb2wgcHJlc2VudDsKKwl1aW50NjRfdCBjb25maWc7 CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgcG11X3BhaXIgdmFsOwogfTsKIAotY29uc3Qg Y2hhciAqc3RhdHNfcmVnX25hbWVzW1NUQVRTX0NPVU5UXSA9IHsKLQkidmVydCBmZXRjaCIsCi0J InByaW0gZmV0Y2giLAotCSJWUyBpbnZvY2F0aW9ucyIsCi0JIkdTIGludm9jYXRpb25zIiwKLQki R1MgcHJpbXMiLAotCSJDTCBpbnZvY2F0aW9ucyIsCi0JIkNMIHByaW1zIiwKLQkiUFMgaW52b2Nh dGlvbnMiLAotCSJQUyBkZXB0aCBwYXNzIiwKK3N0cnVjdCBlbmdpbmUgeworCWNvbnN0IGNoYXIg Km5hbWU7CisJY29uc3QgY2hhciAqZGlzcGxheV9uYW1lOworCisJdW5zaWduZWQgaW50IGNsYXNz OworCXVuc2lnbmVkIGludCBpbnN0YW5jZTsKKworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7 CisKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgYnVzeTsKKwlzdHJ1Y3QgcG11X2NvdW50ZXIgd2FpdDsK KwlzdHJ1Y3QgcG11X2NvdW50ZXIgc2VtYTsKIH07CiAKLXVpbnQ2NF90IHN0YXRzW1NUQVRTX0NP VU5UXTsKLXVpbnQ2NF90IGxhc3Rfc3RhdHNbU1RBVFNfQ09VTlRdOworc3RydWN0IGVuZ2luZXMg eworCXVuc2lnbmVkIGludCBudW1fZW5naW5lczsKKwl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJz OworCURJUiAqcm9vdDsKKwlpbnQgZmQ7CisJc3RydWN0IHBtdV9wYWlyIHRzOworCisJaW50IHJh cGxfZmQ7CisJZG91YmxlIHJhcGxfc2NhbGU7CisKKwlpbnQgaW1jX2ZkOworCWRvdWJsZSBpbWNf cmVhZHNfc2NhbGU7CisJY29uc3QgY2hhciAqaW1jX3JlYWRzX3VuaXQ7CisJZG91YmxlIGltY193 cml0ZXNfc2NhbGU7CisJY29uc3QgY2hhciAqaW1jX3dyaXRlc191bml0OworCisJc3RydWN0IHBt dV9jb3VudGVyIGZyZXFfcmVxOworCXN0cnVjdCBwbXVfY291bnRlciBmcmVxX2FjdDsKKwlzdHJ1 Y3QgcG11X2NvdW50ZXIgaXJxOworCXN0cnVjdCBwbXVfY291bnRlciByYzY7CisJc3RydWN0IHBt dV9jb3VudGVyIHJhcGw7CisJc3RydWN0IHBtdV9jb3VudGVyIGltY19yZWFkczsKKwlzdHJ1Y3Qg cG11X2NvdW50ZXIgaW1jX3dyaXRlczsKKworCXN0cnVjdCBlbmdpbmUgZW5naW5lOworfTsKIAot c3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHRpbWUodm9pZCkKK3N0YXRpYyB1aW50NjRfdAorZ2V0 X3BtdV9jb25maWcoaW50IGRpcmZkLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpjb3Vu dGVyKQogewotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxM KTsKLSAgICByZXR1cm4gKHQudHZfdXNlYyArICh0LnR2X3NlYyAqIDEwMDAwMDApKTsKLX0KKwlj aGFyIGJ1ZlsxMjhdLCAqcDsKKwlpbnQgZmQsIHJldDsKIAotc3RhdGljIGludAotdG9wX2JpdHNf c29ydChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXN0cnVjdCB0b3BfYml0ICog Y29uc3QgKmJpdF9hID0gYTsKLQlzdHJ1Y3QgdG9wX2JpdCAqIGNvbnN0ICpiaXRfYiA9IGI7Ci0J aW50IGFfY291bnQgPSAoKmJpdF9hKS0+Y291bnQ7Ci0JaW50IGJfY291bnQgPSAoKmJpdF9iKS0+ Y291bnQ7CisJcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLSVzIiwgbmFtZSwg Y291bnRlcik7CisJaWYgKHJldCA8IDAgfHwgcmV0ID09IHNpemVvZihidWYpKQorCQlyZXR1cm4g LTE7CiAKLQlpZiAoYV9jb3VudCA8IGJfY291bnQpCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKGFf Y291bnQgPT0gYl9jb3VudCkKLQkJcmV0dXJuIDA7Ci0JZWxzZQorCWZkID0gb3BlbmF0KGRpcmZk LCBidWYsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQogCQlyZXR1cm4gLTE7Ci19CiAKLXN0YXRp YyB2b2lkCi11cGRhdGVfaWRsZV9iaXQoc3RydWN0IHRvcF9iaXQgKnRvcF9iaXQpCi17Ci0JdWlu dDMyX3QgcmVnX3ZhbDsKKwlyZXQgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwljbG9z ZShmZCk7CisJaWYgKHJldCA8PSAwKQorCQlyZXR1cm4gLTE7CiAKLQlpZiAodG9wX2JpdC0+Yml0 LT5yZWcgPT0gSU5TVERPTkVfMSkKLQkJcmVnX3ZhbCA9IGluc3Rkb25lMTsKLQllbHNlCi0JCXJl Z192YWwgPSBpbnN0ZG9uZTsKKwlwID0gaW5kZXgoYnVmLCAnMCcpOworCWlmICghcCkKKwkJcmV0 dXJuIC0xOwogCi0JaWYgKChyZWdfdmFsICYgdG9wX2JpdC0+Yml0LT5iaXQpID09IDApCi0JCXRv cF9iaXQtPmNvdW50Kys7CisJcmV0dXJuIHN0cnRvdWwocCwgTlVMTCwgMCk7CiB9CiAKLXN0YXRp YyB2b2lkCi1wcmludF9jbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvY2spIHsKLQlpZiAo Y2xvY2sgPT0gLTEpCi0JCXByaW50ZigiJXMgY2xvY2s6IHVua25vd24iLCBuYW1lKTsKKyNkZWZp bmUgZW5naW5lX3B0cihlbmdpbmVzLCBuKSAoJmVuZ2luZXMtPmVuZ2luZSArIChuKSkKKworc3Rh dGljIGNvbnN0IGNoYXIgKmNsYXNzX2Rpc3BsYXlfbmFtZSh1bnNpZ25lZCBpbnQgY2xhc3MpCit7 CisJc3dpdGNoIChjbGFzcykgeworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSOgorCQly ZXR1cm4gIlJlbmRlci8zRCI7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19DT1BZOgorCQlyZXR1 cm4gIkJsaXR0ZXIiOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU86CisJCXJldHVybiAi VmlkZW8iOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRToKKwkJcmV0dXJu ICJWaWRlb0VuaGFuY2UiOworCWRlZmF1bHQ6CisJCXJldHVybiAiW3Vua25vd25dIjsKKwl9Cit9 CisKK3N0YXRpYyBpbnQgZW5naW5lX2NtcChjb25zdCB2b2lkICpfX2EsIGNvbnN0IHZvaWQgKl9f YikKK3sKKwljb25zdCBzdHJ1Y3QgZW5naW5lICphID0gKHN0cnVjdCBlbmdpbmUgKilfX2E7CisJ Y29uc3Qgc3RydWN0IGVuZ2luZSAqYiA9IChzdHJ1Y3QgZW5naW5lICopX19iOworCisJaWYgKGEt PmNsYXNzICE9IGItPmNsYXNzKQorCQlyZXR1cm4gYS0+Y2xhc3MgLSBiLT5jbGFzczsKIAllbHNl Ci0JCXByaW50ZigiJXMgY2xvY2s6ICVkIE1oeiIsIG5hbWUsIGNsb2NrKTsKKwkJcmV0dXJuIGEt Pmluc3RhbmNlIC0gYi0+aW5zdGFuY2U7CiB9CiAKLXN0YXRpYyBpbnQKLXByaW50X2Nsb2NrX2lu Zm8oc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXYpCitzdGF0aWMgc3RydWN0IGVuZ2luZXMgKmRp c2NvdmVyX2VuZ2luZXModm9pZCkKIHsKLQl1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRldmlj ZV9pZDsKLQl1aW50MTZfdCBnY2ZnYzsKKwljb25zdCBjaGFyICpzeXNmc19yb290ID0gIi9zeXMv ZGV2aWNlcy9pOTE1L2V2ZW50cyI7CisJc3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3RydWN0 IGRpcmVudCAqZGVudDsKKwlpbnQgcmV0ID0gMDsKKwlESVIgKmQ7CiAKLQlpZiAoSVNfR000NShk ZXZpZCkpIHsKLQkJaW50IGNvcmVfY2xvY2sgPSAtMTsKKwllbmdpbmVzID0gbWFsbG9jKHNpemVv ZihzdHJ1Y3QgZW5naW5lcykpOworCWlmICghZW5naW5lcykKKwkJcmV0dXJuIE5VTEw7CiAKLQkJ cGNpX2RldmljZV9jZmdfcmVhZF91MTYocGNpX2RldiwgJmdjZmdjLCBJOTE1X0dDRkdDKTsKKwlt ZW1zZXQoZW5naW5lcywgMCwgc2l6ZW9mKCplbmdpbmVzKSk7CiAKLQkJc3dpdGNoIChnY2ZnYyAm IDB4ZikgewotCQljYXNlIDg6Ci0JCQljb3JlX2Nsb2NrID0gMjY2OwotCQkJYnJlYWs7Ci0JCWNh c2UgOToKLQkJCWNvcmVfY2xvY2sgPSAzMjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJCWNv cmVfY2xvY2sgPSA0MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWNvcmVfY2xvY2sgPSA1 MzM7Ci0JCQlicmVhazsKLQkJfQotCQlwcmludF9jbG9jaygiY29yZSIsIGNvcmVfY2xvY2spOwot CX0gZWxzZSBpZiAoSVNfOTY1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCBy ZW5kZXJfY2xvY2sgPSAtMSwgc2FtcGxlcl9jbG9jayA9IC0xOworCWVuZ2luZXMtPm51bV9lbmdp bmVzID0gMDsKIAotCQlwY2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5 MTVfR0NGR0MpOworCWQgPSBvcGVuZGlyKHN5c2ZzX3Jvb3QpOworCWlmICghZCkKKwkJcmV0dXJu IE5VTEw7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4ZikgewotCQljYXNlIDI6Ci0JCQlyZW5kZXJf Y2xvY2sgPSAyNTA7IHNhbXBsZXJfY2xvY2sgPSAyNjc7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgot CQkJcmVuZGVyX2Nsb2NrID0gMzIwOyBzYW1wbGVyX2Nsb2NrID0gMzMzOwotCQkJYnJlYWs7Ci0J CWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9jayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsKLQkJ CWJyZWFrOwotCQljYXNlIDU6Ci0JCQlyZW5kZXJfY2xvY2sgPSA1MDA7IHNhbXBsZXJfY2xvY2sg PSA1MzM7CisJd2hpbGUgKChkZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljb25zdCBj aGFyICplbmRzd2l0aCA9ICItYnVzeSI7CisJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4gPSBz dHJsZW4oZW5kc3dpdGgpOworCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPQorCQkJCWVuZ2luZV9w dHIoZW5naW5lcywgZW5naW5lcy0+bnVtX2VuZ2luZXMpOworCQljaGFyIGJ1ZlsyNTZdOworCisJ CWlmIChkZW50LT5kX3R5cGUgIT0gRFRfUkVHKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmxl bihkZW50LT5kX25hbWUpID49IHNpemVvZihidWYpKSB7CisJCQlyZXQgPSAtMTsKIAkJCWJyZWFr OwogCQl9CiAKLQkJcHJpbnRfY2xvY2soInJlbmRlciIsIHJlbmRlcl9jbG9jayk7Ci0JCXByaW50 ZigiICAiKTsKLQkJcHJpbnRfY2xvY2soInNhbXBsZXIiLCBzYW1wbGVyX2Nsb2NrKTsKLQl9IGVs c2UgaWYgKElTXzk0NShkZXZpZCkgJiYgSVNfTU9CSUxFKGRldmlkKSkgewotCQlpbnQgcmVuZGVy X2Nsb2NrID0gLTEsIGRpc3BsYXlfY2xvY2sgPSAtMTsKKwkJc3RyY3B5KGJ1ZiwgZGVudC0+ZF9u YW1lKTsKIAotCQlwY2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVf R0NGR0MpOworCQkvKiB4eHhOLWJ1c3kgKi8KKwkJaWYgKHN0cmxlbihidWYpIDwgKGVuZGxlbiAr IDQpKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoJmJ1ZltzdHJsZW4oYnVmKSAtIGVuZGxl bl0sIGVuZHN3aXRoKSkKKwkJCWNvbnRpbnVlOwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsK LQkJY2FzZSAwOgotCQkJcmVuZGVyX2Nsb2NrID0gMTY2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMToK LQkJCXJlbmRlcl9jbG9jayA9IDIwMDsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlyZW5kZXJf Y2xvY2sgPSAyNTA7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJcmVuZGVyX2Nsb2NrID0gNDAw OworCQltZW1zZXQoZW5naW5lLCAwLCBzaXplb2YoKmVuZ2luZSkpOworCisJCWJ1ZltzdHJsZW4o YnVmKSAtIGVuZGxlbl0gPSAwOworCQllbmdpbmUtPm5hbWUgPSBzdHJkdXAoYnVmKTsKKwkJaWYg KCFlbmdpbmUtPm5hbWUpIHsKKwkJCXJldCA9IC0xOwogCQkJYnJlYWs7CiAJCX0KIAotCQlzd2l0 Y2ggKGdjZmdjICYgMHg3MCkgewotCQljYXNlIDA6Ci0JCQlkaXNwbGF5X2Nsb2NrID0gMjAwOwot CQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAzMjA7CisJCWVuZ2luZS0+ YnVzeS5jb25maWcgPSBnZXRfcG11X2NvbmZpZyhkaXJmZChkKSwgZW5naW5lLT5uYW1lLAorCQkJ CQkJICAgICAiYnVzeSIpOworCQlpZiAoZW5naW5lLT5idXN5LmNvbmZpZyA9PSAtMSkgeworCQkJ cmV0ID0gLTE7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoZ2NmZ2MgJiAoMSA8PCA3KSkKLQkJICAg IGRpc3BsYXlfY2xvY2sgPSAxMzM7CiAKLQkJcHJpbnRfY2xvY2soInJlbmRlciIsIHJlbmRlcl9j bG9jayk7Ci0JCXByaW50ZigiICAiKTsKLQkJcHJpbnRfY2xvY2soImRpc3BsYXkiLCBkaXNwbGF5 X2Nsb2NrKTsKLQl9IGVsc2UgaWYgKElTXzkxNShkZXZpZCkgJiYgSVNfTU9CSUxFKGRldmlkKSkg ewotCQlpbnQgcmVuZGVyX2Nsb2NrID0gLTEsIGRpc3BsYXlfY2xvY2sgPSAtMTsKKwkJZW5naW5l LT5jbGFzcyA9IChlbmdpbmUtPmJ1c3kuY29uZmlnICYKKwkJCQkgKF9fSTkxNV9QTVVfT1RIRVIo MCkgLSAxKSkgPj4KKwkJCQlJOTE1X1BNVV9DTEFTU19TSElGVDsKIAotCQlwY2lfZGV2aWNlX2Nm Z19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2MsIEk5MTVfR0NGR0MpOworCQllbmdpbmUtPmluc3Rh bmNlID0gKGVuZ2luZS0+YnVzeS5jb25maWcgPj4KKwkJCQkgICAgSTkxNV9QTVVfU0FNUExFX0JJ VFMpICYKKwkJCQkgICAgKCgxIDw8IEk5MTVfUE1VX1NBTVBMRV9JTlNUQU5DRV9CSVRTKSAtIDEp OwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcpIHsKLQkJY2FzZSAwOgotCQkJcmVuZGVyX2Nsb2Nr ID0gMTYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlbmRlcl9jbG9jayA9IDE5MDsKLQkJ CWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlyZW5kZXJfY2xvY2sgPSAzMzM7CisJCXJldCA9IHNucHJp bnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy8ldSIsCisJCQkgICAgICAgY2xhc3NfZGlzcGxheV9u YW1lKGVuZ2luZS0+Y2xhc3MpLAorCQkJICAgICAgIGVuZ2luZS0+aW5zdGFuY2UpOworCQlpZiAo cmV0IDwgMCB8fCByZXQgPT0gc2l6ZW9mKGJ1ZikpIHsKKwkJCXJldCA9IC0xOwogCQkJYnJlYWs7 CiAJCX0KLQkJaWYgKGdjZmdjICYgKDEgPDwgMTMpKQotCQkgICAgcmVuZGVyX2Nsb2NrID0gMTMz OworCQlyZXQgPSAwOwogCi0JCXN3aXRjaCAoZ2NmZ2MgJiAweDcwKSB7Ci0JCWNhc2UgMDoKLQkJ CWRpc3BsYXlfY2xvY2sgPSAxOTA7CisJCWVuZ2luZS0+ZGlzcGxheV9uYW1lID0gc3RyZHVwKGJ1 Zik7CisJCWlmICghZW5naW5lLT5kaXNwbGF5X25hbWUpIHsKKwkJCXJldCA9IC0xOwogCQkJYnJl YWs7Ci0JCWNhc2UgNDoKLQkJCWRpc3BsYXlfY2xvY2sgPSAzMzM7CisJCX0KKworCQllbmdpbmVz LT5udW1fZW5naW5lcysrOworCQllbmdpbmVzID0gcmVhbGxvYyhlbmdpbmVzLCBzaXplb2Yoc3Ry dWN0IGVuZ2luZXMpICsKKwkJCQkgIGVuZ2luZXMtPm51bV9lbmdpbmVzICogc2l6ZW9mKHN0cnVj dCBlbmdpbmUpKTsKKwkJaWYgKCFlbmdpbmVzKSB7CisJCQlyZXQgPSAtRU5PTUVNOwogCQkJYnJl YWs7CiAJCX0KLQkJaWYgKGdjZmdjICYgKDEgPDwgNykpCi0JCSAgICBkaXNwbGF5X2Nsb2NrID0g MTMzOworCX0KKworCWlmIChyZXQpCisJCWZyZWUoZW5naW5lcyk7CisJZWxzZSB7CisJCXFzb3J0 KGVuZ2luZV9wdHIoZW5naW5lcywgMCksIGVuZ2luZXMtPm51bV9lbmdpbmVzLAorCQkgICAgICBz aXplb2Yoc3RydWN0IGVuZ2luZSksIGVuZ2luZV9jbXApOwogCi0JCXByaW50X2Nsb2NrKCJyZW5k ZXIiLCByZW5kZXJfY2xvY2spOwotCQlwcmludGYoIiAgIik7Ci0JCXByaW50X2Nsb2NrKCJkaXNw bGF5IiwgZGlzcGxheV9jbG9jayk7CisJCWVuZ2luZXMtPnJvb3QgPSBkOwogCX0KIAorCXJldHVy biByZXQgPT0gMCA/IGVuZ2luZXMgOiBOVUxMOworfQorCitzdGF0aWMgaW50CitmaWxlbmFtZV90 b19idWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnNp emUpCit7CisJaW50IGZkOworCXNzaXplX3QgcmV0OwogCi0JcHJpbnRmKCJcbiIpOwotCXJldHVy biAtMTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQly ZXR1cm4gLTE7CisKKwlyZXQgPSByZWFkKGZkLCBidWYsIGJ1ZnNpemUgLSAxKTsKKwljbG9zZShm ZCk7CisJaWYgKHJldCA8IDEpCisJCXJldHVybiAtMTsKKworCWJ1ZltyZXRdID0gJ1wwJzsKKwor CXJldHVybiAwOwogfQogCi0jZGVmaW5lIFNUQVRTX0xFTiAoMjApCi0jZGVmaW5lIFBFUkNFTlRB R0VfQkFSX0VORAkoNzkgLSBTVEFUU19MRU4pCitzdGF0aWMgdWludDY0X3QgZmlsZW5hbWVfdG9f dTY0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgYmFzZSkKK3sKKwljaGFyIGJ1Zls2NF0sICpi OwogCi1zdGF0aWMgdm9pZAotcHJpbnRfcGVyY2VudGFnZV9iYXIoZmxvYXQgcGVyY2VudCwgaW50 IGN1cl9saW5lX2xlbikKKwlpZiAoZmlsZW5hbWVfdG9fYnVmKGZpbGVuYW1lLCBidWYsIHNpemVv ZihidWYpKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIEhhbmRsZSBib3RoIHNpbmdsZSBpbnRl Z2VyIGFuZCBrZXk9dmFsdWUgZm9ybWF0cyBieSBza2lwcGluZworCSAqIGxlYWRpbmcgbm9uLWRp Z2l0cy4KKwkgKi8KKwliID0gYnVmOworCXdoaWxlICgqYiAmJiAhaXNkaWdpdCgqYikpCisJCWIr KzsKKworCXJldHVybiBzdHJ0b3VsbChiLCBOVUxMLCBiYXNlKTsKK30KKworc3RhdGljIGRvdWJs ZSBmaWxlbmFtZV90b19kb3VibGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JaW50IGJhcl9h dmFpbF9sZW4gPSAoUEVSQ0VOVEFHRV9CQVJfRU5EIC0gY3VyX2xpbmVfbGVuIC0gMSkgKiA4Owot CWludCBiYXJfbGVuID0gYmFyX2F2YWlsX2xlbiAqIChwZXJjZW50ICsgLjUpIC8gMTAwLjA7Ci0J aW50IGk7CisJY2hhciAqb2xkbG9jYWxlOworCWNoYXIgYnVmWzgwXTsKKwlkb3VibGUgdjsKIAot CWZvciAoaSA9IGJhcl9sZW47IGkgPj0gODsgaSAtPSA4KSB7Ci0JCXByaW50ZigiJXMiLCBiYXJz WzhdKTsKLQkJY3VyX2xpbmVfbGVuKys7CisJaWYgKGZpbGVuYW1lX3RvX2J1ZihmaWxlbmFtZSwg YnVmLCBzaXplb2YoYnVmKSkpCisJCXJldHVybiAwOworCisJb2xkbG9jYWxlID0gc2V0bG9jYWxl KExDX0FMTCwgIkMiKTsKKwl2ID0gc3RydG9kKGJ1ZiwgTlVMTCk7CisJc2V0bG9jYWxlKExDX0FM TCwgb2xkbG9jYWxlKTsKKworCXJldHVybiB2OworfQorCitzdGF0aWMgdWludDY0X3QgcmFwbF90 eXBlX2lkKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9kZXZpY2VzL3Bv d2VyL3R5cGUiLCAxMCk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCByYXBsX2dwdV9wb3dlcih2b2lk KQoreworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9zeXMvZGV2aWNlcy9wb3dlci9ldmVudHMv ZW5lcmd5LWdwdSIsIDApOworfQorCitzdGF0aWMgZG91YmxlIHJhcGxfZ3B1X3Bvd2VyX3NjYWxl KHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX2RvdWJsZSgiL3N5cy9kZXZpY2VzL3Bvd2Vy L2V2ZW50cy9lbmVyZ3ktZ3B1LnNjYWxlIik7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBpbWNfdHlw ZV9pZCh2b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9zeXMvZGV2aWNlcy91bmNv cmVfaW1jL3R5cGUiLCAxMCk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBpbWNfZGF0YV9yZWFkcyh2 b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b191NjQoIi9zeXMvZGV2aWNlcy91bmNvcmVfaW1j L2V2ZW50cy9kYXRhX3JlYWRzIiwgMCk7Cit9CisKK3N0YXRpYyBkb3VibGUgaW1jX2RhdGFfcmVh ZHNfc2NhbGUodm9pZCkKK3sKKwlyZXR1cm4gZmlsZW5hbWVfdG9fZG91YmxlKCIvc3lzL2Rldmlj ZXMvdW5jb3JlX2ltYy9ldmVudHMvZGF0YV9yZWFkcy5zY2FsZSIpOworfQorCitzdGF0aWMgY29u c3QgY2hhciAqaW1jX2RhdGFfcmVhZHNfdW5pdCh2b2lkKQoreworCWNoYXIgYnVmWzMyXTsKKwor CWlmIChmaWxlbmFtZV90b19idWYoIi9zeXMvZGV2aWNlcy91bmNvcmVfaW1jL2V2ZW50cy9kYXRh X3JlYWRzLnVuaXQiLAorCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpID09IDApCisJCXJldHVybiBz dHJkdXAoYnVmKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdWludDY0X3Qg aW1jX2RhdGFfd3JpdGVzKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NCgiL3N5cy9k ZXZpY2VzL3VuY29yZV9pbWMvZXZlbnRzL2RhdGFfd3JpdGVzIiwgMCk7Cit9CisKK3N0YXRpYyBk b3VibGUgaW1jX2RhdGFfd3JpdGVzX3NjYWxlKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3Rv X2RvdWJsZSgiL3N5cy9kZXZpY2VzL3VuY29yZV9pbWMvZXZlbnRzL2RhdGFfd3JpdGVzLnNjYWxl Iik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICppbWNfZGF0YV93cml0ZXNfdW5pdCh2b2lkKQor eworCWNoYXIgYnVmWzMyXTsKKworCWlmIChmaWxlbmFtZV90b19idWYoIi9zeXMvZGV2aWNlcy91 bmNvcmVfaW1jL2V2ZW50cy9kYXRhX3dyaXRlcy51bml0IiwKKwkJCSAgICBidWYsIHNpemVvZihi dWYpKSA9PSAwKQorCQlyZXR1cm4gc3RyZHVwKGJ1Zik7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsK K30KKworI2RlZmluZSBfb3Blbl9wbXUoY250LCBwbXUsIGZkKSBcCisoeyBcCisJaW50IGZkX187 IFwKK1wKKwlmZF9fID0gcGVyZl9pOTE1X29wZW5fZ3JvdXAoKHBtdSktPmNvbmZpZywgKGZkKSk7 IFwKKwlpZiAoZmRfXyA+PSAwKSB7IFwKKwkJaWYgKChmZCkgPT0gLTEpIFwKKwkJCShmZCkgPSBm ZF9fOyBcCisJCShwbXUpLT5wcmVzZW50ID0gdHJ1ZTsgXAorCQkocG11KS0+aWR4ID0gKGNudCkr KzsgXAorCX0gXAorXAorCWZkX187IFwKK30pCisKKyNkZWZpbmUgX29wZW5faW1jKGNudCwgcG11 LCBmZCkgXAorKHsgXAorCWludCBmZF9fOyBcCitcCisJZmRfXyA9IGlndF9wZXJmX29wZW5fZ3Jv dXAoaW1jX3R5cGVfaWQoKSwgKHBtdSktPmNvbmZpZywgKGZkKSk7IFwKKwlpZiAoZmRfXyA+PSAw KSB7IFwKKwkJaWYgKChmZCkgPT0gLTEpIFwKKwkJCShmZCkgPSBmZF9fOyBcCisJCShwbXUpLT5w cmVzZW50ID0gdHJ1ZTsgXAorCQkocG11KS0+aWR4ID0gKGNudCkrKzsgXAorCX0gXAorXAorCWZk X187IFwKK30pCisKK3N0YXRpYyBpbnQgcG11X2luaXQoc3RydWN0IGVuZ2luZXMgKmVuZ2luZXMp Cit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCisJZW5naW5lcy0+ZmQgPSAtMTsKKwll bmdpbmVzLT5udW1fY291bnRlcnMgPSAwOworCisJZW5naW5lcy0+aXJxLmNvbmZpZyA9IEk5MTVf UE1VX0lOVEVSUlVQVFM7CisJZmQgPSBfb3Blbl9wbXUoZW5naW5lcy0+bnVtX2NvdW50ZXJzLCAm ZW5naW5lcy0+aXJxLCBlbmdpbmVzLT5mZCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOwor CisJZW5naW5lcy0+ZnJlcV9yZXEuY29uZmlnID0gSTkxNV9QTVVfUkVRVUVTVEVEX0ZSRVFVRU5D WTsKKwlfb3Blbl9wbXUoZW5naW5lcy0+bnVtX2NvdW50ZXJzLCAmZW5naW5lcy0+ZnJlcV9yZXEs IGVuZ2luZXMtPmZkKTsKKworCWVuZ2luZXMtPmZyZXFfYWN0LmNvbmZpZyA9IEk5MTVfUE1VX0FD VFVBTF9GUkVRVUVOQ1k7CisJX29wZW5fcG11KGVuZ2luZXMtPm51bV9jb3VudGVycywgJmVuZ2lu ZXMtPmZyZXFfYWN0LCBlbmdpbmVzLT5mZCk7CisKKwllbmdpbmVzLT5yYzYuY29uZmlnID0gSTkx NV9QTVVfUkM2X1JFU0lERU5DWTsKKwlfb3Blbl9wbXUoZW5naW5lcy0+bnVtX2NvdW50ZXJzLCAm ZW5naW5lcy0+cmM2LCBlbmdpbmVzLT5mZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+ bnVtX2VuZ2luZXM7IGkrKykgeworCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPSBlbmdpbmVfcHRy KGVuZ2luZXMsIGkpOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHBtdV9jb3VudGVyICpwbXU7CisJ CQljb25zdCBjaGFyICpjb3VudGVyOworCQl9ICpjbnQsIGNvdW50ZXJzW10gPSB7CisJCQl7IC5w bXUgPSAmZW5naW5lLT5idXN5LCAuY291bnRlciA9ICJidXN5IiB9LAorCQkJeyAucG11ID0gJmVu Z2luZS0+d2FpdCwgLmNvdW50ZXIgPSAid2FpdCIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPnNl bWEsIC5jb3VudGVyID0gInNlbWEiIH0sCisJCQl7IC5wbXUgPSBOVUxMLCAuY291bnRlciA9IE5V TEwgfSwKKwkJfTsKKworCQlmb3IgKGNudCA9IGNvdW50ZXJzOyBjbnQtPnBtdTsgY250KyspIHsK KwkJCWlmICghY250LT5wbXUtPmNvbmZpZykKKwkJCQljbnQtPnBtdS0+Y29uZmlnID0KKwkJCQkJ Z2V0X3BtdV9jb25maWcoZGlyZmQoZW5naW5lcy0+cm9vdCksCisJCQkJCQkgICAgICAgZW5naW5l LT5uYW1lLAorCQkJCQkJICAgICAgIGNudC0+Y291bnRlcik7CisJCQlmZCA9IF9vcGVuX3BtdShl bmdpbmVzLT5udW1fY291bnRlcnMsIGNudC0+cG11LAorCQkJCSAgICAgICBlbmdpbmVzLT5mZCk7 CisJCQlpZiAoZmQgPj0gMCkKKwkJCQllbmdpbmUtPm51bV9jb3VudGVycysrOworCQl9CiAJfQot CWlmIChpKSB7Ci0JCXByaW50ZigiJXMiLCBiYXJzW2ldKTsKLQkJY3VyX2xpbmVfbGVuKys7CisK KwllbmdpbmVzLT5yYXBsX2ZkID0gLTE7CisJaWYgKHJhcGxfdHlwZV9pZCgpKSB7CisJCWVuZ2lu ZXMtPnJhcGxfc2NhbGUgPSByYXBsX2dwdV9wb3dlcl9zY2FsZSgpOworCQlpZiAoZW5naW5lcy0+ cmFwbF9zY2FsZSAhPSBOQU4pCisJCQllbmdpbmVzLT5yYXBsX3NjYWxlICo9IDFlMzsgLyogZnJv bSBuYW5vIHRvIG1pY3JvICovCisKKwkJZW5naW5lcy0+cmFwbC5jb25maWcgPSByYXBsX2dwdV9w b3dlcigpOworCQlpZiAoIWVuZ2luZXMtPnJhcGwuY29uZmlnKQorCQkJcmV0dXJuIC0xOworCisJ CWVuZ2luZXMtPnJhcGxfZmQgPSBpZ3RfcGVyZl9vcGVuKHJhcGxfdHlwZV9pZCgpLAorCQkJCQkJ IGVuZ2luZXMtPnJhcGwuY29uZmlnKTsKKwkJaWYgKGVuZ2luZXMtPnJhcGxfZmQgPCAwKQorCQkJ cmV0dXJuIC0xOworCisJCWVuZ2luZXMtPnJhcGwucHJlc2VudCA9IHRydWU7CiAJfQogCi0JLyog TkI6IFdlIGNhbid0IHVzZSBhIGZpZWxkIHdpZHRoIHdpdGggdXRmOCBzbyB3ZSBtYW51YWxseQot CSogZ3VhcmFudGVlIGEgZmllbGQgd2l0aCBvZiA0NSBjaGFycyBmb3IgYW55IGJhci4gKi8KLQlw cmludGYoIiUqcyIsIFBFUkNFTlRBR0VfQkFSX0VORCAtIGN1cl9saW5lX2xlbiwgIiIpOwotfQor CWVuZ2luZXMtPmltY19mZCA9IC0xOworCWlmIChpbWNfdHlwZV9pZCgpKSB7CisJCXVuc2lnbmVk IGludCBudW0gPSAwOwogCi1zdHJ1Y3QgcmluZyB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQl1aW50 MzJfdCBtbWlvOwotCWludCBoZWFkLCB0YWlsLCBzaXplOwotCXVpbnQ2NF90IGZ1bGw7Ci0JaW50 IGlkbGU7Ci19OworCQllbmdpbmVzLT5pbWNfcmVhZHNfc2NhbGUgPSBpbWNfZGF0YV9yZWFkc19z Y2FsZSgpOworCQllbmdpbmVzLT5pbWNfd3JpdGVzX3NjYWxlID0gaW1jX2RhdGFfd3JpdGVzX3Nj YWxlKCk7CisKKwkJZW5naW5lcy0+aW1jX3JlYWRzX3VuaXQgPSBpbWNfZGF0YV9yZWFkc191bml0 KCk7CisJCWlmICghZW5naW5lcy0+aW1jX3JlYWRzX3VuaXQpCisJCQlyZXR1cm4gLTE7CiAKLXN0 YXRpYyB1aW50MzJfdCByaW5nX3JlYWQoc3RydWN0IHJpbmcgKnJpbmcsIHVpbnQzMl90IHJlZykK KwkJZW5naW5lcy0+aW1jX3dyaXRlc191bml0ID0gaW1jX2RhdGFfd3JpdGVzX3VuaXQoKTsKKwkJ aWYgKCFlbmdpbmVzLT5pbWNfd3JpdGVzX3VuaXQpCisJCQlyZXR1cm4gLTE7CisKKwkJZW5naW5l cy0+aW1jX3JlYWRzLmNvbmZpZyA9IGltY19kYXRhX3JlYWRzKCk7CisJCWlmICghZW5naW5lcy0+ aW1jX3JlYWRzLmNvbmZpZykKKwkJCXJldHVybiAtMTsKKworCQllbmdpbmVzLT5pbWNfd3JpdGVz LmNvbmZpZyA9IGltY19kYXRhX3dyaXRlcygpOworCQlpZiAoIWVuZ2luZXMtPmltY193cml0ZXMu Y29uZmlnKQorCQkJcmV0dXJuIC0xOworCisJCWZkID0gX29wZW5faW1jKG51bSwgJmVuZ2luZXMt PmltY19yZWFkcywgZW5naW5lcy0+aW1jX2ZkKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiAt MTsKKwkJZmQgPSBfb3Blbl9pbWMobnVtLCAmZW5naW5lcy0+aW1jX3dyaXRlcywgZW5naW5lcy0+ aW1jX2ZkKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQllbmdpbmVzLT5pbWNf cmVhZHMucHJlc2VudCA9IHRydWU7CisJCWVuZ2luZXMtPmltY193cml0ZXMucHJlc2VudCA9IHRy dWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBwbXVfcmVhZF9tdWx0 aShpbnQgZmQsIHVuc2lnbmVkIGludCBudW0sIHVpbnQ2NF90ICp2YWwpCiB7Ci0JcmV0dXJuIElO UkVHKHJpbmctPm1taW8gKyByZWcpOworCXVpbnQ2NF90IGJ1ZlsyICsgbnVtXTsKKwl1bnNpZ25l ZCBpbnQgaTsKKwlzc2l6ZV90IGxlbjsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsK KworCWxlbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWFzc2VydChsZW4gPT0gc2l6 ZW9mKGJ1ZikpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQl2YWxbaV0gPSBidWZb MiArIGldOworCisJcmV0dXJuIGJ1ZlsxXTsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19pbml0KHN0 cnVjdCByaW5nICpyaW5nKQorc3RhdGljIGRvdWJsZSBfX3BtdV9jYWxjKHN0cnVjdCBwbXVfcGFp ciAqcCwgZG91YmxlIGQsIGRvdWJsZSB0LCBkb3VibGUgcykKIHsKLQlyaW5nLT5zaXplID0gKCgo cmluZ19yZWFkKHJpbmcsIFJJTkdfTEVOKSAmIFJJTkdfTlJfUEFHRVMpID4+IDEyKSArIDEpICog NDA5NjsKKwlkb3VibGUgdjsKKworCXYgPSBwLT5jdXIgLSBwLT5wcmV2OworCXYgLz0gZDsKKwl2 IC89IHQ7CisJdiAqPSBzOworCisJaWYgKHMgPT0gMTAwLjAgJiYgdiA+IDEwMC4wKQorCQl2ID0g MTAwLjA7CisKKwlyZXR1cm4gdjsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19yZXNldChzdHJ1Y3Qg cmluZyAqcmluZykKK3N0YXRpYyB2b2lkIGZpbGxfc3RyKGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50 IGJ1ZnN6LCBjaGFyIGMsIHVuc2lnbmVkIGludCBudW0pCiB7Ci0JcmluZy0+aWRsZSA9IHJpbmct PmZ1bGwgPSAwOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bSAmJiBp IDwgKGJ1ZnN6IC0gMSk7IGkrKykKKwkJKmJ1ZisrID0gYzsKKworCSpidWYgPSAwOwogfQogCi1z dGF0aWMgdm9pZCByaW5nX3NhbXBsZShzdHJ1Y3QgcmluZyAqcmluZykKK3N0YXRpYyB2b2lkIHBt dV9jYWxjKHN0cnVjdCBwbXVfY291bnRlciAqY250LAorCQkgICAgIGNoYXIgKmJ1ZiwgdW5zaWdu ZWQgaW50IGJ1ZnN6LAorCQkgICAgIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgd2lkdGhf ZGVjLAorCQkgICAgIGRvdWJsZSBkLCBkb3VibGUgdCwgZG91YmxlIHMpCiB7Ci0JaW50IGZ1bGw7 CisJZG91YmxlIHZhbDsKKwlpbnQgbGVuOworCisJYXNzZXJ0KGJ1ZnN6ID49ICh3aWR0aCArIHdp ZHRoX2RlYyArIDEpKTsKIAotCWlmICghcmluZy0+c2l6ZSkKKwlpZiAoIWNudC0+cHJlc2VudCkg eworCQlmaWxsX3N0cihidWYsIGJ1ZnN6LCAnLScsIHdpZHRoICsgd2lkdGhfZGVjKTsKIAkJcmV0 dXJuOworCX0KKworCXZhbCA9IF9fcG11X2NhbGMoJmNudC0+dmFsLCBkLCB0LCBzKTsKKworCWxl biA9IHNucHJpbnRmKGJ1ZiwgYnVmc3osICIlKi4qZiIsIHdpZHRoICsgd2lkdGhfZGVjLCB3aWR0 aF9kZWMsIHZhbCk7CisJaWYgKGxlbiA8IDAgfHwgbGVuID09IGJ1ZnN6KSB7CisJCWZpbGxfc3Ry KGJ1ZiwgYnVmc3osICdYJywgd2lkdGggKyB3aWR0aF9kZWMpOworCQlyZXR1cm47CisJfQorfQor CitzdGF0aWMgdWludDY0X3QgX19wbXVfcmVhZF9zaW5nbGUoaW50IGZkLCB1aW50NjRfdCAqdHMp Cit7CisJdWludDY0X3QgZGF0YVsyXSA9IHsgfTsKKwlzc2l6ZV90IGxlbjsKIAotCXJpbmctPmhl YWQgPSByaW5nX3JlYWQocmluZywgUklOR19IRUFEKSAmIEhFQURfQUREUjsKLQlyaW5nLT50YWls ID0gcmluZ19yZWFkKHJpbmcsIFJJTkdfVEFJTCkgJiBUQUlMX0FERFI7CisJbGVuID0gcmVhZChm ZCwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwlhc3NlcnQobGVuID09IHNpemVvZihkYXRhKSk7CiAK LQlpZiAocmluZy0+dGFpbCA9PSByaW5nLT5oZWFkKQotCQlyaW5nLT5pZGxlKys7CisJaWYgKHRz KQorCQkqdHMgPSBkYXRhWzFdOwogCi0JZnVsbCA9IHJpbmctPnRhaWwgLSByaW5nLT5oZWFkOwot CWlmIChmdWxsIDwgMCkKLQkJZnVsbCArPSByaW5nLT5zaXplOwotCXJpbmctPmZ1bGwgKz0gZnVs bDsKKwlyZXR1cm4gZGF0YVswXTsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19wcmludF9oZWFkZXIo RklMRSAqb3V0LCBzdHJ1Y3QgcmluZyAqcmluZykKK3N0YXRpYyB1aW50NjRfdCBwbXVfcmVhZF9z aW5nbGUoaW50IGZkKQogewotICAgIGZwcmludGYob3V0LCAiJS42cyUlXHRvcHNcdCIsCi0gICAg ICAgICAgICByaW5nLT5uYW1lCi0gICAgICAgICAgKTsKKwlyZXR1cm4gX19wbXVfcmVhZF9zaW5n bGUoZmQsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3ByaW50KHN0cnVjdCByaW5nICpy aW5nLCB1bnNpZ25lZCBsb25nIHNhbXBsZXNfcGVyX3NlYykKK3N0YXRpYyB2b2lkIF9fdXBkYXRl X3NhbXBsZShzdHJ1Y3QgcG11X2NvdW50ZXIgKmNvdW50ZXIsIHVpbnQ2NF90IHZhbCkKIHsKLQlp bnQgcGVyY2VudF9idXN5LCBsZW47CisJY291bnRlci0+dmFsLnByZXYgPSBjb3VudGVyLT52YWwu Y3VyOworCWNvdW50ZXItPnZhbC5jdXIgPSB2YWw7Cit9CiAKLQlpZiAoIXJpbmctPnNpemUpCi0J CXJldHVybjsKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zYW1wbGUoc3RydWN0IHBtdV9jb3VudGVyICpj b3VudGVyLCB1aW50NjRfdCAqdmFsKQoreworCWlmIChjb3VudGVyLT5wcmVzZW50KQorCQlfX3Vw ZGF0ZV9zYW1wbGUoY291bnRlciwgdmFsW2NvdW50ZXItPmlkeF0pOworfQorCitzdGF0aWMgdm9p ZCBwbXVfc2FtcGxlKHN0cnVjdCBlbmdpbmVzICplbmdpbmVzKQoreworCWNvbnN0IGludCBudW1f dmFsID0gZW5naW5lcy0+bnVtX2NvdW50ZXJzOworCXVpbnQ2NF90IHZhbFsyICsgbnVtX3ZhbF07 CisJdW5zaWduZWQgaW50IGk7CiAKLQlwZXJjZW50X2J1c3kgPSAxMDAgLSAxMDAgKiByaW5nLT5p ZGxlIC8gc2FtcGxlc19wZXJfc2VjOworCWVuZ2luZXMtPnRzLnByZXYgPSBlbmdpbmVzLT50cy5j dXI7CiAKLQlsZW4gPSBwcmludGYoIiUyNXMgYnVzeTogJTNkJSU6ICIsIHJpbmctPm5hbWUsIHBl cmNlbnRfYnVzeSk7Ci0JcHJpbnRfcGVyY2VudGFnZV9iYXIgKHBlcmNlbnRfYnVzeSwgbGVuKTsK LQlwcmludGYoIiUyNHMgc3BhY2U6ICVkLyVkXG4iLAotCQkgICByaW5nLT5uYW1lLAotCQkgICAo aW50KShyaW5nLT5mdWxsIC8gc2FtcGxlc19wZXJfc2VjKSwKLQkJICAgcmluZy0+c2l6ZSk7CisJ aWYgKGVuZ2luZXMtPnJhcGxfZmQgPj0gMCkKKwkJX191cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5y YXBsLAorCQkJCXBtdV9yZWFkX3NpbmdsZShlbmdpbmVzLT5yYXBsX2ZkKSk7CisKKwlpZiAoZW5n aW5lcy0+aW1jX2ZkID49IDApIHsKKwkJcG11X3JlYWRfbXVsdGkoZW5naW5lcy0+aW1jX2ZkLCAy LCB2YWwpOworCQl1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5pbWNfcmVhZHMsIHZhbCk7CisJCXVw ZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmltY193cml0ZXMsIHZhbCk7CisJfQorCisJZW5naW5lcy0+ dHMuY3VyID0gcG11X3JlYWRfbXVsdGkoZW5naW5lcy0+ZmQsIG51bV92YWwsIHZhbCk7CisKKwl1 cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5mcmVxX3JlcSwgdmFsKTsKKwl1cGRhdGVfc2FtcGxlKCZl bmdpbmVzLT5mcmVxX2FjdCwgdmFsKTsKKwl1cGRhdGVfc2FtcGxlKCZlbmdpbmVzLT5pcnEsIHZh bCk7CisJdXBkYXRlX3NhbXBsZSgmZW5naW5lcy0+cmM2LCB2YWwpOworCisJZm9yIChpID0gMDsg aSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzOyBpKyspIHsKKwkJc3RydWN0IGVuZ2luZSAqZW5naW5l ID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsKKworCQl1cGRhdGVfc2FtcGxlKCZlbmdpbmUtPmJ1 c3ksIHZhbCk7CisJCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZS0+c2VtYSwgdmFsKTsKKwkJdXBkYXRl X3NhbXBsZSgmZW5naW5lLT53YWl0LCB2YWwpOworCX0KIH0KIAotc3RhdGljIHZvaWQgcmluZ19s b2coc3RydWN0IHJpbmcgKnJpbmcsIHVuc2lnbmVkIGxvbmcgc2FtcGxlc19wZXJfc2VjLAotCQlG SUxFICpvdXRwdXQpCitzdGF0aWMgY29uc3QgY2hhciAqYmFyc1tdID0geyAiICIsICLilo8iLCAi 4paOIiwgIuKWjSIsICLilowiLCAi4paLIiwgIuKWiiIsICLilokiLCAi4paIIiB9OworCitzdGF0 aWMgdm9pZAorcHJpbnRfcGVyY2VudGFnZV9iYXIoZG91YmxlIHBlcmNlbnQsIGludCBtYXhfbGVu KQogewotCWlmIChyaW5nLT5zaXplKQotCQlmcHJpbnRmKG91dHB1dCwgIiUzZFx0JWRcdCIsCi0J CQkoaW50KSgxMDAgLSAxMDAgKiByaW5nLT5pZGxlIC8gc2FtcGxlc19wZXJfc2VjKSwKLQkJCShp bnQpKHJpbmctPmZ1bGwgLyBzYW1wbGVzX3Blcl9zZWMpKTsKLQllbHNlCi0JCWZwcmludGYob3V0 cHV0LCAiLTFcdC0xXHQiKTsKKwlpbnQgYmFyX2xlbiA9IHBlcmNlbnQgKiAoOCAqIChtYXhfbGVu IC0gMikpIC8gMTAwLjA7CisJaW50IGk7CisKKwlwdXRjaGFyKCd8Jyk7CisKKwlmb3IgKGkgPSBi YXJfbGVuOyBpID49IDg7IGkgLT0gOCkKKwkJcHJpbnRmKCIlcyIsIGJhcnNbOF0pOworCWlmIChp KQorCQlwcmludGYoIiVzIiwgYmFyc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKG1heF9sZW4g LSAyIC0gKGJhcl9sZW4gKyA3KSAvIDgpOyBpKyspCisJCXB1dGNoYXIoJyAnKTsKKworCXB1dGNo YXIoJ3wnKTsKIH0KIAorI2RlZmluZSBERUZBVUxUX1BFUklPRF9NUyAoMTAwMCkKKwogc3RhdGlj IHZvaWQKIHVzYWdlKGNvbnN0IGNoYXIgKmFwcG5hbWUpCiB7CiAJcHJpbnRmKCJpbnRlbF9ncHVf dG9wIC0gRGlzcGxheSBhIHRvcC1saWtlIHN1bW1hcnkgb2YgSW50ZWwgR1BVIHVzYWdlXG4iCi0J CQkiXG4iCi0JCQkidXNhZ2U6ICVzIFtwYXJhbWV0ZXJzXVxuIgotCQkJIlxuIgotCQkJIlRoZSBm b2xsb3dpbmcgcGFyYW1ldGVycyBhcHBseTpcbiIKLQkJCSJbLXMgPHNhbXBsZXM+XSAgICAgICBz YW1wbGVzIHBlciBzZWNvbmRzIChkZWZhdWx0ICVkKVxuIgotCQkJIlstZSA8Y29tbWFuZD5dICAg ICAgIGNvbW1hbmQgdG8gcHJvZmlsZVxuIgotCQkJIlstbyA8ZmlsZT5dICAgICAgICAgIG91dHB1 dCBzdGF0aXN0aWNzIHRvIGZpbGUuIElmIGZpbGUgaXMgJy0nLCIKLQkJCSIgICAgICAgICAgICAg ICAgICAgICBydW4gaW4gYmF0Y2ggbW9kZSBhbmQgb3V0cHV0IHN0YXRpc3RpY3MgdG8gc3RkaW8g b25seSBcbiIKLQkJCSJbLWhdICAgICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBzY3JlZW5c biIKLQkJCSJcbiIsCi0JCQlhcHBuYW1lLAotCQkJU0FNUExFU19QRVJfU0VDCi0JCSAgKTsKLQly ZXR1cm47CisJCSJcbiIKKwkJIlVzYWdlOiAlcyBbcGFyYW1ldGVyc11cbiIKKwkJIlxuIgorCQki XHRUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOlxuIgorCQkiXHRbLXMgPHNh bXBsZXM+XSAgICAgICByZWZyZXNoIHBlcmlvZCBpbiBtcyAoZGVmYXVsdCAldW1zKVxuIgorCQki XHRbLWhdICAgICAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCB0ZXh0XG4iCisJCSJcbiIsCisJ CWFwcG5hbWUsIERFRkFVTFRfUEVSSU9EX01TKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNo YXIgKiphcmd2KQogewotCXVpbnQzMl90IGRldmlkOwotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lf ZGV2OwotCXN0cnVjdCByaW5nIHJlbmRlcl9yaW5nID0gewotCQkubmFtZSA9ICJyZW5kZXIiLAot CQkubW1pbyA9IDB4MjAzMCwKLQl9LCBic2RfcmluZyA9IHsKLQkJLm5hbWUgPSAiYml0c3RyZWFt IiwKLQkJLm1taW8gPSAweDQwMzAsCi0JfSwgYnNkNl9yaW5nID0gewotCQkubmFtZSA9ICJiaXRz dHJlYW0iLAotCQkubW1pbyA9IDB4MTIwMzAsCi0JfSwgYmx0X3JpbmcgPSB7Ci0JCS5uYW1lID0g ImJsaXR0ZXIiLAotCQkubW1pbyA9IDB4MjIwMzAsCi0JfTsKLQlpbnQgaSwgY2g7Ci0JaW50IHNh bXBsZXNfcGVyX3NlYyA9IFNBTVBMRVNfUEVSX1NFQzsKLQlGSUxFICpvdXRwdXQgPSBOVUxMOwot CWRvdWJsZSBlbGFwc2VkX3RpbWU9MDsKLQlpbnQgcHJpbnRfaGVhZGVycz0xOwotCXBpZF90IGNo aWxkX3BpZD0tMTsKLQlpbnQgY2hpbGRfc3RhdDsKLQljaGFyICpjbWQ9TlVMTDsKLQlpbnQgaW50 ZXJhY3RpdmU9MTsKLQotCS8qIFBhcnNlIG9wdGlvbnM/ICovCi0Jd2hpbGUgKChjaCA9IGdldG9w dChhcmdjLCBhcmd2LCAiczpvOmU6aCIpKSAhPSAtMSkgeworCXVuc2lnbmVkIGludCBwZXJpb2Rf dXMgPSBERUZBVUxUX1BFUklPRF9NUyAqIDEwMDA7CisJaW50IGNvbl93ID0gLTEsIGNvbl9oID0g LTE7CisJc3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJl dCwgY2g7CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdj LCBhcmd2LCAiczpoIikpICE9IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnZSc6IGNt ZCA9IHN0cmR1cChvcHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOiBzYW1wbGVzX3Blcl9z ZWMgPSBhdG9pKG9wdGFyZyk7Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2VjIDwgMTAwKSB7Ci0JCQkJ ZnByaW50ZihzdGRlcnIsICJFcnJvcjogc2FtcGxlcyBwZXIgc2Vjb25kIG11c3QgYmUgPj0gMTAw XG4iKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkJaWYg KCFzdHJjbXAob3B0YXJnLCAiLSIpKSB7Ci0JCQkJLyogUnVubmluZyBpbiBub24taW50ZXJhY3Rp dmUgbW9kZSAqLwotCQkJCWludGVyYWN0aXZlID0gMDsKLQkJCQlvdXRwdXQgPSBzdGRvdXQ7Ci0J CQl9Ci0JCQllbHNlCi0JCQkJb3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAidyIpOwotCQkJaWYgKCFv dXRwdXQpCi0JCQl7Ci0JCQkJcGVycm9yKCJmb3BlbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9CisJ CWNhc2UgJ3MnOgorCQkJcGVyaW9kX3VzID0gYXRvaShvcHRhcmcpICogMTAwMDsKIAkJCWJyZWFr OwogCQljYXNlICdoJzoKIAkJCXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhpdCgwKTsKLQkJCWJyZWFr OwogCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGZsYWcgJWMhXG4iLCAo Y2hhcilvcHRvcHQpOworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wdGlvbiAlYyFcbiIs IChjaGFyKW9wdG9wdCk7CiAJCQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4aXQoMSk7Ci0JCQlicmVh azsKIAkJfQogCX0KIAotCXBjaV9kZXYgPSBpbnRlbF9nZXRfcGNpX2RldmljZSgpOwotCWRldmlk ID0gcGNpX2Rldi0+ZGV2aWNlX2lkOwotCWludGVsX21taW9fdXNlX3BjaV9iYXIocGNpX2Rldik7 Ci0JaW5pdF9pbnN0ZG9uZV9kZWZpbml0aW9ucyhkZXZpZCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIGEg Y29tbWFuZCB0byBydW4/ICovCi0JaWYgKGNtZCAhPSBOVUxMKSB7Ci0JCWlmIChvdXRwdXQpIHsK LQkJCWZwcmludGYob3V0cHV0LCAiIyBQcm9maWxpbmc6ICVzXG4iLCBjbWQpOwotCQkJZmZsdXNo KG91dHB1dCk7Ci0JCX0KLQkJY2hpbGRfcGlkID0gZm9yaygpOwotCQlpZiAoY2hpbGRfcGlkIDwg MCkgewotCQkJcGVycm9yKCJmb3JrIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWVsc2UgaWYgKGNo aWxkX3BpZCA9PSAwKSB7Ci0JCQlpbnQgcmVzOwotCQkJcmVzID0gc3lzdGVtKGNtZCk7Ci0JCQlp ZiAocmVzIDwgMCkKLQkJCQlwZXJyb3IoInJ1bm5pbmcgY29tbWFuZCIpOwotCQkJaWYgKG91dHB1 dCkgewotCQkJCWZmbHVzaChvdXRwdXQpOwotCQkJCWZwcmludGYob3V0cHV0LCAiIyAlcyBleGl0 ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIGNtZCwgcmVzKTsKLQkJCQlmZmx1c2gob3V0cHV0KTsKLQkJ CX0KLQkJCWZyZWUoY21kKTsKLQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKGNtZCk7 Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewot CQl0b3BfYml0c1tpXS5iaXQgPSAmaW5zdGRvbmVfYml0c1tpXTsKLQkJdG9wX2JpdHNbaV0uY291 bnQgPSAwOwotCQl0b3BfYml0c19zb3J0ZWRbaV0gPSAmdG9wX2JpdHNbaV07CisJZW5naW5lcyA9 IGRpc2NvdmVyX2VuZ2luZXMoKTsKKwlpZiAoIWVuZ2luZXMpIHsKKwkJZnByaW50ZihzdGRlcnIs CisJCQkiRmFpbGVkIHRvIGRldGVjdCBlbmdpbmVzISBLZXJuZWwgNC4xNiBvciBuZXdlcj9cbiIp OworCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiBHcmFiIGFjY2VzcyB0byB0aGUgcmVnaXN0ZXJzICov Ci0JaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2luaXQocGNpX2RldiwgMCwgLTEpOwotCi0JcmluZ19p bml0KCZyZW5kZXJfcmluZyk7Ci0JaWYgKElTX0dFTjQoZGV2aWQpIHx8IElTX0dFTjUoZGV2aWQp KQotCQlyaW5nX2luaXQoJmJzZF9yaW5nKTsKLQlpZiAoSVNfR0VONihkZXZpZCkgfHwgSVNfR0VO NyhkZXZpZCkpIHsKLQkJcmluZ19pbml0KCZic2Q2X3JpbmcpOwotCQlyaW5nX2luaXQoJmJsdF9y aW5nKTsKKwlyZXQgPSBwbXVfaW5pdChlbmdpbmVzKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYo c3RkZXJyLAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIFBNVSEgS2VybmVsIDQuMTYgb3IgbmV3 ZXI/XG4iKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JLyogSW5pdGlhbGl6ZSBHUFUgc3RhdHMgKi8K LQlpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBTVEFUU19D T1VOVDsgaSsrKSB7Ci0JCQl1aW50MzJfdCBzdGF0c19oaWdoLCBzdGF0c19sb3csIHN0YXRzX2hp Z2hfMjsKLQotCQkJZG8gewotCQkJCXN0YXRzX2hpZ2ggPSBJTlJFRyhzdGF0c19yZWdzW2ldICsg NCk7Ci0JCQkJc3RhdHNfbG93ID0gSU5SRUcoc3RhdHNfcmVnc1tpXSk7Ci0JCQkJc3RhdHNfaGln aF8yID0gSU5SRUcoc3RhdHNfcmVnc1tpXSArIDQpOwotCQkJfSB3aGlsZSAoc3RhdHNfaGlnaCAh PSBzdGF0c19oaWdoXzIpOwotCi0JCQlsYXN0X3N0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRzX2hp Z2ggPDwgMzIgfAotCQkJCXN0YXRzX2xvdzsKLQkJfQotCX0KKwlwbXVfc2FtcGxlKGVuZ2luZXMp OwogCiAJZm9yICg7OykgewotCQlpbnQgajsKLQkJdW5zaWduZWQgbG9uZyBsb25nIHQxLCB0aSwg dGYsIHQyOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgZGVmX3NsZWVwID0gMTAwMDAwMCAvIHNhbXBs ZXNfcGVyX3NlYzsKLQkJdW5zaWduZWQgbG9uZyBsb25nIGxhc3Rfc2FtcGxlc19wZXJfc2VjID0g c2FtcGxlc19wZXJfc2VjOwotCQl1bnNpZ25lZCBzaG9ydCBpbnQgbWF4X2xpbmVzOworCQlkb3Vi bGUgdDsKKyNkZWZpbmUgQlVGU1ogMTYKKwkJY2hhciBmcmVxW0JVRlNaXTsKKwkJY2hhciBmYWN0 W0JVRlNaXTsKKwkJY2hhciBpcnFbQlVGU1pdOworCQljaGFyIHJjNltCVUZTWl07CisJCWNoYXIg cG93ZXJbQlVGU1pdOworCQljaGFyIHJlYWRzW0JVRlNaXTsKKwkJY2hhciB3cml0ZXNbQlVGU1pd OwogCQlzdHJ1Y3Qgd2luc2l6ZSB3czsKLQkJY2hhciBjbGVhcl9zY3JlZW5bXSA9IHsweDFiLCAn WycsICdIJywKLQkJCQkgICAgICAgMHgxYiwgJ1snLCAnSicsCi0JCQkJICAgICAgIDB4MH07Ci0J CWludCBwZXJjZW50OwotCQlpbnQgbGVuOwotCi0JCXQxID0gZ2V0dGltZSgpOwotCi0JCXJpbmdf cmVzZXQoJnJlbmRlcl9yaW5nKTsKLQkJcmluZ19yZXNldCgmYnNkX3JpbmcpOwotCQlyaW5nX3Jl c2V0KCZic2Q2X3JpbmcpOwotCQlyaW5nX3Jlc2V0KCZibHRfcmluZyk7Ci0KLQkJZm9yIChpID0g MDsgaSA8IHNhbXBsZXNfcGVyX3NlYzsgaSsrKSB7Ci0JCQlsb25nIGxvbmcgaW50ZXJ2YWw7Ci0J CQl0aSA9IGdldHRpbWUoKTsKLQkJCWlmIChJU185NjUoZGV2aWQpKSB7Ci0JCQkJaW5zdGRvbmUg PSBJTlJFRyhJTlNURE9ORV9JOTY1KTsKLQkJCQlpbnN0ZG9uZTEgPSBJTlJFRyhJTlNURE9ORV8x KTsKLQkJCX0gZWxzZQotCQkJCWluc3Rkb25lID0gSU5SRUcoSU5TVERPTkUpOwotCi0JCQlmb3Ig KGogPSAwOyBqIDwgbnVtX2luc3Rkb25lX2JpdHM7IGorKykKLQkJCQl1cGRhdGVfaWRsZV9iaXQo JnRvcF9iaXRzW2pdKTsKLQotCQkJcmluZ19zYW1wbGUoJnJlbmRlcl9yaW5nKTsKLQkJCXJpbmdf c2FtcGxlKCZic2RfcmluZyk7Ci0JCQlyaW5nX3NhbXBsZSgmYnNkNl9yaW5nKTsKLQkJCXJpbmdf c2FtcGxlKCZibHRfcmluZyk7Ci0KLQkJCXRmID0gZ2V0dGltZSgpOwotCQkJaWYgKHRmIC0gdDEg Pj0gMTAwMDAwMCkgewotCQkJCS8qIFdlIGFyZSBvdXQgb2Ygc3luYywgYmFpbCBvdXQgKi8KLQkJ CQlsYXN0X3NhbXBsZXNfcGVyX3NlYyA9IGkrMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludGVy dmFsID0gZGVmX3NsZWVwIC0gKHRmIC0gdGkpOwotCQkJaWYgKGludGVydmFsID4gMCkKLQkJCQl1 c2xlZXAoaW50ZXJ2YWwpOworCQlpbnQgbGluZXMgPSAwOworCisJCS8qIFVwZGF0ZSB0ZXJtaW5h bCBzaXplLiAqLworCQlpZiAoaW9jdGwoMCwgVElPQ0dXSU5TWiwgJndzKSAhPSAtMSkgeworCQkJ Y29uX3cgPSB3cy53c19jb2w7CisJCQljb25faCA9IHdzLndzX3JvdzsKIAkJfQogCi0JCWlmIChI QVNfU1RBVFNfUkVHUyhkZXZpZCkpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBTVEFUU19DT1VOVDsg aSsrKSB7Ci0JCQkJdWludDMyX3Qgc3RhdHNfaGlnaCwgc3RhdHNfbG93LCBzdGF0c19oaWdoXzI7 CisJCXBtdV9zYW1wbGUoZW5naW5lcyk7CisJCXQgPSAoZG91YmxlKShlbmdpbmVzLT50cy5jdXIg LSBlbmdpbmVzLT50cy5wcmV2KSAvIDFlOTsKKworCQlwcmludGYoIlwwMzNbSFwwMzNbSiIpOwor CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX3JlcSwgZnJlcSwgQlVGU1osIDQsIDAsIDEuMCwg dCwgMSk7CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5mcmVxX2FjdCwgZmFjdCwgQlVGU1osIDQsIDAs IDEuMCwgdCwgMSk7CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5pcnEsIGlycSwgQlVGU1osIDgsIDAs IDEuMCwgdCwgMSk7CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5yYzYsIHJjNiwgQlVGU1osIDMsIDAs IDFlOSwgdCwgMTAwKTsKKwkJcG11X2NhbGMoJmVuZ2luZXMtPnJhcGwsIHBvd2VyLCBCVUZTWiwg NiwgMCwgMS4wLCB0LAorCQkJIGVuZ2luZXMtPnJhcGxfc2NhbGUpOworCQlwbXVfY2FsYygmZW5n aW5lcy0+aW1jX3JlYWRzLCByZWFkcywgQlVGU1osIDYsIDAsIDEuMCwgdCwKKwkJCSBlbmdpbmVz LT5pbWNfcmVhZHNfc2NhbGUpOworCQlwbXVfY2FsYygmZW5naW5lcy0+aW1jX3dyaXRlcywgd3Jp dGVzLCBCVUZTWiwgNiwgMCwgMS4wLCB0LAorCQkJIGVuZ2luZXMtPmltY193cml0ZXNfc2NhbGUp OworCisJCXByaW50ZigiaW50ZWwtZ3B1LXRvcCAtICVzLyVzIE1IejsgICVzJSUgUkM2OyAlc21X OyAlcyBpcnFzL3NcbiIsCisJCSAgICAgICBmYWN0LCBmcmVxLCByYzYsIHBvd2VyLCBpcnEpOwor CQlsaW5lcysrOworCisJCXByaW50ZigiXG4iKTsKKwkJbGluZXMrKzsKKworCQlwcmludGYoIiUx NnMgJXMgJXMvc1xuIiwKKwkJICAgICAgICJJTUMgcmVhZHM6IiwgcmVhZHMsIGVuZ2luZXMtPmlt Y19yZWFkc191bml0KTsKKwkJbGluZXMrKzsKKworCQlwcmludGYoIiUxNnMgJXMgJXMvc1xuIiwK KwkJICAgICAgICJJTUMgd3JpdGVzOiIsIHdyaXRlcywgZW5naW5lcy0+aW1jX3dyaXRlc191bml0 KTsKKwkJbGluZXMrKzsKKworCQlwcmludGYoIlxuIik7CisJCWxpbmVzKys7CisKKwkJZm9yIChp ID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzICYmIGxpbmVzIDwgY29uX2g7IGkrKykgewor CQkJc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsKKwkJCXVu c2lnbmVkIGludCBtYXhfdyA9IGNvbl93IC0gMTsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCQlj aGFyIHNlbWFbQlVGU1pdOworCQkJY2hhciB3YWl0W0JVRlNaXTsKKwkJCWNoYXIgYnVzeVtCVUZT Wl07CisJCQljaGFyIGJ1ZlsxMjhdOworCQkJZG91YmxlIHZhbDsKKworCQkJaWYgKCFlbmdpbmUt Pm51bV9jb3VudGVycykKKwkJCQljb250aW51ZTsKIAotCQkJCWRvIHsKLQkJCQkJc3RhdHNfaGln aCA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0KTsKLQkJCQkJc3RhdHNfbG93ID0gSU5SRUcoc3Rh dHNfcmVnc1tpXSk7Ci0JCQkJCXN0YXRzX2hpZ2hfMiA9IElOUkVHKHN0YXRzX3JlZ3NbaV0gKyA0 KTsKLQkJCQl9IHdoaWxlIChzdGF0c19oaWdoICE9IHN0YXRzX2hpZ2hfMik7CisJCQlwbXVfY2Fs YygmZW5naW5lLT5zZW1hLCBzZW1hLCBCVUZTWiwgMywgMCwgMWU5LCB0LAorCQkJCSAxMDApOwor CQkJcG11X2NhbGMoJmVuZ2luZS0+d2FpdCwgd2FpdCwgQlVGU1osIDMsIDAsIDFlOSwgdCwKKwkJ CQkgMTAwKTsKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyUlIHNlbWEs ICVzJSUgd2FpdCIsCisJCQkJICAgICAgIHNlbWEsIHdhaXQpOwogCi0JCQkJc3RhdHNbaV0gPSAo dWludDY0X3Qpc3RhdHNfaGlnaCA8PCAzMiB8Ci0JCQkJCXN0YXRzX2xvdzsKLQkJCX0KLQkJfQor CQkJcG11X2NhbGMoJmVuZ2luZS0+YnVzeSwgYnVzeSwgQlVGU1osIDYsIDIsIDFlOSwgdCwKKwkJ CQkgMTAwKTsKKwkJCWxlbiArPSBwcmludGYoIiUxNnMgJXMlJSAiLCBlbmdpbmUtPmRpc3BsYXlf bmFtZSwgYnVzeSk7CiAKLQkJcXNvcnQodG9wX2JpdHNfc29ydGVkLCBudW1faW5zdGRvbmVfYml0 cywKLQkJICAgICAgc2l6ZW9mKHN0cnVjdCB0b3BfYml0ICopLCB0b3BfYml0c19zb3J0KTsKLQot CQkvKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGxpbmVzIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsIGhl aWdodCBzbyB0aGUKLQkJICogbW9zdCBpbXBvcnRhbnQgaW5mbyAoYXQgdGhlIHRvcCkgd2lsbCBz dGF5IG9uIHNjcmVlbi4gKi8KLQkJbWF4X2xpbmVzID0gLTE7Ci0JCWlmIChpb2N0bCgwLCBUSU9D R1dJTlNaLCAmd3MpICE9IC0xKQotCQkJbWF4X2xpbmVzID0gd3Mud3Nfcm93IC0gNjsgLyogZXhj bHVkZSBoZWFkZXIgbGluZXMgKi8KLQkJaWYgKG1heF9saW5lcyA+PSBudW1faW5zdGRvbmVfYml0 cykKLQkJCW1heF9saW5lcyA9IG51bV9pbnN0ZG9uZV9iaXRzOwotCi0JCXQyID0gZ2V0dGltZSgp OwotCQllbGFwc2VkX3RpbWUgKz0gKHQyIC0gdDEpIC8gMTAwMDAwMC4wOwotCi0JCWlmIChpbnRl cmFjdGl2ZSkgewotCQkJcHJpbnRmKCIlcyIsIGNsZWFyX3NjcmVlbik7Ci0JCQlwcmludF9jbG9j a19pbmZvKHBjaV9kZXYpOwotCi0JCQlyaW5nX3ByaW50KCZyZW5kZXJfcmluZywgbGFzdF9zYW1w bGVzX3Blcl9zZWMpOwotCQkJcmluZ19wcmludCgmYnNkX3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJf c2VjKTsKLQkJCXJpbmdfcHJpbnQoJmJzZDZfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwot CQkJcmluZ19wcmludCgmYmx0X3JpbmcsIGxhc3Rfc2FtcGxlc19wZXJfc2VjKTsKLQotCQkJcHJp bnRmKCJcbiUzMHMgICVzXG4iLCAidGFzayIsICJwZXJjZW50IGJ1c3kiKTsKLQkJCWZvciAoaSA9 IDA7IGkgPCBtYXhfbGluZXM7IGkrKykgewotCQkJCWlmICh0b3BfYml0c19zb3J0ZWRbaV0tPmNv dW50ID4gMCkgewotCQkJCQlwZXJjZW50ID0gKHRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgKiAx MDApIC8KLQkJCQkJCWxhc3Rfc2FtcGxlc19wZXJfc2VjOwotCQkJCQlsZW4gPSBwcmludGYoIiUz MHM6ICUzZCUlOiAiLAotCQkJCQkJCSB0b3BfYml0c19zb3J0ZWRbaV0tPmJpdC0+bmFtZSwKLQkJ CQkJCQkgcGVyY2VudCk7Ci0JCQkJCXByaW50X3BlcmNlbnRhZ2VfYmFyIChwZXJjZW50LCBsZW4p OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ZigiJSpzIiwgUEVSQ0VOVEFHRV9CQVJfRU5ELCAi Iik7Ci0JCQkJfQotCi0JCQkJaWYgKGkgPCBTVEFUU19DT1VOVCAmJiBIQVNfU1RBVFNfUkVHUyhk ZXZpZCkpIHsKLQkJCQkJcHJpbnRmKCIlMTNzOiAlbGx1ICglbGxkL3NlYykiLAotCQkJCQkJICAg c3RhdHNfcmVnX25hbWVzW2ldLAotCQkJCQkJICAgKGxvbmcgbG9uZylzdGF0c1tpXSwKLQkJCQkJ CSAgIChsb25nIGxvbmcpKHN0YXRzW2ldIC0gbGFzdF9zdGF0c1tpXSkpOwotCQkJCQlsYXN0X3N0 YXRzW2ldID0gc3RhdHNbaV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCF0b3BfYml0c19zb3J0 ZWRbaV0tPmNvdW50KQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXByaW50ZigiXG4iKTsKLQkJ CX0KLQkJfQotCQlpZiAob3V0cHV0KSB7Ci0JCQkvKiBQcmludCBoZWFkZXJzIGZvciBjb2x1bW5z IGF0IGZpcnN0IHJ1biAqLwotCQkJaWYgKHByaW50X2hlYWRlcnMpIHsKLQkJCQlmcHJpbnRmKG91 dHB1dCwgIiMgdGltZVx0Iik7Ci0JCQkJcmluZ19wcmludF9oZWFkZXIob3V0cHV0LCAmcmVuZGVy X3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJzZF9yaW5nKTsKLQkJCQly aW5nX3ByaW50X2hlYWRlcihvdXRwdXQsICZic2Q2X3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVh ZGVyKG91dHB1dCwgJmJsdF9yaW5nKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9UT1Bf QklUUzsgaSsrKSB7Ci0JCQkJCWlmIChpIDwgU1RBVFNfQ09VTlQgJiYgSEFTX1NUQVRTX1JFR1Mo ZGV2aWQpKSB7Ci0JCQkJCQlmcHJpbnRmKG91dHB1dCwgIiUuNnNcdCIsCi0JCQkJCQkJICAgc3Rh dHNfcmVnX25hbWVzW2ldCi0JCQkJCQkJICAgKTsKLQkJCQkJfQotCQkJCQlpZiAoIXRvcF9iaXRz W2ldLmNvdW50KQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZwcmludGYob3V0cHV0LCAi XG4iKTsKLQkJCQlwcmludF9oZWFkZXJzID0gMDsKLQkJCX0KLQotCQkJLyogUHJpbnQgc3RhdGlz dGljcyAqLwotCQkJZnByaW50ZihvdXRwdXQsICIlLjJmXHQiLCBlbGFwc2VkX3RpbWUpOwotCQkJ cmluZ19sb2coJnJlbmRlcl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJ CXJpbmdfbG9nKCZic2RfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0JCQly aW5nX2xvZygmYnNkNl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYywgb3V0cHV0KTsKLQkJCXJp bmdfbG9nKCZibHRfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMsIG91dHB1dCk7Ci0KLQkJCWZv ciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RPUF9CSVRTOyBpKyspIHsKLQkJCQlpZiAoaSA8IFNUQVRT X0NPVU5UICYmIEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJCQlmcHJpbnRmKG91dHB1dCwg IiUiUFJJdTY0Ilx0IiwKLQkJCQkJCSAgIHN0YXRzW2ldIC0gbGFzdF9zdGF0c1tpXSk7Ci0JCQkJ CWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tpXTsKLQkJCQl9Ci0JCQkJCWlmICghdG9wX2JpdHNbaV0u Y291bnQpCi0JCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZwcmludGYob3V0cHV0LCAiXG4iKTsK LQkJCWZmbHVzaChvdXRwdXQpOwotCQl9CisJCQl2YWwgPSBfX3BtdV9jYWxjKCZlbmdpbmUtPmJ1 c3kudmFsLCAxZTksIHQsIDEwMCk7CisJCQlwcmludF9wZXJjZW50YWdlX2Jhcih2YWwsIG1heF93 IC0gbGVuKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2luc3Rkb25lX2JpdHM7IGkrKykgewot CQkJdG9wX2JpdHNfc29ydGVkW2ldLT5jb3VudCA9IDA7CisJCQlwcmludGYoIiVzXG4iLCBidWYp OwogCi0JCQlpZiAoaSA8IFNUQVRTX0NPVU5UKQotCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tp XTsKKwkJCWxpbmVzKys7CiAJCX0KIAotCQkvKiBDaGVjayBpZiBjaGlsZCBoYXMgZ29uZSAqLwot CQlpZiAoY2hpbGRfcGlkID4gMCkgewotCQkJaW50IHJlczsKLQkJCWlmICgocmVzID0gd2FpdHBp ZChjaGlsZF9waWQsICZjaGlsZF9zdGF0LCBXTk9IQU5HKSkgPT0gLTEpIHsKLQkJCQlwZXJyb3Io IndhaXRwaWQiKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJaWYgKHJlcyA9PSAwKQotCQkJCWNv bnRpbnVlOwotCQkJaWYgKFdJRkVYSVRFRChjaGlsZF9zdGF0KSkKLQkJCQlicmVhazsKLQkJfQot CX0KKwkJcHJpbnRmKCJcbiIpOwogCi0JZmNsb3NlKG91dHB1dCk7CisJCXVzbGVlcChwZXJpb2Rf dXMpOworCX0KIAotCWludGVsX3JlZ2lzdGVyX2FjY2Vzc19maW5pKCk7CiAJcmV0dXJuIDA7CiB9 CmRpZmYgLS1naXQgYS90b29scy9tZXNvbi5idWlsZCBiL3Rvb2xzL21lc29uLmJ1aWxkCmluZGV4 IGJkMmQzMTNkNTE1Ni4uYTkxOGVlYjBiZWYxIDEwMDY0NAotLS0gYS90b29scy9tZXNvbi5idWls ZAorKysgYi90b29scy9tZXNvbi5idWlsZApAQCAtMjMsNyArMjMsNiBAQCB0b29sc19wcm9ncyA9 IFsKIAknaW50ZWxfZ3B1X2ZyZXF1ZW5jeScsCiAJJ2ludGVsX2Zpcm13YXJlX2RlY29kZScsCiAJ J2ludGVsX2dwdV90aW1lJywKLQknaW50ZWxfZ3B1X3RvcCcsCiAJJ2ludGVsX2d0dCcsCiAJJ2lu dGVsX2d1Y19sb2dnZXInLAogCSdpbnRlbF9pbmZvZnJhbWVzJywKQEAgLTExNyw2ICsxMTYsMTEg QEAgc2hhcmVkX2xpYnJhcnkoJ2ludGVsX2F1YmR1bXAnLCAnYXViZHVtcC5jJywKIAkgICAgICAg bmFtZV9wcmVmaXggOiAnJywKIAkgICAgICAgaW5zdGFsbCA6IHRydWUpCiAKK2V4ZWN1dGFibGUo J2ludGVsX2dwdV90b3AnLCAnaW50ZWxfZ3B1X3RvcC5jJywKKwkgICBpbnN0YWxsIDogdHJ1ZSwK KwkgICBpbnN0YWxsX3JwYXRoIDogcnBhdGhkaXIsCisJICAgZGVwZW5kZW5jaWVzIDogdG9vbF9k ZXBzICsgWyBsaWJfaWd0X3BlcmYgXSkKKwogY29uZl9kYXRhID0gY29uZmlndXJhdGlvbl9kYXRh KCkKIGNvbmZfZGF0YS5zZXQoJ3ByZWZpeCcsIHByZWZpeCkKIGNvbmZfZGF0YS5zZXQoJ2V4ZWNf cHJlZml4JywgJyR7cHJlZml4fScpCi0tIAoyLjE0LjEKCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4 QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWls bWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=