ZGlmZiAtLWdpdCBhL3NyYy9seW5xL2xpYi9saWJseW5xLXdpZmk2L2xpYndpZmk2LmMgYi9zcmMvbHlucS9saWIvbGlibHlucS13aWZpNi9saWJ3aWZpNi5jCmluZGV4IGY1NmNjMmQuLjNmMGFkNGQgMTAwNzU1Ci0tLSBhL3NyYy9seW5xL2xpYi9saWJseW5xLXdpZmk2L2xpYndpZmk2LmMKKysrIGIvc3JjL2x5bnEvbGliL2xpYmx5bnEtd2lmaTYvbGlid2lmaTYuYwpAQCAtNDEsMTEgKzQxLDE1IEBACiAjZGVmaW5lIENUUkxfQVAgMQogI2RlZmluZSBBUF9ORVRXT1JLXzAgMAogI2RlZmluZSBTVEFfTUFYX1NBVkVEX0FQX05VTSA1MAorI2RlZmluZSBNQUNfTEVOIDE3CiAKIHB0aHJlYWRfdCBnX2FwX3dhdGNoZXJfcGlkID0gMDsKIHZvbGF0aWxlIGludCBnX2FwX3dhdGNoZXJfc3RvcF9mbGFnID0gMDsKIHZvbGF0aWxlIGludCBnX2FwX3dhdGNoZXJfc3RhcnRlZF9mbGFnID0gMDsKIAorcHRocmVhZF90IGdfYXBfdG1wX3dhdGNoZXJfcGlkID0gMDsKK3ZvbGF0aWxlIGludCBnX2FwX3RtcF93YXRjaGVyX3N0b3BfZmxhZyA9IDA7CisKIHB0aHJlYWRfdCBnX3N0YV93YXRjaGVyX3BpZCA9IDA7CiB2b2xhdGlsZSBpbnQgZ19zdGFfd2F0Y2hlcl9zdG9wX2ZsYWcgPSAwOwogdm9sYXRpbGUgaW50IGdfc3RhX3NjYW5fZmluaXNoX2ZsYWcgPSAxOwpAQCAtNTMxLDYgKzUzNSwxNTcgQEAKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19nbG9iYWxfY2hlY2tfbXV0ZXgpOwogfQogCisvKgoranVzdCB0bXAgYWRkIGZvciBmaXggc3RhIGNvbm5lY3QgYXAgZmFpbCBjaGVjayBhcCBjb25uZWN0IGluZm8KK3JldHVybiAwIC0tLT5DdXJyZW50IG5vIHN0YSBkZXZpY2UgY29ubmVjdCB0aGlzIEFQCisqLworc3RhdGljIGludCBseW5xX2Nvbm5lY3RlZF9hcF9zdGFfc3RhdHVzKCkgeworCisgICAgRklMRSAqZnA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGludCByZXQ7CisgICAgY2hhciBseW5xX2NtZF9yZXRbTUFYX1JFVF09ezB9OworCisgICAgaWYoKGZwPXBvcGVuKCJ3cGFfY2xpIC1pd3BhX3dsYW4wX2NtZCAtcC92YXIvcnVuLyBJRk5BTUU9YXAwIGxpc3Rfc3RhIiwiciIpKT09TlVMTCkKKyAgICB7CisgICAgICAgIHBlcnJvcigicG9wZW4gZXJyb3IhIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoKGZyZWFkKGx5bnFfY21kX3JldCxzaXplb2YobHlucV9jbWRfcmV0KSwxLGZwKSk8MCkKKyAgICB7CisgICAgICAgIHBlcnJvcigiZnJlYWQgZmFpbCEiKTsKKyAgICAgICAgcmV0PXBjbG9zZShmcCk7CisgICAgICAgIGlmKHJldCA9PSAtMSkKKyAgICAgICAgICAgIHBlcnJvcigiY2xvc2UgZmlsZSBmYWlsZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKCBzdHJsZW4obHlucV9jbWRfcmV0KSA8IE1BQ19MRU4pCisgICAgeworICAgICAgICBSTE9HRCgiLS0tQ3VycmVudCBubyBzdGEgZGV2aWNlIGNvbm5lY3QgdGhpcyBBUCAlcyAgJWRcbiIsIGx5bnFfY21kX3JldCxzdHJsZW4obHlucV9jbWRfcmV0KSk7CisgICAgICAgIHJldD1wY2xvc2UoZnApOworICAgICAgICBpZihyZXQ9PS0xKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImNsb3NlIGZpbGUgZmFpbGQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0PXBjbG9zZShmcCk7CisgICAgICAgIGlmKHJldD09LTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvcigiY2xvc2UgZmlsZSBmYWlsZCIpOworICAgICAgICB9CisgICAgICAgIFJMT0dEKCItLS1DdXJyZW50IGhhcyBzdGEgZGV2aWNlIGNvbm5lY3QgdGhpcyBBUC0tLSAlc1xuIiwgbHlucV9jbWRfcmV0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgIH0KK30KKworLyoKKyAgICBqdXN0IHRtcCBhZGQgZm9yIGZpeCBzdGEgY29ubmVjdCBhcCBmYWlsOyBjaGVjayBmdyBzdGF0dXMKKyAgICByZXR1cm4gMSAtLS0tPiBmdyBzdGF0dXMgZXJyb3I7IG5lZWQgd2wgZG93bi91cAorKi8KK3N0YXRpYyBpbnQgY2hlY2tfY3VycmVudF9md19zdGF0dXMoKSB7CisKKyAgICBGSUxFICpmcDsKKyAgICBGSUxFICpmcDE7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGludCByZXQ7CisgICAgY2hhciBseW5xX2NtZF9yZXRfMmdbTUFYX1JFVF09ezB9OworICAgIGNoYXIgbHlucV9jbWRfcmV0XzVnW01BWF9SRVRdPXswfTsKKworICAgIGNvbnN0IGNoYXIgKiBmd19zdGF0dXMgPSAiMHgwMDk2IjsgICAgLy8weDAwOTYgaXMgbm9ybWFsIGZ3IHN0YXR1cworCisgICAgaWYoKGZwPXBvcGVuKCJ3bCBzaG1lbSAgMHgxNWVlIGEiLCJyIikpPT1OVUxMKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJwb3BlbiBlcnJvciEiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZigoZnJlYWQobHlucV9jbWRfcmV0XzVnLHNpemVvZihseW5xX2NtZF9yZXRfMmcpLDEsZnApKTwwKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJmcmVhZCBmYWlsISIpOworICAgICAgICBpZihwY2xvc2UoZnApID09IC0xKQorICAgICAgICAgICAgcGVycm9yKCJjbG9zZSBmcCBmaWxlIGZhaWxkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZigoZnAxPXBvcGVuKCJ3bCBzaG1lbSAgMHgxNWVlIGIiLCJyIikpPT1OVUxMKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJwb3BlbiBlcnJvciEiKTsKKyAgICAgICAgaWYocGNsb3NlKGZwKSA9PSAtMSkKKyAgICAgICAgICAgIHBlcnJvcigiY2xzb2UgZnAgZmlsZSBmYWlsZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKChmcmVhZChseW5xX2NtZF9yZXRfMmcsc2l6ZW9mKGx5bnFfY21kX3JldF81ZyksMSxmcDEpKTwwKQorICAgIHsKKyAgICAgICAgcGVycm9yKCJmcmVhZCBmYWlsISIpOworICAgICAgICBpZihwY2xvc2UoZnAxKSA9PSAtMSkKKyAgICAgICAgICAgIHBlcnJvcigiY2xzb2UgZnAxIGZpbGUgZmFpbGQiKTsKKyAgICAgICAgaWYocGNsb3NlKGZwKSA9PSAtMSkKKyAgICAgICAgICAgIHBlcnJvcigiY2xzb2UgZnAgZmlsZSBmYWlsZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCBzdHJuY21wKGZ3X3N0YXR1cyxseW5xX2NtZF9yZXRfMmcsNikgPT0gMCB8fCBzdHJuY21wKGZ3X3N0YXR1cyxseW5xX2NtZF9yZXRfNWcsNikgPT0gMCApCisgICAgeworICAgICAgICByZXQ9cGNsb3NlKGZwKTsKKyAgICAgICAgaWYocmV0PT0tMSkKKyAgICAgICAgeworICAgICAgICAgICAgcGVycm9yKCJjbG9zZSBmcCBmaWxlIGZhaWxkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0PXBjbG9zZShmcDEpOworICAgICAgICBpZihyZXQ9PS0xKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImNsb3NlIGZwMSBmaWxlIGZhaWxkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2UKKyAgICB7CisgICAgICAgIHJldD1wY2xvc2UoZnApOworICAgICAgICBpZihyZXQ9PS0xKQorICAgICAgICB7CisgICAgICAgICAgIHBlcnJvcigiY2xvc2UgZmlsZSBmYWlsZCIpOworICAgICAgICB9CisgICAgICAgIGlmKHBjbG9zZShmcDEpID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJyb3IoImNsc29lIGZpbGUgZnAxIGZhaWxkIik7CisgICAgICAgIH0KKyAgICAgICAgUkxPR0QoImN1cnJlbnQgZncgc3RhdHVzIC0tZXJyb3ItLSIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEFQVG1wV2F0Y2hlclRocmVhZFByb2MoKSB7CisKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGRlbHl0aW1lID0gMzAwOworICAgIGdfYXBfdG1wX3dhdGNoZXJfc3RvcF9mbGFnID0gMDsKKworICAgIFJMT0dEKCJBUFRtcFdhdGNoZXJUaHJlYWRQcm9jIC0tLS0+IFRocmVhZFByb2Mgc3RhcnQiKTsKKyAgICB3aGlsZSgxKQorICAgIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKCBpID09IGRlbHl0aW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGx5bnFfY29ubmVjdGVkX2FwX3N0YV9zdGF0dXMoKSA9PSAwICkgICAgICAvL28gLS0tPm5vIHN0YSBkZXZpY2UgY29ubmVjdCB0aGlzIGFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoY2hlY2tfY3VycmVudF9md19zdGF0dXMoKSA9PSAxKSAgICAgICAgLy8xIC0tLT5jdXJyZW50IGZ3IHN0YXR1cyBub3QgMHgwMDk2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzeXN0ZW0oIndsIGRvd24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtKCJ3bCB1cCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGdfYXBfdG1wX3dhdGNoZXJfc3RvcF9mbGFnID09IDEgKSAgICAgICAvL3F1aXQgcHJvYworICAgICAgICB7CisgICAgICAgICAgIFJMT0dEKCJBUFRtcFdhdGNoZXJUaHJlYWRQcm9jIC0tLS0tID4gYXAgY2xvc2VkIG9yIHdpZmkgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCit9CisKIHN0YXRpYyBpbnQgbHlucV93aWZpX3N0YV9zdG9wX25ldHdvcmsobHlucV93aWZpX2luZGV4X2UgaWR4LGludCBuZXR3b3JraWQpCiB7CiAgICAgY2hhciBMWU5RX0RJU0FCTEVfQ01EWzEyOF09ezB9OwpAQCAtNzkwLDcgKzk0NSw3IEBACiAgICAgICAgICAgICBSTE9HRCgiRklORCBDVFJMIEVWRU5UIDogQ1RSTC1FVkVOVC1BU1NPQy1SRUpFQ1QgQlVUIE5PVCBGT1VORCBTVEFUVVNfQ09ERVxuIik7CiAgICAgICAgICAgICAqZXJyb3IgPSBMWU5RX1VOU1BFQ0lGSUVEX1JFQVNPTjsKICAgICAgICAgICAgICpzdGF0ZSA9IExZTlFfV0lGSV9TVEFfU1RBVFVTX0RJU0NPTk5FQ1Q7Ci0gICAgICAgICAgICBSTE9HRCgiQ1RSTC1FVkVOVC1BU1NPQy1SRUpFQ1Qgc3RhdGU6JWQsZXJyb3I6JWSjrG5ldHdvcmtpZDolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOworICAgICAgICAgICAgUkxPR0QoIkNUUkwtRVZFTlQtQVNTT0MtUkVKRUNUIHN0YXRlOiVkLGVycm9yOiVkLG5ldHdvcmtpZDolZFxuIiwqc3RhdGUsKmVycm9yLCpuZXR3b3JraWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTEyNiw2ICsxMjgxLDcgQEAKICAgICBnX2FwX3dhdGNoZXJfc3RvcF9mbGFnID0gMTsKICAgICBnX3N0YV93YXRjaGVyX3N0b3BfZmxhZyA9IDE7CiAgICAgZ19zdGFfYXV0b193YXRjaGVyX3N0b3BfZmxhZyA9IDE7CisgICAgZ19hcF90bXBfd2F0Y2hlcl9zdG9wX2ZsYWcgPSAxOwogICAgIGlmIChnX2FwX3dhdGNoZXJfcGlkICE9IDApCiAgICAgICAgIHB0aHJlYWRfam9pbihnX2FwX3dhdGNoZXJfcGlkLCBOVUxMKTsKICAgICBpZiAoZ19zdGFfd2F0Y2hlcl9waWQgIT0gMCkKQEAgLTExMzYsNiArMTI5Miw4IEBACiAgICAgICAgIHdwYV9jdHJsX2Nsb3NlKGdfbHlucV93cGFfY3RybFswXSk7CiAgICAgaWYgKGdfbHlucV93cGFfY3RybFsxXSAhPSBOVUxMKQogICAgICAgICB3cGFfY3RybF9jbG9zZShnX2x5bnFfd3BhX2N0cmxbMV0pOworICAgIGlmIChnX2FwX3RtcF93YXRjaGVyX3BpZCAhPSAwKQorICAgICAgICBwdGhyZWFkX2pvaW4oZ19hcF90bXBfd2F0Y2hlcl9waWQsIE5VTEwpOwogICAgIGdfYXBfd2F0Y2hlcl9waWQgPSAwOwogICAgIGdfc3RhX3dhdGNoZXJfcGlkID0gMDsKICAgICBnX3N0YV9hdXRvX3dhdGNoZXJfcGlkID0gMDsKQEAgLTIyODAsNiArMjQzOCwxNiBAQAogICAgIH0KIAogICAgIGNoZWNrX3RldGhlcl9hbmRfbm90aWZ5KCk7CisgICAgaWYgKGdfYXBfdG1wX3dhdGNoZXJfcGlkID09IDApCisgICAgeworICAgICAgICBpZihwdGhyZWFkX2NyZWF0ZSgmZ19hcF90bXBfd2F0Y2hlcl9waWQsTlVMTCxBUFRtcFdhdGNoZXJUaHJlYWRQcm9jLE5VTEwpIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ19hcF90bXBfd2F0Y2hlcl9waWQgPSAwOworICAgICAgICAgICAgUkxPR0UoIlt3aWZpIGVycm9yXWNyZWF0ZSBBUFRtcFdhdGNoZXJUaHJlYWRQcm9jIGZhaWwiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBSTE9HRCgiW2x5bnFfd2lmaV9hcF9zdGFydF0gY3JlYXQgQVBUbXBXYXRjaGVyVGhyZWFkUHJvYyBvayIpOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtMjMwOSw2ICsyNDc3LDEwIEBACiAgICAgICAgIFJMT0dFKCJseW5xX3dpZmlfYXBfc3RhcnQgZXhjdXRlIHNjcmlwdCBmYWlsIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgZ19hcF90bXBfd2F0Y2hlcl9zdG9wX2ZsYWcgPSAxOworICAgIGlmIChnX2FwX3RtcF93YXRjaGVyX3BpZCAhPSAwKQorICAgICAgICBwdGhyZWFkX2pvaW4oZ19hcF90bXBfd2F0Y2hlcl9waWQsIE5VTEwpOworICAgIGdfYXBfdG1wX3dhdGNoZXJfcGlkID0gMDsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMzkxOSw2ICs0MDkxLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgaW50IGNoZWNrX2FuZF9pbml0X3VjaV9jb25maWcoY2hhciAqIGNvdW50cnlfY29kZSkKIHsKICAgICBGSUxFICogZnA7CkBAIC0zOTU2LDcgKzQxMjksNyBAQAogCiAgICAgaWYgKCBzdHJuY21wKGx5bnFfY21kX3JldCxjb3VudHJ5X2NvZGUsMikgIT0gMCApCiAgICAgewotICAgICAgICBSTE9HRSgiZ2V0IGNvdW50cnkgY29kZSBmb3IgdWNpICVz77yMaW5wdXQgY3B1bnRyeSBjb2RlIGlzOiVzXG4iLGx5bnFfY21kX3JldCxjb3VudHJ5X2NvZGUpOworCVJMT0dFKCJnZXQgY291bnRyeSBjb2RlIGZvciB1Y2kgJXPvvIxpbnB1dCBjcHVudHJ5IGNvZGUgaXM6JXNcbiIsbHlucV9jbWRfcmV0LGNvdW50cnlfY29kZSk7CiAgICAgICAgIGlzX2RpZmZlcmVudCA9IDE7CiAgICAgfQogCg==