From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Weinehall Subject: [PATCH i-g-t v4 1/3] tests/gem_concurrent_blit: rename gem_concurrent_all Date: Thu, 11 Feb 2016 13:09:32 +0200 Message-ID: <1455188974-17801-2-git-send-email-david.weinehall@linux.intel.com> References: <1455188974-17801-1-git-send-email-david.weinehall@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id 19C306E7EC for ; Thu, 11 Feb 2016 03:13:40 -0800 (PST) In-Reply-To: <1455188974-17801-1-git-send-email-david.weinehall@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org V2UnbGwgYm90aCByZW5hbWUgZ2VtX2NvbmN1cnJlbnRfYWxsIG92ZXIgZ2VtX2NvbmN1cnJlbnRf YmxpdAphbmQgY2hhbmdlIGdlbV9jb25jdXJyZW50X2JsaXQgaW4gdGhpcyBjaGFuZ2VzZXQuIFRv IG1ha2UKdGhpcyBlYXNpZXIgdG8gZm9sbG93IHdlIGZpcnN0IGRvIHRoZSB0aGUgcmVuYW1lLgoK U2lnbmVkLW9mZi1ieTogRGF2aWQgV2VpbmVoYWxsIDxkYXZpZC53ZWluZWhhbGxAbGludXguaW50 ZWwuY29tPgotLS0KIHRlc3RzL2dlbV9jb25jdXJyZW50X2JsaXQuYyB8IDE1NDggKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDE1NDAg aW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS90ZXN0cy9nZW1fY29u Y3VycmVudF9ibGl0LmMgYi90ZXN0cy9nZW1fY29uY3VycmVudF9ibGl0LmMKaW5kZXggNTEzZGU0 YTFiNzE5Li45YjdlZjg3MDBlMzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2dlbV9jb25jdXJyZW50X2Js aXQuYworKysgYi90ZXN0cy9nZW1fY29uY3VycmVudF9ibGl0LmMKQEAgLTEsOCArMSwxNTQwIEBA Ci0vKiBUaGlzIHRlc3QgaXMganVzdCBhIGR1cGxpY2F0ZSBvZiBnZW1fY29uY3VycmVudF9hbGwu ICovCi0vKiBIb3dldmVyIHRoZSBleGVjdXRlYWJsZSB3aWxsIGJlIGdlbV9jb25jdXJyZW50X2Js aXQuICovCi0vKiBUaGUgbWFpbiBmdW5jdGlvbiBleGFtaW5lcyBhcmd2WzBdIGFuZCwgaW4gdGhl IGNhc2UgICovCi0vKiBvZiBnZW1fY29uY3VyZW50X2JsaXQgcnVucyBvbmx5IGEgc3Vic2V0IG9m IHRoZSAgICAgICovCi0vKiBhdmFpbGFibGUgc3VidGVzdHMuIFRoaXMgYXZvaWRzIHRoZSB1c2Ug b2YgICAgICAgICAgICovCi0vKiBub24tc3RhbmRhcmQgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMg d2hpY2ggY2FuIGNhdXNlICovCi0vKiBwcm9ibGVtcyBmb3IgYXV0b21hdGVkIHRlc3RpbmcgKi8K LSNpbmNsdWRlICJnZW1fY29uY3VycmVudF9hbGwuYyIKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAw OSwyMDEyLDIwMTMgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVi eSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICog Y29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMg KHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5l eHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJz dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFV VEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFH RVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisg KiBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yczoKKyAqICAgIEVyaWMgQW5ob2x0IDxl cmljQGFuaG9sdC5uZXQ+CisgKiAgICBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KKyAqICAgIERhbmllbCBWZXR0ZXIgPGRhbmllbC52ZXR0ZXJAZmZ3bGwuY2g+CisgKgor ICovCisKKy8qKiBAZmlsZSBnZW1fY29uY3VycmVudC5jCisgKgorICogVGhpcyBpcyBhIHRlc3Qg b2YgcHJlYWQvcHdyaXRlL21tYXAgYmVoYXZpb3Igd2hlbiB3cml0aW5nIHRvIGFjdGl2ZQorICog YnVmZmVycy4KKyAqCisgKiBCYXNlZCBvbiBnZW1fZ3R0X2NvbmN1cnJlbnRfYmx0LgorICovCisK KyNpbmNsdWRlICJpZ3QuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5o PgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50 dHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5j bHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjaW5jbHVkZSA8ZHJt Lmg+CisKKyNpbmNsdWRlICJpbnRlbF9idWZtZ3IuaCIKKworSUdUX1RFU1RfREVTQ1JJUFRJT04o IlRlc3Qgb2YgcHJlYWQvcHdyaXRlL21tYXAgYmVoYXZpb3Igd2hlbiB3cml0aW5nIHRvIGFjdGl2 ZSIKKwkJICAgICAiIGJ1ZmZlcnMuIik7CisKKyNkZWZpbmUgTE9DQUxfSTkxNV9HRU1fVVNFUlBU UiAgICAgICAweDMzCisjZGVmaW5lIExPQ0FMX0lPQ1RMX0k5MTVfR0VNX1VTRVJQVFIgRFJNX0lP V1IgKERSTV9DT01NQU5EX0JBU0UgKyBMT0NBTF9JOTE1X0dFTV9VU0VSUFRSLCBzdHJ1Y3QgbG9j YWxfaTkxNV9nZW1fdXNlcnB0cikKK3N0cnVjdCBsb2NhbF9pOTE1X2dlbV91c2VycHRyIHsKKwl1 aW50NjRfdCB1c2VyX3B0cjsKKwl1aW50NjRfdCB1c2VyX3NpemU7CisJdWludDMyX3QgZmxhZ3M7 CisJdWludDMyX3QgaGFuZGxlOworfTsKKworaW50IGZkLCBkZXZpZCwgZ2VuOworc3RydWN0IGlu dGVsX2JhdGNoYnVmZmVyICpiYXRjaDsKK2ludCBhbGw7CitpbnQgcGFzczsKKworc3RydWN0IGJ1 ZmZlcnMgeworCWNvbnN0IHN0cnVjdCBhY2Nlc3NfbW9kZSAqbW9kZTsKKwlkcm1faW50ZWxfYnVm bWdyICpidWZtZ3I7CisJZHJtX2ludGVsX2JvICoqc3JjLCAqKmRzdDsKKwlkcm1faW50ZWxfYm8g KnNub29wLCAqc3BhcmU7CisJdWludDMyX3QgKnRtcDsKKwlpbnQgd2lkdGgsIGhlaWdodCwgc2l6 ZTsKKwlpbnQgY291bnQ7Cit9OworCisjZGVmaW5lIE1JTl9CVUZGRVJTIDMKKworc3RhdGljIHZv aWQgYmx0X2NvcHlfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqZHN0LCBkcm1f aW50ZWxfYm8gKnNyYyk7CisKK3N0YXRpYyB2b2lkCitub3BfcmVsZWFzZV9ibyhkcm1faW50ZWxf Ym8gKmJvKQoreworCWRybV9pbnRlbF9ib191bnJlZmVyZW5jZShibyk7Cit9CisKK3N0YXRpYyB2 b2lkCitwcndfc2V0X2JvKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50 MzJfdCB2YWwpCit7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBiLT5zaXplOyBpKyspCisJCWItPnRt cFtpXSA9IHZhbDsKKwlkcm1faW50ZWxfYm9fc3ViZGF0YShibywgMCwgNCpiLT5zaXplLCBiLT50 bXApOworfQorCitzdGF0aWMgdm9pZAorcHJ3X2NtcF9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJt X2ludGVsX2JvICpibywgdWludDMyX3QgdmFsKQoreworCXVpbnQzMl90ICp2YWRkcjsKKworCXZh ZGRyID0gYi0+dG1wOworCWRvX29yX2RpZShkcm1faW50ZWxfYm9fZ2V0X3N1YmRhdGEoYm8sIDAs IDQqYi0+c2l6ZSwgdmFkZHIpKTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGItPnNpemU7IGkrKykK KwkJaWd0X2Fzc2VydF9lcV91MzIodmFkZHJbaV0sIHZhbCk7Cit9CisKKyNkZWZpbmUgcGl4ZWwo eSwgd2lkdGgpICgoeSkqKHdpZHRoKSArICgoKHkpICsgcGFzcyklKHdpZHRoKSkpCisKK3N0YXRp YyB2b2lkCitwYXJ0aWFsX3NldF9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpi bywgdWludDMyX3QgdmFsKQoreworCWZvciAoaW50IHkgPSAwOyB5IDwgYi0+aGVpZ2h0OyB5Kysp CisJCWRvX29yX2RpZShkcm1faW50ZWxfYm9fc3ViZGF0YShibywgNCpwaXhlbCh5LCBiLT53aWR0 aCksIDQsICZ2YWwpKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnRpYWxfY21wX2JvKHN0cnVjdCBi dWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCit7CisJZm9yIChpbnQg eSA9IDA7IHkgPCBiLT5oZWlnaHQ7IHkrKykgeworCQl1aW50MzJfdCBidWY7CisJCWRvX29yX2Rp ZShkcm1faW50ZWxfYm9fZ2V0X3N1YmRhdGEoYm8sIDQqcGl4ZWwoeSwgYi0+d2lkdGgpLCA0LCAm YnVmKSk7CisJCWlndF9hc3NlcnRfZXFfdTMyKGJ1ZiwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyBk cm1faW50ZWxfYm8gKgorY3JlYXRlX25vcm1hbF9ibyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3Is IHVpbnQ2NF90IHNpemUpCit7CisJZHJtX2ludGVsX2JvICpibzsKKworCWJvID0gZHJtX2ludGVs X2JvX2FsbG9jKGJ1Zm1nciwgImJvIiwgc2l6ZSwgMCk7CisJaWd0X2Fzc2VydChibyk7CisKKwly ZXR1cm4gYm87Cit9CisKK3N0YXRpYyBib29sIGNhbl9jcmVhdGVfbm9ybWFsKHZvaWQpCit7CisJ cmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorY3JlYXRlX3ByaXZhdGVf Ym8oZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCB1aW50NjRfdCBzaXplKQoreworCWRybV9pbnRl bF9ibyAqYm87CisJdWludDMyX3QgaGFuZGxlOworCisJLyogWFhYIGdlbV9jcmVhdGVfd2l0aF9m bGFncyhmZCwgc2l6ZSwgSTkxNV9DUkVBVEVfUFJJVkFURSk7ICovCisKKwloYW5kbGUgPSBnZW1f Y3JlYXRlKGZkLCBzaXplKTsKKwlibyA9IGdlbV9oYW5kbGVfdG9fbGliZHJtX2JvKGJ1Zm1nciwg ZmQsICJzdG9sZW4iLCBoYW5kbGUpOworCWdlbV9jbG9zZShmZCwgaGFuZGxlKTsKKworCXJldHVy biBibzsKK30KKworc3RhdGljIGJvb2wgY2FuX2NyZWF0ZV9wcml2YXRlKHZvaWQpCit7CisJcmV0 dXJuIGZhbHNlOworfQorCitzdGF0aWMgZHJtX2ludGVsX2JvICoKK2NyZWF0ZV9zdG9sZW5fYm8o ZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdyLCB1aW50NjRfdCBzaXplKQoreworCWRybV9pbnRlbF9i byAqYm87CisJdWludDMyX3QgaGFuZGxlOworCisJLyogWFhYIGdlbV9jcmVhdGVfd2l0aF9mbGFn cyhmZCwgc2l6ZSwgSTkxNV9DUkVBVEVfU1RPTEVOKTsgKi8KKworCWhhbmRsZSA9IGdlbV9jcmVh dGUoZmQsIHNpemUpOworCWJvID0gZ2VtX2hhbmRsZV90b19saWJkcm1fYm8oYnVmbWdyLCBmZCwg InN0b2xlbiIsIGhhbmRsZSk7CisJZ2VtX2Nsb3NlKGZkLCBoYW5kbGUpOworCisJcmV0dXJuIGJv OworfQorCitzdGF0aWMgYm9vbCBjYW5fY3JlYXRlX3N0b2xlbih2b2lkKQoreworCS8qIFhYWCBj aGVjayBudW1fYnVmZmVycyBhZ2FpbnN0IGF2YWlsYWJsZSBzdG9sZW4gKi8KKwlyZXR1cm4gZmFs c2U7Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorKCpjcmVhdGVfZnVuYykoZHJtX2ludGVs X2J1Zm1nciAqYnVmbWdyLCB1aW50NjRfdCBzaXplKTsKKworc3RhdGljIGJvb2wgY3JlYXRlX2Nw dV9yZXF1aXJlKHZvaWQpCit7CisJcmV0dXJuIGNyZWF0ZV9mdW5jICE9IGNyZWF0ZV9zdG9sZW5f Ym87Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgordW5tYXBwZWRfY3JlYXRlX2JvKGRybV9p bnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCXJldHVybiBj cmVhdGVfZnVuYyhidWZtZ3IsICh1aW50NjRfdCk0KndpZHRoKmhlaWdodCk7Cit9CisKK3N0YXRp YyBib29sIGNyZWF0ZV9zbm9vcF9yZXF1aXJlKHZvaWQpCit7CisJaWYgKCFjcmVhdGVfY3B1X3Jl cXVpcmUoKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuICFnZW1faGFzX2xsYyhmZCk7Cit9 CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorc25vb3BfY3JlYXRlX2JvKGRybV9pbnRlbF9idWZt Z3IgKmJ1Zm1nciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworCWRybV9pbnRlbF9ibyAqYm87 CisKKwlibyA9IHVubWFwcGVkX2NyZWF0ZV9ibyhidWZtZ3IsIHdpZHRoLCBoZWlnaHQpOworCWdl bV9zZXRfY2FjaGluZyhmZCwgYm8tPmhhbmRsZSwgSTkxNV9DQUNISU5HX0NBQ0hFRCk7CisJZHJt X2ludGVsX2JvX2Rpc2FibGVfcmV1c2UoYm8pOworCisJcmV0dXJuIGJvOworfQorCitzdGF0aWMg Ym9vbCBjcmVhdGVfdXNlcnB0cl9yZXF1aXJlKHZvaWQpCit7CisJc3RhdGljIGludCBmb3VuZCA9 IC0xOworCWlmIChmb3VuZCA8IDApIHsKKwkJc3RydWN0IGRybV9pOTE1X2dlbV91c2VycHRyIGFy ZzsKKworCQlmb3VuZCA9IDA7CisKKwkJbWVtc2V0KCZhcmcsIDAsIHNpemVvZihhcmcpKTsKKwkJ YXJnLnVzZXJfcHRyID0gLTQwOTZVTEw7CisJCWFyZy51c2VyX3NpemUgPSA4MTkyOworCQllcnJu byA9IDA7CisJCWRybUlvY3RsKGZkLCBMT0NBTF9JT0NUTF9JOTE1X0dFTV9VU0VSUFRSLCAmYXJn KTsKKwkJaWYgKGVycm5vID09IEVGQVVMVCkgeworCQkJaWd0X2Fzc2VydChwb3NpeF9tZW1hbGln bigodm9pZCAqKikmYXJnLnVzZXJfcHRyLAorCQkJCQkJICA0MDk2LCBhcmcudXNlcl9zaXplKSA9 PSAwKTsKKwkJCWZvdW5kID0gZHJtSW9jdGwoZmQsCisJCQkJCSBMT0NBTF9JT0NUTF9JOTE1X0dF TV9VU0VSUFRSLAorCQkJCQkgJmFyZykgPT0gMDsKKwkJCWZyZWUoKHZvaWQgKikodWludHB0cl90 KWFyZy51c2VyX3B0cik7CisJCX0KKworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBk cm1faW50ZWxfYm8gKgordXNlcnB0cl9jcmVhdGVfYm8oZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdy LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJc3RydWN0IGxvY2FsX2k5MTVfZ2VtX3VzZXJw dHIgdXNlcnB0cjsKKwlkcm1faW50ZWxfYm8gKmJvOworCXZvaWQgKnB0cjsKKworCW1lbXNldCgm dXNlcnB0ciwgMCwgc2l6ZW9mKHVzZXJwdHIpKTsKKwl1c2VycHRyLnVzZXJfc2l6ZSA9IHdpZHRo ICogaGVpZ2h0ICogNDsKKwl1c2VycHRyLnVzZXJfc2l6ZSA9ICh1c2VycHRyLnVzZXJfc2l6ZSAr IDQwOTUpICYgLTQwOTY7CisKKwlwdHIgPSBtbWFwKE5VTEwsIHVzZXJwdHIudXNlcl9zaXplLAor CQkgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTiB8IE1BUF9TSEFSRUQsIC0xLCAw KTsKKwlpZ3RfYXNzZXJ0KHB0ciAhPSAodm9pZCAqKS0xKTsKKwl1c2VycHRyLnVzZXJfcHRyID0g KHVpbnRwdHJfdClwdHI7CisKKwlkb19vcl9kaWUoZHJtSW9jdGwoZmQsIExPQ0FMX0lPQ1RMX0k5 MTVfR0VNX1VTRVJQVFIsICZ1c2VycHRyKSk7CisJYm8gPSBnZW1faGFuZGxlX3RvX2xpYmRybV9i byhidWZtZ3IsIGZkLCAidXNlcnB0ciIsIHVzZXJwdHIuaGFuZGxlKTsKKwliby0+dmlydHVhbCA9 ICh2b2lkICopKHVpbnRwdHJfdCl1c2VycHRyLnVzZXJfcHRyOworCWdlbV9jbG9zZShmZCwgdXNl cnB0ci5oYW5kbGUpOworCisJcmV0dXJuIGJvOworfQorCitzdGF0aWMgdm9pZAordXNlcnB0cl9z ZXRfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IHZhbCkK K3sKKwlpbnQgc2l6ZSA9IGItPnNpemU7CisJdWludDMyX3QgKnZhZGRyID0gYm8tPnZpcnR1YWw7 CisKKwlnZW1fc2V0X2RvbWFpbihmZCwgYm8tPmhhbmRsZSwKKwkJICAgICAgIEk5MTVfR0VNX0RP TUFJTl9DUFUsIEk5MTVfR0VNX0RPTUFJTl9DUFUpOworCXdoaWxlIChzaXplLS0pCisJCSp2YWRk cisrID0gdmFsOworfQorCitzdGF0aWMgdm9pZAordXNlcnB0cl9jbXBfYm8oc3RydWN0IGJ1ZmZl cnMgKmIsIGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IHZhbCkKK3sKKwlpbnQgc2l6ZSA9ICBi LT5zaXplOworCXVpbnQzMl90ICp2YWRkciA9IGJvLT52aXJ0dWFsOworCisJZ2VtX3NldF9kb21h aW4oZmQsIGJvLT5oYW5kbGUsCisJCSAgICAgICBJOTE1X0dFTV9ET01BSU5fQ1BVLCAwKTsKKwl3 aGlsZSAoc2l6ZS0tKQorCQlpZ3RfYXNzZXJ0X2VxX3UzMigqdmFkZHIrKywgdmFsKTsKK30KKwor c3RhdGljIHZvaWQKK3VzZXJwdHJfcmVsZWFzZV9ibyhkcm1faW50ZWxfYm8gKmJvKQoreworCW11 bm1hcChiby0+dmlydHVhbCwgYm8tPnNpemUpOworCWJvLT52aXJ0dWFsID0gTlVMTDsKKworCWRy bV9pbnRlbF9ib191bnJlZmVyZW5jZShibyk7Cit9CisKK3N0YXRpYyB2b2lkCitndHRfc2V0X2Jv KHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCit7CisJ dWludDMyX3QgKnZhZGRyID0gYm8tPnZpcnR1YWw7CisJaW50IHNpemUgPSBiLT5zaXplOworCisJ ZHJtX2ludGVsX2dlbV9ib19zdGFydF9ndHRfYWNjZXNzKGJvLCB0cnVlKTsKKwl3aGlsZSAoc2l6 ZS0tKQorCQkqdmFkZHIrKyA9IHZhbDsKK30KKworc3RhdGljIHZvaWQKK2d0dF9jbXBfYm8oc3Ry dWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90IHZhbCkKK3sKKwl1aW50 MzJfdCAqdmFkZHIgPSBiby0+dmlydHVhbDsKKworCS8qIEdUVCBhY2Nlc3MgaXMgc2xvdy4gU28g d2UganVzdCBjb21wYXJlIGEgZmV3IHBvaW50cyAqLworCWRybV9pbnRlbF9nZW1fYm9fc3RhcnRf Z3R0X2FjY2VzcyhibywgZmFsc2UpOworCWZvciAoaW50IHkgPSAwOyB5IDwgYi0+aGVpZ2h0OyB5 KyspCisJCWlndF9hc3NlcnRfZXFfdTMyKHZhZGRyW3BpeGVsKHksIGItPndpZHRoKV0sIHZhbCk7 Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorbWFwX2JvKGRybV9pbnRlbF9ibyAqYm8pCit7 CisJLyogZ3R0IG1hcCBkb2Vzbid0IGhhdmUgYSB3cml0ZSBwYXJhbWV0ZXIsIHNvIGp1c3Qga2Vl cCB0aGUgbWFwcGluZworCSAqIGFyb3VuZCAodG8gYXZvaWQgdGhlIHNldF9kb21haW4gd2l0aCB0 aGUgZ3R0IHdyaXRlIGRvbWFpbiBzZXQpIGFuZAorCSAqIG1hbnVhbGx5IHRlbGwgdGhlIGtlcm5l bCB3aGVuIHdlIHN0YXJ0IGFjY2VzcyB0aGUgZ3R0LiAqLworCWRvX29yX2RpZShkcm1faW50ZWxf Z2VtX2JvX21hcF9ndHQoYm8pKTsKKworCXJldHVybiBibzsKK30KKworc3RhdGljIGRybV9pbnRl bF9ibyAqCit0aWxlX2JvKGRybV9pbnRlbF9ibyAqYm8sIGludCB3aWR0aCkKK3sKKwl1aW50MzJf dCB0aWxpbmcgPSBJOTE1X1RJTElOR19YOworCXVpbnQzMl90IHN0cmlkZSA9IHdpZHRoICogNDsK KworCWRvX29yX2RpZShkcm1faW50ZWxfYm9fc2V0X3RpbGluZyhibywgJnRpbGluZywgc3RyaWRl KSk7CisKKwlyZXR1cm4gYm87Cit9CisKK3N0YXRpYyBkcm1faW50ZWxfYm8gKgorZ3R0X2NyZWF0 ZV9ibyhkcm1faW50ZWxfYnVmbWdyICpidWZtZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sK KwlyZXR1cm4gbWFwX2JvKHVubWFwcGVkX2NyZWF0ZV9ibyhidWZtZ3IsIHdpZHRoLCBoZWlnaHQp KTsKK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitndHRYX2NyZWF0ZV9ibyhkcm1faW50ZWxf YnVmbWdyICpidWZtZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlyZXR1cm4gdGlsZV9i byhndHRfY3JlYXRlX2JvKGJ1Zm1nciwgd2lkdGgsIGhlaWdodCksIHdpZHRoKTsKK30KKworc3Rh dGljIGRybV9pbnRlbF9ibyAqCit3Y19jcmVhdGVfYm8oZHJtX2ludGVsX2J1Zm1nciAqYnVmbWdy LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisJZHJtX2ludGVsX2JvICpibzsKKworCWdlbV9y ZXF1aXJlX21tYXBfd2MoZmQpOworCisJYm8gPSB1bm1hcHBlZF9jcmVhdGVfYm8oYnVmbWdyLCB3 aWR0aCwgaGVpZ2h0KTsKKwliby0+dmlydHVhbCA9IF9fZ2VtX21tYXBfX3djKGZkLCBiby0+aGFu ZGxlLCAwLCBiby0+c2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisJcmV0dXJuIGJvOwor fQorCitzdGF0aWMgdm9pZAord2NfcmVsZWFzZV9ibyhkcm1faW50ZWxfYm8gKmJvKQoreworCW11 bm1hcChiby0+dmlydHVhbCwgYm8tPnNpemUpOworCWJvLT52aXJ0dWFsID0gTlVMTDsKKworCW5v cF9yZWxlYXNlX2JvKGJvKTsKK30KKworc3RhdGljIGRybV9pbnRlbF9ibyAqCitncHVfY3JlYXRl X2JvKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorewor CXJldHVybiB1bm1hcHBlZF9jcmVhdGVfYm8oYnVmbWdyLCB3aWR0aCwgaGVpZ2h0KTsKK30KKwor c3RhdGljIGRybV9pbnRlbF9ibyAqCitncHVYX2NyZWF0ZV9ibyhkcm1faW50ZWxfYnVmbWdyICpi dWZtZ3IsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKwlyZXR1cm4gdGlsZV9ibyhncHVfY3Jl YXRlX2JvKGJ1Zm1nciwgd2lkdGgsIGhlaWdodCksIHdpZHRoKTsKK30KKworc3RhdGljIHZvaWQK K2NwdV9zZXRfYm8oc3RydWN0IGJ1ZmZlcnMgKmIsIGRybV9pbnRlbF9ibyAqYm8sIHVpbnQzMl90 IHZhbCkKK3sKKwlpbnQgc2l6ZSA9IGItPnNpemU7CisJdWludDMyX3QgKnZhZGRyOworCisJZG9f b3JfZGllKGRybV9pbnRlbF9ib19tYXAoYm8sIHRydWUpKTsKKwl2YWRkciA9IGJvLT52aXJ0dWFs OworCXdoaWxlIChzaXplLS0pCisJCSp2YWRkcisrID0gdmFsOworCWRybV9pbnRlbF9ib191bm1h cChibyk7Cit9CisKK3N0YXRpYyB2b2lkCitjcHVfY21wX2JvKHN0cnVjdCBidWZmZXJzICpiLCBk cm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCit7CisJaW50IHNpemUgPSBiLT5zaXplOwor CXVpbnQzMl90ICp2YWRkcjsKKworCWRvX29yX2RpZShkcm1faW50ZWxfYm9fbWFwKGJvLCBmYWxz ZSkpOworCXZhZGRyID0gYm8tPnZpcnR1YWw7CisJd2hpbGUgKHNpemUtLSkKKwkJaWd0X2Fzc2Vy dF9lcV91MzIoKnZhZGRyKyssIHZhbCk7CisJZHJtX2ludGVsX2JvX3VubWFwKGJvKTsKK30KKwor c3RhdGljIHZvaWQKK2dwdV9zZXRfYm8oc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsIGRybV9pbnRl bF9ibyAqYm8sIHVpbnQzMl90IHZhbCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlbG9jYXRp b25fZW50cnkgcmVsb2NbMV07CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgZ2Vt X2V4ZWNbMl07CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmOworCXVp bnQzMl90IGJ1ZlsxMF0sICpiOworCXVpbnQzMl90IHRpbGluZywgc3dpenpsZTsKKworCWRybV9p bnRlbF9ib19nZXRfdGlsaW5nKGJvLCAmdGlsaW5nLCAmc3dpenpsZSk7CisKKwltZW1zZXQocmVs b2MsIDAsIHNpemVvZihyZWxvYykpOworCW1lbXNldChnZW1fZXhlYywgMCwgc2l6ZW9mKGdlbV9l eGVjKSk7CisJbWVtc2V0KCZleGVjYnVmLCAwLCBzaXplb2YoZXhlY2J1ZikpOworCisJYiA9IGJ1 ZjsKKwkqYisrID0gWFlfQ09MT1JfQkxUX0NNRF9OT0xFTiB8CisJCSgoZ2VuID49IDgpID8gNSA6 IDQpIHwKKwkJQ09MT1JfQkxUX1dSSVRFX0FMUEhBIHwgWFlfQ09MT1JfQkxUX1dSSVRFX1JHQjsK KwlpZiAoZ2VuID49IDQgJiYgdGlsaW5nKSB7CisJCWJbLTFdIHw9IFhZX0NPTE9SX0JMVF9USUxF RDsKKwkJKmIgPSBidWZmZXJzLT53aWR0aDsKKwl9IGVsc2UKKwkJKmIgPSBidWZmZXJzLT53aWR0 aCA8PCAyOworCSpiKysgfD0gMHhmMCA8PCAxNiB8IDEgPDwgMjUgfCAxIDw8IDI0OworCSpiKysg PSAwOworCSpiKysgPSBidWZmZXJzLT5oZWlnaHQgPDwgMTYgfCBidWZmZXJzLT53aWR0aDsKKwly ZWxvY1swXS5vZmZzZXQgPSAoYiAtIGJ1ZikgKiBzaXplb2YodWludDMyX3QpOworCXJlbG9jWzBd LnRhcmdldF9oYW5kbGUgPSBiby0+aGFuZGxlOworCXJlbG9jWzBdLnJlYWRfZG9tYWlucyA9IEk5 MTVfR0VNX0RPTUFJTl9SRU5ERVI7CisJcmVsb2NbMF0ud3JpdGVfZG9tYWluID0gSTkxNV9HRU1f RE9NQUlOX1JFTkRFUjsKKwkqYisrID0gMDsKKwlpZiAoZ2VuID49IDgpCisJCSpiKysgPSAwOwor CSpiKysgPSB2YWw7CisJKmIrKyA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisJaWYgKChiIC0gYnVm KSAmIDEpCisJCSpiKysgPSAwOworCisJZ2VtX2V4ZWNbMF0uaGFuZGxlID0gYm8tPmhhbmRsZTsK KwlnZW1fZXhlY1swXS5mbGFncyA9IEVYRUNfT0JKRUNUX05FRURTX0ZFTkNFOworCisJZ2VtX2V4 ZWNbMV0uaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgNDA5Nik7CisJZ2VtX2V4ZWNbMV0ucmVsb2Nh dGlvbl9jb3VudCA9IDE7CisJZ2VtX2V4ZWNbMV0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpcmVs b2M7CisKKwlleGVjYnVmLmJ1ZmZlcnNfcHRyID0gKHVpbnRwdHJfdClnZW1fZXhlYzsKKwlleGVj YnVmLmJ1ZmZlcl9jb3VudCA9IDI7CisJZXhlY2J1Zi5iYXRjaF9sZW4gPSAoYiAtIGJ1ZikgKiBz aXplb2YoYnVmWzBdKTsKKwlpZiAoZ2VuID49IDYpCisJCWV4ZWNidWYuZmxhZ3MgPSBJOTE1X0VY RUNfQkxUOworCisJZ2VtX3dyaXRlKGZkLCBnZW1fZXhlY1sxXS5oYW5kbGUsIDAsIGJ1ZiwgZXhl Y2J1Zi5iYXRjaF9sZW4pOworCWdlbV9leGVjYnVmKGZkLCAmZXhlY2J1Zik7CisKKwlnZW1fY2xv c2UoZmQsIGdlbV9leGVjWzFdLmhhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkCitncHVfY21wX2Jv KHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpCit7CisJ Ymx0X2NvcHlfYm8oYiwgYi0+c25vb3AsIGJvKTsKKwljcHVfY21wX2JvKGIsIGItPnNub29wLCB2 YWwpOworfQorCitjb25zdCBzdHJ1Y3QgYWNjZXNzX21vZGUgeworCWNvbnN0IGNoYXIgKm5hbWU7 CisJYm9vbCAoKnJlcXVpcmUpKHZvaWQpOworCXZvaWQgKCpzZXRfYm8pKHN0cnVjdCBidWZmZXJz ICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpOworCXZvaWQgKCpjbXBfYm8pKHN0 cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmJvLCB1aW50MzJfdCB2YWwpOworCWRybV9p bnRlbF9ibyAqKCpjcmVhdGVfYm8pKGRybV9pbnRlbF9idWZtZ3IgKmJ1Zm1nciwgaW50IHdpZHRo LCBpbnQgaGVpZ2h0KTsKKwl2b2lkICgqcmVsZWFzZV9ibykoZHJtX2ludGVsX2JvICpibyk7Cit9 IGFjY2Vzc19tb2Rlc1tdID0geworCXsKKwkJLm5hbWUgPSAicHJ3IiwKKwkJLnNldF9ibyA9IHBy d19zZXRfYm8sCisJCS5jbXBfYm8gPSBwcndfY21wX2JvLAorCQkuY3JlYXRlX2JvID0gdW5tYXBw ZWRfY3JlYXRlX2JvLAorCQkucmVsZWFzZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAorCX0sCisJewor CQkubmFtZSA9ICJwYXJ0aWFsIiwKKwkJLnNldF9ibyA9IHBhcnRpYWxfc2V0X2JvLAorCQkuY21w X2JvID0gcGFydGlhbF9jbXBfYm8sCisJCS5jcmVhdGVfYm8gPSB1bm1hcHBlZF9jcmVhdGVfYm8s CisJCS5yZWxlYXNlX2JvID0gbm9wX3JlbGVhc2VfYm8sCisJfSwKKwl7CisJCS5uYW1lID0gImNw dSIsCisJCS5yZXF1aXJlID0gY3JlYXRlX2NwdV9yZXF1aXJlLAorCQkuc2V0X2JvID0gY3B1X3Nl dF9ibywKKwkJLmNtcF9ibyA9IGNwdV9jbXBfYm8sCisJCS5jcmVhdGVfYm8gPSB1bm1hcHBlZF9j cmVhdGVfYm8sCisJCS5yZWxlYXNlX2JvID0gbm9wX3JlbGVhc2VfYm8sCisJfSwKKwl7CisJCS5u YW1lID0gInNub29wIiwKKwkJLnJlcXVpcmUgPSBjcmVhdGVfc25vb3BfcmVxdWlyZSwKKwkJLnNl dF9ibyA9IGNwdV9zZXRfYm8sCisJCS5jbXBfYm8gPSBjcHVfY21wX2JvLAorCQkuY3JlYXRlX2Jv ID0gc25vb3BfY3JlYXRlX2JvLAorCQkucmVsZWFzZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAorCX0s CisJeworCQkubmFtZSA9ICJ1c2VycHRyIiwKKwkJLnJlcXVpcmUgPSBjcmVhdGVfdXNlcnB0cl9y ZXF1aXJlLAorCQkuc2V0X2JvID0gdXNlcnB0cl9zZXRfYm8sCisJCS5jbXBfYm8gPSB1c2VycHRy X2NtcF9ibywKKwkJLmNyZWF0ZV9ibyA9IHVzZXJwdHJfY3JlYXRlX2JvLAorCQkucmVsZWFzZV9i byA9IHVzZXJwdHJfcmVsZWFzZV9ibywKKwl9LAorCXsKKwkJLm5hbWUgPSAiZ3R0IiwKKwkJLnNl dF9ibyA9IGd0dF9zZXRfYm8sCisJCS5jbXBfYm8gPSBndHRfY21wX2JvLAorCQkuY3JlYXRlX2Jv ID0gZ3R0X2NyZWF0ZV9ibywKKwkJLnJlbGVhc2VfYm8gPSBub3BfcmVsZWFzZV9ibywKKwl9LAor CXsKKwkJLm5hbWUgPSAiZ3R0WCIsCisJCS5zZXRfYm8gPSBndHRfc2V0X2JvLAorCQkuY21wX2Jv ID0gZ3R0X2NtcF9ibywKKwkJLmNyZWF0ZV9ibyA9IGd0dFhfY3JlYXRlX2JvLAorCQkucmVsZWFz ZV9ibyA9IG5vcF9yZWxlYXNlX2JvLAorCX0sCisJeworCQkubmFtZSA9ICJ3YyIsCisJCS5zZXRf Ym8gPSBndHRfc2V0X2JvLAorCQkuY21wX2JvID0gZ3R0X2NtcF9ibywKKwkJLmNyZWF0ZV9ibyA9 IHdjX2NyZWF0ZV9ibywKKwkJLnJlbGVhc2VfYm8gPSB3Y19yZWxlYXNlX2JvLAorCX0sCisJewor CQkubmFtZSA9ICJncHUiLAorCQkuc2V0X2JvID0gZ3B1X3NldF9ibywKKwkJLmNtcF9ibyA9IGdw dV9jbXBfYm8sCisJCS5jcmVhdGVfYm8gPSBncHVfY3JlYXRlX2JvLAorCQkucmVsZWFzZV9ibyA9 IG5vcF9yZWxlYXNlX2JvLAorCX0sCisJeworCQkubmFtZSA9ICJncHVYIiwKKwkJLnNldF9ibyA9 IGdwdV9zZXRfYm8sCisJCS5jbXBfYm8gPSBncHVfY21wX2JvLAorCQkuY3JlYXRlX2JvID0gZ3B1 WF9jcmVhdGVfYm8sCisJCS5yZWxlYXNlX2JvID0gbm9wX3JlbGVhc2VfYm8sCisJfSwKK307CisK K2ludCBudW1fYnVmZmVyczsKK2lndF9yZW5kZXJfY29weWZ1bmNfdCByZW5kZXJjb3B5OworCitz dGF0aWMgdm9pZCAqYnVmZmVyc19pbml0KHN0cnVjdCBidWZmZXJzICpkYXRhLAorCQkJICBjb25z dCBzdHJ1Y3QgYWNjZXNzX21vZGUgKm1vZGUsCisJCQkgIGludCB3aWR0aCwgaW50IGhlaWdodCwK KwkJCSAgaW50IF9mZCwgaW50IGVuYWJsZV9yZXVzZSkKK3sKKwlkYXRhLT5tb2RlID0gbW9kZTsK KwlkYXRhLT5jb3VudCA9IDA7CisKKwlkYXRhLT53aWR0aCA9IHdpZHRoOworCWRhdGEtPmhlaWdo dCA9IGhlaWdodDsKKwlkYXRhLT5zaXplID0gd2lkdGggKiBoZWlnaHQ7CisJZGF0YS0+dG1wID0g bWFsbG9jKDQqZGF0YS0+c2l6ZSk7CisJaWd0X2Fzc2VydChkYXRhLT50bXApOworCisJZGF0YS0+ YnVmbWdyID0gZHJtX2ludGVsX2J1Zm1ncl9nZW1faW5pdChfZmQsIDQwOTYpOworCWlndF9hc3Nl cnQoZGF0YS0+YnVmbWdyKTsKKworCWRhdGEtPnNyYyA9IG1hbGxvYygyKnNpemVvZihkcm1faW50 ZWxfYm8gKikqbnVtX2J1ZmZlcnMpOworCWlndF9hc3NlcnQoZGF0YS0+c3JjKTsKKwlkYXRhLT5k c3QgPSBkYXRhLT5zcmMgKyBudW1fYnVmZmVyczsKKworCWlmIChlbmFibGVfcmV1c2UpCisJCWRy bV9pbnRlbF9idWZtZ3JfZ2VtX2VuYWJsZV9yZXVzZShkYXRhLT5idWZtZ3IpOworCXJldHVybiBp bnRlbF9iYXRjaGJ1ZmZlcl9hbGxvYyhkYXRhLT5idWZtZ3IsIGRldmlkKTsKK30KKworc3RhdGlj IHZvaWQgYnVmZmVyc19kZXN0cm95KHN0cnVjdCBidWZmZXJzICpkYXRhKQoreworCWlmIChkYXRh LT5jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEtPmNv dW50OyBpKyspIHsKKwkJZGF0YS0+bW9kZS0+cmVsZWFzZV9ibyhkYXRhLT5zcmNbaV0pOworCQlk YXRhLT5tb2RlLT5yZWxlYXNlX2JvKGRhdGEtPmRzdFtpXSk7CisJfQorCWRhdGEtPm1vZGUtPnJl bGVhc2VfYm8oZGF0YS0+c25vb3ApOworCWRhdGEtPm1vZGUtPnJlbGVhc2VfYm8oZGF0YS0+c3Bh cmUpOworCWRhdGEtPmNvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyc19jcmVhdGUo c3RydWN0IGJ1ZmZlcnMgKmRhdGEsCisJCQkgICBpbnQgY291bnQpCit7CisJaW50IHdpZHRoID0g ZGF0YS0+d2lkdGgsIGhlaWdodCA9IGRhdGEtPmhlaWdodDsKKwlpZ3RfYXNzZXJ0KGRhdGEtPmJ1 Zm1ncik7CisKKwlidWZmZXJzX2Rlc3Ryb3koZGF0YSk7CisKKwlmb3IgKGludCBpID0gMDsgaSA8 IGNvdW50OyBpKyspIHsKKwkJZGF0YS0+c3JjW2ldID0KKwkJCWRhdGEtPm1vZGUtPmNyZWF0ZV9i byhkYXRhLT5idWZtZ3IsIHdpZHRoLCBoZWlnaHQpOworCQlkYXRhLT5kc3RbaV0gPQorCQkJZGF0 YS0+bW9kZS0+Y3JlYXRlX2JvKGRhdGEtPmJ1Zm1nciwgd2lkdGgsIGhlaWdodCk7CisJfQorCWRh dGEtPnNwYXJlID0gZGF0YS0+bW9kZS0+Y3JlYXRlX2JvKGRhdGEtPmJ1Zm1nciwgd2lkdGgsIGhl aWdodCk7CisJZGF0YS0+c25vb3AgPSBzbm9vcF9jcmVhdGVfYm8oZGF0YS0+YnVmbWdyLCB3aWR0 aCwgaGVpZ2h0KTsKKwlkYXRhLT5jb3VudCA9IGNvdW50OworfQorCitzdGF0aWMgdm9pZCBidWZm ZXJzX2Zpbmkoc3RydWN0IGJ1ZmZlcnMgKmRhdGEpCit7CisJaWYgKGRhdGEtPmJ1Zm1nciA9PSBO VUxMKQorCQlyZXR1cm47CisKKwlidWZmZXJzX2Rlc3Ryb3koZGF0YSk7CisKKwlmcmVlKGRhdGEt PnRtcCk7CisJZnJlZShkYXRhLT5zcmMpOworCWRhdGEtPnNyYyA9IE5VTEw7CisJZGF0YS0+ZHN0 ID0gTlVMTDsKKworCWludGVsX2JhdGNoYnVmZmVyX2ZyZWUoYmF0Y2gpOworCWRybV9pbnRlbF9i dWZtZ3JfZGVzdHJveShkYXRhLT5idWZtZ3IpOworCWRhdGEtPmJ1Zm1nciA9IE5VTEw7Cit9CisK K3R5cGVkZWYgdm9pZCAoKmRvX2NvcHkpKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8g KmRzdCwgZHJtX2ludGVsX2JvICpzcmMpOwordHlwZWRlZiBzdHJ1Y3QgaWd0X2hhbmdfcmluZyAo KmRvX2hhbmcpKHZvaWQpOworCitzdGF0aWMgdm9pZCByZW5kZXJfY29weV9ibyhzdHJ1Y3QgYnVm ZmVycyAqYiwgZHJtX2ludGVsX2JvICpkc3QsIGRybV9pbnRlbF9ibyAqc3JjKQoreworCXN0cnVj dCBpZ3RfYnVmIGQgPSB7CisJCS5ibyA9IGRzdCwKKwkJLnNpemUgPSBiLT5zaXplICogNCwKKwkJ Lm51bV90aWxlcyA9IGItPnNpemUgKiA0LAorCQkuc3RyaWRlID0gYi0+d2lkdGggKiA0LAorCX0s IHMgPSB7CisJCS5ibyA9IHNyYywKKwkJLnNpemUgPSBiLT5zaXplICogNCwKKwkJLm51bV90aWxl cyA9IGItPnNpemUgKiA0LAorCQkuc3RyaWRlID0gYi0+d2lkdGggKiA0LAorCX07CisJdWludDMy X3Qgc3dpenpsZTsKKworCWRybV9pbnRlbF9ib19nZXRfdGlsaW5nKGRzdCwgJmQudGlsaW5nLCAm c3dpenpsZSk7CisJZHJtX2ludGVsX2JvX2dldF90aWxpbmcoc3JjLCAmcy50aWxpbmcsICZzd2l6 emxlKTsKKworCXJlbmRlcmNvcHkoYmF0Y2gsIE5VTEwsCisJCSAgICZzLCAwLCAwLAorCQkgICBi LT53aWR0aCwgYi0+aGVpZ2h0LAorCQkgICAmZCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJs dF9jb3B5X2JvKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmRzdCwgZHJtX2ludGVs X2JvICpzcmMpCit7CisJaW50ZWxfYmx0X2NvcHkoYmF0Y2gsCisJCSAgICAgICBzcmMsIDAsIDAs IDQqYi0+d2lkdGgsCisJCSAgICAgICBkc3QsIDAsIDAsIDQqYi0+d2lkdGgsCisJCSAgICAgICBi LT53aWR0aCwgYi0+aGVpZ2h0LCAzMik7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9jb3B5X2JvKHN0 cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmRzdCwgZHJtX2ludGVsX2JvICpzcmMpCit7 CisJY29uc3QgaW50IHNpemUgPSBiLT5zaXplICogc2l6ZW9mKHVpbnQzMl90KTsKKwl2b2lkICpk LCAqczsKKworCWdlbV9zZXRfZG9tYWluKGZkLCBzcmMtPmhhbmRsZSwgSTkxNV9HRU1fRE9NQUlO X0NQVSwgMCk7CisJZ2VtX3NldF9kb21haW4oZmQsIGRzdC0+aGFuZGxlLCBJOTE1X0dFTV9ET01B SU5fQ1BVLCBJOTE1X0dFTV9ET01BSU5fQ1BVKTsKKwlzID0gZ2VtX21tYXBfX2NwdShmZCwgc3Jj LT5oYW5kbGUsIDAsIHNpemUsIFBST1RfUkVBRCk7CisJZCA9IGdlbV9tbWFwX19jcHUoZmQsIGRz dC0+aGFuZGxlLCAwLCBzaXplLCBQUk9UX1dSSVRFKTsKKworCW1lbWNweShkLCBzLCBzaXplKTsK KworCW11bm1hcChkLCBzaXplKTsKKwltdW5tYXAocywgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lk IGd0dF9jb3B5X2JvKHN0cnVjdCBidWZmZXJzICpiLCBkcm1faW50ZWxfYm8gKmRzdCwgZHJtX2lu dGVsX2JvICpzcmMpCit7CisJY29uc3QgaW50IHNpemUgPSBiLT5zaXplICogc2l6ZW9mKHVpbnQz Ml90KTsKKwl2b2lkICpkLCAqczsKKworCWdlbV9zZXRfZG9tYWluKGZkLCBzcmMtPmhhbmRsZSwg STkxNV9HRU1fRE9NQUlOX0dUVCwgMCk7CisJZ2VtX3NldF9kb21haW4oZmQsIGRzdC0+aGFuZGxl LCBJOTE1X0dFTV9ET01BSU5fR1RULCBJOTE1X0dFTV9ET01BSU5fR1RUKTsKKworCXMgPSBnZW1f bW1hcF9fZ3R0KGZkLCBzcmMtPmhhbmRsZSwgc2l6ZSwgUFJPVF9SRUFEKTsKKwlkID0gZ2VtX21t YXBfX2d0dChmZCwgZHN0LT5oYW5kbGUsIHNpemUsIFBST1RfV1JJVEUpOworCisJbWVtY3B5KGQs IHMsIHNpemUpOworCisJbXVubWFwKGQsIHNpemUpOworCW11bm1hcChzLCBzaXplKTsKK30KKwor c3RhdGljIHZvaWQgd2NfY29weV9ibyhzdHJ1Y3QgYnVmZmVycyAqYiwgZHJtX2ludGVsX2JvICpk c3QsIGRybV9pbnRlbF9ibyAqc3JjKQoreworCWNvbnN0IGludCBzaXplID0gYi0+d2lkdGggKiBz aXplb2YodWludDMyX3QpOworCXZvaWQgKmQsICpzOworCisJZ2VtX3NldF9kb21haW4oZmQsIHNy Yy0+aGFuZGxlLCBJOTE1X0dFTV9ET01BSU5fR1RULCAwKTsKKwlnZW1fc2V0X2RvbWFpbihmZCwg ZHN0LT5oYW5kbGUsIEk5MTVfR0VNX0RPTUFJTl9HVFQsIEk5MTVfR0VNX0RPTUFJTl9HVFQpOwor CisJcyA9IGdlbV9tbWFwX193YyhmZCwgc3JjLT5oYW5kbGUsIDAsIHNpemUsIFBST1RfUkVBRCk7 CisJZCA9IGdlbV9tbWFwX193YyhmZCwgZHN0LT5oYW5kbGUsIDAsIHNpemUsIFBST1RfV1JJVEUp OworCisJbWVtY3B5KGQsIHMsIHNpemUpOworCisJbXVubWFwKGQsIHNpemUpOworCW11bm1hcChz LCBzaXplKTsKK30KKworc3RhdGljIHN0cnVjdCBpZ3RfaGFuZ19yaW5nIG5vX2hhbmcodm9pZCkK K3sKKwlyZXR1cm4gKHN0cnVjdCBpZ3RfaGFuZ19yaW5nKXswLCAwfTsKK30KKworc3RhdGljIHN0 cnVjdCBpZ3RfaGFuZ19yaW5nIGJjc19oYW5nKHZvaWQpCit7CisJcmV0dXJuIGlndF9oYW5nX3Jp bmcoZmQsIEk5MTVfRVhFQ19CTFQpOworfQorCitzdGF0aWMgc3RydWN0IGlndF9oYW5nX3Jpbmcg cmNzX2hhbmcodm9pZCkKK3sKKwlyZXR1cm4gaWd0X2hhbmdfcmluZyhmZCwgSTkxNV9FWEVDX1JF TkRFUik7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Jhc2ljMChzdHJ1Y3QgYnVmZmVycyAqYnVmZmVy cywKKwkJICAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCSAgICAgIGRvX2hhbmcgZG9faGFu Z19mdW5jKQoreworCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKKworCWJ1ZmZlcnMtPm1vZGUtPnNl dF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbMF0sIDB4ZGVhZGJlZWYpOworCWZvciAoaW50IGkg PSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgaWd0X2hhbmdfcmluZyBo YW5nID0gZG9faGFuZ19mdW5jKCk7CisKKwkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMt PmRzdFtpXSwgYnVmZmVycy0+c3JjWzBdKTsKKwkJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhkZWFkYmVlZik7CisKKwkJaWd0X3Bvc3RfaGFuZ19yaW5n KGZkLCBoYW5nKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Jhc2ljMShzdHJ1Y3QgYnVmZmVy cyAqYnVmZmVycywKKwkJICAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCSAgICAgIGRvX2hh bmcgZG9faGFuZ19mdW5jKQoreworCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKKworCWZvciAoaW50 IGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgaWd0X2hhbmdfcmlu ZyBoYW5nID0gZG9faGFuZ19mdW5jKCk7CisKKwkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPnNyY1tpXSwgaSk7CisJCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJz LCBidWZmZXJzLT5kc3RbaV0sIH5pKTsKKworCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVy cy0+ZHN0W2ldLCBidWZmZXJzLT5zcmNbaV0pOworCQl1c2xlZXAoMCk7IC8qIGxldCBzb21lb25l IGVsc2UgY2xhaW0gdGhlIG11dGV4ICovCisJCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhidWZmZXJz LCBidWZmZXJzLT5kc3RbaV0sIGkpOworCisJCWlndF9wb3N0X2hhbmdfcmluZyhmZCwgaGFuZyk7 CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19iYXNpY04oc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMs CisJCSAgICAgIGRvX2NvcHkgZG9fY29weV9mdW5jLAorCQkgICAgICBkb19oYW5nIGRvX2hhbmdf ZnVuYykKK3sKKwlzdHJ1Y3QgaWd0X2hhbmdfcmluZyBoYW5nOworCisJZ2VtX3F1aWVzY2VudF9n cHUoZmQpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKSB7CisJ CWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIGkpOworCQli dWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCB+aSk7CisJfQor CisJaGFuZyA9IGRvX2hhbmdfZnVuYygpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCBidWZmZXJz LT5jb3VudDsgaSsrKSB7CisJCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0s IGJ1ZmZlcnMtPnNyY1tpXSk7CisJCXVzbGVlcCgwKTsgLyogbGV0IHNvbWVvbmUgZWxzZSBjbGFp bSB0aGUgbXV0ZXggKi8KKwl9CisKKwlmb3IgKGludCBpID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50 OyBpKyspCisJCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0s IGkpOworCisJaWd0X3Bvc3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKK30KKworc3RhdGljIHZvaWQg ZG9fb3ZlcndyaXRlX3NvdXJjZShzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJCQlkb19jb3B5 IGRvX2NvcHlfZnVuYywKKwkJCQlkb19oYW5nIGRvX2hhbmdfZnVuYykKK3sKKwlzdHJ1Y3QgaWd0 X2hhbmdfcmluZyBoYW5nOworCWludCBpOworCisJZ2VtX3F1aWVzY2VudF9ncHUoZmQpOworCWZv ciAoaSA9IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcnMtPm1vZGUtPnNl dF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIGkpOworCQlidWZmZXJzLT5tb2RlLT5zZXRf Ym8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCB+aSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBi dWZmZXJzLT5jb3VudDsgaSsrKQorCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0 W2ldLCBidWZmZXJzLT5zcmNbaV0pOworCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsKKwlmb3IgKGkg PSBidWZmZXJzLT5jb3VudDsgaS0tOyApCisJCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJz LCBidWZmZXJzLT5zcmNbaV0sIDB4ZGVhZGJlZWYpOworCWZvciAoaSA9IDA7IGkgPCBidWZmZXJz LT5jb3VudDsgaSsrKQorCQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVycy0+ ZHN0W2ldLCBpKTsKKwlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQsIGhhbmcpOworfQorCitzdGF0aWMg dm9pZCBkb19vdmVyd3JpdGVfc291cmNlX3JlYWQoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJ CQkJICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCQkgICAgIGRvX2hhbmcgZG9faGFuZ19m dW5jLAorCQkJCSAgICAgaW50IGRvX3JjcykKK3sKKwljb25zdCBpbnQgaGFsZiA9IGJ1ZmZlcnMt PmNvdW50LzI7CisJc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZzsKKwlpbnQgaTsKKworCWdlbV9x dWllc2NlbnRfZ3B1KGZkKTsKKwlmb3IgKGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisJCWJ1ZmZl cnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIGkpOworCQlidWZmZXJz LT5tb2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCB+aSk7CisJCWJ1ZmZlcnMt Pm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaStoYWxmXSwgfmkpOworCX0KKwlm b3IgKGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisJCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZm ZXJzLT5kc3RbaV0sIGJ1ZmZlcnMtPnNyY1tpXSk7CisJCWlmIChkb19yY3MpCisJCQlyZW5kZXJf Y29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaStoYWxmXSwgYnVmZmVycy0+c3JjW2ldKTsK KwkJZWxzZQorCQkJYmx0X2NvcHlfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2kraGFsZl0sIGJ1 ZmZlcnMtPnNyY1tpXSk7CisJfQorCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsKKwlmb3IgKGkgPSBo YWxmOyBpLS07ICkKKwkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPnNy Y1tpXSwgMHhkZWFkYmVlZik7CisJZm9yIChpID0gMDsgaSA8IGhhbGY7IGkrKykgeworCQlidWZm ZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBpKTsKKwkJYnVmZmVy cy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpK2hhbGZdLCBpKTsKKwl9CisJ aWd0X3Bvc3RfaGFuZ19yaW5nKGZkLCBoYW5nKTsKK30KKworc3RhdGljIHZvaWQgZG9fb3Zlcndy aXRlX3NvdXJjZV9yZWFkX2JjcyhzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJCQkJIGRvX2Nv cHkgZG9fY29weV9mdW5jLAorCQkJCQkgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJZG9fb3Zl cndyaXRlX3NvdXJjZV9yZWFkKGJ1ZmZlcnMsIGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jLCAw KTsKK30KKworc3RhdGljIHZvaWQgZG9fb3ZlcndyaXRlX3NvdXJjZV9yZWFkX3JjcyhzdHJ1Y3Qg YnVmZmVycyAqYnVmZmVycywKKwkJCQkJIGRvX2NvcHkgZG9fY29weV9mdW5jLAorCQkJCQkgZG9f aGFuZyBkb19oYW5nX2Z1bmMpCit7CisJZG9fb3ZlcndyaXRlX3NvdXJjZV9yZWFkKGJ1ZmZlcnMs IGRvX2NvcHlfZnVuYywgZG9faGFuZ19mdW5jLCAxKTsKK30KKworc3RhdGljIHZvaWQgZG9fb3Zl cndyaXRlX3NvdXJjZV9fcmV2KHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkJCSAgICAgZG9f Y29weSBkb19jb3B5X2Z1bmMsCisJCQkJICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykKK3sKKwlz dHJ1Y3QgaWd0X2hhbmdfcmluZyBoYW5nOworCWludCBpOworCisJZ2VtX3F1aWVzY2VudF9ncHUo ZmQpOworCWZvciAoaSA9IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKSB7CisJCWJ1ZmZlcnMt Pm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbaV0sIGkpOworCQlidWZmZXJzLT5t b2RlLT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCB+aSk7CisJfQorCWZvciAoaSA9 IDA7IGkgPCBidWZmZXJzLT5jb3VudDsgaSsrKQorCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVm ZmVycy0+ZHN0W2ldLCBidWZmZXJzLT5zcmNbaV0pOworCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsK Kwlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykKKwkJYnVmZmVycy0+bW9kZS0+ c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPnNyY1tpXSwgMHhkZWFkYmVlZik7CisJZm9yIChpID0g YnVmZmVycy0+Y291bnQ7IGktLTsgKQorCQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywg YnVmZmVycy0+ZHN0W2ldLCBpKTsKKwlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQsIGhhbmcpOworfQor CitzdGF0aWMgdm9pZCBkb19vdmVyd3JpdGVfc291cmNlX19vbmUoc3RydWN0IGJ1ZmZlcnMgKmJ1 ZmZlcnMsCisJCQkJICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCQkgICAgIGRvX2hhbmcg ZG9faGFuZ19mdW5jKQoreworCXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7CisKKwlnZW1fcXVp ZXNjZW50X2dwdShmZCk7CisJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMt PnNyY1swXSwgMCk7CisJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRz dFswXSwgfjApOworCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5kc3RbMF0sIGJ1ZmZl cnMtPnNyY1swXSk7CisJaGFuZyA9IGRvX2hhbmdfZnVuYygpOworCWJ1ZmZlcnMtPm1vZGUtPnNl dF9ibyhidWZmZXJzLCBidWZmZXJzLT5zcmNbMF0sIDB4ZGVhZGJlZWYpOworCWJ1ZmZlcnMtPm1v ZGUtPmNtcF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbMF0sIDApOworCWlndF9wb3N0X2hhbmdf cmluZyhmZCwgaGFuZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2ludGVybWl4KHN0cnVjdCBidWZm ZXJzICpidWZmZXJzLAorCQkJZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCQlkb19oYW5nIGRvX2hh bmdfZnVuYywKKwkJCWludCBkb19yY3MpCit7CisJY29uc3QgaW50IGhhbGYgPSBidWZmZXJzLT5j b3VudC8yOworCXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7CisJaW50IGk7CisKKwlnZW1fcXVp ZXNjZW50X2dwdShmZCk7CisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcnMtPmNvdW50OyBpKyspIHsK KwkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPnNyY1tpXSwgMHhkZWFk YmVlZl5+aSk7CisJCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3Rb aV0sIGkpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaGFsZjsgaSsrKSB7CisJCWlmIChkb19yY3Mg PT0gMSB8fCAoZG9fcmNzID09IC0xICYmIGkgJiAxKSkKKwkJCXJlbmRlcl9jb3B5X2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+c3JjW2ldKTsKKwkJZWxzZQorCQkJYmx0X2Nv cHlfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBidWZmZXJzLT5zcmNbaV0pOworCisJCWRv X2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaStoYWxmXSwgYnVmZmVycy0+c3JjW2ld KTsKKworCQlpZiAoZG9fcmNzID09IDEgfHwgKGRvX3JjcyA9PSAtMSAmJiAoaSAmIDEpID09IDAp KQorCQkJcmVuZGVyX2NvcHlfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBidWZmZXJzLT5k c3RbaStoYWxmXSk7CisJCWVsc2UKKwkJCWJsdF9jb3B5X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRz dFtpXSwgYnVmZmVycy0+ZHN0W2kraGFsZl0pOworCisJCWRvX2NvcHlfZnVuYyhidWZmZXJzLCBi dWZmZXJzLT5kc3RbaStoYWxmXSwgYnVmZmVycy0+c3JjW2kraGFsZl0pOworCX0KKwloYW5nID0g ZG9faGFuZ19mdW5jKCk7CisJZm9yIChpID0gMDsgaSA8IDIqaGFsZjsgaSsrKQorCQlidWZmZXJz LT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCAweGRlYWRiZWVmXn5pKTsK KwlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQsIGhhbmcpOworfQorCitzdGF0aWMgdm9pZCBkb19pbnRl cm1peF9yY3Moc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJCQkgICAgZG9fY29weSBkb19jb3B5 X2Z1bmMsCisJCQkgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJZG9faW50ZXJtaXgoYnVm ZmVycywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1bmMsIDEpOworfQorCitzdGF0aWMgdm9pZCBk b19pbnRlcm1peF9iY3Moc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJCQkgICAgZG9fY29weSBk b19jb3B5X2Z1bmMsCisJCQkgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJZG9faW50ZXJt aXgoYnVmZmVycywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1bmMsIDApOworfQorCitzdGF0aWMg dm9pZCBkb19pbnRlcm1peF9ib3RoKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICBk b19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCSAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJ ZG9faW50ZXJtaXgoYnVmZmVycywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1bmMsIC0xKTsKK30K Kworc3RhdGljIHZvaWQgZG9fZWFybHlfcmVhZChzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJ CSAgZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCQkgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQorewor CXN0cnVjdCBpZ3RfaGFuZ19yaW5nIGhhbmc7CisJaW50IGk7CisKKwlnZW1fcXVpZXNjZW50X2dw dShmZCk7CisJZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQorCQlidWZmZXJzLT5tb2Rl LT5zZXRfYm8oYnVmZmVycywgYnVmZmVycy0+c3JjW2ldLCAweGRlYWRiZWVmKTsKKwlmb3IgKGkg PSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7IGkrKykKKwkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1 ZmZlcnMtPmRzdFtpXSwgYnVmZmVycy0+c3JjW2ldKTsKKwloYW5nID0gZG9faGFuZ19mdW5jKCk7 CisJZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQorCQlidWZmZXJzLT5tb2RlLT5jbXBf Ym8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCAweGRlYWRiZWVmKTsKKwlpZ3RfcG9zdF9oYW5n X3JpbmcoZmQsIGhhbmcpOworfQorCitzdGF0aWMgdm9pZCBkb19yZWFkX3JlYWRfYmNzKHN0cnVj dCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCSAg ICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZzsK KwlpbnQgaTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKKwlmb3IgKGkgPSBidWZmZXJzLT5j b3VudDsgaS0tOyApCisJCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5z cmNbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7 IGkrKykgeworCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBidWZmZXJz LT5zcmNbaV0pOworCQlibHRfY29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFyZSwgYnVmZmVy cy0+c3JjW2ldKTsKKwl9CisJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMt PnNwYXJlLCAweGRlYWRiZWVmXihidWZmZXJzLT5jb3VudC0xKSk7CisJaGFuZyA9IGRvX2hhbmdf ZnVuYygpOworCWZvciAoaSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKKwkJYnVmZmVycy0+bW9k ZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhkZWFkYmVlZiBeIGkpOworCWln dF9wb3N0X2hhbmdfcmluZyhmZCwgaGFuZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3dyaXRlX3Jl YWRfYmNzKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICAgZG9fY29weSBkb19jb3B5 X2Z1bmMsCisJCQkgICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykKK3sKKwlzdHJ1Y3QgaWd0X2hh bmdfcmluZyBoYW5nOworCWludCBpOworCisJZ2VtX3F1aWVzY2VudF9ncHUoZmQpOworCWZvciAo aSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKKwkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1ZmZl cnMsIGJ1ZmZlcnMtPnNyY1tpXSwgMHhkZWFkYmVlZiBeIGkpOworCWZvciAoaSA9IDA7IGkgPCBi dWZmZXJzLT5jb3VudDsgaSsrKSB7CisJCWJsdF9jb3B5X2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPnNw YXJlLCBidWZmZXJzLT5zcmNbaV0pOworCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ ZHN0W2ldLCBidWZmZXJzLT5zcGFyZSk7CisJfQorCWhhbmcgPSBkb19oYW5nX2Z1bmMoKTsKKwlm b3IgKGkgPSBidWZmZXJzLT5jb3VudDsgaS0tOyApCisJCWJ1ZmZlcnMtPm1vZGUtPmNtcF9ibyhi dWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKKwlpZ3RfcG9zdF9oYW5n X3JpbmcoZmQsIGhhbmcpOworfQorCitzdGF0aWMgdm9pZCBkb19yZWFkX3JlYWRfcmNzKHN0cnVj dCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCSAg ICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCit7CisJc3RydWN0IGlndF9oYW5nX3JpbmcgaGFuZzsK KwlpbnQgaTsKKworCWdlbV9xdWllc2NlbnRfZ3B1KGZkKTsKKwlmb3IgKGkgPSBidWZmZXJzLT5j b3VudDsgaS0tOyApCisJCWJ1ZmZlcnMtPm1vZGUtPnNldF9ibyhidWZmZXJzLCBidWZmZXJzLT5z cmNbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmZmVycy0+Y291bnQ7 IGkrKykgeworCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCBidWZmZXJz LT5zcmNbaV0pOworCQlyZW5kZXJfY29weV9ibyhidWZmZXJzLCBidWZmZXJzLT5zcGFyZSwgYnVm ZmVycy0+c3JjW2ldKTsKKwl9CisJYnVmZmVycy0+bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZl cnMtPnNwYXJlLCAweGRlYWRiZWVmXihidWZmZXJzLT5jb3VudC0xKSk7CisJaGFuZyA9IGRvX2hh bmdfZnVuYygpOworCWZvciAoaSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKKwkJYnVmZmVycy0+ bW9kZS0+Y21wX2JvKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwgMHhkZWFkYmVlZiBeIGkpOwor CWlndF9wb3N0X2hhbmdfcmluZyhmZCwgaGFuZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3dyaXRl X3JlYWRfcmNzKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICAgZG9fY29weSBkb19j b3B5X2Z1bmMsCisJCQkgICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykKK3sKKwlzdHJ1Y3QgaWd0 X2hhbmdfcmluZyBoYW5nOworCWludCBpOworCisJZ2VtX3F1aWVzY2VudF9ncHUoZmQpOworCWZv ciAoaSA9IGJ1ZmZlcnMtPmNvdW50OyBpLS07ICkKKwkJYnVmZmVycy0+bW9kZS0+c2V0X2JvKGJ1 ZmZlcnMsIGJ1ZmZlcnMtPnNyY1tpXSwgMHhkZWFkYmVlZiBeIGkpOworCWZvciAoaSA9IDA7IGkg PCBidWZmZXJzLT5jb3VudDsgaSsrKSB7CisJCXJlbmRlcl9jb3B5X2JvKGJ1ZmZlcnMsIGJ1ZmZl cnMtPnNwYXJlLCBidWZmZXJzLT5zcmNbaV0pOworCQlkb19jb3B5X2Z1bmMoYnVmZmVycywgYnVm ZmVycy0+ZHN0W2ldLCBidWZmZXJzLT5zcGFyZSk7CisJfQorCWhhbmcgPSBkb19oYW5nX2Z1bmMo KTsKKwlmb3IgKGkgPSBidWZmZXJzLT5jb3VudDsgaS0tOyApCisJCWJ1ZmZlcnMtPm1vZGUtPmNt cF9ibyhidWZmZXJzLCBidWZmZXJzLT5kc3RbaV0sIDB4ZGVhZGJlZWYgXiBpKTsKKwlpZ3RfcG9z dF9oYW5nX3JpbmcoZmQsIGhhbmcpOworfQorCitzdGF0aWMgdm9pZCBkb19ncHVfcmVhZF9hZnRl cl93cml0ZShzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJCQkgICAgZG9fY29weSBkb19jb3B5 X2Z1bmMsCisJCQkJICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQoreworCXN0cnVjdCBpZ3RfaGFu Z19yaW5nIGhhbmc7CisJaW50IGk7CisKKwlnZW1fcXVpZXNjZW50X2dwdShmZCk7CisJZm9yIChp ID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQorCQlidWZmZXJzLT5tb2RlLT5zZXRfYm8oYnVmZmVy cywgYnVmZmVycy0+c3JjW2ldLCAweGFiY2RhYmNkKTsKKwlmb3IgKGkgPSAwOyBpIDwgYnVmZmVy cy0+Y291bnQ7IGkrKykKKwkJZG9fY29weV9mdW5jKGJ1ZmZlcnMsIGJ1ZmZlcnMtPmRzdFtpXSwg YnVmZmVycy0+c3JjW2ldKTsKKwlmb3IgKGkgPSBidWZmZXJzLT5jb3VudDsgaS0tOyApCisJCWRv X2NvcHlfZnVuYyhidWZmZXJzLCBidWZmZXJzLT5zcGFyZSwgYnVmZmVycy0+ZHN0W2ldKTsKKwlo YW5nID0gZG9faGFuZ19mdW5jKCk7CisJZm9yIChpID0gYnVmZmVycy0+Y291bnQ7IGktLTsgKQor CQlidWZmZXJzLT5tb2RlLT5jbXBfYm8oYnVmZmVycywgYnVmZmVycy0+ZHN0W2ldLCAweGFiY2Rh YmNkKTsKKwlpZ3RfcG9zdF9oYW5nX3JpbmcoZmQsIGhhbmcpOworfQorCit0eXBlZGVmIHZvaWQg KCpkb190ZXN0KShzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJCWRvX2NvcHkgZG9fY29weV9m dW5jLAorCQkJZG9faGFuZyBkb19oYW5nX2Z1bmMpOworCit0eXBlZGVmIHZvaWQgKCpydW5fd3Jh cCkoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJCQkgZG9fdGVzdCBkb190ZXN0X2Z1bmMsCisJ CQkgZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCQkgZG9faGFuZyBkb19oYW5nX2Z1bmMpOworCitz dGF0aWMgdm9pZCBydW5fc2luZ2xlKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkgICAgICAg ZG9fdGVzdCBkb190ZXN0X2Z1bmMsCisJCSAgICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJ ICAgICAgIGRvX2hhbmcgZG9faGFuZ19mdW5jKQoreworCWRvX3Rlc3RfZnVuYyhidWZmZXJzLCBk b19jb3B5X2Z1bmMsIGRvX2hhbmdfZnVuYyk7CisJaWd0X2Fzc2VydF9lcShpbnRlbF9kZXRlY3Rf YW5kX2NsZWFyX21pc3NlZF9pbnRlcnJ1cHRzKGZkKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1 bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBidWZmZXJzICpidWZmZXJzLAorCQkJICAgICAgZG9fdGVz dCBkb190ZXN0X2Z1bmMsCisJCQkgICAgICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJCSAgICAg IGRvX2hhbmcgZG9faGFuZ19mdW5jKQoreworCWZvciAocGFzcyA9IDA7IHBhc3MgPCAxMDsgcGFz cysrKQorCQlkb190ZXN0X2Z1bmMoYnVmZmVycywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1bmMp OworCXBhc3MgPSAwOworCWlndF9hc3NlcnRfZXEoaW50ZWxfZGV0ZWN0X2FuZF9jbGVhcl9taXNz ZWRfaW50ZXJydXB0cyhmZCksIDApOworfQorCitzdGF0aWMgdm9pZCBydW5fY2hpbGQoc3RydWN0 IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJCSAgICAgIGRvX3Rlc3QgZG9fdGVzdF9mdW5jLAorCQkgICAg ICBkb19jb3B5IGRvX2NvcHlfZnVuYywKKwkJICAgICAgZG9faGFuZyBkb19oYW5nX2Z1bmMpCisK K3sKKwkvKiBXZSBpbmhlcml0IHRoZSBidWZmZXJzIGZyb20gdGhlIHBhcmVudCwgYnV0IHRoZSBi dWZtZ3IvYmF0Y2gKKwkgKiBuZWVkcyB0byBiZSBsb2NhbCBhcyB0aGUgY2FjaGUgb2YgcmV1c2Fi bGUgaXRzZWxmIHdpbGwgYmUgQ09XZWQsCisJICogbGVhZGluZyB0byB0aGUgY2hpbGQgY2xvc2lu ZyBhbiBvYmplY3Qgd2l0aG91dCB0aGUgcGFyZW50IGtub3dpbmcuCisJICovCisJaWd0X2Zvcmso Y2hpbGQsIDEpCisJCWRvX3Rlc3RfZnVuYyhidWZmZXJzLCBkb19jb3B5X2Z1bmMsIGRvX2hhbmdf ZnVuYyk7CisJaWd0X3dhaXRjaGlsZHJlbigpOworCWlndF9hc3NlcnRfZXEoaW50ZWxfZGV0ZWN0 X2FuZF9jbGVhcl9taXNzZWRfaW50ZXJydXB0cyhmZCksIDApOworfQorCitzdGF0aWMgdm9pZCBf X3J1bl9mb3JrZWQoc3RydWN0IGJ1ZmZlcnMgKmJ1ZmZlcnMsCisJCQkgaW50IG51bV9jaGlsZHJl biwgaW50IGxvb3BzLAorCQkJIGRvX3Rlc3QgZG9fdGVzdF9mdW5jLAorCQkJIGRvX2NvcHkgZG9f Y29weV9mdW5jLAorCQkJIGRvX2hhbmcgZG9faGFuZ19mdW5jKQorCit7CisJY29uc3QgaW50IG9s ZF9udW1fYnVmZmVycyA9IG51bV9idWZmZXJzOworCisJbnVtX2J1ZmZlcnMgLz0gbnVtX2NoaWxk cmVuOworCW51bV9idWZmZXJzICs9IE1JTl9CVUZGRVJTOworCisJaWd0X2ZvcmsoY2hpbGQsIG51 bV9jaGlsZHJlbikgeworCQkvKiByZWNyZWF0ZSBwcm9jZXNzIGxvY2FsIHZhcmlhYmxlcyAqLwor CQlidWZmZXJzLT5jb3VudCA9IDA7CisJCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRF TCk7CisKKwkJYmF0Y2ggPSBidWZmZXJzX2luaXQoYnVmZmVycywgYnVmZmVycy0+bW9kZSwKKwkJ CQkgICAgIGJ1ZmZlcnMtPndpZHRoLCBidWZmZXJzLT5oZWlnaHQsCisJCQkJICAgICBmZCwgdHJ1 ZSk7CisKKwkJYnVmZmVyc19jcmVhdGUoYnVmZmVycywgbnVtX2J1ZmZlcnMpOworCQlmb3IgKHBh c3MgPSAwOyBwYXNzIDwgbG9vcHM7IHBhc3MrKykKKwkJCWRvX3Rlc3RfZnVuYyhidWZmZXJzLCBk b19jb3B5X2Z1bmMsIGRvX2hhbmdfZnVuYyk7CisJCXBhc3MgPSAwOworCisJCWJ1ZmZlcnNfZmlu aShidWZmZXJzKTsKKwl9CisKKwlpZ3Rfd2FpdGNoaWxkcmVuKCk7CisJaWd0X2Fzc2VydF9lcShp bnRlbF9kZXRlY3RfYW5kX2NsZWFyX21pc3NlZF9pbnRlcnJ1cHRzKGZkKSwgMCk7CisKKwludW1f YnVmZmVycyA9IG9sZF9udW1fYnVmZmVyczsKK30KKworc3RhdGljIHZvaWQgcnVuX2ZvcmtlZChz dHJ1Y3QgYnVmZmVycyAqYnVmZmVycywKKwkJICAgICAgIGRvX3Rlc3QgZG9fdGVzdF9mdW5jLAor CQkgICAgICAgZG9fY29weSBkb19jb3B5X2Z1bmMsCisJCSAgICAgICBkb19oYW5nIGRvX2hhbmdf ZnVuYykKK3sKKwlfX3J1bl9mb3JrZWQoYnVmZmVycywgc3lzY29uZihfU0NfTlBST0NFU1NPUlNf T05MTiksIDEwLAorCQkgICAgIGRvX3Rlc3RfZnVuYywgZG9fY29weV9mdW5jLCBkb19oYW5nX2Z1 bmMpOworfQorCitzdGF0aWMgdm9pZCBydW5fYm9tYihzdHJ1Y3QgYnVmZmVycyAqYnVmZmVycywK KwkJICAgICBkb190ZXN0IGRvX3Rlc3RfZnVuYywKKwkJICAgICBkb19jb3B5IGRvX2NvcHlfZnVu YywKKwkJICAgICBkb19oYW5nIGRvX2hhbmdfZnVuYykKK3sKKwlfX3J1bl9mb3JrZWQoYnVmZmVy cywgOCpzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKSwgMTAsCisJCSAgICAgZG9fdGVzdF9m dW5jLCBkb19jb3B5X2Z1bmMsIGRvX2hhbmdfZnVuYyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpdDE3 X3JlcXVpcmUodm9pZCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2dldF90aWxpbmcyIHsKKwkJ dWludDMyX3QgaGFuZGxlOworCQl1aW50MzJfdCB0aWxpbmdfbW9kZTsKKwkJdWludDMyX3Qgc3dp enpsZV9tb2RlOworCQl1aW50MzJfdCBwaHlzX3N3aXp6bGVfbW9kZTsKKwl9IGFyZzsKKyNkZWZp bmUgRFJNX0lPQ1RMX0k5MTVfR0VNX0dFVF9USUxJTkcyCURSTV9JT1dSIChEUk1fQ09NTUFORF9C QVNFICsgRFJNX0k5MTVfR0VNX0dFVF9USUxJTkcsIHN0cnVjdCBkcm1faTkxNV9nZW1fZ2V0X3Rp bGluZzIpCisKKwltZW1zZXQoJmFyZywgMCwgc2l6ZW9mKGFyZykpOworCWFyZy5oYW5kbGUgPSBn ZW1fY3JlYXRlKGZkLCA0MDk2KTsKKwlnZW1fc2V0X3RpbGluZyhmZCwgYXJnLmhhbmRsZSwgSTkx NV9USUxJTkdfWCwgNTEyKTsKKworCWRvX2lvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fR0VU X1RJTElORzIsICZhcmcpOworCWdlbV9jbG9zZShmZCwgYXJnLmhhbmRsZSk7CisJaWd0X3JlcXVp cmUoYXJnLnBoeXNfc3dpenpsZV9tb2RlID09IGFyZy5zd2l6emxlX21vZGUpOworfQorCitzdGF0 aWMgdm9pZCBjcHVfcmVxdWlyZSh2b2lkKQoreworCWJpdDE3X3JlcXVpcmUoKTsKK30KKworc3Rh dGljIHZvaWQgZ3R0X3JlcXVpcmUodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgd2NfcmVxdWly ZSh2b2lkKQoreworCWJpdDE3X3JlcXVpcmUoKTsKKwlnZW1fcmVxdWlyZV9tbWFwX3djKGZkKTsK K30KKworc3RhdGljIHZvaWQgYmNzX3JlcXVpcmUodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQg cmNzX3JlcXVpcmUodm9pZCkKK3sKKwlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKK30KKworc3Rh dGljIHZvaWQKK3J1bl9iYXNpY19tb2Rlcyhjb25zdCBjaGFyICpwcmVmaXgsCisJCWNvbnN0IHN0 cnVjdCBhY2Nlc3NfbW9kZSAqbW9kZSwKKwkJY29uc3QgY2hhciAqc3VmZml4LAorCQlydW5fd3Jh cCBydW5fd3JhcF9mdW5jKQoreworCWNvbnN0IHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKnByZWZp eDsKKwkJZG9fY29weSBjb3B5OworCQl2b2lkICgqcmVxdWlyZSkodm9pZCk7CisJfSBwaXBlbGlu ZXNbXSA9IHsKKwkJeyAiY3B1IiwgY3B1X2NvcHlfYm8sIGNwdV9yZXF1aXJlIH0sCisJCXsgImd0 dCIsIGd0dF9jb3B5X2JvLCBndHRfcmVxdWlyZSB9LAorCQl7ICJ3YyIsIHdjX2NvcHlfYm8sIHdj X3JlcXVpcmUgfSwKKwkJeyAiYmx0IiwgYmx0X2NvcHlfYm8sIGJjc19yZXF1aXJlIH0sCisJCXsg InJlbmRlciIsIHJlbmRlcl9jb3B5X2JvLCByY3NfcmVxdWlyZSB9LAorCQl7IE5VTEwsIE5VTEwg fQorCX0sICpwc2tpcCA9IHBpcGVsaW5lcyArIDMsICpwOworCWNvbnN0IHN0cnVjdCB7CisJCWNv bnN0IGNoYXIgKnN1ZmZpeDsKKwkJZG9faGFuZyBoYW5nOworCX0gaGFuZ3NbXSA9IHsKKwkJeyAi Iiwgbm9faGFuZyB9LAorCQl7ICItaGFuZy1ibHQiLCBiY3NfaGFuZyB9LAorCQl7ICItaGFuZy1y ZW5kZXIiLCByY3NfaGFuZyB9LAorCQl7IE5VTEwsIE5VTEwgfSwKKwl9LCAqaDsKKworCWZvciAo aCA9IGhhbmdzOyBoLT5zdWZmaXg7IGgrKykgeworCQlpZiAoIWFsbCAmJiAqaC0+c3VmZml4KQor CQkJY29udGludWU7CisKKwkJZm9yIChwID0gYWxsID8gcGlwZWxpbmVzIDogcHNraXA7IHAtPnBy ZWZpeDsgcCsrKSB7CisJCQlzdHJ1Y3QgYnVmZmVycyBidWZmZXJzOworCisJCQlpZ3RfZml4dHVy ZQorCQkJCWJhdGNoID0gYnVmZmVyc19pbml0KCZidWZmZXJzLCBtb2RlLAorCQkJCQkJICAgICA1 MTIsIDUxMiwgZmQsCisJCQkJCQkgICAgIHJ1bl93cmFwX2Z1bmMgIT0gcnVuX2NoaWxkKTsKKwor CQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtc2FuaXR5Y2hlY2swJXMlcyIsIHByZWZpeCwgbW9k ZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgeworCQkJCXAtPnJlcXVpcmUo KTsKKwkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOworCQkJCXJ1bl93 cmFwX2Z1bmMoJmJ1ZmZlcnMsIGRvX2Jhc2ljMCwKKwkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFu Zyk7CisJCQl9CisKKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLXNhbml0eWNoZWNrMSVzJXMi LCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKKwkJ CQlwLT5yZXF1aXJlKCk7CisJCQkJYnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJz KTsKKwkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLCBkb19iYXNpYzEsCisJCQkJCSAgICAgIHAt PmNvcHksIGgtPmhhbmcpOworCQkJfQorCisJCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1zYW5p dHljaGVja04lcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+ c3VmZml4KSB7CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJz LCBudW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywgZG9fYmFzaWNOLAor CQkJCQkgICAgICBwLT5jb3B5LCBoLT5oYW5nKTsKKwkJCX0KKworCQkJLyogdHJ5IHRvIG92ZXJ3 cml0ZSB0aGUgc291cmNlIHZhbHVlcyAqLworCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtb3Zl cndyaXRlLXNvdXJjZS1vbmUlcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1 ZmZpeCwgaC0+c3VmZml4KSB7CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWJ1ZmZlcnNfY3JlYXRl KCZidWZmZXJzLCBudW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywKKwkJ CQkJICAgICAgZG9fb3ZlcndyaXRlX3NvdXJjZV9fb25lLAorCQkJCQkgICAgICBwLT5jb3B5LCBo LT5oYW5nKTsKKwkJCX0KKworCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtb3ZlcndyaXRlLXNv dXJjZSVzJXMiLCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZm aXgpIHsKKwkJCQlwLT5yZXF1aXJlKCk7CisJCQkJYnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51 bV9idWZmZXJzKTsKKwkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLAorCQkJCQkgICAgICBkb19v dmVyd3JpdGVfc291cmNlLAorCQkJCQkgICAgICBwLT5jb3B5LCBoLT5oYW5nKTsKKwkJCX0KKwor CQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtb3ZlcndyaXRlLXNvdXJjZS1yZWFkLWJjcyVzJXMi LCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKKwkJ CQlwLT5yZXF1aXJlKCk7CisJCQkJYnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJz KTsKKwkJCQlydW5fd3JhcF9mdW5jKCZidWZmZXJzLAorCQkJCQkgICAgICBkb19vdmVyd3JpdGVf c291cmNlX3JlYWRfYmNzLAorCQkJCQkgICAgICBwLT5jb3B5LCBoLT5oYW5nKTsKKwkJCX0KKwor CQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtb3ZlcndyaXRlLXNvdXJjZS1yZWFkLXJjcyVzJXMi LCBwcmVmaXgsIG1vZGUtPm5hbWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKKwkJ CQlwLT5yZXF1aXJlKCk7CisJCQkJaWd0X3JlcXVpcmUocmVuZGVyY29weSk7CisJCQkJYnVmZmVy c19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKKwkJCQlydW5fd3JhcF9mdW5jKCZidWZm ZXJzLAorCQkJCQkgICAgICBkb19vdmVyd3JpdGVfc291cmNlX3JlYWRfcmNzLAorCQkJCQkgICAg ICBwLT5jb3B5LCBoLT5oYW5nKTsKKwkJCX0KKworCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMt b3ZlcndyaXRlLXNvdXJjZS1yZXYlcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgs IHN1ZmZpeCwgaC0+c3VmZml4KSB7CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWJ1ZmZlcnNfY3Jl YXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywK KwkJCQkJICAgICAgZG9fb3ZlcndyaXRlX3NvdXJjZV9fcmV2LAorCQkJCQkgICAgICBwLT5jb3B5 LCBoLT5oYW5nKTsKKwkJCX0KKworCQkJLyogdHJ5IHRvIGludGVybWl4IGNvcGllcyB3aXRoIEdQ VSBjb3BpZXMqLworCQkJaWd0X3N1YnRlc3RfZigiJXMtJXMtJXMtaW50ZXJtaXgtcmNzJXMlcyIs IHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgeworCQkJ CXAtPnJlcXVpcmUoKTsKKwkJCQlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKKwkJCQlidWZmZXJz X2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOworCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZl cnMsCisJCQkJCSAgICAgIGRvX2ludGVybWl4X3JjcywKKwkJCQkJICAgICAgcC0+Y29weSwgaC0+ aGFuZyk7CisJCQl9CisJCQlpZ3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1pbnRlcm1peC1iY3MlcyVz IiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7CisJ CQkJcC0+cmVxdWlyZSgpOworCQkJCWlndF9yZXF1aXJlKHJlbmRlcmNvcHkpOworCQkJCWJ1ZmZl cnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVm ZmVycywKKwkJCQkJICAgICAgZG9faW50ZXJtaXhfYmNzLAorCQkJCQkgICAgICBwLT5jb3B5LCBo LT5oYW5nKTsKKwkJCX0KKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLWludGVybWl4LWJvdGgl cyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3VmZml4KSB7 CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWlndF9yZXF1aXJlKHJlbmRlcmNvcHkpOworCQkJCWJ1 ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBudW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygm YnVmZmVycywKKwkJCQkJICAgICAgZG9faW50ZXJtaXhfYm90aCwKKwkJCQkJICAgICAgcC0+Y29w eSwgaC0+aGFuZyk7CisJCQl9CisKKwkJCS8qIHRyeSB0byByZWFkIHRoZSByZXN1bHRzIGJlZm9y ZSB0aGUgY29weSBjb21wbGV0ZXMgKi8KKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLWVhcmx5 LXJlYWQlcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3Vm Zml4KSB7CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBu dW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywKKwkJCQkJICAgICAgZG9f ZWFybHlfcmVhZCwKKwkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7CisJCQl9CisKKwkJCS8q IGNvbmN1cnJlbnQgcmVhZHMgKi8KKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLXJlYWQtcmVh ZC1iY3MlcyVzIiwgcHJlZml4LCBtb2RlLT5uYW1lLCBwLT5wcmVmaXgsIHN1ZmZpeCwgaC0+c3Vm Zml4KSB7CisJCQkJcC0+cmVxdWlyZSgpOworCQkJCWJ1ZmZlcnNfY3JlYXRlKCZidWZmZXJzLCBu dW1fYnVmZmVycyk7CisJCQkJcnVuX3dyYXBfZnVuYygmYnVmZmVycywKKwkJCQkJICAgICAgZG9f cmVhZF9yZWFkX2JjcywKKwkJCQkJICAgICAgcC0+Y29weSwgaC0+aGFuZyk7CisJCQl9CisJCQlp Z3Rfc3VidGVzdF9mKCIlcy0lcy0lcy1yZWFkLXJlYWQtcmNzJXMlcyIsIHByZWZpeCwgbW9kZS0+ bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgeworCQkJCXAtPnJlcXVpcmUoKTsK KwkJCQlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKKwkJCQlidWZmZXJzX2NyZWF0ZSgmYnVmZmVy cywgbnVtX2J1ZmZlcnMpOworCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZlcnMsCisJCQkJCSAgICAg IGRvX3JlYWRfcmVhZF9yY3MsCisJCQkJCSAgICAgIHAtPmNvcHksIGgtPmhhbmcpOworCQkJfQor CisJCQkvKiBzcGxpdCBjb3B5aW5nIGJldHdlZW4gcmluZ3MgKi8KKwkJCWlndF9zdWJ0ZXN0X2Yo IiVzLSVzLSVzLXdyaXRlLXJlYWQtYmNzJXMlcyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJl Zml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkgeworCQkJCXAtPnJlcXVpcmUoKTsKKwkJCQlidWZmZXJz X2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOworCQkJCXJ1bl93cmFwX2Z1bmMoJmJ1ZmZl cnMsCisJCQkJCSAgICAgIGRvX3dyaXRlX3JlYWRfYmNzLAorCQkJCQkgICAgICBwLT5jb3B5LCBo LT5oYW5nKTsKKwkJCX0KKwkJCWlndF9zdWJ0ZXN0X2YoIiVzLSVzLSVzLXdyaXRlLXJlYWQtcmNz JXMlcyIsIHByZWZpeCwgbW9kZS0+bmFtZSwgcC0+cHJlZml4LCBzdWZmaXgsIGgtPnN1ZmZpeCkg eworCQkJCXAtPnJlcXVpcmUoKTsKKwkJCQlpZ3RfcmVxdWlyZShyZW5kZXJjb3B5KTsKKwkJCQli dWZmZXJzX2NyZWF0ZSgmYnVmZmVycywgbnVtX2J1ZmZlcnMpOworCQkJCXJ1bl93cmFwX2Z1bmMo JmJ1ZmZlcnMsCisJCQkJCSAgICAgIGRvX3dyaXRlX3JlYWRfcmNzLAorCQkJCQkgICAgICBwLT5j b3B5LCBoLT5oYW5nKTsKKwkJCX0KKworCQkJLyogYW5kIGZpbmFsbHkgdHJ5IHRvIHRyaWNrIHRo ZSBrZXJuZWwgaW50byBsb29zaW5nIHRoZSBwZW5kaW5nIHdyaXRlICovCisJCQlpZ3Rfc3VidGVz dF9mKCIlcy0lcy0lcy1ncHUtcmVhZC1hZnRlci13cml0ZSVzJXMiLCBwcmVmaXgsIG1vZGUtPm5h bWUsIHAtPnByZWZpeCwgc3VmZml4LCBoLT5zdWZmaXgpIHsKKwkJCQlwLT5yZXF1aXJlKCk7CisJ CQkJYnVmZmVyc19jcmVhdGUoJmJ1ZmZlcnMsIG51bV9idWZmZXJzKTsKKwkJCQlydW5fd3JhcF9m dW5jKCZidWZmZXJzLAorCQkJCQkgICAgICBkb19ncHVfcmVhZF9hZnRlcl93cml0ZSwKKwkJCQkJ ICAgICAgcC0+Y29weSwgaC0+aGFuZyk7CisJCQl9CisKKwkJCWlndF9maXh0dXJlCisJCQkJYnVm ZmVyc19maW5pKCZidWZmZXJzKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3J1bl9tb2Rl cyhjb25zdCBjaGFyICpzdHlsZSwgY29uc3Qgc3RydWN0IGFjY2Vzc19tb2RlICptb2RlLCB1bnNp Z25lZCBhbGxvd19tZW0pCit7CisJaWYgKG1vZGUtPnJlcXVpcmUgJiYgIW1vZGUtPnJlcXVpcmUo KSkKKwkJcmV0dXJuOworCisJaWd0X2RlYnVnKCIlczogdXNpbmcgMnglZCBidWZmZXJzLCBlYWNo IDFNaUJcbiIsCisJCQlzdHlsZSwgbnVtX2J1ZmZlcnMpOworCWlmICghX19pbnRlbF9jaGVja19t ZW1vcnkoMipudW1fYnVmZmVycywgMTAyNCoxMDI0LCBhbGxvd19tZW0sCisJCQkJICBOVUxMLCBO VUxMKSkKKwkJcmV0dXJuOworCisJcnVuX2Jhc2ljX21vZGVzKHN0eWxlLCBtb2RlLCAiIiwgcnVu X3NpbmdsZSk7CisJcnVuX2Jhc2ljX21vZGVzKHN0eWxlLCBtb2RlLCAiLWNoaWxkIiwgcnVuX2No aWxkKTsKKwlydW5fYmFzaWNfbW9kZXMoc3R5bGUsIG1vZGUsICItZm9ya2VkIiwgcnVuX2Zvcmtl ZCk7CisKKwlpZ3RfZm9ya19zaWduYWxfaGVscGVyKCk7CisJcnVuX2Jhc2ljX21vZGVzKHN0eWxl LCBtb2RlLCAiLWludGVycnVwdGlibGUiLCBydW5faW50ZXJydXB0aWJsZSk7CisJcnVuX2Jhc2lj X21vZGVzKHN0eWxlLCBtb2RlLCAiLWJvbWIiLCBydW5fYm9tYik7CisJaWd0X3N0b3Bfc2lnbmFs X2hlbHBlcigpOworfQorCitpZ3RfbWFpbgoreworCWNvbnN0IHN0cnVjdCB7CisJCWNvbnN0IGNo YXIgKm5hbWU7CisJCWRybV9pbnRlbF9ibyAqKCpjcmVhdGUpKGRybV9pbnRlbF9idWZtZ3IgKiwg dWludDY0X3Qgc2l6ZSk7CisJCWJvb2wgKCpyZXF1aXJlKSh2b2lkKTsKKwl9IGNyZWF0ZVtdID0g eworCQl7ICIiLCBjcmVhdGVfbm9ybWFsX2JvLCBjYW5fY3JlYXRlX25vcm1hbH0sCisJCXsgInBy aXZhdGUtIiwgY3JlYXRlX3ByaXZhdGVfYm8sIGNhbl9jcmVhdGVfcHJpdmF0ZSB9LAorCQl7ICJz dG9sZW4tIiwgY3JlYXRlX3N0b2xlbl9ibywgY2FuX2NyZWF0ZV9zdG9sZW4gfSwKKwkJeyBOVUxM LCBOVUxMIH0KKwl9LCAqYzsKKwl1aW50NjRfdCBwaW5fc3ogPSAwOworCXZvaWQgKnBpbm5lZCA9 IE5VTEw7CisJaW50IGk7CisKKwlpZ3Rfc2tpcF9vbl9zaW11bGF0aW9uKCk7CisKKwlpZiAoc3Ry c3RyKGlndF90ZXN0X25hbWUoKSwgImFsbCIpKQorCQlhbGwgPSB0cnVlOworCisJaWd0X2ZpeHR1 cmUgeworCQlmZCA9IGRybV9vcGVuX2RyaXZlcihEUklWRVJfSU5URUwpOworCQlpbnRlbF9kZXRl Y3RfYW5kX2NsZWFyX21pc3NlZF9pbnRlcnJ1cHRzKGZkKTsKKwkJZGV2aWQgPSBpbnRlbF9nZXRf ZHJtX2RldmlkKGZkKTsKKwkJZ2VuID0gaW50ZWxfZ2VuKGRldmlkKTsKKwkJcmVuZGVyY29weSA9 IGlndF9nZXRfcmVuZGVyX2NvcHlmdW5jKGRldmlkKTsKKwl9CisKKwlmb3IgKGMgPSBjcmVhdGU7 IGMtPm5hbWU7IGMrKykgeworCQljaGFyIG5hbWVbODBdOworCisJCWNyZWF0ZV9mdW5jID0gYy0+ Y3JlYXRlOworCisJCW51bV9idWZmZXJzID0gTUlOX0JVRkZFUlM7CisJCWlmIChjLT5yZXF1aXJl KCkpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJXMiLCBjLT5uYW1lLCAi dGlueSIpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNjZXNzX21vZGVzKTsgaSsr KQorCQkJCXJ1bl9tb2RlcyhuYW1lLCAmYWNjZXNzX21vZGVzW2ldLCBDSEVDS19SQU0pOworCQl9 CisKKwkJaWd0X2ZpeHR1cmUgeworCQkJbnVtX2J1ZmZlcnMgPSBnZW1fbWFwcGFibGVfYXBlcnR1 cmVfc2l6ZSgpIC8gKDEwMjQgKiAxMDI0KSAvIDQ7CisJCX0KKworCQlpZiAoYy0+cmVxdWlyZSgp KSB7CisJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyVzIiwgYy0+bmFtZSwgInNt YWxsIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhY2Nlc3NfbW9kZXMpOyBpKysp CisJCQkJcnVuX21vZGVzKG5hbWUsICZhY2Nlc3NfbW9kZXNbaV0sIENIRUNLX1JBTSk7CisJCX0K KworCQlpZ3RfZml4dHVyZSB7CisJCQludW1fYnVmZmVycyA9IGdlbV9tYXBwYWJsZV9hcGVydHVy ZV9zaXplKCkgLyAoMTAyNCAqIDEwMjQpOworCQl9CisKKwkJaWYgKGMtPnJlcXVpcmUoKSkgewor CQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlcyIsIGMtPm5hbWUsICJ0aHJhc2gi KTsKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjY2Vzc19tb2Rlcyk7IGkrKykKKwkJ CQlydW5fbW9kZXMobmFtZSwgJmFjY2Vzc19tb2Rlc1tpXSwgQ0hFQ0tfUkFNKTsKKwkJfQorCisJ CWlndF9maXh0dXJlIHsKKwkJCW51bV9idWZmZXJzID0gZ2VtX2FwZXJ0dXJlX3NpemUoZmQpIC8g KDEwMjQgKiAxMDI0KTsKKwkJfQorCisJCWlmIChjLT5yZXF1aXJlKCkpIHsKKwkJCXNucHJpbnRm KG5hbWUsIHNpemVvZihuYW1lKSwgIiVzJXMiLCBjLT5uYW1lLCAiZnVsbCIpOworCQkJZm9yIChp ID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNjZXNzX21vZGVzKTsgaSsrKQorCQkJCXJ1bl9tb2Rlcyhu YW1lLCAmYWNjZXNzX21vZGVzW2ldLCBDSEVDS19SQU0pOworCQl9CisKKwkJaWd0X2ZpeHR1cmUg eworCQkJbnVtX2J1ZmZlcnMgPSBnZW1fbWFwcGFibGVfYXBlcnR1cmVfc2l6ZSgpIC8gKDEwMjQg KiAxMDI0KTsKKwkJCXBpbl9zeiA9IGludGVsX2dldF9hdmFpbF9yYW1fbWIoKSAtIG51bV9idWZm ZXJzOworCisJCQlpZ3RfZGVidWcoIlBpbm5pbmcgJWxkIE1pQlxuIiwgcGluX3N6KTsKKwkJCXBp bl9zeiAqPSAxMDI0ICogMTAyNDsKKworCQkJaWYgKHBvc2l4X21lbWFsaWduKCZwaW5uZWQsIDQw OTYsIHBpbl9zeikgfHwKKwkJCSAgICBtbG9jayhwaW5uZWQsIHBpbl9zeikgfHwKKwkJCSAgICBt YWR2aXNlKHBpbm5lZCwgcGluX3N6LCBNQURWX0RPTlRGT1JLKSkgeworCQkJCWZyZWUocGlubmVk KTsKKwkJCQlwaW5uZWQgPSBOVUxMOworCQkJfQorCQkJaWd0X3JlcXVpcmUocGlubmVkKTsKKwkJ fQorCisJCWlmIChjLT5yZXF1aXJlKCkpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1l KSwgIiVzJXMiLCBjLT5uYW1lLCAic3dhcCIpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUoYWNjZXNzX21vZGVzKTsgaSsrKQorCQkJCXJ1bl9tb2RlcyhuYW1lLCAmYWNjZXNzX21vZGVz W2ldLCBDSEVDS19SQU0gfCBDSEVDS19TV0FQKTsKKwkJfQorCisJCWlndF9maXh0dXJlIHsKKwkJ CWlmIChwaW5uZWQpIHsKKwkJCQltdW5sb2NrKHBpbm5lZCwgcGluX3N6KTsKKwkJCQlmcmVlKHBp bm5lZCk7CisJCQkJcGlubmVkID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KK30KLS0gCjIuNy4wCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZngg bWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK