ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBhNDNkZTQ0Li4yYzUwNjRjIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAKK01vbiBKYW4gMjAgMjM6MjU6MDAgQ0VUIDIwMDMgRGFuaWVsIFZlaWxsYXJkIDxkYW5pZWxAdmVpbGxhcmQuY29tPgorCisJKiB4bWxyZWFkZXIuYyBweXRob24vZHJ2X2xpYnhtbDIucHkgcHl0aG9uL2dlbmVyYXRvci5weQorCSAgcHl0aG9uL2xpYnhtbC5jIHB5dGhvbi9saWJ4bWwucHkgcHl0aG9uL2xpYnhtbF93cmFwLmgKKwkgIHB5dGhvbi90eXBlcy5jOiBwYXRjaCBmcm9tIFN06XBoYW5lIEJpZG91bCBmb3IgYmV0dGVyIHBlcgorCSAgY29udGV4dCBlcnJvciBtZXNzYWdlIEFQSXMKKwkqIHB5dGhvbi90ZXN0cy9jdHh0ZXJyb3IucHkgcHl0aG9uL3Rlc3RzL3JlYWRlcmVyci5weToKKwkgIHVwZGF0ZSBvZiB0aGUgdGVzdHMKKwogU3VuIEphbiAxOSAxNzowOToyOCBNU1QgMjAwMyBKb2huIEZsZWNrIDxqZmxlY2tAaW5rc3RhaW4ubmV0PgogCiAJKiBkb2MvZ3VpZGVsaW5lcy5odG1sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpYnhtbC94bWxyZWFkZXIuaCBiL2luY2x1ZGUvbGlieG1sL3htbHJlYWRlci5oCmluZGV4IDUzMzE0YjEuLmU5NDc1YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlieG1sL3htbHJlYWRlci5oCisrKyBiL2luY2x1ZGUvbGlieG1sL3htbHJlYWRlci5oCkBAIC0yNCwxMSArMjQsMTEgQEAKIH0geG1sUGFyc2VyUHJvcGVydGllczsKIAogdHlwZWRlZiBlbnVtIHsKLSAgICBYTUxSRUFERVJfU0VWRVJJVFlfVkFMSURJVFlfV0FSTklORyA9IDEsCi0gICAgWE1MUkVBREVSX1NFVkVSSVRZX1ZBTElESVRZX0VSUk9SID0gMiwKLSAgICBYTUxSRUFERVJfU0VWRVJJVFlfV0FSTklORyA9IDMsCi0gICAgWE1MUkVBREVSX1NFVkVSSVRZX0VSUk9SID0gNAotfSB4bWxSZWFkZXJTZXZlcml0aWVzOworICAgIFhNTF9QQVJTRVJfU0VWRVJJVFlfVkFMSURJVFlfV0FSTklORyA9IDEsCisgICAgWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9FUlJPUiA9IDIsCisgICAgWE1MX1BBUlNFUl9TRVZFUklUWV9XQVJOSU5HID0gMywKKyAgICBYTUxfUEFSU0VSX1NFVkVSSVRZX0VSUk9SID0gNAorfSB4bWxQYXJzZXJTZXZlcml0aWVzOwogCiB0eXBlZGVmIHN0cnVjdCBfeG1sVGV4dFJlYWRlciB4bWxUZXh0UmVhZGVyOwogdHlwZWRlZiB4bWxUZXh0UmVhZGVyICp4bWxUZXh0UmVhZGVyUHRyOwpAQCAtMTEwLDEyICsxMTAsMTQgQEAKIC8qCiAgKiBFcnJvciBoYW5kbGluZyBleHRlbnNpb25zCiAgKi8KLXR5cGVkZWYgdm9pZCAoKnhtbFRleHRSZWFkZXJFcnJvckZ1bmMpICAgICAgICAgICh2b2lkICphcmcsIAordHlwZWRlZiB2b2lkICogIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyOwordHlwZWRlZiB2b2lkICAgKCp4bWxUZXh0UmVhZGVyRXJyb3JGdW5jKSAgICAgICAgKHZvaWQgKmFyZywgCiAJCQkJCQkgY29uc3QgY2hhciAqbXNnLAotCQkJCQkJIGludCBsaW5lLCAKLQkJCQkJCSBpbnQgY29sLCAKLQkJCQkJCSBjb25zdCBjaGFyICpVUkksIAotCQkJCQkJIHhtbFJlYWRlclNldmVyaXRpZXMgc2V2ZXJpdHkpOworCQkJCQkJIHhtbFBhcnNlclNldmVyaXRpZXMgc2V2ZXJpdHksCisJCQkJCQkgeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcik7CitpbnQgICAgICAgICAgICAgeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyICAoeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcik7CisvKmludCAgICAgICAgICAgICB4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVQb3NpdGlvbih4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yKTsqLworeG1sQ2hhciAqICAgICAgIHhtbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSSAgICAgKHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGxvY2F0b3IpOwogdm9pZCAgICAgICAgICAgIHhtbFRleHRSZWFkZXJTZXRFcnJvckhhbmRsZXIgICAgKHhtbFRleHRSZWFkZXJQdHIgcmVhZGVyLCAKIAkJCQkJCSB4bWxUZXh0UmVhZGVyRXJyb3JGdW5jIGYsIAogCQkJCQkJIHZvaWQgKmFyZyk7CmRpZmYgLS1naXQgYS9weXRob24vZHJ2X2xpYnhtbDIucHkgYi9weXRob24vZHJ2X2xpYnhtbDIucHkKaW5kZXggYzk5NTFlNi4uOTc3Yzg2OCAxMDA2NDQKLS0tIGEvcHl0aG9uL2Rydl9saWJ4bWwyLnB5CisrKyBiL3B5dGhvbi9kcnZfbGlieG1sMi5weQpAQCAtOSwxMCArOSwxMCBAQAogQ0FWRUFUUwogICAgIC0gTGV4aWNhbCBoYW5kbGVycyBhcmUgc3VwcG9ydGVkLCBleGNlcHQgZm9yIHN0YXJ0L2VuZEVudGl0eQogICAgICAgKHdhaXRpbmcgZm9yIFhtbFJlYWRlci5SZXNvbHZlRW50aXR5KSBhbmQgc3RhcnQvZW5kRFRECi0gICAgLSBhcyB1bmRlcnN0YW5kIGl0LCBsaWJ4bWwyIGVycm9yIGhhbmRsZXJzIGFyZSBnbG9iYWxzIChwZXIgdGhyZWFkKTsKLSAgICAgIGVhY2ggY2FsbCB0byBwYXJzZSgpIHJlZ2lzdGVycyBhIG5ldyBlcnJvciBoYW5kbGVyLCAKLSAgICAgIG92ZXJ3cml0aW5nIGFueSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaGFuZGxlciAKLSAgICAgIC0tPiB5b3UgY2FuJ3QgaGF2ZSAyIExpYlhtbDJSZWFkZXIgYWN0aXZlIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAtIEVycm9yIGNhbGxiYWNrcyBhcmUgbm90IGV4YWN0bHkgc3luY2hyb25vdXMsIHRoZXkgdGVuZAorICAgICAgdG8gYmUgaW52b2tlZCBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY29udGVudCBjYWxsYmFjaywKKyAgICAgIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgcmVhZGVyIGludGVyZmFjZSBwYXJzZXMKKyAgICAgIGRhdGEgYnkgY2h1bmtzIG9mIDUxMiBieXRlcwogICAgIAogVE9ETwogICAgIC0gc2VhcmNoIGZvciBUT0RPCkBAIC0zNCw3ICszNCw3IEBACiAiIiIKIAogX19hdXRob3JfXyAgPSB1IlN06XBoYW5lIEJpZG91bCA8c2JpQHNreW5ldC5iZT4iCi1fX3ZlcnNpb25fXyA9ICIwLjIiCitfX3ZlcnNpb25fXyA9ICIwLjMiCiAKIGltcG9ydCBjb2RlY3MKIGltcG9ydCBzeXMKQEAgLTY5LDE1ICs2OSwyNyBAQAogICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgibGlieG1sMiBub3QgYXZhaWxhYmxlOiAiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBlcnJvciB3YXM6ICVzIiAlIGUpCiAKLWRlZiBfcmVnaXN0ZXJFcnJvckhhbmRsZXIoaGFuZGxlcik6Ci0gICAgaWYgbm90IHN5cy5tb2R1bGVzLmhhc19rZXkoJ2xpYnhzbHQnKToKLSAgICAgICAgIyBub3JtYWwgYmVoYXZpb3VyIHdoZW4gbGlieHNsdCBpcyBub3QgaW1wb3J0ZWQKLSAgICAgICAgbGlieG1sMi5yZWdpc3RlckVycm9ySGFuZGxlcihoYW5kbGVyLCJkcnZfbGlieG1sMiIpCi0gICAgZWxzZToKLSAgICAgICAgIyB3aGVuIGxpYnhzbHQgaXMgaW1wb3J0ZWQsIG9uZSBtdXN0Ci0gICAgICAgICMgdXNlIGxpYnhzdCdzIGVycm9yIGhhbmRsZXIgaW5zdGVhZCAoc2VlIGxpYnhtbDIgYnVnIDEwMjE4MSkKLSAgICAgICAgaW1wb3J0IGxpYnhzbHQKLSAgICAgICAgbGlieHNsdC5yZWdpc3RlckVycm9ySGFuZGxlcihoYW5kbGVyLCJkcnZfbGlieG1sMiIpCitjbGFzcyBMb2NhdG9yKHhtbHJlYWRlci5Mb2NhdG9yKToKKyAgICAiIiJTQVggTG9jYXRvciBhZGFwdGVyIGZvciBsaWJ4bWwyLnhtbFRleHRSZWFkZXJMb2NhdG9yIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixsb2NhdG9yKToKKyAgICAgICAgc2VsZi5fX2xvY2F0b3IgPSBsb2NhdG9yCisKKyAgICBkZWYgZ2V0Q29sdW1uTnVtYmVyKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBjdXJyZW50IGV2ZW50IGVuZHMuIgorICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBnZXRMaW5lTnVtYmVyKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgY3VycmVudCBldmVudCBlbmRzLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19sb2NhdG9yLkxpbmVOdW1iZXIoKQorCisgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIgorICAgICAgICByZXR1cm4gc2VsZi5fX2xvY2F0b3IuQmFzZVVSSSgpCiAKIGNsYXNzIExpYlhtbDJSZWFkZXIoeG1scmVhZGVyLlhNTFJlYWRlcik6CiAKQEAgLTk1LDIxICsxMDcsMzAgQEAKICAgICAgICAgIyBlcnJvciBtZXNzYWdlcyBhY2N1bXVsYXRvcgogICAgICAgICBzZWxmLl9fZXJyb3JzID0gTm9uZQogCi0gICAgZGVmIF9lcnJvckhhbmRsZXIoc2VsZixjdHgsc3RyKToKKyAgICBkZWYgX2Vycm9ySGFuZGxlcihzZWxmLGFyZyxtc2csc2V2ZXJpdHksbG9jYXRvcik6CiAgICAgICAgIGlmIHNlbGYuX19lcnJvcnMgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuX19lcnJvcnMgPSBbXQotICAgICAgICBzZWxmLl9fZXJyb3JzLmFwcGVuZChzdHIpCisgICAgICAgIHNlbGYuX19lcnJvcnMuYXBwZW5kKChzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uKG1zZyxOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRvcihsb2NhdG9yKSkpKQogCi0gICAgZGVmIF9yZXBvcnRFcnJvcihzZWxmLGNhbGxiYWNrKToKLSAgICAgICAgIyBUT0RPOiB1c2UgU0FYUGFyc2VFeGNlcHRpb24sIGJ1dCB3ZSBuZWVkIGEgTG9jYXRvciBmb3IgdGhhdAotICAgICAgICAjIFRPRE86IGRpc3Rpbmd1aXNoIHdhcm5pbmdzIGZyb20gZXJyb3JzCi0gICAgICAgIG1zZyA9ICIiLmpvaW4oc2VsZi5fX2Vycm9ycykKKyAgICBkZWYgX3JlcG9ydEVycm9ycyhzZWxmLGZhdGFsKToKKyAgICAgICAgZm9yIHNldmVyaXR5LGV4Y2VwdGlvbiBpbiBzZWxmLl9fZXJyb3JzOgorICAgICAgICAgICAgaWYgc2V2ZXJpdHkgaW4gKGxpYnhtbDIuUEFSU0VSX1NFVkVSSVRZX1ZBTElESVRZX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieG1sMi5QQVJTRVJfU0VWRVJJVFlfV0FSTklORyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIud2FybmluZyhleGNlcHRpb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgd2hlbiBmYXRhbCBpcyBzZXQsIHRoZSBwYXJzZSB3aWxsIHN0b3A7CisgICAgICAgICAgICAgICAgIyB3ZSBjb25zaWRlciB0aGF0IHRoZSBsYXN0IGVycm9yIHJlcG9ydGVkCisgICAgICAgICAgICAgICAgIyBpcyB0aGUgZmF0YWwgb25lLgorICAgICAgICAgICAgICAgIGlmIGZhdGFsIGFuZCBleGNlcHRpb24gaXMgc2VsZi5fX2Vycm9yc1stMV1bMV06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyLmVycm9yKGV4Y2VwdGlvbikKICAgICAgICAgc2VsZi5fX2Vycm9ycyA9IE5vbmUKLSAgICAgICAgY2FsbGJhY2soU0FYRXhjZXB0aW9uKG1zZykpCiAKICAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKICAgICAgICAgc2VsZi5fX3BhcnNpbmcgPSAxCi0gICAgICAgIF9yZWdpc3RlckVycm9ySGFuZGxlcihzZWxmLl9lcnJvckhhbmRsZXIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgcHJlcGFyZSBzb3VyY2UgYW5kIGNyZWF0ZSByZWFkZXIKICAgICAgICAgICAgIGlmIHR5cGUoc291cmNlKSBpbiBTdHJpbmdUeXBlczoKQEAgLTExOCw2ICsxMzksNyBAQAogICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSkKICAgICAgICAgICAgICAgICBpbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoc291cmNlLmdldEJ5dGVTdHJlYW0oKSkKICAgICAgICAgICAgICAgICByZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKHNvdXJjZS5nZXRTeXN0ZW1JZCgpKQorICAgICAgICAgICAgcmVhZGVyLlNldEVycm9ySGFuZGxlcihzZWxmLl9lcnJvckhhbmRsZXIsTm9uZSkKICAgICAgICAgICAgICMgY29uZmlndXJlIHJlYWRlcgogICAgICAgICAgICAgcmVhZGVyLlNldFBhcnNlclByb3AobGlieG1sMi5QQVJTRVJfTE9BRERURCwxKQogICAgICAgICAgICAgcmVhZGVyLlNldFBhcnNlclByb3AobGlieG1sMi5QQVJTRVJfREVGQVVMVEFUVFJTLDEpCkBAIC0xMzcsMjEgKzE1OSwxOCBAQAogICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGVycm9ycwogICAgICAgICAgICAgICAgIGlmIHIgPT0gMToKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX19lcnJvcnMgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uLWZhdGFsIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBvcnRFcnJvcihzZWxmLl9lcnJfaGFuZGxlci5lcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydEVycm9ycygwKQogICAgICAgICAgICAgICAgIGVsaWYgciA9PSAwOgogICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX2Vycm9ycyBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBub24tZmF0YWwgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydEVycm9yKHNlbGYuX2Vycl9oYW5kbGVyLmVycm9yKQotICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwb3J0RXJyb3JzKDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrICMgZW5kIG9mIHBhcnNlCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBmYXRhbCBlcnJvcgogICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX2Vycm9ycyBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwb3J0RXJyb3Ioc2VsZi5fZXJyX2hhbmRsZXIuZmF0YWxFcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydEVycm9ycygxKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIuZmF0YWxFcnJvcihcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FYRXhjZXB0aW9uKCJSZWFkIGZhaWxlZCAobm8gZGV0YWlscyBhdmFpbGFibGUpIikpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJyZWFrICMgZmF0YWwgcGFyc2UgZXJyb3IKICAgICAgICAgICAgICAgICAjIGdldCBub2RlIHR5cGUKICAgICAgICAgICAgICAgICBub2RlVHlwZSA9IHJlYWRlci5Ob2RlVHlwZSgpCiAgICAgICAgICAgICAgICAgIyBFbGVtZW50CkBAIC0xODAsNiArMTk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kKHJlYWRlci5Mb2NhbE5hbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW5hbWVzW2F0dE5hbWVdID0gcW5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1thdHROYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuTW92ZVRvRWxlbWVudCgpCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRFbGVtZW50TlMoIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHROYW1lLGVsdFFOYW1lLGF0dHJpYnV0ZXNOU0ltcGwpIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVhZGVyLklzRW1wdHlFbGVtZW50KCk6CkBAIC0xOTQsNiArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0TmFtZSA9IF9kKHJlYWRlci5OYW1lKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0TmFtZV0gPSBfZChyZWFkZXIuVmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5Nb3ZlVG9FbGVtZW50KCkKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zdGFydEVsZW1lbnQoIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHROYW1lLGF0dHJpYnV0ZXNJbXBsKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVhZGVyLklzRW1wdHlFbGVtZW50KCk6CkBAIC0yNzUsNyArMjk2LDYgQEAKICAgICAgICAgICAgIHJlYWRlci5DbG9zZSgpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLl9fcGFyc2luZyA9IDAKLSAgICAgICAgICAgICMgVE9ETzogdW5yZWdpc3RlciBlcnJvciBoYW5kbGVyPwogCiAgICAgZGVmIHNldERUREhhbmRsZXIoc2VsZiwgaGFuZGxlcik6CiAgICAgICAgICMgVE9ETyAod2hlbiBzdXBwb3J0ZWQsIHRoZSBpbmhlcml0ZWQgbWV0aG9kIHdvcmtzIGp1c3QgZmluZSkKZGlmZiAtLWdpdCBhL3B5dGhvbi9nZW5lcmF0b3IucHkgYi9weXRob24vZ2VuZXJhdG9yLnB5CmluZGV4IGNjMWI0MWIuLjIwZTg5YjcgMTAwNzU1Ci0tLSBhL3B5dGhvbi9nZW5lcmF0b3IucHkKKysrIGIvcHl0aG9uL2dlbmVyYXRvci5weQpAQCAtMjcxLDYgKzI3MSw3IEBACiAgICAgJ3htbE91dHB1dEJ1ZmZlclB0cic6ICgnTycsICJvdXRwdXRCdWZmZXIiLCAieG1sT3V0cHV0QnVmZmVyUHRyIiwgInhtbE91dHB1dEJ1ZmZlclB0ciIpLAogICAgICd4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cic6ICgnTycsICJpbnB1dEJ1ZmZlciIsICJ4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciIsICJ4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciIpLAogICAgICd4bWxSZWdleHBQdHInOiAoJ08nLCAieG1sUmVnIiwgInhtbFJlZ2V4cFB0ciIsICJ4bWxSZWdleHBQdHIiKSwKKyAgICAneG1sVGV4dFJlYWRlckxvY2F0b3JQdHInOiAoJ08nLCAieG1sVGV4dFJlYWRlckxvY2F0b3IiLCAieG1sVGV4dFJlYWRlckxvY2F0b3JQdHIiLCAieG1sVGV4dFJlYWRlckxvY2F0b3JQdHIiKSwKICAgICAneG1sVGV4dFJlYWRlclB0cic6ICgnTycsICJ4bWxUZXh0UmVhZGVyIiwgInhtbFRleHRSZWFkZXJQdHIiLCAieG1sVGV4dFJlYWRlclB0ciIpLAogfQogCkBAIC02MDIsNiArNjAzLDcgQEAKICAgICAieG1sT3V0cHV0QnVmZmVyUHRyIjogKCIuX28iLCAib3V0cHV0QnVmZmVyKF9vYmo9JXMpIiwgIm91dHB1dEJ1ZmZlciIpLAogICAgICJ4bWxQYXJzZXJJbnB1dEJ1ZmZlclB0ciI6ICgiLl9vIiwgImlucHV0QnVmZmVyKF9vYmo9JXMpIiwgImlucHV0QnVmZmVyIiksCiAgICAgInhtbFJlZ2V4cFB0ciI6ICgiLl9vIiwgInhtbFJlZyhfb2JqPSVzKSIsICJ4bWxSZWciKSwKKyAgICAieG1sVGV4dFJlYWRlckxvY2F0b3JQdHIiOiAoIi5fbyIsICJ4bWxUZXh0UmVhZGVyTG9jYXRvcihfb2JqPSVzKSIsICJ4bWxUZXh0UmVhZGVyTG9jYXRvciIpLAogICAgICJ4bWxUZXh0UmVhZGVyUHRyIjogKCIuX28iLCAieG1sVGV4dFJlYWRlcihfb2JqPSVzKSIsICJ4bWxUZXh0UmVhZGVyIiksCiB9CiAKQEAgLTY5MCw2ICs2OTIsOCBAQAogICAgICAgICBmdW5jID0gInJlZ2V4cCIgKyBuYW1lWzk6XQogICAgIGVsaWYgbmFtZVswOjZdID09ICJ4bWxSZWciIGFuZCBmaWxlID09ICJ4bWxyZWdleHAiOgogICAgICAgICBmdW5jID0gInJlZ2V4cCIgKyBuYW1lWzY6XQorICAgIGVsaWYgbmFtZVswOjIwXSA9PSAieG1sVGV4dFJlYWRlckxvY2F0b3IiIGFuZCBmaWxlID09ICJ4bWxyZWFkZXIiOgorICAgICAgICBmdW5jID0gbmFtZVsyMDpdCiAgICAgZWxpZiBuYW1lWzA6MTNdID09ICJ4bWxUZXh0UmVhZGVyIiBhbmQgZmlsZSA9PSAieG1scmVhZGVyIjoKICAgICAgICAgZnVuYyA9IG5hbWVbMTM6XQogICAgIGVsaWYgbmFtZVswOjExXSA9PSAieG1sQUNhdGFsb2ciOgpkaWZmIC0tZ2l0IGEvcHl0aG9uL2xpYnhtbC5jIGIvcHl0aG9uL2xpYnhtbC5jCmluZGV4IGE3NjJhYzcuLjA2MDM5NTAgMTAwNjQ0Ci0tLSBhL3B5dGhvbi9saWJ4bWwuYworKysgYi9weXRob24vbGlieG1sLmMKQEAgLTExNzcsMzIgKzExNzcsNiBAQAogICAgIHJldHVybiAoUHlfTm9uZSk7CiB9CiAKLVB5T2JqZWN0ICoKLWxpYnhtbF94bWxGcmVlUGFyc2VyQ3R4dChBVFRSSUJVVEVfVU5VU0VEIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKLSAgICBQeU9iamVjdCAqcHlvYmpfY3R4dDsKLSAgICB4bWxQYXJzZXJDdHh0UHlDdHh0UHRyIHB5Q3R4dDsKLQotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAoY2hhciAqKSJPOnhtbEZyZWVQYXJzZXJDdHh0IiwgJnB5b2JqX2N0eHQpKQotICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKSBQeXBhcnNlckN0eHRfR2V0KHB5b2JqX2N0eHQpOwotCi0gICAgaWYgKGN0eHQgIT0gTlVMTCkgewotCXB5Q3R4dCA9ICh4bWxQYXJzZXJDdHh0UHlDdHh0UHRyKSgoeG1sUGFyc2VyQ3R4dFB0ciljdHh0KS0+X3ByaXZhdGU7Ci0JaWYgKHB5Q3R4dCkgewotCSAgICBQeV9YREVDUkVGKHB5Q3R4dC0+ZXJyb3JGdW5jKTsKLQkgICAgUHlfWERFQ1JFRihweUN0eHQtPmVycm9yRnVuY0FyZyk7Ci0JICAgIFB5X1hERUNSRUYocHlDdHh0LT53YXJuaW5nRnVuYyk7Ci0JICAgIFB5X1hERUNSRUYocHlDdHh0LT53YXJuaW5nRnVuY0FyZyk7Ci0JICAgIHhtbEZyZWUocHlDdHh0KTsKLQl9Ci0JeG1sRnJlZVBhcnNlckN0eHQoY3R4dCk7Ci0gICAgfQotCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybihQeV9Ob25lKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCQkJCQkqCiAgKgkJCUVycm9yIG1lc3NhZ2UgY2FsbGJhY2sJCQkJKgpAQCAtMTMzMiw0NCArMTMwNiw4NyBAQAogICoJCQkJCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCAKLWxpYnhtbF94bWxQYXJzZXJDdHh0RXJyb3JGdW5jSGFuZGxlcih2b2lkICpjdHh0LCBjb25zdCBjaGFyICptc2csIC4uLikKK3R5cGVkZWYgc3RydWN0IAogewotICAgIGNoYXIgKnN0cjsKLSAgICB2YV9saXN0IGFwOworICAgIFB5T2JqZWN0ICpmOworICAgIFB5T2JqZWN0ICphcmc7Cit9IHhtbFBhcnNlckN0eHRQeUN0eHQ7Cit0eXBlZGVmIHhtbFBhcnNlckN0eHRQeUN0eHQgKnhtbFBhcnNlckN0eHRQeUN0eHRQdHI7CisKK3N0YXRpYyB2b2lkCitsaWJ4bWxfeG1sUGFyc2VyQ3R4dEdlbmVyaWNFcnJvckZ1bmNIYW5kbGVyKHZvaWQgKmN0eCwgaW50IHNldmVyaXR5LCBjaGFyICpzdHIpIAorewogICAgIFB5T2JqZWN0ICpsaXN0OwotICAgIFB5T2JqZWN0ICptZXNzYWdlOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHh0OwogICAgIHhtbFBhcnNlckN0eHRQeUN0eHRQdHIgcHlDdHh0OwogICAgIAogI2lmZGVmIERFQlVHX0VSUk9SCi0gICAgcHJpbnRmKCJsaWJ4bWxfeG1sUGFyc2VyQ3R4dEVycm9yRnVuY0hhbmRsZXIoJXAsICVzLCAuLi4pIGNhbGxlZFxuIiwgY3R4LCBtc2cpOworICAgIHByaW50ZigibGlieG1sX3htbFBhcnNlckN0eHRHZW5lcmljRXJyb3JGdW5jSGFuZGxlciglcCwgJXMsIC4uLikgY2FsbGVkXG4iLCBjdHgsIG1zZyk7CiAjZW5kaWYKIAotICAgIHB5Q3R4dCA9ICh4bWxQYXJzZXJDdHh0UHlDdHh0UHRyKSgoeG1sUGFyc2VyQ3R4dFB0ciljdHh0KS0+X3ByaXZhdGU7CisgICAgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKWN0eDsKKyAgICBweUN0eHQgPSAoeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0ciljdHh0LT5fcHJpdmF0ZTsKIAotICAgIGlmIChweUN0eHQtPmVycm9yRnVuYyA9PSBOVUxMKSB7Ci0gICAgICAgIHZhX3N0YXJ0KGFwLCBtc2cpOwotICAgICAgICB2ZnByaW50ZihzdGRvdXQsIG1zZywgYXApOwotICAgICAgICB2YV9lbmQoYXApOwotICAgIH0gZWxzZSB7Ci0JdmFfc3RhcnQoYXAsIG1zZyk7Ci0Jc3RyID0gbGlieG1sX2J1aWxkTWVzc2FnZShtc2csYXApOwotCXZhX2VuZChhcCk7Ci0KLSAgICAgICAgbGlzdCA9IFB5VHVwbGVfTmV3KDIpOwotICAgICAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgMCwgcHlDdHh0LT5lcnJvckZ1bmNBcmcpOwotICAgICAgICBQeV9YSU5DUkVGKHB5Q3R4dC0+ZXJyb3JGdW5jQXJnKTsKLSAgICAgICAgbWVzc2FnZSA9IGxpYnhtbF9jaGFyUHRyV3JhcChzdHIpOwotICAgICAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgMSwgbWVzc2FnZSk7Ci0gICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHB5Q3R4dC0+ZXJyb3JGdW5jLCBsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIGxpc3QgPSBQeVR1cGxlX05ldyg0KTsKKyAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgMCwgcHlDdHh0LT5hcmcpOworICAgIFB5X1hJTkNSRUYocHlDdHh0LT5hcmcpOworICAgIFB5VHVwbGVfU2V0SXRlbShsaXN0LCAxLCBsaWJ4bWxfY2hhclB0cldyYXAoc3RyKSk7CisgICAgUHlUdXBsZV9TZXRJdGVtKGxpc3QsIDIsIGxpYnhtbF9pbnRXcmFwKHNldmVyaXR5KSk7CisgICAgUHlUdXBsZV9TZXRJdGVtKGxpc3QsIDMsIFB5X05vbmUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChweUN0eHQtPmYsIGxpc3QpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgCisgICAgeworCS8qIFRPRE86IG1hbmFnZSBmb3IgdGhlIGV4Y2VwdGlvbiB0byBiZSBwcm9wYWdhdGVkLi4uICovCisJUHlFcnJfUHJpbnQoKTsKICAgICB9CisgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7Cit9CisKK3N0YXRpYyB2b2lkIAorbGlieG1sX3htbFBhcnNlckN0eHRFcnJvckZ1bmNIYW5kbGVyKHZvaWQgKmN0eCwgY29uc3QgY2hhciAqbXNnLCAuLi4pIAoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgbXNnKTsKKyAgICBsaWJ4bWxfeG1sUGFyc2VyQ3R4dEdlbmVyaWNFcnJvckZ1bmNIYW5kbGVyKGN0eCxYTUxfUEFSU0VSX1NFVkVSSVRZX0VSUk9SLGxpYnhtbF9idWlsZE1lc3NhZ2UobXNnLGFwKSk7CisgICAgdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgCitsaWJ4bWxfeG1sUGFyc2VyQ3R4dFdhcm5pbmdGdW5jSGFuZGxlcih2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSAKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIG1zZyk7CisgICAgbGlieG1sX3htbFBhcnNlckN0eHRHZW5lcmljRXJyb3JGdW5jSGFuZGxlcihjdHgsWE1MX1BBUlNFUl9TRVZFUklUWV9XQVJOSU5HLGxpYnhtbF9idWlsZE1lc3NhZ2UobXNnLGFwKSk7CisgICAgdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgCitsaWJ4bWxfeG1sUGFyc2VyQ3R4dFZhbGlkaXR5RXJyb3JGdW5jSGFuZGxlcih2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSAKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIG1zZyk7CisgICAgbGlieG1sX3htbFBhcnNlckN0eHRHZW5lcmljRXJyb3JGdW5jSGFuZGxlcihjdHgsWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9FUlJPUixsaWJ4bWxfYnVpbGRNZXNzYWdlKG1zZyxhcCkpOworICAgIHZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIAorbGlieG1sX3htbFBhcnNlckN0eHRWYWxpZGl0eVdhcm5pbmdGdW5jSGFuZGxlcih2b2lkICpjdHgsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSAKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIG1zZyk7CisgICAgbGlieG1sX3htbFBhcnNlckN0eHRHZW5lcmljRXJyb3JGdW5jSGFuZGxlcihjdHgsWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9XQVJOSU5HLGxpYnhtbF9idWlsZE1lc3NhZ2UobXNnLGFwKSk7CisgICAgdmFfZW5kKGFwKTsKIH0KIAogUHlPYmplY3QgKgotbGlieG1sX3htbFNldFBhcnNlckN0eHRFcnJvckhhbmRsZXIoQVRUUklCVVRFX1VOVVNFRCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitsaWJ4bWxfeG1sUGFyc2VyQ3R4dFNldEVycm9ySGFuZGxlcihBVFRSSUJVVEVfVU5VU0VEIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgCiB7CiAgICAgUHlPYmplY3QgKnB5X3JldHZhbDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7CkBAIC0xMzc4LDcgKzEzOTUsNyBAQAogICAgIFB5T2JqZWN0ICpweW9ial9mOwogICAgIFB5T2JqZWN0ICpweW9ial9hcmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgKGNoYXIgKikiT09POnhtbFNldFBhcnNlckN0eHRFcnJvckhhbmRsZXIiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAoY2hhciAqKSJPT086eG1sUGFyc2VyQ3R4dFNldEVycm9ySGFuZGxlciIsCiAJCSAgICAgICAgICAmcHlvYmpfY3R4dCwgJnB5b2JqX2YsICZweW9ial9hcmcpKQogICAgICAgICByZXR1cm4oTlVMTCk7CiAgICAgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKSBQeXBhcnNlckN0eHRfR2V0KHB5b2JqX2N0eHQpOwpAQCAtMTM5Miw5OSArMTQwOSw4OCBAQAogCWN0eHQtPl9wcml2YXRlID0gcHlDdHh0OwogICAgIH0KICAgICBlbHNlIHsKLQlweUN0eHQgPSBjdHh0LT5fcHJpdmF0ZTsKKwlweUN0eHQgPSAoeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0ciljdHh0LT5fcHJpdmF0ZTsKICAgICB9CiAgICAgLyogVE9ETzogY2hlY2sgZiBpcyBhIGZ1bmN0aW9uICEgKi8KLSAgICBQeV9YREVDUkVGKHB5Q3R4dC0+ZXJyb3JGdW5jKTsKKyAgICBQeV9YREVDUkVGKHB5Q3R4dC0+Zik7CiAgICAgUHlfWElOQ1JFRihweW9ial9mKTsKLSAgICBweUN0eHQtPmVycm9yRnVuYyA9IHB5b2JqX2Y7Ci0gICAgUHlfWERFQ1JFRihweUN0eHQtPmVycm9yRnVuY0FyZyk7CisgICAgcHlDdHh0LT5mID0gcHlvYmpfZjsKKyAgICBQeV9YREVDUkVGKHB5Q3R4dC0+YXJnKTsKICAgICBQeV9YSU5DUkVGKHB5b2JqX2FyZyk7Ci0gICAgcHlDdHh0LT5lcnJvckZ1bmNBcmcgPSBweW9ial9hcmc7CisgICAgcHlDdHh0LT5hcmcgPSBweW9ial9hcmc7CiAKLSAgICBjdHh0LT5zYXgtPmVycm9yID0gbGlieG1sX3htbFBhcnNlckN0eHRFcnJvckZ1bmNIYW5kbGVyOwotICAgIGN0eHQtPnZjdHh0LmVycm9yID0gbGlieG1sX3htbFBhcnNlckN0eHRFcnJvckZ1bmNIYW5kbGVyOworICAgIGlmIChweW9ial9mICE9IFB5X05vbmUpIHsKKwljdHh0LT5zYXgtPmVycm9yID0gbGlieG1sX3htbFBhcnNlckN0eHRFcnJvckZ1bmNIYW5kbGVyOworCWN0eHQtPnNheC0+d2FybmluZyA9IGxpYnhtbF94bWxQYXJzZXJDdHh0V2FybmluZ0Z1bmNIYW5kbGVyOworCWN0eHQtPnZjdHh0LmVycm9yID0gbGlieG1sX3htbFBhcnNlckN0eHRWYWxpZGl0eUVycm9yRnVuY0hhbmRsZXI7CisJY3R4dC0+dmN0eHQud2FybmluZyA9IGxpYnhtbF94bWxQYXJzZXJDdHh0VmFsaWRpdHlXYXJuaW5nRnVuY0hhbmRsZXI7CisgICAgfQorICAgIGVsc2UgeworCWN0eHQtPnNheC0+ZXJyb3IgPSB4bWxQYXJzZXJFcnJvcjsKKwljdHh0LT52Y3R4dC5lcnJvciA9IHhtbFBhcnNlclZhbGlkaXR5RXJyb3I7CisJY3R4dC0+c2F4LT53YXJuaW5nID0geG1sUGFyc2VyV2FybmluZzsKKwljdHh0LT52Y3R4dC53YXJuaW5nID0geG1sUGFyc2VyVmFsaWRpdHlXYXJuaW5nOworICAgIH0KIAogICAgIHB5X3JldHZhbCA9IGxpYnhtbF9pbnRXcmFwKDEpOwogICAgIHJldHVybihweV9yZXR2YWwpOwogfQogCi1zdGF0aWMgdm9pZCAKLWxpYnhtbF94bWxQYXJzZXJDdHh0V2FybmluZ0Z1bmNIYW5kbGVyKHZvaWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQotewotICAgIGNoYXIgKnN0cjsKLSAgICB2YV9saXN0IGFwOwotICAgIFB5T2JqZWN0ICpsaXN0OwotICAgIFB5T2JqZWN0ICptZXNzYWdlOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0ciBweUN0eHQ7Ci0KLSNpZmRlZiBERUJVR19FUlJPUgotICAgIHByaW50ZigibGlieG1sX3htbFBhcnNlckN0eHRXYXJuaW5nRnVuY0hhbmRsZXIoJXAsICVzLCAuLi4pIGNhbGxlZFxuIiwgY3R4LCBtc2cpOwotI2VuZGlmCi0KLSAgICBweUN0eHQgPSAoeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0cikoKHhtbFBhcnNlckN0eHRQdHIpY3R4dCktPl9wcml2YXRlOwotCi0gICAgaWYgKHB5Q3R4dC0+d2FybmluZ0Z1bmMgPT0gTlVMTCkgewotICAgICAgICB2YV9zdGFydChhcCwgbXNnKTsKLSAgICAgICAgdmZwcmludGYoc3Rkb3V0LCBtc2csIGFwKTsKLSAgICAgICAgdmFfZW5kKGFwKTsKLSAgICB9IGVsc2UgewotCXZhX3N0YXJ0KGFwLCBtc2cpOwotCXN0ciA9IGxpYnhtbF9idWlsZE1lc3NhZ2UobXNnLGFwKTsKLQl2YV9lbmQoYXApOwotCi0gICAgICAgIGxpc3QgPSBQeVR1cGxlX05ldygyKTsKLSAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGxpc3QsIDAsIHB5Q3R4dC0+d2FybmluZ0Z1bmNBcmcpOwotICAgICAgICBQeV9YSU5DUkVGKHB5Q3R4dC0+d2FybmluZ0Z1bmNBcmcpOwotICAgICAgICBtZXNzYWdlID0gbGlieG1sX2NoYXJQdHJXcmFwKHN0cik7Ci0gICAgICAgIFB5VHVwbGVfU2V0SXRlbShsaXN0LCAxLCBtZXNzYWdlKTsKLSAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QocHlDdHh0LT53YXJuaW5nRnVuYywgbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYobGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKLSAgICB9Ci19Ci0KIFB5T2JqZWN0ICoKLWxpYnhtbF94bWxTZXRQYXJzZXJDdHh0V2FybmluZ0hhbmRsZXIoQVRUUklCVVRFX1VOVVNFRCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitsaWJ4bWxfeG1sUGFyc2VyQ3R4dEdldEVycm9ySGFuZGxlcihBVFRSSUJVVEVfVU5VU0VEIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgCiB7CiAgICAgUHlPYmplY3QgKnB5X3JldHZhbDsKICAgICB4bWxQYXJzZXJDdHh0UHRyIGN0eHQ7CiAgICAgeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0ciBweUN0eHQ7CiAgICAgUHlPYmplY3QgKnB5b2JqX2N0eHQ7Ci0gICAgUHlPYmplY3QgKnB5b2JqX2Y7Ci0gICAgUHlPYmplY3QgKnB5b2JqX2FyZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAoY2hhciAqKSJPT086eG1sU2V0UGFyc2VyQ3R4dFdhcm5pbmdIYW5kbGVyIiwgJnB5b2JqX2N0eHQsICZweW9ial9mLCAmcHlvYmpfYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgKGNoYXIgKikiTzp4bWxQYXJzZXJDdHh0R2V0RXJyb3JIYW5kbGVyIiwKKwkJICAgICAgICAgICZweW9ial9jdHh0KSkKICAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIGN0eHQgPSAoeG1sUGFyc2VyQ3R4dFB0cikgUHlwYXJzZXJDdHh0X0dldChweW9ial9jdHh0KTsKLSAgICBpZiAoY3R4dC0+X3ByaXZhdGUgPT0gTlVMTCkgewotCXB5Q3R4dCA9IHhtbE1hbGxvYyhzaXplb2YoeG1sUGFyc2VyQ3R4dFB5Q3R4dCkpOwotCWlmIChweUN0eHQgPT0gTlVMTCkgewotCSAgICBweV9yZXR2YWwgPSBsaWJ4bWxfaW50V3JhcCgtMSk7Ci0JICAgIHJldHVybihweV9yZXR2YWwpOwotCX0KLQltZW1zZXQocHlDdHh0LDAsc2l6ZW9mKHhtbFBhcnNlckN0eHRQeUN0eHQpKTsKLQljdHh0LT5fcHJpdmF0ZSA9IHB5Q3R4dDsKKyAgICBweV9yZXR2YWwgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAoY3R4dC0+X3ByaXZhdGUgIT0gTlVMTCkgeworCXB5Q3R4dCA9ICh4bWxQYXJzZXJDdHh0UHlDdHh0UHRyKWN0eHQtPl9wcml2YXRlOworCisJUHlUdXBsZV9TZXRJdGVtKHB5X3JldHZhbCwgMCwgcHlDdHh0LT5mKTsKKwlQeV9YSU5DUkVGKHB5Q3R4dC0+Zik7CisJUHlUdXBsZV9TZXRJdGVtKHB5X3JldHZhbCwgMSwgcHlDdHh0LT5hcmcpOworCVB5X1hJTkNSRUYocHlDdHh0LT5hcmcpOwogICAgIH0KICAgICBlbHNlIHsKLQlweUN0eHQgPSBjdHh0LT5fcHJpdmF0ZTsKKwkvKiBubyBweXRob24gZXJyb3IgaGFuZGxlciByZWdpc3RlcmVkICovCisJUHlUdXBsZV9TZXRJdGVtKHB5X3JldHZhbCwgMCwgUHlfTm9uZSk7CisJUHlfWElOQ1JFRihQeV9Ob25lKTsKKwlQeVR1cGxlX1NldEl0ZW0ocHlfcmV0dmFsLCAxLCBQeV9Ob25lKTsKKwlQeV9YSU5DUkVGKFB5X05vbmUpOwogICAgIH0KLSAgICAvKiBUT0RPOiBjaGVjayBmIGlzIGEgZnVuY3Rpb24gISAqLwotICAgIFB5X1hERUNSRUYocHlDdHh0LT53YXJuaW5nRnVuYyk7Ci0gICAgUHlfWElOQ1JFRihweW9ial9mKTsKLSAgICBweUN0eHQtPndhcm5pbmdGdW5jID0gcHlvYmpfZjsKLSAgICBQeV9YREVDUkVGKHB5Q3R4dC0+d2FybmluZ0Z1bmNBcmcpOwotICAgIFB5X1hJTkNSRUYocHlvYmpfYXJnKTsKLSAgICBweUN0eHQtPndhcm5pbmdGdW5jQXJnID0gcHlvYmpfYXJnOwotCi0gICAgY3R4dC0+c2F4LT53YXJuaW5nID0gbGlieG1sX3htbFBhcnNlckN0eHRXYXJuaW5nRnVuY0hhbmRsZXI7Ci0gICAgY3R4dC0+dmN0eHQud2FybmluZyA9IGxpYnhtbF94bWxQYXJzZXJDdHh0V2FybmluZ0Z1bmNIYW5kbGVyOwotCi0gICAgcHlfcmV0dmFsID0gbGlieG1sX2ludFdyYXAoMSk7CiAgICAgcmV0dXJuKHB5X3JldHZhbCk7CiB9CiAKK1B5T2JqZWN0ICoKK2xpYnhtbF94bWxGcmVlUGFyc2VyQ3R4dChBVFRSSUJVVEVfVU5VU0VEIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeworICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dDsKKyAgICBQeU9iamVjdCAqcHlvYmpfY3R4dDsKKyAgICB4bWxQYXJzZXJDdHh0UHlDdHh0UHRyIHB5Q3R4dDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAoY2hhciAqKSJPOnhtbEZyZWVQYXJzZXJDdHh0IiwgJnB5b2JqX2N0eHQpKQorICAgICAgICByZXR1cm4oTlVMTCk7CisgICAgY3R4dCA9ICh4bWxQYXJzZXJDdHh0UHRyKSBQeXBhcnNlckN0eHRfR2V0KHB5b2JqX2N0eHQpOworCisgICAgaWYgKGN0eHQgIT0gTlVMTCkgeworCXB5Q3R4dCA9ICh4bWxQYXJzZXJDdHh0UHlDdHh0UHRyKSgoeG1sUGFyc2VyQ3R4dFB0ciljdHh0KS0+X3ByaXZhdGU7CisJaWYgKHB5Q3R4dCkgeworCSAgICBQeV9YREVDUkVGKHB5Q3R4dC0+Zik7CisJICAgIFB5X1hERUNSRUYocHlDdHh0LT5hcmcpOworCSAgICB4bWxGcmVlKHB5Q3R4dCk7CisJfQorCXhtbEZyZWVQYXJzZXJDdHh0KGN0eHQpOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4oUHlfTm9uZSk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQkJCQkJKgogICogICAgICAgICAgICAgICAgICAgICAgUGVyIHhtbFRleHRSZWFkZXIgZXJyb3IgaGFuZGxlciAgICAgICAgICAgICAgICAgKgpAQCAtMTUwMSwyNyArMTUwNywyMyBAQAogc3RhdGljIHZvaWQgCiBsaWJ4bWxfeG1sVGV4dFJlYWRlckVycm9yQ2FsbGJhY2sodm9pZCAqYXJnLCAKIAkJCQkgIGNvbnN0IGNoYXIgKm1zZywKLQkJCQkgIGludCBsaW5lLAotCQkJCSAgaW50IGNvbCwKLQkJCQkgIGNvbnN0IGNoYXIgKlVSSSwKLQkJCQkgIGludCBzZXZlcml0eSkKKwkJCQkgIGludCBzZXZlcml0eSwKKwkJCQkgIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIGxvY2F0b3IpCiB7CiAgICAgeG1sVGV4dFJlYWRlclB5Q3R4dCAqcHlDdHh0ID0gKHhtbFRleHRSZWFkZXJQeUN0eHQgKilhcmc7CiAgICAgUHlPYmplY3QgKmxpc3Q7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICAKLSAgICBsaXN0ID0gUHlUdXBsZV9OZXcoNik7CisgICAgbGlzdCA9IFB5VHVwbGVfTmV3KDQpOwogICAgIFB5VHVwbGVfU2V0SXRlbShsaXN0LCAwLCBweUN0eHQtPmFyZyk7CiAgICAgUHlfWElOQ1JFRihweUN0eHQtPmFyZyk7CiAgICAgUHlUdXBsZV9TZXRJdGVtKGxpc3QsIDEsIGxpYnhtbF9jaGFyUHRyQ29uc3RXcmFwKG1zZykpOwotICAgIFB5VHVwbGVfU2V0SXRlbShsaXN0LCAyLCBsaWJ4bWxfaW50V3JhcChsaW5lKSk7Ci0gICAgUHlUdXBsZV9TZXRJdGVtKGxpc3QsIDMsIGxpYnhtbF9pbnRXcmFwKGNvbCkpOwotICAgIFB5VHVwbGVfU2V0SXRlbShsaXN0LCA0LCBsaWJ4bWxfY2hhclB0ckNvbnN0V3JhcChVUkkpKTsKLSAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgNSwgbGlieG1sX2ludFdyYXAoc2V2ZXJpdHkpKTsKKyAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgMiwgbGlieG1sX2ludFdyYXAoc2V2ZXJpdHkpKTsKKyAgICBQeVR1cGxlX1NldEl0ZW0obGlzdCwgMywgbGlieG1sX3htbFRleHRSZWFkZXJMb2NhdG9yUHRyV3JhcChsb2NhdG9yKSk7CiAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QocHlDdHh0LT5mLCBsaXN0KTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgewotCS8qIFRPRE86IG1hbmFnZSBmb3IgdGhlIGV4Y2VwdGlvbiB0byBiZSBnbyB1cC4uLiAqLworCS8qIFRPRE86IG1hbmFnZSBmb3IgdGhlIGV4Y2VwdGlvbiB0byBiZSBwcm9wYWdhdGVkLi4uICovCiAJUHlFcnJfUHJpbnQoKTsKICAgICB9CiAgICAgUHlfWERFQ1JFRihsaXN0KTsKQEAgLTI1NTgsOCArMjU2MCw4IEBACiAgICAgeyhjaGFyICopICJpbnB1dEJ1ZmZlckNyZWF0ZSIsIGxpYnhtbF94bWxDcmVhdGVJbnB1dEJ1ZmZlciwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKICAgICB7KGNoYXIgKikgInNldEVudGl0eUxvYWRlciIsIGxpYnhtbF94bWxTZXRFbnRpdHlMb2FkZXIsIE1FVEhfVkFSQVJHUywgTlVMTH0sCiAgICAgeyhjaGFyICopInhtbFJlZ2lzdGVyRXJyb3JIYW5kbGVyIiwgbGlieG1sX3htbFJlZ2lzdGVyRXJyb3JIYW5kbGVyLCBNRVRIX1ZBUkFSR1MsIE5VTEwgfSwKLSAgICB7KGNoYXIgKikieG1sU2V0UGFyc2VyQ3R4dEVycm9ySGFuZGxlciIsIGxpYnhtbF94bWxTZXRQYXJzZXJDdHh0RXJyb3JIYW5kbGVyLCBNRVRIX1ZBUkFSR1MsIE5VTEwgfSwKLSAgICB7KGNoYXIgKikieG1sU2V0UGFyc2VyQ3R4dFdhcm5pbmdIYW5kbGVyIiwgbGlieG1sX3htbFNldFBhcnNlckN0eHRXYXJuaW5nSGFuZGxlciwgTUVUSF9WQVJBUkdTLCBOVUxMIH0sCisgICAgeyhjaGFyICopInhtbFBhcnNlckN0eHRTZXRFcnJvckhhbmRsZXIiLCBsaWJ4bWxfeG1sUGFyc2VyQ3R4dFNldEVycm9ySGFuZGxlciwgTUVUSF9WQVJBUkdTLCBOVUxMIH0sCisgICAgeyhjaGFyICopInhtbFBhcnNlckN0eHRHZXRFcnJvckhhbmRsZXIiLCBsaWJ4bWxfeG1sUGFyc2VyQ3R4dEdldEVycm9ySGFuZGxlciwgTUVUSF9WQVJBUkdTLCBOVUxMIH0sCiAgICAgeyhjaGFyICopInhtbEZyZWVQYXJzZXJDdHh0IiwgbGlieG1sX3htbEZyZWVQYXJzZXJDdHh0LCBNRVRIX1ZBUkFSR1MsIE5VTEwgfSwKICAgICB7KGNoYXIgKikieG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlciIsIGxpYnhtbF94bWxUZXh0UmVhZGVyU2V0RXJyb3JIYW5kbGVyLCBNRVRIX1ZBUkFSR1MsIE5VTEwgfSwKICAgICB7KGNoYXIgKikieG1sVGV4dFJlYWRlckdldEVycm9ySGFuZGxlciIsIGxpYnhtbF94bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyLCBNRVRIX1ZBUkFSR1MsIE5VTEwgfSwKZGlmZiAtLWdpdCBhL3B5dGhvbi9saWJ4bWwucHkgYi9weXRob24vbGlieG1sLnB5CmluZGV4IDhmOTE4NWMuLjhmZmEzODMgMTAwNjQ0Ci0tLSBhL3B5dGhvbi9saWJ4bWwucHkKKysrIGIvcHl0aG9uL2xpYnhtbC5weQpAQCAtNDYyLDEyICs0NjIsMTIgQEAKIFBBUlNFUl9TVUJTVF9FTlRJVElFUz00CiAKICMKLSMgRm9yIHRoZSB4bWxUZXh0UmVhZGVyIGVycm9yIHNldmVyaXRpZXMKKyMgRm9yIHRoZSBlcnJvciBjYWxsYmFjayBzZXZlcml0aWVzCiAjCi1YTUxSRUFERVJfU0VWRVJJVFlfVkFMSURJVFlfV0FSTklORz0xCi1YTUxSRUFERVJfU0VWRVJJVFlfVkFMSURJVFlfRVJST1I9MgotWE1MUkVBREVSX1NFVkVSSVRZX1dBUk5JTkc9MwotWE1MUkVBREVSX1NFVkVSSVRZX0VSUk9SPTQKK1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9XQVJOSU5HPTEKK1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9FUlJPUj0yCitQQVJTRVJfU0VWRVJJVFlfV0FSTklORz0zCitQQVJTRVJfU0VWRVJJVFlfRVJST1I9NAogCiAjCiAjIHJlZ2lzdGVyIHRoZSBsaWJ4bWwyIGVycm9yIGhhbmRsZXIKQEAgLTQ5OSwxMSArNDk5LDIxIEBACiAgICAgICAgICAgICBsaWJ4bWwybW9kLnhtbEZyZWVQYXJzZXJDdHh0KHNlbGYuX28pCiAJc2VsZi5fbyA9IE5vbmUKIAotICAgIGRlZiByZWdpc3RlckVycm9ySGFuZGxlcihzZWxmLGYsYXJnKToKLSAgICAgICAgbGlieG1sMm1vZC54bWxTZXRQYXJzZXJDdHh0RXJyb3JIYW5kbGVyKHNlbGYuX28sZixhcmcpCisgICAgZGVmIHNldEVycm9ySGFuZGxlcihzZWxmLGYsYXJnKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYW4gZXJyb3IgaGFuZGxlciB0aGF0IHdpbGwgYmUgY2FsbGVkIGJhY2sgYXMKKyAgICAgICAgICAgZihhcmcsbXNnLHNldmVyaXR5LHJlc2VydmVkKS4KKyAgICAgICAgICAgCisgICAgICAgICAgIEByZXNlcnZlZCBpcyBjdXJyZW50bHkgYWx3YXlzIE5vbmUuIiIiCisgICAgICAgIGxpYnhtbDJtb2QueG1sUGFyc2VyQ3R4dFNldEVycm9ySGFuZGxlcihzZWxmLl9vLGYsYXJnKQogCi0gICAgZGVmIHJlZ2lzdGVyV2FybmluZ0hhbmRsZXIoc2VsZixmLGFyZyk6Ci0gICAgICAgIGxpYnhtbDJtb2QueG1sU2V0UGFyc2VyQ3R4dFdhcm5pbmdIYW5kbGVyKHNlbGYuX28sZixhcmcpCisgICAgZGVmIGdldEVycm9ySGFuZGxlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIChmLGFyZykgYXMgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggc2V0RXJyb3JIYW5kbGVyCisgICAgICAgICAgIG9yIChOb25lLE5vbmUpLiIiIgorICAgICAgICByZXR1cm4gbGlieG1sMm1vZC54bWxQYXJzZXJDdHh0R2V0RXJyb3JIYW5kbGVyKHNlbGYuX28pCisKK2RlZiBfeG1sVGV4dFJlYWRlckVycm9yRnVuYygoZixhcmcpLG1zZyxzZXZlcml0eSxsb2NhdG9yKToKKyAgICAiIiJJbnRlcm1lZGlhdGUgY2FsbGJhY2sgdG8gd3JhcCB0aGUgbG9jYXRvciIiIgorICAgIHJldHVybiBmKGFyZyxtc2csc2V2ZXJpdHkseG1sVGV4dFJlYWRlckxvY2F0b3IobG9jYXRvcikpCiAKIGNsYXNzIHhtbFRleHRSZWFkZXJDb3JlOgogCkBAIC01MTcsMTUgKzUyNywyNSBAQAogICAgICAgICAgICAgbGlieG1sMm1vZC54bWxGcmVlVGV4dFJlYWRlcihzZWxmLl9vKQogICAgICAgICBzZWxmLl9vID0gTm9uZQogCi0gICAgZGVmIHNldEVycm9ySGFuZGxlcihzZWxmLGYsYXJnKToKKyAgICBkZWYgU2V0RXJyb3JIYW5kbGVyKHNlbGYsZixhcmcpOgogICAgICAgICAiIiJSZWdpc3RlciBhbiBlcnJvciBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgYmFjayBhcwotICAgICAgICAgICBmKGFyZyxtc2csbGluZSxjb2wsVVJJLHNldmVyaXR5KS4iIiIKLSAgICAgICAgbGlieG1sMm1vZC54bWxUZXh0UmVhZGVyU2V0RXJyb3JIYW5kbGVyKHNlbGYuX28sZixhcmcpCisgICAgICAgICAgIGYoYXJnLG1zZyxzZXZlcml0eSxsb2NhdG9yKS4iIiIKKyAgICAgICAgaWYgZiBpcyBOb25lOgorICAgICAgICAgICAgbGlieG1sMm1vZC54bWxUZXh0UmVhZGVyU2V0RXJyb3JIYW5kbGVyKFwKKyAgICAgICAgICAgICAgICBzZWxmLl9vLE5vbmUsTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpYnhtbDJtb2QueG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlcihcCisgICAgICAgICAgICAgICAgc2VsZi5fbyxfeG1sVGV4dFJlYWRlckVycm9yRnVuYywoZixhcmcpKQogCi0gICAgZGVmIGdldEVycm9ySGFuZGxlcihzZWxmKToKKyAgICBkZWYgR2V0RXJyb3JIYW5kbGVyKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gKGYsYXJnKSBhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBzZXRFcnJvckhhbmRsZXIKICAgICAgICAgICAgb3IgKE5vbmUsTm9uZSkuIiIiCi0gICAgICAgIHJldHVybiBsaWJ4bWwybW9kLnhtbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXIoc2VsZi5fbykKKyAgICAgICAgZixhcmcgPSBsaWJ4bWwybW9kLnhtbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXIoc2VsZi5fbykKKyAgICAgICAgaWYgZiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhc3NlcnQgZiBpcyBfeG1sVGV4dFJlYWRlckVycm9yRnVuYworICAgICAgICAgICAgcmV0dXJuIGFyZwogCiAjIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCiAjCmRpZmYgLS1naXQgYS9weXRob24vbGlieG1sX3dyYXAuaCBiL3B5dGhvbi9saWJ4bWxfd3JhcC5oCmluZGV4IGM4NzMwY2EuLmM1OWI3MDYgMTAwNjQ0Ci0tLSBhL3B5dGhvbi9saWJ4bWxfd3JhcC5oCisrKyBiL3B5dGhvbi9saWJ4bWxfd3JhcC5oCkBAIC05Myw2ICs5MywxNCBAQAogICAgIHhtbFRleHRSZWFkZXJQdHIgb2JqOwogfSBQeXhtbFRleHRSZWFkZXJfT2JqZWN0OwogCisjZGVmaW5lIFB5eG1sVGV4dFJlYWRlckxvY2F0b3JfR2V0KHYpICgoKHYpID09IFB5X05vbmUpID8gTlVMTCA6IFwKKyAgICAgICAgKCgoUHl4bWxUZXh0UmVhZGVyTG9jYXRvcl9PYmplY3QgKikodikpLT5vYmopKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHhtbFRleHRSZWFkZXJMb2NhdG9yUHRyIG9iajsKK30gUHl4bWxUZXh0UmVhZGVyTG9jYXRvcl9PYmplY3Q7CisKICNkZWZpbmUgUHlVUklfR2V0KHYpICgoKHYpID09IFB5X05vbmUpID8gTlVMTCA6IFwKIAkoKChQeVVSSV9PYmplY3QgKikodikpLT5vYmopKQogCkBAIC0xNDcsMTkgKzE1NSw2IEBACiBQeU9iamVjdCAqIGxpYnhtbF94bWxQYXJzZXJJbnB1dEJ1ZmZlclB0cldyYXAoeG1sUGFyc2VySW5wdXRCdWZmZXJQdHIgYnVmZmVyKTsKIFB5T2JqZWN0ICogbGlieG1sX3htbFJlZ2V4cFB0cldyYXAoeG1sUmVnZXhwUHRyIHJlZ2V4cCk7CiBQeU9iamVjdCAqIGxpYnhtbF94bWxUZXh0UmVhZGVyUHRyV3JhcCh4bWxUZXh0UmVhZGVyUHRyIHJlYWRlcik7CitQeU9iamVjdCAqIGxpYnhtbF94bWxUZXh0UmVhZGVyTG9jYXRvclB0cldyYXAoeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcik7CiAKIHhtbFhQYXRoT2JqZWN0UHRyIGxpYnhtbF94bWxYUGF0aE9iamVjdFB0ckNvbnZlcnQoUHlPYmplY3QgKiBvYmopOwotCi0vKgotICogRGF0YSBzdHJ1Y3R1cmUgdGhhdCBtYWtlcyB0aGUgbGluayBmcm9tIHRoZSBwYXJzZXIgY29udGV4dAotICogdG8gdGhlIHB5dGhvbiB3cmFwcGVyLgotICovCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgICBQeU9iamVjdCAqZXJyb3JGdW5jOwotICAgIFB5T2JqZWN0ICplcnJvckZ1bmNBcmc7Ci0gICAgUHlPYmplY3QgKndhcm5pbmdGdW5jOwotICAgIFB5T2JqZWN0ICp3YXJuaW5nRnVuY0FyZzsKLX0geG1sUGFyc2VyQ3R4dFB5Q3R4dDsKLXR5cGVkZWYgeG1sUGFyc2VyQ3R4dFB5Q3R4dCAqeG1sUGFyc2VyQ3R4dFB5Q3R4dFB0cjsKLQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3Rlc3RzL2N0eHRlcnJvci5weSBiL3B5dGhvbi90ZXN0cy9jdHh0ZXJyb3IucHkKaW5kZXggNDQ1ODljZC4uMjY1YmIxZSAxMDA3NTUKLS0tIGEvcHl0aG9uL3Rlc3RzL2N0eHRlcnJvci5weQorKysgYi9weXRob24vdGVzdHMvY3R4dGVycm9yLnB5CkBAIC05LDIwICs5LDIyIEBACiAjIE1lbW9yeSBkZWJ1ZyBzcGVjaWZpYwogbGlieG1sMi5kZWJ1Z01lbW9yeSgxKQogCi1leHBlY3Q9IiIiLS0+IE9wZW5pbmcgYW5kIGVuZGluZyB0YWcgbWlzbWF0Y2g6IHggYW5kIHkKK2V4cGVjdD0iIiItLT4gKDMpIHhtbG5zOiBVUkkgZm9vIGlzIG5vdCBhYnNvbHV0ZQorLS0+ICg0KSBPcGVuaW5nIGFuZCBlbmRpbmcgdGFnIG1pc21hdGNoOiB4IGFuZCB5CiAiIiIKIAogZXJyPSIiCi1kZWYgY2FsbGJhY2soY3R4LCBzdHIpOgotICAgICBnbG9iYWwgZXJyCitkZWYgY2FsbGJhY2soYXJnLG1zZyxzZXZlcml0eSxyZXNlcnZlZCk6CisgICAgZ2xvYmFsIGVycgorICAgIGVyciA9IGVyciArICIlcyAoJWQpICVzIiAlIChhcmcsc2V2ZXJpdHksbXNnKQogCi0gICAgIGVyciA9IGVyciArICIlcyAlcyIgJSAoY3R4LCBzdHIpCi0KLXMgPSAiIiI8eD48L3k+IiIiCitzID0gIiIiPHggeG1sbnM9ImZvbyI+PC95PiIiIgogCiBwYXJzZXJDdHh0ID0gbGlieG1sMi5jcmVhdGVQdXNoUGFyc2VyKE5vbmUsIiIsMCwidGVzdC54bWwiKQotcGFyc2VyQ3R4dC5yZWdpc3RlckVycm9ySGFuZGxlcihjYWxsYmFjaywgIi0tPiIpCi1wYXJzZXJDdHh0LnJlZ2lzdGVyV2FybmluZ0hhbmRsZXIoY2FsbGJhY2ssICItLT4iKQorcGFyc2VyQ3R4dC5zZXRFcnJvckhhbmRsZXIoY2FsbGJhY2ssICItLT4iKQoraWYgcGFyc2VyQ3R4dC5nZXRFcnJvckhhbmRsZXIoKSAhPSAoY2FsbGJhY2ssIi0tPiIpOgorICAgIHByaW50ICJnZXRFcnJvckhhbmRsZXIgZmFpbGVkIgorICAgIHN5cy5leGl0KDEpCiBwYXJzZXJDdHh0LnBhcnNlQ2h1bmsocyxsZW4ocyksMSkKIGRvYyA9IHBhcnNlckN0eHQuZG9jKCkKIGRvYy5mcmVlRG9jKCkKQEAgLTM3LDggKzM5LDcgQEAKIGkgPSAxMDAwMAogd2hpbGUgaSA+IDA6CiAgICAgcGFyc2VyQ3R4dCA9IGxpYnhtbDIuY3JlYXRlUHVzaFBhcnNlcihOb25lLCIiLDAsInRlc3QueG1sIikKLSAgICBwYXJzZXJDdHh0LnJlZ2lzdGVyRXJyb3JIYW5kbGVyKGNhbGxiYWNrLCAiLS0+IikKLSAgICBwYXJzZXJDdHh0LnJlZ2lzdGVyV2FybmluZ0hhbmRsZXIoY2FsbGJhY2ssICItLT4iKQorICAgIHBhcnNlckN0eHQuc2V0RXJyb3JIYW5kbGVyKGNhbGxiYWNrLCAiLS0+IikKICAgICBwYXJzZXJDdHh0LnBhcnNlQ2h1bmsocyxsZW4ocyksMSkKICAgICBkb2MgPSBwYXJzZXJDdHh0LmRvYygpCiAgICAgZG9jLmZyZWVEb2MoKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3Rlc3RzL3JlYWRlcmVyci5weSBiL3B5dGhvbi90ZXN0cy9yZWFkZXJlcnIucHkKaW5kZXggYWJiYmJhNS4uZGJkZWI0NyAxMDA2NDQKLS0tIGEvcHl0aG9uL3Rlc3RzL3JlYWRlcmVyci5weQorKysgYi9weXRob24vdGVzdHMvcmVhZGVyZXJyLnB5CkBAIC0xMywxNCArMTMsMTQgQEAKIC0tPiAoNCkgdGVzdDE6MTpPcGVuaW5nIGFuZCBlbmRpbmcgdGFnIG1pc21hdGNoOiBjIGFuZCBhCiAiIiIKIGVycj0iIgotZGVmIG15RXJyb3JIYW5kbGVyKGFyZyxtc2csbGluZSxjb2wsVVJJLHNldmVyaXR5KToKK2RlZiBteUVycm9ySGFuZGxlcihhcmcsbXNnLHNldmVyaXR5LGxvY2F0b3IpOgogICAgIGdsb2JhbCBlcnIKLSAgICBlcnIgPSBlcnIgKyAiJXMgKCVkKSAlczolZDolcyIgJSAoYXJnLHNldmVyaXR5LFVSSSxsaW5lLG1zZykKKyAgICBlcnIgPSBlcnIgKyAiJXMgKCVkKSAlczolZDolcyIgJSAoYXJnLHNldmVyaXR5LGxvY2F0b3IuQmFzZVVSSSgpLGxvY2F0b3IuTGluZU51bWJlcigpLG1zZykKIAogZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxhIHhtbG5zPSJmb28iPjxiIGIxPSJiMSIvPjxjPmNvbnRlbnQgb2YgYzwvYT4iIiIpCiBpbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKIHJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QxIikKLXJlYWRlci5zZXRFcnJvckhhbmRsZXIobXlFcnJvckhhbmRsZXIsIi0tPiIpCityZWFkZXIuU2V0RXJyb3JIYW5kbGVyKG15RXJyb3JIYW5kbGVyLCItLT4iKQogd2hpbGUgcmVhZGVyLlJlYWQoKSA9PSAxOgogICAgIHBhc3MKIApAQCAtMzAsOSArMzAsOSBAQAogICAgIHByaW50ICJleHBlY3RlZCAlcyIgJShleHBlY3QpCiAgICAgc3lzLmV4aXQoMSkKIAotcmVhZGVyLnNldEVycm9ySGFuZGxlcihOb25lLE5vbmUpCi1pZiByZWFkZXIuZ2V0RXJyb3JIYW5kbGVyKCkgIT0gKE5vbmUsTm9uZSk6Ci0gICAgcHJpbnQgImdldEVycm9ySGFuZGxlciBmYWlsZWQiCityZWFkZXIuU2V0RXJyb3JIYW5kbGVyKE5vbmUsTm9uZSkKK2lmIHJlYWRlci5HZXRFcnJvckhhbmRsZXIoKSAhPSAoTm9uZSxOb25lKToKKyAgICBwcmludCAiR2V0RXJyb3JIYW5kbGVyIGZhaWxlZCIKICAgICBzeXMuZXhpdCgxKQogCiAjCmRpZmYgLS1naXQgYS9weXRob24vdHlwZXMuYyBiL3B5dGhvbi90eXBlcy5jCmluZGV4IDY1NjI2MjAuLmEwNWM0OGEgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90eXBlcy5jCisrKyBiL3B5dGhvbi90eXBlcy5jCkBAIC01NjYsMyArNTY2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgInhtbFRleHRSZWFkZXJQdHIiLCBOVUxMKTsKICAgICByZXR1cm4gKHJldCk7CiB9CisKK1B5T2JqZWN0ICoKK2xpYnhtbF94bWxUZXh0UmVhZGVyTG9jYXRvclB0cldyYXAoeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcikKK3sKKyAgICBQeU9iamVjdCAqcmV0OworCisjaWZkZWYgREVCVUcKKyAgICBwcmludGYoImxpYnhtbF94bWxUZXh0UmVhZGVyTG9jYXRvclB0cldyYXA6IGxvY2F0b3IgPSAlcFxuIiwgbG9jYXRvcik7CisjZW5kaWYKKyAgICBpZiAobG9jYXRvciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIChQeV9Ob25lKTsKKyAgICB9CisgICAgcmV0ID0KKyAgICAgICAgUHlDT2JqZWN0X0Zyb21Wb2lkUHRyQW5kRGVzYygodm9pZCAqKSBsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICJ4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciIsIE5VTEwpOworICAgIHJldHVybiAocmV0KTsKK30KKwpkaWZmIC0tZ2l0IGEvd2luMzIvbGlieG1sMi5kZWYuc3JjIGIvd2luMzIvbGlieG1sMi5kZWYuc3JjCmluZGV4IDhkMmE5NTcuLjUwMjM5MjcgMTAwNjQ0Ci0tLSBhL3dpbjMyL2xpYnhtbDIuZGVmLnNyYworKysgYi93aW4zMi9saWJ4bWwyLmRlZi5zcmMKQEAgLTEyMTksNiArMTIxOSw5IEBACiAJLyogRXJyb3IgaGFuZGxpbmcgZXh0ZW5zaW9ucyAqLwogCXhtbFRleHRSZWFkZXJTZXRFcnJvckhhbmRsZXIKIAl4bWxUZXh0UmVhZGVyR2V0RXJyb3JIYW5kbGVyCisJeG1sVGV4dFJlYWRlckxvY2F0b3JMaW5lTnVtYmVyCisJLyp4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVQb3NpdGlvbiovCisJeG1sVGV4dFJlYWRlckxvY2F0b3JCYXNlVVJJCiAKIAogCmRpZmYgLS1naXQgYS94bWxyZWFkZXIuYyBiL3htbHJlYWRlci5jCmluZGV4IDlhZTRiNmUuLjM2MzIzNzYgMTAwNjQ0Ci0tLSBhL3htbHJlYWRlci5jCisrKyBiL3htbHJlYWRlci5jCkBAIC0yMjgxLDYgKzIyODEsNzQgQEAKICAgICByZXR1cm4gc3RyOwogfQogCisvKioKKyAqIHhtbFRleHRSZWFkZXJMb2NhdG9yTGluZU51bWJlcgorICogQGxvY2F0b3I6IHRoZSB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciB1c2VkCisgKgorICogT2J0YWluIHRoZSBsaW5lIG51bWJlciBmb3IgdGhlIGdpdmVuIGxvY2F0b3IuCisgKgorICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIgb3IgLTEgaW4gY2FzZSBvZiBlcnJvci4KKyAqLworaW50Cit4bWxUZXh0UmVhZGVyTG9jYXRvckxpbmVOdW1iZXIoeG1sVGV4dFJlYWRlckxvY2F0b3JQdHIgbG9jYXRvcikgeworICAgIC8qIHdlIGtub3cgdGhhdCBsb2NhdG9yIGlzIGEgeG1sUGFyc2VyQ3R4dFB0ciAqLworICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4ID0gKHhtbFBhcnNlckN0eHRQdHIpbG9jYXRvcjsKKyAgICBpbnQgcmV0ID0gLTE7CisKKyAgICBpZiAoY3R4LT5ub2RlICE9IE5VTEwpIHsKKwlyZXQgPSB4bWxHZXRMaW5lTm8oY3R4LT5ub2RlKTsKKyAgICB9CisgICAgZWxzZSB7CisJLyogaW5zcGlyZWQgZnJvbSBlcnJvci5jICovCisJeG1sUGFyc2VySW5wdXRQdHIgaW5wdXQ7CisJaW5wdXQgPSBjdHgtPmlucHV0OworCWlmICgoaW5wdXQtPmZpbGVuYW1lID09IE5VTEwpICYmIChjdHgtPmlucHV0TnIgPiAxKSkKKwkgICAgaW5wdXQgPSBjdHgtPmlucHV0VGFiW2N0eC0+aW5wdXROciAtIDJdOworCWlmIChpbnB1dCAhPSBOVUxMKSB7CisJICAgIHJldCA9IGlucHV0LT5saW5lOworCX0gCisJZWxzZSB7CisJICAgIHJldCA9IC0xOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIHhtbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSQorICogQGxvY2F0b3I6IHRoZSB4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciB1c2VkCisgKgorICogT2J0YWluIHRoZSBiYXNlIFVSSSBmb3IgdGhlIGdpdmVuIGxvY2F0b3IuCisgKgorICogUmV0dXJucyB0aGUgYmFzZSBVUkkgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICovCit4bWxDaGFyICoKK3htbFRleHRSZWFkZXJMb2NhdG9yQmFzZVVSSSh4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciBsb2NhdG9yKSB7CisgICAgLyogd2Uga25vdyB0aGF0IGxvY2F0b3IgaXMgYSB4bWxQYXJzZXJDdHh0UHRyICovCisgICAgeG1sUGFyc2VyQ3R4dFB0ciBjdHggPSAoeG1sUGFyc2VyQ3R4dFB0cilsb2NhdG9yOworICAgIHhtbENoYXIgKnJldCA9IE5VTEw7CisKKyAgICBpZiAoY3R4LT5ub2RlICE9IE5VTEwpIHsKKwlyZXQgPSB4bWxOb2RlR2V0QmFzZShOVUxMLGN0eC0+bm9kZSk7CisgICAgfQorICAgIGVsc2UgeworCS8qIGluc3BpcmVkIGZyb20gZXJyb3IuYyAqLworCXhtbFBhcnNlcklucHV0UHRyIGlucHV0OworCWlucHV0ID0gY3R4LT5pbnB1dDsKKwlpZiAoKGlucHV0LT5maWxlbmFtZSA9PSBOVUxMKSAmJiAoY3R4LT5pbnB1dE5yID4gMSkpCisJICAgIGlucHV0ID0gY3R4LT5pbnB1dFRhYltjdHgtPmlucHV0TnIgLSAyXTsKKwlpZiAoaW5wdXQgIT0gTlVMTCkgeworCSAgICByZXQgPSB4bWxTdHJkdXAoaW5wdXQtPmZpbGVuYW1lKTsKKwl9IAorCWVsc2UgeworCSAgICByZXQgPSBOVUxMOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZAogeG1sVGV4dFJlYWRlckdlbmVyaWNFcnJvcih2b2lkICpjdHh0LCBpbnQgc2V2ZXJpdHksIGNoYXIgKnN0cikgewogICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4ID0gKHhtbFBhcnNlckN0eHRQdHIpY3R4dDsKQEAgLTIyODksMTAgKzIzNTcsOCBAQAogICAgIGlmIChzdHIgIT0gTlVMTCkgewogCXJlYWRlci0+ZXJyb3JGdW5jKHJlYWRlci0+ZXJyb3JGdW5jQXJnLAogCQkJICBzdHIsCi0JCQkgIGN0eC0+aW5wdXQtPmxpbmUsCi0JCQkgIGN0eC0+aW5wdXQtPmNvbCwKLQkJCSAgY3R4LT5pbnB1dC0+ZmlsZW5hbWUsCi0JCQkgIHNldmVyaXR5KTsKKwkJCSAgc2V2ZXJpdHksCisJCQkgICh4bWxUZXh0UmVhZGVyTG9jYXRvclB0ciljdHgpOwogCXhtbEZyZWUoc3RyKTsKICAgICB9CiB9CkBAIC0yMzAzLDcgKzIzNjksNyBAQAogCiAgICAgdmFfc3RhcnQoYXAsbXNnKTsKICAgICB4bWxUZXh0UmVhZGVyR2VuZXJpY0Vycm9yKGN0eHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSRUFERVJfU0VWRVJJVFlfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxfUEFSU0VSX1NFVkVSSVRZX0VSUk9SLAogCSAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0UmVhZGVyQnVpbGRNZXNzYWdlKG1zZyxhcCkpOwogICAgIHZhX2VuZChhcCk7CiAKQEAgLTIzMTUsNyArMjM4MSw3IEBACiAKICAgICB2YV9zdGFydChhcCxtc2cpOwogICAgIHhtbFRleHRSZWFkZXJHZW5lcmljRXJyb3IoY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJFQURFUl9TRVZFUklUWV9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1BBUlNFUl9TRVZFUklUWV9XQVJOSU5HLAogCSAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0UmVhZGVyQnVpbGRNZXNzYWdlKG1zZyxhcCkpOwogICAgIHZhX2VuZChhcCk7CiB9CkBAIC0yMzIzLDI0ICsyMzg5LDM3IEBACiBzdGF0aWMgdm9pZCAKIHhtbFRleHRSZWFkZXJWYWxpZGl0eUVycm9yKHZvaWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgbGVuID0geG1sU3RybGVuKChjb25zdCB4bWxDaGFyICopIG1zZyk7CiAKLSAgICB2YV9zdGFydChhcCxtc2cpOwotICAgIHhtbFRleHRSZWFkZXJHZW5lcmljRXJyb3IoY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJFQURFUl9TRVZFUklUWV9WQUxJRElUWV9FUlJPUiwKLQkgICAgICAgICAgICAgICAgICAgICAgeG1sVGV4dFJlYWRlckJ1aWxkTWVzc2FnZShtc2csYXApKTsKLSAgICB2YV9lbmQoYXApOwotCisgICAgaWYgKChsZW4gPiAxKSAmJiAobXNnW2xlbiAtIDJdICE9ICc6JykpIHsKKwkvKiAKKwkgKiBzb21lIGNhbGxiYWNrcyBvbmx5IHJlcG9ydCBsb2NhdG9yIGluZm9ybWF0aW9uOiAKKwkgKiBza2lwIHRoZW0gKG1pbWlja2luZyBiZWhhdmlvdXIgaW4gZXJyb3IuYykgCisJICovCisJdmFfc3RhcnQoYXAsbXNnKTsKKwl4bWxUZXh0UmVhZGVyR2VuZXJpY0Vycm9yKGN0eHQsCisJCQkJICBYTUxfUEFSU0VSX1NFVkVSSVRZX1ZBTElESVRZX0VSUk9SLAorCQkJCSAgeG1sVGV4dFJlYWRlckJ1aWxkTWVzc2FnZShtc2csYXApKTsKKwl2YV9lbmQoYXApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgCiB4bWxUZXh0UmVhZGVyVmFsaWRpdHlXYXJuaW5nKHZvaWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgbGVuID0geG1sU3RybGVuKChjb25zdCB4bWxDaGFyICopIG1zZyk7CiAKLSAgICB2YV9zdGFydChhcCxtc2cpOwotICAgIHhtbFRleHRSZWFkZXJHZW5lcmljRXJyb3IoY3R4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJFQURFUl9TRVZFUklUWV9WQUxJRElUWV9XQVJOSU5HLAotCSAgICAgICAgICAgICAgICAgICAgICB4bWxUZXh0UmVhZGVyQnVpbGRNZXNzYWdlKG1zZyxhcCkpOwotICAgIHZhX2VuZChhcCk7CisgICAgaWYgKChsZW4gIT0gMCkgJiYgKG1zZ1tsZW4gLSAxXSAhPSAnOicpKSB7CisJLyogCisJICogc29tZSBjYWxsYmFja3Mgb25seSByZXBvcnQgbG9jYXRvciBpbmZvcm1hdGlvbjogCisJICogc2tpcCB0aGVtIChtaW1pY2tpbmcgYmVoYXZpb3VyIGluIGVycm9yLmMpIAorCSAqLworCXZhX3N0YXJ0KGFwLG1zZyk7CisJeG1sVGV4dFJlYWRlckdlbmVyaWNFcnJvcihjdHh0LAorCQkJCSAgWE1MX1BBUlNFUl9TRVZFUklUWV9WQUxJRElUWV9XQVJOSU5HLAorCQkJCSAgeG1sVGV4dFJlYWRlckJ1aWxkTWVzc2FnZShtc2csYXApKTsKKwl2YV9lbmQoYXApOworICAgIH0KIH0KIAogLyoqCkBAIC0yMzQ5LDEzICsyNDI4LDE0IEBACiAgKiBAZjoJdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGNhbGwgb24gZXJyb3IgYW5kIHdhcm5pbmdzCiAgKiBAYXJnOiAgICBhIHVzZXIgYXJndW1lbnQgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KICAqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZXJyb3IgYW5kIHdhcm5pbmdzLgorICoKICAqIElmIEBmIGlzIE5VTEwsIHRoZSBkZWZhdWx0IGVycm9yIGFuZCB3YXJuaW5nIGhhbmRsZXJzIGFyZSByZXN0b3JlZC4KICAqLwogdm9pZAogeG1sVGV4dFJlYWRlclNldEVycm9ySGFuZGxlcih4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwgCiAJCQkgICAgIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgZiwgCi0JCQkgICAgIHZvaWQgKmFyZykKLXsKKwkJCSAgICAgdm9pZCAqYXJnKSB7CiAgICAgaWYgKGYgIT0gTlVMTCkgewogCXJlYWRlci0+Y3R4dC0+c2F4LT5lcnJvciA9IHhtbFRleHRSZWFkZXJFcnJvcjsKIAlyZWFkZXItPmN0eHQtPnZjdHh0LmVycm9yID0geG1sVGV4dFJlYWRlclZhbGlkaXR5RXJyb3I7CkBAIC0yMzc1LDExICsyNDU1LDE4IEBACiAgICAgfQogfQogCisvKioKKyAqIHhtbFRleHRSZWFkZXJHZXRFcnJvckhhbmRsZXI6CisgKiBAcmVhZGVyOiAgdGhlIHhtbFRleHRSZWFkZXJQdHIgdXNlZAorICogQGY6CXRoZSBjYWxsYmFjayBmdW5jdGlvbiBvciBOVUxMIGlzIG5vIGNhbGxiYWNrIGhhcyBiZWVuIHJlZ2lzdGVyZWQKKyAqIEBhcmc6ICAgIGEgdXNlciBhcmd1bWVudAorICoKKyAqIFJldHJpZXZlIHRoZSBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiBhbmQgdXNlciBhcmd1bWVudC4KKyAqLwogdm9pZAogeG1sVGV4dFJlYWRlckdldEVycm9ySGFuZGxlcih4bWxUZXh0UmVhZGVyUHRyIHJlYWRlciwgCiAJCQkgICAgIHhtbFRleHRSZWFkZXJFcnJvckZ1bmMgKmYsIAotCQkJICAgICB2b2lkICoqYXJnKQoteworCQkJICAgICB2b2lkICoqYXJnKSB7CiAgICAgKmYgPSByZWFkZXItPmVycm9yRnVuYzsKICAgICAqYXJnID0gcmVhZGVyLT5lcnJvckZ1bmNBcmc7CiB9Cg==