From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulo Zanoni Subject: [RFC i-g-t] tests: add runtime_pm Date: Fri, 25 Oct 2013 11:44:05 -0200 Message-ID: <1382708645-2036-1-git-send-email-przanoni@gmail.com> References: <1382470214-1597-1-git-send-email-przanoni@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qa0-f44.google.com (mail-qa0-f44.google.com [209.85.216.44]) by gabe.freedesktop.org (Postfix) with ESMTP id B291BE807D for ; Fri, 25 Oct 2013 06:44:17 -0700 (PDT) Received: by mail-qa0-f44.google.com with SMTP id cm18so565608qab.10 for ; Fri, 25 Oct 2013 06:44:16 -0700 (PDT) In-Reply-To: <1382470214-1597-1-git-send-email-przanoni@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org Errors-To: intel-gfx-bounces+gcfxdi-intel-gfx=m.gmane.org@lists.freedesktop.org To: intel-gfx@lists.freedesktop.org Cc: Paulo Zanoni List-Id: intel-gfx@lists.freedesktop.org RnJvbTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+CgpUaGlzIHRlc3Qg aXMgYmFzZWQgb24gcGM4LmMuIEl0IGNvcGllcyBtb3N0IG9mIHRoZSB0ZXN0cyBmcm9tIHBjOC5j LApidXQgaXQgZGVwZW5kcyBvbiBydW50aW1lIFBNIHN0YXR1cyBjaGFuZ2VzIChwYXJzZWQgZnJv bSBzeXNmcykKaW5zdGVhZCBvZiBQQzggcmVzaWRlbmN5IGNoYW5nZXMgKHBhcnNlZCBmcm9tIHRo ZSBNU1IgcmVnaXN0ZXJzKS4KVGhlcmUncyBhbHNvIGEgdGVzdCB0aGF0IGNoZWNrcyBmb3IgUEM4 IHJlc2lkZW5jeS4KCkZvciBub3csIHJ1bnRpbWUgUE0gYW5kIFBDOCBhcmUgZGlmZmVyZW50IGZl YXR1cmVzLCBzbyBoYXZpbmcgMiB0ZXN0CnN1aXRlcyBtYWtlcyBzZW5zZS4gSW4gdGhlIGZ1dHVy ZSB3ZSdsbCBtZXJnZSBib3RoLCBzbyB3ZSdsbCBvbmx5IGdldApQQzggd2hlbiBydW50aW1lIFBN IGlzIGVuYWJsZWQsIHNvIHdlJ2xsIGp1c3Qga2lsbCBwYzguYyBhbmQga2VlcAp1c2luZyBydW50 aW1lX3BtLmMuCgpDaGFuZ2VzIGNvbXBhcmVkIHRvIHBjOC5jOgogIC0gV2Ugbm93IGxvb2sgYXQg dGhlIHJ1bnRpbWUgUE0gc3RhdHVzIGluc3RlYWQgb2YgUEM4IHJlc2lkZW5jaWVzCiAgLSBBZGRl ZCBtb3JlIEdFTSB0ZXN0cyAobW1hcCwgcHJlYWQsIGV4ZWNidWYsIHN0cmVzcyB0ZXN0cykKICAt IEFkZGVkIExQU1AgYW5kIG5vbi1MUFNQIHRlc3RzCiAgLSBBZGRlZCB0ZXN0cyBmcm8gc3lzZnMg YW5kIGRlYnVnZnMgZmlsZXMKICAtIEFkZGVkIGEgdGVzdCBzcGVjaWZpY2FsbHkgZm9yIFBDOAoK U2lnbmVkLW9mZi1ieTogUGF1bG8gWmFub25pIDxwYXVsby5yLnphbm9uaUBpbnRlbC5jb20+Ci0t LQogdGVzdHMvLmdpdGlnbm9yZSAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5hbSAgfCAgICAx ICsKIHRlc3RzL3J1bnRpbWVfcG0uYyB8IDEyNjIgKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxMjY0IGluc2VydGlv bnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9ydW50aW1lX3BtLmMKCmRpZmYgLS1naXQg YS90ZXN0cy8uZ2l0aWdub3JlIGIvdGVzdHMvLmdpdGlnbm9yZQppbmRleCAxYzk3YTA0Li5jZGE2 ZDA5IDEwMDY0NAotLS0gYS90ZXN0cy8uZ2l0aWdub3JlCisrKyBiL3Rlc3RzLy5naXRpZ25vcmUK QEAgLTEwNSw2ICsxMDUsNyBAQCBwcmltZV9udl9wY29weQogcHJpbWVfbnZfdGVzdAogcHJpbWVf c2VsZl9pbXBvcnQKIHByaW1lX3VkbAorcnVudGltZV9wbQogc3lzZnNfcmM2X3Jlc2lkZW5jeQog c3lzZnNfcnBzCiB0ZXN0ZGlzcGxheQpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90 ZXN0cy9NYWtlZmlsZS5hbQppbmRleCBmNmJhMzY4Li4yMzRhYWY1IDEwMDY0NAotLS0gYS90ZXN0 cy9NYWtlZmlsZS5hbQorKysgYi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtNTksNiArNTksNyBAQCBU RVNUU19wcm9nc19NID0gXAogCSQoTk9VVkVBVV9URVNUU19NKSBcCiAJcGM4IFwKIAlwcmltZV9z ZWxmX2ltcG9ydCBcCisJcnVudGltZV9wbSBcCiAJJChOVUxMKQogCiBURVNUU19wcm9ncyA9IFwK ZGlmZiAtLWdpdCBhL3Rlc3RzL3J1bnRpbWVfcG0uYyBiL3Rlc3RzL3J1bnRpbWVfcG0uYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjVlNzQzCi0tLSAvZGV2L251bGwKKysr IGIvdGVzdHMvcnVudGltZV9wbS5jCkBAIC0wLDAgKzEsMTI2MiBAQAorLyoKKyAqIENvcHlyaWdo dCDCqSAyMDEzIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkg Z3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3Ry aWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVz ZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwK KyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0 CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICog SU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBQYXVsbyBaYW5vbmkgPHBh dWxvLnIuemFub25pQGludGVsLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgor I2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9v bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVk ZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4K KyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUg PHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJj LWRldi5oPgorCisjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImludGVsX2dwdV90b29s cy5oIgorI2luY2x1ZGUgImlndF9kaXNwbGF5LmgiCisKKworI2RlZmluZSBNU1JfUEM4X1JFUwkw eDYzMAorI2RlZmluZSBNU1JfUEM5X1JFUwkweDYzMQorI2RlZmluZSBNU1JfUEMxMF9SRVMJMHg2 MzIKKworI2RlZmluZSBQT1dFUl9ESVIgIi9zeXMvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6 MDIuMC9wb3dlciIKKworI2RlZmluZSBNQVhfQ09OTkVDVE9SUwkzMgorI2RlZmluZSBNQVhfRU5D T0RFUlMJMzIKKyNkZWZpbmUgTUFYX0NSVENTCTE2CisKKworZW51bSBydW50aW1lX3BtX3N0YXR1 cyB7CisJUlVOVElNRV9QTV9TVEFUVVNfQUNUSVZFLAorCVJVTlRJTUVfUE1fU1RBVFVTX1NVU1BF TkRFRCwKKwlSVU5USU1FX1BNX1NUQVRVU19TVVNQRU5ESU5HLAorCVJVTlRJTUVfUE1fU1RBVFVT X1VOS05PV04sCit9OworCitlbnVtIHNjcmVlbl90eXBlIHsKKwlTQ1JFRU5fVFlQRV9MUFNQLAor CVNDUkVFTl9UWVBFX05PTl9MUFNQLAorCVNDUkVFTl9UWVBFX0FOWSwKK307CisKKy8qIFN0dWZm IHVzZWQgd2hlbiBjcmVhdGluZyBGQnMgYW5kIG1vZGUgc2V0dGluZy4gKi8KK3N0cnVjdCBtb2Rl X3NldF9kYXRhIHsKKwlkcm1Nb2RlUmVzUHRyIHJlczsKKwlkcm1Nb2RlQ29ubmVjdG9yUHRyIGNv bm5lY3RvcnNbTUFYX0NPTk5FQ1RPUlNdOworCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIgZWRpZHNb TUFYX0NPTk5FQ1RPUlNdOworCisJdWludDMyX3QgZGV2aWQ7Cit9OworCisvKiBTdHVmZiB3ZSBx dWVyeSBhdCBkaWZmZXJlbnQgdGltZXMgc28gd2UgY2FuIGNvbXBhcmUuICovCitzdHJ1Y3QgY29t cGFyZV9kYXRhIHsKKwlkcm1Nb2RlUmVzUHRyIHJlczsKKwlkcm1Nb2RlRW5jb2RlclB0ciBlbmNv ZGVyc1tNQVhfRU5DT0RFUlNdOworCWRybU1vZGVDb25uZWN0b3JQdHIgY29ubmVjdG9yc1tNQVhf Q09OTkVDVE9SU107CisJZHJtTW9kZUNydGNQdHIgY3J0Y3NbTUFYX0NSVENTXTsKKwlkcm1Nb2Rl UHJvcGVydHlCbG9iUHRyIGVkaWRzW01BWF9DT05ORUNUT1JTXTsKK307CisKKworaW50IGRybV9m ZDsKK2ludCBzdGF0dXNfZmQ7CitpbnQgbXNyX2ZkID0gMDsKK3N0cnVjdCBtb2RlX3NldF9kYXRh IG1zX2RhdGE7Citib29sIHF1aWNrID0gZmFsc2U7CisKKworc3RhdGljIHVpbnQ2NF90IGdldF9y ZXNpZGVuY3kodWludDMyX3QgdHlwZSkKK3sKKwlpbnQgcmM7CisJdWludDY0X3QgcmV0OworCisJ cmMgPSBwcmVhZChtc3JfZmQsICZyZXQsIHNpemVvZih1aW50NjRfdCksIHR5cGUpOworCWlndF9h c3NlcnQocmMgPT0gc2l6ZW9mKHJldCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJv b2wgcGM4X3BsdXNfcmVzaWRlbmN5X2NoYW5nZWQodW5zaWduZWQgaW50IHRpbWVvdXRfc2VjKQor eworCXVuc2lnbmVkIGludCBpOworCXVpbnQ2NF90IHJlc19wYzgsIHJlc19wYzksIHJlc19wYzEw OworCWludCB0b19zbGVlcCA9IDEwMCAqIDEwMDA7CisKKwlyZXNfcGM4ID0gZ2V0X3Jlc2lkZW5j eShNU1JfUEM4X1JFUyk7CisJcmVzX3BjOSA9IGdldF9yZXNpZGVuY3koTVNSX1BDOV9SRVMpOwor CXJlc19wYzEwID0gZ2V0X3Jlc2lkZW5jeShNU1JfUEMxMF9SRVMpOworCisJZm9yIChpID0gMDsg aSA8IHRpbWVvdXRfc2VjICogMTAwMCAqIDEwMDA7IGkgKz0gdG9fc2xlZXApIHsKKwkJaWYgKHJl c19wYzggIT0gZ2V0X3Jlc2lkZW5jeShNU1JfUEM4X1JFUykgfHwKKwkJICAgIHJlc19wYzkgIT0g Z2V0X3Jlc2lkZW5jeShNU1JfUEM5X1JFUykgfHwKKwkJICAgIHJlc19wYzEwICE9IGdldF9yZXNp ZGVuY3koTVNSX1BDMTBfUkVTKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJdXNsZWVwKHRv X3NsZWVwKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIENoZWNrcyBub3Qgb25seSBp ZiBQQzgrIGlzIGFsbG93ZWQsIGJ1dCBhbHNvIGlmIHdlJ3JlIHJlYWNoaW5nIGl0LgorICogV2Ug Y2FsbCB0aGlzIHdoZW4gd2UgZXhwZWN0IHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHF1aWNrbHkg c2luY2UgUEM4IGlzCisgKiBhY3R1YWxseSBlbmFibGVkLCBzbyB0aGUgMzBzIHRpbWVvdXQgd2Ug dXNlIHNob3VsZG4ndCBtYXR0ZXIuICovCitzdGF0aWMgYm9vbCBwYzhfcGx1c19lbmFibGVkKHZv aWQpCit7CisJcmV0dXJuIHBjOF9wbHVzX3Jlc2lkZW5jeV9jaGFuZ2VkKDMwKTsKK30KKworLyog V2UgY2FsbCB0aGlzIHdoZW4gd2UgZXhwZWN0IFBDOCsgdG8gYmUgYWN0dWFsbHkgZGlzYWJsZWQs IHNvIHdlIHNob3VsZCBub3QKKyAqIHJldHVybiB1bnRpbCB0aGUgNXMgdGltZW91dCBleHBpcmVz LiBJbiBvdGhlciB3b3JkczogaW4gdGhlICJoYXBweSBjYXNlIiwKKyAqIGV2ZXJ5IHRpbWUgd2Ug Y2FsbCB0aGlzIGZ1bmN0aW9uLCBpdCB3aWxsIHNsZWVwIGZvciA1IHNlY29uZHMuICovCitzdGF0 aWMgYm9vbCBwYzhfcGx1c19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiAhcGM4X3BsdXNfcmVz aWRlbmN5X2NoYW5nZWQoNSk7Cit9CisKKy8qIElmIHRoZSByZWFkIGZhaWxzLCB0aGVuIHRoZSBt YWNoaW5lIGRvZXNuJ3Qgc3VwcG9ydCBQQzgrIHJlc2lkZW5jaWVzLiAqLworc3RhdGljIGJvb2wg c3VwcG9ydHNfcGM4X3BsdXNfcmVzaWRlbmNpZXModm9pZCkKK3sKKwlpbnQgcmM7CisJdWludDY0 X3QgdmFsOworCisJcmMgPSBwcmVhZChtc3JfZmQsICZ2YWwsIHNpemVvZih1aW50NjRfdCksIE1T Ul9QQzhfUkVTKTsKKwlpZiAocmMgIT0gc2l6ZW9mKHZhbCkpCisJCXJldHVybiBmYWxzZTsKKwly YyA9IHByZWFkKG1zcl9mZCwgJnZhbCwgc2l6ZW9mKHVpbnQ2NF90KSwgTVNSX1BDOV9SRVMpOwor CWlmIChyYyAhPSBzaXplb2YodmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCXJjID0gcHJlYWQobXNy X2ZkLCAmdmFsLCBzaXplb2YodWludDY0X3QpLCBNU1JfUEMxMF9SRVMpOworCWlmIChyYyAhPSBz aXplb2YodmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRp YyBlbnVtIHJ1bnRpbWVfcG1fc3RhdHVzIGdldF9ydW50aW1lX3BtX3N0YXR1cyh2b2lkKQorewor CXNzaXplX3Qgbl9yZWFkOworCWNoYXIgYnVmWzMyXTsKKworCWxzZWVrKHN0YXR1c19mZCwgMCwg U0VFS19TRVQpOworCW5fcmVhZCA9IHJlYWQoc3RhdHVzX2ZkLCBidWYsIEFSUkFZX1NJWkUoYnVm KSk7CisJaWd0X2Fzc2VydChuX3JlYWQgPj0gMCk7CisJYnVmW25fcmVhZF0gPSAnXDAnOworCisJ aWYgKHN0cm5jbXAoYnVmLCAic3VzcGVuZGVkXG4iLCBuX3JlYWQpID09IDApCisJCXJldHVybiBS VU5USU1FX1BNX1NUQVRVU19TVVNQRU5ERUQ7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJhY3Rp dmVcbiIsIG5fcmVhZCkgPT0gMCkKKwkJcmV0dXJuIFJVTlRJTUVfUE1fU1RBVFVTX0FDVElWRTsK KwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInN1c3BlbmRpbmdcbiIsIG5fcmVhZCkgPT0gMCkKKwkJ cmV0dXJuIFJVTlRJTUVfUE1fU1RBVFVTX1NVU1BFTkRJTkc7CisKKwlpZ3RfYXNzZXJ0X2YoZmFs c2UsICJVbmtub3duIHN0YXR1cyAlc1xuIiwgYnVmKTsKKwlyZXR1cm4gUlVOVElNRV9QTV9TVEFU VVNfVU5LTk9XTjsKK30KKworc3RhdGljIGJvb2wgd2FpdF9mb3Jfc3RhdHVzKGVudW0gcnVudGlt ZV9wbV9zdGF0dXMgc3RhdHVzKQoreworCWludCBpOworCWludCBodW5kcmVkX21zID0gMTAwICog MTAwMCwgdGVuX3MgPSAxMCAqIDEwMDAgKiAxMDAwOworCisJZm9yIChpID0gMDsgaSA8IHRlbl9z OyBpICs9IGh1bmRyZWRfbXMpIHsKKwkJaWYgKGdldF9ydW50aW1lX3BtX3N0YXR1cygpID09IHN0 YXR1cykKKwkJCXJldHVybiB0cnVlOworCisJCXVzbGVlcChodW5kcmVkX21zKTsKKwl9CisKKwly ZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHdhaXRfZm9yX3N1c3BlbmRlZCh2b2lkKQor eworCXJldHVybiB3YWl0X2Zvcl9zdGF0dXMoUlVOVElNRV9QTV9TVEFUVVNfU1VTUEVOREVEKTsK K30KKworc3RhdGljIGJvb2wgd2FpdF9mb3JfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIHdhaXRf Zm9yX3N0YXR1cyhSVU5USU1FX1BNX1NUQVRVU19BQ1RJVkUpOworfQorCitzdGF0aWMgdm9pZCBk aXNhYmxlX2FsbF9zY3JlZW5zKHN0cnVjdCBtb2RlX3NldF9kYXRhICpkYXRhKQoreworCWludCBp LCByYzsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5yZXMtPmNvdW50X2NydGNzOyBpKyspIHsK KwkJcmMgPSBkcm1Nb2RlU2V0Q3J0Yyhkcm1fZmQsIGRhdGEtPnJlcy0+Y3J0Y3NbaV0sIC0xLCAw LCAwLAorCQkJCSAgICBOVUxMLCAwLCBOVUxMKTsKKwkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKwl9 Cit9CisKK3N0YXRpYyB1aW50MzJfdCBjcmVhdGVfZmIoc3RydWN0IG1vZGVfc2V0X2RhdGEgKmRh dGEsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlzdHJ1Y3Qga21zdGVzdF9mYiBmYjsKKwlj YWlyb190ICpjcjsKKwl1aW50MzJfdCBidWZmZXJfaWQ7CisKKwlidWZmZXJfaWQgPSBrbXN0ZXN0 X2NyZWF0ZV9mYihkcm1fZmQsIHdpZHRoLCBoZWlnaHQsIDMyLCAyNCwgZmFsc2UsCisJCQkJICAg ICAgJmZiKTsKKwljciA9IGttc3Rlc3RfZ2V0X2NhaXJvX2N0eChkcm1fZmQsICZmYik7CisJa21z dGVzdF9wYWludF90ZXN0X3BhdHRlcm4oY3IsIHdpZHRoLCBoZWlnaHQpOworCXJldHVybiBidWZm ZXJfaWQ7Cit9CisKK3N0YXRpYyBib29sIGVuYWJsZV9vbmVfc2NyZWVuX3dpdGhfdHlwZShzdHJ1 Y3QgbW9kZV9zZXRfZGF0YSAqZGF0YSwKKwkJCQkJZW51bSBzY3JlZW5fdHlwZSB0eXBlKQorewor CXVpbnQzMl90IGNydGNfaWQgPSAwLCBidWZmZXJfaWQgPSAwLCBjb25uZWN0b3JfaWQgPSAwOwor CWRybU1vZGVNb2RlSW5mb1B0ciBtb2RlID0gTlVMTDsKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkg PSAwOyBpIDwgZGF0YS0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZHJtTW9kZUNv bm5lY3RvclB0ciBjID0gZGF0YS0+Y29ubmVjdG9yc1tpXTsKKworCQlpZiAodHlwZSA9PSBTQ1JF RU5fVFlQRV9MUFNQICYmCisJCSAgICBjLT5jb25uZWN0b3JfdHlwZSAhPSBEUk1fTU9ERV9DT05O RUNUT1JfZURQKQorCQkJY29udGludWU7CisKKwkJaWYgKHR5cGUgPT0gU0NSRUVOX1RZUEVfTk9O X0xQU1AgJiYKKwkJICAgIGMtPmNvbm5lY3Rvcl90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9l RFApCisJCQljb250aW51ZTsKKworCQlpZiAoYy0+Y29ubmVjdGlvbiA9PSBEUk1fTU9ERV9DT05O RUNURUQgJiYgYy0+Y291bnRfbW9kZXMpIHsKKwkJCWNvbm5lY3Rvcl9pZCA9IGMtPmNvbm5lY3Rv cl9pZDsKKwkJCW1vZGUgPSAmYy0+bW9kZXNbMF07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlm IChjb25uZWN0b3JfaWQgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJY3J0Y19pZCA9IGRhdGEt PnJlcy0+Y3J0Y3NbMF07CisJYnVmZmVyX2lkID0gY3JlYXRlX2ZiKGRhdGEsIG1vZGUtPmhkaXNw bGF5LCBtb2RlLT52ZGlzcGxheSk7CisKKwlpZ3RfYXNzZXJ0KGNydGNfaWQpOworCWlndF9hc3Nl cnQoYnVmZmVyX2lkKTsKKwlpZ3RfYXNzZXJ0KGNvbm5lY3Rvcl9pZCk7CisJaWd0X2Fzc2VydCht b2RlKTsKKworCXJjID0gZHJtTW9kZVNldENydGMoZHJtX2ZkLCBjcnRjX2lkLCBidWZmZXJfaWQs IDAsIDAsICZjb25uZWN0b3JfaWQsCisJCQkgICAgMSwgbW9kZSk7CisJaWd0X2Fzc2VydChyYyA9 PSAwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfb25lX3NjcmVl bihzdHJ1Y3QgbW9kZV9zZXRfZGF0YSAqZGF0YSkKK3sKKwlpZ3RfYXNzZXJ0KGVuYWJsZV9vbmVf c2NyZWVuX3dpdGhfdHlwZShkYXRhLCBTQ1JFRU5fVFlQRV9BTlkpKTsKK30KKworLyogV2UgY291 bGQgY2hlY2sgdGhlIGNoZWNrc3VtIHRvbywgYnV0IGp1c3QgdGhlIGhlYWRlciBpcyBwcm9iYWJs eSBlbm91Z2guICovCitzdGF0aWMgYm9vbCBlZGlkX2lzX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNo YXIgKmVkaWQpCit7CisJY2hhciBlZGlkX2hlYWRlcltdID0geworCQkweDAsIDB4RkYsIDB4RkYs IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MCwKKwl9OworCisJcmV0dXJuIChtZW1jbXAoZWRp ZCwgZWRpZF9oZWFkZXIsIHNpemVvZihlZGlkX2hlYWRlcikpID09IDApOworfQorCitzdGF0aWMg aW50IGNvdW50X2RybV92YWxpZF9lZGlkcyhzdHJ1Y3QgbW9kZV9zZXRfZGF0YSAqZGF0YSkKK3sK KwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5yZXMtPmNvdW50X2Nv bm5lY3RvcnM7IGkrKykKKwkJaWYgKGRhdGEtPmVkaWRzW2ldICYmIGVkaWRfaXNfdmFsaWQoZGF0 YS0+ZWRpZHNbaV0tPmRhdGEpKQorCQkJcmV0Kys7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IGJvb2wgaTJjX2VkaWRfaXNfdmFsaWQoaW50IGZkKQoreworCWludCByYzsKKwl1bnNpZ25lZCBj aGFyIGVkaWRbMTI4XSA9IHt9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsKKwkJeyAvKiBT dGFydCBhdCAwLiAqLworCQkJLmFkZHIgPSAweDUwLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4g PSAxLAorCQkJLmJ1ZiA9IGVkaWQsCisJCX0sIHsgLyogTm93IHJlYWQgdGhlIEVESUQuICovCisJ CQkuYWRkciA9IDB4NTAsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSAxMjgsCisJ CQkuYnVmID0gZWRpZCwKKwkJfQorCX07CisJc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEgbXNn c2V0ID0geworCQkubXNncyA9IG1zZ3MsCisJCS5ubXNncyA9IDIsCisJfTsKKworCXJjID0gaW9j dGwoZmQsIEkyQ19SRFdSLCAmbXNnc2V0KTsKKwlyZXR1cm4gKHJjID49IDApID8gZWRpZF9pc192 YWxpZChlZGlkKSA6IGZhbHNlOworfQorCitzdGF0aWMgaW50IGNvdW50X2kyY192YWxpZF9lZGlk cyh2b2lkKQoreworCWludCBmZCwgcmV0ID0gMDsKKwlESVIgKmRpcjsKKworCXN0cnVjdCBkaXJl bnQgKmRpcmVudDsKKwljaGFyIGZ1bGxfbmFtZVszMl07CisKKwlkaXIgPSBvcGVuZGlyKCIvZGV2 LyIpOworCWlndF9hc3NlcnQoZGlyKTsKKworCXdoaWxlICgoZGlyZW50ID0gcmVhZGRpcihkaXIp KSkgeworCQlpZiAoc3RybmNtcChkaXJlbnQtPmRfbmFtZSwgImkyYy0iLCA0KSA9PSAwKSB7CisJ CQlzbnByaW50ZihmdWxsX25hbWUsIDMyLCAiL2Rldi8lcyIsIGRpcmVudC0+ZF9uYW1lKTsKKwkJ CWZkID0gb3BlbihmdWxsX25hbWUsIE9fUkRXUik7CisJCQlpZ3RfYXNzZXJ0KGZkICE9IC0xKTsK KwkJCWlmIChpMmNfZWRpZF9pc192YWxpZChmZCkpCisJCQkJcmV0Kys7CisJCQljbG9zZShmZCk7 CisJCX0KKwl9CisKKwljbG9zZWRpcihkaXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IHZvaWQgdGVzdF9pMmMoc3RydWN0IG1vZGVfc2V0X2RhdGEgKmRhdGEpCit7CisJaW50IGkyY19l ZGlkcyA9IGNvdW50X2kyY192YWxpZF9lZGlkcygpOworCWludCBkcm1fZWRpZHMgPSBjb3VudF9k cm1fdmFsaWRfZWRpZHMoZGF0YSk7CisKKwlpZ3RfYXNzZXJ0KGkyY19lZGlkcyA9PSBkcm1fZWRp ZHMpOworfQorCitzdGF0aWMgdm9pZCBpMmNfc3VidGVzdF9jaGVja19lbnZpcm9ubWVudCh2b2lk KQoreworCWludCBpMmNfZGV2X2ZpbGVzID0gMDsKKwlESVIgKmRldl9kaXI7CisJc3RydWN0IGRp cmVudCAqZGlyZW50OworCisJLyogTWFrZSBzdXJlIHRoZSAvZGV2L2kyYy0qIGZpbGVzIGV4aXN0 LiAqLworCWRldl9kaXIgPSBvcGVuZGlyKCIvZGV2Iik7CisJaWd0X2Fzc2VydChkZXZfZGlyKTsK Kwl3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZGV2X2RpcikpKSB7CisJCWlmIChzdHJuY21wKGRp cmVudC0+ZF9uYW1lLCAiaTJjLSIsIDQpID09IDApCisJCQlpMmNfZGV2X2ZpbGVzKys7CisJfQor CWNsb3NlZGlyKGRldl9kaXIpOworCWlndF9yZXF1aXJlKGkyY19kZXZfZmlsZXMpOworfQorCisK KyNkZWZpbmUgQ09NUEFSRShkMSwgZDIsIGRhdGEpIGlndF9hc3NlcnQoZDEtPmRhdGEgPT0gZDIt PmRhdGEpCisjZGVmaW5lIENPTVBBUkVfQVJSQVkoZDEsIGQyLCBzaXplLCBkYXRhKSBkbyB7IFwK Kwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSBcCisJCWlndF9hc3NlcnQoZDEtPmRhdGFbaV0g PT0gZDItPmRhdGFbaV0pOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhc3NlcnRfZHJt X3Jlc291cmNlc19lcXVhbChzdHJ1Y3QgY29tcGFyZV9kYXRhICpkMSwKKwkJCQkgICAgICAgc3Ry dWN0IGNvbXBhcmVfZGF0YSAqZDIpCit7CisJQ09NUEFSRShkMSwgZDIsIHJlcy0+Y291bnRfY29u bmVjdG9ycyk7CisJQ09NUEFSRShkMSwgZDIsIHJlcy0+Y291bnRfZW5jb2RlcnMpOworCUNPTVBB UkUoZDEsIGQyLCByZXMtPmNvdW50X2NydGNzKTsKKwlDT01QQVJFKGQxLCBkMiwgcmVzLT5taW5f d2lkdGgpOworCUNPTVBBUkUoZDEsIGQyLCByZXMtPm1heF93aWR0aCk7CisJQ09NUEFSRShkMSwg ZDIsIHJlcy0+bWluX2hlaWdodCk7CisJQ09NUEFSRShkMSwgZDIsIHJlcy0+bWF4X2hlaWdodCk7 Cit9CisKK3N0YXRpYyB2b2lkIGFzc2VydF9tb2Rlc19lcXVhbChkcm1Nb2RlTW9kZUluZm9QdHIg bTEsIGRybU1vZGVNb2RlSW5mb1B0ciBtMikKK3sKKwlDT01QQVJFKG0xLCBtMiwgY2xvY2spOwor CUNPTVBBUkUobTEsIG0yLCBoZGlzcGxheSk7CisJQ09NUEFSRShtMSwgbTIsIGhzeW5jX3N0YXJ0 KTsKKwlDT01QQVJFKG0xLCBtMiwgaHN5bmNfZW5kKTsKKwlDT01QQVJFKG0xLCBtMiwgaHRvdGFs KTsKKwlDT01QQVJFKG0xLCBtMiwgaHNrZXcpOworCUNPTVBBUkUobTEsIG0yLCB2ZGlzcGxheSk7 CisJQ09NUEFSRShtMSwgbTIsIHZzeW5jX3N0YXJ0KTsKKwlDT01QQVJFKG0xLCBtMiwgdnN5bmNf ZW5kKTsKKwlDT01QQVJFKG0xLCBtMiwgdnRvdGFsKTsKKwlDT01QQVJFKG0xLCBtMiwgdnNjYW4p OworCUNPTVBBUkUobTEsIG0yLCB2cmVmcmVzaCk7CisJQ09NUEFSRShtMSwgbTIsIGZsYWdzKTsK KwlDT01QQVJFKG0xLCBtMiwgdHlwZSk7CisJaWd0X2Fzc2VydChzdHJjbXAobTEtPm5hbWUsIG0y LT5uYW1lKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgYXNzZXJ0X2RybV9jb25uZWN0b3JzX2Vx dWFsKGRybU1vZGVDb25uZWN0b3JQdHIgYzEsCisJCQkJCWRybU1vZGVDb25uZWN0b3JQdHIgYzIp Cit7CisJaW50IGk7CisKKwlDT01QQVJFKGMxLCBjMiwgY29ubmVjdG9yX2lkKTsKKwlDT01QQVJF KGMxLCBjMiwgY29ubmVjdG9yX3R5cGUpOworCUNPTVBBUkUoYzEsIGMyLCBjb25uZWN0b3JfdHlw ZV9pZCk7CisJQ09NUEFSRShjMSwgYzIsIG1tV2lkdGgpOworCUNPTVBBUkUoYzEsIGMyLCBtbUhl aWdodCk7CisJQ09NUEFSRShjMSwgYzIsIGNvdW50X21vZGVzKTsKKwlDT01QQVJFKGMxLCBjMiwg Y291bnRfcHJvcHMpOworCUNPTVBBUkUoYzEsIGMyLCBjb3VudF9lbmNvZGVycyk7CisJQ09NUEFS RV9BUlJBWShjMSwgYzIsIGMxLT5jb3VudF9wcm9wcywgcHJvcHMpOworCUNPTVBBUkVfQVJSQVko YzEsIGMyLCBjMS0+Y291bnRfZW5jb2RlcnMsIGVuY29kZXJzKTsKKworCWZvciAoaSA9IDA7IGkg PCBjMS0+Y291bnRfbW9kZXM7IGkrKykKKwkJYXNzZXJ0X21vZGVzX2VxdWFsKCZjMS0+bW9kZXNb MF0sICZjMi0+bW9kZXNbMF0pOworfQorCitzdGF0aWMgdm9pZCBhc3NlcnRfZHJtX2VuY29kZXJz X2VxdWFsKGRybU1vZGVFbmNvZGVyUHRyIGUxLAorCQkJCSAgICAgIGRybU1vZGVFbmNvZGVyUHRy IGUyKQoreworCUNPTVBBUkUoZTEsIGUyLCBlbmNvZGVyX2lkKTsKKwlDT01QQVJFKGUxLCBlMiwg ZW5jb2Rlcl90eXBlKTsKKwlDT01QQVJFKGUxLCBlMiwgcG9zc2libGVfY3J0Y3MpOworCUNPTVBB UkUoZTEsIGUyLCBwb3NzaWJsZV9jbG9uZXMpOworfQorCitzdGF0aWMgdm9pZCBhc3NlcnRfZHJt X2NydGNzX2VxdWFsKGRybU1vZGVDcnRjUHRyIGMxLCBkcm1Nb2RlQ3J0Y1B0ciBjMikKK3sKKwlD T01QQVJFKGMxLCBjMiwgY3J0Y19pZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzc2VydF9kcm1fZWRp ZHNfZXF1YWwoZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBlMSwKKwkJCQkgICBkcm1Nb2RlUHJvcGVy dHlCbG9iUHRyIGUyKQoreworCWlmICghZTEgJiYgIWUyKQorCQlyZXR1cm47CisJaWd0X2Fzc2Vy dChlMSAmJiBlMik7CisKKwlDT01QQVJFKGUxLCBlMiwgaWQpOworCUNPTVBBUkUoZTEsIGUyLCBs ZW5ndGgpOworCisJaWd0X2Fzc2VydChtZW1jbXAoZTEtPmRhdGEsIGUyLT5kYXRhLCBlMS0+bGVu Z3RoKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgYXNzZXJ0X2RybV9pbmZvc19lcXVhbChzdHJ1 Y3QgY29tcGFyZV9kYXRhICpkMSwKKwkJCQkgICBzdHJ1Y3QgY29tcGFyZV9kYXRhICpkMikKK3sK KwlpbnQgaTsKKworCWFzc2VydF9kcm1fcmVzb3VyY2VzX2VxdWFsKGQxLCBkMik7CisKKwlmb3Ig KGkgPSAwOyBpIDwgZDEtPnJlcy0+Y291bnRfY29ubmVjdG9yczsgaSsrKSB7CisJCWFzc2VydF9k cm1fY29ubmVjdG9yc19lcXVhbChkMS0+Y29ubmVjdG9yc1tpXSwKKwkJCQkJICAgIGQyLT5jb25u ZWN0b3JzW2ldKTsKKwkJYXNzZXJ0X2RybV9lZGlkc19lcXVhbChkMS0+ZWRpZHNbaV0sIGQyLT5l ZGlkc1tpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGQxLT5yZXMtPmNvdW50X2VuY29kZXJz OyBpKyspCisJCWFzc2VydF9kcm1fZW5jb2RlcnNfZXF1YWwoZDEtPmVuY29kZXJzW2ldLCBkMi0+ ZW5jb2RlcnNbaV0pOworCisJZm9yIChpID0gMDsgaSA8IGQxLT5yZXMtPmNvdW50X2NydGNzOyBp KyspCisJCWFzc2VydF9kcm1fY3J0Y3NfZXF1YWwoZDEtPmNydGNzW2ldLCBkMi0+Y3J0Y3NbaV0p OworfQorCitzdGF0aWMgZHJtTW9kZVByb3BlcnR5QmxvYlB0ciBnZXRfY29ubmVjdG9yX2VkaWQo ZHJtTW9kZUNvbm5lY3RvclB0ciBjb25uZWN0b3IsCisJCQkJCQkgaW50IGluZGV4KQoreworCXVu c2lnbmVkIGludCBpOworCWRybU1vZGVPYmplY3RQcm9wZXJ0aWVzUHRyIHByb3BzOworCWRybU1v ZGVQcm9wZXJ0eUJsb2JQdHIgcmV0ID0gTlVMTDsKKworCXByb3BzID0gZHJtTW9kZU9iamVjdEdl dFByb3BlcnRpZXMoZHJtX2ZkLCBjb25uZWN0b3ItPmNvbm5lY3Rvcl9pZCwKKwkJCQkJICAgRFJN X01PREVfT0JKRUNUX0NPTk5FQ1RPUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMtPmNvdW50 X3Byb3BzOyBpKyspIHsKKwkJZHJtTW9kZVByb3BlcnR5UHRyIHByb3AgPSBkcm1Nb2RlR2V0UHJv cGVydHkoZHJtX2ZkLAorCQkJCQkJCSAgICAgcHJvcHMtPnByb3BzW2ldKTsKKworCQlpZiAoc3Ry Y21wKHByb3AtPm5hbWUsICJFRElEIikgPT0gMCkgeworCQkJaWd0X2Fzc2VydChwcm9wLT5mbGFn cyAmIERSTV9NT0RFX1BST1BfQkxPQik7CisJCQlpZ3RfYXNzZXJ0KHByb3AtPmNvdW50X2Jsb2Jz ID09IDApOworCQkJcmV0ID0gZHJtTW9kZUdldFByb3BlcnR5QmxvYihkcm1fZmQsCisJCQkJCQkg ICAgIHByb3BzLT5wcm9wX3ZhbHVlc1tpXSk7CisJCX0KKworCQlkcm1Nb2RlRnJlZVByb3BlcnR5 KHByb3ApOworCX0KKworCWRybU1vZGVGcmVlT2JqZWN0UHJvcGVydGllcyhwcm9wcyk7CisJcmV0 dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZCBnZXRfZHJtX2luZm8oc3RydWN0IGNvbXBhcmVf ZGF0YSAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWRhdGEtPnJlcyA9IGRybU1vZGVHZXRSZXNvdXJj ZXMoZHJtX2ZkKTsKKwlpZ3RfYXNzZXJ0KGRhdGEtPnJlcyk7CisKKwlpZ3RfYXNzZXJ0KGRhdGEt PnJlcy0+Y291bnRfY29ubmVjdG9ycyA8PSBNQVhfQ09OTkVDVE9SUyk7CisJaWd0X2Fzc2VydChk YXRhLT5yZXMtPmNvdW50X2VuY29kZXJzIDw9IE1BWF9FTkNPREVSUyk7CisJaWd0X2Fzc2VydChk YXRhLT5yZXMtPmNvdW50X2NydGNzIDw9IE1BWF9DUlRDUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwg ZGF0YS0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZGF0YS0+Y29ubmVjdG9yc1tp XSA9IGRybU1vZGVHZXRDb25uZWN0b3IoZHJtX2ZkLAorCQkJCQkJZGF0YS0+cmVzLT5jb25uZWN0 b3JzW2ldKTsKKwkJZGF0YS0+ZWRpZHNbaV0gPSBnZXRfY29ubmVjdG9yX2VkaWQoZGF0YS0+Y29u bmVjdG9yc1tpXSwgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5yZXMtPmNvdW50X2Vu Y29kZXJzOyBpKyspCisJCWRhdGEtPmVuY29kZXJzW2ldID0gZHJtTW9kZUdldEVuY29kZXIoZHJt X2ZkLAorCQkJCQkJZGF0YS0+cmVzLT5lbmNvZGVyc1tpXSk7CisJZm9yIChpID0gMDsgaSA8IGRh dGEtPnJlcy0+Y291bnRfY3J0Y3M7IGkrKykKKwkJZGF0YS0+Y3J0Y3NbaV0gPSBkcm1Nb2RlR2V0 Q3J0Yyhkcm1fZmQsIGRhdGEtPnJlcy0+Y3J0Y3NbaV0pOworfQorCitzdGF0aWMgdm9pZCBmcmVl X2RybV9pbmZvKHN0cnVjdCBjb21wYXJlX2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgZGF0YS0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZHJtTW9k ZUZyZWVDb25uZWN0b3IoZGF0YS0+Y29ubmVjdG9yc1tpXSk7CisJCWRybU1vZGVGcmVlUHJvcGVy dHlCbG9iKGRhdGEtPmVkaWRzW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPnJlcy0+ Y291bnRfZW5jb2RlcnM7IGkrKykKKwkJZHJtTW9kZUZyZWVFbmNvZGVyKGRhdGEtPmVuY29kZXJz W2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cmVzLT5jb3VudF9jcnRjczsgaSsrKQorCQlk cm1Nb2RlRnJlZUNydGMoZGF0YS0+Y3J0Y3NbaV0pOworCisJZHJtTW9kZUZyZWVSZXNvdXJjZXMo ZGF0YS0+cmVzKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9tb2RlX3NldF9kYXRhKHN0cnVjdCBt b2RlX3NldF9kYXRhICpkYXRhKQoreworCWludCBpOworCisJZGF0YS0+cmVzID0gZHJtTW9kZUdl dFJlc291cmNlcyhkcm1fZmQpOworCWlndF9hc3NlcnQoZGF0YS0+cmVzKTsKKwlpZ3RfYXNzZXJ0 KGRhdGEtPnJlcy0+Y291bnRfY29ubmVjdG9ycyA8PSBNQVhfQ09OTkVDVE9SUyk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgZGF0YS0+cmVzLT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZGF0YS0+ Y29ubmVjdG9yc1tpXSA9IGRybU1vZGVHZXRDb25uZWN0b3IoZHJtX2ZkLAorCQkJCQkJZGF0YS0+ cmVzLT5jb25uZWN0b3JzW2ldKTsKKwkJZGF0YS0+ZWRpZHNbaV0gPSBnZXRfY29ubmVjdG9yX2Vk aWQoZGF0YS0+Y29ubmVjdG9yc1tpXSwgaSk7CisJfQorCisJZGF0YS0+ZGV2aWQgPSBpbnRlbF9n ZXRfZHJtX2RldmlkKGRybV9mZCk7CisKKwlkb19vcl9kaWUoaWd0X3NldF92dF9ncmFwaGljc19t b2RlKCkpOworfQorCitzdGF0aWMgdm9pZCBmaW5pX21vZGVfc2V0X2RhdGEoc3RydWN0IG1vZGVf c2V0X2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+cmVz LT5jb3VudF9jb25uZWN0b3JzOyBpKyspIHsKKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoZGF0YS0+ Y29ubmVjdG9yc1tpXSk7CisJCWRybU1vZGVGcmVlUHJvcGVydHlCbG9iKGRhdGEtPmVkaWRzW2ld KTsKKwl9CisJZHJtTW9kZUZyZWVSZXNvdXJjZXMoZGF0YS0+cmVzKTsKK30KKworc3RhdGljIHZv aWQgcGM4X3N1YnRlc3RfY2hlY2tfZW52aXJvbm1lbnQodm9pZCkKK3sKKwlpZ3RfcmVxdWlyZV9m KElTX0hBU1dFTEwobXNfZGF0YS5kZXZpZCksCisJCSAgICAgICJQQzgrIGZlYXR1cmUgb25seSBz dXBwb3J0ZWQgb24gSGFzd2VsbC5cbiIpOworCisJLyogSWYgdGhpcyBmYWlscywgeW91IGRvbid0 IGhhdmUgdGhlIEtlcm5lbCBtb2R1bGUgbG9hZGVkLiAqLworCW1zcl9mZCA9IG9wZW4oIi9kZXYv Y3B1LzAvbXNyIiwgT19SRE9OTFkpOworCWlndF9hc3NlcnRfZihtc3JfZmQgPj0gMCwgIkNhbid0 IG9wZW4gL2Rldi9jcHUvMC9tc3IuXG4iKTsKKworCS8qIE5vbi1VTFQgbWFjaGluZXMgZG9uJ3Qg c3VwcG9ydCBQQzgrLiAqLworCWlndF9yZXF1aXJlX2Yoc3VwcG9ydHNfcGM4X3BsdXNfcmVzaWRl bmNpZXMoKSwKKwkJICAgICAgIk1hY2hpbmUgZG9lc24ndCBzdXBwb3J0IFBDOCsgcmVzaWRlbmNp ZXMuXG4iKTsKK30KKworc3RhdGljIHZvaWQgYXNzZXJ0X3J1bnRpbWVfcG1faXNfZW5hYmxlZCh2 b2lkKQoreworCWludCBmZDsKKwlzc2l6ZV90IG5fcmVhZDsKKwljaGFyIGJ1Zls2XTsKKwlpbnQg cmM7CisKKwlmZCA9IG9wZW4oUE9XRVJfRElSICIvY29udHJvbCIsIE9fUkRPTkxZKTsKKwlpZ3Rf YXNzZXJ0X2YoZmQgPj0gMCwgIkNhbid0IG9wZW4gIiBQT1dFUl9ESVIgIi9jb250cm9sXG4iKTsK KworCW5fcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgQVJSQVlfU0laRShidWYpKTsKKwlpZ3RfYXNzZXJ0 KG5fcmVhZCA+PSAwKTsKKwlpZ3RfcmVxdWlyZV9mKHN0cm5jbXAoYnVmLCAiYXV0b1xuIiwgbl9y ZWFkKSA9PSAwLAorCQkgICAgICAiUnVudGltZSBQTSBub3QgZW5hYmxlZCBvciBzdXBwb3J0ZWQg b24gdGhpcyBwbGF0Zm9ybVxuIik7CisKKwlyYyA9IGNsb3NlKGZkKTsKKwlpZ3RfYXNzZXJ0KHJj ID09IDApOworfQorCisvKiBXZSBzZXQgMW1zIGF1dG9zdXNwZW5kIGRlbGF5IGhlcmUgc28gdGhp bmdzIHN0YXJ0L3N0b3AgZmFzdCBhbmQgd2UgZG9uJ3QKKyAqIHdhc3RlIHRpbWUgd2FpdGluZyBm b3IgcnVudGltZSBQTSB0byBraWNrIGluLiBXZSBkb24ndCBjYXJlIGFib3V0IHJlc3RvcmluZwor ICogdGhlIG9yaWdpbmFsIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QuICovCitzdGF0aWMg dm9pZCBzZXRfYXV0b3N1c3BlbmRfZGVsYXkodm9pZCkKK3sKKwlpbnQgZmQ7CisJc3NpemVfdCBu X3dyaXRlOworCWludCByYzsKKworCWZkID0gb3BlbihQT1dFUl9ESVIgIi9hdXRvc3VzcGVuZF9k ZWxheV9tcyIsIE9fV1JPTkxZKTsKKwlpZ3RfYXNzZXJ0X2YoZmQgPj0gMCwKKwkJICAgICAiQ2Fu J3Qgb3BlbiAiIFBPV0VSX0RJUiAiL2F1dG9zdXNwZW5kX2RlbGF5X21zXG4iKTsKKworCW5fd3Jp dGUgPSB3cml0ZShmZCwgIjFcbiIsIDIpOworCWlndF9hc3NlcnQobl93cml0ZSA9PSAyKTsKKwor CXJjID0gY2xvc2UoZmQpOworCWlndF9hc3NlcnQocmMgPT0gMCk7CisKK30KKworc3RhdGljIHZv aWQgc2V0dXBfZW52aXJvbm1lbnQodm9pZCkKK3sKKworCWRybV9mZCA9IGRybV9vcGVuX2FueSgp OworCWlndF9hc3NlcnQoZHJtX2ZkID49IDApOworCisJaW5pdF9tb2RlX3NldF9kYXRhKCZtc19k YXRhKTsKKworCWFzc2VydF9ydW50aW1lX3BtX2lzX2VuYWJsZWQoKSwKKworCXN0YXR1c19mZCA9 IG9wZW4oUE9XRVJfRElSICIvcnVudGltZV9zdGF0dXMiLCBPX1JET05MWSk7CisJaWd0X2Fzc2Vy dF9mKHN0YXR1c19mZCA+PSAwLAorCQkgICAgICJDYW4ndCBvcGVuICIgUE9XRVJfRElSICIvcnVu dGltZV9zdGF0dXNcbiIpOworCisJc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCk7Cit9CisKK3N0YXRp YyB2b2lkIHRlYXJkb3duX2Vudmlyb25tZW50KHZvaWQpCit7CisJaW50IHJjOworCisJZmluaV9t b2RlX3NldF9kYXRhKCZtc19kYXRhKTsKKworCWRybUNsb3NlKGRybV9mZCk7CisKKwlyYyA9IGNs b3NlKHN0YXR1c19mZCk7CisJaWd0X2Fzc2VydChyYyA9PSAwKTsKKworCWlmIChtc3JfZmQpIHsK KwkJcmMgPSBjbG9zZShtc3JfZmQpOworCQlpZ3RfYXNzZXJ0KHJjID09IDApOworCX0KK30KKwor LyogU2FuaXR5IHRlc3Q6IG1ha2Ugc3VyZSBpdCBzdXNwZW5kcyB3aGVuIGFsbCBzY3JlZW5zIGFy ZSBkaXNhYmxlZCBhbmQgaXQKKyAqIHJlc3VtZXMgd2hlbiB3ZSBlbmFibGUgYSBzY3JlZW4uICov CitzdGF0aWMgdm9pZCBiYXNpY19zdWJ0ZXN0KHZvaWQpCit7CisJZGlzYWJsZV9hbGxfc2NyZWVu cygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydF9mKHdhaXRfZm9yX3N1c3BlbmRlZCgpLAorCQkgICAg ICJHcmFwaGljcyBkZXZpY2UgaXMgbm90IHN1c3BlbmRpbmcsIHBsZWFzZSBjaGVjayBpdHMgIgor CQkgICAgICJydW50aW1lIFBNIGNvbmZpZ3VyYXRpb24uXG4iKTsKKworCWVuYWJsZV9vbmVfc2Ny ZWVuKCZtc19kYXRhKTsKKwlpZ3RfYXNzZXJ0X2Yod2FpdF9mb3JfYWN0aXZlKCksCisJCSAgICAg IkdyYXBoaWNzIGRldmljZSBpcyBzdGlsbCBzdXNwZW5kZWQgZXZlbiB3aXRoIGEgc2NyZWVuICIK KwkJICAgICAiZW5hYmxlZC4gU29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZy5cbiIpOworfQorCisv KiBUZXN0IGlmIHRoZSBEUk0gcmVzb3VyY2VzIHJlcG9ydGVkIGJ5IHRoZSBJT0NUTHMgYXJlIHN0 aWxsIHRoZSBzYW1lLiBUaGlzCisgKiBlbnN1cmVzIHdlIHN0aWxsIHNlZSB0aGUgbW9uaXRvcnMg d2l0aCB0aGUgc2FtZSBleWVzLiBXZSBnZXQgdGhlIEVESURzIGFuZAorICogY29tcGFyZSB0aGVt LCB3aGljaCBlbnN1cmVzIHdlIHVzZSBEUCBBVVggb3IgR01CVVMgZGVwZW5kaW5nIG9uIHdoYXQn cworICogY29ubmVjdGVkLiAqLworc3RhdGljIHZvaWQgZHJtX3Jlc291cmNlc19zdWJ0ZXN0KHZv aWQpCit7CisJc3RydWN0IGNvbXBhcmVfZGF0YSBwcmVfc3VzcGVuZCwgZHVyaW5nX3N1c3BlbmQs IHBvc3Rfc3VzcGVuZDsKKworCWVuYWJsZV9vbmVfc2NyZWVuKCZtc19kYXRhKTsKKwlpZ3RfYXNz ZXJ0KHdhaXRfZm9yX2FjdGl2ZSgpKTsKKwlnZXRfZHJtX2luZm8oJnByZV9zdXNwZW5kKTsKKwlp Z3RfYXNzZXJ0KHdhaXRfZm9yX2FjdGl2ZSgpKTsKKworCWRpc2FibGVfYWxsX3NjcmVlbnMoJm1z X2RhdGEpOworCWlndF9hc3NlcnQod2FpdF9mb3Jfc3VzcGVuZGVkKCkpOworCWdldF9kcm1faW5m bygmZHVyaW5nX3N1c3BlbmQpOworCWlndF9hc3NlcnQod2FpdF9mb3Jfc3VzcGVuZGVkKCkpOwor CisJZW5hYmxlX29uZV9zY3JlZW4oJm1zX2RhdGEpOworCWlndF9hc3NlcnQod2FpdF9mb3JfYWN0 aXZlKCkpOworCWdldF9kcm1faW5mbygmcG9zdF9zdXNwZW5kKTsKKwlpZ3RfYXNzZXJ0KHdhaXRf Zm9yX2FjdGl2ZSgpKTsKKworCWFzc2VydF9kcm1faW5mb3NfZXF1YWwoJnByZV9zdXNwZW5kLCAm ZHVyaW5nX3N1c3BlbmQpOworCWFzc2VydF9kcm1faW5mb3NfZXF1YWwoJnByZV9zdXNwZW5kLCAm cG9zdF9zdXNwZW5kKTsKKworCWZyZWVfZHJtX2luZm8oJnByZV9zdXNwZW5kKTsKKwlmcmVlX2Ry bV9pbmZvKCZkdXJpbmdfc3VzcGVuZCk7CisJZnJlZV9kcm1faW5mbygmcG9zdF9zdXNwZW5kKTsK K30KKworLyogVHJ5IHRvIHVzZSByYXcgSTJDLCB3aGljaCBhbHNvIG5lZWRzIGludGVycnVwdHMu ICovCitzdGF0aWMgdm9pZCBpMmNfc3VidGVzdCh2b2lkKQoreworCWkyY19zdWJ0ZXN0X2NoZWNr X2Vudmlyb25tZW50KCk7CisKKwllbmFibGVfb25lX3NjcmVlbigmbXNfZGF0YSk7CisJaWd0X2Fz c2VydCh3YWl0X2Zvcl9hY3RpdmUoKSk7CisKKwlkaXNhYmxlX2FsbF9zY3JlZW5zKCZtc19kYXRh KTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX3N1c3BlbmRlZCgpKTsKKwl0ZXN0X2kyYygmbXNfZGF0 YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwllbmFibGVfb25lX3Nj cmVlbigmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9hY3RpdmUoKSk7Cit9CisKKy8q IFRoZSBMUFNQIHZlcnNpb24gdGVzdHMgZURQLCB3aGljaCBkb2Vzbid0IHJlcXVpcmUgdGhlIHBv d2VyIHdlbGwuIFRoZQorICogbm9uLUxQU1AgdmVyc2lvbiB3aWxsIG1ha2Ugc3VyZSB3ZSB0b2dn bGUgdGhlIHBvd2VyIHdlbGwgb24vb2ZmIGV2ZXJ5IHRpbWUuCisgKiBXZSBTS0lQIGluIGNhc2Ug d2UgY2FuJ3QgZmluZCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBvZiBvdXRwdXQgY29ubmVjdGVkLCBi dXQKKyAqIHRoYXQgZG9lc24ndCB0ZXN0IGFzIG11Y2ggYXMgd2UgY291bGQuICovCitzdGF0aWMg dm9pZCBtb2Rlc2V0X3N0cmVzcyhib29sIGxwc3ApCit7CisJaW50IGksIG1heDsKKwllbnVtIHNj cmVlbl90eXBlIHR5cGU7CisKKwltYXggPSBxdWljayA/IDUgOiA1MDsKKwl0eXBlID0gbHBzcCA/ IFNDUkVFTl9UWVBFX0xQU1AgOiBTQ1JFRU5fVFlQRV9OT05fTFBTUDsKKworCWZvciAoaSA9IDA7 IGkgPCBtYXg7IGkrKykgeworCQlkaXNhYmxlX2FsbF9zY3JlZW5zKCZtc19kYXRhKTsKKwkJaWd0 X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwkJLyogSWYgd2Ugc2tpcCB0aGlzIGxp bmUgaXQncyBiZWNhdXNlIHRoZSB0eXBlIG9mIHNjcmVlbiB3ZSB3YW50CisJCSAqIGlzIG5vdCBj b25uZWN0ZWQuICovCisJCWlndF9yZXF1aXJlKGVuYWJsZV9vbmVfc2NyZWVuX3dpdGhfdHlwZSgm bXNfZGF0YSwgdHlwZSkpOworCQlpZ3RfYXNzZXJ0KHdhaXRfZm9yX2FjdGl2ZSgpKTsKKwl9Cit9 CisKKy8qIE1ha2Ugc3VyZSB3ZSBnZXQgdG8gUEM4IG9yIGRlZXBlciBzdGF0ZXMgd2hlbiB3ZSdy ZSBzdXNwZW5kZWQuIE5vdGljZSB0aGF0CisgKiB0aGlzIGFjdHVhbGx5IGRlcGVuZHMgb24gYSBw cm9wZXJseSBjb25maWd1cmVkIG1hY2hpbmUsIHdoZXJlIHRoZSBydW50aW1lIFBNCisgKiBwb2xp Y2VzIGZvciBfYWxsXyBkZXZpY2VzIChub3Qgb25seSBncmFwaGljcykgYXJlIGNvbmZpZ3VyZWQg Y29ycmVjdGx5LiBJZgorICogeW91IHVzZSAicG93ZXJ0b3AiIGFuZCBzd2l0Y2ggZXZlcnl0aGlu ZyB0byAiZ29vZCIsIHRoZXJlJ3MgYSBnb29kIGNoYW5jZQorICogeW91J2xsIGJlIGZpbmUgaGVy ZS4gKi8KK3N0YXRpYyB2b2lkIHBjOF9zdWJ0ZXN0KHZvaWQpCit7CisJcGM4X3N1YnRlc3RfY2hl Y2tfZW52aXJvbm1lbnQoKTsKKworCWRpc2FibGVfYWxsX3NjcmVlbnMoJm1zX2RhdGEpOworCWln dF9hc3NlcnQod2FpdF9mb3Jfc3VzcGVuZGVkKCkpOworCWlndF9hc3NlcnQocGM4X3BsdXNfZW5h YmxlZCgpKTsKKworCWVuYWJsZV9vbmVfc2NyZWVuKCZtc19kYXRhKTsKKwlpZ3RfYXNzZXJ0KHdh aXRfZm9yX2FjdGl2ZSgpKTsKKwlpZ3RfYXNzZXJ0KHBjOF9wbHVzX2Rpc2FibGVkKCkpOworfQor CitzdGF0aWMgdm9pZCAqbW1hcF9nZW1fYnVmKHVpbnQzMl90IGhhbmRsZSwgaW50IHNpemUpCit7 CisJc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwIGdlbV9tbWFwOworCisJZ2VtX21tYXAuaGFuZGxl ID0gaGFuZGxlOworCWdlbV9tbWFwLm9mZnNldCA9IDA7CisJZ2VtX21tYXAuc2l6ZSA9IHNpemU7 CisJZG9faW9jdGwoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9HRU1fTU1BUCwgJmdlbV9tbWFwKTsK KwlpZ3RfYXNzZXJ0KGdlbV9tbWFwLmFkZHJfcHRyKTsKKworCXJldHVybiAodm9pZCAqKSBnZW1f bW1hcC5hZGRyX3B0cjsKK30KKworLyogTWFrZSBzdXJlIGV2ZW4gbW1hcCBzdGlsbCB3b3JrcyB3 aGVuIHdlJ3JlIGluIEQzLiAqLworc3RhdGljIHZvaWQgZ2VtX21tYXBfc3VidGVzdCh2b2lkKQor eworCWludCBpOworCXVpbnQzMl90IGhhbmRsZTsKKwlpbnQgYnVmX3NpemUgPSA4MTkyOworCXVp bnQ4X3QgKmdlbV9idWY7CisKKwkvKiBDcmVhdGUsIG1hcCBhbmQgc2V0IGRhdGEgd2hpbGUgdGhl IGRldmljZSBpcyBhY3RpdmUuICovCisJZW5hYmxlX29uZV9zY3JlZW4oJm1zX2RhdGEpOworCWln dF9hc3NlcnQod2FpdF9mb3JfYWN0aXZlKCkpOworCisJaGFuZGxlID0gZ2VtX2NyZWF0ZShkcm1f ZmQsIGJ1Zl9zaXplKTsKKworCWdlbV9idWYgPSBtbWFwX2dlbV9idWYoaGFuZGxlLCBidWZfc2l6 ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykKKwkJZ2VtX2J1ZltpXSA9IGkg JiAweEZGOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspCisJCWlndF9hc3NlcnQo Z2VtX2J1ZltpXSA9PSAoaSAmIDB4RkYpKTsKKworCS8qIE5vdyBzdXNwZW5kLCByZWFkIGFuZCBt b2RpZnkuICovCisJZGlzYWJsZV9hbGxfc2NyZWVucygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3 YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykK KwkJaWd0X2Fzc2VydChnZW1fYnVmW2ldID09IChpICYgMHhGRikpOworCWlndF9hc3NlcnQod2Fp dF9mb3Jfc3VzcGVuZGVkKCkpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspCisJ CWdlbV9idWZbaV0gPSAofmkgJiAweEZGKTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX3N1c3BlbmRl ZCgpKTsKKworCS8qIE5vdyByZXN1bWUgYW5kIHNlZSBpZiBpdCdzIHN0aWxsIHRoZXJlLiAqLwor CWVuYWJsZV9vbmVfc2NyZWVuKCZtc19kYXRhKTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX2FjdGl2 ZSgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykKKwkJaWd0X2Fzc2VydChnZW1f YnVmW2ldID09ICh+aSAmIDB4RkYpKTsKKworCW11bm1hcChnZW1fYnVmLCBidWZfc2l6ZSk7CisK KwlnZW1fY2xvc2UoZHJtX2ZkLCBoYW5kbGUpOworfQorCisvKiBNYWtlIHN1cmUgcHJlYWQoKSBh bmQgcHdyaXRlKCkgc3RpbGwgd29yayB3aGVuIHdlJ3JlIGluIEQzLiAqLworc3RhdGljIHZvaWQg Z2VtX3ByZWFkX3N1YnRlc3Qodm9pZCkKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCBoYW5kbGU7CisJ aW50IGJ1Zl9zaXplID0gODE5MjsKKwl1aW50OF90ICpjcHVfYnVmLCAqcmVhZF9idWY7CisKKwlj cHVfYnVmID0gbWFsbG9jKGJ1Zl9zaXplKTsKKwlyZWFkX2J1ZiA9IG1hbGxvYyhidWZfc2l6ZSk7 CisJaWd0X2Fzc2VydChjcHVfYnVmKTsKKwlpZ3RfYXNzZXJ0KHJlYWRfYnVmKTsKKwltZW1zZXQo Y3B1X2J1ZiwgMCwgYnVmX3NpemUpOworCW1lbXNldChyZWFkX2J1ZiwgMCwgYnVmX3NpemUpOwor CisJLyogQ3JlYXRlIGFuZCBzZXQgZGF0YSB3aGlsZSB0aGUgZGV2aWNlIGlzIGFjdGl2ZS4gKi8K KwllbmFibGVfb25lX3NjcmVlbigmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9hY3Rp dmUoKSk7CisKKwloYW5kbGUgPSBnZW1fY3JlYXRlKGRybV9mZCwgYnVmX3NpemUpOworCisJZm9y IChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspCisJCWNwdV9idWZbaV0gPSBpICYgMHhGRjsKKwor CWdlbV93cml0ZShkcm1fZmQsIGhhbmRsZSwgMCwgY3B1X2J1ZiwgYnVmX3NpemUpOworCisJZ2Vt X3JlYWQoZHJtX2ZkLCBoYW5kbGUsIDAsIHJlYWRfYnVmLCBidWZfc2l6ZSk7CisKKwlmb3IgKGkg PSAwOyBpIDwgYnVmX3NpemU7IGkrKykKKwkJaWd0X2Fzc2VydChjcHVfYnVmW2ldID09IHJlYWRf YnVmW2ldKTsKKworCS8qIE5vdyBzdXNwZW5kLCByZWFkIGFuZCBtb2RpZnkuICovCisJZGlzYWJs ZV9hbGxfc2NyZWVucygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQo KSk7CisKKwltZW1zZXQocmVhZF9idWYsIDAsIGJ1Zl9zaXplKTsKKwlnZW1fcmVhZChkcm1fZmQs IGhhbmRsZSwgMCwgcmVhZF9idWYsIGJ1Zl9zaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZf c2l6ZTsgaSsrKQorCQlpZ3RfYXNzZXJ0KGNwdV9idWZbaV0gPT0gcmVhZF9idWZbaV0pOworCWln dF9hc3NlcnQod2FpdF9mb3Jfc3VzcGVuZGVkKCkpOworCisJZm9yIChpID0gMDsgaSA8IGJ1Zl9z aXplOyBpKyspCisJCWNwdV9idWZbaV0gPSAofmkgJiAweEZGKTsKKwlnZW1fd3JpdGUoZHJtX2Zk LCBoYW5kbGUsIDAsIGNwdV9idWYsIGJ1Zl9zaXplKTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX3N1 c3BlbmRlZCgpKTsKKworCS8qIE5vdyByZXN1bWUgYW5kIHNlZSBpZiBpdCdzIHN0aWxsIHRoZXJl LiAqLworCWVuYWJsZV9vbmVfc2NyZWVuKCZtc19kYXRhKTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9y X2FjdGl2ZSgpKTsKKworCW1lbXNldChyZWFkX2J1ZiwgMCwgYnVmX3NpemUpOworCWdlbV9yZWFk KGRybV9mZCwgaGFuZGxlLCAwLCByZWFkX2J1ZiwgYnVmX3NpemUpOworCisJZm9yIChpID0gMDsg aSA8IGJ1Zl9zaXplOyBpKyspCisJCWlndF9hc3NlcnQoY3B1X2J1ZltpXSA9PSByZWFkX2J1Zltp XSk7CisKKwlnZW1fY2xvc2UoZHJtX2ZkLCBoYW5kbGUpOworCisJZnJlZShjcHVfYnVmKTsKKwlm cmVlKHJlYWRfYnVmKTsKK30KKworLyogUGFpbnRzIGEgc3F1YXJlIG9mIGNvbG9yICRjb2xvciwg c2l6ZSAkd2lkdGggeCAkaGVpZ2h0LCBhdCBwb3NpdGlvbiAkeCB4ICR5CisgKiBvZiAkZHN0X2hh bmRsZSwgd2hpY2ggY29udGFpbnMgcGl0Y2ggJHBpdGNoLiAqLworc3RhdGljIHZvaWQgc3VibWl0 X2JsdF9jbWQodWludDMyX3QgZHN0X2hhbmRsZSwgdWludDMyX3QgeCwgdWludDMyX3QgeSwKKwkJ CSAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHBpdGNoLAorCQkJ ICAgdWludDMyX3QgY29sb3IsIHVpbnQzMl90ICpwcmVzdW1lZF9kc3Rfb2Zmc2V0KQoreworCWlu dCBpLCByZWxvY19wb3M7CisJaW50IGJwcCA9IDQ7CisJdWludDMyX3QgYmF0Y2hfaGFuZGxlOwor CWludCBiYXRjaF9zaXplID0gOCAqIHNpemVvZih1aW50MzJfdCk7CisJdWludDMyX3QgYmF0Y2hf YnVmW2JhdGNoX3NpemVdOworCXVpbnQzMl90IG9mZnNldF9pbl9kc3QgPSAocGl0Y2ggKiB5KSAr ICh4ICogYnBwKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGV4ZWNidWYgPSB7 fTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBvYmpzWzJdID0ge3t9LCB7fX07 CisJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IHJlbG9jc1sxXSA9IHt7fX07 CisJc3RydWN0IGRybV9pOTE1X2dlbV93YWl0IGdlbV93YWl0OworCisJaSA9IDA7CisKKwliYXRj aF9idWZbaSsrXSA9IENPTE9SX0JMVF9DTUQgfCBDT0xPUl9CTFRfV1JJVEVfQUxQSEEgfAorCQkJ IENPTE9SX0JMVF9XUklURV9SR0I7CisJYmF0Y2hfYnVmW2krK10gPSAoMyA8PCAyNCkgfCAoMHhG MCA8PCAxNikgfCBwaXRjaDsKKwliYXRjaF9idWZbaSsrXSA9IChoZWlnaHQgPDwgMTYpIHwgd2lk dGggKiBicHA7CisJcmVsb2NfcG9zID0gaTsKKwliYXRjaF9idWZbaSsrXSA9ICpwcmVzdW1lZF9k c3Rfb2Zmc2V0ICsgb2Zmc2V0X2luX2RzdDsKKwliYXRjaF9idWZbaSsrXSA9IGNvbG9yOworCisJ YmF0Y2hfYnVmW2krK10gPSBNSV9OT09QOworCWJhdGNoX2J1ZltpKytdID0gTUlfQkFUQ0hfQlVG RkVSX0VORDsKKwliYXRjaF9idWZbaSsrXSA9IE1JX05PT1A7CisKKwlpZ3RfYXNzZXJ0KGkgKiBz aXplb2YodWludDMyX3QpID09IGJhdGNoX3NpemUpOworCisJYmF0Y2hfaGFuZGxlID0gZ2VtX2Ny ZWF0ZShkcm1fZmQsIGJhdGNoX3NpemUpOworCWdlbV93cml0ZShkcm1fZmQsIGJhdGNoX2hhbmRs ZSwgMCwgYmF0Y2hfYnVmLCBiYXRjaF9zaXplKTsKKworCXJlbG9jc1swXS50YXJnZXRfaGFuZGxl ID0gZHN0X2hhbmRsZTsKKwlyZWxvY3NbMF0uZGVsdGEgPSBvZmZzZXRfaW5fZHN0OworCXJlbG9j c1swXS5vZmZzZXQgPSByZWxvY19wb3MgKiBzaXplb2YodWludDMyX3QpOworCXJlbG9jc1swXS5w cmVzdW1lZF9vZmZzZXQgPSAqcHJlc3VtZWRfZHN0X29mZnNldDsKKwlyZWxvY3NbMF0ucmVhZF9k b21haW5zID0gMDsKKwlyZWxvY3NbMF0ud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JF TkRFUjsKKworCW9ianNbMF0uaGFuZGxlID0gZHN0X2hhbmRsZTsKKwlvYmpzWzBdLmFsaWdubWVu dCA9IDY0OworCisJb2Jqc1sxXS5oYW5kbGUgPSBiYXRjaF9oYW5kbGU7CisJb2Jqc1sxXS5yZWxv Y2F0aW9uX2NvdW50ID0gMTsKKwlvYmpzWzFdLnJlbG9jc19wdHIgPSAodWludDY0X3QpIHJlbG9j czsKKworCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodWludDY0X3QpIG9ianM7CisJZXhlY2J1Zi5i dWZmZXJfY291bnQgPSAyOworCWV4ZWNidWYuYmF0Y2hfbGVuID0gYmF0Y2hfc2l6ZTsKKwlleGVj YnVmLmZsYWdzID0gSTkxNV9FWEVDX0JMVDsKKwlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0 X2lkKGV4ZWNidWYsIDApOworCisJZG9faW9jdGwoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9HRU1f RVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKKworCSpwcmVzdW1lZF9kc3Rfb2Zmc2V0ID0gcmVsb2Nz WzBdLnByZXN1bWVkX29mZnNldDsKKworCWdlbV93YWl0LmZsYWdzID0gMDsKKwlnZW1fd2FpdC50 aW1lb3V0X25zID0gMTAwMDAwMDAwMDBMTDsgLyogMTBzICovCisKKwlnZW1fd2FpdC5ib19oYW5k bGUgPSBiYXRjaF9oYW5kbGU7CisJZG9faW9jdGwoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9HRU1f V0FJVCwgJmdlbV93YWl0KTsKKworCWdlbV93YWl0LmJvX2hhbmRsZSA9IGRzdF9oYW5kbGU7CisJ ZG9faW9jdGwoZHJtX2ZkLCBEUk1fSU9DVExfSTkxNV9HRU1fV0FJVCwgJmdlbV93YWl0KTsKKwor CWdlbV9jbG9zZShkcm1fZmQsIGJhdGNoX2hhbmRsZSk7Cit9CisKKy8qIE1ha2Ugc3VyZSB3ZSBj YW4gc3VibWl0IGEgYmF0Y2ggYnVmZmVyIGFuZCB2ZXJpZnkgaXRzIHJlc3VsdC4gKi8KK3N0YXRp YyB2b2lkIGdlbV9leGVjYnVmX3N1YnRlc3Qodm9pZCkKK3sKKwlpbnQgeCwgeTsKKwl1aW50MzJf dCBoYW5kbGU7CisJaW50IGJwcCA9IDQ7CisJaW50IHBpdGNoID0gMTI4ICogYnBwOworCWludCBk c3Rfc2l6ZSA9IDEyOCAqIDEyOCAqIGJwcDsgLyogMTI4eDEyOCBzcXVhcmUgKi8KKwl1aW50MzJf dCAqY3B1X2J1ZjsKKwl1aW50MzJfdCBwcmVzdW1lZF9vZmZzZXQgPSAwOworCWludCBzcV94ID0g NSwgc3FfeSA9IDEwLCBzcV93ID0gMTUsIHNxX2ggPSAyMDsKKwl1aW50MzJfdCBjb2xvcjsKKwor CS8qIENyZWF0ZSBhbmQgc2V0IGRhdGEgd2hpbGUgdGhlIGRldmljZSBpcyBhY3RpdmUuICovCisJ ZW5hYmxlX29uZV9zY3JlZW4oJm1zX2RhdGEpOworCWlndF9hc3NlcnQod2FpdF9mb3JfYWN0aXZl KCkpOworCisJaGFuZGxlID0gZ2VtX2NyZWF0ZShkcm1fZmQsIGRzdF9zaXplKTsKKworCWNwdV9i dWYgPSBtYWxsb2MoZHN0X3NpemUpOworCWlndF9hc3NlcnQoY3B1X2J1Zik7CisJbWVtc2V0KGNw dV9idWYsIDAsIGRzdF9zaXplKTsKKwlnZW1fd3JpdGUoZHJtX2ZkLCBoYW5kbGUsIDAsIGNwdV9i dWYsIGRzdF9zaXplKTsKKworCS8qIE5vdyBzdXNwZW5kIGFuZCB0cnkgaXQuICovCisJZGlzYWJs ZV9hbGxfc2NyZWVucygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQo KSk7CisKKwljb2xvciA9IDB4MTIzNDU2Nzg7CisJc3VibWl0X2JsdF9jbWQoaGFuZGxlLCBzcV94 LCBzcV95LCBzcV93LCBzcV9oLCBwaXRjaCwgY29sb3IsCisJCSAgICAgICAmcHJlc3VtZWRfb2Zm c2V0KTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX3N1c3BlbmRlZCgpKTsKKworCWdlbV9yZWFkKGRy bV9mZCwgaGFuZGxlLCAwLCBjcHVfYnVmLCBkc3Rfc2l6ZSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zv cl9zdXNwZW5kZWQoKSk7CisJZm9yICh5ID0gMDsgeSA8IDEyODsgeSsrKSB7CisJCWZvciAoeCA9 IDA7IHggPCAxMjg7IHgrKykgeworCQkJdWludDMyX3QgcHggPSBjcHVfYnVmW3kgKiAxMjggKyB4 XTsKKworCQkJaWYgKHkgPj0gc3FfeSAmJiB5IDwgKHNxX3kgKyBzcV9oKSAmJgorCQkJICAgIHgg Pj0gc3FfeCAmJiB4IDwgKHNxX3ggKyBzcV93KSkKKwkJCQlpZ3RfYXNzZXJ0KHB4ID09IGNvbG9y KTsKKwkJCWVsc2UKKwkJCQlpZ3RfYXNzZXJ0KHB4ID09IDApOworCQl9CisJfQorCisJLyogTm93 IHJlc3VtZSBhbmQgY2hlY2sgZm9yIGl0IGFnYWluLiAqLworCWVuYWJsZV9vbmVfc2NyZWVuKCZt c19kYXRhKTsKKwlpZ3RfYXNzZXJ0KHdhaXRfZm9yX2FjdGl2ZSgpKTsKKworCW1lbXNldChjcHVf YnVmLCAwLCBkc3Rfc2l6ZSk7CisJZ2VtX3JlYWQoZHJtX2ZkLCBoYW5kbGUsIDAsIGNwdV9idWYs IGRzdF9zaXplKTsKKwlmb3IgKHkgPSAwOyB5IDwgMTI4OyB5KyspIHsKKwkJZm9yICh4ID0gMDsg eCA8IDEyODsgeCsrKSB7CisJCQl1aW50MzJfdCBweCA9IGNwdV9idWZbeSAqIDEyOCArIHhdOwor CisJCQlpZiAoeSA+PSBzcV95ICYmIHkgPCAoc3FfeSArIHNxX2gpICYmCisJCQkgICAgeCA+PSBz cV94ICYmIHggPCAoc3FfeCArIHNxX3cpKQorCQkJCWlndF9hc3NlcnQocHggPT0gY29sb3IpOwor CQkJZWxzZQorCQkJCWlndF9hc3NlcnQocHggPT0gMCk7CisJCX0KKwl9CisKKwkvKiBOb3cgd2Un bGwgZG8gdGhlIG9wcG9zaXRlOiBkbyB0aGUgYmx0IHdoaWxlIGFjdGl2ZSwgdGhlbiByZWFkIHdo aWxlCisJICogc3VzcGVuZGVkLiBXZSB1c2UgdGhlIHNhbWUgc3BvdCwgYnV0IGEgZGlmZmVyZW50 IGNvbG9yLiBBcyBhIGJvbnVzLAorCSAqIHdlJ3JlIHRlc3RpbmcgdGhlIHByZXN1bWVkX29mZnNl dCBmcm9tIHRoZSBwcmV2aW91cyBjb21tYW5kLiAqLworCWNvbG9yID0gMHg4NzY1NDMyMTsKKwlz dWJtaXRfYmx0X2NtZChoYW5kbGUsIHNxX3gsIHNxX3ksIHNxX3csIHNxX2gsIHBpdGNoLCBjb2xv ciwKKwkJICAgICAgICZwcmVzdW1lZF9vZmZzZXQpOworCisJZGlzYWJsZV9hbGxfc2NyZWVucygm bXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwltZW1zZXQo Y3B1X2J1ZiwgMCwgZHN0X3NpemUpOworCWdlbV9yZWFkKGRybV9mZCwgaGFuZGxlLCAwLCBjcHVf YnVmLCBkc3Rfc2l6ZSk7CisJZm9yICh5ID0gMDsgeSA8IDEyODsgeSsrKSB7CisJCWZvciAoeCA9 IDA7IHggPCAxMjg7IHgrKykgeworCQkJdWludDMyX3QgcHggPSBjcHVfYnVmW3kgKiAxMjggKyB4 XTsKKworCQkJaWYgKHkgPj0gc3FfeSAmJiB5IDwgKHNxX3kgKyBzcV9oKSAmJgorCQkJICAgIHgg Pj0gc3FfeCAmJiB4IDwgKHNxX3ggKyBzcV93KSkKKwkJCQlpZ3RfYXNzZXJ0KHB4ID09IGNvbG9y KTsKKwkJCWVsc2UKKwkJCQlpZ3RfYXNzZXJ0KHB4ID09IDApOworCQl9CisJfQorCisJZ2VtX2Ns b3NlKGRybV9mZCwgaGFuZGxlKTsKKworCWZyZWUoY3B1X2J1Zik7Cit9CisKKy8qIEFzc3VtaW5n IGV4ZWNidWYgYWxyZWFkeSB3b3JrcywgbGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIGZv cmNlIG1hbnkKKyAqIHN1c3BlbmQvcmVzdW1lIGN5Y2xlcyB3aXRoIGNvbW1hbmRzLiAqLworc3Rh dGljIHZvaWQgZ2VtX2V4ZWNidWZfc3RyZXNzX3N1YnRlc3Qodm9pZCkKK3sKKwlpbnQgaTsKKwlp bnQgbWF4ID0gcXVpY2sgPyA1IDogNTA7CisJaW50IGJhdGNoX3NpemUgPSA0ICogc2l6ZW9mKHVp bnQzMl90KTsKKwl1aW50MzJfdCBiYXRjaF9idWZbYmF0Y2hfc2l6ZV07CisJdWludDMyX3QgaGFu ZGxlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZiA9IHt9OworCXN0 cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyIG9ianNbMV0gPSB7e319OworCisJaSA9IDA7 CisJYmF0Y2hfYnVmW2krK10gPSBNSV9OT09QOworCWJhdGNoX2J1ZltpKytdID0gTUlfTk9PUDsK KwliYXRjaF9idWZbaSsrXSA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJYmF0Y2hfYnVmW2krK10g PSBNSV9OT09QOworCWlndF9hc3NlcnQoaSAqIHNpemVvZih1aW50MzJfdCkgPT0gYmF0Y2hfc2l6 ZSk7CisKKwlkaXNhYmxlX2FsbF9zY3JlZW5zKCZtc19kYXRhKTsKKwlpZ3RfYXNzZXJ0KHdhaXRf Zm9yX3N1c3BlbmRlZCgpKTsKKworCWhhbmRsZSA9IGdlbV9jcmVhdGUoZHJtX2ZkLCBiYXRjaF9z aXplKTsKKwlnZW1fd3JpdGUoZHJtX2ZkLCBoYW5kbGUsIDAsIGJhdGNoX2J1ZiwgYmF0Y2hfc2l6 ZSk7CisKKwlvYmpzWzBdLmhhbmRsZSA9IGhhbmRsZTsKKworCWV4ZWNidWYuYnVmZmVyc19wdHIg PSAodWludDY0X3QpIG9ianM7CisJZXhlY2J1Zi5idWZmZXJfY291bnQgPSAxOworCWV4ZWNidWYu YmF0Y2hfbGVuID0gYmF0Y2hfc2l6ZTsKKwlleGVjYnVmLmZsYWdzID0gSTkxNV9FWEVDX1JFTkRF UjsKKwlpOTE1X2V4ZWNidWZmZXIyX3NldF9jb250ZXh0X2lkKGV4ZWNidWYsIDApOworCisJZm9y IChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCWRvX2lvY3RsKGRybV9mZCwgRFJNX0lPQ1RMX0k5 MTVfR0VNX0VYRUNCVUZGRVIyLCAmZXhlY2J1Zik7CisJCWlndF9hc3NlcnQod2FpdF9mb3Jfc3Vz cGVuZGVkKCkpOworCX0KKworCWdlbV9jbG9zZShkcm1fZmQsIGhhbmRsZSk7Cit9CisKK3N0YXRp YyB2b2lkIHJlYWRfZnVsbF9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJjLCBmZDsK KwljaGFyIGJ1ZlsxMjhdOworCisJLyogTWFrZSBzdXJlIHdlJ3JlIHN1c3BlbmRlZCEgKi8KKwlp Z3RfYXNzZXJ0KHdhaXRfZm9yX3N1c3BlbmRlZCgpKTsKKworCWZkID0gb3BlbihuYW1lLCBPX1JE T05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCisJZG8geworCQlyYyA9IHJlYWQoZmQs IGJ1ZiwgQVJSQVlfU0laRShidWYpKTsKKwl9IHdoaWxlIChyYyA9PSBBUlJBWV9TSVpFKGJ1Zikp OworCisJcmMgPSBjbG9zZShmZCk7CisJaWd0X2Fzc2VydChyYyA9PSAwKTsKK30KKworc3RhdGlj IHZvaWQgcmVhZF9maWxlc19mcm9tX2Rpcihjb25zdCBjaGFyICpuYW1lLCBpbnQgbGV2ZWwpCit7 CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGlyZW50OworCWNoYXIgKmZ1bGxfbmFtZTsK KwlpbnQgcmM7CisKKwlkaXIgPSBvcGVuZGlyKG5hbWUpOworCWlndF9hc3NlcnQoZGlyKTsKKwor CWZ1bGxfbmFtZSA9IG1hbGxvYyhQQVRIX01BWCk7CisKKwlpZ3RfYXNzZXJ0KGxldmVsIDwgMTI4 KTsKKworCXdoaWxlICgoZGlyZW50ID0gcmVhZGRpcihkaXIpKSkgeworCQlzdHJ1Y3Qgc3RhdCBz dGF0X2J1ZjsKKworCQlpZiAoc3RyY21wKGRpcmVudC0+ZF9uYW1lLCAiLiIpID09IDApCisJCQlj b250aW51ZTsKKwkJaWYgKHN0cmNtcChkaXJlbnQtPmRfbmFtZSwgIi4uIikgPT0gMCkKKwkJCWNv bnRpbnVlOworCisJCXNucHJpbnRmKGZ1bGxfbmFtZSwgUEFUSF9NQVgsICIlcy8lcyIsIG5hbWUs IGRpcmVudC0+ZF9uYW1lKTsKKworCQlyYyA9IGxzdGF0KGZ1bGxfbmFtZSwgJnN0YXRfYnVmKTsK KwkJaWd0X2Fzc2VydChyYyA9PSAwKTsKKworCQlpZiAoU19JU0RJUihzdGF0X2J1Zi5zdF9tb2Rl KSkKKwkJCXJlYWRfZmlsZXNfZnJvbV9kaXIoZnVsbF9uYW1lLCBsZXZlbCArIDEpOworCisJCWlm IChTX0lTUkVHKHN0YXRfYnVmLnN0X21vZGUpKQorCQkJcmVhZF9mdWxsX2ZpbGUoZnVsbF9uYW1l KTsKKwl9CisKKwlmcmVlKGZ1bGxfbmFtZSk7CisJY2xvc2VkaXIoZGlyKTsKK30KKworLyogVGhp cyB0ZXN0IHdpbGwgcHJvYmFibHkgcGFzcywgd2l0aCBhIHNtYWxsIGNoYW5jZSBvZiBoYW5naW5n IHRoZSBtYWNoaW5lIGluCisgKiBjYXNlIG9mIGJ1Z3MuIE1hbnkgb2YgdGhlIGJ1Z3MgZXhlcmNp c2VkIGJ5IHRoaXMgcGF0Y2gganVzdCByZXN1bHQgaW4gZG1lc2cKKyAqIGVycm9ycywgc28gYSAi cGFzcyIgaGVyZSBzaG91bGQgYmUgY29uZmlybWVkIGJ5IGEgY2hlY2sgb24gZG1lc2cuICovCitz dGF0aWMgdm9pZCBkZWJ1Z2ZzX3JlYWRfc3VidGVzdCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnBh dGggPSAiL3N5cy9rZXJuZWwvZGVidWcvZHJpLzAiOworCURJUiAqZGlyOworCisJZGlyID0gb3Bl bmRpcihwYXRoKTsKKwlpZ3RfcmVxdWlyZV9mKGRpciwgIkNhbid0IG9wZW4gdGhlIGRlYnVnZnMg ZGlyZWN0b3J5XG4iKTsKKwljbG9zZWRpcihkaXIpOworCisJZGlzYWJsZV9hbGxfc2NyZWVucygm bXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwlyZWFkX2Zp bGVzX2Zyb21fZGlyKHBhdGgsIDApOworfQorCisvKiBSZWFkIHRoZSBjb21tZW50IG9uIGRlYnVn ZnNfcmVhZF9zdWJ0ZXN0KCkuICovCitzdGF0aWMgdm9pZCBzeXNmc19yZWFkX3N1YnRlc3Qodm9p ZCkKK3sKKwljb25zdCBjaGFyICpwYXRoID0gIi9zeXMvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6 MDA6MDIuMCI7CisJRElSICpkaXI7CisKKwlkaXIgPSBvcGVuZGlyKHBhdGgpOworCWlndF9yZXF1 aXJlX2YoZGlyLCAiQ2FuJ3Qgb3BlbiB0aGUgc3lzZnMgZGlyZWN0b3J5XG4iKTsKKwljbG9zZWRp cihkaXIpOworCisJZGlzYWJsZV9hbGxfc2NyZWVucygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3 YWl0X2Zvcl9zdXNwZW5kZWQoKSk7CisKKwlyZWFkX2ZpbGVzX2Zyb21fZGlyKHBhdGgsIDApOwor fQorCisvKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc3VzcGVuZCB3aGVuIHdlIGhhdmUgdGhlIGk5MTVf Zm9yY2V3YWtlX3VzZXIgZmlsZSBvcGVuLiAqLworc3RhdGljIHZvaWQgZGVidWdmc19mb3JjZXdh a2VfdXNlcl9zdWJ0ZXN0KHZvaWQpCit7CisJaW50IGZkLCByYzsKKworCWlndF9yZXF1aXJlKCEo SVNfR0VOMihtc19kYXRhLmRldmlkKSB8fCBJU19HRU4zKG1zX2RhdGEuZGV2aWQpIHx8CisJCSAg ICAgIElTX0dFTjQobXNfZGF0YS5kZXZpZCkgfHwgSVNfR0VONShtc19kYXRhLmRldmlkKSkpOwor CisJZGlzYWJsZV9hbGxfc2NyZWVucygmbXNfZGF0YSk7CisJaWd0X2Fzc2VydCh3YWl0X2Zvcl9z dXNwZW5kZWQoKSk7CisKKwlmZCA9IG9wZW4oIi9zeXMva2VybmVsL2RlYnVnL2RyaS8wL2k5MTVf Zm9yY2V3YWtlX3VzZXIiLCBPX1JET05MWSk7CisJaWd0X3JlcXVpcmUoZmQpOworCisJaWd0X2Fz c2VydCghd2FpdF9mb3Jfc3VzcGVuZGVkKCkpOworCisJcmMgPSBjbG9zZShmZCk7CisJaWd0X2Fz c2VydChyYyA9PSAwKTsKKworCWlndF9hc3NlcnQod2FpdF9mb3Jfc3VzcGVuZGVkKCkpOworfQor CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCS8qIFRoZSAtLXF1aWNrIG9w dGlvbiBtYWtlcyB0aGUgc3RyZXNzIHRlc3RzIG5vdCBzbyBzdHJlc3NmdWwuICovCisJaWYgKGFy Z2MgPiAxICYmIHN0cmNtcChhcmd2WzFdLCAiLS1xdWljayIpID09IDApCisJCXF1aWNrID0gdHJ1 ZTsKKworCWlndF9zdWJ0ZXN0X2luaXQoYXJnYywgYXJndik7CisKKwlpZ3RfZml4dHVyZQorCQlz ZXR1cF9lbnZpcm9ubWVudCgpOworCisJaWd0X3N1YnRlc3QoImJhc2ljIikKKwkJYmFzaWNfc3Vi dGVzdCgpOworCWlndF9zdWJ0ZXN0KCJkcm0tcmVzb3VyY2VzIikKKwkJZHJtX3Jlc291cmNlc19z dWJ0ZXN0KCk7CisJaWd0X3N1YnRlc3QoImkyYyIpCisJCWkyY19zdWJ0ZXN0KCk7CisJaWd0X3N1 YnRlc3QoInBjOCIpCisJCXBjOF9zdWJ0ZXN0KCk7CisJaWd0X3N1YnRlc3QoImdlbS1tbWFwIikK KwkJZ2VtX21tYXBfc3VidGVzdCgpOworCWlndF9zdWJ0ZXN0KCJnZW0tcHJlYWQiKQorCQlnZW1f cHJlYWRfc3VidGVzdCgpOworCWlndF9zdWJ0ZXN0KCJnZW0tZXhlY2J1ZiIpCisJCWdlbV9leGVj YnVmX3N1YnRlc3QoKTsKKwlpZ3Rfc3VidGVzdCgibW9kZXNldC1zdHJlc3MtbHBzcCIpCisJCW1v ZGVzZXRfc3RyZXNzKHRydWUpOworCWlndF9zdWJ0ZXN0KCJtb2Rlc2V0LXN0cmVzcy1ub24tbHBz cCIpCisJCW1vZGVzZXRfc3RyZXNzKGZhbHNlKTsKKwlpZ3Rfc3VidGVzdCgiZ2VtLWV4ZWNidWYt c3RyZXNzIikKKwkJZ2VtX2V4ZWNidWZfc3RyZXNzX3N1YnRlc3QoKTsKKwlpZ3Rfc3VidGVzdCgi ZGVidWdmcy1yZWFkIikKKwkJZGVidWdmc19yZWFkX3N1YnRlc3QoKTsKKwlpZ3Rfc3VidGVzdCgi ZGVidWdmcy1mb3JjZXdha2UtdXNlciIpCisJCWRlYnVnZnNfZm9yY2V3YWtlX3VzZXJfc3VidGVz dCgpOworCWlndF9zdWJ0ZXN0KCJzeXNmcy1yZWFkIikKKwkJc3lzZnNfcmVhZF9zdWJ0ZXN0KCk7 CisKKwlpZ3RfZml4dHVyZQorCQl0ZWFyZG93bl9lbnZpcm9ubWVudCgpOworCisJaWd0X2V4aXQo KTsKK30KLS0gCjEuOC4zLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNr dG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50 ZWwtZ2Z4Cg==