ZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL0NNYWtlTGlzdHMudHh0CmluZGV4IDY4NThjYmIuLjMxMTUyNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi9pbmNsdWRlKQogCiBpZihBUFBMRSkKICAgaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4NiIpCkBAIC01Nyw3ICs1Nyw2IEBACiAgIHNldCgKICAgICBDUllQVE9fQVJDSF9TT1VSQ0VTCiAKLSAgICBjcHUteDg2XzY0LWFzbS4ke0FTTV9FWFR9CiAgICAgY3B1LWludGVsLmMKICAgKQogZW5kaWYoKQpAQCAtNjYsNyArNjUsNiBAQAogICBzZXQoCiAgICAgQ1JZUFRPX0FSQ0hfU09VUkNFUwogCi0gICAgY3B1LXg4Ni1hc20uJHtBU01fRVhUfQogICAgIGNwdS1pbnRlbC5jCiAgICkKIGVuZGlmKCkKQEAgLTIzMCw2ICsyMjgsMyBAQAogKQogCiB0YXJnZXRfbGlua19saWJyYXJpZXMocmVmY291bnRfdGVzdCBjcnlwdG8pCi0KLXBlcmxhc20oY3B1LXg4Nl82NC1hc20uJHtBU01fRVhUfSBjcHUteDg2XzY0LWFzbS5wbCkKLXBlcmxhc20oY3B1LXg4Ni1hc20uJHtBU01fRVhUfSBjcHUteDg2LWFzbS5wbCkKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYWVzL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQKaW5kZXggNDkwZjQwYS4uYzgyZDk5YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9hZXMvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKQEAgLTYwLDMgKzYwLDEyIEBACiBwZXJsYXNtKGFlcy1hcm12NC4ke0FTTV9FWFR9IGFzbS9hZXMtYXJtdjQucGwpCiBwZXJsYXNtKGJzYWVzLWFybXY3LiR7QVNNX0VYVH0gYXNtL2JzYWVzLWFybXY3LnBsKQogcGVybGFzbShhZXN2OC1hcm14LiR7QVNNX0VYVH0gYXNtL2Flc3Y4LWFybXgucGwpCisKK2FkZF9leGVjdXRhYmxlKAorICBhZXNfdGVzdAorCisgIGFlc190ZXN0LmNjCisgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgorKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMoYWVzX3Rlc3QgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hZXMvYWVzX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL2Flcy9hZXNfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg4ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9hZXMvYWVzX3Rlc3QuY2MKQEAgLTAsMCArMSwxMDIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKworc3RhdGljIGJvb2wgVGVzdEFFUyhjb25zdCB1aW50OF90ICprZXksIHNpemVfdCBrZXlfbGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHBsYWludGV4dFtBRVNfQkxPQ0tfU0laRV0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY2lwaGVydGV4dFtBRVNfQkxPQ0tfU0laRV0pIHsKKyAgQUVTX0tFWSBhZXNfa2V5OworICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShrZXksIGtleV9sZW4gKiA4LCAmYWVzX2tleSkgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQUVTX3NldF9lbmNyeXB0X2tleSBmYWlsZWRcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRlc3QgZW5jcnlwdGlvbi4KKyAgdWludDhfdCBibG9ja1tBRVNfQkxPQ0tfU0laRV07CisgIEFFU19lbmNyeXB0KHBsYWludGV4dCwgYmxvY2ssICZhZXNfa2V5KTsKKyAgaWYgKG1lbWNtcChibG9jaywgY2lwaGVydGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19lbmNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGVzdCBpbi1wbGFjZSBlbmNyeXB0aW9uLgorICBtZW1jcHkoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpOworICBBRVNfZW5jcnlwdChibG9jaywgYmxvY2ssICZhZXNfa2V5KTsKKyAgaWYgKG1lbWNtcChibG9jaywgY2lwaGVydGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19lbmNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5LCBrZXlfbGVuICogOCwgJmFlc19rZXkpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19zZXRfZGVjcnlwdF9rZXkgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBUZXN0IGRlY3J5cHRpb24uCisgIEFFU19kZWNyeXB0KGNpcGhlcnRleHQsIGJsb2NrLCAmYWVzX2tleSk7CisgIGlmIChtZW1jbXAoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19kZWNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGVzdCBpbi1wbGFjZSBkZWNyeXB0aW9uLgorICBtZW1jcHkoYmxvY2ssIGNpcGhlcnRleHQsIEFFU19CTE9DS19TSVpFKTsKKyAgQUVTX2RlY3J5cHQoYmxvY2ssIGJsb2NrLCAmYWVzX2tleSk7CisgIGlmIChtZW1jbXAoYmxvY2ssIHBsYWludGV4dCwgQUVTX0JMT0NLX1NJWkUpICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkFFU19kZWNyeXB0IGdhdmUgdGhlIHdyb25nIG91dHB1dFxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbigpIHsKKyAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOworCisgIC8vIFRlc3QgdmVjdG9ycyBmcm9tIEZJUFMtMTk3LCBBcHBlbmRpeCBDLgorICBpZiAoIVRlc3RBRVMoKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDA4XHgwOVx4MGFceDBiXHgwY1x4MGRceDBlXHgwZiIsCisgICAgICAgICAgICAgICAxMjggLyA4LAorICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceDY5XHhjNFx4ZTBceGQ4XHg2YVx4N2JceDA0XHgzMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDhceGNkXHhiN1x4ODBceDcwXHhiNFx4YzVceDVhIikgfHwKKyAgICAgICFUZXN0QUVTKChjb25zdCB1aW50OF90ICopIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIsCisgICAgICAgICAgICAgICAxOTIgLyA4LAorICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKikiXHgwMFx4MTFceDIyXHgzM1x4NDRceDU1XHg2Nlx4NzciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDg4XHg5OVx4YWFceGJiXHhjY1x4ZGRceGVlXHhmZiIsCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceGRkXHhhOVx4N2NceGE0XHg4Nlx4NGNceGRmXHhlMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NmVceGFmXHg3MFx4YTBceGVjXHgwZFx4NzFceDkxIikgfHwKKyAgICAgICFUZXN0QUVTKChjb25zdCB1aW50OF90ICopIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwOFx4MDlceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxNyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MThceDE5XHgxYVx4MWJceDFjXHgxZFx4MWVceDFmIiwKKyAgICAgICAgICAgICAgIDI1NiAvIDgsCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKSJceDAwXHgxMVx4MjJceDMzXHg0NFx4NTVceDY2XHg3NyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ODhceDk5XHhhYVx4YmJceGNjXHhkZFx4ZWVceGZmIiwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopIlx4OGVceGEyXHhiN1x4Y2FceDUxXHg2N1x4NDVceGJmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhlYVx4ZmNceDQ5XHg5MFx4NGJceDQ5XHg2MFx4ODkiKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hZXMvYXNtL2Flcy01ODYucGwgYi9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbAppbmRleCAwN2ZiOTRjLi42ZThhNmE4IDEwMDc1NQotLS0gYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbAorKysgYi9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApAQCAtNDUsNyArNDUsNyBAQAogIyB0aGUgdW5kZXJ0YWtlbiBlZmZvcnQgd2FzIHRoYXQgaXQgYXBwZWFyZWQgdGhhdCBpbiB0aWdodCBJQS0zMgogIyByZWdpc3RlciB3aW5kb3cgbGl0dGxlLWVuZGlhbiBmbGF2b3IgY291bGQgYWNoaWV2ZSBzbGlnaHRseSBoaWdoZXIKICMgSW5zdHJ1Y3Rpb24gTGV2ZWwgUGFyYWxsZWxpc20sIGFuZCBpdCBpbmRlZWQgcmVzdWx0ZWQgaW4gdXAgdG8gMTUlCi0jIGJldHRlciBwZXJmb3JtYW5jZSBvbiBtb3N0IHJlY2VudCC1LWFyY2hzLi4uCisjIGJldHRlciBwZXJmb3JtYW5jZSBvbiBtb3N0IHJlY2VudCDCtS1hcmNocy4uLgogIwogIyBUaGlyZCB2ZXJzaW9uIGFkZHMgQUVTX2NiY19lbmNyeXB0IGltcGxlbWVudGF0aW9uLCB3aGljaCByZXN1bHRlZCBpbgogIyB1cCB0byA0MCUgcGVyZm9ybWFuY2UgaW1yb3ZlbWVudCBvZiBDQkMgYmVuY2htYXJrIHJlc3VsdHMuIDQwJSB3YXMKQEAgLTIyNCw3ICsyMjQsNyBAQAogJHNwZWVkX2xpbWl0PTUxMjsJIyBjaHVua3Mgc21hbGxlciB0aGFuICRzcGVlZF9saW1pdCBhcmUKIAkJCSMgcHJvY2Vzc2VkIHdpdGggY29tcGFjdCByb3V0aW5lIGluIENCQyBtb2RlCiAkc21hbGxfZm9vdHByaW50PTE7CSMgJHNtYWxsX2Zvb3RwcmludD0xIGNvZGUgaXMgfjUlIHNsb3dlciBbb24KLQkJCSMgcmVjZW50ILUtYXJjaHNdLCBidXQgfjUgdGltZXMgc21hbGxlciEKKwkJCSMgcmVjZW50IMK1LWFyY2hzXSwgYnV0IH41IHRpbWVzIHNtYWxsZXIhCiAJCQkjIEkgZmF2b3IgY29tcGFjdCBjb2RlIHRvIG1pbmltaXplIGNhY2hlCiAJCQkjIGNvbnRlbnRpb24gYW5kIGluIGhvcGUgdG8gImNvbGxlY3QiIDUlIGJhY2sKIAkJCSMgaW4gcmVhbC1saWZlIGFwcGxpY2F0aW9ucy4uLgpAQCAtNTY1LDcgKzU2NSw3IEBACiAjIFBlcmZvcm1hbmNlIGlzIG5vdCBhY3R1YWxseSBleHRyYW9yZGluYXJ5IGluIGNvbXBhcmlzb24gdG8gcHVyZQogIyB4ODYgY29kZS4gSW4gcGFydGljdWxhciBlbmNyeXB0IHBlcmZvcm1hbmNlIGlzIHZpcnR1YWxseSB0aGUgc2FtZS4KICMgRGVjcnlwdCBwZXJmb3JtYW5jZSBvbiB0aGUgb3RoZXIgaGFuZCBpcyAxNS0yMCUgYmV0dGVyIG9uIG5ld2VyCi0jILUtYXJjaHMgW2J1dCB3ZSdyZSB0aGFua2Z1bCBmb3IgKmFueSogaW1wcm92ZW1lbnQgaGVyZV0sIGFuZCB+NTAlCisjIMK1LWFyY2hzIFtidXQgd2UncmUgdGhhbmtmdWwgZm9yICphbnkqIGltcHJvdmVtZW50IGhlcmVdLCBhbmQgfjUwJQogIyBiZXR0ZXIgb24gUElJSTotKSBBbmQgYWRkaXRpb25hbGx5IG9uIHRoZSBwcm9zIHNpZGUgdGhpcyBjb2RlCiAjIGVsaW1pbmF0ZXMgcmVkdW5kYW50IHJlZmVyZW5jZXMgdG8gc3RhY2sgYW5kIHRodXMgcmVsaWV2ZXMvCiAjIG1pbmltaXplcyB0aGUgcHJlc3N1cmUgb24gdGhlIG1lbW9yeSBidXMuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsIGIvc3JjL2NyeXB0by9hZXMvYXNtL2Flcy1hcm12NC5wbAppbmRleCAzNmNkM2I2Li44ODIwMTdhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXMtYXJtdjQucGwKQEAgLTY1LDcgKzY1LDcgQEAKICRjb2RlPTw8X19fOwogI2lmIGRlZmluZWQoX19hcm1fXykKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlICJhcm1fYXJjaC5oIgorIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAjZWxzZQogIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXwogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYWVzdjgtYXJteC5wbCBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCmluZGV4IGIwOTE2ZjYuLjEyMTE1NGEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9hZXN2OC1hcm14LnBsCkBAIC00NSw3ICs0NSw3IEBACiAkcHJlZml4PSJhZXNfdjgiOwogCiAkY29kZT08PF9fXzsKLSNpbmNsdWRlICJhcm1fYXJjaC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KIAogI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKIC50ZXh0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Flcy9hc20vYnNhZXMtYXJtdjcucGwgYi9zcmMvY3J5cHRvL2Flcy9hc20vYnNhZXMtYXJtdjcucGwKaW5kZXggMjczZjBiOS4uN2ZlMzQ5YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hZXMvYXNtL2JzYWVzLWFybXY3LnBsCisrKyBiL3NyYy9jcnlwdG8vYWVzL2FzbS9ic2Flcy1hcm12Ny5wbApAQCAtNzAzLDcgKzcwMyw3IEBACiAkY29kZS49PDxfX187CiAjaWYgZGVmaW5lZChfX2FybV9fKQogI2lmbmRlZiBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgImFybV9hcmNoLmgiCisjIGluY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KIAogIyBkZWZpbmUgVkZQX0FCSV9QVVNICXZzdG1kYglzcCEse2Q4LWQxNX0KICMgZGVmaW5lIFZGUF9BQklfUE9QCXZsZG1pYQlzcCEse2Q4LWQxNX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXJtX2FyY2guaCBiL3NyYy9jcnlwdG8vYXJtX2FyY2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwMGZiYi4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL2FybV9hcmNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDExIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0Ci0gKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgotICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCi0gKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCi0gKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KLQotI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9BUk1fQVJDSF9ICi0jZGVmaW5lIE9QRU5TU0xfSEVBREVSX0FSTV9BUkNIX0gKLQotI2lmICFkZWZpbmVkKF9fQVJNX0FSQ0hfXykKLSMgaWYgZGVmaW5lZChfX0NDX0FSTSkKLSMgIGRlZmluZSBfX0FSTV9BUkNIX18gX19UQVJHRVRfQVJDSF9BUk0KLSMgIGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotIyAgIGRlZmluZSBfX0FSTUVCX18KLSMgIGVsc2UKLSMgICBkZWZpbmUgX19BUk1FTF9fCi0jICBlbmRpZgotIyBlbGlmIGRlZmluZWQoX19HTlVDX18pCi0jICBpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQotIyAgICBkZWZpbmUgX19BUk1fQVJDSF9fIDgKLSMgICAgaWYgX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9CSUdfRU5ESUFOX18KLSMgICAgICBkZWZpbmUgX19BUk1FQl9fCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgX19BUk1FTF9fCi0jICAgIGVuZGlmCi0gIC8qIFdoeSBkb2Vzbid0IGdjYyBkZWZpbmUgX19BUk1fQVJDSF9fPyBJbnN0ZWFkIGl0IGRlZmluZXMKLSAgICogYnVuY2ggb2YgYmVsb3cgbWFjcm9zLiBTZWUgYWxsX2FyY2hpdGVjdGlyZXNbXSB0YWJsZSBpbgotICAgKiBnY2MvY29uZmlnL2FybS9hcm0uYy4gT24gYSBzaWRlIG5vdGUgaXQgZGVmaW5lcwotICAgKiBfX0FSTUVMX18vX19BUk1FQl9fIGZvciBsaXR0bGUtL2JpZy1lbmRpYW4uICovCi0jICBlbGlmCWRlZmluZWQoX19BUk1fQVJDSCkKLSMgICAgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0FSTV9BUkNICi0jICBlbGlmCWRlZmluZWQoX19BUk1fQVJDSF84QV9fKQotIyAgICBkZWZpbmUgX19BUk1fQVJDSF9fIDgKLSMgIGVsaWYJZGVmaW5lZChfX0FSTV9BUkNIXzdfXykJfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pCXx8IFwKLQlkZWZpbmVkKF9fQVJNX0FSQ0hfN1JfXyl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykJfHwgXAotCWRlZmluZWQoX19BUk1fQVJDSF83RU1fXykKLSMgICBkZWZpbmUgX19BUk1fQVJDSF9fIDcKLSMgIGVsaWYJZGVmaW5lZChfX0FSTV9BUkNIXzZfXykJfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZKX18pCXx8IFwKLQlkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXyl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNk1fXykJfHwgXAotCWRlZmluZWQoX19BUk1fQVJDSF82Wl9fKXx8IGRlZmluZWQoX19BUk1fQVJDSF82WktfXykJfHwgXAotCWRlZmluZWQoX19BUk1fQVJDSF82VDJfXykKLSMgICBkZWZpbmUgX19BUk1fQVJDSF9fIDYKLSMgIGVsaWYJZGVmaW5lZChfX0FSTV9BUkNIXzVfXykJfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVUX18pCXx8IFwKLQlkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXyl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pCXx8IFwKLQlkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFSl9fKQotIyAgIGRlZmluZSBfX0FSTV9BUkNIX18gNQotIyAgZWxpZglkZWZpbmVkKF9fQVJNX0FSQ0hfNF9fKQl8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNFRfXykKLSMgICBkZWZpbmUgX19BUk1fQVJDSF9fIDQKLSMgIGVsc2UKLSMgICBlcnJvciAidW5zdXBwb3J0ZWQgQVJNIGFyY2hpdGVjdHVyZSIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogRXZlbiB3aGVuIGJ1aWxkaW5nIGZvciAzMi1iaXQgQVJNLCBzdXBwb3J0IGZvciBhYXJjaDY0IGNyeXB0byBpbnN0cnVjdGlvbnMKLSAqIHdpbGwgYmUgaW5jbHVkZWQuICovCi0jZGVmaW5lIF9fQVJNX01BWF9BUkNIX18gOAotCi0jaWYgIV9fQVNTRU1CTEVSX18KLQotLyogT1BFTlNTTF9hcm1jYXBfUCBjb250YWlucyBmbGFncyBkZXNjcmliaW5nIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIENQVSBhbmQKLSAqIGlzIGVhc3kgZm9yIGFzc2VtYmx5IGNvZGUgdG8gYWNlc3NzLiBGb3IgQyBjb2RlLCBzZWUgdGhlIGZ1bmN0aW9ucyBpbgotICogfGNwdS5ofC4gKi8KLWV4dGVybiB1aW50MzJfdCBPUEVOU1NMX2FybWNhcF9QOwotCi0jZW5kaWYgIC8qICFfX0FTU0VNQkxFUl9fICovCi0KLS8qIEFSTVY3X05FT04gaXMgdHJ1ZSB3aGVuIGEgTkVPTiB1bml0IGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgQ1BVLiAqLwotI2RlZmluZSBBUk1WN19ORU9OICgxIDw8IDApCi0KLS8qIEFSTVY3X05FT05fRlVOQ1RJT05BTCBpcyB0cnVlIHdoZW4gdGhlIE5FT04gdW5pdCBkb2Vzbid0IGNvbnRhaW4gc3VidGxlIGJ1Z3MuCi0gKiBUaGUgUG9seTEzMDUgTkVPTiBjb2RlIGlzIGtub3duIHRvIHRyaWdnZXIgYnVncyBpbiB0aGUgTkVPTiB1bml0cyBvZiBzb21lCi0gKiBwaG9uZXMuIElmIHRoaXMgYml0IGlzbid0IHNldCB0aGVuIHRoZSBQb2x5MTMwNSBORU9OIGNvZGUgd29uJ3QgYmUgdXNlZC4KLSAqIFNlZSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzQxNTk4LiAqLwotI2RlZmluZSBBUk1WN19ORU9OX0ZVTkNUSU9OQUwgKDEgPDwgMTApCi0KLS8qIEFSTVY4X0FFUyBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgaGFyZHdhcmUgQUVTIGluc3RydWN0aW9ucy4gKi8KLSNkZWZpbmUgQVJNVjhfQUVTICgxIDw8IDIpCi0KLS8qIEFSTVY4X1NIQTEgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIGhhcmR3YXJlIFNIQS0xIGluc3RydWN0aW9ucy4gKi8KLSNkZWZpbmUgQVJNVjhfU0hBMSAoMSA8PCAzKQotCi0vKiBBUk1WOF9TSEEyNTYgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIGhhcmR3YXJlIFNIQS0yNTYgaW5zdHJ1Y3Rpb25zLiAqLwotI2RlZmluZSBBUk1WOF9TSEEyNTYgKDEgPDwgNCkKLQotLyogQVJNVjhfUE1VTEwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIGNhcnJ5bGVzcyBtdWx0aXBsaWNhdGlvbi4gKi8KLSNkZWZpbmUgQVJNVjhfUE1VTEwgKDEgPDwgNSkKLQotCi0jZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2FzbjEvQ01ha2VMaXN0cy50eHQKaW5kZXggMjgzNjM2ZS4uNDFlMzEyMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYXNuMS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYXNuMQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfYml0c3RyLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYwppbmRleCA4MDU1ZjBjLi44YmFkMzM5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYwpAQCAtMTI1LDggKzEyNSw3IEBACiAKIAlpZiAobGVuIDwgMSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9CSVRfU1RSSU5HLAotCQkJQVNOMV9SX1NUUklOR19UT09fU0hPUlQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU1RSSU5HX1RPT19TSE9SVCk7CiAJCWdvdG8gZXJyOwogCQl9CiAKQEAgLTE0MSw4ICsxNDAsNyBAQAogCXBhZGRpbmcgPSAqKHArKyk7CiAJaWYgKHBhZGRpbmcgPiA3KQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGMyaV9BU04xX0JJVF9TVFJJTkcsCi0JCQlBU04xX1JfSU5WQUxJRF9CSVRfU1RSSU5HX0JJVFNfTEVGVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTU3LDggKzE1NSw3IEBACiAJCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygoaW50KWxlbik7CiAJCWlmIChzID09IE5VTEwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9CSVRfU1RSSU5HLAotCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQltZW1jcHkocyxwLChpbnQpbGVuKTsKQEAgLTIwOSw3ICsyMDYsNyBAQAogCQkJCQkJCQkgdysxKTsKIAkJaWYgKGMgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfQklUX1NUUklOR19zZXRfYml0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KICAgCQlpZiAodysxLWEtPmxlbmd0aCA+IDApIG1lbXNldChjK2EtPmxlbmd0aCwgMCwgdysxLWEtPmxlbmd0aCk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9ib29sLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9ib29sLmMKaW5kZXggYzMwZWU0OC4uODI2YmNmNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FfYm9vbC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2Jvb2wuYwpAQCAtMTA3LDYgKzEwNyw2IEBACiAJKnBwPXA7CiAJcmV0dXJuKHJldCk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgZDJpX0FTTjFfQk9PTEVBTiwgaSk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgaSk7CiAJcmV0dXJuKHJldCk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfYnl0ZXMuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2J5dGVzLmMKaW5kZXggODg3NGY0OC4uMTkwNDM3NSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FfYnl0ZXMuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9ieXRlcy5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkqcHA9cDsKIAlyZXR1cm4ocmV0KTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV90eXBlX2J5dGVzLCBpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBpKTsKIAlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQogCQlBU04xX1NUUklOR19mcmVlKHJldCk7CiAJcmV0dXJuKE5VTEwpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiBlcnI6CiAJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKIAkJQVNOMV9TVFJJTkdfZnJlZShyZXQpOwotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGQyaV9BU04xX2J5dGVzLCBpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBpKTsKIAlyZXR1cm4oTlVMTCk7CiAJfQogCkBAIC0zMDksNyArMzA5LDcgQEAKIAlpZiAob3MgIT0gTlVMTCkgQVNOMV9TVFJJTkdfZnJlZShvcyk7CiAJcmV0dXJuKDEpOwogZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY29sbGF0ZV9wcmltaXRpdmUsIGMtPmVycm9yKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjLT5lcnJvcik7CiAJaWYgKG9zICE9IE5VTEwpIEFTTjFfU1RSSU5HX2ZyZWUob3MpOwogCWlmIChiLmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGIuZGF0YSk7CiAJcmV0dXJuKDApOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfZDJpX2ZwLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYwppbmRleCA2MDIyYzc0Li45N2VjNzViIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYwpAQCAtNzUsNyArNzUsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9kMmlfZnAsIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGluLEJJT19OT0NMT1NFKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2QyaV9mcCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsaW4sQklPX05PQ0xPU0UpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJYj1CVUZfTUVNX25ldygpOwogCWlmIChiID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gLTE7CiAJCX0KIApAQCAtMTY3LDIwICsxNjcsMjAgQEAKIAogCQkJaWYgKGxlbiArIHdhbnQgPCBsZW4gfHwgIUJVRl9NRU1fZ3Jvd19jbGVhbihiLGxlbit3YW50KSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJaT1CSU9fcmVhZChpbiwmKGItPmRhdGFbbGVuXSksd2FudCk7CiAJCQlpZiAoKGkgPCAwKSAmJiAoKGxlbi1vZmYpID09IDApKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX05PVF9FTk9VR0hfREFUQSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PVF9FTk9VR0hfREFUQSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJaWYgKGkgPiAwKQogCQkJCXsKIAkJCQlpZiAobGVuK2kgPCBsZW4pCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEFTTjFfUl9UT09fTE9ORyk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJbGVuKz1pOwpAQCAtMjExLDcgKzIxMSw3IEBACiAJCQllb3MrKzsKIAkJCWlmIChlb3MgPCAwKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX0hFQURFUl9UT09fTE9ORyk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0hFQURFUl9UT09fTE9ORyk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJd2FudD1IRUFERVJfU0laRTsKQEAgLTIzNSwxMiArMjM1LDEyIEBACiAJCQkJaWYgKHdhbnQgPiBJTlRfTUFYIC8qIEJJT19yZWFkIHRha2VzIGFuIGludCBsZW5ndGggKi8gfHwKIAkJCQkJbGVuK3dhbnQgPCBsZW4pCiAJCQkJCQl7Ci0JCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKKwkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CiAJCQkJCQlnb3RvIGVycjsKIAkJCQkJCX0KIAkJCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihiLGxlbit3YW50KSkKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJd2hpbGUgKHdhbnQgPiAwKQpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJCQkJCWk9QklPX3JlYWQoaW4sJihiLT5kYXRhW2xlbl0pLHdhbnQpOwogCQkJCQlpZiAoaSA8PSAwKQogCQkJCQkJewotCQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfcmVhZF9iaW8sIEFTTjFfUl9OT1RfRU5PVUdIX0RBVEEpOworCQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PVF9FTk9VR0hfREFUQSk7CiAJCQkJCQlnb3RvIGVycjsKIAkJCQkJCX0KIAkJCQkJLyogVGhpcyBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJCQl9CiAJCQlpZiAob2ZmICsgYy5zbGVuIDwgb2ZmKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVE9PX0xPTkcpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCW9mZis9Yy5zbGVuOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAKIAlpZiAob2ZmID4gSU5UX01BWCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9yZWFkX2JpbywgQVNOMV9SX1RPT19MT05HKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1RPT19MT05HKTsKIAkJZ290byBlcnI7CiAJCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfZHVwLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9kdXAuYwppbmRleCA4ZWMxYzVmLi41ZTg3NDU3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9kdXAuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9kdXAuYwpAQCAtNzIsNyArNzIsNyBAQAogCWk9aTJkKHgsTlVMTCk7CiAJYj1PUEVOU1NMX21hbGxvYyhpKzEwKTsKIAlpZiAoYiA9PSBOVUxMKQotCQl7IE9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfZHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IHJldHVybihOVUxMKTsgfQorCQl7IE9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgcmV0dXJuKE5VTEwpOyB9CiAJcD0gYjsKIAlpPWkyZCh4LCZwKTsKIAlwMj0gYjsKQEAgLTk1LDcgKzk1LDcgQEAKIAogCWk9QVNOMV9pdGVtX2kyZCh4LCZiLGl0KTsKIAlpZiAoYiA9PSBOVUxMKQotCQl7IE9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsgcmV0dXJuKE5VTEwpOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyByZXR1cm4oTlVMTCk7IH0KIAlwPSBiOwogCXJldD1BU04xX2l0ZW1fZDJpKE5VTEwsJnAsaSwgaXQpOwogCU9QRU5TU0xfZnJlZShiKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX2VudW0uYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2VudW0uYwppbmRleCBhNTgxYTM0Li41NzlkYWZkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9lbnVtLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfZW51bS5jCkBAIC04NCw3ICs4NCw3IEBACiAJCX0KIAlpZiAoYS0+ZGF0YSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfRU5VTUVSQVRFRF9zZXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4oMCk7CiAJCX0KIAlkPXY7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJcmV0PWFpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCTl90b19BU04xX0VOVU1FUkFURUQsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCWdvdG8gZXJyOwogCQl9CiAJaWYoQk5faXNfbmVnYXRpdmUoYm4pKSByZXQtPnR5cGUgPSBWX0FTTjFfTkVHX0VOVU1FUkFURUQ7CkBAIC0xNTksNyArMTU5LDcgQEAKIAkJdW5zaWduZWQgY2hhciAqbmV3X2RhdGE9T1BFTlNTTF9yZWFsbG9jKHJldC0+ZGF0YSwgbGVuKzQpOwogCQlpZiAoIW5ld19kYXRhKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQk5fdG9fQVNOMV9FTlVNRVJBVEVELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJcmV0LT5kYXRhPW5ld19kYXRhOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJQklHTlVNICpyZXQ7CiAKIAlpZiAoKHJldD1CTl9iaW4yYm4oYWktPmRhdGEsYWktPmxlbmd0aCxibikpID09IE5VTEwpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfRU5VTUVSQVRFRF90b19CTiwgQVNOMV9SX0JOX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9CTl9MSUIpOwogCWVsc2UgaWYoYWktPnR5cGUgPT0gVl9BU04xX05FR19FTlVNRVJBVEVEKSBCTl9zZXRfbmVnYXRpdmUocmV0LDEpOwogCXJldHVybihyZXQpOwogCX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX2dlbnRtLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9nZW50bS5jCmluZGV4IGJlMDkzYTQuLjdjYjE4YTkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2dlbnRtLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfZ2VudG0uYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJCXA9T1BFTlNTTF9tYWxsb2MobGVuKTsKIAkJaWYgKHAgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfR0VORVJBTElaRURUSU1FX2FkaiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuKE5VTEwpOwogCQkJfQogCQlpZiAocy0+ZGF0YSAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfaTJkX2ZwLmMgYi9zcmMvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwppbmRleCAxMWU0MGQzLi43NGRlZDc4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwpAQCAtNjcsNyArNjcsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pMmRfZnAsIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLG91dCxCSU9fTk9DTE9TRSk7CkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgIHJldHVybihyZXQpOwogICAgICAgICB9CiAKLWludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKngpCitpbnQgQVNOMV9pMmRfYmlvKGkyZF9vZl92b2lkICppMmQsIEJJTyAqb3V0LCB2b2lkICp4KQogCXsKIAljaGFyICpiOwogCXVuc2lnbmVkIGNoYXIgKnA7CkBAIC04Niw3ICs4Niw3IEBACiAJYj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKG4pOwogCWlmIChiID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pMmRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2kyZF9mcCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsb3V0LEJJT19OT0NMT1NFKTsKQEAgLTEzMyw3ICsxMzMsNyBAQAogCW4gPSBBU04xX2l0ZW1faTJkKHgsICZiLCBpdCk7CiAJaWYgKGIgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1faTJkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9pbnQuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX2ludC5jCmluZGV4IDJlY2NjYzUuLjlhNTY1MzQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX2ludC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX2ludC5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkqcHA9cGVuZDsKIAlyZXR1cm4ocmV0KTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9JTlRFR0VSLCBpKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBpKTsKIAlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQogCQlNX0FTTjFfSU5URUdFUl9mcmVlKHJldCk7CiAJcmV0dXJuKE5VTEwpOwpAQCAtMzI3LDcgKzMyNyw3IEBACiAJKnBwPXA7CiAJcmV0dXJuKHJldCk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgZDJpX0FTTjFfVUlOVEVHRVIsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOwogCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpCiAJCU1fQVNOMV9JTlRFR0VSX2ZyZWUocmV0KTsKIAlyZXR1cm4oTlVMTCk7CkBAIC0zNTAsNyArMzUwLDcgQEAKIAkJfQogCWlmIChhLT5kYXRhID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9JTlRFR0VSX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCWQ9djsKQEAgLTQxMyw3ICs0MTMsNyBAQAogCQlyZXQ9YWk7CiAJaWYgKHJldCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEJOX3RvX0FTTjFfSU5URUdFUiwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZiAoQk5faXNfbmVnYXRpdmUoYm4pICYmICFCTl9pc196ZXJvKGJuKSkKQEAgLTQyNiw3ICs0MjYsNyBAQAogCQl1bnNpZ25lZCBjaGFyICpuZXdfZGF0YT1PUEVOU1NMX3JlYWxsb2MocmV0LT5kYXRhLCBsZW4rNCk7CiAJCWlmICghbmV3X2RhdGEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCTl90b19BU04xX0lOVEVHRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlyZXQtPmRhdGE9bmV3X2RhdGE7CkBAIC00NDksNyArNDQ5LDcgQEAKIAlCSUdOVU0gKnJldDsKIAogCWlmICgocmV0PUJOX2JpbjJibihhaS0+ZGF0YSxhaS0+bGVuZ3RoLGJuKSkgPT0gTlVMTCkKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9JTlRFR0VSX3RvX0JOLCBBU04xX1JfQk5fTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0JOX0xJQik7CiAJZWxzZSBpZihhaS0+dHlwZSA9PSBWX0FTTjFfTkVHX0lOVEVHRVIpCiAJCUJOX3NldF9uZWdhdGl2ZShyZXQsIDEpOwogCXJldHVybihyZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2FfbWJzdHIuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX21ic3RyLmMKaW5kZXggOWFiZTY1OS4uNDI4MDZkMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2FfbWJzdHIuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvYV9tYnN0ci5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAogCQljYXNlIE1CU1RSSU5HX0JNUDoKIAkJaWYobGVuICYgMSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEFTTjFfUl9JTlZBTElEX0JNUFNUUklOR19MRU5HVEgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfQk1QU1RSSU5HX0xFTkdUSCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJbmNoYXIgPSBsZW4gPj4gMTsKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAJCWNhc2UgTUJTVFJJTkdfVU5JVjoKIAkJaWYobGVuICYgMykgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEFTTjFfUl9JTlZBTElEX1VOSVZFUlNBTFNUUklOR19MRU5HVEgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfVU5JVkVSU0FMU1RSSU5HX0xFTkdUSCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJbmNoYXIgPSBsZW4gPj4gMjsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkvKiBUaGlzIGNvdW50cyB0aGUgY2hhcmFjdGVycyBhbmQgZG9lcyB1dGY4IHN5bnRheCBjaGVja2luZyAqLwogCQlyZXQgPSB0cmF2ZXJzZV9zdHJpbmcoaW4sIGxlbiwgTUJTVFJJTkdfVVRGOCwgaW5fdXRmOCwgJm5jaGFyKTsKIAkJaWYocmV0IDwgMCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEFTTjFfUl9JTlZBTElEX1VURjhTVFJJTkcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfVVRGOFNUUklORyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMzcsMTkgKzEzNywxOSBAQAogCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX1VOS05PV05fRk9STUFUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VOS05PV05fRk9STUFUKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCWlmKChtaW5zaXplID4gMCkgJiYgKG5jaGFyIDwgbWluc2l6ZSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NUUklOR19UT09fU0hPUlQpOwogCQlCSU9fc25wcmludGYoc3RyYnVmLCBzaXplb2Ygc3RyYnVmLCAiJWxkIiwgbWluc2l6ZSk7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibWluc2l6ZT0iLCBzdHJidWYpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYoKG1heHNpemUgPiAwKSAmJiAobmNoYXIgPiBtYXhzaXplKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX1NUUklOR19UT09fTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TVFJJTkdfVE9PX0xPTkcpOwogCQlCSU9fc25wcmludGYoc3RyYnVmLCBzaXplb2Ygc3RyYnVmLCAiJWxkIiwgbWF4c2l6ZSk7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibWF4c2l6ZT0iLCBzdHJidWYpOwogCQlyZXR1cm4gLTE7CkBAIC0xNTcsNyArMTU3LDcgQEAKIAogCS8qIE5vdyB3b3JrIG91dCBtaW5pbWFsIHR5cGUgKGlmIGFueSkgKi8KIAlpZih0cmF2ZXJzZV9zdHJpbmcoaW4sIGxlbiwgaW5mb3JtLCB0eXBlX3N0ciwgJm1hc2spIDwgMCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX21ic3RyaW5nX25jb3B5LCAgQVNOMV9SX0lMTEVHQUxfQ0hBUkFDVEVSUyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0NIQVJBQ1RFUlMpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xOTEsNyArMTkxLDcgQEAKIAkJZnJlZV9vdXQgPSAxOwogCQlkZXN0ID0gQVNOMV9TVFJJTkdfdHlwZV9uZXcoc3RyX3R5cGUpOwogCQlpZighZGVzdCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQkqb3V0ID0gZGVzdDsKQEAgLTE5OSw3ICsxOTksNyBAQAogCS8qIElmIGJvdGggdGhlIHNhbWUgdHlwZSBqdXN0IGNvcHkgYWNyb3NzICovCiAJaWYoaW5mb3JtID09IG91dGZvcm0pIHsKIAkJaWYoIUFTTjFfU1RSSU5HX3NldChkZXN0LCBpbiwgbGVuKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9tYnN0cmluZ19uY29weSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCXJldHVybiBzdHJfdHlwZTsKQEAgLTIzMCw3ICsyMzAsNyBAQAogCX0KIAlpZighKHAgPSBPUEVOU1NMX21hbGxvYyhvdXRsZW4gKyAxKSkpIHsKIAkJaWYoZnJlZV9vdXQpIEFTTjFfU1RSSU5HX2ZyZWUoZGVzdCk7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfbWJzdHJpbmdfbmNvcHksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gLTE7CiAJfQogCWRlc3QtPmxlbmd0aCA9IG91dGxlbjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX29iamVjdC5jIGIvc3JjL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMKaW5kZXggMTg5ODg2Yy4uNmRkZmNhOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2Ffb2JqZWN0LmMKQEAgLTEwNiwxMyArMTA2LDEzIEBACiAJCX0KIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJkX0FTTjFfT0JKRUNULCBBU04xX1JfRklSU1RfTlVNX1RPT19MQVJHRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9GSVJTVF9OVU1fVE9PX0xBUkdFKTsKIAkJZ290byBlcnI7CiAJCX0KIAogCWlmIChudW0gPD0gMCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9NSVNTSU5HX1NFQ09ORF9OVU1CRVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTUlTU0lOR19TRUNPTkRfTlVNQkVSKTsKIAkJZ290byBlcnI7CiAJCX0KIAljPSAqKHArKyk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJaWYgKG51bSA8PSAwKSBicmVhazsKIAkJaWYgKChjICE9ICcuJykgJiYgKGMgIT0gJyAnKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyZF9BU04xX09CSkVDVCwgQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX1NFUEFSQVRPUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJbD0wOwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJCQkJYnJlYWs7CiAJCQlpZiAoKGMgPCAnMCcpIHx8IChjID4gJzknKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJkX0FTTjFfT0JKRUNULCBBU04xX1JfSU5WQUxJRF9ESUdJVCk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfRElHSVQpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCWlmICghdXNlX2JuICYmIGwgPj0gKChVTE9OR19NQVggLSA4MCkgLyAxMEwpKQpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQl7CiAJCQlpZiAoKGZpcnN0IDwgMikgJiYgKGwgPj0gNDApKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9TRUNPTkRfTlVNQkVSX1RPT19MQVJHRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NFQ09ORF9OVU1CRVJfVE9PX0xBUkdFKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlpZiAodXNlX2JuKQpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCQl7CiAJCQlpZiAobGVuK2kgPiBvbGVuKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmRfQVNOMV9PQkpFQ1QsIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJd2hpbGUgKC0taSA+IDApCkBAIC0yODAsNyArMjgwLDcgQEAKIAlpZihyZXQpICpwcCA9IHA7CiAJcmV0dXJuIHJldDsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBkMmlfQVNOMV9PQkpFQ1QsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOwogCXJldHVybihOVUxMKTsKIH0KIApAQCAtMzAwLDcgKzMwMCw3IEBACiAJaWYgKGxlbiA8PSAwIHx8IGxlbiA+IElOVF9NQVggfHwgcHAgPT0gTlVMTCB8fCAocCA9ICpwcCkgPT0gTlVMTCB8fAogCSAgICBwW2xlbiAtIDFdICYgMHg4MCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9PQkpFQ1QsIEFTTjFfUl9JTlZBTElEX09CSkVDVF9FTkNPRElORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX09CSkVDVF9FTkNPRElORyk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJLyogTm93IDAgPCBsZW4gPD0gSU5UX01BWCwgc28gdGhlIGNhc3QgaXMgc2FmZS4gKi8KQEAgLTMwOSw3ICszMDksNyBAQAogCQl7CiAJCWlmICgqcCA9PSAweDgwICYmICghaSB8fCAhKHBbLTFdICYgMHg4MCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYzJpX0FTTjFfT0JKRUNULCBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfT0JKRUNUX0VOQ09ESU5HKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC0zNTAsNyArMzUwLDcgQEAKIAkqcHA9cDsKIAlyZXR1cm4ocmV0KTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBjMmlfQVNOMV9PQkpFQ1QsIGkpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkpOwogCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpCiAJCUFTTjFfT0JKRUNUX2ZyZWUocmV0KTsKIAlyZXR1cm4oTlVMTCk7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAlyZXQ9KEFTTjFfT0JKRUNUICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfT0JKRUNUKSk7CiAJaWYgKHJldCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfT0JKRUNUX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybihOVUxMKTsKIAkJfQogCXJldC0+bGVuZ3RoPTA7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV9zdHJuaWQuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jCmluZGV4IGRmODQ5ZTEuLmQ0MzE2ZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jCkBAIC0yMTUsMTMgKzIxNSwxMyBAQAogCWZsYWdzICY9IH5TVEFCTEVfRkxBR1NfTUFMTE9DOwogCWlmKCFzdGFibGUpIHN0YWJsZSA9IHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhza190YWJsZV9jbXApOwogCWlmKCFzdGFibGUpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9TVFJJTkdfVEFCTEVfYWRkLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAwOwogCX0KIAlpZighKHRtcCA9IEFTTjFfU1RSSU5HX1RBQkxFX2dldChuaWQpKSkgewogCQl0bXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpKTsKIAkJaWYoIXRtcCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9TVFJJTkdfVEFCTEVfYWRkLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJdG1wLT5mbGFncyA9IGZsYWdzIHwgU1RBQkxFX0ZMQUdTX01BTExPQzsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hX3RpbWUuYyBiL3NyYy9jcnlwdG8vYXNuMS9hX3RpbWUuYwppbmRleCBlMDJlODU4Li5hYzJjYjQ4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV90aW1lLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2FfdGltZS5jCkBAIC04NSw3ICs4NSw3IEBACiAJaWYoYS0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSB8fCBhLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCiAJCQkJcmV0dXJuKGkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsCiAJCQkJICAgICBhLT50eXBlICxWX0FTTjFfVU5JVkVSU0FMKSk7Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBBU04xX1JfRVhQRUNUSU5HX0FfVElNRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0VYUEVDVElOR19BX1RJTUUpOwogCXJldHVybiAtMTsKIAl9CiAjZW5kaWYKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXRzPU9QRU5TU0xfZ210aW1lKCZ0LCZkYXRhKTsKIAlpZiAodHMgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1RJTUVfYWRqLCAgQVNOMV9SX0VSUk9SX0dFVFRJTkdfVElNRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9FUlJPUl9HRVRUSU5HX1RJTUUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCWlmIChvZmZzZXRfZGF5IHx8IG9mZnNldF9zZWMpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYV91dGN0bS5jIGIvc3JjL2NyeXB0by9hc24xL2FfdXRjdG0uYwppbmRleCA1MmIwMTBmLi5kYmJiZWNiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvYV91dGN0bS5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMKQEAgLTgxLDEyICs4MSwxMiBAQAogCQlWX0FTTjFfVVRDVElNRSxWX0FTTjFfVU5JVkVSU0FMKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgWFhYLCBFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CiAJaWYgKCFBU04xX1VUQ1RJTUVfY2hlY2socmV0KSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBYWFgsIEFTTjFfUl9JTlZBTElEX1RJTUVfRk9STUFUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfVElNRV9GT1JNQVQpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkJcD1PUEVOU1NMX21hbGxvYyhsZW4pOwogCQlpZiAocCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9VVENUSU1FX2FkaiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWlmIChzLT5kYXRhICE9IE5VTEwpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvYXNuMV9saWIuYyBiL3NyYy9jcnlwdG8vYXNuMS9hc24xX2xpYi5jCmluZGV4IDlhYTI2NzguLmExMDk3NDkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9hc24xX2xpYi5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9hc24xX2xpYi5jCkBAIC02OSwxNyArNjksMTAgQEAKIE9QRU5TU0xfREVDTEFSRV9FUlJPUl9SRUFTT04oQVNOMSwgTUFMTE9DX0ZBSUxVUkUpOwogCiAvKiBDcm9zcy1tb2R1bGUgZXJyb3JzIGZyb20gY3J5cHRvL3g1MDkvaTJkX3ByLmMgKi8KLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBpMmRfUHJpdmF0ZUtleSk7CiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OKEFTTjEsIFVOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CiAKIC8qIENyb3NzLW1vZHVsZSBlcnJvcnMgZnJvbSBjcnlwdG8veDUwOS9hc24xX2dlbi5jLgogICogVE9ETyhkYXZpZGJlbik6IFJlbW92ZSB0aGVzZSBvbmNlIGFzbjFfZ2VuLmMgaXMgZ29uZS4gKi8KLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBBU04xX2dlbmVyYXRlX3YzKTsKLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBhc24xX2NiKTsKLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBwYXJzZV90YWdnaW5nKTsKLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBhcHBlbmRfZXhwKTsKLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBhc24xX3N0cjJ0eXBlKTsKLU9QRU5TU0xfREVDTEFSRV9FUlJPUl9GVU5DVElPTihBU04xLCBiaXRzdHJfY2IpOwogT1BFTlNTTF9ERUNMQVJFX0VSUk9SX1JFQVNPTihBU04xLCBERVBUSF9FWENFRURFRCk7CiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OKEFTTjEsIElMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCk7CiBPUEVOU1NMX0RFQ0xBUkVfRVJST1JfUkVBU09OKEFTTjEsIElMTEVHQUxfQk9PTEVBTik7CkBAIC0xODMsNyArMTc2LDcgQEAKICNlbmRpZgogCWlmICgqcGxlbmd0aCA+IChvbWF4IC0gKHAgLSAqcHApKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2dldF9vYmplY3QsIEFTTjFfUl9UT09fTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UT09fTE9ORyk7CiAJCS8qIFNldCB0aGlzIHNvIHRoYXQgZXZlbiBpZiB0aGluZ3MgYXJlIG5vdCBsb25nIGVub3VnaAogCQkgKiB0aGUgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5ICovCiAJCXJldHw9MHg4MDsKQEAgLTE5MSw3ICsxODQsNyBAQAogCSpwcD1wOwogCXJldHVybihyZXR8aW5mKTsKIGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2dldF9vYmplY3QsIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcpOwogCXJldHVybigweDgwKTsKIAl9CiAKQEAgLTQzMyw3ICs0MjYsNyBAQAogCiAJCWlmIChzdHItPmRhdGEgPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfU1RSSU5HX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJc3RyLT5kYXRhPWM7CiAJCQlyZXR1cm4oMCk7CiAJCQl9CkBAIC00NjksNyArNDYyLDcgQEAKIAlyZXQ9KEFTTjFfU1RSSU5HICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfU1RSSU5HKSk7CiAJaWYgKHJldCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfU1RSSU5HX3R5cGVfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKE5VTEwpOwogCQl9CiAJcmV0LT5sZW5ndGg9MDsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9hc25fcGFjay5jIGIvc3JjL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMKaW5kZXggZWU1OGZhNS4uZTg0MmExMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAogCWlmICghb2N0IHx8ICEqb2N0KSB7CiAJCWlmICghKG9jdG1wID0gQVNOMV9TVFJJTkdfbmV3ICgpKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX3BhY2ssIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCWlmIChvY3QpICpvY3QgPSBvY3RtcDsKQEAgLTgwLDExICs4MCwxMSBAQAogCX0KIAkJCiAJaWYgKCEob2N0bXAtPmxlbmd0aCA9IEFTTjFfaXRlbV9pMmQob2JqLCAmb2N0bXAtPmRhdGEsIGl0KSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX3BhY2ssIEFTTjFfUl9FTkNPREVfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRU5DT0RFX0VSUk9SKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmICghb2N0bXAtPmRhdGEpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX3BhY2ssIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcmV0dXJuIG9jdG1wOwpAQCAtOTksNiArOTksNiBAQAogCiAJcCA9IG9jdC0+ZGF0YTsKIAlpZighKHJldCA9IEFTTjFfaXRlbV9kMmkoTlVMTCwgJnAsIG9jdC0+bGVuZ3RoLCBpdCkpKQotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fdW5wYWNrLCBBU04xX1JfREVDT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0RFQ09ERV9FUlJPUik7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS9iaW9fbmRlZi5jIGIvc3JjL2NyeXB0by9hc24xL2Jpb19uZGVmLmMKaW5kZXggMmY3MTA1ZC4uZjA3ZDNkZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2Jpb19uZGVmLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL2Jpb19uZGVmLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJaWYgKCFhdXggfHwgIWF1eC0+YXNuMV9jYikKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBCSU9fbmV3X05ERUYsIEFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRCk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJbmRlZl9hdXggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoTkRFRl9TVVBQT1JUKSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvZl9lbnVtLmMgYi9zcmMvY3J5cHRvL2FzbjEvZl9lbnVtLmMKaW5kZXggNTMwYWZlNS4uYmNkYjc3MyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL2ZfZW51bS5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9mX2VudW0uYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCWktPWFnYWluOwogCQlpZiAoaSUyICE9IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9FTlVNRVJBVEVELCBBU04xX1JfT0REX05VTUJFUl9PRl9DSEFSUyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfT0REX05VTUJFUl9PRl9DSEFSUyk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaS89MjsKQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJCQkodW5zaWduZWQgaW50KW51bStpKjIpOwogCQkJaWYgKHNwID09IE5VTEwpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0VOVU1FUkFURUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJcz1zcDsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQkJCQltPW0tJ0EnKzEwOwogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9FTlVNRVJBVEVELCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJc1tudW0ral08PD00OwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJaWYgKDApCiAJCXsKIGVycl9zbDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfRU5VTUVSQVRFRCwgQVNOMV9SX1NIT1JUX0xJTkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU0hPUlRfTElORSk7CiAJCX0KIAlpZiAocyAhPSBOVUxMKQogCQlPUEVOU1NMX2ZyZWUocyk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvZl9pbnQuYyBiL3NyYy9jcnlwdG8vYXNuMS9mX2ludC5jCmluZGV4IDJjNGZlNmYuLjUxODYzMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS9mX2ludC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS9mX2ludC5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJaS09YWdhaW47CiAJCWlmIChpJTIgIT0gMCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0lOVEVHRVIsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlpLz0yOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJCQkJc3A9T1BFTlNTTF9yZWFsbG9jX2NsZWFuKHMsc2xlbixudW0raSoyKTsKIAkJCWlmIChzcCA9PSBOVUxMKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9JTlRFR0VSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCXM9c3A7CkBAIC0xODEsNyArMTgxLDcgQEAKIAkJCQkJbT1tLSdBJysxMDsKIAkJCQllbHNlCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfSU5URUdFUiwgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9OT05fSEVYX0NIQVJBQ1RFUlMpOwogCQkJCQlnb3RvIGVycjsKIAkJCQkJfQogCQkJCXNbbnVtK2pdPDw9NDsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWlmICgwKQogCQl7CiBlcnJfc2w6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGEyaV9BU04xX0lOVEVHRVIsIEFTTjFfUl9TSE9SVF9MSU5FKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NIT1JUX0xJTkUpOwogCQl9CiAJaWYgKHMgIT0gTlVMTCkKIAkJT1BFTlNTTF9mcmVlKHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL2Zfc3RyaW5nLmMgYi9zcmMvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYwppbmRleCAyZjUzNjcwLi41YTdmZTM2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYworKysgYi9zcmMvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCWktPWFnYWluOwogCQlpZiAoaSUyICE9IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhMmlfQVNOMV9TVFJJTkcsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlpLz0yOwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CiAJCQlpZiAoc3AgPT0gTlVMTCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfU1RSSU5HLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCXM9c3A7CkBAIC0xNzUsNyArMTc1LDcgQEAKIAkJCQkJbT1tLSdBJysxMDsKIAkJCQllbHNlCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfU1RSSU5HLCBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJc1tudW0ral08PD00OwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJaWYgKDApCiAJCXsKIGVycl9zbDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYTJpX0FTTjFfU1RSSU5HLCBBU04xX1JfU0hPUlRfTElORSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9TSE9SVF9MSU5FKTsKIAkJfQogCWlmIChzICE9IE5VTEwpCiAJCU9QRU5TU0xfZnJlZShzKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX2RlYy5jIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fZGVjLmMKaW5kZXggNzNkM2JiMy4uNTA3YTg0MiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9hc24xL3Rhc25fZGVjLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL3Rhc25fZGVjLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCQkJICovCiAJCQlpZiAoKHRhZyAhPSAtMSkgfHwgb3B0KQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0lMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9PUFRJT05TX09OX0lURU1fVEVNUExBVEUpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCXJldHVybiBhc24xX3RlbXBsYXRlX2V4X2QyaShwdmFsLCBpbiwgbGVuLApAQCAtMjA2LDcgKzIwNiw3IEBACiAJCQkJCQkmcCwgbGVuLCAtMSwgMCwgMSwgY3R4KTsKIAkJaWYgKCFyZXQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIApAQCAtMjE1LDcgKzIxNSw3IEBACiAJCQl7CiAJCQkvKiBJZiBPUFRJT05BTCwgYXNzdW1lIHRoaXMgaXMgT0sgKi8KIAkJCWlmIChvcHQpIHJldHVybiAtMTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTVNUUklOR19OT1RfVU5JVkVSU0FMKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NU1RSSU5HX05PVF9VTklWRVJTQUwpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCS8qIENoZWNrIHRhZyBtYXRjaGVzIGJpdCBtYXAgKi8KQEAgLTIyNCw3ICsyMjQsNyBAQAogCQkJLyogSWYgT1BUSU9OQUwsIGFzc3VtZSB0aGlzIGlzIE9LICovCiAJCQlpZiAob3B0KQogCQkJCXJldHVybiAtMTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTVNUUklOR19XUk9OR19UQUcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01TVFJJTkdfV1JPTkdfVEFHKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQlyZXR1cm4gYXNuMV9kMmlfZXhfcHJpbWl0aXZlKHB2YWwsIGluLCBsZW4sCkBAIC0yNTUsNyArMjU1LDcgQEAKIAkJCQkJJnAsIGxlbiwgZXhwdGFnLCBhY2xhc3MsIDEsIGN0eCk7CiAJCQlpZiAoIXJldCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQlpZiAocmV0ID09IC0xKQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJCQlpbXBoYWNrID0gKndwOwogCQkJaWYgKHAgPT0gTlVMTCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkqd3AgPSAodW5zaWduZWQgY2hhcikoKCpwICYgVl9BU04xX0NPTlNUUlVDVEVEKQpAQCAtMjk4LDcgKzI5OCw3IEBACiAJCWlmIChwdG1wdmFsKQogCQkJcmV0dXJuIDE7CiAKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCWdvdG8gZXJyOwogCiAKQEAgLTMyMCw3ICszMjAsNyBAQAogCQkJfQogCQllbHNlIGlmICghQVNOMV9pdGVtX2V4X25ldyhwdmFsLCBpdCkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJLyogQ0hPSUNFIHR5cGUsIHRyeSBlYWNoIHBvc3NpYmlsaXR5IGluIHR1cm4gKi8KQEAgLTM0MCw3ICszNDAsNyBAQAogCQkJCWJyZWFrOwogCQkJLyogT3RoZXJ3aXNlIG11c3QgYmUgYW4gQVNOMSBwYXJzaW5nIGVycm9yICovCiAJCQllcnJ0dCA9IHR0OwotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAKQEAgLTM1NCw3ICszNTQsNyBAQAogCQkJCUFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKIAkJCQlyZXR1cm4gLTE7CiAJCQkJfQotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9OT19NQVRDSElOR19DSE9JQ0VfVFlQRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAKQEAgLTM4MCw3ICszODAsNyBAQAogCQkJCQkmcCwgbGVuLCB0YWcsIGFjbGFzcywgb3B0LCBjdHgpOwogCQlpZiAoIXJldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQllbHNlIGlmIChyZXQgPT0gLTEpCkBAIC0zOTQsMTMgKzM5NCwxMyBAQAogCQllbHNlIHNlcV9ub2xlbiA9IHNlcV9lb2M7CiAJCWlmICghY3N0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9TRVFVRU5DRV9OT1RfQ09OU1RSVUNURUQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NFUVVFTkNFX05PVF9DT05TVFJVQ1RFRCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAogCQlpZiAoISpwdmFsICYmICFBU04xX2l0ZW1fZXhfbmV3KHB2YWwsIGl0KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCkBAIC00MzcsNyArNDM3LDcgQEAKIAkJCQl7CiAJCQkJaWYgKCFzZXFfZW9jKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfaXRlbV9leF9kMmksICBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOwogCQkJCQlnb3RvIGVycjsKIAkJCQkJfQogCQkJCWxlbiAtPSBwIC0gcTsKQEAgLTQ3OSwxMyArNDc5LDEzIEBACiAJCS8qIENoZWNrIGZvciBFT0MgaWYgZXhwZWN0aW5nIG9uZSAqLwogCQlpZiAoc2VxX2VvYyAmJiAhYXNuMV9jaGVja19lb2MoJnAsIGxlbikpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX0VPQyk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJLyogQ2hlY2sgYWxsIGRhdGEgcmVhZCAqLwogCQlpZiAoIXNlcV9ub2xlbiAmJiBsZW4pCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX1NFUVVFTkNFX0xFTkdUSF9NSVNNQVRDSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfU0VRVUVOQ0VfTEVOR1RIX01JU01BVENIKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCkBAIC01MDgsNyArNTA4LDcgQEAKIAkJCWVsc2UKIAkJCQl7CiAJCQkJZXJydHQgPSBzZXF0dDsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX2l0ZW1fZXhfZDJpLCAgQVNOMV9SX0ZJRUxEX01JU1NJTkcpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9GSUVMRF9NSVNTSU5HKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CkBAIC01MjQsNyArNTI0LDcgQEAKIAkJcmV0dXJuIDA7CiAJCX0KIAlhdXhlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9pdGVtX2V4X2QyaSwgIEFTTjFfUl9BVVhfRVJST1IpOworCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9BVVhfRVJST1IpOwogCWVycjoKIAlBU04xX2l0ZW1fZXhfZnJlZShwdmFsLCBpdCk7CiAJaWYgKGVycnR0KQpAQCAtNTY5LDIxICs1NjksMjEgQEAKIAkJcSA9IHA7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9leF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQllbHNlIGlmIChyZXQgPT0gLTEpCiAJCQlyZXR1cm4gLTE7CiAJCWlmICghY3N0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9leF9kMmksICBBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJLyogV2UndmUgZm91bmQgdGhlIGZpZWxkIHNvIGl0IGNhbid0IGJlIE9QVElPTkFMIG5vdyAqLwogCQlyZXQgPSBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSh2YWwsICZwLCBsZW4sIHR0LCAwLCBjdHgpOwogCQlpZiAoIXJldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfZXhfZDJpLCAgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJLyogV2UgcmVhZCB0aGUgZmllbGQgaW4gT0sgc28gdXBkYXRlIGxlbmd0aCAqLwpAQCAtNTkzLDcgKzU5Myw3IEBACiAJCQkvKiBJZiBOREVGIHdlIG11c3QgaGF2ZSBhbiBFT0MgaGVyZSAqLwogCQkJaWYgKCFhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9leF9kMmksICBBU04xX1JfTUlTU0lOR19FT0MpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX0VPQyk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQpAQCAtNjAzLDcgKzYwMyw3IEBACiAJCQkgKiBhbiBlcnJvciAqLwogCQkJaWYgKGxlbikKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9leF9kMmksICBBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQl9CkBAIC02NTksNyArNjU5LDcgQEAKIAkJCQkJJnAsIGxlbiwgc2t0YWcsIHNrYWNsYXNzLCBvcHQsIGN0eCk7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQllbHNlIGlmIChyZXQgPT0gLTEpCkBAIC02ODIsNyArNjgyLDcgQEAKIAkJCQkKIAkJaWYgKCEqdmFsKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIApAQCAtNjk2LDcgKzY5Niw3IEBACiAJCQkJewogCQkJCWlmICghc2tfZW9jKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpLCAgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQlsZW4gLT0gcCAtIHE7CkBAIC03MDgsMjAgKzcwOCwyMCBAQAogCQkJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCiAJCQkJCQktMSwgMCwgMCwgY3R4KSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJbGVuIC09IHAgLSBxOwogCQkJaWYgKCFza19BU04xX1ZBTFVFX3B1c2goKFNUQUNLX09GKEFTTjFfVkFMVUUpICopKnZhbCwKIAkJCQkJCXNrZmllbGQpKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQogCQlpZiAoc2tfZW9jKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTUlTU0lOR19FT0MpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01JU1NJTkdfRU9DKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC03MzIsNyArNzMyLDcgQEAKIAkJCUFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLCB0dC0+dGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKIAkJaWYgKCFyZXQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWVsc2UgaWYgKHJldCA9PSAtMSkKQEAgLTc0NSw3ICs3NDUsNyBAQAogCQkJCQkJCS0xLCAwLCBvcHQsIGN0eCk7CiAJCWlmICghcmV0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmksICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQllbHNlIGlmIChyZXQgPT0gLTEpCkBAIC03NzUsNyArNzc1LDcgQEAKIAlsb25nIGxlbjsgCiAJaWYgKCFwdmFsKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9JTExFR0FMX05VTEwpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9OVUxMKTsKIAkJcmV0dXJuIDA7IC8qIFNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJfQogCkBAIC03OTMsMTIgKzc5MywxMiBAQAogCQl1bnNpZ25lZCBjaGFyIG9jbGFzczsKIAkJaWYgKHRhZyA+PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgQVNOMV9SX0lMTEVHQUxfVEFHR0VEX0FOWSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9UQUdHRURfQU5ZKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQlpZiAob3B0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kMmlfZXhfcHJpbWl0aXZlLCAgQVNOMV9SX0lMTEVHQUxfT1BUSU9OQUxfQU5ZKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX09QVElPTkFMX0FOWSk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJcCA9ICppbjsKQEAgLTgwNiw3ICs4MDYsNyBAQAogCQkJCQkmcCwgaW5sZW4sIC0xLCAwLCAwLCBjdHgpOwogCQlpZiAoIXJldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAJCWlmIChvY2xhc3MgIT0gVl9BU04xX1VOSVZFUlNBTCkKQEAgLTgyMyw3ICs4MjMsNyBAQAogCQkJCSZwLCBpbmxlbiwgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKIAlpZiAoIXJldCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2QyaV9leF9wcmltaXRpdmUsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOwogCQlyZXR1cm4gMDsKIAkJfQogCWVsc2UgaWYgKHJldCA9PSAtMSkKQEAgLTg0Myw3ICs4NDMsNyBAQAogCQkvKiBTRVFVRU5DRSBhbmQgU0VUIG11c3QgYmUgY29uc3RydWN0ZWQgKi8KIAkJZWxzZSBpZiAoIWNzdCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEFTTjFfUl9UWVBFX05PVF9DT05TVFJVQ1RFRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVFlQRV9OT1RfQ09OU1RSVUNURUQpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAKQEAgLTg2OSw4ICs4NjksNyBAQAogCQkJfHwgdXR5cGUgPT0gVl9BU04xX0VOVU1FUkFURUQpCiAJCQl7CiAJCQkvKiBUaGVzZSB0eXBlcyBvbmx5IGhhdmUgcHJpbWl0aXZlIGVuY29kaW5ncy4gKi8KLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwKLQkJCQlBU04xX1JfVFlQRV9OT1RfUFJJTUlUSVZFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9UWVBFX05PVF9QUklNSVRJVkUpOwogCQkJcmV0dXJuIDA7CiAJCQl9CiAKQEAgLTg5Miw3ICs4OTEsNyBAQAogCQkvKiBBcHBlbmQgYSBmaW5hbCBudWxsIHRvIHN0cmluZyAqLwogCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbigmYnVmLCBsZW4gKyAxKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQlidWYuZGF0YVtsZW5dID0gMDsKQEAgLTk2MCw3ICs5NTksNyBAQAogCQljYXNlIFZfQVNOMV9OVUxMOgogCQlpZiAobGVuKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBBU04xX1JfTlVMTF9JU19XUk9OR19MRU5HVEgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05VTExfSVNfV1JPTkdfTEVOR1RIKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQkqcHZhbCA9IChBU04xX1ZBTFVFICopMTsKQEAgLTk2OSw3ICs5NjgsNyBAQAogCQljYXNlIFZfQVNOMV9CT09MRUFOOgogCQlpZiAobGVuICE9IDEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2V4X2MyaSwgIEFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEgpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWVsc2UKQEAgLTEwMTYsMTIgKzEwMTUsMTIgQEAKIAkJZGVmYXVsdDoKIAkJaWYgKHV0eXBlID09IFZfQVNOMV9CTVBTVFJJTkcgJiYgKGxlbiAmIDEpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBBU04xX1JfQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaWYgKHV0eXBlID09IFZfQVNOMV9VTklWRVJTQUxTVFJJTkcgJiYgKGxlbiAmIDMpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBBU04xX1JfVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJLyogQWxsIGJhc2VkIG9uIEFTTjFfU1RSSU5HIGFuZCBoYW5kbGVkIHRoZSBzYW1lICovCkBAIC0xMDMwLDcgKzEwMjksNyBAQAogCQkJc3RtcCA9IEFTTjFfU1RSSU5HX3R5cGVfbmV3KHV0eXBlKTsKIAkJCWlmICghc3RtcCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9leF9jMmksICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIAkJCSpwdmFsID0gKEFTTjFfVkFMVUUgKilzdG1wOwpAQCAtMTA1Myw3ICsxMDUyLDcgQEAKIAkJCXsKIAkJCWlmICghQVNOMV9TVFJJTkdfc2V0KHN0bXAsIGNvbnQsIGxlbikpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZXhfYzJpLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlBU04xX1NUUklOR19mcmVlKHN0bXApOwkKIAkJCQkqcHZhbCA9IE5VTEw7CiAJCQkJZ290byBlcnI7CkBAIC0xMTE1LDcgKzExMTQsNyBAQAogCQlpZighYXNuMV9jaGVja190bGVuKCZwbGVuLCBOVUxMLCBOVUxMLCAmaW5mLCBOVUxMLCAmcCwgbGVuLAogCQkJCS0xLCAwLCAwLCBOVUxMKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfZmluZF9lbmQsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQlpZiAoaW5mKQpAQCAtMTEyNiw3ICsxMTI1LDcgQEAKIAkJfQogCWlmIChleHBlY3RlZF9lb2MpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9maW5kX2VuZCwgIEFTTjFfUl9NSVNTSU5HX0VPQyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9NSVNTSU5HX0VPQyk7CiAJCXJldHVybiAwOwogCQl9CiAJKmluID0gcDsKQEAgLTExNzMsNyArMTE3Miw3IEBACiAJCQkgKiBjb25zdHJ1Y3RlZCBmb3JtICovCiAJCQlpZiAoIWluZikKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jb2xsZWN0LCAgQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOwogCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCWluZiA9IDA7CkBAIC0xMTgzLDcgKzExODIsNyBAQAogCQlpZiAoIWFzbjFfY2hlY2tfdGxlbigmcGxlbiwgTlVMTCwgTlVMTCwgJmluaW5mLCAmY3N0LCAmcCwKIAkJCQkJbGVuLCB0YWcsIGFjbGFzcywgMCwgTlVMTCkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05FU1RFRF9BU04xX0VSUk9SKTsKIAkJCXJldHVybiAwOwogCQkJfQogCkBAIC0xMTkyLDcgKzExOTEsNyBAQAogCQkJewogCQkJaWYgKGRlcHRoID49IEFTTjFfTUFYX1NUUklOR19ORVNUKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfTkVTVEVEX0FTTjFfU1RSSU5HKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTkVTVEVEX0FTTjFfU1RSSU5HKTsKIAkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQlpZiAoIWFzbjFfY29sbGVjdChidWYsICZwLCBwbGVuLCBpbmluZiwgdGFnLCBhY2xhc3MsCkBAIC0xMjA1LDcgKzEyMDQsNyBAQAogCQl9CiAJaWYgKGluZikKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NvbGxlY3QsICBBU04xX1JfTUlTU0lOR19FT0MpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTUlTU0lOR19FT0MpOwogCQlyZXR1cm4gMDsKIAkJfQogCSppbiA9IHA7CkBAIC0xMjIwLDcgKzEyMTksNyBAQAogCQlsZW4gPSBidWYtPmxlbmd0aDsKIAkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLCBsZW4gKyBwbGVuKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGNvbGxlY3RfZGF0YSwgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQkJfQogCQltZW1jcHkoYnVmLT5kYXRhICsgbGVuLCAqcCwgcGxlbik7CkBAIC0xMjg4LDcgKzEyODcsNyBAQAogCQkJICovCiAJCQlpZiAoIShpICYgMHg4MSkgJiYgKChwbGVuICsgY3R4LT5oZHJsZW4pID4gbGVuKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jaGVja190bGVuLCAgQVNOMV9SX1RPT19MT05HKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVE9PX0xPTkcpOwogCQkJCWFzbjFfdGxjX2NsZWFyKGN0eCk7CiAJCQkJcmV0dXJuIDA7CiAJCQkJfQpAQCAtMTI5Nyw3ICsxMjk2LDcgQEAKIAogCWlmIChpICYgMHg4MCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NoZWNrX3RsZW4sICBBU04xX1JfQkFEX09CSkVDVF9IRUFERVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQkFEX09CSkVDVF9IRUFERVIpOwogCQlhc24xX3RsY19jbGVhcihjdHgpOwogCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTMxMCw3ICsxMzA5LDcgQEAKIAkJCSAqLwogCQkJaWYgKG9wdCkgcmV0dXJuIC0xOwogCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2hlY2tfdGxlbiwgIEFTTjFfUl9XUk9OR19UQUcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1dST05HX1RBRyk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJLyogV2UgaGF2ZSBhIHRhZyBhbmQgY2xhc3MgbWF0Y2g6CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvdGFzbl9uZXcuYyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX25ldy5jCmluZGV4IDZkNjlkY2IuLmM2OGZlMDYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX25ldy5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX25ldy5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAlyZXR1cm4gMTsKIAogCW1lbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCUFTTjFfaXRlbV9leF9mcmVlKHB2YWwsIGl0KTsKICNpZmRlZiBDUllQVE9fTURFQlVHCiAJaWYgKGl0LT5zbmFtZSkgQ1JZUFRPX3BvcF9pbmZvKCk7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAlyZXR1cm4gMDsKIAogCWF1eGVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcsICBBU04xX1JfQVVYX0VSUk9SKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfQVVYX0VSUk9SKTsKIAlBU04xX2l0ZW1fZXhfZnJlZShwdmFsLCBpdCk7CiAjaWZkZWYgQ1JZUFRPX01ERUJVRwogCWlmIChpdC0+c25hbWUpIENSWVBUT19wb3BfaW5mbygpOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCXNrdmFsID0gc2tfQVNOMV9WQUxVRV9uZXdfbnVsbCgpOwogCQlpZiAoIXNrdmFsKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV90ZW1wbGF0ZV9uZXcsICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXQgPSAwOwogCQkJZ290byBkb25lOwogCQkJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9hc24xL3Rhc25fcHJuLmMgYi9zcmMvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYwppbmRleCBkZjE5ZmYwLi42YTA5N2ExIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYworKysgYi9zcmMvY3J5cHRvL2FzbjEvdGFzbl9wcm4uYwpAQCAtODgsNyArODgsNyBAQAogCXJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihBU04xX1BDVFgpKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9QQ1RYX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJcmV0LT5mbGFncyA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2FzbjEvdGFzbl91dGwuYyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX3V0bC5jCmluZGV4IGZmMzc2NGUuLjk2MGNkYmIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYXNuMS90YXNuX3V0bC5jCisrKyBiL3NyYy9jcnlwdG8vYXNuMS90YXNuX3V0bC5jCkBAIC0yNjAsOCArMjYwLDcgQEAKIGVycjoKICAgLyogRklYTUU6IHNob3VsZCBsb2cgdGhlIHZhbHVlIG9yIE9JRCBvZiB1bnN1cHBvcnRlZCB0eXBlICovCiAgIGlmIChudWxsZXJyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9kb19hZGIsCi0gICAgICAgICAgICAgICAgICAgICAgQVNOMV9SX1VOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9VTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFKTsKICAgfQogICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYXNuMS94X2xvbmcuYyBiL3NyYy9jcnlwdG8vYXNuMS94X2xvbmcuYwppbmRleCA1YzJmOTZlLi43YjFhNmZlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2FzbjEveF9sb25nLmMKKysrIGIvc3JjL2NyeXB0by9hc24xL3hfbG9uZy5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAl1bnNpZ25lZCBsb25nIHV0bXAgPSAwOwogCWNoYXIgKmNwID0gKGNoYXIgKilwdmFsOwogCWlmKGxlbiA+IChpbnQpc2l6ZW9mKGxvbmcpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGxvbmdfYzJpLCAgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIElzIGl0IG5lZ2F0aXZlPyAqLwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJCWx0bXAgPSAtbHRtcDsKIAl9CiAJaWYobHRtcCA9PSBpdC0+c2l6ZSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBsb25nX2MyaSwgIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyk7CiAJCXJldHVybiAwOwogCX0KIAltZW1jcHkoY3AsICZsdG1wLCBzaXplb2YobG9uZykpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iYXNlNjQvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dAppbmRleCA0MjAzN2E1Li5mMWRiYTZjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2Jhc2U2NC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYmFzZTY0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0CmluZGV4IGRiZjU5NTEuLjhkZTA5MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYmlvL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBiaW8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL2Jpby5jIGIvc3JjL2NyeXB0by9iaW8vYmlvLmMKaW5kZXggNWFjNTkxMS4uNGJjOThiYSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vYmlvLmMKKysrIGIvc3JjL2NyeXB0by9iaW8vYmlvLmMKQEAgLTkwLDcgKzkwLDcgQEAKIEJJTyAqQklPX25ldyhjb25zdCBCSU9fTUVUSE9EICptZXRob2QpIHsKICAgQklPICpyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPKSk7CiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICB9CiAKICAgaWYgKGlvX2Z1bmMgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX2lvLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gLTI7CiAgIH0KIApAQCAtMTY1LDcgKzE2NSw3IEBACiAgIH0KIAogICBpZiAoIWJpby0+aW5pdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX2lvLCBCSU9fUl9VTklOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOSU5JVElBTElaRUQpOwogICAgIHJldHVybiAtMjsKICAgfQogCkBAIC0yMTcsNyArMjE3LDcgQEAKICAgfQogCiAgIGlmIChiaW8tPm1ldGhvZCA9PSBOVUxMIHx8IGJpby0+bWV0aG9kLT5jdHJsID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19jdHJsLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gLTI7CiAgIH0KIApAQCAtMzIzLDcgKzMyMyw3IEBACiAgIH0KIAogICBpZiAoYmlvLT5tZXRob2QgPT0gTlVMTCB8fCBiaW8tPm1ldGhvZC0+Y2FsbGJhY2tfY3RybCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fY2FsbGJhY2tfY3RybCwgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDYyLDYgKzQ2MiwxMCBAQAogICBFUlJfcHJpbnRfZXJyb3JzX2NiKHByaW50X2JpbywgYmlvKTsKIH0KIAordm9pZCBFUlJfcHJpbnRfZXJyb3JzKEJJTyAqYmlvKSB7CisgIEJJT19wcmludF9lcnJvcnMoYmlvKTsKK30KKwogLyogYmlvX3JlYWRfYWxsIHJlYWRzIGV2ZXJ5dGhpbmcgZnJvbSB8YmlvfCBhbmQgcHJlcGVuZHMgfHByZWZpeHwgdG8gaXQuIE9uCiAgKiBzdWNjZXNzLCB8Km91dHwgaXMgc2V0IHRvIGFuIGFsbG9jYXRlZCBidWZmZXIgKHdoaWNoIHNob3VsZCBiZSBmcmVlZCB3aXRoCiAgKiB8T1BFTlNTTF9mcmVlfCksIHwqb3V0X2xlbnwgaXMgc2V0IHRvIGl0cyBsZW5ndGggYW5kIG9uZSBpcyByZXR1cm5lZC4gVGhlCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9iaW9fbWVtLmMgYi9zcmMvY3J5cHRvL2Jpby9iaW9fbWVtLmMKaW5kZXggZjNhYWQ2Zi4uZWY1NjExMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vYmlvX21lbS5jCisrKyBiL3NyYy9jcnlwdG8vYmlvL2Jpb19tZW0uYwpAQCAtNzAsNyArNzAsNyBAQAogICBjb25zdCBzaXplX3Qgc2l6ZSA9IGxlbiA8IDAgPyBzdHJsZW4oKGNoYXIgKilidWYpIDogKHNpemVfdClsZW47CiAKICAgaWYgKCFidWYgJiYgbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19uZXdfbWVtX2J1ZiwgQklPX1JfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICBiID0gKEJVRl9NRU0gKiliaW8tPnB0cjsKIAogICBpZiAoYmlvLT5mbGFncyAmIEJJT19GTEFHU19NRU1fUkRPTkxZKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBtZW1fd3JpdGUsIEJJT19SX1dSSVRFX1RPX1JFQURfT05MWV9CSU8pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfV1JJVEVfVE9fUkVBRF9PTkxZX0JJTyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iaW8vYnVmZmVyLmMgYi9zcmMvY3J5cHRvL2Jpby9idWZmZXIuYwppbmRleCAzZmMwNjg1Li45ZDBjYjNjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9idWZmZXIuYworKysgYi9zcmMvY3J5cHRvL2Jpby9idWZmZXIuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAgIHJldHVybiByZXQ7CiAKIG1hbGxvY19lcnJvcjoKLSAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBidWZmZXJfY3RybCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL2Nvbm5lY3QuYyBiL3NyYy9jcnlwdG8vYmlvL2Nvbm5lY3QuYwppbmRleCAzMjM2MWJmLi4yZWQyZGVmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Jpby9jb25uZWN0LmMKKysrIGIvc3JjL2NyeXB0by9iaW8vY29ubmVjdC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKICAgICAgIGNhc2UgQklPX0NPTk5fU19CRUZPUkU6CiAgICAgICAgIHAgPSBjLT5wYXJhbV9ob3N0bmFtZTsKICAgICAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfTk9fSE9TVE5BTUVfU1BFQ0lGSUVEKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX05PX0hPU1ROQU1FX1NQRUNJRklFRCk7CiAgICAgICAgICAgZ290byBleGl0X2xvb3A7CiAgICAgICAgIH0KICAgICAgICAgZm9yICg7ICpwICE9IDA7IHArKykgewpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYy0+cGFyYW1fcG9ydCA9PSBOVUxMKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9OT19QT1JUX1NQRUNJRklFRCk7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OT19QT1JUX1NQRUNJRklFRCk7CiAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lKTsKICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKICAgICAgICAgfQpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIGlmICghYmlvX2lwX2FuZF9wb3J0X3RvX3NvY2tldF9hbmRfYWRkcigKICAgICAgICAgICAgICAgICAmYmlvLT5udW0sICZjLT50aGVtLCAmYy0+dGhlbV9sZW5ndGgsIGMtPnBhcmFtX2hvc3RuYW1lLAogICAgICAgICAgICAgICAgIGMtPnBhcmFtX3BvcnQpKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9VTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVCk7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVCk7CiAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsIGMtPnBhcmFtX3BvcnQpOwogICAgICAgICAgIGdvdG8gZXhpdF9sb29wOwogICAgICAgICB9CkBAIC0xODUsNyArMTg1LDcgQEAKIAogICAgICAgICBpZiAoYy0+bmJpbykgewogICAgICAgICAgIGlmICghYmlvX3NvY2tldF9uYmlvKGJpby0+bnVtLCAxKSkgewotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU8pOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU8pOwogICAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFyYW1fcG9ydCk7CiAgICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpKSk7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKHNldHNvY2tvcHQpOwotICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfS0VFUEFMSVZFKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0tFRVBBTElWRSk7CiAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsIGMtPnBhcmFtX3BvcnQpOwogICAgICAgICAgIGdvdG8gZXhpdF9sb29wOwogICAgICAgICB9CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgICAgIGJpby0+cmV0cnlfcmVhc29uID0gQklPX1JSX0NPTk5FQ1Q7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIE9QRU5TU0xfUFVUX1NZU1RFTV9FUlJPUihjb25uZWN0KTsKLSAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgY29ubl9zdGF0ZSwgQklPX1JfQ09OTkVDVF9FUlJPUik7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0NPTk5FQ1RfRVJST1IpOwogICAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFyYW1fcG9ydCk7CiAgICAgICAgICAgfQpAQCAtMjMyLDcgKzIzMiw3IEBACiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOwogICAgICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGNvbm5lY3QpOwotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBjb25uX3N0YXRlLCBCSU9fUl9OQklPX0NPTk5FQ1RfRVJST1IpOworICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OQklPX0NPTk5FQ1RfRVJST1IpOwogICAgICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJob3N0PSIsIGMtPnBhcmFtX2hvc3RuYW1lLCAiOiIsIGMtPnBhcmFtX3BvcnQpOwogICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICB9CkBAIC00NjQsNyArNDY0LDcgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQklPX0NUUkxfU0VUX0NBTExCQUNLOiB7CiAjaWYgMCAvKiBGSVhNRTogU2hvdWxkIHRoaXMgYmUgdXNlZD8gIC0tIFJpY2hhcmQgTGV2aXR0ZSAqLwotCQlPUEVOU1NMX1BVVF9FUlJPUihCSU8sIFhYWCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogCQlyZXQgPSAtMTsKICNlbHNlCiAgICAgICByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9iaW8vZmlsZS5jIGIvc3JjL2NyeXB0by9iaW8vZmlsZS5jCmluZGV4IDdmNTdhYWQuLjJkM2NjZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYmlvL2ZpbGUuYworKysgYi9zcmMvY3J5cHRvL2Jpby9maWxlLmMKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgQklPX0ZQX0FQUEVORCAweDA4CiAKIHN0YXRpYyBGSUxFICpvcGVuX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpIHsKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChDUF9VVEY4KQorI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKSAmJiBkZWZpbmVkKENQX1VURjgpCiAgIGludCBzeiwgbGVuXzAgPSAoaW50KXN0cmxlbihmaWxlbmFtZSkgKyAxOwogICBEV09SRCBmbGFnczsKIApAQCAtMTMzLDkgKzEzMyw5IEBACiAKICAgICBFUlJfYWRkX2Vycm9yX2RhdGEoNSwgImZvcGVuKCciLCBmaWxlbmFtZSwgIicsJyIsIG1vZGUsICInKSIpOwogICAgIGlmIChlcnJubyA9PSBFTk9FTlQpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX25ld19maWxlLCBCSU9fUl9OT19TVUNIX0ZJTEUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9OT19TVUNIX0ZJTEUpOwogICAgIH0gZWxzZSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19uZXdfZmlsZSwgQklPX1JfU1lTX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1NZU19MSUIpOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKICAgfQpAQCAtMTgyLDIwICsxODIsMTkgQEAKIH0KIAogc3RhdGljIGludCBmaWxlX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKSB7Ci0gIGludCByZXQgPSAwOwotCiAgIGlmICghYi0+aW5pdCkgewogICAgIHJldHVybiAwOwogICB9CiAKLSAgcmV0ID0gZnJlYWQob3V0LCAxLCBvdXRsLCAoRklMRSAqKWItPnB0cik7CisgIHNpemVfdCByZXQgPSBmcmVhZChvdXQsIDEsIG91dGwsIChGSUxFICopYi0+cHRyKTsKICAgaWYgKHJldCA9PSAwICYmIGZlcnJvcigoRklMRSAqKWItPnB0cikpIHsKICAgICBPUEVOU1NMX1BVVF9TWVNURU1fRVJST1IoZnJlYWQpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgZmlsZV9yZWFkLCBFUlJfUl9TWVNfTElCKTsKLSAgICByZXQgPSAtMTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX1NZU19MSUIpOworICAgIHJldHVybiAtMTsKICAgfQogCi0gIHJldHVybiByZXQ7CisgIC8qIGZyZWFkIHJlYWRzIGF0IG1vc3QgfG91dGx8IGJ5dGVzLCBzbyB8cmV0fCBmaXRzIGluIGFuIGludC4gKi8KKyAgcmV0dXJuIChpbnQpcmV0OwogfQogCiBzdGF0aWMgaW50IGZpbGVfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkgewpAQCAtMjUzLDcgKzI1Miw3IEBACiAgICAgICB9IGVsc2UgaWYgKG51bSAmIEJJT19GUF9SRUFEKSB7CiAgICAgICAgIEJVRl9zdHJsY3B5KHAsICJyIiwgc2l6ZW9mKHApKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgZmlsZV9jdHJsLCBCSU9fUl9CQURfRk9QRU5fTU9ERSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfQkFEX0ZPUEVOX01PREUpOwogICAgICAgICByZXQgPSAwOwogICAgICAgICBicmVhazsKICAgICAgIH0KQEAgLTI2MSw3ICsyNjAsNyBAQAogICAgICAgaWYgKGZwID09IE5VTEwpIHsKICAgICAgICAgT1BFTlNTTF9QVVRfU1lTVEVNX0VSUk9SKGZvcGVuKTsKICAgICAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDUsICJmb3BlbignIiwgcHRyLCAiJywnIiwgcCwgIicpIik7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgZmlsZV9jdHJsLCBFUlJfUl9TWVNfTElCKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9TWVNfTElCKTsKICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9wYWlyLmMgYi9zcmMvY3J5cHRvL2Jpby9wYWlyLmMKaW5kZXggY2M1NTk1MC4uNmY3ODg5MCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vcGFpci5jCisrKyBiL3NyYy9jcnlwdG8vYmlvL3BhaXIuYwpAQCAtMTgxLDI3ICsxODEsMjUgQEAKICAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CiAKICAgaWYgKCFiaW8tPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmLCBCSU9fUl9VTklOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgYiA9IGJpby0+cHRyOwogCiAgIGlmICghYiB8fCAhYi0+cGVlcikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBwZWVyX2IgPSBiLT5wZWVyLT5wdHI7CiAgIGlmICghcGVlcl9iIHx8ICFwZWVyX2ItPnBlZXIgfHwgcGVlcl9iLT5wZWVyLT5wdHIgIT0gYikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAocGVlcl9iLT56ZXJvX2NvcHlfcmVhZF9sb2NrKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1ZiwgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yMjksMzcgKzIyNywzMiBAQAogICBhc3NlcnQoQklPX2dldF9yZXRyeV9mbGFncyhiaW8pID09IDApOwogCiAgIGlmICghYmlvLT5pbml0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBiID0gYmlvLT5wdHI7CiAKICAgaWYgKCFiIHx8ICFiLT5wZWVyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGVlcl9iID0gYi0+cGVlci0+cHRyOwogICBpZiAoIXBlZXJfYiB8fCAhcGVlcl9iLT5wZWVyIHx8IHBlZXJfYi0+cGVlci0+cHRyICE9IGIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIXBlZXJfYi0+emVyb19jb3B5X3JlYWRfbG9jaykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfcmVhZF9idWZfZG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgbWF4X2F2YWlsYWJsZSA9CiAgICAgICBiaW9femVyb19jb3B5X2dldF9yZWFkX2J1ZihwZWVyX2IsICZkdW1teV9yZWFkX2J1ZiwgJmR1bW15X3JlYWRfb2Zmc2V0KTsKICAgaWYgKGJ5dGVzX3JlYWQgPiBtYXhfYXZhaWxhYmxlKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF9yZWFkX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzE4LDM1ICszMTEsMzMgQEAKICAgQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CiAKICAgaWYgKCFiaW8tPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1ZiwgQklPX1JfVU5JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTklOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGIgPSBiaW8tPnB0cjsKIAogICBpZiAoIWIgfHwgIWItPmJ1ZiB8fCAhYi0+cGVlcikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAwOwogICB9CiAgIHBlZXJfYiA9IGItPnBlZXItPnB0cjsKICAgaWYgKCFwZWVyX2IgfHwgIXBlZXJfYi0+cGVlciB8fCBwZWVyX2ItPnBlZXItPnB0ciAhPSBiKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBhc3NlcnQoYi0+YnVmICE9IE5VTEwpOwogCiAgIGlmIChiLT56ZXJvX2NvcHlfd3JpdGVfbG9jaykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgYi0+cmVxdWVzdCA9IDA7CiAgIGlmIChiLT5jbG9zZWQpIHsKICAgICAvKiBCaW8gaXMgYWxyZWFkeSBjbG9zZWQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWYsIEJJT19SX0JST0tFTl9QSVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0JST0tFTl9QSVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNjksNDMgKzM2MCwzOCBAQAogICB1aW50OF90KiBkdW1teV93cml0ZV9idWY7CiAKICAgaWYgKCFiaW8tPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBiID0gYmlvLT5wdHI7CiAKICAgaWYgKCFiIHx8ICFiLT5idWYgfHwgIWItPnBlZXIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOwogICAgIHJldHVybiAwOwogICB9CiAgIHBlZXJfYiA9IGItPnBlZXItPnB0cjsKICAgaWYgKCFwZWVyX2IgfHwgIXBlZXJfYi0+cGVlciB8fCBwZWVyX2ItPnBlZXItPnB0ciAhPSBiKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9femVyb19jb3B5X2dldF93cml0ZV9idWZfZG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGItPnJlcXVlc3QgPSAwOwogICBpZiAoYi0+Y2xvc2VkKSB7CiAgICAgLyogQklPIGlzIGFscmVhZHkgY2xvc2VkLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmX2RvbmUsIEJJT19SX0JST0tFTl9QSVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT19SX0JST0tFTl9QSVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmICghYi0+emVyb19jb3B5X3dyaXRlX2xvY2spIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lLAotICAgICAgICAgICAgICAgICAgICAgIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICByZXN0ID0gYmlvX3plcm9fY29weV9nZXRfd3JpdGVfYnVmKGIsICZkdW1teV93cml0ZV9idWYsICZkdW1teV93cml0ZV9vZmZzZXQpOwogCiAgIGlmIChieXRlc193cml0dGVuID4gcmVzdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmX2RvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgQklPX1JfSU5WQUxJRF9BUkdVTUVOVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9JTlZBTElEX0FSR1VNRU5UKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01MjUsNyArNTExLDcgQEAKICAgYi0+cmVxdWVzdCA9IDA7CiAgIGlmIChiLT5jbG9zZWQpIHsKICAgICAvKiB3ZSBhbHJlYWR5IGNsb3NlZCAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX3dyaXRlLCBCSU9fUl9CUk9LRU5fUElQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBCSU9fUl9CUk9LRU5fUElQRSk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKQEAgLTU5MCw3ICs1NzYsNyBAQAogICBiMiA9IGJpbzItPnB0cjsKIAogICBpZiAoYjEtPnBlZXIgIT0gTlVMTCB8fCBiMi0+cGVlciAhPSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fbWFrZV9wYWlyLCBCSU9fUl9JTl9VU0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX1JfSU5fVVNFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC02MDUsNyArNTkxLDcgQEAKICAgICAgIGIxLT5idWZfZXh0ZXJuYWxseV9hbGxvY2F0ZWQgPSAwOwogICAgICAgYjEtPmJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGIxLT5zaXplKTsKICAgICAgIGlmIChiMS0+YnVmID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBiaW9fbWFrZV9wYWlyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNjI0LDcgKzYxMCw3IEBACiAgICAgICBiMi0+YnVmX2V4dGVybmFsbHlfYWxsb2NhdGVkID0gMDsKICAgICAgIGIyLT5idWYgPSBPUEVOU1NMX21hbGxvYyhiMi0+c2l6ZSk7CiAgICAgICBpZiAoYjItPmJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgYmlvX21ha2VfcGFpciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCSU8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYmlvL3ByaW50Zi5jIGIvc3JjL2NyeXB0by9iaW8vcHJpbnRmLmMKaW5kZXggZjUxYjM5Ni4uMmY1YWU0YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vcHJpbnRmLmMKKysrIGIvc3JjL2NyeXB0by9iaW8vcHJpbnRmLmMKQEAgLTk1LDcgKzk1LDcgQEAKICAgICBvdXQgPSBPUEVOU1NMX21hbGxvYyhyZXF1ZXN0ZWRfbGVuICsgMSk7CiAgICAgb3V0X21hbGxvY2VkID0gMTsKICAgICBpZiAob3V0ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJJTywgQklPX3ByaW50ZiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Jpby9zb2NrZXRfaGVscGVyLmMgYi9zcmMvY3J5cHRvL2Jpby9zb2NrZXRfaGVscGVyLmMKaW5kZXggYjFjZGQxYS4uMDFmNjM1ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9iaW8vc29ja2V0X2hlbHBlci5jCisrKyBiL3NyYy9jcnlwdG8vYmlvL3NvY2tldF9oZWxwZXIuYwpAQCAtMTIsNyArMTIsOCBAQAogICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgogICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KIAotI2RlZmluZSBfUE9TSVhfU09VUkNFCisjdW5kZWYgX1BPU0lYX0NfU09VUkNFCisjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSAyMDAxMTJMCiAKICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CkBAIC01MCw3ICs1MSw3IEBACiAKICAgcmV0ID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHBvcnRfc3RyLCAmaGludCwgJnJlc3VsdCk7CiAgIGlmIChyZXQgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNZUywgZ2V0YWRkcmluZm8sIDApOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFNZUywgMCk7CiAgICAgRVJSX2FkZF9lcnJvcl9kYXRhKDEsIGdhaV9zdHJlcnJvcihyZXQpKTsKICAgICByZXR1cm4gMDsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vYm4vQ01ha2VMaXN0cy50eHQKaW5kZXggMmUwY2I0NS4uMjMyZTQwYSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ibi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2JuL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQogICBzZXQoCkBAIC0zOSw2ICszOSw3IEBACiAgIGFkZC5jCiAgIGFzbS94ODZfNjQtZ2NjLmMKICAgYm4uYworICBibl9hc24xLmMKICAgY21wLmMKICAgY29udmVydC5jCiAgIGN0eC5jCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2FkZC5jIGIvc3JjL2NyeXB0by9ibi9hZGQuYwppbmRleCAxYzZiMmQ3Li5hMDQzZDgzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2FkZC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vYWRkLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCiAgIGlmIChkaWYgPCAwKSAvKiBobW0uLi4gc2hvdWxkIG5vdCBiZSBoYXBwZW5pbmcgKi8KICAgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl91c3ViLCBCTl9SX0FSRzJfTFRfQVJHMyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQVJHMl9MVF9BUkczKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsIGIvc3JjL2NyeXB0by9ibi9hc20vYXJtdjQtbW9udC5wbAppbmRleCAwZjFiNmE5Li40MjA2ZmQ4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsCisrKyBiL3NyYy9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwKQEAgLTc5LDcgKzc5LDcgQEAKICRfbnVtPSIkbnVtLCMxNSo0IjsJJF9icGVuZD0kX251bTsKIAogJGNvZGU9PDxfX187Ci0jaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAKIC50ZXh0CiAuY29kZQkzMgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9ibi5jIGIvc3JjL2NyeXB0by9ibi9ibi5jCmluZGV4IGYzMmQ2YjAuLmIzNDI3NDkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vYm4uYworKysgYi9zcmMvY3J5cHRvL2JuL2JuLmMKQEAgLTY5LDcgKzY5LDcgQEAKICAgQklHTlVNICpibiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCSUdOVU0pKTsKIAogICBpZiAoYm4gPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTI3OSwyNiArMjc5LDI2IEBACiAgIH0KIH0KIAotQklHTlVNICpibl93ZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIHdvcmRzKSB7CitCSUdOVU0gKmJuX3dleHBhbmQoQklHTlVNICpibiwgc2l6ZV90IHdvcmRzKSB7CiAgIEJOX1VMT05HICphOwogCi0gIGlmICh3b3JkcyA8PSAodW5zaWduZWQpIGJuLT5kbWF4KSB7CisgIGlmICh3b3JkcyA8PSAoc2l6ZV90KWJuLT5kbWF4KSB7CiAgICAgcmV0dXJuIGJuOwogICB9CiAKICAgaWYgKHdvcmRzID4gKElOVF9NQVggLyAoNCAqIEJOX0JJVFMyKSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgYm5fd2V4cGFuZCwgQk5fUl9CSUdOVU1fVE9PX0xPTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJR05VTV9UT09fTE9ORyk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBpZiAoYm4tPmZsYWdzICYgQk5fRkxHX1NUQVRJQ19EQVRBKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIGJuX3dleHBhbmQsIEJOX1JfRVhQQU5EX09OX1NUQVRJQ19CSUdOVU1fREFUQSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfRVhQQU5EX09OX1NUQVRJQ19CSUdOVU1fREFUQSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBhID0gKEJOX1VMT05HICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX1VMT05HKSAqIHdvcmRzKTsKICAgaWYgKGEgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBibl93ZXhwYW5kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0zMDYsMTIgKzMwNiwxNiBAQAogCiAgIE9QRU5TU0xfZnJlZShibi0+ZCk7CiAgIGJuLT5kID0gYTsKLSAgYm4tPmRtYXggPSB3b3JkczsKKyAgYm4tPmRtYXggPSAoaW50KXdvcmRzOwogCiAgIHJldHVybiBibjsKIH0KIAotQklHTlVNICpibl9leHBhbmQoQklHTlVNICpibiwgdW5zaWduZWQgYml0cykgeworQklHTlVNICpibl9leHBhbmQoQklHTlVNICpibiwgc2l6ZV90IGJpdHMpIHsKKyAgaWYgKGJpdHMgKyBCTl9CSVRTMiAtIDEgPCBiaXRzKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQklHTlVNX1RPT19MT05HKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQogICByZXR1cm4gYm5fd2V4cGFuZChibiwgKGJpdHMrQk5fQklUUzItMSkvQk5fQklUUzIpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2JuX2FzbjEuYyBiL3NyYy9jcnlwdG8vYm4vYm5fYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzBiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL2JuL2JuX2FzbjEuYwpAQCAtMCwwICsxLDkzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisKK2ludCBCTl9jYnMydW5zaWduZWQoQ0JTICpjYnMsIEJJR05VTSAqcmV0KSB7CisgIENCUyBjaGlsZDsKKyAgaWYgKCFDQlNfZ2V0X2FzbjEoY2JzLCAmY2hpbGQsIENCU19BU04xX0lOVEVHRVIpIHx8CisgICAgICBDQlNfbGVuKCZjaGlsZCkgPT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9FTkNPRElORyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoQ0JTX2RhdGEoJmNoaWxkKVswXSAmIDB4ODApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogSU5URUdFUnMgbXVzdCBiZSBtaW5pbWFsLiAqLworICBpZiAoQ0JTX2RhdGEoJmNoaWxkKVswXSA9PSAweDAwICYmCisgICAgICBDQlNfbGVuKCZjaGlsZCkgPiAxICYmCisgICAgICAhKENCU19kYXRhKCZjaGlsZClbMV0gJiAweDgwKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9FTkNPRElORyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gQk5fYmluMmJuKENCU19kYXRhKCZjaGlsZCksIENCU19sZW4oJmNoaWxkKSwgcmV0KSAhPSBOVUxMOworfQorCitpbnQgQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KENCUyAqY2JzLCBCSUdOVU0gKnJldCkgeworICBDQlMgY2hpbGQ7CisgIGlmICghQ0JTX2dldF9hc24xKGNicywgJmNoaWxkLCBDQlNfQVNOMV9JTlRFR0VSKSB8fAorICAgICAgQ0JTX2xlbigmY2hpbGQpID09IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9CQURfRU5DT0RJTkcpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogVGhpcyBmdW5jdGlvbiBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHJlamVjdCBuZWdhdGl2ZSBudW1iZXJzIG9yIG5vbi1taW5pbWFsCisgICAqIGVuY29kaW5ncy4gRXN0b25pYW4gSURzIGlzc3VlZCBiZXR3ZWVuIFNlcHRlbWJlciAyMDE0IHRvIFNlcHRlbWJlciAyMDE1IGFyZQorICAgKiBicm9rZW4uIFNlZSBodHRwczovL2NyYnVnLmNvbS81MzIwNDggYW5kIGh0dHBzOi8vY3JidWcuY29tLzUzNDc2Ni4KKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IFJlbW92ZSB0aGlzIGNvZGUgYW5kIGNhbGxlcnMgaW4gTWFyY2ggMjAxNi4gKi8KKyAgcmV0dXJuIEJOX2JpbjJibihDQlNfZGF0YSgmY2hpbGQpLCBDQlNfbGVuKCZjaGlsZCksIHJldCkgIT0gTlVMTDsKK30KKworaW50IEJOX2JuMmNiYihDQkIgKmNiYiwgY29uc3QgQklHTlVNICpibikgeworICAvKiBOZWdhdGl2ZSBudW1iZXJzIGFyZSB1bnN1cHBvcnRlZC4gKi8KKyAgaWYgKEJOX2lzX25lZ2F0aXZlKGJuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05FR0FUSVZFX05VTUJFUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDQkIgY2hpbGQ7CisgIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9JTlRFR0VSKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0VOQ09ERV9FUlJPUik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBUaGUgbnVtYmVyIG11c3QgYmUgcGFkZGVkIHdpdGggYSBsZWFkaW5nIHplcm8gaWYgdGhlIGhpZ2ggYml0IHdvdWxkCisgICAqIG90aGVyd2lzZSBiZSBzZXQgKG9yIHxibnwgaXMgemVybykuICovCisgIGlmIChCTl9udW1fYml0cyhibikgJSA4ID09IDAgJiYKKyAgICAgICFDQkJfYWRkX3U4KCZjaGlsZCwgMHgwMCkpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9FTkNPREVfRVJST1IpOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDhfdCAqb3V0OworICBpZiAoIUNCQl9hZGRfc3BhY2UoJmNoaWxkLCAmb3V0LCBCTl9udW1fYnl0ZXMoYm4pKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0VOQ09ERV9FUlJPUik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQk5fYm4yYmluKGJuLCBvdXQpOworICBpZiAoIUNCQl9mbHVzaChjYmIpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfRU5DT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vYm5fdGVzdC5jYyBiL3NyYy9jcnlwdG8vYm4vYm5fdGVzdC5jYwppbmRleCA2YTdkNDhjLi40NzA5M2E3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2JuX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9ibi9ibl90ZXN0LmNjCkBAIC04Miw2ICs4Miw3IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogI2luY2x1ZGUgIi4uL2NyeXB0by90ZXN0L3Njb3BlZF90eXBlcy5oIgorI2luY2x1ZGUgIi4uL2NyeXB0by90ZXN0L3Rlc3RfdXRpbC5oIgogCiAKIC8vIFRoaXMgcHJvZ3JhbSB0ZXN0cyB0aGUgQklHTlVNIGltcGxlbWVudGF0aW9uLiBJdCB0YWtlcyBhbiBvcHRpb25hbCAtYmMKQEAgLTExNywxMSArMTE4LDEzIEBACiBzdGF0aWMgYm9vbCB0ZXN0X3NtYWxsX3ByaW1lKEZJTEUgKmZwLCBCTl9DVFggKmN0eCk7CiBzdGF0aWMgYm9vbCB0ZXN0X21vZF9leHBfbW9udDUoRklMRSAqZnAsIEJOX0NUWCAqY3R4KTsKIHN0YXRpYyBib29sIHRlc3Rfc3FydChGSUxFICpmcCwgQk5fQ1RYICpjdHgpOwotc3RhdGljIGJvb2wgdGVzdF9ibjJiaW5fcGFkZGVkKEZJTEUgKmZwLCBCTl9DVFggKmN0eCk7Ci1zdGF0aWMgYm9vbCB0ZXN0X2RlYzJibihGSUxFICpmcCwgQk5fQ1RYICpjdHgpOwotc3RhdGljIGJvb2wgdGVzdF9oZXgyYm4oRklMRSAqZnAsIEJOX0NUWCAqY3R4KTsKLXN0YXRpYyBib29sIHRlc3RfYXNjMmJuKEZJTEUgKmZwLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgYm9vbCB0ZXN0X2JuMmJpbl9wYWRkZWQoQk5fQ1RYICpjdHgpOworc3RhdGljIGJvb2wgdGVzdF9kZWMyYm4oQk5fQ1RYICpjdHgpOworc3RhdGljIGJvb2wgdGVzdF9oZXgyYm4oQk5fQ1RYICpjdHgpOworc3RhdGljIGJvb2wgdGVzdF9hc2MyYm4oQk5fQ1RYICpjdHgpOworc3RhdGljIGJvb2wgdGVzdF9tcGkoKTsKIHN0YXRpYyBib29sIHRlc3RfcmFuZCgpOworc3RhdGljIGJvb2wgdGVzdF9hc24xKCk7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtTYW1wbGVbXSA9CiAgICAgIlx4QzZceDRGXHg0M1x4MDRceDJBXHhFQVx4Q0FceDZFXHg1OFx4MzZceDgwXHg1Qlx4RThceEM5IgpAQCAtMzExLDM1ICszMTQsMTUgQEAKICAgfQogICBmbHVzaF9mcChiY19maWxlLmdldCgpKTsKIAotICBtZXNzYWdlKGJjX2ZpbGUuZ2V0KCksICJCTl9ibjJiaW5fcGFkZGVkIik7Ci0gIGlmICghdGVzdF9ibjJiaW5fcGFkZGVkKGJjX2ZpbGUuZ2V0KCksIGN0eC5nZXQoKSkpIHsKKyAgaWYgKCF0ZXN0X2JuMmJpbl9wYWRkZWQoY3R4LmdldCgpKSB8fAorICAgICAgIXRlc3RfZGVjMmJuKGN0eC5nZXQoKSkgfHwKKyAgICAgICF0ZXN0X2hleDJibihjdHguZ2V0KCkpIHx8CisgICAgICAhdGVzdF9hc2MyYm4oY3R4LmdldCgpKSB8fAorICAgICAgIXRlc3RfbXBpKCkgfHwKKyAgICAgICF0ZXN0X3JhbmQoKSB8fAorICAgICAgIXRlc3RfYXNuMSgpKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KLSAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7Ci0KLSAgbWVzc2FnZShiY19maWxlLmdldCgpLCAiQk5fZGVjMmJuIik7Ci0gIGlmICghdGVzdF9kZWMyYm4oYmNfZmlsZS5nZXQoKSwgY3R4LmdldCgpKSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIGZsdXNoX2ZwKGJjX2ZpbGUuZ2V0KCkpOwotCi0gIG1lc3NhZ2UoYmNfZmlsZS5nZXQoKSwgIkJOX2hleDJibiIpOwotICBpZiAoIXRlc3RfaGV4MmJuKGJjX2ZpbGUuZ2V0KCksIGN0eC5nZXQoKSkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBmbHVzaF9mcChiY19maWxlLmdldCgpKTsKLQotICBtZXNzYWdlKGJjX2ZpbGUuZ2V0KCksICJCTl9hc2MyYm4iKTsKLSAgaWYgKCF0ZXN0X2FzYzJibihiY19maWxlLmdldCgpLCBjdHguZ2V0KCkpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7Ci0KLSAgbWVzc2FnZShiY19maWxlLmdldCgpLCAiQk5fcmFuZCIpOwotICBpZiAoIXRlc3RfcmFuZCgpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgZmx1c2hfZnAoYmNfZmlsZS5nZXQoKSk7CiAKICAgcHJpbnRmKCJQQVNTXG4iKTsKICAgcmV0dXJuIDA7CkBAIC00NDAsNiArNDIzLDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyAgaWYgKCFCTl9vbmUoYS5nZXQoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgQk5femVybyhiLmdldCgpKTsKKyAgaWYgKEJOX2RpdihkLmdldCgpLCBjLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCBjdHgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJEaXZpc2lvbiBieSB6ZXJvIHN1Y2NlZWRlZCFcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBFUlJfY2xlYXJfZXJyb3IoKTsKKwogICBmb3IgKGludCBpID0gMDsgaSA8IG51bTAgKyBudW0xOyBpKyspIHsKICAgICBpZiAoaSA8IG51bTEpIHsKICAgICAgIGlmICghQk5fcmFuZChhLmdldCgpLCA0MDAsIDAsIDApIHx8CkBAIC04MzcsMTggKzgzMCwxNyBAQAogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0wOyBpKyspIHsKLSAgICBCTl9VTE9ORyBzOwogICAgIGRvIHsKICAgICAgIGlmICghQk5fcmFuZChhLmdldCgpLCA1MTIsIC0xLCAwKSB8fAogICAgICAgICAgICFCTl9yYW5kKGIuZ2V0KCksIEJOX0JJVFMyLCAtMSwgMCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgcyA9IGItPmRbMF07Ci0gICAgfSB3aGlsZSAoIXMpOworICAgIH0gd2hpbGUgKEJOX2lzX3plcm8oYi5nZXQoKSkpOwogCiAgICAgaWYgKCFCTl9jb3B5KGIuZ2V0KCksIGEuZ2V0KCkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIEJOX1VMT05HIHMgPSBiLT5kWzBdOwogICAgIEJOX1VMT05HIHIgPSBCTl9kaXZfd29yZChiLmdldCgpLCBzKTsKICAgICBpZiAociA9PSAoQk5fVUxPTkcpLTEpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTg5MSw4ICs4ODMsMjcgQEAKICAgU2NvcGVkQklHTlVNIEIoQk5fbmV3KCkpOwogICBTY29wZWRCSUdOVU0gbihCTl9uZXcoKSk7CiAgIFNjb3BlZEJOX01PTlRfQ1RYIG1vbnQoQk5fTU9OVF9DVFhfbmV3KCkpOwotICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIUEgfHwgIUIgfHwgIW4gfHwgIW1vbnQgfHwKLSAgICAgICFCTl9yYW5kKGEuZ2V0KCksIDEwMCwgMCwgMCkgfHwKKyAgaWYgKCFhIHx8ICFiIHx8ICFjIHx8ICFkIHx8ICFBIHx8ICFCIHx8ICFuIHx8ICFtb250KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQk5femVybyhuLmdldCgpKTsKKyAgaWYgKEJOX01PTlRfQ1RYX3NldChtb250LmdldCgpLCBuLmdldCgpLCBjdHgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTl9NT05UX0NUWF9zZXQgc3VjY2VlZGVkIGZvciB6ZXJvIG1vZHVsdXMhXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCFCTl9zZXRfd29yZChuLmdldCgpLCAxNikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKEJOX01PTlRfQ1RYX3NldChtb250LmdldCgpLCBuLmdldCgpLCBjdHgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTl9NT05UX0NUWF9zZXQgc3VjY2VlZGVkIGZvciBldmVuIG1vZHVsdXMhXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCFCTl9yYW5kKGEuZ2V0KCksIDEwMCwgMCwgMCkgfHwKICAgICAgICFCTl9yYW5kKGIuZ2V0KCksIDEwMCwgMCwgMCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTkzMiw2ICs5NDMsNyBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQorCiAgIHJldHVybiB0cnVlOwogfQogCkBAIC05ODUsNiArOTk3LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyAgaWYgKCFCTl9vbmUoYS5nZXQoKSkgfHwgIUJOX29uZShiLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBCTl96ZXJvKGMuZ2V0KCkpOworICBpZiAoQk5fbW9kX211bChlLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCBjLmdldCgpLCBjdHgpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTl9tb2RfbXVsIHdpdGggemVybyBtb2R1bHVzIHN1Y2NlZWRlZCFcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBFUlJfY2xlYXJfZXJyb3IoKTsKKwogICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgewogICAgIGlmICghQk5fcmFuZChjLmdldCgpLCAxMDI0LCAwLCAwKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTAzOSw4ICsxMDYxLDIxIEBACiAgIFNjb3BlZEJJR05VTSBjKEJOX25ldygpKTsKICAgU2NvcGVkQklHTlVNIGQoQk5fbmV3KCkpOwogICBTY29wZWRCSUdOVU0gZShCTl9uZXcoKSk7Ci0gIGlmICghYSB8fCAhYiB8fCAhYyB8fCAhZCB8fCAhZSB8fAotICAgICAgIUJOX3JhbmQoYy5nZXQoKSwgMzAsIDAsIDEpKSB7ICAvLyBtdXN0IGJlIG9kZCBmb3IgbW9udGdvbWVyeQorICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIWUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIUJOX29uZShhLmdldCgpKSB8fCAhQk5fb25lKGIuZ2V0KCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEJOX3plcm8oYy5nZXQoKSk7CisgIGlmIChCTl9tb2RfZXhwKGQuZ2V0KCksIGEuZ2V0KCksIGIuZ2V0KCksIGMuZ2V0KCksIGN0eCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX21vZF9leHAgd2l0aCB6ZXJvIG1vZHVsdXMgc3VjY2VlZGVkIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCFCTl9yYW5kKGMuZ2V0KCksIDMwLCAwLCAxKSkgeyAgLy8gbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKQEAgLTEwNzksOCArMTExNCwzMiBAQAogICBTY29wZWRCSUdOVU0gYyhCTl9uZXcoKSk7CiAgIFNjb3BlZEJJR05VTSBkKEJOX25ldygpKTsKICAgU2NvcGVkQklHTlVNIGUoQk5fbmV3KCkpOwotICBpZiAoIWEgfHwgIWIgfHwgIWMgfHwgIWQgfHwgIWUgfHwKLSAgICAgICFCTl9yYW5kKGMuZ2V0KCksIDMwLCAwLCAxKSkgeyAgLy8gbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkKKyAgaWYgKCFhIHx8ICFiIHx8ICFjIHx8ICFkIHx8ICFlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFCTl9vbmUoYS5nZXQoKSkgfHwgIUJOX29uZShiLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBCTl96ZXJvKGMuZ2V0KCkpOworICBpZiAoQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZShkLmdldCgpLCBhLmdldCgpLCBiLmdldCgpLCBjLmdldCgpLCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lIHdpdGggemVybyBtb2R1bHVzIHN1Y2NlZWRlZCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIGlmICghQk5fc2V0X3dvcmQoYy5nZXQoKSwgMTYpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKGQuZ2V0KCksIGEuZ2V0KCksIGIuZ2V0KCksIGMuZ2V0KCksIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUgd2l0aCBldmVuIG1vZHVsdXMgc3VjY2VlZGVkIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCFCTl9yYW5kKGMuZ2V0KCksIDMwLCAwLCAxKSkgeyAgLy8gbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW0yOyBpKyspIHsKQEAgLTEyMDgsOCArMTI2Nyw5IEBACiAgICAgaWYgKCFCTl9vbmUoZS5nZXQoKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgZm9yICg7ICFCTl9pc196ZXJvKGIuZ2V0KCkpOyBCTl9zdWIoYi5nZXQoKSwgYi5nZXQoKSwgQk5fdmFsdWVfb25lKCkpKSB7Ci0gICAgICBpZiAoIUJOX211bChlLmdldCgpLCBlLmdldCgpLCBhLmdldCgpLCBjdHgpKSB7CisgICAgd2hpbGUgKCFCTl9pc196ZXJvKGIuZ2V0KCkpKSB7CisgICAgICBpZiAoIUJOX211bChlLmdldCgpLCBlLmdldCgpLCBhLmdldCgpLCBjdHgpIHx8CisgICAgICAgICAgIUJOX3N1YihiLmdldCgpLCBiLmdldCgpLCBCTl92YWx1ZV9vbmUoKSkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KQEAgLTEzNzEsNyArMTQzMSw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCB0ZXN0X2JuMmJpbl9wYWRkZWQoRklMRSAqZnAsIEJOX0NUWCAqY3R4KSB7CitzdGF0aWMgYm9vbCB0ZXN0X2JuMmJpbl9wYWRkZWQoQk5fQ1RYICpjdHgpIHsKICAgdWludDhfdCB6ZXJvc1syNTZdLCBvdXRbMjU2XSwgcmVmZXJlbmNlWzEyOF07CiAKICAgbWVtc2V0KHplcm9zLCAwLCBzaXplb2YoemVyb3MpKTsKQEAgLTE0NDgsNyArMTUwOCw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIHRlc3RfZGVjMmJuKEZJTEUgKmZwLCBCTl9DVFggKmN0eCkgeworc3RhdGljIGJvb2wgdGVzdF9kZWMyYm4oQk5fQ1RYICpjdHgpIHsKICAgU2NvcGVkQklHTlVNIGJuOwogICBpbnQgcmV0ID0gRGVjaW1hbFRvQklHTlVNKCZibiwgIjAiKTsKICAgaWYgKHJldCAhPSAxIHx8ICFCTl9pc196ZXJvKGJuLmdldCgpKSB8fCBCTl9pc19uZWdhdGl2ZShibi5nZXQoKSkpIHsKQEAgLTE0OTAsNyArMTU1MCw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBib29sIHRlc3RfaGV4MmJuKEZJTEUgKmZwLCBCTl9DVFggKmN0eCkgeworc3RhdGljIGJvb2wgdGVzdF9oZXgyYm4oQk5fQ1RYICpjdHgpIHsKICAgU2NvcGVkQklHTlVNIGJuOwogICBpbnQgcmV0ID0gSGV4VG9CSUdOVU0oJmJuLCAiMCIpOwogICBpZiAocmV0ICE9IDEgfHwgIUJOX2lzX3plcm8oYm4uZ2V0KCkpIHx8IEJOX2lzX25lZ2F0aXZlKGJuLmdldCgpKSkgewpAQCAtMTUzMyw3ICsxNTkzLDcgQEAKICAgcmV0dXJuIFNjb3BlZEJJR05VTShyYXcpOwogfQogCi1zdGF0aWMgYm9vbCB0ZXN0X2FzYzJibihGSUxFICpmcCwgQk5fQ1RYICpjdHgpIHsKK3N0YXRpYyBib29sIHRlc3RfYXNjMmJuKEJOX0NUWCAqY3R4KSB7CiAgIFNjb3BlZEJJR05VTSBibiA9IEFTQ0lJVG9CSUdOVU0oIjAiKTsKICAgaWYgKCFibiB8fCAhQk5faXNfemVybyhibi5nZXQoKSkgfHwgQk5faXNfbmVnYXRpdmUoYm4uZ2V0KCkpKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJCTl9hc2MyYm4gZ2F2ZSBhIGJhZCByZXN1bHQuXG4iKTsKQEAgLTE1ODUsNiArMTY0NSw2MyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RydWN0IE1QSVRlc3QgeworICBjb25zdCBjaGFyICpiYXNlMTA7CisgIGNvbnN0IGNoYXIgKm1waTsKKyAgc2l6ZV90IG1waV9sZW47Cit9OworCitzdGF0aWMgY29uc3QgTVBJVGVzdCBrTVBJVGVzdHNbXSA9IHsKKyAgeyAiMCIsICJceDAwXHgwMFx4MDBceDAwIiwgNCB9LAorICB7ICIxIiwgIlx4MDBceDAwXHgwMFx4MDFceDAxIiwgNSB9LAorICB7ICItMSIsICJceDAwXHgwMFx4MDBceDAxXHg4MSIsIDUgfSwKKyAgeyAiMTI4IiwgIlx4MDBceDAwXHgwMFx4MDJceDAwXHg4MCIsIDYgfSwKKyAgeyAiMjU2IiwgIlx4MDBceDAwXHgwMFx4MDJceDAxXHgwMCIsIDYgfSwKKyAgeyAiLTI1NiIsICJceDAwXHgwMFx4MDBceDAyXHg4MVx4MDAiLCA2IH0sCit9OworCitzdGF0aWMgYm9vbCB0ZXN0X21waSgpIHsKKyAgdWludDhfdCBzY3JhdGNoWzhdOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtNUElUZXN0cykgLyBzaXplb2Yoa01QSVRlc3RzWzBdKTsgaSsrKSB7CisgICAgY29uc3QgTVBJVGVzdCAmdGVzdCA9IGtNUElUZXN0c1tpXTsKKyAgICBTY29wZWRCSUdOVU0gYm4oQVNDSUlUb0JJR05VTSh0ZXN0LmJhc2UxMCkpOworICAgIGNvbnN0IHNpemVfdCBtcGlfbGVuID0gQk5fYm4ybXBpKGJuLmdldCgpLCBOVUxMKTsKKyAgICBpZiAobXBpX2xlbiA+IHNpemVvZihzY3JhdGNoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNUEkgdGVzdCAjJXU6IE1QSSBzaXplIGlzIHRvbyBsYXJnZSB0byB0ZXN0LlxuIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkKWkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBtcGlfbGVuMiA9IEJOX2JuMm1waShibi5nZXQoKSwgc2NyYXRjaCk7CisgICAgaWYgKG1waV9sZW4gIT0gbXBpX2xlbjIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiBsZW5ndGggY2hhbmdlcy5cbiIsICh1bnNpZ25lZClpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobXBpX2xlbiAhPSB0ZXN0Lm1waV9sZW4gfHwKKyAgICAgICAgbWVtY21wKHRlc3QubXBpLCBzY3JhdGNoLCBtcGlfbGVuKSAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1QSSB0ZXN0ICMldSBmYWlsZWQ6XG4iLCAodW5zaWduZWQpaSk7CisgICAgICBoZXhkdW1wKHN0ZGVyciwgIkV4cGVjdGVkOiAiLCB0ZXN0Lm1waSwgdGVzdC5tcGlfbGVuKTsKKyAgICAgIGhleGR1bXAoc3RkZXJyLCAiR290OiAgICAgICIsIHNjcmF0Y2gsIG1waV9sZW4pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFNjb3BlZEJJR05VTSBibjIoQk5fbXBpMmJuKHNjcmF0Y2gsIG1waV9sZW4sIE5VTEwpKTsKKyAgICBpZiAoYm4yLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiBmYWlsZWQgdG8gcGFyc2VcbiIsICh1bnNpZ25lZClpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTVBJIHRlc3QgIyV1OiB3cm9uZyByZXN1bHRcbiIsICh1bnNpZ25lZClpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdGljIGJvb2wgdGVzdF9yYW5kKCkgewogICBTY29wZWRCSUdOVU0gYm4oQk5fbmV3KCkpOwogICBpZiAoIWJuKSB7CkBAIC0xNjI4LDMgKzE3NDUsMTcwIEBACiAKICAgcmV0dXJuIHRydWU7CiB9CisKK3N0cnVjdCBBU04xVGVzdCB7CisgIGNvbnN0IGNoYXIgKnZhbHVlX2FzY2lpOworICBjb25zdCBjaGFyICpkZXI7CisgIHNpemVfdCBkZXJfbGVuOworfTsKKworc3RhdGljIGNvbnN0IEFTTjFUZXN0IGtBU04xVGVzdHNbXSA9IHsKKyAgICB7IjAiLCAiXHgwMlx4MDFceDAwIiwgM30sCisgICAgeyIxIiwgIlx4MDJceDAxXHgwMSIsIDN9LAorICAgIHsiMTI3IiwgIlx4MDJceDAxXHg3ZiIsIDN9LAorICAgIHsiMTI4IiwgIlx4MDJceDAyXHgwMFx4ODAiLCA0fSwKKyAgICB7IjB4ZGVhZGJlZWYiLCAiXHgwMlx4MDVceDAwXHhkZVx4YWRceGJlXHhlZiIsIDd9LAorICAgIHsiMHgwMTAyMDMwNDA1MDYwNzA4IiwKKyAgICAgIlx4MDJceDA4XHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDgiLCAxMH0sCisgICAgeyIweGZmZmZmZmZmZmZmZmZmZmYiLAorICAgICAgIlx4MDJceDA5XHgwMFx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgMTF9LAorfTsKKworc3RydWN0IEFTTjFJbnZhbGlkVGVzdCB7CisgIGNvbnN0IGNoYXIgKmRlcjsKKyAgc2l6ZV90IGRlcl9sZW47Cit9OworCitzdGF0aWMgY29uc3QgQVNOMUludmFsaWRUZXN0IGtBU04xSW52YWxpZFRlc3RzW10gPSB7CisgICAgLy8gQmFkIHRhZy4KKyAgICB7Ilx4MDNceDAxXHgwMCIsIDN9LAorICAgIC8vIEVtcHR5IGNvbnRlbnRzLgorICAgIHsiXHgwMlx4MDAiLCAyfSwKK307CisKKy8vIGtBU04xQnVnZ3lUZXN0cyBhcmUgaW5jb3JyZWN0IGVuY29kaW5ncyBhbmQgaG93IHxCTl9jYnMydW5zaWduZWRfYnVnZ3l8CisvLyBzaG91bGQgaW50ZXJwcmV0IHRoZW0uCitzdGF0aWMgY29uc3QgQVNOMVRlc3Qga0FTTjFCdWdneVRlc3RzW10gPSB7CisgICAgLy8gTmVnYXRpdmUgbnVtYmVycy4KKyAgICB7IjEyOCIsICJceDAyXHgwMVx4ODAiLCAzfSwKKyAgICB7IjI1NSIsICJceDAyXHgwMVx4ZmYiLCAzfSwKKyAgICAvLyBVbm5lY2Vzc2FyeSBsZWFkaW5nIHplcm9zLgorICAgIHsiMSIsICJceDAyXHgwMlx4MDBceDAxIiwgNH0sCit9OworCitzdGF0aWMgYm9vbCB0ZXN0X2FzbjEoKSB7CisgIGZvciAoY29uc3QgQVNOMVRlc3QgJnRlc3QgOiBrQVNOMVRlc3RzKSB7CisgICAgU2NvcGVkQklHTlVNIGJuID0gQVNDSUlUb0JJR05VTSh0ZXN0LnZhbHVlX2FzY2lpKTsKKyAgICBpZiAoIWJuKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGVzdCB0aGF0IHRoZSBpbnB1dCBpcyBjb3JyZWN0bHkgcGFyc2VkLgorICAgIFNjb3BlZEJJR05VTSBibjIoQk5fbmV3KCkpOworICAgIGlmICghYm4yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENCUyBjYnM7CisgICAgQ0JTX2luaXQoJmNicywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCB0ZXN0LmRlcl9sZW4pOworICAgIGlmICghQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuMi5nZXQoKSkgfHwgQ0JTX2xlbigmY2JzKSAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNpbmcgQVNOLjEgSU5URUdFUiBmYWlsZWQuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKEJOX2NtcChibi5nZXQoKSwgYm4yLmdldCgpKSAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBwYXJzZS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRlc3QgdGhlIHZhbHVlIHNlcmlhbGl6ZXMgY29ycmVjdGx5LgorICAgIENCQiBjYmI7CisgICAgdWludDhfdCAqZGVyOworICAgIHNpemVfdCBkZXJfbGVuOworICAgIENCQl96ZXJvKCZjYmIpOworICAgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKKyAgICAgICAgIUJOX2JuMmNiYigmY2JiLCBibi5nZXQoKSkgfHwKKyAgICAgICAgIUNCQl9maW5pc2goJmNiYiwgJmRlciwgJmRlcl9sZW4pKSB7CisgICAgICBDQkJfY2xlYW51cCgmY2JiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIoZGVyKTsKKyAgICBpZiAoZGVyX2xlbiAhPSB0ZXN0LmRlcl9sZW4gfHwKKyAgICAgICAgbWVtY21wKGRlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCBkZXJfbGVuKSAhPSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBzZXJpYWxpemF0aW9uLlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gfEJOX2NiczJ1bnNpZ25lZF9idWdneXwgcGFyc2VzIGFsbCB2YWxpZCBpbnB1dC4KKyAgICBDQlNfaW5pdCgmY2JzLCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ZXN0LmRlciksIHRlc3QuZGVyX2xlbik7CisgICAgaWYgKCFCTl9jYnMydW5zaWduZWRfYnVnZ3koJmNicywgYm4yLmdldCgpKSB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyBBU04uMSBJTlRFR0VSIGZhaWxlZC5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIHBhcnNlLlxuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgZm9yIChjb25zdCBBU04xSW52YWxpZFRlc3QgJnRlc3QgOiBrQVNOMUludmFsaWRUZXN0cykgeworICAgIFNjb3BlZEJJR05VTSBibihCTl9uZXcoKSk7CisgICAgaWYgKCFibikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDQlMgY2JzOworICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKKyAgICBpZiAoQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuLmdldCgpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICAgIC8vIEFsbCB0ZXN0cyBpbiBrQVNOMUludmFsaWRUZXN0cyBhcmUgYWxzbyByZWplY3RlZCBieQorICAgIC8vIHxCTl9jYnMydW5zaWduZWRfYnVnZ3l8LgorICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKKyAgICBpZiAoQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KCZjYnMsIGJuLmdldCgpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgfQorCisgIGZvciAoY29uc3QgQVNOMVRlc3QgJnRlc3QgOiBrQVNOMUJ1Z2d5VGVzdHMpIHsKKyAgICAvLyBUaGVzZSBicm9rZW4gZW5jb2RpbmdzIGFyZSByZWplY3RlZCBieSB8Qk5fY2JzMnVuc2lnbmVkfC4KKyAgICBTY29wZWRCSUdOVU0gYm4oQk5fbmV3KCkpOworICAgIGlmICghYm4pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDQlMgY2JzOworICAgIENCU19pbml0KCZjYnMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRlc3QuZGVyKSwgdGVzdC5kZXJfbGVuKTsKKyAgICBpZiAoQk5fY2JzMnVuc2lnbmVkKCZjYnMsIGJuLmdldCgpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQYXJzZWQgaW52YWxpZCBpbnB1dC5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICAgIC8vIEhvd2V2ZXIgfEJOX2NiczJ1bnNpZ25lZF9idWdneXwgYWNjZXB0cyB0aGVtLgorICAgIFNjb3BlZEJJR05VTSBibjIgPSBBU0NJSVRvQklHTlVNKHRlc3QudmFsdWVfYXNjaWkpOworICAgIGlmICghYm4yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0JTX2luaXQoJmNicywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odGVzdC5kZXIpLCB0ZXN0LmRlcl9sZW4pOworICAgIGlmICghQk5fY2JzMnVuc2lnbmVkX2J1Z2d5KCZjYnMsIGJuLmdldCgpKSB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyAoaW52YWxpZCkgQVNOLjEgSU5URUdFUiBmYWlsZWQuXG4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoQk5fY21wKGJuLmdldCgpLCBibjIuZ2V0KCkpICE9IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXCJCYWRcIiBwYXJzZS5cbiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIFNlcmlhbGl6aW5nIG5lZ2F0aXZlIG51bWJlcnMgaXMgbm90IHN1cHBvcnRlZC4KKyAgU2NvcGVkQklHTlVNIGJuID0gQVNDSUlUb0JJR05VTSgiLTEiKTsKKyAgaWYgKCFibikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBDQkIgY2JiOworICBDQkJfemVybygmY2JiKTsKKyAgaWYgKCFDQkJfaW5pdCgmY2JiLCAwKSB8fAorICAgICAgQk5fYm4yY2JiKCZjYmIsIGJuLmdldCgpKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiU2VyaWFsaXplZCBuZWdhdGl2ZSBudW1iZXIuXG4iKTsKKyAgICBDQkJfY2xlYW51cCgmY2JiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgQ0JCX2NsZWFudXAoJmNiYik7CisKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2NvbnZlcnQuYyBiL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCmluZGV4IDUzMWI2NjEuLjAxMjI3MDkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vY29udmVydC5jCkBAIC01Niw3ICs1Niw5IEBACiAKICNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTY3LDcgKzY5LDggQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBCSUdOVU0gKkJOX2JpbjJibihjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGxlbiwgQklHTlVNICpyZXQpIHsKLSAgdW5zaWduZWQgbnVtX3dvcmRzLCBtOworICBzaXplX3QgbnVtX3dvcmRzOworICB1bnNpZ25lZCBtOwogICBCTl9VTE9ORyB3b3JkID0gMDsKICAgQklHTlVNICpibiA9IE5VTEw7CiAKQEAgLTkzLDcgKzk2LDEwIEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICByZXQtPnRvcCA9IG51bV93b3JkczsKKyAgLyogfGJuX3dleHBhbmR8IG11c3QgY2hlY2sgYm91bmRzIG9uIHxudW1fd29yZHN8IHRvIHdyaXRlIGl0IGludG8KKyAgICogfHJldC0+ZG1heHwuICovCisgIGFzc2VydChudW1fd29yZHMgPD0gSU5UX01BWCk7CisgIHJldC0+dG9wID0gKGludCludW1fd29yZHM7CiAgIHJldC0+bmVnID0gMDsKIAogICB3aGlsZSAobGVuLS0pIHsKQEAgLTE5OCw3ICsyMDQsNyBAQAogCiAgIGJ1ZiA9IChjaGFyICopT1BFTlNTTF9tYWxsb2MoYm4tPnRvcCAqIEJOX0JZVEVTICogMiArIDIpOwogICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fYm4yaGV4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0yMjcsNDcgKzIzMyw1OSBAQAogICByZXR1cm4gYnVmOwogfQogCi0vKiBkZWNvZGVfaGV4IGRlY29kZXMgfGl8IGJ5dGVzIG9mIGhleCBkYXRhIGZyb20gfGlufCBhbmQgdXBkYXRlcyB8Ym58LiAqLwotc3RhdGljIHZvaWQgZGVjb2RlX2hleChCSUdOVU0gKmJuLCBjb25zdCBjaGFyICppbiwgaW50IGkpIHsKLSAgaW50IGgsIG0sIGosIGssIGM7Ci0gIEJOX1VMT05HIGw9MDsKLQotICBqID0gaTsgLyogbGVhc3Qgc2lnbmlmaWNhbnQgJ2hleCcgKi8KLSAgaCA9IDA7Ci0gIHdoaWxlIChqID4gMCkgewotICAgIG0gPSAoKEJOX0JZVEVTICogMikgPD0gaikgPyAoQk5fQllURVMgKiAyKSA6IGo7Ci0gICAgbCA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgYyA9IGluW2ogLSBtXTsKLSAgICAgIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKLSAgICAgICAgayA9IGMgLSAnMCc7Ci0gICAgICB9IGVsc2UgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkgewotICAgICAgICBrID0gYyAtICdhJyArIDEwOwotICAgICAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdGJykpIHsKLSAgICAgICAgayA9IGMgLSAnQScgKyAxMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGsgPSAwOyAvKiBwYXJhbm9pYSAqLwotICAgICAgfQotCi0gICAgICBsID0gKGwgPDwgNCkgfCBrOwotCi0gICAgICBpZiAoLS1tIDw9IDApIHsKLSAgICAgICAgYm4tPmRbaCsrXSA9IGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGogLT0gKEJOX0JZVEVTICogMik7CisvKiBkZWNvZGVfaGV4IGRlY29kZXMgfGluX2xlbnwgYnl0ZXMgb2YgaGV4IGRhdGEgZnJvbSB8aW58IGFuZCB1cGRhdGVzIHxibnwuICovCitzdGF0aWMgaW50IGRlY29kZV9oZXgoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4pIHsKKyAgaWYgKGluX2xlbiA+IElOVF9NQVgvNCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJR05VTV9UT09fTE9ORyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogfGluX2xlbnwgaXMgdGhlIG51bWJlciBvZiBoZXggZGlnaXRzLiAqLworICBpZiAoYm5fZXhwYW5kKGJuLCBpbl9sZW4gKiA0KSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CiAgIH0KIAotICBibi0+dG9wID0gaDsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaW5fbGVuID4gMCkgeworICAgIC8qIERlY29kZSBvbmUgfEJOX1VMT05HfCBhdCBhIHRpbWUuICovCisgICAgaW50IHRvZG8gPSBCTl9CWVRFUyAqIDI7CisgICAgaWYgKHRvZG8gPiBpbl9sZW4pIHsKKyAgICAgIHRvZG8gPSBpbl9sZW47CisgICAgfQorCisgICAgQk5fVUxPTkcgd29yZCA9IDA7CisgICAgaW50IGo7CisgICAgZm9yIChqID0gdG9kbzsgaiA+IDA7IGotLSkgeworICAgICAgY2hhciBjID0gaW5baW5fbGVuIC0gal07CisKKyAgICAgIEJOX1VMT05HIGhleDsKKyAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICBoZXggPSBjIC0gJzAnOworICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgeworICAgICAgICBoZXggPSBjIC0gJ2EnICsgMTA7CisgICAgICB9IGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB7CisgICAgICAgIGhleCA9IGMgLSAnQScgKyAxMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhleCA9IDA7CisgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gVGhlIGNhbGxlciBjaGVja3MgfGlzeGRpZ2l0fC4gKi8KKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgfQorICAgICAgd29yZCA9ICh3b3JkIDw8IDQpIHwgaGV4OworICAgIH0KKworICAgIGJuLT5kW2krK10gPSB3b3JkOworICAgIGluX2xlbiAtPSB0b2RvOworICB9CisgIGFzc2VydChpIDw9IGJuLT5kbWF4KTsKKyAgYm4tPnRvcCA9IGk7CisgIHJldHVybiAxOwogfQogCiAvKiBkZWNvZGVfZGVjIGRlY29kZXMgfGluX2xlbnwgYnl0ZXMgb2YgZGVjaW1hbCBkYXRhIGZyb20gfGlufCBhbmQgdXBkYXRlcyB8Ym58LiAqLwotc3RhdGljIHZvaWQgZGVjb2RlX2RlYyhCSUdOVU0gKmJuLCBjb25zdCBjaGFyICppbiwgaW50IGluX2xlbikgeworc3RhdGljIGludCBkZWNvZGVfZGVjKEJJR05VTSAqYm4sIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5fbGVuKSB7CiAgIGludCBpLCBqOwogICBCTl9VTE9ORyBsID0gMDsKIAorICAvKiBEZWNvZGUgfEJOX0RFQ19OVU18IGRpZ2l0cyBhdCBhIHRpbWUuICovCiAgIGogPSBCTl9ERUNfTlVNIC0gKGluX2xlbiAlIEJOX0RFQ19OVU0pOwogICBpZiAoaiA9PSBCTl9ERUNfTlVNKSB7CiAgICAgaiA9IDA7CkBAIC0yNzcsMTUgKzI5NSwxOCBAQAogICAgIGwgKj0gMTA7CiAgICAgbCArPSBpbltpXSAtICcwJzsKICAgICBpZiAoKytqID09IEJOX0RFQ19OVU0pIHsKLSAgICAgIEJOX211bF93b3JkKGJuLCBCTl9ERUNfQ09OVik7Ci0gICAgICBCTl9hZGRfd29yZChibiwgbCk7CisgICAgICBpZiAoIUJOX211bF93b3JkKGJuLCBCTl9ERUNfQ09OVikgfHwKKyAgICAgICAgICAhQk5fYWRkX3dvcmQoYm4sIGwpKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQogICAgICAgbCA9IDA7CiAgICAgICBqID0gMDsKICAgICB9CiAgIH0KKyAgcmV0dXJuIDE7CiB9CiAKLXR5cGVkZWYgdm9pZCAoKmRlY29kZV9mdW5jKSAoQklHTlVNICpibiwgY29uc3QgY2hhciAqaW4sIGludCBpKTsKK3R5cGVkZWYgaW50ICgqZGVjb2RlX2Z1bmMpIChCSUdOVU0gKmJuLCBjb25zdCBjaGFyICppbiwgaW50IGluX2xlbik7CiB0eXBlZGVmIGludCAoKmNoYXJfdGVzdF9mdW5jKSAoaW50IGMpOwogCiBzdGF0aWMgaW50IGJuX3gyYm4oQklHTlVNICoqb3V0cCwgY29uc3QgY2hhciAqaW4sIGRlY29kZV9mdW5jIGRlY29kZSwgY2hhcl90ZXN0X2Z1bmMgd2FudF9jaGFyKSB7CkBAIC0zMDIsNyArMzIzLDcgQEAKICAgICBpbisrOwogICB9CiAKLSAgZm9yIChpID0gMDsgd2FudF9jaGFyKCh1bnNpZ25lZCBjaGFyKWluW2ldKTsgaSsrKSB7fQorICBmb3IgKGkgPSAwOyB3YW50X2NoYXIoKHVuc2lnbmVkIGNoYXIpaW5baV0pICYmIGkgKyBuZWcgPCBJTlRfTUFYOyBpKyspIHt9CiAKICAgbnVtID0gaSArIG5lZzsKICAgaWYgKG91dHAgPT0gTlVMTCkgewpAQCAtMzIwLDEzICszNDEsMTAgQEAKICAgICBCTl96ZXJvKHJldCk7CiAgIH0KIAotICAvKiBpIGlzIHRoZSBudW1iZXIgb2YgaGV4IGRpZ2VzdHM7ICovCi0gIGlmIChibl9leHBhbmQocmV0LCBpICogNCkgPT0gTlVMTCkgeworICBpZiAoIWRlY29kZShyZXQsIGluLCBpKSkgewogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgZGVjb2RlKHJldCwgaW4sIGkpOwotCiAgIGJuX2NvcnJlY3RfdG9wKHJldCk7CiAgIGlmICghQk5faXNfemVybyhyZXQpKSB7CiAgICAgcmV0LT5uZWcgPSBuZWc7CkBAIC0zNjUsNyArMzgzLDcgQEAKICAgICAgIChCTl9VTE9ORyAqKU9QRU5TU0xfbWFsbG9jKChudW0gLyBCTl9ERUNfTlVNICsgMSkgKiBzaXplb2YoQk5fVUxPTkcpKTsKICAgYnVmID0gKGNoYXIgKilPUEVOU1NMX21hbGxvYyhudW0gKyAzKTsKICAgaWYgKChidWYgPT0gTlVMTCkgfHwgKGJuX2RhdGEgPT0gTlVMTCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fYm4yZGVjLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICB0ID0gQk5fZHVwKGEpOwpAQCAtNDk5LDMgKzUxNyw4MSBAQAogICAgICAgcmV0dXJuIEJOX01BU0syOwogICB9CiB9CisKK3NpemVfdCBCTl9ibjJtcGkoY29uc3QgQklHTlVNICppbiwgdWludDhfdCAqb3V0KSB7CisgIGNvbnN0IHNpemVfdCBiaXRzID0gQk5fbnVtX2JpdHMoaW4pOworICBjb25zdCBzaXplX3QgYnl0ZXMgPSAoYml0cyArIDcpIC8gODsKKyAgLyogSWYgdGhlIG51bWJlciBvZiBiaXRzIGlzIGEgbXVsdGlwbGUgb2YgOCwgaS5lLiBpZiB0aGUgTVNCIGlzIHNldCwKKyAgICogcHJlZml4IHdpdGggYSB6ZXJvIGJ5dGUuICovCisgIGludCBleHRlbmQgPSAwOworICBpZiAoYnl0ZXMgIT0gMCAmJiAoYml0cyAmIDB4MDcpID09IDApIHsKKyAgICBleHRlbmQgPSAxOworICB9CisKKyAgY29uc3Qgc2l6ZV90IGxlbiA9IGJ5dGVzICsgZXh0ZW5kOworICBpZiAobGVuIDwgYnl0ZXMgfHwKKyAgICAgIDQgKyBsZW4gPCBsZW4gfHwKKyAgICAgIChsZW4gJiAweGZmZmZmZmZmKSAhPSBsZW4pIHsKKyAgICAvKiBJZiB3ZSBjYW5ub3QgcmVwcmVzZW50IHRoZSBudW1iZXIgdGhlbiB3ZSBlbWl0IHplcm8gYXMgdGhlIGludGVyZmFjZQorICAgICAqIGRvZXNuJ3QgYWxsb3cgYW4gZXJyb3IgdG8gYmUgc2lnbmFsbGVkLiAqLworICAgIGlmIChvdXQpIHsKKyAgICAgIG1lbXNldChvdXQsIDAsIDQpOworICAgIH0KKyAgICByZXR1cm4gNDsKKyAgfQorCisgIGlmIChvdXQgPT0gTlVMTCkgeworICAgIHJldHVybiA0ICsgbGVuOworICB9CisKKyAgb3V0WzBdID0gbGVuID4+IDI0OworICBvdXRbMV0gPSBsZW4gPj4gMTY7CisgIG91dFsyXSA9IGxlbiA+PiA4OworICBvdXRbM10gPSBsZW47CisgIGlmIChleHRlbmQpIHsKKyAgICBvdXRbNF0gPSAwOworICB9CisgIEJOX2JuMmJpbihpbiwgb3V0ICsgNCArIGV4dGVuZCk7CisgIGlmIChpbi0+bmVnICYmIGxlbiA+IDApIHsKKyAgICBvdXRbNF0gfD0gMHg4MDsKKyAgfQorICByZXR1cm4gbGVuICsgNDsKK30KKworQklHTlVNICpCTl9tcGkyYm4oY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBsZW4sIEJJR05VTSAqb3V0KSB7CisgIGlmIChsZW4gPCA0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQkFEX0VOQ09ESU5HKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjb25zdCBzaXplX3QgaW5fbGVuID0gKChzaXplX3QpaW5bMF0gPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KWluWzFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVfdClpblsyXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemVfdClpblszXSk7CisgIGlmIChpbl9sZW4gIT0gbGVuIC0gNCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9FTkNPRElORyk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBvdXQgPSBCTl9uZXcoKTsKKyAgfQorICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGluX2xlbiA9PSAwKSB7CisgICAgQk5femVybyhvdXQpOworICAgIHJldHVybiBvdXQ7CisgIH0KKworICBpbiArPSA0OworICBpZiAoQk5fYmluMmJuKGluLCBpbl9sZW4sIG91dCkgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIG91dC0+bmVnID0gKCgqaW4pICYgMHg4MCkgIT0gMDsKKyAgaWYgKG91dC0+bmVnKSB7CisgICAgQk5fY2xlYXJfYml0KG91dCwgQk5fbnVtX2JpdHMob3V0KSAtIDEpOworICB9CisgIHJldHVybiBvdXQ7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2N0eC5jIGIvc3JjL2NyeXB0by9ibi9jdHguYwppbmRleCAwNTc4Mzc2Li40OGQ5YWRmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2N0eC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vY3R4LmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogQk5fQ1RYICpCTl9DVFhfbmV3KHZvaWQpIHsKICAgQk5fQ1RYICpyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQk5fQ1RYKSk7CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX0NUWF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgIGN0eC0+ZXJyX3N0YWNrKys7CiAgIH0gZWxzZSBpZiAoIUJOX1NUQUNLX3B1c2goJmN0eC0+c3RhY2ssIGN0eC0+dXNlZCkpIHsKICAgICAvKiAoVHJ5IHRvKSBnZXQgYSBuZXcgZnJhbWUgcG9pbnRlciAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9DVFhfc3RhcnQsIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CiAgICAgY3R4LT5lcnJfc3RhY2srKzsKICAgfQogfQpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgLyogU2V0dGluZyB0b29fbWFueSBwcmV2ZW50cyByZXBlYXRlZCAiZ2V0IiBhdHRlbXB0cyBmcm9tCiAgICAgICogY2x1dHRlcmluZyB0aGUgZXJyb3Igc3RhY2suICovCiAgICAgY3R4LT50b29fbWFueSA9IDE7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX0NUWF9nZXQsIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9kaXYuYyBiL3NyYy9jcnlwdG8vYm4vZGl2LmMKaW5kZXggMzU4OGVhMS4uNzc5ZGRhMiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ibi9kaXYuYworKysgYi9zcmMvY3J5cHRvL2JuL2Rpdi5jCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICogc28gZG9uJ3QganVzdCByZWx5IG9uIGJuX2NoZWNrX3RvcCgpIGhlcmUgKi8KICAgaWYgKChudW0tPnRvcCA+IDAgJiYgbnVtLT5kW251bS0+dG9wIC0gMV0gPT0gMCkgfHwKICAgICAgIChkaXZpc29yLT50b3AgPiAwICYmIGRpdmlzb3ItPmRbZGl2aXNvci0+dG9wIC0gMV0gPT0gMCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZGl2LCBCTl9SX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKICAgfQogCiAgIGlmIChCTl9pc196ZXJvKGRpdmlzb3IpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2RpdiwgQk5fUl9ESVZfQllfWkVSTyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfRElWX0JZX1pFUk8pOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUxMSw3ICs1MTEsNyBAQAogICAgIC8qIG1heF9zaGlmdCA+PSAwICovCiAKICAgICBpZiAobWF4X3NoaWZ0IDwgMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9sc2hpZnRfcXVpY2ssIEJOX1JfSU5QVVRfTk9UX1JFRFVDRUQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfSU5QVVRfTk9UX1JFRFVDRUQpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL2V4cG9uZW50aWF0aW9uLmMgYi9zcmMvY3J5cHRvL2JuL2V4cG9uZW50aWF0aW9uLmMKaW5kZXggZDMwNjNjOS4uNmM1ZTExYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ibi9leHBvbmVudGlhdGlvbi5jCisrKyBiL3NyYy9jcnlwdG8vYm4vZXhwb25lbnRpYXRpb24uYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKICAgaWYgKChwLT5mbGFncyAmIEJOX0ZMR19DT05TVFRJTUUpICE9IDApIHsKICAgICAvKiBCTl9GTEdfQ09OU1RUSU1FIG9ubHkgc3VwcG9ydGVkIGJ5IEJOX21vZF9leHBfbW9udCgpICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2V4cCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNzMsOCArMTczLDggQEAKICAgICB9CiAgIH0KIAotICBpZiAociAhPSBycikgewotICAgIEJOX2NvcHkociwgcnIpOworICBpZiAociAhPSByciAmJiAhQk5fY29weShyLCBycikpIHsKKyAgICBnb3RvIGVycjsKICAgfQogICByZXQgPSAxOwogCkBAIC0zMzMsNyArMzMzLDcgQEAKICAgaiA9IDA7CiAgIHdoaWxlIChCTl91Y21wKHIsICYocmVjcC0+TikpID49IDApIHsKICAgICBpZiAoaisrID4gMikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2Rpdl9yZWNwLCBCTl9SX0JBRF9SRUNJUFJPQ0FMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JBRF9SRUNJUFJPQ0FMKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoIUJOX3VzdWIociwgciwgJihyZWNwLT5OKSkpIHsKQEAgLTQyNyw3ICs0MjcsNyBAQAogCiAgIGlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewogICAgIC8qIEJOX0ZMR19DT05TVFRJTUUgb25seSBzdXBwb3J0ZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgbW9kX2V4cF9yZWNwLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTYxNiw3ICs2MTYsNyBAQAogICB9CiAKICAgaWYgKCFCTl9pc19vZGQobSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250LCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKICAgICByZXR1cm4gMDsKICAgfQogICBiaXRzID0gQk5fbnVtX2JpdHMocCk7CkBAIC04NjIsMTMgKzg2MiwxMyBAQAogICB1bnNpZ25lZCBjaGFyICpwb3dlcmJ1ZiA9IE5VTEw7CiAgIEJJR05VTSB0bXAsIGFtOwogCi0gIHRvcCA9IG0tPnRvcDsKLQotICBpZiAoIShtLT5kWzBdICYgMSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgIGlmICghQk5faXNfb2RkKG0pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKICAgICByZXR1cm4gMDsKICAgfQorCisgIHRvcCA9IG0tPnRvcDsKKwogICBiaXRzID0gQk5fbnVtX2JpdHMocCk7CiAgIGlmIChiaXRzID09IDApIHsKICAgICByZXQgPSBCTl9vbmUocnIpOwpAQCAtOTI2LDcgKzkyNiw2IEBACiAgICAgfQogICB9CiAjZW5kaWYKLSAgKHZvaWQpMDsKIAogICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIHByZS1jb21wdXRlZAogICAgKiBwb3dlcnMgb2YgYW0sIGFtIGl0c2VsZiBhbmQgdG1wLgpAQCAtMTIyMywxMyArMTIyMiwxMiBAQAogCiAgIGlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewogICAgIC8qIEJOX0ZMR19DT05TVFRJTUUgb25seSBzdXBwb3J0ZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2V4cF9tb250X3dvcmQsCi0gICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIUJOX2lzX29kZChtKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfZXhwX21vbnRfd29yZCwgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTM3Miw3ICsxMzcwLDcgQEAKICAgQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOwogCiAgIGlmICghKG0tPmRbMF0gJiAxKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2RfZXhwMl9tb250LCBCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKICAgICByZXR1cm4gMDsKICAgfQogICBiaXRzMSA9IEJOX251bV9iaXRzKHAxKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vZ2NkLmMgYi9zcmMvY3J5cHRvL2JuL2djZC5jCmluZGV4IDMxMzJjMjkuLmUxMDYxNDkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vZ2NkLmMKKysrIGIvc3JjL2NyeXB0by9ibi9nY2QuYwpAQCAtMjIzLDIwICsyMjMsMjMgQEAKIH0KIAogLyogc29sdmVzIGF4ID09IDEgKG1vZCBuKSAqLwotc3RhdGljIEJJR05VTSAqQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKEJJR05VTSAqb3V0LCBjb25zdCBCSUdOVU0gKmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpuLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgQklHTlVNICpCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goQklHTlVNICpvdXQsIGludCAqb3V0X25vX2ludmVyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpOwogCi1CSUdOVU0gKkJOX21vZF9pbnZlcnNlKEJJR05VTSAqb3V0LCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbiwKLSAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKK0JJR05VTSAqQk5fbW9kX2ludmVyc2VfZXgoQklHTlVNICpvdXQsIGludCAqb3V0X25vX2ludmVyc2UsIGNvbnN0IEJJR05VTSAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpuLCBCTl9DVFggKmN0eCkgewogICBCSUdOVU0gKkEsICpCLCAqWCwgKlksICpNLCAqRCwgKlQsICpSID0gTlVMTDsKICAgQklHTlVNICpyZXQgPSBOVUxMOwogICBpbnQgc2lnbjsKIAogICBpZiAoKGEtPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCB8fAogICAgICAgKG4tPmZsYWdzICYgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgewotICAgIHJldHVybiBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gob3V0LCBhLCBuLCBjdHgpOworICAgIHJldHVybiBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gob3V0LCBvdXRfbm9faW52ZXJzZSwgYSwgbiwgY3R4KTsKICAgfQogCisgICpvdXRfbm9faW52ZXJzZSA9IDA7CisKICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CiAgIEEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIEIgPSBCTl9DVFhfZ2V0KGN0eCk7CkBAIC01MjIsNyArNTI1LDggQEAKICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9pbnZlcnNlLCBCTl9SX05PX0lOVkVSU0UpOworICAgICpvdXRfbm9faW52ZXJzZSA9IDE7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9fSU5WRVJTRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gUjsKQEAgLTUzNSwxNiArNTM5LDI1IEBACiAgIHJldHVybiByZXQ7CiB9CiAKK0JJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLAorICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgeworICBpbnQgbm9faW52ZXJzZTsKKyAgcmV0dXJuIEJOX21vZF9pbnZlcnNlX2V4KG91dCwgJm5vX2ludmVyc2UsIGEsIG4sIGN0eCk7Cit9CisKIC8qIEJOX21vZF9pbnZlcnNlX25vX2JyYW5jaCBpcyBhIHNwZWNpYWwgdmVyc2lvbiBvZiBCTl9tb2RfaW52ZXJzZS4KICAqIEl0IGRvZXMgbm90IGNvbnRhaW4gYnJhbmNoZXMgdGhhdCBtYXkgbGVhayBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi1zdGF0aWMgQklHTlVNICpCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goQklHTlVNICpvdXQsIGNvbnN0IEJJR05VTSAqYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm4sIEJOX0NUWCAqY3R4KSB7CitzdGF0aWMgQklHTlVNICpCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goQklHTlVNICpvdXQsIGludCAqb3V0X25vX2ludmVyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKICAgQklHTlVNICpBLCAqQiwgKlgsICpZLCAqTSwgKkQsICpULCAqUiA9IE5VTEw7CiAgIEJJR05VTSBsb2NhbF9BLCBsb2NhbF9COwogICBCSUdOVU0gKnBBLCAqcEI7CiAgIEJJR05VTSAqcmV0ID0gTlVMTDsKICAgaW50IHNpZ247CiAKKyAgKm91dF9ub19pbnZlcnNlID0gMDsKKwogICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgQSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgQiA9IEJOX0NUWF9nZXQoY3R4KTsKQEAgLTY4Miw3ICs2OTUsOCBAQAogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoLCBCTl9SX05PX0lOVkVSU0UpOworICAgICpvdXRfbm9faW52ZXJzZSA9IDE7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9fSU5WRVJTRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gUjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vYm4vaW50ZXJuYWwuaAppbmRleCAyNjc0YjNjLi4wZDBlYjQ0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9ibi9pbnRlcm5hbC5oCkBAIC0xMzYsOSArMTM2LDkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qIGJuX2V4cGFuZCBhY3RzIHRoZSBzYW1lIGFzIHxCTl93ZXhwYW5kfCwgYnV0IHRha2VzIGEgbnVtYmVyIG9mIGJpdHMgcmF0aGVyCisvKiBibl9leHBhbmQgYWN0cyB0aGUgc2FtZSBhcyB8Ym5fd2V4cGFuZHwsIGJ1dCB0YWtlcyBhIG51bWJlciBvZiBiaXRzIHJhdGhlcgogICogdGhhbiBhIG51bWJlciBvZiB3b3Jkcy4gKi8KLUJJR05VTSAqYm5fZXhwYW5kKEJJR05VTSAqYm4sIHVuc2lnbmVkIGJpdHMpOworQklHTlVNICpibl9leHBhbmQoQklHTlVNICpibiwgc2l6ZV90IGJpdHMpOwogCiAjaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9tb250Z29tZXJ5LmMgYi9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYwppbmRleCAxNTJjZjJkLi5jNmM5Yzg4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYworKysgYi9zcmMvY3J5cHRvL2JuL21vbnRnb21lcnkuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KICNpbmNsdWRlIDxvcGVuc3NsL3RocmVhZC5oPgogCkBAIC0xNzYsNiArMTc3LDExIEBACiAgIEJJR05VTSB0bW9kOwogICBCTl9VTE9ORyBidWZbMl07CiAKKyAgaWYgKEJOX2lzX3plcm8obW9kKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0RJVl9CWV9aRVJPKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCiAgIEJOX0NUWF9zdGFydChjdHgpOwogICBSaSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgaWYgKFJpID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vbXVsLmMgYi9zcmMvY3J5cHRvL2JuL211bC5jCmluZGV4IGExN2Q3NjYuLjAyOWE1OWUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vbXVsLmMKKysrIGIvc3JjL2NyeXB0by9ibi9tdWwuYwpAQCAtNjY2LDggKzY2Niw4IEBACiAKIGVuZDoKICAgYm5fY29ycmVjdF90b3AocnIpOwotICBpZiAociAhPSBycikgewotICAgIEJOX2NvcHkociwgcnIpOworICBpZiAociAhPSByciAmJiAhQk5fY29weShyLCBycikpIHsKKyAgICBnb3RvIGVycjsKICAgfQogICByZXQgPSAxOwogCkBAIC04NzcsOCArODc3LDggQEAKICAgICByci0+dG9wID0gbWF4OwogICB9CiAKLSAgaWYgKHJyICE9IHIpIHsKLSAgICBCTl9jb3B5KHIsIHJyKTsKKyAgaWYgKHJyICE9IHIgJiYgIUJOX2NvcHkociwgcnIpKSB7CisgICAgZ290byBlcnI7CiAgIH0KICAgcmV0ID0gMTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ibi9wcmltZS5jIGIvc3JjL2NyeXB0by9ibi9wcmltZS5jCmluZGV4IGNmM2FmY2YuLmJiYjhmZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vcHJpbWUuYworKysgYi9zcmMvY3J5cHRvL2JuL3ByaW1lLmMKQEAgLTM2MiwxMSArMzYyLDExIEBACiAKICAgaWYgKGJpdHMgPCAyKSB7CiAgICAgLyogVGhlcmUgYXJlIG5vIHByaW1lIG51bWJlcnMgdGhpcyBzbWFsbC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZ2VuZXJhdGVfcHJpbWVfZXgsIEJOX1JfQklUU19UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX0JJVFNfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfSBlbHNlIGlmIChiaXRzID09IDIgJiYgc2FmZSkgewogICAgIC8qIFRoZSBzbWFsbGVzdCBzYWZlIHByaW1lICg3KSBpcyB0aHJlZSBiaXRzLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9nZW5lcmF0ZV9wcmltZV9leCwgQk5fUl9CSVRTX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfQklUU19UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUxNSwxMSArNTE1LDEwIEBACiAKICAgLyogQSA6PSBhYnMoYSkgKi8KICAgaWYgKGEtPm5lZykgewotICAgIEJJR05VTSAqdDsKLSAgICBpZiAoKHQgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIHsKKyAgICBCSUdOVU0gKnQgPSBCTl9DVFhfZ2V0KGN0eCk7CisgICAgaWYgKHQgPT0gTlVMTCB8fCAhQk5fY29weSh0LCBhKSkgewogICAgICAgZ290byBlcnI7CiAgICAgfQotICAgIEJOX2NvcHkodCwgYSk7CiAgICAgdC0+bmVnID0gMDsKICAgICBBID0gdDsKICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vcmFuZG9tLmMgYi9zcmMvY3J5cHRvL2JuL3JhbmRvbS5jCmluZGV4IDU0OWFjNDguLjMxMTZlNTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vcmFuZG9tLmMKKysrIGIvc3JjL2NyeXB0by9ibi9yYW5kb20uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MoYnl0ZXMpOwogICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fcmFuZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAgIHVuc2lnbmVkIGNvdW50ID0gMTAwOwogCiAgIGlmIChyYW5nZS0+bmVnIHx8IEJOX2lzX3plcm8ocmFuZ2UpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3JhbmRfcmFuZ2UsIEJOX1JfSU5WQUxJRF9SQU5HRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfSU5WQUxJRF9SQU5HRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgICB9CiAKICAgICAgIGlmICghLS1jb3VudCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fcmFuZF9yYW5nZSwgQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0gd2hpbGUgKEJOX2NtcChyLCByYW5nZSkgPj0gMCk7CkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgIH0KIAogICAgICAgaWYgKCEtLWNvdW50KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9yYW5kX3JhbmdlLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfSB3aGlsZSAoQk5fY21wKHIsIHJhbmdlKSA+PSAwKTsKQEAgLTI2NCwxMyArMjY0LDEzIEBACiAgIH0KIAogICBpZiAoQk5faXNfemVybyhyYW5nZSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZ2VuZXJhdGVfZHNhX25vbmNlLCBCTl9SX0RJVl9CWV9aRVJPKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9ESVZfQllfWkVSTyk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBrX2J5dGVzID0gT1BFTlNTTF9tYWxsb2MobnVtX2tfYnl0ZXMpOwogICBpZiAoIWtfYnl0ZXMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fZ2VuZXJhdGVfZHNhX25vbmNlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAvKiBObyByZWFzb25hYmxlIERTQSBvciBFQ0RTQSBrZXkgc2hvdWxkIGhhdmUgYSBwcml2YXRlIGtleQogICAgICAqIHRoaXMgbGFyZ2UgYW5kIHdlIGRvbid0IGhhbmRsZSB0aGlzIGNhc2UgaW4gb3JkZXIgdG8gYXZvaWQKICAgICAgKiBsZWFraW5nIHRoZSBsZW5ndGggb2YgdGhlIHByaXZhdGUga2V5LiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9nZW5lcmF0ZV9kc2Ffbm9uY2UsIEJOX1JfUFJJVkFURV9LRVlfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fUl9QUklWQVRFX0tFWV9UT09fTEFSR0UpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIG1lbWNweShwcml2YXRlX2J5dGVzLCBwcml2LT5kLCB0b2RvKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vcnNhel9leHAuaCBiL3NyYy9jcnlwdG8vYm4vcnNhel9leHAuaAppbmRleCAwYmI2YjBjLi5jNzUyYjQ1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL3JzYXpfZXhwLmgKKysrIGIvc3JjL2NyeXB0by9ibi9yc2F6X2V4cC5oCkBAIC0xLDMyICsxLDQ0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodChjKSAyMDEyLCBJbnRlbCBDb3JwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKiBEZXZlbG9wZXJzIGFuZCBhdXRob3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogU2hheSBHdWVyb24gKDEsIDIpLCBhbmQgVmxhZCBLcmFzbm92ICgxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qICgxKSBJbnRlbCBDb3Jwb3JhdGlvbiwgSXNyYWVsIERldmVsb3BtZW50IENlbnRlciwgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogKDIpIFVuaXZlcnNpdHkgb2YgSGFpZmEsIElzcmFlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBDb3B5cmlnaHQgKGMpIDIwMTIsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAgICAgICAgKgorKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSAgICAqCisqICBtZXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgKiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICAgICAqCisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgKiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgICAgICAqCisqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgICoKKyogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAgICAgICAgICAgICAgICAgKgorKiAgICAgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICogIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzICAgICAgICAgKgorKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gICAqCisqICAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIElOVEVMIENPUlBPUkFUSU9OICIiQVMgSVMiIiBBTkQgQU5ZICAgICAgICAgICoKKyogIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFICAgICAgICAgKgorKiAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSICAgICAgICAqCisqICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFTCBDT1JQT1JBVElPTiBPUiAgICAgICAgICAgICoKKyogIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCAgICAgKgorKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAgICAgICAqCisqICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgICAgICAgICoKKyogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgICAgKgorKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgICAgICAqCisqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgICAgICAgICoKKyogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTElDRU5TRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qIFRoaXMgc3VibWlzc2lvbiB0byBPcGVuU1NMIGlzIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBPcGVuU1NMICAKLSogbGljZW5zZSwgYW5kIG9ubHkgdG8gdGhlIE9wZW5TU0wgcHJvamVjdCwgaW4gb3JkZXIgdG8gYWxsb3cgaW50ZWdyYXRpb24gICAgCi0qIGludG8gdGhlIHB1YmxpY2x5IGRpc3RyaWJ1dGVkIGNvZGUuIAotKiBUaGUgdXNlIG9mIHRoaXMgY29kZSwgb3IgcG9ydGlvbnMgb2YgdGhpcyBjb2RlLCBvciBjb25jZXB0cyBlbWJlZGRlZCBpbgotKiB0aGlzIGNvZGUsIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGlzIGNvZGUgYW5kL29yIGFsZ29yaXRobShzKSBpbiBpdCwgb3IgdGhlCi0qIHVzZSBvZiB0aGlzIGNvZGUgZm9yIGFueSBvdGhlciBwdXJwb3NlIHRoYW4gc3RhdGVkIGFib3ZlLCByZXF1aXJlcyBzcGVjaWFsCi0qIGxpY2Vuc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBESVNDTEFJTUVSOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09OVFJJQlVUT1JTIEFORCBUSEUgQ09QWVJJR0hUIE9XTkVSUyAgICAgCi0qIGBgQVMgSVMnJy4gQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIAotKiBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBPUiBUSEUgQ09QWVJJR0hUCi0qIE9XTkVSUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIAotKiBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiAgICAKLSogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTICAgCi0qIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICAgIAotKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAgICAKLSogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgCi0qIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKiBEZXZlbG9wZXJzIGFuZCBhdXRob3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIFNoYXkgR3Vlcm9uICgxLCAyKSwgYW5kIFZsYWQgS3Jhc25vdiAoMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogKDEpIEludGVsIENvcnBvcmF0aW9uLCBJc3JhZWwgRGV2ZWxvcG1lbnQgQ2VudGVyLCBIYWlmYSwgSXNyYWVsICAgICAgICAgICAgKgorKiAoMikgVW5pdmVyc2l0eSBvZiBIYWlmYSwgSXNyYWVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmbmRlZiBSU0FaX0VYUF9ICiAjZGVmaW5lIFJTQVpfRVhQX0gKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vYm4vc2hpZnQuYyBiL3NyYy9jcnlwdG8vYm4vc2hpZnQuYwppbmRleCBmMTQzOTk2Li5kZWZlYzkyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2JuL3NoaWZ0LmMKKysrIGIvc3JjL2NyeXB0by9ibi9zaGlmdC5jCkBAIC02OSw3ICs2OSw3IEBACiAgIEJOX1VMT05HIGw7CiAKICAgaWYgKG4gPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX2xzaGlmdCwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05FR0FUSVZFX05VTUJFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTM4LDcgKzEzOCw3IEBACiAgIEJOX1VMT05HIGwsIHRtcDsKIAogICBpZiAobiA8IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fcnNoaWZ0LCBCTl9SX05FR0FUSVZFX05VTUJFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTkVHQVRJVkVfTlVNQkVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2JuL3NxcnQuYyBiL3NyYy9jcnlwdG8vYm4vc3FydC5jCmluZGV4IGU3MWE4MTguLjJlZDY2YzIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYm4vc3FydC5jCisrKyBiL3NyYy9jcnlwdG8vYm4vc3FydC5jCkBAIC04Niw3ICs4Niw3IEBACiAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2Rfc3FydCwgQk5fUl9QX0lTX05PVF9QUklNRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfUF9JU19OT1RfUFJJTUUpOwogICAgIHJldHVybiAoTlVMTCk7CiAgIH0KIApAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgfQogICAgIGlmIChyID09IDApIHsKICAgICAgIC8qIG0gZGl2aWRlcyBwICovCi0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfUF9JU19OT1RfUFJJTUUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfUF9JU19OT1RfUFJJTUUpOwogICAgICAgZ290byBlbmQ7CiAgICAgfQogICB9IHdoaWxlIChyID09IDEgJiYgKytpIDwgODIpOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAgICAgICogRXZlbiBpZiAgcCAgaXMgbm90IHByaW1lLCB3ZSBzaG91bGQgaGF2ZSBmb3VuZCBzb21lICB5CiAgICAgICogc3VjaCB0aGF0IHIgPT0gLTEuCiAgICAgICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX21vZF9zcXJ0LCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOwogICAgIGdvdG8gZW5kOwogICB9CiAKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIGdvdG8gZW5kOwogICB9CiAgIGlmIChCTl9pc19vbmUoeSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfUF9JU19OT1RfUFJJTUUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKICAgICBnb3RvIGVuZDsKICAgfQogCkBAIC0zNzcsNyArMzc3LDcgQEAKICAgICB3aGlsZSAoIUJOX2lzX29uZSh0KSkgewogICAgICAgaSsrOwogICAgICAgaWYgKGkgPT0gZSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fbW9kX3NxcnQsIEJOX1JfTk9UX0FfU1FVQVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICAgICAgZ290byBlbmQ7CiAgICAgICB9CiAgICAgICBpZiAoIUJOX21vZF9tdWwodCwgdCwgdCwgcCwgY3R4KSkgewpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgfQogCiAgICAgaWYgKCFlcnIgJiYgMCAhPSBCTl9jbXAoeCwgQSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9tb2Rfc3FydCwgQk5fUl9OT1RfQV9TUVVBUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICAgIGVyciA9IDE7CiAgICAgfQogICB9CkBAIC00MzQsNyArNDM0LDcgQEAKICAgaW50IG9rID0gMCwgbGFzdF9kZWx0YV92YWxpZCA9IDA7CiAKICAgaWYgKGluLT5uZWcpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgQk5fc3FydCwgQk5fUl9ORUdBVElWRV9OVU1CRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9SX05FR0FUSVZFX05VTUJFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKEJOX2lzX3plcm8oaW4pKSB7CkBAIC00NTIsNyArNDUyLDcgQEAKICAgbGFzdF9kZWx0YSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgZGVsdGEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIGlmIChlc3RpbWF0ZSA9PSBOVUxMIHx8IHRtcCA9PSBOVUxMIHx8IGxhc3RfZGVsdGEgPT0gTlVMTCB8fCBkZWx0YSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3NxcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQ3MCw3ICs0NzAsNyBAQAogICAgICAgICAhQk5fc3FyKHRtcCwgZXN0aW1hdGUsIGN0eCkgfHwKICAgICAgICAgLyogfGRlbHRhfCA9IHxpbnwgLSB8dG1wfCAqLwogICAgICAgICAhQk5fc3ViKGRlbHRhLCBpbiwgdG1wKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX3NxcnQsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihCTiwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNDkwLDE1ICs0OTAsMTUgQEAKICAgfQogCiAgIGlmIChCTl9jbXAodG1wLCBpbikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJOLCBCTl9zcXJ0LCBCTl9SX05PVF9BX1NRVUFSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQk4sIEJOX1JfTk9UX0FfU1FVQVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIG9rID0gMTsKIAogZXJyOgotICBpZiAob2sgJiYgb3V0X3NxcnQgPT0gaW4pIHsKLSAgICBCTl9jb3B5KG91dF9zcXJ0LCBlc3RpbWF0ZSk7CisgIGlmIChvayAmJiBvdXRfc3FydCA9PSBpbiAmJiAhQk5fY29weShvdXRfc3FydCwgZXN0aW1hdGUpKSB7CisgICAgb2sgPSAwOwogICB9CiAgIEJOX0NUWF9lbmQoY3R4KTsKICAgcmV0dXJuIG9rOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9idWYvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dAppbmRleCAxOWVkZjdkLi42M2YxMDI1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2J1Zi9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYnVmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J1Zi9idWYuYyBiL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCmluZGV4IDU3NjllNzcuLjEzYjVjZWIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCisrKyBiL3NyYy9jcnlwdG8vYnVmL2J1Zi5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJVRl9NRU0pKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfTUVNX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTEwNSwxNCArMTA1LDE0IEBACiAgIG4gPSBsZW4gKyAzOwogICBpZiAobiA8IGxlbikgewogICAgIC8qIG92ZXJmbG93ICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBidWZfbWVtX2dyb3csIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBuID0gbiAvIDM7CiAgIGFsbG9jX3NpemUgPSBuICogNDsKICAgaWYgKGFsbG9jX3NpemUgLyA0ICE9IG4pIHsKICAgICAvKiBvdmVyZmxvdyAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgYnVmX21lbV9ncm93LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTI3LDcgKzEyNyw3IEBACiAgIH0KIAogICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBidWZfbWVtX2dyb3csIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBsZW4gPSAwOwogICB9IGVsc2UgewogICAgIGJ1Zi0+ZGF0YSA9IG5ld19idWY7CkBAIC0xODAsMTIgKzE4MCwxMiBAQAogICBhbGxvY19zaXplID0gc2l6ZSArIDE7CiAgIGlmIChhbGxvY19zaXplIDwgc2l6ZSkgewogICAgIC8qIG92ZXJmbG93ICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBCVUZfc3RybmR1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEJVRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKGFsbG9jX3NpemUpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9zdHJuZHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQlVGLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMjI2LDcgKzIyNiw3IEBACiAKICAgcmV0ID0gT1BFTlNTTF9tYWxsb2MoZHN0X3NpemUpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEJVRl9tZW1kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihCVUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvQ01ha2VMaXN0cy50eHQKaW5kZXggY2JiYWNmMi4uMzQ2MmFlZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgYnl0ZXN0cmluZwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmdfdGVzdC5jYyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9ieXRlc3RyaW5nX3Rlc3QuY2MKaW5kZXggNjZlOWMxZS4uZTk4N2UxYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2J5dGVzdHJpbmdfdGVzdC5jYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvYnl0ZXN0cmluZ190ZXN0LmNjCkBAIC0xMDksNyArMTA5LDcgQEAKICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEyW10gPSB7MHgzMCwgMywgMSwgMn07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhM1tdID0gezB4MzAsIDB4ODB9OwogICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YTRbXSA9IHsweDMwLCAweDgxLCAxLCAxfTsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGE1W10gPSB7MHgzMCwgMHg4MiwgMCwgMSwgMX07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhNVs0ICsgMHg4MF0gPSB7MHgzMCwgMHg4MiwgMCwgMHg4MH07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhNltdID0gezB4YTEsIDMsIDB4NCwgMSwgMX07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhN1tdID0gezB4YTEsIDMsIDB4NCwgMiwgMX07CiAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhOFtdID0gezB4YTEsIDMsIDB4MiwgMSwgMX07CkBAIC02NDksNiArNjQ5LDE0IEBACiAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgaW50IFRlc3RaZXJvKCkgeworICBDQkIgY2JiOworICBDQkJfemVybygmY2JiKTsKKyAgLy8gQ2FsbGluZyB8Q0JCX2NsZWFudXB8IG9uIGEgemVyby1zdGF0ZSB8Q0JCfCBtdXN0IG5vdCBjcmFzaC4KKyAgQ0JCX2NsZWFudXAoJmNiYik7CisgIHJldHVybiAxOworfQorCiBpbnQgbWFpbih2b2lkKSB7CiAgIENSWVBUT19saWJyYXJ5X2luaXQoKTsKIApAQCAtNjY1LDcgKzY3Myw4IEBACiAgICAgICAhVGVzdENCQkFTTjEoKSB8fAogICAgICAgIVRlc3RCZXJDb252ZXJ0KCkgfHwKICAgICAgICFUZXN0QVNOMVVpbnQ2NCgpIHx8Ci0gICAgICAhVGVzdEdldE9wdGlvbmFsQVNOMUJvb2woKSkgeworICAgICAgIVRlc3RHZXRPcHRpb25hbEFTTjFCb29sKCkgfHwKKyAgICAgICFUZXN0WmVybygpKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jIGIvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2NiYi5jCmluZGV4IGYxZTA5YTIuLjFkYTZhMjEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9jYmIuYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvY2JiLmMKQEAgLTIwLDYgKzIwLDEwIEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KIAogCit2b2lkIENCQl96ZXJvKENCQiAqY2JiKSB7CisgIG1lbXNldChjYmIsIDAsIHNpemVvZihDQkIpKTsKK30KKwogc3RhdGljIGludCBjYmJfaW5pdChDQkIgKmNiYiwgdWludDhfdCAqYnVmLCBzaXplX3QgY2FwKSB7CiAgIHN0cnVjdCBjYmJfYnVmZmVyX3N0ICpiYXNlOwogCkBAIC0yNDMsNiArMjQ3LDExIEBACiAgIHJldHVybiAxOwogfQogCitzaXplX3QgQ0JCX2xlbihjb25zdCBDQkIgKmNiYikgeworICBhc3NlcnQoY2JiLT5jaGlsZCA9PSBOVUxMKTsKKworICByZXR1cm4gY2JiLT5iYXNlLT5sZW47Cit9CiAKIHN0YXRpYyBpbnQgY2JiX2FkZF9sZW5ndGhfcHJlZml4ZWQoQ0JCICpjYmIsIENCQiAqb3V0X2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuX2xlbikgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2Nicy5jIGIvc3JjL2NyeXB0by9ieXRlc3RyaW5nL2Nicy5jCmluZGV4IGI4Y2FlZGQuLjVlMGM1MzggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9jYnMuYworKysgYi9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvY2JzLmMKQEAgLTEzNyw2ICsxMzcsMTUgQEAKICAgcmV0dXJuIDE7CiB9CiAKK2ludCBDQlNfY29weV9ieXRlcyhDQlMgKmNicywgdWludDhfdCAqb3V0LCBzaXplX3QgbGVuKSB7CisgIGNvbnN0IHVpbnQ4X3QgKnY7CisgIGlmICghY2JzX2dldChjYnMsICZ2LCBsZW4pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtY3B5KG91dCwgdiwgbGVuKTsKKyAgcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgY2JzX2dldF9sZW5ndGhfcHJlZml4ZWQoQ0JTICpjYnMsIENCUyAqb3V0LCBzaXplX3QgbGVuX2xlbikgewogICB1aW50MzJfdCBsZW47CiAgIGlmICghY2JzX2dldF91KGNicywgJmxlbiwgbGVuX2xlbikpIHsKQEAgLTMyMCwxNCArMzI5LDE5IEBACiB9CiAKIGludCBDQlNfZ2V0X29wdGlvbmFsX2FzbjEoQ0JTICpjYnMsIENCUyAqb3V0LCBpbnQgKm91dF9wcmVzZW50LCB1bnNpZ25lZCB0YWcpIHsKKyAgaW50IHByZXNlbnQgPSAwOworCiAgIGlmIChDQlNfcGVla19hc24xX3RhZyhjYnMsIHRhZykpIHsKICAgICBpZiAoIUNCU19nZXRfYXNuMShjYnMsIG91dCwgdGFnKSkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgICpvdXRfcHJlc2VudCA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgKm91dF9wcmVzZW50ID0gMDsKKyAgICBwcmVzZW50ID0gMTsKICAgfQorCisgIGlmIChvdXRfcHJlc2VudCAhPSBOVUxMKSB7CisgICAgKm91dF9wcmVzZW50ID0gcHJlc2VudDsKKyAgfQorCiAgIHJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2J5dGVzdHJpbmcvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCmluZGV4IDM5MWFkMTkuLmI0ZWE3ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vYnl0ZXN0cmluZy9pbnRlcm5hbC5oCkBAIC0zOCwxNCArMzgsNiBAQAogICogSXQgcmV0dXJucyBvbmUgb24gc3VjY2VzcyBhbmQgemVybyBvdGhlcndpc2UuICovCiBPUEVOU1NMX0VYUE9SVCBpbnQgQ0JTX2FzbjFfYmVyX3RvX2RlcihDQlMgKmluLCB1aW50OF90ICoqb3V0LCBzaXplX3QgKm91dF9sZW4pOwogCi0vKiBDQlNfZ2V0X2FueV9iZXJfYXNuMV9lbGVtZW50IGFjdHMgdGhlIHNhbWUgYXMgfENCU19nZXRfYW55X2FzbjFfZWxlbWVudHwgYnV0Ci0gKiBhbHNvIGFsbG93cyBpbmRlZmluaXRlLWxlbmd0aCBlbGVtZW50cyB0byBiZSByZXR1cm5lZC4gSW4gdGhhdCBjYXNlLAotICogfCpvdXRfaGVhZGVyX2xlbnwgYW5kIHxDQlNfbGVuKG91dCl8IHdpbGwgYm90aCBiZSB0d28gYXMgb25seSB0aGUgaGVhZGVyIGlzCi0gKiByZXR1cm5lZC4gKi8KLU9QRU5TU0xfRVhQT1JUIGludCBDQlNfZ2V0X2FueV9iZXJfYXNuMV9lbGVtZW50KENCUyAqY2JzLCBDQlMgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpvdXRfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpvdXRfaGVhZGVyX2xlbik7Ci0KIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaGFjaGEvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dAppbmRleCA2YzNmODdlLi4yNjZlODY5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2NoYWNoYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKICAgc2V0KApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm0uUyBiL3NyYy9jcnlwdG8vY2hhY2hhL2NoYWNoYV92ZWNfYXJtLlMKaW5kZXggZGRjMzc0ZS4uMGY4MjYyNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm0uUworKysgYi9zcmMvY3J5cHRvL2NoYWNoYS9jaGFjaGFfdmVjX2FybS5TCkBAIC0yMyw2ICsyMyw3IEBACiAjICAgICAvb3B0L2djYy1saW5hcm8tNC45LTIwMTQuMTEteDg2XzY0X2FybS1saW51eC1nbnVlYWJpaGYvYmluL2FybS1saW51eC1nbnVlYWJpaGYtZ2NjIC1PMyAtbWNwdT1jb3J0ZXgtYTggLW1mcHU9bmVvbiAtZnBpYyAtREFTTV9HRU4gLUkgLi4vLi4vaW5jbHVkZSAtUyBjaGFjaGFfdmVjLmMgLW8gLQogCiAjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQogCiAJLnN5bnRheCB1bmlmaWVkCiAJLmNwdSBjb3J0ZXgtYTgKQEAgLTE0MjMsNCArMTQyNCw1IEBACiAJLmlkZW50CSJHQ0M6IChMaW5hcm8gR0NDIDIwMTQuMTEpIDQuOS4zIDIwMTQxMDMxIChwcmVyZWxlYXNlKSIKIAkuc2VjdGlvbgkubm90ZS5HTlUtc3RhY2ssIiIsJXByb2diaXRzCiAKKyNlbmRpZiAgLyogX19hcm1fXyB8fCBfX2FhcmNoNjRfXyAqLwogI2VuZGlmICAvKiAhT1BFTlNTTF9OT19BU00gKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2hhY2hhL2NoYWNoYV92ZWNfYXJtX2dlbmVyYXRlLmdvIGIvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KaW5kZXggZDY4MWU4YS4uNmQxNjdiOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KKysrIGIvc3JjL2NyeXB0by9jaGFjaGEvY2hhY2hhX3ZlY19hcm1fZ2VuZXJhdGUuZ28KQEAgLTUyLDcgKzUyLDggQEAKIAlvdXRwdXQuV3JpdGVTdHJpbmcoY29tcGlsZXIpCiAJb3V0cHV0LldyaXRlU3RyaW5nKCIgIikKIAlvdXRwdXQuV3JpdGVTdHJpbmcoc3RyaW5ncy5Kb2luKGFyZ3MsICIgIikpCi0Jb3V0cHV0LldyaXRlU3RyaW5nKCJcblxuI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKVxuXG4iKQorCW91dHB1dC5Xcml0ZVN0cmluZygiXG5cbiNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSlcbiIpCisJb3V0cHV0LldyaXRlU3RyaW5nKCIjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKVxuXG4iKQogCiAJY21kIDo9IGV4ZWMuQ29tbWFuZChjb21waWxlciwgYXJncy4uLikKIAljbWQuU3RkZXJyID0gb3MuU3RkZXJyCkBAIC0xNDQsNSArMTQ1LDYgQEAKIGAKIAogY29uc3QgdHJhaWxlciA9IGAKKyNlbmRpZiAgLyogX19hcm1fXyB8fCBfX2FhcmNoNjRfXyAqLwogI2VuZGlmICAvKiAhT1BFTlNTTF9OT19BU00gKi8KIGAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKaW5kZXggMjc3NTY5OC4uNmI0YzcyOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGNpcGhlcgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvYWVhZC5jIGIvc3JjL2NyeXB0by9jaXBoZXIvYWVhZC5jCmluZGV4IDIwZDY5OWQuLjdlNzQ3ZjggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWQuYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9hZWFkLmMKQEAgLTMwLDExICszMCwxNSBAQAogCiBzaXplX3QgRVZQX0FFQURfbWF4X3RhZ19sZW4oY29uc3QgRVZQX0FFQUQgKmFlYWQpIHsgcmV0dXJuIGFlYWQtPm1heF90YWdfbGVuOyB9CiAKK3ZvaWQgRVZQX0FFQURfQ1RYX3plcm8oRVZQX0FFQURfQ1RYICpjdHgpIHsKKyAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKEVWUF9BRUFEX0NUWCkpOworfQorCiBpbnQgRVZQX0FFQURfQ1RYX2luaXQoRVZQX0FFQURfQ1RYICpjdHgsIGNvbnN0IEVWUF9BRUFEICphZWFkLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB0YWdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIEVOR0lORSAqaW1wbCkgewogICBpZiAoIWFlYWQtPmluaXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9BRUFEX0NUWF9pbml0LCBDSVBIRVJfUl9OT19ESVJFQ1RJT05fU0VUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX05PX0RJUkVDVElPTl9TRVQpOwogICAgIGN0eC0+YWVhZCA9IE5VTEw7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTQ3LDggKzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGFnX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGV2cF9hZWFkX2RpcmVjdGlvbl90IGRpcikgewogICBpZiAoa2V5X2xlbiAhPSBhZWFkLT5rZXlfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQUVBRF9DVFhfaW5pdF93aXRoX2RpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9LRVlfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9VTlNVUFBPUlRFRF9LRVlfU0laRSk7CiAgICAgY3R4LT5hZWFkID0gTlVMTDsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTAxLDEyICsxMDQsMTIgQEAKICAgc2l6ZV90IHBvc3NpYmxlX291dF9sZW4gPSBpbl9sZW4gKyBjdHgtPmFlYWQtPm92ZXJoZWFkOwogCiAgIGlmIChwb3NzaWJsZV9vdXRfbGVuIDwgaW5fbGVuIC8qIG92ZXJmbG93ICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQUVBRF9DVFhfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgZ290byBlcnJvcjsKICAgfQogCiAgIGlmICghY2hlY2tfYWxpYXMoaW4sIGluX2xlbiwgb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX3NlYWwsIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAKQEAgLTEyOCw3ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub25jZV9sZW4sIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkLCBzaXplX3QgYWRfbGVuKSB7CiAgIGlmICghY2hlY2tfYWxpYXMoaW4sIGluX2xlbiwgb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0FFQURfQ1RYX29wZW4sIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX09VVFBVVF9BTElBU0VTX0lOUFVUKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWRfdGVzdC5jYyBiL3NyYy9jcnlwdG8vY2lwaGVyL2FlYWRfdGVzdC5jYwppbmRleCBlNGI3NWQ2Li5iYWFlZTllIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9hZWFkX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvYWVhZF90ZXN0LmNjCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KIAogI2luY2x1ZGUgIi4uL3Rlc3QvZmlsZV90ZXN0LmgiCisjaW5jbHVkZSAiLi4vdGVzdC9zY29wZWRfdHlwZXMuaCIKICNpbmNsdWRlICIuLi90ZXN0L3N0bF9jb21wYXQuaCIKIAogCkBAIC0zNSwxOCArMzYsNiBAQAogLy8gICBDVDogNTI5NDI2NWE2MAogLy8gICBUQUc6IDFkNDU3NTg2MjE3NjJlMDYxMzY4ZTY4ODY4ZTJmOTI5CiAKLS8vIEVWUF9BRUFEX0NUWCBsYWNrcyBhIHplcm8gc3RhdGUsIHNvIGl0IGRvZXNuJ3QgZml0IGVhc2lseSBpbnRvCi0vLyBTY29wZWRPcGVuU1NMQ29udGV4dC4KLWNsYXNzIEVWUF9BRUFEX0NUWFNjb3BlciB7Ci0gcHVibGljOgotICBFVlBfQUVBRF9DVFhTY29wZXIoRVZQX0FFQURfQ1RYICpjdHgpIDogY3R4XyhjdHgpIHt9Ci0gIH5FVlBfQUVBRF9DVFhTY29wZXIoKSB7Ci0gICAgRVZQX0FFQURfQ1RYX2NsZWFudXAoY3R4Xyk7Ci0gIH0KLSBwcml2YXRlOgotICBFVlBfQUVBRF9DVFggKmN0eF87Ci19OwotCiBzdGF0aWMgYm9vbCBUZXN0QUVBRChGaWxlVGVzdCAqdCwgdm9pZCAqYXJnKSB7CiAgIGNvbnN0IEVWUF9BRUFEICphZWFkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFVlBfQUVBRCo+KGFyZyk7CiAKQEAgLTYwLDIwICs0OSwxOSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIEVWUF9BRUFEX0NUWCBjdHg7Ci0gIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oJmN0eCwgYWVhZCwgYnNzbDo6dmVjdG9yX2RhdGEoJmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNpemUoKSwgdGFnLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnBfYWVhZF9zZWFsKSkgeworICBTY29wZWRFVlBfQUVBRF9DVFggY3R4OworICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKGN0eC5nZXQoKSwgYWVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSwga2V5LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcuc2l6ZSgpLCBldnBfYWVhZF9zZWFsKSkgewogICAgIHQtPlByaW50TGluZSgiRmFpbGVkIHRvIGluaXQgQUVBRC4iKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgRVZQX0FFQURfQ1RYU2NvcGVyIGNsZWFudXAoJmN0eCk7CiAKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb3V0KGluLnNpemUoKSArIEVWUF9BRUFEX21heF9vdmVyaGVhZChhZWFkKSk7CiAgIGlmICghdC0+SGFzQXR0cmlidXRlKCJOT19TRUFMIikpIHsKICAgICBzaXplX3Qgb3V0X2xlbjsKLSAgICBpZiAoIUVWUF9BRUFEX0NUWF9zZWFsKCZjdHgsIGJzc2w6OnZlY3Rvcl9kYXRhKCZvdXQpLCAmb3V0X2xlbiwgb3V0LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZub25jZSksIG5vbmNlLnNpemUoKSwKKyAgICBpZiAoIUVWUF9BRUFEX0NUWF9zZWFsKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksICZvdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmluKSwgaW4uc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmFkKSwgYWQuc2l6ZSgpKSkgewogICAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gcnVuIEFFQUQuIik7CkBAIC0xMDEsMTcgKzg5LDE3IEBACiAKICAgLy8gVGhlICJzdGF0ZWZ1bCIgQUVBRHMgZm9yIGltcGxlbWVudGluZyBwcmUtQUVBRCBjaXBoZXIgc3VpdGVzIG5lZWQgdG8gYmUKICAgLy8gcmVzZXQgYWZ0ZXIgZWFjaCBvcGVyYXRpb24uCi0gIEVWUF9BRUFEX0NUWF9jbGVhbnVwKCZjdHgpOwotICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKCZjdHgsIGFlYWQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zaXplKCksIHRhZy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZwX2FlYWRfb3BlbikpIHsKKyAgY3R4LlJlc2V0KCk7CisgIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oY3R4LmdldCgpLCBhZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLCBrZXkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zaXplKCksIGV2cF9hZWFkX29wZW4pKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gaW5pdCBBRUFELiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dDIob3V0LnNpemUoKSk7CiAgIHNpemVfdCBvdXQyX2xlbjsKLSAgaW50IHJldCA9IEVWUF9BRUFEX0NUWF9vcGVuKCZjdHgsCisgIGludCByZXQgPSBFVlBfQUVBRF9DVFhfb3BlbihjdHguZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmb3V0MiksICZvdXQyX2xlbiwgb3V0Mi5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmbm9uY2UpLCBub25jZS5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmb3V0KSwgb3V0LnNpemUoKSwKQEAgLTEzNywxMCArMTI1LDEwIEBACiAKICAgLy8gVGhlICJzdGF0ZWZ1bCIgQUVBRHMgZm9yIGltcGxlbWVudGluZyBwcmUtQUVBRCBjaXBoZXIgc3VpdGVzIG5lZWQgdG8gYmUKICAgLy8gcmVzZXQgYWZ0ZXIgZWFjaCBvcGVyYXRpb24uCi0gIEVWUF9BRUFEX0NUWF9jbGVhbnVwKCZjdHgpOwotICBpZiAoIUVWUF9BRUFEX0NUWF9pbml0X3dpdGhfZGlyZWN0aW9uKCZjdHgsIGFlYWQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zaXplKCksIHRhZy5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZwX2FlYWRfb3BlbikpIHsKKyAgY3R4LlJlc2V0KCk7CisgIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oY3R4LmdldCgpLCBhZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpLCBrZXkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5zaXplKCksIGV2cF9hZWFkX29wZW4pKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJGYWlsZWQgdG8gaW5pdCBBRUFELiIpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTQ4LDggKzEzNiw4IEBACiAgIC8vIEdhcmJhZ2UgYXQgdGhlIGVuZCBpc24ndCBpZ25vcmVkLgogICBvdXQucHVzaF9iYWNrKDApOwogICBvdXQyLnJlc2l6ZShvdXQuc2l6ZSgpKTsKLSAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKCZjdHgsIGJzc2w6OnZlY3Rvcl9kYXRhKCZvdXQyKSwgJm91dDJfbGVuLCBvdXQyLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZub25jZSksIG5vbmNlLnNpemUoKSwKKyAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQyLnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksIG91dC5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmYWQpLCBhZC5zaXplKCkpKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJEZWNyeXB0ZWQgYmFkIGRhdGEgd2l0aCB0cmFpbGluZyBnYXJiYWdlLiIpOwpAQCAtMTU5LDEwICsxNDcsMTAgQEAKIAogICAvLyBUaGUgInN0YXRlZnVsIiBBRUFEcyBmb3IgaW1wbGVtZW50aW5nIHByZS1BRUFEIGNpcGhlciBzdWl0ZXMgbmVlZCB0byBiZQogICAvLyByZXNldCBhZnRlciBlYWNoIG9wZXJhdGlvbi4KLSAgRVZQX0FFQURfQ1RYX2NsZWFudXAoJmN0eCk7Ci0gIGlmICghRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24oJmN0eCwgYWVhZCwgYnNzbDo6dmVjdG9yX2RhdGEoJmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNpemUoKSwgdGFnLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldnBfYWVhZF9vcGVuKSkgeworICBjdHguUmVzZXQoKTsKKyAgaWYgKCFFVlBfQUVBRF9DVFhfaW5pdF93aXRoX2RpcmVjdGlvbihjdHguZ2V0KCksIGFlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmtleSksIGtleS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnNpemUoKSwgZXZwX2FlYWRfb3BlbikpIHsKICAgICB0LT5QcmludExpbmUoIkZhaWxlZCB0byBpbml0IEFFQUQuIik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0xNzEsOCArMTU5LDggQEAKICAgb3V0WzBdIF49IDB4ODA7CiAgIG91dC5yZXNpemUob3V0LnNpemUoKSAtIDEpOwogICBvdXQyLnJlc2l6ZShvdXQuc2l6ZSgpKTsKLSAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKCZjdHgsIGJzc2w6OnZlY3Rvcl9kYXRhKCZvdXQyKSwgJm91dDJfbGVuLCBvdXQyLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZub25jZSksIG5vbmNlLnNpemUoKSwKKyAgaWYgKEVWUF9BRUFEX0NUWF9vcGVuKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm91dDIpLCAmb3V0Ml9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQyLnNpemUoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJm5vbmNlKSwgbm9uY2Uuc2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJm91dCksIG91dC5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmYWQpLCBhZC5zaXplKCkpKSB7CiAgICAgdC0+UHJpbnRMaW5lKCJEZWNyeXB0ZWQgYmFkIGRhdGEgd2l0aCBjb3JydXB0ZWQgYnl0ZS4iKTsKQEAgLTIwMCw2ICsxODgsNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiQSBzaWxseSB0YWcgbGVuZ3RoIGRpZG4ndCB0cmlnZ2VyIGFuIGVycm9yIVxuIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgLyogUnVubmluZyBhIHNlY29uZCwgZmFpbGVkIF9pbml0IHNob3VsZCBub3QgY2F1c2UgYSBtZW1vcnkgbGVhay4gKi8KICAgaWYgKEVWUF9BRUFEX0NUWF9pbml0KCZjdHgsIGFlYWQsIGtleSwga2V5X2xlbiwKQEAgLTIwOCw2ICsxOTcsNyBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiQSBzaWxseSB0YWcgbGVuZ3RoIGRpZG4ndCB0cmlnZ2VyIGFuIGVycm9yIVxuIik7CiAgICAgcmV0dXJuIDA7CiAgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CiAKICAgLyogQ2FsbGluZyBfY2xlYW51cCBvbiBhbiB8RVZQX0FFQURfQ1RYfCBhZnRlciBhIGZhaWxlZCBfaW5pdCBzaG91bGQgYmUgYQogICAgKiBuby1vcC4gKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2NpcGhlci5jIGIvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKaW5kZXggNDAwYzNmNS4uNDQwMTg2NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyLmMKQEAgLTY4LDEyICs2OCwxOCBAQAogCiBjb25zdCBFVlBfQ0lQSEVSICpFVlBfZ2V0X2NpcGhlcmJ5bmlkKGludCBuaWQpIHsKICAgc3dpdGNoIChuaWQpIHsKKyAgICBjYXNlIE5JRF9yYzJfY2JjOgorICAgICAgcmV0dXJuIEVWUF9yYzJfY2JjKCk7CisgICAgY2FzZSBOSURfcmMyXzQwX2NiYzoKKyAgICAgIHJldHVybiBFVlBfcmMyXzQwX2NiYygpOwogICAgIGNhc2UgTklEX2Rlc19lZGUzX2NiYzoKICAgICAgIHJldHVybiBFVlBfZGVzX2VkZTNfY2JjKCk7CiAgICAgY2FzZSBOSURfZGVzX2VkZV9jYmM6CiAgICAgICByZXR1cm4gRVZQX2Rlc19jYmMoKTsKICAgICBjYXNlIE5JRF9hZXNfMTI4X2NiYzoKICAgICAgIHJldHVybiBFVlBfYWVzXzEyOF9jYmMoKTsKKyAgICBjYXNlIE5JRF9hZXNfMTkyX2NiYzoKKyAgICAgIHJldHVybiBFVlBfYWVzXzE5Ml9jYmMoKTsKICAgICBjYXNlIE5JRF9hZXNfMjU2X2NiYzoKICAgICAgIHJldHVybiBFVlBfYWVzXzI1Nl9jYmMoKTsKICAgICBkZWZhdWx0OgpAQCAtMTE1LDcgKzEyMSw3IEBACiAKIGludCBFVlBfQ0lQSEVSX0NUWF9jb3B5KEVWUF9DSVBIRVJfQ1RYICpvdXQsIGNvbnN0IEVWUF9DSVBIRVJfQ1RYICppbikgewogICBpZiAoaW4gPT0gTlVMTCB8fCBpbi0+Y2lwaGVyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2NvcHksIENJUEhFUl9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEyNSw3ICsxMzEsNyBAQAogICBpZiAoaW4tPmNpcGhlcl9kYXRhICYmIGluLT5jaXBoZXItPmN0eF9zaXplKSB7CiAgICAgb3V0LT5jaXBoZXJfZGF0YSA9IE9QRU5TU0xfbWFsbG9jKGluLT5jaXBoZXItPmN0eF9zaXplKTsKICAgICBpZiAoIW91dC0+Y2lwaGVyX2RhdGEpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfY29weSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgbWVtY3B5KG91dC0+Y2lwaGVyX2RhdGEsIGluLT5jaXBoZXJfZGF0YSwgaW4tPmNpcGhlci0+Y3R4X3NpemUpOwpAQCAtMTY1LDcgKzE3MSw3IEBACiAgICAgICBjdHgtPmNpcGhlcl9kYXRhID0gT1BFTlNTTF9tYWxsb2MoY3R4LT5jaXBoZXItPmN0eF9zaXplKTsKICAgICAgIGlmICghY3R4LT5jaXBoZXJfZGF0YSkgewogICAgICAgICBjdHgtPmNpcGhlciA9IE5VTEw7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNzgsMTIgKzE4NCwxMiBAQAogICAgIGlmIChjdHgtPmNpcGhlci0+ZmxhZ3MgJiBFVlBfQ0lQSF9DVFJMX0lOSVQpIHsKICAgICAgIGlmICghRVZQX0NJUEhFUl9DVFhfY3RybChjdHgsIEVWUF9DVFJMX0lOSVQsIDAsIE5VTEwpKSB7CiAgICAgICAgIGN0eC0+Y2lwaGVyID0gTlVMTDsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ2lwaGVySW5pdF9leCwgQ0lQSEVSX1JfSU5JVElBTElaQVRJT05fRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfQogICB9IGVsc2UgaWYgKCFjdHgtPmNpcGhlcikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NpcGhlckluaXRfZXgsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzM4LDggKzM0NCw3IEBACiAgIGJsID0gY3R4LT5idWZfbGVuOwogICBpZiAoY3R4LT5mbGFncyAmIEVWUF9DSVBIX05PX1BBRERJTkcpIHsKICAgICBpZiAoYmwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0VuY3J5cHRGaW5hbF9leCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgKm91dF9sZW4gPSAwOwpAQCAtNDM0LDggKzQzOSw3IEBACiAgIGIgPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKICAgaWYgKGN0eC0+ZmxhZ3MgJiBFVlBfQ0lQSF9OT19QQURESU5HKSB7CiAgICAgaWYgKGN0eC0+YnVmX2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRGVjcnlwdEZpbmFsX2V4LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RIKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAqb3V0X2xlbiA9IDA7CkBAIC00NDQsOCArNDQ4LDcgQEAKIAogICBpZiAoYiA+IDEpIHsKICAgICBpZiAoY3R4LT5idWZfbGVuIHx8ICFjdHgtPmZpbmFsX3VzZWQpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0RlY3J5cHRGaW5hbF9leCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1dST05HX0ZJTkFMX0JMT0NLX0xFTkdUSCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1dST05HX0ZJTkFMX0JMT0NLX0xFTkdUSCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgYXNzZXJ0KGIgPD0gc2l6ZW9mKGN0eC0+ZmluYWwpKTsKQEAgLTQ1NCwxMyArNDU3LDEzIEBACiAgICAgICogT3RoZXJ3aXNlIGl0IHByb3ZpZGVzIGEgcGFkZGluZyBvcmFjbGUuICovCiAgICAgbiA9IGN0eC0+ZmluYWxbYiAtIDFdOwogICAgIGlmIChuID09IDAgfHwgbiA+IChpbnQpYikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfRGVjcnlwdEZpbmFsX2V4LCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgIGlmIChjdHgtPmZpbmFsWy0tYl0gIT0gbikgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9EZWNyeXB0RmluYWxfZXgsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgIH0KQEAgLTUzOCwxOSArNTQxLDE4IEBACiBpbnQgRVZQX0NJUEhFUl9DVFhfY3RybChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgY29tbWFuZCwgaW50IGFyZywgdm9pZCAqcHRyKSB7CiAgIGludCByZXQ7CiAgIGlmICghY3R4LT5jaXBoZXIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVWUF9DSVBIRVJfQ1RYX2N0cmwsIENJUEhFUl9SX05PX0NJUEhFUl9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIWN0eC0+Y2lwaGVyLT5jdHJsKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFVlBfQ0lQSEVSX0NUWF9jdHJsLCBDSVBIRVJfUl9DVFJMX05PVF9JTVBMRU1FTlRFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9DVFJMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICByZXQgPSBjdHgtPmNpcGhlci0+Y3RybChjdHgsIGNvbW1hbmQsIGFyZywgcHRyKTsKICAgaWYgKHJldCA9PSAtMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfY3RybCwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9DVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NzIsOCArNTc0LDcgQEAKICAgfQogCiAgIGlmIChrZXlfbGVuID09IDAgfHwgIShjLT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfVkFSSUFCTEVfTEVOR1RIKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfSU5WQUxJRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjMwLDcgKzYzMSw3IEBACiAgICAgcmV0dXJuIEVWUF9yYzQoKTsKICAgfSBlbHNlIGlmIChPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgImRlcy1jYmMiKSA9PSAwKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7Ci0gIH0gZWxzZSBpZiAoT1BFTlNTTF9zdHJjYXNlY21wKG5hbWUsICIzZGVzLWNiYyIpID09IDAgfHwKKyAgfSBlbHNlIGlmIChPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgImRlcy1lZGUzLWNiYyIpID09IDAgfHwKICAgICAgICAgICAgICBPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgIjNkZXMiKSA9PSAwKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfZWRlM19jYmMoKTsKICAgfSBlbHNlIGlmIChPUEVOU1NMX3N0cmNhc2VjbXAobmFtZSwgImFlcy0xMjgtY2JjIikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvY2lwaGVyX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYwppbmRleCA5N2E4NGUwLi41ZjA0MTc4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9jaXBoZXJfdGVzdC5jYwpAQCAtNjksNiArNjksMTIgQEAKIHN0YXRpYyBjb25zdCBFVlBfQ0lQSEVSICpHZXRDaXBoZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgaWYgKG5hbWUgPT0gIkRFUy1DQkMiKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7CisgIH0gZWxzZSBpZiAobmFtZSA9PSAiREVTLUVDQiIpIHsKKyAgICByZXR1cm4gRVZQX2Rlc19lY2IoKTsKKyAgfSBlbHNlIGlmIChuYW1lID09ICJERVMtRURFIikgeworICAgIHJldHVybiBFVlBfZGVzX2VkZSgpOworICB9IGVsc2UgaWYgKG5hbWUgPT0gIkRFUy1FREUtQ0JDIikgeworICAgIHJldHVybiBFVlBfZGVzX2VkZV9jYmMoKTsKICAgfSBlbHNlIGlmIChuYW1lID09ICJERVMtRURFMy1DQkMiKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfZWRlM19jYmMoKTsKICAgfSBlbHNlIGlmIChuYW1lID09ICJSQzQiKSB7CkBAIC0xMDQsNiArMTEwLDcgQEAKIHN0YXRpYyBib29sIFRlc3RPcGVyYXRpb24oRmlsZVRlc3QgKnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJml2LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGxhaW50ZXh0LApAQCAtMTYwLDExICsxNjcsMjkgQEAKICAgICAgICghYWFkLmVtcHR5KCkgJiYKICAgICAgICAhRVZQX0NpcGhlclVwZGF0ZShjdHguZ2V0KCksIG51bGxwdHIsICZ1bnVzZWQsIGJzc2w6OnZlY3Rvcl9kYXRhKCZhYWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFhZC5zaXplKCkpKSB8fAotICAgICAgIUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKGN0eC5nZXQoKSwgMCkgfHwKLSAgICAgICghaW4tPmVtcHR5KCkgJiYKLSAgICAgICAhRVZQX0NpcGhlclVwZGF0ZShjdHguZ2V0KCksIGJzc2w6OnZlY3Rvcl9kYXRhKCZyZXN1bHQpLCAmcmVzdWx0X2xlbjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoaW4pLCBpbi0+c2l6ZSgpKSkgfHwKLSAgICAgICFFVlBfQ2lwaGVyRmluYWxfZXgoY3R4LmdldCgpLCBic3NsOjp2ZWN0b3JfZGF0YSgmcmVzdWx0KSArIHJlc3VsdF9sZW4xLAorICAgICAgIUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKGN0eC5nZXQoKSwgMCkpIHsKKyAgICB0LT5QcmludExpbmUoIk9wZXJhdGlvbiBmYWlsZWQuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdHJlYW1pbmcpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLT5zaXplKCk7IGkrKykgeworICAgICAgdWludDhfdCBjID0gKCppbilbaV07CisgICAgICBpbnQgbGVuOworICAgICAgaWYgKCFFVlBfQ2lwaGVyVXBkYXRlKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCkgKyByZXN1bHRfbGVuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCAmYywgMSkpIHsKKyAgICAgICAgdC0+UHJpbnRMaW5lKCJPcGVyYXRpb24gZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXN1bHRfbGVuMSArPSBsZW47CisgICAgfQorICB9IGVsc2UgaWYgKCFpbi0+ZW1wdHkoKSAmJgorICAgICAgICAgICAgICFFVlBfQ2lwaGVyVXBkYXRlKGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9sZW4xLCBic3NsOjp2ZWN0b3JfZGF0YShpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPnNpemUoKSkpIHsKKyAgICB0LT5QcmludExpbmUoIk9wZXJhdGlvbiBmYWlsZWQuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghRVZQX0NpcGhlckZpbmFsX2V4KGN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJnJlc3VsdCkgKyByZXN1bHRfbGVuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdF9sZW4yKSkgewogICAgIHQtPlByaW50TGluZSgiT3BlcmF0aW9uIGZhaWxlZC4iKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yMzYsMTUgKzI2MSwyMSBAQAogICB9CiAKICAgLy8gQnkgZGVmYXVsdCwgYm90aCBkaXJlY3Rpb25zIGFyZSBydW4sIHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSBvcGVyYXRpb24uCi0gIGlmIChvcGVyYXRpb24gIT0ga0RlY3J5cHQgJiYKLSAgICAgICFUZXN0T3BlcmF0aW9uKHQsIGNpcGhlciwgdHJ1ZSAvKiBlbmNyeXB0ICovLCBrZXksIGl2LCBwbGFpbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBjaXBoZXJ0ZXh0LCBhYWQsIHRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7CisgIGlmIChvcGVyYXRpb24gIT0ga0RlY3J5cHQpIHsKKyAgICBpZiAoIVRlc3RPcGVyYXRpb24odCwgY2lwaGVyLCB0cnVlIC8qIGVuY3J5cHQgKi8sIGZhbHNlIC8qIHNpbmdsZS1zaG90ICovLAorICAgICAgICAgICAgICAgICAgICAgICBrZXksIGl2LCBwbGFpbnRleHQsIGNpcGhlcnRleHQsIGFhZCwgdGFnKSB8fAorICAgICAgICAhVGVzdE9wZXJhdGlvbih0LCBjaXBoZXIsIHRydWUgLyogZW5jcnlwdCAqLywgdHJ1ZSAvKiBzdHJlYW1pbmcgKi8sIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXYsIHBsYWludGV4dCwgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICB9Ci0gIGlmIChvcGVyYXRpb24gIT0ga0VuY3J5cHQgJiYKLSAgICAgICFUZXN0T3BlcmF0aW9uKHQsIGNpcGhlciwgZmFsc2UgLyogZGVjcnlwdCAqLywga2V5LCBpdiwgcGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOworICBpZiAob3BlcmF0aW9uICE9IGtFbmNyeXB0KSB7CisgICAgaWYgKCFUZXN0T3BlcmF0aW9uKHQsIGNpcGhlciwgZmFsc2UgLyogZGVjcnlwdCAqLywgZmFsc2UgLyogc2luZ2xlLXNob3QgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGtleSwgaXYsIHBsYWludGV4dCwgY2lwaGVydGV4dCwgYWFkLCB0YWcpIHx8CisgICAgICAgICFUZXN0T3BlcmF0aW9uKHQsIGNpcGhlciwgZmFsc2UgLyogZGVjcnlwdCAqLywgdHJ1ZSAvKiBzdHJlYW1pbmcgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGtleSwgaXYsIHBsYWludGV4dCwgY2lwaGVydGV4dCwgYWFkLCB0YWcpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICB9CiAKICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX2Flcy5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9hZXMuYwppbmRleCA0MWQwYWVjLi5lODkwNWY2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX2Flcy5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfYWVzLmMKQEAgLTY0LDcgKzY0LDcgQEAKICNpbmNsdWRlICIuLi9tb2Rlcy9pbnRlcm5hbC5oIgogCiAjaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkgfHwgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpCi0jaW5jbHVkZSAiLi4vYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAjZW5kaWYKIAogCkBAIC05OCw4ICs5OCw2IEBACiAjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmIFwKICAgICAoZGVmaW5lZChPUEVOU1NMX1g4Nl82NCkgfHwgZGVmaW5lZChPUEVOU1NMX1g4NikpCiAjZGVmaW5lIFZQQUVTCi1leHRlcm4gdW5zaWduZWQgaW50IE9QRU5TU0xfaWEzMmNhcF9QW107Ci0KIHN0YXRpYyBjaGFyIHZwYWVzX2NhcGFibGUodm9pZCkgewogICByZXR1cm4gKE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDEgPDwgKDQxIC0gMzIpKSkgIT0gMDsKIH0KQEAgLTExMyw3ICsxMTEsNiBAQAogCiAjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgXAogICAgIChkZWZpbmVkKE9QRU5TU0xfQVJNKSB8fCBkZWZpbmVkKE9QRU5TU0xfQUFSQ0g2NCkpCi0jaW5jbHVkZSAiLi4vYXJtX2FyY2guaCIKIAogI2lmIGRlZmluZWQoT1BFTlNTTF9BUk0pICYmIF9fQVJNX01BWF9BUkNIX18gPj0gNwogI2RlZmluZSBCU0FFUwpAQCAtMzM4LDcgKzMzNSw3IEBACiAgIH0KIAogICBpZiAocmV0IDwgMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVzX2luaXRfa2V5LCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzExLDcgKzcwOCw3IEBACiAgIH0gZWxzZSB7CiAgICAgaWYgKCFjdHgtPmVuY3J5cHQpIHsKICAgICAgIGlmIChnY3R4LT50YWdsZW4gPCAwIHx8Ci0gICAgICAgICAgIUNSWVBUT19nY20xMjhfZmluaXNoKCZnY3R4LT5nY20sIGN0eC0+YnVmLCBnY3R4LT50YWdsZW4pICE9IDApIHsKKyAgICAgICAgICAhQ1JZUFRPX2djbTEyOF9maW5pc2goJmdjdHgtPmdjbSwgY3R4LT5idWYsIGdjdHgtPnRhZ2xlbikpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogICAgICAgZ2N0eC0+aXZfc2V0ID0gMDsKQEAgLTg1Myw3ICs4NTAsNyBAQAogICB9CiAKICAgaWYgKHJldCA8IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlc25pX2luaXRfa2V5LCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTA2Niw3ICsxMDYzLDcgQEAKICAgY29uc3Qgc2l6ZV90IGtleV9iaXRzID0ga2V5X2xlbiAqIDg7CiAKICAgaWYgKGtleV9iaXRzICE9IDEyOCAmJiBrZXlfYml0cyAhPSAyNTYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2djbV9pbml0LCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7IC8qIEVWUF9BRUFEX0NUWF9pbml0IHNob3VsZCBjYXRjaCB0aGlzLiAqLwogICB9CiAKQEAgLTEwNzUsNyArMTA3Miw3IEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IEVWUF9BRUFEX0FFU19HQ01fVEFHX0xFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfZ2NtX2luaXQsIENJUEhFUl9SX1RBR19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVEFHX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTEwOCwxMiArMTEwNSwxMiBAQAogICBHQ00xMjhfQ09OVEVYVCBnY207CiAKICAgaWYgKGluX2xlbiArIGdjbV9jdHgtPnRhZ19sZW4gPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2djbV9zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIGdjbV9jdHgtPnRhZ19sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2djbV9zZWFsLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTExNTIsMTQgKzExNDksMTQgQEAKICAgR0NNMTI4X0NPTlRFWFQgZ2NtOwogCiAgIGlmIChpbl9sZW4gPCBnY21fY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19nY21fb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGxhaW50ZXh0X2xlbiA9IGluX2xlbiAtIGdjbV9jdHgtPnRhZ19sZW47CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgcGxhaW50ZXh0X2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfZ2NtX29wZW4sIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTE4NSw3ICsxMTgyLDcgQEAKIAogICBDUllQVE9fZ2NtMTI4X3RhZygmZ2NtLCB0YWcsIGdjbV9jdHgtPnRhZ19sZW4pOwogICBpZiAoQ1JZUFRPX21lbWNtcCh0YWcsIGluICsgcGxhaW50ZXh0X2xlbiwgZ2NtX2N0eC0+dGFnX2xlbikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfZ2NtX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMjM5LDcgKzEyMzYsNyBAQAogICBjb25zdCBzaXplX3Qga2V5X2JpdHMgPSBrZXlfbGVuICogODsKIAogICBpZiAoa2V5X2JpdHMgIT0gMTI4ICYmIGtleV9iaXRzICE9IDI1NikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfaW5pdCwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOwogICAgIHJldHVybiAwOyAvKiBFVlBfQUVBRF9DVFhfaW5pdCBzaG91bGQgY2F0Y2ggdGhpcy4gKi8KICAgfQogCkBAIC0xMjQ4LDE0ICsxMjQ1LDEzIEBACiAgIH0KIAogICBpZiAodGFnX2xlbiAhPSA4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX1RBR19TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX1RBR19TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGt3X2N0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWVhZF9hZXNfa2V5X3dyYXBfY3R4KSk7CiAgIGlmIChrd19jdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEyOTMsOCArMTI4OSw3IEBACiAgIHVpbnQ4X3QgQVtBRVNfQkxPQ0tfU0laRV07CiAKICAgaWYgKGFkX2xlbiAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX0FEX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfQURfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTMwNCwxNCArMTI5OSwxMiBAQAogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSA4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoaW5fbGVuICUgOCAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX0lOUFVUX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfSU5QVVRfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTMyMCwzMiArMTMxMywyOSBAQAogICAgKiBjb25zZXJ2YXRpdmVseSBjYXAgaXQgdG8gMl4zMi0xNiB0byBzdG9wIDMyLWJpdCBwbGF0Zm9ybXMgY29tcGxhaW5pbmcgdGhhdAogICAgKiBhIGNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUuICovCiAgIGlmIChpbl9sZW4gPiAweGZmZmZmZmYwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIG4gPSBpbl9sZW4gLyA4OwogCiAgIGlmIChuIDwgMikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfc2VhbCwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9JTlBVVF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX0lOUFVUX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiArIDggPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX3NlYWwsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfc2VhbCwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKEFFU19zZXRfZW5jcnlwdF9rZXkoa3dfY3R4LT5rZXksIGt3X2N0eC0+a2V5X2JpdHMsICZrcy5rcykgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzg4LDggKzEzNzgsNyBAQAogICB1aW50OF90IEFbQUVTX0JMT0NLX1NJWkVdOwogCiAgIGlmIChhZF9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9BRF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEzOTksMTQgKzEzODgsMTIgQEAKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9OT05DRV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiAlIDggIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9VTlNVUFBPUlRFRF9JTlBVVF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1VOU1VQUE9SVEVEX0lOUFVUX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE0MTUsMjYgKzE0MDIsMjQgQEAKICAgICogY29uc2VydmF0aXZlbHkgY2FwIGl0IHRvIDJeMzItOCB0byBzdG9wIDMyLWJpdCBwbGF0Zm9ybXMgY29tcGxhaW5pbmcgdGhhdAogICAgKiBhIGNvbXBhcmlzb24gaXMgYWx3YXlzIHRydWUuICovCiAgIGlmIChpbl9sZW4gPiAweGZmZmZmZmY4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gPCAyNCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgbiA9IChpbl9sZW4gLyA4KSAtIDE7CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuIC0gOCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfa2V5X3dyYXBfb3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKEFFU19zZXRfZGVjcnlwdF9rZXkoa3dfY3R4LT5rZXksIGt3X2N0eC0+a2V5X2JpdHMsICZrcy5rcykgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2Flc19rZXlfd3JhcF9vcGVuLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNDU3LDcgKzE0NDIsNyBAQAogICB9CiAKICAgaWYgKENSWVBUT19tZW1jbXAoQSwgbm9uY2UsIDgpICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2tleV93cmFwX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNTQxLDE1ICsxNTI2LDEzIEBACiAgIHN0YXRpYyBjb25zdCBzaXplX3QgaG1hY19rZXlfbGVuID0gMzI7CiAKICAgaWYgKGtleV9sZW4gPCBobWFjX2tleV9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsgLyogRVZQX0FFQURfQ1RYX2luaXQgc2hvdWxkIGNhdGNoIHRoaXMuICovCiAgIH0KIAogICBjb25zdCBzaXplX3QgYWVzX2tleV9sZW4gPSBrZXlfbGVuIC0gaG1hY19rZXlfbGVuOwogICBpZiAoYWVzX2tleV9sZW4gIT0gMTYgJiYgYWVzX2tleV9sZW4gIT0gMzIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsgLyogRVZQX0FFQURfQ1RYX2luaXQgc2hvdWxkIGNhdGNoIHRoaXMuICovCiAgIH0KIApAQCAtMTU1OCwxNSArMTU0MSwxMyBAQAogICB9CiAKICAgaWYgKHRhZ19sZW4gPiBFVlBfQUVBRF9BRVNfQ1RSX0hNQUNfU0hBMjU2X1RBR19MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1RBR19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVEFHX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBhZXNfY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfY3R4KSk7CiAgIGlmIChhZXNfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNjY2LDIwICsxNjQ3LDE3IEBACiAgIGlmIChpbl9sZW4gKyBhZXNfY3R4LT50YWdfbGVuIDwgaW5fbGVuIHx8CiAgICAgICAvKiBUaGlzIGlucHV0IGlzIHNvIGxhcmdlIGl0IHdvdWxkIG92ZXJmbG93IHRoZSAzMi1iaXQgYmxvY2sgY291bnRlci4gKi8KICAgICAgIGluX2xlbl82NCA+PSAoT1BFTlNTTF9VNjQoMSkgPDwgMzIpICogQUVTX0JMT0NLX1NJWkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgYWVzX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X3NlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfQUVTX0NUUl9ITUFDX1NIQTI1Nl9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTcwMywyMiArMTY4MSwxOSBAQAogICBzaXplX3QgcGxhaW50ZXh0X2xlbjsKIAogICBpZiAoaW5fbGVuIDwgYWVzX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgcGxhaW50ZXh0X2xlbiA9IGluX2xlbiAtIGFlc19jdHgtPnRhZ19sZW47CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgcGxhaW50ZXh0X2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9hZXNfY3RyX2htYWNfc2hhMjU2X29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfQUVTX0NUUl9ITUFDX1NIQTI1Nl9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9vcGVuLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX1VOU1VQUE9SVEVEX05PTkNFX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTcyNyw4ICsxNzAyLDcgQEAKICAgICAgICAgICAgICAgICAgJmFlc19jdHgtPm91dGVyX2luaXRfc3RhdGUsIGFkLCBhZF9sZW4sIG5vbmNlLCBpbiwKICAgICAgICAgICAgICAgICAgcGxhaW50ZXh0X2xlbik7CiAgIGlmIChDUllQVE9fbWVtY21wKGhtYWNfcmVzdWx0LCBpbiArIHBsYWludGV4dF9sZW4sIGFlc19jdHgtPnRhZ19sZW4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfYWVzX2N0cl9obWFjX3NoYTI1Nl9vcGVuLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX2NoYWNoYTIwcG9seTEzMDUuYyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCmluZGV4IGViZjAwODguLjlkZGExYjAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfY2hhY2hhMjBwb2x5MTMwNS5jCkBAIC00Miw3ICs0Miw3IEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IFBPTFkxMzA1X1RBR19MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfaW5pdCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTA3LDIzICsxMDcsMjIgQEAKICAgICogQ2FzdGluZyB0byB1aW50NjRfdCBpbnNpZGUgdGhlIGNvbmRpdGlvbmFsIGlzIG5vdCBzdWZmaWNpZW50IHRvIHN0b3AKICAgICogdGhlIHdhcm5pbmcuICovCiAgIGlmIChpbl9sZW5fNjQgPj0gKDF1bGwgPDwgMzIpICogNjQgLSA2NCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gKyBjMjBfY3R4LT50YWdfbGVuIDwgaW5fbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X3NlYWwsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG1heF9vdXRfbGVuIDwgaW5fbGVuICsgYzIwX2N0eC0+dGFnX2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsLAotICAgICAgICAgICAgICAgICAgICAgIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IENIQUNIQTIwX05PTkNFX0xFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9zZWFsLCBDSVBIRVJfUl9JVl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNTYsNyArMTU1LDcgQEAKICAgY29uc3QgdWludDY0X3QgaW5fbGVuXzY0ID0gaW5fbGVuOwogCiAgIGlmIChpbl9sZW4gPCBjMjBfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNjgsMjAgKzE2NywxOSBAQAogICAgKiBDYXN0aW5nIHRvIHVpbnQ2NF90IGluc2lkZSB0aGUgY29uZGl0aW9uYWwgaXMgbm90IHN1ZmZpY2llbnQgdG8gc3RvcAogICAgKiB0aGUgd2FybmluZy4gKi8KICAgaWYgKGluX2xlbl82NCA+PSAoMXVsbCA8PCAzMikgKiA2NCAtIDY0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X29wZW4sIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSBDSEFDSEEyMF9OT05DRV9MRU4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbiwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBwbGFpbnRleHRfbGVuID0gaW5fbGVuIC0gYzIwX2N0eC0+dGFnX2xlbjsKIAogICBpZiAobWF4X291dF9sZW4gPCBwbGFpbnRleHRfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X29wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xOTUsNyArMTkzLDcgQEAKICAgQ1JZUFRPX3BvbHkxMzA1X2ZpbmlzaCgmcG9seTEzMDUsIG1hYyk7CiAKICAgaWYgKENSWVBUT19tZW1jbXAobWFjLCBpbiArIHBsYWludGV4dF9sZW4sIGMyMF9jdHgtPnRhZ19sZW4pICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfZGVzLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX2Rlcy5jCmluZGV4IDc0ZTFmY2UuLmIxZDMxMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfZGVzLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9kZXMuYwpAQCAtOTYsNiArOTYsMzEgQEAKIGNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2JjKHZvaWQpIHsgcmV0dXJuICZkZXNfY2JjOyB9CiAKIAorc3RhdGljIGludCBkZXNfZWNiX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fbGVuKSB7CisgIGlmIChpbl9sZW4gPCBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgeworICAgIHJldHVybiAxOworICB9CisgIGluX2xlbiAtPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKworICBFVlBfREVTX0tFWSAqZGF0ID0gKEVWUF9ERVNfS0VZICopIGN0eC0+Y2lwaGVyX2RhdGE7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDw9IGluX2xlbjsgaSArPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgeworICAgIERFU19lY2JfZW5jcnlwdCgoREVTX2NibG9jayAqKSAoaW4gKyBpKSwgKERFU19jYmxvY2sgKikgKG91dCArIGkpLAorICAgICAgICAgICAgICAgICAgICAmZGF0LT5rcy5rcywgY3R4LT5lbmNyeXB0KTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgZGVzX2VjYiA9IHsKKyAgICBOSURfZGVzX2VjYiwgICAgICAgICA4IC8qIGJsb2NrX3NpemUgKi8sICA4IC8qIGtleV9zaXplICovLAorICAgIDAgLyogaXZfbGVuICovLCAgICAgIHNpemVvZihFVlBfREVTX0tFWSksIEVWUF9DSVBIX0VDQl9NT0RFLAorICAgIE5VTEwgLyogYXBwX2RhdGEgKi8sIGRlc19pbml0X2tleSwgICAgICAgIGRlc19lY2JfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqLywgfTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lY2Iodm9pZCkgeyByZXR1cm4gJmRlc19lY2I7IH0KKworCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHVuaW9uIHsKICAgICBkb3VibGUgYWxpZ247CkBAIC0xMjYsMTAgKzE1MSw1NyBAQAogICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgZGVzM19jYmMgPSB7Ci0gICAgTklEX2Rlc19jYmMsICAgICAgICAgOCAvKiBibG9ja19zaXplICovLCAgMjQgLyoga2V5X3NpemUgKi8sCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBkZXNfZWRlM19jYmMgPSB7CisgICAgTklEX2Rlc19lZGUzX2NiYywgICAgOCAvKiBibG9ja19zaXplICovLCAgMjQgLyoga2V5X3NpemUgKi8sCiAgICAgOCAvKiBpdl9sZW4gKi8sICAgICAgc2l6ZW9mKERFU19FREVfS0VZKSwgRVZQX0NJUEhfQ0JDX01PREUsCiAgICAgTlVMTCAvKiBhcHBfZGF0YSAqLywgZGVzX2VkZTNfaW5pdF9rZXksICAgZGVzX2VkZTNfY2JjX2NpcGhlciwKICAgICBOVUxMIC8qIGNsZWFudXAgKi8sICBOVUxMIC8qIGN0cmwgKi8sIH07CiAKLWNvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jYmModm9pZCkgeyByZXR1cm4gJmRlczNfY2JjOyB9Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2JjKHZvaWQpIHsgcmV0dXJuICZkZXNfZWRlM19jYmM7IH0KKworCitzdGF0aWMgaW50IGRlc19lZGVfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwgaW50IGVuYykgeworICBERVNfY2Jsb2NrICpkZXNrZXkgPSAoREVTX2NibG9jayAqKSBrZXk7CisgIERFU19FREVfS0VZICpkYXQgPSAoREVTX0VERV9LRVkgKikgY3R4LT5jaXBoZXJfZGF0YTsKKworICBERVNfc2V0X2tleSgmZGVza2V5WzBdLCAmZGF0LT5rcy5rc1swXSk7CisgIERFU19zZXRfa2V5KCZkZXNrZXlbMV0sICZkYXQtPmtzLmtzWzFdKTsKKyAgREVTX3NldF9rZXkoJmRlc2tleVswXSwgJmRhdC0+a3Mua3NbMl0pOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBkZXNfZWRlX2NiYyA9IHsKKyAgICBOSURfZGVzX2VkZV9jYmMsICAgICA4IC8qIGJsb2NrX3NpemUgKi8sICAxNiAvKiBrZXlfc2l6ZSAqLywKKyAgICA4IC8qIGl2X2xlbiAqLywgICAgICBzaXplb2YoREVTX0VERV9LRVkpLCBFVlBfQ0lQSF9DQkNfTU9ERSwKKyAgICBOVUxMIC8qIGFwcF9kYXRhICovLCBkZXNfZWRlX2luaXRfa2V5ICwgICBkZXNfZWRlM19jYmNfY2lwaGVyLAorICAgIE5VTEwgLyogY2xlYW51cCAqLywgIE5VTEwgLyogY3RybCAqLywgfTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGVfY2JjKHZvaWQpIHsgcmV0dXJuICZkZXNfZWRlX2NiYzsgfQorCisKK3N0YXRpYyBpbnQgZGVzX2VkZV9lY2JfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7CisgIGlmIChpbl9sZW4gPCBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgeworICAgIHJldHVybiAxOworICB9CisgIGluX2xlbiAtPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKworICBERVNfRURFX0tFWSAqZGF0ID0gKERFU19FREVfS0VZICopIGN0eC0+Y2lwaGVyX2RhdGE7CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDw9IGluX2xlbjsgaSArPSBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSkgeworICAgIERFU19lY2IzX2VuY3J5cHQoKERFU19jYmxvY2sgKikgKGluICsgaSksIChERVNfY2Jsb2NrICopIChvdXQgKyBpKSwKKyAgICAgICAgICAgICAgICAgICAgICZkYXQtPmtzLmtzWzBdLCAmZGF0LT5rcy5rc1sxXSwgJmRhdC0+a3Mua3NbMl0sCisgICAgICAgICAgICAgICAgICAgICBjdHgtPmVuY3J5cHQpOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBkZXNfZWRlX2VjYiA9IHsKKyAgICBOSURfZGVzX2VkZV9jYmMsICAgICA4IC8qIGJsb2NrX3NpemUgKi8sICAxNiAvKiBrZXlfc2l6ZSAqLywKKyAgICAwIC8qIGl2X2xlbiAqLywgICAgICBzaXplb2YoREVTX0VERV9LRVkpLCBFVlBfQ0lQSF9FQ0JfTU9ERSwKKyAgICBOVUxMIC8qIGFwcF9kYXRhICovLCBkZXNfZWRlX2luaXRfa2V5ICwgICBkZXNfZWRlX2VjYl9jaXBoZXIsCisgICAgTlVMTCAvKiBjbGVhbnVwICovLCAgTlVMTCAvKiBjdHJsICovLCB9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZSh2b2lkKSB7IHJldHVybiAmZGVzX2VkZV9lY2I7IH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmMyLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3JjMi5jCmluZGV4IGM5MGFiOTMuLjhjYTdiYmEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmMyLmMKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9yYzIuYwpAQCAtMzk1LDEzICszOTUsMTggQEAKICAgICBjYXNlIEVWUF9DVFJMX0lOSVQ6CiAgICAgICBrZXktPmtleV9iaXRzID0gRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpICogODsKICAgICAgIHJldHVybiAxOworICAgIGNhc2UgRVZQX0NUUkxfU0VUX1JDMl9LRVlfQklUUzoKKyAgICAgIC8qIFNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IGxhdGVyIGNhbGwgdG8gfEVWUF9DVFJMX0lOSVR8LCBidXQKKyAgICAgICAqIHBlb3BsZSBjYWxsIGl0LCBzbyBpdCBtYXkgYXMgd2VsbCB3b3JrLiAqLworICAgICAga2V5LT5rZXlfYml0cyA9IGFyZzsKKyAgICAgIHJldHVybiAxOwogCiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiAtMTsKICAgfQogfQogCi1zdGF0aWMgY29uc3QgRVZQX0NJUEhFUiByYzJfNDBfY2JjX2NpcGhlciA9IHsKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIHJjMl80MF9jYmMgPSB7CiAgICAgTklEX3JjMl80MF9jYmMsCiAgICAgOCAvKiBibG9jayBzaXplICovLAogICAgIDUgLyogNDAgYml0ICovLApAQCAtNDE2LDUgKzQyMSwyMyBAQAogfTsKIAogY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl80MF9jYmModm9pZCkgewotICByZXR1cm4gJnJjMl80MF9jYmNfY2lwaGVyOworICByZXR1cm4gJnJjMl80MF9jYmM7Cit9CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIHJjMl9jYmMgPSB7CisgICAgTklEX3JjMl9jYmMsCisgICAgOCAvKiBibG9jayBzaXplICovLAorICAgIDE2IC8qIDEyOCBiaXQgKi8sCisgICAgOCAvKiBpdiBsZW4gKi8sCisgICAgc2l6ZW9mKEVWUF9SQzJfS0VZKSwKKyAgICBFVlBfQ0lQSF9DQkNfTU9ERSB8IEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCB8IEVWUF9DSVBIX0NUUkxfSU5JVCwKKyAgICBOVUxMIC8qIGFwcF9kYXRhICovLAorICAgIHJjMl9pbml0X2tleSwKKyAgICByYzJfY2JjX2NpcGhlciwKKyAgICBOVUxMLAorICAgIHJjMl9jdHJsLAorfTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9jYmModm9pZCkgeworICByZXR1cm4gJnJjMl9jYmM7CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX3JjNC5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV9yYzQuYwppbmRleCA4MGRlYTM2Li5lMDViOWZkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3JjNC5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfcmM0LmMKQEAgLTExNSwyMCArMTE1LDIwIEBACiAgIH0KIAogICBpZiAodGFnX2xlbiA+IE1ENV9ESUdFU1RfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX2luaXQsIENJUEhFUl9SX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgLyogVGhlIGtleXMgY29uc2lzdHMgb2YgfE1ENV9ESUdFU1RfTEVOR1RIfCBieXRlcyBvZiBITUFDKE1ENSkga2V5IGZvbGxvd2VkCiAgICAqIGJ5IHNvbWUgbnVtYmVyIG9mIGJ5dGVzIG9mIFJDNCBrZXkuICovCiAgIGlmIChrZXlfbGVuIDw9IE1ENV9ESUdFU1RfTEVOR1RIKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX2luaXQsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9LRVlfTEVOR1RIKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHJjNF9jdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGFlYWRfcmM0X21kNV90bHNfY3R4KSk7CiAgIGlmIChyYzRfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIG1lbXNldChyYzRfY3R4LCAwLCBzaXplb2Yoc3RydWN0IGFlYWRfcmM0X21kNV90bHNfY3R4KSk7CkBAIC0xODUsMjIgKzE4NSwyMiBAQAogICB1aW50OF90IGRpZ2VzdFtNRDVfRElHRVNUX0xFTkdUSF07CiAKICAgaWYgKGluX2xlbiArIHJjNF9jdHgtPnRhZ19sZW4gPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfc2VhbCwgQ0lQSEVSX1JfSVZfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4gKyByYzRfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX3NlYWwsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfcmM0X21kNV90bHNfc2VhbCwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX1RPT19MQVJHRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjg4LDIxICsyODgsMjEgQEAKICAgdWludDhfdCBkaWdlc3RbTUQ1X0RJR0VTVF9MRU5HVEhdOwogCiAgIGlmIChpbl9sZW4gPCByYzRfY3R4LT50YWdfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHBsYWludGV4dF9sZW4gPSBpbl9sZW4gLSByYzRfY3R4LT50YWdfbGVuOwogCiAgIGlmIChub25jZV9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9yYzRfbWQ1X3Rsc19vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbikgewogICAgIC8qIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGVyIHByb3ZpZGUgc3BhY2UgZm9yIHRoZSBNQUMsIGV2ZW4gdGhvdWdoIGl0CiAgICAgICogd2lsbCBhbHdheXMgYmUgcmVtb3ZlZCBvbiByZXR1cm4uICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3JjNF9tZDVfdGxzX29wZW4sIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzY2LDcgKzM2Niw3IEBACiAgIE1ENV9GaW5hbChkaWdlc3QsICZtZCk7CiAKICAgaWYgKENSWVBUT19tZW1jbXAob3V0ICsgcGxhaW50ZXh0X2xlbiwgZGlnZXN0LCByYzRfY3R4LT50YWdfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9yYzRfbWQ1X3Rsc19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jaXBoZXIvZV9zc2wzLmMgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYwppbmRleCAxMDMxZDliLi4zODljNTJmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYworKysgYi9zcmMvY3J5cHRvL2NpcGhlci9lX3NzbDMuYwpAQCAtODUsMTIgKzg1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgRVZQX01EICptZCkgewogICBpZiAodGFnX2xlbiAhPSBFVlBfQUVBRF9ERUZBVUxUX1RBR19MRU5HVEggJiYKICAgICAgIHRhZ19sZW4gIT0gRVZQX01EX3NpemUobWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfaW5pdCwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGtleV9sZW4gIT0gRVZQX0FFQURfa2V5X2xlbmd0aChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfaW5pdCwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0tFWV9MRU5HVEgpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAgIEFFQURfU1NMM19DVFggKnNzbDNfY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFFQURfU1NMM19DVFgpKTsKICAgaWYgKHNzbDNfY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19pbml0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmc3NsM19jdHgtPmNpcGhlcl9jdHgpOwpAQCAtMTMzLDI5ICsxMzMsMjkgQEAKIAogICBpZiAoIXNzbDNfY3R4LT5jaXBoZXJfY3R4LmVuY3J5cHQpIHsKICAgICAvKiBVbmxpa2UgYSBub3JtYWwgQUVBRCwgYW4gU1NMMyBBRUFEIG1heSBvbmx5IGJlIHVzZWQgaW4gb25lIGRpcmVjdGlvbi4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19zZWFsLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoaW5fbGVuICsgRVZQX0FFQURfbWF4X292ZXJoZWFkKGN0eC0+YWVhZCkgPCBpbl9sZW4gfHwKICAgICAgIGluX2xlbiA+IElOVF9NQVgpIHsKICAgICAvKiBFVlBfQ0lQSEVSIHRha2VzIGludCBhcyBpbnB1dC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfc2VhbCwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX3NlYWwsIENJUEhFUl9SX0lWX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JVl9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGFkX2xlbiAhPSAxMSAtIDIgLyogbGVuZ3RoIGJ5dGVzICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfc2VhbCwgQ0lQSEVSX1JfSU5WQUxJRF9BRF9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfQURfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjE3LDM2ICsyMTcsMzYgQEAKIAogICBpZiAoc3NsM19jdHgtPmNpcGhlcl9jdHguZW5jcnlwdCkgewogICAgIC8qIFVubGlrZSBhIG5vcm1hbCBBRUFELCBhbiBTU0wzIEFFQUQgbWF5IG9ubHkgYmUgdXNlZCBpbiBvbmUgZGlyZWN0aW9uLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHNpemVfdCBtYWNfbGVuID0gRVZQX01EX0NUWF9zaXplKCZzc2wzX2N0eC0+bWRfY3R4KTsKICAgaWYgKGluX2xlbiA8IG1hY19sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4pIHsKICAgICAvKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBwcm92aWRlIHNwYWNlIGZvciB0aGUgTUFDLCBldmVuIHRob3VnaCBpdAogICAgICAqIHdpbGwgYWx3YXlzIGJlIHJlbW92ZWQgb24gcmV0dXJuLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX29wZW4sIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobm9uY2VfbGVuICE9IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChhZF9sZW4gIT0gMTEgLSAyIC8qIGxlbmd0aCBieXRlcyAqLykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF9zc2wzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfQURfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGluX2xlbiA+IElOVF9NQVgpIHsKICAgICAvKiBFVlBfQ0lQSEVSIHRha2VzIGludCBhcyBpbnB1dC4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNzAsMTIgKzI3MCwxMiBAQAogICBpZiAoRVZQX0NJUEhFUl9DVFhfbW9kZSgmc3NsM19jdHgtPmNpcGhlcl9jdHgpID09IEVWUF9DSVBIX0NCQ19NT0RFKSB7CiAgICAgdW5zaWduZWQgcGFkZGluZ19sZW5ndGggPSBvdXRbdG90YWwgLSAxXTsKICAgICBpZiAodG90YWwgPCBwYWRkaW5nX2xlbmd0aCArIDEgKyBtYWNfbGVuKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfc3NsM19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICAvKiBUaGUgcGFkZGluZyBtdXN0IGJlIG1pbmltYWwuICovCiAgICAgaWYgKHBhZGRpbmdfbGVuZ3RoICsgMSA+IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoJnNzbDNfY3R4LT5jaXBoZXJfY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgZGF0YV9sZW4gPSB0b3RhbCAtIHBhZGRpbmdfbGVuZ3RoIC0gMSAtIG1hY19sZW47CkBAIC0yODksNyArMjg5LDcgQEAKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoQ1JZUFRPX21lbWNtcCgmb3V0W2RhdGFfbGVuXSwgbWFjLCBtYWNfbGVuKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3NzbDNfb3BlbiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM0MCw2ICszNDAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9zaGExKCkpOwogfQogCitzdGF0aWMgaW50IGFlYWRfbnVsbF9zaGExX3NzbDNfaW5pdChFVlBfQUVBRF9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9sZW4sIHNpemVfdCB0YWdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBldnBfYWVhZF9kaXJlY3Rpb25fdCBkaXIpIHsKKyAgcmV0dXJuIGFlYWRfc3NsM19pbml0KGN0eCwga2V5LCBrZXlfbGVuLCB0YWdfbGVuLCBkaXIsIEVWUF9lbmNfbnVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgRVZQX3NoYTEoKSk7Cit9CisKIHN0YXRpYyBjb25zdCBFVlBfQUVBRCBhZWFkX3JjNF9tZDVfc3NsMyA9IHsKICAgICBNRDVfRElHRVNUX0xFTkdUSCArIDE2LCAvKiBrZXkgbGVuIChNRDUgKyBSQzQpICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogbm9uY2UgbGVuICovCkBAIC00MDUsNiArNDEyLDE5IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRfcmM0X3N0YXRlICovCiB9OwogCitzdGF0aWMgY29uc3QgRVZQX0FFQUQgYWVhZF9udWxsX3NoYTFfc3NsMyA9IHsKKyAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyoga2V5IGxlbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KKyAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyogb3ZlcmhlYWQgKFNIQTEpICovCisgICAgU0hBX0RJR0VTVF9MRU5HVEgsICAgICAgICAgIC8qIG1heCB0YWcgbGVuZ3RoICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgICBhZWFkX251bGxfc2hhMV9zc2wzX2luaXQsCisgICAgYWVhZF9zc2wzX2NsZWFudXAsCisgICAgYWVhZF9zc2wzX3NlYWwsCisgICAgYWVhZF9zc2wzX29wZW4sCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldF9yYzRfc3RhdGUgKi8KK307CisKIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9yYzRfbWQ1X3NzbDModm9pZCkgeyByZXR1cm4gJmFlYWRfcmM0X21kNV9zc2wzOyB9CiAKIGNvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9yYzRfc2hhMV9zc2wzKHZvaWQpIHsgcmV0dXJuICZhZWFkX3JjNF9zaGExX3NzbDM7IH0KQEAgLTQyMCwzICs0NDAsNSBAQAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3NzbDModm9pZCkgewogICByZXR1cm4gJmFlYWRfZGVzX2VkZTNfY2JjX3NoYTFfc3NsMzsKIH0KKworY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX251bGxfc2hhMV9zc2wzKHZvaWQpIHsgcmV0dXJuICZhZWFkX251bGxfc2hhMV9zc2wzOyB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci9lX3Rscy5jIGIvc3JjL2NyeXB0by9jaXBoZXIvZV90bHMuYwppbmRleCBiZWQwMmNiLi4yNzc4ODgxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NpcGhlci9lX3Rscy5jCisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL2VfdGxzLmMKQEAgLTU3LDEyICs1NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgaW1wbGljaXRfaXYpIHsKICAgaWYgKHRhZ19sZW4gIT0gRVZQX0FFQURfREVGQVVMVF9UQUdfTEVOR1RIICYmCiAgICAgICB0YWdfbGVuICE9IEVWUF9NRF9zaXplKG1kKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfaW5pdCwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVU5TVVBQT1JURURfVEFHX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGtleV9sZW4gIT0gRVZQX0FFQURfa2V5X2xlbmd0aChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19pbml0LCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfS0VZX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNzUsNyArNzUsNyBAQAogCiAgIEFFQURfVExTX0NUWCAqdGxzX2N0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihBRUFEX1RMU19DVFgpKTsKICAgaWYgKHRsc19jdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9DSVBIRVJfQ1RYX2luaXQoJnRsc19jdHgtPmNpcGhlcl9jdHgpOwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKICAgaWYgKCF0bHNfY3R4LT5jaXBoZXJfY3R4LmVuY3J5cHQpIHsKICAgICAvKiBVbmxpa2UgYSBub3JtYWwgQUVBRCwgYSBUTFMgQUVBRCBtYXkgb25seSBiZSB1c2VkIGluIG9uZSBkaXJlY3Rpb24uICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19zZWFsLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX09QRVJBVElPTik7CiAgICAgcmV0dXJuIDA7CiAKICAgfQpAQCAtMTE3LDIyICsxMTcsMjIgQEAKICAgaWYgKGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpIDwgaW5fbGVuIHx8CiAgICAgICBpbl9sZW4gPiBJTlRfTUFYKSB7CiAgICAgLyogRVZQX0NJUEhFUiB0YWtlcyBpbnQgYXMgaW5wdXQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19zZWFsLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0X2xlbiA8IGluX2xlbiArIEVWUF9BRUFEX21heF9vdmVyaGVhZChjdHgtPmFlYWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19zZWFsLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKG5vbmNlX2xlbiAhPSBFVlBfQUVBRF9ub25jZV9sZW5ndGgoY3R4LT5hZWFkKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfc2VhbCwgQ0lQSEVSX1JfSU5WQUxJRF9OT05DRV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfTk9OQ0VfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoYWRfbGVuICE9IDEzIC0gMiAvKiBsZW5ndGggYnl0ZXMgKi8pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX3NlYWwsIENJUEhFUl9SX0lOVkFMSURfQURfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIxNCwzNiArMjE0LDM2IEBACiAKICAgaWYgKHRsc19jdHgtPmNpcGhlcl9jdHguZW5jcnlwdCkgewogICAgIC8qIFVubGlrZSBhIG5vcm1hbCBBRUFELCBhIFRMUyBBRUFEIG1heSBvbmx5IGJlIHVzZWQgaW4gb25lIGRpcmVjdGlvbi4gKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICByZXR1cm4gMDsKIAogICB9CiAKICAgaWYgKGluX2xlbiA8IEhNQUNfc2l6ZSgmdGxzX2N0eC0+aG1hY19jdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dF9sZW4gPCBpbl9sZW4pIHsKICAgICAvKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxlciBwcm92aWRlIHNwYWNlIGZvciB0aGUgTUFDLCBldmVuIHRob3VnaCBpdAogICAgICAqIHdpbGwgYWx3YXlzIGJlIHJlbW92ZWQgb24gcmV0dXJuLiAqLwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgYWVhZF90bHNfb3BlbiwgQ0lQSEVSX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChub25jZV9sZW4gIT0gRVZQX0FFQURfbm9uY2VfbGVuZ3RoKGN0eC0+YWVhZCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0lOVkFMSURfTk9OQ0VfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBDSVBIRVJfUl9JTlZBTElEX05PTkNFX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGFkX2xlbiAhPSAxMyAtIDIgLyogbGVuZ3RoIGJ5dGVzICovKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9JTlZBTElEX0FEX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfSU5WQUxJRF9BRF9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChpbl9sZW4gPiBJTlRfTUFYKSB7CiAgICAgLyogRVZQX0NJUEhFUiB0YWtlcyBpbnQgYXMgaW5wdXQuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICAgICAgKHVuc2lnbmVkKUhNQUNfc2l6ZSgmdGxzX2N0eC0+aG1hY19jdHgpKTsKICAgICAvKiBQdWJsaWNseSBpbnZhbGlkLiBUaGlzIGNhbiBiZSByZWplY3RlZCBpbiBub24tY29uc3RhbnQgdGltZS4gKi8KICAgICBpZiAocGFkZGluZ19vayA9PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENJUEhFUiwgQ0lQSEVSX1JfQkFEX0RFQ1JZUFQpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMzEyLDcgKzMxMiw3IEBACiAgICAgaWYgKCFFVlBfdGxzX2NiY19kaWdlc3RfcmVjb3JkKHRsc19jdHgtPmhtYWNfY3R4Lm1kLCBtYWMsICZtYWNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF9maXhlZCwgb3V0LCBkYXRhX3BsdXNfbWFjX2xlbiwgdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsc19jdHgtPm1hY19rZXksIHRsc19jdHgtPm1hY19rZXlfbGVuKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ0lQSEVSLCBhZWFkX3Rsc19vcGVuLCBDSVBIRVJfUl9CQURfREVDUllQVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBhc3NlcnQobWFjX2xlbiA9PSBITUFDX3NpemUoJnRsc19jdHgtPmhtYWNfY3R4KSk7CkBAIC0zNDksNyArMzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICBnb29kICY9IGNvbnN0YW50X3RpbWVfZXFfaW50KHBhZGRpbmdfb2ssIDEpOwogICBpZiAoIWdvb2QpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIGFlYWRfdGxzX29wZW4sIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDSVBIRVIsIENJUEhFUl9SX0JBRF9ERUNSWVBUKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00NDQsNiArNDQ0LDEzIEBACiAgIHJldHVybiAxOwogfQogCitzdGF0aWMgaW50IGFlYWRfbnVsbF9zaGExX3Rsc19pbml0KEVWUF9BRUFEX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfbGVuLCBzaXplX3QgdGFnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBldnBfYWVhZF9kaXJlY3Rpb25fdCBkaXIpIHsKKyAgcmV0dXJuIGFlYWRfdGxzX2luaXQoY3R4LCBrZXksIGtleV9sZW4sIHRhZ19sZW4sIGRpciwgRVZQX2VuY19udWxsKCksCisgICAgICAgICAgICAgICAgICAgICAgIEVWUF9zaGExKCksIDEgLyogaW1wbGljaXQgaXYgKi8pOworfQorCiBzdGF0aWMgY29uc3QgRVZQX0FFQUQgYWVhZF9yYzRfc2hhMV90bHMgPSB7CiAgICAgU0hBX0RJR0VTVF9MRU5HVEggKyAxNiwgLyoga2V5IGxlbiAoU0hBMSArIFJDNCkgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KQEAgLTU3NCw2ICs1ODEsMTkgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X3JjNF9zdGF0ZSAqLwogfTsKIAorc3RhdGljIGNvbnN0IEVWUF9BRUFEIGFlYWRfbnVsbF9zaGExX3RscyA9IHsKKyAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyoga2V5IGxlbiAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub25jZSBsZW4gKi8KKyAgICBTSEFfRElHRVNUX0xFTkdUSCwgICAgICAgICAgLyogb3ZlcmhlYWQgKFNIQTEpICovCisgICAgU0hBX0RJR0VTVF9MRU5HVEgsICAgICAgICAgIC8qIG1heCB0YWcgbGVuZ3RoICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXQgKi8KKyAgICBhZWFkX251bGxfc2hhMV90bHNfaW5pdCwKKyAgICBhZWFkX3Rsc19jbGVhbnVwLAorICAgIGFlYWRfdGxzX3NlYWwsCisgICAgYWVhZF90bHNfb3BlbiwKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X3JjNF9zdGF0ZSAqLworfTsKKwogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX3JjNF9zaGExX3Rscyh2b2lkKSB7IHJldHVybiAmYWVhZF9yYzRfc2hhMV90bHM7IH0KIAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Flc18xMjhfY2JjX3NoYTFfdGxzKHZvaWQpIHsKQEAgLTYxMSwzICs2MzEsNSBAQAogY29uc3QgRVZQX0FFQUQgKkVWUF9hZWFkX2Rlc19lZGUzX2NiY19zaGExX3Rsc19pbXBsaWNpdF9pdih2b2lkKSB7CiAgIHJldHVybiAmYWVhZF9kZXNfZWRlM19jYmNfc2hhMV90bHNfaW1wbGljaXRfaXY7CiB9CisKK2NvbnN0IEVWUF9BRUFEICpFVlBfYWVhZF9udWxsX3NoYTFfdGxzKHZvaWQpIHsgcmV0dXJuICZhZWFkX251bGxfc2hhMV90bHM7IH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvYWVzXzEyOF9nY21fdGVzdHMudHh0IGIvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKaW5kZXggNWY3YWQzNS4uNzU0NjZmZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9jaXBoZXIvdGVzdC9hZXNfMTI4X2djbV90ZXN0cy50eHQKQEAgLTQxOCwzICs0MTgsOSBAQAogQ1Q6IDVmMzYyN2JkNTNmOGRhMGJiZTZmM2M5MjQ2ZDZmOTZmZTlhYmI5MWNkZWNmNjZkZGQ0MmY4MzNkOThmNGQ0NjM0YzJlMWUxYWQ0MDg4Yzg0YzIyMTkxYmRiOWQ5OWVmMjI3MzIwZTQ1NWRkMTEyYzRhOWU5Y2NhOTU3MjRmY2M5YWUwMjRlZDEyYmY2MGE4MDJkMGI4N2I5OWQ5YmYyMjU5MDc4NjU2N2MyOTYyMTcxZDJiMDViZWM5NzU0YzYyNzYwOGU5ZWJhN2JjY2M3MDU0MGFhNGRhNzJlMWUwNGIyNmQ4Zjk2OGIxMDIzMGY3MDc1MDFjMDA5MWE4YWMxMThmODZlODdhYWUxYWMwMDI1N2FlZTI5YzMzNDViZDM4MzkxNTQ5NzdhY2QzNzhmYzFiMjE5N2Y1YzFmZDhlMTIyNjJmOWMyOTc0ZmI5MmRjNDgxZWViNTFhYWRkNDRhODg1MWY2MWI5M2E4NGJhNTdmMjg3MGRmMDQyM2QyODliZmRjZmU2MzRmOWVjYjdkN2M2MTEwYTk1YjQ5NDE4YTJkZDY2NjMzNzc2OTAyNzVjMjA1YjNlZmE3OWEwYTc3YzkyNTY3ZmI0MjlkOGVlNDM3MzEyYTM5ZGY3NTE2ZGMyMzhmN2I5NDE0OTM4MjIzZDdlYzI0ZDI1NmQzZmIzYTU5NTRhN2M3NWRiZDc5NDg2ZDQ5YmE2YmIzOGE3Y2NjZTBmNTg3MDAyNjBiNzEzMTlhZGY5OGFiODY4NGUzNDkxM2FiZTJkOWQ5NzE5M2UyCiBUQUc6IGU2OTBlODlhZjM5ZmYzNjdmNWQ0MGExYjdjN2NjZDRmCiAKK0tFWTogMzEzMjMzMzQzNTM2MzczODM5MzAzMTMyMzMzNDM1MzYKK05PTkNFOiAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgorSU46IDQ4NjU2YzZjNmYyYzIwNTc2ZjcyNmM2NAorQUQ6CitDVDogY2VjMTg5ZDBlODQxOWI5MGZiMTZkNTU1CitUQUc6IDMyODkzODMyYThkNjA5MjI0ZDc3YzJlNTZhOTIyMjgyCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NpcGhlci90ZXN0L2NpcGhlcl90ZXN0LnR4dCBiL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CmluZGV4IDkzY2I4ZjMuLjIxZmZmZGIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CisrKyBiL3NyYy9jcnlwdG8vY2lwaGVyL3Rlc3QvY2lwaGVyX3Rlc3QudHh0CkBAIC0zOCw2ICszOCwyMiBAQAogQ2lwaGVydGV4dCA9IDNGRTMwMUM5NjJBQzAxRDAyMjEzNzYzQzFDQkQ0Q0RDNzk5NjU3QzA2NEVDRjVENDFDNjczODEyQ0ZERTk2NzUKIAogCisjIERFUyBFREUgQ0JDIHRlc3RzCitDaXBoZXIgPSBERVMtRURFLUNCQworS2V5ID0gMDEyMzQ1Njc4OWFiY2RlZmYxZTBkM2MyYjVhNDk3ODYKK0lWID0gZmVkY2JhOTg3NjU0MzIxMAorUGxhaW50ZXh0ID0gMzczNjM1MzQzMzMyMzEyMDRFNkY3NzIwNjk3MzIwNzQ2ODY1MjA3NDY5NkQ2NTIwNjY2RjcyMjAwMDAwMDAwMAorQ2lwaGVydGV4dCA9IDc5NDhDMERBNEZFOTFDRDgxNURDQTk2REJDOUI2MEE4NTdFQjk1NEY0REVCMDhFQjk4NzIyNjQyQUU2OTI1N0IKKworCisjIERFUyBFREUgdGVzdHMKK0NpcGhlciA9IERFUy1FREUKK0tleSA9IDAxMjM0NTY3ODlhYmNkZWZmMWUwZDNjMmI1YTQ5Nzg2CitJViA9IGZlZGNiYTk4NzY1NDMyMTAKK1BsYWludGV4dCA9IDM3MzYzNTM0MzMzMjMxMjA0RTZGNzcyMDY5NzMyMDc0Njg2NTIwNzQ2OTZENjUyMDY2NkY3MjIwMDAwMDAwMDAKK0NpcGhlcnRleHQgPSAyMkU4ODk0MDJFMjg0MjJGODE2N0FEMjc5RDkwQTU2NkRBNzVCNzM0RTEyQzY3MUZDMjY2OUFFQ0IzRTRGRThGCisKKwogIyBBRVMgMTI4IEVDQiB0ZXN0cyAoZnJvbSBGSVBTLTE5NyB0ZXN0IHZlY3RvcnMsIGVuY3J5cHQpCiBDaXBoZXIgPSBBRVMtMTI4LUVDQgogS2V5ID0gMDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYKQEAgLTM2MCw2ICszNzYsMTMgQEAKIEFBRCA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAxMTEyMTMxNDE1MTYxNzE4MTkxYTFiMWMxZDFlMWYKIFRhZyA9IDNiNjI5Y2NmYmMxMTE5YjczMTllMWRjZTJjZDZmZDZkCiAKK0NpcGhlciA9IEFFUy0xMjgtR0NNCitLZXkgPSAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgorSVYgPSAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNgorUGxhaW50ZXh0ID0gNDg2NTZjNmM2ZjJjMjA1NzZmNzI2YzY0CitDaXBoZXJ0ZXh0ID0gY2VjMTg5ZDBlODQxOWI5MGZiMTZkNTU1CitUYWcgPSAzMjg5MzgzMmE4ZDYwOTIyNGQ3N2MyZTU2YTkyMjI4MgorQUFEID0KIAogIyBPRkIgdGVzdHMgZnJvbSBPcGVuU1NMIHVwc3RyZWFtLgogCkBAIC01MzUsMyArNTU4LDQwIEBACiBLZXkgPSA4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0IKIFBsYWludGV4dCA9IEY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwCiBDaXBoZXJ0ZXh0ID0gOUE0QjQxQkE3MzhENkM3MkZCMTY2OTE2MDNDMThFMEUKKworIyBERVMgRUNCIHRlc3RzCisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IDAwMDAwMDAwMDAwMDAwMDAKK1BsYWludGV4dCA9IDAwMDAwMDAwMDAwMDAwMDAKK0NpcGhlcnRleHQgPSA4Q0E2NERFOUMxQjEyM0E3CisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IEZGRkZGRkZGRkZGRkZGRkYKK1BsYWludGV4dCA9IEZGRkZGRkZGRkZGRkZGRkYKK0NpcGhlcnRleHQgPSA3MzU5QjIxNjNFNEVEQzU4CisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IDMwMDAwMDAwMDAwMDAwMDAKK1BsYWludGV4dCA9IDEwMDAwMDAwMDAwMDAwMDEKK0NpcGhlcnRleHQgPSA5NThFNkU2MjdBMDU1NTdCCisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IDExMTExMTExMTExMTExMTEKK1BsYWludGV4dCA9IDExMTExMTExMTExMTExMTEKK0NpcGhlcnRleHQgPSBGNDAzNzlBQjlFMEVDNTMzCisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IDAxMjM0NTY3ODlBQkNERUYKK1BsYWludGV4dCA9IDExMTExMTExMTExMTExMTEKK0NpcGhlcnRleHQgPSAxNzY2OERGQzcyOTI1MzJECisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IDExMTExMTExMTExMTExMTEKK1BsYWludGV4dCA9IDAxMjM0NTY3ODlBQkNERUYKK0NpcGhlcnRleHQgPSA4QTVBRTFGODFBQjhGMkRECisKK0NpcGhlciA9IERFUy1FQ0IKK0tleSA9IEZFRENCQTk4NzY1NDMyMTAKK1BsYWludGV4dCA9IDAxMjM0NTY3ODlBQkNERUYKK0NpcGhlcnRleHQgPSBFRDM5RDk1MEZBNzRCQ0M0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NtYWMvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2NtYWMvQ01ha2VMaXN0cy50eHQKaW5kZXggOGViZDgwYy4uYmIzYWJjMyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jbWFjL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vY21hYy9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgY21hYwpAQCAtMTIsNiArMTIsOCBAQAogICBjbWFjX3Rlc3QKIAogICBjbWFjX3Rlc3QuY2MKKworICAkPFRBUkdFVF9PQkpFQ1RTOnRlc3Rfc3VwcG9ydD4KICkKIAogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGNtYWNfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NtYWMvY21hY190ZXN0LmNjIGIvc3JjL2NyeXB0by9jbWFjL2NtYWNfdGVzdC5jYwppbmRleCAwZjA2ODYwLi41M2Y0NWQxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NtYWMvY21hY190ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vY21hYy9jbWFjX3Rlc3QuY2MKQEAgLTE5LDE2ICsxOSwxMyBAQAogI2luY2x1ZGUgPG9wZW5zc2wvY21hYy5oPgogCiAjaW5jbHVkZSAiLi4vdGVzdC9zY29wZWRfdHlwZXMuaCIKKyNpbmNsdWRlICIuLi90ZXN0L3Rlc3RfdXRpbC5oIgogCiAKLXN0YXRpYyB2b2lkIGR1bXAoY29uc3QgdWludDhfdCAqZ290LCBjb25zdCB1aW50OF90ICpleHBlY3RlZCwgc2l6ZV90IGxlbikgewotICBTY29wZWRCSU8gYmlvKEJJT19uZXdfZnAoc3RkZXJyLCAwIC8qIGRvbid0IGNsb3NlICovKSk7Ci0KLSAgQklPX3B1dHMoYmlvLmdldCgpLCAiXG5Hb3Q6XG4iKTsKLSAgQklPX2hleGR1bXAoYmlvLmdldCgpLCBnb3QsIGxlbiwgMiAvKiBpbmRlbnQgKi8pOwotICBCSU9fcHV0cyhiaW8uZ2V0KCksICJFeHBlY3RlZDpcbiIpOwotICBCSU9faGV4ZHVtcChiaW8uZ2V0KCksIGV4cGVjdGVkLCBsZW4sIDIgLyogaW5kZW50ICovKTsKLSAgQklPX2ZsdXNoKGJpby5nZXQoKSk7CitzdGF0aWMgdm9pZCBkdW1wKGNvbnN0IHVpbnQ4X3QgKmdvdCwgY29uc3QgdWludDhfdCAqd2FudCwgc2l6ZV90IGxlbikgeworICBoZXhkdW1wKHN0ZGVyciwgImdvdCA6IiwgZ290LCBsZW4pOworICBoZXhkdW1wKHN0ZGVyciwgIndhbnQ6Iiwgd2FudCwgbGVuKTsKKyAgZmZsdXNoKHN0ZGVycik7CiB9CiAKIHN0YXRpYyBpbnQgdGVzdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1aW50OF90ICprZXksIHNpemVfdCBrZXlfbGVuLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9jb25mL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9jb25mL0NNYWtlTGlzdHMudHh0CmluZGV4IDgwNDZiYjguLjBhM2M3OTUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY29uZi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2NvbmYvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGNvbmYKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY29uZi9jb25mLmMgYi9zcmMvY3J5cHRvL2NvbmYvY29uZi5jCmluZGV4IDIxM2VmYzUuLmUwOThhMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY29uZi9jb25mLmMKKysrIGIvc3JjL2NyeXB0by9jb25mL2NvbmYuYwpAQCAtMTExLDYgKzExMSwxNiBAQAogICByZXR1cm4gY29uZjsKIH0KIAorQ09ORl9WQUxVRSAqQ09ORl9WQUxVRV9uZXcodm9pZCkgeworICBDT05GX1ZBTFVFICp2ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTkZfVkFMVUUpKTsKKyAgaWYgKCF2KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisgIG1lbXNldCh2LCAwLCBzaXplb2YoQ09ORl9WQUxVRSkpOworICByZXR1cm4gdjsKK30KKwogc3RhdGljIHZvaWQgdmFsdWVfZnJlZV9jb250ZW50cyhDT05GX1ZBTFVFICp2YWx1ZSkgewogICBpZiAodmFsdWUtPnNlY3Rpb24pIHsKICAgICBPUEVOU1NMX2ZyZWUodmFsdWUtPnNlY3Rpb24pOwpAQCAtMTM3LDI5ICsxNDcsMjYgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBsaF9DT05GX1ZBTFVFX2RvYWxsKGNvbmYtPmRhdGEsIHZhbHVlX2ZyZWVfY29udGVudHMpOworICBsaF9DT05GX1ZBTFVFX2RvYWxsKGNvbmYtPmRhdGEsIHZhbHVlX2ZyZWUpOwogICBsaF9DT05GX1ZBTFVFX2ZyZWUoY29uZi0+ZGF0YSk7CiAgIE9QRU5TU0xfZnJlZShjb25mKTsKIH0KIAogQ09ORl9WQUxVRSAqTkNPTkZfbmV3X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbikgewogICBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2sgPSBOVUxMOwotICBpbnQgb2sgPSAwLCBpOworICBpbnQgb2sgPSAwOwogICBDT05GX1ZBTFVFICp2ID0gTlVMTCwgKm9sZF92YWx1ZTsKIAogICBzayA9IHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKTsKLSAgdiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSk7CisgIHYgPSBDT05GX1ZBTFVFX25ldygpOwogICBpZiAoc2sgPT0gTlVMTCB8fCB2ID09IE5VTEwpIHsKICAgICBnb3RvIGVycjsKICAgfQotICBpID0gc3RybGVuKHNlY3Rpb24pICsgMTsKLSAgdi0+c2VjdGlvbiA9IE9QRU5TU0xfbWFsbG9jKGkpOworICB2LT5zZWN0aW9uID0gT1BFTlNTTF9zdHJkdXAoc2VjdGlvbik7CiAgIGlmICh2LT5zZWN0aW9uID09IE5VTEwpIHsKICAgICBnb3RvIGVycjsKICAgfQogCi0gIG1lbWNweSh2LT5zZWN0aW9uLCBzZWN0aW9uLCBpKTsKLSAgdi0+c2VjdGlvbltpLTFdID0gMDsKICAgdi0+bmFtZSA9IE5VTEw7CiAgIHYtPnZhbHVlID0gKGNoYXIgKilzazsKIApAQCAtMjg1LDcgKzI5Miw3IEBACiAgICAgICBycCA9IGU7CiAgICAgICBpZiAocSkgewogICAgICAgICBpZiAociAhPSBxKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgc3RyX2NvcHksIENPTkZfUl9OT19DTE9TRV9CUkFDRSk7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX05PX0NMT1NFX0JSQUNFKTsKICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQogICAgICAgICBlKys7CkBAIC0zMDQsNyArMzExLDcgQEAKICAgICAgIH0KICAgICAgICpycCA9IHI7CiAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIHN0cl9jb3B5LCBDT05GX1JfVkFSSUFCTEVfSEFTX05PX1ZBTFVFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX1ZBUklBQkxFX0hBU19OT19WQUxVRSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgKHN0cmxlbihwKSArIGJ1Zi0+bGVuZ3RoIC0gKGUgLSBmcm9tKSkpOwpAQCAtMzcyLDExICszNzksMTIgQEAKICAgcmV0dXJuIHZhbHVlLT52YWx1ZTsKIH0KIAotaW50IGFkZF9zdHJpbmcoY29uc3QgQ09ORiAqY29uZiwgQ09ORl9WQUxVRSAqc2VjdGlvbiwgQ09ORl9WQUxVRSAqdmFsdWUpIHsKK3N0YXRpYyBpbnQgYWRkX3N0cmluZyhjb25zdCBDT05GICpjb25mLCBDT05GX1ZBTFVFICpzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIENPTkZfVkFMVUUgKnZhbHVlKSB7CiAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0aW9uX3N0YWNrID0gKFNUQUNLX09GKENPTkZfVkFMVUUpKikgc2VjdGlvbi0+dmFsdWU7CiAgIENPTkZfVkFMVUUgKm9sZF92YWx1ZTsKIAotICB2YWx1ZS0+c2VjdGlvbiA9IHNlY3Rpb24tPnNlY3Rpb247CisgIHZhbHVlLT5zZWN0aW9uID0gT1BFTlNTTF9zdHJkdXAoc2VjdGlvbi0+c2VjdGlvbik7CiAgIGlmICghc2tfQ09ORl9WQUxVRV9wdXNoKHNlY3Rpb25fc3RhY2ssIHZhbHVlKSkgewogICAgIHJldHVybiAwOwogICB9CkBAIC01MDUsMjAgKzUxMywxOSBAQAogICBjaGFyICpzdGFydCwgKnBzZWN0aW9uLCAqcG5hbWU7CiAKICAgaWYgKChidWZmID0gQlVGX01FTV9uZXcoKSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfQlVGX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfQlVGX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICBzZWN0aW9uID0gKGNoYXIgKilPUEVOU1NMX21hbGxvYygxMCk7CisgIHNlY3Rpb24gPSBPUEVOU1NMX3N0cmR1cCgiZGVmYXVsdCIpOwogICBpZiAoc2VjdGlvbiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9Ci0gIEJVRl9zdHJsY3B5KHNlY3Rpb24sICJkZWZhdWx0IiwgMTApOwogCiAgIHN2ID0gTkNPTkZfbmV3X3NlY3Rpb24oY29uZiwgc2VjdGlvbik7CiAgIGlmIChzdiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTUyNiw3ICs1MzMsNyBAQAogICBhZ2FpbiA9IDA7CiAgIGZvciAoOzspIHsKICAgICBpZiAoIUJVRl9NRU1fZ3JvdyhidWZmLCBidWZudW0gKyBDT05GQlVGU0laRSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfQlVGX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBFUlJfUl9CVUZfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBwID0gJihidWZmLT5kYXRhW2J1Zm51bV0pOwpAQCAtNTk1LDcgKzYwMiw3IEBACiAgICAgICAgICAgc3MgPSBwOwogICAgICAgICAgIGdvdG8gYWdhaW47CiAgICAgICAgIH0KLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBDT05GX1JfTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIENPTkZfUl9NSVNTSU5HX0NMT1NFX1NRVUFSRV9CUkFDS0VUKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICAqZW5kID0gJ1wwJzsKQEAgLTYwNiw3ICs2MTMsNyBAQAogICAgICAgICBzdiA9IE5DT05GX25ld19zZWN0aW9uKGNvbmYsIHNlY3Rpb24pOwogICAgICAgfQogICAgICAgaWYgKHN2ID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBjb250aW51ZTsKQEAgLTYyMyw3ICs2MzAsNyBAQAogICAgICAgfQogICAgICAgcCA9IGVhdF93cyhjb25mLCBlbmQpOwogICAgICAgaWYgKCpwICE9ICc9JykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9NSVNTSU5HX0VRVUFMX1NJR04pOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICAqZW5kID0gJ1wwJzsKQEAgLTYzOSwyMCArNjQ2LDE3IEBACiAgICAgICBwKys7CiAgICAgICAqcCA9ICdcMCc7CiAKLSAgICAgIGlmICghKHYgPSAoQ09ORl9WQUxVRSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSkpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIGRlZl9sb2FkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgaWYgKCEodiA9IENPTkZfVkFMVUVfbmV3KCkpKSB7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgaWYgKHBzZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgcHNlY3Rpb24gPSBzZWN0aW9uOwogICAgICAgfQotICAgICAgdi0+bmFtZSA9IChjaGFyICopT1BFTlNTTF9tYWxsb2Moc3RybGVuKHBuYW1lKSArIDEpOwotICAgICAgdi0+dmFsdWUgPSBOVUxMOworICAgICAgdi0+bmFtZSA9IE9QRU5TU0xfc3RyZHVwKHBuYW1lKTsKICAgICAgIGlmICh2LT5uYW1lID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgZGVmX2xvYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENPTkYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9Ci0gICAgICBCVUZfc3RybGNweSh2LT5uYW1lLCBwbmFtZSwgc3RybGVuKHBuYW1lKSArIDEpOwogICAgICAgaWYgKCFzdHJfY29weShjb25mLCBwc2VjdGlvbiwgJih2LT52YWx1ZSksIHN0YXJ0KSkgewogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KQEAgLTY2MiwxNCArNjY2LDE0IEBACiAgICAgICAgICAgdHYgPSBOQ09ORl9uZXdfc2VjdGlvbihjb25mLCBwc2VjdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR2ID09IE5VTEwpIHsKLSAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKKyAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CiAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHR2ID0gc3Y7CiAgICAgICB9CiAgICAgICBpZiAoYWRkX3N0cmluZyhjb25mLCB0diwgdikgPT0gMCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBkZWZfbG9hZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIHYgPSBOVUxMOwpAQCAtNzE1LDcgKzcxOSw3IEBACiAgIGludCByZXQ7CiAKICAgaWYgKGluID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBOQ09ORl9sb2FkLCBFUlJfUl9TWVNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDT05GLCBFUlJfUl9TWVNfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC03MzYsNyArNzQwLDcgQEAKICAgY29uc3QgY2hhciAqbHN0YXJ0LCAqdG1wZW5kLCAqcDsKIAogICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9wYXJzZV9saXN0LCBDT05GX1JfTElTVF9DQU5OT1RfQkVfTlVMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoQ09ORiwgQ09ORl9SX0xJU1RfQ0FOTk9UX0JFX05VTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY29uZi9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9jb25mL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkMWE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vY29uZi9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSwgR29vZ2xlIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gKi8KKworI2lmbmRlZiBPUEVOU1NMX0hFQURFUl9DUllQVE9fQ09ORl9JTlRFUk5BTF9ICisjZGVmaW5lIE9QRU5TU0xfSEVBREVSX0NSWVBUT19DT05GX0lOVEVSTkFMX0gKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIENPTkZfVkFMVUVfbmV3IHJldHVybnMgYSBmcmVzaGx5IGFsbG9jYXRlZCBhbmQgemVyb2VkIHxDT05GX1ZBTFVFfC4gKi8KK0NPTkZfVkFMVUUgKkNPTkZfVkFMVUVfbmV3KHZvaWQpOworCisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorfSAgLyogZXh0ZXJuIEMgKi8KKyNlbmRpZgorCisjZW5kaWYgIC8qIE9QRU5TU0xfSEVBREVSX0NSWVBUT19DT05GX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3B1LWFybS5jIGIvc3JjL2NyeXB0by9jcHUtYXJtLmMKaW5kZXggNzRlOTM3Yi4uNmUwMzdhYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9jcHUtYXJtLmMKKysrIGIvc3JjL2NyeXB0by9jcHUtYXJtLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAKIAogLyogV2UgY2FuJ3QgaW5jbHVkZSA8c3lzL2F1eHYuaD4gYmVjYXVzZSB0aGUgQW5kcm9pZCBTREsgdmVyc2lvbiBhZ2FpbnN0IHdoaWNoCkBAIC03MCwxMiArNzAsMTIgQEAKICAgc2lnbG9uZ2ptcChzaWdpbGxfam1wLCBzaWduYWwpOwogfQogCi12b2lkIENSWVBUT19hcm1fbmVvbl9wcm9iZSgpOwordm9pZCBDUllQVE9fYXJtX25lb25fcHJvYmUodm9pZCk7CiAKIC8vIHByb2JlX2Zvcl9ORU9OIHJldHVybnMgMSBpZiBhIE5FT04gaW5zdHJ1Y3Rpb24gcnVucyBzdWNjZXNzZnVsbHkuIEJlY2F1c2UKIC8vIGdldGF1eHZhbCBkb2Vzbid0IGV4aXN0IG9uIEFuZHJvaWQgdW50aWwgSmVsbHkgQmVhbiwgc3VwcG9ydGluZyBORU9OIG9uCiAvLyBvbGRlciBkZXZpY2VzIHJlcXVpcmVzIHRoaXMuCi1zdGF0aWMgaW50IHByb2JlX2Zvcl9ORU9OKCkgeworc3RhdGljIGludCBwcm9iZV9mb3JfTkVPTih2b2lkKSB7CiAgIGludCBzdXBwb3J0ZWQgPSAwOwogCiAgIHNpZ3NldF90IHNpZ21hc2s7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2NwdS1pbnRlbC5jIGIvc3JjL2NyeXB0by9jcHUtaW50ZWwuYwppbmRleCBkZjBlMTI3Li45MjRiYWIwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2NwdS1pbnRlbC5jCisrKyBiL3NyYy9jcnlwdG8vY3B1LWludGVsLmMKQEAgLTY4LDggKzY4LDU4IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotLyogT1BFTlNTTF9pYTMyX2NwdWlkIGlzIGRlZmluZWQgaW4gY3B1LXg4Nl82NC1hc20ucGwuICovCi1leHRlcm4gdWludDY0X3QgT1BFTlNTTF9pYTMyX2NwdWlkKHVpbnQzMl90Kik7CisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisjcHJhZ21hIHdhcm5pbmcocHVzaCwgMykKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworCisvKiBPUEVOU1NMX2NwdWlkIHJ1bnMgdGhlIGNwdWlkIGluc3RydWN0aW9uLiB8bGVhZnwgaXMgcGFzc2VkIGluIGFzIEVBWCBhbmQgRUNYCisgKiBpcyBzZXQgdG8gemVyby4gSXQgd3JpdGVzIEVBWCwgRUJYLCBFQ1gsIGFuZCBFRFggdG8gfCpvdXRfZWF4fCB0aHJvdWdoCisgKiB8Km91dF9lZHh8LiAqLworc3RhdGljIHZvaWQgT1BFTlNTTF9jcHVpZCh1aW50MzJfdCAqb3V0X2VheCwgdWludDMyX3QgKm91dF9lYngsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfZWN4LCB1aW50MzJfdCAqb3V0X2VkeCwgdWludDMyX3QgbGVhZikgeworI2lmIGRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQorICBpbnQgdG1wWzRdOworICBfX2NwdWlkKHRtcCwgKGludClsZWFmKTsKKyAgKm91dF9lYXggPSAodWludDMyX3QpdG1wWzBdOworICAqb3V0X2VieCA9ICh1aW50MzJfdCl0bXBbMV07CisgICpvdXRfZWN4ID0gKHVpbnQzMl90KXRtcFsyXTsKKyAgKm91dF9lZHggPSAodWludDMyX3QpdG1wWzNdOworI2VsaWYgZGVmaW5lZChfX3BpY19fKSAmJiBkZWZpbmVkKE9QRU5TU0xfMzJfQklUKQorICAvKiBJbmxpbmUgYXNzZW1ibHkgbWF5IG5vdCBjbG9iYmVyIHRoZSBQSUMgcmVnaXN0ZXIuIEZvciAzMi1iaXQsIHRoaXMgaXMgRUJYLgorICAgKiBTZWUgaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDc2MDIuICovCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4b3IgJSVlY3gsICUlZWN4XG4iCisgICAgIm1vdiAlJWVieCwgJSVlZGlcbiIKKyAgICAiY3B1aWRcbiIKKyAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIKKyAgICA6ICI9YSIoKm91dF9lYXgpLCAiPUQiKCpvdXRfZWJ4KSwgIj1jIigqb3V0X2VjeCksICI9ZCIoKm91dF9lZHgpCisgICAgOiAiYSIobGVhZikKKyAgKTsKKyNlbHNlCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4b3IgJSVlY3gsICUlZWN4XG4iCisgICAgImNwdWlkXG4iCisgICAgOiAiPWEiKCpvdXRfZWF4KSwgIj1iIigqb3V0X2VieCksICI9YyIoKm91dF9lY3gpLCAiPWQiKCpvdXRfZWR4KQorICAgIDogImEiKGxlYWYpCisgICk7CisjZW5kaWYKK30KKworLyogT1BFTlNTTF94Z2V0YnYgcmV0dXJucyB0aGUgdmFsdWUgb2YgYW4gSW50ZWwgRXh0ZW5kZWQgQ29udHJvbCBSZWdpc3RlciAoWENSKS4KKyAqIEN1cnJlbnRseSBvbmx5IFhDUjAgaXMgZGVmaW5lZCBieSBJbnRlbCBzbyB8eGNyfCBzaG91bGQgYWx3YXlzIGJlIHplcm8uICovCitzdGF0aWMgdWludDY0X3QgT1BFTlNTTF94Z2V0YnYodWludDMyX3QgeGNyKSB7CisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisgIHJldHVybiAodWludDY0X3QpX3hnZXRidih4Y3IpOworI2Vsc2UKKyAgdWludDMyX3QgZWF4LCBlZHg7CisgIF9fYXNtX18gdm9sYXRpbGUgKCJ4Z2V0YnYiIDogIj1hIihlYXgpLCAiPWQiKGVkeCkgOiAiYyIoeGNyKSk7CisgIHJldHVybiAoKCh1aW50NjRfdCllZHgpIDw8IDMyKSB8IGVheDsKKyNlbmRpZgorfQogCiAvKiBoYW5kbGVfY3B1X2VudiBhcHBsaWVzIHRoZSB2YWx1ZSBmcm9tIHxpbnwgdG8gdGhlIENQVUlEIHZhbHVlcyBpbiB8b3V0WzBdfAogICogYW5kIHxvdXRbMV18LiBTZWUgdGhlIGNvbW1lbnQgaW4gfE9QRU5TU0xfY3B1aWRfc2V0dXB8IGFib3V0IHRoaXMuICovCkBAIC05MSwxOCArMTQxLDEwMSBAQAogfQogCiB2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkgeworICAvKiBEZXRlcm1pbmUgdGhlIHZlbmRvciBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZS4gKi8KKyAgdWludDMyX3QgZWF4LCBlYngsIGVjeCwgZWR4OworICBPUEVOU1NMX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgsIDApOworCisgIHVpbnQzMl90IG51bV9pZHMgPSBlYXg7CisKKyAgaW50IGlzX2ludGVsID0gZWJ4ID09IDB4NzU2ZTY1NDcgLyogR2VudSAqLyAmJgorICAgICAgICAgICAgICAgICBlZHggPT0gMHg0OTY1NmU2OSAvKiBpbmVJICovICYmCisgICAgICAgICAgICAgICAgIGVjeCA9PSAweDZjNjU3NDZlIC8qIG50ZWwgKi87CisgIGludCBpc19hbWQgPSBlYnggPT0gMHg2ODc0NzU0MSAvKiBBdXRoICovICYmCisgICAgICAgICAgICAgICBlZHggPT0gMHg2OTc0NmU2NSAvKiBlbnRpICovICYmCisgICAgICAgICAgICAgICBlY3ggPT0gMHg0NDRkNDE2MyAvKiBjQU1EICovOworCisgIGludCBoYXNfYW1kX3hvcCA9IDA7CisgIGlmIChpc19hbWQpIHsKKyAgICAvKiBBTUQtc3BlY2lmaWMgbG9naWMuCisgICAgICogU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYW1kLmNvbS93b3JkcHJlc3MvbWVkaWEvMjAxMi8xMC8yNTQ4MTEucGRmICovCisgICAgT1BFTlNTTF9jcHVpZCgmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4LCAweDgwMDAwMDAwKTsKKyAgICB1aW50MzJfdCBudW1fZXh0ZW5kZWRfaWRzID0gZWF4OworICAgIGlmIChudW1fZXh0ZW5kZWRfaWRzID49IDB4ODAwMDAwMDEpIHsKKyAgICAgIE9QRU5TU0xfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCwgMHg4MDAwMDAwMSk7CisgICAgICBpZiAoZWN4ICYgKDEgPDwgMTEpKSB7CisgICAgICAgIGhhc19hbWRfeG9wID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB1aW50MzJfdCBleHRlbmRlZF9mZWF0dXJlcyA9IDA7CisgIGlmIChudW1faWRzID49IDcpIHsKKyAgICBPUEVOU1NMX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgsIDcpOworICAgIGV4dGVuZGVkX2ZlYXR1cmVzID0gZWJ4OworICB9CisKKyAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY29yZXMgc2hhcmluZyBhbiBMMSBkYXRhIGNhY2hlIHRvIGFkanVzdCB0aGUKKyAgICogaHlwZXItdGhyZWFkaW5nIGJpdC4gKi8KKyAgdWludDMyX3QgY29yZXNfcGVyX2NhY2hlID0gMDsKKyAgaWYgKGlzX2FtZCkgeworICAgIC8qIEFNRCBDUFVzIG5ldmVyIHNoYXJlIGFuIEwxIGRhdGEgY2FjaGUgYmV0d2VlbiB0aHJlYWRzIGJ1dCBkbyBzZXQgdGhlIEhUVAorICAgICAqIGJpdCBvbiBtdWx0aS1jb3JlIENQVXMuICovCisgICAgY29yZXNfcGVyX2NhY2hlID0gMTsKKyAgfSBlbHNlIGlmIChudW1faWRzID49IDQpIHsKKyAgICAvKiBUT0RPKGRhdmlkYmVuKTogVGhlIEludGVsIG1hbnVhbCBzYXlzIHRoaXMgQ1BVSUQgbGVhZiBlbnVtZXJhdGVzIGFsbAorICAgICAqIGNhY2hlcyB1c2luZyBFQ1ggYW5kIGRvZXNuJ3Qgc2F5IHdoaWNoIGlzIGZpcnN0LiBEb2VzIHRoaXMgbWF0dGVyPyAqLworICAgIE9QRU5TU0xfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCwgNCk7CisgICAgY29yZXNfcGVyX2NhY2hlID0gMSArICgoZWF4ID4+IDE0KSAmIDB4ZmZmKTsKKyAgfQorCisgIE9QRU5TU0xfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCwgMSk7CisKKyAgLyogQWRqdXN0IHRoZSBoeXBlci10aHJlYWRpbmcgYml0LiAqLworICBpZiAoZWR4ICYgKDEgPDwgMjgpKSB7CisgICAgdWludDMyX3QgbnVtX2xvZ2ljYWxfY29yZXMgPSAoZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgaWYgKGNvcmVzX3Blcl9jYWNoZSA9PSAxIHx8IG51bV9sb2dpY2FsX2NvcmVzIDw9IDEpIHsKKyAgICAgIGVkeCAmPSB+KDEgPDwgMjgpOworICAgIH0KKyAgfQorCisgIC8qIFJlc2VydmVkIGJpdCAjMjAgd2FzIGhpc3RvcmljYWxseSByZXB1cnBvc2VkIHRvIGNvbnRyb2wgdGhlIGluLW1lbW9yeQorICAgKiByZXByZXNlbnRhdGlvbiBvZiBSQzQgc3RhdGUuIEFsd2F5cyBzZXQgaXQgdG8gemVyby4gKi8KKyAgZWR4ICY9IH4oMSA8PCAyMCk7CisKKyAgLyogUmVzZXJ2ZWQgYml0ICMzMCBpcyByZXB1cnBvc2VkIHRvIHNpZ25hbCBhbiBJbnRlbCBDUFUuICovCisgIGlmIChpc19pbnRlbCkgeworICAgIGVkeCB8PSAoMSA8PCAzMCk7CisgIH0gZWxzZSB7CisgICAgZWR4ICY9IH4oMSA8PCAzMCk7CisgIH0KKworICAvKiBUaGUgU0RCRyBiaXQgaXMgcmVwdXJwb3NlZCB0byBkZW5vdGUgQU1EIFhPUCBzdXBwb3J0LiAqLworICBpZiAoaGFzX2FtZF94b3ApIHsKKyAgICBlY3ggfD0gKDEgPDwgMTEpOworICB9IGVsc2UgeworICAgIGVjeCAmPSB+KDEgPDwgMTEpOworICB9CisKKyAgdWludDY0X3QgeGNyMCA9IDA7CisgIGlmIChlY3ggJiAoMSA8PCAyNykpIHsKKyAgICAvKiBYQ1IwIG1heSBvbmx5IGJlIHF1ZXJpZWQgaWYgdGhlIE9TWFNBVkUgYml0IGlzIHNldC4gKi8KKyAgICB4Y3IwID0gT1BFTlNTTF94Z2V0YnYoMCk7CisgIH0KKyAgLyogU2VlIEludGVsIG1hbnVhbCwgc2VjdGlvbiAxNC4zLiAqLworICBpZiAoKHhjcjAgJiA2KSAhPSA2KSB7CisgICAgLyogWU1NIHJlZ2lzdGVycyBjYW5ub3QgYmUgdXNlZC4gKi8KKyAgICBlY3ggJj0gfigxIDw8IDI4KTsgLyogQVZYICovCisgICAgZWN4ICY9IH4oMSA8PCAxMik7IC8qIEZNQSAqLworICAgIGVjeCAmPSB+KDEgPDwgMTEpOyAvKiBBTUQgWE9QICovCisgICAgZXh0ZW5kZWRfZmVhdHVyZXMgJj0gfigxIDw8IDUpOyAvKiBBVlgyICovCisgIH0KKworICBPUEVOU1NMX2lhMzJjYXBfUFswXSA9IGVkeDsKKyAgT1BFTlNTTF9pYTMyY2FwX1BbMV0gPSBlY3g7CisgIE9QRU5TU0xfaWEzMmNhcF9QWzJdID0gZXh0ZW5kZWRfZmVhdHVyZXM7CisgIE9QRU5TU0xfaWEzMmNhcF9QWzNdID0gMDsKKwogICBjb25zdCBjaGFyICplbnYxLCAqZW52MjsKLQotI2lmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpCi0gIE9QRU5TU0xfaWEzMl9jcHVpZChPUEVOU1NMX2lhMzJjYXBfUCk7Ci0jZWxzZQotICB1aW50NjRfdCB2ZWMgPSBPUEVOU1NMX2lhMzJfY3B1aWQoT1BFTlNTTF9pYTMyY2FwX1ApOwotICAvKiAxPDwxMCBzZXRzIGEgcmVzZXJ2ZWQgYml0IHRvIGluZGljYXRlIHRoYXQgdGhlIHZhcmlhYmxlCi0gICAqIHdhcyBhbHJlYWR5IGluaXRpYWxpc2VkLiAqLwotICBPUEVOU1NMX2lhMzJjYXBfUFswXSA9ICgodWludDMyX3QpdmVjKSB8ICgxIDw8IDEwKTsKLSAgT1BFTlNTTF9pYTMyY2FwX1BbMV0gPSB2ZWMgPj4gMzI7Ci0jZW5kaWYKLQogICBlbnYxID0gZ2V0ZW52KCJPUEVOU1NMX2lhMzJjYXAiKTsKICAgaWYgKGVudjEgPT0gTlVMTCkgewogICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3B1LXg4Ni1hc20ucGwgYi9zcmMvY3J5cHRvL2NwdS14ODYtYXNtLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTljNDM2Li4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vY3B1LXg4Ni1hc20ucGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcGVybAotCi0kMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwotcHVzaChASU5DLCAiJHtkaXJ9cGVybGFzbSIsICJwZXJsYXNtIik7Ci1yZXF1aXJlICJ4ODZhc20ucGwiOwotCi0mYXNtX2luaXQoJEFSR1ZbMF0sImNyeXB0by9jcHUteDg2LWFzbSIpOwotCi1mb3IgKEBBUkdWKSB7ICRzc2UyPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KLQotJmZ1bmN0aW9uX2JlZ2luKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKLQkmeG9yCSgiZWR4IiwiZWR4Iik7Ci0JJnB1c2hmCSgpOwotCSZwb3AJKCJlYXgiKTsKLQkmbW92CSgiZWN4IiwiZWF4Iik7Ci0JJnhvcgkoImVheCIsMTw8MjEpOwotCSZwdXNoCSgiZWF4Iik7Ci0JJnBvcGYJKCk7Ci0JJnB1c2hmCSgpOwotCSZwb3AJKCJlYXgiKTsKLQkmeG9yCSgiZWN4IiwiZWF4Iik7Ci0JJnhvcgkoImVheCIsImVheCIpOwotCSZidAkoImVjeCIsMjEpOwotCSZqbmMJKCZsYWJlbCgibm9jcHVpZCIpKTsKLQkmbW92CSgiZXNpIiwmd3BhcmFtKDApKTsKLQkmbW92CSgmRFdQKDgsImVzaSIpLCJlYXgiKTsJIyBjbGVhciAzcmQgd29yZAotCSZjcHVpZAkoKTsKLQkmbW92CSgiZWRpIiwiZWF4Iik7CQkjIG1heCB2YWx1ZSBmb3Igc3RhbmRhcmQgcXVlcnkgbGV2ZWwKLQotCSZ4b3IJKCJlYXgiLCJlYXgiKTsKLQkmY21wCSgiZWJ4IiwweDc1NmU2NTQ3KTsJIyAiR2VudSIKLQkmc2V0bmUJKCZMQigiZWF4IikpOwotCSZtb3YJKCJlYnAiLCJlYXgiKTsKLQkmY21wCSgiZWR4IiwweDQ5NjU2ZTY5KTsJIyAiaW5lSSIKLQkmc2V0bmUJKCZMQigiZWF4IikpOwotCSZvcgkoImVicCIsImVheCIpOwotCSZjbXAJKCJlY3giLDB4NmM2NTc0NmUpOwkjICJudGVsIgotCSZzZXRuZQkoJkxCKCJlYXgiKSk7Ci0JJm9yCSgiZWJwIiwiZWF4Iik7CQkjIDAgaW5kaWNhdGVzIEludGVsIENQVQotCSZqegkoJmxhYmVsKCJpbnRlbCIpKTsKLQotCSZjbXAJKCJlYngiLDB4Njg3NDc1NDEpOwkjICJBdXRoIgotCSZzZXRuZQkoJkxCKCJlYXgiKSk7Ci0JJm1vdgkoImVzaSIsImVheCIpOwotCSZjbXAJKCJlZHgiLDB4Njk3NDZFNjUpOwkjICJlbnRpIgotCSZzZXRuZQkoJkxCKCJlYXgiKSk7Ci0JJm9yCSgiZXNpIiwiZWF4Iik7Ci0JJmNtcAkoImVjeCIsMHg0NDRENDE2Myk7CSMgImNBTUQiCi0JJnNldG5lCSgmTEIoImVheCIpKTsKLQkmb3IJKCJlc2kiLCJlYXgiKTsJCSMgMCBpbmRpY2F0ZXMgQU1EIENQVQotCSZqbnoJKCZsYWJlbCgiaW50ZWwiKSk7Ci0KLQkjIEFNRCBzcGVjaWZpYwotCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDApOwotCSZjcHVpZAkoKTsKLQkmY21wCSgiZWF4IiwweDgwMDAwMDAxKTsKLQkmamIJKCZsYWJlbCgiaW50ZWwiKSk7Ci0JJm1vdgkoImVzaSIsImVheCIpOwotCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDEpOwotCSZjcHVpZAkoKTsKLQkmb3IJKCJlYnAiLCJlY3giKTsKLQkmYW5kCSgiZWJwIiwxPDwxMXwxKTsJIyBpc29sYXRlIFhPUCBiaXQKLQkmY21wCSgiZXNpIiwweDgwMDAwMDA4KTsKLQkmamIJKCZsYWJlbCgiaW50ZWwiKSk7Ci0KLQkmbW92CSgiZWF4IiwweDgwMDAwMDA4KTsKLQkmY3B1aWQJKCk7Ci0JJm1vdnoJKCJlc2kiLCZMQigiZWN4IikpOwkjIG51bWJlciBvZiBjb3JlcyAtIDEKLQkmaW5jCSgiZXNpIik7CQkjIG51bWJlciBvZiBjb3JlcwotCi0JJm1vdgkoImVheCIsMSk7Ci0JJnhvcgkoImVjeCIsImVjeCIpOwotCSZjcHVpZAkoKTsKLQkmYnQJKCJlZHgiLDI4KTsKLQkmam5jCSgmbGFiZWwoImdlbmVyaWMiKSk7Ci0JJnNocgkoImVieCIsMTYpOwotCSZhbmQJKCJlYngiLDB4ZmYpOwotCSZjbXAJKCJlYngiLCJlc2kiKTsKLQkmamEJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKLQkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsJIyBjbGVhciBoeXBlci10aHJlYWRpbmcgYml0Ci0JJmptcAkoJmxhYmVsKCJnZW5lcmljIikpOwotCQotJnNldF9sYWJlbCgiaW50ZWwiKTsKLQkmY21wCSgiZWRpIiw3KTsKLQkmamIJKCZsYWJlbCgiY2FjaGVpbmZvIikpOwotCi0JJm1vdgkoImVzaSIsJndwYXJhbSgwKSk7Ci0JJm1vdgkoImVheCIsNyk7Ci0JJnhvcgkoImVjeCIsImVjeCIpOwotCSZjcHVpZAkoKTsKLQkmbW92CSgmRFdQKDgsImVzaSIpLCJlYngiKTsKLQotJnNldF9sYWJlbCgiY2FjaGVpbmZvIik7Ci0JJmNtcAkoImVkaSIsNCk7Ci0JJm1vdgkoImVkaSIsLTEpOwotCSZqYgkoJmxhYmVsKCJub2NhY2hlaW5mbyIpKTsKLQotCSZtb3YJKCJlYXgiLDQpOwotCSZtb3YJKCJlY3giLDApOwkJIyBxdWVyeSBMMUQKLQkmY3B1aWQJKCk7Ci0JJm1vdgkoImVkaSIsImVheCIpOwotCSZzaHIJKCJlZGkiLDE0KTsKLQkmYW5kCSgiZWRpIiwweGZmZik7CQkjIG51bWJlciBvZiBjb3JlcyAtMSBwZXIgTDFECi0KLSZzZXRfbGFiZWwoIm5vY2FjaGVpbmZvIik7Ci0JJm1vdgkoImVheCIsMSk7Ci0JJnhvcgkoImVjeCIsImVjeCIpOwotCSZjcHVpZAkoKTsKLQkmYW5kCSgiZWR4IiwweGJmZWZmZmZmKTsJIyBmb3JjZSByZXNlcnZlZCBiaXRzICMyMCwgIzMwIHRvIDAKLQkmY21wCSgiZWJwIiwwKTsKLQkmam5lCSgmbGFiZWwoIm5vdGludGVsIikpOwotCSZvcgkoImVkeCIsMTw8MzApOwkJIyBzZXQgcmVzZXJ2ZWQgYml0IzMwIG9uIEludGVsIENQVXMKLSZzZXRfbGFiZWwoIm5vdGludGVsIik7Ci0JJmJ0CSgiZWR4IiwyOCk7CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAotCSZqbmMJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKLQkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsKLQkmY21wCSgiZWRpIiwwKTsKLQkmamUJKCZsYWJlbCgiZ2VuZXJpYyIpKTsKLQotCSZvcgkoImVkeCIsMHgxMDAwMDAwMCk7Ci0JJnNocgkoImVieCIsMTYpOwotCSZjbXAJKCZMQigiZWJ4IiksMSk7Ci0JJmphCSgmbGFiZWwoImdlbmVyaWMiKSk7Ci0JJmFuZAkoImVkeCIsMHhlZmZmZmZmZik7CSMgY2xlYXIgaHlwZXItdGhyZWFkaW5nIGJpdCBpZiBub3QKLQotJnNldF9sYWJlbCgiZ2VuZXJpYyIpOwotCSZhbmQJKCJlYnAiLDE8PDExKTsJCSMgaXNvbGF0ZSBBTUQgWE9QIGZsYWcKLQkmYW5kCSgiZWN4IiwweGZmZmZmN2ZmKTsJIyBmb3JjZSAxMXRoIGJpdCB0byAwCi0JJm1vdgkoImVzaSIsImVkeCIpOwotCSZvcgkoImVicCIsImVjeCIpOwkJIyBtZXJnZSBBTUQgWE9QIGZsYWcKLQotCSZidAkoImVjeCIsMjcpOwkJIyBjaGVjayBPU1hTQVZFIGJpdAotCSZqbmMJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOwotCSZ4b3IJKCJlY3giLCJlY3giKTsKLQkmZGF0YV9ieXRlKDB4MGYsMHgwMSwweGQwKTsJIyB4Z2V0YnYKLQkmYW5kCSgiZWF4Iiw2KTsKLQkmY21wCSgiZWF4Iiw2KTsKLQkmamUJKCZsYWJlbCgiZG9uZSIpKTsKLQkmY21wCSgiZWF4IiwyKTsKLQkmamUJKCZsYWJlbCgiY2xlYXJfYXZ4IikpOwotJnNldF9sYWJlbCgiY2xlYXJfeG1tIik7Ci0JJmFuZAkoImVicCIsMHhmZGZmZmZmZCk7CSMgY2xlYXIgQUVTTkkgYW5kIFBDTE1VTFFEUSBiaXRzCi0JJmFuZAkoImVzaSIsMHhmZWZmZmZmZik7CSMgY2xlYXIgRlhTUgotJnNldF9sYWJlbCgiY2xlYXJfYXZ4Iik7Ci0JJmFuZAkoImVicCIsMHhlZmZmZTdmZik7CSMgY2xlYXIgQVZYLCBGTUEgYW5kIEFNRCBYT1AgYml0cwotCSZtb3YJKCJlZGkiLCZ3cGFyYW0oMCkpOwotCSZhbmQJKCZEV1AoOCwiZWRpIiksMHhmZmZmZmZkZik7CSMgY2xlYXIgQVZYMgotJnNldF9sYWJlbCgiZG9uZSIpOwotCSZtb3YJKCJlYXgiLCJlc2kiKTsKLQkmbW92CSgiZWR4IiwiZWJwIik7Ci0mc2V0X2xhYmVsKCJub2NwdWlkIik7Ci0mZnVuY3Rpb25fZW5kKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKLQotJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpOwotCi0mZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9yZHRzYyIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKLQkmeG9yCSgiZWF4IiwiZWF4Iik7Ci0JJnhvcgkoImVkeCIsImVkeCIpOwotCSZwaWNtZXVwKCJlY3giLCJPUEVOU1NMX2lhMzJjYXBfUCIpOwotCSZidAkoJkRXUCgwLCJlY3giKSw0KTsKLQkmam5jCSgmbGFiZWwoIm5vdHNjIikpOwotCSZyZHRzYwkoKTsKLSZzZXRfbGFiZWwoIm5vdHNjIik7Ci0JJnJldAkoKTsKLSZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9yZHRzYyIpOwotCi0jIFRoaXMgd29ya3MgaW4gUmluZyAwIG9ubHkgW3JlYWQgREpHUFArTVMtRE9TK3ByaXZpbGVnZWQgRFBNSSBob3N0XSwKLSMgYnV0IGl0J3Mgc2FmZSB0byBjYWxsIGl0IG9uIGFueSBbc3VwcG9ydGVkXSAzMi1iaXQgcGxhdGZvcm0uLi4KLSMgSnVzdCBjaGVjayBmb3IgW25vbi1demVybyByZXR1cm4gdmFsdWUuLi4KLSZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2luc3RydW1lbnRfaGFsdCIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKLQkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKLQkmYnQJKCZEV1AoMCwiZWN4IiksNCk7Ci0JJmpuYwkoJmxhYmVsKCJub2hhbHQiKSk7CSMgbm8gVFNDCi0KLQkmZGF0YV93b3JkKDB4OTA1ODkwMGUpOwkJIyBwdXNoICVjczsgcG9wICVlYXgKLQkmYW5kCSgiZWF4IiwzKTsKLQkmam56CSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBub3QgZW5vdWdoIHByaXZpbGVnZXMKLQotCSZwdXNoZgkoKTsKLQkmcG9wCSgiZWF4Iik7Ci0JJmJ0CSgiZWF4Iiw5KTsKLQkmam5jCSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAotCi0JJnJkdHNjCSgpOwotCSZwdXNoCSgiZWR4Iik7Ci0JJnB1c2gJKCJlYXgiKTsKLQkmaGFsdAkoKTsKLQkmcmR0c2MJKCk7Ci0KLQkmc3ViCSgiZWF4IiwmRFdQKDAsImVzcCIpKTsKLQkmc2JiCSgiZWR4IiwmRFdQKDQsImVzcCIpKTsKLQkmYWRkCSgiZXNwIiw4KTsKLQkmcmV0CSgpOwotCi0mc2V0X2xhYmVsKCJub2hhbHQiKTsKLQkmeG9yCSgiZWF4IiwiZWF4Iik7Ci0JJnhvcgkoImVkeCIsImVkeCIpOwotCSZyZXQJKCk7Ci0mZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaW5zdHJ1bWVudF9oYWx0Iik7Ci0KLSMgRXNzZW50aWFsbHkgdGhlcmUgaXMgb25seSBvbmUgdXNlIGZvciB0aGlzIGZ1bmN0aW9uLiBVbmRlciBESkdQUDoKLSMKLSMJI2luY2x1ZGUgPGdvMzIuaD4KLSMJLi4uCi0jCWk9T1BFTlNTTF9mYXJfc3BpbihfZG9zX2RzLDB4NDZjKTsKLSMJLi4uCi0jIHRvIG9idGFpbiB0aGUgbnVtYmVyIG9mIHNwaW5zIHRpbGwgY2xvc2VzdCB0aW1lciBpbnRlcnJ1cHQuCi0KLSZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2Zhcl9zcGluIik7Ci0JJnB1c2hmCSgpOwotCSZwb3AJKCJlYXgiKTsKLQkmYnQJKCJlYXgiLDkpOwotCSZqbmMJKCZsYWJlbCgibm9zcGluIikpOwkjIGludGVycnVwdHMgYXJlIGRpc2FibGVkCi0KLQkmbW92CSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKLQkmbW92CSgiZWN4IiwmRFdQKDgsImVzcCIpKTsKLQkmZGF0YV93b3JkICgweDkwZDg4ZTFlKTsJIyBwdXNoICVkcywgbW92ICVlYXgsJWRzCi0JJnhvcgkoImVheCIsImVheCIpOwotCSZtb3YJKCJlZHgiLCZEV1AoMCwiZWN4IikpOwotCSZqbXAJKCZsYWJlbCgic3BpbiIpKTsKLQotCSZhbGlnbgkoMTYpOwotJnNldF9sYWJlbCgic3BpbiIpOwotCSZpbmMJKCJlYXgiKTsKLQkmY21wCSgiZWR4IiwmRFdQKDAsImVjeCIpKTsKLQkmamUJKCZsYWJlbCgic3BpbiIpKTsKLQotCSZkYXRhX3dvcmQgKDB4MWY5MDkwOTApOwkjIHBvcAklZHMKLQkmcmV0CSgpOwotCi0mc2V0X2xhYmVsKCJub3NwaW4iKTsKLQkmeG9yCSgiZWF4IiwiZWF4Iik7Ci0JJnhvcgkoImVkeCIsImVkeCIpOwotCSZyZXQJKCk7Ci0mZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfZmFyX3NwaW4iKTsKLQotJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfd2lwZV9jcHUiLCJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIik7Ci0JJnhvcgkoImVheCIsImVheCIpOwotCSZ4b3IJKCJlZHgiLCJlZHgiKTsKLQkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKLQkmbW92CSgiZWN4IiwmRFdQKDAsImVjeCIpKTsKLQkmYnQJKCZEV1AoMCwiZWN4IiksMSk7Ci0JJmpuYwkoJmxhYmVsKCJub194ODciKSk7Ci0JaWYgKCRzc2UyKSB7Ci0JCSZhbmQJKCJlY3giLDE8PDI2fDE8PDI0KTsJIyBjaGVjayBTU0UyIGFuZCBGWFNSIGJpdHMKLQkJJmNtcAkoImVjeCIsMTw8MjZ8MTw8MjQpOwotCQkmam5lCSgmbGFiZWwoIm5vX3NzZTIiKSk7Ci0JCSZweG9yCSgieG1tMCIsInhtbTAiKTsKLQkJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOwotCQkmcHhvcgkoInhtbTIiLCJ4bW0yIik7Ci0JCSZweG9yCSgieG1tMyIsInhtbTMiKTsKLQkJJnB4b3IJKCJ4bW00IiwieG1tNCIpOwotCQkmcHhvcgkoInhtbTUiLCJ4bW01Iik7Ci0JCSZweG9yCSgieG1tNiIsInhtbTYiKTsKLQkJJnB4b3IJKCJ4bW03IiwieG1tNyIpOwotCSZzZXRfbGFiZWwoIm5vX3NzZTIiKTsKLQl9Ci0JIyBqdXN0IGEgYnVuY2ggb2YgZmxkeiB0byB6YXAgdGhlIGZwL21tIGJhbmsgZm9sbG93ZWQgYnkgZmluaXQuLi4KLQkmZGF0YV93b3JkKDB4ZWVkOWVlZDksMHhlZWQ5ZWVkOSwweGVlZDllZWQ5LDB4ZWVkOWVlZDksMHg5MGUzZGI5Yik7Ci0mc2V0X2xhYmVsKCJub194ODciKTsKLQkmbGVhCSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKLQkmcmV0CSgpOwotJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX3dpcGVfY3B1Iik7Ci0KLSZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2F0b21pY19hZGQiKTsKLQkmbW92CSgiZWR4IiwmRFdQKDQsImVzcCIpKTsJIyBmZXRjaCB0aGUgcG9pbnRlciwgMXN0IGFyZwotCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNwIikpOwkjIGZldGNoIHRoZSBpbmNyZW1lbnQsIDJuZCBhcmcKLQkmcHVzaAkoImVieCIpOwotCSZub3AJKCk7Ci0JJm1vdgkoImVheCIsJkRXUCgwLCJlZHgiKSk7Ci0mc2V0X2xhYmVsKCJzcGluIik7Ci0JJmxlYQkoImVieCIsJkRXUCgwLCJlYXgiLCJlY3giKSk7Ci0JJm5vcAkoKTsKLQkmZGF0YV93b3JkKDB4MWFiMTBmZjApOwkjIGxvY2s7CWNtcHhjaGcJJWVieCwoJWVkeCkJIyAlZWF4IGlzIGVudm9sdmVkIGFuZCBpcyBhbHdheXMgcmVsb2FkZWQKLQkmam5lCSgmbGFiZWwoInNwaW4iKSk7Ci0JJm1vdgkoImVheCIsImVieCIpOwkjIE9wZW5TU0wgZXhwZWN0cyB0aGUgbmV3IHZhbHVlCi0JJnBvcAkoImVieCIpOwotCSZyZXQJKCk7Ci0mZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfYXRvbWljX2FkZCIpOwotCi0jIFRoaXMgZnVuY3Rpb24gY2FuIGJlY29tZSBoYW5keSB1bmRlciBXaW4zMiBpbiBzaXR1YXRpb25zIHdoZW4KLSMgd2UgZG9uJ3Qga25vdyB3aGljaCBjYWxsaW5nIGNvbnZlbnRpb24sIF9fc3RkY2FsbCBvciBfX2NkZWNsKCopLAotIyBpbmRpcmVjdCBjYWxsZWUgaXMgdXNpbmcuIEluIEMgaXQgY2FuIGJlIGRlcGxveWVkIGFzCi0jCi0jaWZkZWYgT1BFTlNTTF9DUFVJRF9PQkoKLSMJdHlwZSBPUEVOU1NMX2luZGlyZWN0X2NhbGwodm9pZCAqZiwuLi4pOwotIwkuLi4KLSMJT1BFTlNTTF9pbmRpcmVjdF9jYWxsKGZ1bmMsW3VwIHRvICRtYXggYXJndW1lbnRzXSk7Ci0jZW5kaWYKLSMKLSMgKCopCWl0J3MgZGVzaWduZWQgdG8gd29yayBldmVuIGZvciBfX2Zhc3RjYWxsIGlmIG51bWJlciBvZgotIwlhcmd1bWVudHMgaXMgMSBvciAyIQotJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaW5kaXJlY3RfY2FsbCIpOwotCXsKLQlteSAoJG1heCwkaSk9KDcsKTsJIyAkbWF4IGhhcyB0byBiZSBjaG9zZW4gYXMgNCpuLTEKLQkJCQkjIGluIG9yZGVyIHRvIHByZXNlcnZlIGV2ZW50dWFsCi0JCQkJIyBzdGFjayBhbGlnbm1lbnQKLQkmcHVzaAkoImVicCIpOwotCSZtb3YJKCJlYnAiLCJlc3AiKTsKLQkmc3ViCSgiZXNwIiwkbWF4KjQpOwotCSZtb3YJKCJlY3giLCZEV1AoMTIsImVicCIpKTsKLQkmbW92CSgmRFdQKDAsImVzcCIpLCJlY3giKTsKLQkmbW92CSgiZWR4IiwmRFdQKDE2LCJlYnAiKSk7Ci0JJm1vdgkoJkRXUCg0LCJlc3AiKSwiZWR4Iik7Ci0JZm9yKCRpPTI7JGk8JG1heDskaSsrKQotCQl7Ci0JCSMgU29tZSBjb3BpZXMgd2lsbCBiZSByZWR1bmRhbnQvYm9ndXMuLi4KLQkJJm1vdgkoImVheCIsJkRXUCgxMiskaSo0LCJlYnAiKSk7Ci0JCSZtb3YJKCZEV1AoMCskaSo0LCJlc3AiKSwiZWF4Iik7Ci0JCX0KLQkmY2FsbF9wdHIJKCZEV1AoOCwiZWJwIikpOyMgbWFrZSB0aGUgY2FsbC4uLgotCSZtb3YJKCJlc3AiLCJlYnAiKTsJIyAuLi4gYW5kIGp1c3QgcmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlcgotCQkJCSMgd2l0aG91dCBwYXlpbmcgYXR0ZW50aW9uIHRvIHdoYXQgd2UgY2FsbGVkLAotCQkJCSMgKF9fY2RlY2wgKmZ1bmMpIG9yIChfX3N0ZGNhbGwgKm9uZSkuCi0JJnBvcAkoImVicCIpOwotCSZyZXQJKCk7Ci0JfQotJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX2luZGlyZWN0X2NhbGwiKTsKLQotJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaWEzMl9yZHJhbmQiKTsKLQkmbW92CSgiZWN4Iiw4KTsKLSZzZXRfbGFiZWwoImxvb3AiKTsKLQkmcmRyYW5kCSgiZWF4Iik7Ci0JJmpjCSgmbGFiZWwoImJyZWFrIikpOwotCSZsb29wCSgmbGFiZWwoImxvb3AiKSk7Ci0mc2V0X2xhYmVsKCJicmVhayIpOwotCSZjbXAJKCJlYXgiLDApOwotCSZjbW92ZQkoImVheCIsImVjeCIpOwotCSZyZXQJKCk7Ci0mZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaWEzMl9yZHJhbmQiKTsKLQotJmhpZGRlbigiT1BFTlNTTF9pYTMyY2FwX1AiKTsKLQotJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3B1LXg4Nl82NC1hc20ucGwgYi9zcmMvY3J5cHRvL2NwdS14ODZfNjQtYXNtLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWQ3YTZjLi4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vY3B1LXg4Nl82NC1hc20ucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcGVybAotCi0kZmxhdm91ciA9IHNoaWZ0OwotJG91dHB1dCAgPSBzaGlmdDsKLWlmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KLQotJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKLQotJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKLSggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgotKCAkeGxhdGU9IiR7ZGlyfXBlcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgotZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKLQotb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7Ci0qU1RET1VUPSpPVVQ7Ci0KLSgkYXJnMSwkYXJnMiwkYXJnMywkYXJnNCk9JHdpbjY0PygiJXJjeCIsIiVyZHgiLCIlcjgiLCAiJXI5IikgOgkjIFdpbjY0IG9yZGVyCi0JCQkJICgiJXJkaSIsIiVyc2kiLCIlcmR4IiwiJXJjeCIpOwkjIFVuaXggb3JkZXIKLQotcHJpbnQ8PF9fXzsKLS50ZXh0Ci0KLS5nbG9ibAlPUEVOU1NMX2lhMzJfY3B1aWQKLS50eXBlCU9QRU5TU0xfaWEzMl9jcHVpZCxcQGZ1bmN0aW9uLDEKLS5hbGlnbgkxNgotT1BFTlNTTF9pYTMyX2NwdWlkOgotCSMgT24gV2luZG93cywgJGFyZzEgaXMgcmN4LCBidXQgdGhhdCB3aWxsIGJlIGNsb2JiZXJlZC4gU28gbWFrZSBXaW5kb3dzCi0JIyB1c2UgdGhlIHNhbWUgcmVnaXN0ZXIgYXMgVW5peC4KLQltb3YJJGFyZzEsJXJkaQotCW1vdgklcmJ4LCVyOAkJIyBzYXZlICVyYngKLQotCXhvcgklZWF4LCVlYXgKLQltb3YJJWVheCw4KCVyZGkpCQkjIGNsZWFyIDNyZCB3b3JkCi0JY3B1aWQKLQltb3YJJWVheCwlcjExZAkJIyBtYXggdmFsdWUgZm9yIHN0YW5kYXJkIHF1ZXJ5IGxldmVsCi0KLQl4b3IJJWVheCwlZWF4Ci0JY21wCVwkMHg3NTZlNjU0NywlZWJ4CSMgIkdlbnUiCi0Jc2V0bmUJJWFsCi0JbW92CSVlYXgsJXI5ZAotCWNtcAlcJDB4NDk2NTZlNjksJWVkeAkjICJpbmVJIgotCXNldG5lCSVhbAotCW9yCSVlYXgsJXI5ZAotCWNtcAlcJDB4NmM2NTc0NmUsJWVjeAkjICJudGVsIgotCXNldG5lCSVhbAotCW9yCSVlYXgsJXI5ZAkJIyAwIGluZGljYXRlcyBJbnRlbCBDUFUKLQlqegkuTGludGVsCi0KLQljbXAJXCQweDY4NzQ3NTQxLCVlYngJIyAiQXV0aCIKLQlzZXRuZQklYWwKLQltb3YJJWVheCwlcjEwZAotCWNtcAlcJDB4Njk3NDZFNjUsJWVkeAkjICJlbnRpIgotCXNldG5lCSVhbAotCW9yCSVlYXgsJXIxMGQKLQljbXAJXCQweDQ0NEQ0MTYzLCVlY3gJIyAiY0FNRCIKLQlzZXRuZQklYWwKLQlvcgklZWF4LCVyMTBkCQkjIDAgaW5kaWNhdGVzIEFNRCBDUFUKLQlqbnoJLkxpbnRlbAotCi0JIyBBTUQgc3BlY2lmaWMKLQkjIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFtZC5jb20vd29yZHByZXNzL21lZGlhLzIwMTIvMTAvMjU0ODExLnBkZiAoMSkKLQotCW1vdglcJDB4ODAwMDAwMDAsJWVheAotCWNwdWlkCi0JIyBSZXR1cm5zICJUaGUgbGFyZ2VzdCBDUFVJRCBleHRlbmRlZCBmdW5jdGlvbiBpbnB1dCB2YWx1ZSBzdXBwb3J0ZWQgYnkKLQkjIHRoZSBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uIiBpbiBFQVguCi0JY21wCVwkMHg4MDAwMDAwMSwlZWF4Ci0JamIJLkxpbnRlbAotCW1vdgklZWF4LCVyMTBkCi0JbW92CVwkMHg4MDAwMDAwMSwlZWF4Ci0JY3B1aWQKLQkjIFJldHVybnMgZmVhdHVyZSBiaXRzIGluIEVDWC4gU2VlIHBhZ2UgMjAgb2YgWzFdLgotCSMgVE9ETyhmb3JrKTogSSB0aGluayB0aGlzIHNob3VsZCBiZSBhIE1PVi4KLQlvcgklZWN4LCVyOWQKLQlhbmQJXCQweDAwMDAwODAxLCVyOWQJIyBpc29sYXRlIEFNRCBYT1AgYml0LCAxPDwxMQotCi0JY21wCVwkMHg4MDAwMDAwOCwlcjEwZAotCWpiCS5MaW50ZWwKLQotCW1vdglcJDB4ODAwMDAwMDgsJWVheAotCWNwdWlkCi0JIyBSZXR1cm5zIEFQSUMgSUQgYW5kIG51bWJlciBvZiBjb3JlcyBpbiBFQ1guIFNlZSBwYWdlIDI3IG9mIFsxXS4KLQltb3Z6YgklY2wsJXIxMAkJIyBudW1iZXIgb2YgY29yZXMgLSAxCi0JaW5jCSVyMTAJCQkjIG51bWJlciBvZiBjb3JlcwotCi0JbW92CVwkMSwlZWF4Ci0JY3B1aWQKLQkjIFNlZSBwYWdlIDEzIG9mIFsxXS4KLQlidAlcJDI4LCVlZHgJCSMgdGVzdCBoeXBlci10aHJlYWRpbmcgYml0Ci0Jam5jCS5MZ2VuZXJpYwotCXNocglcJDE2LCVlYngJCSMgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycwotCWNtcAklcjEwYiwlYmwKLQlqYQkuTGdlbmVyaWMKLQlhbmQJXCQweGVmZmZmZmZmLCVlZHgJIyBDbGVhciBoeXBlci10aHJlYWRpbmcgYml0LgotCWptcAkuTGdlbmVyaWMKLQotLkxpbnRlbDoKLQljbXAJXCQ0LCVyMTFkCi0JbW92CVwkLTEsJXIxMGQKLQlqYgkuTG5vY2FjaGVpbmZvCi0KLQltb3YJXCQ0LCVlYXgKLQltb3YJXCQwLCVlY3gJCSMgcXVlcnkgTDFECi0JY3B1aWQKLQltb3YJJWVheCwlcjEwZAotCXNocglcJDE0LCVyMTBkCi0JYW5kCVwkMHhmZmYsJXIxMGQJCSMgbnVtYmVyIG9mIGNvcmVzIC0xIHBlciBMMUQKLQotCWNtcAlcJDcsJXIxMWQKLQlqYgkuTG5vY2FjaGVpbmZvCi0KLQltb3YJXCQ3LCVlYXgKLQl4b3IJJWVjeCwlZWN4Ci0JY3B1aWQKLQltb3YJJWVieCw4KCVyZGkpCi0KLS5Mbm9jYWNoZWluZm86Ci0JbW92CVwkMSwlZWF4Ci0JY3B1aWQKLQkjIEdldHMgZmVhdHVyZSBpbmZvcm1hdGlvbi4gU2VlIHRhYmxlIDMtMjEgaW4gdGhlIEludGVsIG1hbnVhbC4KLQlhbmQJXCQweGJmZWZmZmZmLCVlZHgJIyBmb3JjZSByZXNlcnZlZCBiaXRzIHRvIDAKLQljbXAJXCQwLCVyOWQKLQlqbmUJLkxub3RpbnRlbAotCW9yCVwkMHg0MDAwMDAwMCwlZWR4CSMgc2V0IHJlc2VydmVkIGJpdCMzMCBvbiBJbnRlbCBDUFVzCi0uTG5vdGludGVsOgotCWJ0CVwkMjgsJWVkeAkJIyB0ZXN0IGh5cGVyLXRocmVhZGluZyBiaXQKLQlqbmMJLkxnZW5lcmljCi0JYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgfigxPDwyOCkgLSBjbGVhciBoeXBlci10aHJlYWRpbmcuCi0JY21wCVwkMCwlcjEwZAotCWplCS5MZ2VuZXJpYwotCi0Jb3IJXCQweDEwMDAwMDAwLCVlZHgJIyAxPDwyOAotCXNocglcJDE2LCVlYngKLQljbXAJXCQxLCVibAkJCSMgc2VlIGlmIGNhY2hlIGlzIHNoYXJlZAotCWphCS5MZ2VuZXJpYwotCWFuZAlcJDB4ZWZmZmZmZmYsJWVkeAkjIH4oMTw8MjgpCi0uTGdlbmVyaWM6Ci0JYW5kCVwkMHgwMDAwMDgwMCwlcjlkCSMgaXNvbGF0ZSBBTUQgWE9QIGZsYWcKLQlhbmQJXCQweGZmZmZmN2ZmLCVlY3gKLQlvcgklZWN4LCVyOWQJCSMgbWVyZ2UgQU1EIFhPUCBmbGFnCi0KLQltb3YJJWVkeCwlcjEwZAkJIyAlcjlkOiVyMTBkIGlzIGNvcHkgb2YgJWVjeDolZWR4Ci0JYnQJXCQyNywlcjlkCQkjIGNoZWNrIE9TWFNBVkUgYml0Ci0Jam5jCS5MY2xlYXJfYXZ4Ci0JeG9yCSVlY3gsJWVjeAkJIyBYQ1IwCi0JLmJ5dGUJMHgwZiwweDAxLDB4ZDAJCSMgeGdldGJ2Ci0JYW5kCVwkNiwlZWF4CQkjIGlzb2xhdGUgWE1NIGFuZCBZTU0gc3RhdGUgc3VwcG9ydAotCWNtcAlcJDYsJWVheAotCWplCS5MZG9uZQotLkxjbGVhcl9hdng6Ci0JbW92CVwkMHhlZmZmZTdmZiwlZWF4CSMgfigxPDwyOHwxPDwxMnwxPDwxMSkKLQlhbmQJJWVheCwlcjlkCQkjIGNsZWFyIEFWWCwgRk1BIGFuZCBBTUQgWE9QIGJpdHMKLQlhbmRsCVwkMHhmZmZmZmZkZiw4KCVyZGkpCSMgY2xlYXggQVZYMiwgfigxPDw1KQotLkxkb25lOgotCW1vdmwJJXI5ZCw0KCVyZGkpCi0JbW92bAklcjEwZCwwKCVyZGkpCi0JbW92CSVyOCwlcmJ4CQkjIHJlc3RvcmUgJXJieAotCXJldAotLnNpemUJT1BFTlNTTF9pYTMyX2NwdWlkLC4tT1BFTlNTTF9pYTMyX2NwdWlkCi0KLV9fXwotCi1jbG9zZSBTVERPVVQ7CSMgZmx1c2gKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vY3J5cHRvLmMgYi9zcmMvY3J5cHRvL2NyeXB0by5jCmluZGV4IGQ5YmIwN2UuLjM0ZDA0YjQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vY3J5cHRvLmMKKysrIGIvc3JjL2NyeXB0by9jcnlwdG8uYwpAQCAtNTUsNyArNTUsNyBAQAogdWludDMyX3QgT1BFTlNTTF9pYTMyY2FwX1BbNF0gPSB7MH07CiAjZWxpZiBkZWZpbmVkKE9QRU5TU0xfQVJNKSB8fCBkZWZpbmVkKE9QRU5TU0xfQUFSQ0g2NCkKIAotI2luY2x1ZGUgImFybV9hcmNoLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgogCiAjaWYgZGVmaW5lZChfX0FSTV9ORU9OX18pCiB1aW50MzJfdCBPUEVOU1NMX2FybWNhcF9QID0gQVJNVjdfTkVPTiB8IEFSTVY3X05FT05fRlVOQ1RJT05BTDsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGVzL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9kZXMvQ01ha2VMaXN0cy50eHQKaW5kZXggN2Q0OWZmMy4uZjYxZmExNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kZXMvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9kZXMvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGRlcwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kZXMvZGVzLmMgYi9zcmMvY3J5cHRvL2Rlcy9kZXMuYwppbmRleCA5Y2Q3NWY1Li5hNTY2OWE2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Rlcy9kZXMuYworKysgYi9zcmMvY3J5cHRvL2Rlcy9kZXMuYwpAQCAtMjk4LDEwICsyOTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDB9OwogICB1aW50MzJfdCBjLCBkLCB0LCBzLCB0MjsKICAgY29uc3QgdWludDhfdCAqaW47Ci0gIHVpbnQzMl90ICprOwogICBpbnQgaTsKIAotICBrID0gJnNjaGVkdWxlLT5rcy0+ZGVzbG9uZ1swXTsKICAgaW4gPSBrZXktPmJ5dGVzOwogCiAgIGMybChpbiwgYyk7CkBAIC0zNDQsMTAgKzM0MiwxMCBAQAogCiAgICAgLyogdGFibGUgY29udGFpbmVkIDAyMTMgNDY1NyAqLwogICAgIHQyID0gKCh0IDw8IDE2TCkgfCAocyAmIDB4MDAwMGZmZmZMKSkgJiAweGZmZmZmZmZmTDsKLSAgICAqKGsrKykgPSBST1RBVEUodDIsIDMwKSAmIDB4ZmZmZmZmZmZMOworICAgIHNjaGVkdWxlLT5zdWJrZXlzW2ldWzBdID0gUk9UQVRFKHQyLCAzMCkgJiAweGZmZmZmZmZmTDsKIAogICAgIHQyID0gKChzID4+IDE2TCkgfCAodCAmIDB4ZmZmZjAwMDBMKSk7Ci0gICAgKihrKyspID0gUk9UQVRFKHQyLCAyNikgJiAweGZmZmZmZmZmTDsKKyAgICBzY2hlZHVsZS0+c3Via2V5c1tpXVsxXSA9IFJPVEFURSh0MiwgMjYpICYgMHhmZmZmZmZmZkw7CiAgIH0KIH0KIApAQCAtMzgyLDcgKzM4MCw2IEBACiAKIHN0YXRpYyB2b2lkIERFU19lbmNyeXB0MSh1aW50MzJfdCAqZGF0YSwgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MsIGludCBlbmMpIHsKICAgdWludDMyX3QgbCwgciwgdCwgdTsKLSAgY29uc3QgdWludDMyX3QgKnM7CiAKICAgciA9IGRhdGFbMF07CiAgIGwgPSBkYXRhWzFdOwpAQCAtMzk4LDQzICszOTUsNDIgQEAKICAgciA9IFJPVEFURShyLCAyOSkgJiAweGZmZmZmZmZmTDsKICAgbCA9IFJPVEFURShsLCAyOSkgJiAweGZmZmZmZmZmTDsKIAotICBzID0ga3MtPmtzLT5kZXNsb25nOwogICAvKiBJIGRvbid0IGtub3cgaWYgaXQgaXMgd29ydGggdGhlIGVmZm9ydCBvZiBsb29wIHVucm9sbGluZyB0aGUKICAgICogaW5uZXIgbG9vcCAqLwogICBpZiAoZW5jKSB7Ci0gICAgRF9FTkNSWVBUKGwsIHIsIDApOyAgLyogIDEgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMik7ICAvKiAgMiAqLwotICAgIERfRU5DUllQVChsLCByLCA0KTsgIC8qICAzICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDYpOyAgLyogIDQgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgOCk7ICAvKiAgNSAqLwotICAgIERfRU5DUllQVChyLCBsLCAxMCk7IC8qICA2ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDEyKTsgLyogIDcgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMTQpOyAvKiAgOCAqLwotICAgIERfRU5DUllQVChsLCByLCAxNik7IC8qICA5ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDE4KTsgLyogIDEwICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDIwKTsgLyogIDExICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDIyKTsgLyogIDEyICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDI0KTsgLyogIDEzICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDI2KTsgLyogIDE0ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDI4KTsgLyogIDE1ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDMwKTsgLyogIDE2ICovCisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAwKTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDEpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMik7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAzKTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDQpOworICAgIERfRU5DUllQVChrcywgciwgbCwgNSk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCA2KTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDcpOworICAgIERfRU5DUllQVChrcywgbCwgciwgOCk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCA5KTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDEwKTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDExKTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDEyKTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDEzKTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDE0KTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDE1KTsKICAgfSBlbHNlIHsKLSAgICBEX0VOQ1JZUFQobCwgciwgMzApOyAvKiAxNiAqLwotICAgIERfRU5DUllQVChyLCBsLCAyOCk7IC8qIDE1ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDI2KTsgLyogMTQgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMjQpOyAvKiAxMyAqLwotICAgIERfRU5DUllQVChsLCByLCAyMik7IC8qIDEyICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDIwKTsgLyogMTEgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMTgpOyAvKiAxMCAqLwotICAgIERfRU5DUllQVChyLCBsLCAxNik7IC8qICA5ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDE0KTsgLyogIDggKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMTIpOyAvKiAgNyAqLwotICAgIERfRU5DUllQVChsLCByLCAxMCk7IC8qICA2ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDgpOyAgLyogIDUgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgNik7ICAvKiAgNCAqLwotICAgIERfRU5DUllQVChyLCBsLCA0KTsgIC8qICAzICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDIpOyAgLyogIDIgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMCk7ICAvKiAgMSAqLworICAgIERfRU5DUllQVChrcywgbCwgciwgMTUpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTQpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMTMpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTIpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMTEpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTApOworICAgIERfRU5DUllQVChrcywgbCwgciwgOSk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCA4KTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDcpOworICAgIERfRU5DUllQVChrcywgciwgbCwgNik7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCA1KTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDQpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMyk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAyKTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDEpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMCk7CiAgIH0KIAogICAvKiByb3RhdGUgYW5kIGNsZWFyIHRoZSB0b3AgYml0cyBvbiBtYWNoaW5lcyB3aXRoIDhieXRlIGxvbmdzICovCkBAIC00NDgsNyArNDQ0LDYgQEAKIAogc3RhdGljIHZvaWQgREVTX2VuY3J5cHQyKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprcywgaW50IGVuYykgewogICB1aW50MzJfdCBsLCByLCB0LCB1OwotICBjb25zdCB1aW50MzJfdCAqczsKIAogICByID0gZGF0YVswXTsKICAgbCA9IGRhdGFbMV07CkBAIC00NjIsNTIgKzQ1Nyw1MSBAQAogICByID0gUk9UQVRFKHIsIDI5KSAmIDB4ZmZmZmZmZmZMOwogICBsID0gUk9UQVRFKGwsIDI5KSAmIDB4ZmZmZmZmZmZMOwogCi0gIHMgPSBrcy0+a3MtPmRlc2xvbmc7CiAgIC8qIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB3b3J0aCB0aGUgZWZmb3J0IG9mIGxvb3AgdW5yb2xsaW5nIHRoZQogICAgKiBpbm5lciBsb29wICovCiAgIGlmIChlbmMpIHsKLSAgICBEX0VOQ1JZUFQobCwgciwgMCk7ICAvKiAgMSAqLwotICAgIERfRU5DUllQVChyLCBsLCAyKTsgIC8qICAyICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDQpOyAgLyogIDMgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgNik7ICAvKiAgNCAqLwotICAgIERfRU5DUllQVChsLCByLCA4KTsgIC8qICA1ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDEwKTsgLyogIDYgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMTIpOyAvKiAgNyAqLwotICAgIERfRU5DUllQVChyLCBsLCAxNCk7IC8qICA4ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDE2KTsgLyogIDkgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMTgpOyAvKiAgMTAgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMjApOyAvKiAgMTEgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMjIpOyAvKiAgMTIgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMjQpOyAvKiAgMTMgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMjYpOyAvKiAgMTQgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMjgpOyAvKiAgMTUgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMzApOyAvKiAgMTYgKi8KKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDApOworICAgIERfRU5DUllQVChrcywgciwgbCwgMSk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAyKTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDMpOworICAgIERfRU5DUllQVChrcywgbCwgciwgNCk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCA1KTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDYpOworICAgIERfRU5DUllQVChrcywgciwgbCwgNyk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCA4KTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDkpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMTApOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTEpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMTIpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTMpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMTQpOworICAgIERfRU5DUllQVChrcywgciwgbCwgMTUpOwogICB9IGVsc2UgewotICAgIERfRU5DUllQVChsLCByLCAzMCk7IC8qIDE2ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDI4KTsgLyogMTUgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMjYpOyAvKiAxNCAqLwotICAgIERfRU5DUllQVChyLCBsLCAyNCk7IC8qIDEzICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDIyKTsgLyogMTIgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgMjApOyAvKiAxMSAqLwotICAgIERfRU5DUllQVChsLCByLCAxOCk7IC8qIDEwICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDE2KTsgLyogIDkgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMTQpOyAvKiAgOCAqLwotICAgIERfRU5DUllQVChyLCBsLCAxMik7IC8qICA3ICovCi0gICAgRF9FTkNSWVBUKGwsIHIsIDEwKTsgLyogIDYgKi8KLSAgICBEX0VOQ1JZUFQociwgbCwgOCk7ICAvKiAgNSAqLwotICAgIERfRU5DUllQVChsLCByLCA2KTsgIC8qICA0ICovCi0gICAgRF9FTkNSWVBUKHIsIGwsIDQpOyAgLyogIDMgKi8KLSAgICBEX0VOQ1JZUFQobCwgciwgMik7ICAvKiAgMiAqLwotICAgIERfRU5DUllQVChyLCBsLCAwKTsgIC8qICAxICovCisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxNSk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxNCk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMyk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMik7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAxMSk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAxMCk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCA5KTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDgpOworICAgIERfRU5DUllQVChrcywgbCwgciwgNyk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCA2KTsKKyAgICBEX0VOQ1JZUFQoa3MsIGwsIHIsIDUpOworICAgIERfRU5DUllQVChrcywgciwgbCwgNCk7CisgICAgRF9FTkNSWVBUKGtzLCBsLCByLCAzKTsKKyAgICBEX0VOQ1JZUFQoa3MsIHIsIGwsIDIpOworICAgIERfRU5DUllQVChrcywgbCwgciwgMSk7CisgICAgRF9FTkNSWVBUKGtzLCByLCBsLCAwKTsKICAgfQogICAvKiByb3RhdGUgYW5kIGNsZWFyIHRoZSB0b3AgYml0cyBvbiBtYWNoaW5lcyB3aXRoIDhieXRlIGxvbmdzICovCiAgIGRhdGFbMF0gPSBST1RBVEUobCwgMykgJiAweGZmZmZmZmZmTDsKICAgZGF0YVsxXSA9IFJPVEFURShyLCAzKSAmIDB4ZmZmZmZmZmZMOwogfQogCi1zdGF0aWMgdm9pZCBERVNfZW5jcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CisvKiBERVNfZW5jcnlwdDMgaXMgbm90IHN0YXRpYyBiZWNhdXNlIGl0J3MgdXNlZCBpbiBkZWNyZXBpdC4gKi8KK3ZvaWQgREVTX2VuY3J5cHQzKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczEsCisgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMykgewogICB1aW50MzJfdCBsLCByOwogCiAgIGwgPSBkYXRhWzBdOwpAQCAtNTI1LDkgKzUxOSw5IEBACiAgIGRhdGFbMV0gPSByOwogfQogCi1zdGF0aWMgdm9pZCBERVNfZGVjcnlwdDModWludDMyX3QgKmRhdGEsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgREVTX2tleV9zY2hlZHVsZSAqa3MzKSB7CisvKiBERVNfZGVjcnlwdDMgaXMgbm90IHN0YXRpYyBiZWNhdXNlIGl0J3MgdXNlZCBpbiBkZWNyZXBpdC4gKi8KK3ZvaWQgREVTX2RlY3J5cHQzKHVpbnQzMl90ICpkYXRhLCBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczEsCisgICAgICAgICAgICAgICAgICBjb25zdCBERVNfa2V5X3NjaGVkdWxlICprczIsIGNvbnN0IERFU19rZXlfc2NoZWR1bGUgKmtzMykgewogICB1aW50MzJfdCBsLCByOwogCiAgIGwgPSBkYXRhWzBdOwpAQCAtNzcwLDMgKzc2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jKSB7CiAgIERFU19lZGUzX2NiY19lbmNyeXB0KGluLCBvdXQsIGxlbiwga3MxLCBrczIsIGtzMSwgaXZlYywgZW5jKTsKIH0KKworCisvKiBEZXByZWNhdGVkIGZ1bmN0aW9ucy4gKi8KKwordm9pZCBERVNfc2V0X2tleV91bmNoZWNrZWQoY29uc3QgREVTX2NibG9jayAqa2V5LCBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSkgeworICBERVNfc2V0X2tleShrZXksIHNjaGVkdWxlKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGVzL2ludGVybmFsLmggYi9zcmMvY3J5cHRvL2Rlcy9pbnRlcm5hbC5oCmluZGV4IGQzYTVjZWMuLjkxNTU5ZmYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZGVzL2ludGVybmFsLmgKKysrIGIvc3JjL2NyeXB0by9kZXMvaW50ZXJuYWwuaApAQCAtMTgzLDEzICsxODMsMTMgQEAKICAgICBQRVJNX09QKGwsIHIsIHR0LCA0LCAweDBmMGYwZjBmTCk7ICBcCiAgIH0KIAotI2RlZmluZSBMT0FEX0RBVEEoUiwgUywgdSwgdCwgRTAsIEUxKSBcCi0gIHUgPSBSIF4gc1tTXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ID0gUiBeIHNbUyArIDFdCisjZGVmaW5lIExPQURfREFUQShrcywgUiwgUywgdSwgdCwgRTAsIEUxKSBcCisgIHUgPSBSIF4ga3MtPnN1YmtleXNbU11bMF07ICAgICAgICAgICAgICBcCisgIHQgPSBSIF4ga3MtPnN1YmtleXNbU11bMV0KIAotI2RlZmluZSBEX0VOQ1JZUFQoTEwsIFIsIFMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgRF9FTkNSWVBUKGtzLCBMTCwgUiwgUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExPQURfREFUQShSLCBTLCB1LCB0LCBFMCwgRTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEX0RBVEEoa3MsIFIsIFMsIHUsIHQsIEUwLCBFMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdCA9IFJPVEFURSh0LCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIExMIF49ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgREVTX1NQdHJhbnNbMF1bKHUgPj4gMkwpICYgMHgzZl0gXiBERVNfU1B0cmFuc1syXVsodSA+PiAxMEwpICYgMHgzZl0gXiBcCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RoL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9kaC9DTWFrZUxpc3RzLnR4dAppbmRleCBkMGMxZGE3Li4xYTQ2NTEyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RoL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZGgvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGRoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RoL2RoLmMgYi9zcmMvY3J5cHRvL2RoL2RoLmMKaW5kZXggOTZiODVmMy4uZDI1ZjM1OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaC9kaC5jCisrKyBiL3NyYy9jcnlwdG8vZGgvZGguYwpAQCAtNzgsNyArNzgsNyBAQAogREggKkRIX25ld19tZXRob2QoY29uc3QgRU5HSU5FICplbmdpbmUpIHsKICAgREggKmRoID0gKERIICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKERIKSk7CiAgIGlmIChkaCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIERIX25ld19tZXRob2QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGgvZGhfaW1wbC5jIGIvc3JjL2NyeXB0by9kaC9kaF9pbXBsLmMKaW5kZXggZjI2OTQxMi4uNmNmMGFiYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaC9kaF9pbXBsLmMKKysrIGIvc3JjL2NyeXB0by9kaC9kaF9pbXBsLmMKQEAgLTExNyw3ICsxMTcsNyBAQAogICB9CiAKICAgaWYgKGdlbmVyYXRvciA8PSAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIGdlbmVyYXRlX3BhcmFtZXRlcnMsIERIX1JfQkFEX0dFTkVSQVRPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIERIX1JfQkFEX0dFTkVSQVRPUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKGdlbmVyYXRvciA9PSBESF9HRU5FUkFUT1JfMikgewpAQCAtMTY1LDcgKzE2NSw3IEBACiAKIGVycjoKICAgaWYgKCFvaykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBnZW5lcmF0ZV9wYXJhbWV0ZXJzLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBFUlJfUl9CTl9MSUIpOwogICB9CiAKICAgaWYgKGN0eCAhPSBOVUxMKSB7CkBAIC0yNDIsNyArMjQyLDcgQEAKIAogZXJyOgogICBpZiAob2sgIT0gMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBnZW5lcmF0ZV9rZXksIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoREgsIEVSUl9SX0JOX0xJQik7CiAgIH0KIAogICBpZiAoZGgtPnB1Yl9rZXkgPT0gTlVMTCkgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAgIEJJR05VTSBsb2NhbF9wcml2OwogCiAgIGlmIChCTl9udW1fYml0cyhkaC0+cCkgPiBPUEVOU1NMX0RIX01BWF9NT0RVTFVTX0JJVFMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgY29tcHV0ZV9rZXksIERIX1JfTU9EVUxVU19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9SX01PRFVMVVNfVE9PX0xBUkdFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yNzksNyArMjc5LDcgQEAKICAgfQogCiAgIGlmIChkaC0+cHJpdl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBjb21wdXRlX2tleSwgREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yOTAsMTQgKzI5MCwxNCBAQAogICB9CiAKICAgaWYgKCFESF9jaGVja19wdWJfa2V5KGRoLCBwdWJfa2V5LCAmY2hlY2tfcmVzdWx0KSB8fCBjaGVja19yZXN1bHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgY29tcHV0ZV9rZXksIERIX1JfSU5WQUxJRF9QVUJLRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBESF9SX0lOVkFMSURfUFVCS0VZKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIEJOX3dpdGhfZmxhZ3MoJmxvY2FsX3ByaXYsIGRoLT5wcml2X2tleSwgQk5fRkxHX0NPTlNUVElNRSk7CiAgIGlmICghQk5fbW9kX2V4cF9tb250KHNoYXJlZF9rZXksIHB1Yl9rZXksICZsb2NhbF9wcml2LCBkaC0+cCwgY3R4LAogICAgICAgICAgICAgICAgICAgICAgICBtb250KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERILCBjb21wdXRlX2tleSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihESCwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RpZ2VzdC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZGlnZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IDgxNmQxMTYuLjg1NmU0NWEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZGlnZXN0L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZGlnZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBkaWdlc3QKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZGlnZXN0L2RpZ2VzdC5jIGIvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0LmMKaW5kZXggZjA5OTQ4Yi4uZWI3MWIwNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0LmMKKysrIGIvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0LmMKQEAgLTExNiw4ICsxMTYsNyBAQAogICB1aW50OF90ICp0bXBfYnVmID0gTlVMTDsKIAogICBpZiAoaW4gPT0gTlVMTCB8fCBpbi0+ZGlnZXN0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihESUdFU1QsIEVWUF9NRF9DVFhfY29weV9leCwKLSAgICAgICAgICAgICAgICAgICAgICBESUdFU1RfUl9JTlBVVF9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRElHRVNUX1JfSU5QVVRfTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzAsMTUgKzEyOSwxNSBAQAogICB9CiAKICAgRVZQX01EX0NUWF9jbGVhbnVwKG91dCk7Ci0gIG1lbWNweShvdXQsIGluLCBzaXplb2YoRVZQX01EX0NUWCkpOwogCisgIG91dC0+ZGlnZXN0ID0gaW4tPmRpZ2VzdDsKICAgaWYgKGluLT5tZF9kYXRhICYmIGluLT5kaWdlc3QtPmN0eF9zaXplKSB7CiAgICAgaWYgKHRtcF9idWYpIHsKICAgICAgIG91dC0+bWRfZGF0YSA9IHRtcF9idWY7CiAgICAgfSBlbHNlIHsKICAgICAgIG91dC0+bWRfZGF0YSA9IE9QRU5TU0xfbWFsbG9jKGluLT5kaWdlc3QtPmN0eF9zaXplKTsKICAgICAgIGlmICghb3V0LT5tZF9kYXRhKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRVZQX01EX0NUWF9jb3B5X2V4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKERJR0VTVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICB9CkBAIC0xNDYsNiArMTQ1LDcgQEAKICAgfQogCiAgIGFzc2VydChpbi0+cGN0eCA9PSBOVUxMIHx8IGluLT5wY3R4X29wcyAhPSBOVUxMKTsKKyAgb3V0LT5wY3R4X29wcyA9IGluLT5wY3R4X29wczsKICAgaWYgKGluLT5wY3R4ICYmIGluLT5wY3R4X29wcykgewogICAgIG91dC0+cGN0eCA9IGluLT5wY3R4X29wcy0+ZHVwKGluLT5wY3R4KTsKICAgICBpZiAoIW91dC0+cGN0eCkgewpAQCAtMTY0LDMwICsxNjQsMjAgQEAKIAogaW50IEVWUF9EaWdlc3RJbml0X2V4KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmVuZ2luZSkgewogICBpZiAoY3R4LT5kaWdlc3QgIT0gdHlwZSkgewotICAgIGlmIChjdHgtPmRpZ2VzdCAmJiBjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpIHsKKyAgICBpZiAoY3R4LT5kaWdlc3QgJiYgY3R4LT5kaWdlc3QtPmN0eF9zaXplID4gMCkgewogICAgICAgT1BFTlNTTF9mcmVlKGN0eC0+bWRfZGF0YSk7CiAgICAgfQogICAgIGN0eC0+ZGlnZXN0ID0gdHlwZTsKLSAgICBpZiAoIShjdHgtPmZsYWdzICYgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQpICYmIHR5cGUtPmN0eF9zaXplKSB7Ci0gICAgICBjdHgtPnVwZGF0ZSA9IHR5cGUtPnVwZGF0ZTsKKyAgICBpZiAodHlwZS0+Y3R4X3NpemUgPiAwKSB7CiAgICAgICBjdHgtPm1kX2RhdGEgPSBPUEVOU1NMX21hbGxvYyh0eXBlLT5jdHhfc2l6ZSk7CiAgICAgICBpZiAoY3R4LT5tZF9kYXRhID09IE5VTEwpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRElHRVNULCBFVlBfRGlnZXN0SW5pdF9leCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihESUdFU1QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgYXNzZXJ0KGN0eC0+cGN0eCA9PSBOVUxMIHx8IGN0eC0+cGN0eF9vcHMgIT0gTlVMTCk7Ci0gIGlmIChjdHgtPnBjdHhfb3BzKSB7Ci0gICAgaWYgKCFjdHgtPnBjdHhfb3BzLT5iZWdpbl9kaWdlc3QoY3R4KSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGN0eC0+ZmxhZ3MgJiBFVlBfTURfQ1RYX0ZMQUdfTk9fSU5JVCkgewotICAgIHJldHVybiAxOwotICB9CiAKICAgY3R4LT5kaWdlc3QtPmluaXQoY3R4KTsKICAgcmV0dXJuIDE7CkBAIC0xOTksNyArMTg5LDcgQEAKIH0KIAogaW50IEVWUF9EaWdlc3RVcGRhdGUoRVZQX01EX0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7Ci0gIGN0eC0+dXBkYXRlKGN0eCwgZGF0YSwgbGVuKTsKKyAgY3R4LT5kaWdlc3QtPnVwZGF0ZShjdHgsIGRhdGEsIGxlbik7CiAgIHJldHVybiAxOwogfQogCkBAIC0yMTQsNyArMjA0LDcgQEAKIH0KIAogaW50IEVWUF9EaWdlc3RGaW5hbChFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm1kLCB1bnNpZ25lZCBpbnQgKnNpemUpIHsKLSAgRVZQX0RpZ2VzdEZpbmFsX2V4KGN0eCwgbWQsIHNpemUpOworICAodm9pZClFVlBfRGlnZXN0RmluYWxfZXgoY3R4LCBtZCwgc2l6ZSk7CiAgIEVWUF9NRF9DVFhfY2xlYW51cChjdHgpOwogICByZXR1cm4gMTsKIH0KQEAgLTI1MywxMCArMjQzLDYgQEAKICAgcmV0dXJuIEVWUF9NRF90eXBlKEVWUF9NRF9DVFhfbWQoY3R4KSk7CiB9CiAKLXZvaWQgRVZQX01EX0NUWF9zZXRfZmxhZ3MoRVZQX01EX0NUWCAqY3R4LCB1aW50MzJfdCBmbGFncykgewotICBjdHgtPmZsYWdzIHw9IGZsYWdzOwotfQotCiBpbnQgRVZQX2FkZF9kaWdlc3QoY29uc3QgRVZQX01EICpkaWdlc3QpIHsKICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3RzLmMgYi9zcmMvY3J5cHRvL2RpZ2VzdC9kaWdlc3RzLmMKaW5kZXggZjVlZGEzNi4uMzMwN2YyNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kaWdlc3QvZGlnZXN0cy5jCisrKyBiL3NyYy9jcnlwdG8vZGlnZXN0L2RpZ2VzdHMuYwpAQCAtNjcsNyArNjcsNyBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpZiBkZWZpbmVkKE5ERUJVRykKLSNkZWZpbmUgQ0hFQ0soeCkgeAorI2RlZmluZSBDSEVDSyh4KSAodm9pZCkgKHgpCiAjZWxzZQogI2RlZmluZSBDSEVDSyh4KSBhc3NlcnQoeCkKICNlbmRpZgpAQCAtMjYyLDYgKzI2Miw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5pZF90b19kaWdlc3QgbmlkX3RvX2RpZ2VzdF9tYXBwaW5nW10gPSB7CisgIHsgTklEX21kNCwgRVZQX21kNCwgU05fbWQ0LCBMTl9tZDQgfSwKICAgeyBOSURfbWQ1LCBFVlBfbWQ1LCBTTl9tZDUsIExOX21kNSB9LAogICB7IE5JRF9zaGExLCBFVlBfc2hhMSwgU05fc2hhMSwgTE5fc2hhMSB9LAogICB7IE5JRF9zaGEyMjQsIEVWUF9zaGEyMjQsIFNOX3NoYTIyNCwgTE5fc2hhMjI0IH0sCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RpZ2VzdC9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9kaWdlc3QvaW50ZXJuYWwuaAppbmRleCAxNTcyZmE4Li5lM2Q4MTJhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RpZ2VzdC9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vZGlnZXN0L2ludGVybmFsLmgKQEAgLTkyLDcgKzkyLDcgQEAKIH07CiAKIC8qIGV2cF9tZF9wY3R4X29wcyBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyB0byBhbGxvdyB0aGUgfHBjdHh8IG1lbWJlciBvZgotICogfEVWUF9NRF9DVFh8IHRvIGJlIG1hbmlwdWxhdGVkIHdpdGhvdXQgYnJlYWtpbmcgbGF5aW5nIGJ5IGNhbGxpbmcgRVZQCisgKiB8RVZQX01EX0NUWHwgdG8gYmUgbWFuaXB1bGF0ZWQgd2l0aG91dCBicmVha2luZyBsYXllcmluZyBieSBjYWxsaW5nIEVWUAogICogZnVuY3Rpb25zLiAqLwogc3RydWN0IGV2cF9tZF9wY3R4X29wcyB7CiAgIC8qIGZyZWUgaXMgY2FsbGVkIHdoZW4gYW4gfEVWUF9NRF9DVFh8IGlzIGJlaW5nIGZyZWVkIGFuZCB0aGUgfHBjdHh8IGFsc28KQEAgLTEwMiwyMyArMTAyLDggQEAKICAgLyogZHVwIGlzIGNhbGxlZCB3aGVuIGFuIHxFVlBfTURfQ1RYfCBpcyBjb3BpZWQgYW5kIHNvIHRoZSB8cGN0eHwgYWxzbyBuZWVkcwogICAgKiB0byBiZSBjb3BpZWQuICovCiAgIEVWUF9QS0VZX0NUWCogKCpkdXApIChFVlBfUEtFWV9DVFggKnBjdHgpOwotCi0gIC8qIGJlZ2luX2RpZ2VzdCBpcyBjYWxsZWQgd2hlbiBhIG5ldyBkaWdlc3Qgb3BlcmF0aW9uIGlzIHN0YXJ0ZWQuIEl0IHJldHVybnMKLSAgICogb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb3RoZXJ3aXNlLiAqLwotICBpbnQgKCpiZWdpbl9kaWdlc3QpIChFVlBfTURfQ1RYICpjdHgpOwogfTsKIAotLyogRVZQX01EX0NUWF9zZXRfZmxhZ3MgT1JzIHxmbGFnc3wgaW50byB0aGUgZmxhZ3MgbWVtYmVyIG9mIHxjdHh8LiAqLwotT1BFTlNTTF9FWFBPUlQgdm9pZCBFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIHVpbnQzMl90IGZsYWdzKTsKLQotLyogRVZQX01EX0NUWF9GTEFHX05PX0lOSVQgY2F1c2VzIHRoZSB8RVZQX01EfCdzIHxpbml0fCBmdW5jdGlvbiBub3QgdG8gYmUKLSAqIGNhbGxlZCwgdGhlIHx1cGRhdGV8IG1lbWJlciBub3QgdG8gYmUgY29waWVkIGZyb20gdGhlIHxFVlBfTUR8IGluCi0gKiB8RVZQX0RpZ2VzdEluaXRfZXh8IGFuZCBmb3IgfG1kX2RhdGF8IG5vdCB0byBiZSBpbml0aWFsaXNlZC4KLSAqCi0gKiBUT0RPKGRhdmlkYmVuKTogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgfEVWUF9QS0VZX0hNQUN8IGFuZCBjYW4KLSAqIGJlIHJlbW92ZWQgd2hlbiBpdCBpcyBnb25lLiAqLwotI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfTk9fSU5JVCAxCi0KIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiB9ICAvKiBleHRlcm4gQyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kc2EvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dAppbmRleCAxYmI4YjYzLi5lOGI3NzkzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2RzYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZHNhCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2RzYS9kc2EuYyBiL3NyYy9jcnlwdG8vZHNhL2RzYS5jCmluZGV4IDY1NDQ0YjEuLjNmZjI5YzQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZHNhL2RzYS5jCisrKyBiL3NyYy9jcnlwdG8vZHNhL2RzYS5jCkBAIC04Miw3ICs4Miw3IEBACiBEU0EgKkRTQV9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CiAgIERTQSAqZHNhID0gKERTQSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihEU0EpKTsKICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfbmV3X21ldGhvZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZHNhL2RzYV9hc24xLmMgYi9zcmMvY3J5cHRvL2RzYS9kc2FfYXNuMS5jCmluZGV4IDkzM2ZiYTcuLmI2YjNmYTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZHNhL2RzYV9hc24xLmMKKysrIGIvc3JjL2NyeXB0by9kc2EvZHNhX2FzbjEuYwpAQCAtNzMsNyArNzMsNyBAQAogICBEU0FfU0lHICpzaWc7CiAgIHNpZyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihEU0FfU0lHKSk7CiAgIGlmICghc2lnKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBkc2Ffc2lnX2NiLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9kc2EvZHNhX2ltcGwuYyBiL3NyYy9jcnlwdG8vZHNhL2RzYV9pbXBsLmMKaW5kZXggMmFiOGJhOC4uYjEwNjEwZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9kc2EvZHNhX2ltcGwuYworKysgYi9zcmMvY3J5cHRvL2RzYS9kc2FfaW1wbC5jCkBAIC04Myw3ICs4Myw3IEBACiAgIGludCByZXQgPSAwOwogCiAgIGlmICghZHNhLT5wIHx8ICFkc2EtPnEgfHwgIWRzYS0+ZykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgc2lnbl9zZXR1cCwgRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTcxLDcgKzE3MSw3IEBACiAKIGVycjoKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHNpZ25fc2V0dXAsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBFUlJfUl9CTl9MSUIpOwogICAgIGlmIChyICE9IE5VTEwpIHsKICAgICAgIEJOX2NsZWFyX2ZyZWUocik7CiAgICAgfQpAQCAtMjY5LDcgKzI2OSw3IEBACiAKIGVycjoKICAgaWYgKCFyZXQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHNpZ24sIHJlYXNvbik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCByZWFzb24pOwogICAgIEJOX2ZyZWUocik7CiAgICAgQk5fZnJlZShzKTsKICAgfQpAQCAtMjkyLDE5ICsyOTIsMTkgQEAKICAgKm91dF92YWxpZCA9IDA7CiAKICAgaWYgKCFkc2EtPnAgfHwgIWRzYS0+cSB8fCAhZHNhLT5nKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCB2ZXJpZnksIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaSA9IEJOX251bV9iaXRzKGRzYS0+cSk7CiAgIC8qIGZpcHMgMTg2LTMgYWxsb3dzIG9ubHkgZGlmZmVyZW50IHNpemVzIGZvciBxICovCiAgIGlmIChpICE9IDE2MCAmJiBpICE9IDIyNCAmJiBpICE9IDI1NikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgdmVyaWZ5LCBEU0FfUl9CQURfUV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRFNBLCBEU0FfUl9CQURfUV9WQUxVRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoQk5fbnVtX2JpdHMoZHNhLT5wKSA+IE9QRU5TU0xfRFNBX01BWF9NT0RVTFVTX0JJVFMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihEU0EsIHZlcmlmeSwgRFNBX1JfTU9EVUxVU19UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgRFNBX1JfTU9EVUxVU19UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM4MSw3ICszODEsNyBAQAogCiBlcnI6CiAgIGlmIChyZXQgIT0gMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKERTQSwgRVJSX1JfQk5fTElCKTsKICAgfQogICBCTl9DVFhfZnJlZShjdHgpOwogICBCTl9mcmVlKCZ1MSk7CkBAIC00ODcsMTYgKzQ4NywxNCBAQAogCiAgIGJpdHMgPSAoYml0cyArIDYzKSAvIDY0ICogNjQ7CiAKLSAgLyogTkI6IHNlZWRfbGVuID09IDAgaXMgc3BlY2lhbCBjYXNlOiBjb3B5IGdlbmVyYXRlZCBzZWVkIHRvCi0gICAqIHNlZWRfaW4gaWYgaXQgaXMgbm90IE5VTEwuICovCi0gIGlmIChzZWVkX2xlbiAmJiAoc2VlZF9sZW4gPCAoc2l6ZV90KXFzaXplKSkgewotICAgIHNlZWRfaW4gPSBOVUxMOyAvKiBzZWVkIGJ1ZmZlciB0b28gc21hbGwgLS0gaWdub3JlICovCi0gIH0KLSAgaWYgKHNlZWRfbGVuID4gKHNpemVfdClxc2l6ZSkgewotICAgIHNlZWRfbGVuID0gcXNpemU7IC8qIEFwcC4gMi4yIG9mIEZJUFMgUFVCIDE4NiBhbGxvd3MgbGFyZ2VyIFNFRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICogYnV0IG91ciBpbnRlcm5hbCBidWZmZXJzIGFyZSByZXN0cmljdGVkIHRvIDE2MCBiaXRzKi8KLSAgfQogICBpZiAoc2VlZF9pbiAhPSBOVUxMKSB7CisgICAgaWYgKHNlZWRfbGVuIDwgKHNpemVfdClxc2l6ZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzZWVkX2xlbiA+IChzaXplX3QpcXNpemUpIHsKKyAgICAgIC8qIE9ubHkgY29uc3VtZSBhcyBtdWNoIHNlZWQgYXMgaXMgZXhwZWN0ZWQuICovCisgICAgICBzZWVkX2xlbiA9IHFzaXplOworICAgIH0KICAgICBtZW1jcHkoc2VlZCwgc2VlZF9pbiwgc2VlZF9sZW4pOwogICB9CiAKQEAgLTUyNywyMSArNTI1LDE5IEBACiAgIGZvciAoOzspIHsKICAgICAvKiBGaW5kIHEuICovCiAgICAgZm9yICg7OykgewotICAgICAgaW50IHNlZWRfaXNfcmFuZG9tOwotCiAgICAgICAvKiBzdGVwIDEgKi8KICAgICAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMCwgbSsrKSkgewogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIAotICAgICAgaWYgKCFzZWVkX2xlbikgeworICAgICAgaW50IHVzZV9yYW5kb21fc2VlZCA9IChzZWVkX2luID09IE5VTEwpOworICAgICAgaWYgKHVzZV9yYW5kb21fc2VlZCkgewogICAgICAgICBpZiAoIVJBTkRfYnl0ZXMoc2VlZCwgcXNpemUpKSB7CiAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KLSAgICAgICAgc2VlZF9pc19yYW5kb20gPSAxOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2VlZF9pc19yYW5kb20gPSAwOwotICAgICAgICBzZWVkX2xlbiA9IDA7IC8qIHVzZSByYW5kb20gc2VlZCBpZiAnc2VlZF9pbicgdHVybnMgb3V0IHRvIGJlIGJhZCovCisgICAgICAgIC8qIElmIHdlIGNvbWUgYmFjayB0aHJvdWdoLCB1c2UgcmFuZG9tIHNlZWQgbmV4dCB0aW1lLiAqLworICAgICAgICBzZWVkX2luID0gTlVMTDsKICAgICAgIH0KICAgICAgIG1lbWNweShidWYsIHNlZWQsIHFzaXplKTsKICAgICAgIG1lbWNweShidWYyLCBzZWVkLCBxc2l6ZSk7CkBAIC01NzAsNyArNTY2LDcgQEAKICAgICAgIH0KIAogICAgICAgLyogc3RlcCA0ICovCi0gICAgICByID0gQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgocSwgRFNTX3ByaW1lX2NoZWNrcywgY3R4LCBzZWVkX2lzX3JhbmRvbSwgY2IpOworICAgICAgciA9IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KHEsIERTU19wcmltZV9jaGVja3MsIGN0eCwgdXNlX3JhbmRvbV9zZWVkLCBjYik7CiAgICAgICBpZiAociA+IDApIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9lYy9DTWFrZUxpc3RzLnR4dAppbmRleCBiNWViZWZhLi4zOGE5MWY4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZWMvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGVjCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL2VjLmMgYi9zcmMvY3J5cHRvL2VjL2VjLmMKaW5kZXggZjM4ZWJhNi4uMzExN2YxNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lYy9lYy5jCisrKyBiL3NyYy9jcnlwdG8vZWMvZWMuYwpAQCAtMjIyLDcgKzIyMiwxMSBAQAogICAgIHtOSURfc2VjcDIyNHIxLCAmUDIyNCwgMH0sCiAgICAgewogICAgICAgICBOSURfWDlfNjJfcHJpbWUyNTZ2MSwgJlAyNTYsCi0jaWYgZGVmaW5lZChPUEVOU1NMXzY0X0JJVCkgJiYgIWRlZmluZWQoT1BFTlNTTF9XSU5ET1dTKQorICAgIC8qIE1TQU4gYXBwZWFycyB0byBoYXZlIGEgYnVnIHRoYXQgY2F1c2VzIHRoaXMgUC0yNTYgY29kZSB0byBiZSBtaXNjb21waWxlZAorICAgICAqIGluIG9wdCBtb2RlLiBXaGlsZSB0aGF0IGlzIGJlaW5nIGxvb2tlZCBhdCwgZG9uJ3QgcnVuIHRoZSB1aW50MTI4X3QKKyAgICAgKiBQLTI1NiBjb2RlIHVuZGVyIE1TQU4gZm9yIG5vdy4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfNjRfQklUKSAmJiAhZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpICYmIFwKKyAgICAhZGVmaW5lZChNRU1PUllfU0FOSVRJWkVSKQogICAgICAgICBFQ19HRnBfbmlzdHAyNTZfbWV0aG9kLAogI2Vsc2UKICAgICAgICAgMCwKQEAgLTIzNywxOCArMjQxLDE4IEBACiAgIEVDX0dST1VQICpyZXQ7CiAKICAgaWYgKG1ldGggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXcsIEVDX1JfU0xPVF9GVUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9TTE9UX0ZVTEwpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgaWYgKG1ldGgtPmdyb3VwX2luaXQgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXcsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICByZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfR1JPVVApKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEVDX0dST1VQKSk7CkBAIC0yNzYsOCArMjgwLDcgQEAKICAgfQogCiAgIGlmIChyZXQtPm1ldGgtPmdyb3VwX3NldF9jdXJ2ZSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIXJldC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlKHJldCwgcCwgYSwgYiwgY3R4KSkgewpAQCAtMzI5LDcgKzMzMiw3IEBACiAgIEVDX0dST1VQICpncm91cCA9IE5VTEw7CiAgIEVDX1BPSU5UICpQID0gTlVMTDsKICAgQk5fQ1RYICpjdHggPSBOVUxMOwotICBCSUdOVU0gKnAgPSBOVUxMLCAqYSA9IE5VTEwsICpiID0gTlVMTCwgKnggPSBOVUxMLCAqeSA9IE5VTEwsICpvcmRlciA9IE5VTEw7CisgIEJJR05VTSAqcCA9IE5VTEwsICphID0gTlVMTCwgKmIgPSBOVUxMLCAqeCA9IE5VTEwsICp5ID0gTlVMTDsKICAgaW50IG9rID0gMDsKICAgdW5zaWduZWQgcGFyYW1fbGVuOwogICBjb25zdCBFQ19NRVRIT0QgKm1ldGg7CkBAIC0zMzcsNyArMzQwLDcgQEAKICAgY29uc3QgdWludDhfdCAqcGFyYW1zOwogCiAgIGlmICgoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTM0OCw3ICszNTEsNyBAQAogICBpZiAoIShwID0gQk5fYmluMmJuKHBhcmFtcyArIDAgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpIHx8CiAgICAgICAhKGEgPSBCTl9iaW4yYm4ocGFyYW1zICsgMSAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkgfHwKICAgICAgICEoYiA9IEJOX2JpbjJibihwYXJhbXMgKyAyICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTM1Niw0NSArMzU5LDM5IEBACiAgICAgbWV0aCA9IGN1cnZlLT5tZXRob2QoKTsKICAgICBpZiAoKChncm91cCA9IGVjX2dyb3VwX25ldyhtZXRoKSkgPT0gTlVMTCkgfHwKICAgICAgICAgKCEoZ3JvdXAtPm1ldGgtPmdyb3VwX3NldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KSkpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgewogICAgIGlmICgoZ3JvdXAgPSBFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKHAsIGEsIGIsIGN0eCkpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19ncm91cF9uZXdfZnJvbV9kYXRhLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KIAogICBpZiAoKFAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2dyb3VwX25ld19mcm9tX2RhdGEsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoISh4ID0gQk5fYmluMmJuKHBhcmFtcyArIDMgKiBwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpIHx8CiAgICAgICAhKHkgPSBCTl9iaW4yYm4ocGFyYW1zICsgNCAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIHksIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQotICBpZiAoIShvcmRlciA9IEJOX2JpbjJibihwYXJhbXMgKyA1ICogcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSB8fAotICAgICAgIUJOX3NldF93b3JkKHgsIChCTl9VTE9ORylkYXRhLT5jb2ZhY3RvcikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfQk5fTElCKTsKKyAgaWYgKCFCTl9iaW4yYm4ocGFyYW1zICsgNSAqIHBhcmFtX2xlbiwgcGFyYW1fbGVuLCAmZ3JvdXAtPm9yZGVyKSB8fAorICAgICAgIUJOX3NldF93b3JkKCZncm91cC0+Y29mYWN0b3IsIChCTl9VTE9ORylkYXRhLT5jb2ZhY3RvcikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGdyb3VwLT5nZW5lcmF0b3IgPSBQOwogICBQID0gTlVMTDsKLSAgaWYgKCFCTl9jb3B5KCZncm91cC0+b3JkZXIsIG9yZGVyKSB8fAotICAgICAgIUJOX3NldF93b3JkKCZncm91cC0+Y29mYWN0b3IsIChCTl9VTE9ORylkYXRhLT5jb2ZhY3RvcikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfZ3JvdXBfbmV3X2Zyb21fZGF0YSwgRVJSX1JfQk5fTElCKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCiAgIG9rID0gMTsKIAogZXJyOgpAQCAtNDA3LDcgKzQwNCw2IEBACiAgIEJOX2ZyZWUocCk7CiAgIEJOX2ZyZWUoYSk7CiAgIEJOX2ZyZWUoYik7Ci0gIEJOX2ZyZWUob3JkZXIpOwogICBCTl9mcmVlKHgpOwogICBCTl9mcmVlKHkpOwogICByZXR1cm4gZ3JvdXA7CkBAIC00MjcsNyArNDIzLDcgQEAKICAgfQogCiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSwgRUNfUl9VTktOT1dOX0dST1VQKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9VTktOT1dOX0dST1VQKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC00NTUsMTEgKzQ1MSwxMSBAQAogCiBpbnQgZWNfZ3JvdXBfY29weShFQ19HUk9VUCAqZGVzdCwgY29uc3QgRUNfR1JPVVAgKnNyYykgewogICBpZiAoZGVzdC0+bWV0aC0+Z3JvdXBfY29weSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2NvcHksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGRlc3QtPm1ldGggIT0gc3JjLT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2NvcHksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZGVzdCA9PSBzcmMpIHsKQEAgLTU1NCw4ICs1NTAsNyBAQAogaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKm91dF9wLCBCSUdOVU0gKm91dF9hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICpvdXRfYiwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5ncm91cF9nZXRfY3VydmUgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19HUk9VUF9nZXRfY3VydmVfR0ZwLAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5ncm91cF9nZXRfY3VydmUoZ3JvdXAsIG91dF9wLCBvdXRfYSwgb3V0X2IsIGN0eCk7CkBAIC01NjUsOCArNTYwLDcgQEAKIAogaW50IEVDX0dST1VQX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKmdyb3VwKSB7CiAgIGlmIChncm91cC0+bWV0aC0+Z3JvdXBfZ2V0X2RlZ3JlZSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0dST1VQX2dldF9kZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9kZWdyZWUoZ3JvdXApOwpAQCAtNjAyLDE3ICs1OTYsMTcgQEAKICAgRUNfUE9JTlQgKnJldDsKIAogICBpZiAoZ3JvdXAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9uZXcsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9pbml0ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfbmV3LCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mICpyZXQpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC02NTMsMTEgKzY0NywxMSBAQAogCiBpbnQgRUNfUE9JTlRfY29weShFQ19QT0lOVCAqZGVzdCwgY29uc3QgRUNfUE9JTlQgKnNyYykgewogICBpZiAoZGVzdC0+bWV0aC0+cG9pbnRfY29weSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2NvcHksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGRlc3QtPm1ldGggIT0gc3JjLT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2NvcHksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZGVzdCA9PSBzcmMpIHsKQEAgLTY3Niw3ICs2NzAsNyBAQAogCiAgIHQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOwogICBpZiAodCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2R1cCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgciA9IEVDX1BPSU5UX2NvcHkodCwgYSk7CkBAIC02OTAsMTIgKzY4NCwxMSBAQAogCiBpbnQgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X3RvX2luZmluaXR5ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5LAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF90b19pbmZpbml0eSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCBwb2ludCk7CkBAIC03MDMsMTIgKzY5NiwxMSBAQAogCiBpbnQgRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5pc19hdF9pbmZpbml0eSA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2lzX2F0X2luZmluaXR5LAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2lzX2F0X2luZmluaXR5LCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpOwpAQCAtNzE3LDEyICs3MDksMTEgQEAKIGludCBFQ19QT0lOVF9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPmlzX29uX2N1cnZlID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaXNfb25fY3VydmUsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaXNfb25fY3VydmUsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmlzX29uX2N1cnZlKGdyb3VwLCBwb2ludCwgY3R4KTsKQEAgLTczMSwxMSArNzIyLDExIEBACiBpbnQgRUNfUE9JTlRfY21wKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLAogICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2NtcCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2NtcCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgaWYgKChncm91cC0+bWV0aCAhPSBhLT5tZXRoKSB8fCAoYS0+bWV0aCAhPSBiLT5tZXRoKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9jbXAsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9jbXAoZ3JvdXAsIGEsIGIsIGN0eCk7CkBAIC03NDMsMTIgKzczNCwxMSBAQAogCiBpbnQgRUNfUE9JTlRfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+bWFrZV9hZmZpbmUgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9tYWtlX2FmZmluZSwKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9tYWtlX2FmZmluZSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBncm91cC0+bWV0aC0+bWFrZV9hZmZpbmUoZ3JvdXAsIHBvaW50LCBjdHgpOwpAQCAtNzU5LDEzICs3NDksMTIgQEAKICAgc2l6ZV90IGk7CiAKICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludHNfbWFrZV9hZmZpbmUgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVHNfbWFrZV9hZmZpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnRzW2ldLT5tZXRoKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRzX21ha2VfYWZmaW5lLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQpAQCAtNzc2LDEzICs3NjUsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIEJJR05VTSAqeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwLAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwLAotICAgICAgICAgICAgICAgICAgICAgIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpOwpAQCAtNzkyLDEzICs3NzksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwKLSAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKQEAgLTgwNywxMiArNzkyLDEyIEBACiBpbnQgRUNfUE9JTlRfYWRkKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLAogICAgICAgICAgICAgICAgICBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5hZGQgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9hZGQsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKChncm91cC0+bWV0aCAhPSByLT5tZXRoKSB8fCAoci0+bWV0aCAhPSBhLT5tZXRoKSB8fAogICAgICAgKGEtPm1ldGggIT0gYi0+bWV0aCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfYWRkLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5hZGQoZ3JvdXAsIHIsIGEsIGIsIGN0eCk7CkBAIC04MjIsMTEgKzgwNywxMSBAQAogaW50IEVDX1BPSU5UX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwKICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5kYmwgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kYmwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKChncm91cC0+bWV0aCAhPSByLT5tZXRoKSB8fCAoci0+bWV0aCAhPSBhLT5tZXRoKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9kYmwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gZ3JvdXAtPm1ldGgtPmRibChncm91cCwgciwgYSwgY3R4KTsKQEAgLTgzNSwxMSArODIwLDExIEBACiAKIGludCBFQ19QT0lOVF9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5pbnZlcnQgPT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9pbnZlcnQsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IGEtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfaW52ZXJ0LCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5pbnZlcnQoZ3JvdXAsIGEsIGN0eCk7CkBAIC04NzQsMTMgKzg1OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KSB7CiAgIGlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKLSAgICAgICAgICAgICAgICAgICAgICBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWMvZWNfYXNuMS5jIGIvc3JjL2NyeXB0by9lYy9lY19hc24xLmMKaW5kZXggZmYzZGNhNi4uMzFkODk0NCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lYy9lY19hc24xLmMKKysrIGIvc3JjL2NyeXB0by9lYy9lY19hc24xLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogICBpZiAocmV0ID09IE5VTEwpIHsKICAgICByZXQgPSBFQ1BLUEFSQU1FVEVSU19uZXcoKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTE5Niw3ICsxOTYsNyBAQAogICBpbnQgbmlkID0gTklEX3VuZGVmOwogCiAgIGlmIChwYXJhbXMgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cCwgRUNfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUyk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtMjIyLDE0ICsyMjIsMTMgQEAKICAgfQogCiAgIGlmIChuaWQgPT0gTklEX3VuZGVmKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwLCBFQ19SX05PTl9OQU1FRF9DVVJWRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfTk9OX05BTUVEX0NVUlZFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIHJldCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBFQ19SX0VDX0dST1VQX05FV19CWV9OQU1FX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0VDX0dST1VQX05FV19CWV9OQU1FX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTI0MywxNCArMjQyLDE0IEBACiAKICAgcGFyYW1zID0gZDJpX0VDUEtQQVJBTUVURVJTKE5VTEwsIGlucCwgbGVuKTsKICAgaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BLUGFyYW1ldGVycywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUpOwogICAgIEVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGdyb3VwID0gZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAocGFyYW1zKTsKICAgaWYgKGdyb3VwID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUEtQYXJhbWV0ZXJzLCBFQ19SX1BLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9QS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRSk7CiAgICAgRUNQS1BBUkFNRVRFUlNfZnJlZShwYXJhbXMpOwogICAgIHJldHVybiBOVUxMOwogICB9CkBAIC0yNjgsMTIgKzI2NywxMiBAQAogICBpbnQgcmV0ID0gMDsKICAgRUNQS1BBUkFNRVRFUlMgKnRtcCA9IGVjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzKGdyb3VwLCBOVUxMKTsKICAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1BLUGFyYW1ldGVycywgRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfR1JPVVAyUEtQQVJBTUVURVJTX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldCA9IGkyZF9FQ1BLUEFSQU1FVEVSUyh0bXAsIG91dHApOwogICBpZiAocmV0ID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUEtQYXJhbWV0ZXJzLCBFQ19SX0kyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CiAgICAgRUNQS1BBUkFNRVRFUlNfZnJlZSh0bXApOwogICAgIHJldHVybiAwOwogICB9CkBAIC0yODgsMTQgKzI4NywxNCBAQAogCiAgIHByaXZfa2V5ID0gZDJpX0VDX1BSSVZBVEVLRVkoTlVMTCwgaW4sIGxlbik7CiAgIGlmIChwcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICBpZiAoYSA9PSBOVUxMIHx8ICphID09IE5VTEwpIHsKICAgICByZXQgPSBFQ19LRVlfbmV3KCk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTMwOCw3ICszMDcsNyBAQAogICB9CiAKICAgaWYgKHJldC0+Z3JvdXAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTMxOSwxOCArMzE4LDE4IEBACiAgICAgICAgIEJOX2JpbjJibihNX0FTTjFfU1RSSU5HX2RhdGEocHJpdl9rZXktPnByaXZhdGVLZXkpLAogICAgICAgICAgICAgICAgICAgTV9BU04xX1NUUklOR19sZW5ndGgocHJpdl9rZXktPnByaXZhdGVLZXkpLCByZXQtPnByaXZfa2V5KTsKICAgICBpZiAocmV0LT5wcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfQk5fTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFQ19SX01JU1NJTkdfUFJJVkFURV9LRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX01JU1NJTkdfUFJJVkFURV9LRVkpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgRUNfUE9JTlRfZnJlZShyZXQtPnB1Yl9rZXkpOwogICByZXQtPnB1Yl9rZXkgPSBFQ19QT0lOVF9uZXcocmV0LT5ncm91cCk7CiAgIGlmIChyZXQtPnB1Yl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQcml2YXRlS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTM0MiwyMCArMzQxLDIwIEBACiAgICAgcHViX29jdF9sZW4gPSBNX0FTTjFfU1RSSU5HX2xlbmd0aChwcml2X2tleS0+cHVibGljS2V5KTsKICAgICAvKiBUaGUgZmlyc3QgYnl0ZSAodGhlIHBvaW50IGNvbnZlcnNpb24gZm9ybSkgbXVzdCBiZSBwcmVzZW50LiAqLwogICAgIGlmIChwdWJfb2N0X2xlbiA8PSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIC8qIFNhdmUgdGhlIHBvaW50IGNvbnZlcnNpb24gZm9ybS4gKi8KICAgICByZXQtPmNvbnZfZm9ybSA9IChwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCkocHViX29jdFswXSAmIH4weDAxKTsKICAgICBpZiAoIUVDX1BPSU5UX29jdDJwb2ludChyZXQtPmdyb3VwLCByZXQtPnB1Yl9rZXksIHB1Yl9vY3QsIHB1Yl9vY3RfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZDJpX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgewogICAgIGlmICghRUNfUE9JTlRfbXVsKHJldC0+Z3JvdXAsIHJldC0+cHViX2tleSwgcmV0LT5wcml2X2tleSwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICAvKiBSZW1lbWJlciB0aGUgb3JpZ2luYWwgcHJpdmF0ZS1rZXktb25seSBlbmNvZGluZy4gKi8KQEAgLTM4NywxMyArMzg2LDEzIEBACiAgIEVDX1BSSVZBVEVLRVkgKnByaXZfa2V5ID0gTlVMTDsKIAogICBpZiAoa2V5ID09IE5VTEwgfHwga2V5LT5ncm91cCA9PSBOVUxMIHx8IGtleS0+cHJpdl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgcHJpdl9rZXkgPSBFQ19QUklWQVRFS0VZX25ldygpOwogICBpZiAocHJpdl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00MDIsMTcgKzQwMSwxNyBAQAogICBidWZfbGVuID0gQk5fbnVtX2J5dGVzKCZrZXktPmdyb3VwLT5vcmRlcik7CiAgIGJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pOwogICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQoYnVmZmVyLCBidWZfbGVuLCBrZXktPnByaXZfa2V5KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFNX0FTTjFfT0NURVRfU1RSSU5HX3NldChwcml2X2tleS0+cHJpdmF0ZUtleSwgYnVmZmVyLCBidWZfbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBpMmRfRUNQcml2YXRlS2V5LCBFUlJfUl9BU04xX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0FTTjFfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00MjAsNyArNDE5LDcgQEAKICAgaWYgKCEoa2V5LT5lbmNfZmxhZyAmIEVDX1BLRVlfTk9fUEFSQU1FVEVSUykpIHsKICAgICBpZiAoKHByaXZfa2V5LT5wYXJhbWV0ZXJzID0gZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoCiAgICAgICAgICAgICAga2V5LT5ncm91cCwgcHJpdl9rZXktPnBhcmFtZXRlcnMpKSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC00MjksNyArNDI4LDcgQEAKICAgaWYgKCEoa2V5LT5lbmNfZmxhZyAmIEVDX1BLRVlfTk9fUFVCS0VZKSAmJiBrZXktPnB1Yl9rZXkgIT0gTlVMTCkgewogICAgIHByaXZfa2V5LT5wdWJsaWNLZXkgPSBNX0FTTjFfQklUX1NUUklOR19uZXcoKTsKICAgICBpZiAocHJpdl9rZXktPnB1YmxpY0tleSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNDM5LDcgKzQzOCw3IEBACiAgICAgaWYgKHRtcF9sZW4gPiBidWZfbGVuKSB7CiAgICAgICB1aW50OF90ICp0bXBfYnVmZmVyID0gT1BFTlNTTF9yZWFsbG9jKGJ1ZmZlciwgdG1wX2xlbik7CiAgICAgICBpZiAoIXRtcF9idWZmZXIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBidWZmZXIgPSB0bXBfYnVmZmVyOwpAQCAtNDQ4LDIxICs0NDcsMjEgQEAKIAogICAgIGlmICghRUNfUE9JTlRfcG9pbnQyb2N0KGtleS0+Z3JvdXAsIGtleS0+cHViX2tleSwga2V5LT5jb252X2Zvcm0sIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfbGVuLCBOVUxMKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIHByaXZfa2V5LT5wdWJsaWNLZXktPmZsYWdzICY9IH4oQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQgfCAweDA3KTsKICAgICBwcml2X2tleS0+cHVibGljS2V5LT5mbGFncyB8PSBBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKICAgICBpZiAoIU1fQVNOMV9CSVRfU1RSSU5HX3NldChwcml2X2tleS0+cHVibGljS2V5LCBidWZmZXIsIGJ1Zl9sZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUHJpdmF0ZUtleSwgRVJSX1JfQVNOMV9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0FTTjFfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQogCiAgIHJldCA9IGkyZF9FQ19QUklWQVRFS0VZKHByaXZfa2V5LCBvdXRwKTsKICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyZF9FQ1ByaXZhdGVLZXksIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgb2sgPSAxOwpAQCAtNDc1LDcgKzQ3NCw3IEBACiAKIGludCBpMmRfRUNQYXJhbWV0ZXJzKGNvbnN0IEVDX0tFWSAqa2V5LCB1aW50OF90ICoqb3V0cCkgewogICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJkX0VDUGFyYW1ldGVycywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gaTJkX0VDUEtQYXJhbWV0ZXJzKGtleS0+Z3JvdXAsIG91dHApOwpAQCAtNDg1LDE0ICs0ODQsMTQgQEAKICAgRUNfS0VZICpyZXQ7CiAKICAgaWYgKGlucCA9PSBOVUxMIHx8ICppbnAgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQYXJhbWV0ZXJzLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgaWYgKGtleSA9PSBOVUxMIHx8ICprZXkgPT0gTlVMTCkgewogICAgIHJldCA9IEVDX0tFWV9uZXcoKTsKICAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBkMmlfRUNQYXJhbWV0ZXJzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICB9IGVsc2UgewpAQCAtNTAwLDcgKzQ5OSw3IEBACiAgIH0KIAogICBpZiAoIWQyaV9FQ1BLUGFyYW1ldGVycygmcmV0LT5ncm91cCwgaW5wLCBsZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGQyaV9FQ1BhcmFtZXRlcnMsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgaWYgKGtleSA9PSBOVUxMIHx8ICprZXkgPT0gTlVMTCkgewogICAgICAgRUNfS0VZX2ZyZWUocmV0KTsKICAgICB9CkBAIC01MTcsMTcgKzUxNiwxNyBAQAogICBFQ19LRVkgKnJldCA9IE5VTEw7CiAKICAgaWYgKGtleXAgPT0gTlVMTCB8fCAqa2V5cCA9PSBOVUxMIHx8ICgqa2V5cCktPmdyb3VwID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgbzJpX0VDUHVibGljS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldCA9ICprZXlwOwogICBpZiAocmV0LT5wdWJfa2V5ID09IE5VTEwgJiYKICAgICAgIChyZXQtPnB1Yl9rZXkgPSBFQ19QT0lOVF9uZXcocmV0LT5ncm91cCkpID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgbzJpX0VDUHVibGljS2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIUVDX1BPSU5UX29jdDJwb2ludChyZXQtPmdyb3VwLCByZXQtPnB1Yl9rZXksICppbnAsIGxlbiwgTlVMTCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgbzJpX0VDUHVibGljS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIC8qIHNhdmUgdGhlIHBvaW50IGNvbnZlcnNpb24gZm9ybSAqLwpAQCAtNTQxLDcgKzU0MCw3IEBACiAgIGludCBuZXdfYnVmZmVyID0gMDsKIAogICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJvX0VDUHVibGljS2V5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTU1NiwxNCArNTU1LDE0IEBACiAgIGlmICgqb3V0cCA9PSBOVUxMKSB7CiAgICAgKm91dHAgPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuKTsKICAgICBpZiAoKm91dHAgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGkyb19FQ1B1YmxpY0tleSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBuZXdfYnVmZmVyID0gMTsKICAgfQogICBpZiAoIUVDX1BPSU5UX3BvaW50Mm9jdChrZXktPmdyb3VwLCBrZXktPnB1Yl9rZXksIGtleS0+Y29udl9mb3JtLCAqb3V0cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2xlbiwgTlVMTCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgaTJvX0VDUHVibGljS2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgIGlmIChuZXdfYnVmZmVyKSB7CiAgICAgICBPUEVOU1NMX2ZyZWUoKm91dHApOwogICAgICAgKm91dHAgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy9lY19rZXkuYyBiL3NyYy9jcnlwdG8vZWMvZWNfa2V5LmMKaW5kZXggZTVjYmZlZC4uMGRlZmE5OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lYy9lY19rZXkuYworKysgYi9zcmMvY3J5cHRvL2VjL2VjX2tleS5jCkBAIC04Nyw3ICs4Nyw3IEBACiBFQ19LRVkgKkVDX0tFWV9uZXdfbWV0aG9kKGNvbnN0IEVOR0lORSAqZW5naW5lKSB7CiAgIEVDX0tFWSAqcmV0ID0gKEVDX0tFWSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19LRVkpKTsKICAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9uZXdfbWV0aG9kLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0xMjcsNyArMTI3LDcgQEAKIEVDX0tFWSAqRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGludCBuaWQpIHsKICAgRUNfS0VZICpyZXQgPSBFQ19LRVlfbmV3KCk7CiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHJldC0+Z3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIEVDX0tFWSAqRUNfS0VZX2NvcHkoRUNfS0VZICpkZXN0LCBjb25zdCBFQ19LRVkgKnNyYykgewogICBpZiAoZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9jb3B5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIC8qIENvcHkgdGhlIHBhcmFtZXRlcnMuICovCkBAIC0zMDAsMTIgKzMwMCwxMiBAQAogICBFQ19QT0lOVCAqcG9pbnQgPSBOVUxMOwogCiAgIGlmICghZWNrZXkgfHwgIWVja2V5LT5ncm91cCB8fCAhZWNrZXktPnB1Yl9rZXkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShlY2tleS0+Z3JvdXAsIGVja2V5LT5wdWJfa2V5KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX1BPSU5UX0FUX0lORklOSVRZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzE5LDcgKzMxOSw3IEBACiAKICAgLyogdGVzdGluZyB3aGV0aGVyIHRoZSBwdWJfa2V5IGlzIG9uIHRoZSBlbGxpcHRpYyBjdXJ2ZSAqLwogICBpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGVja2V5LT5ncm91cCwgZWNrZXktPnB1Yl9rZXksIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgLyogdGVzdGluZyB3aGV0aGVyIHB1Yl9rZXkgKiBvcmRlciBpcyB0aGUgcG9pbnQgYXQgaW5maW5pdHkgKi8KQEAgLTMyNywxNSArMzI3LDE1IEBACiAgICAqIHRvIGNoZWNrIHRoZSBwcml2YXRlIGtleSwgYmVsb3c/ICovCiAgIG9yZGVyID0gJmVja2V5LT5ncm91cC0+b3JkZXI7CiAgIGlmIChCTl9pc196ZXJvKG9yZGVyKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghRUNfUE9JTlRfbXVsKGVja2V5LT5ncm91cCwgcG9pbnQsIE5VTEwsIGVja2V5LT5wdWJfa2V5LCBvcmRlciwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZWNrZXktPmdyb3VwLCBwb2ludCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9XUk9OR19PUkRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfV1JPTkdfT1JERVIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIC8qIGluIGNhc2UgdGhlIHByaXZfa2V5IGlzIHByZXNlbnQgOgpAQCAtMzQzLDE1ICszNDMsMTUgQEAKICAgICovCiAgIGlmIChlY2tleS0+cHJpdl9rZXkpIHsKICAgICBpZiAoQk5fY21wKGVja2V5LT5wcml2X2tleSwgb3JkZXIpID49IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFQ19SX1dST05HX09SREVSKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1dST05HX09SREVSKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoIUVDX1BPSU5UX211bChlY2tleS0+Z3JvdXAsIHBvaW50LCBlY2tleS0+cHJpdl9rZXksIE5VTEwsIE5VTEwsIGN0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfY2hlY2tfa2V5LCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKEVDX1BPSU5UX2NtcChlY2tleS0+Z3JvdXAsIHBvaW50LCBlY2tleS0+cHViX2tleSwgY3R4KSAhPSAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfS0VZX2NoZWNrX2tleSwgRUNfUl9JTlZBTElEX1BSSVZBVEVfS0VZKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfUFJJVkFURV9LRVkpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0zNzEsOCArMzcxLDcgQEAKICAgaW50IG9rID0gMDsKIAogICBpZiAoIWtleSB8fCAha2V5LT5ncm91cCB8fCAheCB8fCAheSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzLAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgY3R4ID0gQk5fQ1RYX25ldygpOwpAQCAtMzk0LDggKzM5Myw3IEBACiAgIC8qIENoZWNrIGlmIHJldHJpZXZlZCBjb29yZGluYXRlcyBtYXRjaCBvcmlnaW5hbHM6IGlmIG5vdCB2YWx1ZXMKICAgICogYXJlIG91dCBvZiByYW5nZS4gKi8KICAgaWYgKEJOX2NtcCh4LCB0eCkgfHwgQk5fY21wKHksIHR5KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzLAotICAgICAgICAgICAgICAgICAgICAgIEVDX1JfQ09PUkRJTkFURVNfT1VUX09GX1JBTkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9DT09SRElOQVRFU19PVVRfT0ZfUkFOR0UpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTQyMiw3ICs0MjAsNyBAQAogICBFQ19QT0lOVCAqcHViX2tleSA9IE5VTEw7CiAKICAgaWYgKCFlY2tleSB8fCAhZWNrZXktPmdyb3VwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX0tFWV9nZW5lcmF0ZV9rZXksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy9lY19tb250Z29tZXJ5LmMgYi9zcmMvY3J5cHRvL2VjL2VjX21vbnRnb21lcnkuYwppbmRleCA3NGRiYzZjLi5iODk3MDAwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL2VjX21vbnRnb21lcnkuYworKysgYi9zcmMvY3J5cHRvL2VjL2VjX21vbnRnb21lcnkuYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFCTl9NT05UX0NUWF9zZXQobW9udCwgcCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgb25lID0gQk5fbmV3KCk7CkBAIC0yMzIsNyArMjMyLDcgQEAKIGludCBlY19HRnBfbW9udF9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1vbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9tdWwsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI0Miw3ICsyNDIsNyBAQAogaW50IGVjX0dGcF9tb250X2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1vbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9zcXIsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI1Miw3ICsyNTIsNyBAQAogaW50IGVjX0dGcF9tb250X2ZpZWxkX2VuY29kZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1vbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9lbmNvZGUsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI2Miw3ICsyNjIsNyBAQAogaW50IGVjX0dGcF9tb250X2ZpZWxkX2RlY29kZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1vbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbW9udF9maWVsZF9kZWNvZGUsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI3Miw3ICsyNzIsNyBAQAogaW50IGVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm9uZSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUsIEVDX1JfTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWMvb2N0LmMgYi9zcmMvY3J5cHRvL2VjL29jdC5jCmluZGV4IDgxNmE0MmYuLmNiNTBlMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWMvb2N0LmMKKysrIGIvc3JjL2NyeXB0by9lYy9vY3QuYwpAQCAtODUsNyArODUsNyBAQAogCiAgIGlmICgoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQpICYmCiAgICAgICAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsIEVDX1JfSU5WQUxJRF9GT1JNKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0ZPUk0pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAvKiBlbmNvZGVzIHRvIGEgc2luZ2xlIDAgb2N0ZXQgKi8KICAgICBpZiAoYnVmICE9IE5VTEwpIHsKICAgICAgIGlmIChsZW4gPCAxKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgICAgIHJldHVybiAwOwogICAgICAgfQogICAgICAgYnVmWzBdID0gMDsKQEAgLTExMCw3ICsxMTAsNyBAQAogICAvKiBpZiAnYnVmJyBpcyBOVUxMLCBqdXN0IHJldHVybiByZXF1aXJlZCBsZW5ndGggKi8KICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CiAgICAgaWYgKGxlbiA8IHJldCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTE0MiwyMSArMTQyLDIxIEBACiAgICAgaSA9IDE7CiAKICAgICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQoYnVmICsgaSwgZmllbGRfbGVuLCB4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGkgKz0gZmllbGRfbGVuOwogCiAgICAgaWYgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpIHsKICAgICAgIGlmICghQk5fYm4yYmluX3BhZGRlZChidWYgKyBpLCBmaWVsZF9sZW4sIHkpKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICAgIGkgKz0gZmllbGRfbGVuOwogICAgIH0KIAogICAgIGlmIChpICE9IHJldCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnQyb2N0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0xODcsNyArMTg3LDcgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAgIGZvcm0gPSBidWZbMF07CkBAIC0xOTUsMTcgKzE5NSwxNyBAQAogICBmb3JtID0gZm9ybSAmIH4xVTsKICAgaWYgKChmb3JtICE9IDApICYmIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkgJiYKICAgICAgIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoKGZvcm0gPT0gMCB8fCBmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEKSAmJiB5X2JpdCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChmb3JtID09IDApIHsKICAgICBpZiAobGVuICE9IDEpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX29jdDJwb2ludCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yMTcsNyArMjE3LDcgQEAKICAgICAgIChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkgPyAxICsgZmllbGRfbGVuIDogMSArIDIgKiBmaWVsZF9sZW47CiAKICAgaWYgKGxlbiAhPSBlbmNfbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIzMSw3ICsyMzEsNyBAQAogICBCTl9DVFhfc3RhcnQoY3R4KTsKICAgeCA9IEJOX0NUWF9nZXQoY3R4KTsKICAgeSA9IEJOX0NUWF9nZXQoY3R4KTsKLSAgaWYgKHkgPT0gTlVMTCkgeworICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkgewogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmIChCTl91Y21wKHgsICZncm91cC0+ZmllbGQpID49IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKEJOX3VjbXAoeSwgJmdyb3VwLT5maWVsZCkgPj0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiAgIC8qIHRlc3QgcmVxdWlyZWQgYnkgWDkuNjIgKi8KICAgaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgcG9pbnQsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsIEVDX1JfUE9JTlRfSVNfTk9UX09OX0NVUlZFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTI3OSwxMiArMjc5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5vY3QycG9pbnQgPT0gMCAmJgogICAgICAgIShncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfb2N0MnBvaW50LAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX29jdDJwb2ludCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkgewpAQCAtMjk5LDEyICsyOTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKGdyb3VwLT5tZXRoLT5wb2ludDJvY3QgPT0gMCAmJgogICAgICAgIShncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUE9JTlRfcG9pbnQyb2N0LAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3BvaW50Mm9jdCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkgewpAQCAtNDA2LDkgKzQwNCw5IEBACiAgICAgaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9CTiAmJgogICAgICAgICBFUlJfR0VUX1JFQVNPTihlcnIpID09IEJOX1JfTk9UX0FfU1FVQVJFKSB7CiAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NFRF9QT0lOVCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9JTlZBTElEX0NPTVBSRVNTRURfUE9JTlQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywgRVJSX1JfQk5fTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIH0KICAgICBnb3RvIGVycjsKICAgfQpAQCAtNDIzLDEyICs0MjEsMTAgQEAKICAgICAgIH0KIAogICAgICAgaWYgKGtyb24gPT0gMSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTlZBTElEX0NPTVBSRVNTSU9OX0JJVCk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIEJOX21vZF9zcXJ0KCkgc2hvdWxkIGhhdmUgY291Z2h0IHRoaXMgZXJyb3IgKG5vdCBhIHNxdWFyZSkgKi8KLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKICAgICAgIH0KICAgICAgIGdvdG8gZXJyOwogICAgIH0KQEAgLTQzNyw4ICs0MzMsNyBAQAogICAgIH0KICAgfQogICBpZiAoeV9iaXQgIT0gQk5faXNfb2RkKHkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDU5LDEzICs0NTQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfYml0LCBCTl9DVFggKmN0eCkgewogICBpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzID09IDAgJiYKICAgICAgICEoZ3JvdXAtPm1ldGgtPmZsYWdzICYgRUNfRkxBR1NfREVGQVVMVF9PQ1QpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCwKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAsCi0gICAgICAgICAgICAgICAgICAgICAgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChncm91cC0+bWV0aC0+ZmxhZ3MgJiBFQ19GTEFHU19ERUZBVUxUX09DVCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy9wMjU2LTY0LmMgYi9zcmMvY3J5cHRvL2VjL3AyNTYtNjQuYwppbmRleCBmZGI5NDJjLi4zOTQ2YjI5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL3AyNTYtNjQuYworKysgYi9zcmMvY3J5cHRvL2VjL3AyNTYtNjQuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAvKiBCTl90b19mZWxlbSBjb252ZXJ0cyBhbiBPcGVuU1NMIEJJR05VTSBpbnRvIGFuIGZlbGVtLiAqLwogc3RhdGljIGludCBCTl90b19mZWxlbShmZWxlbSBvdXQsIGNvbnN0IEJJR05VTSAqYm4pIHsKICAgaWYgKEJOX2lzX25lZ2F0aXZlKGJuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBCTl90b19mZWxlbSwgRUNfUl9CSUdOVU1fT1VUX09GX1JBTkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9CSUdOVU1fT1VUX09GX1JBTkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKICAgbWVtc2V0KGJfb3V0LCAwLCBzaXplb2YoYl9vdXQpKTsKICAgdW5zaWduZWQgbnVtX2J5dGVzID0gQk5fbnVtX2J5dGVzKGJuKTsKICAgaWYgKG51bV9ieXRlcyA+IHNpemVvZihiX291dCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgQk5fdG9fZmVsZW0sIEVDX1JfQklHTlVNX09VVF9PRl9SQU5HRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfQklHTlVNX09VVF9PRl9SQU5HRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTYzOCw4ICsxNjM4LDcgQEAKICAgaWYgKEJOX2NtcChjdXJ2ZV9wLCBwKSB8fAogICAgICAgQk5fY21wKGN1cnZlX2EsIGEpIHx8CiAgICAgICBCTl9jbXAoY3VydmVfYiwgYikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX25pc3RwMjU2X2dyb3VwX3NldF9jdXJ2ZSwKLSAgICAgICAgICAgICAgICAgICAgICBFQ19SX1dST05HX0NVUlZFX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1dST05HX0NVUlZFX1BBUkFNRVRFUlMpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIHJldCA9IGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlKGdyb3VwLCBwLCBhLCBiLCBjdHgpOwpAQCAtMTY2MSw4ICsxNjYwLDcgQEAKICAgbG9uZ2ZlbGVtIHRtcDsKIAogICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBFQ19SX1BPSU5UX0FUX0lORklOSVRZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKCFCTl90b19mZWxlbSh4X2luLCAmcG9pbnQtPlgpIHx8CkBAIC0xNjc3LDggKzE2NzUsNyBAQAogICBmZWxlbV9yZWR1Y2UoeF9pbiwgdG1wKTsKICAgZmVsZW1fY29udHJhY3QoeF9vdXQsIHhfaW4pOwogICBpZiAoeCAhPSBOVUxMICYmICFzbWFsbGZlbGVtX3RvX0JOKHgsIHhfb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIGZlbGVtX211bCh0bXAsIHoxLCB6Mik7CkBAIC0xNjg3LDggKzE2ODQsNyBAQAogICBmZWxlbV9yZWR1Y2UoeV9pbiwgdG1wKTsKICAgZmVsZW1fY29udHJhY3QoeV9vdXQsIHlfaW4pOwogICBpZiAoeSAhPSBOVUxMICYmICFzbWFsbGZlbGVtX3RvX0JOKHksIHlfb3V0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiAxOwpAQCAtMTc2Myw3ICsxNzU5LDcgQEAKICAgICBpZiAoIXNtYWxsZmVsZW1fdG9fQk4oeCwgZ19wcmVfY29tcFswXVsxXVswXSkgfHwKICAgICAgICAgIXNtYWxsZmVsZW1fdG9fQk4oeSwgZ19wcmVfY29tcFswXVsxXVsxXSkgfHwKICAgICAgICAgIXNtYWxsZmVsZW1fdG9fQk4oeiwgZ19wcmVfY29tcFswXVsxXVsyXSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRzX211bCwgRVJSX1JfQk5fTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghZWNfcG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgZ2VuZXJhdG9yLCB4LCB5LCB6LApAQCAtMTc5NCw3ICsxNzkwLDcgQEAKICAgICB9CiAgICAgaWYgKHNlY3JldHMgPT0gTlVMTCB8fCBwcmVfY29tcCA9PSBOVUxMIHx8CiAgICAgICAgIChtaXhlZCAmJiB0bXBfc21hbGxmZWxlbXMgPT0gTlVMTCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfbmlzdHAyNTZfcG9pbnRzX211bCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtMTgxOCw3ICsxODE0LDcgQEAKICAgICAgICAgICAvKiB0aGlzIGlzIGFuIHVudXN1YWwgaW5wdXQsIGFuZCB3ZSBkb24ndCBndWFyYW50ZWUKICAgICAgICAgICAgKiBjb25zdGFudC10aW1lbmVzcy4gKi8KICAgICAgICAgICBpZiAoIUJOX25ubW9kKHRtcF9zY2FsYXIsIHBfc2NhbGFyLCAmZ3JvdXAtPm9yZGVyLCBjdHgpKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX25pc3RwMjU2X3BvaW50c19tdWwsIEVSUl9SX0JOX0xJQik7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgIH0KICAgICAgICAgICBudW1fYnl0ZXMgPSBCTl9ibjJiaW4odG1wX3NjYWxhciwgdG1wKTsKQEAgLTE4NjMsNyArMTg1OSw3IEBACiAgICAgICAvKiB0aGlzIGlzIGFuIHVudXN1YWwgaW5wdXQsIGFuZCB3ZSBkb24ndCBndWFyYW50ZWUKICAgICAgICAqIGNvbnN0YW50LXRpbWVuZXNzLiAqLwogICAgICAgaWYgKCFCTl9ubm1vZCh0bXBfc2NhbGFyLCBzY2FsYXIsICZncm91cC0+b3JkZXIsIGN0eCkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsLCBFUlJfUl9CTl9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfQk5fTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBudW1fYnl0ZXMgPSBCTl9ibjJiaW4odG1wX3NjYWxhciwgdG1wKTsKQEAgLTE4ODksNyArMTg4NSw3IEBACiAgIGlmICghc21hbGxmZWxlbV90b19CTih4LCB4X2luKSB8fAogICAgICAgIXNtYWxsZmVsZW1fdG9fQk4oeSwgeV9pbikgfHwKICAgICAgICFzbWFsbGZlbGVtX3RvX0JOKHosIHpfaW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9uaXN0cDI1Nl9wb2ludHNfbXVsLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIHJldCA9IGVjX3BvaW50X3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHIsIHgsIHksIHosIGN0eCk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjL3NpbXBsZS5jIGIvc3JjL2NyeXB0by9lYy9zaW1wbGUuYwppbmRleCA2OWZkMmU0Li5jNjIxOTljIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL3NpbXBsZS5jCisrKyBiL3NyYy9jcnlwdG8vZWMvc2ltcGxlLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAgIC8qIHAgbXVzdCBiZSBhIHByaW1lID4gMyAqLwogICBpZiAoQk5fbnVtX2JpdHMocCkgPD0gMiB8fCAhQk5faXNfb2RkKHApKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlLCBFQ19SX0lOVkFMSURfRklFTEQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOVkFMSURfRklFTEQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI4Myw4ICsyODMsNyBAQAogICBpZiAoY3R4ID09IE5VTEwpIHsKICAgICBjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOwogICAgIGlmIChjdHggPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAotICAgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtNDkyLDggKzQ5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpIHsKICAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpIHsKICAgICAvKiB1bmxpa2UgZm9yIHByb2plY3RpdmUgY29vcmRpbmF0ZXMsIHdlIGRvIG5vdCB0b2xlcmF0ZSB0aGlzICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUxMCw4ICs1MDgsNyBAQAogICBpbnQgcmV0ID0gMDsKIAogICBpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTUyNyw3ICs1MjQsNyBAQAogICBaXzEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIFpfMiA9IEJOX0NUWF9nZXQoY3R4KTsKICAgWl8zID0gQk5fQ1RYX2dldChjdHgpOwotICBpZiAoWl8zID09IE5VTEwpIHsKKyAgaWYgKFogPT0gTlVMTCB8fCBaXzEgPT0gTlVMTCB8fCBaXzIgPT0gTlVMTCB8fCBaXzMgPT0gTlVMTCkgewogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTU2MCw4ICs1NTcsNyBAQAogICAgIH0KICAgfSBlbHNlIHsKICAgICBpZiAoIUJOX21vZF9pbnZlcnNlKFpfMSwgWl8sICZncm91cC0+ZmllbGQsIGN0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTExODMsNyArMTE3OSw3IEBACiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFwb2ludC0+Wl9pc19vbmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTI2OSw3ICsxMjY1LDcgQEAKICAgICogbm9uLXplcm8gcG9pbnRzW2ldLT5aIGJ5IGl0cyBpbnZlcnNlLiAqLwogCiAgIGlmICghQk5fbW9kX2ludmVyc2UodG1wLCBwcm9kX1pbbnVtIC0gMV0sICZncm91cC0+ZmllbGQsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lYy93bmFmLmMgYi9zcmMvY3J5cHRvL2VjL3duYWYuYwppbmRleCBhZTBkNzNmLi43ZmEwZTFiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjL3duYWYuYworKysgYi9zcmMvY3J5cHRvL2VjL3duYWYuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgcmV0ID0gKEVDX1BSRV9DT01QICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVDX1BSRV9DT01QKSk7CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3ByZV9jb21wX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIHJldDsKICAgfQogICByZXQtPmJsb2Nrc2l6ZSA9IDg7IC8qIGRlZmF1bHQgKi8KQEAgLTE1OCw3ICsxNTgsNyBAQAogICBpZiAoQk5faXNfemVybyhzY2FsYXIpKSB7CiAgICAgciA9IE9QRU5TU0xfbWFsbG9jKDEpOwogICAgIGlmICghcikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICByWzBdID0gMDsKQEAgLTE2OSw3ICsxNjksNyBAQAogICBpZiAodyA8PSAwIHx8IHcgPiA3KSAvKiAnc2lnbmVkIGNoYXInIGNhbiByZXByZXNlbnQgaW50ZWdlcnMgd2l0aCBhYnNvbHV0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgbGVzcyB0aGFuIDJeNyAqLwogICB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgYml0ID0gMSA8PCB3OyAgICAgICAgLyogYXQgbW9zdCAxMjggKi8KQEAgLTE4MSw3ICsxODEsNyBAQAogICB9CiAKICAgaWYgKHNjYWxhci0+ZCA9PSBOVUxMIHx8IHNjYWxhci0+dG9wID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgICAgKiAoKnJldF9sZW4gd2lsbCBiZSBzZXQgdG8gdGhlIGFjdHVhbCBsZW5ndGgsIGkuZS4gYXQgbW9zdAogICAgICAgICAgICAqIEJOX251bV9iaXRzKHNjYWxhcikgKyAxKSAqLwogICBpZiAociA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgd2luZG93X3ZhbCA9IHNjYWxhci0+ZFswXSAmIG1hc2s7CkBAIC0yMjUsNyArMjI1LDcgQEAKICAgICAgIH0KIAogICAgICAgaWYgKGRpZ2l0IDw9IC1iaXQgfHwgZGlnaXQgPj0gYml0IHx8ICEoZGlnaXQgJiAxKSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCkBAIC0yMzUsNyArMjM1LDcgQEAKICAgICAgICAqIGZvciBtb2RpZmllZCB3aW5kb3cgTkFGcywgaXQgbWF5IGFsc28gYmUgMl53CiAgICAgICAgKi8KICAgICAgIGlmICh3aW5kb3dfdmFsICE9IDAgJiYgd2luZG93X3ZhbCAhPSBuZXh0X2JpdCAmJiB3aW5kb3dfdmFsICE9IGJpdCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgY29tcHV0ZV93TkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0KQEAgLTI0NiwxMyArMjQ2LDEzIEBACiAgICAgd2luZG93X3ZhbCArPSBiaXQgKiBCTl9pc19iaXRfc2V0KHNjYWxhciwgaiArIHcpOwogCiAgICAgaWYgKHdpbmRvd192YWwgPiBuZXh0X2JpdCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGNvbXB1dGVfd05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQogCiAgIGlmIChqID4gbGVuICsgMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBjb21wdXRlX3dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGxlbiA9IGo7CkBAIC0zMTYsNyArMzE2LDcgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKGdyb3VwLT5tZXRoICE9IHItPm1ldGgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMjYsNyArMzI2LDcgQEAKIAogICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICBpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnRzW2ldLT5tZXRoKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC0zNDEsNyArMzQxLDcgQEAKICAgaWYgKHNjYWxhciAhPSBOVUxMKSB7CiAgICAgZ2VuZXJhdG9yID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApOwogICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTM2Niw3ICszNjYsNyBAQAogCiAgICAgICAvKiBjaGVjayB0aGF0IHByZV9jb21wIGxvb2tzIHNhbmUgKi8KICAgICAgIGlmIChwcmVfY29tcC0+bnVtICE9IChwcmVfY29tcC0+bnVtYmxvY2tzICogcHJlX3BvaW50c19wZXJfYmxvY2spKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMzkxLDcgKzM5MSw3IEBACiAgIH0KIAogICBpZiAoIXdzaXplIHx8ICF3TkFGX2xlbiB8fCAhd05BRiB8fCAhdmFsX3N1YikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICBpZiAocHJlX2NvbXAgPT0gTlVMTCkgewogICAgICAgaWYgKG51bV9zY2FsYXIgIT0gMSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICAvKiB3ZSBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgd05BRiBmb3IgJ3NjYWxhcicgKi8KQEAgLTQyOSw3ICs0MjksNyBAQAogICAgICAgc2l6ZV90IHRtcF9sZW4gPSAwOwogCiAgICAgICBpZiAobnVtX3NjYWxhciAhPSAwKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KIApAQCAtNDYzLDcgKzQ2Myw4IEBACiAgICAgICAgICAgLyogcG9zc2libHkgd2UgY2FuIGRvIHdpdGggZmV3ZXIgYmxvY2tzIHRoYW4gZXN0aW1hdGVkICovCiAgICAgICAgICAgbnVtYmxvY2tzID0gKHRtcF9sZW4gKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKICAgICAgICAgICBpZiAobnVtYmxvY2tzID4gcHJlX2NvbXAtPm51bWJsb2NrcykgewotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgIH0KICAgICAgICAgICB0b3RhbG51bSA9IG51bSArIG51bWJsb2NrczsKQEAgLTQ3Nyw3ICs0NzgsOCBAQAogICAgICAgICAgIGlmIChpIDwgdG90YWxudW0gLSAxKSB7CiAgICAgICAgICAgICB3TkFGX2xlbltpXSA9IGJsb2Nrc2l6ZTsKICAgICAgICAgICAgIGlmICh0bXBfbGVuIDwgYmxvY2tzaXplKSB7Ci0gICAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUodG1wX3dOQUYpOwogICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRtcF9sZW4gLT0gYmxvY2tzaXplOwpAQCAtNDkwLDcgKzQ5Miw3IEBACiAgICAgICAgICAgd05BRltpICsgMV0gPSBOVUxMOwogICAgICAgICAgIHdOQUZbaV0gPSBPUEVOU1NMX21hbGxvYyh3TkFGX2xlbltpXSk7CiAgICAgICAgICAgaWYgKHdOQUZbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfbXVsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICAgICAgT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICAgIH0KQEAgLTUwMCw3ICs1MDIsNyBAQAogICAgICAgICAgIH0KIAogICAgICAgICAgIGlmICgqdG1wX3BvaW50cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgICAgICBPUEVOU1NMX2ZyZWUodG1wX3dOQUYpOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgfQpAQCAtNTE5LDcgKzUyMSw3IEBACiAgICAqLwogICB2YWwgPSBPUEVOU1NMX21hbGxvYygobnVtX3ZhbCArIDEpICogc2l6ZW9mIHZhbFswXSk7CiAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX211bCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KICAgdmFsW251bV92YWxdID0gTlVMTDsgLyogcGl2b3QgZWxlbWVudCAqLwpAQCAtNTM3LDcgKzUzOSw3IEBACiAgICAgfQogICB9CiAgIGlmICghKHYgPT0gdmFsICsgbnVtX3ZhbCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgZWNfd05BRl9tdWwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRVJSX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTY5NSw3ICs2OTcsNyBAQAogCiAgIGdlbmVyYXRvciA9IEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKTsKICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0LCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTcyMSw3ICs3MjMsNyBAQAogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmIChCTl9pc196ZXJvKG9yZGVyKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRUNfUl9VTktOT1dOX09SREVSKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQywgRUNfUl9VTktOT1dOX09SREVSKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03NDksNyArNzUxLDcgQEAKIAogICBwb2ludHMgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUE9JTlQgKikgKiAobnVtICsgMSkpOwogICBpZiAoIXBvaW50cykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNzU3LDEzICs3NTksMTMgQEAKICAgdmFyW251bV0gPSBOVUxMOyAvKiBwaXZvdCAqLwogICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKICAgICBpZiAoKHZhcltpXSA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBlY193TkFGX3ByZWNvbXB1dGVfbXVsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQogCiAgIGlmICghKHRtcF9wb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCkpIHx8ICEoYmFzZSA9IEVDX1BPSU5UX25ldyhncm91cCkpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03OTUsNyArNzk3LDcgQEAKICAgICAgIHNpemVfdCBrOwogCiAgICAgICBpZiAoYmxvY2tzaXplIDw9IDIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUMsIGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjZGgvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2VjZGgvQ01ha2VMaXN0cy50eHQKaW5kZXggMzQ2ZTcyZC4uOGVhZWFlNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RoL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZWNkaC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZWNkaApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lY2RoL2VjZGguYyBiL3NyYy9jcnlwdG8vZWNkaC9lY2RoLmMKaW5kZXggYTAxMWJhYi4uMTQ4NTZkYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RoL2VjZGguYworKysgYi9zcmMvY3J5cHRvL2VjZGgvZWNkaC5jCkBAIC05NSw3ICs5NSw3IEBACiAKICAgcHJpdiA9IEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KHByaXZfa2V5KTsKICAgaWYgKHByaXYgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVDREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX1JfTk9fUFJJVkFURV9WQUxVRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTAzLDM1ICsxMDMsMzUgQEAKIAogICB0bXAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOwogICBpZiAodG1wID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFQ0RIX2NvbXB1dGVfa2V5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHRtcCwgTlVMTCwgcHViX2tleSwgcHJpdiwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgdG1wLCB4LCB5LCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBidWZsZW4gPSAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgKyA3KSAvIDg7CiAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGJ1Zmxlbik7CiAgIGlmIChidWYgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVDREhfY29tcHV0ZV9rZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RILCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUJOX2JuMmJpbl9wYWRkZWQoYnVmLCBidWZsZW4sIHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDREgsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChLREYgIT0gMCkgewogICAgIGlmIChLREYoYnVmLCBidWZsZW4sIG91dCwgJm91dGxlbikgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9jb21wdXRlX2tleSwgRUNESF9SX0tERl9GQUlMRUQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNESCwgRUNESF9SX0tERl9GQUlMRUQpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHJldCA9IG91dGxlbjsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWNkc2EvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2VjZHNhL0NNYWtlTGlzdHMudHh0CmluZGV4IGY0MzFlNTkuLmU3NTgxYmUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZWNkc2EvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9lY2RzYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZWNkc2EKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2EuYyBiL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2EuYwppbmRleCBiNzE3OTllLi44NDAzZDYwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhLmMKKysrIGIvc3JjL2NyeXB0by9lY2RzYS9lY2RzYS5jCkBAIC01Miw5ICs1MiwxMSBAQAogCiAjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogCkBAIC04MSwxNiArODMsMTggQEAKICAgICByZXR1cm4gZWNrZXktPmVjZHNhX21ldGgtPnZlcmlmeShkaWdlc3QsIGRpZ2VzdF9sZW4sIHNpZywgc2lnX2xlbiwgZWNrZXkpOwogICB9CiAKLSAgcyA9IEVDRFNBX1NJR19uZXcoKTsKLSAgY29uc3QgdWludDhfdCAqc2lncCA9IHNpZzsKLSAgaWYgKHMgPT0gTlVMTCB8fCBkMmlfRUNEU0FfU0lHKCZzLCAmc2lncCwgc2lnX2xlbikgPT0gTlVMTCB8fAotICAgICAgc2lncCAhPSBzaWcgKyBzaWdfbGVuKSB7CisgIC8qIERlY29kZSB0aGUgRUNEU0Egc2lnbmF0dXJlLiAqLworICBzID0gRUNEU0FfU0lHX2Zyb21fYnl0ZXMoc2lnLCBzaWdfbGVuKTsKKyAgaWYgKHMgPT0gTlVMTCkgewogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgLyogRW5zdXJlIHRoYXQgdGhlIHNpZ25hdHVyZSB1c2VzIERFUiBhbmQgZG9lc24ndCBoYXZlIHRyYWlsaW5nIGdhcmJhZ2UuICovCi0gIGNvbnN0IGludCBkZXJfbGVuID0gaTJkX0VDRFNBX1NJRyhzLCAmZGVyKTsKLSAgaWYgKGRlcl9sZW4gPCAwIHx8IChzaXplX3QpIGRlcl9sZW4gIT0gc2lnX2xlbiB8fCBtZW1jbXAoc2lnLCBkZXIsIHNpZ19sZW4pKSB7CisgIC8qIERlZmVuZCBhZ2FpbnN0IHBvdGVudGlhbCBsYXhuZXNzIGluIHRoZSBERVIgcGFyc2VyLiAqLworICBzaXplX3QgZGVyX2xlbjsKKyAgaWYgKCFFQ0RTQV9TSUdfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIHMpIHx8CisgICAgICBkZXJfbGVuICE9IHNpZ19sZW4gfHwgbWVtY21wKHNpZywgZGVyLCBzaWdfbGVuKSAhPSAwKSB7CisgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiBjcnlwdG8vYnl0ZXN0cmluZyBpcyBzdHJpY3RseSBERVIuICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xMTYsMTQgKzEyMCwxNCBAQAogICAgIGRpZ2VzdF9sZW4gPSAobnVtX2JpdHMgKyA3KSAvIDg7CiAgIH0KICAgaWYgKCFCTl9iaW4yYm4oZGlnZXN0LCBkaWdlc3RfbGVuLCBvdXQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGRpZ2VzdF90b19ibiwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIC8qIElmIHN0aWxsIHRvbyBsb25nIHRydW5jYXRlIHJlbWFpbmluZyBiaXRzIHdpdGggYSBzaGlmdCAqLwogICBpZiAoKDggKiBkaWdlc3RfbGVuID4gbnVtX2JpdHMpICYmCiAgICAgICAhQk5fcnNoaWZ0KG91dCwgb3V0LCA4IC0gKG51bV9iaXRzICYgMHg3KSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZGlnZXN0X3RvX2JuLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE0NSw3ICsxNDksNyBAQAogICBjb25zdCBFQ19QT0lOVCAqcHViX2tleTsKIAogICBpZiAoZWNrZXktPmVjZHNhX21ldGggJiYgZWNrZXktPmVjZHNhX21ldGgtPnZlcmlmeSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfUl9OT1RfSU1QTEVNRU5URUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTE1MywxMyArMTU3LDEzIEBACiAgIGlmICgoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY2tleSkpID09IE5VTEwgfHwKICAgICAgIChwdWJfa2V5ID0gRUNfS0VZX2dldDBfcHVibGljX2tleShlY2tleSkpID09IE5VTEwgfHwKICAgICAgIHNpZyA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRUNEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBjdHggPSBCTl9DVFhfbmV3KCk7CiAgIGlmICghY3R4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CkBAIC0xNjgsMjYgKzE3MiwyNiBAQAogICB1MiA9IEJOX0NUWF9nZXQoY3R4KTsKICAgbSA9IEJOX0NUWF9nZXQoY3R4KTsKICAgWCA9IEJOX0NUWF9nZXQoY3R4KTsKLSAgaWYgKCFYKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfQk5fTElCKTsKKyAgaWYgKG9yZGVyID09IE5VTEwgfHwgdTEgPT0gTlVMTCB8fCB1MiA9PSBOVUxMIHx8IG0gPT0gTlVMTCB8fCBYID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoQk5faXNfemVybyhzaWctPnIpIHx8IEJOX2lzX25lZ2F0aXZlKHNpZy0+cikgfHwKICAgICAgIEJOX3VjbXAoc2lnLT5yLCBvcmRlcikgPj0gMCB8fCBCTl9pc196ZXJvKHNpZy0+cykgfHwKICAgICAgIEJOX2lzX25lZ2F0aXZlKHNpZy0+cykgfHwgQk5fdWNtcChzaWctPnMsIG9yZGVyKSA+PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRUNEU0FfUl9CQURfU0lHTkFUVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfUl9CQURfU0lHTkFUVVJFKTsKICAgICByZXQgPSAwOyAvKiBzaWduYXR1cmUgaXMgaW52YWxpZCAqLwogICAgIGdvdG8gZXJyOwogICB9CiAgIC8qIGNhbGN1bGF0ZSB0bXAxID0gaW52KFMpIG1vZCBvcmRlciAqLwogICBpZiAoIUJOX21vZF9pbnZlcnNlKHUyLCBzaWctPnMsIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIWRpZ2VzdF90b19ibihtLCBkaWdlc3QsIGRpZ2VzdF9sZW4sIG9yZGVyKSkgewpAQCAtMTk1LDMwICsxOTksMzAgQEAKICAgfQogICAvKiB1MSA9IG0gKiB0bXAgbW9kIG9yZGVyICovCiAgIGlmICghQk5fbW9kX211bCh1MSwgbSwgdTIsIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfQk5fTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICAvKiB1MiA9IHIgKiB3IG1vZCBxICovCiAgIGlmICghQk5fbW9kX211bCh1Miwgc2lnLT5yLCB1Miwgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgcG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOwogICBpZiAocG9pbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBwb2ludCwgdTEsIHB1Yl9rZXksIHUyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3ZlcmlmeSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgWCwgTlVMTCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb192ZXJpZnksIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFCTl9ubm1vZCh1MSwgWCwgb3JkZXIsIGN0eCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fdmVyaWZ5LCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9CTl9MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIC8qIGlmIHRoZSBzaWduYXR1cmUgaXMgY29ycmVjdCB1MSBpcyBlcXVhbCB0byBzaWctPnIgKi8KQEAgLTI0MSwxMyArMjQ1LDEzIEBACiAgIGludCByZXQgPSAwOwogCiAgIGlmIChlY2tleSA9PSBOVUxMIHx8IChncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KSkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGN0eF9pbiA9PSBOVUxMKSB7CiAgICAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMjU5LDE2ICsyNjMsMTYgQEAKICAgb3JkZXIgPSBCTl9uZXcoKTsKICAgWCA9IEJOX25ldygpOwogICBpZiAoIWsgfHwgIXIgfHwgIW9yZGVyIHx8ICFYKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIHRtcF9wb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCk7CiAgIGlmICh0bXBfcG9pbnQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9FQ19MSUIpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTI4Niw4ICsyOTAsNyBAQAogICAgICAgICBvayA9IEJOX3JhbmRfcmFuZ2Uoaywgb3JkZXIpOwogICAgICAgfQogICAgICAgaWYgKCFvaykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZWNkc2Ffc2lnbl9zZXR1cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRUNEU0FfUl9SQU5ET01fTlVNQkVSX0dFTkVSQVRJT05fRkFJTEVEKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgIH0gd2hpbGUgKEJOX2lzX3plcm8oaykpOwpAQCAtMzA3LDIzICszMTAsMjMgQEAKIAogICAgIC8qIGNvbXB1dGUgciB0aGUgeC1jb29yZGluYXRlIG9mIGdlbmVyYXRvciAqIGsgKi8KICAgICBpZiAoIUVDX1BPSU5UX211bChncm91cCwgdG1wX3BvaW50LCBrLCBOVUxMLCBOVUxMLCBjdHgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgZWNkc2Ffc2lnbl9zZXR1cCwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHRtcF9wb2ludCwgWCwgTlVMTCwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIGlmICghQk5fbm5tb2QociwgWCwgb3JkZXIsIGN0eCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBlY2RzYV9zaWduX3NldHVwLCBFUlJfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0gd2hpbGUgKEJOX2lzX3plcm8ocikpOwogCiAgIC8qIGNvbXB1dGUgdGhlIGludmVyc2Ugb2YgayAqLwogICBpZiAoIUJOX21vZF9pbnZlcnNlKGssIGssIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIGVjZHNhX3NpZ25fc2V0dXAsIEVSUl9SX0JOX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0JOX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgLyogY2xlYXIgb2xkIHZhbHVlcyBpZiBuZWNlc3NhcnkgKi8KQEAgLTM2NSw3ICszNjgsNyBAQAogICBjb25zdCBCSUdOVU0gKnByaXZfa2V5OwogCiAgIGlmIChlY2tleS0+ZWNkc2FfbWV0aCAmJiBlY2tleS0+ZWNkc2FfbWV0aC0+c2lnbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFQ0RTQV9SX05PVF9JTVBMRU1FTlRFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfTk9UX0lNUExFTUVOVEVEKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0zNzMsMjUgKzM3NiwyNSBAQAogICBwcml2X2tleSA9IEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGVja2V5KTsKIAogICBpZiAoZ3JvdXAgPT0gTlVMTCB8fCBwcml2X2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAogICByZXQgPSBFQ0RTQV9TSUdfbmV3KCk7CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHMgPSByZXQtPnM7CiAKICAgaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwgfHwgKG9yZGVyID0gQk5fbmV3KCkpID09IE5VTEwgfHwKICAgICAgICh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fCAobSA9IEJOX25ldygpKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0VDX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgaWYgKCFkaWdlc3RfdG9fYm4obSwgZGlnZXN0LCBkaWdlc3RfbGVuLCBvcmRlcikpIHsKQEAgLTQwMCwzNSArNDAzLDM1IEBACiAgIGZvciAoOzspIHsKICAgICBpZiAoaW5fa2ludiA9PSBOVUxMIHx8IGluX3IgPT0gTlVMTCkgewogICAgICAgaWYgKCFlY2RzYV9zaWduX3NldHVwKGVja2V5LCBjdHgsICZraW52LCAmcmV0LT5yLCBkaWdlc3QsIGRpZ2VzdF9sZW4pKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9FQ0RTQV9MSUIpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfRUNEU0FfTElCKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgICBja2ludiA9IGtpbnY7CiAgICAgfSBlbHNlIHsKICAgICAgIGNraW52ID0gaW5fa2ludjsKICAgICAgIGlmIChCTl9jb3B5KHJldC0+ciwgaW5fcikgPT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIUJOX21vZF9tdWwodG1wLCBwcml2X2tleSwgcmV0LT5yLCBvcmRlciwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoIUJOX21vZF9hZGRfcXVpY2socywgdG1wLCBtLCBvcmRlcikpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9kb19zaWduX2V4LCBFUlJfUl9CTl9MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVSUl9SX0JOX0xJQik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKCFCTl9tb2RfbXVsKHMsIHMsIGNraW52LCBvcmRlciwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX2RvX3NpZ25fZXgsIEVSUl9SX0JOX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfQk5fTElCKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoQk5faXNfemVybyhzKSkgewogICAgICAgLyogaWYga2ludiBhbmQgciBoYXZlIGJlZW4gc3VwcGxpZWQgYnkgdGhlIGNhbGxlcgogICAgICAgICogZG9uJ3QgdG8gZ2VuZXJhdGUgbmV3IGtpbnYgYW5kIHIgdmFsdWVzICovCiAgICAgICBpZiAoaW5fa2ludiAhPSBOVUxMICYmIGluX3IgIT0gTlVMTCkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfZG9fc2lnbl9leCwgRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNDU1LDIwICs0NTgsMzYgQEAKIGludCBFQ0RTQV9zaWduX2V4KGludCB0eXBlLCBjb25zdCB1aW50OF90ICpkaWdlc3QsIHNpemVfdCBkaWdlc3RfbGVuLAogICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2lnLCB1bnNpZ25lZCBpbnQgKnNpZ19sZW4sIGNvbnN0IEJJR05VTSAqa2ludiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IEJJR05VTSAqciwgRUNfS0VZICplY2tleSkgeworICBpbnQgcmV0ID0gMDsKICAgRUNEU0FfU0lHICpzID0gTlVMTDsKIAogICBpZiAoZWNrZXktPmVjZHNhX21ldGggJiYgZWNrZXktPmVjZHNhX21ldGgtPnNpZ24pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRUNEU0Ffc2lnbl9leCwgRUNEU0FfUl9OT1RfSU1QTEVNRU5URUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgKnNpZ19sZW4gPSAwOwotICAgIHJldHVybiAwOworICAgIGdvdG8gZXJyOwogICB9CiAKICAgcyA9IEVDRFNBX2RvX3NpZ25fZXgoZGlnZXN0LCBkaWdlc3RfbGVuLCBraW52LCByLCBlY2tleSk7CiAgIGlmIChzID09IE5VTEwpIHsKICAgICAqc2lnX2xlbiA9IDA7Ci0gICAgcmV0dXJuIDA7CisgICAgZ290byBlcnI7CiAgIH0KLSAgKnNpZ19sZW4gPSBpMmRfRUNEU0FfU0lHKHMsICZzaWcpOworCisgIENCQiBjYmI7CisgIENCQl96ZXJvKCZjYmIpOworICBzaXplX3QgbGVuOworICBpZiAoIUNCQl9pbml0X2ZpeGVkKCZjYmIsIHNpZywgRUNEU0Ffc2l6ZShlY2tleSkpIHx8CisgICAgICAhRUNEU0FfU0lHX21hcnNoYWwoJmNiYiwgcykgfHwKKyAgICAgICFDQkJfZmluaXNoKCZjYmIsIE5VTEwsICZsZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICBDQkJfY2xlYW51cCgmY2JiKTsKKyAgICAqc2lnX2xlbiA9IDA7CisgICAgZ290byBlcnI7CisgIH0KKyAgKnNpZ19sZW4gPSAodW5zaWduZWQpbGVuOworICByZXQgPSAxOworCitlcnI6CiAgIEVDRFNBX1NJR19mcmVlKHMpOwotICByZXR1cm4gMTsKKyAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2FfYXNuMS5jIGIvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV9hc24xLmMKaW5kZXggZjU1N2NhNy4uZjJkN2MzNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV9hc24xLmMKKysrIGIvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV9hc24xLmMKQEAgLTUyLDQ1ICs1MiwzMyBAQAogCiAjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgogCi0jaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnl0ZXN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9lY19rZXkuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogCiAjaW5jbHVkZSAiLi4vZWMvaW50ZXJuYWwuaCIKIAogCi1ERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KEVDRFNBX1NJRyk7Ci1ERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcsIEVDRFNBX1NJRyk7Ci0KLUFTTjFfU0VRVUVOQ0UoRUNEU0FfU0lHKSA9IHsKLSAgICBBU04xX1NJTVBMRShFQ0RTQV9TSUcsIHIsIENCSUdOVU0pLAotICAgIEFTTjFfU0lNUExFKEVDRFNBX1NJRywgcywgQ0JJR05VTSksCi19IEFTTjFfU0VRVUVOQ0VfRU5EKEVDRFNBX1NJRyk7Ci0KLUlNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoRUNEU0FfU0lHLCBFQ0RTQV9TSUcsIEVDRFNBX1NJRyk7Ci0KIHNpemVfdCBFQ0RTQV9zaXplKGNvbnN0IEVDX0tFWSAqa2V5KSB7Ci0gIHNpemVfdCByZXQsIGksIGdyb3VwX29yZGVyX3NpemU7Ci0gIEFTTjFfSU5URUdFUiBiczsKLSAgQklHTlVNICpvcmRlciA9IE5VTEw7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICBjb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisgIGlmIChrZXkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CiAKKyAgc2l6ZV90IGdyb3VwX29yZGVyX3NpemU7CiAgIGlmIChrZXktPmVjZHNhX21ldGggJiYga2V5LT5lY2RzYV9tZXRoLT5ncm91cF9vcmRlcl9zaXplKSB7CiAgICAgZ3JvdXBfb3JkZXJfc2l6ZSA9IGtleS0+ZWNkc2FfbWV0aC0+Z3JvdXBfb3JkZXJfc2l6ZShrZXkpOwogICB9IGVsc2UgewotICAgIHNpemVfdCBudW1fYml0czsKLQotICAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoa2V5KTsKKyAgICBjb25zdCBFQ19HUk9VUCAqZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChrZXkpOwogICAgIGlmIChncm91cCA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBvcmRlciA9IEJOX25ldygpOworICAgIEJJR05VTSAqb3JkZXIgPSBCTl9uZXcoKTsKICAgICBpZiAob3JkZXIgPT0gTlVMTCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtOTksMjEgKzg3LDExIEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBudW1fYml0cyA9IEJOX251bV9iaXRzKG9yZGVyKTsKLSAgICBncm91cF9vcmRlcl9zaXplID0gKG51bV9iaXRzICsgNykgLyA4OworICAgIGdyb3VwX29yZGVyX3NpemUgPSBCTl9udW1fYnl0ZXMob3JkZXIpOworICAgIEJOX2NsZWFyX2ZyZWUob3JkZXIpOwogICB9CiAKLSAgYnMubGVuZ3RoID0gZ3JvdXBfb3JkZXJfc2l6ZTsKLSAgYnMuZGF0YSA9IGJ1ZjsKLSAgYnMudHlwZSA9IFZfQVNOMV9JTlRFR0VSOwotICAvKiBJZiB0aGUgdG9wIGJpdCBpcyBzZXQgdGhlIEFTTi4xIGVuY29kaW5nIGlzIDEgbGFyZ2VyLiAqLwotICBidWZbMF0gPSAweGZmOwotCi0gIGkgPSBpMmRfQVNOMV9JTlRFR0VSKCZicywgTlVMTCk7Ci0gIGkgKz0gaTsgLyogciBhbmQgcyAqLwotICByZXQgPSBBU04xX29iamVjdF9zaXplKDEsIGksIFZfQVNOMV9TRVFVRU5DRSk7Ci0gIEJOX2NsZWFyX2ZyZWUob3JkZXIpOwotICByZXR1cm4gcmV0OworICByZXR1cm4gRUNEU0FfU0lHX21heF9sZW4oZ3JvdXBfb3JkZXJfc2l6ZSk7CiB9CiAKIEVDRFNBX1NJRyAqRUNEU0FfU0lHX25ldyh2b2lkKSB7CkBAIC0xMzksMyArMTE3LDEzNCBAQAogICBCTl9mcmVlKHNpZy0+cyk7CiAgIE9QRU5TU0xfZnJlZShzaWcpOwogfQorCitFQ0RTQV9TSUcgKkVDRFNBX1NJR19wYXJzZShDQlMgKmNicykgeworICBFQ0RTQV9TSUcgKnJldCA9IEVDRFNBX1NJR19uZXcoKTsKKyAgaWYgKHJldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQ0JTIGNoaWxkOworICBpZiAoIUNCU19nZXRfYXNuMShjYnMsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgICAgICAhQk5fY2JzMnVuc2lnbmVkKCZjaGlsZCwgcmV0LT5yKSB8fAorICAgICAgIUJOX2NiczJ1bnNpZ25lZCgmY2hpbGQsIHJldC0+cykgfHwKKyAgICAgIENCU19sZW4oJmNoaWxkKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfQkFEX1NJR05BVFVSRSk7CisgICAgRUNEU0FfU0lHX2ZyZWUocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitFQ0RTQV9TSUcgKkVDRFNBX1NJR19mcm9tX2J5dGVzKGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5fbGVuKSB7CisgIENCUyBjYnM7CisgIENCU19pbml0KCZjYnMsIGluLCBpbl9sZW4pOworICBFQ0RTQV9TSUcgKnJldCA9IEVDRFNBX1NJR19wYXJzZSgmY2JzKTsKKyAgaWYgKHJldCA9PSBOVUxMIHx8IENCU19sZW4oJmNicykgIT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX0JBRF9TSUdOQVRVUkUpOworICAgIEVDRFNBX1NJR19mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IEVDRFNBX1NJR19tYXJzaGFsKENCQiAqY2JiLCBjb25zdCBFQ0RTQV9TSUcgKnNpZykgeworICBDQkIgY2hpbGQ7CisgIGlmICghQ0JCX2FkZF9hc24xKGNiYiwgJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKKyAgICAgICFCTl9ibjJjYmIoJmNoaWxkLCBzaWctPnIpIHx8CisgICAgICAhQk5fYm4yY2JiKCZjaGlsZCwgc2lnLT5zKSB8fAorICAgICAgIUNCQl9mbHVzaChjYmIpKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRUNEU0EsIEVDRFNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IEVDRFNBX1NJR190b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVDRFNBX1NJRyAqc2lnKSB7CisgIENCQiBjYmI7CisgIENCQl96ZXJvKCZjYmIpOworICBpZiAoIUNCQl9pbml0KCZjYmIsIDApIHx8CisgICAgICAhRUNEU0FfU0lHX21hcnNoYWwoJmNiYiwgc2lnKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgb3V0X2J5dGVzLCBvdXRfbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVDRFNBLCBFQ0RTQV9SX0VOQ09ERV9FUlJPUik7CisgICAgQ0JCX2NsZWFudXAoJmNiYik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIGRlcl9sZW5fbGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gcmVwcmVzZW50IGEgbGVuZ3RoIG9mIHxsZW58CisgKiBpbiBERVIuICovCitzdGF0aWMgc2l6ZV90IGRlcl9sZW5fbGVuKHNpemVfdCBsZW4pIHsKKyAgaWYgKGxlbiA8IDB4ODApIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzaXplX3QgcmV0ID0gMTsKKyAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICByZXQrKzsKKyAgICBsZW4gPj49IDg7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc2l6ZV90IEVDRFNBX1NJR19tYXhfbGVuKHNpemVfdCBvcmRlcl9sZW4pIHsKKyAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBsZW5ndGggb2YgYW4gfG9yZGVyX2xlbnwgYnl0ZSBpbnRlZ2VyLiBEZWZlbnNpdmVseQorICAgKiBhc3N1bWUgdGhhdCB0aGUgbGVhZGluZyAweDAwIGlzIGluY2x1ZGVkLiAqLworICBzaXplX3QgaW50ZWdlcl9sZW4gPSAxIC8qIHRhZyAqLyArIGRlcl9sZW5fbGVuKG9yZGVyX2xlbiArIDEpICsgMSArIG9yZGVyX2xlbjsKKyAgaWYgKGludGVnZXJfbGVuIDwgb3JkZXJfbGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogQW4gRUNEU0Egc2lnbmF0dXJlIGlzIHR3byBJTlRFR0VScy4gKi8KKyAgc2l6ZV90IHZhbHVlX2xlbiA9IDIgKiBpbnRlZ2VyX2xlbjsKKyAgaWYgKHZhbHVlX2xlbiA8IGludGVnZXJfbGVuKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLyogQWRkIHRoZSBoZWFkZXIuICovCisgIHNpemVfdCByZXQgPSAxIC8qIHRhZyAqLyArIGRlcl9sZW5fbGVuKHZhbHVlX2xlbikgKyB2YWx1ZV9sZW47CisgIGlmIChyZXQgPCB2YWx1ZV9sZW4pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitFQ0RTQV9TSUcgKmQyaV9FQ0RTQV9TSUcoRUNEU0FfU0lHICoqb3V0LCBjb25zdCB1aW50OF90ICoqaW5wLCBsb25nIGxlbikgeworICBpZiAobGVuIDwgMCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENCUyBjYnM7CisgIENCU19pbml0KCZjYnMsICppbnAsIChzaXplX3QpbGVuKTsKKyAgRUNEU0FfU0lHICpyZXQgPSBFQ0RTQV9TSUdfcGFyc2UoJmNicyk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChvdXQgIT0gTlVMTCkgeworICAgIEVDRFNBX1NJR19mcmVlKCpvdXQpOworICAgICpvdXQgPSByZXQ7CisgIH0KKyAgKmlucCArPSAoc2l6ZV90KWxlbiAtIENCU19sZW4oJmNicyk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBpMmRfRUNEU0FfU0lHKGNvbnN0IEVDRFNBX1NJRyAqc2lnLCB1aW50OF90ICoqb3V0cCkgeworICB1aW50OF90ICpkZXI7CisgIHNpemVfdCBkZXJfbGVuOworICBpZiAoIUVDRFNBX1NJR190b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgc2lnKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZGVyX2xlbiA+IElOVF9NQVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFQ0RTQSwgRVJSX1JfT1ZFUkZMT1cpOworICAgIE9QRU5TU0xfZnJlZShkZXIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAob3V0cCAhPSBOVUxMKSB7CisgICAgaWYgKCpvdXRwID09IE5VTEwpIHsKKyAgICAgICpvdXRwID0gZGVyOworICAgICAgZGVyID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5KCpvdXRwLCBkZXIsIGRlcl9sZW4pOworICAgICAgKm91dHAgKz0gZGVyX2xlbjsKKyAgICB9CisgIH0KKyAgT1BFTlNTTF9mcmVlKGRlcik7CisgIHJldHVybiAoaW50KWRlcl9sZW47Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL2VjZHNhL2VjZHNhX3Rlc3QuY2MKaW5kZXggYTZiZDdhMS4uYjkxNjUwOSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lY2RzYS9lY2RzYV90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vZWNkc2EvZWNkc2FfdGVzdC5jYwpAQCAtNzgsMTggKzc4LDEzIEBACiAKICAgc3dpdGNoIChhcGkpIHsKICAgICBjYXNlIGtFbmNvZGVkQXBpOiB7Ci0gICAgICBpbnQgc2lnX2xlbiA9IGkyZF9FQ0RTQV9TSUcoZWNkc2Ffc2lnLCBOVUxMKTsKLSAgICAgIGlmIChzaWdfbGVuIDw9IDApIHsKKyAgICAgIHVpbnQ4X3QgKmRlcjsKKyAgICAgIHNpemVfdCBkZXJfbGVuOworICAgICAgaWYgKCFFQ0RTQV9TSUdfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIGVjZHNhX3NpZykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2lnbmF0dXJlKHN0YXRpY19jYXN0PHNpemVfdD4oc2lnX2xlbikpOwotICAgICAgdWludDhfdCAqc2lnX3B0ciA9IGJzc2w6OnZlY3Rvcl9kYXRhKCZzaWduYXR1cmUpOwotICAgICAgc2lnX2xlbiA9IGkyZF9FQ0RTQV9TSUcoZWNkc2Ffc2lnLCAmc2lnX3B0cik7Ci0gICAgICBpZiAoc2lnX2xlbiA8PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGFjdHVhbF9yZXN1bHQgPSBFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCBkaWdlc3RfbGVuLCBic3NsOjp2ZWN0b3JfZGF0YSgmc2lnbmF0dXJlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLnNpemUoKSwgZWNrZXkpOworICAgICAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIoZGVyKTsKKyAgICAgIGFjdHVhbF9yZXN1bHQgPSBFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCBkaWdlc3RfbGVuLCBkZXIsIGRlcl9sZW4sIGVja2V5KTsKICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMjY3LDggKzI2Miw4IEBACiAgICAgZnByaW50ZihvdXQsICIuIik7CiAgICAgZmZsdXNoKG91dCk7CiAgICAgLy8gVmVyaWZ5IGEgdGFtcGVyZWQgc2lnbmF0dXJlLgotICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ19wdHIgPSBic3NsOjp2ZWN0b3JfZGF0YSgmc2lnbmF0dXJlKTsKLSAgICBTY29wZWRFQ0RTQV9TSUcgZWNkc2Ffc2lnKGQyaV9FQ0RTQV9TSUcoTlVMTCwgJnNpZ19wdHIsIHNpZ25hdHVyZS5zaXplKCkpKTsKKyAgICBTY29wZWRFQ0RTQV9TSUcgZWNkc2Ffc2lnKEVDRFNBX1NJR19mcm9tX2J5dGVzKAorICAgICAgICBic3NsOjp2ZWN0b3JfZGF0YSgmc2lnbmF0dXJlKSwgc2lnbmF0dXJlLnNpemUoKSkpOwogICAgIGlmICghZWNkc2Ffc2lnIHx8CiAgICAgICAgICFUZXN0VGFtcGVyZWRTaWcob3V0LCBrRW5jb2RlZEFwaSwgZGlnZXN0LCAyMCwgZWNkc2Ffc2lnLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVja2V5LmdldCgpLCBvcmRlci5nZXQoKSkpIHsKQEAgLTMyNSwxMSArMzIwLDQ1IEBACiAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBUZXN0RUNEU0FfU0lHX21heF9sZW4oc2l6ZV90IG9yZGVyX2xlbikgeworICAvKiBDcmVhdGUgdGhlIGxhcmdlc3QgcG9zc2libGUgfEVDRFNBX1NJR3wgb2YgdGhlIGdpdmVuIGNvbnN0cmFpbnRzLiAqLworICBTY29wZWRFQ0RTQV9TSUcgc2lnKEVDRFNBX1NJR19uZXcoKSk7CisgIGlmICghc2lnKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzKG9yZGVyX2xlbiwgMHhmZik7CisgIGlmICghQk5fYmluMmJuKGJzc2w6OnZlY3Rvcl9kYXRhKCZieXRlcyksIGJ5dGVzLnNpemUoKSwgc2lnLT5yKSB8fAorICAgICAgIUJOX2JpbjJibihic3NsOjp2ZWN0b3JfZGF0YSgmYnl0ZXMpLCBieXRlcy5zaXplKCksIHNpZy0+cykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLyogU2VyaWFsaXplIGl0LiAqLworICB1aW50OF90ICpkZXI7CisgIHNpemVfdCBkZXJfbGVuOworICBpZiAoIUVDRFNBX1NJR190b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgc2lnLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTY29wZWRPcGVuU1NMQnl0ZXMgZGVsZXRlX2RlcihkZXIpOworCisgIHNpemVfdCBtYXhfbGVuID0gRUNEU0FfU0lHX21heF9sZW4ob3JkZXJfbGVuKTsKKyAgaWYgKG1heF9sZW4gIT0gZGVyX2xlbikgeworICAgIGZwcmludGYoc3RkZXJyLCAiRUNEU0FfU0lHX21heF9sZW4oJXUpIHJldHVybmVkICV1LCB3YW50ZWQgJXVcbiIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ob3JkZXJfbGVuKSwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1heF9sZW4pLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRlcl9sZW4pKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIGludCBtYWluKHZvaWQpIHsKICAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOwogICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOwogCi0gIGlmICghVGVzdEJ1aWx0aW4oc3Rkb3V0KSkgeworICBpZiAoIVRlc3RCdWlsdGluKHN0ZG91dCkgfHwKKyAgICAgICFUZXN0RUNEU0FfU0lHX21heF9sZW4oMjI0LzgpIHx8CisgICAgICAhVGVzdEVDRFNBX1NJR19tYXhfbGVuKDI1Ni84KSB8fAorICAgICAgIVRlc3RFQ0RTQV9TSUdfbWF4X2xlbigzODQvOCkgfHwKKyAgICAgICFUZXN0RUNEU0FfU0lHX21heF9sZW4oNTEyLzgpIHx8CisgICAgICAhVGVzdEVDRFNBX1NJR19tYXhfbGVuKDEwMDAwKSkgewogICAgIHByaW50ZigiXG5FQ0RTQSB0ZXN0IGZhaWxlZFxuIik7CiAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOwogICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lbmdpbmUvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dAppbmRleCBlMDM2NTBlLi41NjY3ZjAyIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2VuZ2luZS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZW5naW5lCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CmluZGV4IDUyMTVlZWMuLjg1MTllNTEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vZXJyL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9jdXN0b21fY29tbWFuZCgKICAgT1VUUFVUIGVycl9kYXRhLmMKQEAgLTgsMTAgKzgsOCBAQAogICBhc24xLmVycm9yZGF0YQogICBiaW8uZXJyb3JkYXRhCiAgIGJuLmVycm9yZGF0YQotICBidWYuZXJyb3JkYXRhCiAgIGNpcGhlci5lcnJvcmRhdGEKICAgY29uZi5lcnJvcmRhdGEKLSAgY3J5cHRvLmVycm9yZGF0YQogICBkaC5lcnJvcmRhdGEKICAgZGlnZXN0LmVycm9yZGF0YQogICBkc2EuZXJyb3JkYXRhCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9hc24xLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCmluZGV4IDQ0YjljNzMuLjU1MzQyYTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2FzbjEuZXJyb3JkYXRhCkBAIC0xLDE1MiArMSw4OCBAQAotQVNOMSxmdW5jdGlvbiwxMDAsQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQKLUFTTjEsZnVuY3Rpb24sMTAxLEFTTjFfRU5VTUVSQVRFRF9zZXQKLUFTTjEsZnVuY3Rpb24sMTAyLEFTTjFfRU5VTUVSQVRFRF90b19CTgotQVNOMSxmdW5jdGlvbiwxMDMsQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqCi1BU04xLGZ1bmN0aW9uLDEwNCxBU04xX0lOVEVHRVJfc2V0Ci1BU04xLGZ1bmN0aW9uLDEwNSxBU04xX0lOVEVHRVJfdG9fQk4KLUFTTjEsZnVuY3Rpb24sMTA2LEFTTjFfT0JKRUNUX25ldwotQVNOMSxmdW5jdGlvbiwxMDcsQVNOMV9QQ1RYX25ldwotQVNOMSxmdW5jdGlvbiwxMDgsQVNOMV9TVFJJTkdfVEFCTEVfYWRkCi1BU04xLGZ1bmN0aW9uLDEwOSxBU04xX1NUUklOR19zZXQKLUFTTjEsZnVuY3Rpb24sMTEwLEFTTjFfU1RSSU5HX3R5cGVfbmV3Ci1BU04xLGZ1bmN0aW9uLDExMSxBU04xX1RJTUVfYWRqCi1BU04xLGZ1bmN0aW9uLDExMixBU04xX1VUQ1RJTUVfYWRqCi1BU04xLGZ1bmN0aW9uLDExMyxBU04xX2QyaV9mcAotQVNOMSxmdW5jdGlvbiwxMTQsQVNOMV9kdXAKLUFTTjEsZnVuY3Rpb24sMTE1LEFTTjFfZ2VuZXJhdGVfdjMKLUFTTjEsZnVuY3Rpb24sMTE2LEFTTjFfZ2V0X29iamVjdAotQVNOMSxmdW5jdGlvbiwxMTcsQVNOMV9pMmRfYmlvCi1BU04xLGZ1bmN0aW9uLDExOCxBU04xX2kyZF9mcAotQVNOMSxmdW5jdGlvbiwxMTksQVNOMV9pdGVtX2QyaV9mcAotQVNOMSxmdW5jdGlvbiwxMjAsQVNOMV9pdGVtX2R1cAotQVNOMSxmdW5jdGlvbiwxMjEsQVNOMV9pdGVtX2V4X2QyaQotQVNOMSxmdW5jdGlvbiwxMjIsQVNOMV9pdGVtX2kyZF9iaW8KLUFTTjEsZnVuY3Rpb24sMTIzLEFTTjFfaXRlbV9pMmRfZnAKLUFTTjEsZnVuY3Rpb24sMTI0LEFTTjFfaXRlbV9wYWNrCi1BU04xLGZ1bmN0aW9uLDEyNSxBU04xX2l0ZW1fdW5wYWNrCi1BU04xLGZ1bmN0aW9uLDEyNixBU04xX21ic3RyaW5nX25jb3B5Ci1BU04xLGZ1bmN0aW9uLDEyNyxBU04xX3RlbXBsYXRlX25ldwotQVNOMSxmdW5jdGlvbiwxMjgsQklPX25ld19OREVGCi1BU04xLGZ1bmN0aW9uLDEyOSxCTl90b19BU04xX0VOVU1FUkFURUQKLUFTTjEsZnVuY3Rpb24sMTMwLEJOX3RvX0FTTjFfSU5URUdFUgotQVNOMSxmdW5jdGlvbiwxMzEsYTJkX0FTTjFfT0JKRUNUCi1BU04xLGZ1bmN0aW9uLDEzMixhMmlfQVNOMV9FTlVNRVJBVEVECi1BU04xLGZ1bmN0aW9uLDEzMyxhMmlfQVNOMV9JTlRFR0VSCi1BU04xLGZ1bmN0aW9uLDEzNCxhMmlfQVNOMV9TVFJJTkcKLUFTTjEsZnVuY3Rpb24sMTM1LGFwcGVuZF9leHAKLUFTTjEsZnVuY3Rpb24sMTM2LGFzbjFfY2IKLUFTTjEsZnVuY3Rpb24sMTM3LGFzbjFfY2hlY2tfdGxlbgotQVNOMSxmdW5jdGlvbiwxMzgsYXNuMV9jb2xsYXRlX3ByaW1pdGl2ZQotQVNOMSxmdW5jdGlvbiwxMzksYXNuMV9jb2xsZWN0Ci1BU04xLGZ1bmN0aW9uLDE0MCxhc24xX2QyaV9leF9wcmltaXRpdmUKLUFTTjEsZnVuY3Rpb24sMTQxLGFzbjFfZDJpX3JlYWRfYmlvCi1BU04xLGZ1bmN0aW9uLDE0Mixhc24xX2RvX2FkYgotQVNOMSxmdW5jdGlvbiwxNDMsYXNuMV9leF9jMmkKLUFTTjEsZnVuY3Rpb24sMTQ0LGFzbjFfZmluZF9lbmQKLUFTTjEsZnVuY3Rpb24sMTQ1LGFzbjFfaXRlbV9leF9jb21iaW5lX25ldwotQVNOMSxmdW5jdGlvbiwxNDYsYXNuMV9zdHIydHlwZQotQVNOMSxmdW5jdGlvbiwxNDcsYXNuMV90ZW1wbGF0ZV9leF9kMmkKLUFTTjEsZnVuY3Rpb24sMTQ4LGFzbjFfdGVtcGxhdGVfbm9leHBfZDJpCi1BU04xLGZ1bmN0aW9uLDE0OSxiaXRzdHJfY2IKLUFTTjEsZnVuY3Rpb24sMTUwLGMyaV9BU04xX0JJVF9TVFJJTkcKLUFTTjEsZnVuY3Rpb24sMTUxLGMyaV9BU04xX0lOVEVHRVIKLUFTTjEsZnVuY3Rpb24sMTUyLGMyaV9BU04xX09CSkVDVAotQVNOMSxmdW5jdGlvbiwxNTMsY29sbGVjdF9kYXRhCi1BU04xLGZ1bmN0aW9uLDE1NCxkMmlfQVNOMV9CT09MRUFOCi1BU04xLGZ1bmN0aW9uLDE1NSxkMmlfQVNOMV9PQkpFQ1QKLUFTTjEsZnVuY3Rpb24sMTU2LGQyaV9BU04xX1VJTlRFR0VSCi1BU04xLGZ1bmN0aW9uLDE1NyxkMmlfQVNOMV9VVENUSU1FCi1BU04xLGZ1bmN0aW9uLDE1OCxkMmlfQVNOMV9ieXRlcwotQVNOMSxmdW5jdGlvbiwxNTksZDJpX0FTTjFfdHlwZV9ieXRlcwotQVNOMSxmdW5jdGlvbiwxNjAsaTJkX0FTTjFfVElNRQotQVNOMSxmdW5jdGlvbiwxNjEsaTJkX1ByaXZhdGVLZXkKLUFTTjEsZnVuY3Rpb24sMTYyLGxvbmdfYzJpCi1BU04xLGZ1bmN0aW9uLDE2MyxwYXJzZV90YWdnaW5nCi1BU04xLHJlYXNvbiwxMDAsQVNOMV9MRU5HVEhfTUlTTUFUQ0gKLUFTTjEscmVhc29uLDEwMSxBVVhfRVJST1IKLUFTTjEscmVhc29uLDEwMixCQURfR0VUX0FTTjFfT0JKRUNUX0NBTEwKLUFTTjEscmVhc29uLDEwMyxCQURfT0JKRUNUX0hFQURFUgotQVNOMSxyZWFzb24sMTA0LEJNUFNUUklOR19JU19XUk9OR19MRU5HVEgKLUFTTjEscmVhc29uLDEwNSxCTl9MSUIKLUFTTjEscmVhc29uLDEwNixCT09MRUFOX0lTX1dST05HX0xFTkdUSAotQVNOMSxyZWFzb24sMTA3LEJVRkZFUl9UT09fU01BTEwKLUFTTjEscmVhc29uLDEwOCxERUNPREVfRVJST1IKLUFTTjEscmVhc29uLDEwOSxERVBUSF9FWENFRURFRAotQVNOMSxyZWFzb24sMTEwLEVOQ09ERV9FUlJPUgotQVNOMSxyZWFzb24sMTExLEVSUk9SX0dFVFRJTkdfVElNRQotQVNOMSxyZWFzb24sMTEyLEVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFCi1BU04xLHJlYXNvbiwxMTMsRVhQRUNUSU5HX0FOX0lOVEVHRVIKLUFTTjEscmVhc29uLDExNCxFWFBFQ1RJTkdfQU5fT0JKRUNUCi1BU04xLHJlYXNvbiwxMTUsRVhQRUNUSU5HX0FfQk9PTEVBTgotQVNOMSxyZWFzb24sMTE2LEVYUEVDVElOR19BX1RJTUUKLUFTTjEscmVhc29uLDExNyxFWFBMSUNJVF9MRU5HVEhfTUlTTUFUQ0gKLUFTTjEscmVhc29uLDExOCxFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVECi1BU04xLHJlYXNvbiwxMTksRklFTERfTUlTU0lORwotQVNOMSxyZWFzb24sMTIwLEZJUlNUX05VTV9UT09fTEFSR0UKLUFTTjEscmVhc29uLDEyMSxIRUFERVJfVE9PX0xPTkcKLUFTTjEscmVhc29uLDEyMixJTExFR0FMX0JJVFNUUklOR19GT1JNQVQKLUFTTjEscmVhc29uLDEyMyxJTExFR0FMX0JPT0xFQU4KLUFTTjEscmVhc29uLDEyNCxJTExFR0FMX0NIQVJBQ1RFUlMKLUFTTjEscmVhc29uLDEyNSxJTExFR0FMX0ZPUk1BVAotQVNOMSxyZWFzb24sMTI2LElMTEVHQUxfSEVYCi1BU04xLHJlYXNvbiwxMjcsSUxMRUdBTF9JTVBMSUNJVF9UQUcKLUFTTjEscmVhc29uLDEyOCxJTExFR0FMX0lOVEVHRVIKLUFTTjEscmVhc29uLDEyOSxJTExFR0FMX05FU1RFRF9UQUdHSU5HCi1BU04xLHJlYXNvbiwxMzAsSUxMRUdBTF9OVUxMCi1BU04xLHJlYXNvbiwxMzEsSUxMRUdBTF9OVUxMX1ZBTFVFCi1BU04xLHJlYXNvbiwxMzIsSUxMRUdBTF9PQkpFQ1QKLUFTTjEscmVhc29uLDEzMyxJTExFR0FMX09QVElPTkFMX0FOWQotQVNOMSxyZWFzb24sMTM0LElMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFCi1BU04xLHJlYXNvbiwxMzUsSUxMRUdBTF9UQUdHRURfQU5ZCi1BU04xLHJlYXNvbiwxMzYsSUxMRUdBTF9USU1FX1ZBTFVFCi1BU04xLHJlYXNvbiwxMzcsSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUCi1BU04xLHJlYXNvbiwxMzgsSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcKLUFTTjEscmVhc29uLDEzOSxJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUCi1BU04xLHJlYXNvbiwxNDAsSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RICi1BU04xLHJlYXNvbiwxNDEsSU5WQUxJRF9ESUdJVAotQVNOMSxyZWFzb24sMTQyLElOVkFMSURfTU9ESUZJRVIKLUFTTjEscmVhc29uLDE0MyxJTlZBTElEX05VTUJFUgotQVNOMSxyZWFzb24sMTQ0LElOVkFMSURfT0JKRUNUX0VOQ09ESU5HCi1BU04xLHJlYXNvbiwxNDUsSU5WQUxJRF9TRVBBUkFUT1IKLUFTTjEscmVhc29uLDE0NixJTlZBTElEX1RJTUVfRk9STUFUCi1BU04xLHJlYXNvbiwxNDcsSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RICi1BU04xLHJlYXNvbiwxNDgsSU5WQUxJRF9VVEY4U1RSSU5HCi1BU04xLHJlYXNvbiwxNDksTElTVF9FUlJPUgotQVNOMSxyZWFzb24sMTUwLE1BTExPQ19GQUlMVVJFCi1BU04xLHJlYXNvbiwxNTEsTUlTU0lOR19BU04xX0VPUwotQVNOMSxyZWFzb24sMTUyLE1JU1NJTkdfRU9DCi1BU04xLHJlYXNvbiwxNTMsTUlTU0lOR19TRUNPTkRfTlVNQkVSCi1BU04xLHJlYXNvbiwxNTQsTUlTU0lOR19WQUxVRQotQVNOMSxyZWFzb24sMTU1LE1TVFJJTkdfTk9UX1VOSVZFUlNBTAotQVNOMSxyZWFzb24sMTU2LE1TVFJJTkdfV1JPTkdfVEFHCi1BU04xLHJlYXNvbiwxNTcsTkVTVEVEX0FTTjFfRVJST1IKLUFTTjEscmVhc29uLDE1OCxORVNURURfQVNOMV9TVFJJTkcKLUFTTjEscmVhc29uLDE1OSxOT05fSEVYX0NIQVJBQ1RFUlMKLUFTTjEscmVhc29uLDE2MCxOT1RfQVNDSUlfRk9STUFUCi1BU04xLHJlYXNvbiwxNjEsTk9UX0VOT1VHSF9EQVRBCi1BU04xLHJlYXNvbiwxNjIsTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUKLUFTTjEscmVhc29uLDE2MyxOVUxMX0lTX1dST05HX0xFTkdUSAotQVNOMSxyZWFzb24sMTY0LE9CSkVDVF9OT1RfQVNDSUlfRk9STUFUCi1BU04xLHJlYXNvbiwxNjUsT0REX05VTUJFUl9PRl9DSEFSUwotQVNOMSxyZWFzb24sMTY2LFNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFCi1BU04xLHJlYXNvbiwxNjcsU0VRVUVOQ0VfTEVOR1RIX01JU01BVENICi1BU04xLHJlYXNvbiwxNjgsU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVECi1BU04xLHJlYXNvbiwxNjksU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRwotQVNOMSxyZWFzb24sMTcwLFNIT1JUX0xJTkUKLUFTTjEscmVhc29uLDE3MSxTVFJFQU1JTkdfTk9UX1NVUFBPUlRFRAotQVNOMSxyZWFzb24sMTcyLFNUUklOR19UT09fTE9ORwotQVNOMSxyZWFzb24sMTczLFNUUklOR19UT09fU0hPUlQKLUFTTjEscmVhc29uLDE3NCxUQUdfVkFMVUVfVE9PX0hJR0gKLUFTTjEscmVhc29uLDE3NSxUSU1FX05PVF9BU0NJSV9GT1JNQVQKLUFTTjEscmVhc29uLDE3NixUT09fTE9ORwotQVNOMSxyZWFzb24sMTc3LFRZUEVfTk9UX0NPTlNUUlVDVEVECi1BU04xLHJlYXNvbiwxNzgsVFlQRV9OT1RfUFJJTUlUSVZFCi1BU04xLHJlYXNvbiwxNzksVU5FWFBFQ1RFRF9FT0MKLUFTTjEscmVhc29uLDE4MCxVTklWRVJTQUxTVFJJTkdfSVNfV1JPTkdfTEVOR1RICi1BU04xLHJlYXNvbiwxODEsVU5LTk9XTl9GT1JNQVQKLUFTTjEscmVhc29uLDE4MixVTktOT1dOX1RBRwotQVNOMSxyZWFzb24sMTgzLFVOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUKLUFTTjEscmVhc29uLDE4NCxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKLUFTTjEscmVhc29uLDE4NSxVTlNVUFBPUlRFRF9UWVBFCi1BU04xLHJlYXNvbiwxODYsV1JPTkdfVEFHCi1BU04xLHJlYXNvbiwxODcsV1JPTkdfVFlQRQorQVNOMSwxMDAsQVNOMV9MRU5HVEhfTUlTTUFUQ0gKK0FTTjEsMTAxLEFVWF9FUlJPUgorQVNOMSwxMDIsQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMCitBU04xLDEwMyxCQURfT0JKRUNUX0hFQURFUgorQVNOMSwxMDQsQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSAorQVNOMSwxMDUsQk5fTElCCitBU04xLDEwNixCT09MRUFOX0lTX1dST05HX0xFTkdUSAorQVNOMSwxMDcsQlVGRkVSX1RPT19TTUFMTAorQVNOMSwxMDgsREVDT0RFX0VSUk9SCitBU04xLDEwOSxERVBUSF9FWENFRURFRAorQVNOMSwxMTAsRU5DT0RFX0VSUk9SCitBU04xLDExMSxFUlJPUl9HRVRUSU5HX1RJTUUKK0FTTjEsMTEyLEVYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFCitBU04xLDExMyxFWFBFQ1RJTkdfQU5fSU5URUdFUgorQVNOMSwxMTQsRVhQRUNUSU5HX0FOX09CSkVDVAorQVNOMSwxMTUsRVhQRUNUSU5HX0FfQk9PTEVBTgorQVNOMSwxMTYsRVhQRUNUSU5HX0FfVElNRQorQVNOMSwxMTcsRVhQTElDSVRfTEVOR1RIX01JU01BVENICitBU04xLDExOCxFWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVECitBU04xLDExOSxGSUVMRF9NSVNTSU5HCitBU04xLDEyMCxGSVJTVF9OVU1fVE9PX0xBUkdFCitBU04xLDEyMSxIRUFERVJfVE9PX0xPTkcKK0FTTjEsMTIyLElMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVAorQVNOMSwxMjMsSUxMRUdBTF9CT09MRUFOCitBU04xLDEyNCxJTExFR0FMX0NIQVJBQ1RFUlMKK0FTTjEsMTI1LElMTEVHQUxfRk9STUFUCitBU04xLDEyNixJTExFR0FMX0hFWAorQVNOMSwxMjcsSUxMRUdBTF9JTVBMSUNJVF9UQUcKK0FTTjEsMTI4LElMTEVHQUxfSU5URUdFUgorQVNOMSwxMjksSUxMRUdBTF9ORVNURURfVEFHR0lORworQVNOMSwxMzAsSUxMRUdBTF9OVUxMCitBU04xLDEzMSxJTExFR0FMX05VTExfVkFMVUUKK0FTTjEsMTMyLElMTEVHQUxfT0JKRUNUCitBU04xLDEzMyxJTExFR0FMX09QVElPTkFMX0FOWQorQVNOMSwxMzQsSUxMRUdBTF9PUFRJT05TX09OX0lURU1fVEVNUExBVEUKK0FTTjEsMTM1LElMTEVHQUxfVEFHR0VEX0FOWQorQVNOMSwxMzYsSUxMRUdBTF9USU1FX1ZBTFVFCitBU04xLDEzNyxJTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQKK0FTTjEsMTM4LElOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HCitBU04xLDEzOSxJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUCitBU04xLDE0MCxJTlZBTElEX0JNUFNUUklOR19MRU5HVEgKK0FTTjEsMTQxLElOVkFMSURfRElHSVQKK0FTTjEsMTQyLElOVkFMSURfTU9ESUZJRVIKK0FTTjEsMTQzLElOVkFMSURfTlVNQkVSCitBU04xLDE0NCxJTlZBTElEX09CSkVDVF9FTkNPRElORworQVNOMSwxNDUsSU5WQUxJRF9TRVBBUkFUT1IKK0FTTjEsMTQ2LElOVkFMSURfVElNRV9GT1JNQVQKK0FTTjEsMTQ3LElOVkFMSURfVU5JVkVSU0FMU1RSSU5HX0xFTkdUSAorQVNOMSwxNDgsSU5WQUxJRF9VVEY4U1RSSU5HCitBU04xLDE0OSxMSVNUX0VSUk9SCitBU04xLDE1MCxNQUxMT0NfRkFJTFVSRQorQVNOMSwxNTEsTUlTU0lOR19BU04xX0VPUworQVNOMSwxNTIsTUlTU0lOR19FT0MKK0FTTjEsMTUzLE1JU1NJTkdfU0VDT05EX05VTUJFUgorQVNOMSwxNTQsTUlTU0lOR19WQUxVRQorQVNOMSwxNTUsTVNUUklOR19OT1RfVU5JVkVSU0FMCitBU04xLDE1NixNU1RSSU5HX1dST05HX1RBRworQVNOMSwxNTcsTkVTVEVEX0FTTjFfRVJST1IKK0FTTjEsMTU4LE5FU1RFRF9BU04xX1NUUklORworQVNOMSwxNTksTk9OX0hFWF9DSEFSQUNURVJTCitBU04xLDE2MCxOT1RfQVNDSUlfRk9STUFUCitBU04xLDE2MSxOT1RfRU5PVUdIX0RBVEEKK0FTTjEsMTYyLE5PX01BVENISU5HX0NIT0lDRV9UWVBFCitBU04xLDE2MyxOVUxMX0lTX1dST05HX0xFTkdUSAorQVNOMSwxNjQsT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQKK0FTTjEsMTY1LE9ERF9OVU1CRVJfT0ZfQ0hBUlMKK0FTTjEsMTY2LFNFQ09ORF9OVU1CRVJfVE9PX0xBUkdFCitBU04xLDE2NyxTRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gKK0FTTjEsMTY4LFNFUVVFTkNFX05PVF9DT05TVFJVQ1RFRAorQVNOMSwxNjksU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRworQVNOMSwxNzAsU0hPUlRfTElORQorQVNOMSwxNzEsU1RSRUFNSU5HX05PVF9TVVBQT1JURUQKK0FTTjEsMTcyLFNUUklOR19UT09fTE9ORworQVNOMSwxNzMsU1RSSU5HX1RPT19TSE9SVAorQVNOMSwxNzQsVEFHX1ZBTFVFX1RPT19ISUdICitBU04xLDE3NSxUSU1FX05PVF9BU0NJSV9GT1JNQVQKK0FTTjEsMTc2LFRPT19MT05HCitBU04xLDE3NyxUWVBFX05PVF9DT05TVFJVQ1RFRAorQVNOMSwxNzgsVFlQRV9OT1RfUFJJTUlUSVZFCitBU04xLDE3OSxVTkVYUEVDVEVEX0VPQworQVNOMSwxODAsVU5JVkVSU0FMU1RSSU5HX0lTX1dST05HX0xFTkdUSAorQVNOMSwxODEsVU5LTk9XTl9GT1JNQVQKK0FTTjEsMTgyLFVOS05PV05fVEFHCitBU04xLDE4MyxVTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFCitBU04xLDE4NCxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKK0FTTjEsMTg1LFVOU1VQUE9SVEVEX1RZUEUKK0FTTjEsMTg2LFdST05HX1RBRworQVNOMSwxODcsV1JPTkdfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvYmlvLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2Jpby5lcnJvcmRhdGEKaW5kZXggOWYyYWYwMi4uOTRiM2M5NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvYmlvLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9iaW8uZXJyb3JkYXRhCkBAIC0xLDM2ICsxLDE3IEBACi1CSU8sZnVuY3Rpb24sMTAwLEJJT19jYWxsYmFja19jdHJsCi1CSU8sZnVuY3Rpb24sMTAxLEJJT19jdHJsCi1CSU8sZnVuY3Rpb24sMTAyLEJJT19uZXcKLUJJTyxmdW5jdGlvbiwxMDMsQklPX25ld19maWxlCi1CSU8sZnVuY3Rpb24sMTA0LEJJT19uZXdfbWVtX2J1ZgotQklPLGZ1bmN0aW9uLDExOCxCSU9fcHJpbnRmCi1CSU8sZnVuY3Rpb24sMTA1LEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmCi1CSU8sZnVuY3Rpb24sMTA2LEJJT196ZXJvX2NvcHlfZ2V0X3JlYWRfYnVmX2RvbmUKLUJJTyxmdW5jdGlvbiwxMDcsQklPX3plcm9fY29weV9nZXRfd3JpdGVfYnVmCi1CSU8sZnVuY3Rpb24sMTA4LEJJT196ZXJvX2NvcHlfZ2V0X3dyaXRlX2J1Zl9kb25lCi1CSU8sZnVuY3Rpb24sMTA5LGJpb19pbwotQklPLGZ1bmN0aW9uLDExMCxiaW9fbWFrZV9wYWlyCi1CSU8sZnVuY3Rpb24sMTExLGJpb193cml0ZQotQklPLGZ1bmN0aW9uLDExMixidWZmZXJfY3RybAotQklPLGZ1bmN0aW9uLDExMyxjb25uX2N0cmwKLUJJTyxmdW5jdGlvbiwxMTQsY29ubl9zdGF0ZQotQklPLGZ1bmN0aW9uLDExNSxmaWxlX2N0cmwKLUJJTyxmdW5jdGlvbiwxMTYsZmlsZV9yZWFkCi1CSU8sZnVuY3Rpb24sMTE3LG1lbV93cml0ZQotQklPLHJlYXNvbiwxMDAsQkFEX0ZPUEVOX01PREUKLUJJTyxyZWFzb24sMTAxLEJST0tFTl9QSVBFCi1CSU8scmVhc29uLDEwMixDT05ORUNUX0VSUk9SCi1CSU8scmVhc29uLDEwMyxFUlJPUl9TRVRUSU5HX05CSU8KLUJJTyxyZWFzb24sMTA0LElOVkFMSURfQVJHVU1FTlQKLUJJTyxyZWFzb24sMTA1LElOX1VTRQotQklPLHJlYXNvbiwxMDYsS0VFUEFMSVZFCi1CSU8scmVhc29uLDEwNyxOQklPX0NPTk5FQ1RfRVJST1IKLUJJTyxyZWFzb24sMTA4LE5PX0hPU1ROQU1FX1NQRUNJRklFRAotQklPLHJlYXNvbiwxMDksTk9fUE9SVF9TUEVDSUZJRUQKLUJJTyxyZWFzb24sMTEwLE5PX1NVQ0hfRklMRQotQklPLHJlYXNvbiwxMTEsTlVMTF9QQVJBTUVURVIKLUJJTyxyZWFzb24sMTEyLFNZU19MSUIKLUJJTyxyZWFzb24sMTEzLFVOQUJMRV9UT19DUkVBVEVfU09DS0VUCi1CSU8scmVhc29uLDExNCxVTklOSVRJQUxJWkVECi1CSU8scmVhc29uLDExNSxVTlNVUFBPUlRFRF9NRVRIT0QKLUJJTyxyZWFzb24sMTE2LFdSSVRFX1RPX1JFQURfT05MWV9CSU8KK0JJTywxMDAsQkFEX0ZPUEVOX01PREUKK0JJTywxMDEsQlJPS0VOX1BJUEUKK0JJTywxMDIsQ09OTkVDVF9FUlJPUgorQklPLDEwMyxFUlJPUl9TRVRUSU5HX05CSU8KK0JJTywxMDQsSU5WQUxJRF9BUkdVTUVOVAorQklPLDEwNSxJTl9VU0UKK0JJTywxMDYsS0VFUEFMSVZFCitCSU8sMTA3LE5CSU9fQ09OTkVDVF9FUlJPUgorQklPLDEwOCxOT19IT1NUTkFNRV9TUEVDSUZJRUQKK0JJTywxMDksTk9fUE9SVF9TUEVDSUZJRUQKK0JJTywxMTAsTk9fU1VDSF9GSUxFCitCSU8sMTExLE5VTExfUEFSQU1FVEVSCitCSU8sMTEyLFNZU19MSUIKK0JJTywxMTMsVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQKK0JJTywxMTQsVU5JTklUSUFMSVpFRAorQklPLDExNSxVTlNVUFBPUlRFRF9NRVRIT0QKK0JJTywxMTYsV1JJVEVfVE9fUkVBRF9PTkxZX0JJTwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvYm4uZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvYm4uZXJyb3JkYXRhCmluZGV4IDZmZDQ5NjguLjc2YjYzOTIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2JuLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9ibi5lcnJvcmRhdGEKQEAgLTEsNDQgKzEsMTkgQEAKLUJOLGZ1bmN0aW9uLDEwMCxCTl9DVFhfZ2V0Ci1CTixmdW5jdGlvbiwxMDEsQk5fQ1RYX25ldwotQk4sZnVuY3Rpb24sMTAyLEJOX0NUWF9zdGFydAotQk4sZnVuY3Rpb24sMTAzLEJOX2JuMmRlYwotQk4sZnVuY3Rpb24sMTA0LEJOX2JuMmhleAotQk4sZnVuY3Rpb24sMTA1LEJOX2RpdgotQk4sZnVuY3Rpb24sMTA2LEJOX2Rpdl9yZWNwCi1CTixmdW5jdGlvbiwxMDcsQk5fZXhwCi1CTixmdW5jdGlvbiwxMDgsQk5fZ2VuZXJhdGVfZHNhX25vbmNlCi1CTixmdW5jdGlvbiwxMDksQk5fZ2VuZXJhdGVfcHJpbWVfZXgKLUJOLGZ1bmN0aW9uLDEyNSxCTl9sc2hpZnQKLUJOLGZ1bmN0aW9uLDExMCxCTl9tb2RfZXhwMl9tb250Ci1CTixmdW5jdGlvbiwxMTEsQk5fbW9kX2V4cF9tb250Ci1CTixmdW5jdGlvbiwxMTIsQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZQotQk4sZnVuY3Rpb24sMTEzLEJOX21vZF9leHBfbW9udF93b3JkCi1CTixmdW5jdGlvbiwxMTQsQk5fbW9kX2ludmVyc2UKLUJOLGZ1bmN0aW9uLDExNSxCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gKLUJOLGZ1bmN0aW9uLDExNixCTl9tb2RfbHNoaWZ0X3F1aWNrCi1CTixmdW5jdGlvbiwxMTcsQk5fbW9kX3NxcnQKLUJOLGZ1bmN0aW9uLDExOCxCTl9uZXcKLUJOLGZ1bmN0aW9uLDExOSxCTl9yYW5kCi1CTixmdW5jdGlvbiwxMjAsQk5fcmFuZF9yYW5nZQotQk4sZnVuY3Rpb24sMTI2LEJOX3JzaGlmdAotQk4sZnVuY3Rpb24sMTIxLEJOX3NxcnQKLUJOLGZ1bmN0aW9uLDEyMixCTl91c3ViCi1CTixmdW5jdGlvbiwxMjMsYm5fd2V4cGFuZAotQk4sZnVuY3Rpb24sMTI0LG1vZF9leHBfcmVjcAotQk4scmVhc29uLDEwMCxBUkcyX0xUX0FSRzMKLUJOLHJlYXNvbiwxMDEsQkFEX1JFQ0lQUk9DQUwKLUJOLHJlYXNvbiwxMDIsQklHTlVNX1RPT19MT05HCi1CTixyZWFzb24sMTAzLEJJVFNfVE9PX1NNQUxMCi1CTixyZWFzb24sMTA0LENBTExFRF9XSVRIX0VWRU5fTU9EVUxVUwotQk4scmVhc29uLDEwNSxESVZfQllfWkVSTwotQk4scmVhc29uLDEwNixFWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBCi1CTixyZWFzb24sMTA3LElOUFVUX05PVF9SRURVQ0VECi1CTixyZWFzb24sMTA4LElOVkFMSURfUkFOR0UKLUJOLHJlYXNvbiwxMDksTkVHQVRJVkVfTlVNQkVSCi1CTixyZWFzb24sMTEwLE5PVF9BX1NRVUFSRQotQk4scmVhc29uLDExMSxOT1RfSU5JVElBTElaRUQKLUJOLHJlYXNvbiwxMTIsTk9fSU5WRVJTRQotQk4scmVhc29uLDExMyxQUklWQVRFX0tFWV9UT09fTEFSR0UKLUJOLHJlYXNvbiwxMTQsUF9JU19OT1RfUFJJTUUKLUJOLHJlYXNvbiwxMTUsVE9PX01BTllfSVRFUkFUSU9OUwotQk4scmVhc29uLDExNixUT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTCitCTiwxMDAsQVJHMl9MVF9BUkczCitCTiwxMTcsQkFEX0VOQ09ESU5HCitCTiwxMDEsQkFEX1JFQ0lQUk9DQUwKK0JOLDEwMixCSUdOVU1fVE9PX0xPTkcKK0JOLDEwMyxCSVRTX1RPT19TTUFMTAorQk4sMTA0LENBTExFRF9XSVRIX0VWRU5fTU9EVUxVUworQk4sMTA1LERJVl9CWV9aRVJPCitCTiwxMTgsRU5DT0RFX0VSUk9SCitCTiwxMDYsRVhQQU5EX09OX1NUQVRJQ19CSUdOVU1fREFUQQorQk4sMTA3LElOUFVUX05PVF9SRURVQ0VECitCTiwxMDgsSU5WQUxJRF9SQU5HRQorQk4sMTA5LE5FR0FUSVZFX05VTUJFUgorQk4sMTEwLE5PVF9BX1NRVUFSRQorQk4sMTExLE5PVF9JTklUSUFMSVpFRAorQk4sMTEyLE5PX0lOVkVSU0UKK0JOLDExMyxQUklWQVRFX0tFWV9UT09fTEFSR0UKK0JOLDExNCxQX0lTX05PVF9QUklNRQorQk4sMTE1LFRPT19NQU5ZX0lURVJBVElPTlMKK0JOLDExNixUT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9idWYuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvYnVmLmVycm9yZGF0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiNmM5YS4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL2Vyci9idWYuZXJyb3JkYXRhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1CVUYsZnVuY3Rpb24sMTAwLEJVRl9NRU1fbmV3Ci1CVUYsZnVuY3Rpb24sMTAxLEJVRl9tZW1kdXAKLUJVRixmdW5jdGlvbiwxMDIsQlVGX3N0cm5kdXAKLUJVRixmdW5jdGlvbiwxMDMsYnVmX21lbV9ncm93CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9jaXBoZXIuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvY2lwaGVyLmVycm9yZGF0YQppbmRleCBjZTg0NTliLi4xMDM3NTA1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9jaXBoZXIuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2NpcGhlci5lcnJvcmRhdGEKQEAgLTEsNjAgKzEsMjUgQEAKLUNJUEhFUixmdW5jdGlvbiwxMDAsRVZQX0FFQURfQ1RYX2luaXQKLUNJUEhFUixmdW5jdGlvbiwxMzEsRVZQX0FFQURfQ1RYX2luaXRfd2l0aF9kaXJlY3Rpb24KLUNJUEhFUixmdW5jdGlvbiwxMDEsRVZQX0FFQURfQ1RYX29wZW4KLUNJUEhFUixmdW5jdGlvbiwxMDIsRVZQX0FFQURfQ1RYX3NlYWwKLUNJUEhFUixmdW5jdGlvbiwxMDMsRVZQX0NJUEhFUl9DVFhfY29weQotQ0lQSEVSLGZ1bmN0aW9uLDEwNCxFVlBfQ0lQSEVSX0NUWF9jdHJsCi1DSVBIRVIsZnVuY3Rpb24sMTA1LEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoCi1DSVBIRVIsZnVuY3Rpb24sMTA2LEVWUF9DaXBoZXJJbml0X2V4Ci1DSVBIRVIsZnVuY3Rpb24sMTA3LEVWUF9EZWNyeXB0RmluYWxfZXgKLUNJUEhFUixmdW5jdGlvbiwxMDgsRVZQX0VuY3J5cHRGaW5hbF9leAotQ0lQSEVSLGZ1bmN0aW9uLDEzMixhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfaW5pdAotQ0lQSEVSLGZ1bmN0aW9uLDEzMyxhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfb3BlbgotQ0lQSEVSLGZ1bmN0aW9uLDEzNCxhZWFkX2Flc19jdHJfaG1hY19zaGEyNTZfc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDEwOSxhZWFkX2Flc19nY21faW5pdAotQ0lQSEVSLGZ1bmN0aW9uLDExMCxhZWFkX2Flc19nY21fb3BlbgotQ0lQSEVSLGZ1bmN0aW9uLDExMSxhZWFkX2Flc19nY21fc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDExMixhZWFkX2Flc19rZXlfd3JhcF9pbml0Ci1DSVBIRVIsZnVuY3Rpb24sMTEzLGFlYWRfYWVzX2tleV93cmFwX29wZW4KLUNJUEhFUixmdW5jdGlvbiwxMTQsYWVhZF9hZXNfa2V5X3dyYXBfc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDExNSxhZWFkX2NoYWNoYTIwX3BvbHkxMzA1X2luaXQKLUNJUEhFUixmdW5jdGlvbiwxMTYsYWVhZF9jaGFjaGEyMF9wb2x5MTMwNV9vcGVuCi1DSVBIRVIsZnVuY3Rpb24sMTE3LGFlYWRfY2hhY2hhMjBfcG9seTEzMDVfc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDExOCxhZWFkX3JjNF9tZDVfdGxzX2luaXQKLUNJUEhFUixmdW5jdGlvbiwxMTksYWVhZF9yYzRfbWQ1X3Rsc19vcGVuCi1DSVBIRVIsZnVuY3Rpb24sMTIwLGFlYWRfcmM0X21kNV90bHNfc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDEyMSxhZWFkX3NzbDNfZW5zdXJlX2NpcGhlcl9pbml0Ci1DSVBIRVIsZnVuY3Rpb24sMTIyLGFlYWRfc3NsM19pbml0Ci1DSVBIRVIsZnVuY3Rpb24sMTIzLGFlYWRfc3NsM19vcGVuCi1DSVBIRVIsZnVuY3Rpb24sMTI0LGFlYWRfc3NsM19zZWFsCi1DSVBIRVIsZnVuY3Rpb24sMTI1LGFlYWRfdGxzX2Vuc3VyZV9jaXBoZXJfaW5pdAotQ0lQSEVSLGZ1bmN0aW9uLDEyNixhZWFkX3Rsc19pbml0Ci1DSVBIRVIsZnVuY3Rpb24sMTI3LGFlYWRfdGxzX29wZW4KLUNJUEhFUixmdW5jdGlvbiwxMjgsYWVhZF90bHNfc2VhbAotQ0lQSEVSLGZ1bmN0aW9uLDEyOSxhZXNfaW5pdF9rZXkKLUNJUEhFUixmdW5jdGlvbiwxMzAsYWVzbmlfaW5pdF9rZXkKLUNJUEhFUixyZWFzb24sMTAwLEFFU19LRVlfU0VUVVBfRkFJTEVECi1DSVBIRVIscmVhc29uLDEwMSxCQURfREVDUllQVAotQ0lQSEVSLHJlYXNvbiwxMDIsQkFEX0tFWV9MRU5HVEgKLUNJUEhFUixyZWFzb24sMTAzLEJVRkZFUl9UT09fU01BTEwKLUNJUEhFUixyZWFzb24sMTA0LENUUkxfTk9UX0lNUExFTUVOVEVECi1DSVBIRVIscmVhc29uLDEwNSxDVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URUQKLUNJUEhFUixyZWFzb24sMTA2LERBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSAotQ0lQSEVSLHJlYXNvbiwxMDcsSU5JVElBTElaQVRJT05fRVJST1IKLUNJUEhFUixyZWFzb24sMTA4LElOUFVUX05PVF9JTklUSUFMSVpFRAotQ0lQSEVSLHJlYXNvbiwxMDksSU5WQUxJRF9BRF9TSVpFCi1DSVBIRVIscmVhc29uLDExMCxJTlZBTElEX0tFWV9MRU5HVEgKLUNJUEhFUixyZWFzb24sMTExLElOVkFMSURfTk9OQ0VfU0laRQotQ0lQSEVSLHJlYXNvbiwxMTIsSU5WQUxJRF9PUEVSQVRJT04KLUNJUEhFUixyZWFzb24sMTEzLElWX1RPT19MQVJHRQotQ0lQSEVSLHJlYXNvbiwxMTQsTk9fQ0lQSEVSX1NFVAotQ0lQSEVSLHJlYXNvbiwxMjQsTk9fRElSRUNUSU9OX1NFVAotQ0lQSEVSLHJlYXNvbiwxMTUsT1VUUFVUX0FMSUFTRVNfSU5QVVQKLUNJUEhFUixyZWFzb24sMTE2LFRBR19UT09fTEFSR0UKLUNJUEhFUixyZWFzb24sMTE3LFRPT19MQVJHRQotQ0lQSEVSLHJlYXNvbiwxMTgsVU5TVVBQT1JURURfQURfU0laRQotQ0lQSEVSLHJlYXNvbiwxMTksVU5TVVBQT1JURURfSU5QVVRfU0laRQotQ0lQSEVSLHJlYXNvbiwxMjAsVU5TVVBQT1JURURfS0VZX1NJWkUKLUNJUEhFUixyZWFzb24sMTIxLFVOU1VQUE9SVEVEX05PTkNFX1NJWkUKLUNJUEhFUixyZWFzb24sMTIyLFVOU1VQUE9SVEVEX1RBR19TSVpFCi1DSVBIRVIscmVhc29uLDEyMyxXUk9OR19GSU5BTF9CTE9DS19MRU5HVEgKK0NJUEhFUiwxMDAsQUVTX0tFWV9TRVRVUF9GQUlMRUQKK0NJUEhFUiwxMDEsQkFEX0RFQ1JZUFQKK0NJUEhFUiwxMDIsQkFEX0tFWV9MRU5HVEgKK0NJUEhFUiwxMDMsQlVGRkVSX1RPT19TTUFMTAorQ0lQSEVSLDEwNCxDVFJMX05PVF9JTVBMRU1FTlRFRAorQ0lQSEVSLDEwNSxDVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URUQKK0NJUEhFUiwxMDYsREFUQV9OT1RfTVVMVElQTEVfT0ZfQkxPQ0tfTEVOR1RICitDSVBIRVIsMTA3LElOSVRJQUxJWkFUSU9OX0VSUk9SCitDSVBIRVIsMTA4LElOUFVUX05PVF9JTklUSUFMSVpFRAorQ0lQSEVSLDEwOSxJTlZBTElEX0FEX1NJWkUKK0NJUEhFUiwxMTAsSU5WQUxJRF9LRVlfTEVOR1RICitDSVBIRVIsMTExLElOVkFMSURfTk9OQ0VfU0laRQorQ0lQSEVSLDExMixJTlZBTElEX09QRVJBVElPTgorQ0lQSEVSLDExMyxJVl9UT09fTEFSR0UKK0NJUEhFUiwxMTQsTk9fQ0lQSEVSX1NFVAorQ0lQSEVSLDEyNCxOT19ESVJFQ1RJT05fU0VUCitDSVBIRVIsMTE1LE9VVFBVVF9BTElBU0VTX0lOUFVUCitDSVBIRVIsMTE2LFRBR19UT09fTEFSR0UKK0NJUEhFUiwxMTcsVE9PX0xBUkdFCitDSVBIRVIsMTE4LFVOU1VQUE9SVEVEX0FEX1NJWkUKK0NJUEhFUiwxMTksVU5TVVBQT1JURURfSU5QVVRfU0laRQorQ0lQSEVSLDEyMCxVTlNVUFBPUlRFRF9LRVlfU0laRQorQ0lQSEVSLDEyMSxVTlNVUFBPUlRFRF9OT05DRV9TSVpFCitDSVBIRVIsMTIyLFVOU1VQUE9SVEVEX1RBR19TSVpFCitDSVBIRVIsMTIzLFdST05HX0ZJTkFMX0JMT0NLX0xFTkdUSApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvY29uZi5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9jb25mLmVycm9yZGF0YQppbmRleCAwYjk2YTMyLi42NTFmYWJlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9jb25mLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9jb25mLmVycm9yZGF0YQpAQCAtMSwxMCArMSw2IEBACi1DT05GLGZ1bmN0aW9uLDEwMCxDT05GX3BhcnNlX2xpc3QKLUNPTkYsZnVuY3Rpb24sMTAxLE5DT05GX2xvYWQKLUNPTkYsZnVuY3Rpb24sMTAyLGRlZl9sb2FkX2JpbwotQ09ORixmdW5jdGlvbiwxMDMsc3RyX2NvcHkKLUNPTkYscmVhc29uLDEwMCxMSVNUX0NBTk5PVF9CRV9OVUxMCi1DT05GLHJlYXNvbiwxMDEsTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVAotQ09ORixyZWFzb24sMTAyLE1JU1NJTkdfRVFVQUxfU0lHTgotQ09ORixyZWFzb24sMTAzLE5PX0NMT1NFX0JSQUNFCi1DT05GLHJlYXNvbiwxMDQsVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTgotQ09ORixyZWFzb24sMTA1LFZBUklBQkxFX0hBU19OT19WQUxVRQorQ09ORiwxMDAsTElTVF9DQU5OT1RfQkVfTlVMTAorQ09ORiwxMDEsTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVAorQ09ORiwxMDIsTUlTU0lOR19FUVVBTF9TSUdOCitDT05GLDEwMyxOT19DTE9TRV9CUkFDRQorQ09ORiwxMDQsVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTgorQ09ORiwxMDUsVkFSSUFCTEVfSEFTX05PX1ZBTFVFCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9jcnlwdG8uZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvY3J5cHRvLmVycm9yZGF0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwZTlkNS4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL2Vyci9jcnlwdG8uZXJyb3JkYXRhCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1DUllQVE8sZnVuY3Rpb24sMTAwLENSWVBUT19nZXRfZXhfbmV3X2luZGV4Ci1DUllQVE8sZnVuY3Rpb24sMTAxLENSWVBUT19zZXRfZXhfZGF0YQotQ1JZUFRPLGZ1bmN0aW9uLDEwMixnZXRfY2xhc3MKLUNSWVBUTyxmdW5jdGlvbiwxMDMsZ2V0X2Z1bmNfcG9pbnRlcnMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2RoLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2RoLmVycm9yZGF0YQppbmRleCAxZmQ2NzViLi41NzFlMjE4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9kaC5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvZGguZXJyb3JkYXRhCkBAIC0xLDggKzEsNCBAQAotREgsZnVuY3Rpb24sMTAwLERIX25ld19tZXRob2QKLURILGZ1bmN0aW9uLDEwMSxjb21wdXRlX2tleQotREgsZnVuY3Rpb24sMTAyLGdlbmVyYXRlX2tleQotREgsZnVuY3Rpb24sMTAzLGdlbmVyYXRlX3BhcmFtZXRlcnMKLURILHJlYXNvbiwxMDAsQkFEX0dFTkVSQVRPUgotREgscmVhc29uLDEwMSxJTlZBTElEX1BVQktFWQotREgscmVhc29uLDEwMixNT0RVTFVTX1RPT19MQVJHRQotREgscmVhc29uLDEwMyxOT19QUklWQVRFX1ZBTFVFCitESCwxMDAsQkFEX0dFTkVSQVRPUgorREgsMTAxLElOVkFMSURfUFVCS0VZCitESCwxMDIsTU9EVUxVU19UT09fTEFSR0UKK0RILDEwMyxOT19QUklWQVRFX1ZBTFVFCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9kaWdlc3QuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvZGlnZXN0LmVycm9yZGF0YQppbmRleCA5NWEzNjIyLi40MTFlNzc4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9kaWdlc3QuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2RpZ2VzdC5lcnJvcmRhdGEKQEAgLTEsMyArMSBAQAotRElHRVNULGZ1bmN0aW9uLDEwMCxFVlBfRGlnZXN0SW5pdF9leAotRElHRVNULGZ1bmN0aW9uLDEwMSxFVlBfTURfQ1RYX2NvcHlfZXgKLURJR0VTVCxyZWFzb24sMTAwLElOUFVUX05PVF9JTklUSUFMSVpFRAorRElHRVNULDEwMCxJTlBVVF9OT1RfSU5JVElBTElaRUQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2RzYS5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9kc2EuZXJyb3JkYXRhCmluZGV4IGMyZGZmMjMuLjNjNTc2NGEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2RzYS5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvZHNhLmVycm9yZGF0YQpAQCAtMSw5ICsxLDQgQEAKLURTQSxmdW5jdGlvbiwxMDAsRFNBX25ld19tZXRob2QKLURTQSxmdW5jdGlvbiwxMDEsZHNhX3NpZ19jYgotRFNBLGZ1bmN0aW9uLDEwMixzaWduCi1EU0EsZnVuY3Rpb24sMTAzLHNpZ25fc2V0dXAKLURTQSxmdW5jdGlvbiwxMDQsdmVyaWZ5Ci1EU0EscmVhc29uLDEwMCxCQURfUV9WQUxVRQotRFNBLHJlYXNvbiwxMDEsTUlTU0lOR19QQVJBTUVURVJTCi1EU0EscmVhc29uLDEwMixNT0RVTFVTX1RPT19MQVJHRQotRFNBLHJlYXNvbiwxMDMsTkVFRF9ORVdfU0VUVVBfVkFMVUVTCitEU0EsMTAwLEJBRF9RX1ZBTFVFCitEU0EsMTAxLE1JU1NJTkdfUEFSQU1FVEVSUworRFNBLDEwMixNT0RVTFVTX1RPT19MQVJHRQorRFNBLDEwMyxORUVEX05FV19TRVRVUF9WQUxVRVMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2VjLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2VjLmVycm9yZGF0YQppbmRleCAyNTJmN2FiLi5lN2I0MTc1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9lYy5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvZWMuZXJyb3JkYXRhCkBAIC0xLDk1ICsxLDI4IEBACi1FQyxmdW5jdGlvbiwxNTksQk5fdG9fZmVsZW0KLUVDLGZ1bmN0aW9uLDEwMCxFQ19HUk9VUF9jb3B5Ci1FQyxmdW5jdGlvbiwxMDEsRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcAotRUMsZnVuY3Rpb24sMTAyLEVDX0dST1VQX2dldF9kZWdyZWUKLUVDLGZ1bmN0aW9uLDEwMyxFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZQotRUMsZnVuY3Rpb24sMTY2LEVDX0dST1VQX25ld19jdXJ2ZV9HRnAKLUVDLGZ1bmN0aW9uLDEwNCxFQ19LRVlfY2hlY2tfa2V5Ci1FQyxmdW5jdGlvbiwxMDUsRUNfS0VZX2NvcHkKLUVDLGZ1bmN0aW9uLDEwNixFQ19LRVlfZ2VuZXJhdGVfa2V5Ci1FQyxmdW5jdGlvbiwxNjUsRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lCi1FQyxmdW5jdGlvbiwxMDcsRUNfS0VZX25ld19tZXRob2QKLUVDLGZ1bmN0aW9uLDEwOCxFQ19LRVlfc2V0X3B1YmxpY19rZXlfYWZmaW5lX2Nvb3JkaW5hdGVzCi1FQyxmdW5jdGlvbiwxMDksRUNfUE9JTlRfYWRkCi1FQyxmdW5jdGlvbiwxMTAsRUNfUE9JTlRfY21wCi1FQyxmdW5jdGlvbiwxMTEsRUNfUE9JTlRfY29weQotRUMsZnVuY3Rpb24sMTEyLEVDX1BPSU5UX2RibAotRUMsZnVuY3Rpb24sMTEzLEVDX1BPSU5UX2R1cAotRUMsZnVuY3Rpb24sMTE0LEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwCi1FQyxmdW5jdGlvbiwxMTUsRUNfUE9JTlRfaW52ZXJ0Ci1FQyxmdW5jdGlvbiwxMTYsRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkKLUVDLGZ1bmN0aW9uLDExNyxFQ19QT0lOVF9pc19vbl9jdXJ2ZQotRUMsZnVuY3Rpb24sMTE4LEVDX1BPSU5UX21ha2VfYWZmaW5lCi1FQyxmdW5jdGlvbiwxMTksRUNfUE9JTlRfbmV3Ci1FQyxmdW5jdGlvbiwxMjAsRUNfUE9JTlRfb2N0MnBvaW50Ci1FQyxmdW5jdGlvbiwxMjEsRUNfUE9JTlRfcG9pbnQyb2N0Ci1FQyxmdW5jdGlvbiwxMjIsRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAKLUVDLGZ1bmN0aW9uLDEyMyxFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAKLUVDLGZ1bmN0aW9uLDEyNCxFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkKLUVDLGZ1bmN0aW9uLDEyNSxFQ19QT0lOVHNfbWFrZV9hZmZpbmUKLUVDLGZ1bmN0aW9uLDEyNixjb21wdXRlX3dOQUYKLUVDLGZ1bmN0aW9uLDEyNyxkMmlfRUNQS1BhcmFtZXRlcnMKLUVDLGZ1bmN0aW9uLDEyOCxkMmlfRUNQYXJhbWV0ZXJzCi1FQyxmdW5jdGlvbiwxMjksZDJpX0VDUHJpdmF0ZUtleQotRUMsZnVuY3Rpb24sMTMwLGVjX0dGcF9tb250X2ZpZWxkX2RlY29kZQotRUMsZnVuY3Rpb24sMTMxLGVjX0dGcF9tb250X2ZpZWxkX2VuY29kZQotRUMsZnVuY3Rpb24sMTMyLGVjX0dGcF9tb250X2ZpZWxkX211bAotRUMsZnVuY3Rpb24sMTMzLGVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUKLUVDLGZ1bmN0aW9uLDEzNCxlY19HRnBfbW9udF9maWVsZF9zcXIKLUVDLGZ1bmN0aW9uLDEzNSxlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUKLUVDLGZ1bmN0aW9uLDE2MCxlY19HRnBfbmlzdHAyNTZfZ3JvdXBfc2V0X2N1cnZlCi1FQyxmdW5jdGlvbiwxNjEsZWNfR0ZwX25pc3RwMjU2X3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMKLUVDLGZ1bmN0aW9uLDE2MixlY19HRnBfbmlzdHAyNTZfcG9pbnRzX211bAotRUMsZnVuY3Rpb24sMTM2LGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50Ci1FQyxmdW5jdGlvbiwxMzcsZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUKLUVDLGZ1bmN0aW9uLDEzOCxlY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lCi1FQyxmdW5jdGlvbiwxMzksZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQKLUVDLGZ1bmN0aW9uLDE0MCxlY19HRnBfc2ltcGxlX3BvaW50Mm9jdAotRUMsZnVuY3Rpb24sMTQxLGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcwotRUMsZnVuY3Rpb24sMTQyLGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcwotRUMsZnVuY3Rpb24sMTQzLGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lCi1FQyxmdW5jdGlvbiwxNDQsZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcwotRUMsZnVuY3Rpb24sMTQ1LGVjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzCi1FQyxmdW5jdGlvbiwxNDYsZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAKLUVDLGZ1bmN0aW9uLDE2MyxlY19ncm91cF9jb3B5Ci1FQyxmdW5jdGlvbiwxNDcsZWNfZ3JvdXBfbmV3Ci1FQyxmdW5jdGlvbiwxNDgsZWNfZ3JvdXBfbmV3X2N1cnZlX0dGcAotRUMsZnVuY3Rpb24sMTQ5LGVjX2dyb3VwX25ld19mcm9tX2RhdGEKLUVDLGZ1bmN0aW9uLDE1MCxlY19wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwCi1FQyxmdW5jdGlvbiwxNTEsZWNfcHJlX2NvbXBfbmV3Ci1FQyxmdW5jdGlvbiwxNTIsZWNfd05BRl9tdWwKLUVDLGZ1bmN0aW9uLDE1MyxlY193TkFGX3ByZWNvbXB1dGVfbXVsdAotRUMsZnVuY3Rpb24sMTU0LGkyZF9FQ1BLUGFyYW1ldGVycwotRUMsZnVuY3Rpb24sMTU1LGkyZF9FQ1BhcmFtZXRlcnMKLUVDLGZ1bmN0aW9uLDE1NixpMmRfRUNQcml2YXRlS2V5Ci1FQyxmdW5jdGlvbiwxNTcsaTJvX0VDUHVibGljS2V5Ci1FQyxmdW5jdGlvbiwxNjQsbmlzdHAyNTZfcHJlX2NvbXBfbmV3Ci1FQyxmdW5jdGlvbiwxNTgsbzJpX0VDUHVibGljS2V5Ci1FQyxyZWFzb24sMTI2LEJJR05VTV9PVVRfT0ZfUkFOR0UKLUVDLHJlYXNvbiwxMDAsQlVGRkVSX1RPT19TTUFMTAotRUMscmVhc29uLDEwMSxDT09SRElOQVRFU19PVVRfT0ZfUkFOR0UKLUVDLHJlYXNvbiwxMDIsRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUKLUVDLHJlYXNvbiwxMDMsRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRQotRUMscmVhc29uLDEwNCxHUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRQotRUMscmVhc29uLDEwNSxJMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRQotRUMscmVhc29uLDEwNixJTkNPTVBBVElCTEVfT0JKRUNUUwotRUMscmVhc29uLDEwNyxJTlZBTElEX0NPTVBSRVNTRURfUE9JTlQKLUVDLHJlYXNvbiwxMDgsSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQKLUVDLHJlYXNvbiwxMDksSU5WQUxJRF9FTkNPRElORwotRUMscmVhc29uLDExMCxJTlZBTElEX0ZJRUxECi1FQyxyZWFzb24sMTExLElOVkFMSURfRk9STQotRUMscmVhc29uLDExMixJTlZBTElEX0dST1VQX09SREVSCi1FQyxyZWFzb24sMTEzLElOVkFMSURfUFJJVkFURV9LRVkKLUVDLHJlYXNvbiwxMTQsTUlTU0lOR19QQVJBTUVURVJTCi1FQyxyZWFzb24sMTE1LE1JU1NJTkdfUFJJVkFURV9LRVkKLUVDLHJlYXNvbiwxMTYsTk9OX05BTUVEX0NVUlZFCi1FQyxyZWFzb24sMTE3LE5PVF9JTklUSUFMSVpFRAotRUMscmVhc29uLDExOCxQS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRQotRUMscmVhc29uLDExOSxQT0lOVF9BVF9JTkZJTklUWQotRUMscmVhc29uLDEyMCxQT0lOVF9JU19OT1RfT05fQ1VSVkUKLUVDLHJlYXNvbiwxMjEsU0xPVF9GVUxMCi1FQyxyZWFzb24sMTIyLFVOREVGSU5FRF9HRU5FUkFUT1IKLUVDLHJlYXNvbiwxMjMsVU5LTk9XTl9HUk9VUAotRUMscmVhc29uLDEyNCxVTktOT1dOX09SREVSCi1FQyxyZWFzb24sMTI3LFdST05HX0NVUlZFX1BBUkFNRVRFUlMKLUVDLHJlYXNvbiwxMjUsV1JPTkdfT1JERVIKK0VDLDEyNixCSUdOVU1fT1VUX09GX1JBTkdFCitFQywxMDAsQlVGRkVSX1RPT19TTUFMTAorRUMsMTAxLENPT1JESU5BVEVTX09VVF9PRl9SQU5HRQorRUMsMTAyLEQySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFCitFQywxMDMsRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRQorRUMsMTA0LEdST1VQMlBLUEFSQU1FVEVSU19GQUlMVVJFCitFQywxMDUsSTJEX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUKK0VDLDEwNixJTkNPTVBBVElCTEVfT0JKRUNUUworRUMsMTA3LElOVkFMSURfQ09NUFJFU1NFRF9QT0lOVAorRUMsMTA4LElOVkFMSURfQ09NUFJFU1NJT05fQklUCitFQywxMDksSU5WQUxJRF9FTkNPRElORworRUMsMTEwLElOVkFMSURfRklFTEQKK0VDLDExMSxJTlZBTElEX0ZPUk0KK0VDLDExMixJTlZBTElEX0dST1VQX09SREVSCitFQywxMTMsSU5WQUxJRF9QUklWQVRFX0tFWQorRUMsMTE0LE1JU1NJTkdfUEFSQU1FVEVSUworRUMsMTE1LE1JU1NJTkdfUFJJVkFURV9LRVkKK0VDLDExNixOT05fTkFNRURfQ1VSVkUKK0VDLDExNyxOT1RfSU5JVElBTElaRUQKK0VDLDExOCxQS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRQorRUMsMTE5LFBPSU5UX0FUX0lORklOSVRZCitFQywxMjAsUE9JTlRfSVNfTk9UX09OX0NVUlZFCitFQywxMjEsU0xPVF9GVUxMCitFQywxMjIsVU5ERUZJTkVEX0dFTkVSQVRPUgorRUMsMTIzLFVOS05PV05fR1JPVVAKK0VDLDEyNCxVTktOT1dOX09SREVSCitFQywxMjcsV1JPTkdfQ1VSVkVfUEFSQU1FVEVSUworRUMsMTI1LFdST05HX09SREVSCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9lY2RoLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2VjZGguZXJyb3JkYXRhCmluZGV4IDBmMTIxNWUuLmY3MTRjMzAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2VjZGguZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2VjZGguZXJyb3JkYXRhCkBAIC0xLDQgKzEsMyBAQAotRUNESCxmdW5jdGlvbiwxMDAsRUNESF9jb21wdXRlX2tleQotRUNESCxyZWFzb24sMTAwLEtERl9GQUlMRUQKLUVDREgscmVhc29uLDEwMSxOT19QUklWQVRFX1ZBTFVFCi1FQ0RILHJlYXNvbiwxMDIsUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFCitFQ0RILDEwMCxLREZfRkFJTEVECitFQ0RILDEwMSxOT19QUklWQVRFX1ZBTFVFCitFQ0RILDEwMixQT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2VjZHNhLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL2VjZHNhLmVycm9yZGF0YQppbmRleCA5N2MyMTNlLi41OGJhNTkxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9lY2RzYS5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvZWNkc2EuZXJyb3JkYXRhCkBAIC0xLDEwICsxLDYgQEAKLUVDRFNBLGZ1bmN0aW9uLDEwMCxFQ0RTQV9kb19zaWduX2V4Ci1FQ0RTQSxmdW5jdGlvbiwxMDEsRUNEU0FfZG9fdmVyaWZ5Ci1FQ0RTQSxmdW5jdGlvbiwxMDIsRUNEU0Ffc2lnbl9leAotRUNEU0EsZnVuY3Rpb24sMTAzLGRpZ2VzdF90b19ibgotRUNEU0EsZnVuY3Rpb24sMTA0LGVjZHNhX3NpZ25fc2V0dXAKLUVDRFNBLHJlYXNvbiwxMDAsQkFEX1NJR05BVFVSRQotRUNEU0EscmVhc29uLDEwMSxNSVNTSU5HX1BBUkFNRVRFUlMKLUVDRFNBLHJlYXNvbiwxMDIsTkVFRF9ORVdfU0VUVVBfVkFMVUVTCi1FQ0RTQSxyZWFzb24sMTAzLE5PVF9JTVBMRU1FTlRFRAotRUNEU0EscmVhc29uLDEwNCxSQU5ET01fTlVNQkVSX0dFTkVSQVRJT05fRkFJTEVECitFQ0RTQSwxMDAsQkFEX1NJR05BVFVSRQorRUNEU0EsMTA1LEVOQ09ERV9FUlJPUgorRUNEU0EsMTAxLE1JU1NJTkdfUEFSQU1FVEVSUworRUNEU0EsMTAyLE5FRURfTkVXX1NFVFVQX1ZBTFVFUworRUNEU0EsMTAzLE5PVF9JTVBMRU1FTlRFRAorRUNEU0EsMTA0LFJBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRUQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2VuZ2luZS5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9lbmdpbmUuZXJyb3JkYXRhCmluZGV4IDExODVlODguLmVkYmQ3YjkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL2VuZ2luZS5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvZW5naW5lLmVycm9yZGF0YQpAQCAtMSArMSBAQAotRU5HSU5FLHJlYXNvbiwxMDAsT1BFUkFUSU9OX05PVF9TVVBQT1JURUQKK0VOR0lORSwxMDAsT1BFUkFUSU9OX05PVF9TVVBQT1JURUQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2Vyci5jIGIvc3JjL2NyeXB0by9lcnIvZXJyLmMKaW5kZXggZGUxYjRhNy4uMjQ4MjRlOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZXJyLmMKKysrIGIvc3JjL2NyeXB0by9lcnIvZXJyLmMKQEAgLTEyNSwxMCArMTI1LDYgQEAKICNpbmNsdWRlICIuLi9pbnRlcm5hbC5oIgogCiAKLWV4dGVybiBjb25zdCB1aW50MzJfdCBrT3BlblNTTEZ1bmN0aW9uVmFsdWVzW107Ci1leHRlcm4gY29uc3Qgc2l6ZV90IGtPcGVuU1NMRnVuY3Rpb25WYWx1ZXNMZW47Ci1leHRlcm4gY29uc3QgY2hhciBrT3BlblNTTEZ1bmN0aW9uU3RyaW5nRGF0YVtdOwotCiBleHRlcm4gY29uc3QgdWludDMyX3Qga09wZW5TU0xSZWFzb25WYWx1ZXNbXTsKIGV4dGVybiBjb25zdCBzaXplX3Qga09wZW5TU0xSZWFzb25WYWx1ZXNMZW47CiBleHRlcm4gY29uc3QgY2hhciBrT3BlblNTTFJlYXNvblN0cmluZ0RhdGFbXTsKQEAgLTI1OSw0MiArMjU1LDUxIEBACiB9CiAKIHVpbnQzMl90IEVSUl9nZXRfZXJyb3Iodm9pZCkgewotICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygxLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMSAvKiBpbmMgKi8sIDAgLyogYm90dG9tICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogdWludDMyX3QgRVJSX2dldF9lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMSwgMCwgZmlsZSwgbGluZSwgTlVMTCwgTlVMTCk7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEgLyogaW5jICovLCAwIC8qIGJvdHRvbSAqLywgZmlsZSwgbGluZSwgTlVMTCwgTlVMTCk7CiB9CiAKIHVpbnQzMl90IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZGF0YSwgaW50ICpmbGFncykgewotICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygxLCAwLCBmaWxlLCBsaW5lLCBkYXRhLCBmbGFncyk7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDEgLyogaW5jICovLCAwIC8qIGJvdHRvbSAqLywgZmlsZSwgbGluZSwgZGF0YSwgZmxhZ3MpOwogfQogCiB1aW50MzJfdCBFUlJfcGVla19lcnJvcih2b2lkKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDAgLyogYm90dG9tICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAsIDAsIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDAgLyogYm90dG9tICovLCBmaWxlLCBsaW5lLCBOVUxMLCBOVUxMKTsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfZXJyb3JfbGluZV9kYXRhKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMCwgZmlsZSwgbGluZSwgZGF0YSwgZmxhZ3MpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDAgLyogYm90dG9tICovLCBmaWxlLCBsaW5lLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Cit9CisKK2NvbnN0IGNoYXIgKkVSUl9wZWVrX2Z1bmN0aW9uKHZvaWQpIHsKKyAgRVJSX1NUQVRFICpzdGF0ZSA9IGVycl9nZXRfc3RhdGUoKTsKKyAgaWYgKHN0YXRlID09IE5VTEwgfHwgc3RhdGUtPmJvdHRvbSA9PSBzdGF0ZS0+dG9wKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHN0YXRlLT5lcnJvcnNbKHN0YXRlLT5ib3R0b20gKyAxKSAlIEVSUl9OVU1fRVJST1JTXS5mdW5jdGlvbjsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfbGFzdF9lcnJvcih2b2lkKSB7Ci0gIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAsIDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDEgLyogdG9wICovLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogdWludDMyX3QgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgZmlsZSwgbGluZSwgTlVMTCwgTlVMTCk7CisgIHJldHVybiBnZXRfZXJyb3JfdmFsdWVzKDAgLyogcGVlayAqLywgMSAvKiB0b3AgKi8sIGZpbGUsIGxpbmUsIE5VTEwsIE5VTEwpOwogfQogCiB1aW50MzJfdCBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpIHsKLSAgcmV0dXJuIGdldF9lcnJvcl92YWx1ZXMoMCwgMSwgZmlsZSwgbGluZSwgZGF0YSwgZmxhZ3MpOworICByZXR1cm4gZ2V0X2Vycm9yX3ZhbHVlcygwIC8qIHBlZWsgKi8sIDEgLyogdG9wICovLCBmaWxlLCBsaW5lLCBkYXRhLCBmbGFncyk7CiB9CiAKIHZvaWQgRVJSX2NsZWFyX2Vycm9yKHZvaWQpIHsKQEAgLTM0MSw0MCArMzQ2LDIwIEBACiAgIGVycm5vID0gMDsKIH0KIAotY2hhciAqRVJSX2Vycm9yX3N0cmluZyh1aW50MzJfdCBwYWNrZWRfZXJyb3IsIGNoYXIgKnJldCkgewotICBzdGF0aWMgY2hhciBidWZbRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOXTsKLQotICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAvKiBUT0RPKGZvcmspOiByZW1vdmUgdGhpcy4gKi8KLSAgICByZXQgPSBidWY7Ci0gIH0KLQotI2lmICFkZWZpbmVkKE5ERUJVRykKLSAgLyogVGhpcyBpcyBhaW1lZCB0byBoZWxwIGNhdGNoIGNhbGxlcnMgd2hvIGRvbid0IHByb3ZpZGUKLSAgICogfEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTnwgYnl0ZXMgb2Ygc3BhY2UuICovCi0gIG1lbXNldChyZXQsIDAsIEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTik7Ci0jZW5kaWYKLQotICBFUlJfZXJyb3Jfc3RyaW5nX24ocGFja2VkX2Vycm9yLCByZXQsIEVSUl9FUlJPUl9TVFJJTkdfQlVGX0xFTik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBFUlJfZXJyb3Jfc3RyaW5nX24odWludDMyX3QgcGFja2VkX2Vycm9yLCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgY2hhciBsaWJfYnVmWzY0XSwgZnVuY19idWZbNjRdLCByZWFzb25fYnVmWzY0XTsKLSAgY29uc3QgY2hhciAqbGliX3N0ciwgKmZ1bmNfc3RyLCAqcmVhc29uX3N0cjsKLSAgdW5zaWduZWQgbGliLCBmdW5jLCByZWFzb247CitzdGF0aWMgdm9pZCBlcnJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY29uc3QgY2hhciAqZnVuY19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBjaGFyIGxpYl9idWZbNjRdLCByZWFzb25fYnVmWzY0XTsKKyAgY29uc3QgY2hhciAqbGliX3N0ciwgKnJlYXNvbl9zdHI7CisgIHVuc2lnbmVkIGxpYiwgcmVhc29uOwogCiAgIGlmIChsZW4gPT0gMCkgewogICAgIHJldHVybjsKICAgfQogCiAgIGxpYiA9IEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvcik7Ci0gIGZ1bmMgPSBFUlJfR0VUX0ZVTkMocGFja2VkX2Vycm9yKTsKICAgcmVhc29uID0gRVJSX0dFVF9SRUFTT04ocGFja2VkX2Vycm9yKTsKIAogICBsaWJfc3RyID0gRVJSX2xpYl9lcnJvcl9zdHJpbmcocGFja2VkX2Vycm9yKTsKLSAgZnVuY19zdHIgPSBFUlJfZnVuY19lcnJvcl9zdHJpbmcocGFja2VkX2Vycm9yKTsKICAgcmVhc29uX3N0ciA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvcik7CiAKICAgaWYgKGxpYl9zdHIgPT0gTlVMTCkgewpAQCAtMzgzLDggKzM2OCw3IEBACiAgIH0KIAogICBpZiAoZnVuY19zdHIgPT0gTlVMTCkgewotICAgIEJJT19zbnByaW50ZihmdW5jX2J1Ziwgc2l6ZW9mKGZ1bmNfYnVmKSwgImZ1bmMoJXUpIiwgZnVuYyk7Ci0gICAgZnVuY19zdHIgPSBmdW5jX2J1ZjsKKyAgICBmdW5jX3N0ciA9ICJPUEVOU1NMX2ludGVybmFsIjsKICAgfQogCiAgIGlmIChyZWFzb25fc3RyID09IE5VTEwpIHsKQEAgLTQyNiw2ICs0MTAsMjkgQEAKICAgfQogfQogCitjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvciwgY2hhciAqcmV0KSB7CisgIHN0YXRpYyBjaGFyIGJ1ZltFUlJfRVJST1JfU1RSSU5HX0JVRl9MRU5dOworCisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIC8qIFRPRE8oZm9yayk6IHJlbW92ZSB0aGlzLiAqLworICAgIHJldCA9IGJ1ZjsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAvKiBUaGlzIGlzIGFpbWVkIHRvIGhlbHAgY2F0Y2ggY2FsbGVycyB3aG8gZG9uJ3QgcHJvdmlkZQorICAgKiB8RVJSX0VSUk9SX1NUUklOR19CVUZfTEVOfCBieXRlcyBvZiBzcGFjZS4gKi8KKyAgbWVtc2V0KHJldCwgMCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKyNlbmRpZgorCisgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIHJldCwgRVJSX0VSUk9SX1NUUklOR19CVUZfTEVOKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIEVSUl9lcnJvcl9zdHJpbmdfbih1aW50MzJfdCBwYWNrZWRfZXJyb3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgeworICBlcnJfZXJyb3Jfc3RyaW5nKHBhY2tlZF9lcnJvciwgTlVMTCwgYnVmLCBsZW4pOworfQorCiAvLyBlcnJfc3RyaW5nX2NtcCBpcyBhIGNvbXBhcmUgZnVuY3Rpb24gZm9yIHNlYXJjaGluZyBlcnJvciB2YWx1ZXMgd2l0aAogLy8gfGJzZWFyY2h8IGluIHxlcnJfc3RyaW5nX2xvb2t1cHwuCiBzdGF0aWMgaW50IGVycl9zdHJpbmdfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKQEAgLTUwNSw4ICs1MTIsOCBAQAogICAgICJITUFDIHJvdXRpbmVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX0hNQUMgKi8KICAgICAiRGlnZXN0IGZ1bmN0aW9ucyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9ESUdFU1QgKi8KICAgICAiQ2lwaGVyIGZ1bmN0aW9ucyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9DSVBIRVIgKi8KLSAgICAiVXNlciBkZWZpbmVkIGZ1bmN0aW9ucyIsICAgICAgICAgICAgICAgICAgICAgLyogRVJSX0xJQl9VU0VSICovCiAgICAgIkhLREYgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVSUl9MSUJfSEtERiAqLworICAgICJVc2VyIGRlZmluZWQgZnVuY3Rpb25zIiwgICAgICAgICAgICAgICAgICAgICAvKiBFUlJfTElCX1VTRVIgKi8KIH07CiAKIGNvbnN0IGNoYXIgKkVSUl9saWJfZXJyb3Jfc3RyaW5nKHVpbnQzMl90IHBhY2tlZF9lcnJvcikgewpAQCAtNTE5LDM2ICs1MjYsNyBAQAogfQogCiBjb25zdCBjaGFyICpFUlJfZnVuY19lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGxpYiA9IEVSUl9HRVRfTElCKHBhY2tlZF9lcnJvcik7Ci0gIGNvbnN0IHVpbnQzMl90IGZ1bmMgPSBFUlJfR0VUX0ZVTkMocGFja2VkX2Vycm9yKTsKLQotICBpZiAobGliID09IEVSUl9MSUJfU1lTKSB7Ci0gICAgc3dpdGNoIChmdW5jKSB7Ci0gICAgICBjYXNlIFNZU19GX2ZvcGVuOgotICAgICAgICByZXR1cm4gImZvcGVuIjsKLSAgICAgIGNhc2UgU1lTX0ZfZmNsb3NlOgotICAgICAgICByZXR1cm4gImZjbG9zZSI7Ci0gICAgICBjYXNlIFNZU19GX2ZyZWFkOgotICAgICAgICByZXR1cm4gImZyZWFkIjsKLSAgICAgIGNhc2UgU1lTX0ZfZndyaXRlOgotICAgICAgICByZXR1cm4gImZ3cml0ZSI7Ci0gICAgICBjYXNlIFNZU19GX3NvY2tldDoKLSAgICAgICAgcmV0dXJuICJzb2NrZXQiOwotICAgICAgY2FzZSBTWVNfRl9zZXRzb2Nrb3B0OgotICAgICAgICByZXR1cm4gInNldHNvY2tvcHQiOwotICAgICAgY2FzZSBTWVNfRl9jb25uZWN0OgotICAgICAgICByZXR1cm4gImNvbm5lY3QiOwotICAgICAgY2FzZSBTWVNfRl9nZXRhZGRyaW5mbzoKLSAgICAgICAgcmV0dXJuICJnZXRhZGRyaW5mbyI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gZXJyX3N0cmluZ19sb29rdXAoRVJSX0dFVF9MSUIocGFja2VkX2Vycm9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9HRVRfRlVOQyhwYWNrZWRfZXJyb3IpLCBrT3BlblNTTEZ1bmN0aW9uVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAga09wZW5TU0xGdW5jdGlvblZhbHVlc0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcGVuU1NMRnVuY3Rpb25TdHJpbmdEYXRhKTsKKyAgcmV0dXJuICJPUEVOU1NMX2ludGVybmFsIjsKIH0KIAogY29uc3QgY2hhciAqRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodWludDMyX3QgcGFja2VkX2Vycm9yKSB7CkBAIC01OTksMTIgKzU3NywxMyBAQAogICBjb25zdCB1bnNpZ25lZCBsb25nIHRocmVhZF9oYXNoID0gKHVpbnRwdHJfdCkgZXJyX2dldF9zdGF0ZSgpOwogCiAgIGZvciAoOzspIHsKKyAgICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IEVSUl9wZWVrX2Z1bmN0aW9uKCk7CiAgICAgcGFja2VkX2Vycm9yID0gRVJSX2dldF9lcnJvcl9saW5lX2RhdGEoJmZpbGUsICZsaW5lLCAmZGF0YSwgJmZsYWdzKTsKICAgICBpZiAocGFja2VkX2Vycm9yID09IDApIHsKICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIEVSUl9lcnJvcl9zdHJpbmdfbihwYWNrZWRfZXJyb3IsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGVycl9lcnJvcl9zdHJpbmcocGFja2VkX2Vycm9yLCBmdW5jdGlvbiwgYnVmLCBzaXplb2YoYnVmKSk7CiAgICAgQklPX3NucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVsdTolczolczolZDolc1xuIiwgdGhyZWFkX2hhc2gsIGJ1ZiwKICAgICAgICAgICAgICAgICAgZmlsZSwgbGluZSwgKGZsYWdzICYgRVJSX0ZMQUdfU1RSSU5HKSA/IGRhdGEgOiAiIik7CiAgICAgaWYgKGNhbGxiYWNrKGJ1ZjIsIHN0cmxlbihidWYyKSwgY3R4KSA8PSAwKSB7CkBAIC02NDQsOCArNjIzLDggQEAKICAgZXJyb3ItPmZsYWdzID0gZmxhZ3M7CiB9CiAKLXZvaWQgRVJSX3B1dF9lcnJvcihpbnQgbGlicmFyeSwgaW50IGZ1bmMsIGludCByZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZSkgewordm9pZCBFUlJfcHV0X2Vycm9yKGludCBsaWJyYXJ5LCBpbnQgcmVhc29uLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsaW5lKSB7CiAgIEVSUl9TVEFURSAqY29uc3Qgc3RhdGUgPSBlcnJfZ2V0X3N0YXRlKCk7CiAgIHN0cnVjdCBlcnJfZXJyb3Jfc3QgKmVycm9yOwogCkBAIC02NTQsNyArNjMzLDcgQEAKICAgfQogCiAgIGlmIChsaWJyYXJ5ID09IEVSUl9MSUJfU1lTICYmIHJlYXNvbiA9PSAwKSB7Ci0jaWYgZGVmaW5lZChXSU4zMikKKyNpZiBkZWZpbmVkKE9QRU5TU0xfV0lORE9XUykKICAgICByZWFzb24gPSBHZXRMYXN0RXJyb3IoKTsKICNlbHNlCiAgICAgcmVhc29uID0gZXJybm87CkBAIC02NjgsOSArNjQ3LDEwIEBACiAKICAgZXJyb3IgPSAmc3RhdGUtPmVycm9yc1tzdGF0ZS0+dG9wXTsKICAgZXJyX2NsZWFyKGVycm9yKTsKKyAgZXJyb3ItPmZ1bmN0aW9uID0gZnVuY3Rpb247CiAgIGVycm9yLT5maWxlID0gZmlsZTsKICAgZXJyb3ItPmxpbmUgPSBsaW5lOwotICBlcnJvci0+cGFja2VkID0gRVJSX1BBQ0sobGlicmFyeSwgZnVuYywgcmVhc29uKTsKKyAgZXJyb3ItPnBhY2tlZCA9IEVSUl9QQUNLKGxpYnJhcnksIHJlYXNvbik7CiB9CiAKIC8qIEVSUl9hZGRfZXJyb3JfZGF0YV92ZGF0YSB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBjb25zdCBjaGFyKiBwb2ludGVycywKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2Vycl9kYXRhX2dlbmVyYXRlLmdvIGIvc3JjL2NyeXB0by9lcnIvZXJyX2RhdGFfZ2VuZXJhdGUuZ28KaW5kZXggYTViNGNiNS4uMjRlMGQ2NiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZXJyX2RhdGFfZ2VuZXJhdGUuZ28KKysrIGIvc3JjL2NyeXB0by9lcnIvZXJyX2RhdGFfZ2VuZXJhdGUuZ28KQEAgLTU5LDggKzU5LDggQEAKIAkiSE1BQyIsCiAJIkRJR0VTVCIsCiAJIkNJUEhFUiIsCi0JIlVTRVIiLAogCSJIS0RGIiwKKwkiVVNFUiIsCiB9CiAKIC8vIHN0cmluZ0xpc3QgaXMgYSBtYXAgZnJvbSB1aW50MzIgLT4gc3RyaW5nIHdoaWNoIGNhbiBvdXRwdXQgZGF0YSBmb3IgYSBzb3J0ZWQKQEAgLTY5LDcgKzY5LDcgQEAKIAkvLyBlbnRyaWVzIGlzIGFuIGFycmF5IG9mIGtleXMgYW5kIG9mZnNldHMgaW50byB8c3RyaW5nRGF0YXwuIFRoZQogCS8vIG9mZnNldHMgYXJlIGluIHRoZSBib3R0b20gMTUgYml0cyBvZiBlYWNoIHVpbnQzMiBhbmQgdGhlIGtleSBpcyB0aGUKIAkvLyB0b3AgMTcgYml0cy4KLQllbnRyaWVzICAgICAgICAgW111aW50MzIKKwllbnRyaWVzIFtddWludDMyCiAJLy8gaW50ZXJuZWRTdHJpbmdzIGNvbnRhaW5zIHRoZSBzYW1lIHN0cmluZ3MgYXMgYXJlIGluIHxzdHJpbmdEYXRhfCwKIAkvLyBidXQgYWxsb3dzIGZvciBlYXN5IGRlZHVwbGljYXRpb24uIEl0IG1hcHMgYSBzdHJpbmcgdG8gaXRzIG9mZnNldCBpbgogCS8vIHxzdHJpbmdEYXRhfC4KQEAgLTE0Niw3ICsxNDYsNyBAQAogCQlmbXQuRnByaW50ZihvdXQsICIgICAgMHgleCxcbiIsIHYpCiAJfQogCW91dC5Xcml0ZVN0cmluZygifTtcblxuIikKLQlvdXQuV3JpdGVTdHJpbmcoImNvbnN0IHNpemVfdCAiICsgdmFsdWVzICsgIkxlbiA9IHNpemVvZigiICsgdmFsdWVzICsgIikgLyBzaXplb2YoIiArIHZhbHVlcyArICJbMF0pO1xuXG4iKTsKKwlvdXQuV3JpdGVTdHJpbmcoImNvbnN0IHNpemVfdCAiICsgdmFsdWVzICsgIkxlbiA9IHNpemVvZigiICsgdmFsdWVzICsgIikgLyBzaXplb2YoIiArIHZhbHVlcyArICJbMF0pO1xuXG4iKQogCiAJc3RyaW5nRGF0YSA6PSAia09wZW5TU0wiICsgbmFtZSArICJTdHJpbmdEYXRhIgogCW91dC5Xcml0ZVN0cmluZygiY29uc3QgY2hhciAiICsgc3RyaW5nRGF0YSArICJbXSA9XG4gICAgXCIiKQpAQCAtMTYxLDggKzE2MSw4IEBACiB9CiAKIHR5cGUgZXJyb3JEYXRhIHN0cnVjdCB7Ci0JZnVuY3Rpb25zLCByZWFzb25zICpzdHJpbmdMaXN0Ci0JbGlicmFyeU1hcCAgICAgICAgIG1hcFtzdHJpbmdddWludDMyCisJcmVhc29ucyAgICAqc3RyaW5nTGlzdAorCWxpYnJhcnlNYXAgbWFwW3N0cmluZ111aW50MzIKIH0KIAogZnVuYyAoZSAqZXJyb3JEYXRhKSByZWFkRXJyb3JEYXRhRmlsZShmaWxlbmFtZSBzdHJpbmcpIGVycm9yIHsKQEAgLTE4NCw4ICsxODQsOCBAQAogCQkJY29udGludWUKIAkJfQogCQlwYXJ0cyA6PSBieXRlcy5TcGxpdChsaW5lLCBjb21tYSkKLQkJaWYgbGVuKHBhcnRzKSAhPSA0IHsKLQkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgbGluZSAlZCBpbiAlczogZm91bmQgJWQgdmFsdWVzIGJ1dCB3YW50IDQiLCBsaW5lTm8sIGZpbGVuYW1lLCBsZW4ocGFydHMpKQorCQlpZiBsZW4ocGFydHMpICE9IDMgeworCQkJcmV0dXJuIGZtdC5FcnJvcmYoImJhZCBsaW5lICVkIGluICVzOiBmb3VuZCAlZCB2YWx1ZXMgYnV0IHdhbnQgMyIsIGxpbmVObywgZmlsZW5hbWUsIGxlbihwYXJ0cykpCiAJCX0KIAkJbGliTnVtLCBvayA6PSBlLmxpYnJhcnlNYXBbc3RyaW5nKHBhcnRzWzBdKV0KIAkJaWYgIW9rIHsKQEAgLTE5NCwyNiArMTk0LDE4IEBACiAJCWlmIGxpYk51bSA+PSA2NCB7CiAJCQlyZXR1cm4gZm10LkVycm9yZigiYmFkIGxpbmUgJWQgaW4gJXM6IGxpYnJhcnkgdmFsdWUgdG9vIGxhcmdlIiwgbGluZU5vLCBmaWxlbmFtZSkKIAkJfQotCQlrZXksIGVyciA6PSBzdHJjb252LlBhcnNlVWludChzdHJpbmcocGFydHNbMl0pLCAxMCAvKiBiYXNlICovLCAzMiAvKiBiaXQgc2l6ZSAqLykKKwkJa2V5LCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQoc3RyaW5nKHBhcnRzWzFdKSwgMTAgLyogYmFzZSAqLywgMzIgLyogYml0IHNpemUgKi8pCiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIGZtdC5FcnJvcmYoImJhZCBsaW5lICVkIGluICVzOiAlcyIsIGxpbmVObywgZmlsZW5hbWUsIGVycikKIAkJfQogCQlpZiBrZXkgPj0gMjA0OCB7CiAJCQlyZXR1cm4gZm10LkVycm9yZigiYmFkIGxpbmUgJWQgaW4gJXM6IGtleSB0b28gbGFyZ2UiLCBsaW5lTm8sIGZpbGVuYW1lKQogCQl9Ci0JCXZhbHVlIDo9IHN0cmluZyhwYXJ0c1szXSkKKwkJdmFsdWUgOj0gc3RyaW5nKHBhcnRzWzJdKQogCiAJCWxpc3RLZXkgOj0gbGliTnVtPDwyNiB8IHVpbnQzMihrZXkpPDwxNQogCi0JCXN3aXRjaCBzdHJpbmcocGFydHNbMV0pIHsKLQkJY2FzZSAiZnVuY3Rpb24iOgotCQkJZXJyID0gZS5mdW5jdGlvbnMuQWRkKGxpc3RLZXksIHZhbHVlKQotCQljYXNlICJyZWFzb24iOgotCQkJZXJyID0gZS5yZWFzb25zLkFkZChsaXN0S2V5LCB2YWx1ZSkKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmbXQuRXJyb3JmKCJiYWQgbGluZSAlZCBpbiAlczogYmFkIHZhbHVlIHR5cGUiLCBsaW5lTm8sIGZpbGVuYW1lKQotCQl9Ci0KKwkJZXJyID0gZS5yZWFzb25zLkFkZChsaXN0S2V5LCB2YWx1ZSkKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gZXJyCiAJCX0KQEAgLTIyNCw3ICsyMTYsNiBAQAogCiBmdW5jIG1haW4oKSB7CiAJZSA6PSAmZXJyb3JEYXRhewotCQlmdW5jdGlvbnM6ICBuZXdTdHJpbmdMaXN0KCksCiAJCXJlYXNvbnM6ICAgIG5ld1N0cmluZ0xpc3QoKSwKIAkJbGlicmFyeU1hcDogbWFrZShtYXBbc3RyaW5nXXVpbnQzMiksCiAJfQpAQCAtMjc5LDkgKzI3MCw4IEBACiAJZm9yIGksIG5hbWUgOj0gcmFuZ2UgbGlicmFyeU5hbWVzIHsKIAkJZm10LkZwcmludGYob3V0LCAiT1BFTlNTTF9DT01QSUxFX0FTU0VSVChFUlJfTElCXyVzID09ICVkLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkXyVkKTtcbiIsIG5hbWUsIGkrMSwgaSsxKQogCX0KLQlmbXQuRnByaW50ZihvdXQsICJPUEVOU1NMX0NPTVBJTEVfQVNTRVJUKEVSUl9OVU1fTElCUyA9PSAlZCwgbGlicmFyeV92YWx1ZXNfY2hhbmdlZF9udW0pO1xuIiwgbGVuKGxpYnJhcnlOYW1lcykgKyAxKQorCWZtdC5GcHJpbnRmKG91dCwgIk9QRU5TU0xfQ09NUElMRV9BU1NFUlQoRVJSX05VTV9MSUJTID09ICVkLCBsaWJyYXJ5X3ZhbHVlc19jaGFuZ2VkX251bSk7XG4iLCBsZW4obGlicmFyeU5hbWVzKSsxKQogCW91dC5Xcml0ZVN0cmluZygiXG4iKQogCi0JZS5mdW5jdGlvbnMuV3JpdGVUbyhvdXQsICJGdW5jdGlvbiIpCiAJZS5yZWFzb25zLldyaXRlVG8ob3V0LCAiUmVhc29uIikKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL2Vycl90ZXN0LmNjIGIvc3JjL2NyeXB0by9lcnIvZXJyX3Rlc3QuY2MKaW5kZXggOThkZmI4NS4uNjY0M2M2OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvZXJyX3Rlc3QuY2MKKysrIGIvc3JjL2NyeXB0by9lcnIvZXJyX3Rlc3QuY2MKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGJvb2wgVGVzdE92ZXJmbG93KCkgewogICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRVJSX05VTV9FUlJPUlMqMjsgaSsrKSB7Ci0gICAgRVJSX3B1dF9lcnJvcigxLCAyLCBpKzEsICJ0ZXN0IiwgMSk7CisgICAgRVJSX3B1dF9lcnJvcigxLCBpKzEsICJmdW5jdGlvbiIsICJ0ZXN0IiwgMSk7CiAgIH0KIAogICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgRVJSX05VTV9FUlJPUlMgLSAxOyBpKyspIHsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CisgIEVSUl9wdXRfZXJyb3IoMSwgMiwgImZ1bmN0aW9uIiwgInRlc3QiLCA0KTsKICAgRVJSX2FkZF9lcnJvcl9kYXRhKDEsICJ0ZXN0aW5nIik7CiAKICAgaW50IHBlZWtlZF9saW5lLCBsaW5lLCBwZWVrZWRfZmxhZ3MsIGZsYWdzOwpAQCAtNTgsNiArNTgsNyBAQAogICB1aW50MzJfdCBwZWVrZWRfcGFja2VkX2Vycm9yID0KICAgICAgIEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YSgmcGVla2VkX2ZpbGUsICZwZWVrZWRfbGluZSwgJnBlZWtlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZWVrZWRfZmxhZ3MpOworICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IEVSUl9wZWVrX2Z1bmN0aW9uKCk7CiAgIHVpbnQzMl90IHBhY2tlZF9lcnJvciA9IEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKCZmaWxlLCAmbGluZSwgJmRhdGEsICZmbGFncyk7CiAKICAgaWYgKHBlZWtlZF9wYWNrZWRfZXJyb3IgIT0gcGFja2VkX2Vycm9yIHx8CkBAIC02OCwxMiArNjksMTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBpZiAoc3RyY21wKGZpbGUsICJ0ZXN0IikgIT0gMCB8fAorICBpZiAoc3RyY21wKGZ1bmN0aW9uLCAiZnVuY3Rpb24iKSAhPSAwIHx8CisgICAgICBzdHJjbXAoZmlsZSwgInRlc3QiKSAhPSAwIHx8CiAgICAgICBsaW5lICE9IDQgfHwKICAgICAgIChmbGFncyAmIEVSUl9GTEFHX1NUUklORykgPT0gMCB8fAogICAgICAgRVJSX0dFVF9MSUIocGFja2VkX2Vycm9yKSAhPSAxIHx8Ci0gICAgICBFUlJfR0VUX0ZVTkMocGFja2VkX2Vycm9yKSAhPSAyIHx8Ci0gICAgICBFUlJfR0VUX1JFQVNPTihwYWNrZWRfZXJyb3IpICE9IDMgfHwKKyAgICAgIEVSUl9HRVRfUkVBU09OKHBhY2tlZF9lcnJvcikgIT0gMiB8fAogICAgICAgc3RyY21wKGRhdGEsICJ0ZXN0aW5nIikgIT0gMCkgewogICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGVycm9yIGRhdGEgcmV0dXJuZWQuXG4iKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC04OCw3ICs4OSw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgRVJSX3B1dF9lcnJvcigxLCAyLCAzLCAidGVzdCIsIDQpOworICBFUlJfcHV0X2Vycm9yKDEsIDIsICJmdW5jdGlvbiIsICJ0ZXN0IiwgNCk7CiAgIEVSUl9jbGVhcl9lcnJvcigpOwogCiAgIGlmIChFUlJfZ2V0X2Vycm9yKCkgIT0gMCkgewpAQCAtMTAwLDcgKzEwMSw3IEBACiB9CiAKIHN0YXRpYyBib29sIFRlc3RQcmludCgpIHsKLSAgRVJSX3B1dF9lcnJvcigxLCAyLCAzLCAidGVzdCIsIDQpOworICBFUlJfcHV0X2Vycm9yKDEsIDIsICJmdW5jdGlvbiIsICJ0ZXN0IiwgNCk7CiAgIEVSUl9hZGRfZXJyb3JfZGF0YSgxLCAidGVzdGluZyIpOwogICB1aW50MzJfdCBwYWNrZWRfZXJyb3IgPSBFUlJfZ2V0X2Vycm9yKCk7CiAKQEAgLTExMywxMSArMTE0LDQxIEBACiB9CiAKIHN0YXRpYyBib29sIFRlc3RSZWxlYXNlKCkgewotICBFUlJfcHV0X2Vycm9yKDEsIDIsIDMsICJ0ZXN0IiwgNCk7CisgIEVSUl9wdXRfZXJyb3IoMSwgMiwgImZ1bmN0aW9uIiwgInRlc3QiLCA0KTsKICAgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CiAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBIYXNTdWZmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdWZmaXgpIHsKKyAgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgc2l6ZV90IHN0cl9sZW4gPSBzdHJsZW4oc3RyKTsKKyAgaWYgKHN0cl9sZW4gPCBzdWZmaXhfbGVuKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiBzdHJjbXAoc3RyICsgc3RyX2xlbiAtIHN1ZmZpeF9sZW4sIHN1ZmZpeCkgPT0gMDsKK30KKworc3RhdGljIGJvb2wgVGVzdFB1dE1hY3JvKCkgeworICBpbnQgZXhwZWN0ZWRfbGluZSA9IF9fTElORV9fICsgMTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoVVNFUiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCisgIGludCBsaW5lOworICBjb25zdCBjaGFyICpmaWxlOworICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IEVSUl9wZWVrX2Z1bmN0aW9uKCk7CisgIHVpbnQzMl90IGVycm9yID0gRVJSX2dldF9lcnJvcl9saW5lKCZmaWxlLCAmbGluZSk7CisKKyAgaWYgKHN0cmNtcChmdW5jdGlvbiwgIlRlc3RQdXRNYWNybyIpICE9IDAgfHwKKyAgICAgICFIYXNTdWZmaXgoZmlsZSwgImVycl90ZXN0LmNjIikgfHwKKyAgICAgIGxpbmUgIT0gZXhwZWN0ZWRfbGluZSB8fAorICAgICAgRVJSX0dFVF9MSUIoZXJyb3IpICE9IEVSUl9MSUJfVVNFUiB8fAorICAgICAgRVJSX0dFVF9SRUFTT04oZXJyb3IpICE9IEVSUl9SX0lOVEVSTkFMX0VSUk9SKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCYWQgZXJyb3IgZGF0YSByZXR1cm5lZC5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCiBpbnQgbWFpbigpIHsKICAgQ1JZUFRPX2xpYnJhcnlfaW5pdCgpOwogCkBAIC0xMjUsNyArMTU2LDggQEAKICAgICAgICFUZXN0UHV0RXJyb3IoKSB8fAogICAgICAgIVRlc3RDbGVhckVycm9yKCkgfHwKICAgICAgICFUZXN0UHJpbnQoKSB8fAotICAgICAgIVRlc3RSZWxlYXNlKCkpIHsKKyAgICAgICFUZXN0UmVsZWFzZSgpIHx8CisgICAgICAhVGVzdFB1dE1hY3JvKCkpIHsKICAgICByZXR1cm4gMTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9ldnAuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvZXZwLmVycm9yZGF0YQppbmRleCAxNGRkMjdiLi44ZjhkZDQ4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9ldnAuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL2V2cC5lcnJvcmRhdGEKQEAgLTEsMTE0ICsxLDQ2IEBACi1FVlAsZnVuY3Rpb24sMTYwLEVWUF9EaWdlc3RTaWduQWxnb3JpdGhtCi1FVlAsZnVuY3Rpb24sMTYxLEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobQotRVZQLGZ1bmN0aW9uLDE2MixFVlBfUEtFWV9DVFhfY3RybAotRVZQLGZ1bmN0aW9uLDE2MyxFVlBfUEtFWV9DVFhfZHVwCi1FVlAsZnVuY3Rpb24sMTU5LEVWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsCi1FVlAsZnVuY3Rpb24sMTY0LEVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycwotRVZQLGZ1bmN0aW9uLDE2NSxFVlBfUEtFWV9kZWNyeXB0Ci1FVlAsZnVuY3Rpb24sMTY2LEVWUF9QS0VZX2RlY3J5cHRfaW5pdAotRVZQLGZ1bmN0aW9uLDE2NyxFVlBfUEtFWV9kZXJpdmUKLUVWUCxmdW5jdGlvbiwxMDgsRVZQX1BLRVlfZGVyaXZlX2luaXQKLUVWUCxmdW5jdGlvbiwxNjgsRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyCi1FVlAsZnVuY3Rpb24sMTEwLEVWUF9QS0VZX2VuY3J5cHQKLUVWUCxmdW5jdGlvbiwxMTEsRVZQX1BLRVlfZW5jcnlwdF9pbml0Ci1FVlAsZnVuY3Rpb24sMTEyLEVWUF9QS0VZX2dldDFfREgKLUVWUCxmdW5jdGlvbiwxNjksRVZQX1BLRVlfZ2V0MV9EU0EKLUVWUCxmdW5jdGlvbiwxMTQsRVZQX1BLRVlfZ2V0MV9FQ19LRVkKLUVWUCxmdW5jdGlvbiwxMTUsRVZQX1BLRVlfZ2V0MV9SU0EKLUVWUCxmdW5jdGlvbiwxMTYsRVZQX1BLRVlfa2V5Z2VuCi1FVlAsZnVuY3Rpb24sMTcwLEVWUF9QS0VZX2tleWdlbl9pbml0Ci1FVlAsZnVuY3Rpb24sMTcxLEVWUF9QS0VZX25ldwotRVZQLGZ1bmN0aW9uLDE3MixFVlBfUEtFWV9zZXRfdHlwZQotRVZQLGZ1bmN0aW9uLDEyMCxFVlBfUEtFWV9zaWduCi1FVlAsZnVuY3Rpb24sMTIxLEVWUF9QS0VZX3NpZ25faW5pdAotRVZQLGZ1bmN0aW9uLDEyMixFVlBfUEtFWV92ZXJpZnkKLUVWUCxmdW5jdGlvbiwxMjMsRVZQX1BLRVlfdmVyaWZ5X2luaXQKLUVWUCxmdW5jdGlvbiwxNzMsY2hlY2tfcGFkZGluZ19tZAotRVZQLGZ1bmN0aW9uLDEyNSxkMmlfQXV0b1ByaXZhdGVLZXkKLUVWUCxmdW5jdGlvbiwxMjYsZDJpX1ByaXZhdGVLZXkKLUVWUCxmdW5jdGlvbiwxMjcsZG9fRUNfS0VZX3ByaW50Ci1FVlAsZnVuY3Rpb24sMTc0LGRvX2RzYV9wcmludAotRVZQLGZ1bmN0aW9uLDE3NSxkb19yc2FfcHJpbnQKLUVWUCxmdW5jdGlvbiwxMjksZG9fc2lndmVyX2luaXQKLUVWUCxmdW5jdGlvbiwxNzYsZHNhX3BhcmFtX2RlY29kZQotRVZQLGZ1bmN0aW9uLDE3Nyxkc2FfcHJpdl9kZWNvZGUKLUVWUCxmdW5jdGlvbiwxNzgsZHNhX3ByaXZfZW5jb2RlCi1FVlAsZnVuY3Rpb24sMTc5LGRzYV9wdWJfZGVjb2RlCi1FVlAsZnVuY3Rpb24sMTgwLGRzYV9wdWJfZW5jb2RlCi1FVlAsZnVuY3Rpb24sMTgxLGRzYV9zaWdfcHJpbnQKLUVWUCxmdW5jdGlvbiwxMzAsZWNrZXlfcGFyYW0ydHlwZQotRVZQLGZ1bmN0aW9uLDEzMSxlY2tleV9wYXJhbV9kZWNvZGUKLUVWUCxmdW5jdGlvbiwxMzIsZWNrZXlfcHJpdl9kZWNvZGUKLUVWUCxmdW5jdGlvbiwxMzMsZWNrZXlfcHJpdl9lbmNvZGUKLUVWUCxmdW5jdGlvbiwxMzQsZWNrZXlfcHViX2RlY29kZQotRVZQLGZ1bmN0aW9uLDEzNSxlY2tleV9wdWJfZW5jb2RlCi1FVlAsZnVuY3Rpb24sMTM2LGVja2V5X3R5cGUycGFyYW0KLUVWUCxmdW5jdGlvbiwxMzcsZXZwX3BrZXlfY3R4X25ldwotRVZQLGZ1bmN0aW9uLDEzOCxobWFjX3NpZ25jdHgKLUVWUCxmdW5jdGlvbiwxMzksaTJkX1B1YmxpY0tleQotRVZQLGZ1bmN0aW9uLDE4MixvbGRfZHNhX3ByaXZfZGVjb2RlCi1FVlAsZnVuY3Rpb24sMTQwLG9sZF9lY19wcml2X2RlY29kZQotRVZQLGZ1bmN0aW9uLDE0MSxvbGRfcnNhX3ByaXZfZGVjb2RlCi1FVlAsZnVuY3Rpb24sMTQyLHBrZXlfZWNfY3RybAotRVZQLGZ1bmN0aW9uLDE0Myxwa2V5X2VjX2Rlcml2ZQotRVZQLGZ1bmN0aW9uLDE0NCxwa2V5X2VjX2tleWdlbgotRVZQLGZ1bmN0aW9uLDE0NSxwa2V5X2VjX3BhcmFtZ2VuCi1FVlAsZnVuY3Rpb24sMTQ2LHBrZXlfZWNfc2lnbgotRVZQLGZ1bmN0aW9uLDE1OCxwa2V5X2htYWNfY3RybAotRVZQLGZ1bmN0aW9uLDE0Nyxwa2V5X3JzYV9jdHJsCi1FVlAsZnVuY3Rpb24sMTQ4LHBrZXlfcnNhX2RlY3J5cHQKLUVWUCxmdW5jdGlvbiwxNDkscGtleV9yc2FfZW5jcnlwdAotRVZQLGZ1bmN0aW9uLDE1MCxwa2V5X3JzYV9zaWduCi1FVlAsZnVuY3Rpb24sMTUxLHJzYV9hbGdvcl90b19tZAotRVZQLGZ1bmN0aW9uLDE1Mixyc2FfZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtCi1FVlAsZnVuY3Rpb24sMTUzLHJzYV9tZ2YxX3RvX21kCi1FVlAsZnVuY3Rpb24sMTU0LHJzYV9wcml2X2RlY29kZQotRVZQLGZ1bmN0aW9uLDE1NSxyc2FfcHJpdl9lbmNvZGUKLUVWUCxmdW5jdGlvbiwxNTYscnNhX3Bzc190b19jdHgKLUVWUCxmdW5jdGlvbiwxNTcscnNhX3B1Yl9kZWNvZGUKLUVWUCxyZWFzb24sMTUxLEJOX0RFQ09ERV9FUlJPUgotRVZQLHJlYXNvbiwxMDAsQlVGRkVSX1RPT19TTUFMTAotRVZQLHJlYXNvbiwxMDEsQ09NTUFORF9OT1RfU1VQUE9SVEVECi1FVlAscmVhc29uLDE0NixDT05URVhUX05PVF9JTklUSUFMSVNFRAotRVZQLHJlYXNvbiwxNDMsREVDT0RFX0VSUk9SCi1FVlAscmVhc29uLDEwNCxESUZGRVJFTlRfS0VZX1RZUEVTCi1FVlAscmVhc29uLDEwNSxESUZGRVJFTlRfUEFSQU1FVEVSUwotRVZQLHJlYXNvbiwxNDcsRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVECi1FVlAscmVhc29uLDEwNyxFWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWQotRVZQLHJlYXNvbiwxNDEsRVhQRUNUSU5HX0FOX1JTQV9LRVkKLUVWUCxyZWFzb24sMTA5LEVYUEVDVElOR19BX0RIX0tFWQotRVZQLHJlYXNvbiwxMTAsRVhQRUNUSU5HX0FfRFNBX0tFWQotRVZQLHJlYXNvbiwxMTEsSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUKLUVWUCxyZWFzb24sMTEyLElOVkFMSURfQ1VSVkUKLUVWUCxyZWFzb24sMTEzLElOVkFMSURfRElHRVNUX0xFTkdUSAotRVZQLHJlYXNvbiwxMTQsSU5WQUxJRF9ESUdFU1RfVFlQRQotRVZQLHJlYXNvbiwxMTUsSU5WQUxJRF9LRVlCSVRTCi1FVlAscmVhc29uLDExNixJTlZBTElEX01HRjFfTUQKLUVWUCxyZWFzb24sMTQyLElOVkFMSURfT1BFUkFUSU9OCi1FVlAscmVhc29uLDExOCxJTlZBTElEX1BBRERJTkdfTU9ERQotRVZQLHJlYXNvbiwxMTksSU5WQUxJRF9QU1NfUEFSQU1FVEVSUwotRVZQLHJlYXNvbiwxNDQsSU5WQUxJRF9QU1NfU0FMVExFTgotRVZQLHJlYXNvbiwxMjEsSU5WQUxJRF9TQUxUX0xFTkdUSAotRVZQLHJlYXNvbiwxMjIsSU5WQUxJRF9UUkFJTEVSCi1FVlAscmVhc29uLDEyMyxLRVlTX05PVF9TRVQKLUVWUCxyZWFzb24sMTI0LE1JU1NJTkdfUEFSQU1FVEVSUwotRVZQLHJlYXNvbiwxMjUsTk9fREVGQVVMVF9ESUdFU1QKLUVWUCxyZWFzb24sMTI2LE5PX0tFWV9TRVQKLUVWUCxyZWFzb24sMTI3LE5PX01EQzJfU1VQUE9SVAotRVZQLHJlYXNvbiwxMjgsTk9fTklEX0ZPUl9DVVJWRQotRVZQLHJlYXNvbiwxMjksTk9fT1BFUkFUSU9OX1NFVAotRVZQLHJlYXNvbiwxMzAsTk9fUEFSQU1FVEVSU19TRVQKLUVWUCxyZWFzb24sMTMxLE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUKLUVWUCxyZWFzb24sMTMyLE9QRVJBVE9OX05PVF9JTklUSUFMSVpFRAotRVZQLHJlYXNvbiwxNTIsUEFSQU1FVEVSX0VOQ09ESU5HX0VSUk9SCi1FVlAscmVhc29uLDEzMyxVTktOT1dOX0RJR0VTVAotRVZQLHJlYXNvbiwxMzQsVU5LTk9XTl9NQVNLX0RJR0VTVAotRVZQLHJlYXNvbiwxNTAsVU5LTk9XTl9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE0KLUVWUCxyZWFzb24sMTQ1LFVOS05PV05fUFVCTElDX0tFWV9UWVBFCi1FVlAscmVhc29uLDE0OSxVTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0KLUVWUCxyZWFzb24sMTM4LFVOU1VQUE9SVEVEX0FMR09SSVRITQotRVZQLHJlYXNvbiwxMzksVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0KLUVWUCxyZWFzb24sMTQwLFVOU1VQUE9SVEVEX01BU0tfUEFSQU1FVEVSCi1FVlAscmVhc29uLDE1MyxVTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUKLUVWUCxyZWFzb24sMTU0LFVOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFCi1FVlAscmVhc29uLDE0OCxXUk9OR19QVUJMSUNfS0VZX1RZUEUKK0VWUCwxNTEsQk5fREVDT0RFX0VSUk9SCitFVlAsMTAwLEJVRkZFUl9UT09fU01BTEwKK0VWUCwxMDEsQ09NTUFORF9OT1RfU1VQUE9SVEVECitFVlAsMTQ2LENPTlRFWFRfTk9UX0lOSVRJQUxJU0VECitFVlAsMTQzLERFQ09ERV9FUlJPUgorRVZQLDEwNCxESUZGRVJFTlRfS0VZX1RZUEVTCitFVlAsMTA1LERJRkZFUkVOVF9QQVJBTUVURVJTCitFVlAsMTQ3LERJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRAorRVZQLDEwNyxFWFBFQ1RJTkdfQU5fRUNfS0VZX0tFWQorRVZQLDE0MSxFWFBFQ1RJTkdfQU5fUlNBX0tFWQorRVZQLDEwOSxFWFBFQ1RJTkdfQV9ESF9LRVkKK0VWUCwxMTAsRVhQRUNUSU5HX0FfRFNBX0tFWQorRVZQLDExMSxJTExFR0FMX09SX1VOU1VQUE9SVEVEX1BBRERJTkdfTU9ERQorRVZQLDExMixJTlZBTElEX0NVUlZFCitFVlAsMTEzLElOVkFMSURfRElHRVNUX0xFTkdUSAorRVZQLDExNCxJTlZBTElEX0RJR0VTVF9UWVBFCitFVlAsMTE1LElOVkFMSURfS0VZQklUUworRVZQLDExNixJTlZBTElEX01HRjFfTUQKK0VWUCwxNDIsSU5WQUxJRF9PUEVSQVRJT04KK0VWUCwxMTgsSU5WQUxJRF9QQURESU5HX01PREUKK0VWUCwxMTksSU5WQUxJRF9QU1NfUEFSQU1FVEVSUworRVZQLDE0NCxJTlZBTElEX1BTU19TQUxUTEVOCitFVlAsMTIxLElOVkFMSURfU0FMVF9MRU5HVEgKK0VWUCwxMjIsSU5WQUxJRF9UUkFJTEVSCitFVlAsMTIzLEtFWVNfTk9UX1NFVAorRVZQLDEyNCxNSVNTSU5HX1BBUkFNRVRFUlMKK0VWUCwxMjUsTk9fREVGQVVMVF9ESUdFU1QKK0VWUCwxMjYsTk9fS0VZX1NFVAorRVZQLDEyNyxOT19NREMyX1NVUFBPUlQKK0VWUCwxMjgsTk9fTklEX0ZPUl9DVVJWRQorRVZQLDEyOSxOT19PUEVSQVRJT05fU0VUCitFVlAsMTMwLE5PX1BBUkFNRVRFUlNfU0VUCitFVlAsMTMxLE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUKK0VWUCwxMzIsT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVECitFVlAsMTUyLFBBUkFNRVRFUl9FTkNPRElOR19FUlJPUgorRVZQLDEzMyxVTktOT1dOX0RJR0VTVAorRVZQLDEzNCxVTktOT1dOX01BU0tfRElHRVNUCitFVlAsMTUwLFVOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNCitFVlAsMTQ1LFVOS05PV05fUFVCTElDX0tFWV9UWVBFCitFVlAsMTQ5LFVOS05PV05fU0lHTkFUVVJFX0FMR09SSVRITQorRVZQLDEzOCxVTlNVUFBPUlRFRF9BTEdPUklUSE0KK0VWUCwxMzksVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0KK0VWUCwxNDAsVU5TVVBQT1JURURfTUFTS19QQVJBTUVURVIKK0VWUCwxNTMsVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFCitFVlAsMTU0LFVOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFCitFVlAsMTQ4LFdST05HX1BVQkxJQ19LRVlfVFlQRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvaGtkZi5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9oa2RmLmVycm9yZGF0YQppbmRleCA4NzhhODAyLi44NDg2NmRlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9oa2RmLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9oa2RmLmVycm9yZGF0YQpAQCAtMSwyICsxIEBACi1IS0RGLGZ1bmN0aW9uLDEwMCxIS0RGCi1IS0RGLHJlYXNvbiwxMDAsT1VUUFVUX1RPT19MQVJHRQorSEtERiwxMDAsT1VUUFVUX1RPT19MQVJHRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvb2JqLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL29iai5lcnJvcmRhdGEKaW5kZXggNzRlNDYyOS4uYzU0NDM1ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvb2JqLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9vYmouZXJyb3JkYXRhCkBAIC0xLDUgKzEgQEAKLU9CSixmdW5jdGlvbiwxMDAsT0JKX2NyZWF0ZQotT0JKLGZ1bmN0aW9uLDEwMSxPQkpfZHVwCi1PQkosZnVuY3Rpb24sMTAyLE9CSl9uaWQyb2JqCi1PQkosZnVuY3Rpb24sMTAzLE9CSl90eHQyb2JqCi1PQkoscmVhc29uLDEwMCxVTktOT1dOX05JRAorT0JKLDEwMCxVTktOT1dOX05JRApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9lcnIvcGVtLmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL3BlbS5lcnJvcmRhdGEKaW5kZXggNDIyMTZhNy4uMmE0YjczYSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9lcnIvcGVtLmVycm9yZGF0YQorKysgYi9zcmMvY3J5cHRvL2Vyci9wZW0uZXJyb3JkYXRhCkBAIC0xLDM5ICsxLDE1IEBACi1QRU0sZnVuY3Rpb24sMTAwLFBFTV9BU04xX3JlYWQKLVBFTSxmdW5jdGlvbiwxMDEsUEVNX0FTTjFfcmVhZF9iaW8KLVBFTSxmdW5jdGlvbiwxMDIsUEVNX0FTTjFfd3JpdGUKLVBFTSxmdW5jdGlvbiwxMDMsUEVNX0FTTjFfd3JpdGVfYmlvCi1QRU0sZnVuY3Rpb24sMTA0LFBFTV9YNTA5X0lORk9fcmVhZAotUEVNLGZ1bmN0aW9uLDEwNSxQRU1fWDUwOV9JTkZPX3JlYWRfYmlvCi1QRU0sZnVuY3Rpb24sMTA2LFBFTV9YNTA5X0lORk9fd3JpdGVfYmlvCi1QRU0sZnVuY3Rpb24sMTA3LFBFTV9kb19oZWFkZXIKLVBFTSxmdW5jdGlvbiwxMDgsUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8KLVBFTSxmdW5jdGlvbiwxMDksUEVNX3JlYWQKLVBFTSxmdW5jdGlvbiwxMTAsUEVNX3JlYWRfREhwYXJhbXMKLVBFTSxmdW5jdGlvbiwxMTEsUEVNX3JlYWRfUHJpdmF0ZUtleQotUEVNLGZ1bmN0aW9uLDExMixQRU1fcmVhZF9iaW8KLVBFTSxmdW5jdGlvbiwxMTMsUEVNX3JlYWRfYmlvX0RIcGFyYW1zCi1QRU0sZnVuY3Rpb24sMTE0LFBFTV9yZWFkX2Jpb19QYXJhbWV0ZXJzCi1QRU0sZnVuY3Rpb24sMTE1LFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5Ci1QRU0sZnVuY3Rpb24sMTE2LFBFTV93cml0ZQotUEVNLGZ1bmN0aW9uLDExNyxQRU1fd3JpdGVfUHJpdmF0ZUtleQotUEVNLGZ1bmN0aW9uLDExOCxQRU1fd3JpdGVfYmlvCi1QRU0sZnVuY3Rpb24sMTE5LGQyaV9QS0NTOFByaXZhdGVLZXlfYmlvCi1QRU0sZnVuY3Rpb24sMTIwLGQyaV9QS0NTOFByaXZhdGVLZXlfZnAKLVBFTSxmdW5jdGlvbiwxMjEsZG9fcGs4cGtleQotUEVNLGZ1bmN0aW9uLDEyMixkb19wazhwa2V5X2ZwCi1QRU0sZnVuY3Rpb24sMTIzLGxvYWRfaXYKLVBFTSxyZWFzb24sMTAwLEJBRF9CQVNFNjRfREVDT0RFCi1QRU0scmVhc29uLDEwMSxCQURfREVDUllQVAotUEVNLHJlYXNvbiwxMDIsQkFEX0VORF9MSU5FCi1QRU0scmVhc29uLDEwMyxCQURfSVZfQ0hBUlMKLVBFTSxyZWFzb24sMTA0LEJBRF9QQVNTV09SRF9SRUFECi1QRU0scmVhc29uLDEwNSxDSVBIRVJfSVNfTlVMTAotUEVNLHJlYXNvbiwxMDYsRVJST1JfQ09OVkVSVElOR19QUklWQVRFX0tFWQotUEVNLHJlYXNvbiwxMDcsTk9UX0RFS19JTkZPCi1QRU0scmVhc29uLDEwOCxOT1RfRU5DUllQVEVECi1QRU0scmVhc29uLDEwOSxOT1RfUFJPQ19UWVBFCi1QRU0scmVhc29uLDExMCxOT19TVEFSVF9MSU5FCi1QRU0scmVhc29uLDExMSxSRUFEX0tFWQotUEVNLHJlYXNvbiwxMTIsU0hPUlRfSEVBREVSCi1QRU0scmVhc29uLDExMyxVTlNVUFBPUlRFRF9DSVBIRVIKLVBFTSxyZWFzb24sMTE0LFVOU1VQUE9SVEVEX0VOQ1JZUFRJT04KK1BFTSwxMDAsQkFEX0JBU0U2NF9ERUNPREUKK1BFTSwxMDEsQkFEX0RFQ1JZUFQKK1BFTSwxMDIsQkFEX0VORF9MSU5FCitQRU0sMTAzLEJBRF9JVl9DSEFSUworUEVNLDEwNCxCQURfUEFTU1dPUkRfUkVBRAorUEVNLDEwNSxDSVBIRVJfSVNfTlVMTAorUEVNLDEwNixFUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZCitQRU0sMTA3LE5PVF9ERUtfSU5GTworUEVNLDEwOCxOT1RfRU5DUllQVEVECitQRU0sMTA5LE5PVF9QUk9DX1RZUEUKK1BFTSwxMTAsTk9fU1RBUlRfTElORQorUEVNLDExMSxSRUFEX0tFWQorUEVNLDExMixTSE9SVF9IRUFERVIKK1BFTSwxMTMsVU5TVVBQT1JURURfQ0lQSEVSCitQRU0sMTE0LFVOU1VQUE9SVEVEX0VOQ1JZUFRJT04KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL3BrY3M4LmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL3BrY3M4LmVycm9yZGF0YQppbmRleCA5MzZmM2M1Li4wZWI1MDgzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9wa2NzOC5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvcGtjczguZXJyb3JkYXRhCkBAIC0xLDQzICsxLDI1IEBACi1QS0NTOCxmdW5jdGlvbiwxMDAsRVZQX1BLQ1M4MlBLRVkKLVBLQ1M4LGZ1bmN0aW9uLDEwMSxFVlBfUEtFWTJQS0NTOAotUEtDUzgsZnVuY3Rpb24sMTAyLFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cwotUEtDUzgsZnVuY3Rpb24sMTAzLFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvCi1QS0NTOCxmdW5jdGlvbiwxMDQsUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm9zCi1QS0NTOCxmdW5jdGlvbiwxMDUsUEtDUzVfcGJlMl9zZXRfaXYKLVBLQ1M4LGZ1bmN0aW9uLDEwNixQS0NTNV9wYmVfc2V0Ci1QS0NTOCxmdW5jdGlvbiwxMDcsUEtDUzVfcGJlX3NldDBfYWxnb3IKLVBLQ1M4LGZ1bmN0aW9uLDEwOCxQS0NTNV9wYmtkZjJfc2V0Ci1QS0NTOCxmdW5jdGlvbiwxMDksUEtDUzhfZGVjcnlwdAotUEtDUzgsZnVuY3Rpb24sMTEwLFBLQ1M4X2VuY3J5cHQKLVBLQ1M4LGZ1bmN0aW9uLDExMSxQS0NTOF9lbmNyeXB0X3BiZQotUEtDUzgsZnVuY3Rpb24sMTEyLHBiZV9jaXBoZXJfaW5pdAotUEtDUzgsZnVuY3Rpb24sMTEzLHBiZV9jcnlwdAotUEtDUzgsZnVuY3Rpb24sMTE0LHBrY3MxMl9pdGVtX2RlY3J5cHRfZDJpCi1QS0NTOCxmdW5jdGlvbiwxMTUscGtjczEyX2l0ZW1faTJkX2VuY3J5cHQKLVBLQ1M4LGZ1bmN0aW9uLDExNixwa2NzMTJfa2V5X2dlbl9yYXcKLVBLQ1M4LGZ1bmN0aW9uLDExNyxwa2NzMTJfcGJlX2tleWl2Z2VuCi1QS0NTOCxyZWFzb24sMTAwLEJBRF9QS0NTMTJfREFUQQotUEtDUzgscmVhc29uLDEwMSxCQURfUEtDUzEyX1ZFUlNJT04KLVBLQ1M4LHJlYXNvbiwxMDIsQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUgotUEtDUzgscmVhc29uLDEwMyxDUllQVF9FUlJPUgotUEtDUzgscmVhc29uLDEwNCxERUNPREVfRVJST1IKLVBLQ1M4LHJlYXNvbiwxMDUsRU5DT0RFX0VSUk9SCi1QS0NTOCxyZWFzb24sMTA2LEVOQ1JZUFRfRVJST1IKLVBLQ1M4LHJlYXNvbiwxMDcsRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TCi1QS0NTOCxyZWFzb24sMTA4LElOQ09SUkVDVF9QQVNTV09SRAotUEtDUzgscmVhc29uLDEwOSxLRVlHRU5fRkFJTFVSRQotUEtDUzgscmVhc29uLDExMCxLRVlfR0VOX0VSUk9SCi1QS0NTOCxyZWFzb24sMTExLE1FVEhPRF9OT1RfU1VQUE9SVEVECi1QS0NTOCxyZWFzb24sMTEyLE1JU1NJTkdfTUFDCi1QS0NTOCxyZWFzb24sMTEzLE1VTFRJUExFX1BSSVZBVEVfS0VZU19JTl9QS0NTMTIKLVBLQ1M4LHJlYXNvbiwxMTQsUEtDUzEyX1BVQkxJQ19LRVlfSU5URUdSSVRZX05PVF9TVVBQT1JURUQKLVBLQ1M4LHJlYXNvbiwxMTUsUEtDUzEyX1RPT19ERUVQTFlfTkVTVEVECi1QS0NTOCxyZWFzb24sMTE2LFBSSVZBVEVfS0VZX0RFQ09ERV9FUlJPUgotUEtDUzgscmVhc29uLDExNyxQUklWQVRFX0tFWV9FTkNPREVfRVJST1IKLVBLQ1M4LHJlYXNvbiwxMTgsVE9PX0xPTkcKLVBLQ1M4LHJlYXNvbiwxMTksVU5LTk9XTl9BTEdPUklUSE0KLVBLQ1M4LHJlYXNvbiwxMjAsVU5LTk9XTl9DSVBIRVIKLVBLQ1M4LHJlYXNvbiwxMjEsVU5LTk9XTl9DSVBIRVJfQUxHT1JJVEhNCi1QS0NTOCxyZWFzb24sMTIyLFVOS05PV05fRElHRVNUCi1QS0NTOCxyZWFzb24sMTIzLFVOS05PV05fSEFTSAotUEtDUzgscmVhc29uLDEyNCxVTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0KK1BLQ1M4LDEwMCxCQURfUEtDUzEyX0RBVEEKK1BLQ1M4LDEwMSxCQURfUEtDUzEyX1ZFUlNJT04KK1BLQ1M4LDEwMixDSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSCitQS0NTOCwxMDMsQ1JZUFRfRVJST1IKK1BLQ1M4LDEwNCxERUNPREVfRVJST1IKK1BLQ1M4LDEwNSxFTkNPREVfRVJST1IKK1BLQ1M4LDEwNixFTkNSWVBUX0VSUk9SCitQS0NTOCwxMDcsRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TCitQS0NTOCwxMDgsSU5DT1JSRUNUX1BBU1NXT1JECitQS0NTOCwxMDksS0VZR0VOX0ZBSUxVUkUKK1BLQ1M4LDExMCxLRVlfR0VOX0VSUk9SCitQS0NTOCwxMTEsTUVUSE9EX05PVF9TVVBQT1JURUQKK1BLQ1M4LDExMixNSVNTSU5HX01BQworUEtDUzgsMTEzLE1VTFRJUExFX1BSSVZBVEVfS0VZU19JTl9QS0NTMTIKK1BLQ1M4LDExNCxQS0NTMTJfUFVCTElDX0tFWV9JTlRFR1JJVFlfTk9UX1NVUFBPUlRFRAorUEtDUzgsMTE1LFBLQ1MxMl9UT09fREVFUExZX05FU1RFRAorUEtDUzgsMTE2LFBSSVZBVEVfS0VZX0RFQ09ERV9FUlJPUgorUEtDUzgsMTE3LFBSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUgorUEtDUzgsMTE4LFRPT19MT05HCitQS0NTOCwxMTksVU5LTk9XTl9BTEdPUklUSE0KK1BLQ1M4LDEyMCxVTktOT1dOX0NJUEhFUgorUEtDUzgsMTIxLFVOS05PV05fQ0lQSEVSX0FMR09SSVRITQorUEtDUzgsMTIyLFVOS05PV05fRElHRVNUCitQS0NTOCwxMjMsVU5LTk9XTl9IQVNICitQS0NTOCwxMjQsVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci9yc2EuZXJyb3JkYXRhIGIvc3JjL2NyeXB0by9lcnIvcnNhLmVycm9yZGF0YQppbmRleCA2NGIzOTBkLi5jMTlmNzNjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2Vyci9yc2EuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL3JzYS5lcnJvcmRhdGEKQEAgLTEsNjkgKzEsNDYgQEAKLVJTQSxmdW5jdGlvbiwxMDAsQk5fQkxJTkRJTkdfY29udmVydF9leAotUlNBLGZ1bmN0aW9uLDEwMSxCTl9CTElORElOR19jcmVhdGVfcGFyYW0KLVJTQSxmdW5jdGlvbiwxMDIsQk5fQkxJTkRJTkdfaW52ZXJ0X2V4Ci1SU0EsZnVuY3Rpb24sMTAzLEJOX0JMSU5ESU5HX25ldwotUlNBLGZ1bmN0aW9uLDEwNCxCTl9CTElORElOR191cGRhdGUKLVJTQSxmdW5jdGlvbiwxMDUsUlNBX2NoZWNrX2tleQotUlNBLGZ1bmN0aW9uLDEwNixSU0FfbmV3X21ldGhvZAotUlNBLGZ1bmN0aW9uLDEwNyxSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUF9tZ2YxCi1SU0EsZnVuY3Rpb24sMTA4LFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMQotUlNBLGZ1bmN0aW9uLDEwOSxSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xCi1SU0EsZnVuY3Rpb24sMTEwLFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIKLVJTQSxmdW5jdGlvbiwxMTEsUlNBX3BhZGRpbmdfYWRkX25vbmUKLVJTQSxmdW5jdGlvbiwxMTIsUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxCi1SU0EsZnVuY3Rpb24sMTEzLFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMQotUlNBLGZ1bmN0aW9uLDExNCxSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIKLVJTQSxmdW5jdGlvbiwxMTUsUlNBX3BhZGRpbmdfY2hlY2tfbm9uZQotUlNBLGZ1bmN0aW9uLDExNixSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zCi1SU0EsZnVuY3Rpb24sMTE3LFJTQV9zaWduCi1SU0EsZnVuY3Rpb24sMTE4LFJTQV92ZXJpZnkKLVJTQSxmdW5jdGlvbiwxMTksUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMQotUlNBLGZ1bmN0aW9uLDEyMCxkZWNyeXB0Ci1SU0EsZnVuY3Rpb24sMTIxLGVuY3J5cHQKLVJTQSxmdW5jdGlvbiwxMjIsa2V5Z2VuCi1SU0EsZnVuY3Rpb24sMTIzLHBrY3MxX3ByZWZpeGVkX21zZwotUlNBLGZ1bmN0aW9uLDEyNCxwcml2YXRlX3RyYW5zZm9ybQotUlNBLGZ1bmN0aW9uLDEyNSxyc2Ffc2V0dXBfYmxpbmRpbmcKLVJTQSxmdW5jdGlvbiwxMjYsc2lnbl9yYXcKLVJTQSxmdW5jdGlvbiwxMjcsdmVyaWZ5X3JhdwotUlNBLHJlYXNvbiwxMDAsQkFEX0VfVkFMVUUKLVJTQSxyZWFzb24sMTAxLEJBRF9GSVhFRF9IRUFERVJfREVDUllQVAotUlNBLHJlYXNvbiwxMDIsQkFEX1BBRF9CWVRFX0NPVU5UCi1SU0EscmVhc29uLDEwMyxCQURfUlNBX1BBUkFNRVRFUlMKLVJTQSxyZWFzb24sMTA0LEJBRF9TSUdOQVRVUkUKLVJTQSxyZWFzb24sMTA1LEJMT0NLX1RZUEVfSVNfTk9UXzAxCi1SU0EscmVhc29uLDEwNixCTl9OT1RfSU5JVElBTElaRUQKLVJTQSxyZWFzb24sMTA3LENSVF9QQVJBTVNfQUxSRUFEWV9HSVZFTgotUlNBLHJlYXNvbiwxMDgsQ1JUX1ZBTFVFU19JTkNPUlJFQ1QKLVJTQSxyZWFzb24sMTA5LERBVEFfTEVOX05PVF9FUVVBTF9UT19NT0RfTEVOCi1SU0EscmVhc29uLDExMCxEQVRBX1RPT19MQVJHRQotUlNBLHJlYXNvbiwxMTEsREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFCi1SU0EscmVhc29uLDExMixEQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUwotUlNBLHJlYXNvbiwxMTMsREFUQV9UT09fU01BTEwKLVJTQSxyZWFzb24sMTE0LERBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRQotUlNBLHJlYXNvbiwxMTUsRElHRVNUX1RPT19CSUdfRk9SX1JTQV9LRVkKLVJTQSxyZWFzb24sMTE2LERfRV9OT1RfQ09OR1JVRU5UX1RPXzEKLVJTQSxyZWFzb24sMTE3LEVNUFRZX1BVQkxJQ19LRVkKLVJTQSxyZWFzb24sMTE4LEZJUlNUX09DVEVUX0lOVkFMSUQKLVJTQSxyZWFzb24sMTE5LElOQ09OU0lTVEVOVF9TRVRfT0ZfQ1JUX1ZBTFVFUwotUlNBLHJlYXNvbiwxMjAsSU5URVJOQUxfRVJST1IKLVJTQSxyZWFzb24sMTIxLElOVkFMSURfTUVTU0FHRV9MRU5HVEgKLVJTQSxyZWFzb24sMTIyLEtFWV9TSVpFX1RPT19TTUFMTAotUlNBLHJlYXNvbiwxMjMsTEFTVF9PQ1RFVF9JTlZBTElECi1SU0EscmVhc29uLDEyNCxNT0RVTFVTX1RPT19MQVJHRQotUlNBLHJlYXNvbiwxMjUsTk9fUFVCTElDX0VYUE9ORU5UCi1SU0EscmVhc29uLDEyNixOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HCi1SU0EscmVhc29uLDEyNyxOX05PVF9FUVVBTF9QX1EKLVJTQSxyZWFzb24sMTI4LE9BRVBfREVDT0RJTkdfRVJST1IKLVJTQSxyZWFzb24sMTI5LE9OTFlfT05FX09GX1BfUV9HSVZFTgotUlNBLHJlYXNvbiwxMzAsT1VUUFVUX0JVRkZFUl9UT09fU01BTEwKLVJTQSxyZWFzb24sMTMxLFBBRERJTkdfQ0hFQ0tfRkFJTEVECi1SU0EscmVhc29uLDEzMixQS0NTX0RFQ09ESU5HX0VSUk9SCi1SU0EscmVhc29uLDEzMyxTTEVOX0NIRUNLX0ZBSUxFRAotUlNBLHJlYXNvbiwxMzQsU0xFTl9SRUNPVkVSWV9GQUlMRUQKLVJTQSxyZWFzb24sMTM1LFRPT19MT05HCi1SU0EscmVhc29uLDEzNixUT09fTUFOWV9JVEVSQVRJT05TCi1SU0EscmVhc29uLDEzNyxVTktOT1dOX0FMR09SSVRITV9UWVBFCi1SU0EscmVhc29uLDEzOCxVTktOT1dOX1BBRERJTkdfVFlQRQotUlNBLHJlYXNvbiwxMzksVkFMVUVfTUlTU0lORwotUlNBLHJlYXNvbiwxNDAsV1JPTkdfU0lHTkFUVVJFX0xFTkdUSAorUlNBLDE0MyxCQURfRU5DT0RJTkcKK1JTQSwxMDAsQkFEX0VfVkFMVUUKK1JTQSwxMDEsQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUCitSU0EsMTAyLEJBRF9QQURfQllURV9DT1VOVAorUlNBLDEwMyxCQURfUlNBX1BBUkFNRVRFUlMKK1JTQSwxMDQsQkFEX1NJR05BVFVSRQorUlNBLDE0NSxCQURfVkVSU0lPTgorUlNBLDEwNSxCTE9DS19UWVBFX0lTX05PVF8wMQorUlNBLDEwNixCTl9OT1RfSU5JVElBTElaRUQKK1JTQSwxNDIsQ0FOTk9UX1JFQ09WRVJfTVVMVElfUFJJTUVfS0VZCitSU0EsMTA3LENSVF9QQVJBTVNfQUxSRUFEWV9HSVZFTgorUlNBLDEwOCxDUlRfVkFMVUVTX0lOQ09SUkVDVAorUlNBLDEwOSxEQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTgorUlNBLDExMCxEQVRBX1RPT19MQVJHRQorUlNBLDExMSxEQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUKK1JTQSwxMTIsREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMKK1JTQSwxMTMsREFUQV9UT09fU01BTEwKK1JTQSwxMTQsREFUQV9UT09fU01BTExfRk9SX0tFWV9TSVpFCitSU0EsMTE1LERJR0VTVF9UT09fQklHX0ZPUl9SU0FfS0VZCitSU0EsMTE2LERfRV9OT1RfQ09OR1JVRU5UX1RPXzEKK1JTQSwxMTcsRU1QVFlfUFVCTElDX0tFWQorUlNBLDE0NCxFTkNPREVfRVJST1IKK1JTQSwxMTgsRklSU1RfT0NURVRfSU5WQUxJRAorUlNBLDExOSxJTkNPTlNJU1RFTlRfU0VUX09GX0NSVF9WQUxVRVMKK1JTQSwxMjAsSU5URVJOQUxfRVJST1IKK1JTQSwxMjEsSU5WQUxJRF9NRVNTQUdFX0xFTkdUSAorUlNBLDEyMixLRVlfU0laRV9UT09fU01BTEwKK1JTQSwxMjMsTEFTVF9PQ1RFVF9JTlZBTElECitSU0EsMTI0LE1PRFVMVVNfVE9PX0xBUkdFCitSU0EsMTQxLE1VU1RfSEFWRV9BVF9MRUFTVF9UV09fUFJJTUVTCitSU0EsMTI1LE5PX1BVQkxJQ19FWFBPTkVOVAorUlNBLDEyNixOVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HCitSU0EsMTI3LE5fTk9UX0VRVUFMX1BfUQorUlNBLDEyOCxPQUVQX0RFQ09ESU5HX0VSUk9SCitSU0EsMTI5LE9OTFlfT05FX09GX1BfUV9HSVZFTgorUlNBLDEzMCxPVVRQVVRfQlVGRkVSX1RPT19TTUFMTAorUlNBLDEzMSxQQURESU5HX0NIRUNLX0ZBSUxFRAorUlNBLDEzMixQS0NTX0RFQ09ESU5HX0VSUk9SCitSU0EsMTMzLFNMRU5fQ0hFQ0tfRkFJTEVECitSU0EsMTM0LFNMRU5fUkVDT1ZFUllfRkFJTEVECitSU0EsMTM1LFRPT19MT05HCitSU0EsMTM2LFRPT19NQU5ZX0lURVJBVElPTlMKK1JTQSwxMzcsVU5LTk9XTl9BTEdPUklUSE1fVFlQRQorUlNBLDEzOCxVTktOT1dOX1BBRERJTkdfVFlQRQorUlNBLDEzOSxWQUxVRV9NSVNTSU5HCitSU0EsMTQwLFdST05HX1NJR05BVFVSRV9MRU5HVEgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL3NzbC5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci9zc2wuZXJyb3JkYXRhCmluZGV4IDk0NjRjM2QuLjBiMzBiMTMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL3NzbC5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIvc3NsLmVycm9yZGF0YQpAQCAtMSwzODcgKzEsMjE3IEBACi1TU0wsZnVuY3Rpb24sMjc2LFNTTF9BRUFEX0NUWF9uZXcKLVNTTCxmdW5jdGlvbiwyNzcsU1NMX0FFQURfQ1RYX29wZW4KLVNTTCxmdW5jdGlvbiwyNzgsU1NMX0FFQURfQ1RYX3NlYWwKLVNTTCxmdW5jdGlvbiwxMDAsU1NMX0NUWF9jaGVja19wcml2YXRlX2tleQotU1NMLGZ1bmN0aW9uLDEwMSxTU0xfQ1RYX25ldwotU1NMLGZ1bmN0aW9uLDI3MixTU0xfQ1RYX3NldDFfdGxzX2NoYW5uZWxfaWQKLVNTTCxmdW5jdGlvbiwxMDIsU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QKLVNTTCxmdW5jdGlvbiwxMDMsU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3RfdGxzMTEKLVNTTCxmdW5jdGlvbiwxMDQsU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0Ci1TU0wsZnVuY3Rpb24sMjY4LFNTTF9DVFhfc2V0X3RtcF9kaAotU1NMLGZ1bmN0aW9uLDI2OSxTU0xfQ1RYX3NldF90bXBfZWNkaAotU1NMLGZ1bmN0aW9uLDEwNSxTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5Ci1TU0wsZnVuY3Rpb24sMTA2LFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMQotU1NMLGZ1bmN0aW9uLDEwNyxTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUKLVNTTCxmdW5jdGlvbiwxMDgsU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleQotU1NMLGZ1bmN0aW9uLDEwOSxTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEKLVNTTCxmdW5jdGlvbiwxMTAsU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlCi1TU0wsZnVuY3Rpb24sMTExLFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlCi1TU0wsZnVuY3Rpb24sMTEyLFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEKLVNTTCxmdW5jdGlvbiwxMTMsU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZQotU1NMLGZ1bmN0aW9uLDExNCxTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlCi1TU0wsZnVuY3Rpb24sMTE1LFNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50Ci1TU0wsZnVuY3Rpb24sMjgwLFNTTF9TRVNTSU9OX2Zyb21fYnl0ZXMKLVNTTCxmdW5jdGlvbiwxMTYsU1NMX1NFU1NJT05fbmV3Ci1TU0wsZnVuY3Rpb24sMjgxLFNTTF9TRVNTSU9OX3BhcnNlCi1TU0wsZnVuY3Rpb24sMTUwLFNTTF9TRVNTSU9OX3BhcnNlX29jdGV0X3N0cmluZwotU1NMLGZ1bmN0aW9uLDE1MSxTU0xfU0VTU0lPTl9wYXJzZV9zdHJpbmcKLVNTTCxmdW5jdGlvbiwxMTcsU1NMX1NFU1NJT05fcHJpbnRfZnAKLVNTTCxmdW5jdGlvbiwxMTgsU1NMX1NFU1NJT05fc2V0MV9pZF9jb250ZXh0Ci1TU0wsZnVuY3Rpb24sMTE5LFNTTF9TRVNTSU9OX3RvX2J5dGVzX2Z1bGwKLVNTTCxmdW5jdGlvbiwxMjAsU1NMX2FjY2VwdAotU1NMLGZ1bmN0aW9uLDEyMSxTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrCi1TU0wsZnVuY3Rpb24sMTIyLFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrCi1TU0wsZnVuY3Rpb24sMTIzLFNTTF9jaGVja19wcml2YXRlX2tleQotU1NMLGZ1bmN0aW9uLDEyNCxTU0xfY2xlYXIKLVNTTCxmdW5jdGlvbiwxMjUsU1NMX2Nvbm5lY3QKLVNTTCxmdW5jdGlvbiwxMjYsU1NMX2RvX2hhbmRzaGFrZQotU1NMLGZ1bmN0aW9uLDEyNyxTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZQotU1NMLGZ1bmN0aW9uLDEyOCxTU0xfbmV3Ci1TU0wsZnVuY3Rpb24sMTI5LFNTTF9wZWVrCi1TU0wsZnVuY3Rpb24sMTMwLFNTTF9yZWFkCi1TU0wsZnVuY3Rpb24sMTMxLFNTTF9yZW5lZ290aWF0ZQotU1NMLGZ1bmN0aW9uLDI3MyxTU0xfc2V0MV90bHNfY2hhbm5lbF9pZAotU1NMLGZ1bmN0aW9uLDEzMixTU0xfc2V0X2NpcGhlcl9saXN0Ci1TU0wsZnVuY3Rpb24sMTMzLFNTTF9zZXRfZmQKLVNTTCxmdW5jdGlvbiwxMzQsU1NMX3NldF9yZmQKLVNTTCxmdW5jdGlvbiwxMzUsU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQKLVNTTCxmdW5jdGlvbiwyNzQsU1NMX3NldF90bHNleHRfaG9zdF9uYW1lCi1TU0wsZnVuY3Rpb24sMjcwLFNTTF9zZXRfdG1wX2RoCi1TU0wsZnVuY3Rpb24sMjcxLFNTTF9zZXRfdG1wX2VjZGgKLVNTTCxmdW5jdGlvbiwxMzYsU1NMX3NldF93ZmQKLVNTTCxmdW5jdGlvbiwxMzcsU1NMX3NodXRkb3duCi1TU0wsZnVuY3Rpb24sMTM4LFNTTF91c2VfUHJpdmF0ZUtleQotU1NMLGZ1bmN0aW9uLDEzOSxTU0xfdXNlX1ByaXZhdGVLZXlfQVNOMQotU1NMLGZ1bmN0aW9uLDE0MCxTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZQotU1NMLGZ1bmN0aW9uLDE0MSxTU0xfdXNlX1JTQVByaXZhdGVLZXkKLVNTTCxmdW5jdGlvbiwxNDIsU1NMX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEKLVNTTCxmdW5jdGlvbiwxNDMsU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUKLVNTTCxmdW5jdGlvbiwxNDQsU1NMX3VzZV9jZXJ0aWZpY2F0ZQotU1NMLGZ1bmN0aW9uLDE0NSxTU0xfdXNlX2NlcnRpZmljYXRlX0FTTjEKLVNTTCxmdW5jdGlvbiwxNDYsU1NMX3VzZV9jZXJ0aWZpY2F0ZV9maWxlCi1TU0wsZnVuY3Rpb24sMTQ3LFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQKLVNTTCxmdW5jdGlvbiwxNDgsU1NMX3dyaXRlCi1TU0wsZnVuY3Rpb24sMTQ5LGQyaV9TU0xfU0VTU0lPTgotU1NMLGZ1bmN0aW9uLDE1Mixkb19zc2wzX3dyaXRlCi1TU0wsZnVuY3Rpb24sMTUzLGR0bHMxX2FjY2VwdAotU1NMLGZ1bmN0aW9uLDE1NCxkdGxzMV9idWZmZXJfcmVjb3JkCi1TU0wsZnVuY3Rpb24sMTU1LGR0bHMxX2NoZWNrX3RpbWVvdXRfbnVtCi1TU0wsZnVuY3Rpb24sMTU2LGR0bHMxX2Nvbm5lY3QKLVNTTCxmdW5jdGlvbiwxNTcsZHRsczFfZG9fd3JpdGUKLVNTTCxmdW5jdGlvbiwyNjMsZHRsczFfZ2V0X2J1ZmZlcmVkX21lc3NhZ2UKLVNTTCxmdW5jdGlvbiwxNTgsZHRsczFfZ2V0X2hlbGxvX3ZlcmlmeQotU1NMLGZ1bmN0aW9uLDE1OSxkdGxzMV9nZXRfbWVzc2FnZQotU1NMLGZ1bmN0aW9uLDE2MCxkdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudAotU1NMLGZ1bmN0aW9uLDI2NSxkdGxzMV9obV9mcmFnbWVudF9uZXcKLVNTTCxmdW5jdGlvbiwxNjEsZHRsczFfcHJlcHJvY2Vzc19mcmFnbWVudAotU1NMLGZ1bmN0aW9uLDI2NCxkdGxzMV9wcm9jZXNzX2ZyYWdtZW50Ci1TU0wsZnVuY3Rpb24sMTYyLGR0bHMxX3Byb2Nlc3NfcmVjb3JkCi1TU0wsZnVuY3Rpb24sMTYzLGR0bHMxX3JlYWRfYnl0ZXMKLVNTTCxmdW5jdGlvbiwyNzksZHRsczFfc2VhbF9yZWNvcmQKLVNTTCxmdW5jdGlvbiwxNjQsZHRsczFfc2VuZF9oZWxsb192ZXJpZnlfcmVxdWVzdAotU1NMLGZ1bmN0aW9uLDE2NSxkdGxzMV93cml0ZV9hcHBfZGF0YQotU1NMLGZ1bmN0aW9uLDE2NixpMmRfU1NMX1NFU1NJT04KLVNTTCxmdW5jdGlvbiwxNjcsc3NsM19hY2NlcHQKLVNTTCxmdW5jdGlvbiwxNjksc3NsM19jZXJ0X3ZlcmlmeV9oYXNoCi1TU0wsZnVuY3Rpb24sMTcwLHNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtCi1TU0wsZnVuY3Rpb24sMjgyLHNzbDNfY2hlY2tfY2VydGlmaWNhdGVfZm9yX2NpcGhlcgotU1NMLGZ1bmN0aW9uLDE3MSxzc2wzX2Nvbm5lY3QKLVNTTCxmdW5jdGlvbiwxNzIsc3NsM19jdHJsCi1TU0wsZnVuY3Rpb24sMTczLHNzbDNfY3R4X2N0cmwKLVNTTCxmdW5jdGlvbiwxNzQsc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMKLVNTTCxmdW5jdGlvbiwxNzUsc3NsM19kb19jaGFuZ2VfY2lwaGVyX3NwZWMKLVNTTCxmdW5jdGlvbiwxNzYsc3NsM19leHBlY3RfY2hhbmdlX2NpcGhlcl9zcGVjCi1TU0wsZnVuY3Rpb24sMTc3LHNzbDNfZ2V0X2NlcnRfc3RhdHVzCi1TU0wsZnVuY3Rpb24sMTc4LHNzbDNfZ2V0X2NlcnRfdmVyaWZ5Ci1TU0wsZnVuY3Rpb24sMTc5LHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QKLVNTTCxmdW5jdGlvbiwxODAsc3NsM19nZXRfY2hhbm5lbF9pZAotU1NMLGZ1bmN0aW9uLDE4MSxzc2wzX2dldF9jbGllbnRfY2VydGlmaWNhdGUKLVNTTCxmdW5jdGlvbiwxODIsc3NsM19nZXRfY2xpZW50X2hlbGxvCi1TU0wsZnVuY3Rpb24sMTgzLHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UKLVNTTCxmdW5jdGlvbiwxODQsc3NsM19nZXRfZmluaXNoZWQKLVNTTCxmdW5jdGlvbiwxODUsc3NsM19nZXRfaW5pdGlhbF9ieXRlcwotU1NMLGZ1bmN0aW9uLDE4Nixzc2wzX2dldF9tZXNzYWdlCi1TU0wsZnVuY3Rpb24sMTg3LHNzbDNfZ2V0X25ld19zZXNzaW9uX3RpY2tldAotU1NMLGZ1bmN0aW9uLDE4OCxzc2wzX2dldF9uZXh0X3Byb3RvCi1TU0wsZnVuY3Rpb24sMTg5LHNzbDNfZ2V0X3JlY29yZAotU1NMLGZ1bmN0aW9uLDE5MCxzc2wzX2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUKLVNTTCxmdW5jdGlvbiwxOTEsc3NsM19nZXRfc2VydmVyX2RvbmUKLVNTTCxmdW5jdGlvbiwxOTIsc3NsM19nZXRfc2VydmVyX2hlbGxvCi1TU0wsZnVuY3Rpb24sMTkzLHNzbDNfZ2V0X3NlcnZlcl9rZXlfZXhjaGFuZ2UKLVNTTCxmdW5jdGlvbiwxOTQsc3NsM19nZXRfdjJfY2xpZW50X2hlbGxvCi1TU0wsZnVuY3Rpb24sMTk1LHNzbDNfaGFuZHNoYWtlX21hYwotU1NMLGZ1bmN0aW9uLDI3NSxzc2wzX291dHB1dF9jZXJ0X2NoYWluCi1TU0wsZnVuY3Rpb24sMTk2LHNzbDNfcHJmCi1TU0wsZnVuY3Rpb24sMTk3LHNzbDNfcmVhZF9ieXRlcwotU1NMLGZ1bmN0aW9uLDE5OCxzc2wzX3JlYWRfbgotU1NMLGZ1bmN0aW9uLDI2Nyxzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUKLVNTTCxmdW5jdGlvbiwyNjYsc3NsM19zZWFsX3JlY29yZAotU1NMLGZ1bmN0aW9uLDE5OSxzc2wzX3NlbmRfY2VydF92ZXJpZnkKLVNTTCxmdW5jdGlvbiwyMDAsc3NsM19zZW5kX2NlcnRpZmljYXRlX3JlcXVlc3QKLVNTTCxmdW5jdGlvbiwyMDEsc3NsM19zZW5kX2NoYW5uZWxfaWQKLVNTTCxmdW5jdGlvbiwyMDIsc3NsM19zZW5kX2NsaWVudF9jZXJ0aWZpY2F0ZQotU1NMLGZ1bmN0aW9uLDIwMyxzc2wzX3NlbmRfY2xpZW50X2hlbGxvCi1TU0wsZnVuY3Rpb24sMjA0LHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlCi1TU0wsZnVuY3Rpb24sMjA1LHNzbDNfc2VuZF9zZXJ2ZXJfY2VydGlmaWNhdGUKLVNTTCxmdW5jdGlvbiwyMDYsc3NsM19zZW5kX3NlcnZlcl9oZWxsbwotU1NMLGZ1bmN0aW9uLDIwNyxzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZQotU1NMLGZ1bmN0aW9uLDIwOCxzc2wzX3NldHVwX3JlYWRfYnVmZmVyCi1TU0wsZnVuY3Rpb24sMjA5LHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyCi1TU0wsZnVuY3Rpb24sMjEwLHNzbDNfd3JpdGVfYnl0ZXMKLVNTTCxmdW5jdGlvbiwyMTEsc3NsM193cml0ZV9wZW5kaW5nCi1TU0wsZnVuY3Rpb24sMjEyLHNzbF9hZGRfY2VydF9jaGFpbgotU1NMLGZ1bmN0aW9uLDIxMyxzc2xfYWRkX2NlcnRfdG9fYnVmCi1TU0wsZnVuY3Rpb24sMjE0LHNzbF9hZGRfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0Ci1TU0wsZnVuY3Rpb24sMjE1LHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0Ci1TU0wsZnVuY3Rpb24sMjE2LHNzbF9hZGRfY2xpZW50aGVsbG9fdXNlX3NydHBfZXh0Ci1TU0wsZnVuY3Rpb24sMjE3LHNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0Ci1TU0wsZnVuY3Rpb24sMjE4LHNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0Ci1TU0wsZnVuY3Rpb24sMjE5LHNzbF9hZGRfc2VydmVyaGVsbG9fdXNlX3NydHBfZXh0Ci1TU0wsZnVuY3Rpb24sMjIwLHNzbF9idWlsZF9jZXJ0X2NoYWluCi1TU0wsZnVuY3Rpb24sMjIxLHNzbF9ieXRlc190b19jaXBoZXJfbGlzdAotU1NMLGZ1bmN0aW9uLDIyMixzc2xfY2VydF9kdXAKLVNTTCxmdW5jdGlvbiwyMjMsc3NsX2NlcnRfaW5zdAotU1NMLGZ1bmN0aW9uLDIyNCxzc2xfY2VydF9uZXcKLVNTTCxmdW5jdGlvbiwyMjUsc3NsX2NoZWNrX3NlcnZlcmhlbGxvX3Rsc2V4dAotU1NMLGZ1bmN0aW9uLDIyNixzc2xfY2hlY2tfc3J2cl9lY2NfY2VydF9hbmRfYWxnCi1TU0wsZnVuY3Rpb24sMjI3LHNzbF9jaXBoZXJfcHJvY2Vzc19ydWxlc3RyCi1TU0wsZnVuY3Rpb24sMjI4LHNzbF9jaXBoZXJfc3RyZW5ndGhfc29ydAotU1NMLGZ1bmN0aW9uLDIyOSxzc2xfY3JlYXRlX2NpcGhlcl9saXN0Ci1TU0wsZnVuY3Rpb24sMjMwLHNzbF9jdHhfbG9nX21hc3Rlcl9zZWNyZXQKLVNTTCxmdW5jdGlvbiwyMzEsc3NsX2N0eF9sb2dfcnNhX2NsaWVudF9rZXlfZXhjaGFuZ2UKLVNTTCxmdW5jdGlvbiwyMzIsc3NsX2N0eF9tYWtlX3Byb2ZpbGVzCi1TU0wsZnVuY3Rpb24sMjMzLHNzbF9nZXRfbmV3X3Nlc3Npb24KLVNTTCxmdW5jdGlvbiwyMzQsc3NsX2dldF9wcmV2X3Nlc3Npb24KLVNTTCxmdW5jdGlvbiwyMzUsc3NsX2dldF9zZXJ2ZXJfY2VydF9pbmRleAotU1NMLGZ1bmN0aW9uLDIzNixzc2xfZ2V0X3NpZ25fcGtleQotU1NMLGZ1bmN0aW9uLDIzNyxzc2xfaW5pdF93YmlvX2J1ZmZlcgotU1NMLGZ1bmN0aW9uLDIzOCxzc2xfcGFyc2VfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0Ci1TU0wsZnVuY3Rpb24sMjM5LHNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQKLVNTTCxmdW5jdGlvbiwyNDAsc3NsX3BhcnNlX2NsaWVudGhlbGxvX3VzZV9zcnRwX2V4dAotU1NMLGZ1bmN0aW9uLDI0MSxzc2xfcGFyc2Vfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0Ci1TU0wsZnVuY3Rpb24sMjQyLHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb190bHNleHQKLVNTTCxmdW5jdGlvbiwyNDMsc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3VzZV9zcnRwX2V4dAotU1NMLGZ1bmN0aW9uLDI0NCxzc2xfc2Nhbl9jbGllbnRoZWxsb190bHNleHQKLVNTTCxmdW5jdGlvbiwyNDUsc3NsX3NjYW5fc2VydmVyaGVsbG9fdGxzZXh0Ci1TU0wsZnVuY3Rpb24sMjQ2LHNzbF9zZXNzX2NlcnRfbmV3Ci1TU0wsZnVuY3Rpb24sMjQ3LHNzbF9zZXRfY2VydAotU1NMLGZ1bmN0aW9uLDI0OCxzc2xfc2V0X3BrZXkKLVNTTCxmdW5jdGlvbiwyNTIsc3NsX3ZlcmlmeV9jZXJ0X2NoYWluCi1TU0wsZnVuY3Rpb24sMjUzLHRsczEyX2NoZWNrX3BlZXJfc2lnYWxnCi1TU0wsZnVuY3Rpb24sMjU0LHRsczFfYWVhZF9jdHhfaW5pdAotU1NMLGZ1bmN0aW9uLDI1NSx0bHMxX2NlcnRfdmVyaWZ5X21hYwotU1NMLGZ1bmN0aW9uLDI1Nix0bHMxX2NoYW5nZV9jaXBoZXJfc3RhdGUKLVNTTCxmdW5jdGlvbiwyNTcsdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlX2FlYWQKLVNTTCxmdW5jdGlvbiwyNTgsdGxzMV9jaGVja19kdXBsaWNhdGVfZXh0ZW5zaW9ucwotU1NMLGZ1bmN0aW9uLDI1OSx0bHMxX2VuYwotU1NMLGZ1bmN0aW9uLDI2MCx0bHMxX2V4cG9ydF9rZXlpbmdfbWF0ZXJpYWwKLVNTTCxmdW5jdGlvbiwyNjEsdGxzMV9wcmYKLVNTTCxmdW5jdGlvbiwyNjIsdGxzMV9zZXR1cF9rZXlfYmxvY2sKLVNTTCxyZWFzb24sMTAwLEFQUF9EQVRBX0lOX0hBTkRTSEFLRQotU1NMLHJlYXNvbiwxMDEsQVRURU1QVF9UT19SRVVTRV9TRVNTSU9OX0lOX0RJRkZFUkVOVF9DT05URVhUCi1TU0wscmVhc29uLDEwMixCQURfQUxFUlQKLVNTTCxyZWFzb24sMTAzLEJBRF9DSEFOR0VfQ0lQSEVSX1NQRUMKLVNTTCxyZWFzb24sMTA0LEJBRF9EQVRBX1JFVFVSTkVEX0JZX0NBTExCQUNLCi1TU0wscmVhc29uLDEwNSxCQURfREhfUF9MRU5HVEgKLVNTTCxyZWFzb24sMTA2LEJBRF9ESUdFU1RfTEVOR1RICi1TU0wscmVhc29uLDEwNyxCQURfRUNDX0NFUlQKLVNTTCxyZWFzb24sMTA4LEJBRF9FQ1BPSU5UCi1TU0wscmVhc29uLDEwOSxCQURfSEFORFNIQUtFX0xFTkdUSAotU1NMLHJlYXNvbiwxMTAsQkFEX0hBTkRTSEFLRV9SRUNPUkQKLVNTTCxyZWFzb24sMTExLEJBRF9IRUxMT19SRVFVRVNUCi1TU0wscmVhc29uLDExMixCQURfTEVOR1RICi1TU0wscmVhc29uLDExMyxCQURfUEFDS0VUX0xFTkdUSAotU1NMLHJlYXNvbiwxMTQsQkFEX1JTQV9FTkNSWVBUCi1TU0wscmVhc29uLDExNSxCQURfU0lHTkFUVVJFCi1TU0wscmVhc29uLDExNixCQURfU1JUUF9NS0lfVkFMVUUKLVNTTCxyZWFzb24sMTE3LEJBRF9TUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUCi1TU0wscmVhc29uLDExOCxCQURfU1NMX0ZJTEVUWVBFCi1TU0wscmVhc29uLDExOSxCQURfV1JJVEVfUkVUUlkKLVNTTCxyZWFzb24sMTIwLEJJT19OT1RfU0VUCi1TU0wscmVhc29uLDEyMSxCTl9MSUIKLVNTTCxyZWFzb24sMjcyLEJVRkZFUl9UT09fU01BTEwKLVNTTCxyZWFzb24sMTIyLENBTk5PVF9TRVJJQUxJWkVfUFVCTElDX0tFWQotU1NMLHJlYXNvbiwxMjMsQ0FfRE5fTEVOR1RIX01JU01BVENICi1TU0wscmVhc29uLDEyNCxDQV9ETl9UT09fTE9ORwotU1NMLHJlYXNvbiwxMjUsQ0NTX1JFQ0VJVkVEX0VBUkxZCi1TU0wscmVhc29uLDEyNixDRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVECi1TU0wscmVhc29uLDEyNyxDRVJUX0NCX0VSUk9SCi1TU0wscmVhc29uLDEyOCxDRVJUX0xFTkdUSF9NSVNNQVRDSAotU1NMLHJlYXNvbiwxMjksQ0hBTk5FTF9JRF9OT1RfUDI1NgotU1NMLHJlYXNvbiwxMzAsQ0hBTk5FTF9JRF9TSUdOQVRVUkVfSU5WQUxJRAotU1NMLHJlYXNvbiwxMzEsQ0lQSEVSX0NPREVfV1JPTkdfTEVOR1RICi1TU0wscmVhc29uLDEzMixDSVBIRVJfT1JfSEFTSF9VTkFWQUlMQUJMRQotU1NMLHJlYXNvbiwxMzMsQ0xJRU5USEVMTE9fUEFSU0VfRkFJTEVECi1TU0wscmVhc29uLDEzNCxDTElFTlRIRUxMT19UTFNFWFQKLVNTTCxyZWFzb24sMTM1LENPTk5FQ1RJT05fUkVKRUNURUQKLVNTTCxyZWFzb24sMTM2LENPTk5FQ1RJT05fVFlQRV9OT1RfU0VUCi1TU0wscmVhc29uLDEzNyxDT09LSUVfTUlTTUFUQ0gKLVNTTCxyZWFzb24sMTM4LEQySV9FQ0RTQV9TSUcKLVNTTCxyZWFzb24sMTM5LERBVEFfQkVUV0VFTl9DQ1NfQU5EX0ZJTklTSEVECi1TU0wscmVhc29uLDE0MCxEQVRBX0xFTkdUSF9UT09fTE9ORwotU1NMLHJlYXNvbiwxNDEsREVDT0RFX0VSUk9SCi1TU0wscmVhc29uLDE0MixERUNSWVBUSU9OX0ZBSUxFRAotU1NMLHJlYXNvbiwxNDMsREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUMKLVNTTCxyZWFzb24sMTQ0LERIX1BVQkxJQ19WQUxVRV9MRU5HVEhfSVNfV1JPTkcKLVNTTCxyZWFzb24sMTQ1LERJR0VTVF9DSEVDS19GQUlMRUQKLVNTTCxyZWFzb24sMTQ2LERUTFNfTUVTU0FHRV9UT09fQklHCi1TU0wscmVhc29uLDE0NyxFQ0NfQ0VSVF9OT1RfRk9SX1NJR05JTkcKLVNTTCxyZWFzb24sMTQ4LEVNUFRZX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1QKLVNTTCxyZWFzb24sMjc2LEVNU19TVEFURV9JTkNPTlNJU1RFTlQKLVNTTCxyZWFzb24sMTQ5LEVOQ1JZUFRFRF9MRU5HVEhfVE9PX0xPTkcKLVNTTCxyZWFzb24sMTUwLEVSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUCi1TU0wscmVhc29uLDE1MSxFVlBfRElHRVNUU0lHTkZJTkFMX0ZBSUxFRAotU1NMLHJlYXNvbiwxNTIsRVZQX0RJR0VTVFNJR05JTklUX0ZBSUxFRAotU1NMLHJlYXNvbiwxNTMsRVhDRVNTSVZFX01FU1NBR0VfU0laRQotU1NMLHJlYXNvbiwxNTQsRVhUUkFfREFUQV9JTl9NRVNTQUdFCi1TU0wscmVhc29uLDI3MSxGUkFHTUVOVF9NSVNNQVRDSAotU1NMLHJlYXNvbiwxNTUsR09UX0FfRklOX0JFRk9SRV9BX0NDUwotU1NMLHJlYXNvbiwxNTYsR09UX0NIQU5ORUxfSURfQkVGT1JFX0FfQ0NTCi1TU0wscmVhc29uLDE1NyxHT1RfTkVYVF9QUk9UT19CRUZPUkVfQV9DQ1MKLVNTTCxyZWFzb24sMTU4LEdPVF9ORVhUX1BST1RPX1dJVEhPVVRfRVhURU5TSU9OCi1TU0wscmVhc29uLDE1OSxIQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE8KLVNTTCxyZWFzb24sMTYwLEhBTkRTSEFLRV9SRUNPUkRfQkVGT1JFX0NDUwotU1NMLHJlYXNvbiwxNjEsSFRUUFNfUFJPWFlfUkVRVUVTVAotU1NMLHJlYXNvbiwxNjIsSFRUUF9SRVFVRVNUCi1TU0wscmVhc29uLDE2MyxJTkFQUFJPUFJJQVRFX0ZBTExCQUNLCi1TU0wscmVhc29uLDE2NCxJTlZBTElEX0NPTU1BTkQKLVNTTCxyZWFzb24sMTY1LElOVkFMSURfTUVTU0FHRQotU1NMLHJlYXNvbiwxNjYsSU5WQUxJRF9TU0xfU0VTU0lPTgotU1NMLHJlYXNvbiwxNjcsSU5WQUxJRF9USUNLRVRfS0VZU19MRU5HVEgKLVNTTCxyZWFzb24sMTY4LExFTkdUSF9NSVNNQVRDSAotU1NMLHJlYXNvbiwxNjksTElCUkFSWV9IQVNfTk9fQ0lQSEVSUwotU1NMLHJlYXNvbiwxNzAsTUlTU0lOR19ESF9LRVkKLVNTTCxyZWFzb24sMTcxLE1JU1NJTkdfRUNEU0FfU0lHTklOR19DRVJUCi1TU0wscmVhc29uLDE3MixNSVNTSU5HX1JTQV9DRVJUSUZJQ0FURQotU1NMLHJlYXNvbiwxNzMsTUlTU0lOR19SU0FfRU5DUllQVElOR19DRVJUCi1TU0wscmVhc29uLDE3NCxNSVNTSU5HX1JTQV9TSUdOSU5HX0NFUlQKLVNTTCxyZWFzb24sMTc1LE1JU1NJTkdfVE1QX0RIX0tFWQotU1NMLHJlYXNvbiwxNzYsTUlTU0lOR19UTVBfRUNESF9LRVkKLVNTTCxyZWFzb24sMTc3LE1JWEVEX1NQRUNJQUxfT1BFUkFUT1JfV0lUSF9HUk9VUFMKLVNTTCxyZWFzb24sMTc4LE1UVV9UT09fU01BTEwKLVNTTCxyZWFzb24sMTc5LE5FU1RFRF9HUk9VUAotU1NMLHJlYXNvbiwxODAsTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVECi1TU0wscmVhc29uLDE4MSxOT19DRVJUSUZJQ0FURV9BU1NJR05FRAotU1NMLHJlYXNvbiwxODIsTk9fQ0VSVElGSUNBVEVfU0VUCi1TU0wscmVhc29uLDE4MyxOT19DSVBIRVJTX0FWQUlMQUJMRQotU1NMLHJlYXNvbiwxODQsTk9fQ0lQSEVSU19QQVNTRUQKLVNTTCxyZWFzb24sMTg1LE5PX0NJUEhFUlNfU1BFQ0lGSUVECi1TU0wscmVhc29uLDE4NixOT19DSVBIRVJfTUFUQ0gKLVNTTCxyZWFzb24sMTg3LE5PX0NPTVBSRVNTSU9OX1NQRUNJRklFRAotU1NMLHJlYXNvbiwxODgsTk9fTUVUSE9EX1NQRUNJRklFRAotU1NMLHJlYXNvbiwxODksTk9fUDI1Nl9TVVBQT1JUCi1TU0wscmVhc29uLDE5MCxOT19QUklWQVRFX0tFWV9BU1NJR05FRAotU1NMLHJlYXNvbiwxOTEsTk9fUkVORUdPVElBVElPTgotU1NMLHJlYXNvbiwxOTIsTk9fUkVRVUlSRURfRElHRVNUCi1TU0wscmVhc29uLDE5MyxOT19TSEFSRURfQ0lQSEVSCi1TU0wscmVhc29uLDE5NCxOT19TSEFSRURfU0lHQVRVUkVfQUxHT1JJVEhNUwotU1NMLHJlYXNvbiwxOTUsTk9fU1JUUF9QUk9GSUxFUwotU1NMLHJlYXNvbiwxOTYsTlVMTF9TU0xfQ1RYCi1TU0wscmVhc29uLDE5NyxOVUxMX1NTTF9NRVRIT0RfUEFTU0VECi1TU0wscmVhc29uLDE5OCxPTERfU0VTU0lPTl9DSVBIRVJfTk9UX1JFVFVSTkVECi1TU0wscmVhc29uLDI3MyxPTERfU0VTU0lPTl9WRVJTSU9OX05PVF9SRVRVUk5FRAotU1NMLHJlYXNvbiwyNzQsT1VUUFVUX0FMSUFTRVNfSU5QVVQKLVNTTCxyZWFzb24sMTk5LFBBQ0tFVF9MRU5HVEhfVE9PX0xPTkcKLVNTTCxyZWFzb24sMjAwLFBBUlNFX1RMU0VYVAotU1NMLHJlYXNvbiwyMDEsUEFUSF9UT09fTE9ORwotU1NMLHJlYXNvbiwyMDIsUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFCi1TU0wscmVhc29uLDIwMyxQRUVSX0VSUk9SX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEUKLVNTTCxyZWFzb24sMjA0LFBST1RPQ09MX0lTX1NIVVRET1dOCi1TU0wscmVhc29uLDIwNSxQU0tfSURFTlRJVFlfTk9UX0ZPVU5ECi1TU0wscmVhc29uLDIwNixQU0tfTk9fQ0xJRU5UX0NCCi1TU0wscmVhc29uLDIwNyxQU0tfTk9fU0VSVkVSX0NCCi1TU0wscmVhc29uLDIwOCxSRUFEX0JJT19OT1RfU0VUCi1TU0wscmVhc29uLDIwOSxSRUFEX1RJTUVPVVRfRVhQSVJFRAotU1NMLHJlYXNvbiwyMTAsUkVDT1JEX0xFTkdUSF9NSVNNQVRDSAotU1NMLHJlYXNvbiwyMTEsUkVDT1JEX1RPT19MQVJHRQotU1NMLHJlYXNvbiwyMTIsUkVORUdPVElBVEVfRVhUX1RPT19MT05HCi1TU0wscmVhc29uLDIxMyxSRU5FR09USUFUSU9OX0VOQ09ESU5HX0VSUgotU1NMLHJlYXNvbiwyMTQsUkVORUdPVElBVElPTl9NSVNNQVRDSAotU1NMLHJlYXNvbiwyMTUsUkVRVUlSRURfQ0lQSEVSX01JU1NJTkcKLVNTTCxyZWFzb24sMjc1LFJFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OCi1TU0wscmVhc29uLDI3NyxSRVNVTUVEX05PTl9FTVNfU0VTU0lPTl9XSVRIX0VNU19FWFRFTlNJT04KLVNTTCxyZWFzb24sMjE2LFNDU1ZfUkVDRUlWRURfV0hFTl9SRU5FR09USUFUSU5HCi1TU0wscmVhc29uLDIxNyxTRVJWRVJIRUxMT19UTFNFWFQKLVNTTCxyZWFzb24sMjE4LFNFU1NJT05fSURfQ09OVEVYVF9VTklOSVRJQUxJWkVECi1TU0wscmVhc29uLDIxOSxTRVNTSU9OX01BWV9OT1RfQkVfQ1JFQVRFRAotU1NMLHJlYXNvbiwyMjAsU0lHTkFUVVJFX0FMR09SSVRITVNfRVJST1IKLVNTTCxyZWFzb24sMjIxLFNSVFBfQ09VTERfTk9UX0FMTE9DQVRFX1BST0ZJTEVTCi1TU0wscmVhc29uLDIyMixTUlRQX1BST1RFQ1RJT05fUFJPRklMRV9MSVNUX1RPT19MT05HCi1TU0wscmVhc29uLDIyMyxTUlRQX1VOS05PV05fUFJPVEVDVElPTl9QUk9GSUxFCi1TU0wscmVhc29uLDIyNCxTU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUKLVNTTCxyZWFzb24sMjI1LFNTTDNfRVhUX0lOVkFMSURfU0VSVkVSTkFNRV9UWVBFCi1TU0wscmVhc29uLDEwNDIsU1NMVjNfQUxFUlRfQkFEX0NFUlRJRklDQVRFCi1TU0wscmVhc29uLDEwMjAsU1NMVjNfQUxFUlRfQkFEX1JFQ09SRF9NQUMKLVNTTCxyZWFzb24sMTA0NSxTU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9FWFBJUkVECi1TU0wscmVhc29uLDEwNDQsU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfUkVWT0tFRAotU1NMLHJlYXNvbiwxMDQ2LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1VOS05PV04KLVNTTCxyZWFzb24sMTAwMCxTU0xWM19BTEVSVF9DTE9TRV9OT1RJRlkKLVNTTCxyZWFzb24sMTAzMCxTU0xWM19BTEVSVF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUKLVNTTCxyZWFzb24sMTA0MCxTU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRQotU1NMLHJlYXNvbiwxMDQ3LFNTTFYzX0FMRVJUX0lMTEVHQUxfUEFSQU1FVEVSCi1TU0wscmVhc29uLDEwNDEsU1NMVjNfQUxFUlRfTk9fQ0VSVElGSUNBVEUKLVNTTCxyZWFzb24sMTAxMCxTU0xWM19BTEVSVF9VTkVYUEVDVEVEX01FU1NBR0UKLVNTTCxyZWFzb24sMTA0MyxTU0xWM19BTEVSVF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURQotU1NMLHJlYXNvbiwyMjYsU1NMX0NUWF9IQVNfTk9fREVGQVVMVF9TU0xfVkVSU0lPTgotU1NMLHJlYXNvbiwyMjcsU1NMX0hBTkRTSEFLRV9GQUlMVVJFCi1TU0wscmVhc29uLDIyOCxTU0xfU0VTU0lPTl9JRF9DQUxMQkFDS19GQUlMRUQKLVNTTCxyZWFzb24sMjI5LFNTTF9TRVNTSU9OX0lEX0NPTkZMSUNUCi1TU0wscmVhc29uLDIzMCxTU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HCi1TU0wscmVhc29uLDIzMSxTU0xfU0VTU0lPTl9JRF9IQVNfQkFEX0xFTkdUSAotU1NMLHJlYXNvbiwxMDQ5LFRMU1YxX0FMRVJUX0FDQ0VTU19ERU5JRUQKLVNTTCxyZWFzb24sMTA1MCxUTFNWMV9BTEVSVF9ERUNPREVfRVJST1IKLVNTTCxyZWFzb24sMTAyMSxUTFNWMV9BTEVSVF9ERUNSWVBUSU9OX0ZBSUxFRAotU1NMLHJlYXNvbiwxMDUxLFRMU1YxX0FMRVJUX0RFQ1JZUFRfRVJST1IKLVNTTCxyZWFzb24sMTA2MCxUTFNWMV9BTEVSVF9FWFBPUlRfUkVTVFJJQ1RJT04KLVNTTCxyZWFzb24sMTA4NixUTFNWMV9BTEVSVF9JTkFQUFJPUFJJQVRFX0ZBTExCQUNLCi1TU0wscmVhc29uLDEwNzEsVExTVjFfQUxFUlRfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZCi1TU0wscmVhc29uLDEwODAsVExTVjFfQUxFUlRfSU5URVJOQUxfRVJST1IKLVNTTCxyZWFzb24sMTEwMCxUTFNWMV9BTEVSVF9OT19SRU5FR09USUFUSU9OCi1TU0wscmVhc29uLDEwNzAsVExTVjFfQUxFUlRfUFJPVE9DT0xfVkVSU0lPTgotU1NMLHJlYXNvbiwxMDIyLFRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVwotU1NMLHJlYXNvbiwxMDQ4LFRMU1YxX0FMRVJUX1VOS05PV05fQ0EKLVNTTCxyZWFzb24sMTA5MCxUTFNWMV9BTEVSVF9VU0VSX0NBTkNFTExFRAotU1NMLHJlYXNvbiwxMTE0LFRMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFCi1TU0wscmVhc29uLDExMTMsVExTVjFfQkFEX0NFUlRJRklDQVRFX1NUQVRVU19SRVNQT05TRQotU1NMLHJlYXNvbiwxMTExLFRMU1YxX0NFUlRJRklDQVRFX1VOT0JUQUlOQUJMRQotU1NMLHJlYXNvbiwxMTEyLFRMU1YxX1VOUkVDT0dOSVpFRF9OQU1FCi1TU0wscmVhc29uLDExMTAsVExTVjFfVU5TVVBQT1JURURfRVhURU5TSU9OCi1TU0wscmVhc29uLDIzMixUTFNfQ0xJRU5UX0NFUlRfUkVRX1dJVEhfQU5PTl9DSVBIRVIKLVNTTCxyZWFzb24sMjMzLFRMU19JTExFR0FMX0VYUE9SVEVSX0xBQkVMCi1TU0wscmVhc29uLDIzNCxUTFNfSU5WQUxJRF9FQ1BPSU5URk9STUFUX0xJU1QKLVNTTCxyZWFzb24sMjM1LFRMU19QRUVSX0RJRF9OT1RfUkVTUE9ORF9XSVRIX0NFUlRJRklDQVRFX0xJU1QKLVNTTCxyZWFzb24sMjM2LFRMU19SU0FfRU5DUllQVEVEX1ZBTFVFX0xFTkdUSF9JU19XUk9ORwotU1NMLHJlYXNvbiwyMzcsVE9PX01BTllfRU1QVFlfRlJBR01FTlRTCi1TU0wscmVhc29uLDIzOCxVTkFCTEVfVE9fRklORF9FQ0RIX1BBUkFNRVRFUlMKLVNTTCxyZWFzb24sMjM5LFVOQUJMRV9UT19GSU5EX1BVQkxJQ19LRVlfUEFSQU1FVEVSUwotU1NMLHJlYXNvbiwyNDAsVU5FWFBFQ1RFRF9HUk9VUF9DTE9TRQotU1NMLHJlYXNvbiwyNDEsVU5FWFBFQ1RFRF9NRVNTQUdFCi1TU0wscmVhc29uLDI0MixVTkVYUEVDVEVEX09QRVJBVE9SX0lOX0dST1VQCi1TU0wscmVhc29uLDI0MyxVTkVYUEVDVEVEX1JFQ09SRAotU1NMLHJlYXNvbiwyNDQsVU5JTklUSUFMSVpFRAotU1NMLHJlYXNvbiwyNDUsVU5LTk9XTl9BTEVSVF9UWVBFCi1TU0wscmVhc29uLDI0NixVTktOT1dOX0NFUlRJRklDQVRFX1RZUEUKLVNTTCxyZWFzb24sMjQ3LFVOS05PV05fQ0lQSEVSX1JFVFVSTkVECi1TU0wscmVhc29uLDI0OCxVTktOT1dOX0NJUEhFUl9UWVBFCi1TU0wscmVhc29uLDI0OSxVTktOT1dOX0RJR0VTVAotU1NMLHJlYXNvbiwyNTAsVU5LTk9XTl9LRVlfRVhDSEFOR0VfVFlQRQotU1NMLHJlYXNvbiwyNTEsVU5LTk9XTl9QUk9UT0NPTAotU1NMLHJlYXNvbiwyNTIsVU5LTk9XTl9TU0xfVkVSU0lPTgotU1NMLHJlYXNvbiwyNTMsVU5LTk9XTl9TVEFURQotU1NMLHJlYXNvbiwyNTQsVU5QUk9DRVNTRURfSEFORFNIQUtFX0RBVEEKLVNTTCxyZWFzb24sMjU1LFVOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTl9ESVNBQkxFRAotU1NMLHJlYXNvbiwyNTYsVU5TVVBQT1JURURfQ0lQSEVSCi1TU0wscmVhc29uLDI1NyxVTlNVUFBPUlRFRF9DT01QUkVTU0lPTl9BTEdPUklUSE0KLVNTTCxyZWFzb24sMjU4LFVOU1VQUE9SVEVEX0VMTElQVElDX0NVUlZFCi1TU0wscmVhc29uLDI1OSxVTlNVUFBPUlRFRF9QUk9UT0NPTAotU1NMLHJlYXNvbiwyNjAsVU5TVVBQT1JURURfU1NMX1ZFUlNJT04KLVNTTCxyZWFzb24sMjYxLFVTRV9TUlRQX05PVF9ORUdPVElBVEVECi1TU0wscmVhc29uLDI2MixXUk9OR19DRVJUSUZJQ0FURV9UWVBFCi1TU0wscmVhc29uLDI2MyxXUk9OR19DSVBIRVJfUkVUVVJORUQKLVNTTCxyZWFzb24sMjY0LFdST05HX0NVUlZFCi1TU0wscmVhc29uLDI2NSxXUk9OR19NRVNTQUdFX1RZUEUKLVNTTCxyZWFzb24sMjY2LFdST05HX1NJR05BVFVSRV9UWVBFCi1TU0wscmVhc29uLDI2NyxXUk9OR19TU0xfVkVSU0lPTgotU1NMLHJlYXNvbiwyNjgsV1JPTkdfVkVSU0lPTl9OVU1CRVIKLVNTTCxyZWFzb24sMjY5LFg1MDlfTElCCi1TU0wscmVhc29uLDI3MCxYNTA5X1ZFUklGSUNBVElPTl9TRVRVUF9QUk9CTEVNUworU1NMLDEwMCxBUFBfREFUQV9JTl9IQU5EU0hBS0UKK1NTTCwxMDEsQVRURU1QVF9UT19SRVVTRV9TRVNTSU9OX0lOX0RJRkZFUkVOVF9DT05URVhUCitTU0wsMTAyLEJBRF9BTEVSVAorU1NMLDEwMyxCQURfQ0hBTkdFX0NJUEhFUl9TUEVDCitTU0wsMTA0LEJBRF9EQVRBX1JFVFVSTkVEX0JZX0NBTExCQUNLCitTU0wsMTA1LEJBRF9ESF9QX0xFTkdUSAorU1NMLDEwNixCQURfRElHRVNUX0xFTkdUSAorU1NMLDEwNyxCQURfRUNDX0NFUlQKK1NTTCwxMDgsQkFEX0VDUE9JTlQKK1NTTCwxMDksQkFEX0hBTkRTSEFLRV9MRU5HVEgKK1NTTCwxMTAsQkFEX0hBTkRTSEFLRV9SRUNPUkQKK1NTTCwxMTEsQkFEX0hFTExPX1JFUVVFU1QKK1NTTCwxMTIsQkFEX0xFTkdUSAorU1NMLDExMyxCQURfUEFDS0VUX0xFTkdUSAorU1NMLDExNCxCQURfUlNBX0VOQ1JZUFQKK1NTTCwxMTUsQkFEX1NJR05BVFVSRQorU1NMLDExNixCQURfU1JUUF9NS0lfVkFMVUUKK1NTTCwxMTcsQkFEX1NSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1QKK1NTTCwxMTgsQkFEX1NTTF9GSUxFVFlQRQorU1NMLDExOSxCQURfV1JJVEVfUkVUUlkKK1NTTCwxMjAsQklPX05PVF9TRVQKK1NTTCwxMjEsQk5fTElCCitTU0wsMjcyLEJVRkZFUl9UT09fU01BTEwKK1NTTCwxMjIsQ0FOTk9UX1NFUklBTElaRV9QVUJMSUNfS0VZCitTU0wsMTIzLENBX0ROX0xFTkdUSF9NSVNNQVRDSAorU1NMLDEyNCxDQV9ETl9UT09fTE9ORworU1NMLDEyNSxDQ1NfUkVDRUlWRURfRUFSTFkKK1NTTCwxMjYsQ0VSVElGSUNBVEVfVkVSSUZZX0ZBSUxFRAorU1NMLDEyNyxDRVJUX0NCX0VSUk9SCitTU0wsMTI4LENFUlRfTEVOR1RIX01JU01BVENICitTU0wsMTI5LENIQU5ORUxfSURfTk9UX1AyNTYKK1NTTCwxMzAsQ0hBTk5FTF9JRF9TSUdOQVRVUkVfSU5WQUxJRAorU1NMLDEzMSxDSVBIRVJfQ09ERV9XUk9OR19MRU5HVEgKK1NTTCwxMzIsQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEUKK1NTTCwxMzMsQ0xJRU5USEVMTE9fUEFSU0VfRkFJTEVECitTU0wsMTM0LENMSUVOVEhFTExPX1RMU0VYVAorU1NMLDEzNSxDT05ORUNUSU9OX1JFSkVDVEVECitTU0wsMTM2LENPTk5FQ1RJT05fVFlQRV9OT1RfU0VUCitTU0wsMTM3LENPT0tJRV9NSVNNQVRDSAorU1NMLDI4NCxDVVNUT01fRVhURU5TSU9OX0NPTlRFTlRTX1RPT19MQVJHRQorU1NMLDI4NSxDVVNUT01fRVhURU5TSU9OX0VSUk9SCitTU0wsMTM4LEQySV9FQ0RTQV9TSUcKK1NTTCwxMzksREFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQKK1NTTCwxNDAsREFUQV9MRU5HVEhfVE9PX0xPTkcKK1NTTCwxNDEsREVDT0RFX0VSUk9SCitTU0wsMTQyLERFQ1JZUFRJT05fRkFJTEVECitTU0wsMTQzLERFQ1JZUFRJT05fRkFJTEVEX09SX0JBRF9SRUNPUkRfTUFDCitTU0wsMTQ0LERIX1BVQkxJQ19WQUxVRV9MRU5HVEhfSVNfV1JPTkcKK1NTTCwxNDUsRElHRVNUX0NIRUNLX0ZBSUxFRAorU1NMLDE0NixEVExTX01FU1NBR0VfVE9PX0JJRworU1NMLDE0NyxFQ0NfQ0VSVF9OT1RfRk9SX1NJR05JTkcKK1NTTCwxNDgsRU1QVFlfU1JUUF9QUk9URUNUSU9OX1BST0ZJTEVfTElTVAorU1NMLDI3NixFTVNfU1RBVEVfSU5DT05TSVNURU5UCitTU0wsMTQ5LEVOQ1JZUFRFRF9MRU5HVEhfVE9PX0xPTkcKK1NTTCwyODEsRVJST1JfQURESU5HX0VYVEVOU0lPTgorU1NMLDE1MCxFUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVAorU1NMLDI4MixFUlJPUl9QQVJTSU5HX0VYVEVOU0lPTgorU1NMLDE1MSxFVlBfRElHRVNUU0lHTkZJTkFMX0ZBSUxFRAorU1NMLDE1MixFVlBfRElHRVNUU0lHTklOSVRfRkFJTEVECitTU0wsMTUzLEVYQ0VTU0lWRV9NRVNTQUdFX1NJWkUKK1NTTCwxNTQsRVhUUkFfREFUQV9JTl9NRVNTQUdFCitTU0wsMjcxLEZSQUdNRU5UX01JU01BVENICitTU0wsMTU1LEdPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MKK1NTTCwxNTYsR09UX0NIQU5ORUxfSURfQkVGT1JFX0FfQ0NTCitTU0wsMTU3LEdPVF9ORVhUX1BST1RPX0JFRk9SRV9BX0NDUworU1NMLDE1OCxHT1RfTkVYVF9QUk9UT19XSVRIT1VUX0VYVEVOU0lPTgorU1NMLDE1OSxIQU5EU0hBS0VfRkFJTFVSRV9PTl9DTElFTlRfSEVMTE8KK1NTTCwxNjAsSEFORFNIQUtFX1JFQ09SRF9CRUZPUkVfQ0NTCitTU0wsMTYxLEhUVFBTX1BST1hZX1JFUVVFU1QKK1NTTCwxNjIsSFRUUF9SRVFVRVNUCitTU0wsMTYzLElOQVBQUk9QUklBVEVfRkFMTEJBQ0sKK1NTTCwxNjQsSU5WQUxJRF9DT01NQU5ECitTU0wsMTY1LElOVkFMSURfTUVTU0FHRQorU1NMLDE2NixJTlZBTElEX1NTTF9TRVNTSU9OCitTU0wsMTY3LElOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RICitTU0wsMTY4LExFTkdUSF9NSVNNQVRDSAorU1NMLDE2OSxMSUJSQVJZX0hBU19OT19DSVBIRVJTCitTU0wsMTcwLE1JU1NJTkdfREhfS0VZCitTU0wsMTcxLE1JU1NJTkdfRUNEU0FfU0lHTklOR19DRVJUCitTU0wsMjgzLE1JU1NJTkdfRVhURU5TSU9OCitTU0wsMTcyLE1JU1NJTkdfUlNBX0NFUlRJRklDQVRFCitTU0wsMTczLE1JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVAorU1NMLDE3NCxNSVNTSU5HX1JTQV9TSUdOSU5HX0NFUlQKK1NTTCwxNzUsTUlTU0lOR19UTVBfREhfS0VZCitTU0wsMTc2LE1JU1NJTkdfVE1QX0VDREhfS0VZCitTU0wsMTc3LE1JWEVEX1NQRUNJQUxfT1BFUkFUT1JfV0lUSF9HUk9VUFMKK1NTTCwxNzgsTVRVX1RPT19TTUFMTAorU1NMLDI4NixORUdPVElBVEVEX0JPVEhfTlBOX0FORF9BTFBOCitTU0wsMTc5LE5FU1RFRF9HUk9VUAorU1NMLDE4MCxOT19DRVJUSUZJQ0FURVNfUkVUVVJORUQKK1NTTCwxODEsTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQKK1NTTCwxODIsTk9fQ0VSVElGSUNBVEVfU0VUCitTU0wsMTgzLE5PX0NJUEhFUlNfQVZBSUxBQkxFCitTU0wsMTg0LE5PX0NJUEhFUlNfUEFTU0VECitTU0wsMTg1LE5PX0NJUEhFUlNfU1BFQ0lGSUVECitTU0wsMTg2LE5PX0NJUEhFUl9NQVRDSAorU1NMLDE4NyxOT19DT01QUkVTU0lPTl9TUEVDSUZJRUQKK1NTTCwxODgsTk9fTUVUSE9EX1NQRUNJRklFRAorU1NMLDE4OSxOT19QMjU2X1NVUFBPUlQKK1NTTCwxOTAsTk9fUFJJVkFURV9LRVlfQVNTSUdORUQKK1NTTCwxOTEsTk9fUkVORUdPVElBVElPTgorU1NMLDE5MixOT19SRVFVSVJFRF9ESUdFU1QKK1NTTCwxOTMsTk9fU0hBUkVEX0NJUEhFUgorU1NMLDE5NCxOT19TSEFSRURfU0lHQVRVUkVfQUxHT1JJVEhNUworU1NMLDE5NSxOT19TUlRQX1BST0ZJTEVTCitTU0wsMTk2LE5VTExfU1NMX0NUWAorU1NMLDE5NyxOVUxMX1NTTF9NRVRIT0RfUEFTU0VECitTU0wsMTk4LE9MRF9TRVNTSU9OX0NJUEhFUl9OT1RfUkVUVVJORUQKK1NTTCwyNzMsT0xEX1NFU1NJT05fVkVSU0lPTl9OT1RfUkVUVVJORUQKK1NTTCwyNzQsT1VUUFVUX0FMSUFTRVNfSU5QVVQKK1NTTCwxOTksUEFDS0VUX0xFTkdUSF9UT09fTE9ORworU1NMLDIwMCxQQVJTRV9UTFNFWFQKK1NTTCwyMDEsUEFUSF9UT09fTE9ORworU1NMLDIwMixQRUVSX0RJRF9OT1RfUkVUVVJOX0FfQ0VSVElGSUNBVEUKK1NTTCwyMDMsUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFCitTU0wsMjA0LFBST1RPQ09MX0lTX1NIVVRET1dOCitTU0wsMjA1LFBTS19JREVOVElUWV9OT1RfRk9VTkQKK1NTTCwyMDYsUFNLX05PX0NMSUVOVF9DQgorU1NMLDIwNyxQU0tfTk9fU0VSVkVSX0NCCitTU0wsMjA4LFJFQURfQklPX05PVF9TRVQKK1NTTCwyMDksUkVBRF9USU1FT1VUX0VYUElSRUQKK1NTTCwyMTAsUkVDT1JEX0xFTkdUSF9NSVNNQVRDSAorU1NMLDIxMSxSRUNPUkRfVE9PX0xBUkdFCitTU0wsMjEyLFJFTkVHT1RJQVRFX0VYVF9UT09fTE9ORworU1NMLDIxMyxSRU5FR09USUFUSU9OX0VOQ09ESU5HX0VSUgorU1NMLDIxNCxSRU5FR09USUFUSU9OX01JU01BVENICitTU0wsMjE1LFJFUVVJUkVEX0NJUEhFUl9NSVNTSU5HCitTU0wsMjc1LFJFU1VNRURfRU1TX1NFU1NJT05fV0lUSE9VVF9FTVNfRVhURU5TSU9OCitTU0wsMjc3LFJFU1VNRURfTk9OX0VNU19TRVNTSU9OX1dJVEhfRU1TX0VYVEVOU0lPTgorU1NMLDIxNixTQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORworU1NMLDIxNyxTRVJWRVJIRUxMT19UTFNFWFQKK1NTTCwyMTgsU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQKK1NTTCwyMTksU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQKK1NTTCwyMjAsU0lHTkFUVVJFX0FMR09SSVRITVNfRVJST1IKK1NTTCwyODAsU0lHTkFUVVJFX0FMR09SSVRITVNfRVhURU5TSU9OX1NFTlRfQllfU0VSVkVSCitTU0wsMjIxLFNSVFBfQ09VTERfTk9UX0FMTE9DQVRFX1BST0ZJTEVTCitTU0wsMjIyLFNSVFBfUFJPVEVDVElPTl9QUk9GSUxFX0xJU1RfVE9PX0xPTkcKK1NTTCwyMjMsU1JUUF9VTktOT1dOX1BST1RFQ1RJT05fUFJPRklMRQorU1NMLDIyNCxTU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUKK1NTTCwyMjUsU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FX1RZUEUKK1NTTCwxMDQyLFNTTFYzX0FMRVJUX0JBRF9DRVJUSUZJQ0FURQorU1NMLDEwMjAsU1NMVjNfQUxFUlRfQkFEX1JFQ09SRF9NQUMKK1NTTCwxMDQ1LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX0VYUElSRUQKK1NTTCwxMDQ0LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1JFVk9LRUQKK1NTTCwxMDQ2LFNTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1VOS05PV04KK1NTTCwxMDAwLFNTTFYzX0FMRVJUX0NMT1NFX05PVElGWQorU1NMLDEwMzAsU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFCitTU0wsMTA0MCxTU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRQorU1NMLDEwNDcsU1NMVjNfQUxFUlRfSUxMRUdBTF9QQVJBTUVURVIKK1NTTCwxMDQxLFNTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFCitTU0wsMTAxMCxTU0xWM19BTEVSVF9VTkVYUEVDVEVEX01FU1NBR0UKK1NTTCwxMDQzLFNTTFYzX0FMRVJUX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFCitTU0wsMjI2LFNTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04KK1NTTCwyMjcsU1NMX0hBTkRTSEFLRV9GQUlMVVJFCitTU0wsMjI4LFNTTF9TRVNTSU9OX0lEX0NBTExCQUNLX0ZBSUxFRAorU1NMLDIyOSxTU0xfU0VTU0lPTl9JRF9DT05GTElDVAorU1NMLDIzMCxTU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HCitTU0wsMjMxLFNTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RICitTU0wsMTA0OSxUTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVECitTU0wsMTA1MCxUTFNWMV9BTEVSVF9ERUNPREVfRVJST1IKK1NTTCwxMDIxLFRMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVECitTU0wsMTA1MSxUTFNWMV9BTEVSVF9ERUNSWVBUX0VSUk9SCitTU0wsMTA2MCxUTFNWMV9BTEVSVF9FWFBPUlRfUkVTVFJJQ1RJT04KK1NTTCwxMDg2LFRMU1YxX0FMRVJUX0lOQVBQUk9QUklBVEVfRkFMTEJBQ0sKK1NTTCwxMDcxLFRMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWQorU1NMLDEwODAsVExTVjFfQUxFUlRfSU5URVJOQUxfRVJST1IKK1NTTCwxMTAwLFRMU1YxX0FMRVJUX05PX1JFTkVHT1RJQVRJT04KK1NTTCwxMDcwLFRMU1YxX0FMRVJUX1BST1RPQ09MX1ZFUlNJT04KK1NTTCwxMDIyLFRMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVworU1NMLDEwNDgsVExTVjFfQUxFUlRfVU5LTk9XTl9DQQorU1NMLDEwOTAsVExTVjFfQUxFUlRfVVNFUl9DQU5DRUxMRUQKK1NTTCwxMTE0LFRMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFCitTU0wsMTExMyxUTFNWMV9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFCitTU0wsMTExMSxUTFNWMV9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUKK1NTTCwxMTEyLFRMU1YxX1VOUkVDT0dOSVpFRF9OQU1FCitTU0wsMTExMCxUTFNWMV9VTlNVUFBPUlRFRF9FWFRFTlNJT04KK1NTTCwyMzIsVExTX0NMSUVOVF9DRVJUX1JFUV9XSVRIX0FOT05fQ0lQSEVSCitTU0wsMjMzLFRMU19JTExFR0FMX0VYUE9SVEVSX0xBQkVMCitTU0wsMjM0LFRMU19JTlZBTElEX0VDUE9JTlRGT1JNQVRfTElTVAorU1NMLDIzNSxUTFNfUEVFUl9ESURfTk9UX1JFU1BPTkRfV0lUSF9DRVJUSUZJQ0FURV9MSVNUCitTU0wsMjM2LFRMU19SU0FfRU5DUllQVEVEX1ZBTFVFX0xFTkdUSF9JU19XUk9ORworU1NMLDIzNyxUT09fTUFOWV9FTVBUWV9GUkFHTUVOVFMKK1NTTCwyNzgsVE9PX01BTllfV0FSTklOR19BTEVSVFMKK1NTTCwyMzgsVU5BQkxFX1RPX0ZJTkRfRUNESF9QQVJBTUVURVJTCitTU0wsMjM5LFVOQUJMRV9UT19GSU5EX1BVQkxJQ19LRVlfUEFSQU1FVEVSUworU1NMLDI3OSxVTkVYUEVDVEVEX0VYVEVOU0lPTgorU1NMLDI0MCxVTkVYUEVDVEVEX0dST1VQX0NMT1NFCitTU0wsMjQxLFVORVhQRUNURURfTUVTU0FHRQorU1NMLDI0MixVTkVYUEVDVEVEX09QRVJBVE9SX0lOX0dST1VQCitTU0wsMjQzLFVORVhQRUNURURfUkVDT1JECitTU0wsMjQ0LFVOSU5JVElBTElaRUQKK1NTTCwyNDUsVU5LTk9XTl9BTEVSVF9UWVBFCitTU0wsMjQ2LFVOS05PV05fQ0VSVElGSUNBVEVfVFlQRQorU1NMLDI0NyxVTktOT1dOX0NJUEhFUl9SRVRVUk5FRAorU1NMLDI0OCxVTktOT1dOX0NJUEhFUl9UWVBFCitTU0wsMjQ5LFVOS05PV05fRElHRVNUCitTU0wsMjUwLFVOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUKK1NTTCwyNTEsVU5LTk9XTl9QUk9UT0NPTAorU1NMLDI1MixVTktOT1dOX1NTTF9WRVJTSU9OCitTU0wsMjUzLFVOS05PV05fU1RBVEUKK1NTTCwyNTQsVU5QUk9DRVNTRURfSEFORFNIQUtFX0RBVEEKK1NTTCwyNTUsVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVECitTU0wsMjU2LFVOU1VQUE9SVEVEX0NJUEhFUgorU1NMLDI1NyxVTlNVUFBPUlRFRF9DT01QUkVTU0lPTl9BTEdPUklUSE0KK1NTTCwyNTgsVU5TVVBQT1JURURfRUxMSVBUSUNfQ1VSVkUKK1NTTCwyNTksVU5TVVBQT1JURURfUFJPVE9DT0wKK1NTTCwyNjAsVU5TVVBQT1JURURfU1NMX1ZFUlNJT04KK1NTTCwyNjEsVVNFX1NSVFBfTk9UX05FR09USUFURUQKK1NTTCwyNjIsV1JPTkdfQ0VSVElGSUNBVEVfVFlQRQorU1NMLDI2MyxXUk9OR19DSVBIRVJfUkVUVVJORUQKK1NTTCwyNjQsV1JPTkdfQ1VSVkUKK1NTTCwyNjUsV1JPTkdfTUVTU0FHRV9UWVBFCitTU0wsMjY2LFdST05HX1NJR05BVFVSRV9UWVBFCitTU0wsMjY3LFdST05HX1NTTF9WRVJTSU9OCitTU0wsMjY4LFdST05HX1ZFUlNJT05fTlVNQkVSCitTU0wsMjY5LFg1MDlfTElCCitTU0wsMjcwLFg1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2Vyci94NTA5LmVycm9yZGF0YSBiL3NyYy9jcnlwdG8vZXJyL3g1MDkuZXJyb3JkYXRhCmluZGV4IDFiNTBlMzYuLmY0ODI4Y2UgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL3g1MDkuZXJyb3JkYXRhCisrKyBiL3NyYy9jcnlwdG8vZXJyL3g1MDkuZXJyb3JkYXRhCkBAIC0xLDk2ICsxLDM3IEBACi1YNTA5LGZ1bmN0aW9uLDEwMCxBU04xX2RpZ2VzdAotWDUwOSxmdW5jdGlvbiwxMDEsQVNOMV9pdGVtX3NpZ25fY3R4Ci1YNTA5LGZ1bmN0aW9uLDEwMixBU04xX2l0ZW1fdmVyaWZ5Ci1YNTA5LGZ1bmN0aW9uLDEwMyxORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUKLVg1MDksZnVuY3Rpb24sMTA0LE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZQotWDUwOSxmdW5jdGlvbiwxNTgsUEtDUzdfZ2V0X0NSTHMKLVg1MDksZnVuY3Rpb24sMTA1LFBLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMKLVg1MDksZnVuY3Rpb24sMTA2LFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9OSUQKLVg1MDksZnVuY3Rpb24sMTA3LFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkoKLVg1MDksZnVuY3Rpb24sMTA4LFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQKLVg1MDksZnVuY3Rpb24sMTA5LFg1MDlfQVRUUklCVVRFX2dldDBfZGF0YQotWDUwOSxmdW5jdGlvbiwxMTAsWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhCi1YNTA5LGZ1bmN0aW9uLDExMSxYNTA5X0NSTF9hZGQwX3Jldm9rZWQKLVg1MDksZnVuY3Rpb24sMTEyLFg1MDlfQ1JMX2RpZmYKLVg1MDksZnVuY3Rpb24sMTEzLFg1MDlfQ1JMX3ByaW50X2ZwCi1YNTA5LGZ1bmN0aW9uLDExNCxYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklECi1YNTA5LGZ1bmN0aW9uLDExNSxYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKCi1YNTA5LGZ1bmN0aW9uLDExNixYNTA5X0lORk9fbmV3Ci1YNTA5LGZ1bmN0aW9uLDExNyxYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X05JRAotWDUwOSxmdW5jdGlvbiwxMTgsWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV90eHQKLVg1MDksZnVuY3Rpb24sMTE5LFg1MDlfTkFNRV9FTlRSWV9zZXRfb2JqZWN0Ci1YNTA5LGZ1bmN0aW9uLDEyMCxYNTA5X05BTUVfYWRkX2VudHJ5Ci1YNTA5LGZ1bmN0aW9uLDEyMSxYNTA5X05BTUVfb25lbGluZQotWDUwOSxmdW5jdGlvbiwxMjIsWDUwOV9OQU1FX3ByaW50Ci1YNTA5LGZ1bmN0aW9uLDEyMyxYNTA5X1BLRVlfbmV3Ci1YNTA5LGZ1bmN0aW9uLDEyNCxYNTA5X1BVQktFWV9nZXQKLVg1MDksZnVuY3Rpb24sMTI1LFg1MDlfUFVCS0VZX3NldAotWDUwOSxmdW5jdGlvbiwxMjYsWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXkKLVg1MDksZnVuY3Rpb24sMTI3LFg1MDlfUkVRX3RvX1g1MDkKLVg1MDksZnVuY3Rpb24sMTI4LFg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyCi1YNTA5LGZ1bmN0aW9uLDEyOSxYNTA5X1NUT1JFX0NUWF9pbml0Ci1YNTA5LGZ1bmN0aW9uLDEzMCxYNTA5X1NUT1JFX0NUWF9uZXcKLVg1MDksZnVuY3Rpb24sMTMxLFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdAotWDUwOSxmdW5jdGlvbiwxMzIsWDUwOV9TVE9SRV9hZGRfY2VydAotWDUwOSxmdW5jdGlvbiwxMzMsWDUwOV9TVE9SRV9hZGRfY3JsCi1YNTA5LGZ1bmN0aW9uLDEzNCxYNTA5X1RSVVNUX2FkZAotWDUwOSxmdW5jdGlvbiwxMzUsWDUwOV9UUlVTVF9zZXQKLVg1MDksZnVuY3Rpb24sMTM2LFg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkKLVg1MDksZnVuY3Rpb24sMTM3LFg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzCi1YNTA5LGZ1bmN0aW9uLDEzOCxYNTA5X2xvYWRfY2VydF9jcmxfZmlsZQotWDUwOSxmdW5jdGlvbiwxMzksWDUwOV9sb2FkX2NlcnRfZmlsZQotWDUwOSxmdW5jdGlvbiwxNDAsWDUwOV9sb2FkX2NybF9maWxlCi1YNTA5LGZ1bmN0aW9uLDE0MSxYNTA5X3ByaW50X2V4X2ZwCi1YNTA5LGZ1bmN0aW9uLDE0MixYNTA5X3RvX1g1MDlfUkVRCi1YNTA5LGZ1bmN0aW9uLDE0MyxYNTA5X3ZlcmlmeV9jZXJ0Ci1YNTA5LGZ1bmN0aW9uLDE0NCxYNTA5YXRfYWRkMV9hdHRyCi1YNTA5LGZ1bmN0aW9uLDE0NSxYNTA5djNfYWRkX2V4dAotWDUwOSxmdW5jdGlvbiwxNDYsYWRkX2NlcnRfZGlyCi1YNTA5LGZ1bmN0aW9uLDE0NyxieV9maWxlX2N0cmwKLVg1MDksZnVuY3Rpb24sMTQ4LGNoZWNrX3BvbGljeQotWDUwOSxmdW5jdGlvbiwxNDksZGlyX2N0cmwKLVg1MDksZnVuY3Rpb24sMTUwLGdldF9jZXJ0X2J5X3N1YmplY3QKLVg1MDksZnVuY3Rpb24sMTUxLGkyZF9EU0FfUFVCS0VZCi1YNTA5LGZ1bmN0aW9uLDE1MixpMmRfRUNfUFVCS0VZCi1YNTA5LGZ1bmN0aW9uLDE1MyxpMmRfUlNBX1BVQktFWQotWDUwOSxmdW5jdGlvbiwxNTcscGtjczdfcGFyc2VfaGVhZGVyCi1YNTA5LGZ1bmN0aW9uLDE1NCx4NTA5X25hbWVfZW5jb2RlCi1YNTA5LGZ1bmN0aW9uLDE1NSx4NTA5X25hbWVfZXhfZDJpCi1YNTA5LGZ1bmN0aW9uLDE1Nix4NTA5X25hbWVfZXhfbmV3Ci1YNTA5LHJlYXNvbiwxMDAsQUtJRF9NSVNNQVRDSAotWDUwOSxyZWFzb24sMTAxLEJBRF9QS0NTN19WRVJTSU9OCi1YNTA5LHJlYXNvbiwxMDIsQkFEX1g1MDlfRklMRVRZUEUKLVg1MDkscmVhc29uLDEwMyxCQVNFNjRfREVDT0RFX0VSUk9SCi1YNTA5LHJlYXNvbiwxMDQsQ0FOVF9DSEVDS19ESF9LRVkKLVg1MDkscmVhc29uLDEwNSxDRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRQotWDUwOSxyZWFzb24sMTA2LENSTF9BTFJFQURZX0RFTFRBCi1YNTA5LHJlYXNvbiwxMDcsQ1JMX1ZFUklGWV9GQUlMVVJFCi1YNTA5LHJlYXNvbiwxMDgsSURQX01JU01BVENICi1YNTA5LHJlYXNvbiwxMDksSU5WQUxJRF9CSVRfU1RSSU5HX0JJVFNfTEVGVAotWDUwOSxyZWFzb24sMTEwLElOVkFMSURfRElSRUNUT1JZCi1YNTA5LHJlYXNvbiwxMTEsSU5WQUxJRF9GSUVMRF9OQU1FCi1YNTA5LHJlYXNvbiwxMTIsSU5WQUxJRF9UUlVTVAotWDUwOSxyZWFzb24sMTEzLElTU1VFUl9NSVNNQVRDSAotWDUwOSxyZWFzb24sMTE0LEtFWV9UWVBFX01JU01BVENICi1YNTA5LHJlYXNvbiwxMTUsS0VZX1ZBTFVFU19NSVNNQVRDSAotWDUwOSxyZWFzb24sMTE2LExPQURJTkdfQ0VSVF9ESVIKLVg1MDkscmVhc29uLDExNyxMT0FESU5HX0RFRkFVTFRTCi1YNTA5LHJlYXNvbiwxMTgsTUVUSE9EX05PVF9TVVBQT1JURUQKLVg1MDkscmVhc29uLDExOSxORVdFUl9DUkxfTk9UX05FV0VSCi1YNTA5LHJlYXNvbiwxMjAsTk9UX1BLQ1M3X1NJR05FRF9EQVRBCi1YNTA5LHJlYXNvbiwxMjEsTk9fQ0VSVElGSUNBVEVTX0lOQ0xVREVECi1YNTA5LHJlYXNvbiwxMjIsTk9fQ0VSVF9TRVRfRk9SX1VTX1RPX1ZFUklGWQotWDUwOSxyZWFzb24sMTM2LE5PX0NSTFNfSU5DTFVERUQKLVg1MDkscmVhc29uLDEyMyxOT19DUkxfTlVNQkVSCi1YNTA5LHJlYXNvbiwxMjQsUFVCTElDX0tFWV9ERUNPREVfRVJST1IKLVg1MDkscmVhc29uLDEyNSxQVUJMSUNfS0VZX0VOQ09ERV9FUlJPUgotWDUwOSxyZWFzb24sMTI2LFNIT1VMRF9SRVRSWQotWDUwOSxyZWFzb24sMTI3LFVOQUJMRV9UT19GSU5EX1BBUkFNRVRFUlNfSU5fQ0hBSU4KLVg1MDkscmVhc29uLDEyOCxVTkFCTEVfVE9fR0VUX0NFUlRTX1BVQkxJQ19LRVkKLVg1MDkscmVhc29uLDEyOSxVTktOT1dOX0tFWV9UWVBFCi1YNTA5LHJlYXNvbiwxMzAsVU5LTk9XTl9OSUQKLVg1MDkscmVhc29uLDEzMSxVTktOT1dOX1BVUlBPU0VfSUQKLVg1MDkscmVhc29uLDEzMixVTktOT1dOX1RSVVNUX0lECi1YNTA5LHJlYXNvbiwxMzMsVU5TVVBQT1JURURfQUxHT1JJVEhNCi1YNTA5LHJlYXNvbiwxMzQsV1JPTkdfTE9PS1VQX1RZUEUKLVg1MDkscmVhc29uLDEzNSxXUk9OR19UWVBFCitYNTA5LDEwMCxBS0lEX01JU01BVENICitYNTA5LDEwMSxCQURfUEtDUzdfVkVSU0lPTgorWDUwOSwxMDIsQkFEX1g1MDlfRklMRVRZUEUKK1g1MDksMTAzLEJBU0U2NF9ERUNPREVfRVJST1IKK1g1MDksMTA0LENBTlRfQ0hFQ0tfREhfS0VZCitYNTA5LDEwNSxDRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRQorWDUwOSwxMDYsQ1JMX0FMUkVBRFlfREVMVEEKK1g1MDksMTA3LENSTF9WRVJJRllfRkFJTFVSRQorWDUwOSwxMDgsSURQX01JU01BVENICitYNTA5LDEwOSxJTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUCitYNTA5LDExMCxJTlZBTElEX0RJUkVDVE9SWQorWDUwOSwxMTEsSU5WQUxJRF9GSUVMRF9OQU1FCitYNTA5LDExMixJTlZBTElEX1RSVVNUCitYNTA5LDExMyxJU1NVRVJfTUlTTUFUQ0gKK1g1MDksMTE0LEtFWV9UWVBFX01JU01BVENICitYNTA5LDExNSxLRVlfVkFMVUVTX01JU01BVENICitYNTA5LDExNixMT0FESU5HX0NFUlRfRElSCitYNTA5LDExNyxMT0FESU5HX0RFRkFVTFRTCitYNTA5LDExOCxNRVRIT0RfTk9UX1NVUFBPUlRFRAorWDUwOSwxMTksTkVXRVJfQ1JMX05PVF9ORVdFUgorWDUwOSwxMjAsTk9UX1BLQ1M3X1NJR05FRF9EQVRBCitYNTA5LDEyMSxOT19DRVJUSUZJQ0FURVNfSU5DTFVERUQKK1g1MDksMTIyLE5PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkKK1g1MDksMTM2LE5PX0NSTFNfSU5DTFVERUQKK1g1MDksMTIzLE5PX0NSTF9OVU1CRVIKK1g1MDksMTI0LFBVQkxJQ19LRVlfREVDT0RFX0VSUk9SCitYNTA5LDEyNSxQVUJMSUNfS0VZX0VOQ09ERV9FUlJPUgorWDUwOSwxMjYsU0hPVUxEX1JFVFJZCitYNTA5LDEyNyxVTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOCitYNTA5LDEyOCxVTkFCTEVfVE9fR0VUX0NFUlRTX1BVQkxJQ19LRVkKK1g1MDksMTI5LFVOS05PV05fS0VZX1RZUEUKK1g1MDksMTMwLFVOS05PV05fTklECitYNTA5LDEzMSxVTktOT1dOX1BVUlBPU0VfSUQKK1g1MDksMTMyLFVOS05PV05fVFJVU1RfSUQKK1g1MDksMTMzLFVOU1VQUE9SVEVEX0FMR09SSVRITQorWDUwOSwxMzQsV1JPTkdfTE9PS1VQX1RZUEUKK1g1MDksMTM1LFdST05HX1RZUEUKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXJyL3g1MDl2My5lcnJvcmRhdGEgYi9zcmMvY3J5cHRvL2Vyci94NTA5djMuZXJyb3JkYXRhCmluZGV4IDA1OWU2NzcuLmU1M2I3ODAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXJyL3g1MDl2My5lcnJvcmRhdGEKKysrIGIvc3JjL2NyeXB0by9lcnIveDUwOXYzLmVycm9yZGF0YQpAQCAtMSwxMjAgKzEsNjMgQEAKLVg1MDlWMyxmdW5jdGlvbiwxMDAsU1hORVRfYWRkX2lkX0lOVEVHRVIKLVg1MDlWMyxmdW5jdGlvbiwxMDEsU1hORVRfYWRkX2lkX2FzYwotWDUwOVYzLGZ1bmN0aW9uLDEwMixTWE5FVF9hZGRfaWRfdWxvbmcKLVg1MDlWMyxmdW5jdGlvbiwxMDMsU1hORVRfZ2V0X2lkX2FzYwotWDUwOVYzLGZ1bmN0aW9uLDEwNCxTWE5FVF9nZXRfaWRfdWxvbmcKLVg1MDlWMyxmdW5jdGlvbiwxMDUsWDUwOVYzX0VYVF9hZGQKLVg1MDlWMyxmdW5jdGlvbiwxMDYsWDUwOVYzX0VYVF9hZGRfYWxpYXMKLVg1MDlWMyxmdW5jdGlvbiwxMDcsWDUwOVYzX0VYVF9mcmVlCi1YNTA5VjMsZnVuY3Rpb24sMTA4LFg1MDlWM19FWFRfaTJkCi1YNTA5VjMsZnVuY3Rpb24sMTA5LFg1MDlWM19FWFRfbmNvbmYKLVg1MDlWMyxmdW5jdGlvbiwxMTAsWDUwOVYzX2FkZDFfaTJkCi1YNTA5VjMsZnVuY3Rpb24sMTExLFg1MDlWM19hZGRfdmFsdWUKLVg1MDlWMyxmdW5jdGlvbiwxMTIsWDUwOVYzX2dldF9zZWN0aW9uCi1YNTA5VjMsZnVuY3Rpb24sMTEzLFg1MDlWM19nZXRfc3RyaW5nCi1YNTA5VjMsZnVuY3Rpb24sMTE0LFg1MDlWM19nZXRfdmFsdWVfYm9vbAotWDUwOVYzLGZ1bmN0aW9uLDExNSxYNTA5VjNfcGFyc2VfbGlzdAotWDUwOVYzLGZ1bmN0aW9uLDExNixYNTA5X1BVUlBPU0VfYWRkCi1YNTA5VjMsZnVuY3Rpb24sMTE3LFg1MDlfUFVSUE9TRV9zZXQKLVg1MDlWMyxmdW5jdGlvbiwxMTgsYTJpX0dFTkVSQUxfTkFNRQotWDUwOVYzLGZ1bmN0aW9uLDExOSxjb3B5X2VtYWlsCi1YNTA5VjMsZnVuY3Rpb24sMTIwLGNvcHlfaXNzdWVyCi1YNTA5VjMsZnVuY3Rpb24sMTIxLGRvX2Rpcm5hbWUKLVg1MDlWMyxmdW5jdGlvbiwxMjIsZG9fZXh0X2kyZAotWDUwOVYzLGZ1bmN0aW9uLDEyMyxkb19leHRfbmNvbmYKLVg1MDlWMyxmdW5jdGlvbiwxMjQsZ25hbWVzX2Zyb21fc2VjdG5hbWUKLVg1MDlWMyxmdW5jdGlvbiwxMjUsaGV4X3RvX3N0cmluZwotWDUwOVYzLGZ1bmN0aW9uLDEyNixpMnNfQVNOMV9FTlVNRVJBVEVECi1YNTA5VjMsZnVuY3Rpb24sMTI3LGkyc19BU04xX0lBNVNUUklORwotWDUwOVYzLGZ1bmN0aW9uLDEyOCxpMnNfQVNOMV9JTlRFR0VSCi1YNTA5VjMsZnVuY3Rpb24sMTI5LGkydl9BVVRIT1JJVFlfSU5GT19BQ0NFU1MKLVg1MDlWMyxmdW5jdGlvbiwxMzAsbm90aWNlX3NlY3Rpb24KLVg1MDlWMyxmdW5jdGlvbiwxMzEsbnJlZl9ub3MKLVg1MDlWMyxmdW5jdGlvbiwxMzIscG9saWN5X3NlY3Rpb24KLVg1MDlWMyxmdW5jdGlvbiwxMzMscHJvY2Vzc19wY2lfdmFsdWUKLVg1MDlWMyxmdW5jdGlvbiwxMzQscjJpX2NlcnRwb2wKLVg1MDlWMyxmdW5jdGlvbiwxMzUscjJpX3BjaQotWDUwOVYzLGZ1bmN0aW9uLDEzNixzMmlfQVNOMV9JQTVTVFJJTkcKLVg1MDlWMyxmdW5jdGlvbiwxMzcsczJpX0FTTjFfSU5URUdFUgotWDUwOVYzLGZ1bmN0aW9uLDEzOCxzMmlfQVNOMV9PQ1RFVF9TVFJJTkcKLVg1MDlWMyxmdW5jdGlvbiwxMzksczJpX3NrZXlfaWQKLVg1MDlWMyxmdW5jdGlvbiwxNDAsc2V0X2Rpc3RfcG9pbnRfbmFtZQotWDUwOVYzLGZ1bmN0aW9uLDE0MSxzdHJpbmdfdG9faGV4Ci1YNTA5VjMsZnVuY3Rpb24sMTQyLHYyaV9BU04xX0JJVF9TVFJJTkcKLVg1MDlWMyxmdW5jdGlvbiwxNDMsdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUwotWDUwOVYzLGZ1bmN0aW9uLDE0NCx2MmlfQVVUSE9SSVRZX0tFWUlECi1YNTA5VjMsZnVuY3Rpb24sMTQ1LHYyaV9CQVNJQ19DT05TVFJBSU5UUwotWDUwOVYzLGZ1bmN0aW9uLDE0Nix2MmlfRVhURU5ERURfS0VZX1VTQUdFCi1YNTA5VjMsZnVuY3Rpb24sMTQ3LHYyaV9HRU5FUkFMX05BTUVTCi1YNTA5VjMsZnVuY3Rpb24sMTQ4LHYyaV9HRU5FUkFMX05BTUVfZXgKLVg1MDlWMyxmdW5jdGlvbiwxNDksdjJpX05BTUVfQ09OU1RSQUlOVFMKLVg1MDlWMyxmdW5jdGlvbiwxNTAsdjJpX1BPTElDWV9DT05TVFJBSU5UUwotWDUwOVYzLGZ1bmN0aW9uLDE1MSx2MmlfUE9MSUNZX01BUFBJTkdTCi1YNTA5VjMsZnVuY3Rpb24sMTUyLHYyaV9jcmxkCi1YNTA5VjMsZnVuY3Rpb24sMTUzLHYyaV9pZHAKLVg1MDlWMyxmdW5jdGlvbiwxNTQsdjJpX2lzc3Vlcl9hbHQKLVg1MDlWMyxmdW5jdGlvbiwxNTUsdjJpX3N1YmplY3RfYWx0Ci1YNTA5VjMsZnVuY3Rpb24sMTU2LHYzX2dlbmVyaWNfZXh0ZW5zaW9uCi1YNTA5VjMscmVhc29uLDEwMCxCQURfSVBfQUREUkVTUwotWDUwOVYzLHJlYXNvbiwxMDEsQkFEX09CSkVDVAotWDUwOVYzLHJlYXNvbiwxMDIsQk5fREVDMkJOX0VSUk9SCi1YNTA5VjMscmVhc29uLDEwMyxCTl9UT19BU04xX0lOVEVHRVJfRVJST1IKLVg1MDlWMyxyZWFzb24sMTA0LENBTk5PVF9GSU5EX0ZSRUVfRlVOQ1RJT04KLVg1MDlWMyxyZWFzb24sMTA1LERJUk5BTUVfRVJST1IKLVg1MDlWMyxyZWFzb24sMTA2LERJU1RQT0lOVF9BTFJFQURZX1NFVAotWDUwOVYzLHJlYXNvbiwxMDcsRFVQTElDQVRFX1pPTkVfSUQKLVg1MDlWMyxyZWFzb24sMTA4LEVSUk9SX0NPTlZFUlRJTkdfWk9ORQotWDUwOVYzLHJlYXNvbiwxMDksRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OCi1YNTA5VjMscmVhc29uLDExMCxFUlJPUl9JTl9FWFRFTlNJT04KLVg1MDlWMyxyZWFzb24sMTExLEVYUEVDVEVEX0FfU0VDVElPTl9OQU1FCi1YNTA5VjMscmVhc29uLDExMixFWFRFTlNJT05fRVhJU1RTCi1YNTA5VjMscmVhc29uLDExMyxFWFRFTlNJT05fTkFNRV9FUlJPUgotWDUwOVYzLHJlYXNvbiwxMTQsRVhURU5TSU9OX05PVF9GT1VORAotWDUwOVYzLHJlYXNvbiwxMTUsRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRAotWDUwOVYzLHJlYXNvbiwxMTYsRVhURU5TSU9OX1ZBTFVFX0VSUk9SCi1YNTA5VjMscmVhc29uLDExNyxJTExFR0FMX0VNUFRZX0VYVEVOU0lPTgotWDUwOVYzLHJlYXNvbiwxMTgsSUxMRUdBTF9IRVhfRElHSVQKLVg1MDlWMyxyZWFzb24sMTE5LElOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRwotWDUwOVYzLHJlYXNvbiwxMjAsSU5WQUxJRF9CT09MRUFOX1NUUklORwotWDUwOVYzLHJlYXNvbiwxMjEsSU5WQUxJRF9FWFRFTlNJT05fU1RSSU5HCi1YNTA5VjMscmVhc29uLDEyMixJTlZBTElEX01VTFRJUExFX1JETlMKLVg1MDlWMyxyZWFzb24sMTIzLElOVkFMSURfTkFNRQotWDUwOVYzLHJlYXNvbiwxMjQsSU5WQUxJRF9OVUxMX0FSR1VNRU5UCi1YNTA5VjMscmVhc29uLDEyNSxJTlZBTElEX05VTExfTkFNRQotWDUwOVYzLHJlYXNvbiwxMjYsSU5WQUxJRF9OVUxMX1ZBTFVFCi1YNTA5VjMscmVhc29uLDEyNyxJTlZBTElEX05VTUJFUgotWDUwOVYzLHJlYXNvbiwxMjgsSU5WQUxJRF9OVU1CRVJTCi1YNTA5VjMscmVhc29uLDEyOSxJTlZBTElEX09CSkVDVF9JREVOVElGSUVSCi1YNTA5VjMscmVhc29uLDEzMCxJTlZBTElEX09QVElPTgotWDUwOVYzLHJlYXNvbiwxMzEsSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUgotWDUwOVYzLHJlYXNvbiwxMzIsSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORwotWDUwOVYzLHJlYXNvbiwxMzMsSU5WQUxJRF9QVVJQT1NFCi1YNTA5VjMscmVhc29uLDEzNCxJTlZBTElEX1NFQ1RJT04KLVg1MDlWMyxyZWFzb24sMTM1LElOVkFMSURfU1lOVEFYCi1YNTA5VjMscmVhc29uLDEzNixJU1NVRVJfREVDT0RFX0VSUk9SCi1YNTA5VjMscmVhc29uLDEzNyxNSVNTSU5HX1ZBTFVFCi1YNTA5VjMscmVhc29uLDEzOCxORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUwotWDUwOVYzLHJlYXNvbiwxMzksTk9fQ09ORklHX0RBVEFCQVNFCi1YNTA5VjMscmVhc29uLDE0MCxOT19JU1NVRVJfQ0VSVElGSUNBVEUKLVg1MDlWMyxyZWFzb24sMTQxLE5PX0lTU1VFUl9ERVRBSUxTCi1YNTA5VjMscmVhc29uLDE0MixOT19QT0xJQ1lfSURFTlRJRklFUgotWDUwOVYzLHJlYXNvbiwxNDMsTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRAotWDUwOVYzLHJlYXNvbiwxNDQsTk9fUFVCTElDX0tFWQotWDUwOVYzLHJlYXNvbiwxNDUsTk9fU1VCSkVDVF9ERVRBSUxTCi1YNTA5VjMscmVhc29uLDE0NixPRERfTlVNQkVSX09GX0RJR0lUUwotWDUwOVYzLHJlYXNvbiwxNDcsT1BFUkFUSU9OX05PVF9ERUZJTkVECi1YNTA5VjMscmVhc29uLDE0OCxPVEhFUk5BTUVfRVJST1IKLVg1MDlWMyxyZWFzb24sMTQ5LFBPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQKLVg1MDlWMyxyZWFzb24sMTUwLFBPTElDWV9QQVRIX0xFTkdUSAotWDUwOVYzLHJlYXNvbiwxNTEsUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRAotWDUwOVYzLHJlYXNvbiwxNTIsUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZCi1YNTA5VjMscmVhc29uLDE1MyxTRUNUSU9OX05PVF9GT1VORAotWDUwOVYzLHJlYXNvbiwxNTQsVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUwotWDUwOVYzLHJlYXNvbiwxNTUsVU5BQkxFX1RPX0dFVF9JU1NVRVJfS0VZSUQKLVg1MDlWMyxyZWFzb24sMTU2LFVOS05PV05fQklUX1NUUklOR19BUkdVTUVOVAotWDUwOVYzLHJlYXNvbiwxNTcsVU5LTk9XTl9FWFRFTlNJT04KLVg1MDlWMyxyZWFzb24sMTU4LFVOS05PV05fRVhURU5TSU9OX05BTUUKLVg1MDlWMyxyZWFzb24sMTU5LFVOS05PV05fT1BUSU9OCi1YNTA5VjMscmVhc29uLDE2MCxVTlNVUFBPUlRFRF9PUFRJT04KLVg1MDlWMyxyZWFzb24sMTYxLFVOU1VQUE9SVEVEX1RZUEUKLVg1MDlWMyxyZWFzb24sMTYyLFVTRVJfVE9PX0xPTkcKK1g1MDlWMywxMDAsQkFEX0lQX0FERFJFU1MKK1g1MDlWMywxMDEsQkFEX09CSkVDVAorWDUwOVYzLDEwMixCTl9ERUMyQk5fRVJST1IKK1g1MDlWMywxMDMsQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SCitYNTA5VjMsMTA0LENBTk5PVF9GSU5EX0ZSRUVfRlVOQ1RJT04KK1g1MDlWMywxMDUsRElSTkFNRV9FUlJPUgorWDUwOVYzLDEwNixESVNUUE9JTlRfQUxSRUFEWV9TRVQKK1g1MDlWMywxMDcsRFVQTElDQVRFX1pPTkVfSUQKK1g1MDlWMywxMDgsRVJST1JfQ09OVkVSVElOR19aT05FCitYNTA5VjMsMTA5LEVSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTgorWDUwOVYzLDExMCxFUlJPUl9JTl9FWFRFTlNJT04KK1g1MDlWMywxMTEsRVhQRUNURURfQV9TRUNUSU9OX05BTUUKK1g1MDlWMywxMTIsRVhURU5TSU9OX0VYSVNUUworWDUwOVYzLDExMyxFWFRFTlNJT05fTkFNRV9FUlJPUgorWDUwOVYzLDExNCxFWFRFTlNJT05fTk9UX0ZPVU5ECitYNTA5VjMsMTE1LEVYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQKK1g1MDlWMywxMTYsRVhURU5TSU9OX1ZBTFVFX0VSUk9SCitYNTA5VjMsMTE3LElMTEVHQUxfRU1QVFlfRVhURU5TSU9OCitYNTA5VjMsMTE4LElMTEVHQUxfSEVYX0RJR0lUCitYNTA5VjMsMTE5LElOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRworWDUwOVYzLDEyMCxJTlZBTElEX0JPT0xFQU5fU1RSSU5HCitYNTA5VjMsMTIxLElOVkFMSURfRVhURU5TSU9OX1NUUklORworWDUwOVYzLDEyMixJTlZBTElEX01VTFRJUExFX1JETlMKK1g1MDlWMywxMjMsSU5WQUxJRF9OQU1FCitYNTA5VjMsMTI0LElOVkFMSURfTlVMTF9BUkdVTUVOVAorWDUwOVYzLDEyNSxJTlZBTElEX05VTExfTkFNRQorWDUwOVYzLDEyNixJTlZBTElEX05VTExfVkFMVUUKK1g1MDlWMywxMjcsSU5WQUxJRF9OVU1CRVIKK1g1MDlWMywxMjgsSU5WQUxJRF9OVU1CRVJTCitYNTA5VjMsMTI5LElOVkFMSURfT0JKRUNUX0lERU5USUZJRVIKK1g1MDlWMywxMzAsSU5WQUxJRF9PUFRJT04KK1g1MDlWMywxMzEsSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUgorWDUwOVYzLDEzMixJTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HCitYNTA5VjMsMTMzLElOVkFMSURfUFVSUE9TRQorWDUwOVYzLDEzNCxJTlZBTElEX1NFQ1RJT04KK1g1MDlWMywxMzUsSU5WQUxJRF9TWU5UQVgKK1g1MDlWMywxMzYsSVNTVUVSX0RFQ09ERV9FUlJPUgorWDUwOVYzLDEzNyxNSVNTSU5HX1ZBTFVFCitYNTA5VjMsMTM4LE5FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTCitYNTA5VjMsMTM5LE5PX0NPTkZJR19EQVRBQkFTRQorWDUwOVYzLDE0MCxOT19JU1NVRVJfQ0VSVElGSUNBVEUKK1g1MDlWMywxNDEsTk9fSVNTVUVSX0RFVEFJTFMKK1g1MDlWMywxNDIsTk9fUE9MSUNZX0lERU5USUZJRVIKK1g1MDlWMywxNDMsTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRAorWDUwOVYzLDE0NCxOT19QVUJMSUNfS0VZCitYNTA5VjMsMTQ1LE5PX1NVQkpFQ1RfREVUQUlMUworWDUwOVYzLDE0NixPRERfTlVNQkVSX09GX0RJR0lUUworWDUwOVYzLDE0NyxPUEVSQVRJT05fTk9UX0RFRklORUQKK1g1MDlWMywxNDgsT1RIRVJOQU1FX0VSUk9SCitYNTA5VjMsMTQ5LFBPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQKK1g1MDlWMywxNTAsUE9MSUNZX1BBVEhfTEVOR1RICitYNTA5VjMsMTUxLFBPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQKK1g1MDlWMywxNTIsUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZCitYNTA5VjMsMTUzLFNFQ1RJT05fTk9UX0ZPVU5ECitYNTA5VjMsMTU0LFVOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMKK1g1MDlWMywxNTUsVU5BQkxFX1RPX0dFVF9JU1NVRVJfS0VZSUQKK1g1MDlWMywxNTYsVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UCitYNTA5VjMsMTU3LFVOS05PV05fRVhURU5TSU9OCitYNTA5VjMsMTU4LFVOS05PV05fRVhURU5TSU9OX05BTUUKK1g1MDlWMywxNTksVU5LTk9XTl9PUFRJT04KK1g1MDlWMywxNjAsVU5TVVBQT1JURURfT1BUSU9OCitYNTA5VjMsMTYxLFVOU1VQUE9SVEVEX1RZUEUKK1g1MDlWMywxNjIsVVNFUl9UT09fTE9ORwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dAppbmRleCA1NzY5ZmE0Li41ZDJlOTE4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2V2cC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgZXZwCkBAIC02LDE1ICs2LDEzIEBACiAgIE9CSkVDVAogCiAgIGFsZ29yaXRobS5jCi0gIGFzbjEuYwogICBkaWdlc3RzaWduLmMKICAgZXZwLmMKKyAgZXZwX2FzbjEuYwogICBldnBfY3R4LmMKICAgcF9kc2FfYXNuMS5jCiAgIHBfZWMuYwogICBwX2VjX2FzbjEuYwotICBwX2htYWMuYwotICBwX2htYWNfYXNuMS5jCiAgIHBfcnNhLmMKICAgcF9yc2FfYXNuMS5jCiAgIHBia2RmLmMKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2FsZ29yaXRobS5jIGIvc3JjL2NyeXB0by9ldnAvYWxnb3JpdGhtLmMKaW5kZXggZWEyOGRmYS4uNjNiYzc3YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvYWxnb3JpdGhtLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvYWxnb3JpdGhtLmMKQEAgLTc0LDggKzc0LDcgQEAKICAgZGlnZXN0ID0gRVZQX01EX0NUWF9tZChjdHgpOwogICBwa2V5ID0gRVZQX1BLRVlfQ1RYX2dldDBfcGtleShjdHgtPnBjdHgpOwogICBpZiAoIWRpZ2VzdCB8fCAhcGtleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX0RpZ2VzdFNpZ25BbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfQ09OVEVYVF9OT1RfSU5JVElBTElTRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQ09OVEVYVF9OT1RfSU5JVElBTElTRUQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTk3LDggKzk2LDcgQEAKICAgICogdGhhdC4gKi8KICAgaWYgKCFPQkpfZmluZF9zaWdpZF9ieV9hbGdzKCZzaWduX25pZCwgRVZQX01EX3R5cGUoZGlnZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZXktPmFtZXRoLT5wa2V5X2lkKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX0RpZ2VzdFNpZ25BbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTIyLDI0ICsxMjAsMjEgQEAKICAgLyogQ29udmVydCBzaWduYXR1cmUgT0lEIGludG8gZGlnZXN0IGFuZCBwdWJsaWMga2V5IE9JRHMgKi8KICAgaWYgKCFPQkpfZmluZF9zaWdpZF9hbGdzKE9CSl9vYmoybmlkKGFsZ29yLT5hbGdvcml0aG0pLCAmZGlnZXN0X25pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwa2V5X25pZCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobSwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIC8qIENoZWNrIHB1YmxpYyBrZXkgT0lEIG1hdGNoZXMgcHVibGljIGtleSB0eXBlICovCiAgIGFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kKE5VTEwsIHBrZXlfbmlkKTsKICAgaWYgKGFtZXRoID09IE5VTEwgfHwgYW1ldGgtPnBrZXlfaWQgIT0gcGtleS0+YW1ldGgtPnBrZXlfaWQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9EaWdlc3RWZXJpZnlJbml0RnJvbUFsZ29yaXRobSwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIC8qIE5JRF91bmRlZiBzaWduYWxzIHRoYXQgdGhlcmUgYXJlIGN1c3RvbSBwYXJhbWV0ZXJzIHRvIHNldC4gKi8KICAgaWYgKGRpZ2VzdF9uaWQgPT0gTklEX3VuZGVmKSB7CiAgICAgaWYgKCFwa2V5LT5hbWV0aCB8fCAhcGtleS0+YW1ldGgtPmRpZ2VzdF92ZXJpZnlfaW5pdF9mcm9tX2FsZ29yaXRobSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfRGlnZXN0VmVyaWZ5SW5pdEZyb21BbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xNDksOCArMTQ0LDcgQEAKICAgLyogT3RoZXJ3aXNlLCBpbml0aWFsaXplIHdpdGggdGhlIGRpZ2VzdCBmcm9tIHRoZSBPSUQuICovCiAgIGRpZ2VzdCA9IEVWUF9nZXRfZGlnZXN0YnluaWQoZGlnZXN0X25pZCk7CiAgIGlmIChkaWdlc3QgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX0RpZ2VzdFZlcmlmeUluaXRGcm9tQWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNKTsKICAgICByZXR1cm4gMDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMgYi9zcmMvY3J5cHRvL2V2cC9kaWdlc3RzaWduLmMKaW5kZXggYzE2M2Q0MC4uY2NiNGRlNCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZGlnZXN0c2lnbi5jCisrKyBiL3NyYy9jcnlwdG8vZXZwL2RpZ2VzdHNpZ24uYwpAQCAtNjIsMTcgKzYyLDkgQEAKICNpbmNsdWRlICIuLi9kaWdlc3QvaW50ZXJuYWwuaCIKIAogCi0vKiBtZF9iZWdpbl9kaWdzZXQgaXMgYSBjYWxsYmFjayBmcm9tIHRoZSB8RVZQX01EX0NUWHwgY29kZSB0aGF0IGlzIGNhbGxlZCB3aGVuCi0gKiBhIG5ldyBkaWdlc3QgaXMgYmVndW4uICovCi1zdGF0aWMgaW50IG1kX2JlZ2luX2RpZ2VzdChFVlBfTURfQ1RYICpjdHgpIHsKLSAgcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eC0+cGN0eCwgLTEsIEVWUF9QS0VZX09QX1RZUEVfU0lHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklULCAwLCBjdHgpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV2cF9tZF9wY3R4X29wcyBtZF9wY3R4X29wcyA9IHsKICAgRVZQX1BLRVlfQ1RYX2ZyZWUsCiAgIEVWUF9QS0VZX0NUWF9kdXAsCi0gIG1kX2JlZ2luX2RpZ2VzdCwKIH07CiAKIHN0YXRpYyBpbnQgZG9fc2lndmVyX2luaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfUEtFWV9DVFggKipwY3R4LApAQCAtOTEsMjYgKzgzLDE2IEBACiAgIH0KIAogICBpZiAodHlwZSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19zaWd2ZXJfaW5pdCwgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGlzX3ZlcmlmeSkgewotICAgIGlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdCkgewotICAgICAgaWYgKCFjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdChjdHgtPnBjdHgsIGN0eCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBjdHgtPnBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1ZFUklGWUNUWDsKLSAgICB9IGVsc2UgaWYgKCFFVlBfUEtFWV92ZXJpZnlfaW5pdChjdHgtPnBjdHgpKSB7CisgICAgaWYgKCFFVlBfUEtFWV92ZXJpZnlfaW5pdChjdHgtPnBjdHgpKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgaWYgKGN0eC0+cGN0eC0+cG1ldGgtPnNpZ25jdHhfaW5pdCkgewotICAgICAgaWYgKCFjdHgtPnBjdHgtPnBtZXRoLT5zaWduY3R4X2luaXQoY3R4LT5wY3R4LCBjdHgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgY3R4LT5wY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9TSUdOQ1RYOwotICAgIH0gZWxzZSBpZiAoIUVWUF9QS0VZX3NpZ25faW5pdChjdHgtPnBjdHgpKSB7CisgICAgaWYgKCFFVlBfUEtFWV9zaWduX2luaXQoY3R4LT5wY3R4KSkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CkBAIC0xNDYsNTkgKzEyOCwzNyBAQAogCiBpbnQgRVZQX0RpZ2VzdFNpZ25GaW5hbChFVlBfTURfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dF9zaWcsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm91dF9zaWdfbGVuKSB7Ci0gIGludCByID0gMDsKLSAgY29uc3QgaW50IGhhc19zaWduY3R4ID0gY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eCAhPSBOVUxMOwotCiAgIGlmIChvdXRfc2lnKSB7CiAgICAgRVZQX01EX0NUWCB0bXBfY3R4OworICAgIGludCByZXQ7CiAgICAgdWludDhfdCBtZFtFVlBfTUFYX01EX1NJWkVdOwogICAgIHVuc2lnbmVkIGludCBtZGxlbjsKIAogICAgIEVWUF9NRF9DVFhfaW5pdCgmdG1wX2N0eCk7Ci0gICAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJnRtcF9jdHgsIGN0eCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoaGFzX3NpZ25jdHgpIHsKLSAgICAgIHIgPSB0bXBfY3R4LnBjdHgtPnBtZXRoLT5zaWduY3R4KHRtcF9jdHgucGN0eCwgb3V0X3NpZywgb3V0X3NpZ19sZW4sICZ0bXBfY3R4KTsKLSAgICB9IGVsc2UgewotICAgICAgciA9IEVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwgbWQsICZtZGxlbik7Ci0gICAgICBpZiAocikgewotICAgICAgICByID0gRVZQX1BLRVlfc2lnbihjdHgtPnBjdHgsIG91dF9zaWcsIG91dF9zaWdfbGVuLCBtZCwgbWRsZW4pOwotICAgICAgfQotICAgIH0KKyAgICByZXQgPSBFVlBfTURfQ1RYX2NvcHlfZXgoJnRtcF9jdHgsIGN0eCkgJiYKKyAgICAgICAgICBFVlBfRGlnZXN0RmluYWxfZXgoJnRtcF9jdHgsIG1kLCAmbWRsZW4pICYmCisgICAgICAgICAgRVZQX1BLRVlfc2lnbihjdHgtPnBjdHgsIG91dF9zaWcsIG91dF9zaWdfbGVuLCBtZCwgbWRsZW4pOwogICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmdG1wX2N0eCk7Ci0gICAgcmV0dXJuIHI7CisKKyAgICByZXR1cm4gcmV0OwogICB9IGVsc2UgewotICAgIGlmIChoYXNfc2lnbmN0eCkgewotICAgICAgcmV0dXJuIGN0eC0+cGN0eC0+cG1ldGgtPnNpZ25jdHgoY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgY3R4KTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZV90IHMgPSBFVlBfTURfc2l6ZShjdHgtPmRpZ2VzdCk7Ci0gICAgICByZXR1cm4gRVZQX1BLRVlfc2lnbihjdHgtPnBjdHgsIG91dF9zaWcsIG91dF9zaWdfbGVuLCBOVUxMLCBzKTsKLSAgICB9CisgICAgc2l6ZV90IHMgPSBFVlBfTURfc2l6ZShjdHgtPmRpZ2VzdCk7CisgICAgcmV0dXJuIEVWUF9QS0VZX3NpZ24oY3R4LT5wY3R4LCBvdXRfc2lnLCBvdXRfc2lnX2xlbiwgTlVMTCwgcyk7CiAgIH0KIH0KIAogaW50IEVWUF9EaWdlc3RWZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZ19sZW4pIHsKICAgRVZQX01EX0NUWCB0bXBfY3R4OworICBpbnQgcmV0OwogICB1aW50OF90IG1kW0VWUF9NQVhfTURfU0laRV07Ci0gIGludCByOwogICB1bnNpZ25lZCBpbnQgbWRsZW47CiAKICAgRVZQX01EX0NUWF9pbml0KCZ0bXBfY3R4KTsKLSAgaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJnRtcF9jdHgsIGN0eCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoY3R4LT5wY3R4LT5wbWV0aC0+dmVyaWZ5Y3R4KSB7Ci0gICAgciA9IHRtcF9jdHgucGN0eC0+cG1ldGgtPnZlcmlmeWN0eCh0bXBfY3R4LnBjdHgsIHNpZywgc2lnX2xlbiwgJnRtcF9jdHgpOwotICB9IGVsc2UgewotICAgIHIgPSBFVlBfRGlnZXN0RmluYWxfZXgoJnRtcF9jdHgsIG1kLCAmbWRsZW4pOwotICAgIGlmIChyKSB7Ci0gICAgICByID0gRVZQX1BLRVlfdmVyaWZ5KGN0eC0+cGN0eCwgc2lnLCBzaWdfbGVuLCBtZCwgbWRsZW4pOwotICAgIH0KLSAgfQotCisgIHJldCA9IEVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCwgY3R4KSAmJgorICAgICAgICBFVlBfRGlnZXN0RmluYWxfZXgoJnRtcF9jdHgsIG1kLCAmbWRsZW4pICYmCisgICAgICAgIEVWUF9QS0VZX3ZlcmlmeShjdHgtPnBjdHgsIHNpZywgc2lnX2xlbiwgbWQsIG1kbGVuKTsKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKIAotICByZXR1cm4gcjsKKyAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cC5jIGIvc3JjL2NyeXB0by9ldnAvZXZwLmMKaW5kZXggMGFkNWMyNy4uNTgyMjM3OSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZXZwLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvZXZwLmMKQEAgLTc1LDcgKzc1LDYgQEAKIAogZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGRzYV9hc24xX21ldGg7CiBleHRlcm4gY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgZWNfYXNuMV9tZXRoOwotZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoOwogZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIHJzYV9hc24xX21ldGg7CiAKIEVWUF9QS0VZICpFVlBfUEtFWV9uZXcodm9pZCkgewpAQCAtODMsNyArODIsNyBAQAogCiAgIHJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfUEtFWSkpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTE1OSwxMiArMTU4LDEyIEBACiAKIGludCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSkgewogICBpZiAodG8tPnR5cGUgIT0gZnJvbS0+dHlwZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzLCBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKEVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhmcm9tKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yMDcsOCArMjA2LDYgQEAKICAgICBjYXNlIEVWUF9QS0VZX1JTQToKICAgICBjYXNlIEVWUF9QS0VZX1JTQTI6CiAgICAgICByZXR1cm4gJnJzYV9hc24xX21ldGg7Ci0gICAgY2FzZSBFVlBfUEtFWV9ITUFDOgotICAgICAgcmV0dXJuICZobWFjX2FzbjFfbWV0aDsKICAgICBjYXNlIEVWUF9QS0VZX0VDOgogICAgICAgcmV0dXJuICZlY19hc24xX21ldGg7CiAgICAgY2FzZSBFVlBfUEtFWV9EU0E6CkBAIC0yMjYsMzIgKzIyMyw2IEBACiAgIHJldHVybiBtZXRoLT5wa2V5X2lkOwogfQogCi1FVlBfUEtFWSAqRVZQX1BLRVlfbmV3X21hY19rZXkoaW50IHR5cGUsIEVOR0lORSAqZSwgY29uc3QgdWludDhfdCAqbWFjX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFjX2tleV9sZW4pIHsKLSAgRVZQX1BLRVlfQ1RYICptYWNfY3R4ID0gTlVMTDsKLSAgRVZQX1BLRVkgKnJldCA9IE5VTEw7Ci0KLSAgbWFjX2N0eCA9IEVWUF9QS0VZX0NUWF9uZXdfaWQodHlwZSwgZSk7Ci0gIGlmICghbWFjX2N0eCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFFVlBfUEtFWV9rZXlnZW5faW5pdChtYWNfY3R4KSB8fAotICAgICAgIUVWUF9QS0VZX0NUWF9jdHJsKG1hY19jdHgsIC0xLCBFVlBfUEtFWV9PUF9LRVlHRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSwgbWFjX2tleV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiltYWNfa2V5KSB8fAotICAgICAgIUVWUF9QS0VZX2tleWdlbihtYWNfY3R4LCAmcmV0KSkgewotICAgIHJldCA9IE5VTEw7Ci0gICAgZ290byBtZXJyOwotICB9Ci0KLW1lcnI6Ci0gIGlmIChtYWNfY3R4KSB7Ci0gICAgRVZQX1BLRVlfQ1RYX2ZyZWUobWFjX2N0eCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQogaW50IEVWUF9QS0VZX3NldDFfUlNBKEVWUF9QS0VZICpwa2V5LCBSU0EgKmtleSkgewogICBpZiAoRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCBrZXkpKSB7CiAgICAgUlNBX3VwX3JlZihrZXkpOwpAQCAtMjY2LDcgKzIzNyw3IEBACiAKIFJTQSAqRVZQX1BLRVlfZ2V0MV9SU0EoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfUlNBKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX1JTQSwgRVZQX1JfRVhQRUNUSU5HX0FOX1JTQV9LRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfRVhQRUNUSU5HX0FOX1JTQV9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIFJTQV91cF9yZWYocGtleS0+cGtleS5yc2EpOwpAQCAtMjg3LDcgKzI1OCw3IEBACiAKIERTQSAqRVZQX1BLRVlfZ2V0MV9EU0EoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfRFNBKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX0RTQSwgRVZQX1JfRVhQRUNUSU5HX0FfRFNBX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBEU0FfdXBfcmVmKHBrZXktPnBrZXkuZHNhKTsKQEAgLTMwOCw3ICsyNzksNyBAQAogCiBFQ19LRVkgKkVWUF9QS0VZX2dldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5KSB7CiAgIGlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9nZXQxX0VDX0tFWSwgRVZQX1JfRVhQRUNUSU5HX0FOX0VDX0tFWV9LRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfRVhQRUNUSU5HX0FOX0VDX0tFWV9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIEVDX0tFWV91cF9yZWYocGtleS0+cGtleS5lYyk7CkBAIC0zMjksNyArMzAwLDcgQEAKIAogREggKkVWUF9QS0VZX2dldDFfREgoRVZQX1BLRVkgKnBrZXkpIHsKICAgaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfREgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2dldDFfREgsIEVWUF9SX0VYUEVDVElOR19BX0RIX0tFWSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9FWFBFQ1RJTkdfQV9ESF9LRVkpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIERIX3VwX3JlZihwa2V5LT5wa2V5LmRoKTsKQEAgLTM0OSwxMCArMzIwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7CiAgIGlmIChsZW4gPT0gMyAmJiBtZW1jbXAobmFtZSwgIlJTQSIsIDMpID09IDApIHsKICAgICByZXR1cm4gJnJzYV9hc24xX21ldGg7Ci0gIH0gZWxzZSBpZiAobGVuID09IDQgJiYgbWVtY21wKG5hbWUsICJITUFDIiwgNCkgPT0gMCkgewotICAgIHJldHVybiAmaG1hY19hc24xX21ldGg7CiAgIH0gaWYgKGxlbiA9PSAyICYmIG1lbWNtcChuYW1lLCAiRUMiLCAyKSA9PSAwKSB7CiAgICAgcmV0dXJuICZlY19hc24xX21ldGg7CisgIH0gZWxzZSBpZiAobGVuID09IDMgJiYgbWVtY21wKG5hbWUsICJEU0EiLCAzKSA9PSAwKSB7CisgICAgcmV0dXJuICZkc2FfYXNuMV9tZXRoOwogICB9CiAgIHJldHVybiBOVUxMOwogfQpAQCAtMzY2LDcgKzMzNyw3IEBACiAKICAgYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoTlVMTCwgdHlwZSk7CiAgIGlmIChhbWV0aCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zZXRfdHlwZSwgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CiAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiYWxnb3JpdGhtICVkICglcykiLCB0eXBlLCBPQkpfbmlkMnNuKHR5cGUpKTsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtNDM2LDEwICs0MDcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHZvaWQgKilvdXRfbWQpOwogfQogCi1FVlBfUEtFWSAqRVZQX1BLRVlfZHVwKEVWUF9QS0VZICpwa2V5KSB7Ci0gIHJldHVybiBFVlBfUEtFWV91cF9yZWYocGtleSk7Ci19Ci0KIHZvaWQgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXModm9pZCkge30KIAogdm9pZCBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycyh2b2lkKSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvYXNuMS5jIGIvc3JjL2NyeXB0by9ldnAvZXZwX2FzbjEuYwpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBzcmMvY3J5cHRvL2V2cC9hc24xLmMKcmVuYW1lIHRvIHNyYy9jcnlwdG8vZXZwL2V2cF9hc24xLmMKaW5kZXggM2RmOWY1Mi4uMzU2YzYyYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvYXNuMS5jCisrKyBiL3NyYy9jcnlwdG8vZXZwL2V2cF9hc24xLmMKQEAgLTcxLDcgKzcxLDcgQEAKICAgaWYgKG91dCA9PSBOVUxMIHx8ICpvdXQgPT0gTlVMTCkgewogICAgIHJldCA9IEVWUF9QS0VZX25ldygpOwogICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkMmlfUHJpdmF0ZUtleSwgRVJSX1JfRVZQX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VWUF9MSUIpOwogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICB9IGVsc2UgewpAQCAtNzksNyArNzksNyBAQAogICB9CiAKICAgaWYgKCFFVlBfUEtFWV9zZXRfdHlwZShyZXQsIHR5cGUpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkMmlfUHJpdmF0ZUtleSwgRVZQX1JfVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgIHJldCA9IEVWUF9QS0NTODJQS0VZKHA4KTsKICAgICAgIFBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZDJpX1ByaXZhdGVLZXksIEVSUl9SX0FTTjFfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfQVNOMV9MSUIpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9CkBAIC0xMzQsOCArMTM0LDcgQEAKIAogICAgIHNrX0FTTjFfVFlQRV9wb3BfZnJlZShpbmtleSwgQVNOMV9UWVBFX2ZyZWUpOwogICAgIGlmICghcDgpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZDJpX0F1dG9Qcml2YXRlS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXQgPSBFVlBfUEtDUzgyUEtFWShwOCk7CkBAIC0xNjEsNyArMTYwLDcgQEAKICAgICBjYXNlIEVWUF9QS0VZX0VDOgogICAgICAgcmV0dXJuIGkyb19FQ1B1YmxpY0tleShrZXktPnBrZXkuZWMsIG91dHApOwogICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGkyZF9QdWJsaWNLZXksIEVWUF9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CiAgICAgICByZXR1cm4gLTE7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL2V2cF9jdHguYyBiL3NyYy9jcnlwdG8vZXZwL2V2cF9jdHguYwppbmRleCA5ZjQyMjc0Li5hOGU3MWZlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9ldnBfY3R4LmMKKysrIGIvc3JjL2NyeXB0by9ldnAvZXZwX2N0eC5jCkBAIC02NywxMiArNjcsMTAgQEAKIAogCiBleHRlcm4gY29uc3QgRVZQX1BLRVlfTUVUSE9EIHJzYV9wa2V5X21ldGg7Ci1leHRlcm4gY29uc3QgRVZQX1BLRVlfTUVUSE9EIGhtYWNfcGtleV9tZXRoOwogZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX01FVEhPRCBlY19wa2V5X21ldGg7CiAKIHN0YXRpYyBjb25zdCBFVlBfUEtFWV9NRVRIT0QgKmNvbnN0IGV2cF9tZXRob2RzW10gPSB7CiAgICZyc2FfcGtleV9tZXRoLAotICAmaG1hY19wa2V5X21ldGgsCiAgICZlY19wa2V5X21ldGgsCiB9OwogCkBAIC0xMDIsNyArMTAwLDcgQEAKICAgcG1ldGggPSBldnBfcGtleV9tZXRoX2ZpbmQoaWQpOwogCiAgIGlmIChwbWV0aCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBldnBfcGtleV9jdHhfbmV3LCBFVlBfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKICAgICBjb25zdCBjaGFyICpuYW1lID0gT0JKX25pZDJzbihpZCk7CiAgICAgRVJSX2FkZF9lcnJvcl9kYXRhZigiYWxnb3JpdGhtICVkICglcykiLCBpZCwgbmFtZSk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTAsNyArMTA4LDcgQEAKIAogICByZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX1BLRVlfQ1RYKSk7CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBldnBfcGtleV9jdHhfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEVWUF9QS0VZX0NUWCkpOwpAQCAtMTkyLDcgKzE5MCw3IEBACiAKIGVycjoKICAgRVZQX1BLRVlfQ1RYX2ZyZWUocmN0eCk7Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfQ1RYX2R1cCwgRVJSX0xJQl9FVlApOworICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9MSUJfRVZQKTsKICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTIwNyw3ICsyMDUsNyBAQAogaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwgaW50IGNtZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgcDEsIHZvaWQgKnAyKSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5jdHJsKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0NPTU1BTkRfTk9UX1NVUFBPUlRFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGtleXR5cGUgIT0gLTEgJiYgY3R4LT5wbWV0aC0+cGtleV9pZCAhPSBrZXl0eXBlKSB7CkBAIC0yMTUsMTIgKzIxMywxMiBAQAogICB9CiAKICAgaWYgKGN0eC0+b3BlcmF0aW9uID09IEVWUF9QS0VZX09QX1VOREVGSU5FRCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfQ1RYX2N0cmwsIEVWUF9SX05PX09QRVJBVElPTl9TRVQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTk9fT1BFUkFUSU9OX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAob3B0eXBlICE9IC0xICYmICEoY3R4LT5vcGVyYXRpb24gJiBvcHR5cGUpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9DVFhfY3RybCwgRVZQX1JfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9PUEVSQVRJT04pOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIyOSw4ICsyMjcsNyBAQAogCiBpbnQgRVZQX1BLRVlfc2lnbl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5zaWduKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zaWduX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNTAsMTIgKzI0NywxMSBAQAogaW50IEVWUF9QS0VZX3NpZ24oRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKnNpZywgc2l6ZV90ICpzaWdfbGVuLAogICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5zaWduKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9zaWduLAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX1NJR04pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3NpZ24sIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBjdHgtPnBtZXRoLT5zaWduKGN0eCwgc2lnLCBzaWdfbGVuLCBkYXRhLCBkYXRhX2xlbik7CkBAIC0yNjMsOCArMjU5LDcgQEAKIAogaW50IEVWUF9QS0VZX3ZlcmlmeV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT52ZXJpZnkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3ZlcmlmeV9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9WRVJJRlk7CkBAIC0yODIsMTIgKzI3NywxMSBAQAogaW50IEVWUF9QS0VZX3ZlcmlmeShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdWludDhfdCAqc2lnLCBzaXplX3Qgc2lnX2xlbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuKSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT52ZXJpZnkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3ZlcmlmeSwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9WRVJJRlkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX3ZlcmlmeSwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGN0eC0+cG1ldGgtPnZlcmlmeShjdHgsIHNpZywgc2lnX2xlbiwgZGF0YSwgZGF0YV9sZW4pOwpAQCAtMjk1LDggKzI4OSw3IEBACiAKIGludCBFVlBfUEtFWV9lbmNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmVuY3J5cHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2VuY3J5cHRfaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfRU5DUllQVDsKQEAgLTMxMywxMiArMzA2LDExIEBACiBpbnQgRVZQX1BLRVlfZW5jcnlwdChFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dGxlbiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5sZW4pIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmVuY3J5cHQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2VuY3J5cHQsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfRU5DUllQVCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZW5jcnlwdCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcmV0dXJuIGN0eC0+cG1ldGgtPmVuY3J5cHQoY3R4LCBvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKQEAgLTMyNiw4ICszMTgsNyBAQAogCiBpbnQgRVZQX1BLRVlfZGVjcnlwdF9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZWNyeXB0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZWNyeXB0X2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0RFQ1JZUFQ7CkBAIC0zNDQsMTIgKzMzNSwxMSBAQAogaW50IEVWUF9QS0VZX2RlY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRsZW4sCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGlubGVuKSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZWNyeXB0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZWNyeXB0LAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFQ1JZUFQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2RlY3J5cHQsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBjdHgtPnBtZXRoLT5kZWNyeXB0KGN0eCwgb3V0LCBvdXRsZW4sIGluLCBpbmxlbik7CkBAIC0zNTcsOCArMzQ3LDcgQEAKIAogaW50IEVWUF9QS0VZX2Rlcml2ZV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7CiAgIGlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZXJpdmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9pbml0LAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9ERVJJVkU7CkBAIC0zNzcsMTUgKzM2NiwxMyBAQAogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fAogICAgICAgIShjdHgtPnBtZXRoLT5kZXJpdmUgfHwgY3R4LT5wbWV0aC0+ZW5jcnlwdCB8fCBjdHgtPnBtZXRoLT5kZWNyeXB0KSB8fAogICAgICAgIWN0eC0+cG1ldGgtPmN0cmwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIGlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9ERVJJVkUgJiYKICAgICAgIGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0VOQ1JZUFQgJiYKICAgICAgIGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFQ1JZUFQpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwKLSAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00MDAsMTIgKzM4NywxMiBAQAogICB9CiAKICAgaWYgKCFjdHgtPnBrZXkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlciwgRVZQX1JfTk9fS0VZX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19LRVlfU0VUKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChjdHgtPnBrZXktPnR5cGUgIT0gcGVlci0+dHlwZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyLCBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RJRkZFUkVOVF9LRVlfVFlQRVMpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQxNiw4ICs0MDMsNyBAQAogICAgKiAtMiBpcyBPSyBmb3IgdXMgaGVyZSwgYXMgd2VsbCBhcyAxLCBzbyB3ZSBjYW4gY2hlY2sgZm9yIDAgb25seS4gKi8KICAgaWYgKCFFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMocGVlcikgJiYKICAgICAgICFFVlBfUEtFWV9jbXBfcGFyYW1ldGVycyhjdHgtPnBrZXksIHBlZXIpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfRElGRkVSRU5UX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfRElGRkVSRU5UX1BBUkFNRVRFUlMpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQzNywxMiArNDIzLDExIEBACiAKIGludCBFVlBfUEtFWV9kZXJpdmUoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKmtleSwgc2l6ZV90ICpvdXRfa2V5X2xlbikgewogICBpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZGVyaXZlKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVSSVZFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9kZXJpdmUsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOwogICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiBjdHgtPnBtZXRoLT5kZXJpdmUoY3R4LCBrZXksIG91dF9rZXlfbGVuKTsKQEAgLTQ1MCw4ICs0MzUsNyBAQAogCiBpbnQgRVZQX1BLRVlfa2V5Z2VuX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmtleWdlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfa2V5Z2VuX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBjdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0tFWUdFTjsKQEAgLTQ2NywxMiArNDUxLDExIEBACiAKIGludCBFVlBfUEtFWV9rZXlnZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICoqcHBrZXkpIHsKICAgaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmtleWdlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfa2V5Z2VuLAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0tFWUdFTikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1BLRVlfa2V5Z2VuLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC00ODMsNyArNDY2LDcgQEAKICAgaWYgKCEqcHBrZXkpIHsKICAgICAqcHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKICAgICBpZiAoISpwcGtleSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUEtFWV9rZXlnZW4sIEVSUl9MSUJfRVZQKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX0xJQl9FVlApOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9ldnBfZXh0cmFfdGVzdC5jYyBiL3NyYy9jcnlwdG8vZXZwL2V2cF9leHRyYV90ZXN0LmNjCmluZGV4IDY3NDU0N2QuLjljOTU1ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL2V2cF9leHRyYV90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vZXZwL2V2cF9leHRyYV90ZXN0LmNjCkBAIC0zMjIsOCArMzIyLDggQEAKIH07CiAKIHN0YXRpYyBTY29wZWRFVlBfUEtFWSBMb2FkRXhhbXBsZVJTQUtleSgpIHsKLSAgY29uc3QgdWludDhfdCAqZGVycCA9IGtFeGFtcGxlUlNBS2V5REVSOwotICBTY29wZWRSU0EgcnNhKGQyaV9SU0FQcml2YXRlS2V5KG51bGxwdHIsICZkZXJwLCBzaXplb2Yoa0V4YW1wbGVSU0FLZXlERVIpKSk7CisgIFNjb3BlZFJTQSByc2EoUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMoa0V4YW1wbGVSU0FLZXlERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtFeGFtcGxlUlNBS2V5REVSKSkpOwogICBpZiAoIXJzYSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V2cC9ldnBfdGVzdC5jYyBiL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0LmNjCmluZGV4IDIzOWY4NjguLmM3YWM5MDggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0LmNjCkBAIC01NiwxMCArNTYsMTkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NzAyKQorI2VuZGlmCisKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKICNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgogI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9kaWdlc3QuaD4KQEAgLTcyLDExICs4MSwxMCBAQAogI2luY2x1ZGUgIi4uL3Rlc3Qvc3RsX2NvbXBhdC5oIgogCiAKLS8vIGV2cF90ZXN0IGRpc3BhdGNoZXMgYmV0d2VlbiBtdWx0aXBsZSB0ZXN0IHR5cGVzLiBITUFDIHRlc3RzIHRlc3QgdGhlIGxlZ2FjeQotLy8gRVZQX1BLRVlfSE1BQyBBUEkuIFByaXZhdGVLZXkgdGVzdHMgdGFrZSBhIGtleSBuYW1lIHBhcmFtZXRlciBhbmQgc2luZ2xlCi0vLyBibG9jaywgZGVjb2RlIGl0IGFzIGEgUEVNIHByaXZhdGUga2V5LCBhbmQgc2F2ZSBpdCB1bmRlciB0aGF0IGtleSBuYW1lLgotLy8gRGVjcnlwdCwgU2lnbiwgYW5kIFZlcmlmeSB0ZXN0cyB0YWtlIGEgcHJldmlvdXNseSBpbXBvcnRlZCBrZXkgbmFtZSBhcwotLy8gcGFyYW1ldGVyIGFuZCB0ZXN0IHRoZWlyIHJlc3BlY3RpdmUgb3BlcmF0aW9ucy4KKy8vIGV2cF90ZXN0IGRpc3BhdGNoZXMgYmV0d2VlbiBtdWx0aXBsZSB0ZXN0IHR5cGVzLiBQcml2YXRlS2V5IHRlc3RzIHRha2UgYSBrZXkKKy8vIG5hbWUgcGFyYW1ldGVyIGFuZCBzaW5nbGUgYmxvY2ssIGRlY29kZSBpdCBhcyBhIFBFTSBwcml2YXRlIGtleSwgYW5kIHNhdmUgaXQKKy8vIHVuZGVyIHRoYXQga2V5IG5hbWUuIERlY3J5cHQsIFNpZ24sIGFuZCBWZXJpZnkgdGVzdHMgdGFrZSBhIHByZXZpb3VzbHkKKy8vIGltcG9ydGVkIGtleSBuYW1lIGFzIHBhcmFtZXRlciBhbmQgdGVzdCB0aGVpciByZXNwZWN0aXZlIG9wZXJhdGlvbnMuCiAKIHN0YXRpYyBjb25zdCBFVlBfTUQgKkdldERpZ2VzdChGaWxlVGVzdCAqdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgaWYgKG5hbWUgPT0gIk1ENSIpIHsKQEAgLTEyMCw1NCArMTI4LDEwIEBACiAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgYm9vbCBUZXN0SE1BQyhGaWxlVGVzdCAqdCkgewotICBzdGQ6OnN0cmluZyBkaWdlc3Rfc3RyOwotICBpZiAoIXQtPkdldEF0dHJpYnV0ZSgmZGlnZXN0X3N0ciwgIkhNQUMiKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25zdCBFVlBfTUQgKmRpZ2VzdCA9IEdldERpZ2VzdCh0LCBkaWdlc3Rfc3RyKTsKLSAgaWYgKGRpZ2VzdCA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5LCBpbnB1dCwgb3V0cHV0OwotICBpZiAoIXQtPkdldEJ5dGVzKCZrZXksICJLZXkiKSB8fAotICAgICAgIXQtPkdldEJ5dGVzKCZpbnB1dCwgIklucHV0IikgfHwKLSAgICAgICF0LT5HZXRCeXRlcygmb3V0cHV0LCAiT3V0cHV0IikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTY29wZWRFVlBfUEtFWSBwa2V5KEVWUF9QS0VZX25ld19tYWNfa2V5KEVWUF9QS0VZX0hNQUMsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNzbDo6dmVjdG9yX2RhdGEoJmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNpemUoKSkpOwotICBTY29wZWRFVlBfTURfQ1RYIG1jdHg7Ci0gIGlmICghcGtleSB8fAotICAgICAgIUVWUF9EaWdlc3RTaWduSW5pdChtY3R4LmdldCgpLCBudWxscHRyLCBkaWdlc3QsIG51bGxwdHIsIHBrZXkuZ2V0KCkpIHx8Ci0gICAgICAhRVZQX0RpZ2VzdFNpZ25VcGRhdGUobWN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJmlucHV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zaXplKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2l6ZV90IGxlbjsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYWN0dWFsOwotICBpZiAoIUVWUF9EaWdlc3RTaWduRmluYWwobWN0eC5nZXQoKSwgbnVsbHB0ciwgJmxlbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYWN0dWFsLnJlc2l6ZShsZW4pOwotICBpZiAoIUVWUF9EaWdlc3RTaWduRmluYWwobWN0eC5nZXQoKSwgYnNzbDo6dmVjdG9yX2RhdGEoJmFjdHVhbCksICZsZW4pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGFjdHVhbC5yZXNpemUobGVuKTsKLSAgcmV0dXJuIHQtPkV4cGVjdEJ5dGVzRXF1YWwoYnNzbDo6dmVjdG9yX2RhdGEoJm91dHB1dCksIG91dHB1dC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZhY3R1YWwpLCBhY3R1YWwuc2l6ZSgpKTsKLX0KLQogc3RhdGljIGJvb2wgVGVzdEVWUChGaWxlVGVzdCAqdCwgdm9pZCAqYXJnKSB7CiAgIEtleU1hcCAqa2V5X21hcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8S2V5TWFwKj4oYXJnKTsKICAgaWYgKHQtPkdldFR5cGUoKSA9PSAiUHJpdmF0ZUtleSIpIHsKICAgICByZXR1cm4gSW1wb3J0UHJpdmF0ZUtleSh0LCBrZXlfbWFwKTsKLSAgfSBlbHNlIGlmICh0LT5HZXRUeXBlKCkgPT0gIkhNQUMiKSB7Ci0gICAgcmV0dXJuIFRlc3RITUFDKHQpOwogICB9CiAKICAgaW50ICgqa2V5X29wX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKQEAgLTIxOSw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJzc2w6OnZlY3Rvcl9kYXRhKCZpbnB1dCksIGlucHV0LnNpemUoKSkpIHsKICAgICAgIC8vIEVDRFNBIHNvbWV0aW1lcyBkb2Vzbid0IHB1c2ggYW4gZXJyb3IgY29kZS4gUHVzaCBvbmUgb24gdGhlIGVycm9yIHF1ZXVlCiAgICAgICAvLyBzbyBpdCdzIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIG90aGVyIGVycm9ycy4KLSAgICAgIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl9VU0VSLCAwLCBFUlJfUl9FVlBfTElCLCBfX0ZJTEVfXywgX19MSU5FX18pOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoVVNFUiwgRVJSX1JfRVZQX0xJQik7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3RzLnR4dCBiL3NyYy9jcnlwdG8vZXZwL2V2cF90ZXN0cy50eHQKaW5kZXggY2NjZmE0Zi4uOTdkZGFhMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvZXZwX3Rlc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2V2cC9ldnBfdGVzdHMudHh0CkBAIC0xNjMsMTIgKzE2MywxMSBAQAogSW5wdXQgPSAiMDEyMzQ1Njc4OUFCQ0RFRjEyMzQiCiBPdXRwdXQgPSAzMDQ1MDIyMTAwYjFkMWNiMWE1NzcwMzViY2NkZDVhODZjNjE0OGMyY2M3YzYzM2NkNDJiNzIzNDEzOWI1OTMwNzZkMDQxZTE1MjAyMjAxODk4Y2RkNTJiNDFjYTUwMjA5ODE4NGI0MDljZjgzYTIxYmM5NDUwMDY3NDZlM2I3Y2VhNTIyMzRlMDQzZWM4MDAKICMgVGhpcyBvcGVyYXRpb24gZmFpbHMgd2l0aG91dCBhbiBlcnJvciBjb2RlLCBzbyBFUlJfUl9FVlBfTElCIGlzIHN1cmZhY2VkLgotRXJyb3IgPSBwdWJsaWMga2V5IHJvdXRpbmVzCitFcnJvciA9IEJBRF9TSUdOQVRVUkUKIAogIyBCRVIgc2lnbmF0dXJlCiBWZXJpZnkgPSBQLTI1NgogRGlnZXN0ID0gU0hBMQogSW5wdXQgPSAiMDEyMzQ1Njc4OUFCQ0RFRjEyMzQiCiBPdXRwdXQgPSAzMDgwMDIyMTAwYjFkMWNiMWE1NzcwMzViY2NkZDVhODZjNjE0OGMyY2M3YzYzM2NkNDJiNzIzNDEzOWI1OTMwNzZkMDQxZTE1MjAyMjAxODk4Y2RkNTJiNDFjYTUwMjA5ODE4NGI0MDljZjgzYTIxYmM5NDUwMDY3NDZlM2I3Y2VhNTIyMzRlMDQzZWM4MDAwMAotIyBUaGlzIG9wZXJhdGlvbiBmYWlscyB3aXRob3V0IGFuIGVycm9yIGNvZGUsIHNvIEVSUl9SX0VWUF9MSUIgaXMgc3VyZmFjZWQuCi1FcnJvciA9IHB1YmxpYyBrZXkgcm91dGluZXMKK0Vycm9yID0gQkFEX1NJR05BVFVSRQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vZXZwL2ludGVybmFsLmgKaW5kZXggMDhhN2JmYi4uNjA4ODFlMyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL2V2cC9pbnRlcm5hbC5oCkBAIC04OSw4ICs4OSw3IEBACiAgIGludCBwa2V5X2Jhc2VfaWQ7CiAgIHVuc2lnbmVkIGxvbmcgcGtleV9mbGFnczsKIAotICBjaGFyICpwZW1fc3RyOwotICBjaGFyICppbmZvOworICBjb25zdCBjaGFyICpwZW1fc3RyOwogCiAgIGludCAoKnB1Yl9kZWNvZGUpKEVWUF9QS0VZICpwaywgWDUwOV9QVUJLRVkgKnB1Yik7CiAgIGludCAoKnB1Yl9lbmNvZGUpKFg1MDlfUFVCS0VZICpwdWIsIGNvbnN0IEVWUF9QS0VZICpwayk7CkBAIC0xMTUsOCArMTE0LDggQEAKICAgaW50ICgqcGtleV9zaXplKShjb25zdCBFVlBfUEtFWSAqcGspOwogICBpbnQgKCpwa2V5X2JpdHMpKGNvbnN0IEVWUF9QS0VZICpwayk7CiAKLSAgaW50ICgqcGFyYW1fZGVjb2RlKShFVlBfUEtFWSAqcGtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsIGludCBkZXJsZW4pOwotICBpbnQgKCpwYXJhbV9lbmNvZGUpKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcik7CisgIGludCAoKnBhcmFtX2RlY29kZSkoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVpbnQ4X3QgKipwZGVyLCBpbnQgZGVybGVuKTsKKyAgaW50ICgqcGFyYW1fZW5jb2RlKShjb25zdCBFVlBfUEtFWSAqcGtleSwgdWludDhfdCAqKnBkZXIpOwogICBpbnQgKCpwYXJhbV9taXNzaW5nKShjb25zdCBFVlBfUEtFWSAqcGspOwogICBpbnQgKCpwYXJhbV9jb3B5KShFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKTsKICAgaW50ICgqcGFyYW1fY21wKShjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpOwpAQCAtMTMwLDkgKzEyOSw5IEBACiAKICAgLyogTGVnYWN5IGZ1bmN0aW9ucyBmb3Igb2xkIFBFTSAqLwogCi0gIGludCAoKm9sZF9wcml2X2RlY29kZSkoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLAorICBpbnQgKCpvbGRfcHJpdl9kZWNvZGUpKEVWUF9QS0VZICpwa2V5LCBjb25zdCB1aW50OF90ICoqcGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVybGVuKTsKLSAgaW50ICgqb2xkX3ByaXZfZW5jb2RlKShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpOworICBpbnQgKCpvbGRfcHJpdl9lbmNvZGUpKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1aW50OF90ICoqcGRlcik7CiAKICAgLyogQ29udmVydGluZyBwYXJhbWV0ZXJzIHRvL2Zyb20gQWxnb3JpdGhtSWRlbnRpZmllciAoWDUwOV9BTEdPUikuICovCiAgIGludCAoKmRpZ2VzdF92ZXJpZnlfaW5pdF9mcm9tX2FsZ29yaXRobSkoRVZQX01EX0NUWCAqY3R4LApAQCAtMTUzLDE1ICsxNTIsMTIgQEAKICNkZWZpbmUgRVZQX1BLRVlfT1BfU0lHTiAoMSA8PCAzKQogI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRlkgKDEgPDwgNCkKICNkZWZpbmUgRVZQX1BLRVlfT1BfVkVSSUZZUkVDT1ZFUiAoMSA8PCA1KQotI2RlZmluZSBFVlBfUEtFWV9PUF9TSUdOQ1RYICgxIDw8IDYpCi0jZGVmaW5lIEVWUF9QS0VZX09QX1ZFUklGWUNUWCAoMSA8PCA3KQotI2RlZmluZSBFVlBfUEtFWV9PUF9FTkNSWVBUICgxIDw8IDgpCi0jZGVmaW5lIEVWUF9QS0VZX09QX0RFQ1JZUFQgKDEgPDwgOSkKLSNkZWZpbmUgRVZQX1BLRVlfT1BfREVSSVZFICgxIDw8IDEwKQorI2RlZmluZSBFVlBfUEtFWV9PUF9FTkNSWVBUICgxIDw8IDYpCisjZGVmaW5lIEVWUF9QS0VZX09QX0RFQ1JZUFQgKDEgPDwgNykKKyNkZWZpbmUgRVZQX1BLRVlfT1BfREVSSVZFICgxIDw8IDgpCiAKICNkZWZpbmUgRVZQX1BLRVlfT1BfVFlQRV9TSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoRVZQX1BLRVlfT1BfU0lHTiB8IEVWUF9QS0VZX09QX1ZFUklGWSB8IEVWUF9QS0VZX09QX1ZFUklGWVJFQ09WRVIgfCBcCi0gICBFVlBfUEtFWV9PUF9TSUdOQ1RYIHwgRVZQX1BLRVlfT1BfVkVSSUZZQ1RYKQorICAoRVZQX1BLRVlfT1BfU0lHTiB8IEVWUF9QS0VZX09QX1ZFUklGWSB8IEVWUF9QS0VZX09QX1ZFUklGWVJFQ09WRVIpCiAKICNkZWZpbmUgRVZQX1BLRVlfT1BfVFlQRV9DUllQVCAoRVZQX1BLRVlfT1BfRU5DUllQVCB8IEVWUF9QS0VZX09QX0RFQ1JZUFQpCiAKQEAgLTE4MSwxMyArMTc3LDggQEAKIE9QRU5TU0xfRVhQT1JUIGludCBFVlBfUEtFWV9DVFhfY3RybChFVlBfUEtFWV9DVFggKmN0eCwgaW50IGtleXR5cGUsIGludCBvcHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNtZCwgaW50IHAxLCB2b2lkICpwMik7CiAKLS8qIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVCBpcyBhbiBpbnRlcm5hbCB2YWx1ZS4gSXQncyBjYWxsZWQgYnkKLSAqIEVWUF9EaWdlc3RJbml0X2V4IHRvIHNpZ25hbCB0aGUgfEVWUF9QS0VZfCB0aGF0IGEgZGlnZXN0IG9wZXJhdGlvbiBpcwotICogc3RhcnRpbmcuCi0gKgotICogVE9ETyhkYXZpZGJlbik6IFRoaXMgaXMgb25seSBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgZGVwcmVjYXRlZCBITUFDIHxFVlBfUEtFWXwKLSAqIHR5cGVzLiAqLwotI2RlZmluZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQgMworI2RlZmluZSBFVlBfUEtFWV9DVFJMX01EIDEKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfTUQgMgogCiAvKiBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZIGlzIGNhbGxlZCB3aXRoIGRpZmZlcmVudCB2YWx1ZXMgb2YgfHAxfDoKICAqICAgMDogSXMgY2FsbGVkIGZyb20gfEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlcnwgYW5kIHxwMnwgY29udGFpbnMgYSBwZWVyIGtleS4KQEAgLTE5OCwyMSArMTg5LDEyIEBACiAgKiAgICAgIChFQylESCBhbHdheXMgcmV0dXJuIG9uZSBpbiB0aGlzIGNhc2UuCiAgKiAgIDM6IElzIGNhbGxlZCB3aXRoIHxwMnwgPT0gTlVMTCB0byBzZXQgd2hldGhlciB0aGUgcGVlcidzIGtleSB3YXMgdXNlZC4KICAqICAgICAgKEVDKURIIGFsd2F5cyByZXR1cm4gb25lIGluIHRoaXMgY2FzZS4gVGhpcyB3YXMgb25seSB1c2VkIGZvciBHT1NULiAqLwotI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZIDQKLQotLyogRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSBzZXRzIGEgTUFDIGtleS4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIGRvbmUgYW4KLSAqIHxFVlBfUEtFWV9DVFh8IHByaW9yIHRvIGNhbGxpbmcgfEVWUF9QS0VZX2tleWdlbnwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYW4KLSAqIEhNQUMgfEVWUF9QS0VZfCB3aXRoIHRoZSBnaXZlbiBrZXkuIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3MgYW5kIHplcm8gb24KLSAqIGVycm9yLiAqLwotI2RlZmluZSBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZIDUKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9QRUVSX0tFWSAzCiAKIC8qIEVWUF9QS0VZX0FMR19DVFJMIGlzIHRoZSBiYXNlIHZhbHVlIGZyb20gd2hpY2gga2V5LXR5cGUgc3BlY2lmaWMgY3RybAogICogY29tbWFuZHMgYXJlIG51bWJlcmVkLiAqLwogI2RlZmluZSBFVlBfUEtFWV9BTEdfQ1RSTCAweDEwMDAKIAotI2RlZmluZSBFVlBfUEtFWV9DVFJMX01EIDEKLSNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfTUQgMgotCiAjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX1BBRERJTkcgKEVWUF9QS0VZX0FMR19DVFJMICsgMSkKICNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX1BBRERJTkcgKEVWUF9QS0VZX0FMR19DVFJMICsgMikKICNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfUFNTX1NBTFRMRU4gKEVWUF9QS0VZX0FMR19DVFJMICsgMykKQEAgLTI2MCwzNCArMjQyLDI1IEBACiAgIGludCAoKmtleWdlbikoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KTsKIAogICBpbnQgKCpzaWduX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKLSAgaW50ICgqc2lnbikoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCi0gICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CisgIGludCAoKnNpZ24pKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpzaWcsIHNpemVfdCAqc2lnbGVuLAorICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0YnMsIHNpemVfdCB0YnNsZW4pOwogCiAgIGludCAoKnZlcmlmeV9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7Ci0gIGludCAoKnZlcmlmeSkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pOwotCi0gIGludCAoKnNpZ25jdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpOwotICBpbnQgKCpzaWduY3R4KShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKLSAgICAgICAgICAgICAgICAgRVZQX01EX0NUWCAqbWN0eCk7Ci0KLSAgaW50ICgqdmVyaWZ5Y3R4X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfTURfQ1RYICptY3R4KTsKLSAgaW50ICgqdmVyaWZ5Y3R4KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBpbnQgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgIEVWUF9NRF9DVFggKm1jdHgpOworICBpbnQgKCp2ZXJpZnkpKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpzaWcsIHNpemVfdCBzaWdsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKTsKIAogICBpbnQgKCplbmNyeXB0X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKLSAgaW50ICgqZW5jcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pOworICBpbnQgKCplbmNyeXB0KShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqb3V0LCBzaXplX3QgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbmxlbik7CiAKICAgaW50ICgqZGVjcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7Ci0gIGludCAoKmRlY3J5cHQpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAotICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKTsKKyAgaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVpbnQ4X3QgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5sZW4pOwogCiAgIGludCAoKmRlcml2ZV9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7Ci0gIGludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pOworICBpbnQgKCpkZXJpdmUpKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICprZXksIHNpemVfdCAqa2V5bGVuKTsKIAogICBpbnQgKCpjdHJsKShFVlBfUEtFWV9DVFggKmN0eCwgaW50IHR5cGUsIGludCBwMSwgdm9pZCAqcDIpOwotICBpbnQgKCpjdHJsX3N0cikoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKIH0gLyogRVZQX1BLRVlfTUVUSE9EICovOwogCiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfZHNhX2FzbjEuYyBiL3NyYy9jcnlwdG8vZXZwL3BfZHNhX2FzbjEuYwppbmRleCA4MjZkNGU0Li40NzkwY2Y2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2V2cC9wX2RzYV9hc24xLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9kc2FfYXNuMS5jCkBAIC05MSwyOSArOTEsMjkgQEAKIAogICAgIGRzYSA9IGQyaV9EU0FwYXJhbXMoTlVMTCwgJnBtLCBwbWxlbik7CiAgICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wdWJfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgaWYgKHB0eXBlID09IFZfQVNOMV9OVUxMIHx8IHB0eXBlID09IFZfQVNOMV9VTkRFRikgewogICAgIGRzYSA9IERTQV9uZXcoKTsKICAgICBpZiAoZHNhID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVWUF9SX1BBUkFNRVRFUl9FTkNPRElOR19FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgcHVibGljX2tleSA9IGQyaV9BU04xX0lOVEVHRVIoTlVMTCwgJnAsIHBrbGVuKTsKICAgaWYgKHB1YmxpY19rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgZHNhLT5wdWJfa2V5ID0gQVNOMV9JTlRFR0VSX3RvX0JOKHB1YmxpY19rZXksIE5VTEwpOwogICBpZiAoZHNhLT5wdWJfa2V5ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wdWJfZGVjb2RlLCBFVlBfUl9CTl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQk5fREVDT0RFX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xNDAsMTIgKzE0MCwxMiBAQAogICBpZiAoZHNhLT5wICYmIGRzYS0+cSAmJiBkc2EtPmcpIHsKICAgICBwdmFsID0gQVNOMV9TVFJJTkdfbmV3KCk7CiAgICAgaWYgKCFwdmFsKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wdWJfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBwdmFsLT5sZW5ndGggPSBpMmRfRFNBcGFyYW1zKGRzYSwgJnB2YWwtPmRhdGEpOwogICAgIGlmIChwdmFsLT5sZW5ndGggPD0gMCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHViX2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgcHR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CkBAIC0xNTUsNyArMTU1LDcgQEAKIAogICBwZW5jbGVuID0gaTJkX0RTQVB1YmxpY0tleShkc2EsICZwZW5jKTsKICAgaWYgKHBlbmNsZW4gPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3B1Yl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yNTIsMjMgKzI1MiwyMyBAQAogICAvKiBXZSBoYXZlIHBhcmFtZXRlcnMuIE5vdyBzZXQgcHJpdmF0ZSBrZXkgKi8KICAgZHNhLT5wcml2X2tleSA9IEFTTjFfSU5URUdFUl90b19CTihwcml2a2V5LCBOVUxMKTsKICAgaWYgKGRzYS0+cHJpdl9rZXkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZGVjb2RlLCBFUlJfTElCX0JOKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9MSUJfQk4pOwogICAgIGdvdG8gZHNhZXJyOwogICB9CiAgIC8qIENhbGN1bGF0ZSBwdWJsaWMga2V5LiAqLwogICBkc2EtPnB1Yl9rZXkgPSBCTl9uZXcoKTsKICAgaWYgKGRzYS0+cHViX2tleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGRzYWVycjsKICAgfQogICBjdHggPSBCTl9DVFhfbmV3KCk7CiAgIGlmIChjdHggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZGVjb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBkc2FlcnI7CiAgIH0KIAogICBpZiAoIUJOX21vZF9leHAoZHNhLT5wdWJfa2V5LCBkc2EtPmcsIGRzYS0+cHJpdl9rZXksIGRzYS0+cCwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZHNhX3ByaXZfZGVjb2RlLCBFUlJfTElCX0JOKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9MSUJfQk4pOwogICAgIGdvdG8gZHNhZXJyOwogICB9CiAKQEAgLTI4MCw3ICsyODAsNyBAQAogICByZXR1cm4gMTsKIAogZGVjZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wcml2X2RlY29kZSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwogCiBkc2FlcnI6CiAgIEJOX0NUWF9mcmVlKGN0eCk7CkBAIC0yOTcsMTkgKzI5NywxOSBAQAogICBpbnQgZHBsZW47CiAKICAgaWYgKCFwa2V5LT5wa2V5LmRzYSB8fCAhcGtleS0+cGtleS5kc2EtPnByaXZfa2V5KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9lbmNvZGUsIEVWUF9SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgcGFyYW1zID0gQVNOMV9TVFJJTkdfbmV3KCk7CiAgIGlmICghcGFyYW1zKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIHBhcmFtcy0+bGVuZ3RoID0gaTJkX0RTQXBhcmFtcyhwa2V5LT5wa2V5LmRzYSwgJnBhcmFtcy0+ZGF0YSk7CiAgIGlmIChwYXJhbXMtPmxlbmd0aCA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogICBwYXJhbXMtPnR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CkBAIC0zMTgsMTMgKzMxOCwxNCBAQAogICBwcmtleSA9IEJOX3RvX0FTTjFfSU5URUdFUihwa2V5LT5wa2V5LmRzYS0+cHJpdl9rZXksIE5VTEwpOwogCiAgIGlmICghcHJrZXkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9wcml2X2VuY29kZSwgRVJSX0xJQl9CTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfTElCX0JOKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGRwbGVuID0gaTJkX0FTTjFfSU5URUdFUihwcmtleSwgJmRwKTsKIAogICBBU04xX0lOVEVHRVJfZnJlZShwcmtleSk7CisgIHBya2V5ID0gTlVMTDsKIAogICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX2RzYSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIFZfQVNOMV9TRVFVRU5DRSwgcGFyYW1zLCBkcCwgZHBsZW4pKSB7CkBAIC00MzcsNyArNDM4LDcgQEAKIAogICBtID0gKHVpbnQ4X3QgKilPUEVOU1NMX21hbGxvYyhidWZfbGVuICsgMTApOwogICBpZiAobSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19kc2FfcHJpbnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00NjYsNyArNDY3LDcgQEAKICAgRFNBICpkc2E7CiAgIGRzYSA9IGQyaV9EU0FwYXJhbXMoTlVMTCwgcGRlciwgZGVybGVuKTsKICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkc2FfcGFyYW1fZGVjb2RlLCBFUlJfUl9EU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0RTQV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKQEAgLTQ5Nyw3ICs0OTgsNyBAQAogICBEU0EgKmRzYTsKICAgZHNhID0gZDJpX0RTQVByaXZhdGVLZXkoTlVMTCwgcGRlciwgZGVybGVuKTsKICAgaWYgKGRzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBvbGRfZHNhX3ByaXZfZGVjb2RlLCBFUlJfUl9EU0FfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0RTQV9MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKQEAgLTUzMSw3ICs1MzIsNyBAQAogICB1cGRhdGVfYnVmbGVuKGRzYV9zaWctPnMsICZidWZfbGVuKTsKICAgbSA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4gKyAxMCk7CiAgIGlmIChtID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRzYV9zaWdfcHJpbnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC01NTQsNyArNTU1LDYgQEAKICAgMCwKIAogICAiRFNBIiwKLSAgIk9wZW5TU0wgRFNBIG1ldGhvZCIsCiAKICAgZHNhX3B1Yl9kZWNvZGUsCiAgIGRzYV9wdWJfZW5jb2RlLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9lYy5jIGIvc3JjL2NyeXB0by9ldnAvcF9lYy5jCmluZGV4IDczYzAwZDguLjc3ZjIxM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfZWMuYworKysgYi9zcmMvY3J5cHRvL2V2cC9wX2VjLmMKQEAgLTEyNSwyNSArMTI1LDE4IEBACiAKIHN0YXRpYyBpbnQgcGtleV9lY19zaWduKEVWUF9QS0VZX0NUWCAqY3R4LCB1aW50OF90ICpzaWcsIHNpemVfdCAqc2lnbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKSB7Ci0gIGludCB0eXBlOwogICB1bnNpZ25lZCBpbnQgc2x0bXA7Ci0gIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOwogICBFQ19LRVkgKmVjID0gY3R4LT5wa2V5LT5wa2V5LmVjOwogCiAgIGlmICghc2lnKSB7CiAgICAgKnNpZ2xlbiA9IEVDRFNBX3NpemUoZWMpOwogICAgIHJldHVybiAxOwogICB9IGVsc2UgaWYgKCpzaWdsZW4gPCAoc2l6ZV90KUVDRFNBX3NpemUoZWMpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX3NpZ24sIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICB0eXBlID0gTklEX3NoYTE7Ci0gIGlmIChkY3R4LT5tZCkgewotICAgIHR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7Ci0gIH0KLQotICBpZiAoIUVDRFNBX3NpZ24odHlwZSwgdGJzLCB0YnNsZW4sIHNpZywgJnNsdG1wLCBlYykpIHsKKyAgaWYgKCFFQ0RTQV9zaWduKDAsIHRicywgdGJzbGVuLCBzaWcsICZzbHRtcCwgZWMpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgKnNpZ2xlbiA9IChzaXplX3Qpc2x0bXA7CkBAIC0xNTIsMTYgKzE0NSw3IEBACiAKIHN0YXRpYyBpbnQgcGtleV9lY192ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNpZywgc2l6ZV90IHNpZ2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGJzLCBzaXplX3QgdGJzbGVuKSB7Ci0gIGludCB0eXBlOwotICBFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKLSAgRUNfS0VZICplYyA9IGN0eC0+cGtleS0+cGtleS5lYzsKLQotICB0eXBlID0gTklEX3NoYTE7Ci0gIGlmIChkY3R4LT5tZCkgewotICAgIHR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7Ci0gIH0KLQotICByZXR1cm4gRUNEU0FfdmVyaWZ5KHR5cGUsIHRicywgdGJzbGVuLCBzaWcsIHNpZ2xlbiwgZWMpOworICByZXR1cm4gRUNEU0FfdmVyaWZ5KDAsIHRicywgdGJzbGVuLCBzaWcsIHNpZ2xlbiwgY3R4LT5wa2V5LT5wa2V5LmVjKTsKIH0KIAogc3RhdGljIGludCBwa2V5X2VjX2Rlcml2ZShFVlBfUEtFWV9DVFggKmN0eCwgdWludDhfdCAqa2V5LApAQCAtMTcyLDcgKzE1Niw3IEBACiAgIEVDX0tFWSAqZWNrZXk7CiAKICAgaWYgKCFjdHgtPnBrZXkgfHwgIWN0eC0+cGVlcmtleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9lY19kZXJpdmUsIEVWUF9SX0tFWVNfTk9UX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9LRVlTX05PVF9TRVQpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTIwNyw3ICsxOTEsNyBAQAogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9FQ19QQVJBTUdFTl9DVVJWRV9OSUQ6CiAgICAgICBncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKHAxKTsKICAgICAgIGlmIChncm91cCA9PSBOVUxMKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9lY19jdHJsLCBFVlBfUl9JTlZBTElEX0NVUlZFKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX0NVUlZFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBFQ19HUk9VUF9mcmVlKGRjdHgtPmdlbl9ncm91cCk7CkBAIC0yMjEsNyArMjA1LDcgQEAKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEyNTYgJiYKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEzODQgJiYKICAgICAgICAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGE1MTIpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX2N0cmwsIEVWUF9SX0lOVkFMSURfRElHRVNUX1RZUEUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfRElHRVNUX1RZUEUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIGRjdHgtPm1kID0gcDI7CkBAIC0yMzIsMTIgKzIxNiwxMSBAQAogICAgICAgcmV0dXJuIDE7CiAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVk6Ci0gICAgLyogRGVmYXVsdCBiZWhhdmlvdXIgaXMgT0sgKi8KLSAgICBjYXNlIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVDoKKyAgICAgIC8qIERlZmF1bHQgYmVoYXZpb3VyIGlzIE9LICovCiAgICAgICByZXR1cm4gMTsKIAogICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKICAgICAgIHJldHVybiAwOwogICB9CiB9CkBAIC0yNDgsNyArMjMxLDcgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKGRjdHgtPmdlbl9ncm91cCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X2VjX3BhcmFtZ2VuLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZWMgPSBFQ19LRVlfbmV3KCk7CkBAIC0yNjgsNyArMjUxLDcgQEAKICAgRUNfS0VZICplYyA9IE5VTEw7CiAgIEVDX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOwogICBpZiAoY3R4LT5wa2V5ID09IE5VTEwgJiYgZGN0eC0+Z2VuX2dyb3VwID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfZWNfa2V5Z2VuLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9OT19QQVJBTUVURVJTX1NFVCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgZWMgPSBFQ19LRVlfbmV3KCk7CkBAIC0yOTAsMTIgKzI3MywxMSBAQAogfQogCiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgZWNfcGtleV9tZXRoID0gewotICAgIEVWUF9QS0VZX0VDLCAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X2VjX2luaXQsCi0gICAgcGtleV9lY19jb3B5LCAgICAgICAgICAgcGtleV9lY19jbGVhbnVwLCAgICAgIDAgLyogcGFyYW1nZW5faW5pdCAqLywKLSAgICBwa2V5X2VjX3BhcmFtZ2VuLCAgICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9lY19rZXlnZW4sCi0gICAgMCAvKiBzaWduX2luaXQgKi8sICAgICAgcGtleV9lY19zaWduLCAgICAgICAgIDAgLyogdmVyaWZ5X2luaXQgKi8sCi0gICAgcGtleV9lY192ZXJpZnksICAgICAgICAgMCAvKiBzaWduY3R4X2luaXQgKi8sIDAgLyogc2lnbmN0eCAqLywKLSAgICAwIC8qIHZlcmlmeWN0eF9pbml0ICovLCAwIC8qIHZlcmlmeWN0eCAqLywgICAgMCAvKiBlbmNyeXB0X2luaXQgKi8sCi0gICAgMCAvKiBlbmNyeXB0ICovLCAgICAgICAgMCAvKiBkZWNyeXB0X2luaXQgKi8sIDAgLyogZGVjcnlwdCAqLywKLSAgICAwIC8qIGRlcml2ZV9pbml0ICovLCAgICBwa2V5X2VjX2Rlcml2ZSwgICAgICAgcGtleV9lY19jdHJsLAorICAgIEVWUF9QS0VZX0VDLCAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9lY19pbml0LAorICAgIHBrZXlfZWNfY29weSwgICAgICAgICBwa2V5X2VjX2NsZWFudXAsICAgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAorICAgIHBrZXlfZWNfcGFyYW1nZW4sICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9lY19rZXlnZW4sCisgICAgMCAvKiBzaWduX2luaXQgKi8sICAgIHBrZXlfZWNfc2lnbiwgICAgICAgICAwIC8qIHZlcmlmeV9pbml0ICovLAorICAgIHBrZXlfZWNfdmVyaWZ5LCAgICAgICAwIC8qIGVuY3J5cHRfaW5pdCAqLywgMCAvKiBlbmNyeXB0ICovLAorICAgIDAgLyogZGVjcnlwdF9pbml0ICovLCAwIC8qIGRlY3J5cHQgKi8sICAgICAgMCAvKiBkZXJpdmVfaW5pdCAqLywKKyAgICBwa2V5X2VjX2Rlcml2ZSwgICAgICAgcGtleV9lY19jdHJsLAogfTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfZWNfYXNuMS5jIGIvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKaW5kZXggZmJiZjRlNy4uOTg2Nzk0NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKKysrIGIvc3JjL2NyeXB0by9ldnAvcF9lY19hc24xLmMKQEAgLTcxLDEzICs3MSwxMyBAQAogICBpbnQgbmlkOwogCiAgIGlmIChlY19rZXkgPT0gTlVMTCB8fCAoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY19rZXkpKSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wYXJhbTJ0eXBlLCBFVlBfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIG5pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwKTsKICAgaWYgKG5pZCA9PSBOSURfdW5kZWYpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3BhcmFtMnR5cGUsIEVWUF9SX05PX05JRF9GT1JfQ1VSVkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTk9fTklEX0ZPUl9DVVJWRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtOTQsNyArOTQsNyBAQAogICBpbnQgcGVuY2xlbjsKIAogICBpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHViX2VuY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgcGVuY2xlbiA9IGkyb19FQ1B1YmxpY0tleShlY19rZXksIE5VTEwpOwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKICAgICBlY2tleSA9IGQyaV9FQ1BhcmFtZXRlcnMoTlVMTCwgJnBtLCBwbWxlbik7CiAgICAgaWYgKGVja2V5ID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfdHlwZTJwYXJhbSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIGlmIChwdHlwZSA9PSBWX0FTTjFfT0JKRUNUKSB7CkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3R5cGUycGFyYW0sIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE3NywxMyArMTc3LDEzIEBACiAKICAgZWNrZXkgPSBlY2tleV90eXBlMnBhcmFtKHB0eXBlLCBwdmFsKTsKICAgaWYgKCFlY2tleSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHViX2RlY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBXZSBoYXZlIHBhcmFtZXRlcnMgbm93IHNldCBwdWJsaWMga2V5ICovCiAgIGlmICghbzJpX0VDUHVibGljS2V5KCZlY2tleSwgJnAsIHBrbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHViX2RlY29kZSwgRVZQX1JfREVDT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RFQ09ERV9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMjMyLDcgKzIzMiw3IEBACiAKICAgLyogV2UgaGF2ZSBwYXJhbWV0ZXJzIG5vdyBzZXQgcHJpdmF0ZSBrZXkgKi8KICAgaWYgKCFkMmlfRUNQcml2YXRlS2V5KCZlY2tleSwgJnAsIHBrbGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9kZWNvZGUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9ERUNPREVfRVJST1IpOwogICAgIGdvdG8gZWNlcnI7CiAgIH0KIApAQCAtMjQ2LDIzICsyNDYsMjMgQEAKICAgICBncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KTsKICAgICBwdWJfa2V5ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKICAgICBpZiAocHViX2tleSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlY2xpYmVycjsKICAgICB9CiAgICAgaWYgKCFFQ19QT0lOVF9jb3B5KHB1Yl9rZXksIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKSkpIHsKICAgICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOwogICAgICAgZ290byBlY2xpYmVycjsKICAgICB9CiAgICAgcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShlY2tleSk7CiAgICAgaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIHB1Yl9rZXksIHByaXZfa2V5LCBOVUxMLCBOVUxMLCBOVUxMKSkgewogICAgICAgRUNfUE9JTlRfZnJlZShwdWJfa2V5KTsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CiAgICAgICBnb3RvIGVjbGliZXJyOwogICAgIH0KICAgICBpZiAoRUNfS0VZX3NldF9wdWJsaWNfa2V5KGVja2V5LCBwdWJfa2V5KSA9PSAwKSB7CiAgICAgICBFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wcml2X2RlY29kZSwgRVJSX1JfRUNfTElCKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKICAgICAgIGdvdG8gZWNsaWJlcnI7CiAgICAgfQogICAgIEVDX1BPSU5UX2ZyZWUocHViX2tleSk7CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgcmV0dXJuIDE7CiAKIGVjbGliZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZGVjb2RlLCBFUlJfUl9FQ19MSUIpOworICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX0VDX0xJQik7CiBlY2VycjoKICAgaWYgKGVja2V5KSB7CiAgICAgRUNfS0VZX2ZyZWUoZWNrZXkpOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgIGVjX2tleSA9IHBrZXktPnBrZXkuZWM7CiAKICAgaWYgKCFlY2tleV9wYXJhbTJ0eXBlKCZwdHlwZSwgJnB2YWwsIGVjX2tleSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZW5jb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMDQsMjAgKzMwNCwyMCBAQAogICBlcGxlbiA9IGkyZF9FQ1ByaXZhdGVLZXkoZWNfa2V5LCBOVUxMKTsKICAgaWYgKCFlcGxlbikgewogICAgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGVja2V5X3ByaXZfZW5jb2RlLCBFUlJfUl9FQ19MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfRUNfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogICBlcCA9ICh1aW50OF90ICopT1BFTlNTTF9tYWxsb2MoZXBsZW4pOwogICBpZiAoIWVwKSB7CiAgICAgRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCBvbGRfZmxhZ3MpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogICBwID0gZXA7CiAgIGlmICghaTJkX0VDUHJpdmF0ZUtleShlY19rZXksICZwKSkgewogICAgIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKICAgICBPUEVOU1NMX2ZyZWUoZXApOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgZWNrZXlfcHJpdl9lbmNvZGUsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIC8qIHJlc3RvcmUgb2xkIGVuY29kaW5nIGZsYWdzICovCkBAIC0zMjUsNiArMzI1LDcgQEAKIAogICBpZiAoIVBLQ1M4X3BrZXlfc2V0MChwOCwgKEFTTjFfT0JKRUNUICopT0JKX25pZDJvYmooTklEX1g5XzYyX2lkX2VjUHVibGljS2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgMCwgcHR5cGUsIHB2YWwsIGVwLCBlcGxlbikpIHsKKyAgICBPUEVOU1NMX2ZyZWUoZXApOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ3OCw3ICs0NzksNyBAQAogCiBlcnI6CiAgIGlmICghcmV0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBkb19FQ19LRVlfcHJpbnQsIHJlYXNvbik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByZWFzb24pOwogICB9CiAgIE9QRU5TU0xfZnJlZShwdWJfa2V5X2J5dGVzKTsKICAgQk5fZnJlZShvcmRlcik7CkBAIC00OTEsNyArNDkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXJsZW4pIHsKICAgRUNfS0VZICplY2tleTsKICAgaWYgKCEoZWNrZXkgPSBkMmlfRUNQYXJhbWV0ZXJzKE5VTEwsIHBkZXIsIGRlcmxlbikpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBlY2tleV9wYXJhbV9kZWNvZGUsIEVSUl9SX0VDX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9FQ19MSUIpOwogICAgIHJldHVybiAwOwogICB9CiAgIEVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkocGtleSwgZWNrZXkpOwpAQCAtNTI2LDcgKzUyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVybGVuKSB7CiAgIEVDX0tFWSAqZWM7CiAgIGlmICghKGVjID0gZDJpX0VDUHJpdmF0ZUtleShOVUxMLCBwZGVyLCBkZXJsZW4pKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgb2xkX2VjX3ByaXZfZGVjb2RlLCBFVlBfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfREVDT0RFX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogICBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKQEAgLTU0Miw3ICs1NDMsNiBAQAogICBFVlBfUEtFWV9FQywKICAgMCwKICAgIkVDIiwKLSAgIk9wZW5TU0wgRUMgYWxnb3JpdGhtIiwKIAogICBlY2tleV9wdWJfZGVjb2RlLAogICBlY2tleV9wdWJfZW5jb2RlLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9obWFjLmMgYi9zcmMvY3J5cHRvL2V2cC9wX2htYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMjU0YS4uMDAwMDAwMAotLS0gYS9zcmMvY3J5cHRvL2V2cC9wX2htYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKLSAqIHByb2plY3QgMjAwNy4KLSAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAotICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKLSAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKLSAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZwotICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQotICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuICovCi0KLSNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgotI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KLQotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vZGlnZXN0L2ludGVybmFsLmgiCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBFVlBfTUQgKm1kOyAgICAgICAvKiBNRCBmb3IgSE1BQyB1c2UgKi8KLSAgQVNOMV9PQ1RFVF9TVFJJTkcga3RtcDsgLyogVGVtcCBzdG9yYWdlIGZvciBrZXkgKi8KLSAgSE1BQ19DVFggY3R4OwotfSBITUFDX1BLRVlfQ1RYOwotCi1zdGF0aWMgaW50IHBrZXlfaG1hY19pbml0KEVWUF9QS0VZX0NUWCAqY3R4KSB7Ci0gIEhNQUNfUEtFWV9DVFggKmhjdHg7Ci0gIGhjdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoSE1BQ19QS0VZX0NUWCkpOwotICBpZiAoIWhjdHgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBtZW1zZXQoaGN0eCwgMCwgc2l6ZW9mKEhNQUNfUEtFWV9DVFgpKTsKLSAgaGN0eC0+a3RtcC50eXBlID0gVl9BU04xX09DVEVUX1NUUklORzsKLSAgSE1BQ19DVFhfaW5pdCgmaGN0eC0+Y3R4KTsKLQotICBjdHgtPmRhdGEgPSBoY3R4OwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IHBrZXlfaG1hY19jb3B5KEVWUF9QS0VZX0NUWCAqZHN0LCBFVlBfUEtFWV9DVFggKnNyYykgewotICBITUFDX1BLRVlfQ1RYICpzY3R4LCAqZGN0eDsKLSAgaWYgKCFwa2V5X2htYWNfaW5pdChkc3QpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgc2N0eCA9IHNyYy0+ZGF0YTsKLSAgZGN0eCA9IGRzdC0+ZGF0YTsKLSAgZGN0eC0+bWQgPSBzY3R4LT5tZDsKLSAgSE1BQ19DVFhfaW5pdCgmZGN0eC0+Y3R4KTsKLSAgaWYgKCFITUFDX0NUWF9jb3B5X2V4KCZkY3R4LT5jdHgsICZzY3R4LT5jdHgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKHNjdHgtPmt0bXAuZGF0YSkgewotICAgIGlmICghQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KCZkY3R4LT5rdG1wLCBzY3R4LT5rdG1wLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2N0eC0+a3RtcC5sZW5ndGgpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHBrZXlfaG1hY19jbGVhbnVwKEVWUF9QS0VZX0NUWCAqY3R4KSB7Ci0gIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7Ci0KLSAgaWYgKGhjdHggPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIEhNQUNfQ1RYX2NsZWFudXAoJmhjdHgtPmN0eCk7Ci0gIGlmIChoY3R4LT5rdG1wLmRhdGEpIHsKLSAgICBpZiAoaGN0eC0+a3RtcC5sZW5ndGgpIHsKLSAgICAgIE9QRU5TU0xfY2xlYW5zZShoY3R4LT5rdG1wLmRhdGEsIGhjdHgtPmt0bXAubGVuZ3RoKTsKLSAgICB9Ci0gICAgT1BFTlNTTF9mcmVlKGhjdHgtPmt0bXAuZGF0YSk7Ci0gICAgaGN0eC0+a3RtcC5kYXRhID0gTlVMTDsKLSAgfQotICBPUEVOU1NMX2ZyZWUoaGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGtleV9obWFjX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpIHsKLSAgQVNOMV9PQ1RFVF9TVFJJTkcgKmhrZXkgPSBOVUxMOwotICBITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5kYXRhOwotCi0gIGlmICghaGN0eC0+a3RtcC5kYXRhKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaGtleSA9IEFTTjFfT0NURVRfU1RSSU5HX2R1cCgmaGN0eC0+a3RtcCk7Ci0gIGlmICghaGtleSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIEVWUF9QS0VZX2Fzc2lnbihwa2V5LCBFVlBfUEtFWV9ITUFDLCBoa2V5KTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgaW50X3VwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkgewotICBITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5wY3R4LT5kYXRhOwotICBITUFDX1VwZGF0ZSgmaGN0eC0+Y3R4LCBkYXRhLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaG1hY19zaWduY3R4X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpIHsKLSAgLyogfG1jdHh8IGdldHMgcmVwdXJwb3NlZCBhcyBhIGhvb2sgdG8gY2FsbCB8SE1BQ19VcGRhdGV8LiBTdXBwcmVzcyB0aGUKLSAgICogYXV0b21hdGljIHNldHRpbmcgb2YgfG1jdHgtPnVwZGF0ZXwgYW5kIHRoZSByZXN0IG9mIGl0cyBpbml0aWFsaXphdGlvbi4gKi8KLSAgRVZQX01EX0NUWF9zZXRfZmxhZ3MobWN0eCwgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQpOwotICBtY3R4LT51cGRhdGUgPSBpbnRfdXBkYXRlOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBobWFjX3NpZ25jdHgoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBFVlBfTURfQ1RYICptY3R4KSB7Ci0gIHVuc2lnbmVkIGludCBobGVuOwotICBITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5kYXRhOwotICBzaXplX3QgbWRfc2l6ZSA9IEVWUF9NRF9DVFhfc2l6ZShtY3R4KTsKLQotICBpZiAoIXNpZykgewotICAgICpzaWdsZW4gPSBtZF9zaXplOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKCpzaWdsZW4gPCBtZF9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBobWFjX3NpZ25jdHgsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKCFITUFDX0ZpbmFsKCZoY3R4LT5jdHgsIHNpZywgJmhsZW4pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKnNpZ2xlbiA9IChzaXplX3QpaGxlbjsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgcGtleV9obWFjX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSB7Ci0gIEhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7Ci0gIEFTTjFfT0NURVRfU1RSSU5HICprZXk7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZOgotICAgICAgaWYgKCghcDIgJiYgcDEgPiAwKSB8fCAocDEgPCAtMSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpZiAoIUFTTjFfT0NURVRfU1RSSU5HX3NldCgmaGN0eC0+a3RtcCwgcDIsIHAxKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFVlBfUEtFWV9DVFJMX01EOgotICAgICAgaGN0eC0+bWQgPSBwMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQ6Ci0gICAgICBrZXkgPSAoQVNOMV9PQ1RFVF9TVFJJTkcgKiljdHgtPnBrZXktPnBrZXkucHRyOwotICAgICAgaWYgKCFITUFDX0luaXRfZXgoJmhjdHgtPmN0eCwga2V5LT5kYXRhLCBrZXktPmxlbmd0aCwgaGN0eC0+bWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmVuZ2luZSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfaG1hY19jdHJsLCBFVlBfUl9DT01NQU5EX05PVF9TVVBQT1JURUQpOwotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IEVWUF9QS0VZX01FVEhPRCBobWFjX3BrZXlfbWV0aCA9IHsKLSAgICBFVlBfUEtFWV9ITUFDLCAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9obWFjX2luaXQsCi0gICAgcGtleV9obWFjX2NvcHksICAgICAgICAgcGtleV9obWFjX2NsZWFudXAsICAgIDAgLyogcGFyYW1nZW5faW5pdCAqLywKLSAgICAwIC8qIHBhcmFtZ2VuICovLCAgICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9obWFjX2tleWdlbiwKLSAgICAwIC8qIHNpZ25faW5pdCAqLywgICAgICAwIC8qIHNpZ24gKi8sICAgICAgICAgMCAvKiB2ZXJpZnlfaW5pdCAqLywKLSAgICAwIC8qIHZlcmlmeSAqLywgICAgICAgICBobWFjX3NpZ25jdHhfaW5pdCwgICAgaG1hY19zaWduY3R4LAotICAgIDAgLyogdmVyaWZ5Y3R4X2luaXQgKi8sIDAgLyogdmVyaWZ5Y3R4ICovLCAgICAwIC8qIGVuY3J5cHRfaW5pdCAqLywKLSAgICAwIC8qIGVuY3J5cHQgKi8sICAgICAgICAwIC8qIGRlY3J5cHRfaW5pdCAqLywgMCAvKiBkZWNyeXB0ICovLAotICAgIDAgLyogZGVyaXZlX2luaXQgKi8sICAgIDAgLyogZGVyaXZlICovLCAgICAgICBwa2V5X2htYWNfY3RybCwKLSAgICAwLAotfTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vZXZwL3BfaG1hY19hc24xLmMgYi9zcmMvY3J5cHRvL2V2cC9wX2htYWNfYXNuMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWE2Njc2Li4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfaG1hY19hc24xLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKLSAqIHByb2plY3QgMjAwNy4KLSAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKLSAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCi0gKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0Ci0gKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKLSAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KLSAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLiAqLwotCi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZGlnZXN0Lmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgotCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotCi1zdGF0aWMgaW50IGhtYWNfc2l6ZShjb25zdCBFVlBfUEtFWSAqcGtleSkgeyByZXR1cm4gRVZQX01BWF9NRF9TSVpFOyB9Ci0KLXN0YXRpYyB2b2lkIGhtYWNfa2V5X2ZyZWUoRVZQX1BLRVkgKnBrZXkpIHsKLSAgQVNOMV9PQ1RFVF9TVFJJTkcgKm9zID0gKEFTTjFfT0NURVRfU1RSSU5HICopcGtleS0+cGtleS5wdHI7Ci0gIGlmIChvcykgewotICAgIGlmIChvcy0+ZGF0YSkgewotICAgICAgT1BFTlNTTF9jbGVhbnNlKG9zLT5kYXRhLCBvcy0+bGVuZ3RoKTsKLSAgICB9Ci0gICAgQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvcyk7Ci0gIH0KLX0KLQotY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgaG1hY19hc24xX21ldGggPSB7Ci0gICAgRVZQX1BLRVlfSE1BQywgICAgICAgRVZQX1BLRVlfSE1BQywgICAgICAgICAwIC8qIGZsYWdzICovLAotICAgICJITUFDIiwgICAgICAgICAgICAgICJPcGVuU1NMIEhNQUMgbWV0aG9kIiwgMCAvKiBwdWJfZGVjb2RlICovLAotICAgIDAgLyogcHViX2VuY29kZSAqLywgIDAgLyogcHViX2NtcCAqLywgICAgICAgMCAvKiBwdWJfcHJpbnQgKi8sCi0gICAgMCAvKnByaXZfZGVjb2RlICovLCAgMCAvKiBwcml2X2VuY29kZSAqLywgICAwIC8qIHByaXZfcHJpbnQgKi8sCi0gICAgMCAvKiBwa2V5X29wYXF1ZSAqLywgMCAvKiBwa2V5X3N1cHBvcnRzX2RpZ2VzdCAqLywKLSAgICBobWFjX3NpemUsICAgICAgICAgICAwIC8qIHBrZXlfYml0cyAqLywgICAgIDAgLyogcGFyYW1fZGVjb2RlICovLAotICAgIDAgLyogcGFyYW1fZW5jb2RlKi8sIDAgLyogcGFyYW1fbWlzc2luZyovLCAgMCAvKiBwYXJhbV9jb3B5Ki8sCi0gICAgMCAvKiBwYXJhbV9jbXAqLywgICAgMCAvKiBwYXJhbV9wcmludCovLCAgICAwIC8qIHNpZ19wcmludCovLAotICAgIGhtYWNfa2V5X2ZyZWUsICAgICAgIDAgLyogb2xkX3ByaXZfZGVjb2RlICovLAotICAgIDAgLyogb2xkX3ByaXZfZW5jb2RlICovCi19OwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9yc2EuYyBiL3NyYy9jcnlwdG8vZXZwL3BfcnNhLmMKaW5kZXggNWFiYzA3NS4uY2ZlY2JmZCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9ldnAvcF9yc2EuYworKysgYi9zcmMvY3J5cHRvL2V2cC9wX3JzYS5jCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgfQogCiAgIGlmICgqc2lnbGVuIDwga2V5X2xlbikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2Ffc2lnbiwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xODIsMTIgKzE4MiwxMiBAQAogICAgIHVuc2lnbmVkIGludCBvdXRfbGVuOwogCiAgICAgaWYgKHRic2xlbiAhPSBFVlBfTURfc2l6ZShyY3R4LT5tZCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2Ffc2lnbiwgRVZQX1JfSU5WQUxJRF9ESUdFU1RfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9ESUdFU1RfTEVOR1RIKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmIChFVlBfTURfdHlwZShyY3R4LT5tZCkgPT0gTklEX21kYzIpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2Ffc2lnbiwgRVZQX1JfTk9fTURDMl9TVVBQT1JUKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfTk9fTURDMl9TVVBQT1JUKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjY4LDcgKzI2OCw3IEBACiAgIH0KIAogICBpZiAoKm91dGxlbiA8IGtleV9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2VuY3J5cHQsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzAwLDcgKzMwMCw3IEBACiAgIH0KIAogICBpZiAoKm91dGxlbiA8IGtleV9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2RlY3J5cHQsIEVWUF9SX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMzMzLDcgKzMzMyw3IEBACiAgIH0KIAogICBpZiAocGFkZGluZyA9PSBSU0FfTk9fUEFERElORykgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgY2hlY2tfcGFkZGluZ19tZCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTM2MSw4ICszNjEsNyBAQAogICAgICAgICAgICAwID09IChjdHgtPm9wZXJhdGlvbiAmIChFVlBfUEtFWV9PUF9TSUdOIHwgRVZQX1BLRVlfT1BfVkVSSUZZKSkpIHx8CiAgICAgICAgICAgKHAxID09IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcgJiYKICAgICAgICAgICAgMCA9PSAoY3R4LT5vcGVyYXRpb24gJiBFVlBfUEtFWV9PUF9UWVBFX0NSWVBUKSkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBwa2V5X3JzYV9jdHJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUl9JTExFR0FMX09SX1VOU1VQUE9SVEVEX1BBRERJTkdfTU9ERSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIGlmICgocDEgPT0gUlNBX1BLQ1MxX1BTU19QQURESU5HIHx8IHAxID09IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpICYmCkBAIC0zNzksNyArMzc4LDcgQEAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX1BTU19TQUxUTEVOOgogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9HRVRfUlNBX1BTU19TQUxUTEVOOgogICAgICAgaWYgKHJjdHgtPnBhZF9tb2RlICE9IFJTQV9QS0NTMV9QU1NfUEFERElORykgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHBrZXlfcnNhX2N0cmwsIEVWUF9SX0lOVkFMSURfUFNTX1NBTFRMRU4pOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUFNTX1NBTFRMRU4pOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIGlmICh0eXBlID09IEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9QU1NfU0FMVExFTikgewpAQCAtMzk0LDcgKzM5Myw3IEBACiAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX0tFWUdFTl9CSVRTOgogICAgICAgaWYgKHAxIDwgMjU2KSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9LRVlCSVRTKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX0tFWUJJVFMpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIHJjdHgtPm5iaXRzID0gcDE7CkBAIC00MTEsNyArNDEwLDcgQEAKICAgICBjYXNlIEVWUF9QS0VZX0NUUkxfUlNBX09BRVBfTUQ6CiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9NRDoKICAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBpZiAodHlwZSA9PSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9NRCkgewpAQCAtNDM2LDcgKzQzNSw3IEBACiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfTUdGMV9NRDoKICAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfUFNTX1BBRERJTkcgJiYKICAgICAgICAgICByY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9NR0YxX01EKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9JTlZBTElEX01HRjFfTUQpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICAgIGlmICh0eXBlID09IEVWUF9QS0VZX0NUUkxfR0VUX1JTQV9NR0YxX01EKSB7CkBAIC00NTIsNyArNDUxLDcgQEAKIAogICAgIGNhc2UgRVZQX1BLRVlfQ1RSTF9SU0FfT0FFUF9MQUJFTDoKICAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBPUEVOU1NMX2ZyZWUocmN0eC0+b2FlcF9sYWJlbCk7CkBAIC00NjksMTcgKzQ2OCwxNCBAQAogCiAgICAgY2FzZSBFVlBfUEtFWV9DVFJMX0dFVF9SU0FfT0FFUF9MQUJFTDoKICAgICAgIGlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfT0FFUF9QQURESU5HKSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0lOVkFMSURfUEFERElOR19NT0RFKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAgICAgICBDQlNfaW5pdCgoQ0JTICopcDIsIHJjdHgtPm9hZXBfbGFiZWwsIHJjdHgtPm9hZXBfbGFiZWxsZW4pOwogICAgICAgcmV0dXJuIDE7CiAKLSAgICBjYXNlIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVDoKLSAgICAgIHJldHVybiAxOwotCiAgICAgZGVmYXVsdDoKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcGtleV9yc2FfY3RybCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKICAgICAgIHJldHVybiAwOwogICB9CiB9CkBAIC01MDksMTQgKzUwNSwxMyBAQAogfQogCiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgcnNhX3BrZXlfbWV0aCA9IHsKLSAgICBFVlBfUEtFWV9SU0EsICAgICAgICAgICAwIC8qIGZsYWdzICovLCAgICAgICAgcGtleV9yc2FfaW5pdCwKLSAgICBwa2V5X3JzYV9jb3B5LCAgICAgICAgICBwa2V5X3JzYV9jbGVhbnVwLCAgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAotICAgIDAgLyogcGFyYW1nZW4gKi8sICAgICAgIDAgLyoga2V5Z2VuX2luaXQgKi8sICBwa2V5X3JzYV9rZXlnZW4sCi0gICAgMCAvKiBzaWduX2luaXQgKi8sICAgICAgcGtleV9yc2Ffc2lnbiwgICAgICAgIDAgLyogdmVyaWZ5X2luaXQgKi8sCi0gICAgcGtleV9yc2FfdmVyaWZ5LCAgICAgICAgMCAvKiBzaWduY3R4X2luaXQgKi8sIDAgLyogc2lnbmN0eCAqLywKLSAgICAwIC8qIHZlcmlmeWN0eF9pbml0ICovLCAwIC8qIHZlcmlmeWN0eCAqLywgICAgMCAvKiBlbmNyeXB0X2luaXQgKi8sCi0gICAgcGtleV9yc2FfZW5jcnlwdCwgICAgICAgMCAvKiBkZWNyeXB0X2luaXQgKi8sIHBrZXlfcnNhX2RlY3J5cHQsCi0gICAgMCAvKiBkZXJpdmVfaW5pdCAqLywgICAgMCAvKiBkZXJpdmUgKi8sICAgICAgIHBrZXlfcnNhX2N0cmwsCisgICAgRVZQX1BLRVlfUlNBLCAgICAgICAgIDAgLyogZmxhZ3MgKi8sICAgICAgICBwa2V5X3JzYV9pbml0LAorICAgIHBrZXlfcnNhX2NvcHksICAgICAgICBwa2V5X3JzYV9jbGVhbnVwLCAgICAgMCAvKiBwYXJhbWdlbl9pbml0ICovLAorICAgIDAgLyogcGFyYW1nZW4gKi8sICAgICAwIC8qIGtleWdlbl9pbml0ICovLCAgcGtleV9yc2Ffa2V5Z2VuLAorICAgIDAgLyogc2lnbl9pbml0ICovLCAgICBwa2V5X3JzYV9zaWduLCAgICAgICAgMCAvKiB2ZXJpZnlfaW5pdCAqLywKKyAgICBwa2V5X3JzYV92ZXJpZnksICAgICAgMCAvKiBlbmNyeXB0X2luaXQgKi8sIHBrZXlfcnNhX2VuY3J5cHQsCisgICAgMCAvKiBkZWNyeXB0X2luaXQgKi8sIHBrZXlfcnNhX2RlY3J5cHQsICAgICAwIC8qIGRlcml2ZV9pbml0ICovLAorICAgIDAgLyogZGVyaXZlICovLCAgICAgICBwa2V5X3JzYV9jdHJsLAogfTsKIAogaW50IEVWUF9QS0VZX0NUWF9zZXRfcnNhX3BhZGRpbmcoRVZQX1BLRVlfQ1RYICpjdHgsIGludCBwYWRkaW5nKSB7CkBAIC01OTMsNyArNTg4LDcgQEAKICAgICByZXR1cm4gLTE7CiAgIH0KICAgaWYgKENCU19sZW4oJmxhYmVsKSA+IElOVF9NQVgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9QS0VZX0NUWF9nZXQwX3JzYV9vYWVwX2xhYmVsLCBFUlJfUl9PVkVSRkxPVyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9PVkVSRkxPVyk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAgICpvdXRfbGFiZWwgPSBDQlNfZGF0YSgmbGFiZWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9ldnAvcF9yc2FfYXNuMS5jIGIvc3JjL2NyeXB0by9ldnAvcF9yc2FfYXNuMS5jCmluZGV4IDFlMmQzZjYuLmY2MDYyNWIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXZwL3BfcnNhX2FzbjEuYworKysgYi9zcmMvY3J5cHRvL2V2cC9wX3JzYV9hc24xLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J5dGVzdHJpbmcuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2RpZ2VzdC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZW0uaD4KQEAgLTY5LDE2ICs3MCwxNCBAQAogCiAKIHN0YXRpYyBpbnQgcnNhX3B1Yl9lbmNvZGUoWDUwOV9QVUJLRVkgKnBrLCBjb25zdCBFVlBfUEtFWSAqcGtleSkgewotICB1aW50OF90ICplbmNvZGVkID0gTlVMTDsKLSAgaW50IGxlbjsKLSAgbGVuID0gaTJkX1JTQVB1YmxpY0tleShwa2V5LT5wa2V5LnJzYSwgJmVuY29kZWQpOwotCi0gIGlmIChsZW4gPD0gMCkgeworICB1aW50OF90ICplbmNvZGVkOworICBzaXplX3QgZW5jb2RlZF9sZW47CisgIGlmICghUlNBX3B1YmxpY19rZXlfdG9fYnl0ZXMoJmVuY29kZWQsICZlbmNvZGVkX2xlbiwgcGtleS0+cGtleS5yc2EpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoIVg1MDlfUFVCS0VZX3NldDBfcGFyYW0ocGssIE9CSl9uaWQyb2JqKEVWUF9QS0VZX1JTQSksIFZfQVNOMV9OVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCwgbGVuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZCwgZW5jb2RlZF9sZW4pKSB7CiAgICAgT1BFTlNTTF9mcmVlKGVuY29kZWQpOwogICAgIHJldHVybiAwOwogICB9CkBAIC04OSwxNiArODgsMjUgQEAKIHN0YXRpYyBpbnQgcnNhX3B1Yl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFg1MDlfUFVCS0VZICpwdWJrZXkpIHsKICAgY29uc3QgdWludDhfdCAqcDsKICAgaW50IHBrbGVuOwotICBSU0EgKnJzYTsKLQogICBpZiAoIVg1MDlfUFVCS0VZX2dldDBfcGFyYW0oTlVMTCwgJnAsICZwa2xlbiwgTlVMTCwgcHVia2V5KSkgewogICAgIHJldHVybiAwOwogICB9Ci0gIHJzYSA9IGQyaV9SU0FQdWJsaWNLZXkoTlVMTCwgJnAsIHBrbGVuKTsKLSAgaWYgKHJzYSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHViX2RlY29kZSwgRVJSX1JfUlNBX0xJQik7CisKKyAgLyogRXN0b25pYW4gSURzIGlzc3VlZCBiZXR3ZWVuIFNlcHRlbWJlciAyMDE0IHRvIFNlcHRlbWJlciAyMDE1IGFyZQorICAgKiBicm9rZW4uIFNlZSBodHRwczovL2NyYnVnLmNvbS81MzIwNDggYW5kIGh0dHBzOi8vY3JidWcuY29tLzUzNDc2Ni4KKyAgICoKKyAgICogVE9ETyhkYXZpZGJlbik6IFN3aXRjaCB0aGlzIHRvIHRoZSBzdHJpY3QgdmVyc2lvbiBpbiBNYXJjaCAyMDE2IG9yIHdoZW4KKyAgICogQ2hyb21pdW0gY2FuIGZvcmNlIGNsaWVudCBjZXJ0aWZpY2F0ZXMgZG93biBhIGRpZmZlcmVudCBjb2RlcGF0aCwgd2hpY2hldmVyCisgICAqIGNvbWVzIGZpcnN0LiAqLworICBDQlMgY2JzOworICBDQlNfaW5pdCgmY2JzLCBwLCBwa2xlbik7CisgIFJTQSAqcnNhID0gUlNBX3BhcnNlX3B1YmxpY19rZXlfYnVnZ3koJmNicyk7CisgIGlmIChyc2EgPT0gTlVMTCB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisgICAgUlNBX2ZyZWUocnNhKTsKICAgICByZXR1cm4gMDsKICAgfQorCiAgIEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwgcnNhKTsKICAgcmV0dXJuIDE7CiB9CkBAIC0xMDksMjAgKzExNywxNyBAQAogfQogCiBzdGF0aWMgaW50IHJzYV9wcml2X2VuY29kZShQS0NTOF9QUklWX0tFWV9JTkZPICpwOCwgY29uc3QgRVZQX1BLRVkgKnBrZXkpIHsKLSAgdWludDhfdCAqcmsgPSBOVUxMOwotICBpbnQgcmtsZW47Ci0KLSAgcmtsZW4gPSBpMmRfUlNBUHJpdmF0ZUtleShwa2V5LT5wa2V5LnJzYSwgJnJrKTsKLQotICBpZiAocmtsZW4gPD0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3ByaXZfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIHVpbnQ4X3QgKmVuY29kZWQ7CisgIHNpemVfdCBlbmNvZGVkX2xlbjsKKyAgaWYgKCFSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXMoJmVuY29kZWQsICZlbmNvZGVkX2xlbiwgcGtleS0+cGtleS5yc2EpKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBUT0RPKGZvcmspOiBjb25zdCBjb3JyZWN0bmVzcyBpbiBuZXh0IGxpbmUuICovCiAgIGlmICghUEtDUzhfcGtleV9zZXQwKHA4LCAoQVNOMV9PQkpFQ1QgKilPQkpfbmlkMm9iaihOSURfcnNhRW5jcnlwdGlvbiksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIFZfQVNOMV9OVUxMLCBOVUxMLCByaywgcmtsZW4pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHJpdl9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgVl9BU04xX05VTEwsIE5VTEwsIGVuY29kZWQsIGVuY29kZWRfbGVuKSkgeworICAgIE9QRU5TU0xfZnJlZShlbmNvZGVkKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMzIsMTYgKzEzNywxNCBAQAogc3RhdGljIGludCByc2FfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KSB7CiAgIGNvbnN0IHVpbnQ4X3QgKnA7CiAgIGludCBwa2xlbjsKLSAgUlNBICpyc2E7Ci0KICAgaWYgKCFQS0NTOF9wa2V5X2dldDAoTlVMTCwgJnAsICZwa2xlbiwgTlVMTCwgcDgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHJpdl9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIHJzYSA9IGQyaV9SU0FQcml2YXRlS2V5KE5VTEwsICZwLCBwa2xlbik7CisgIFJTQSAqcnNhID0gUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMocCwgcGtsZW4pOwogICBpZiAocnNhID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wcml2X2RlY29kZSwgRVJSX1JfUlNBX0xJQik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFUlJfUl9SU0FfTElCKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xOTgsMTEgKzIwMSwyNCBAQAogICAgIHVwZGF0ZV9idWZsZW4ocnNhLT5kbXAxLCAmYnVmX2xlbik7CiAgICAgdXBkYXRlX2J1Zmxlbihyc2EtPmRtcTEsICZidWZfbGVuKTsKICAgICB1cGRhdGVfYnVmbGVuKHJzYS0+aXFtcCwgJmJ1Zl9sZW4pOworCisgICAgaWYgKHJzYS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCkgeworICAgICAgc2l6ZV90IGk7CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyk7CisgICAgICAgICAgIGkrKykgeworICAgICAgICBjb25zdCBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQorICAgICAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUocnNhLT5hZGRpdGlvbmFsX3ByaW1lcywgaSk7CisgICAgICAgIHVwZGF0ZV9idWZsZW4oYXAtPnByaW1lLCAmYnVmX2xlbik7CisgICAgICAgIHVwZGF0ZV9idWZsZW4oYXAtPmV4cCwgJmJ1Zl9sZW4pOworICAgICAgICB1cGRhdGVfYnVmbGVuKGFwLT5jb2VmZiwgJmJ1Zl9sZW4pOworICAgICAgfQorICAgIH0KICAgfQogCiAgIG0gPSAodWludDhfdCAqKU9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4gKyAxMCk7CiAgIGlmIChtID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIGRvX3JzYV9wcmludCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTI0MSw2ICsyNTcsMjggQEAKICAgICAgICAgIUFTTjFfYm5fcHJpbnQob3V0LCAiY29lZmZpY2llbnQ6IiwgcnNhLT5pcW1wLCBtLCBvZmYpKSB7CiAgICAgICBnb3RvIGVycjsKICAgICB9CisKKyAgICBpZiAocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyAhPSBOVUxMICYmCisgICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX251bShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzKSA+IDApIHsKKyAgICAgIHNpemVfdCBpOworCisgICAgICBpZiAoQklPX3ByaW50ZihvdXQsICJvdGhlclByaW1lSW5mb3M6XG4iKSA8PSAwKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX251bShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzKTsKKyAgICAgICAgICAgaSsrKSB7CisgICAgICAgIGNvbnN0IFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9CisgICAgICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzLCBpKTsKKworICAgICAgICBpZiAoQklPX3ByaW50ZihvdXQsICJvdGhlclByaW1lSW5mbyAocHJpbWUgJXUpOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShpICsgMykpIDw9IDAgfHwKKyAgICAgICAgICAgICFBU04xX2JuX3ByaW50KG91dCwgInByaW1lOiIsIGFwLT5wcmltZSwgbSwgb2ZmKSB8fAorICAgICAgICAgICAgIUFTTjFfYm5fcHJpbnQob3V0LCAiZXhwb25lbnQ6IiwgYXAtPmV4cCwgbSwgb2ZmKSB8fAorICAgICAgICAgICAgIUFTTjFfYm5fcHJpbnQob3V0LCAiY29lZmY6IiwgYXAtPmNvZWZmLCBtLCBvZmYpKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAgIH0KICAgcmV0ID0gMTsKIApAQCAtNDA3LDE4ICs0NDUsMTggQEAKICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgb2xkX3JzYV9wcml2X2RlY29kZShFVlBfUEtFWSAqcGtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsCitzdGF0aWMgaW50IG9sZF9yc2FfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIGNvbnN0IHVpbnQ4X3QgKipwZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXJsZW4pIHsKICAgUlNBICpyc2EgPSBkMmlfUlNBUHJpdmF0ZUtleShOVUxMLCBwZGVyLCBkZXJsZW4pOwogICBpZiAocnNhID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIG9sZF9yc2FfcHJpdl9kZWNvZGUsIEVSUl9SX1JTQV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVJSX1JfUlNBX0xJQik7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCByc2EpOwogICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBvbGRfcnNhX3ByaXZfZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcikgeworc3RhdGljIGludCBvbGRfcnNhX3ByaXZfZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1aW50OF90ICoqcGRlcikgewogICByZXR1cm4gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsIHBkZXIpOwogfQogCkBAIC00NzQsNyArNTEyLDcgQEAKICAgfQogICBtZCA9IEVWUF9nZXRfZGlnZXN0YnlvYmooYWxnLT5hbGdvcml0aG0pOwogICBpZiAobWQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX2FsZ29yX3RvX21kLCBFVlBfUl9VTktOT1dOX0RJR0VTVCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTktOT1dOX0RJR0VTVCk7CiAgIH0KICAgcmV0dXJuIG1kOwogfQpAQCAtNDg3LDE2ICs1MjUsMTYgQEAKICAgfQogICAvKiBDaGVjayBtYXNrIGFuZCBsb29rdXAgbWFzayBoYXNoIGFsZ29yaXRobSAqLwogICBpZiAoT0JKX29iajJuaWQoYWxnLT5hbGdvcml0aG0pICE9IE5JRF9tZ2YxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfbWdmMV90b19tZCwgRVZQX1JfVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfTUFTS19BTEdPUklUSE0pOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIGlmICghbWFza0hhc2gpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9tZ2YxX3RvX21kLCBFVlBfUl9VTlNVUFBPUlRFRF9NQVNLX1BBUkFNRVRFUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCBFVlBfUl9VTlNVUFBPUlRFRF9NQVNLX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKG1hc2tIYXNoLT5hbGdvcml0aG0pOwogICBpZiAobWQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX21nZjFfdG9fbWQsIEVWUF9SX1VOS05PV05fTUFTS19ESUdFU1QpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5LTk9XTl9NQVNLX0RJR0VTVCk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcmV0dXJuIG1kOwpAQCAtNTc2LDEzICs2MTQsMTMgQEAKIAogICAvKiBTYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSBpdCBpcyBQU1MgKi8KICAgaWYgKE9CSl9vYmoybmlkKHNpZ2FsZy0+YWxnb3JpdGhtKSAhPSBOSURfcnNhc3NhUHNzKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfcHNzX3RvX2N0eCwgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfVU5TVVBQT1JURURfU0lHTkFUVVJFX1RZUEUpOwogICAgIHJldHVybiAwOwogICB9CiAgIC8qIERlY29kZSBQU1MgcGFyYW1ldGVycyAqLwogICBwc3MgPSByc2FfcHNzX2RlY29kZShzaWdhbGcsICZtYXNrSGFzaCk7CiAgIGlmIChwc3MgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgcnNhX3Bzc190b19jdHgsIEVWUF9SX0lOVkFMSURfUFNTX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9QU1NfUEFSQU1FVEVSUyk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNjAyLDcgKzY0MCw3IEBACiAgICAgLyogQ291bGQgcGVyZm9ybSBtb3JlIHNhbHQgbGVuZ3RoIHNhbml0eSBjaGVja3MgYnV0IHRoZSBtYWluCiAgICAgICogUlNBIHJvdXRpbmVzIHdpbGwgdHJhcCBvdGhlciBpbnZhbGlkIHZhbHVlcyBhbnl3YXkuICovCiAgICAgaWYgKHNhbHRsZW4gPCAwKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wc3NfdG9fY3R4LCBFVlBfUl9JTlZBTElEX1NBTFRfTEVOR1RIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9TQUxUX0xFTkdUSCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgIH0KQEAgLTYxMCw3ICs2NDgsNyBAQAogICAvKiBsb3ctbGV2ZWwgcm91dGluZXMgc3VwcG9ydCBvbmx5IHRyYWlsZXIgZmllbGQgMHhiYyAodmFsdWUgMSkKICAgICogYW5kIFBLQ1MjMSBzYXlzIHdlIHNob3VsZCByZWplY3QgYW55IG90aGVyIHZhbHVlIGFueXdheS4gKi8KICAgaWYgKHBzcy0+dHJhaWxlckZpZWxkICYmIEFTTjFfSU5URUdFUl9nZXQocHNzLT50cmFpbGVyRmllbGQpICE9IDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIHJzYV9wc3NfdG9fY3R4LCBFVlBfUl9JTlZBTElEX1RSQUlMRVIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKEVWUCwgRVZQX1JfSU5WQUxJRF9UUkFJTEVSKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC02MzgsOCArNjc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfUEtFWSAqcGtleSkgewogICAvKiBTYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSBpdCBpcyBQU1MgKi8KICAgaWYgKE9CSl9vYmoybmlkKHNpZ2FsZy0+YWxnb3JpdGhtKSAhPSBOSURfcnNhc3NhUHNzKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoRVZQLCByc2FfZGlnZXN0X3ZlcmlmeV9pbml0X2Zyb21fYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICAgICAgIEVWUF9SX1VOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihFVlAsIEVWUF9SX1VOU1VQUE9SVEVEX1NJR05BVFVSRV9UWVBFKTsKICAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gcnNhX3Bzc190b19jdHgoY3R4LCBzaWdhbGcsIHBrZXkpOwpAQCAtNjcxLDcgKzcwOCw2IEBACiAgIEFTTjFfUEtFWV9TSUdQQVJBTV9OVUxMLAogCiAgICJSU0EiLAotICAiT3BlblNTTCBSU0EgbWV0aG9kIiwKIAogICByc2FfcHViX2RlY29kZSwKICAgcnNhX3B1Yl9lbmNvZGUsCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2V4X2RhdGEuYyBiL3NyYy9jcnlwdG8vZXhfZGF0YS5jCmluZGV4IDEwZmVmYzguLmY1NjJmMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vZXhfZGF0YS5jCisrKyBiL3NyYy9jcnlwdG8vZXhfZGF0YS5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogICBmdW5jcyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihDUllQVE9fRVhfREFUQV9GVU5DUykpOwogICBpZiAoZnVuY3MgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xNTYsMTIgKzE1NiwxMyBAQAogCiAgIGlmIChleF9kYXRhX2NsYXNzLT5tZXRoID09IE5VTEwgfHwKICAgICAgICFza19DUllQVE9fRVhfREFUQV9GVU5DU19wdXNoKGV4X2RhdGFfY2xhc3MtPm1ldGgsIGZ1bmNzKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBPUEVOU1NMX2ZyZWUoZnVuY3MpOwogICAgIGdvdG8gZXJyOwogICB9CiAKLSAgKm91dF9pbmRleCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShleF9kYXRhX2NsYXNzLT5tZXRoKSAtIDE7CisgICpvdXRfaW5kZXggPSBza19DUllQVE9fRVhfREFUQV9GVU5DU19udW0oZXhfZGF0YV9jbGFzcy0+bWV0aCkgLSAxICsKKyAgICAgICAgICAgICAgIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZDsKICAgcmV0ID0gMTsKIAogZXJyOgpAQCAtMTc1LDcgKzE3Niw3IEBACiAgIGlmIChhZC0+c2sgPT0gTlVMTCkgewogICAgIGFkLT5zayA9IHNrX3ZvaWRfbmV3X251bGwoKTsKICAgICBpZiAoYWQtPnNrID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX3NldF9leF9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQpAQCAtMTg1LDcgKzE4Niw3IEBACiAgIC8qIEFkZCBOVUxMIHZhbHVlcyB1bnRpbCB0aGUgc3RhY2sgaXMgbG9uZyBlbm91Z2guICovCiAgIGZvciAoaSA9IG47IGkgPD0gaW5kZXg7IGkrKykgewogICAgIGlmICghc2tfdm9pZF9wdXNoKGFkLT5zaywgTlVMTCkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgQ1JZUFRPX3NldF9leF9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihDUllQVE8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KICAgfQpAQCAtMjIyLDcgKzIyMyw3IEBACiAgIENSWVBUT19TVEFUSUNfTVVURVhfdW5sb2NrKCZleF9kYXRhX2NsYXNzLT5sb2NrKTsKIAogICBpZiAobiA+IDAgJiYgKm91dCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoQ1JZUFRPLCBnZXRfZnVuY19wb2ludGVycywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKENSWVBUTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI0NCw4ICsyNDUsOCBAQAogICAgIENSWVBUT19FWF9EQVRBX0ZVTkNTICpmdW5jX3BvaW50ZXIgPQogICAgICAgICBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShmdW5jX3BvaW50ZXJzLCBpKTsKICAgICBpZiAoZnVuY19wb2ludGVyLT5uZXdfZnVuYykgewotICAgICAgZnVuY19wb2ludGVyLT5uZXdfZnVuYyhvYmosIE5VTEwsIGFkLCBpLCBmdW5jX3BvaW50ZXItPmFyZ2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJncCk7CisgICAgICBmdW5jX3BvaW50ZXItPm5ld19mdW5jKG9iaiwgTlVMTCwgYWQsIGkgKyBleF9kYXRhX2NsYXNzLT5udW1fcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJnbCwgZnVuY19wb2ludGVyLT5hcmdwKTsKICAgICB9CiAgIH0KIApAQCAtMjcyLDEyICsyNzMsMTIgQEAKICAgZm9yIChpID0gMDsgaSA8IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShmdW5jX3BvaW50ZXJzKTsgaSsrKSB7CiAgICAgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmZ1bmNfcG9pbnRlciA9CiAgICAgICAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3ZhbHVlKGZ1bmNfcG9pbnRlcnMsIGkpOwotICAgIHZvaWQgKnB0ciA9IENSWVBUT19nZXRfZXhfZGF0YShmcm9tLCBpKTsKKyAgICB2b2lkICpwdHIgPSBDUllQVE9fZ2V0X2V4X2RhdGEoZnJvbSwgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCk7CiAgICAgaWYgKGZ1bmNfcG9pbnRlci0+ZHVwX2Z1bmMpIHsKLSAgICAgIGZ1bmNfcG9pbnRlci0+ZHVwX2Z1bmModG8sIGZyb20sICZwdHIsIGksIGZ1bmNfcG9pbnRlci0+YXJnbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY19wb2ludGVyLT5hcmdwKTsKKyAgICAgIGZ1bmNfcG9pbnRlci0+ZHVwX2Z1bmModG8sIGZyb20sICZwdHIsIGkgKyBleF9kYXRhX2NsYXNzLT5udW1fcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJnbCwgZnVuY19wb2ludGVyLT5hcmdwKTsKICAgICB9Ci0gICAgQ1JZUFRPX3NldF9leF9kYXRhKHRvLCBpLCBwdHIpOworICAgIENSWVBUT19zZXRfZXhfZGF0YSh0bywgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCwgcHRyKTsKICAgfQogCiAgIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2ZyZWUoZnVuY19wb2ludGVycyk7CkBAIC0yOTgsOSArMjk5LDkgQEAKICAgICBDUllQVE9fRVhfREFUQV9GVU5DUyAqZnVuY19wb2ludGVyID0KICAgICAgICAgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfdmFsdWUoZnVuY19wb2ludGVycywgaSk7CiAgICAgaWYgKGZ1bmNfcG9pbnRlci0+ZnJlZV9mdW5jKSB7Ci0gICAgICB2b2lkICpwdHIgPSBDUllQVE9fZ2V0X2V4X2RhdGEoYWQsIGkpOwotICAgICAgZnVuY19wb2ludGVyLT5mcmVlX2Z1bmMob2JqLCBwdHIsIGFkLCBpLCBmdW5jX3BvaW50ZXItPmFyZ2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX3BvaW50ZXItPmFyZ3ApOworICAgICAgdm9pZCAqcHRyID0gQ1JZUFRPX2dldF9leF9kYXRhKGFkLCBpICsgZXhfZGF0YV9jbGFzcy0+bnVtX3Jlc2VydmVkKTsKKyAgICAgIGZ1bmNfcG9pbnRlci0+ZnJlZV9mdW5jKG9iaiwgcHRyLCBhZCwgaSArIGV4X2RhdGFfY2xhc3MtPm51bV9yZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfcG9pbnRlci0+YXJnbCwgZnVuY19wb2ludGVyLT5hcmdwKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9oa2RmL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9oa2RmL0NNYWtlTGlzdHMudHh0CmluZGV4IDY2ZDY4MGEuLjUzYmY1NTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vaGtkZi9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2hrZGYvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogYWRkX2xpYnJhcnkoCiAgIGhrZGYKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vaGtkZi9oa2RmLmMgYi9zcmMvY3J5cHRvL2hrZGYvaGtkZi5jCmluZGV4IGJiN2Y1YTQuLmY5Y2RjYjAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vaGtkZi9oa2RmLmMKKysrIGIvc3JjL2NyeXB0by9oa2RmL2hrZGYuYwpAQCAtNDAsNyArNDAsNyBAQAogICAvKiBFeHBhbmQga2V5IG1hdGVyaWFsIHRvIGRlc2lyZWQgbGVuZ3RoLiAqLwogICBuID0gKG91dF9sZW4gKyBkaWdlc3RfbGVuIC0gMSkgLyBkaWdlc3RfbGVuOwogICBpZiAob3V0X2xlbiArIGRpZ2VzdF9sZW4gPCBvdXRfbGVuIHx8IG4gPiAyNTUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihIS0RGLCBIS0RGLCBIS0RGX1JfT1VUUFVUX1RPT19MQVJHRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoSEtERiwgSEtERl9SX09VVFBVVF9UT09fTEFSR0UpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTgzLDcgKzgzLDcgQEAKIG91dDoKICAgSE1BQ19DVFhfY2xlYW51cCgmaG1hYyk7CiAgIGlmIChyZXQgIT0gMSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKEhLREYsIEhLREYsIEVSUl9SX0hNQUNfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihIS0RGLCBFUlJfUl9ITUFDX0xJQik7CiAgIH0KICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vaG1hYy9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vaG1hYy9DTWFrZUxpc3RzLnR4dAppbmRleCAxMWQyNjdmLi4zOTJjZTAxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2htYWMvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9obWFjL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBobWFjCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL2htYWMvaG1hYy5jIGIvc3JjL2NyeXB0by9obWFjL2htYWMuYwppbmRleCA1NTZlN2Y5Li5kMzdhMjQ5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2htYWMvaG1hYy5jCisrKyBiL3NyYy9jcnlwdG8vaG1hYy9obWFjLmMKQEAgLTk3LDcgKzk3LDcgQEAKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPmlfY3R4KTsKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPm9fY3R4KTsKICAgRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPm1kX2N0eCk7Ci0gIE9QRU5TU0xfY2xlYW5zZShjdHgsIHNpemVvZihjdHgpKTsKKyAgT1BFTlNTTF9jbGVhbnNlKGN0eCwgc2l6ZW9mKEhNQUNfQ1RYKSk7CiB9CiAKIGludCBITUFDX0luaXRfZXgoSE1BQ19DVFggKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBzaXplX3Qga2V5X2xlbiwKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vaG1hYy9obWFjX3Rlc3RzLnR4dCBiL3NyYy9jcnlwdG8vaG1hYy9obWFjX3Rlc3RzLnR4dAppbmRleCAwMTJmNTkzLi41M2YzZjhmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL2htYWMvaG1hY190ZXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9obWFjL2htYWNfdGVzdHMudHh0CkBAIC0xLDYgKzEsMyBAQAotIyBUaGlzIHRlc3QgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbiBldnBfdGVzdCBhbmQgaG1hY190ZXN0LCB0byB0ZXN0IHRoZSBsZWdhY3kKLSMgRVZQX1BLRVlfSE1BQyBBUEkuCi0KIEhNQUMgPSBNRDUKICMgTm90ZTogVGhlIGVtcHR5IGtleSByZXN1bHRzIGluIHBhc3NpbmcgTlVMTCB0byBITUFDX0luaXRfZXgsIHNvIHRoaXMgdGVzdHMKICMgdGhhdCBITUFDX0NUWCBhbmQgSE1BQyB0cmVhdCBOVUxMIGFzIHRoZSBlbXB0eSBrZXkgaW5pdGlhbGx5LgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9pbnRlcm5hbC5oCmluZGV4IDU5ZWRkZDAuLjcxMzY1OWQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL2ludGVybmFsLmgKQEAgLTQ1Miw2ICs0NTIsNyBAQAogdHlwZWRlZiBlbnVtIHsKICAgT1BFTlNTTF9USFJFQURfTE9DQUxfRVJSID0gMCwKICAgT1BFTlNTTF9USFJFQURfTE9DQUxfUkFORCwKKyAgT1BFTlNTTF9USFJFQURfTE9DQUxfVVJBTkRPTV9CVUYsCiAgIE9QRU5TU0xfVEhSRUFEX0xPQ0FMX1RFU1QsCiAgIE5VTV9PUEVOU1NMX1RIUkVBRF9MT0NBTFMsCiB9IHRocmVhZF9sb2NhbF9kYXRhX3Q7CkBAIC00OTMsOSArNDk0LDE0IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgIHN0cnVjdCBDUllQVE9fU1RBVElDX01VVEVYIGxvY2s7CiAgIFNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqbWV0aDsKKyAgLyogbnVtX3Jlc2VydmVkIGlzIG9uZSBpZiB0aGUgZXhfZGF0YSBpbmRleCB6ZXJvIGlzIHJlc2VydmVkIGZvciBsZWdhY3kKKyAgICogfFRZUEVfZ2V0X2FwcF9kYXRhfCBmdW5jdGlvbnMuICovCisgIHVpbnQ4X3QgbnVtX3Jlc2VydmVkOwogfSBDUllQVE9fRVhfREFUQV9DTEFTUzsKIAotI2RlZmluZSBDUllQVE9fRVhfREFUQV9DTEFTU19JTklUIHtDUllQVE9fU1RBVElDX01VVEVYX0lOSVQsIE5VTEx9CisjZGVmaW5lIENSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVQge0NSWVBUT19TVEFUSUNfTVVURVhfSU5JVCwgTlVMTCwgMH0KKyNkZWZpbmUgQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVF9XSVRIX0FQUF9EQVRBIFwKKyAgICB7Q1JZUFRPX1NUQVRJQ19NVVRFWF9JTklULCBOVUxMLCAxfQogCiAvKiBDUllQVE9fZ2V0X2V4X25ld19pbmRleCBhbGxvY2F0ZXMgYSBuZXcgaW5kZXggZm9yIHxleF9kYXRhX2NsYXNzfCBhbmQgd3JpdGVzCiAgKiBpdCB0byB8Km91dF9pbmRleHwuIEVhY2ggY2xhc3Mgb2Ygb2JqZWN0IHNob3VsZCBwcm92aWRlIGEgd3JhcHBlciBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9saGFzaC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vbGhhc2gvQ01ha2VMaXN0cy50eHQKaW5kZXggYzcxYjhhMS4uY2U3ODVlYiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9saGFzaC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL2xoYXNoL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBsaGFzaApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9saGFzaC9saGFzaC5jIGIvc3JjL2NyeXB0by9saGFzaC9saGFzaC5jCmluZGV4IGMyODJmYTguLjI1NzkwMGUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbGhhc2gvbGhhc2guYworKysgYi9zcmMvY3J5cHRvL2xoYXNoL2xoYXNoLmMKQEAgLTEsNCArMSw1IEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgogICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tZDQvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL21kNC9DTWFrZUxpc3RzLnR4dAppbmRleCBkYjdhMTg3Li41OTE0MGE3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21kNC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL21kNC9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgbWQ0CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21kNS9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vbWQ1L0NNYWtlTGlzdHMudHh0CmluZGV4IDZjNWU4MGYuLmEzN2M0N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbWQ1L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vbWQ1L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGlmICgke0FSQ0h9IFNUUkVRVUFMICJ4ODZfNjQiKQogICBzZXQoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21kNS9tZDUuYyBiL3NyYy9jcnlwdG8vbWQ1L21kNS5jCmluZGV4IDU1NzVlZmIuLjZhZDhkMTIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbWQ1L21kNS5jCisrKyBiL3NyYy9jcnlwdG8vbWQ1L21kNS5jCkBAIC0xLDQgKzEsNSBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KICAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbWVtLmMgYi9zcmMvY3J5cHRvL21lbS5jCmluZGV4IGNlNDE0NDAuLmVkZDE0YTggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbWVtLmMKKysrIGIvc3JjL2NyeXB0by9tZW0uYwpAQCAtMSw0ICsxLDUgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCiAgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21vZGVzL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9tb2Rlcy9DTWFrZUxpc3RzLnR4dAppbmRleCBmZmIyOWI2Li42ZGE1MjA3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21vZGVzL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8vbW9kZXMvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLWFybXY0LnBsIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gtYXJtdjQucGwKaW5kZXggMjVhNGUyNy4uZGM1Yjk5ZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gtYXJtdjQucGwKKysrIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gtYXJtdjQucGwKQEAgLTQ1LDcgKzQ1LDcgQEAKICMgcHJvY2Vzc2VzIG9uZSBieXRlIGluIDguNDUgY3ljbGVzLCBBOSAtIGluIDEwLjIsIEExNSAtIGluIDcuNjMsCiAjIFNuYXBkcmFnb24gUzQgLSBpbiA5LjMzLgogIwotIyBD4m1hcmEsIEQuOyBHb3V26mEsIEMuIFAuIEwuOyBM83BleiwgSi4gJiBEYWhhYiwgUi46IEZhc3QgU29mdHdhcmUKKyMgQ8OibWFyYSwgRC47IEdvdXbDqmEsIEMuIFAuIEwuOyBMw7NwZXosIEouICYgRGFoYWIsIFIuOiBGYXN0IFNvZnR3YXJlCiAjIFBvbHlub21pYWwgTXVsdGlwbGljYXRpb24gb24gQVJNIFByb2Nlc3NvcnMgdXNpbmcgdGhlIE5FT04gRW5naW5lLgogIyAKICMgaHR0cDovL2NvbnJhZG9wbGcuY3J5cHRvbGFuZC5uZXQvZmlsZXMvMjAxMC8xMi9tb2NyeXNlbjEzLnBkZgpAQCAtMTM0LDcgKzEzNCw3IEBACiAKICRjb2RlPTw8X19fOwogI2lmIGRlZmluZWQoX19hcm1fXykKLSNpbmNsdWRlICJhcm1fYXJjaC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KIAogLnN5bnRheCB1bmlmaWVkCiAKQEAgLTQ1NywxMiArNDU3LDEyIEBACiAJdmVvcgkJJElOLCRYbAkJCUAgaW5wXj1YaQogLkxnbXVsdF9uZW9uOgogX19fCi0JJmNsbXVsNjR4NjQJKCRYbCwkSGxvLCIkSU4jbG8iKTsJIyBILmxvt1hpLmxvCisJJmNsbXVsNjR4NjQJKCRYbCwkSGxvLCIkSU4jbG8iKTsJIyBILmxvwrdYaS5sbwogJGNvZGUuPTw8X19fOwogCXZlb3IJCSRJTiNsbywkSU4jbG8sJElOI2hpCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCiBfX18KLQkmY2xtdWw2NHg2NAkoJFhtLCRIaGwsIiRJTiNsbyIpOwkjIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKLQkmY2xtdWw2NHg2NAkoJFhoLCRIaGksIiRJTiNoaSIpOwkjIEguaGm3WGkuaGkKKwkmY2xtdWw2NHg2NAkoJFhtLCRIaGwsIiRJTiNsbyIpOwkjIChILmxvK0guaGkpwrcoWGkubG8rWGkuaGkpCisJJmNsbXVsNjR4NjQJKCRYaCwkSGhpLCIkSU4jaGkiKTsJIyBILmhpwrdYaS5oaQogJGNvZGUuPTw8X19fOwogCXZlb3IJCSRYbSwkWG0sJFhsCQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKIAl2ZW9yCQkkWG0sJFhtLCRYaApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2LnBsIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2LnBsCmluZGV4IDIzYTU1MjcuLjAyNjkxNjkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Ni5wbAorKysgYi9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODYucGwKQEAgLTM1OCw3ICszNTgsNyBAQAogIyBlZmZlY3RpdmUgYWRkcmVzcyBjYWxjdWxhdGlvbiBhbmQgZmluYWxseSBtZXJnZSBvZiB2YWx1ZSB0byBaLmhpLgogIyBSZWZlcmVuY2UgdG8gcmVtXzRiaXQgaXMgc2NoZWR1bGVkIHNvIGxhdGUgdGhhdCBJIGhhZCB0byA+PjQKICMgcmVtXzRiaXQgZWxlbWVudHMuIFRoaXMgcmVzdWx0ZWQgaW4gMjAtNDUlIHByb2NlbnQgaW1wcm92ZW1lbnQKLSMgb24gY29udGVtcG9yYXJ5ILUtYXJjaHMuCisjIG9uIGNvbnRlbXBvcmFyeSDCtS1hcmNocy4KIHsKICAgICBteSAkY250OwogICAgIG15ICRyZW1fNGJpdCA9ICJlYXgiOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2XzY0LnBsIGIvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2gteDg2XzY0LnBsCmluZGV4IDZlNjU2Y2EuLjVhN2NlMzkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNoLXg4Nl82NC5wbAorKysgYi9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaC14ODZfNjQucGwKQEAgLTU3NiwxNSArNTc2LDE1IEBACiAJIyBleHBlcmltZW50YWwgYWx0ZXJuYXRpdmUuIHNwZWNpYWwgdGhpbmcgYWJvdXQgaXMgdGhhdCB0aGVyZQogCSMgbm8gZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gbXVsdGlwbGljYXRpb25zLi4uIAogCW1vdgkJXCRgMHhFMTw8MWAsJWVheAotCW1vdgkJXCQweEEwNDA2MDgwMjBDMEUwMDAsJXIxMAkjICgoNy4uMCm3MHhFMCkmMHhmZgorCW1vdgkJXCQweEEwNDA2MDgwMjBDMEUwMDAsJXIxMAkjICgoNy4uMCnCtzB4RTApJjB4ZmYKIAltb3YJCVwkMHgwNywlcjExZAogCW1vdnEJCSVyYXgsJFQxCiAJbW92cQkJJXIxMCwkVDIKIAltb3ZxCQklcjExLCRUMwkJIyBib3Jyb3cgJFQzCiAJcGFuZAkJJFhpLCRUMwotCXBzaHVmYgkJJFQzLCRUMgkJCSMgKCRYaSY3KbcweEUwCisJcHNodWZiCQkkVDMsJFQyCQkJIyAoJFhpJjcpwrcweEUwCiAJbW92cQkJJXJheCwkVDMKLQlwY2xtdWxxZHEJXCQweDAwLCRYaSwkVDEJCSMgtygweEUxPDwxKQorCXBjbG11bHFkcQlcJDB4MDAsJFhpLCRUMQkJIyDCtygweEUxPDwxKQogCXB4b3IJCSRYaSwkVDIKIAlwc2xsZHEJCVwkMTUsJFQyCiAJcGFkZGQJCSRUMiwkVDIJCQkjIDw8KDY0KzU2KzEpCkBAIC02NTcsNyArNjU3LDcgQEAKIAlqZQkJLkxza2lwNHgKIAogCXN1YgkJXCQweDMwLCRsZW4KLQltb3YJCVwkMHhBMDQwNjA4MDIwQzBFMDAwLCVyYXgJIyAoKDcuLjAptzB4RTApJjB4ZmYKKwltb3YJCVwkMHhBMDQwNjA4MDIwQzBFMDAwLCVyYXgJIyAoKDcuLjApwrcweEUwKSYweGZmCiAJbW92ZHF1CQkweDMwKCRIdGJsKSwkSGtleTMKIAltb3ZkcXUJCTB4NDAoJEh0YmwpLCRIa2V5NAogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaHY4LWFybXgucGwgYi9zcmMvY3J5cHRvL21vZGVzL2FzbS9naGFzaHY4LWFybXgucGwKaW5kZXggNjg2OTUxZi4uM2E3YjhkOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tb2Rlcy9hc20vZ2hhc2h2OC1hcm14LnBsCisrKyBiL3NyYy9jcnlwdG8vbW9kZXMvYXNtL2doYXNodjgtYXJteC5wbApAQCAtNTQsNyArNTQsNyBAQAogbXkgKCR0MCwkdDEsJHQyLCR4QzIsJEgsJEhobCwkSDIpPW1hcCgicSRfIiwoOC4uMTQpKTsKIAogJGNvZGU9PDxfX187Ci0jaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAKIC50ZXh0CiBfX18KQEAgLTE0OCwxMCArMTQ4LDEwIEBACiAjZW5kaWYKIAl2ZXh0LjgJCSRJTiwkdDEsJHQxLCM4CiAKLQl2cG11bGwucDY0CSRYbCwkSCwkSU4JCUAgSC5sb7dYaS5sbworCXZwbXVsbC5wNjQJJFhsLCRILCRJTgkJQCBILmxvwrdYaS5sbwogCXZlb3IJCSR0MSwkdDEsJElOCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwotCXZwbXVsbDIucDY0CSRYaCwkSCwkSU4JCUAgSC5oabdYaS5oaQotCXZwbXVsbC5wNjQJJFhtLCRIaGwsJHQxCQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKKwl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGnCt1hpLmhpCisJdnBtdWxsLnA2NAkkWG0sJEhobCwkdDEJCUAgKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKIAogCXZleHQuOAkJJHQxLCRYbCwkWGgsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwogCXZlb3IJCSR0MiwkWGwsJFhoCkBAIC0yMzksNyArMjM5LDcgQEAKICNlbmRpZgogCXZleHQuOAkJJEluLCR0MSwkdDEsIzgKIAl2ZW9yCQkkSU4sJElOLCRYbAkJQCBJW2ldXj1YaQotCXZwbXVsbC5wNjQJJFhsbiwkSCwkSW4JCUAgSLdJaSsxCisJdnBtdWxsLnA2NAkkWGxuLCRILCRJbgkJQCBIwrdJaSsxCiAJdmVvcgkJJHQxLCR0MSwkSW4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCiAJdnBtdWxsMi5wNjQJJFhobiwkSCwkSW4KIAliCQkuTG9vcF9tb2QyeF92OApAQCAtMjQ4LDE0ICsyNDgsMTQgQEAKIC5Mb29wX21vZDJ4X3Y4OgogCXZleHQuOAkJJHQyLCRJTiwkSU4sIzgKIAlzdWJzCQkkbGVuLCRsZW4sIzMyCQlAIGlzIHRoZXJlIG1vcmUgZGF0YT8KLQl2cG11bGwucDY0CSRYbCwkSDIsJElOCQlAIEheMi5sb7dYaS5sbworCXZwbXVsbC5wNjQJJFhsLCRIMiwkSU4JCUAgSF4yLmxvwrdYaS5sbwogCWNjbHIJCSRpbmMsbG8JCQlAIGlzIGl0IHRpbWUgdG8gemVybyAkaW5jPwogCiAJIHZwbXVsbC5wNjQJJFhtbiwkSGhsLCR0MQogCXZlb3IJCSR0MiwkdDIsJElOCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwotCXZwbXVsbDIucDY0CSRYaCwkSDIsJElOCQlAIEheMi5oabdYaS5oaQorCXZwbXVsbDIucDY0CSRYaCwkSDIsJElOCQlAIEheMi5oacK3WGkuaGkKIAl2ZW9yCQkkWGwsJFhsLCRYbG4JCUAgYWNjdW11bGF0ZQotCXZwbXVsbDIucDY0CSRYbSwkSGhsLCR0MgkJQCAoSF4yLmxvK0heMi5oaSm3KFhpLmxvK1hpLmhpKQorCXZwbXVsbDIucDY0CSRYbSwkSGhsLCR0MgkJQCAoSF4yLmxvK0heMi5oaSnCtyhYaS5sbytYaS5oaSkKIAkgdmxkMS42NAl7JHQwfSxbJGlucF0sJGluYwlAIGxvYWQgW3JvdGF0ZWRdIElbaSsyXQogCiAJdmVvcgkJJFhoLCRYaCwkWGhuCkBAIC0yODAsNyArMjgwLDcgQEAKIAkgdmV4dC44CQkkSW4sJHQxLCR0MSwjOAogCSB2ZXh0LjgJCSRJTiwkdDAsJHQwLCM4CiAJdmVvcgkJJFhsLCRYbSwkdDIKLQkgdnBtdWxsLnA2NAkkWGxuLCRILCRJbgkJQCBIt0lpKzEKKwkgdnBtdWxsLnA2NAkkWGxuLCRILCRJbgkJQCBIwrdJaSsxCiAJdmVvcgkJJElOLCRJTiwkWGgJCUAgYWNjdW11bGF0ZSAkSU4gZWFybHkKIAogCXZleHQuOAkJJHQyLCRYbCwkWGwsIzgJCUAgMm5kIHBoYXNlIG9mIHJlZHVjdGlvbgpAQCAtMzA0LDEwICszMDQsMTAgQEAKIAl2ZW9yCQkkSU4sJElOLCRYbAkJQCBpbnBePVhpCiAJdmVvcgkJJHQxLCR0MCwkdDIJCUAgJHQxIGlzIHJvdGF0ZWQgaW5wXlhpCiAKLQl2cG11bGwucDY0CSRYbCwkSCwkSU4JCUAgSC5sb7dYaS5sbworCXZwbXVsbC5wNjQJJFhsLCRILCRJTgkJQCBILmxvwrdYaS5sbwogCXZlb3IJCSR0MSwkdDEsJElOCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwotCXZwbXVsbDIucDY0CSRYaCwkSCwkSU4JCUAgSC5oabdYaS5oaQotCXZwbXVsbC5wNjQJJFhtLCRIaGwsJHQxCQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKKwl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGnCt1hpLmhpCisJdnBtdWxsLnA2NAkkWG0sJEhobCwkdDEJCUAgKEgubG8rSC5oaSnCtyhYaS5sbytYaS5oaSkKIAogCXZleHQuOAkJJHQxLCRYbCwkWGgsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwogCXZlb3IJCSR0MiwkWGwsJFhoCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21vZGVzL2djbS5jIGIvc3JjL2NyeXB0by9tb2Rlcy9nY20uYwppbmRleCBiMWMxMGIzLi41OTNkY2U4IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL21vZGVzL2djbS5jCisrKyBiL3NyYy9jcnlwdG8vbW9kZXMvZ2NtLmMKQEAgLTM0OSwxMiArMzQ5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKICNlbmRpZgogI2VsaWYgZGVmaW5lZChPUEVOU1NMX0FSTSkgfHwgZGVmaW5lZChPUEVOU1NMX0FBUkNINjQpCi0jaW5jbHVkZSAiLi4vYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAjaWYgX19BUk1fQVJDSF9fID49IDcKICNkZWZpbmUgR0hBU0hfQVNNX0FSTQogI2RlZmluZSBHQ01fRlVOQ1JFRl80QklUCiAKLXN0YXRpYyBpbnQgcG11bGxfY2FwYWJsZSgpIHsKK3N0YXRpYyBpbnQgcG11bGxfY2FwYWJsZSh2b2lkKSB7CiAgIHJldHVybiAoT1BFTlNTTF9hcm1jYXBfUCAmIEFSTVY4X1BNVUxMKSAhPSAwOwogfQogCkBAIC0zNjUsNyArMzY1LDcgQEAKIAogI2lmIGRlZmluZWQoT1BFTlNTTF9BUk0pCiAvKiAzMi1iaXQgQVJNIGFsc28gaGFzIHN1cHBvcnQgZm9yIGRvaW5nIEdDTSB3aXRoIE5FT04gaW5zdHJ1Y3Rpb25zLiAqLwotc3RhdGljIGludCBuZW9uX2NhcGFibGUoKSB7CitzdGF0aWMgaW50IG5lb25fY2FwYWJsZSh2b2lkKSB7CiAgIHJldHVybiBDUllQVE9faXNfTkVPTl9jYXBhYmxlKCk7CiB9CiAKQEAgLTM3NSw3ICszNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKICNlbHNlCiAvKiBBQXJjaDY0IG9ubHkgaGFzIHRoZSBBUk12OCB2ZXJzaW9ucyBvZiBmdW5jdGlvbnMuICovCi1zdGF0aWMgaW50IG5lb25fY2FwYWJsZSgpIHsKK3N0YXRpYyBpbnQgbmVvbl9jYXBhYmxlKHZvaWQpIHsKICAgcmV0dXJuIDA7CiB9CiB2b2lkIGdjbV9pbml0X25lb24odTEyOCBIdGFibGVbMTZdLCBjb25zdCB1aW50NjRfdCBYaVsyXSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9tb2Rlcy9nY21fdGVzdC5jIGIvc3JjL2NyeXB0by9tb2Rlcy9nY21fdGVzdC5jCmluZGV4IGE4ODE5ZWEuLjg5ZWQ3OTIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vbW9kZXMvZ2NtX3Rlc3QuYworKysgYi9zcmMvY3J5cHRvL21vZGVzL2djbV90ZXN0LmMKQEAgLTU1LDYgKzU1LDcgQEAKICNpbmNsdWRlIDxvcGVuc3NsL21vZGVzLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIi4uL3Rlc3QvdGVzdF91dGlsLmgiCiAKIAogc3RydWN0IHRlc3RfY2FzZSB7CkBAIC0yOTgsMTcgKzI5OSw2IEBACiAgIHJldHVybiAwOwogfQogCi12b2lkIGhleGR1bXAoY29uc3QgY2hhciAqbXNnLCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGxlbikgewotICBjb25zdCB1aW50OF90ICpkYXRhID0gaW47Ci0gIHNpemVfdCBpOwotCi0gIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIG1zZyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGZwcmludGYoc3RkZXJyLCAiJTAyeCIsIGRhdGFbaV0pOwotICB9Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLX0KLQogc3RhdGljIGludCBydW5fdGVzdF9jYXNlKHVuc2lnbmVkIHRlc3RfbnVtLCBjb25zdCBzdHJ1Y3QgdGVzdF9jYXNlICp0ZXN0KSB7CiAgIHNpemVfdCBrZXlfbGVuLCBwbGFpbnRleHRfbGVuLCBhZGRpdGlvbmFsX2RhdGFfbGVuLCBub25jZV9sZW4sIGNpcGhlcnRleHRfbGVuLAogICAgICAgdGFnX2xlbjsKQEAgLTM2Nyw4ICszNTcsOCBAQAogICBpZiAoIUNSWVBUT19nY20xMjhfZmluaXNoKCZjdHgsIHRhZywgdGFnX2xlbikgfHwKICAgICAgIChjaXBoZXJ0ZXh0ICYmIG1lbWNtcChvdXQsIGNpcGhlcnRleHQsIHBsYWludGV4dF9sZW4pICE9IDApKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICIldTogZW5jcnlwdCBmYWlsZWQuXG4iLCB0ZXN0X251bSk7Ci0gICAgaGV4ZHVtcCgiZ290ICIsIG91dCwgcGxhaW50ZXh0X2xlbik7Ci0gICAgaGV4ZHVtcCgid2FudCIsIGNpcGhlcnRleHQsIHBsYWludGV4dF9sZW4pOworICAgIGhleGR1bXAoc3RkZXJyLCAiZ290IDoiLCBvdXQsIHBsYWludGV4dF9sZW4pOworICAgIGhleGR1bXAoc3RkZXJyLCAid2FudDoiLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHRfbGVuKTsKICAgICBnb3RvIG91dDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL21vZGVzL2ludGVybmFsLmggYi9zcmMvY3J5cHRvL21vZGVzL2ludGVybmFsLmgKaW5kZXggZDEyNDA1ZS4uY2FlYWM0MCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9tb2Rlcy9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vbW9kZXMvaW50ZXJuYWwuaApAQCAtMTczLDExICsxNzMsNiBAQAogICB2b2lkICprZXk7CiB9OwogCi1zdHJ1Y3QgeHRzMTI4X2NvbnRleHQgewotICB2b2lkICprZXkxLCAqa2V5MjsKLSAgYmxvY2sxMjhfZiBibG9jazEsIGJsb2NrMjsKLX07Ci0KIHN0cnVjdCBjY20xMjhfY29udGV4dCB7CiAgIHVuaW9uIHsKICAgICB1aW50NjRfdCB1WzJdOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9vYmovQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL29iai9DTWFrZUxpc3RzLnR4dAppbmRleCBhMjdlNTA0Li5iOGE0ZWYzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL29iai9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL29iai9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgb2JqCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL29iai9vYmouYyBiL3NyYy9jcnlwdG8vb2JqL29iai5jCmluZGV4IGJmMTZkMTcuLjk0ZjczOWMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vb2JqL29iai5jCisrKyBiL3NyYy9jcnlwdG8vb2JqL29iai5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAogICByID0gQVNOMV9PQkpFQ1RfbmV3KCk7CiAgIGlmIChyID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl9kdXAsIEVSUl9SX0FTTjFfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIEVSUl9SX0FTTjFfTElCKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICByLT5sbiA9IHItPnNuID0gTlVMTDsKQEAgLTE0OSw3ICsxNDksNyBAQAogICByZXR1cm4gcjsKIAogZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl9kdXAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgIE9QRU5TU0xfZnJlZShsbik7CiAgIE9QRU5TU0xfZnJlZShzbik7CiAgIE9QRU5TU0xfZnJlZShkYXRhKTsKQEAgLTMzNyw3ICszMzcsNyBAQAogICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmZ2xvYmFsX2FkZGVkX2xvY2spOwogCiBlcnI6Ci0gIE9QRU5TU0xfUFVUX0VSUk9SKE9CSiwgT0JKX25pZDJvYmosIE9CSl9SX1VOS05PV05fTklEKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfUl9VTktOT1dOX05JRCk7CiAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zODgsNyArMzg4LDcgQEAKIAogICBidWYgPSBPUEVOU1NMX21hbGxvYyh0b3RhbF9sZW4pOwogICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihPQkosIE9CSl90eHQyb2JqLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIApAQCAtNjM2LDcgKzYzNiw3IEBACiAKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBPQkpfY3JlYXRlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoT0JKLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3BlbS9DTWFrZUxpc3RzLnR4dAppbmRleCA3MjBiYTJmLi4zMGRkN2M5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BlbS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3BlbS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgcGVtCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BlbS9wZW1faW5mby5jIGIvc3JjL2NyeXB0by9wZW0vcGVtX2luZm8uYwppbmRleCAzZjAyNjE5Li5iNGFlODA1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BlbS9wZW1faW5mby5jCisrKyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9pbmZvLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQl7CiAJCWlmICgocmV0PXNrX1g1MDlfSU5GT19uZXdfbnVsbCgpKSA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC0yNDgsMTMgKzI0OCwxMyBAQAogCQkJCQl7CiAJCQkJCWlmICghZDJpX1ByaXZhdGVLZXkocHR5cGUsIHBwLCAmcCwgbGVuKSkKIAkJCQkJCXsKLQkJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT19yZWFkX2JpbywgRVJSX1JfQVNOMV9MSUIpOworCQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9BU04xX0xJQik7CiAJCQkJCQlnb3RvIGVycjsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCWVsc2UgaWYgKGQyaShwcCwmcCxsZW4pID09IE5VTEwpCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvLCBFUlJfUl9BU04xX0xJQik7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOwogCQkJCQlnb3RvIGVycjsKIAkJCQkJfQogCQkJCX0KQEAgLTMyNiw3ICszMjYsNyBAQAogCQlvYmpzdHI9T0JKX25pZDJzbihFVlBfQ0lQSEVSX25pZChlbmMpKTsKIAkJaWYgKG9ianN0ciA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3dyaXRlX2JpbywgUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC0zNDIsNyArMzQyLDcgQEAKIAkJCXsKIAkJCWlmIChlbmMgPT0gTlVMTCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fWDUwOV9JTkZPX3dyaXRlX2JpbywgUEVNX1JfQ0lQSEVSX0lTX05VTEwpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQ0lQSEVSX0lTX05VTEwpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIApAQCAtMzYwLDcgKzM2MCw3IEBACiAJCQkJRVZQX0NJUEhFUl9uaWQoeGktPmVuY19jaXBoZXIuY2lwaGVyKSk7CiAJCQlpZiAob2Jqc3RyID09IE5VTEwpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1g1MDlfSU5GT193cml0ZV9iaW8sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vcGVtX2xpYi5jIGIvc3JjL2NyeXB0by9wZW0vcGVtX2xpYi5jCmluZGV4IDUyMDE0NjcuLjU5MTU2OTYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGVtL3BlbV9saWIuYworKysgYi9zcmMvY3J5cHRvL3BlbS9wZW1fbGliLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV9yZWFkLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC0zMDIsMTQgKzMwMiwxNCBAQAogCQlvYmpzdHI9T0JKX25pZDJzbihFVlBfQ0lQSEVSX25pZChlbmMpKTsKIAkJaWYgKG9ianN0ciA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZV9iaW8sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJfQogCiAJaWYgKChkc2l6ZT1pMmQoeCxOVUxMKSkgPCAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGVfYmlvLCBFUlJfUl9BU04xX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOwogCQlkc2l6ZT0wOwogCQlnb3RvIGVycjsKIAkJfQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJZGF0YT0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKCh1bnNpZ25lZCBpbnQpZHNpemUrMjApOwogCWlmIChkYXRhID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fQVNOMV93cml0ZV9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAJcD1kYXRhOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAgCQkJa2xlbj0oKmNhbGxiYWNrKShidWYsUEVNX0JVRlNJWkUsMSx1KTsKIAkJCWlmIChrbGVuIDw9IDApCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfd3JpdGVfYmlvLCBQRU1fUl9SRUFEX0tFWSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9SRUFEX0tFWSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJa3N0cj0odW5zaWduZWQgY2hhciAqKWJ1ZjsKQEAgLTQwOCw3ICs0MDgsNyBAQAogCWtsZW49Y2FsbGJhY2soYnVmLFBFTV9CVUZTSVpFLDAsdSk7CiAJaWYgKGtsZW4gPD0gMCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9kb19oZWFkZXIsIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCk7CiAJCXJldHVybigwKTsKIAkJfQogCkBAIC00MjgsNyArNDI4LDcgQEAKIAlPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKilrZXksc2l6ZW9mKGtleSkpOwogCWlmICghbykKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9kb19oZWFkZXIsIFBFTV9SX0JBRF9ERUNSWVBUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfREVDUllQVCk7CiAJCXJldHVybigwKTsKIAkJfQogCWorPWk7CkBAIC00MzcsMTEgKzQzNywxOCBAQAogCX0KIAogc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIqIGNpcGhlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgaWYgKHN0cmNtcChuYW1lLCAiREVTLUNCQyIpID09IDApIHsKKyAgLyogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSAoZGVwcmVjYXRlZCkgZnVuY3Rpb24gfEVWUF9nZXRfY2lwaGVyYnluYW1lfC4gKi8KKyAgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX3JjNCkpIHsKKyAgICByZXR1cm4gRVZQX3JjNCgpOworICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX2Rlc19jYmMpKSB7CiAgICAgcmV0dXJuIEVWUF9kZXNfY2JjKCk7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJBRVMtMTI4LUNCQyIpID09IDApIHsKKyAgfSBlbHNlIGlmICgwID09IHN0cmNtcChuYW1lLCBTTl9kZXNfZWRlM19jYmMpKSB7CisgICAgcmV0dXJuIEVWUF9kZXNfZWRlM19jYmMoKTsKKyAgfSBlbHNlIGlmICgwID09IHN0cmNtcChuYW1lLCBTTl9hZXNfMTI4X2NiYykpIHsKICAgICByZXR1cm4gRVZQX2Flc18xMjhfY2JjKCk7Ci0gIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICAiQUVTLTI1Ni1DQkMiKSA9PSAwKSB7CisgIH0gZWxzZSBpZiAoMCA9PSBzdHJjbXAobmFtZSwgU05fYWVzXzE5Ml9jYmMpKSB7CisgICAgcmV0dXJuIEVWUF9hZXNfMTkyX2NiYygpOworICB9IGVsc2UgaWYgKDAgPT0gc3RyY21wKG5hbWUsIFNOX2Flc18yNTZfY2JjKSkgewogICAgIHJldHVybiBFVlBfYWVzXzI1Nl9jYmMoKTsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gTlVMTDsKQEAgLTQ1OCwxOSArNDY1LDE5IEBACiAJaWYgKChoZWFkZXIgPT0gTlVMTCkgfHwgKCpoZWFkZXIgPT0gJ1wwJykgfHwgKCpoZWFkZXIgPT0gJ1xuJykpCiAJCXJldHVybigxKTsKIAlpZiAoc3RybmNtcChoZWFkZXIsIlByb2MtVHlwZTogIiwxMSkgIT0gMCkKLQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9OT1RfUFJPQ19UWVBFKTsgcmV0dXJuKDApOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9OT1RfUFJPQ19UWVBFKTsgcmV0dXJuKDApOyB9CiAJaGVhZGVyKz0xMTsKIAlpZiAoKmhlYWRlciAhPSAnNCcpIHJldHVybigwKTsgaGVhZGVyKys7CiAJaWYgKCpoZWFkZXIgIT0gJywnKSByZXR1cm4oMCk7IGhlYWRlcisrOwogCWlmIChzdHJuY21wKGhlYWRlciwiRU5DUllQVEVEIiw5KSAhPSAwKQotCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8sIFBFTV9SX05PVF9FTkNSWVBURUQpOyByZXR1cm4oMCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX05PVF9FTkNSWVBURUQpOyByZXR1cm4oMCk7IH0KIAlmb3IgKDsgKCpoZWFkZXIgIT0gJ1xuJykgJiYgKCpoZWFkZXIgIT0gJ1wwJyk7IGhlYWRlcisrKQogCQk7CiAJaWYgKCpoZWFkZXIgPT0gJ1wwJykKLQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9TSE9SVF9IRUFERVIpOyByZXR1cm4oMCk7IH0KKwkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX1NIT1JUX0hFQURFUik7IHJldHVybigwKTsgfQogCWhlYWRlcisrOwogCWlmIChzdHJuY21wKGhlYWRlciwiREVLLUluZm86ICIsMTApICE9IDApCi0JCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTywgUEVNX1JfTk9UX0RFS19JTkZPKTsgcmV0dXJuKDApOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9OT1RfREVLX0lORk8pOyByZXR1cm4oMCk7IH0KIAloZWFkZXIrPTEwOwogCiAJcD1oZWFkZXI7CkBAIC00ODksNyArNDk2LDcgQEAKIAogCWlmIChlbmMgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPLCBQRU1fUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9VTlNVUFBPUlRFRF9FTkNSWVBUSU9OKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJaWYgKCFsb2FkX2l2KGhlYWRlcl9wcCwmKGNpcGhlci0+aXZbMF0pLEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGVuYykpKQpAQCAtNTE2LDcgKzUyMyw3IEBACiAJCQl2PSAqZnJvbS0nYScrMTA7CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgbG9hZF9pdiwgUEVNX1JfQkFEX0lWX0NIQVJTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQkFEX0lWX0NIQVJTKTsKIAkJCXJldHVybigwKTsKIAkJCX0KIAkJZnJvbSsrOwpAQCAtNTM2LDcgKzU0Myw3IEBACiAKICAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV93cml0ZSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC02MDMsNyArNjEwLDcgQEAKIAkJT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgUEVNX0JVRlNJWkUqOCk7CiAJCU9QRU5TU0xfZnJlZShidWYpOwogCX0KLQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV93cml0ZV9iaW8sIHJlYXNvbik7CisJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCByZWFzb24pOwogCXJldHVybigwKTsKIAl9CiAKQEAgLTYxNiw3ICs2MjMsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CkBAIC02NDQsNyArNjUxLDcgQEAKIAkJQlVGX01FTV9mcmVlKG5hbWVCKTsKIAkJQlVGX01FTV9mcmVlKGhlYWRlckIpOwogCQlCVUZfTUVNX2ZyZWUoZGF0YUIpOwotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAKQEAgLTY1NSw3ICs2NjIsNyBAQAogCiAJCWlmIChpIDw9IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgUEVNX1JfTk9fU1RBUlRfTElORSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX05PX1NUQVJUX0xJTkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAKQEAgLTY3MCw3ICs2NzcsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFCVUZfTUVNX2dyb3cobmFtZUIsaSs5KSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQltZW1jcHkobmFtZUItPmRhdGEsJihidWZbMTFdKSxpLTYpOwpAQCAtNjgwLDcgKzY4Nyw3IEBACiAJCX0KIAlobD0wOwogCWlmICghQlVGX01FTV9ncm93KGhlYWRlckIsMjU2KSkKLQkJeyBPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQorCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQogCWhlYWRlckItPmRhdGFbMF09J1wwJzsKIAlmb3IgKDs7KQogCQl7CkBAIC02OTIsNyArNjk5LDcgQEAKIAogCQlpZiAoYnVmWzBdID09ICdcbicpIGJyZWFrOwogCQlpZiAoIUJVRl9NRU1fZ3JvdyhoZWFkZXJCLGhsK2krOSkpCi0JCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CisJCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQogCQlpZiAoc3RybmNtcChidWYsIi0tLS0tRU5EICIsOSkgPT0gMCkKIAkJCXsKIAkJCW5vaGVhZD0xOwpAQCAtNzA1LDcgKzcxMiw3IEBACiAKIAlibD0wOwogCWlmICghQlVGX01FTV9ncm93KGRhdGFCLDEwMjQpKQotCQl7IE9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CisJCXsgT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CiAJZGF0YUItPmRhdGFbMF09J1wwJzsKIAlpZiAoIW5vaGVhZCkKIAkJewpAQCAtNzIzLDcgKzczMCw3IEBACiAJCQlpZiAoaSA+IDY1KSBicmVhazsKIAkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGRhdGFCLGkrYmwrOSkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJbWVtY3B5KCYoZGF0YUItPmRhdGFbYmxdKSxidWYsaSk7CkBAIC03NTQsNyArNzYxLDcgQEAKIAkJKHN0cm5jbXAobmFtZUItPmRhdGEsJihidWZbOV0pLGkpICE9IDApIHx8CiAJCShzdHJuY21wKCYoYnVmWzkraV0pLCItLS0tLVxuIiw2KSAhPSAwKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9yZWFkX2JpbywgUEVNX1JfQkFEX0VORF9MSU5FKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfRU5EX0xJTkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC03NjQsMTMgKzc3MSwxMyBAQAogCQkodW5zaWduZWQgY2hhciAqKWRhdGFCLT5kYXRhLGJsKTsKIAlpZiAoaSA8IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW8sIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfQkFTRTY0X0RFQ09ERSk7CiAJCWdvdG8gZXJyOwogCQl9CiAJaT1FVlBfRGVjb2RlRmluYWwoJmN0eCwodW5zaWduZWQgY2hhciAqKSYoZGF0YUItPmRhdGFbYmxdKSwmayk7CiAJaWYgKGkgPCAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvLCBQRU1fUl9CQURfQkFTRTY0X0RFQ09ERSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUpOwogCQlnb3RvIGVycjsKIAkJfQogCWJsKz1rOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jIGIvc3JjL2NyeXB0by9wZW0vcGVtX290aC5jCmluZGV4IDIwZDEyYjYuLjNlOGY2YmQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGVtL3BlbV9vdGguYworKysgYi9zcmMvY3J5cHRvL3BlbS9wZW1fb3RoLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlwID0gZGF0YTsKIAlyZXQ9ZDJpKHgsJnAsbGVuKTsKIAlpZiAocmV0ID09IE5VTEwpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX0FTTjFfcmVhZF9iaW8sIEVSUl9SX0FTTjFfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9BU04xX0xJQik7CiAJT1BFTlNTTF9mcmVlKGRhdGEpOwogCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vcGVtX3BrOC5jIGIvc3JjL2NyeXB0by9wZW0vcGVtX3BrOC5jCmluZGV4IDAzNTAzOGUuLjA4MjQ0NzcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGVtL3BlbV9wazguYworKysgYi9zcmMvY3J5cHRvL3BlbS9wZW1fcGs4LmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCWNoYXIgYnVmW1BFTV9CVUZTSVpFXTsKIAlpbnQgcmV0OwogCWlmKCEocDhpbmYgPSBFVlBfUEtFWTJQS0NTOCh4KSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBkb19wazhwa2V5LCBQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmKGVuYyB8fCAobmlkICE9IC0xKSkgewpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCQlpZiAoIWNiKSBjYiA9IFBFTV9kZWZfY2FsbGJhY2s7CiAJCQlrbGVuID0gY2IoYnVmLCBQRU1fQlVGU0laRSwgMSwgdSk7CiAJCQlpZihrbGVuIDw9IDApIHsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIGRvX3BrOHBrZXksIFBFTV9SX1JFQURfS0VZKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIFBFTV9SX1JFQURfS0VZKTsKIAkJCQlQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDhpbmYpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtMTYzLDcgKzE2Myw3IEBACiAJaWYgKCFjYikgY2IgPSBQRU1fZGVmX2NhbGxiYWNrOwogCWtsZW49Y2IocHNidWYsUEVNX0JVRlNJWkUsMCx1KTsKIAlpZiAoa2xlbiA8PSAwKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8sIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRCk7CiAJCVg1MDlfU0lHX2ZyZWUocDgpOwogCQlyZXR1cm4gTlVMTDsJCiAJfQpAQCAtMjE2LDcgKzIxNiw3IEBACiAJQklPICpicDsKIAlpbnQgcmV0OwogCWlmKCEoYnAgPSBCSU9fbmV3X2ZwKGZwLCBCSU9fTk9DTE9TRSkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgZG9fcGs4cGtleV9mcCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCX0KIAlyZXQgPSBkb19wazhwa2V5KGJwLCB4LCBpc2RlciwgbmlkLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKQEAgLTIyOSw3ICsyMjksNyBAQAogCUJJTyAqYnA7CiAJRVZQX1BLRVkgKnJldDsKIAlpZighKGJwID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIGQyaV9QS0NTOFByaXZhdGVLZXlfZnAsIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCX0KIAlyZXQgPSBkMmlfUEtDUzhQcml2YXRlS2V5X2JpbyhicCwgeCwgY2IsIHUpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZW0vcGVtX3BrZXkuYyBiL3NyYy9jcnlwdG8vcGVtL3BlbV9wa2V5LmMKaW5kZXggZmU1ODU1OC4uYzQ2MjcyNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wZW0vcGVtX3BrZXkuYworKysgYi9zcmMvY3J5cHRvL3BlbS9wZW1fcGtleS5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJaWYgKCFjYikgY2IgPSBQRU1fZGVmX2NhbGxiYWNrOwogCQlrbGVuPWNiKHBzYnVmLFBFTV9CVUZTSVpFLDAsdSk7CiAJCWlmIChrbGVuIDw9IDApIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXksIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOwogCQkJWDUwOV9TSUdfZnJlZShwOCk7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMTMyLDcgKzEzMiw3IEBACiAJCX0KIHA4ZXJyOgogCWlmIChyZXQgPT0gTlVMTCkKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleSwgRVJSX1JfQVNOMV9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKIAogZXJyOgogCU9QRU5TU0xfZnJlZShubSk7CkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJfQogZXJyOgogCWlmIChyZXQgPT0gTlVMTCkKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9iaW9fUGFyYW1ldGVycywgRVJSX1JfQVNOMV9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0FTTjFfTElCKTsKIAlPUEVOU1NMX2ZyZWUobm0pOwogCU9QRU5TU0xfZnJlZShkYXRhKTsKIAlyZXR1cm4ocmV0KTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fcmVhZF9Qcml2YXRlS2V5LCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiAgICAgICAgIGlmICgoYj1CSU9fbmV3X2ZwKGZwLCBCSU9fTk9DTE9TRSkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEVNLCBQRU1fd3JpdGVfUHJpdmF0ZUtleSwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAJCX0KICAgICAgICAgcmV0PVBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleShiLCB4LCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKQEAgLTI4Nyw3ICsyODcsNyBAQAogCQlyZXQgPSBkMmlfREhwYXJhbXMoeCwgJnAsIGxlbik7CiAKIAlpZiAocmV0ID09IE5VTEwpCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfYmlvX0RIcGFyYW1zLCBFUlJfUl9BU04xX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgRVJSX1JfQVNOMV9MSUIpOwogCU9QRU5TU0xfZnJlZShubSk7CiAJT1BFTlNTTF9mcmVlKGRhdGEpOwogCXJldHVybiByZXQ7CkBAIC0zMDEsNyArMzAxLDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBFTSwgUEVNX3JlYWRfREhwYXJhbXMsIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQRU0sIEVSUl9SX0JVRl9MSUIpOwogICAgICAgICAgICAgICAgIHJldHVybigwKTsKIAkJfQogICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wZXJsYXNtL2FybS14bGF0ZS5wbCBiL3NyYy9jcnlwdG8vcGVybGFzbS9hcm0teGxhdGUucGwKaW5kZXggODFjZWIzMS4uNzA2ZmE3MCAxMDA3NTUKLS0tIGEvc3JjL2NyeXB0by9wZXJsYXNtL2FybS14bGF0ZS5wbAorKysgYi9zcmMvY3J5cHRvL3Blcmxhc20vYXJtLXhsYXRlLnBsCkBAIC0xMTYsNiArMTE2LDkgQEAKICAgICByZXR1cm4gJGxpbmU7CiB9CiAKK3ByaW50ICIjaWYgZGVmaW5lZChfX2FybV9fKVxuIiBpZiAoJGZsYXZvdXIgZXEgImxpbnV4MzIiKTsKK3ByaW50ICIjaWYgZGVmaW5lZChfX2FhcmNoNjRfXylcbiIgaWYgKCRmbGF2b3VyIGVxICJsaW51eDY0Iik7CisKIHdoaWxlKCRsaW5lPTw+KSB7CiAKICAgICBpZiAoJGxpbmUgPX4gbS9eXHMqKCN8QHxcL1wvKS8pCXsgcHJpbnQgJGxpbmU7IG5leHQ7IH0KQEAgLTE2Miw0ICsxNjUsNiBAQAogICAgIHByaW50ICJcbiI7CiB9CiAKK3ByaW50ICIjZW5kaWYiIGlmICgkZmxhdm91ciBlcSAibGludXgzMiIgfHwgJGZsYXZvdXIgZXEgImxpbnV4NjQiKTsKKwogY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzOC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vcGtjczgvQ01ha2VMaXN0cy50eHQKaW5kZXggNDQyNmYxZS4uY2U1YmNlMSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wa2NzOC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3BrY3M4L0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICBwa2NzOApAQCAtMTksNCArMTksMTEgQEAKICAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+CiApCiAKK2FkZF9leGVjdXRhYmxlKAorICBwa2NzOF90ZXN0CisKKyAgcGtjczhfdGVzdC5jYworKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMocGtjczhfdGVzdCBjcnlwdG8pCiB0YXJnZXRfbGlua19saWJyYXJpZXMocGtjczEyX3Rlc3QgY3J5cHRvKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzOC9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9wa2NzOC9pbnRlcm5hbC5oCmluZGV4IDQ0Y2E0ZjcuLjc5OTVlNzggMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcGtjczgvaW50ZXJuYWwuaAorKysgYi9zcmMvY3J5cHRvL3BrY3M4L2ludGVybmFsLmgKQEAgLTY2LDYgKzY2LDE1IEBACiAjZGVmaW5lIFBLQ1M1X0RFRkFVTFRfSVRFUkFUSU9OUyAyMDQ4CiAjZGVmaW5lIFBLQ1M1X1NBTFRfTEVOIDgKIAorLyogUEtDUzVfdjJfUEJFX2tleWl2Z2VuIGludGlhbGl6ZXMgdGhlIHN1cHBsaWVkIHxjdHh8IGZvciBQQktERiB2Miwgd2hpY2ggbXVzdAorICogYmUgc3BlY2lmaWVkIGJ5IHxwYXJhbXwuIFRoZSBwYXNzd29yZCBpcyBzcGVjaWZpZWQgYnkgfHBhc3NfcmF3fCBhbmQKKyAqIHxwYXNzX3Jhd19sZW58LiB8Y2lwaGVyfCBhbmQgfG1kfCBhcmUgaWdub3JlZC4KKyAqCisgKiBJdCByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworaW50IFBLQ1M1X3YyX1BCRV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpwYXNzX3JhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhc3NfcmF3X2xlbiwgQVNOMV9UWVBFICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLCBpbnQgZW5jKTsKKwogCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKIH0gIC8qIGV4dGVybiBDICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZS5jIGIvc3JjL2NyeXB0by9wa2NzOC9wNV9wYmUuYwppbmRleCBmMzBhZTc5Li42NTNjYWJmIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZS5jCisrKyBiL3NyYy9jcnlwdG8vcGtjczgvcDVfcGJlLmMKQEAgLTg2LDIxICs4NiwyMSBAQAogCXBiZSA9IFBCRVBBUkFNX25ldygpOwogCWlmICghcGJlKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0MF9hbGdvciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCWlmKGl0ZXIgPD0gMCkKIAkJaXRlciA9IFBLQ1M1X0RFRkFVTFRfSVRFUkFUSU9OUzsKIAlpZiAoIUFTTjFfSU5URUdFUl9zZXQocGJlLT5pdGVyLCBpdGVyKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlX3NldDBfYWxnb3IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZiAoIXNhbHRsZW4pCiAJCXNhbHRsZW4gPSBQS0NTNV9TQUxUX0xFTjsKIAlpZiAoIUFTTjFfU1RSSU5HX3NldChwYmUtPnNhbHQsIE5VTEwsIHNhbHRsZW4pKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0MF9hbGdvciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCXNzdHIgPSBBU04xX1NUUklOR19kYXRhKHBiZS0+c2FsdCk7CkBAIC0xMTEsNyArMTExLDcgQEAKIAogCWlmKCFBU04xX2l0ZW1fcGFjayhwYmUsIEFTTjFfSVRFTV9ycHRyKFBCRVBBUkFNKSwgJnBiZV9zdHIpKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0MF9hbGdvciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlyZXQgPSBYNTA5X0FMR09SX25ldygpOwogCWlmICghcmV0KQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmVfc2V0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcGtjczgvcDVfcGJldjIuYyBiL3NyYy9jcnlwdG8vcGtjczgvcDVfcGJldjIuYwppbmRleCA5ZWI5ODQ4Li5mNThhYWU3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3BrY3M4L3A1X3BiZXYyLmMKKysrIGIvc3JjL2NyeXB0by9wa2NzOC9wNV9wYmV2Mi5jCkBAIC01Myw2ICs1Myw4IEBACiAgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCiAgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4gKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgpAQCAtMTI0LDcgKzEyNiw3IEBACiAKIAlhbGdfbmlkID0gRVZQX0NJUEhFUl9uaWQoY2lwaGVyKTsKIAlpZihhbGdfbmlkID09IE5JRF91bmRlZikgewotCQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJlMl9zZXRfaXYsIFBLQ1M4X1JfQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIpOwogCQlnb3RvIGVycjsKIAl9CiAJb2JqID0gT0JKX25pZDJvYmooYWxnX25pZCk7CkBAIC0xNTIsNyArMTU0LDcgQEAKIAlpZiAoIUVWUF9DaXBoZXJJbml0X2V4KCZjdHgsIGNpcGhlciwgTlVMTCwgTlVMTCwgaXYsIDApKQogCQlnb3RvIGVycjsKIAlpZihwYXJhbV90b19hc24xKCZjdHgsIHNjaGVtZS0+cGFyYW1ldGVyKSA8IDApIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M1X3BiZTJfc2V0X2l2LCBQS0NTOF9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyk7CiAJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTIwMiw3ICsyMDQsNyBAQAogCXJldHVybiByZXQ7CiAKIAltZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTNV9wYmUyX3NldF9pdiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAKIAllcnI6CiAJUEJFMlBBUkFNX2ZyZWUocGJlMik7CkBAIC0yOTUsOSArMjk3LDE0MyBAQAogCXJldHVybiBrZXlmdW5jOwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzVfcGJrZGYyX3NldCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJUEJLREYyUEFSQU1fZnJlZShrZGYpOwogCVg1MDlfQUxHT1JfZnJlZShrZXlmdW5jKTsKIAlyZXR1cm4gTlVMTDsKIAl9CiAKK3N0YXRpYyBpbnQgUEtDUzVfdjJfUEJLREYyX2tleWl2Z2VuKEVWUF9DSVBIRVJfQ1RYICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwYXNzX3JhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXNzX3Jhd19sZW4sIGNvbnN0IEFTTjFfVFlQRSAqcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBU04xX1RZUEUgKml2LCBpbnQgZW5jKSB7CisgIGludCBydiA9IDA7CisgIFBCS0RGMlBBUkFNICpwYmtkZjJwYXJhbSA9IE5VTEw7CisKKyAgaWYgKEVWUF9DSVBIRVJfQ1RYX2NpcGhlcihjdHgpID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgQ0lQSEVSX1JfTk9fQ0lQSEVSX1NFVCk7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBEZWNvZGUgcGFyYW1ldGVycy4gKi8KKyAgaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnR5cGUgIT0gVl9BU04xX1NFUVVFTkNFKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGNvbnN0IHVpbnQ4X3QgKnBidWYgPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisgIGludCBwbGVuID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGg7CisgIHBia2RmMnBhcmFtID0gZDJpX1BCS0RGMlBBUkFNKE5VTEwsICZwYnVmLCBwbGVuKTsKKyAgaWYgKHBia2RmMnBhcmFtID09IE5VTEwgfHwgcGJ1ZiAhPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGEgKyBwbGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIE5vdyBjaGVjayB0aGUgcGFyYW1ldGVycy4gKi8KKyAgdWludDhfdCBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKyAgY29uc3Qgc2l6ZV90IGtleV9sZW4gPSBFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCk7CisgIGFzc2VydChrZXlfbGVuIDw9IHNpemVvZihrZXkpKTsKKworICBpZiAocGJrZGYycGFyYW0tPmtleWxlbmd0aCAhPSBOVUxMICYmCisgICAgICBBU04xX0lOVEVHRVJfZ2V0KHBia2RmMnBhcmFtLT5rZXlsZW5ndGgpICE9IChpbnQpIGtleV9sZW4pIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTlNVUFBPUlRFRF9LRVlMRU5HVEgpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgaWYgKHBia2RmMnBhcmFtLT5wcmYgIT0gTlVMTCAmJgorICAgICAgT0JKX29iajJuaWQocGJrZGYycGFyYW0tPnByZi0+YWxnb3JpdGhtKSAhPSBOSURfaG1hY1dpdGhTSEExKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfUFJGKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChwYmtkZjJwYXJhbS0+c2FsdC0+dHlwZSAhPSBWX0FTTjFfT0NURVRfU1RSSU5HKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfU0FMVF9UWVBFKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGlmIChwYmtkZjJwYXJhbS0+aXRlci0+dHlwZSAhPSBWX0FTTjFfSU5URUdFUikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9JVEVSQVRJT05fQ09VTlQpOworICAgIGdvdG8gZXJyOworICB9CisgIGxvbmcgaXRlcmF0aW9ucyA9IEFTTjFfSU5URUdFUl9nZXQocGJrZGYycGFyYW0tPml0ZXIpOworICBpZiAoaXRlcmF0aW9ucyA8IDAgfHwgaXRlcmF0aW9ucyA+IFVJTlRfTUFYKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX0lURVJBVElPTl9DT1VOVCk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoaXYtPnR5cGUgIT0gVl9BU04xX09DVEVUX1NUUklORyB8fCBpdi0+dmFsdWUub2N0ZXRfc3RyaW5nID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgY29uc3Qgc2l6ZV90IGl2X2xlbiA9IEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjdHgpOworICBpZiAoaXYtPnZhbHVlLm9jdGV0X3N0cmluZy0+bGVuZ3RoICE9IGl2X2xlbikgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyk7CisgICAgZ290byBlcnI7CisgIH0KKworICBpZiAoIVBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEoKGNvbnN0IGNoYXIgKikgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBia2RmMnBhcmFtLT5zYWx0LT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYmtkZjJwYXJhbS0+c2FsdC0+dmFsdWUub2N0ZXRfc3RyaW5nLT5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zLCBrZXlfbGVuLCBrZXkpKSB7CisgICAgZ290byBlcnI7CisgIH0KKworICBydiA9IEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgTlVMTCAvKiBjaXBoZXIgKi8sIE5VTEwgLyogZW5naW5lICovLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaXYtPnZhbHVlLm9jdGV0X3N0cmluZy0+ZGF0YSwgZW5jKTsKKworIGVycjoKKyAgUEJLREYyUEFSQU1fZnJlZShwYmtkZjJwYXJhbSk7CisgIHJldHVybiBydjsKK30KKworaW50IFBLQ1M1X3YyX1BCRV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1aW50OF90ICpwYXNzX3JhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBhc3NfcmF3X2xlbiwgQVNOMV9UWVBFICpwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRVZQX0NJUEhFUiAqdW51c2VkLCBjb25zdCBFVlBfTUQgKnVudXNlZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmMpIHsKKyAgUEJFMlBBUkFNICpwYmUycGFyYW0gPSBOVUxMOworICBpbnQgcnYgPSAwOworCisgIGlmIChwYXJhbSA9PSBOVUxMIHx8CisgICAgICBwYXJhbS0+dHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UgfHwKKyAgICAgIHBhcmFtLT52YWx1ZS5zZXF1ZW5jZSA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIGNvbnN0IHVpbnQ4X3QgKnBidWYgPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisgIGludCBwbGVuID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGg7CisgIHBiZTJwYXJhbSA9IGQyaV9QQkUyUEFSQU0oTlVMTCwgJnBidWYsIHBsZW4pOworICBpZiAocGJlMnBhcmFtID09IE5VTEwgfHwgcGJ1ZiAhPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGEgKyBwbGVuKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIC8qIENoZWNrIHRoYXQgdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGlzIFBCS0RGMi4gKi8KKyAgaWYgKE9CSl9vYmoybmlkKHBiZTJwYXJhbS0+a2V5ZnVuYy0+YWxnb3JpdGhtKSAhPSBOSURfaWRfcGJrZGYyKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfS0VZX0RFUklWQVRJT05fRlVOQ1RJT04pOworICAgIGdvdG8gZXJyOworICB9CisKKyAgLyogU2VlIGlmIHdlIHJlY29nbmlzZSB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0uICovCisgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciA9CisgICAgICBFVlBfZ2V0X2NpcGhlcmJ5bmlkKE9CSl9vYmoybmlkKHBiZTJwYXJhbS0+ZW5jcnlwdGlvbi0+YWxnb3JpdGhtKSk7CisgIGlmIChjaXBoZXIgPT0gTlVMTCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBGaXh1cCBjaXBoZXIgYmFzZWQgb24gQWxnb3JpdGhtSWRlbnRpZmllci4gKi8KKyAgaWYgKCFFVlBfQ2lwaGVySW5pdF9leChjdHgsIGNpcGhlciwgTlVMTCAvKiBlbmdpbmUgKi8sIE5VTEwgLyoga2V5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogaXYgKi8sIGVuYykpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJ2ID0gUEtDUzVfdjJfUEJLREYyX2tleWl2Z2VuKGN0eCwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJlMnBhcmFtLT5rZXlmdW5jLT5wYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBiZTJwYXJhbS0+ZW5jcnlwdGlvbi0+cGFyYW1ldGVyLCBlbmMpOworCisgZXJyOgorICBQQkUyUEFSQU1fZnJlZShwYmUycGFyYW0pOworICByZXR1cm4gcnY7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4LmMgYi9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4LmMKaW5kZXggODQzYzc0ZC4uODA2N2M5MSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9wa2NzOC9wa2NzOC5jCisrKyBiL3NyYy9jcnlwdG8vcGtjczgvcGtjczguYwpAQCAtNjksNiArNjksNyBAQAogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CiAKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIi4uL2J5dGVzdHJpbmcvaW50ZXJuYWwuaCIKICNpbmNsdWRlICIuLi9ldnAvaW50ZXJuYWwuaCIKIApAQCAtMjAwLDcgKzIwMSw3IEBACiAgIH0KIAogZXJyOgotICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2tleV9nZW5fcmF3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAKIGVuZDoKICAgT1BFTlNTTF9mcmVlKEFpKTsKQEAgLTIyNywxNCArMjI4LDE0IEBACiAgIC8qIEV4dHJhY3QgdXNlZnVsIGluZm8gZnJvbSBwYXJhbWV0ZXIgKi8KICAgaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnR5cGUgIT0gVl9BU04xX1NFUVVFTkNFIHx8CiAgICAgICBwYXJhbS0+dmFsdWUuc2VxdWVuY2UgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHBidWYgPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CiAgIHBiZSA9IGQyaV9QQkVQQVJBTShOVUxMLCAmcGJ1ZiwgcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGgpOwogICBpZiAocGJlID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMjQ3LDEzICsyNDgsMTMgQEAKICAgc2FsdF9sZW4gPSBwYmUtPnNhbHQtPmxlbmd0aDsKICAgaWYgKCFwa2NzMTJfa2V5X2dlbl9yYXcocGFzc19yYXcsIHBhc3NfcmF3X2xlbiwgc2FsdCwgc2FsdF9sZW4sIFBLQ1MxMl9LRVlfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnMsIEVWUF9DSVBIRVJfa2V5X2xlbmd0aChjaXBoZXIpLCBrZXksIG1kKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQS0NTOF9SX0tFWV9HRU5fRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0tFWV9HRU5fRVJST1IpOwogICAgIFBCRVBBUkFNX2ZyZWUocGJlKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIXBrY3MxMl9rZXlfZ2VuX3JhdyhwYXNzX3JhdywgcGFzc19yYXdfbGVuLCBzYWx0LCBzYWx0X2xlbiwgUEtDUzEyX0lWX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb25zLCBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpLCBpdiwgbWQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9wYmVfa2V5aXZnZW4sIFBLQ1M4X1JfS0VZX0dFTl9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfS0VZX0dFTl9FUlJPUik7CiAgICAgUEJFUEFSQU1fZnJlZShwYmUpOwogICAgIHJldHVybiAwOwogICB9CkBAIC0yNzQsNDIgKzI3NSw5MyBAQAogICBjb25zdCBFVlBfQ0lQSEVSKiAoKmNpcGhlcl9mdW5jKSh2b2lkKTsKICAgY29uc3QgRVZQX01EKiAoKm1kX2Z1bmMpKHZvaWQpOwogICBrZXlnZW5fZnVuYyBrZXlnZW47CisgIGludCBmbGFnczsKIH07CiAKKyNkZWZpbmUgUEJFX1VDUzJfQ09OVkVSVF9QQVNTV09SRCAweDEKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwYmVfc3VpdGUga0J1aWx0aW5QQkVbXSA9IHsKICAgICB7Ci0gICAgIE5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMsIEVWUF9yYzJfNDBfY2JjLCBFVlBfc2hhMSwgcGtjczEyX3BiZV9rZXlpdmdlbiwKKyAgICAgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQywgRVZQX3JjMl80MF9jYmMsIEVWUF9zaGExLAorICAgICBwa2NzMTJfcGJlX2tleWl2Z2VuLCBQQkVfVUNTMl9DT05WRVJUX1BBU1NXT1JECiAgICAgfSwKICAgICB7CiAgICAgIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQsIEVWUF9yYzQsIEVWUF9zaGExLCBwa2NzMTJfcGJlX2tleWl2Z2VuLAorICAgICBQQkVfVUNTMl9DT05WRVJUX1BBU1NXT1JECiAgICAgfSwKICAgICB7CiAgICAgIE5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDLCBFVlBfZGVzX2VkZTNfY2JjLCBFVlBfc2hhMSwKLSAgICAgcGtjczEyX3BiZV9rZXlpdmdlbiwKKyAgICAgcGtjczEyX3BiZV9rZXlpdmdlbiwgUEJFX1VDUzJfQ09OVkVSVF9QQVNTV09SRAorICAgIH0sCisgICAgeworICAgICAgTklEX3BiZXMyLCBOVUxMLCBOVUxMLCAgUEtDUzVfdjJfUEJFX2tleWl2Z2VuLCAwCiAgICAgfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGJlX3N1aXRlICpnZXRfcGJlX3N1aXRlKGludCBwYmVfbmlkKSB7CisgIHVuc2lnbmVkIGk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa0J1aWx0aW5QQkUpIC8gc2l6ZW9mKGtCdWlsdGluUEJFWzBdKTsgaSsrKSB7CisgICAgaWYgKGtCdWlsdGluUEJFW2ldLnBiZV9uaWQgPT0gcGJlX25pZCkgeworICAgICAgcmV0dXJuICZrQnVpbHRpblBCRVtpXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworLyogcGFzc190b19wYXNzX3JhdyBwZXJmb3JtcyBhIHBhc3N3b3JkIGNvbnZlcnNpb24gKHBvc3NpYmx5IGEgbm8tb3ApCisgKiBhcHByb3ByaWF0ZSB0byB0aGUgc3VwcGxpZWQgfHBiZV9uaWR8LiBUaGUgaW5wdXQgfHBhc3N8IGlzIHRyZWF0ZWQgYXMgYQorICogTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGlmIHxwYXNzX2xlbnwgaXMgLTEsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGEKKyAqIGJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC4gSWYgdGhlIHN1cHBsaWVkIFBCRSBOSUQgc2V0cyB0aGUKKyAqIHxQQkVfVUNTMl9DT05WRVJUX1BBU1NXT1JEfCBmbGFnLCB0aGUgc3VwcGxpZWQgfHBhc3N8IHdpbGwgYmUgY29udmVydGVkIHRvCisgKiBVQ1MtMi4KKyAqCisgKiBJdCBzZXRzIHwqb3V0X3Bhc3NfcmF3fCB0byBhIG5ldyBidWZmZXIgdGhhdCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIGFuZCB6ZXJvIG9uIGVycm9yLiAqLworc3RhdGljIGludCBwYXNzX3RvX3Bhc3NfcmF3KGludCBwYmVfbmlkLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKm91dF9wYXNzX3Jhdywgc2l6ZV90ICpvdXRfcGFzc19yYXdfbGVuKSB7CisgIGlmIChwYXNzID09IE5VTEwpIHsKKyAgICAqb3V0X3Bhc3NfcmF3ID0gTlVMTDsKKyAgICAqb3V0X3Bhc3NfcmF3X2xlbiA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAocGFzc19sZW4gPT0gLTEpIHsKKyAgICBwYXNzX2xlbiA9IHN0cmxlbihwYXNzKTsKKyAgfSBlbHNlIGlmIChwYXNzX2xlbiA8IDAgfHwgcGFzc19sZW4gPiAyMDAwMDAwMDAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX09WRVJGTE9XKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBwYmVfc3VpdGUgKnN1aXRlID0gZ2V0X3BiZV9zdWl0ZShwYmVfbmlkKTsKKyAgaWYgKHN1aXRlICE9IE5VTEwgJiYgKHN1aXRlLT5mbGFncyAmIFBCRV9VQ1MyX0NPTlZFUlRfUEFTU1dPUkQpKSB7CisgICAgaWYgKCFhc2NpaV90b191Y3MyKHBhc3MsIHBhc3NfbGVuLCBvdXRfcGFzc19yYXcsIG91dF9wYXNzX3Jhd19sZW4pKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9IGVsc2UgeworICAgICpvdXRfcGFzc19yYXcgPSBCVUZfbWVtZHVwKHBhc3MsIHBhc3NfbGVuKTsKKyAgICBpZiAoKm91dF9wYXNzX3JhdyA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpvdXRfcGFzc19yYXdfbGVuID0gKHNpemVfdClwYXNzX2xlbjsKKyAgfQorCisgIHJldHVybiAxOworfQorCiBzdGF0aWMgaW50IHBiZV9jaXBoZXJfaW5pdChBU04xX09CSkVDVCAqcGJlX29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhc3NfcmF3LCBzaXplX3QgcGFzc19yYXdfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9UWVBFICpwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCBpc19lbmNyeXB0KSB7CiAgIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcjsKICAgY29uc3QgRVZQX01EICptZDsKLSAgdW5zaWduZWQgaTsKIAotICBjb25zdCBzdHJ1Y3QgcGJlX3N1aXRlICpzdWl0ZSA9IE5VTEw7Ci0gIGNvbnN0IGludCBwYmVfbmlkID0gT0JKX29iajJuaWQocGJlX29iaik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZihrQnVpbHRpblBCRSkgLyBzaXplb2Yoc3RydWN0IHBiZV9zdWl0ZSk7IGkrKykgewotICAgIGlmIChrQnVpbHRpblBCRVtpXS5wYmVfbmlkID09IHBiZV9uaWQpIHsKLSAgICAgIHN1aXRlID0gJmtCdWlsdGluUEJFW2ldOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KKyAgY29uc3Qgc3RydWN0IHBiZV9zdWl0ZSAqc3VpdGUgPSBnZXRfcGJlX3N1aXRlKE9CSl9vYmoybmlkKHBiZV9vYmopKTsKICAgaWYgKHN1aXRlID09IE5VTEwpIHsKICAgICBjaGFyIG9ial9zdHJbODBdOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY2lwaGVyX2luaXQsIFBLQ1M4X1JfVU5LTk9XTl9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOS05PV05fQUxHT1JJVEhNKTsKICAgICBpZiAoIXBiZV9vYmopIHsKICAgICAgIHN0cm5jcHkob2JqX3N0ciwgIk5VTEwiLCBzaXplb2Yob2JqX3N0cikpOwogICAgIH0gZWxzZSB7CkBAIC0zMjQsNyArMzc2LDcgQEAKICAgfSBlbHNlIHsKICAgICBjaXBoZXIgPSBzdWl0ZS0+Y2lwaGVyX2Z1bmMoKTsKICAgICBpZiAoIWNpcGhlcikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jaXBoZXJfaW5pdCwgUEtDUzhfUl9VTktOT1dOX0NJUEhFUik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9VTktOT1dOX0NJUEhFUik7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgIH0KQEAgLTMzNCwxNCArMzg2LDE0IEBACiAgIH0gZWxzZSB7CiAgICAgbWQgPSBzdWl0ZS0+bWRfZnVuYygpOwogICAgIGlmICghbWQpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY2lwaGVyX2luaXQsIFBLQ1M4X1JfVU5LTk9XTl9ESUdFU1QpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5LTk9XTl9ESUdFU1QpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICB9CiAKICAgaWYgKCFzdWl0ZS0+a2V5Z2VuKGN0eCwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwgcGFyYW0sIGNpcGhlciwgbWQsCiAgICAgICAgICAgICAgICAgICAgICBpc19lbmNyeXB0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY2lwaGVyX2luaXQsIFBLQ1M4X1JfS0VZR0VOX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0tFWUdFTl9GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zNjIsMzIgKzQxNCwzMiBAQAogCiAgIGlmICghcGJlX2NpcGhlcl9pbml0KGFsZ29yLT5hbGdvcml0aG0sIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yLT5wYXJhbWV0ZXIsICZjdHgsIGlzX2VuY3J5cHQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jcnlwdCwgUEtDUzhfUl9VTktOT1dOX0NJUEhFUl9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOS05PV05fQ0lQSEVSX0FMR09SSVRITSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KICAgYmxvY2tfc2l6ZSA9IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoJmN0eCk7CiAKICAgaWYgKGluX2xlbiArIGJsb2NrX3NpemUgPCBpbl9sZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NyeXB0LCBQS0NTOF9SX1RPT19MT05HKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9UT09fTE9ORyk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBidWYgPSBPUEVOU1NMX21hbGxvYyhpbl9sZW4gKyBibG9ja19zaXplKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBiZV9jcnlwdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUVWUF9DaXBoZXJVcGRhdGUoJmN0eCwgYnVmLCAmbiwgaW4sIGluX2xlbikpIHsKICAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGJlX2NyeXB0LCBFUlJfUl9FVlBfTElCKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfRVZQX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KICAgKm91dF9sZW4gPSBuOwogCiAgIGlmICghRVZQX0NpcGhlckZpbmFsX2V4KCZjdHgsIGJ1ZiArIG4sICZuKSkgewogICAgIE9QRU5TU0xfZnJlZShidWYpOwotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwYmVfY3J5cHQsIEVSUl9SX0VWUF9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9FVlBfTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogICAqb3V0X2xlbiArPSBuOwpAQCAtNDEwLDE0ICs0NjIsMTQgQEAKIAogICBpZiAoIXBiZV9jcnlwdChhbGdvciwgcGFzc19yYXcsIHBhc3NfcmF3X2xlbiwgb2N0LT5kYXRhLCBvY3QtPmxlbmd0aCwKICAgICAgICAgICAgICAgICAgJm91dCwgJm91dF9sZW4sIDAgLyogZGVjcnlwdCAqLykpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2l0ZW1fZGVjcnlwdF9kMmksIFBLQ1M4X1JfQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0NSWVBUX0VSUk9SKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBwID0gb3V0OwogICByZXQgPSBBU04xX2l0ZW1fZDJpKE5VTEwsICZwLCBvdXRfbGVuLCBpdCk7CiAgIE9QRU5TU0xfY2xlYW5zZShvdXQsIG91dF9sZW4pOwogICBpZiAoIXJldCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBwa2NzMTJfaXRlbV9kZWNyeXB0X2QyaSwgUEtDUzhfUl9ERUNPREVfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CiAgIH0KICAgT1BFTlNTTF9mcmVlKG91dCk7CiAgIHJldHVybiByZXQ7CkBAIC00MjcsMTkgKzQ3OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzc19sZW4pIHsKICAgdWludDhfdCAqcGFzc19yYXcgPSBOVUxMOwogICBzaXplX3QgcGFzc19yYXdfbGVuID0gMDsKLSAgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcmV0OwotCi0gIGlmIChwYXNzKSB7Ci0gICAgaWYgKHBhc3NfbGVuID09IC0xKSB7Ci0gICAgICBwYXNzX2xlbiA9IHN0cmxlbihwYXNzKTsKLSAgICB9Ci0gICAgaWYgKCFhc2NpaV90b191Y3MyKHBhc3MsIHBhc3NfbGVuLCAmcGFzc19yYXcsICZwYXNzX3Jhd19sZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfZGVjcnlwdCwgUEtDUzhfUl9ERUNPREVfRVJST1IpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICBpZiAoIXBhc3NfdG9fcGFzc19yYXcoT0JKX29iajJuaWQocGtjczgtPmFsZ29yLT5hbGdvcml0aG0pLCBwYXNzLCBwYXNzX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwYXNzX3JhdywgJnBhc3NfcmF3X2xlbikpIHsKKyAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIHJldCA9IFBLQ1M4X2RlY3J5cHRfcGJlKHBrY3M4LCBwYXNzX3JhdywgcGFzc19yYXdfbGVuKTsKKyAgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcmV0ID0gUEtDUzhfZGVjcnlwdF9wYmUocGtjczgsIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4pOwogCiAgIGlmIChwYXNzX3JhdykgewogICAgIE9QRU5TU0xfY2xlYW5zZShwYXNzX3JhdywgcGFzc19yYXdfbGVuKTsKQEAgLTQ2NiwxNyArNTExLDE3IEBACiAKICAgb2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKTsKICAgaWYgKG9jdCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9pdGVtX2kyZF9lbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBpbl9sZW4gPSBBU04xX2l0ZW1faTJkKG9iaiwgJmluLCBpdCk7CiAgIGlmICghaW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgcGtjczEyX2l0ZW1faTJkX2VuY3J5cHQsIFBLQ1M4X1JfRU5DT0RFX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9FTkNPREVfRVJST1IpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIGlmICghcGJlX2NyeXB0KGFsZ29yLCBwYXNzX3JhdywgcGFzc19yYXdfbGVuLCBpbiwgaW5fbGVuLCAmb2N0LT5kYXRhLCAmY3J5cHRfbGVuLAogICAgICAgICAgICAgICAgICAxIC8qIGVuY3J5cHQgKi8pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIHBrY3MxMl9pdGVtX2kyZF9lbmNyeXB0LCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOwogICAgIE9QRU5TU0xfZnJlZShpbik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KQEAgLTQ5MSwyMCArNTM2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9ucywgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpIHsKICAgdWludDhfdCAqcGFzc19yYXcgPSBOVUxMOwogICBzaXplX3QgcGFzc19yYXdfbGVuID0gMDsKLSAgWDUwOV9TSUcgKnJldDsKLQotICBpZiAocGFzcykgewotICAgIGlmIChwYXNzX2xlbiA9PSAtMSkgewotICAgICAgcGFzc19sZW4gPSBzdHJsZW4ocGFzcyk7Ci0gICAgfQotICAgIGlmICghYXNjaWlfdG9fdWNzMihwYXNzLCBwYXNzX2xlbiwgJnBhc3NfcmF3LCAmcGFzc19yYXdfbGVuKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X2VuY3J5cHQsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgaWYgKCFwYXNzX3RvX3Bhc3NfcmF3KHBiZV9uaWQsIHBhc3MsIHBhc3NfbGVuLCAmcGFzc19yYXcsICZwYXNzX3Jhd19sZW4pKSB7CisgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAotICByZXQgPSBQS0NTOF9lbmNyeXB0X3BiZShwYmVfbmlkLCBwYXNzX3JhdywgcGFzc19yYXdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBzYWx0X2xlbiwgaXRlcmF0aW9ucywgcDhpbmYpOworICBYNTA5X1NJRyAqcmV0ID0gUEtDUzhfZW5jcnlwdF9wYmUocGJlX25pZCwgY2lwaGVyLCBwYXNzX3JhdywgcGFzc19yYXdfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgc2FsdF9sZW4sIGl0ZXJhdGlvbnMsIHA4aW5mKTsKIAogICBpZiAocGFzc19yYXcpIHsKICAgICBPUEVOU1NMX2NsZWFuc2UocGFzc19yYXcsIHBhc3NfcmF3X2xlbik7CkBAIC01MTMsNyArNTUwLDcgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotWDUwOV9TSUcgKlBLQ1M4X2VuY3J5cHRfcGJlKGludCBwYmVfbmlkLAorWDUwOV9TSUcgKlBLQ1M4X2VuY3J5cHRfcGJlKGludCBwYmVfbmlkLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFzc19yYXcsIHNpemVfdCBwYXNzX3Jhd19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2FsdCwgc2l6ZV90IHNhbHRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25zLCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZikgewpAQCAtNTIyLDEzICs1NTksMTcgQEAKIAogICBwa2NzOCA9IFg1MDlfU0lHX25ldygpOwogICBpZiAocGtjczggPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0X3BiZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAotICBwYmUgPSBQS0NTNV9wYmVfc2V0KHBiZV9uaWQsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKKyAgaWYgKHBiZV9uaWQgPT0gLTEpIHsKKyAgICBwYmUgPSBQS0NTNV9wYmUyX3NldChjaXBoZXIsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKKyAgfSBlbHNlIHsKKyAgICBwYmUgPSBQS0NTNV9wYmVfc2V0KHBiZV9uaWQsIGl0ZXJhdGlvbnMsIHNhbHQsIHNhbHRfbGVuKTsKKyAgfQogICBpZiAoIXBiZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9lbmNyeXB0X3BiZSwgRVJSX1JfQVNOMV9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFUlJfUl9BU04xX0xJQik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNTM4LDcgKzU3OSw3IEBACiAgIHBrY3M4LT5kaWdlc3QgPSBwa2NzMTJfaXRlbV9pMmRfZW5jcnlwdCgKICAgICAgIHBiZSwgQVNOMV9JVEVNX3JwdHIoUEtDUzhfUFJJVl9LRVlfSU5GTyksIHBhc3NfcmF3LCBwYXNzX3Jhd19sZW4sIHA4aW5mKTsKICAgaWYgKCFwa2NzOC0+ZGlnZXN0KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X2VuY3J5cHRfcGJlLCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0VOQ1JZUFRfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTU2MCwxMyArNjAxLDEyIEBACiAKICAgcGtleSA9IEVWUF9QS0VZX25ldygpOwogICBpZiAocGtleSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0NTODJQS0VZLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIGlmICghRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgT0JKX29iajJuaWQoYWxnb2lkKSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLQ1M4MlBLRVksCi0gICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITSk7CiAgICAgaTJ0X0FTTjFfT0JKRUNUKG9ial90bXAsIDgwLCBhbGdvaWQpOwogICAgIEVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiVFlQRT0iLCBvYmpfdG1wKTsKICAgICBnb3RvIGVycm9yOwpAQCAtNTc0LDExICs2MTQsMTEgQEAKIAogICBpZiAocGtleS0+YW1ldGgtPnByaXZfZGVjb2RlKSB7CiAgICAgaWYgKCFwa2V5LT5hbWV0aC0+cHJpdl9kZWNvZGUocGtleSwgcDgpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLQ1M4MlBLRVksIFBLQ1M4X1JfUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1BSSVZBVEVfS0VZX0RFQ09ERV9FUlJPUik7CiAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLQ1M4MlBLRVksIFBLQ1M4X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAKQEAgLTU5NCw3ICs2MzQsNyBAQAogCiAgIHA4ID0gUEtDUzhfUFJJVl9LRVlfSU5GT19uZXcoKTsKICAgaWYgKHA4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLRVkyUEtDUzgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIHA4LT5icm9rZW4gPSBQS0NTOF9PSzsKQEAgLTYwMiwxNyArNjQyLDE1IEBACiAgIGlmIChwa2V5LT5hbWV0aCkgewogICAgIGlmIChwa2V5LT5hbWV0aC0+cHJpdl9lbmNvZGUpIHsKICAgICAgIGlmICghcGtleS0+YW1ldGgtPnByaXZfZW5jb2RlKHA4LCBwa2V5KSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVZQX1BLRVkyUEtDUzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfUFJJVkFURV9LRVlfRU5DT0RFX0VSUk9SKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIEVWUF9QS0VZMlBLQ1M4LCBQS0NTOF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICB9IGVsc2UgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBFVlBfUEtFWTJQS0NTOCwKLSAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1VOU1VQUE9SVEVEX1BSSVZBVEVfS0VZX0FMR09SSVRITSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNKTsKICAgICBnb3RvIGVycm9yOwogICB9CiAgIHJldHVybiBwODsKQEAgLTY0Niw4ICs2ODQsNyBAQAogICAgKiBwa2NzNy1lbmNyeXB0ZWREYXRhIGFuZCBhIHBrY3M3LWRhdGEpIGFuZCBkZXB0aCAxICh0aGUgdmFyaW91cyBQS0NTIzEyCiAgICAqIGJhZ3MpLiAqLwogICBpZiAoZGVwdGggPiAzKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvcywKLSAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1BLQ1MxMl9UT09fREVFUExZX05FU1RFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfUEtDUzEyX1RPT19ERUVQTFlfTkVTVEVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC02NTYsNiArNjkzLDcgQEAKICAgICogY29udmVyc2lvbiBjYW5ub3Qgc2VlIHRocm91Z2ggdGhvc2Ugd3JhcHBpbmdzLiBTbyBlYWNoIHRpbWUgd2Ugc3RlcAogICAgKiB0aHJvdWdoIG9uZSB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8gREVSIGFnYWluLiAqLwogICBpZiAoIUNCU19hc24xX2Jlcl90b19kZXIoY29udGVudF9pbmZvcywgJmRlcl9ieXRlcywgJmRlcl9sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC02NjYsMTYgKzcwNCwxNCBAQAogICB9CiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJmluLCAmaW4sIENCU19BU04xX1NFUVVFTkNFKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mb3MsCi0gICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICB3aGlsZSAoQ0JTX2xlbigmaW4pID4gMCkgewogICAgIENCUyBjb250ZW50X2luZm87CiAgICAgaWYgKCFDQlNfZ2V0X2FzbjEoJmluLCAmY29udGVudF9pbmZvLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC03MDUsOCArNzQxLDcgQEAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoY29udGVudF9pbmZvLCAmY29udGVudF90eXBlLCBDQlNfQVNOMV9PQkpFQ1QpIHx8CiAgICAgICAhQ0JTX2dldF9hc24xKGNvbnRlbnRfaW5mbywgJndyYXBwZWRfY29udGVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCAwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03MzQsMTQgKzc2OSwxMiBAQAogICAgICAgICAhQ0JTX2dldF9hc24xX2VsZW1lbnQoJmVjaSwgJmFpLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKICAgICAgICAgIUNCU19nZXRfYXNuMSgmZWNpLCAmZW5jcnlwdGVkX2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgIENCU19BU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCAwKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIGlmIChPQkpfY2JzMm5pZCgmY29udGVudHNfdHlwZSkgIT0gTklEX3BrY3M3X2RhdGEpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTc1Miw4ICs3ODUsNyBAQAogICAgIH0KICAgICBpZiAoaW5wICE9IENCU19kYXRhKCZhaSkgKyBDQlNfbGVuKCZhaSkpIHsKICAgICAgIFg1MDlfQUxHT1JfZnJlZShhbGdvcik7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC03NzMsOCArODA1LDcgQEAKIAogICAgIGlmICghQ0JTX2dldF9hc24xKCZ3cmFwcGVkX2NvbnRlbnRzLCAmb2N0ZXRfc3RyaW5nX2NvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9PQ1RFVFNUUklORykpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTc4Nyw4ICs4MTgsNyBAQAogICAgIFg1MDlfU0lHICplbmNyeXB0ZWQgPSBOVUxMOwogCiAgICAgaWYgKCpjdHgtPm91dF9rZXkpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfaGFuZGxlX2NvbnRlbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfTVVMVElQTEVfUFJJVkFURV9LRVlTX0lOX1BLQ1MxMik7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9NVUxUSVBMRV9QUklWQVRFX0tFWVNfSU5fUEtDUzEyKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtNzk2LDEzICs4MjYsMTEgQEAKICAgICAgKiBzdHJ1Y3R1cmUgYXMgb25lIGFuZCBzbyB8WDUwOV9TSUd8IGlzIHJldXNlZCB0byBzdG9yZSBpdC4gKi8KICAgICBlbmNyeXB0ZWQgPSBkMmlfWDUwOV9TSUcoTlVMTCwgJmlucCwgQ0JTX2xlbigmd3JhcHBlZF9jb250ZW50cykpOwogICAgIGlmIChlbmNyeXB0ZWQgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBpZiAoaW5wICE9IENCU19kYXRhKCZ3cmFwcGVkX2NvbnRlbnRzKSArIENCU19sZW4oJndyYXBwZWRfY29udGVudHMpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgWDUwOV9TSUdfZnJlZShlbmNyeXB0ZWQpOwogICAgICAgZ290byBlcnI7CiAgICAgfQpAQCAtODI4LDggKzg1Niw3IEBACiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJmNlcnRfYmFnLCAmd3JhcHBlZF9jZXJ0LAogICAgICAgICAgICAgICAgICAgICAgIENCU19BU04xX0NPTlRFWFRfU1BFQ0lGSUMgfCBDQlNfQVNOMV9DT05TVFJVQ1RFRCB8IDApIHx8CiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJndyYXBwZWRfY2VydCwgJmNlcnQsIENCU19BU04xX09DVEVUU1RSSU5HKSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtODM3LDEzICs4NjQsMTEgQEAKICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucCA9IENCU19kYXRhKCZjZXJ0KTsKICAgICAgIFg1MDkgKng1MDkgPSBkMmlfWDUwOShOVUxMLCAmaW5wLCBDQlNfbGVuKCZjZXJ0KSk7CiAgICAgICBpZiAoIXg1MDkpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9oYW5kbGVfY29udGVudF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgICAgfQogICAgICAgaWYgKGlucCAhPSBDQlNfZGF0YSgmY2VydCkgKyBDQlNfbGVuKCZjZXJ0KSkgewotICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2hhbmRsZV9jb250ZW50X2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICAgICAgWDUwOV9mcmVlKHg1MDkpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KQEAgLTg3NSw2ICs5MDAsNyBAQAogCiAgIC8qIFRoZSBpbnB1dCBtYXkgYmUgaW4gQkVSIGZvcm1hdC4gKi8KICAgaWYgKCFDQlNfYXNuMV9iZXJfdG9fZGVyKGJlcl9pbiwgJmRlcl9ieXRlcywgJmRlcl9sZW4pKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoZGVyX2J5dGVzICE9IE5VTEwpIHsKQEAgLTg5MSwyOCArOTE3LDI3IEBACiAgIGlmICghQ0JTX2dldF9hc24xKCZpbiwgJnBmeCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CiAgICAgICBDQlNfbGVuKCZpbikgIT0gMCB8fAogICAgICAgIUNCU19nZXRfYXNuMV91aW50NjQoJnBmeCwgJnZlcnNpb24pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cywgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAodmVyc2lvbiA8IDMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgIFBLQ1M4X1JfQkFEX1BLQ1MxMl9WRVJTSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX1ZFUlNJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnBmeCwgJmF1dGhzYWZlLCBDQlNfQVNOMV9TRVFVRU5DRSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChDQlNfbGVuKCZwZngpID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX01JU1NJTkdfTUFDKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9NSVNTSU5HX01BQyk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUNCU19nZXRfYXNuMSgmcGZ4LCAmbWFjX2RhdGEsIENCU19BU04xX1NFUVVFTkNFKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTkyMSw3ICs5NDYsNyBAQAogICBpZiAoIUNCU19nZXRfYXNuMSgmYXV0aHNhZmUsICZjb250ZW50X3R5cGUsIENCU19BU04xX09CSkVDVCkgfHwKICAgICAgICFDQlNfZ2V0X2FzbjEoJmF1dGhzYWZlLCAmd3JhcHBlZF9hdXRoc2FmZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCAwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTkyOSwxMyArOTU0LDEyIEBACiAgICAqIGxhdHRlciBpbmRpY2F0ZXMgdGhhdCBpdCdzIHNpZ25lZCBieSBhIHB1YmxpYyBrZXksIHdoaWNoIGlzbid0CiAgICAqIHN1cHBvcnRlZC4gKi8KICAgaWYgKE9CSl9jYnMybmlkKCZjb250ZW50X3R5cGUpICE9IE5JRF9wa2NzN19kYXRhKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICBQS0NTOF9SX1BLQ1MxMl9QVUJMSUNfS0VZX0lOVEVHUklUWV9OT1RfU1VQUE9SVEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9QS0NTMTJfUFVCTElDX0tFWV9JTlRFR1JJVFlfTk9UX1NVUFBPUlRFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoIUNCU19nZXRfYXNuMSgmd3JhcHBlZF9hdXRoc2FmZXMsICZhdXRoc2FmZXMsIENCU19BU04xX09DVEVUU1RSSU5HKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfQkFEX1BLQ1MxMl9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTk0Myw3ICs5NjcsNyBAQAogICBjdHgub3V0X2NlcnRzID0gb3V0X2NlcnRzOwogICBpZiAoIWFzY2lpX3RvX3VjczIocGFzc3dvcmQsIHN0cmxlbihwYXNzd29yZCksICZjdHgucGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAmY3R4LnBhc3N3b3JkX2xlbikpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX0RFQ09ERV9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfREVDT0RFX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC05NjIsNyArOTg2LDcgQEAKICAgICAgICAgIUNCU19nZXRfYXNuMSgmaGFzaF90eXBlX3NlcSwgJmhhc2hfb2lkLCBDQlNfQVNOMV9PQkpFQ1QpIHx8CiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJm1hYywgJmV4cGVjdGVkX21hYywgQ0JTX0FTTjFfT0NURVRTVFJJTkcpIHx8CiAgICAgICAgICFDQlNfZ2V0X2FzbjEoJm1hY19kYXRhLCAmc2FsdCwgQ0JTX0FTTjFfT0NURVRTVFJJTkcpKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLCBQS0NTOF9SX0JBRF9QS0NTMTJfREFUQSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogCkBAIC05NzEsOCArOTk1LDcgQEAKICAgICBpZiAoQ0JTX2xlbigmbWFjX2RhdGEpID4gMCkgewogICAgICAgaWYgKCFDQlNfZ2V0X2FzbjFfdWludDY0KCZtYWNfZGF0YSwgJml0ZXJhdGlvbnMpIHx8CiAgICAgICAgICAgaXRlcmF0aW9ucyA+IElOVF9NQVgpIHsKLSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1MxMl9nZXRfa2V5X2FuZF9jZXJ0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzhfUl9CQURfUEtDUzEyX0RBVEEpOwogICAgICAgICBnb3RvIGVycjsKICAgICAgIH0KICAgICB9CkBAIC05ODAsNyArMTAwMyw3IEBACiAgICAgaGFzaF9uaWQgPSBPQkpfY2JzMm5pZCgmaGFzaF9vaWQpOwogICAgIGlmIChoYXNoX25pZCA9PSBOSURfdW5kZWYgfHwKICAgICAgICAgKG1kID0gRVZQX2dldF9kaWdlc3RieW5pZChoYXNoX25pZCkpID09IE5VTEwpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTMTJfZ2V0X2tleV9hbmRfY2VydHMsIFBLQ1M4X1JfVU5LTk9XTl9IQVNIKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFBLQ1M4LCBQS0NTOF9SX1VOS05PV05fSEFTSCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAKQEAgLTk5Niw4ICsxMDE5LDcgQEAKICAgICB9CiAKICAgICBpZiAoIUNCU19tZW1fZXF1YWwoJmV4cGVjdGVkX21hYywgaG1hYywgaG1hY19sZW4pKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgUEtDUzEyX2dldF9rZXlfYW5kX2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgUEtDUzhfUl9JTkNPUlJFQ1RfUEFTU1dPUkQpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUEtDUzgsIFBLQ1M4X1JfSU5DT1JSRUNUX1BBU1NXT1JEKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfQpAQCAtMTEyNiw2ICsxMTQ4LDcgQEAKICAgaWYgKCFjYV9jZXJ0cykgewogICAgIGNhX2NlcnRzID0gc2tfWDUwOV9uZXdfbnVsbCgpOwogICAgIGlmIChjYV9jZXJ0cyA9PSBOVUxMKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihQS0NTOCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGNhX2NlcnRzX2FsbG9jZWQgPSAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9wa2NzOC9wa2NzOF90ZXN0LmNjIGIvc3JjL2NyeXB0by9wa2NzOC9wa2NzOF90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODhkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL3BrY3M4L3BrY3M4X3Rlc3QuY2MKQEAgLTAsMCArMSw5MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M4Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpbmNsdWRlICIuLi90ZXN0L3Njb3BlZF90eXBlcy5oIgorCisKKy8qIGtERVIgaXMgYSBQS0NTIzggZW5jcnlwdGVkIHByaXZhdGUga2V5LiBJdCB3YXMgZ2VuZXJhdGVkIHdpdGg6CisgKgorICogb3BlbnNzbCBnZW5yc2EgNTEyID4gdGVzdC5rZXkKKyAqIG9wZW5zc2wgcGtjczggLXRvcGs4IC1pbiB0ZXN0LmtleSAtb3V0IHRlc3Qua2V5LmVuY3J5cHRlZCAtdjIgZGVzMyAtb3V0Zm9ybSBkZXIKKyAqIGhleGR1bXAgLUN2IHRlc3Qua2V5LmVuY3J5cHRlZAorICoKKyAqIFRoZSBwYXNzd29yZCBpcyAidGVzdGluZyIuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGtERVJbXSA9IHsKKyAgMHgzMCwgMHg4MiwgMHgwMSwgMHg5ZSwgMHgzMCwgMHg0MCwgMHgwNiwgMHgwOSwgMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhmNywgMHgwZCwgMHgwMSwgMHgwNSwKKyAgMHgwZCwgMHgzMCwgMHgzMywgMHgzMCwgMHgxYiwgMHgwNiwgMHgwOSwgMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhmNywgMHgwZCwgMHgwMSwgMHgwNSwgMHgwYywKKyAgMHgzMCwgMHgwZSwgMHgwNCwgMHgwOCwgMHgwNiwgMHhhNSwgMHg0YiwgMHgwYywgMHgwYywgMHg1MCwgMHg4YywgMHgxOSwgMHgwMiwgMHgwMiwgMHgwOCwgMHgwMCwKKyAgMHgzMCwgMHgxNCwgMHgwNiwgMHgwOCwgMHgyYSwgMHg4NiwgMHg0OCwgMHg4NiwgMHhmNywgMHgwZCwgMHgwMywgMHgwNywgMHgwNCwgMHgwOCwgMHgzYSwgMHhkMCwKKyAgMHg3MCwgMHg0YiwgMHgyNiwgMHg1MCwgMHgxMywgMHg3YiwgMHgwNCwgMHg4MiwgMHgwMSwgMHg1OCwgMHhhNiwgMHhlZSwgMHgwMiwgMHhmMiwgMHhmMiwgMHg3YywKKyAgMHgxOSwgMHg5MSwgMHhlMywgMHhjZSwgMHgzMiwgMHg4NSwgMHhjNSwgMHgwMSwgMHhkOSwgMHhlMywgMHg1ZSwgMHgxNCwgMHhiNiwgMHhiOCwgMHg3OCwgMHhhZCwKKyAgMHhkYSwgMHgwMSwgMHhlYywgMHg5ZSwgMHg0MiwgMHhlOCwgMHhiZiwgMHgwYiwgMHg0NiwgMHgwMywgMHhiYywgMHg5MiwgMHg2ZiwgMHhlNCwgMHgwZiwgMHgwZiwKKyAgMHg0OCwgMHgzMCwgMHgxMCwgMHgxMCwgMHg5YiwgMHhmYiwgMHg0YiwgMHhiOSwgMHg0NSwgMHhmOCwgMHhjZiwgMHhhYiwgMHhhMSwgMHgxOCwgMHhkZCwgMHgxOSwKKyAgMHhhNCwgMHhhNCwgMHhlMSwgMHhmMCwgMHhhMSwgMHg4ZCwgMHhjMiwgMHgyMywgMHhlNywgMHgwZCwgMHg3YSwgMHg2NCwgMHgyMSwgMHg2YiwgMHhmYSwgMHg0OCwKKyAgMHhiOSwgMHg0MSwgMHhjMSwgMHgwYywgMHg0YiwgMHhjZSwgMHg2ZiwgMHgxYSwgMHg5MSwgMHg5YiwgMHg5ZiwgMHhkZCwgMHhjZiwgMHhhOSwgMHg4ZCwgMHgzMywKKyAgMHgyYywgMHg0NSwgMHg4MSwgMHg1YywgMHg1ZSwgMHg2NywgMHhjNiwgMHg2OCwgMHg0MywgMHg2MiwgMHhmZiwgMHg1ZSwgMHg5YiwgMHgxYSwgMHgxNSwgMHgzYSwKKyAgMHg5ZCwgMHg3MSwgMHgzZiwgMHhiZSwgMHgzMiwgMHgyZiwgMHhlNSwgMHg5MCwgMHg2NSwgMHg2NSwgMHg5YywgMHgyMiwgMHhmNiwgMHgyOSwgMHgyZSwgMHhjZiwKKyAgMHgyNiwgMHgxNiwgMHg3YiwgMHg2NiwgMHg0OCwgMHg1NSwgMHhhZCwgMHg5YSwgMHg4ZCwgMHg4OSwgMHhmNCwgMHg0OCwgMHg0ZiwgMHgxZiwgMHg5ZCwgMHhiOCwKKyAgMHhmYSwgMHhlMSwgMHhmMSwgMHgzYiwgMHgzOSwgMHg1YywgMHg3MiwgMHhjNiwgMHhiOCwgMHgzZSwgMHg5OCwgMHhlOCwgMHg3NywgMHhlOCwgMHhiNiwgMHg3MSwKKyAgMHg4NCwgMHhhOCwgMHg2ZSwgMHhjYSwgMHhhZiwgMHg2MiwgMHg5NiwgMHg0OSwgMHg4YSwgMHgyMSwgMHg2ZiwgMHg5ZSwgMHg3OCwgMHgwNywgMHg5NywgMHgzOCwKKyAgMHg0MCwgMHg2NiwgMHg0MiwgMHg1YSwgMHgxYiwgMHhlMCwgMHg5YiwgMHhlOSwgMHg5MSwgMHg4MiwgMHhlNCwgMHhlYSwgMHg4ZiwgMHgyYSwgMHhiMiwgMHg4MCwKKyAgMHhjZSwgMHhlOCwgMHg1NywgMHhkMywgMHhhYywgMHgxMSwgMHg5ZCwgMHhiMiwgMHgzOSwgMHgwZiwgMHhlMSwgMHhjZSwgMHgxOCwgMHg5NiwgMHgzOCwgMHhhMSwKKyAgMHgxOSwgMHg4MCwgMHg4OCwgMHg4MSwgMHgzZCwgMHhkYSwgMHhhYSwgMHg4ZSwgMHgxNSwgMHgyNywgMHgxOSwgMHg3MywgMHgwYywgMHhmMywgMHhhZiwgMHg0NSwKKyAgMHhlOSwgMHgxYiwgMHhhZCwgMHg2YywgMHgzZCwgMHhiZiwgMHg5NSwgMHhmNywgMHhhMCwgMHg4NywgMHgwZSwgMHhkZSwgMHhmMSwgMHhkOCwgMHhlZSwgMHhhYSwKKyAgMHg5MiwgMHg3NiwgMHg4ZCwgMHgzMiwgMHg0NSwgMHhhMSwgMHhlNywgMHhmNSwgMHgwNSwgMHhkNiwgMHgyYywgMHg2NywgMHg2MywgMHgxMCwgMHhmYSwgMHhkZSwKKyAgMHg4MCwgMHhjNywgMHg1YiwgMHg5NiwgMHgwZiwgMHgyNCwgMHg1MCwgMHg3OCwgMHgzMCwgMHhlNSwgMHg4OSwgMHhmMywgMHg3MywgMHhmYSwgMHg0MCwgMHgxMSwKKyAgMHhkNSwgMHgyNiwgMHhiOCwgMHgzNiwgMHg5NiwgMHg5OCwgMHhlNiwgMHhiZCwgMHg3MywgMHg2MiwgMHg1NiwgMHhiOSwgMHhlYSwgMHgyOCwgMHgxNiwgMHg5MywKKyAgMHg1YiwgMHgzMywgMHhhZSwgMHg4MywgMHhmOSwgMHgxZiwgMHhlZSwgMHhlZiwgMHhjOCwgMHhiZiwgMHhjNywgMHhiMSwgMHg0NywgMHg0MywgMHhhMSwgMHhjNiwKKyAgMHgxYSwgMHg2NCwgMHg0NywgMHgwMiwgMHg0MCwgMHgzZSwgMHhiYywgMHgwZiwgMHg4MCwgMHg3MSwgMHg1YywgMHg0NCwgMHg2MCwgMHhiYywgMHg3OCwgMHgyZSwKKyAgMHhkMiwgMHg3NywgMHhmOCwgMHg2ZSwgMHgxMiwgMHg1MSwgMHg4OSwgMHhkYiwgMHg5MCwgMHg2NCwgMHhjZCwgMHg3NiwgMHgxMCwgMHgyOSwgMHg3MywgMHhjMiwKKyAgMHgyZiwgMHg5NCwgMHg3YiwgMHg5OCwgMHhjZCwgMHhiYiwgMHg2MSwgMHgxNiwgMHgxZCwgMHg1MiwgMHgxMSwgMHg3MywgMHg0OCwgMHhlNiwgMHgzOSwgMHhmYywKKyAgMHhkNiwgMHgyZCwKK307CisKK3N0YXRpYyBib29sIHRlc3QoY29uc3QgdWludDhfdCAqZGVyLCBzaXplX3QgZGVyX2xlbikgeworICBjb25zdCB1aW50OF90ICpkYXRhID0gZGVyOworICBTY29wZWRYNTA5X1NJRyBzaWcoZDJpX1g1MDlfU0lHKE5VTEwsICZkYXRhLCBkZXJfbGVuKSk7CisgIGlmIChzaWcuZ2V0KCkgPT0gTlVMTCB8fCBkYXRhICE9IGRlciArIGRlcl9sZW4pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImQyaV9YNTA5X1NJRyBmYWlsZWQgb3IgZGlkIG5vdCBjb25zdW1lIGFsbCBieXRlcy5cbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyIGtQYXNzd29yZFtdID0gInRlc3RpbmciOworICBTY29wZWRQS0NTOF9QUklWX0tFWV9JTkZPIGtleXBhaXIoUEtDUzhfZGVjcnlwdChzaWcuZ2V0KCksIGtQYXNzd29yZCwgLTEpKTsKKyAgaWYgKCFrZXlwYWlyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJQS0NTOF9kZWNyeXB0IGZhaWxlZC5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIGlmICghdGVzdChrREVSLCBzaXplb2Yoa0RFUikpKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBwcmludGYoIlBBU1NcbiIpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcG9seTEzMDUvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3BvbHkxMzA1L0NNYWtlTGlzdHMudHh0CmluZGV4IGJiMGMxZTQuLjY3NGQ5ZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcG9seTEzMDUvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9wb2x5MTMwNS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAiYXJtIikKICAgc2V0KApAQCAtMTksMyArMTksMTIgQEAKIAogICAke1BPTFkxMzA1X0FSQ0hfU09VUkNFU30KICkKKworYWRkX2V4ZWN1dGFibGUoCisgIHBvbHkxMzA1X3Rlc3QKKworICBwb2x5MTMwNV90ZXN0LmNjCisgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgorKQorCit0YXJnZXRfbGlua19saWJyYXJpZXMocG9seTEzMDVfdGVzdCBjcnlwdG8pCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QuY2MgYi9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyNjA3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vcG9seTEzMDUvcG9seTEzMDVfdGVzdC5jYwpAQCAtMCwwICsxLDgxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BvbHkxMzA1Lmg+CisKKyNpbmNsdWRlICIuLi90ZXN0L2ZpbGVfdGVzdC5oIgorI2luY2x1ZGUgIi4uL3Rlc3Qvc3RsX2NvbXBhdC5oIgorCisKKy8vIHxDUllQVE9fcG9seTEzMDVfZmluaXNofCByZXF1aXJlcyBhIDE2LWJ5dGUtYWxpZ25lZCBvdXRwdXQuCisjaWYgZGVmaW5lZChPUEVOU1NMX1dJTkRPV1MpCisvLyBNU1ZDIGRvZXNuJ3Qgc3VwcG9ydCBDKysxMSB8YWxpZ25hc3wuCisjZGVmaW5lIEFMSUdORUQgX19kZWNsc3BlYyhhbGlnbigxNikpCisjZWxzZQorI2RlZmluZSBBTElHTkVEIGFsaWduYXMoMTYpCisjZW5kaWYKKworc3RhdGljIGJvb2wgVGVzdFBvbHkxMzA1KEZpbGVUZXN0ICp0LCB2b2lkICphcmcpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5LCBpbiwgbWFjOworICBpZiAoIXQtPkdldEJ5dGVzKCZrZXksICJLZXkiKSB8fAorICAgICAgIXQtPkdldEJ5dGVzKCZpbiwgIklucHV0IikgfHwKKyAgICAgICF0LT5HZXRCeXRlcygmbWFjLCAiTUFDIikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGtleS5zaXplKCkgIT0gMzIgfHwgbWFjLnNpemUoKSAhPSAxNikgeworICAgIHQtPlByaW50TGluZSgiSW52YWxpZCB0ZXN0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGVzdCBzaW5nbGUtc2hvdCBvcGVyYXRpb24uCisgIHBvbHkxMzA1X3N0YXRlIHN0YXRlOworICBDUllQVE9fcG9seTEzMDVfaW5pdCgmc3RhdGUsIGJzc2w6OnZlY3Rvcl9kYXRhKCZrZXkpKTsKKyAgQ1JZUFRPX3BvbHkxMzA1X3VwZGF0ZSgmc3RhdGUsIGJzc2w6OnZlY3Rvcl9kYXRhKCZpbiksIGluLnNpemUoKSk7CisgIEFMSUdORUQgdWludDhfdCBvdXRbMTZdOworICBDUllQVE9fcG9seTEzMDVfZmluaXNoKCZzdGF0ZSwgb3V0KTsKKyAgaWYgKCF0LT5FeHBlY3RCeXRlc0VxdWFsKG91dCwgMTYsIGJzc2w6OnZlY3Rvcl9kYXRhKCZtYWMpLCBtYWMuc2l6ZSgpKSkgeworICAgIHQtPlByaW50TGluZSgiU2luZ2xlLXNob3QgUG9seTEzMDUgZmFpbGVkLiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRlc3Qgc3RyZWFtaW5nIGJ5dGUtYnktYnl0ZS4KKyAgQ1JZUFRPX3BvbHkxMzA1X2luaXQoJnN0YXRlLCBic3NsOjp2ZWN0b3JfZGF0YSgma2V5KSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKKyAgICBDUllQVE9fcG9seTEzMDVfdXBkYXRlKCZzdGF0ZSwgJmluW2ldLCAxKTsKKyAgfQorICBDUllQVE9fcG9seTEzMDVfZmluaXNoKCZzdGF0ZSwgb3V0KTsKKyAgaWYgKCF0LT5FeHBlY3RCeXRlc0VxdWFsKG91dCwgMTYsIGJzc2w6OnZlY3Rvcl9kYXRhKCZtYWMpLCBtYWMuc2l6ZSgpKSkgeworICAgIHQtPlByaW50TGluZSgiU3RyZWFtaW5nIFBvbHkxMzA1IGZhaWxlZC4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgIENSWVBUT19saWJyYXJ5X2luaXQoKTsKKworICBpZiAoYXJnYyAhPSAyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyA8dGVzdCBmaWxlPlxuIiwgYXJndlswXSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICByZXR1cm4gRmlsZVRlc3RNYWluKFRlc3RQb2x5MTMwNSwgbnVsbHB0ciwgYXJndlsxXSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3BvbHkxMzA1L3BvbHkxMzA1X3Rlc3QudHh0IGIvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV90ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzVkNDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9wb2x5MTMwNS9wb2x5MTMwNV90ZXN0LnR4dApAQCAtMCwwICsxLDUyIEBACisjIFJGQyA3MzU5LCBzZWN0aW9uIDIuNS4yLgorCitLZXkgPSA4NWQ2YmU3ODU3NTU2ZDMzN2Y0NDUyZmU0MmQ1MDZhODAxMDM4MDhhZmIwZGIyZmQ0YWJmZjZhZjQxNDlmNTFiCitJbnB1dCA9ICJDcnlwdG9ncmFwaGljIEZvcnVtIFJlc2VhcmNoIEdyb3VwIgorTUFDID0gYTgwNjFkYzEzMDUxMzZjNmMyMmI4YmFmMGMwMTI3YTkKKworCisjIFJGQyA3MzU5LCBzZWN0aW9uIEEuMy4KKworS2V5ID0gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorSW5wdXQgPSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorTUFDID0gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworS2V5ID0gMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzNmU1ZjZiNWM1ZTA2MDcwZjBlZmNhOTYyMjdhODYzZQorSW5wdXQgPSA0MTZlNzkyMDczNzU2MjZkNjk3MzczNjk2ZjZlMjA3NDZmMjA3NDY4NjUyMDQ5NDU1NDQ2MjA2OTZlNzQ2NTZlNjQ2NTY0MjA2Mjc5MjA3NDY4NjUyMDQzNmY2ZTc0NzI2OTYyNzU3NDZmNzIyMDY2NmY3MjIwNzA3NTYyNmM2OTYzNjE3NDY5NmY2ZTIwNjE3MzIwNjE2YzZjMjA2ZjcyMjA3MDYxNzI3NDIwNmY2NjIwNjE2ZTIwNDk0NTU0NDYyMDQ5NmU3NDY1NzI2ZTY1NzQyZDQ0NzI2MTY2NzQyMDZmNzIyMDUyNDY0MzIwNjE2ZTY0MjA2MTZlNzkyMDczNzQ2MTc0NjU2ZDY1NmU3NDIwNmQ2MTY0NjUyMDc3Njk3NDY4Njk2ZTIwNzQ2ODY1MjA2MzZmNmU3NDY1Nzg3NDIwNmY2NjIwNjE2ZTIwNDk0NTU0NDYyMDYxNjM3NDY5NzY2OTc0NzkyMDY5NzMyMDYzNmY2ZTczNjk2NDY1NzI2NTY0MjA2MTZlMjAyMjQ5NDU1NDQ2MjA0MzZmNmU3NDcyNjk2Mjc1NzQ2OTZmNmUyMjJlMjA1Mzc1NjM2ODIwNzM3NDYxNzQ2NTZkNjU2ZTc0NzMyMDY5NmU2MzZjNzU2NDY1MjA2ZjcyNjE2YzIwNzM3NDYxNzQ2NTZkNjU2ZTc0NzMyMDY5NmUyMDQ5NDU1NDQ2MjA3MzY1NzM3MzY5NmY2ZTczMmMyMDYxNzMyMDc3NjU2YzZjMjA2MTczMjA3NzcyNjk3NDc0NjU2ZTIwNjE2ZTY0MjA2NTZjNjU2Mzc0NzI2ZjZlNjk2MzIwNjM2ZjZkNmQ3NTZlNjk2MzYxNzQ2OTZmNmU3MzIwNmQ2MTY0NjUyMDYxNzQyMDYxNmU3OTIwNzQ2OTZkNjUyMDZmNzIyMDcwNmM2MTYzNjUyYzIwNzc2ODY5NjM2ODIwNjE3MjY1MjA2MTY0NjQ3MjY1NzM3MzY1NjQyMDc0NmYKK01BQyA9IDM2ZTVmNmI1YzVlMDYwNzBmMGVmY2E5NjIyN2E4NjNlCisKK0tleSA9IDM2ZTVmNmI1YzVlMDYwNzBmMGVmY2E5NjIyN2E4NjNlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK0lucHV0ID0gNDE2ZTc5MjA3Mzc1NjI2ZDY5NzM3MzY5NmY2ZTIwNzQ2ZjIwNzQ2ODY1MjA0OTQ1NTQ0NjIwNjk2ZTc0NjU2ZTY0NjU2NDIwNjI3OTIwNzQ2ODY1MjA0MzZmNmU3NDcyNjk2Mjc1NzQ2ZjcyMjA2NjZmNzIyMDcwNzU2MjZjNjk2MzYxNzQ2OTZmNmUyMDYxNzMyMDYxNmM2YzIwNmY3MjIwNzA2MTcyNzQyMDZmNjYyMDYxNmUyMDQ5NDU1NDQ2MjA0OTZlNzQ2NTcyNmU2NTc0MmQ0NDcyNjE2Njc0MjA2ZjcyMjA1MjQ2NDMyMDYxNmU2NDIwNjE2ZTc5MjA3Mzc0NjE3NDY1NmQ2NTZlNzQyMDZkNjE2NDY1MjA3NzY5NzQ2ODY5NmUyMDc0Njg2NTIwNjM2ZjZlNzQ2NTc4NzQyMDZmNjYyMDYxNmUyMDQ5NDU1NDQ2MjA2MTYzNzQ2OTc2Njk3NDc5MjA2OTczMjA2MzZmNmU3MzY5NjQ2NTcyNjU2NDIwNjE2ZTIwMjI0OTQ1NTQ0NjIwNDM2ZjZlNzQ3MjY5NjI3NTc0Njk2ZjZlMjIyZTIwNTM3NTYzNjgyMDczNzQ2MTc0NjU2ZDY1NmU3NDczMjA2OTZlNjM2Yzc1NjQ2NTIwNmY3MjYxNmMyMDczNzQ2MTc0NjU2ZDY1NmU3NDczMjA2OTZlMjA0OTQ1NTQ0NjIwNzM2NTczNzM2OTZmNmU3MzJjMjA2MTczMjA3NzY1NmM2YzIwNjE3MzIwNzc3MjY5NzQ3NDY1NmUyMDYxNmU2NDIwNjU2YzY1NjM3NDcyNmY2ZTY5NjMyMDYzNmY2ZDZkNzU2ZTY5NjM2MTc0Njk2ZjZlNzMyMDZkNjE2NDY1MjA2MTc0MjA2MTZlNzkyMDc0Njk2ZDY1MjA2ZjcyMjA3MDZjNjE2MzY1MmMyMDc3Njg2OTYzNjgyMDYxNzI2NTIwNjE2NDY0NzI2NTczNzM2NTY0MjA3NDZmCitNQUMgPSBmMzQ3N2U3Y2Q5NTQxN2FmODlhNmI4Nzk0YzMxMGNmMAorCitLZXkgPSAxYzkyNDBhNWViNTVkMzhhZjMzMzg4ODYwNGY2YjVmMDQ3MzkxN2MxNDAyYjgwMDk5ZGNhNWNiYzIwNzA3NWMwCitJbnB1dCA9IDI3NTQ3NzYxNzMyMDYyNzI2OTZjNmM2OTY3MmMyMDYxNmU2NDIwNzQ2ODY1MjA3MzZjNjk3NDY4NzkyMDc0NmY3NjY1NzMwYTQ0Njk2NDIwNjc3OTcyNjUyMDYxNmU2NDIwNjc2OTZkNjI2YzY1MjA2OTZlMjA3NDY4NjUyMDc3NjE2MjY1M2EwYTQxNmM2YzIwNmQ2OTZkNzM3OTIwNzc2NTcyNjUyMDc0Njg2NTIwNjI2ZjcyNmY2NzZmNzY2NTczMmMwYTQxNmU2NDIwNzQ2ODY1MjA2ZDZmNmQ2NTIwNzI2MTc0Njg3MzIwNmY3NTc0Njc3MjYxNjI2NTJlCitNQUMgPSA0NTQxNjY5YTdlYWFlZTYxZTcwOGRjN2NiY2M1ZWI2MgorCitLZXkgPSAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitJbnB1dCA9IGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCitNQUMgPSAwMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitLZXkgPSAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCitJbnB1dCA9IDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitNQUMgPSAwMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitLZXkgPSAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitJbnB1dCA9IGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorTUFDID0gMDUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworS2V5ID0gMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorSW5wdXQgPSBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlZmVmZWZlMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEKK01BQyA9IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK0tleSA9IDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK0lucHV0ID0gZmRmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKK01BQyA9IGZhZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmCisKK0tleSA9IDAxMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK0lucHV0ID0gZTMzNTk0ZDc1MDVlNDNiOTAwMDAwMDAwMDAwMDAwMDAzMzk0ZDc1MDVlNDM3OWNkMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK01BQyA9IDE0MDAwMDAwMDAwMDAwMDA1NTAwMDAwMDAwMDAwMDAwCisKK0tleSA9IDAxMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK0lucHV0ID0gZTMzNTk0ZDc1MDVlNDNiOTAwMDAwMDAwMDAwMDAwMDAzMzk0ZDc1MDVlNDM3OWNkMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitNQUMgPSAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yYW5kL0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9yYW5kL0NNYWtlTGlzdHMudHh0CmluZGV4IDM3NGQ4ZjEuLjM1ZDUyOTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3JhbmQvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmFuZC9od3JhbmQuYyBiL3NyYy9jcnlwdG8vcmFuZC9od3JhbmQuYwppbmRleCA1ZjgxZjA5Li5mMGJiY2NkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JhbmQvaHdyYW5kLmMKKysrIGIvc3JjL2NyeXB0by9yYW5kL2h3cmFuZC5jCkBAIC0xNSwyMyArMTUsMjggQEAKICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8b3BlbnNzbC9jcHUuaD4KIAorI2luY2x1ZGUgImludGVybmFsLmgiCisKIAogI2lmIGRlZmluZWQoT1BFTlNTTF9YODZfNjQpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQogCi1pbnQgQ1JZUFRPX2hhdmVfaHdyYW5kKHZvaWQpIHsKLSAgcmV0dXJuIChPUEVOU1NMX2lhMzJjYXBfUFsxXSAmICgxdSA8PCAzMCkpICE9IDA7Ci19Ci0KIC8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBhc20vcmRyYW5kLXg4Nl82NC5wbCAqLwogZXh0ZXJuIGludCBDUllQVE9fcmRyYW5kKHVpbnQ4X3Qgb3V0WzhdKTsKIGV4dGVybiBpbnQgQ1JZUFRPX3JkcmFuZF9tdWx0aXBsZThfYnVmKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbik7CiAKK3N0YXRpYyBpbnQgaGF2ZV9yZHJhbmQodm9pZCkgeworICByZXR1cm4gKE9QRU5TU0xfaWEzMmNhcF9QWzFdICYgKDF1IDw8IDMwKSkgIT0gMDsKK30KKwogaW50IENSWVBUT19od3JhbmQodWludDhfdCAqYnVmLCBzaXplX3QgbGVuKSB7CisgIGlmICghaGF2ZV9yZHJhbmQoKSkgeworICAgIHJldHVybiAwOworICB9CisKICAgY29uc3Qgc2l6ZV90IGxlbl9tdWx0aXBsZTggPSBsZW4gJiB+NzsKICAgaWYgKCFDUllQVE9fcmRyYW5kX211bHRpcGxlOF9idWYoYnVmLCBsZW5fbXVsdGlwbGU4KSkgewogICAgIHJldHVybiAwOwpAQCAtNTMsMTIgKzU4LDggQEAKIAogI2Vsc2UKIAotaW50IENSWVBUT19oYXZlX2h3cmFuZCh2b2lkKSB7CitpbnQgQ1JZUFRPX2h3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1JZUFRPX2h3cmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pIHsKLSAgYWJvcnQoKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JhbmQvaW50ZXJuYWwuaCBiL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCmluZGV4IDVlNmVhMTEuLmYzNWFiYmIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vcmFuZC9pbnRlcm5hbC5oCkBAIC0yNCwxMyArMjQsOSBAQAogICogc3lzdGVtLiAqLwogdm9pZCBDUllQVE9fc3lzcmFuZCh1aW50OF90ICpidWYsIHNpemVfdCBsZW4pOwogCi0vKiBDUllQVE9faGF2ZV9od3JhbmQgcmV0dXJucyBvbmUgaWZmIHxDUllQVE9faHdyYW5kfCBjYW4gYmUgY2FsbGVkIHRvIGdlbmVyYXRlCi0gKiBoYXJkd2FyZSBlbnRyb3B5LiAqLwotaW50IENSWVBUT19oYXZlX2h3cmFuZCh2b2lkKTsKLQotLyogQ1JZUFRPX2h3cmFuZCBmaWxscyB8bGVufCBieXRlcyBhdCB8YnVmfCB3aXRoIGVudHJvcHkgZnJvbSB0aGUgaGFyZHdhcmUuCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB8Q1JZUFRPX2hhdmVfaHdyYW5kfCByZXR1cm5zIG9uZS4KLSAqIEl0IHJldHVybnMgb25lIG9uIHN1Y2Nlc3Mgb3IgemVybyBvbiBoYXJkd2FyZSBmYWlsdXJlLiAqLworLyogQ1JZUFRPX2h3cmFuZCBmaWxscyB8bGVufCBieXRlcyBhdCB8YnVmfCB3aXRoIGVudHJvcHkgZnJvbSB0aGUgaGFyZHdhcmUuIEl0CisgKiByZXR1cm5zIG9uZSBvbiBzdWNjZXNzIG9yIHplcm8gb24gaGFyZHdhcmUgZmFpbHVyZSBvciBpZiBoYXJkd2FyZSBzdXBwb3J0IGlzCisgKiB1bmF2YWlsYWJsZS4gKi8KIGludCBDUllQVE9faHdyYW5kKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbik7CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yYW5kL3JhbmQuYyBiL3NyYy9jcnlwdG8vcmFuZC9yYW5kLmMKaW5kZXggYTk2YWM0OC4uZTc2YTEyMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yYW5kL3JhbmQuYworKysgYi9zcmMvY3J5cHRvL3JhbmQvcmFuZC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxvcGVuc3NsL2NoYWNoYS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWVtLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNjksMTcgKzcwLDEyIEBACiAgIE9QRU5TU0xfZnJlZShzdGF0ZSk7CiB9CiAKLWV4dGVybiB2b2lkIENSWVBUT19jaGFjaGFfMjAodWludDhfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBrZXlbMzJdLCBjb25zdCB1aW50OF90IG5vbmNlWzhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnRlcik7Ci0KIGludCBSQU5EX2J5dGVzKHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbikgewogICBpZiAobGVuID09IDApIHsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIGlmICghQ1JZUFRPX2hhdmVfaHdyYW5kKCkgfHwKLSAgICAgICFDUllQVE9faHdyYW5kKGJ1ZiwgbGVuKSkgeworICBpZiAoIUNSWVBUT19od3JhbmQoYnVmLCBsZW4pKSB7CiAgICAgLyogV2l0aG91dCBhIGhhcmR3YXJlIFJORyB0byBzYXZlIHVzIGZyb20gYWRkcmVzcy1zcGFjZSBkdXBsaWNhdGlvbiwgdGhlIE9TCiAgICAgICogZW50cm9weSBpcyB1c2VkIGRpcmVjdGx5LiAqLwogICAgIENSWVBUT19zeXNyYW5kKGJ1ZiwgbGVuKTsKQEAgLTE2Miw2ICsxNTgsMTAgQEAKIAogdm9pZCBSQU5EX2FkZChjb25zdCB2b2lkICpidWYsIGludCBudW0sIGRvdWJsZSBlbnRyb3B5KSB7fQogCitpbnQgUkFORF9lZ2QoY29uc3QgY2hhciAqcGF0aCkgeworICByZXR1cm4gMjU1OworfQorCiBpbnQgUkFORF9wb2xsKHZvaWQpIHsKICAgcmV0dXJuIDE7CiB9CkBAIC0xNjksMyArMTY5LDE4IEBACiBpbnQgUkFORF9zdGF0dXModm9pZCkgewogICByZXR1cm4gMTsKIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCByYW5kX21ldGhfc3Qga1NTTGVheU1ldGhvZCA9IHsKKyAgUkFORF9zZWVkLAorICBSQU5EX2J5dGVzLAorICBSQU5EX2NsZWFudXAsCisgIFJBTkRfYWRkLAorICBSQU5EX3BzZXVkb19ieXRlcywKKyAgUkFORF9zdGF0dXMsCit9OworCitSQU5EX01FVEhPRCAqUkFORF9TU0xlYXkodm9pZCkgeworICByZXR1cm4gKFJBTkRfTUVUSE9EKikgJmtTU0xlYXlNZXRob2Q7Cit9CisKK3ZvaWQgUkFORF9zZXRfcmFuZF9tZXRob2QoY29uc3QgUkFORF9NRVRIT0QgKm1ldGhvZCkge30KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmFuZC91cmFuZG9tLmMgYi9zcmMvY3J5cHRvL3JhbmQvdXJhbmRvbS5jCmluZGV4IDc4OGE5NzkuLjFjYzUyNjAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcmFuZC91cmFuZG9tLmMKKysrIGIvc3JjL2NyeXB0by9yYW5kL3VyYW5kb20uYwpAQCAtMzAsOTIgKzMwLDEyNiBAQAogCiAKIC8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgUFJORyBieSByZWFkaW5nIGZyb20gL2Rldi91cmFuZG9tLCBvcHRpb25hbGx5IHdpdGggYQotICogZm9yay1zYWZlIGJ1ZmZlci4KLSAqCi0gKiBJZiBidWZmZXJpbmcgaXMgZW5hYmxlZCB0aGVuIGl0IG1haW50YWlucyBhIGdsb2JhbCwgbGlua2VkIGxpc3Qgb2YgYnVmZmVycy4KLSAqIFRocmVhZHMgd2hpY2ggbmVlZCByYW5kb20gYnl0ZXMgZ3JhYiBhIGJ1ZmZlciBmcm9tIHRoZSBsaXN0IHVuZGVyIGEgbG9jayBhbmQKLSAqIGNvcHkgb3V0IHRoZSBieXRlcyB0aGF0IHRoZXkgbmVlZC4gSW4gdGhlIHJhcmUgY2FzZSB0aGF0IHRoZSBidWZmZXIgaXMKLSAqIGVtcHR5LCBpdCdzIHJlZmlsbGVkIGZyb20gL2Rldi91cmFuZG9tIG91dHNpZGUgb2YgdGhlIGxvY2suCi0gKgotICogTGFyZ2UgcmVxdWVzdHMgYXJlIGFsd2F5cyBzZXJ2aWNlZCBmcm9tIC9kZXYvdXJhbmRvbSBkaXJlY3RseS4KLSAqCi0gKiBFYWNoIGJ1ZmZlciBjb250YWlucyB0aGUgUElEIG9mIHRoZSBwcm9jZXNzIHRoYXQgY3JlYXRlZCBpdCBhbmQgaXQncyB0ZXN0ZWQKLSAqIGFnYWluc3QgdGhlIGN1cnJlbnQgUElEIGVhY2ggdGltZS4gVGh1cyBwcm9jZXNzZXMgdGhhdCBmb3JrIHdpbGwgZGlzY2FyZCBhbGwKLSAqIHRoZSBidWZmZXJzIGZpbGxlZCBieSB0aGUgcGFyZW50IHByb2Nlc3MuIFRoZXJlIGFyZSB0d28gcHJvYmxlbXMgd2l0aCB0aGlzOgotICoKLSAqIDEpIGdsaWJjIG1haW50YWlucyBhIGNhY2hlIG9mIHRoZSBjdXJyZW50IFBJRCtQUElEIGFuZCwgaWYgdGhpcyBjYWNoZSBpc24ndAotICogICAgY29ycmVjdGx5IGludmFsaWRhdGVkLCB0aGUgZ2V0cGlkKCkgd2lsbCBjb250aW51ZSB0byBiZWxpZXZlIHRoYXQKLSAqICAgIGl0J3MgdGhlIG9sZCBwcm9jZXNzLiBHbGliYyBkZXBlbmRzIG9uIHRoZSBnbGliYyB3cmFwcGVycyBmb3IgZm9yaywKLSAqICAgIHZmb3JrIGFuZCBjbG9uZSBiZWluZyB1c2VkIGluIG9yZGVyIHRvIGludmFsaWRhdGUgdGhlIGdldHBpZCgpIGNhY2hlLgotICoKLSAqIDIpIElmIGEgcHJvY2VzcyBmb3JrcywgZGllcyBhbmQgdGhlbiBpdHMgY2hpbGQgZm9ya3MsIGl0J3MgcG9zc2libGUgdGhhdAotICogICAgdGhlIHRoaXJkIHByb2Nlc3Mgd2lsbCBlbmQgdXAgd2l0aCB0aGUgc2FtZSBQSUQgYXMgdGhlIG9yaWdpbmFsIHByb2Nlc3MuCi0gKiAgICBJZiB0aGUgc2Vjb25kIHByb2Nlc3MgbmV2ZXIgdXNlZCBhbnkgcmFuZG9tIHZhbHVlcyB0aGVuIHRoaXMgd2lsbCBtZWFuCi0gKiAgICB0aGF0IHRoZSB0aGlyZCBwcm9jZXNzIGhhcyBzdGFsZSwgY2FjaGVkIHZhbHVlcyBhbmQgd29uJ3Qgbm90aWNlLgotICovCisgKiBidWZmZXIsIHdoaWNoIGlzIHVuc2FmZSBhY3Jvc3MgfGZvcmt8LiAqLwogCi0vKiBCVUZfU0laRSBpcyBpbnRlbmRlZCB0byBiZSBhIDRLIGFsbG9jYXRpb24gd2l0aCBtYWxsb2Mgb3ZlcmhlYWQuIHN0cnVjdAotICogcmFuZF9idWZmZXIgYWxzbyBmaXRzIGluIHRoaXMgc3BhY2UgYW5kIHRoZSByZW1haW5kZXIgaXMgZW50cm9weS4gKi8KLSNkZWZpbmUgQlVGX1NJWkUgKDQwOTYgLSAxNikKKyNkZWZpbmUgQlVGX1NJWkUgNDA5NgogCi0vKiByYW5kX2J1ZmZlciBjb250YWlucyB1bnVzZWQsIHJhbmRvbSBieXRlcy4gVGhlc2Ugc3RydWN0dXJlcyBmb3JtIGEgbGlua2VkCi0gKiBsaXN0IHZpYSB0aGUgfG5leHR8IHBvaW50ZXIsIHdoaWNoIGlzIE5VTEwgaW4gdGhlIGZpbmFsIGVsZW1lbnQuICovCisvKiByYW5kX2J1ZmZlciBjb250YWlucyB1bnVzZWQsIHJhbmRvbSBieXRlcywgc29tZSBvZiB3aGljaCBtYXkgaGF2ZSBiZWVuCisgKiBjb25zdW1lZCBhbHJlYWR5LiAqLwogc3RydWN0IHJhbmRfYnVmZmVyIHsKLSAgc2l6ZV90IHVzZWQ7IC8qIHVzZWQgY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiB8cmFuZHwgdGhhdCBoYXZlCi0gICAgICAgICAgICAgICAgICBiZWVuIGNvbnN1bWVkLiAqLwotICBzdHJ1Y3QgcmFuZF9idWZmZXIgKm5leHQ7Ci0gIHBpZF90IHBpZDsgLyogcGlkIGNvbnRhaW5zIHRoZSBwaWQgYXQgdGhlIHRpbWUgdGhhdCB0aGUgYnVmZmVyIHdhcwotICAgICAgICAgICAgICAgIGNyZWF0ZWQgc28gdGhhdCBkYXRhIGlzIG5vdCBkdXBsaWNhdGVkIGFmdGVyIGEgZm9yay4gKi8KLSAgcGlkX3QgcHBpZDsgLyogcHBpZCBjb250YWlucyB0aGUgcGFyZW50IHBpZCBpbiBvcmRlciB0byB0cnkgYW5kIHJlZHVjZQotICAgICAgICAgICAgICAgICB0aGUgcG9zc2liaWxpdHkgb2YgZHVwbGljYXRlZCBQSUQgY29uZnVzaW5nIHRoZQotICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gb2YgYSBmb3JrLiAqLwotICB1aW50OF90IHJhbmRbXTsKKyAgc2l6ZV90IHVzZWQ7CisgIHVpbnQ4X3QgcmFuZFtCVUZfU0laRV07CiB9OwogCi0vKiByYW5kX2J5dGVzX3Blcl9idWYgaXMgdGhlIG51bWJlciBvZiBhY3R1YWwgZW50cm9weSBieXRlcyBpbiBhIGJ1ZmZlci4gKi8KLXN0YXRpYyBjb25zdCBzaXplX3QgcmFuZF9ieXRlc19wZXJfYnVmID0gQlVGX1NJWkUgLSBzaXplb2Yoc3RydWN0IHJhbmRfYnVmZmVyKTsKKy8qIHJlcXVlc3RlZF9sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCB0aGUgfCpfcmVxdWVzdGVkfCB2YXJpYWJsZXMuICovCitzdGF0aWMgc3RydWN0IENSWVBUT19TVEFUSUNfTVVURVggcmVxdWVzdGVkX2xvY2sgPSBDUllQVE9fU1RBVElDX01VVEVYX0lOSVQ7CiAKLXN0YXRpYyBzdHJ1Y3QgQ1JZUFRPX1NUQVRJQ19NVVRFWCBnbG9iYWxfbG9jayA9IENSWVBUT19TVEFUSUNfTVVURVhfSU5JVDsKKy8qIHVyYW5kb21fZmRfcmVxdWVzdGVkIGlzIHNldCBieSB8UkFORF9zZXRfdXJhbmRvbV9mZHwuICBJdCdzIHByb3RlY3RlZCBieQorICogfHJlcXVlc3RlZF9sb2NrfC4gKi8KK3N0YXRpYyBpbnQgdXJhbmRvbV9mZF9yZXF1ZXN0ZWQgPSAtMjsKIAotLyogbGlzdF9oZWFkIGlzIHRoZSBzdGFydCBvZiBhIGdsb2JhbCwgbGlua2VkLWxpc3Qgb2YgcmFuZF9idWZmZXIgb2JqZWN0cy4gSXQncwotICogcHJvdGVjdGVkIGJ5IHxnbG9iYWxfbG9ja3wuICovCi1zdGF0aWMgc3RydWN0IHJhbmRfYnVmZmVyICpsaXN0X2hlYWQ7Ci0KLS8qIHVyYW5kb21fZmQgaXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gL2Rldi91cmFuZG9tLiBJdCdzIHByb3RlY3RlZCBieQotICogfGdsb2JhbF9sb2NrfC4gKi8KKy8qIHVyYW5kb21fZmQgaXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gL2Rldi91cmFuZG9tLiBJdCdzIHByb3RlY3RlZCBieSB8b25jZXwuICovCiBzdGF0aWMgaW50IHVyYW5kb21fZmQgPSAtMjsKIAorLyogdXJhbmRvbV9idWZmZXJpbmdfcmVxdWVzdGVkIGlzIHNldCBieSB8UkFORF9lbmFibGVfZm9ya191bnNhZmVfYnVmZmVyaW5nfC4KKyAqIEl0J3MgcHJvdGVjdGVkIGJ5IHxyZXF1ZXN0ZWRfbG9ja3wuICovCitzdGF0aWMgaW50IHVyYW5kb21fYnVmZmVyaW5nX3JlcXVlc3RlZCA9IDA7CisKIC8qIHVyYW5kb21fYnVmZmVyaW5nIGNvbnRyb2xzIHdoZXRoZXIgYnVmZmVyaW5nIGlzIGVuYWJsZWQgKDEpIG9yIG5vdCAoMCkuIFRoaXMKLSAqIGlzIHByb3RlY3RlZCBieSB8Z2xvYmFsX2xvY2t8LiAqLworICogaXMgcHJvdGVjdGVkIGJ5IHxvbmNlfC4gKi8KIHN0YXRpYyBpbnQgdXJhbmRvbV9idWZmZXJpbmcgPSAwOwogCi0vKiB1cmFuZG9tX2dldF9mZF9sb2NrZWQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0byAvZGV2L3VyYW5kb20uIFRoZSBjYWxsZXIKLSAqIG9mIHRoaXMgZnVuY3Rpb24gbXVzdCBob2xkIHxnbG9iYWxfbG9ja3wuICovCi1zdGF0aWMgaW50IHVyYW5kb21fZ2V0X2ZkX2xvY2tlZCh2b2lkKSB7Ci0gIGlmICh1cmFuZG9tX2ZkICE9IC0yKSB7Ci0gICAgcmV0dXJuIHVyYW5kb21fZmQ7CitzdGF0aWMgQ1JZUFRPX29uY2VfdCBvbmNlID0gQ1JZUFRPX09OQ0VfSU5JVDsKKworLyogaW5pdF9vbmNlIGluaXRpYWxpemVzIHRoZSBzdGF0ZSBvZiB0aGlzIG1vZHVsZSB0byB2YWx1ZXMgcHJldmlvdXNseQorICogcmVxdWVzdGVkLiBUaGlzIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRoYXQgbW9kaWZpZXMgfHVyYW5kb21fZmR8IGFuZAorICogfHVyYW5kb21fYnVmZmVyaW5nfCwgd2hvc2UgdmFsdWVzIG1heSBiZSByZWFkIHNhZmVseSBhZnRlciBjYWxsaW5nIHRoZQorICogb25jZS4gKi8KK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkKSB7CisgIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja19yZWFkKCZyZXF1ZXN0ZWRfbG9jayk7CisgIHVyYW5kb21fYnVmZmVyaW5nID0gdXJhbmRvbV9idWZmZXJpbmdfcmVxdWVzdGVkOworICBpbnQgZmQgPSB1cmFuZG9tX2ZkX3JlcXVlc3RlZDsKKyAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJnJlcXVlc3RlZF9sb2NrKTsKKworICBpZiAoZmQgPT0gLTIpIHsKKyAgICBkbyB7CisgICAgICBmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKyAgICB9IHdoaWxlIChmZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CiAgIH0KIAotICB1cmFuZG9tX2ZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkpOwotICByZXR1cm4gdXJhbmRvbV9mZDsKKyAgaWYgKGZkIDwgMCkgeworICAgIGFib3J0KCk7CisgIH0KKworICBpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGRCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGFib3J0KCk7CisgIH0KKyAgZmxhZ3MgfD0gRkRfQ0xPRVhFQzsKKyAgaWYgKGZjbnRsKGZkLCBGX1NFVEZELCBmbGFncykgPT0gLTEpIHsKKyAgICBhYm9ydCgpOworICB9CisgIHVyYW5kb21fZmQgPSBmZDsKIH0KIAotLyogUkFORF9jbGVhbnVwIGZyZWVzIGFsbCBidWZmZXJzLCBjbG9zZXMgYW55IGNhY2hlZCBmaWxlIGRlc2NyaXB0b3IKLSAqIGFuZCByZXNldHMgdGhlIGdsb2JhbCBzdGF0ZS4gKi8KLXZvaWQgUkFORF9jbGVhbnVwKHZvaWQpIHsKLSAgc3RydWN0IHJhbmRfYnVmZmVyICpjdXI7Cit2b2lkIFJBTkRfY2xlYW51cCh2b2lkKSB7fQogCi0gIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja193cml0ZSgmZ2xvYmFsX2xvY2spOwotICB3aGlsZSAoKGN1ciA9IGxpc3RfaGVhZCkpIHsKLSAgICBsaXN0X2hlYWQgPSBjdXItPm5leHQ7Ci0gICAgT1BFTlNTTF9mcmVlKGN1cik7Cit2b2lkIFJBTkRfc2V0X3VyYW5kb21fZmQoaW50IGZkKSB7CisgIGZkID0gZHVwKGZkKTsKKyAgaWYgKGZkIDwgMCkgeworICAgIGFib3J0KCk7CiAgIH0KLSAgaWYgKHVyYW5kb21fZmQgPj0gMCkgewotICAgIGNsb3NlKHVyYW5kb21fZmQpOworCisgIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja193cml0ZSgmcmVxdWVzdGVkX2xvY2spOworICB1cmFuZG9tX2ZkX3JlcXVlc3RlZCA9IGZkOworICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmcmVxdWVzdGVkX2xvY2spOworCisgIENSWVBUT19vbmNlKCZvbmNlLCBpbml0X29uY2UpOworICBpZiAodXJhbmRvbV9mZCAhPSBmZCkgeworICAgIGFib3J0KCk7ICAvLyBBbHJlYWR5IGluaXRpYWxpemVkLgogICB9Ci0gIHVyYW5kb21fZmQgPSAtMjsKLSAgbGlzdF9oZWFkID0gTlVMTDsKLSAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKK30KKwordm9pZCBSQU5EX2VuYWJsZV9mb3JrX3Vuc2FmZV9idWZmZXJpbmcoaW50IGZkKSB7CisgIGlmIChmZCA+PSAwKSB7CisgICAgZmQgPSBkdXAoZmQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZkID0gLTI7CisgIH0KKworICBDUllQVE9fU1RBVElDX01VVEVYX2xvY2tfd3JpdGUoJnJlcXVlc3RlZF9sb2NrKTsKKyAgdXJhbmRvbV9idWZmZXJpbmdfcmVxdWVzdGVkID0gMTsKKyAgdXJhbmRvbV9mZF9yZXF1ZXN0ZWQgPSBmZDsKKyAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJnJlcXVlc3RlZF9sb2NrKTsKKworICBDUllQVE9fb25jZSgmb25jZSwgaW5pdF9vbmNlKTsKKyAgaWYgKHVyYW5kb21fYnVmZmVyaW5nICE9IDEgfHwgKGZkID49IDAgJiYgdXJhbmRvbV9mZCAhPSBmZCkpIHsKKyAgICBhYm9ydCgpOyAgLy8gQWxyZWFkeSBpbml0aWFsaXplZC4KKyAgfQorfQorCitzdGF0aWMgc3RydWN0IHJhbmRfYnVmZmVyICpnZXRfdGhyZWFkX2xvY2FsX2J1ZmZlcih2b2lkKSB7CisgIHN0cnVjdCByYW5kX2J1ZmZlciAqYnVmID0KKyAgICAgIENSWVBUT19nZXRfdGhyZWFkX2xvY2FsKE9QRU5TU0xfVEhSRUFEX0xPQ0FMX1VSQU5ET01fQlVGKTsKKyAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFuZF9idWZmZXIpKTsKKyAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYnVmLT51c2VkID0gQlVGX1NJWkU7ICAvKiBUbyB0cmlnZ2VyIGEgfHJlYWRfZnVsbHwgb24gZmlyc3QgdXNlLiAqLworICBpZiAoIUNSWVBUT19zZXRfdGhyZWFkX2xvY2FsKE9QRU5TU0xfVEhSRUFEX0xPQ0FMX1VSQU5ET01fQlVGLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9mcmVlKSkgeworICAgIE9QRU5TU0xfZnJlZShidWYpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGJ1ZjsKIH0KIAogLyogcmVhZF9mdWxsIHJlYWRzIGV4YWN0bHkgfGxlbnwgYnl0ZXMgZnJvbSB8ZmR8IGludG8gfG91dHwgYW5kIHJldHVybnMgMS4gSW4KQEAgLTEzOCwxMTAgKzE3Miw0OCBAQAogICByZXR1cm4gMTsKIH0KIAotLyogQ1JZUFRPX3N5c3JhbmQgcHV0cyB8bnVtfCByYW5kb20gYnl0ZXMgaW50byB8b3V0fC4gKi8KLXZvaWQgQ1JZUFRPX3N5c3JhbmQodWludDhfdCAqb3V0LCBzaXplX3QgcmVxdWVzdGVkKSB7Ci0gIGludCBmZDsKLSAgc3RydWN0IHJhbmRfYnVmZmVyICpidWY7Ci0gIHNpemVfdCB0b2RvOwotICBwaWRfdCBwaWQsIHBwaWQ7CisvKiByZWFkX2Zyb21fYnVmZmVyIHJlYWRzIHxyZXF1ZXN0ZWR8IHJhbmRvbSBieXRlcyBmcm9tIHRoZSBidWZmZXIgaW50byB8b3V0fCwKKyAqIHJlZmlsbGluZyBpdCBpZiBuZWNlc3NhcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gKi8KK3N0YXRpYyB2b2lkIHJlYWRfZnJvbV9idWZmZXIoc3RydWN0IHJhbmRfYnVmZmVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCwgc2l6ZV90IHJlcXVlc3RlZCkgeworICBzaXplX3QgcmVtYWluaW5nID0gQlVGX1NJWkUgLSBidWYtPnVzZWQ7CiAKKyAgd2hpbGUgKHJlcXVlc3RlZCA+IHJlbWFpbmluZykgeworICAgIG1lbWNweShvdXQsICZidWYtPnJhbmRbYnVmLT51c2VkXSwgcmVtYWluaW5nKTsKKyAgICBidWYtPnVzZWQgKz0gcmVtYWluaW5nOworICAgIG91dCArPSByZW1haW5pbmc7CisgICAgcmVxdWVzdGVkIC09IHJlbWFpbmluZzsKKworICAgIGlmICghcmVhZF9mdWxsKHVyYW5kb21fZmQsIGJ1Zi0+cmFuZCwgQlVGX1NJWkUpKSB7CisgICAgICBhYm9ydCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBidWYtPnVzZWQgPSAwOworICAgIHJlbWFpbmluZyA9IEJVRl9TSVpFOworICB9CisKKyAgbWVtY3B5KG91dCwgJmJ1Zi0+cmFuZFtidWYtPnVzZWRdLCByZXF1ZXN0ZWQpOworICBidWYtPnVzZWQgKz0gcmVxdWVzdGVkOworfQorCisvKiBDUllQVE9fc3lzcmFuZCBwdXRzIHxyZXF1ZXN0ZWR8IHJhbmRvbSBieXRlcyBpbnRvIHxvdXR8LiAqLwordm9pZCBDUllQVE9fc3lzcmFuZCh1aW50OF90ICpvdXQsIHNpemVfdCByZXF1ZXN0ZWQpIHsKICAgaWYgKHJlcXVlc3RlZCA9PSAwKSB7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgQ1JZUFRPX1NUQVRJQ19NVVRFWF9sb2NrX3dyaXRlKCZnbG9iYWxfbG9jayk7Ci0gIGZkID0gdXJhbmRvbV9nZXRfZmRfbG9ja2VkKCk7CisgIENSWVBUT19vbmNlKCZvbmNlLCBpbml0X29uY2UpOworICBpZiAodXJhbmRvbV9idWZmZXJpbmcgJiYgcmVxdWVzdGVkIDwgQlVGX1NJWkUpIHsKKyAgICBzdHJ1Y3QgcmFuZF9idWZmZXIgKmJ1ZiA9IGdldF90aHJlYWRfbG9jYWxfYnVmZmVyKCk7CisgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICByZWFkX2Zyb21fYnVmZmVyKGJ1Ziwgb3V0LCByZXF1ZXN0ZWQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQogCi0gIGlmIChmZCA8IDApIHsKLSAgICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmZ2xvYmFsX2xvY2spOworICBpZiAoIXJlYWRfZnVsbCh1cmFuZG9tX2ZkLCBvdXQsIHJlcXVlc3RlZCkpIHsKICAgICBhYm9ydCgpOwotICAgIHJldHVybjsKICAgfQotCi0gIC8qIElmIGJ1ZmZlcmluZyBpcyBub3QgZW5hYmxlZCwgb3IgaWYgdGhlIHJlcXVlc3QgaXMgbGFyZ2UsIHRoZW4gdGhlCi0gICAqIHJlc3VsdCBjb21lcyBkaXJlY3RseSBmcm9tIHVyYW5kb20uICovCi0gIGlmICghdXJhbmRvbV9idWZmZXJpbmcgfHwgcmVxdWVzdGVkID4gQlVGX1NJWkUgLyAyKSB7Ci0gICAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKLSAgICBpZiAoIXJlYWRfZnVsbChmZCwgb3V0LCByZXF1ZXN0ZWQpKSB7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBwaWQgPSBnZXRwaWQoKTsKLSAgcHBpZCA9IGdldHBwaWQoKTsKLQotICBmb3IgKDs7KSB7Ci0gICAgYnVmID0gbGlzdF9oZWFkOwotICAgIGlmIChidWYgJiYgYnVmLT5waWQgPT0gcGlkICYmIGJ1Zi0+cHBpZCA9PSBwcGlkICYmCi0gICAgICAgIHJhbmRfYnl0ZXNfcGVyX2J1ZiAtIGJ1Zi0+dXNlZCA+PSByZXF1ZXN0ZWQpIHsKLSAgICAgIG1lbWNweShvdXQsICZidWYtPnJhbmRbYnVmLT51c2VkXSwgcmVxdWVzdGVkKTsKLSAgICAgIGJ1Zi0+dXNlZCArPSByZXF1ZXN0ZWQ7Ci0gICAgICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmZ2xvYmFsX2xvY2spOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIElmIHdlIGRvbid0IGltbWVkaWF0ZWx5IGhhdmUgZW5vdWdoIGVudHJvcHkgd2l0aCB0aGUgY29ycmVjdAotICAgICAqIFBJRCwgcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgbGlzdCBpbiBvcmRlciB0byBnYWluCi0gICAgICogZXhjbHVzaXZlIGFjY2VzcyBhbmQgdW5sb2NrLiAqLwotICAgIGlmIChidWYpIHsKLSAgICAgIGxpc3RfaGVhZCA9IGJ1Zi0+bmV4dDsKLSAgICB9Ci0gICAgQ1JZUFRPX1NUQVRJQ19NVVRFWF91bmxvY2soJmdsb2JhbF9sb2NrKTsKLQotICAgIGlmICghYnVmKSB7Ci0gICAgICBidWYgPSAoc3RydWN0IHJhbmRfYnVmZmVyICopT1BFTlNTTF9tYWxsb2MoQlVGX1NJWkUpOwotICAgICAgaWYgKCFidWYpIHsKLSAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgLyogVGhlIGJ1ZmZlciBkb2Vzbid0IGNvbnRhaW4gYW55IHJhbmRvbSBieXRlcyB5ZXQKLSAgICAgICAqIHNvIHdlIG1hcmsgaXQgYXMgZnVsbHkgdXNlZCBzbyB0aGF0IGl0IHdpbGwgYmUKLSAgICAgICAqIGZpbGxlZCBiZWxvdy4gKi8KLSAgICAgIGJ1Zi0+dXNlZCA9IHJhbmRfYnl0ZXNfcGVyX2J1ZjsKLSAgICAgIGJ1Zi0+bmV4dCA9IE5VTEw7Ci0gICAgICBidWYtPnBpZCA9IHBpZDsKLSAgICAgIGJ1Zi0+cHBpZCA9IHBwaWQ7Ci0gICAgfQotCi0gICAgaWYgKGJ1Zi0+cGlkID09IHBpZCAmJiBidWYtPnBwaWQgPT0gcHBpZCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSBmb3JrZWQgYW5kIHNvIGNhbm5vdCB1c2UgdGhlc2UgYnl0ZXMgYXMgdGhleQotICAgICAqIG1heSBoYXZlIGJlZW4gdXNlZCBpbiBhbm90aGVyIHByb2Nlc3MuICovCi0gICAgT1BFTlNTTF9mcmVlKGJ1Zik7Ci0gICAgQ1JZUFRPX1NUQVRJQ19NVVRFWF9sb2NrX3dyaXRlKCZnbG9iYWxfbG9jayk7Ci0gIH0KLQotICB3aGlsZSAocmVxdWVzdGVkID4gMCkgewotICAgIHRvZG8gPSByYW5kX2J5dGVzX3Blcl9idWYgLSBidWYtPnVzZWQ7Ci0gICAgaWYgKHRvZG8gPiByZXF1ZXN0ZWQpIHsKLSAgICAgIHRvZG8gPSByZXF1ZXN0ZWQ7Ci0gICAgfQotICAgIG1lbWNweShvdXQsICZidWYtPnJhbmRbYnVmLT51c2VkXSwgdG9kbyk7Ci0gICAgcmVxdWVzdGVkIC09IHRvZG87Ci0gICAgb3V0ICs9IHRvZG87Ci0gICAgYnVmLT51c2VkICs9IHRvZG87Ci0KLSAgICBpZiAoYnVmLT51c2VkIDwgcmFuZF9ieXRlc19wZXJfYnVmKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIXJlYWRfZnVsbChmZCwgYnVmLT5yYW5kLCByYW5kX2J5dGVzX3Blcl9idWYpKSB7Ci0gICAgICBPUEVOU1NMX2ZyZWUoYnVmKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnVmLT51c2VkID0gMDsKLSAgfQotCi0gIENSWVBUT19TVEFUSUNfTVVURVhfbG9ja193cml0ZSgmZ2xvYmFsX2xvY2spOwotICBhc3NlcnQobGlzdF9oZWFkICE9IGJ1Zik7Ci0gIGJ1Zi0+bmV4dCA9IGxpc3RfaGVhZDsKLSAgbGlzdF9oZWFkID0gYnVmOwotICBDUllQVE9fU1RBVElDX01VVEVYX3VubG9jaygmZ2xvYmFsX2xvY2spOwogfQogCiAjZW5kaWYgIC8qICFPUEVOU1NMX1dJTkRPV1MgKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmM0L0NNYWtlTGlzdHMudHh0IGIvc3JjL2NyeXB0by9yYzQvQ01ha2VMaXN0cy50eHQKaW5kZXggZmUyZDBjNi4uYTIwOGU5NiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yYzQvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9yYzQvQ01ha2VMaXN0cy50eHQKQEAgLTEsNCArMSw0IEBACi1pbmNsdWRlX2RpcmVjdG9yaWVzKC4gLi4gLi4vLi4vaW5jbHVkZSkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoLi4vLi4vaW5jbHVkZSkKIAogaWYgKCR7QVJDSH0gU1RSRVFVQUwgIng4Nl82NCIpCiAgIHNldCgKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsIGIvc3JjL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwKaW5kZXggZGI0NjI0Mi4uY2VmNjI2OCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwKKysrIGIvc3JjL2NyeXB0by9yYzQvYXNtL3JjNC14ODZfNjQucGwKQEAgLTU2LDcgKzU2LDcgQEAKICMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgogIyBJZiBleGVjdXRlZCBvbiBYZW9uLCBjdXJyZW50IFJDNF9DSEFSIGNvZGUtcGF0aCBpcyAyLjd4IGZhc3RlciB0aGFuCiAjIFJDNF9JTlQgY29kZS1wYXRoLiBXaGlsZSBpZiBleGVjdXRlZCBvbiBPcHRlcm9uLCBpdCdzIG9ubHkgMjUlCi0jIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCisjIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSDCtS1hcmNoIGRldGVjdGlvbgogIyBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4gdGhpcyBmaW5hbCBSQzRfQ0hBUiBjb2RlLXBhdGggc2hvdWxkIGJlCiAjIHByZWZlcnJlZCwgYXMgaXQgcHJvdmlkZXMgYmV0dGVyICphbGwtcm91bmQqIHBlcmZvcm1hbmNlXS4KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3JzYS9DTWFrZUxpc3RzLnR4dAppbmRleCAwZWExMmM4Li5iZDhhZDNiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3JzYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgcnNhCkBAIC0xNSw3ICsxNSw3IEBACiBhZGRfZXhlY3V0YWJsZSgKICAgcnNhX3Rlc3QKIAotICByc2FfdGVzdC5jCisgIHJzYV90ZXN0LmNjCiAKICAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+CiApCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9ibGluZGluZy5jIGIvc3JjL2NyeXB0by9yc2EvYmxpbmRpbmcuYwppbmRleCAyNDUxNDJiLi5jOTNjZWUxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9ibGluZGluZy5jCisrKyBiL3NyYy9jcnlwdG8vcnNhL2JsaW5kaW5nLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAgIHJldCA9IChCTl9CTElORElORyopIE9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9CTElORElORykpOwogICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEJOX0JMSU5ESU5HX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiBOVUxMOwogICB9CiAgIG1lbXNldChyZXQsIDAsIHNpemVvZihCTl9CTElORElORykpOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAgIGludCByZXQgPSAwOwogCiAgIGlmIChiLT5BID09IE5VTEwgfHwgYi0+QWkgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgQk5fQkxJTkRJTkdfdXBkYXRlLCBSU0FfUl9CTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQk5fTk9UX0lOSVRJQUxJWkVEKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0yMzAsNyArMjMwLDcgQEAKICAgaW50IHJldCA9IDE7CiAKICAgaWYgKGItPkEgPT0gTlVMTCB8fCBiLT5BaSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR19jb252ZXJ0X2V4LCBSU0FfUl9CTl9OT1RfSU5JVElBTElaRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQk5fTk9UX0lOSVRJQUxJWkVEKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0yNjYsNyArMjY2LDcgQEAKICAgICByZXQgPSBCTl9tb2RfbXVsKG4sIG4sIHIsIGItPm1vZCwgY3R4KTsKICAgfSBlbHNlIHsKICAgICBpZiAoYi0+QWkgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR19pbnZlcnRfZXgsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JOX05PVF9JTklUSUFMSVpFRCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0ID0gQk5fbW9kX211bChuLCBuLCBiLT5BaSwgYi0+bW9kLCBjdHgpOwpAQCAtMzI1LDEzICszMjUsMTMgQEAKICAgICBpZiAoIUJOX3JhbmRfcmFuZ2UocmV0LT5BLCByZXQtPm1vZCkpIHsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KLSAgICBpZiAoQk5fbW9kX2ludmVyc2UocmV0LT5BaSwgcmV0LT5BLCByZXQtPm1vZCwgY3R4KSA9PSBOVUxMKSB7CisKKyAgICBpbnQgbm9faW52ZXJzZTsKKyAgICBpZiAoQk5fbW9kX2ludmVyc2VfZXgocmV0LT5BaSwgJm5vX2ludmVyc2UsIHJldC0+QSwgcmV0LT5tb2QsIGN0eCkgPT0gTlVMTCkgewogICAgICAgLyogdGhpcyBzaG91bGQgYWxtb3N0IG5ldmVyIGhhcHBlbiBmb3IgZ29vZCBSU0Ega2V5cyAqLwotICAgICAgdWludDMyX3QgZXJyb3IgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7Ci0gICAgICBpZiAoRVJSX0dFVF9SRUFTT04oZXJyb3IpID09IEJOX1JfTk9fSU5WRVJTRSkgeworICAgICAgaWYgKG5vX2ludmVyc2UpIHsKICAgICAgICAgaWYgKHJldHJ5X2NvdW50ZXItLSA9PSAwKSB7Ci0gICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBCTl9CTElORElOR19jcmVhdGVfcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisgICAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQogICAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKQEAgLTQxNiwxNCArNDE2LDE0IEBACiAgIEJOX0NUWF9zdGFydChjdHgpOwogICBlID0gQk5fQ1RYX2dldChjdHgpOwogICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCByc2Ffc2V0dXBfYmxpbmRpbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChyc2EtPmUgPT0gTlVMTCkgewogICAgIGUgPSByc2FfZ2V0X3B1YmxpY19leHAocnNhLT5kLCByc2EtPnAsIHJzYS0+cSwgY3R4KTsKICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHJzYV9zZXR1cF9ibGluZGluZywgUlNBX1JfTk9fUFVCTElDX0VYUE9ORU5UKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfTk9fUFVCTElDX0VYUE9ORU5UKTsKICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgfSBlbHNlIHsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogICByZXQgPSBCTl9CTElORElOR19jcmVhdGVfcGFyYW0oTlVMTCwgZSwgbiwgY3R4LCByc2EtPm1ldGgtPmJuX21vZF9leHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250X2N0eCk7CiAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcnNhX3NldHVwX2JsaW5kaW5nLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9pbnRlcm5hbC5oIGIvc3JjL2NyeXB0by9yc2EvaW50ZXJuYWwuaAppbmRleCBkMTVmMmE1Li5jMDA0NGMzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9pbnRlcm5hbC5oCisrKyBiL3NyYy9jcnlwdG8vcnNhL2ludGVybmFsLmgKQEAgLTU5LDggKzU5LDYgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvYmFzZS5oPgogCi0jaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+Ci0KIAogI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiBleHRlcm4gIkMiIHsKQEAgLTEwOSw4ICsxMDcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlBfTUQgKm1kLCBjb25zdCBFVlBfTUQgKm1nZjFtZCk7CiBpbnQgUlNBX3BhZGRpbmdfYWRkX25vbmUodWludDhfdCAqdG8sIHVuc2lnbmVkIHRvX2xlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tX2xlbik7Ci1pbnQgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdG9fbGVuLCBjb25zdCB1aW50OF90ICpmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbV9sZW4pOwogCiAvKiBSU0FfcHJpdmF0ZV90cmFuc2Zvcm0gY2FsbHMgZWl0aGVyIHRoZSBtZXRob2Qtc3BlY2lmaWMgfHByaXZhdGVfdHJhbnNmb3JtfAogICogZnVuY3Rpb24gKGlmIGdpdmVuKSBvciB0aGUgZ2VuZXJpYyBvbmUuIFNlZSB0aGUgY29tbWVudCBmb3IKQEAgLTExOCwyMCArMTE0LDI2IEBACiBpbnQgUlNBX3ByaXZhdGVfdHJhbnNmb3JtKFJTQSAqcnNhLCB1aW50OF90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKTsKIAotdHlwZWRlZiBzdHJ1Y3QgcnNhX3Bzc19wYXJhbXNfc3QgewotICBYNTA5X0FMR09SICpoYXNoQWxnb3JpdGhtOwotICBYNTA5X0FMR09SICptYXNrR2VuQWxnb3JpdGhtOwotICBBU04xX0lOVEVHRVIgKnNhbHRMZW5ndGg7Ci0gIEFTTjFfSU5URUdFUiAqdHJhaWxlckZpZWxkOwotfSBSU0FfUFNTX1BBUkFNUzsKIAotREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhSU0FfUFNTX1BBUkFNUykKKy8qIFJTQV9hZGRpdGlvbmFsX3ByaW1lIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0aGlyZCwgZm9ydGggZXRjIHByaW1lCisgKiBpbiBhIG11bHRpLXByaW1lIFJTQSBrZXkuICovCit0eXBlZGVmIHN0cnVjdCBSU0FfYWRkaXRpb25hbF9wcmltZV9zdCB7CisgIEJJR05VTSAqcHJpbWU7CisgIC8qIGV4cCBpcyBkXntwcmltZS0xfSBtb2QgcHJpbWUgKi8KKyAgQklHTlVNICpleHA7CisgIC8qIGNvZWZmIGlzIHN1Y2ggdGhhdCByw5djb2VmZiDiiaEgMSBtb2QgcHJpbWUuICovCisgIEJJR05VTSAqY29lZmY7CiAKLXR5cGVkZWYgc3RydWN0IHJzYV9vYWVwX3BhcmFtc19zdCB7Ci0gIFg1MDlfQUxHT1IgKmhhc2hGdW5jOwotICBYNTA5X0FMR09SICptYXNrR2VuRnVuYzsKLSAgWDUwOV9BTEdPUiAqcFNvdXJjZUZ1bmM7Ci19IFJTQV9PQUVQX1BBUkFNUzsKKyAgLyogVmFsdWVzIGJlbG93IGhlcmUgYXJlIG5vdCBpbiB0aGUgQVNOLjEgc2VyaWFsaXNhdGlvbi4gKi8KKworICAvKiByIGlzIHRoZSBwcm9kdWN0IG9mIGFsbCBwcmltZXMgKGluY2x1ZGluZyBwIGFuZCBxKSBwcmlvciB0byB0aGlzIG9uZS4gKi8KKyAgQklHTlVNICpyOworICAvKiBtZXRob2RfbW9kIGlzIG1hbmFnZWQgYnkgdGhlIHxSU0FfTUVUSE9EfC4gKi8KKyAgQk5fTU9OVF9DVFggKm1ldGhvZF9tb2Q7Cit9IFJTQV9hZGRpdGlvbmFsX3ByaW1lOworCit2b2lkIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUoUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwKTsKKwogCiAjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKIH0gLyogZXh0ZXJuIEMgKi8KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcnNhL3BhZGRpbmcuYyBiL3NyYy9jcnlwdG8vcnNhL3BhZGRpbmcuYwppbmRleCAwYTcyNWYxLi41YTQyZTI0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9wYWRkaW5nLmMKKysrIGIvc3JjL2NyeXB0by9yc2EvcGFkZGluZy5jCkBAIC03NCwxNCArNzQsMTIgQEAKICAgdWludDhfdCAqcDsKIAogICBpZiAodGxlbiA8IFJTQV9QS0NTMV9QQURESU5HX1NJWkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoZmxlbiA+IHRsZW4gLSBSU0FfUEtDUzFfUEFERElOR19TSVpFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8xLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTEwNSwxNSArMTAzLDEzIEBACiAgIGNvbnN0IHVpbnQ4X3QgKnA7CiAKICAgaWYgKGZsZW4gPCAyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fU01BTEwpOwogICAgIHJldHVybiAtMTsKICAgfQogCiAgIHAgPSBmcm9tOwogICBpZiAoKCoocCsrKSAhPSAwKSB8fCAoKihwKyspICE9IDEpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0xMjYsOCArMTIyLDcgQEAKICAgICAgICAgcCsrOwogICAgICAgICBicmVhazsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQpOworICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9GSVhFRF9IRUFERVJfREVDUllQVCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KICAgICB9CkBAIC0xMzUsMjEgKzEzMCwxOCBAQAogICB9CiAKICAgaWYgKGkgPT0gaikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORyk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAKICAgaWYgKGkgPCA4KSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9QQURfQllURV9DT1VOVCk7CiAgICAgcmV0dXJuIC0xOwogICB9CiAgIGkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCiAgIGogLT0gaTsKICAgaWYgKGogPiB0bGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0UpOwogICAgIHJldHVybiAtMTsKICAgfQogICBtZW1jcHkodG8sIHAsIGopOwpAQCAtMTYzLDE0ICsxNTUsMTIgQEAKICAgdWludDhfdCAqcDsKIAogICBpZiAodGxlbiA8IFJTQV9QS0NTMV9QQURESU5HX1NJWkUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoZmxlbiA+IHRsZW4gLSBSU0FfUEtDUzFfUEFERElOR19TSVpFKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8yLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTI3MSw4ICsyNjEsNyBAQAogICBzaXplX3QgbXNnX2luZGV4LCBtc2dfbGVuOwogCiAgIGlmIChmbGVuID09IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiwKLSAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0yODEsOCArMjcwLDcgQEAKICAgICogfFJTQV9QS0NTMV9QQURESU5HfCBtYWtlIGl0IGltcG9zc2libGUgdG8gY29tcGxldGVseSBhdm9pZCBCbGVpY2hlbmJhY2hlcidzCiAgICAqIGF0dGFjay4gKi8KICAgaWYgKCFSU0FfbWVzc2FnZV9pbmRleF9QS0NTMV90eXBlXzIoZnJvbSwgZmxlbiwgJm1zZ19pbmRleCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMiwKLSAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9QS0NTX0RFQ09ESU5HX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1BLQ1NfREVDT0RJTkdfRVJST1IpOwogICAgIHJldHVybiAtMTsKICAgfQogCkBAIC0yOTAsOCArMjc4LDcgQEAKICAgaWYgKG1zZ19sZW4gPiB0bGVuKSB7CiAgICAgLyogVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgY2FsbGVkIHdpdGggfHRsZW58CiAgICAgICogdGhlIGtleSBzaXplIGFuZCB8ZmxlbnwgaXMgYm91bmRlZCBieSB0aGUga2V5IHNpemUuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfUEtDU19ERUNPRElOR19FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9QS0NTX0RFQ09ESU5HX0VSUk9SKTsKICAgICByZXR1cm4gLTE7CiAgIH0KICAgbWVtY3B5KHRvLCAmZnJvbVttc2dfaW5kZXhdLCBtc2dfbGVuKTsKQEAgLTMwMCwxNCArMjg3LDEyIEBACiAKIGludCBSU0FfcGFkZGluZ19hZGRfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwgdW5zaWduZWQgZmxlbikgewogICBpZiAoZmxlbiA+IHRsZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9ub25lLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKGZsZW4gPCB0bGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfbm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19TTUFMTF9GT1JfS0VZX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fU01BTExfRk9SX0tFWV9TSVpFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0zMTUsMTcgKzMwMCw2IEBACiAgIHJldHVybiAxOwogfQogCi1pbnQgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh1aW50OF90ICp0bywgdW5zaWduZWQgdGxlbiwgY29uc3QgdWludDhfdCAqZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsZW4pIHsKLSAgaWYgKGZsZW4gPiB0bGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19ub25lLCBSU0FfUl9EQVRBX1RPT19MQVJHRSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgbWVtY3B5KHRvLCBmcm9tLCBmbGVuKTsKLSAgcmV0dXJuIGZsZW47Ci19Ci0KIGludCBQS0NTMV9NR0YxKHVpbnQ4X3QgKm1hc2ssIHVuc2lnbmVkIGxlbiwgY29uc3QgdWludDhfdCAqc2VlZCwKICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNlZWRsZW4sIGNvbnN0IEVWUF9NRCAqZGdzdCkgewogICB1bnNpZ25lZCBvdXRsZW4gPSAwOwpAQCAtMzg4LDIxICszNjIsMTggQEAKICAgbWRsZW4gPSBFVlBfTURfc2l6ZShtZCk7CiAKICAgaWYgKHRsZW4gPCAyICogbWRsZW4gKyAyKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUF9tZ2YxLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgZW1sZW4gPSB0bGVuIC0gMTsKICAgaWYgKGZsZW4gPiBlbWxlbiAtIDIgKiBtZGxlbiAtIDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoZW1sZW4gPCAyICogbWRsZW4gKyAxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUF9tZ2YxLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQyMiw4ICszOTMsNyBAQAogCiAgIGRibWFzayA9IE9QRU5TU0xfbWFsbG9jKGVtbGVuIC0gbWRsZW4pOwogICBpZiAoZGJtYXNrID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQX21nZjEsCi0gICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ3Nyw4ICs0NDcsNyBAQAogICBkYmxlbiA9IGZsZW4gLSBtZGxlbiAtIDE7CiAgIGRiID0gT1BFTlNTTF9tYWxsb2MoZGJsZW4pOwogICBpZiAoZGIgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxLAotICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC01MjYsOCArNDk1LDcgQEAKICAgb25lX2luZGV4Kys7CiAgIG1sZW4gPSBkYmxlbiAtIG9uZV9pbmRleDsKICAgaWYgKHRsZW4gPCBtbGVuKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQX21nZjEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfREFUQV9UT09fTEFSR0UpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0UpOwogICAgIG1sZW4gPSAtMTsKICAgfSBlbHNlIHsKICAgICBtZW1jcHkodG8sIGRiICsgb25lX2luZGV4LCBtbGVuKTsKQEAgLTUzOSw4ICs1MDcsNyBAQAogZGVjb2RpbmdfZXJyOgogICAvKiB0byBhdm9pZCBjaG9zZW4gY2lwaGVydGV4dCBhdHRhY2tzLCB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgbm90IHJldmVhbAogICAgKiB3aGljaCBraW5kIG9mIGRlY29kaW5nIGVycm9yIGhhcHBlbmVkICovCi0gIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUF9tZ2YxLAotICAgICAgICAgICAgICAgICAgICBSU0FfUl9PQUVQX0RFQ09ESU5HX0VSUk9SKTsKKyAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9PQUVQX0RFQ09ESU5HX0VSUk9SKTsKICBlcnI6CiAgIE9QRU5TU0xfZnJlZShkYik7CiAgIHJldHVybiAtMTsKQEAgLTU3NiwxNSArNTQzLDE0IEBACiAgIH0gZWxzZSBpZiAoc0xlbiA9PSAtMikgewogICAgIHNMZW4gPSAtMjsKICAgfSBlbHNlIGlmIChzTGVuIDwgLTIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIE1TQml0cyA9IChCTl9udW1fYml0cyhyc2EtPm4pIC0gMSkgJiAweDc7CiAgIGVtTGVuID0gUlNBX3NpemUocnNhKTsKICAgaWYgKEVNWzBdICYgKDB4RkYgPDwgTVNCaXRzKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwKLSAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9GSVJTVF9PQ1RFVF9JTlZBTElEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0ZJUlNUX09DVEVUX0lOVkFMSUQpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmIChNU0JpdHMgPT0gMCkgewpAQCAtNTkzLDE4ICs1NTksMTggQEAKICAgfQogICBpZiAoZW1MZW4gPCAoKGludCloTGVuICsgc0xlbiArIDIpKSB7CiAgICAgLyogc0xlbiBjYW4gYmUgc21hbGwgbmVnYXRpdmUgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoRU1bZW1MZW4gLSAxXSAhPSAweGJjKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLCBSU0FfUl9MQVNUX09DVEVUX0lOVkFMSUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfTEFTVF9PQ1RFVF9JTlZBTElEKTsKICAgICBnb3RvIGVycjsKICAgfQogICBtYXNrZWREQkxlbiA9IGVtTGVuIC0gaExlbiAtIDE7CiAgIEggPSBFTSArIG1hc2tlZERCTGVuOwogICBEQiA9IE9QRU5TU0xfbWFsbG9jKG1hc2tlZERCTGVuKTsKICAgaWYgKCFEQikgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAgIGlmIChQS0NTMV9NR0YxKERCLCBtYXNrZWREQkxlbiwgSCwgaExlbiwgbWdmMUhhc2gpIDwgMCkgewpAQCAtNjIwLDEyICs1ODYsMTEgQEAKICAgICA7CiAgIH0KICAgaWYgKERCW2krK10gIT0gMHgxKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5X1BLQ1MxX1BTU19tZ2YxLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX1NMRU5fUkVDT1ZFUllfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1NMRU5fUkVDT1ZFUllfRkFJTEVEKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoc0xlbiA+PSAwICYmIChtYXNrZWREQkxlbiAtIGkpICE9IHNMZW4pIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnlfUEtDUzFfUFNTX21nZjEsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIEhhc2gsIE5VTEwpIHx8CkBAIC02NDIsNyArNjA3LDcgQEAKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAobWVtY21wKEhfLCBILCBoTGVuKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3ZlcmlmeV9QS0NTMV9QU1NfbWdmMSwgUlNBX1JfQkFEX1NJR05BVFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfU0lHTkFUVVJFKTsKICAgICByZXQgPSAwOwogICB9IGVsc2UgewogICAgIHJldCA9IDE7CkBAIC02ODEsMTQgKzY0NiwxMiBAQAogICB9IGVsc2UgaWYgKHNMZW4gPT0gLTIpIHsKICAgICBzTGVuID0gLTI7CiAgIH0gZWxzZSBpZiAoc0xlbiA8IC0yKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTX21nZjEsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKEJOX2lzX3plcm8ocnNhLT5uKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTU19tZ2YxLAotICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU1QVFlfUFVCTElDX0tFWSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNzAxLDIxICs2NjQsMTggQEAKICAgfQogICBpZiAoc0xlbiA9PSAtMikgewogICAgIGlmIChlbUxlbiA8IGhMZW4gKyAyKSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgc0xlbiA9IGVtTGVuIC0gaExlbiAtIDI7CiAgIH0gZWxzZSBpZiAoZW1MZW4gPCBoTGVuICsgc0xlbiArIDIpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwKLSAgICAgICAgICAgICAgICAgICAgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKICAgICBnb3RvIGVycjsKICAgfQogICBpZiAoc0xlbiA+IDApIHsKICAgICBzYWx0ID0gT1BFTlNTTF9tYWxsb2Moc0xlbik7CiAgICAgaWYgKCFzYWx0KSB7Ci0gICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1NfbWdmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIGlmICghUkFORF9ieXRlcyhzYWx0LCBzTGVuKSkgewpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvcnNhLmMgYi9zcmMvY3J5cHRvL3JzYS9yc2EuYwppbmRleCAxNzA1OWIwLi4yZjIzMTY1IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9yc2EuYworKysgYi9zcmMvY3J5cHRvL3JzYS9yc2EuYwpAQCAtNzksNyArNzksNyBAQAogUlNBICpSU0FfbmV3X21ldGhvZChjb25zdCBFTkdJTkUgKmVuZ2luZSkgewogICBSU0EgKnJzYSA9IChSU0EgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoUlNBKSk7CiAgIGlmIChyc2EgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX25ld19tZXRob2QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC0xMTQsNiArMTE0LDE4IEBACiAgIHJldHVybiByc2E7CiB9CiAKK3ZvaWQgUlNBX2FkZGl0aW9uYWxfcHJpbWVfZnJlZShSU0FfYWRkaXRpb25hbF9wcmltZSAqYXApIHsKKyAgaWYgKGFwID09IE5VTEwpIHsKKyAgICByZXR1cm47CisgIH0KKworICBCTl9jbGVhcl9mcmVlKGFwLT5wcmltZSk7CisgIEJOX2NsZWFyX2ZyZWUoYXAtPmV4cCk7CisgIEJOX2NsZWFyX2ZyZWUoYXAtPmNvZWZmKTsKKyAgQk5fY2xlYXJfZnJlZShhcC0+cik7CisgIE9QRU5TU0xfZnJlZShhcCk7Cit9CisKIHZvaWQgUlNBX2ZyZWUoUlNBICpyc2EpIHsKICAgdW5zaWduZWQgdTsKIApAQCAtMTQ1LDYgKzE1NywxMCBAQAogICB9CiAgIE9QRU5TU0xfZnJlZShyc2EtPmJsaW5kaW5ncyk7CiAgIE9QRU5TU0xfZnJlZShyc2EtPmJsaW5kaW5nc19pbnVzZSk7CisgIGlmIChyc2EtPmFkZGl0aW9uYWxfcHJpbWVzICE9IE5VTEwpIHsKKyAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV9wb3BfZnJlZShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUpOworICB9CiAgIENSWVBUT19NVVRFWF9jbGVhbnVwKCZyc2EtPmxvY2spOwogICBPUEVOU1NMX2ZyZWUocnNhKTsKIH0KQEAgLTE2Miw2ICsxNzgsMTYgQEAKICAgcmV0dXJuIFJTQV9kZWZhdWx0X21ldGhvZC5rZXlnZW4ocnNhLCBiaXRzLCBlX3ZhbHVlLCBjYik7CiB9CiAKK2ludCBSU0FfZ2VuZXJhdGVfbXVsdGlfcHJpbWVfa2V5KFJTQSAqcnNhLCBpbnQgYml0cywgaW50IG51bV9wcmltZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKmVfdmFsdWUsIEJOX0dFTkNCICpjYikgeworICBpZiAocnNhLT5tZXRoLT5tdWx0aV9wcmltZV9rZXlnZW4pIHsKKyAgICByZXR1cm4gcnNhLT5tZXRoLT5tdWx0aV9wcmltZV9rZXlnZW4ocnNhLCBiaXRzLCBudW1fcHJpbWVzLCBlX3ZhbHVlLCBjYik7CisgIH0KKworICByZXR1cm4gUlNBX2RlZmF1bHRfbWV0aG9kLm11bHRpX3ByaW1lX2tleWdlbihyc2EsIGJpdHMsIG51bV9wcmltZXMsIGVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiKTsKK30KKwogaW50IFJTQV9lbmNyeXB0KFJTQSAqcnNhLCBzaXplX3QgKm91dF9sZW4sIHVpbnQ4X3QgKm91dCwgc2l6ZV90IG1heF9vdXQsCiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4sIGludCBwYWRkaW5nKSB7CiAgIGlmIChyc2EtPm1ldGgtPmVuY3J5cHQpIHsKQEAgLTM0MiwyMCArMzY4LDE1IEBACiAgICAgfSwKIH07CiAKLS8qIFRPRE8oZm9yayk6IG1vc3RseSBuZXcgY29kZSwgbmVlZHMgY2FyZWZ1bCByZXZpZXcuICovCi0KLS8qIHBrY3MxX3ByZWZpeGVkX21zZyBidWlsZHMgYSBQS0NTIzEsIHByZWZpeGVkIHZlcnNpb24gb2YgfG1zZ3wgZm9yIHRoZSBnaXZlbgotICogaGFzaCBmdW5jdGlvbiBhbmQgc2V0cyB8b3V0X21zZ3wgdG8gcG9pbnQgdG8gaXQuIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLAotICogfCpvdXRfbXNnfCBtYXkgYmUgYWxsb2NhdGVkIG1lbW9yeSBhbmQsIGlmIHNvLCB8KmlzX2FsbG9jZWR8IHdpbGwgYmUgMS4gKi8KLXN0YXRpYyBpbnQgcGtjczFfcHJlZml4ZWRfbXNnKHVpbnQ4X3QgKipvdXRfbXNnLCBzaXplX3QgKm91dF9tc2dfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hbGxvY2VkLCBpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKm1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtc2dfbGVuKSB7CitpbnQgUlNBX2FkZF9wa2NzMV9wcmVmaXgodWludDhfdCAqKm91dF9tc2csIHNpemVfdCAqb3V0X21zZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hbGxvY2VkLCBpbnQgaGFzaF9uaWQsIGNvbnN0IHVpbnQ4X3QgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbXNnX2xlbikgewogICB1bnNpZ25lZCBpOwogCiAgIGlmIChoYXNoX25pZCA9PSBOSURfbWQ1X3NoYTEpIHsKICAgICAvKiBTcGVjaWFsIGNhc2U6IFNTTCBzaWduYXR1cmUsIGp1c3QgY2hlY2sgdGhlIGxlbmd0aC4gKi8KICAgICBpZiAobXNnX2xlbiAhPSBTU0xfU0lHX0xFTkdUSCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwa2NzMV9wcmVmaXhlZF9tc2csIFJTQV9SX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMzc4LDEzICszOTksMTMgQEAKIAogICAgIHNpZ25lZF9tc2dfbGVuID0gcHJlZml4X2xlbiArIG1zZ19sZW47CiAgICAgaWYgKHNpZ25lZF9tc2dfbGVuIDwgcHJlZml4X2xlbikgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwa2NzMV9wcmVmaXhlZF9tc2csIFJTQV9SX1RPT19MT05HKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVE9PX0xPTkcpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgc2lnbmVkX21zZyA9IE9QRU5TU0xfbWFsbG9jKHNpZ25lZF9tc2dfbGVuKTsKICAgICBpZiAoIXNpZ25lZF9tc2cpIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcGtjczFfcHJlZml4ZWRfbXNnLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMzk4LDcgKzQxOSw3IEBACiAgICAgcmV0dXJuIDE7CiAgIH0KIAotICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHBrY3MxX3ByZWZpeGVkX21zZywgUlNBX1JfVU5LTk9XTl9BTEdPUklUSE1fVFlQRSk7CisgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVU5LTk9XTl9BTEdPUklUSE1fVFlQRSk7CiAgIHJldHVybiAwOwogfQogCkBAIC00MTUsMTQgKzQzNiwxNCBAQAogICAgIHJldHVybiByc2EtPm1ldGgtPnNpZ24oaGFzaF9uaWQsIGluLCBpbl9sZW4sIG91dCwgb3V0X2xlbiwgcnNhKTsKICAgfQogCi0gIGlmICghcGtjczFfcHJlZml4ZWRfbXNnKCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sICZzaWduZWRfbXNnX2lzX2FsbG9jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfbmlkLCBpbiwgaW5fbGVuKSkgeworICBpZiAoIVJTQV9hZGRfcGtjczFfcHJlZml4KCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpZ25lZF9tc2dfaXNfYWxsb2NlZCwgaGFzaF9uaWQsIGluLCBpbl9sZW4pKSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAocnNhX3NpemUgPCBSU0FfUEtDUzFfUEFERElOR19TSVpFIHx8CiAgICAgICBzaWduZWRfbXNnX2xlbiA+IHJzYV9zaXplIC0gUlNBX1BLQ1MxX1BBRERJTkdfU0laRSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3NpZ24sIFJTQV9SX0RJR0VTVF9UT09fQklHX0ZPUl9SU0FfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RJR0VTVF9UT09fQklHX0ZPUl9SU0FfS0VZKTsKICAgICBnb3RvIGZpbmlzaDsKICAgfQogCkBAIC00NTMsMTggKzQ3NCwxOCBAQAogICB9CiAKICAgaWYgKHNpZ19sZW4gIT0gcnNhX3NpemUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfV1JPTkdfU0lHTkFUVVJFX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAoaGFzaF9uaWQgPT0gTklEX21kNV9zaGExICYmIG1zZ19sZW4gIT0gU1NMX1NJR19MRU5HVEgpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV92ZXJpZnksIFJTQV9SX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBidWYgPSBPUEVOU1NMX21hbGxvYyhyc2Ffc2l6ZSk7CiAgIGlmICghYnVmKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDczLDEzICs0OTQsMTMgQEAKICAgICBnb3RvIG91dDsKICAgfQogCi0gIGlmICghcGtjczFfcHJlZml4ZWRfbXNnKCZzaWduZWRfbXNnLCAmc2lnbmVkX21zZ19sZW4sICZzaWduZWRfbXNnX2lzX2FsbG9jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfbmlkLCBtc2csIG1zZ19sZW4pKSB7CisgIGlmICghUlNBX2FkZF9wa2NzMV9wcmVmaXgoJnNpZ25lZF9tc2csICZzaWduZWRfbXNnX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lnbmVkX21zZ19pc19hbGxvY2VkLCBoYXNoX25pZCwgbXNnLCBtc2dfbGVuKSkgewogICAgIGdvdG8gb3V0OwogICB9CiAKICAgaWYgKGxlbiAhPSBzaWduZWRfbXNnX2xlbiB8fCBDUllQVE9fbWVtY21wKGJ1Ziwgc2lnbmVkX21zZywgbGVuKSAhPSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfdmVyaWZ5LCBSU0FfUl9CQURfU0lHTkFUVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9TSUdOQVRVUkUpOwogICAgIGdvdG8gb3V0OwogICB9CiAKQEAgLTUwOSwxMiArNTMwLDEyIEBACiAgIH0KIAogICBpZiAoKGtleS0+cCAhPSBOVUxMKSAhPSAoa2V5LT5xICE9IE5VTEwpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBSU0FfUl9PTkxZX09ORV9PRl9QX1FfR0lWRU4pOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfT05MWV9PTkVfT0ZfUF9RX0dJVkVOKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmICgha2V5LT5uIHx8ICFrZXktPmUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIFJTQV9SX1ZBTFVFX01JU1NJTkcpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVkFMVUVfTUlTU0lORyk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNTI2LDcgKzU0Nyw3IEBACiAKICAgY3R4ID0gQk5fQ1RYX25ldygpOwogICBpZiAoY3R4ID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01NDAsNTIgKzU2MSw3NCBAQAogICBCTl9pbml0KCZkbXExKTsKICAgQk5faW5pdCgmaXFtcCk7CiAKLSAgaWYgKC8qIG4gPSBwcSAqLwotICAgICAgIUJOX211bCgmbiwga2V5LT5wLCBrZXktPnEsIGN0eCkgfHwKLSAgICAgIC8qIGxjbSA9IGxjbShwLTEsIHEtMSkgKi8KKyAgaWYgKCFCTl9tdWwoJm4sIGtleS0+cCwga2V5LT5xLCBjdHgpIHx8CisgICAgICAvKiBsY20gPSBsY20ocHJpbWUtMSwgZm9yIGFsbCBwcmltZXMpICovCiAgICAgICAhQk5fc3ViKCZwbTEsIGtleS0+cCwgQk5fdmFsdWVfb25lKCkpIHx8CiAgICAgICAhQk5fc3ViKCZxbTEsIGtleS0+cSwgQk5fdmFsdWVfb25lKCkpIHx8CiAgICAgICAhQk5fbXVsKCZsY20sICZwbTEsICZxbTEsIGN0eCkgfHwKKyAgICAgICFCTl9nY2QoJmdjZCwgJnBtMSwgJnFtMSwgY3R4KSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX0xJQl9CTik7CisgICAgZ290byBvdXQ7CisgIH0KKworICBzaXplX3QgbnVtX2FkZGl0aW9uYWxfcHJpbWVzID0gMDsKKyAgaWYgKGtleS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCkgeworICAgIG51bV9hZGRpdGlvbmFsX3ByaW1lcyA9IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX251bShrZXktPmFkZGl0aW9uYWxfcHJpbWVzKTsKKyAgfQorCisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2FkZGl0aW9uYWxfcHJpbWVzOyBpKyspIHsKKyAgICBjb25zdCBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQorICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShrZXktPmFkZGl0aW9uYWxfcHJpbWVzLCBpKTsKKyAgICBpZiAoIUJOX211bCgmbiwgJm4sIGFwLT5wcmltZSwgY3R4KSB8fAorICAgICAgICAhQk5fc3ViKCZwbTEsIGFwLT5wcmltZSwgQk5fdmFsdWVfb25lKCkpIHx8CisgICAgICAgICFCTl9tdWwoJmxjbSwgJmxjbSwgJnBtMSwgY3R4KSB8fAorICAgICAgICAhQk5fZ2NkKCZnY2QsICZnY2QsICZwbTEsIGN0eCkpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX0xJQl9CTik7CisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIH0KKworICBpZiAoIUJOX2RpdigmbGNtLCBOVUxMLCAmbGNtLCAmZ2NkLCBjdHgpIHx8CiAgICAgICAhQk5fZ2NkKCZnY2QsICZwbTEsICZxbTEsIGN0eCkgfHwKLSAgICAgICFCTl9kaXYoJmxjbSwgTlVMTCwgJmxjbSwgJmdjZCwgY3R4KSB8fAotICAgICAgLyogZGUgPSBkKmUgbW9kIGxjbShwLTEsIHEtMSkgKi8KKyAgICAgIC8qIGRlID0gZCplIG1vZCBsY20ocHJpbWUtMSwgZm9yIGFsbCBwcmltZXMpLiAqLwogICAgICAgIUJOX21vZF9tdWwoJmRlLCBrZXktPmQsIGtleS0+ZSwgJmxjbSwgY3R4KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgRVJSX0xJQl9CTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfTElCX0JOKTsKICAgICBnb3RvIG91dDsKICAgfQogCiAgIGlmIChCTl9jbXAoJm4sIGtleS0+bikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgUlNBX1JfTl9OT1RfRVFVQUxfUF9RKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX05fTk9UX0VRVUFMX1BfUSk7CiAgICAgZ290byBvdXQ7CiAgIH0KIAogICBpZiAoIUJOX2lzX29uZSgmZGUpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBSU0FfUl9EX0VfTk9UX0NPTkdSVUVOVF9UT18xKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RfRV9OT1RfQ09OR1JVRU5UX1RPXzEpOwogICAgIGdvdG8gb3V0OwogICB9CiAKICAgaGFzX2NydF92YWx1ZXMgPSBrZXktPmRtcDEgIT0gTlVMTDsKICAgaWYgKGhhc19jcnRfdmFsdWVzICE9IChrZXktPmRtcTEgIT0gTlVMTCkgfHwKICAgICAgIGhhc19jcnRfdmFsdWVzICE9IChrZXktPmlxbXAgIT0gTlVMTCkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9jaGVja19rZXksIFJTQV9SX0lOQ09OU0lTVEVOVF9TRVRfT0ZfQ1JUX1ZBTFVFUyk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9JTkNPTlNJU1RFTlRfU0VUX09GX0NSVF9WQUxVRVMpOwogICAgIGdvdG8gb3V0OwogICB9CiAKLSAgaWYgKGhhc19jcnRfdmFsdWVzKSB7CisgIGlmIChoYXNfY3J0X3ZhbHVlcyAmJiBudW1fYWRkaXRpb25hbF9wcmltZXMgPT0gMCkgewogICAgIGlmICgvKiBkbXAxID0gZCBtb2QgKHAtMSkgKi8KICAgICAgICAgIUJOX21vZCgmZG1wMSwga2V5LT5kLCAmcG0xLCBjdHgpIHx8CiAgICAgICAgIC8qIGRtcTEgPSBkIG1vZCAocS0xKSAqLwogICAgICAgICAhQk5fbW9kKCZkbXExLCBrZXktPmQsICZxbTEsIGN0eCkgfHwKICAgICAgICAgLyogaXFtcCA9IHFeLTEgbW9kIHAgKi8KICAgICAgICAgIUJOX21vZF9pbnZlcnNlKCZpcW1wLCBrZXktPnEsIGtleS0+cCwgY3R4KSkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfY2hlY2tfa2V5LCBFUlJfTElCX0JOKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX0xJQl9CTik7CiAgICAgICBnb3RvIG91dDsKICAgICB9CiAKICAgICBpZiAoQk5fY21wKCZkbXAxLCBrZXktPmRtcDEpICE9IDAgfHwKICAgICAgICAgQk5fY21wKCZkbXExLCBrZXktPmRtcTEpICE9IDAgfHwKICAgICAgICAgQk5fY21wKCZpcW1wLCBrZXktPmlxbXApICE9IDApIHsKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX2NoZWNrX2tleSwgUlNBX1JfQ1JUX1ZBTFVFU19JTkNPUlJFQ1QpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9DUlRfVkFMVUVTX0lOQ09SUkVDVCk7CiAgICAgICBnb3RvIG91dDsKICAgICB9CiAgIH0KQEAgLTYxMywxMyArNjU2LDE3IEBACiAgIGludCBvayA9IDA7CiAKICAgaWYgKHJzYS0+biA9PSBOVUxMIHx8IHJzYS0+ZSA9PSBOVUxMIHx8IHJzYS0+ZCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBSU0FfUl9FTVBUWV9QVUJMSUNfS0VZKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VNUFRZX1BVQkxJQ19LRVkpOwogICAgIHJldHVybiAwOwogICB9CiAKICAgaWYgKHJzYS0+cCB8fCByc2EtPnEgfHwgcnNhLT5kbXAxIHx8IHJzYS0+ZG1xMSB8fCByc2EtPmlxbXApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgUlNBX1JfQ1JUX1BBUkFNU19BTFJFQURZX0dJVkVOKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0NSVF9QQVJBTVNfQUxSRUFEWV9HSVZFTik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyAhPSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9DQU5OT1RfUkVDT1ZFUl9NVUxUSV9QUklNRV9LRVkpOwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTYyOCw3ICs2NzUsNyBAQAogCiAgIGN0eCA9IEJOX0NUWF9uZXcoKTsKICAgaWYgKGN0eCA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjQxLDcgKzY4OCw3IEBACiAKICAgaWYgKHRvdGllbnQgPT0gTlVMTCB8fCByZW0gPT0gTlVMTCB8fCBtdWx0aXBsZSA9PSBOVUxMIHx8IHBfcGx1c19xID09IE5VTEwgfHwKICAgICAgIHBfbWludXNfcSA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNjY5LDEyICs3MTYsMTIgQEAKICAgICAgICFCTl9kaXYobXVsdGlwbGUsIE5VTEwsIHRvdGllbnQsIHJzYS0+biwgY3R4KSB8fAogICAgICAgIUJOX2FkZF93b3JkKG11bHRpcGxlLCAxKSB8fAogICAgICAgIUJOX2Rpdih0b3RpZW50LCByZW0sIHRvdGllbnQsIG11bHRpcGxlLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmICghQk5faXNfemVybyhyZW0pKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBSU0FfUl9CQURfUlNBX1BBUkFNRVRFUlMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX1JTQV9QQVJBTUVURVJTKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC02ODUsNyArNzMyLDcgQEAKICAgcnNhLT5pcW1wID0gQk5fbmV3KCk7CiAgIGlmIChyc2EtPnAgPT0gTlVMTCB8fCByc2EtPnEgPT0gTlVMTCB8fCByc2EtPmRtcDEgPT0gTlVMTCB8fCByc2EtPmRtcTEgPT0KICAgICAgIE5VTEwgfHwgcnNhLT5pcW1wID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9yZWNvdmVyX2NydF9wYXJhbXMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03MDMsMTIgKzc1MCwxMiBAQAogICAgICAgIUJOX3JzaGlmdDEocnNhLT5xLCByc2EtPnEpIHx8CiAgICAgICAhQk5fZGl2KHJzYS0+cCwgTlVMTCwgcnNhLT5uLCByc2EtPnEsIGN0eCkgfHwKICAgICAgICFCTl9tdWwobXVsdGlwbGUsIHJzYS0+cCwgcnNhLT5xLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCiAgIGlmIChCTl9jbXAobXVsdGlwbGUsIHJzYS0+bikgIT0gMCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX3JlY292ZXJfY3J0X3BhcmFtcywgUlNBX1JfSU5URVJOQUxfRVJST1IpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfSU5URVJOQUxfRVJST1IpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTcxNyw3ICs3NjQsNyBAQAogICAgICAgIUJOX3N1YihyZW0sIHJzYS0+cSwgQk5fdmFsdWVfb25lKCkpIHx8CiAgICAgICAhQk5fbW9kKHJzYS0+ZG1xMSwgcnNhLT5kLCByZW0sIGN0eCkgfHwKICAgICAgICFCTl9tb2RfaW52ZXJzZShyc2EtPmlxbXAsIHJzYS0+cSwgcnNhLT5wLCBjdHgpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfcmVjb3Zlcl9jcnRfcGFyYW1zLCBFUlJfUl9CTl9MSUIpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfQk5fTElCKTsKICAgICBnb3RvIGVycjsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3JzYS9yc2FfYXNuMS5jIGIvc3JjL2NyeXB0by9yc2EvcnNhX2FzbjEuYwppbmRleCA5MjRjYjhhLi5lMzc1NmJhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3JzYS9yc2FfYXNuMS5jCisrKyBiL3NyYy9jcnlwdG8vcnNhL3JzYV9hc24xLmMKQEAgLTU1LDQ1ICs1NSwzODQgQEAKIAogI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21lbS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogCi0vKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBmcmVlIGFuZCBuZXcgbWV0aG9kcyAqLwotc3RhdGljIGludCByc2FfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCi0gICAgICAgICAgICAgICAgICB2b2lkICpleGFyZykgewotICBpZiAob3BlcmF0aW9uID09IEFTTjFfT1BfTkVXX1BSRSkgewotICAgICpwdmFsID0gKEFTTjFfVkFMVUUgKilSU0FfbmV3KCk7Ci0gICAgaWYgKCpwdmFsKSB7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9CitzdGF0aWMgaW50IHBhcnNlX2ludGVnZXJfYnVnZ3koQ0JTICpjYnMsIEJJR05VTSAqKm91dCwgaW50IGJ1Z2d5KSB7CisgIGFzc2VydCgqb3V0ID09IE5VTEwpOworICAqb3V0ID0gQk5fbmV3KCk7CisgIGlmICgqb3V0ID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKLSAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT0gQVNOMV9PUF9GUkVFX1BSRSkgewotICAgIFJTQV9mcmVlKChSU0EgKikqcHZhbCk7Ci0gICAgKnB2YWwgPSBOVUxMOwotICAgIHJldHVybiAyOworICB9CisgIGlmIChidWdneSkgeworICAgIHJldHVybiBCTl9jYnMydW5zaWduZWRfYnVnZ3koY2JzLCAqb3V0KTsKKyAgfQorICByZXR1cm4gQk5fY2JzMnVuc2lnbmVkKGNicywgKm91dCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaW50ZWdlcihDQlMgKmNicywgQklHTlVNICoqb3V0KSB7CisgIHJldHVybiBwYXJzZV9pbnRlZ2VyX2J1Z2d5KGNicywgb3V0LCAwIC8qIG5vdCBidWdneSAqLyk7Cit9CisKK3N0YXRpYyBpbnQgbWFyc2hhbF9pbnRlZ2VyKENCQiAqY2JiLCBCSUdOVU0gKmJuKSB7CisgIGlmIChibiA9PSBOVUxMKSB7CisgICAgLyogQW4gUlNBIG9iamVjdCBtYXkgYmUgbWlzc2luZyBzb21lIGNvbXBvbmVudHMuICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9WQUxVRV9NSVNTSU5HKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gQk5fYm4yY2JiKGNiYiwgYm4pOworfQorCitzdGF0aWMgUlNBICpwYXJzZV9wdWJsaWNfa2V5KENCUyAqY2JzLCBpbnQgYnVnZ3kpIHsKKyAgUlNBICpyZXQgPSBSU0FfbmV3KCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIENCUyBjaGlsZDsKKyAgaWYgKCFDQlNfZ2V0X2FzbjEoY2JzLCAmY2hpbGQsIENCU19BU04xX1NFUVVFTkNFKSB8fAorICAgICAgIXBhcnNlX2ludGVnZXJfYnVnZ3koJmNoaWxkLCAmcmV0LT5uLCBidWdneSkgfHwKKyAgICAgICFwYXJzZV9pbnRlZ2VyKCZjaGlsZCwgJnJldC0+ZSkgfHwKKyAgICAgIENCU19sZW4oJmNoaWxkKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRU5DT0RJTkcpOworICAgIFJTQV9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworUlNBICpSU0FfcGFyc2VfcHVibGljX2tleShDQlMgKmNicykgeworICByZXR1cm4gcGFyc2VfcHVibGljX2tleShjYnMsIDAgLyogbm90IGJ1Z2d5ICovKTsKK30KKworUlNBICpSU0FfcGFyc2VfcHVibGljX2tleV9idWdneShDQlMgKmNicykgeworICAvKiBFc3RvbmlhbiBJRHMgaXNzdWVkIGJldHdlZW4gU2VwdGVtYmVyIDIwMTQgdG8gU2VwdGVtYmVyIDIwMTUgYXJlCisgICAqIGJyb2tlbi4gU2VlIGh0dHBzOi8vY3JidWcuY29tLzUzMjA0OCBhbmQgaHR0cHM6Ly9jcmJ1Zy5jb20vNTM0NzY2LgorICAgKgorICAgKiBUT0RPKGRhdmlkYmVuKTogUmVtb3ZlIHRoaXMgY29kZSBhbmQgY2FsbGVycyBpbiBNYXJjaCAyMDE2LiAqLworICByZXR1cm4gcGFyc2VfcHVibGljX2tleShjYnMsIDEgLyogYnVnZ3kgKi8pOworfQorCitSU0EgKlJTQV9wdWJsaWNfa2V5X2Zyb21fYnl0ZXMoY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pIHsKKyAgQ0JTIGNiczsKKyAgQ0JTX2luaXQoJmNicywgaW4sIGluX2xlbik7CisgIFJTQSAqcmV0ID0gUlNBX3BhcnNlX3B1YmxpY19rZXkoJmNicyk7CisgIGlmIChyZXQgPT0gTlVMTCB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9FTkNPRElORyk7CisgICAgUlNBX2ZyZWUocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitpbnQgUlNBX21hcnNoYWxfcHVibGljX2tleShDQkIgKmNiYiwgY29uc3QgUlNBICpyc2EpIHsKKyAgQ0JCIGNoaWxkOworICBpZiAoIUNCQl9hZGRfYXNuMShjYmIsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5uKSB8fAorICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+ZSkgfHwKKyAgICAgICFDQkJfZmx1c2goY2JiKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gMDsKICAgfQogICByZXR1cm4gMTsKIH0KIAotQVNOMV9TRVFVRU5DRV9jYihSU0FQcml2YXRlS2V5LCByc2FfY2IpID0gewotICBBU04xX1NJTVBMRShSU0EsIHZlcnNpb24sIExPTkcpLAotICBBU04xX1NJTVBMRShSU0EsIG4sIEJJR05VTSksCi0gIEFTTjFfU0lNUExFKFJTQSwgZSwgQklHTlVNKSwKLSAgQVNOMV9TSU1QTEUoUlNBLCBkLCBCSUdOVU0pLAotICBBU04xX1NJTVBMRShSU0EsIHAsIEJJR05VTSksCi0gIEFTTjFfU0lNUExFKFJTQSwgcSwgQklHTlVNKSwKLSAgQVNOMV9TSU1QTEUoUlNBLCBkbXAxLCBCSUdOVU0pLAotICBBU04xX1NJTVBMRShSU0EsIGRtcTEsIEJJR05VTSksCi0gIEFTTjFfU0lNUExFKFJTQSwgaXFtcCwgQklHTlVNKSwKLX0gQVNOMV9TRVFVRU5DRV9FTkRfY2IoUlNBLCBSU0FQcml2YXRlS2V5KTsKK2ludCBSU0FfcHVibGljX2tleV90b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUlNBICpyc2EpIHsKKyAgQ0JCIGNiYjsKKyAgQ0JCX3plcm8oJmNiYik7CisgIGlmICghQ0JCX2luaXQoJmNiYiwgMCkgfHwKKyAgICAgICFSU0FfbWFyc2hhbF9wdWJsaWNfa2V5KCZjYmIsIHJzYSkgfHwKKyAgICAgICFDQkJfZmluaXNoKCZjYmIsIG91dF9ieXRlcywgb3V0X2xlbikpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0VOQ09ERV9FUlJPUik7CisgICAgQ0JCX2NsZWFudXAoJmNiYik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CiAKLUFTTjFfU0VRVUVOQ0VfY2IoUlNBUHVibGljS2V5LCByc2FfY2IpID0gewotICAgIEFTTjFfU0lNUExFKFJTQSwgbiwgQklHTlVNKSwKLSAgICBBU04xX1NJTVBMRShSU0EsIGUsIEJJR05VTSksCi19IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKFJTQSwgUlNBUHVibGljS2V5KTsKKy8qIGtWZXJzaW9uVHdvUHJpbWUgYW5kIGtWZXJzaW9uTXVsdGkgYXJlIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoZSB2ZXJzaW9uCisgKiBmaWVsZCBvZiBhbiBSU0FQcml2YXRlS2V5IHN0cnVjdHVyZSAoUkZDIDM0NDcpLiAqLworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtWZXJzaW9uVHdvUHJpbWUgPSAwOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtWZXJzaW9uTXVsdGkgPSAxOworCisvKiByc2FfcGFyc2VfYWRkaXRpb25hbF9wcmltZSBwYXJzZXMgYSBERVItZW5jb2RlZCBPdGhlclByaW1lSW5mbyBmcm9tIHxjYnN8IGFuZAorICogYWR2YW5jZXMgfGNic3wuIEl0IHJldHVybnMgYSBuZXdseS1hbGxvY2F0ZWQgfFJTQV9hZGRpdGlvbmFsX3ByaW1lfCBvbgorICogc3VjY2VzcyBvciBOVUxMIG9uIGVycm9yLiBUaGUgfHJ8IGFuZCB8bWV0aG9kX21vZHwgZmllbGRzIG9mIHRoZSByZXN1bHQgYXJlCisgKiBzZXQgdG8gTlVMTC4gKi8KK3N0YXRpYyBSU0FfYWRkaXRpb25hbF9wcmltZSAqcnNhX3BhcnNlX2FkZGl0aW9uYWxfcHJpbWUoQ0JTICpjYnMpIHsKKyAgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKnJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihSU0FfYWRkaXRpb25hbF9wcmltZSkpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtZW1zZXQocmV0LCAwLCBzaXplb2YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpKTsKKworICBDQlMgY2hpbGQ7CisgIGlmICghQ0JTX2dldF9hc24xKGNicywgJmNoaWxkLCBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKKyAgICAgICFwYXJzZV9pbnRlZ2VyKCZjaGlsZCwgJnJldC0+cHJpbWUpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmV4cCkgfHwKKyAgICAgICFwYXJzZV9pbnRlZ2VyKCZjaGlsZCwgJnJldC0+Y29lZmYpIHx8CisgICAgICBDQlNfbGVuKCZjaGlsZCkgIT0gMCkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfQkFEX0VOQ09ESU5HKTsKKyAgICBSU0FfYWRkaXRpb25hbF9wcmltZV9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCitSU0EgKlJTQV9wYXJzZV9wcml2YXRlX2tleShDQlMgKmNicykgeworICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIEJJR05VTSAqcHJvZHVjdF9vZl9wcmltZXNfc29fZmFyID0gTlVMTDsKKyAgUlNBICpyZXQgPSBSU0FfbmV3KCk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgQ0JTIGNoaWxkOworICB1aW50NjRfdCB2ZXJzaW9uOworICBpZiAoIUNCU19nZXRfYXNuMShjYnMsICZjaGlsZCwgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgICAgICAhQ0JTX2dldF9hc24xX3VpbnQ2NCgmY2hpbGQsICZ2ZXJzaW9uKSB8fAorICAgICAgKHZlcnNpb24gIT0ga1ZlcnNpb25Ud29QcmltZSAmJiB2ZXJzaW9uICE9IGtWZXJzaW9uTXVsdGkpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPm4pIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmUpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmQpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPnApIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPnEpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmRtcDEpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmRtcTEpIHx8CisgICAgICAhcGFyc2VfaW50ZWdlcigmY2hpbGQsICZyZXQtPmlxbXApKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfVkVSU0lPTik7CisgICAgZ290byBlcnI7CisgIH0KKworICAvKiBNdWx0aS1wcmltZSBSU0EgcmVxdWlyZXMgYSBuZXdlciB2ZXJzaW9uLiAqLworICBpZiAodmVyc2lvbiA9PSBrVmVyc2lvbk11bHRpICYmCisgICAgICBDQlNfcGVla19hc24xX3RhZygmY2hpbGQsIENCU19BU04xX1NFUVVFTkNFKSkgeworICAgIENCUyBvdGhlcl9wcmltZV9pbmZvczsKKyAgICBpZiAoIUNCU19nZXRfYXNuMSgmY2hpbGQsICZvdGhlcl9wcmltZV9pbmZvcywgQ0JTX0FTTjFfU0VRVUVOQ0UpIHx8CisgICAgICAgIENCU19sZW4oJm90aGVyX3ByaW1lX2luZm9zKSA9PSAwKSB7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0JBRF9FTkNPRElORyk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgcmV0LT5hZGRpdGlvbmFsX3ByaW1lcyA9IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX25ld19udWxsKCk7CisgICAgaWYgKHJldC0+YWRkaXRpb25hbF9wcmltZXMgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBjdHggPSBCTl9DVFhfbmV3KCk7CisgICAgcHJvZHVjdF9vZl9wcmltZXNfc29fZmFyID0gQk5fbmV3KCk7CisgICAgaWYgKGN0eCA9PSBOVUxMIHx8CisgICAgICAgIHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2ZhciA9PSBOVUxMIHx8CisgICAgICAgICFCTl9tdWwocHJvZHVjdF9vZl9wcmltZXNfc29fZmFyLCByZXQtPnAsIHJldC0+cSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgd2hpbGUgKENCU19sZW4oJm90aGVyX3ByaW1lX2luZm9zKSA+IDApIHsKKyAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9IHJzYV9wYXJzZV9hZGRpdGlvbmFsX3ByaW1lKCZvdGhlcl9wcmltZV9pbmZvcyk7CisgICAgICBpZiAoYXAgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGlmICghc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfcHVzaChyZXQtPmFkZGl0aW9uYWxfcHJpbWVzLCBhcCkpIHsKKyAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUoYXApOworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGFwLT5yID0gQk5fZHVwKHByb2R1Y3Rfb2ZfcHJpbWVzX3NvX2Zhcik7CisgICAgICBpZiAoYXAtPnIgPT0gTlVMTCB8fAorICAgICAgICAgICFCTl9tdWwocHJvZHVjdF9vZl9wcmltZXNfc29fZmFyLCBwcm9kdWN0X29mX3ByaW1lc19zb19mYXIsCisgICAgICAgICAgICAgICAgICBhcC0+cHJpbWUsIGN0eCkpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKENCU19sZW4oJmNoaWxkKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRU5DT0RJTkcpOworICAgIGdvdG8gZXJyOworICB9CisKKyAgQk5fQ1RYX2ZyZWUoY3R4KTsKKyAgQk5fZnJlZShwcm9kdWN0X29mX3ByaW1lc19zb19mYXIpOworICByZXR1cm4gcmV0OworCitlcnI6CisgIEJOX0NUWF9mcmVlKGN0eCk7CisgIEJOX2ZyZWUocHJvZHVjdF9vZl9wcmltZXNfc29fZmFyKTsKKyAgUlNBX2ZyZWUocmV0KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK1JTQSAqUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMoY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpbl9sZW4pIHsKKyAgQ0JTIGNiczsKKyAgQ0JTX2luaXQoJmNicywgaW4sIGluX2xlbik7CisgIFJTQSAqcmV0ID0gUlNBX3BhcnNlX3ByaXZhdGVfa2V5KCZjYnMpOworICBpZiAocmV0ID09IE5VTEwgfHwgQ0JTX2xlbigmY2JzKSAhPSAwKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRU5DT0RJTkcpOworICAgIFJTQV9mcmVlKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworaW50IFJTQV9tYXJzaGFsX3ByaXZhdGVfa2V5KENCQiAqY2JiLCBjb25zdCBSU0EgKnJzYSkgeworICBjb25zdCBpbnQgaXNfbXVsdGlwcmltZSA9CisgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcykgPiAwOworCisgIENCQiBjaGlsZDsKKyAgaWYgKCFDQkJfYWRkX2FzbjEoY2JiLCAmY2hpbGQsIENCU19BU04xX1NFUVVFTkNFKSB8fAorICAgICAgIUNCQl9hZGRfYXNuMV91aW50NjQoJmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbXVsdGlwcmltZSA/IGtWZXJzaW9uTXVsdGkgOiBrVmVyc2lvblR3b1ByaW1lKSB8fAorICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+bikgfHwKKyAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPmUpIHx8CisgICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5kKSB8fAorICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+cCkgfHwKKyAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPnEpIHx8CisgICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZjaGlsZCwgcnNhLT5kbXAxKSB8fAorICAgICAgIW1hcnNoYWxfaW50ZWdlcigmY2hpbGQsIHJzYS0+ZG1xMSkgfHwKKyAgICAgICFtYXJzaGFsX2ludGVnZXIoJmNoaWxkLCByc2EtPmlxbXApKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9FTkNPREVfRVJST1IpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGlzX211bHRpcHJpbWUpIHsKKyAgICBDQkIgb3RoZXJfcHJpbWVfaW5mb3M7CisgICAgaWYgKCFDQkJfYWRkX2FzbjEoJmNoaWxkLCAmb3RoZXJfcHJpbWVfaW5mb3MsIENCU19BU04xX1NFUVVFTkNFKSkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9FTkNPREVfRVJST1IpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyk7IGkrKykgeworICAgICAgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KKyAgICAgICAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUocnNhLT5hZGRpdGlvbmFsX3ByaW1lcywgaSk7CisgICAgICBDQkIgb3RoZXJfcHJpbWVfaW5mbzsKKyAgICAgIGlmICghQ0JCX2FkZF9hc24xKCZvdGhlcl9wcmltZV9pbmZvcywgJm90aGVyX3ByaW1lX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9TRVFVRU5DRSkgfHwKKyAgICAgICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZvdGhlcl9wcmltZV9pbmZvLCBhcC0+cHJpbWUpIHx8CisgICAgICAgICAgIW1hcnNoYWxfaW50ZWdlcigmb3RoZXJfcHJpbWVfaW5mbywgYXAtPmV4cCkgfHwKKyAgICAgICAgICAhbWFyc2hhbF9pbnRlZ2VyKCZvdGhlcl9wcmltZV9pbmZvLCBhcC0+Y29lZmYpKSB7CisgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFDQkJfZmx1c2goY2JiKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFJTQV9wcml2YXRlX2tleV90b19ieXRlcyh1aW50OF90ICoqb3V0X2J5dGVzLCBzaXplX3QgKm91dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJTQSAqcnNhKSB7CisgIENCQiBjYmI7CisgIENCQl96ZXJvKCZjYmIpOworICBpZiAoIUNCQl9pbml0KCZjYmIsIDApIHx8CisgICAgICAhUlNBX21hcnNoYWxfcHJpdmF0ZV9rZXkoJmNiYiwgcnNhKSB8fAorICAgICAgIUNCQl9maW5pc2goJmNiYiwgb3V0X2J5dGVzLCBvdXRfbGVuKSkgeworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfRU5DT0RFX0VSUk9SKTsKKyAgICBDQkJfY2xlYW51cCgmY2JiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworUlNBICpkMmlfUlNBUHVibGljS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDQlMgY2JzOworICBDQlNfaW5pdCgmY2JzLCAqaW5wLCAoc2l6ZV90KWxlbik7CisgIFJTQSAqcmV0ID0gUlNBX3BhcnNlX3B1YmxpY19rZXkoJmNicyk7CisgIGlmIChyZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmIChvdXQgIT0gTlVMTCkgeworICAgIFJTQV9mcmVlKCpvdXQpOworICAgICpvdXQgPSByZXQ7CisgIH0KKyAgKmlucCArPSAoc2l6ZV90KWxlbiAtIENCU19sZW4oJmNicyk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBpMmRfUlNBUHVibGljS2V5KGNvbnN0IFJTQSAqaW4sIHVpbnQ4X3QgKipvdXRwKSB7CisgIHVpbnQ4X3QgKmRlcjsKKyAgc2l6ZV90IGRlcl9sZW47CisgIGlmICghUlNBX3B1YmxpY19rZXlfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIGluKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZGVyX2xlbiA+IElOVF9NQVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX09WRVJGTE9XKTsKKyAgICBPUEVOU1NMX2ZyZWUoZGVyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKG91dHAgIT0gTlVMTCkgeworICAgIGlmICgqb3V0cCA9PSBOVUxMKSB7CisgICAgICAqb3V0cCA9IGRlcjsKKyAgICAgIGRlciA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweSgqb3V0cCwgZGVyLCBkZXJfbGVuKTsKKyAgICAgICpvdXRwICs9IGRlcl9sZW47CisgICAgfQorICB9CisgIE9QRU5TU0xfZnJlZShkZXIpOworICByZXR1cm4gKGludClkZXJfbGVuOworfQorCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5KFJTQSAqKm91dCwgY29uc3QgdWludDhfdCAqKmlucCwgbG9uZyBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBDQlMgY2JzOworICBDQlNfaW5pdCgmY2JzLCAqaW5wLCAoc2l6ZV90KWxlbik7CisgIFJTQSAqcmV0ID0gUlNBX3BhcnNlX3ByaXZhdGVfa2V5KCZjYnMpOworICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAob3V0ICE9IE5VTEwpIHsKKyAgICBSU0FfZnJlZSgqb3V0KTsKKyAgICAqb3V0ID0gcmV0OworICB9CisgICppbnAgKz0gKHNpemVfdClsZW4gLSBDQlNfbGVuKCZjYnMpOworICByZXR1cm4gcmV0OworfQorCitpbnQgaTJkX1JTQVByaXZhdGVLZXkoY29uc3QgUlNBICppbiwgdWludDhfdCAqKm91dHApIHsKKyAgdWludDhfdCAqZGVyOworICBzaXplX3QgZGVyX2xlbjsKKyAgaWYgKCFSU0FfcHJpdmF0ZV9rZXlfdG9fYnl0ZXMoJmRlciwgJmRlcl9sZW4sIGluKSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZGVyX2xlbiA+IElOVF9NQVgpIHsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX09WRVJGTE9XKTsKKyAgICBPUEVOU1NMX2ZyZWUoZGVyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKG91dHAgIT0gTlVMTCkgeworICAgIGlmICgqb3V0cCA9PSBOVUxMKSB7CisgICAgICAqb3V0cCA9IGRlcjsKKyAgICAgIGRlciA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweSgqb3V0cCwgZGVyLCBkZXJfbGVuKTsKKyAgICAgICpvdXRwICs9IGRlcl9sZW47CisgICAgfQorICB9CisgIE9QRU5TU0xfZnJlZShkZXIpOworICByZXR1cm4gKGludClkZXJfbGVuOworfQogCiBBU04xX1NFUVVFTkNFKFJTQV9QU1NfUEFSQU1TKSA9IHsKICAgQVNOMV9FWFBfT1BUKFJTQV9QU1NfUEFSQU1TLCBoYXNoQWxnb3JpdGhtLCBYNTA5X0FMR09SLDApLApAQCAtMTA0LDIyICs0NDMsMjQgQEAKIAogSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFJTQV9QU1NfUEFSQU1TKTsKIAotQVNOMV9TRVFVRU5DRShSU0FfT0FFUF9QQVJBTVMpID0gewotICBBU04xX0VYUF9PUFQoUlNBX09BRVBfUEFSQU1TLCBoYXNoRnVuYywgWDUwOV9BTEdPUiwgMCksCi0gIEFTTjFfRVhQX09QVChSU0FfT0FFUF9QQVJBTVMsIG1hc2tHZW5GdW5jLCBYNTA5X0FMR09SLCAxKSwKLSAgQVNOMV9FWFBfT1BUKFJTQV9PQUVQX1BBUkFNUywgcFNvdXJjZUZ1bmMsIFg1MDlfQUxHT1IsIDIpLAotfSBBU04xX1NFUVVFTkNFX0VORChSU0FfT0FFUF9QQVJBTVMpOwotCi1JTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUlNBX09BRVBfUEFSQU1TKTsKLQotSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShSU0EsIFJTQVByaXZhdGVLZXksIFJTQVByaXZhdGVLZXkpOwotCi1JTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKFJTQSwgUlNBUHVibGljS2V5LCBSU0FQdWJsaWNLZXkpOwotCiBSU0EgKlJTQVB1YmxpY0tleV9kdXAoY29uc3QgUlNBICpyc2EpIHsKLSAgcmV0dXJuIEFTTjFfaXRlbV9kdXAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgKFJTQSAqKSByc2EpOworICB1aW50OF90ICpkZXI7CisgIHNpemVfdCBkZXJfbGVuOworICBpZiAoIVJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCByc2EpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUlNBICpyZXQgPSBSU0FfcHVibGljX2tleV9mcm9tX2J5dGVzKGRlciwgZGVyX2xlbik7CisgIE9QRU5TU0xfZnJlZShkZXIpOworICByZXR1cm4gcmV0OwogfQogCiBSU0EgKlJTQVByaXZhdGVLZXlfZHVwKGNvbnN0IFJTQSAqcnNhKSB7Ci0gIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCAoUlNBICopIHJzYSk7CisgIHVpbnQ4X3QgKmRlcjsKKyAgc2l6ZV90IGRlcl9sZW47CisgIGlmICghUlNBX3ByaXZhdGVfa2V5X3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCByc2EpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgUlNBICpyZXQgPSBSU0FfcHJpdmF0ZV9rZXlfZnJvbV9ieXRlcyhkZXIsIGRlcl9sZW4pOworICBPUEVOU1NMX2ZyZWUoZGVyKTsKKyAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcnNhL3JzYV9pbXBsLmMgYi9zcmMvY3J5cHRvL3JzYS9yc2FfaW1wbC5jCmluZGV4IGUxNGYwZjUuLmViNGEzNmYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vcnNhL3JzYV9pbXBsLmMKKysrIGIvc3JjL2NyeXB0by9yc2EvcnNhX2ltcGwuYwpAQCAtNzgsNiArNzgsMTUgQEAKICAgQk5fTU9OVF9DVFhfZnJlZShyc2EtPl9tZXRob2RfbW9kX3ApOwogICBCTl9NT05UX0NUWF9mcmVlKHJzYS0+X21ldGhvZF9tb2RfcSk7CiAKKyAgaWYgKHJzYS0+YWRkaXRpb25hbF9wcmltZXMgIT0gTlVMTCkgeworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBza19SU0FfYWRkaXRpb25hbF9wcmltZV9udW0ocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyk7IGkrKykgeworICAgICAgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KKyAgICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShyc2EtPmFkZGl0aW9uYWxfcHJpbWVzLCBpKTsKKyAgICAgIEJOX01PTlRfQ1RYX2ZyZWUoYXAtPm1ldGhvZF9tb2QpOworICAgIH0KKyAgfQorCiAgIHJldHVybiAxOwogfQogCkBAIC05NCwyNCArMTAzLDI0IEBACiAgIGludCBpLCByZXQgPSAwOwogCiAgIGlmIChyc2Ffc2l6ZSA+IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChtYXhfb3V0IDwgcnNhX3NpemUpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChCTl91Y21wKHJzYS0+biwgcnNhLT5lKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRV9WQUxVRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBmb3IgbGFyZ2UgbW9kdWxpLCBlbmZvcmNlIGV4cG9uZW50IGxpbWl0ICovCiAgIGlmIChCTl9udW1fYml0cyhyc2EtPm4pID4gT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTICYmCiAgICAgICBCTl9udW1fYml0cyhyc2EtPmUpID4gT1BFTlNTTF9SU0FfTUFYX1BVQkVYUF9CSVRTKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRV9WQUxVRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtMTI1LDcgKzEzNCw3IEBACiAgIHJlc3VsdCA9IEJOX0NUWF9nZXQoY3R4KTsKICAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOwogICBpZiAoIWYgfHwgIXJlc3VsdCB8fCAhYnVmKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTQyLDcgKzE1MSw3IEBACiAgICAgICBpID0gUlNBX3BhZGRpbmdfYWRkX25vbmUoYnVmLCByc2Ffc2l6ZSwgaW4sIGluX2xlbik7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKICAgICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTE1Niw3ICsxNjUsNyBAQAogCiAgIGlmIChCTl91Y21wKGYsIHJzYS0+bikgPj0gMCkgewogICAgIC8qIHVzdWFsbHkgdGhlIHBhZGRpbmcgZnVuY3Rpb25zIHdvdWxkIGNhdGNoIHRoaXMgKi8KLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGVuY3J5cHQsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC0xNzUsNyArMTg0LDcgQEAKICAgLyogcHV0IGluIGxlYWRpbmcgMCBieXRlcyBpZiB0aGUgbnVtYmVyIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZQogICAgKiBtb2R1bHVzICovCiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChvdXQsIHJzYV9zaXplLCByZXN1bHQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBlbmNyeXB0LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzA5LDEzICszMTgsMTMgQEAKICAgaW50IGksIHJldCA9IDA7CiAKICAgaWYgKG1heF9vdXQgPCByc2Ffc2l6ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgc2lnbl9yYXcsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBzaWduX3JhdywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTMyNyw3ICszMzYsNyBAQAogICAgICAgaSA9IFJTQV9wYWRkaW5nX2FkZF9ub25lKGJ1ZiwgcnNhX3NpemUsIGluLCBpbl9sZW4pOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgc2lnbl9yYXcsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOwogICAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzU5LDE4ICszNjgsMjMgQEAKICAgaW50IHJldCA9IDA7CiAKICAgaWYgKG1heF9vdXQgPCByc2Ffc2l6ZSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgZGVjcnlwdCwgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfT1VUUFVUX0JVRkZFUl9UT09fU01BTEwpOwogICAgIHJldHVybiAwOwogICB9CiAKLSAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOwotICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGRlY3J5cHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLSAgICBnb3RvIGVycjsKKyAgaWYgKHBhZGRpbmcgPT0gUlNBX05PX1BBRERJTkcpIHsKKyAgICBidWYgPSBvdXQ7CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgYSB0ZW1wb3JhcnkgYnVmZmVyIHRvIGhvbGQgdGhlIHBhZGRlZCBwbGFpbnRleHQuICovCisgICAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CiAgIH0KIAogICBpZiAoaW5fbGVuICE9IHJzYV9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9EQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMzg4LDIyICs0MDIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFJTQV9OT19QQURESU5HOgotICAgICAgciA9IFJTQV9wYWRkaW5nX2NoZWNrX25vbmUob3V0LCByc2Ffc2l6ZSwgYnVmLCByc2Ffc2l6ZSk7CisgICAgICByID0gcnNhX3NpemU7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKICAgICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKHIgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBkZWNyeXB0LCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CiAgIH0gZWxzZSB7CiAgICAgKm91dF9sZW4gPSByOwogICAgIHJldCA9IDE7CiAgIH0KIAogZXJyOgotICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgaWYgKHBhZGRpbmcgIT0gUlNBX05PX1BBRERJTkcgJiYgYnVmICE9IE5VTEwpIHsKICAgICBPUEVOU1NMX2NsZWFuc2UoYnVmLCByc2Ffc2l6ZSk7CiAgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CiAgIH0KQEAgLTQyMSwyNCArNDM1LDI0IEBACiAgIEJOX0NUWCAqY3R4ID0gTlVMTDsKIAogICBpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIGlmIChCTl91Y21wKHJzYS0+biwgcnNhLT5lKSA8PSAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRV9WQUxVRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICBpZiAobWF4X291dCA8IHJzYV9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9PVVRQVVRfQlVGRkVSX1RPT19TTUFMTCk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIAogICAvKiBmb3IgbGFyZ2UgbW9kdWxpLCBlbmZvcmNlIGV4cG9uZW50IGxpbWl0ICovCiAgIGlmIChCTl9udW1fYml0cyhyc2EtPm4pID4gT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTICYmCiAgICAgICBCTl9udW1fYml0cyhyc2EtPmUpID4gT1BFTlNTTF9SU0FfTUFYX1BVQkVYUF9CSVRTKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9CQURfRV9WQUxVRSk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9CQURfRV9WQUxVRSk7CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDUwLDE0ICs0NjQsMjMgQEAKICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CiAgIGYgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIHJlc3VsdCA9IEJOX0NUWF9nZXQoY3R4KTsKLSAgYnVmID0gT1BFTlNTTF9tYWxsb2MocnNhX3NpemUpOwotICBpZiAoIWYgfHwgIXJlc3VsdCB8fCAhYnVmKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgIGlmIChwYWRkaW5nID09IFJTQV9OT19QQURESU5HKSB7CisgICAgYnVmID0gb3V0OworICB9IGVsc2UgeworICAgIC8qIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBwYWRkZWQgcGxhaW50ZXh0LiAqLworICAgIGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHJzYV9zaXplKTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisgIGlmICghZiB8fCAhcmVzdWx0KSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAgICAgZ290byBlcnI7CiAgIH0KIAogICBpZiAoaW5fbGVuICE9IHJzYV9zaXplKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9EQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9EQVRBX0xFTl9OT1RfRVFVQUxfVE9fTU9EX0xFTik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDY2LDcgKzQ4OSw3IEBACiAgIH0KIAogICBpZiAoQk5fdWNtcChmLCByc2EtPm4pID49IDApIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIHZlcmlmeV9yYXcsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC00ODMsNyArNTA2LDcgQEAKICAgfQogCiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChidWYsIHJzYV9zaXplLCByZXN1bHQpKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtNDkyLDE1ICs1MTUsMTUgQEAKICAgICAgIHIgPSBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzEob3V0LCByc2Ffc2l6ZSwgYnVmLCByc2Ffc2l6ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFJTQV9OT19QQURESU5HOgotICAgICAgciA9IFJTQV9wYWRkaW5nX2NoZWNrX25vbmUob3V0LCByc2Ffc2l6ZSwgYnVmLCByc2Ffc2l6ZSk7CisgICAgICByID0gcnNhX3NpemU7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRSk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKICAgICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKHIgPCAwKSB7Ci0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCB2ZXJpZnlfcmF3LCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CiAgIH0gZWxzZSB7CiAgICAgKm91dF9sZW4gPSByOwogICAgIHJldCA9IDE7CkBAIC01MTEsNyArNTM0LDcgQEAKICAgICBCTl9DVFhfZW5kKGN0eCk7CiAgICAgQk5fQ1RYX2ZyZWUoY3R4KTsKICAgfQotICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgaWYgKHBhZGRpbmcgIT0gUlNBX05PX1BBRERJTkcgJiYgYnVmICE9IE5VTEwpIHsKICAgICBPUEVOU1NMX2NsZWFuc2UoYnVmLCByc2Ffc2l6ZSk7CiAgICAgT1BFTlNTTF9mcmVlKGJ1Zik7CiAgIH0KQEAgLTUzNSw3ICs1NTgsNyBAQAogICByZXN1bHQgPSBCTl9DVFhfZ2V0KGN0eCk7CiAKICAgaWYgKGYgPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcHJpdmF0ZV90cmFuc2Zvcm0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC01NDUsMTQgKzU2OCwxNCBAQAogCiAgIGlmIChCTl91Y21wKGYsIHJzYS0+bikgPj0gMCkgewogICAgIC8qIFVzdWFsbHkgdGhlIHBhZGRpbmcgZnVuY3Rpb25zIHdvdWxkIGNhdGNoIHRoaXMuICovCi0gICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwcml2YXRlX3RyYW5zZm9ybSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpOworICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpOwogICAgIGdvdG8gZXJyOwogICB9CiAKICAgaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0JMSU5ESU5HKSkgewogICAgIGJsaW5kaW5nID0gcnNhX2JsaW5kaW5nX2dldChyc2EsICZibGluZGluZ19pbmRleCwgY3R4KTsKICAgICBpZiAoYmxpbmRpbmcgPT0gTlVMTCkgewotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBwcml2YXRlX3RyYW5zZm9ybSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKCFCTl9CTElORElOR19jb252ZXJ0X2V4KGYsIE5VTEwsIGJsaW5kaW5nLCBjdHgpKSB7CkBAIC01OTMsNyArNjE2LDcgQEAKICAgfQogCiAgIGlmICghQk5fYm4yYmluX3BhZGRlZChvdXQsIGxlbiwgcmVzdWx0KSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFJTQSwgcHJpdmF0ZV90cmFuc2Zvcm0sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC02MTYsNiArNjM5LDExIEBACiAgIEJJR05VTSBsb2NhbF9kbXAxLCBsb2NhbF9kbXExLCBsb2NhbF9jLCBsb2NhbF9yMTsKICAgQklHTlVNICpkbXAxLCAqZG1xMSwgKmMsICpwcjE7CiAgIGludCByZXQgPSAwOworICBzaXplX3QgaSwgbnVtX2FkZGl0aW9uYWxfcHJpbWVzID0gMDsKKworICBpZiAocnNhLT5hZGRpdGlvbmFsX3ByaW1lcyAhPSBOVUxMKSB7CisgICAgbnVtX2FkZGl0aW9uYWxfcHJpbWVzID0gc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfbnVtKHJzYS0+YWRkaXRpb25hbF9wcmltZXMpOworICB9CiAKICAgQk5fQ1RYX3N0YXJ0KGN0eCk7CiAgIHIxID0gQk5fQ1RYX2dldChjdHgpOwpAQCAtNzI0LDYgKzc1Miw0MiBAQAogICAgIGdvdG8gZXJyOwogICB9CiAKKyAgZm9yIChpID0gMDsgaSA8IG51bV9hZGRpdGlvbmFsX3ByaW1lczsgaSsrKSB7CisgICAgLyogbXVsdGktcHJpbWUgUlNBLiAqLworICAgIEJJR05VTSBsb2NhbF9leHAsIGxvY2FsX3ByaW1lOworICAgIEJJR05VTSAqZXhwID0gJmxvY2FsX2V4cCwgKnByaW1lID0gJmxvY2FsX3ByaW1lOworICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9CisgICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKHJzYS0+YWRkaXRpb25hbF9wcmltZXMsIGkpOworCisgICAgQk5fd2l0aF9mbGFncyhleHAsIGFwLT5leHAsIEJOX0ZMR19DT05TVFRJTUUpOworICAgIEJOX3dpdGhfZmxhZ3MocHJpbWUsIGFwLT5wcmltZSwgQk5fRkxHX0NPTlNUVElNRSk7CisKKyAgICAvKiBjIHdpbGwgYWxyZWFkeSBwb2ludCB0byBhIEJJR05VTSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzLiAqLworICAgIGlmICghQk5fbW9kKHIxLCBjLCBwcmltZSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfQ0FDSEVfUFJJVkFURSkgJiYKKyAgICAgICAgIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJmFwLT5tZXRob2RfbW9kLCAmcnNhLT5sb2NrLCBwcmltZSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAobTEsIHIxLCBleHAsIHByaW1lLCBjdHgsIGFwLT5tZXRob2RfbW9kKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgQk5fc2V0X2ZsYWdzKG0xLCBCTl9GTEdfQ09OU1RUSU1FKTsKKworICAgIGlmICghQk5fc3ViKG0xLCBtMSwgcjApIHx8CisgICAgICAgICFCTl9tdWwobTEsIG0xLCBhcC0+Y29lZmYsIGN0eCkgfHwKKyAgICAgICAgIUJOX21vZChtMSwgbTEsIHByaW1lLCBjdHgpIHx8CisgICAgICAgIChCTl9pc19uZWdhdGl2ZShtMSkgJiYgIUJOX2FkZChtMSwgbTEsIHByaW1lKSkgfHwKKyAgICAgICAgIUJOX211bChtMSwgbTEsIGFwLT5yLCBjdHgpIHx8CisgICAgICAgICFCTl9hZGQocjAsIHIwLCBtMSkpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCiAgIGlmIChyc2EtPmUgJiYgcnNhLT5uKSB7CiAgICAgaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAodnJmeSwgcjAsIHJzYS0+ZSwgcnNhLT5uLCBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhLT5fbWV0aG9kX21vZF9uKSkgewpAQCAtNzY2LDEyICs4MzAsMjAgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBrZXlnZW4oUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmVfdmFsdWUsIEJOX0dFTkNCICpjYikgeworc3RhdGljIGludCBrZXlnZW5fbXVsdGlwcmltZShSU0EgKnJzYSwgaW50IGJpdHMsIGludCBudW1fcHJpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdOVU0gKmVfdmFsdWUsIEJOX0dFTkNCICpjYikgewogICBCSUdOVU0gKnIwID0gTlVMTCwgKnIxID0gTlVMTCwgKnIyID0gTlVMTCwgKnIzID0gTlVMTCwgKnRtcDsKICAgQklHTlVNIGxvY2FsX3IwLCBsb2NhbF9kLCBsb2NhbF9wOwogICBCSUdOVU0gKnByMCwgKmQsICpwOwotICBpbnQgYml0c3AsIGJpdHNxLCBvayA9IC0xLCBuID0gMDsKKyAgaW50IHByaW1lX2JpdHMsIG9rID0gLTEsIG4gPSAwLCBpLCBqOwogICBCTl9DVFggKmN0eCA9IE5VTEw7CisgIFNUQUNLX09GKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSAqYWRkaXRpb25hbF9wcmltZXMgPSBOVUxMOworCisgIGlmIChudW1fcHJpbWVzIDwgMikgeworICAgIG9rID0gMDsgLyogd2Ugc2V0IG91ciBvd24gZXJyICovCisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBSU0FfUl9NVVNUX0hBVkVfQVRfTEVBU1RfVFdPX1BSSU1FUyk7CisgICAgZ290byBlcnI7CisgIH0KIAogICBjdHggPSBCTl9DVFhfbmV3KCk7CiAgIGlmIChjdHggPT0gTlVMTCkgewpAQCAtNzgyLDEyICs4NTQsMzYgQEAKICAgcjEgPSBCTl9DVFhfZ2V0KGN0eCk7CiAgIHIyID0gQk5fQ1RYX2dldChjdHgpOwogICByMyA9IEJOX0NUWF9nZXQoY3R4KTsKLSAgaWYgKHIzID09IE5VTEwpIHsKKyAgaWYgKHIwID09IE5VTEwgfHwgcjEgPT0gTlVMTCB8fCByMiA9PSBOVUxMIHx8IHIzID09IE5VTEwpIHsKICAgICBnb3RvIGVycjsKICAgfQogCi0gIGJpdHNwID0gKGJpdHMgKyAxKSAvIDI7Ci0gIGJpdHNxID0gYml0cyAtIGJpdHNwOworICBpZiAobnVtX3ByaW1lcyA+IDIpIHsKKyAgICBhZGRpdGlvbmFsX3ByaW1lcyA9IHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX25ld19udWxsKCk7CisgICAgaWYgKGFkZGl0aW9uYWxfcHJpbWVzID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDI7IGkgPCBudW1fcHJpbWVzOyBpKyspIHsKKyAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoUlNBX2FkZGl0aW9uYWxfcHJpbWUpKTsKKyAgICBpZiAoYXAgPT0gTlVMTCkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICAgIG1lbXNldChhcCwgMCwgc2l6ZW9mKFJTQV9hZGRpdGlvbmFsX3ByaW1lKSk7CisgICAgYXAtPnByaW1lID0gQk5fbmV3KCk7CisgICAgYXAtPmV4cCA9IEJOX25ldygpOworICAgIGFwLT5jb2VmZiA9IEJOX25ldygpOworICAgIGFwLT5yID0gQk5fbmV3KCk7CisgICAgaWYgKGFwLT5wcmltZSA9PSBOVUxMIHx8CisgICAgICAgIGFwLT5leHAgPT0gTlVMTCB8fAorICAgICAgICBhcC0+Y29lZmYgPT0gTlVMTCB8fAorICAgICAgICBhcC0+ciA9PSBOVUxMIHx8CisgICAgICAgICFza19SU0FfYWRkaXRpb25hbF9wcmltZV9wdXNoKGFkZGl0aW9uYWxfcHJpbWVzLCBhcCkpIHsKKyAgICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lX2ZyZWUoYXApOworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CiAKICAgLyogV2UgbmVlZCB0aGUgUlNBIGNvbXBvbmVudHMgbm9uLU5VTEwgKi8KICAgaWYgKCFyc2EtPm4gJiYgKChyc2EtPm4gPSBCTl9uZXcoKSkgPT0gTlVMTCkpIHsKQEAgLTgxNSwxMSArOTExLDE0IEBACiAgICAgZ290byBlcnI7CiAgIH0KIAotICBCTl9jb3B5KHJzYS0+ZSwgZV92YWx1ZSk7CisgIGlmICghQk5fY29weShyc2EtPmUsIGVfdmFsdWUpKSB7CisgICAgZ290byBlcnI7CisgIH0KIAogICAvKiBnZW5lcmF0ZSBwIGFuZCBxICovCisgIHByaW1lX2JpdHMgPSAoYml0cyArIChudW1fcHJpbWVzIC0gMSkpIC8gbnVtX3ByaW1lczsKICAgZm9yICg7OykgewotICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocnNhLT5wLCBiaXRzcCwgMCwgTlVMTCwgTlVMTCwgY2IpIHx8CisgICAgaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChyc2EtPnAsIHByaW1lX2JpdHMsIDAsIE5VTEwsIE5VTEwsIGNiKSB8fAogICAgICAgICAhQk5fc3ViKHIyLCByc2EtPnAsIEJOX3ZhbHVlX29uZSgpKSB8fAogICAgICAgICAhQk5fZ2NkKHIxLCByMiwgcnNhLT5lLCBjdHgpKSB7CiAgICAgICBnb3RvIGVycjsKQEAgLTgzNCwxOSArOTMzLDIwIEBACiAgIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMCkpIHsKICAgICBnb3RvIGVycjsKICAgfQorICBwcmltZV9iaXRzID0gKChiaXRzIC0gcHJpbWVfYml0cykgKyAobnVtX3ByaW1lcyAtIDIpKSAvIChudW1fcHJpbWVzIC0gMSk7CiAgIGZvciAoOzspIHsKICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgcmlkaWN1bG91c2x5IHNtYWxsIGtleXMsIHdlIGNhbiBnZXQgc3R1Y2sKICAgICAgKiBjb250aW51YWxseSByZWdlbmVyYXRpbmcgdGhlIHNhbWUgcHJpbWUgdmFsdWVzLiBDaGVjayBmb3IKICAgICAgKiB0aGlzIGFuZCBiYWlsIGlmIGl0IGhhcHBlbnMgMyB0aW1lcy4gKi8KICAgICB1bnNpZ25lZCBpbnQgZGVnZW5lcmF0ZSA9IDA7CiAgICAgZG8gewotICAgICAgaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChyc2EtPnEsIGJpdHNxLCAwLCBOVUxMLCBOVUxMLCBjYikpIHsKKyAgICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgocnNhLT5xLCBwcmltZV9iaXRzLCAwLCBOVUxMLCBOVUxMLCBjYikpIHsKICAgICAgICAgZ290byBlcnI7CiAgICAgICB9CiAgICAgfSB3aGlsZSAoKEJOX2NtcChyc2EtPnAsIHJzYS0+cSkgPT0gMCkgJiYgKCsrZGVnZW5lcmF0ZSA8IDMpKTsKICAgICBpZiAoZGVnZW5lcmF0ZSA9PSAzKSB7CiAgICAgICBvayA9IDA7IC8qIHdlIHNldCBvdXIgb3duIGVyciAqLwotICAgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBrZXlnZW4sIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CisgICAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCk7CiAgICAgICBnb3RvIGVycjsKICAgICB9CiAgICAgaWYgKCFCTl9zdWIocjIsIHJzYS0+cSwgQk5fdmFsdWVfb25lKCkpIHx8CkBAIC04NjAsMjAgKzk2MCw5MSBAQAogICAgICAgZ290byBlcnI7CiAgICAgfQogICB9Ci0gIGlmICghQk5fR0VOQ0JfY2FsbChjYiwgMywgMSkpIHsKKworICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDEpIHx8CisgICAgICAhQk5fbXVsKHJzYS0+biwgcnNhLT5wLCByc2EtPnEsIGN0eCkpIHsKICAgICBnb3RvIGVycjsKICAgfQorCisgIGZvciAoaSA9IDI7IGkgPCBudW1fcHJpbWVzOyBpKyspIHsKKyAgICBSU0FfYWRkaXRpb25hbF9wcmltZSAqYXAgPQorICAgICAgICBza19SU0FfYWRkaXRpb25hbF9wcmltZV92YWx1ZShhZGRpdGlvbmFsX3ByaW1lcywgaSAtIDIpOworICAgIHByaW1lX2JpdHMgPSAoKGJpdHMgLSBCTl9udW1fYml0cyhyc2EtPm4pKSArIChudW1fcHJpbWVzIC0gKGkgKyAxKSkpIC8KKyAgICAgICAgICAgICAgICAgKG51bV9wcmltZXMgLSBpKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgIGlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgoYXAtPnByaW1lLCBwcmltZV9iaXRzLCAwLCBOVUxMLCBOVUxMLCBjYikpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAoQk5fY21wKHJzYS0+cCwgYXAtPnByaW1lKSA9PSAwIHx8CisgICAgICAgICAgQk5fY21wKHJzYS0+cSwgYXAtPnByaW1lKSA9PSAwKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKGogPSAwOyBqIDwgaSAtIDI7IGorKykgeworICAgICAgICBpZiAoQk5fY21wKHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKGFkZGl0aW9uYWxfcHJpbWVzLCBqKS0+cHJpbWUsCisgICAgICAgICAgICAgICAgICAgYXAtPnByaW1lKSA9PSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChqICE9IGkgLSAyKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoIUJOX3N1YihyMiwgYXAtPnByaW1lLCBCTl92YWx1ZV9vbmUoKSkgfHwKKyAgICAgICAgICAhQk5fZ2NkKHIxLCByMiwgcnNhLT5lLCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorCisgICAgICBpZiAoIUJOX2lzX29uZShyMSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoaSAhPSBudW1fcHJpbWVzIC0gMSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLyogRm9yIHRoZSBsYXN0IHByaW1lIHdlJ2xsIGNoZWNrIHRoYXQgaXQgbWFrZXMgbiBsYXJnZSBlbm91Z2guIEluIHRoZQorICAgICAgICogdHdvIHByaW1lIGNhc2UgdGhpcyBpc24ndCBhIHByb2JsZW0gYmVjYXVzZSB3ZSBnZW5lcmF0ZSBwcmltZXMgd2l0aAorICAgICAgICogdGhlIHRvcCB0d28gYml0cyBzZXQgYW5kIHNvIHRoZSBwcm9kdWN0IGlzIGFsd2F5cyBvZiB0aGUgZXhwZWN0ZWQKKyAgICAgICAqIHNpemUuIEluIHRoZSBtdWx0aSBwcmltZSBjYXNlLCB0aGlzIGRvZXNuJ3QgZm9sbG93LiAqLworICAgICAgaWYgKCFCTl9tdWwocjEsIHJzYS0+biwgYXAtPnByaW1lLCBjdHgpKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKEJOX251bV9iaXRzKHIxKSA9PSBiaXRzKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBpZiAoIUJOX0dFTkNCX2NhbGwoY2IsIDIsIG4rKykpIHsKKyAgICAgICAgZ290byBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgLyogYXAtPnIgaXMgaXMgdGhlIHByb2R1Y3Qgb2YgYWxsIHRoZSBwcmltZXMgcHJpb3IgdG8gdGhlIGN1cnJlbnQgb25lCisgICAgICogKGluY2x1ZGluZyBwIGFuZCBxKS4gKi8KKyAgICBpZiAoIUJOX2NvcHkoYXAtPnIsIHJzYS0+bikpIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoaSA9PSBudW1fcHJpbWVzIC0gMSkgeworICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgdGhlIGxhc3QgcHJpbWUsIHdlIGNhbGN1bGF0ZWQgbiBhcyB8cjF8IGluIHRoZSBsb29wCisgICAgICAgKiBhYm92ZS4gKi8KKyAgICAgIGlmICghQk5fY29weShyc2EtPm4sIHIxKSkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFCTl9tdWwocnNhLT5uLCByc2EtPm4sIGFwLT5wcmltZSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCFCTl9HRU5DQl9jYWxsKGNiLCAzLCAxKSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKICAgaWYgKEJOX2NtcChyc2EtPnAsIHJzYS0+cSkgPCAwKSB7CiAgICAgdG1wID0gcnNhLT5wOwogICAgIHJzYS0+cCA9IHJzYS0+cTsKICAgICByc2EtPnEgPSB0bXA7CiAgIH0KIAotICAvKiBjYWxjdWxhdGUgbiAqLwotICBpZiAoIUJOX211bChyc2EtPm4sIHJzYS0+cCwgcnNhLT5xLCBjdHgpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQogICAvKiBjYWxjdWxhdGUgZCAqLwogICBpZiAoIUJOX3N1YihyMSwgcnNhLT5wLCBCTl92YWx1ZV9vbmUoKSkpIHsKICAgICBnb3RvIGVycjsgLyogcC0xICovCkBAIC04ODQsNiArMTA1NSwxNCBAQAogICBpZiAoIUJOX211bChyMCwgcjEsIHIyLCBjdHgpKSB7CiAgICAgZ290byBlcnI7IC8qIChwLTEpKHEtMSkgKi8KICAgfQorICBmb3IgKGkgPSAyOyBpIDwgbnVtX3ByaW1lczsgaSsrKSB7CisgICAgUlNBX2FkZGl0aW9uYWxfcHJpbWUgKmFwID0KKyAgICAgICAgc2tfUlNBX2FkZGl0aW9uYWxfcHJpbWVfdmFsdWUoYWRkaXRpb25hbF9wcmltZXMsIGkgLSAyKTsKKyAgICBpZiAoIUJOX3N1YihyMywgYXAtPnByaW1lLCBCTl92YWx1ZV9vbmUoKSkgfHwKKyAgICAgICAgIUJOX211bChyMCwgcjAsIHIzLCBjdHgpKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KICAgcHIwID0gJmxvY2FsX3IwOwogICBCTl93aXRoX2ZsYWdzKHByMCwgcjAsIEJOX0ZMR19DT05TVFRJTUUpOwogICBpZiAoIUJOX21vZF9pbnZlcnNlKHJzYS0+ZCwgcnNhLT5lLCBwcjAsIGN0eCkpIHsKQEAgLTkxMiwyMSArMTA5MSwzOCBAQAogICAgIGdvdG8gZXJyOwogICB9CiAKKyAgZm9yIChpID0gMjsgaSA8IG51bV9wcmltZXM7IGkrKykgeworICAgIFJTQV9hZGRpdGlvbmFsX3ByaW1lICphcCA9CisgICAgICAgIHNrX1JTQV9hZGRpdGlvbmFsX3ByaW1lX3ZhbHVlKGFkZGl0aW9uYWxfcHJpbWVzLCBpIC0gMik7CisgICAgaWYgKCFCTl9zdWIoYXAtPmV4cCwgYXAtPnByaW1lLCBCTl92YWx1ZV9vbmUoKSkgfHwKKyAgICAgICAgIUJOX21vZChhcC0+ZXhwLCByc2EtPmQsIGFwLT5leHAsIGN0eCkgfHwKKyAgICAgICAgIUJOX21vZF9pbnZlcnNlKGFwLT5jb2VmZiwgYXAtPnIsIGFwLT5wcmltZSwgY3R4KSkgeworICAgICAgZ290byBlcnI7CisgICAgfQorICB9CisKICAgb2sgPSAxOworICByc2EtPmFkZGl0aW9uYWxfcHJpbWVzID0gYWRkaXRpb25hbF9wcmltZXM7CisgIGFkZGl0aW9uYWxfcHJpbWVzID0gTlVMTDsKIAogZXJyOgogICBpZiAob2sgPT0gLTEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihSU0EsIGtleWdlbiwgRVJSX0xJQl9CTik7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoUlNBLCBFUlJfTElCX0JOKTsKICAgICBvayA9IDA7CiAgIH0KICAgaWYgKGN0eCAhPSBOVUxMKSB7CiAgICAgQk5fQ1RYX2VuZChjdHgpOwogICAgIEJOX0NUWF9mcmVlKGN0eCk7CiAgIH0KLQorICBza19SU0FfYWRkaXRpb25hbF9wcmltZV9wb3BfZnJlZShhZGRpdGlvbmFsX3ByaW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNBX2FkZGl0aW9uYWxfcHJpbWVfZnJlZSk7CiAgIHJldHVybiBvazsKIH0KIAorc3RhdGljIGludCBrZXlnZW4oUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmVfdmFsdWUsIEJOX0dFTkNCICpjYikgeworICByZXR1cm4ga2V5Z2VuX211bHRpcHJpbWUocnNhLCBiaXRzLCAyIC8qIG51bSBwcmltZXMgKi8sIGVfdmFsdWUsIGNiKTsKK30KKwogY29uc3Qgc3RydWN0IHJzYV9tZXRoX3N0IFJTQV9kZWZhdWx0X21ldGhvZCA9IHsKICAgewogICAgIDAgLyogcmVmZXJlbmNlcyAqLywKQEAgLTk1NSw0ICsxMTUxLDcgQEAKICAgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDIHwgUlNBX0ZMQUdfQ0FDSEVfUFJJVkFURSwKIAogICBrZXlnZW4sCisgIGtleWdlbl9tdWx0aXByaW1lLAorCisgIE5VTEwgLyogc3VwcG9ydHNfZGlnZXN0ICovLAogfTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vcnNhL3JzYV90ZXN0LmMgYi9zcmMvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMThjZjNmLi4wMDAwMDAwCi0tLSBhL3NyYy9jcnlwdG8vcnNhL3JzYV90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgotICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgotICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAotICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCi0gKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCi0gKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KLSAqCi0gKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgotICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgotICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgotICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KLSAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgotICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5Ci0gKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgotICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5Ci0gKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KLSAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCi0gKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKLSAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQotICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQotICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KLQotI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KLQotCi0jZGVmaW5lIFNldEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGtleS0+biA9IEJOX2JpbjJibihuLCBzaXplb2YobikgLSAxLCBrZXktPm4pOyAgICAgICAgICAgICBcCi0gIGtleS0+ZSA9IEJOX2JpbjJibihlLCBzaXplb2YoZSkgLSAxLCBrZXktPmUpOyAgICAgICAgICAgICBcCi0gIGtleS0+ZCA9IEJOX2JpbjJibihkLCBzaXplb2YoZCkgLSAxLCBrZXktPmQpOyAgICAgICAgICAgICBcCi0gIGtleS0+cCA9IEJOX2JpbjJibihwLCBzaXplb2YocCkgLSAxLCBrZXktPnApOyAgICAgICAgICAgICBcCi0gIGtleS0+cSA9IEJOX2JpbjJibihxLCBzaXplb2YocSkgLSAxLCBrZXktPnEpOyAgICAgICAgICAgICBcCi0gIGtleS0+ZG1wMSA9IEJOX2JpbjJibihkbXAxLCBzaXplb2YoZG1wMSkgLSAxLCBrZXktPmRtcDEpOyBcCi0gIGtleS0+ZG1xMSA9IEJOX2JpbjJibihkbXExLCBzaXplb2YoZG1xMSkgLSAxLCBrZXktPmRtcTEpOyBcCi0gIGtleS0+aXFtcCA9IEJOX2JpbjJibihpcW1wLCBzaXplb2YoaXFtcCkgLSAxLCBrZXktPmlxbXApOyBcCi0gIG1lbWNweShjLCBjdGV4dF9leCwgc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOyAgICAgICAgICAgICAgICBcCi0gIHJldHVybiAoc2l6ZW9mKGN0ZXh0X2V4KSAtIDEpOwotCi1zdGF0aWMgaW50IGtleTEoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KLSAgICAgICJceDAwXHhBQVx4MzZceEFCXHhDRVx4ODhceEFDXHhGRFx4RkZceDU1XHg1Mlx4M0NceDdGXHhDNFx4NTJceDNGIgotICAgICAgIlx4OTBceEVGXHhBMFx4MERceEYzXHg3N1x4NEFceDI1XHg5Rlx4MkVceDYyXHhCNFx4QzVceEQ5XHg5Q1x4QjUiCi0gICAgICAiXHhBRFx4QjNceDAwXHhBMFx4MjhceDVFXHg1M1x4MDFceDkzXHgwRVx4MENceDcwXHhGQlx4NjhceDc2XHg5MyIKLSAgICAgICJceDlDXHhFNlx4MTZceENFXHg2Mlx4NEFceDExXHhFMFx4MDhceDZEXHgzNFx4MUVceEJDXHhBQ1x4QTBceEExIgotICAgICAgIlx4RjUiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQotICAgICAgIlx4MEFceDAzXHgzN1x4NDhceDYyXHg2NFx4ODdceDY5XHg1Rlx4NUZceDMwXHhCQ1x4MzhceEI5XHg4Qlx4NDQiCi0gICAgICAiXHhDMlx4Q0RceDJEXHhGRlx4NDNceDQwXHg5OFx4Q0RceDIwXHhEOFx4QTFceDM4XHhEMFx4OTBceEJGXHg2NCIKLSAgICAgICJceDc5XHg3Q1x4M0ZceEE3XHhBMlx4Q0RceENCXHgzQ1x4RDFceEUwXHhCRFx4QkFceDI2XHg1NFx4QjRceEY5IgotICAgICAgIlx4REZceDhFXHg4QVx4RTVceDlEXHg3M1x4M0RceDlGXHgzM1x4QjNceDAxXHg2Mlx4NEFceEZEXHgxRFx4NTEiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9Ci0gICAgICAiXHgwMFx4RDhceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKLSAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDEyIgotICAgICAgIlx4MEQiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbXSA9Ci0gICAgICAiXHgwMFx4QzlceDdGXHhCMVx4RjBceDI3XHhGNFx4NTNceEY2XHgzNFx4MTJceDMzXHhFQVx4QUFceEQxXHhEOSIKLSAgICAgICJceDM1XHgzRlx4NkNceDQyXHhEMFx4ODhceDY2XHhCMVx4RDBceDVBXHgwRlx4MjBceDM1XHgwMlx4OEJceDlEIgotICAgICAgIlx4ODkiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9Ci0gICAgICAiXHg1OVx4MEJceDk1XHg3Mlx4QTJceEMyXHhBOVx4QzRceDA2XHgwNVx4OURceEMyXHhBQlx4MkZceDFEXHhBRiIKLSAgICAgICJceEVCXHg3RVx4OEJceDRGXHgxMFx4QTdceDU0XHg5RVx4OEVceEVEXHhGNVx4QjRceEZDXHhFMFx4OUVceDA1IjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXExW10gPQotICAgICAgIlx4MDBceDhFXHgzQ1x4MDVceDIxXHhGRVx4MTVceEUwXHhFQVx4MDZceEEzXHg2Rlx4RjBceEYxXHgwQ1x4OTkiCi0gICAgICAiXHg1Mlx4QzNceDVCXHg3QVx4NzVceDE0XHhGRFx4MzJceDM4XHhCOFx4MEFceEFEXHg1Mlx4OThceDYyXHg4RCIKLSAgICAgICJceDUxIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQotICAgICAgIlx4MzZceDNGXHhGN1x4MThceDlEXHhBOFx4RTlceDBCXHgxRFx4MzRceDFGXHg3MVx4RDBceDlCXHg3Nlx4QTgiCi0gICAgICAiXHhBOVx4NDNceEUxXHgxRFx4MTBceEIyXHg0RFx4MjRceDlGXHgyRFx4RUFceEZFXHhGOFx4MENceDE4XHgyNiI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9Ci0gICAgICAiXHgxYlx4OGZceDA1XHhmOVx4Y2FceDFhXHg3OVx4NTJceDZlXHg1M1x4ZjNceGNjXHg1MVx4NGZceGRiXHg4OSIKLSAgICAgICJceDJiXHhmYlx4OTFceDkzXHgyM1x4MWVceDc4XHhiOVx4OTJceGU2XHg4ZFx4NTBceGE0XHg4MFx4Y2JceDUyIgotICAgICAgIlx4MzNceDg5XHg1Y1x4NzRceDk1XHg4ZFx4NWRceDAyXHhhYlx4OGNceDBmXHhkMFx4NDBceGViXHg1OFx4NDQiCi0gICAgICAiXHhiMFx4MDVceGMzXHg5ZVx4ZDhceDI3XHg0YVx4OWRceGJmXHhhOFx4MDZceDcxXHg0MFx4OTRceDM5XHhkMiI7Ci0KLSAgU2V0S2V5OwotfQotCi1zdGF0aWMgaW50IGtleTIoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpIHsKLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KLSAgICAgICJceDAwXHhBM1x4MDdceDlBXHg5MFx4REZceDBEXHhGRFx4NzJceEFDXHgwOVx4MENceENDXHgyQVx4NzhceEI4IgotICAgICAgIlx4NzRceDEzXHgxM1x4M0VceDQwXHg3NVx4OUNceDk4XHhGQVx4RjhceDIwXHg0Rlx4MzVceDhBXHgwQlx4MjYiCi0gICAgICAiXHgzQ1x4NjdceDcwXHhFN1x4ODNceEE5XHgzQlx4NjlceDcxXHhCN1x4MzdceDc5XHhEMlx4NzFceDdCXHhFOCIKLSAgICAgICJceDM0XHg3N1x4Q0YiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDMiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRbXSA9Ci0gICAgICAiXHg2Q1x4QUZceEJDXHg2MFx4OTRceEIzXHhGRVx4NENceDcyXHhCMFx4QjNceDMyXHhDNlx4RkJceDI1XHhBMiIKLSAgICAgICJceEI3XHg2Mlx4MjlceDgwXHg0RVx4NjhceDY1XHhGQ1x4QTRceDVBXHg3NFx4REZceDBGXHg4Rlx4QjhceDQxIgotICAgICAgIlx4M0JceDUyXHhDMFx4RDBceEU1XHgzRFx4OUJceDU5XHgwRlx4RjFceDlCXHhFN1x4OUZceDQ5XHhERFx4MjEiCi0gICAgICAiXHhFNVx4RUIiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9Ci0gICAgICAiXHgwMFx4Q0ZceDIwXHgzNVx4MDJceDhCXHg5RFx4ODZceDk4XHg0MFx4QjRceDE2XHg2Nlx4QjRceDJFXHg5MiIKLSAgICAgICJceEVBXHgwRFx4QTNceEI0XHgzMlx4MDRceEI1XHhDRlx4Q0VceDkxIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBxW10gPQotICAgICAgIlx4MDBceEM5XHg3Rlx4QjFceEYwXHgyN1x4RjRceDUzXHhGNlx4MzRceDEyXHgzM1x4RUFceEFBXHhEMVx4RDkiCi0gICAgICAiXHgzNVx4M0ZceDZDXHg0Mlx4RDBceDg4XHg2Nlx4QjFceEQwXHg1RiI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1wMVtdID0KLSAgICAgICJceDAwXHg4QVx4MTVceDc4XHhBQ1x4NURceDEzXHhBRlx4MTBceDJCXHgyMlx4QjlceDk5XHhDRFx4NzRceDYxIgotICAgICAgIlx4RjFceDVFXHg2RFx4MjJceENDXHgwM1x4MjNceERGXHhERlx4MEIiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcTFbXSA9Ci0gICAgICAiXHgwMFx4ODZceDU1XHgyMVx4NEFceEM1XHg0RFx4OERceDRFXHhDRFx4NjFceDc3XHhGMVx4QzdceDM2XHg5MCIKLSAgICAgICJceENFXHgyQVx4NDhceDJDXHg4Qlx4MDVceDk5XHhDQlx4RTBceDNGIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQotICAgICAgIlx4MDBceDgzXHhFRlx4RUZceEI4XHhBOVx4QTRceDBEXHgxRFx4QjZceEVEXHg5OFx4QURceDg0XHhFRFx4MTMiCi0gICAgICAiXHgzNVx4RENceEMxXHgwOFx4RjNceDIyXHhEMFx4NTdceENGXHg4RCI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9Ci0gICAgICAiXHgxNFx4YmRceGRkXHgyOFx4YzlceDgzXHgzNVx4MTlceDIzXHg4MFx4ZThceGU1XHg0OVx4YjFceDU4XHgyYSIKLSAgICAgICJceDhiXHg0MFx4YjRceDQ4XHg2ZFx4MDNceGE2XHhhNVx4MzFceDFmXHgxZlx4ZDVceGYwXHhhMVx4ODBceGU0IgotICAgICAgIlx4MTdceDUzXHgwM1x4MjlceGE5XHgzNFx4OTBceDc0XHhiMVx4NTJceDEzXHg1NFx4MjlceDA4XHgyNFx4NTIiCi0gICAgICAiXHg2Mlx4NTEiOwotCi0gIFNldEtleTsKLX0KLQotc3RhdGljIGludCBrZXkzKFJTQSAqa2V5LCB1bnNpZ25lZCBjaGFyICpjKSB7Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5bXSA9Ci0gICAgICAiXHgwMFx4QkJceEY4XHgyRlx4MDlceDA2XHg4Mlx4Q0VceDlDXHgyM1x4MzhceEFDXHgyQlx4OURceEE4XHg3MSIKLSAgICAgICJceEY3XHgzNlx4OERceDA3XHhFRVx4RDRceDEwXHg0M1x4QTRceDQwXHhENlx4QjZceEYwXHg3NFx4NTRceEY1IgotICAgICAgIlx4MUZceEI4XHhERlx4QkFceEFGXHgwM1x4NUNceDAyXHhBQlx4NjFceEVBXHg0OFx4Q0VceEVCXHg2Rlx4Q0QiCi0gICAgICAiXHg0OFx4NzZceEVEXHg1Mlx4MERceDYwXHhFMVx4RUNceDQ2XHgxOVx4NzFceDlEXHg4QVx4NUJceDhCXHg4MCIKLSAgICAgICJceDdGXHhBRlx4QjhceEUwXHhBM1x4REZceEM3XHgzN1x4NzJceDNFXHhFNlx4QjRceEI3XHhEOVx4M0FceDI1IgotICAgICAgIlx4ODRceEVFXHg2QVx4NjRceDlEXHgwNlx4MDlceDUzXHg3NFx4ODhceDM0XHhCMlx4NDVceDQ1XHg5OFx4MzkiCi0gICAgICAiXHg0RVx4RTBceEFBXHhCMVx4MkRceDdCXHg2MVx4QTVceDFGXHg1Mlx4N0FceDlBXHg0MVx4RjZceEMxXHg2OCIKLSAgICAgICJceDdGXHhFMlx4NTNceDcyXHg5OFx4Q0FceDJBXHg4Rlx4NTlceDQ2XHhGOFx4RTVceEZEXHgwOVx4MURceEJEIgotICAgICAgIlx4Q0IiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGVbXSA9ICJceDExIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQotICAgICAgIlx4MDBceEE1XHhEQVx4RkNceDUzXHg0MVx4RkFceEYyXHg4OVx4QzRceEI5XHg4OFx4REJceDMwXHhDMVx4Q0QiCi0gICAgICAiXHhGOFx4M0ZceDMxXHgyNVx4MUVceDA2XHg2OFx4QjRceDI3XHg4NFx4ODFceDM4XHgwMVx4NTdceDk2XHg0MSIKLSAgICAgICJceEIyXHg5NFx4MTBceEIzXHhDN1x4OTlceDhEXHg2Qlx4QzRceDY1XHg3NFx4NUVceDVDXHgzOVx4MjZceDY5IgotICAgICAgIlx4RDZceDg3XHgwRFx4QTJceEMwXHg4Mlx4QTlceDM5XHhFM1x4N0ZceERDXHhCOFx4MkVceEM5XHgzRVx4REEiCi0gICAgICAiXHhDOVx4N0ZceEYzXHhBRFx4NTlceDUwXHhBQ1x4Q0ZceEJDXHgxMVx4MUNceDc2XHhGMVx4QTlceDUyXHg5NCIKLSAgICAgICJceDQ0XHhFNVx4NkFceEFGXHg2OFx4QzVceDZDXHgwOVx4MkNceEQzXHg4RFx4QzNceEJFXHhGNVx4RDJceDBBIgotICAgICAgIlx4OTNceDk5XHgyNlx4RURceDRGXHg3NFx4QTFceDNFXHhERFx4RkJceEUxXHhBMVx4Q0VceENDXHg0OFx4OTQiCi0gICAgICAiXHhBRlx4OTRceDI4XHhDMlx4QjdceEI4XHg4OFx4M0ZceEU0XHg0Nlx4M0FceDRCXHhDOFx4NUJceDFDXHhCMyIKLSAgICAgICJceEMxIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBwW10gPQotICAgICAgIlx4MDBceEVFXHhDRlx4QUVceDgxXHhCMVx4QjlceEIzXHhDOVx4MDhceDgxXHgwQlx4MTBceEExXHhCNVx4NjAiCi0gICAgICAiXHgwMVx4OTlceEVCXHg5Rlx4NDRceEFFXHhGNFx4RkRceEE0XHg5M1x4QjhceDFBXHg5RVx4M0RceDg0XHhGNiIKLSAgICAgICJceDMyXHgxMlx4NEVceEYwXHgyM1x4NkVceDVEXHgxRVx4M0JceDdFXHgyOFx4RkFceEU3XHhBQVx4MDRceDBBIgotICAgICAgIlx4MkRceDVCXHgyNVx4MjFceDc2XHg0NVx4OURceDFGXHgzOVx4NzVceDQxXHhCQVx4MkFceDU4XHhGQlx4NjUiCi0gICAgICAiXHg5OSI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgcVtdID0KLSAgICAgICJceDAwXHhDOVx4N0ZceEIxXHhGMFx4MjdceEY0XHg1M1x4RjZceDM0XHgxMlx4MzNceEVBXHhBQVx4RDFceEQ5IgotICAgICAgIlx4MzVceDNGXHg2Q1x4NDJceEQwXHg4OFx4NjZceEIxXHhEMFx4NUFceDBGXHgyMFx4MzVceDAyXHg4Qlx4OUQiCi0gICAgICAiXHg4Nlx4OThceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKLSAgICAgICJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDE1IgotICAgICAgIlx4MDMiOwotCi0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGRtcDFbXSA9Ci0gICAgICAiXHg1NFx4NDlceDRDXHhBNlx4M0VceEJBXHgwM1x4MzdceEU0XHhFMlx4NDBceDIzXHhGQ1x4RDZceDlBXHg1QSIKLSAgICAgICJceEVCXHgwN1x4RERceERDXHgwMVx4ODNceEE0XHhEMFx4QUNceDlCXHg1NFx4QjBceDUxXHhGMlx4QjFceDNFIgotICAgICAgIlx4RDlceDQ5XHgwOVx4NzVceEVBXHhCN1x4NzRceDE0XHhGRlx4NTlceEMxXHhGN1x4NjlceDJFXHg5QVx4MkUiCi0gICAgICAiXHgyMFx4MkJceDM4XHhGQ1x4OTFceDBBXHg0N1x4NDFceDc0XHhBRFx4QzlceDNDXHgxRlx4NjdceEM5XHg4MSI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1xMVtdID0KLSAgICAgICJceDQ3XHgxRVx4MDJceDkwXHhGRlx4MEFceEYwXHg3NVx4MDNceDUxXHhCN1x4RjhceDc4XHg4Nlx4NENceEE5IgotICAgICAgIlx4NjFceEFEXHhCRFx4M0FceDhBXHg3RVx4OTlceDFDXHg1Q1x4MDVceDU2XHhBOVx4NENceDMxXHg0Nlx4QTciCi0gICAgICAiXHhGOVx4ODBceDNGXHg4Rlx4NkZceDhBXHhFM1x4NDJceEU5XHgzMVx4RkRceDhBXHhFNFx4N0FceDIyXHgwRCIKLSAgICAgICJceDFCXHg5OVx4QTRceDk1XHg4NFx4OThceDA3XHhGRVx4MzlceEY5XHgyNFx4NUFceDk4XHgzNlx4REFceDNEIjsKLQotICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQotICAgICAgIlx4MDBceEIwXHg2Q1x4NEZceERBXHhCQlx4NjNceDAxXHgxOVx4OERceDI2XHg1Qlx4REJceEFFXHg5NFx4MjMiCi0gICAgICAiXHhCM1x4ODBceEYyXHg3MVx4RjdceDM0XHg1M1x4ODhceDUwXHg5M1x4MDdceDdGXHhDRFx4MzlceEUyXHgxMSIKLSAgICAgICJceDlGXHhDOVx4ODZceDMyXHgxNVx4NEZceDU4XHg4M1x4QjFceDY3XHhBOVx4NjdceEJGXHg0MFx4MkJceDRFIgotICAgICAgIlx4OUVceDJFXHgwRlx4OTZceDU2XHhFNlx4OThceEVBXHgzNlx4NjZceEVEXHhGQlx4MjVceDc5XHg4MFx4MzkiCi0gICAgICAiXHhGNyI7Ci0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgY3RleHRfZXhbXSA9Ci0gICAgICAiXHhiOFx4MjRceDZiXHg1Nlx4YTZceGVkXHg1OFx4ODFceGFlXHhiNVx4ODVceGQ5XHhhMlx4NWJceDJhXHhkNyIKLSAgICAgICJceDkwXHhjNFx4MTdceGUwXHg4MFx4NjhceDFiXHhmMVx4YWNceDJiXHhjM1x4ZGVceGI2XHg5ZFx4OGJceGNlIgotICAgICAgIlx4ZjBceGM0XHgzNlx4NmZceGVjXHg0MFx4MGFceGYwXHg1Mlx4YTdceDJlXHg5Ylx4MGVceGZmXHhiNVx4YjMiCi0gICAgICAiXHhmMlx4ZjFceDkyXHhkYlx4ZWFceGNhXHgwM1x4YzFceDI3XHg0MFx4MDVceDcxXHgxM1x4YmZceDFmXHgwNiIKLSAgICAgICJceDY5XHhhY1x4MjJceGU5XHhmM1x4YTdceDg1XHgyZVx4M2NceDE1XHhkOVx4MTNceGNhXHhiMFx4YjhceDg2IgotICAgICAgIlx4M2FceDk1XHhjOVx4OTJceDk0XHhjZVx4ODZceDc0XHgyMVx4NDlceDU0XHg2MVx4MDNceDQ2XHhmNFx4ZDQiCi0gICAgICAiXHg3NFx4YjJceDZmXHg3Y1x4NDhceGI0XHgyZVx4ZTZceDhlXHgxZlx4NTdceDJhXHgxZlx4YzRceDAyXHg2YSIKLSAgICAgICJceGM0XHg1Nlx4YjRceGY1XHg5Zlx4N2JceDYyXHgxZVx4YTFceGI5XHhkOFx4OGZceDY0XHgyMFx4MmZceGIxIjsKLQotICBTZXRLZXk7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9iYWRfa2V5KHZvaWQpIHsKLSAgUlNBICprZXkgPSBSU0FfbmV3KCk7Ci0gIEJJR05VTSBlOwotCi0gIEJOX2luaXQoJmUpOwotICBCTl9zZXRfd29yZCgmZSwgUlNBX0Y0KTsKLQotICBpZiAoIVJTQV9nZW5lcmF0ZV9rZXlfZXgoa2V5LCA1MTIsICZlLCBOVUxMKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2dlbmVyYXRlX2tleV9leCBmYWlsZWQuXG4iKTsKLSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoIUJOX2FkZChrZXktPnAsIGtleS0+cCwgQk5fdmFsdWVfb25lKCkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJCTiBlcnJvci5cbiIpOwotICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChSU0FfY2hlY2tfa2V5KGtleSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgcGFzc2VkIHdpdGggaW52YWxpZCBrZXkhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEVSUl9jbGVhcl9lcnJvcigpOwotICBCTl9mcmVlKCZlKTsKLSAgUlNBX2ZyZWUoa2V5KTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9vbmx5X2RfZ2l2ZW4odm9pZCkgewotICBSU0EgKmtleSA9IFJTQV9uZXcoKTsKLSAgdWludDhfdCBidWZbNjRdOwotICB1bnNpZ25lZCBidWZfbGVuID0gc2l6ZW9mKGJ1Zik7Ci0gIGNvbnN0IHVpbnQ4X3Qga0R1bW15SGFzaFsxNl0gPSB7MH07Ci0gIGludCByZXQgPSAwOwotCi0gIGlmICghQk5faGV4MmJuKCZrZXktPm4sCi0gICAgICAgICAgICAgICAgICIwMGU3N2JiZjM4ODlkNGVmMzZhOWEyNWQ0ZDY5ZjNmNjMyZWI0MzYyMjE0Yzc0NTE3ZGE2ZDZhZWFhOWJkIgotICAgICAgICAgICAgICAgICAiMDlhYzQyYjI2NjIxY2Q4OGYzYTZlYjAxMzc3MmZjM2JmOWY4MzkxNGI2NDY3MjMxYzYzMDIwMmMzNWIzZSIKLSAgICAgICAgICAgICAgICAgIjU4MDhjNjU5IikgfHwKLSAgICAgICFCTl9oZXgyYm4oJmtleS0+ZSwgIjAxMDAwMSIpIHx8Ci0gICAgICAhQk5faGV4MmJuKCZrZXktPmQsCi0gICAgICAgICAgICAgICAgICIwMzY1ZGI5ZWI2ZDczYjUzYjAxNWM0MGNkOGRiNGRlN2RkNzAzNWM2OGI1YWMxYmY3ODZkN2E0ZWUyY2VhIgotICAgICAgICAgICAgICAgICAiMzE2ZWFlY2EyMWE3M2FjMzY1ZTU4NzEzMTk1ZjJhZTk4NDkzNDg1MjVjYTg1NTM4NmI2ZDAyOGU0MzdhOSIKLSAgICAgICAgICAgICAgICAgIjQ5NWEwMSIpIHx8Ci0gICAgICBSU0Ffc2l6ZShrZXkpID4gc2l6ZW9mKGJ1ZikpIHsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmICghUlNBX2NoZWNrX2tleShrZXkpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOwotICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAotICAgICAgICAgICAgICAgIGtleSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9zaWduIGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOwotICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICBnb3RvIGVycjsKLSAgfQotCi0gIGlmICghUlNBX3ZlcmlmeShOSURfc2hhMjU2LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICAgIGtleSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV92ZXJpZnkgZmFpbGVkIHdpdGggb25seSBkIGdpdmVuLlxuIik7Ci0gICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgcmV0ID0gMTsKLQotZXJyOgotICBSU0FfZnJlZShrZXkpOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRlc3RfcmVjb3Zlcl9jcnRfcGFyYW1zKHZvaWQpIHsKLSAgUlNBICprZXkxLCAqa2V5MjsKLSAgQklHTlVNICplID0gQk5fbmV3KCk7Ci0gIHVpbnQ4X3QgYnVmWzEyOF07Ci0gIHVuc2lnbmVkIGJ1Zl9sZW4gPSBzaXplb2YoYnVmKTsKLSAgY29uc3QgdWludDhfdCBrRHVtbXlIYXNoWzE2XSA9IHswfTsKLSAgdW5zaWduZWQgaTsKLQotICBCTl9zZXRfd29yZChlLCBSU0FfRjQpOwotCi0gIEVSUl9jbGVhcl9lcnJvcigpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKLSAgICBrZXkxID0gUlNBX25ldygpOwotICAgIGlmICghUlNBX2dlbmVyYXRlX2tleV9leChrZXkxLCA1MTIsIGUsIE5VTEwpKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9nZW5lcmF0ZV9rZXlfZXggZmFpbGVkLlxuIik7Ci0gICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIVJTQV9jaGVja19rZXkoa2V5MSkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2NoZWNrX2tleSBmYWlsZWQgd2l0aCBvcmlnaW5hbCBrZXkuXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGtleTIgPSBSU0FfbmV3KCk7Ci0gICAga2V5Mi0+biA9IEJOX2R1cChrZXkxLT5uKTsKLSAgICBrZXkyLT5lID0gQk5fZHVwKGtleTEtPmUpOwotICAgIGtleTItPmQgPSBCTl9kdXAoa2V5MS0+ZCk7Ci0gICAgUlNBX2ZyZWUoa2V5MSk7Ci0KLSAgICBpZiAoIVJTQV9yZWNvdmVyX2NydF9wYXJhbXMoa2V5MikpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3JlY292ZXJfY3J0X3BhcmFtcyBmYWlsZWQuXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChSU0Ffc2l6ZShrZXkyKSA+IGJ1Zl9sZW4pIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghUlNBX2NoZWNrX2tleShrZXkyKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAotICAgICAgICAgICAgICAgICAga2V5MikpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3NpZ24gZmFpbGVkIHdpdGggcmVjb3ZlcmVkIGtleS5cbiIpOwotICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCFSU0FfdmVyaWZ5KE5JRF9zaGEyNTYsIGtEdW1teUhhc2gsIHNpemVvZihrRHVtbXlIYXNoKSwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgICAgICBrZXkyKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfdmVyaWZ5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKLSAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIFJTQV9mcmVlKGtleTIpOwotICB9Ci0KLSAgQk5fZnJlZShlKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaW50IGVyciA9IDA7Ci0gIGludCB2OwotICBSU0EgKmtleTsKLSAgdW5zaWduZWQgY2hhciBwdGV4dFsyNTZdOwotICB1bnNpZ25lZCBjaGFyIGN0ZXh0WzI1Nl07Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHB0ZXh0X2V4W10gPSAiXHg1NFx4ODVceDliXHgzNFx4MmNceDQ5XHhlYVx4MmEiOwotICB1bnNpZ25lZCBjaGFyIGN0ZXh0X2V4WzI1Nl07Ci0gIGludCBwbGVuOwotICBpbnQgY2xlbiA9IDA7Ci0gIGludCBudW07Ci0gIGludCBuOwotCi0gIENSWVBUT19saWJyYXJ5X2luaXQoKTsKLQotICBwbGVuID0gc2l6ZW9mKHB0ZXh0X2V4KSAtIDE7Ci0KLSAgZm9yICh2ID0gMDsgdiA8IDM7IHYrKykgewotICAgIGtleSA9IFJTQV9uZXcoKTsKLSAgICBzd2l0Y2ggKHYpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgY2xlbiA9IGtleTEoa2V5LCBjdGV4dF9leCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBjbGVuID0ga2V5MihrZXksIGN0ZXh0X2V4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIGNsZW4gPSBrZXkzKGtleSwgY3RleHRfZXgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgfQotCi0gICAgaWYgKCFSU0FfY2hlY2tfa2V5KGtleSkpIHsKLSAgICAgIHByaW50ZigiJWQ6IFJTQV9jaGVja19rZXkgZmFpbGVkXG4iLCB2KTsKLSAgICAgIGVyciA9IDE7Ci0gICAgICBnb3RvIG9hZXA7Ci0gICAgfQotCi0gICAgbnVtID0gUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfUEFERElORyk7Ci0gICAgaWYgKG51bSAhPSBjbGVuKSB7Ci0gICAgICBwcmludGYoIlBLQ1MjMSB2MS41IGVuY3J5cHRpb24gZmFpbGVkIVxuIik7Ci0gICAgICBlcnIgPSAxOwotICAgICAgZ290byBvYWVwOwotICAgIH0KLQotICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX1BBRERJTkcpOwotICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKLSAgICAgIHByaW50ZigiUEtDUyMxIHYxLjUgZGVjcnlwdGlvbiBmYWlsZWQhXG4iKTsKLSAgICAgIGVyciA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiUEtDUyAjMSB2MS41IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBva1xuIik7Ci0gICAgfQotCi0gIG9hZXA6Ci0gICAgRVJSX2NsZWFyX2Vycm9yKCk7Ci0gICAgbnVtID0KLSAgICAgICAgUlNBX3B1YmxpY19lbmNyeXB0KHBsZW4sIHB0ZXh0X2V4LCBjdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKLSAgICBpZiAobnVtID09IC0xKSB7Ci0gICAgICBwcmludGYoIk5vIE9BRVAgc3VwcG9ydFxuIik7Ci0gICAgICBnb3RvIG5leHQ7Ci0gICAgfQotICAgIGlmIChudW0gIT0gY2xlbikgewotICAgICAgcHJpbnRmKCJPQUVQIGVuY3J5cHRpb24gZmFpbGVkIVxuIik7Ci0gICAgICBlcnIgPSAxOwotICAgICAgZ290byBuZXh0OwotICAgIH0KLQotICAgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7Ci0gICAgaWYgKG51bSAhPSBwbGVuIHx8IG1lbWNtcChwdGV4dCwgcHRleHRfZXgsIG51bSkgIT0gMCkgewotICAgICAgcHJpbnRmKCJPQUVQIGRlY3J5cHRpb24gKGVuY3J5cHRlZCBkYXRhKSBmYWlsZWQhXG4iKTsKLSAgICAgIGVyciA9IDE7Ci0gICAgfSBlbHNlIGlmIChtZW1jbXAoY3RleHQsIGN0ZXh0X2V4LCBudW0pID09IDApIHsKLSAgICAgIHByaW50ZigiT0FFUCB0ZXN0IHZlY3RvciAlZCBwYXNzZWQhXG4iLCB2KTsKLSAgICB9Ci0KLSAgICAvKiBEaWZmZXJlbnQgY2lwaGVydGV4dHMgKHJzYV9vYWVwLmMgd2l0aG91dCAtRFBLQ1NfVEVTVFZFQ1QpLgotICAgICAgIFRyeSBkZWNyeXB0aW5nIGN0ZXh0X2V4ICovCi0KLSAgICBudW0gPQotICAgICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0KGNsZW4sIGN0ZXh0X2V4LCBwdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKLQotICAgIGlmIChudW0gIT0gcGxlbiB8fCBtZW1jbXAocHRleHQsIHB0ZXh0X2V4LCBudW0pICE9IDApIHsKLSAgICAgIHByaW50ZigiT0FFUCBkZWNyeXB0aW9uICh0ZXN0IHZlY3RvciBkYXRhKSBmYWlsZWQhXG4iKTsKLSAgICAgIGVyciA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZigiT0FFUCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gb2tcbiIpOwotICAgIH0KLQotICAgIC8qIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cyAqLwotICAgIGZvciAobiA9IDA7IG4gPCBjbGVuOyArK24pIHsKLSAgICAgIGludCBiOwotICAgICAgdW5zaWduZWQgY2hhciBzYXZlZCA9IGN0ZXh0W25dOwotICAgICAgZm9yIChiID0gMDsgYiA8IDI1NjsgKytiKSB7Ci0gICAgICAgIGlmIChiID09IHNhdmVkKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY3RleHRbbl0gPSBiOwotICAgICAgICBudW0gPQotICAgICAgICAgICAgUlNBX3ByaXZhdGVfZGVjcnlwdChudW0sIGN0ZXh0LCBwdGV4dCwga2V5LCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICBwcmludGYoIkNvcnJ1cHQgZGF0YSBkZWNyeXB0ZWQhXG4iKTsKLSAgICAgICAgICBlcnIgPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIG5leHQ6Ci0gICAgUlNBX2ZyZWUoa2V5KTsKLSAgfQotCi0gIGlmIChlcnIgIT0gMCB8fAotICAgICAgIXRlc3Rfb25seV9kX2dpdmVuKCkgfHwKLSAgICAgICF0ZXN0X3JlY292ZXJfY3J0X3BhcmFtcygpIHx8Ci0gICAgICAhdGVzdF9iYWRfa2V5KCkpIHsKLSAgICBlcnIgPSAxOwotICB9Ci0KLSAgaWYgKGVyciA9PSAwKSB7Ci0gICAgcHJpbnRmKCJQQVNTXG4iKTsKLSAgfQotICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9yc2EvcnNhX3Rlc3QuY2MgYi9zcmMvY3J5cHRvL3JzYS9yc2FfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJiNzhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NyeXB0by9yc2EvcnNhX3Rlc3QuY2MKQEAgLTAsMCArMSw4NjkgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbQorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ieXRlc3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqLmg+CisKKyNpbmNsdWRlICIuLi90ZXN0L3Njb3BlZF90eXBlcy5oIgorCisKKy8vIGtQbGFpbnRleHQgaXMgYSBzYW1wbGUgcGxhaW50ZXh0Lgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1BsYWludGV4dFtdID0gIlx4NTRceDg1XHg5Ylx4MzRceDJjXHg0OVx4ZWFceDJhIjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1BsYWludGV4dExlbiA9IHNpemVvZihrUGxhaW50ZXh0KSAtIDE7CisKKy8vIGtLZXkxIGlzIGEgREVSLWVuY29kZWQgUlNBUHJpdmF0ZUtleS4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtLZXkxW10gPQorICAgICJceDMwXHg4Mlx4MDFceDM4XHgwMlx4MDFceDAwXHgwMlx4NDFceDAwXHhhYVx4MzZceGFiXHhjZVx4ODhceGFjXHhmZFx4ZmYiCisgICAgIlx4NTVceDUyXHgzY1x4N2ZceGM0XHg1Mlx4M2ZceDkwXHhlZlx4YTBceDBkXHhmM1x4NzdceDRhXHgyNVx4OWZceDJlXHg2MiIKKyAgICAiXHhiNFx4YzVceGQ5XHg5Y1x4YjVceGFkXHhiM1x4MDBceGEwXHgyOFx4NWVceDUzXHgwMVx4OTNceDBlXHgwY1x4NzBceGZiIgorICAgICJceDY4XHg3Nlx4OTNceDljXHhlNlx4MTZceGNlXHg2Mlx4NGFceDExXHhlMFx4MDhceDZkXHgzNFx4MWVceGJjXHhhY1x4YTAiCisgICAgIlx4YTFceGY1XHgwMlx4MDFceDExXHgwMlx4NDBceDBhXHgwM1x4MzdceDQ4XHg2Mlx4NjRceDg3XHg2OVx4NWZceDVmXHgzMCIKKyAgICAiXHhiY1x4MzhceGI5XHg4Ylx4NDRceGMyXHhjZFx4MmRceGZmXHg0M1x4NDBceDk4XHhjZFx4MjBceGQ4XHhhMVx4MzhceGQwIgorICAgICJceDkwXHhiZlx4NjRceDc5XHg3Y1x4M2ZceGE3XHhhMlx4Y2RceGNiXHgzY1x4ZDFceGUwXHhiZFx4YmFceDI2XHg1NFx4YjQiCisgICAgIlx4ZjlceGRmXHg4ZVx4OGFceGU1XHg5ZFx4NzNceDNkXHg5Zlx4MzNceGIzXHgwMVx4NjJceDRhXHhmZFx4MWRceDUxXHgwMiIKKyAgICAiXHgyMVx4MDBceGQ4XHg0MFx4YjRceDE2XHg2Nlx4YjRceDJlXHg5Mlx4ZWFceDBkXHhhM1x4YjRceDMyXHgwNFx4YjVceGNmIgorICAgICJceGNlXHgzM1x4NTJceDUyXHg0ZFx4MDRceDE2XHhhNVx4YTRceDQxXHhlN1x4MDBceGFmXHg0Nlx4MTJceDBkXHgwMlx4MjEiCisgICAgIlx4MDBceGM5XHg3Zlx4YjFceGYwXHgyN1x4ZjRceDUzXHhmNlx4MzRceDEyXHgzM1x4ZWFceGFhXHhkMVx4ZDlceDM1XHgzZiIKKyAgICAiXHg2Y1x4NDJceGQwXHg4OFx4NjZceGIxXHhkMFx4NWFceDBmXHgyMFx4MzVceDAyXHg4Ylx4OWRceDg5XHgwMlx4MjBceDU5IgorICAgICJceDBiXHg5NVx4NzJceGEyXHhjMlx4YTlceGM0XHgwNlx4MDVceDlkXHhjMlx4YWJceDJmXHgxZFx4YWZceGViXHg3ZVx4OGIiCisgICAgIlx4NGZceDEwXHhhN1x4NTRceDllXHg4ZVx4ZWRceGY1XHhiNFx4ZmNceGUwXHg5ZVx4MDVceDAyXHgyMVx4MDBceDhlXHgzYyIKKyAgICAiXHgwNVx4MjFceGZlXHgxNVx4ZTBceGVhXHgwNlx4YTNceDZmXHhmMFx4ZjFceDBjXHg5OVx4NTJceGMzXHg1Ylx4N2FceDc1IgorICAgICJceDE0XHhmZFx4MzJceDM4XHhiOFx4MGFceGFkXHg1Mlx4OThceDYyXHg4ZFx4NTFceDAyXHgyMFx4MzZceDNmXHhmN1x4MTgiCisgICAgIlx4OWRceGE4XHhlOVx4MGJceDFkXHgzNFx4MWZceDcxXHhkMFx4OWJceDc2XHhhOFx4YTlceDQzXHhlMVx4MWRceDEwXHhiMiIKKyAgICAiXHg0ZFx4MjRceDlmXHgyZFx4ZWFceGZlXHhmOFx4MGNceDE4XHgyNiI7CisKKy8vIGtPQUVQQ2lwaGVydGV4dDEgaXMgYSBzYW1wbGUgZW5jcnlwdGlvbiBvZiB8a1BsYWludGV4dHwgd2l0aCB8a0tleTF8IHVzaW5nCisvLyBSU0EgT0FFUC4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtPQUVQQ2lwaGVydGV4dDFbXSA9CisgICAgIlx4MWJceDhmXHgwNVx4ZjlceGNhXHgxYVx4NzlceDUyXHg2ZVx4NTNceGYzXHhjY1x4NTFceDRmXHhkYlx4ODlceDJiXHhmYiIKKyAgICAiXHg5MVx4OTNceDIzXHgxZVx4NzhceGI5XHg5Mlx4ZTZceDhkXHg1MFx4YTRceDgwXHhjYlx4NTJceDMzXHg4OVx4NWNceDc0IgorICAgICJceDk1XHg4ZFx4NWRceDAyXHhhYlx4OGNceDBmXHhkMFx4NDBceGViXHg1OFx4NDRceGIwXHgwNVx4YzNceDllXHhkOFx4MjciCisgICAgIlx4NGFceDlkXHhiZlx4YThceDA2XHg3MVx4NDBceDk0XHgzOVx4ZDIiOworCisvLyBrS2V5MiBpcyBhIERFUi1lbmNvZGVkIFJTQVByaXZhdGVLZXkuCitzdGF0aWMgY29uc3QgdWludDhfdCBrS2V5MltdID0KKyAgICAiXHgzMFx4ODFceGZiXHgwMlx4MDFceDAwXHgwMlx4MzNceDAwXHhhM1x4MDdceDlhXHg5MFx4ZGZceDBkXHhmZFx4NzJceGFjIgorICAgICJceDA5XHgwY1x4Y2NceDJhXHg3OFx4YjhceDc0XHgxM1x4MTNceDNlXHg0MFx4NzVceDljXHg5OFx4ZmFceGY4XHgyMFx4NGYiCisgICAgIlx4MzVceDhhXHgwYlx4MjZceDNjXHg2N1x4NzBceGU3XHg4M1x4YTlceDNiXHg2OVx4NzFceGI3XHgzN1x4NzlceGQyXHg3MSIKKyAgICAiXHg3Ylx4ZThceDM0XHg3N1x4Y2ZceDAyXHgwMVx4MDNceDAyXHgzMlx4NmNceGFmXHhiY1x4NjBceDk0XHhiM1x4ZmVceDRjIgorICAgICJceDcyXHhiMFx4YjNceDMyXHhjNlx4ZmJceDI1XHhhMlx4YjdceDYyXHgyOVx4ODBceDRlXHg2OFx4NjVceGZjXHhhNFx4NWEiCisgICAgIlx4NzRceGRmXHgwZlx4OGZceGI4XHg0MVx4M2JceDUyXHhjMFx4ZDBceGU1XHgzZFx4OWJceDU5XHgwZlx4ZjFceDliXHhlNyIKKyAgICAiXHg5Zlx4NDlceGRkXHgyMVx4ZTVceGViXHgwMlx4MWFceDAwXHhjZlx4MjBceDM1XHgwMlx4OGJceDlkXHg4Nlx4OThceDQwIgorICAgICJceGI0XHgxNlx4NjZceGI0XHgyZVx4OTJceGVhXHgwZFx4YTNceGI0XHgzMlx4MDRceGI1XHhjZlx4Y2VceDkxXHgwMlx4MWEiCisgICAgIlx4MDBceGM5XHg3Zlx4YjFceGYwXHgyN1x4ZjRceDUzXHhmNlx4MzRceDEyXHgzM1x4ZWFceGFhXHhkMVx4ZDlceDM1XHgzZiIKKyAgICAiXHg2Y1x4NDJceGQwXHg4OFx4NjZceGIxXHhkMFx4NWZceDAyXHgxYVx4MDBceDhhXHgxNVx4NzhceGFjXHg1ZFx4MTNceGFmIgorICAgICJceDEwXHgyYlx4MjJceGI5XHg5OVx4Y2RceDc0XHg2MVx4ZjFceDVlXHg2ZFx4MjJceGNjXHgwM1x4MjNceGRmXHhkZlx4MGIiCisgICAgIlx4MDJceDFhXHgwMFx4ODZceDU1XHgyMVx4NGFceGM1XHg0ZFx4OGRceDRlXHhjZFx4NjFceDc3XHhmMVx4YzdceDM2XHg5MCIKKyAgICAiXHhjZVx4MmFceDQ4XHgyY1x4OGJceDA1XHg5OVx4Y2JceGUwXHgzZlx4MDJceDFhXHgwMFx4ODNceGVmXHhlZlx4YjhceGE5IgorICAgICJceGE0XHgwZFx4MWRceGI2XHhlZFx4OThceGFkXHg4NFx4ZWRceDEzXHgzNVx4ZGNceGMxXHgwOFx4ZjNceDIyXHhkMFx4NTciCisgICAgIlx4Y2ZceDhkIjsKKworLy8ga09BRVBDaXBoZXJ0ZXh0MiBpcyBhIHNhbXBsZSBlbmNyeXB0aW9uIG9mIHxrUGxhaW50ZXh0fCB3aXRoIHxrS2V5MnwgdXNpbmcKKy8vIFJTQSBPQUVQLgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga09BRVBDaXBoZXJ0ZXh0MltdID0KKyAgICAiXHgxNFx4YmRceGRkXHgyOFx4YzlceDgzXHgzNVx4MTlceDIzXHg4MFx4ZThceGU1XHg0OVx4YjFceDU4XHgyYVx4OGJceDQwIgorICAgICJceGI0XHg0OFx4NmRceDAzXHhhNlx4YTVceDMxXHgxZlx4MWZceGQ1XHhmMFx4YTFceDgwXHhlNFx4MTdceDUzXHgwM1x4MjkiCisgICAgIlx4YTlceDM0XHg5MFx4NzRceGIxXHg1Mlx4MTNceDU0XHgyOVx4MDhceDI0XHg1Mlx4NjJceDUxIjsKKworLy8ga0tleTMgaXMgYSBERVItZW5jb2RlZCBSU0FQcml2YXRlS2V5Lgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0tleTNbXSA9CisgICAgIlx4MzBceDgyXHgwMlx4NWJceDAyXHgwMVx4MDBceDAyXHg4MVx4ODFceDAwXHhiYlx4ZjhceDJmXHgwOVx4MDZceDgyXHhjZSIKKyAgICAiXHg5Y1x4MjNceDM4XHhhY1x4MmJceDlkXHhhOFx4NzFceGY3XHgzNlx4OGRceDA3XHhlZVx4ZDRceDEwXHg0M1x4YTRceDQwIgorICAgICJceGQ2XHhiNlx4ZjBceDc0XHg1NFx4ZjVceDFmXHhiOFx4ZGZceGJhXHhhZlx4MDNceDVjXHgwMlx4YWJceDYxXHhlYVx4NDgiCisgICAgIlx4Y2VceGViXHg2Zlx4Y2RceDQ4XHg3Nlx4ZWRceDUyXHgwZFx4NjBceGUxXHhlY1x4NDZceDE5XHg3MVx4OWRceDhhXHg1YiIKKyAgICAiXHg4Ylx4ODBceDdmXHhhZlx4YjhceGUwXHhhM1x4ZGZceGM3XHgzN1x4NzJceDNlXHhlNlx4YjRceGI3XHhkOVx4M2FceDI1IgorICAgICJceDg0XHhlZVx4NmFceDY0XHg5ZFx4MDZceDA5XHg1M1x4NzRceDg4XHgzNFx4YjJceDQ1XHg0NVx4OThceDM5XHg0ZVx4ZTAiCisgICAgIlx4YWFceGIxXHgyZFx4N2JceDYxXHhhNVx4MWZceDUyXHg3YVx4OWFceDQxXHhmNlx4YzFceDY4XHg3Zlx4ZTJceDUzXHg3MiIKKyAgICAiXHg5OFx4Y2FceDJhXHg4Zlx4NTlceDQ2XHhmOFx4ZTVceGZkXHgwOVx4MWRceGJkXHhjYlx4MDJceDAxXHgxMVx4MDJceDgxIgorICAgICJceDgxXHgwMFx4YTVceGRhXHhmY1x4NTNceDQxXHhmYVx4ZjJceDg5XHhjNFx4YjlceDg4XHhkYlx4MzBceGMxXHhjZFx4ZjgiCisgICAgIlx4M2ZceDMxXHgyNVx4MWVceDA2XHg2OFx4YjRceDI3XHg4NFx4ODFceDM4XHgwMVx4NTdceDk2XHg0MVx4YjJceDk0XHgxMCIKKyAgICAiXHhiM1x4YzdceDk5XHg4ZFx4NmJceGM0XHg2NVx4NzRceDVlXHg1Y1x4MzlceDI2XHg2OVx4ZDZceDg3XHgwZFx4YTJceGMwIgorICAgICJceDgyXHhhOVx4MzlceGUzXHg3Zlx4ZGNceGI4XHgyZVx4YzlceDNlXHhkYVx4YzlceDdmXHhmM1x4YWRceDU5XHg1MFx4YWMiCisgICAgIlx4Y2ZceGJjXHgxMVx4MWNceDc2XHhmMVx4YTlceDUyXHg5NFx4NDRceGU1XHg2YVx4YWZceDY4XHhjNVx4NmNceDA5XHgyYyIKKyAgICAiXHhkM1x4OGRceGMzXHhiZVx4ZjVceGQyXHgwYVx4OTNceDk5XHgyNlx4ZWRceDRmXHg3NFx4YTFceDNlXHhkZFx4ZmJceGUxIgorICAgICJceGExXHhjZVx4Y2NceDQ4XHg5NFx4YWZceDk0XHgyOFx4YzJceGI3XHhiOFx4ODhceDNmXHhlNFx4NDZceDNhXHg0Ylx4YzgiCisgICAgIlx4NWJceDFjXHhiM1x4YzFceDAyXHg0MVx4MDBceGVlXHhjZlx4YWVceDgxXHhiMVx4YjlceGIzXHhjOVx4MDhceDgxXHgwYiIKKyAgICAiXHgxMFx4YTFceGI1XHg2MFx4MDFceDk5XHhlYlx4OWZceDQ0XHhhZVx4ZjRceGZkXHhhNFx4OTNceGI4XHgxYVx4OWVceDNkIgorICAgICJceDg0XHhmNlx4MzJceDEyXHg0ZVx4ZjBceDIzXHg2ZVx4NWRceDFlXHgzYlx4N2VceDI4XHhmYVx4ZTdceGFhXHgwNFx4MGEiCisgICAgIlx4MmRceDViXHgyNVx4MjFceDc2XHg0NVx4OWRceDFmXHgzOVx4NzVceDQxXHhiYVx4MmFceDU4XHhmYlx4NjVceDk5XHgwMiIKKyAgICAiXHg0MVx4MDBceGM5XHg3Zlx4YjFceGYwXHgyN1x4ZjRceDUzXHhmNlx4MzRceDEyXHgzM1x4ZWFceGFhXHhkMVx4ZDlceDM1IgorICAgICJceDNmXHg2Y1x4NDJceGQwXHg4OFx4NjZceGIxXHhkMFx4NWFceDBmXHgyMFx4MzVceDAyXHg4Ylx4OWRceDg2XHg5OFx4NDAiCisgICAgIlx4YjRceDE2XHg2Nlx4YjRceDJlXHg5Mlx4ZWFceDBkXHhhM1x4YjRceDMyXHgwNFx4YjVceGNmXHhjZVx4MzNceDUyXHg1MiIKKyAgICAiXHg0ZFx4MDRceDE2XHhhNVx4YTRceDQxXHhlN1x4MDBceGFmXHg0Nlx4MTVceDAzXHgwMlx4NDBceDU0XHg0OVx4NGNceGE2IgorICAgICJceDNlXHhiYVx4MDNceDM3XHhlNFx4ZTJceDQwXHgyM1x4ZmNceGQ2XHg5YVx4NWFceGViXHgwN1x4ZGRceGRjXHgwMVx4ODMiCisgICAgIlx4YTRceGQwXHhhY1x4OWJceDU0XHhiMFx4NTFceGYyXHhiMVx4M2VceGQ5XHg0OVx4MDlceDc1XHhlYVx4YjdceDc0XHgxNCIKKyAgICAiXHhmZlx4NTlceGMxXHhmN1x4NjlceDJlXHg5YVx4MmVceDIwXHgyYlx4MzhceGZjXHg5MVx4MGFceDQ3XHg0MVx4NzRceGFkIgorICAgICJceGM5XHgzY1x4MWZceDY3XHhjOVx4ODFceDAyXHg0MFx4NDdceDFlXHgwMlx4OTBceGZmXHgwYVx4ZjBceDc1XHgwM1x4NTEiCisgICAgIlx4YjdceGY4XHg3OFx4ODZceDRjXHhhOVx4NjFceGFkXHhiZFx4M2FceDhhXHg3ZVx4OTlceDFjXHg1Y1x4MDVceDU2XHhhOSIKKyAgICAiXHg0Y1x4MzFceDQ2XHhhN1x4ZjlceDgwXHgzZlx4OGZceDZmXHg4YVx4ZTNceDQyXHhlOVx4MzFceGZkXHg4YVx4ZTRceDdhIgorICAgICJceDIyXHgwZFx4MWJceDk5XHhhNFx4OTVceDg0XHg5OFx4MDdceGZlXHgzOVx4ZjlceDI0XHg1YVx4OThceDM2XHhkYVx4M2QiCisgICAgIlx4MDJceDQxXHgwMFx4YjBceDZjXHg0Zlx4ZGFceGJiXHg2M1x4MDFceDE5XHg4ZFx4MjZceDViXHhkYlx4YWVceDk0XHgyMyIKKyAgICAiXHhiM1x4ODBceGYyXHg3MVx4ZjdceDM0XHg1M1x4ODhceDUwXHg5M1x4MDdceDdmXHhjZFx4MzlceGUyXHgxMVx4OWZceGM5IgorICAgICJceDg2XHgzMlx4MTVceDRmXHg1OFx4ODNceGIxXHg2N1x4YTlceDY3XHhiZlx4NDBceDJiXHg0ZVx4OWVceDJlXHgwZlx4OTYiCisgICAgIlx4NTZceGU2XHg5OFx4ZWFceDM2XHg2Nlx4ZWRceGZiXHgyNVx4NzlceDgwXHgzOVx4ZjciOworCisvLyBrT0FFUENpcGhlcnRleHQzIGlzIGEgc2FtcGxlIGVuY3J5cHRpb24gb2YgfGtQbGFpbnRleHR8IHdpdGggfGtLZXkzfCB1c2luZworLy8gUlNBIE9BRVAuCitzdGF0aWMgY29uc3QgdWludDhfdCBrT0FFUENpcGhlcnRleHQzW10gPQorICAgICJceGI4XHgyNFx4NmJceDU2XHhhNlx4ZWRceDU4XHg4MVx4YWVceGI1XHg4NVx4ZDlceGEyXHg1Ylx4MmFceGQ3XHg5MFx4YzQiCisgICAgIlx4MTdceGUwXHg4MFx4NjhceDFiXHhmMVx4YWNceDJiXHhjM1x4ZGVceGI2XHg5ZFx4OGJceGNlXHhmMFx4YzRceDM2XHg2ZiIKKyAgICAiXHhlY1x4NDBceDBhXHhmMFx4NTJceGE3XHgyZVx4OWJceDBlXHhmZlx4YjVceGIzXHhmMlx4ZjFceDkyXHhkYlx4ZWFceGNhIgorICAgICJceDAzXHhjMVx4MjdceDQwXHgwNVx4NzFceDEzXHhiZlx4MWZceDA2XHg2OVx4YWNceDIyXHhlOVx4ZjNceGE3XHg4NVx4MmUiCisgICAgIlx4M2NceDE1XHhkOVx4MTNceGNhXHhiMFx4YjhceDg2XHgzYVx4OTVceGM5XHg5Mlx4OTRceGNlXHg4Nlx4NzRceDIxXHg0OSIKKyAgICAiXHg1NFx4NjFceDAzXHg0Nlx4ZjRceGQ0XHg3NFx4YjJceDZmXHg3Y1x4NDhceGI0XHgyZVx4ZTZceDhlXHgxZlx4NTdceDJhIgorICAgICJceDFmXHhjNFx4MDJceDZhXHhjNFx4NTZceGI0XHhmNVx4OWZceDdiXHg2Mlx4MWVceGExXHhiOVx4ZDhceDhmXHg2NFx4MjAiCisgICAgIlx4MmZceGIxIjsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1R3b1ByaW1lS2V5W10gPQorICAgICJceDMwXHg4Mlx4MDRceGExXHgwMlx4MDFceDAwXHgwMlx4ODJceDAxXHgwMVx4MDBceDkzXHgzYVx4NGZceGM5XHg2YVx4MGEiCisgICAgIlx4NmJceDI4XHgwNFx4ZmFceGI3XHgwNVx4NTZceGRmXHhhMFx4YWFceDRmXHhhYVx4YWJceDk0XHhhMFx4YTlceDI1XHhlZiIKKyAgICAiXHhjNVx4OTZceGQyXHhkNFx4NjZceDE2XHg2Mlx4MmNceDEzXHg3Ylx4OTFceGQwXHgzNlx4MGFceDEwXHgxMVx4NmRceDdhIgorICAgICJceDkxXHhiNlx4ZTRceDc0XHg1N1x4YzFceDNkXHg3YVx4YmVceDI0XHgwNVx4M2FceDA0XHgwYlx4NzNceDkxXHg1M1x4YjEiCisgICAgIlx4NzRceDEwXHhlMVx4ODdceGRjXHg5MVx4MjhceDljXHgxZVx4ZTVceGYyXHhiOVx4ZmNceGEyXHg0OFx4MzRceGI2XHg3OCIKKyAgICAiXHhlZFx4NmRceDk1XHhmYlx4ZjJceGMwXHg0ZVx4MWNceGE0XHgxNVx4MDBceDNjXHg4YVx4NjhceDJiXHhkNlx4Y2VceGQ1IgorICAgICJceGIzXHg5Zlx4NjZceDAyXHhhN1x4MGRceDA4XHhhM1x4MjNceDliXHhlNVx4MzZceDk2XHgxM1x4MjJceGY5XHg2OVx4YTYiCisgICAgIlx4ODdceDg4XHg5Ylx4ODVceDNmXHg4M1x4OWNceGFiXHgxYVx4MWJceDZkXHg4ZFx4MTZceGY0XHg1ZVx4YmRceGVlXHg0YiIKKyAgICAiXHg1OVx4NTZceGY4XHg5ZFx4NThceGNkXHhkMlx4ODNceDg1XHg1OVx4NDNceDg0XHg2M1x4NGZceGU2XHgxYVx4ODZceDY2IgorICAgICJceDBkXHhiNVx4YTBceDg3XHg4OVx4YjZceDEzXHg4Mlx4NDNceGRhXHgzNFx4OTJceDNiXHg2OFx4YzRceDk1XHg3MVx4MmYiCisgICAgIlx4MTVceGMyXHhlMFx4NDNceDY3XHgzY1x4MDhceDAwXHgzNlx4MTBceGMzXHhiNFx4NDZceDRjXHg0ZVx4NmVceGY1XHg0NCIKKyAgICAiXHhhOVx4MDRceDQ0XHg5ZFx4Y2VceGM3XHgwNVx4NzlceGVlXHgxMVx4Y2ZceGFmXHgyY1x4ZDdceDlhXHgzMlx4ZDNceGE1IgorICAgICJceDMwXHhkNFx4M2FceDc4XHg0M1x4MzdceDc0XHgyMlx4OTBceDI0XHgwNFx4MTFceGQ3XHg5NVx4MDhceDUyXHhhNFx4NzEiCisgICAgIlx4NDFceDY4XHg5NFx4YjBceGEwXHhjM1x4ZWNceDRlXHhkMlx4YzRceDMwXHg3MVx4OThceDY0XHg5Y1x4ZTNceDdjXHg3NiIKKyAgICAiXHhlZlx4MzNceGEzXHgyYlx4YjFceDg3XHg2M1x4ZDJceDVjXHgwOVx4ZmNceDkwXHgyZFx4OTJceGY0XHg1N1x4MDJceDAxIgorICAgICJceDAzXHgwMlx4ODJceDAxXHgwMFx4NjJceDI2XHhkZlx4ZGJceDljXHgwNlx4ZjJceDFhXHhhZFx4ZmNceDdhXHgwM1x4OGYiCisgICAgIlx4M2ZceGMwXHg3MVx4OGFceDcxXHhjN1x4YjhceDZiXHgxYlx4NmVceDlmXHhkOVx4MGZceDM3XHgzOFx4NDRceDBlXHhlYyIKKyAgICAiXHgxZFx4NjJceDUyXHg2MVx4MzVceDc5XHg1Y1x4MGFceGI2XHg0OFx4ZmNceDYxXHgyNFx4OThceDRkXHg4Zlx4ZDZceDI4IgorICAgICJceGZjXHg3ZVx4YzJceGFlXHgyNlx4YWRceDVjXHhmN1x4YjZceDM3XHhjYlx4YTJceGI1XHhlYlx4YWZceGU4XHg2MFx4YzUiCisgICAgIlx4YmRceDY5XHhlZVx4YTFceGQxXHg1M1x4MTZceGRhXHhjZFx4Y2VceGZiXHg0OFx4ZjNceGI5XHg1Mlx4YTFceGQ1XHg4OSIKKyAgICAiXHg2OFx4NmRceDYzXHg1NVx4N2RceGIxXHg5YVx4YzdceGU0XHg4OVx4ZTNceGNkXHgxNFx4ZWVceGFjXHg2Zlx4NWVceDA1IgorICAgICJceGMyXHgxN1x4YmRceDQzXHg3OVx4YjlceDYyXHgxN1x4NTBceGYxXHgxOVx4YWZceGIwXHg2N1x4YWVceDJhXHg1N1x4YmQiCisgICAgIlx4YzdceDY2XHhiY1x4ZjNceGIzXHg2NFx4YTFceGUzXHgxNlx4NzRceDllXHhlYVx4MDJceDVjXHhhYlx4OTRceGQ4XHg5NyIKKyAgICAiXHgwMlx4NDJceDBjXHgyY1x4YmFceDU0XHhiOVx4YWZceGUwXHg0NVx4OTNceGFkXHg3Zlx4YjNceDEwXHg2YVx4OTZceDUwIgorICAgICJceDRiXHhhZlx4Y2ZceGM4XHgyN1x4NjJceDJkXHg4M1x4ZTlceDI2XHhjNlx4OTRceGMxXHhlZlx4NWNceDhlXHgwNlx4NDIiCisgICAgIlx4NTNceGU1XHg1Nlx4YWZceGMyXHg5OVx4MDFceGFhXHg5YVx4NzFceGJjXHhlOFx4MjFceDMzXHgyYVx4MmRceGEzXHgzNiIKKyAgICAiXHhhY1x4MWJceDg2XHgxOVx4ZjhceGNkXHgxZlx4ODBceGE0XHgyNlx4OThceGI4XHg5Zlx4NjJceDYyXHhkNVx4MWFceDdmIgorICAgICJceGVlXHhkYlx4ZGZceDgxXHhkM1x4MjFceGRiXHgzM1x4OTJceGVlXHhmZlx4ZTJceDJmXHgzMlx4NzdceDczXHg2YVx4NTgiCisgICAgIlx4YWJceDIxXHhmM1x4ZTNceGUxXHhiY1x4NGZceDEyXHg3Mlx4YTZceGI1XHhjMlx4ZmJceDI3XHg5ZVx4YzhceGNhXHhhYiIKKyAgICAiXHg2NFx4YTBceDg3XHgwN1x4OWRceGVmXHhjYVx4MGZceGRiXHgwMlx4ODFceDgxXHgwMFx4ZTZceGQzXHg0ZFx4YzBceGExIgorICAgICJceDkxXHgwZVx4NjJceGZkXHhiMFx4ZGRceGM2XHgzMFx4YjhceDhjXHhjYlx4MTRceGMxXHg0Ylx4NjlceDMwXHhkZFx4Y2QiCisgICAgIlx4ODZceDY3XHhjYlx4MzdceDE0XHhjNVx4MDNceGQyXHhiNFx4NjlceGFiXHgzZFx4ZTVceDE2XHg4MVx4MGZceGU1XHg1MCIKKyAgICAiXHhmNFx4MThceGIxXHhlY1x4YmNceDcxXHhlOVx4ODBceDk5XHgwNlx4ZTRceGEzXHhmZVx4NDRceDg0XHg0YVx4MmRceDFlIgorICAgICJceDA3XHg3Zlx4MjJceDcwXHg2ZFx4NGZceGQ0XHg5M1x4MGJceDhiXHg5OVx4Y2VceDFlXHhhYlx4Y2RceDRjXHhkMlx4ZDMiCisgICAgIlx4MTBceDQ3XHg1Y1x4MDlceDlmXHg2ZFx4ODJceGMwXHgwOFx4NzVceGUzXHgzZFx4ODNceGMyXHgxOVx4NTBceDI5XHhlYyIKKyAgICAiXHgxZlx4ODRceDI5XHhjY1x4ZjFceDU2XHhlZVx4YmRceDU0XHg1ZFx4ZTZceDE5XHhkZlx4MGRceDFjXHhhNFx4YmJceDBhIgorICAgICJceGZlXHg4NFx4NDRceDI5XHgxZFx4ZjlceDVjXHg4MFx4OTZceDViXHgyNFx4YjRceGY3XHgwMlx4MWJceDAyXHg4MVx4ODEiCisgICAgIlx4MDBceGEzXHg0OFx4ZjFceDljXHg1OFx4YzJceDVmXHgzOFx4ZmJceGQ4XHgxMlx4MzlceGYxXHg4ZVx4NzNceGExXHhjZiIKKyAgICAiXHg3OFx4MTJceGUwXHhlZFx4MmFceGJiXHhlZlx4YWNceDIzXHhiMlx4YmZceGQ2XHgwY1x4ZTlceDZlXHgxZVx4YWJceGVhIgorICAgICJceDNmXHg2OFx4MzZceGE3XHgxZlx4ZTVceGFiXHhlMFx4ODZceGE1XHg3Nlx4MzJceDk4XHhkZFx4NzVceGI1XHgyYlx4YmMiCisgICAgIlx4Y2JceDhhXHgwM1x4MDBceDdjXHgyZVx4Y2FceGY4XHhiY1x4MTlceGU0XHhlM1x4YTNceDMxXHhiZFx4MWRceDIwXHgyYiIKKyAgICAiXHgwOVx4YWRceDZmXHg0Y1x4ZWRceDQ4XHhkNFx4ZGZceDg3XHhmOVx4ZjBceDQ2XHhiOVx4ODZceDRjXHg0Ylx4NzFceGU3IgorICAgICJceDQ4XHg3OFx4ZGNceGVkXHhjN1x4ODJceDAyXHg0NFx4ZDNceGE2XHhiM1x4MTBceDVmXHg2Mlx4ODFceGZjXHhiOFx4ZTQiCisgICAgIlx4MGVceGY0XHgxYVx4ZGRceGFiXHgzZlx4YmNceDYzXHg3OVx4NWJceDM5XHg2OVx4NWVceGVhXHhhOVx4MTVceGZlXHg5MCIKKyAgICAiXHhlY1x4ZGFceDc1XHgwMlx4ODFceDgxXHgwMFx4OTlceGUyXHgzM1x4ZDVceGMxXHgwYlx4NWVceGVjXHhhOVx4MjBceDkzIgorICAgICJceGQ5XHg3NVx4ZDBceDVkXHhkY1x4YjhceDgwXHhkY1x4ZjBceGNiXHgzZVx4ODlceDA0XHg0NVx4MzJceDI0XHhiOFx4ODMiCisgICAgIlx4NTdceGUxXHhjZFx4OWJceGM3XHg3ZVx4OThceGI5XHhhYlx4NWZceGVlXHgzNVx4ZjhceDEwXHg3Nlx4OWRceGQyXHhmNiIKKyAgICAiXHg5Ylx4YWJceDEwXHhhZlx4NDNceDE3XHhmZVx4ZDhceDU4XHgzMVx4NzNceDY5XHg1YVx4NTRceGMxXHhhMFx4NDhceGRmIgorICAgICJceGUzXHgwY1x4YjJceDVkXHgxMVx4MzRceDE0XHg3Mlx4ODhceGRkXHhlMVx4ZTJceDBhXHhkYVx4M2RceDViXHhiZlx4OWUiCisgICAgIlx4NTdceDJhXHhiMFx4NGVceDk3XHg3ZVx4NTdceGQ2XHhiYlx4OGFceGM2XHg5ZFx4NmFceDU4XHgxYlx4ZGRceGY2XHgzOSIKKyAgICAiXHhmNFx4N2VceDM4XHgzZVx4OTlceDY2XHg5NFx4YjNceDY4XHg2ZFx4ZDJceDA3XHg1NFx4NThceDJkXHg3MFx4YmVceGE2IgorICAgICJceDNkXHhhYlx4MGVceGU3XHg2ZFx4Y2RceGZhXHgwMVx4NjdceDAyXHg4MVx4ODBceDZjXHhkYlx4NGJceGJkXHg5MFx4ODEiCisgICAgIlx4OTRceGQwXHhhN1x4ZTVceDYxXHg3Ylx4ZjZceDVlXHhmN1x4YzFceDM0XHhmYVx4YjdceDQwXHg5ZVx4MWNceDdkXHg0YSIKKyAgICAiXHg3Mlx4YzJceDc3XHgyYVx4OGVceGIzXHg0Nlx4NDlceDY5XHhjN1x4ZjFceDdmXHg5YVx4Y2ZceDFhXHgxNVx4NDNceGM3IgorICAgICJceGViXHgwNFx4NmVceDRlXHhjY1x4NjVceGU4XHhmOVx4MjNceDcyXHg3ZFx4ZGRceDA2XHhhY1x4YWFceGZkXHg3NFx4ODciCisgICAgIlx4NTBceDdkXHg2Nlx4OThceDk3XHhjMlx4MjFceDI4XHhiZVx4MTVceDcyXHgwNlx4NzNceDlmXHg4OFx4OWVceDMwXHg4ZCIKKyAgICAiXHhlYVx4NWFceGE2XHhhMFx4MmZceDI2XHg1OVx4ODhceDMyXHg0Ylx4ZWZceDg1XHhhNVx4ZThceDllXHg4NVx4MDFceDU2IgorICAgICJceGQ4XHg4ZFx4MTlceGNjXHhiNVx4OTRceGVjXHg1Nlx4YThceDdiXHg0Mlx4YjRceGEyXHhiY1x4OTNceGM3XHg3Zlx4ZDIiCisgICAgIlx4ZWNceGZiXHg5Mlx4MjZceDQ2XHgzZlx4NDdceDFiXHg2M1x4ZmZceDBiXHg0OFx4OTFceGEzXHgwMlx4ODFceDgwXHgyYyIKKyAgICAiXHg0YVx4YjlceGE0XHg0Nlx4N2JceGZmXHg1MFx4N2VceGJmXHg2MFx4NDdceDNiXHgyYlx4NjZceDgyXHhkY1x4MGVceDUzIgorICAgICJceDY1XHg3MVx4ZTlceGRhXHgyYVx4YjhceDMyXHg5M1x4NDJceGI3XHhmZlx4ZWFceDY3XHg2Nlx4ZjFceGJjXHg4N1x4MjgiCisgICAgIlx4NjVceDI5XHg3OVx4Y2FceGFiXHg5M1x4NTZceGRhXHg5NVx4YzFceDI2XHg0NFx4M2RceDI3XHhjMVx4OTFceGM2XHg5YiIKKyAgICAiXHhkOVx4ZWNceDlkXHhiN1x4NDlceGU3XHgxNlx4ZWVceDk5XHg4N1x4NTBceDk1XHg4MVx4ZDRceDVjXHg1Ylx4NWFceDVkIgorICAgICJceDBhXHg0M1x4YTVceGE3XHg4Zlx4NWFceDgwXHg0OVx4YTBceGI3XHgxMFx4ODVceGM3XHhmNFx4NDJceDM0XHg4Nlx4YjYiCisgICAgIlx4NWZceDNmXHg4OFx4OWVceGM3XHhmNVx4NTlceDI5XHgzOVx4NjhceDQ4XHhmMlx4ZDdceDA4XHg1Ylx4OTJceDhlXHg2YiIKKyAgICAiXHhlYVx4YTVceDYzXHg1Zlx4YzBceGZiXHhlNFx4ZTFceGIyXHg3ZFx4YjdceDQwXHhlOVx4NTVceDA2XHhiZlx4NThceDI1IgorICAgICJceDZmIjsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1R3b1ByaW1lRW5jcnlwdGVkTWVzc2FnZVtdID0geworICAgIDB4NjMsIDB4MGEsIDB4MzAsIDB4NDUsIDB4NDMsIDB4MTEsIDB4NDUsIDB4YjcsIDB4OTksIDB4NjcsIDB4OTAsIDB4MzUsCisgICAgMHgzNywgMHgyNywgMHhmZiwgMHhiYywgMHhlMCwgMHhiZiwgMHhhNiwgMHhkMSwgMHg0NywgMHg1MCwgMHhiYiwgMHg2YywKKyAgICAweDFjLCAweGFhLCAweDY2LCAweGYyLCAweGZmLCAweDlkLCAweDlhLCAweGE2LCAweGI0LCAweDE2LCAweDYzLCAweGIwLAorICAgIDB4YTEsIDB4N2MsIDB4N2MsIDB4MGMsIDB4ZWYsIDB4YjMsIDB4NjYsIDB4NTIsIDB4NDIsIDB4ZDcsIDB4NWUsIDB4ZjMsCisgICAgMHhhNCwgMHgxNSwgMHgzMywgMHg0MCwgMHg0MywgMHhlOCwgMHhiMSwgMHhmYywgMHhlMCwgMHg0MiwgMHg4MywgMHg0NiwKKyAgICAweDI4LCAweGNlLCAweGRlLCAweDdiLCAweDAxLCAweGViLCAweDI4LCAweDkyLCAweDcwLCAweGRmLCAweDhkLCAweDU0LAorICAgIDB4OWUsIDB4ZWQsIDB4MjMsIDB4YjQsIDB4NzgsIDB4YzMsIDB4Y2EsIDB4ODUsIDB4NTMsIDB4NDgsIDB4ZDYsIDB4OGEsCisgICAgMHg4NywgMHhmNywgMHg2OSwgMHhjZCwgMHg4MiwgMHg4YywgMHg0ZiwgMHg1YywgMHgwNSwgMHg1NSwgMHhhNiwgMHg3OCwKKyAgICAweDg5LCAweGFiLCAweDRjLCAweGQ4LCAweGE5LCAweGQ2LCAweGE1LCAweGY0LCAweDI5LCAweDRjLCAweDIzLCAweGM4LAorICAgIDB4Y2YsIDB4ZjAsIDB4NGMsIDB4NjQsIDB4NmIsIDB4NGUsIDB4MDIsIDB4MTcsIDB4NjksIDB4ZDYsIDB4NDcsIDB4ODMsCisgICAgMHgzMCwgMHg0MywgMHgwMiwgMHgyOSwgMHhkYSwgMHhkYSwgMHg3NSwgMHgzYiwgMHhkNywgMHhhNywgMHgyYiwgMHgzMSwKKyAgICAweGIzLCAweGU5LCAweDcxLCAweGE0LCAweDQxLCAweGY3LCAweDI2LCAweDliLCAweGNkLCAweDIzLCAweGZhLCAweDQ1LAorICAgIDB4M2MsIDB4OWIsIDB4N2QsIDB4MjgsIDB4ZjcsIDB4ZjksIDB4NjcsIDB4MDQsIDB4YmEsIDB4ZmMsIDB4NDYsIDB4NzUsCisgICAgMHgxMSwgMHgzYywgMHhkNSwgMHgyNywgMHg0MywgMHg1MywgMHhiMSwgMHhiNiwgMHg5ZSwgMHgxOCwgMHhlYiwgMHgxMSwKKyAgICAweGI0LCAweDI1LCAweDIwLCAweDMwLCAweDBiLCAweGUwLCAweDFjLCAweDE3LCAweDM2LCAweDIyLCAweDEwLCAweDBmLAorICAgIDB4OTksIDB4YjUsIDB4NTAsIDB4MTQsIDB4NzMsIDB4MDcsIDB4ZjAsIDB4MmYsIDB4NWQsIDB4NGMsIDB4ZTMsIDB4ZjIsCisgICAgMHg4NiwgMHhjMiwgMHgwNSwgMHhjOCwgMHgzOCwgMHhlZCwgMHhlYiwgMHgyYSwgMHg0YSwgMHhhYiwgMHg3NiwgMHhlMywKKyAgICAweDFhLCAweDc1LCAweDQ0LCAweGY3LCAweDZlLCAweDk0LCAweGRjLCAweDI1LCAweDYyLCAweDdlLCAweDMxLCAweGNhLAorICAgIDB4YzIsIDB4NzMsIDB4NTEsIDB4YjUsIDB4MDMsIDB4ZmIsIDB4ZjksIDB4ZjYsIDB4YjUsIDB4OGQsIDB4NGUsIDB4NmMsCisgICAgMHgyMSwgMHgwZSwgMHhmOSwgMHg5NywgMHgyNiwgMHg1NywgMHhmMywgMHg1MiwgMHg3MiwgMHgwNywgMHhmOCwgMHhiNCwKKyAgICAweGNkLCAweGI0LCAweDM5LCAweGNmLCAweGJmLCAweDc4LCAweGNjLCAweGI2LCAweDg3LCAweGY5LCAweGI3LCAweDhiLAorICAgIDB4NmEsIDB4Y2UsIDB4OWYsIDB4YzgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrVGhyZWVQcmltZUtleVtdID0KKyAgICAiXHgzMFx4ODJceDA0XHhkN1x4MDJceDAxXHgwMVx4MDJceDgyXHgwMVx4MDBceDYyXHg5MVx4ZTlceGVhXHhiM1x4NWRceDZjIgorICAgICJceDI5XHhhZVx4MjFceDgzXHhiYlx4YjVceDgyXHhiMVx4OWVceGVhXHhlMFx4NjRceDViXHgxZVx4MmZceDVlXHgyY1x4MGEiCisgICAgIlx4ODBceDNkXHgyOVx4ZDRceGZhXHg5YVx4ZTdceDQ0XHhlNlx4MjFceGJkXHg5OFx4YzBceDNkXHhlMFx4NTNceDU5XHhhZSIKKyAgICAiXHhkM1x4M2VceGZlXHhjNFx4YzJceGM0XHg1YVx4NWFceDg5XHgwN1x4ZjRceDRmXHhkY1x4YjBceDZhXHhkNFx4M2VceDk5IgorICAgICJceDdkXHg3YVx4OTdceDI2XHg0ZVx4ZTFceDkzXHhjYVx4NmVceGVkXHgwN1x4ZmNceGI0XHhmYVx4OTVceDFlXHg3M1x4N2IiCisgICAgIlx4ODZceDA4XHg2YVx4YjlceGQ0XHgyOVx4YjBceDdlXHg1OVx4YjdceDlkXHg3Ylx4ZWJceDY3XHg2ZVx4ZjBceGJiXHg1ZSIKKyAgICAiXHhjZlx4YjlceGNkXHg1OFx4OTNceGYwXHhlN1x4ODhceDE3XHg2Y1x4MGRceDc2XHgxZVx4YjlceDI3XHg5YVx4NGRceDAyIgorICAgICJceDE2XHhiNlx4NDlceDZkXHhhN1x4ODNceDIzXHg0ZFx4MDJceDQ4XHgwY1x4MGNceDFmXHgwZVx4ODVceDIxXHhlM1x4MDYiCisgICAgIlx4NzZceDBhXHg3M1x4ZTZceGMxXHgyMVx4ZmFceDMwXHgxOFx4NzhceDI5XHg1Y1x4MzFceGQwXHgyOVx4YWVceDZmXHg3ZCIKKyAgICAiXHg4N1x4ZDhceDJmXHgxNlx4ZmFceGJjXHg2N1x4OGFceDk0XHg3MVx4NTlceDliXHhlY1x4MjJceDQwXHg1NVx4OWZceGMyIgorICAgICJceDk0XHhiNVx4YmRceDc4XHgwMVx4YzlceGVmXHgxOFx4YzhceDZkXHgwZFx4ZGNceDUzXHg0Mlx4YjJceDVjXHhhYlx4NjUiCisgICAgIlx4MDVceGJkXHgzNVx4MDhceDg1XHgxYlx4ZjhceGU5XHg0N1x4YmNceGZlXHhjNVx4YWVceDQ3XHgyOVx4NjNceDQ0XHg4ZSIKKyAgICAiXHg0ZFx4YjdceDQ3XHhhYlx4MGRceGQ4XHg3Nlx4NjhceDRmXHhjN1x4MDdceDAyXHhlNFx4ODZceGIwXHhjZlx4ZDhceDE5IgorICAgICJceGFkXHhmNFx4ODVceDc2XHg4Ylx4M2JceDRlXHg0MFx4OGRceDI5XHg3YVx4OGFceDA3XHgzNlx4ZjNceDc4XHhhZVx4MTciCisgICAgIlx4YTZceDhmXHg1M1x4NThceDY1XHg0Y1x4ODZceDllXHhkN1x4OGJceGVjXHgzOFx4NGZceDk5XHhjN1x4MDJceDAxXHgwMyIKKyAgICAiXHgwMlx4ODJceDAxXHgwMFx4NDFceGI2XHg5Ylx4ZjFceGNjXHhlOFx4ZjJceGM2XHg3NFx4MTZceDU3XHhkMlx4NzlceDAxIgorICAgICJceGNiXHhiZlx4NDdceDQwXHg0Mlx4ZTdceDY5XHg3NFx4ZTlceDcyXHhiMVx4YWFceGQzXHg3MVx4MzhceGE3XHgxMVx4ZWYiCisgICAgIlx4ODNceDQ0XHgxNlx4N2VceDY1XHhkNVx4N2VceDk1XHg4Y1x4ZTZceDc0XHg4Y1x4ZDRceGE5XHhkOFx4ODFceGQ4XHgzYyIKKyAgICAiXHgzY1x4NWJceDVhXHhhMlx4ZGZceGU4XHg3NVx4OWNceDhkXHg3Zlx4MTBceGZlXHg1MVx4YmFceDE5XHg4OVx4ZWJceGI3IgorICAgICJceGRjXHg0OVx4ZjNceDVhXHhhOFx4NzhceGE3XHgwZVx4MTRceDRjXHhmZFx4MDRceDA1XHg5Y1x4N2JceGUyXHhjNVx4YTMiCisgICAgIlx4MDRceGVlXHhkOVx4NGNceGZkXHg3ZFx4NDdceGIwXHgwZFx4OWJceDNkXHg3MFx4OTFceDgxXHgyY1x4YWJceDJiXHg4NyIKKyAgICAiXHhhZFx4MTFceDY4XHgyNFx4ZmNceDJiXHhkNFx4ZWVceDVlXHgyOFx4ZWJceDZkXHhhYlx4ZGVceDBmXHg3N1x4MTVceDU4IgorICAgICJceDc2XHgzOVx4YzlceDU5XHgzYVx4N2ZceDE5XHg5ZFx4YzZceDdlXHg4Nlx4ZTRceGQ1XHgzOFx4NzBceDllXHhhZVx4YjkiCisgICAgIlx4ZmJceDMzXHgzM1x4ZDFceDBjXHgyZFx4YWJceDAxXHgyMFx4ZTFceDhiXHgyOVx4OTlceGQzXHhlYlx4ODdceDA1XHg3MiIKKyAgICAiXHhhYVx4NDNceDU4XHg2NFx4OGVceDllXHgzMVx4ZGJceDQ1XHg5Ylx4MmJceGFjXHg1OFx4ODBceDVkXHgzM1x4YTJceDQzIgorICAgICJceDA1XHg5Nlx4Y2NceGNhXHgyZFx4MDRceDVmXHhkNlx4YjdceDNkXHg4Ylx4OGZceDJkXHhhM1x4YTVceGY4XHg3M1x4ZjUiCisgICAgIlx4ZDdceGMwXHgxOVx4ZmZceDEwXHhlNlx4ZWVceDNhXHgyNlx4MmZceGUxXHg2NFx4M2RceDExXHhjZFx4MmRceGU0XHgwYSIKKyAgICAiXHg4NFx4MjdceGUzXHhjYlx4MTZceDYyXHgxOVx4ZTdceGUzXHgwZFx4MTNceGU4XHgwOVx4NWFceDUzXHhkMFx4MjBceDU2IgorICAgICJceDE1XHhmNVx4YjNceDY3XHhhY1x4YTFceGI1XHg5NFx4NmJceGFiXHhkY1x4NzFceGM3XHhiZlx4MGFceGRlXHg3Nlx4ZjUiCisgICAgIlx4MDNceGEwXHgzMFx4ZDhceDI3XHg5ZFx4MDBceDJiXHgwMlx4NTdceDAwXHhmMVx4NGZceGMyXHg4Nlx4MTNceDA2XHgxNyIKKyAgICAiXHhmN1x4NjlceDdlXHgzN1x4ZGZceDY3XHhjNVx4MzJceGEwXHg3NFx4MWNceDMyXHg2OVx4MGZceDlmXHgwOFx4ODhceDI0IgorICAgICJceGIxXHg1MVx4YmNceGJjXHg5Mlx4YmFceDczXHgxZlx4OWNceDc1XHhjMlx4MTRceDZkXHg0Zlx4YzRceDVhXHhjZlx4ZGEiCisgICAgIlx4NDRceDM1XHgwMFx4NmJceDQyXHgzYlx4OWZceDE0XHhmMVx4MDVceGIzXHg1MVx4MjJceGI2XHhiZVx4OWNceGUwXHhjMSIKKyAgICAiXHg1Y1x4NDhceDYxXHhkZlx4NGVceDRjXHg3Mlx4YjhceDA1XHgzNVx4N2NceGFjXHhmMVx4YmJceGEwXHgzYlx4MmFceGVhIgorICAgICJceGY3XHg4Nlx4ZTlceGQyXHhmZlx4MWVceDFkXHgwMlx4NTZceDAwXHhjYVx4YjFceDM5XHhmNlx4YTJceGM2XHgzYlx4NjUiCisgICAgIlx4NDVceDJmXHgzOVx4MDBceGNkXHg2ZVx4ZDZceDU1XHhmN1x4NzFceDM3XHg4OVx4YzJceGU3XHg3YVx4YzBceDFhXHhhNiIKKyAgICAiXHgyZlx4ZWFceDE3XHg3Y1x4YWFceDJhXHg5MVx4OGZceGQ0XHhjN1x4NTBceDhiXHhhYlx4OGVceDk5XHgzYlx4MzNceDkxIgorICAgICJceGJjXHgwMlx4MTBceDU4XHg0Ylx4NThceDQwXHg5Ylx4YzRceDhmXHg0OFx4MmJceGE3XHg0NFx4ZmRceDA3XHgwNFx4ZjAiCisgICAgIlx4OThceDY3XHg1Nlx4ZWFceDI1XHg5Mlx4OGJceDJlXHg0Ylx4NGFceGExXHhkM1x4YzJceGE0XHhiNFx4OWJceDU5XHg3MCIKKyAgICAiXHgzMlx4YTZceGQ4XHg4Ylx4ZDlceDAyXHg1N1x4MDBceGEwXHhkZlx4ZDdceDA0XHgwY1x4YWVceGJhXHhhNFx4ZjBceGZlIgorICAgICJceGNmXHhlYVx4NDVceDJlXHgyMVx4YzBceDRkXHg2OFx4MjFceDliXHg1Zlx4YmZceDViXHgwNVx4NmRceGNiXHg4Ylx4ZDMiCisgICAgIlx4MjhceDYxXHhkMVx4YTJceDE1XHgxMlx4ZjlceDJjXHgwZFx4OWVceDM1XHgyZFx4OTFceGRmXHhlNlx4ZDhceDIzXHg1NSIKKyAgICAiXHg5Y1x4ZDZceGQyXHg2YVx4MGRceGY2XHgwM1x4Y2NceGUwXHhjMVx4Y2ZceDI5XHhiZFx4ZWJceDJiXHg5Mlx4ZGFceGViIgorICAgICJceGVhXHgzNFx4MzJceGY3XHgyNVx4NThceGNlXHg1M1x4MWRceGY2XHg3ZFx4MTVceDdjXHhjN1x4NDdceDRmXHhhZlx4NDYiCisgICAgIlx4OGNceGFhXHgxNFx4MTNceDAyXHg1Nlx4MDBceDg3XHgyMFx4ZDFceDRmXHgxN1x4MmVceGQyXHg0M1x4ODNceDc0XHhkMCIKKyAgICAiXHhhYlx4MzNceDlmXHgzOVx4OGVceGE0XHhmNlx4MjVceDA2XHg4MVx4ZWZceGE3XHgyYVx4YmNceDZlXHhjYVx4OWNceDBmIgorICAgICJceGE4XHg3MVx4NzFceGI2XHg1Zlx4ZTNceDJmXHg4Ylx4MDdceGM3XHhiNFx4NjZceDI3XHg3N1x4YjZceDdkXHg1Nlx4YjUiCisgICAgIlx4OTBceDMyXHgzYVx4ZDVceGJkXHgyZFx4YjRceGRhXHhjN1x4YzRceGQ4XHhhOFx4YWZceDU4XHhhMFx4NjVceDlhXHgzOSIKKyAgICAiXHhmMVx4NmVceDYxXHhiMlx4MWVceGRjXHhkY1x4NmJceGUyXHg4MVx4YzNceDIzXHgxMlx4M2JceGEwXHgyMVx4YzRceDkwIgorICAgICJceDVkXHgzYlx4MDJceDU3XHgwMFx4ZTZceDhhXHhhYVx4YjhceDZkXHgyY1x4ODFceDQzXHhiNVx4ZDZceGEwXHgyYlx4NDIiCisgICAgIlx4NDlceGE5XHgwYVx4NTFceGZhXHgxOFx4YzhceDMyXHhlYVx4NTRceDE4XHhmM1x4NjBceGMyXHhiNVx4NGFceDQzXHgwNSIKKyAgICAiXHg5M1x4OWNceDAxXHhkOVx4MjhceGVkXHg3M1x4ZmFceDgyXHhiY1x4MTJceDY0XHhjYlx4YzRceDI0XHhhOVx4M2VceGFlIgorICAgICJceDdjXHg0Ylx4OGZceDk0XHg1N1x4N2JceDE0XHgxMFx4NDFceGRjXHg2Mlx4MTJceDhjXHhiMlx4NGFceDdjXHhmNlx4NTMiCisgICAgIlx4ZDRceGM2XHhlNFx4ZGFceGQxXHhhMlx4MDBceDBlXHgzZFx4MzBceGY3XHgwNVx4NGZceDFkXHg4Mlx4YmNceDUyXHhkOSIKKyAgICAiXHhiMVx4MzBceDgyXHgwMVx4MGFceDMwXHg4Mlx4MDFceDA2XHgwMlx4NTZceDAwXHg4NFx4MTJceDRmXHhmN1x4M2JceDY1IgorICAgICJceDUzXHgzNFx4NmNceDZjXHg0ZFx4NzdceGRmXHhmZFx4MWZceGI2XHgxNlx4ZTJceDI1XHgxNVx4Y2FceGM5XHhjMVx4NDEiCisgICAgIlx4OWFceDUwXHhkYVx4ZWJceDg4XHg0Zlx4M2RceGIzXHgwMVx4MDBceDQ0XHhjNFx4YWNceGU3XHgxNFx4NjJceGE2XHg1NiIKKyAgICAiXHhkZVx4YzVceGI3XHhjM1x4MWRceDA3XHhiZFx4N2RceDY0XHhjNVx4N2VceDQ1XHgyNVx4NTZceGVkXHg3YVx4ZDJceDE0IgorICAgICJceGRiXHg0ZVx4MjdceGQ0XHgxZlx4ZjhceDk0XHhhN1x4ZWZceDA3XHhjZVx4ZGJceDI0XHhiN1x4ZGRceDcxXHg1Y1x4NjMiCisgICAgIlx4YzlceDMzXHhmZVx4ZGVceDQwXHg1Mlx4ZWJceDAyXHg1NVx4NThceDBjXHgzNVx4NGZceDdjXHhlZVx4MzdceDc4XHg0OCIKKyAgICAiXHg0OFx4MzNceGE1XHgzZlx4ZmVceDE1XHgyNFx4MGZceDQxXHg2ZVx4MGVceDg3XHgzMVx4MmJceDgxXHgxMVx4OGJceDNjIgorICAgICJceDlkXHgwNVx4OGFceDI5XHgyMlx4MDBceGFhXHhkOFx4ODNceDFkXHhlZlx4NjJceGVjXHg2ZVx4ZTRceDk0XHg4M1x4Y2YiCisgICAgIlx4ZDdceDY4XHhhZlx4ZDNceGE4XHhlZFx4ZDhceGZlXHhkOFx4YzNceDhmXHg0OFx4ZmNceDhjXHgwZFx4ZTdceDg5XHg2ZiIKKyAgICAiXHhlMlx4YmZceGZiXHgwZFx4YzVceDRhXHgwNVx4MzRceDkyXHgxOFx4N2FceDkzXHhhMFx4ZThceDQyXHg4Nlx4MjJceGE5IgorICAgICJceGU5XHg4MFx4MzdceDQ3XHgwMlx4NTVceDYwXHg3Nlx4YWJceGRlXHgyYlx4ZjVceGEyXHgyY1x4YWFceDBjXHg5OVx4ODEiCisgICAgIlx4ZWVceDcyXHgyY1x4N2RceDIyXHg1OVx4MmFceDM1XHhlYVx4NTBceDRlXHg0N1x4NmJceDkyXHgyZFx4MzBceGExXHgwMSIKKyAgICAiXHhhNVx4OWVceDI2XHg2ZVx4MjdceGNhXHhmNVx4ZjJceDg3XHg1ZFx4MzFceGFmXHhlOVx4MzJceGNkXHgxMFx4ZmRceDRkIgorICAgICJceGRiXHhmOVx4ODZceDA1XHgxMlx4MWJceDAxXHg4NFx4NTVceDk3XHg1Zlx4ZTJceDc4XHgyN1x4ZDlceGU0XHgyNlx4N2QiCisgICAgIlx4YWJceDBlXHhlMFx4MWJceDZmXHhjYlx4NGJceDE0XHhkZFx4ZGNceGRjXHg4Ylx4ZThceDlmXHhkMFx4NjJceDk2XHhjYSIKKyAgICAiXHhjZiI7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtUaHJlZVByaW1lRW5jcnlwdGVkTWVzc2FnZVtdID0geworICAgIDB4NTgsIDB4ZDksIDB4ZWEsIDB4OGEsIDB4ZjYsIDB4M2QsIDB4YjQsIDB4ZDksIDB4ZjcsIDB4YmIsIDB4MDIsIDB4YzUsCisgICAgMHg1OCwgMHhkMiwgMHhhOSwgMHg0NiwgMHg4MCwgMHg3MCwgMHg3MCwgMHgxNiwgMHgwNywgMHg2NCwgMHgzMiwgMHg0YywKKyAgICAweDRlLCAweDkyLCAweDYxLCAweGI3LCAweGZmLCAweDkyLCAweGRjLCAweGZjLCAweGY4LCAweGYwLCAweDJjLCAweDg0LAorICAgIDB4NTYsIDB4YmMsIDB4ZTUsIDB4OTMsIDB4NzYsIDB4ZTUsIDB4YTMsIDB4NzIsIDB4OTgsIDB4ZjIsIDB4ZGYsIDB4ZWYsCisgICAgMHg5OSwgMHg1MywgMHhmNiwgMHhkOCwgMHg0YiwgMHgwOSwgMHhhYywgMHhhOSwgMHhhMywgMHhkYiwgMHg2MywgMHhhMSwKKyAgICAweGI1LCAweDA5LCAweDhlLCAweDQwLCAweDg0LCAweDhmLCAweDRkLCAweGQ1LCAweDFkLCAweGFjLCAweDZjLCAweGFhLAorICAgIDB4NmIsIDB4MTUsIDB4ZTcsIDB4YjEsIDB4MGMsIDB4NjcsIDB4ZDIsIDB4YjIsIDB4ODEsIDB4NTgsIDB4MzAsIDB4MGUsCisgICAgMHgxOCwgMHgyNywgMHhhMSwgMHg5YiwgMHg5NiwgMHhhZCwgMHhhZSwgMHg3NiwgMHgxYSwgMHgzMiwgMHhmNywgMHgxMCwKKyAgICAweDBiLCAweDUzLCAweDg1LCAweDMxLCAweGQ2LCAweDJhLCAweGY2LCAweDFjLCAweDlmLCAweGMyLCAweGM3LCAweGIxLAorICAgIDB4MDUsIDB4NjMsIDB4MGIsIDB4YTUsIDB4MDcsIDB4MWYsIDB4MWMsIDB4MDEsIDB4ZjAsIDB4ZTAsIDB4MDYsIDB4ZWEsCisgICAgMHgyMCwgMHg2OSwgMHg0MSwgMHgxOSwgMHg1NywgMHg5MiwgMHgxNywgMHhmNywgMHgwYywgMHg1YywgMHg2NiwgMHg3NSwKKyAgICAweDBlLCAweGU1LCAweGIzLCAweGYxLCAweDY3LCAweDNiLCAweDI3LCAweDQ3LCAweGIyLCAweDhlLCAweDFjLCAweGI2LAorICAgIDB4M2YsIDB4ZGQsIDB4NzYsIDB4NDIsIDB4MzEsIDB4MTMsIDB4NjgsIDB4OTYsIDB4ZGYsIDB4M2IsIDB4ZDQsIDB4ODcsCisgICAgMHhkOSwgMHgxNiwgMHg0NCwgMHg3MSwgMHg1MiwgMHgyZSwgMHg1NCwgMHgzZSwgMHgwOSwgMHhjZCwgMHg3MSwgMHhjMSwKKyAgICAweDFlLCAweDVlLCAweDk2LCAweDEzLCAweGM5LCAweDFlLCAweGE0LCAweGU2LCAweGU2LCAweDk3LCAweDJjLCAweDZiLAorICAgIDB4ZjIsIDB4YTksIDB4NWMsIDB4YzYsIDB4NjAsIDB4MmEsIDB4YmMsIDB4ODIsIDB4ZjgsIDB4Y2IsIDB4ZDQsIDB4ZDcsCisgICAgMHhlYSwgMHg4YSwgMHhhMSwgMHg4YSwgMHhkOSwgMHhhNSwgMHgxNCwgMHg4YiwgMHg5ZSwgMHhmOSwgMHgyNSwgMHgwMiwKKyAgICAweGQyLCAweGFiLCAweDBjLCAweDQyLCAweGNhLCAweDJkLCAweDQ1LCAweGEzLCAweDU2LCAweDVlLCAweGEyLCAweDJhLAorICAgIDB4YzgsIDB4NjAsIDB4YTUsIDB4ODcsIDB4NWQsIDB4ODUsIDB4NWMsIDB4ZGUsIDB4YzcsIDB4YTIsIDB4NDcsIDB4YzMsCisgICAgMHg5OSwgMHgyOSwgMHgyMywgMHg3OSwgMHgzNiwgMHg4OCwgMHhhZCwgMHg0MCwgMHgzZSwgMHgyNywgMHg3ZCwgMHhmMCwKKyAgICAweGI2LCAweGZhLCAweDk1LCAweDIwLCAweDNjLCAweGVjLCAweGZjLCAweDU2LCAweDNiLCAweDIwLCAweDkxLCAweGVlLAorICAgIDB4OTgsIDB4MTAsIDB4MmMsIDB4ODIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBrU2l4UHJpbWVLZXlbXSA9CisgICAgIlx4MzBceDgyXHgwNVx4MjBceDAyXHgwMVx4MDFceDAyXHg4Mlx4MDFceDAwXHgxY1x4MDRceDM5XHg0NFx4YjlceGI4XHg3MSIKKyAgICAiXHgxY1x4MWNceGY3XHhkY1x4MTFceDFiXHg4NVx4M2JceDJiXHhlOFx4YTZceGViXHhlYlx4ZTlceGI2XHg4Nlx4OTdceDczIgorICAgICJceDVkXHg3NVx4NDZceGQxXHgzNVx4MjVceGY4XHgzMFx4OWFceGMzXHg1N1x4NDRceDg5XHhhNlx4NDRceDU5XHhlM1x4M2EiCisgICAgIlx4NjBceGI1XHgzM1x4ODRceDcyXHhhNFx4MDNceGM1XHgxYVx4MjBceDk4XHg3MFx4YmRceGU4XHgzYlx4YzFceDliXHg4YSIKKyAgICAiXHgzYVx4MjRceDQ1XHhiNlx4NmFceDczXHhiNFx4ZDBceDZjXHgxOFx4YzZceGE3XHg5NFx4ZDNceDI0XHg3MFx4ZjBceDJkIgorICAgICJceDBjXHhhNVx4YjJceDNiXHhjNVx4MzNceDkwXHg5ZFx4NTZceDhkXHgzM1x4ZjZceDkzXHg3ZFx4YTdceDk1XHg4OFx4MDUiCisgICAgIlx4ZGZceGY1XHg2NVx4NThceGI5XHg1Ylx4ZDNceDA3XHg5Y1x4MTZceDhlXHg3NFx4ZmNceGI4XHg3Nlx4YWZceDYyXHg5OSIKKyAgICAiXHg2Y1x4ZDRceGM1XHhiM1x4NjlceGU1XHg2NFx4ZGZceDM4XHgwMFx4MjVceDI0XHhlOVx4YjFceDRhXHg4NVx4YTZceGY0IgorICAgICJceGI2XHgyM1x4NjhceDY3XHg0YVx4MmNceGJkXHg5ZFx4MDFceDNiXHgwNFx4OGNceDcwXHg5NFx4ODJceDc2XHg0NVx4MGMiCisgICAgIlx4OGJceDk1XHg4YVx4MDdceDFjXHgzMlx4ZTdceDA5XHg5N1x4M2FceGZkXHhjYVx4NTdceGU5XHg1N1x4MGNceGFlXHgyYiIKKyAgICAiXHhhM1x4MjVceGQxXHhmMlx4MGRceDM0XHhhMVx4ZTZceDJmXHg3Ylx4MWJceDM2XHg1M1x4ODNceDk1XHhiOVx4MjZceDZlIgorICAgICJceDRmXHgzNlx4MjZceGY4XHg0N1x4YWVceGRmXHhlOFx4NGRceGY2XHhiMlx4ZmZceDAzXHgyM1x4NzRceGZhXHhhNVx4NmQiCisgICAgIlx4Y2JceGNiXHg4MFx4MTJceGMzXHg3N1x4ZjBceDE5XHhiN1x4ZjJceDZiXHgxOVx4NWNceGRlXHgwYVx4ZDdceGVlXHg4YyIKKyAgICAiXHg0OFx4MmZceDUwXHgyNFx4YTVceDJlXHhjY1x4MmFceGVkXHhjMlx4MzVceGUwXHgzZFx4MjlceDMxXHgxN1x4ZDZceDhmIgorICAgICJceDQ0XHhhYVx4NWJceDMzXHhiZFx4YjRceDg4XHg4N1x4ZDlceDI5XHgzZlx4OTRceGU3XHg3NVx4ZTNceDAyXHgwMVx4MDMiCisgICAgIlx4MDJceDgyXHgwMVx4MDBceDEyXHhhZFx4N2JceDgzXHgyNlx4N2FceGY2XHgxMlx4YmRceGZhXHg5Mlx4YjZceDEyXHg1OCIKKyAgICAiXHhkMlx4MWRceDQ1XHhjNFx4OWRceDQ3XHhmMVx4MjRceDU5XHhiYVx4NGNceGU4XHhmOFx4ZDlceGUwXHhjZVx4MTlceDUwIgorICAgICJceDIwXHg2N1x4MmNceGU0XHhkOFx4NWJceGM0XHgyZFx4OTFceDQxXHhlYlx4MDVceDRmXHhmNFx4YjRceDIwXHhjN1x4YmMiCisgICAgIlx4ZDZceGUyXHg1Y1x4YTBceDI3XHhjZlx4YjhceGIzXHgzYlx4NWNceGViXHg1ZVx4OTZceGI3XHg5OVx4NGJceDhhXHhjMyIKKyAgICAiXHg3MFx4YWZceDdmXHhkOFx4NWZceGViXHhjYlx4MWFceDc5XHg0NFx4NjhceDk3XHg4NFx4ZDhceDI5XHg4N1x4NjRceGJhIgorICAgICJceDE4XHgyZVx4OTVceDY2XHgxYVx4N2RceGQ5XHgzNVx4M2FceDVjXHg5Mlx4N2FceDgxXHgxYlx4NmNceGE5XHhmOFx4ZmEiCisgICAgIlx4MDVceDIzXHgxOFx4NWJceGIyXHhmOFx4NzdceDFjXHhjNVx4MWJceDdkXHgyNlx4NWZceDQ4XHg2OVx4MWJceGM0XHgzNCIKKyAgICAiXHhlZlx4NmVceGExXHgxNVx4ZDJceGIyXHhhY1x4YjhceGE4XHhlZFx4MWVceGVlXHhkY1x4YjVceGI5XHg1Y1x4NzlceDI1IgorICAgICJceDQ4XHhiYlx4ZTVceDlkXHhkOFx4ZTVceGUyXHg5NFx4ZGZceGQ1XHgzMlx4MjJceDg0XHhiZlx4YzJceGFhXHhhNFx4NTQiCisgICAgIlx4YmJceDI5XHhkYlx4MTNceDRhXHgyOFx4M2RceDgzXHgzYVx4ZmZceGEzXHhhZVx4MzhceDA4XHhmY1x4MzZceDg0XHg5MSIKKyAgICAiXHgzMFx4ZDFceGZkXHg4Mlx4NjRceGYxXHgwZlx4YWVceGJhXHhkN1x4OWFceDQzXHg1OFx4MDNceDVlXHg1Zlx4MDFceGNiIgorICAgICJceDhiXHg5MFx4OGRceDc3XHgzNFx4NmZceDM3XHg0MFx4YjZceDZkXHgyMlx4MjNceDkwXHhiMlx4ZmRceDMyXHhiNVx4OTYiCisgICAgIlx4NDVceGJmXHhhZVx4OGNceGM0XHg2Mlx4MDNceDZjXHg2OFx4OTBceDU5XHgzMVx4MWFceGNiXHhmYlx4YTRceDBiXHg5NCIKKyAgICAiXHgxNVx4MTNceGRhXHgxYVx4OGRceGE3XHgwYlx4MzRceDYyXHg5M1x4ZWFceGJlXHg2ZVx4NzFceGMyXHgxZFx4YzhceDlkIgorICAgICJceGFjXHg2Nlx4Y2NceDMxXHg4N1x4ZmZceDk5XHhhYlx4MDJceDJjXHgwMFx4YTVceDU3XHg0MVx4NjZceDg3XHg2OFx4MDIiCisgICAgIlx4NmFceGRmXHg5N1x4YjBceGZlXHg2Ylx4MzRceGM0XHgzM1x4ODhceDJiXHhjZVx4ODJceGFmXHgyZFx4MzNceDVhXHhhZCIKKyAgICAiXHg3NVx4MmRceGFjXHhhNVx4ZDZceDNhXHgyZFx4NjVceDQzXHg2OFx4ZmJceDQ0XHg5ZVx4YjhceDI1XHgwNVx4ZWRceDk3IgorICAgICJceDAyXHgyY1x4MDBceGQyXHg3N1x4MzRceDI0XHhhY1x4NjBceDlhXHhjNFx4NjhceDM0XHhlNVx4NmFceGEzXHhkY1x4ZTIiCisgICAgIlx4YjBceDU4XHg1Y1x4MzVceDgzXHg1YVx4YzdceGE3XHhjMVx4MGJceDdlXHg5ZVx4YTVceDg1XHgzMlx4NDdceDkzXHgyMiIKKyAgICAiXHhlZVx4YjZceDU5XHhlOVx4ZTNceDYxXHg5NFx4ZDBceDBlXHhjYlx4MDJceDJiXHg2ZVx4M2FceDJiXHg5OVx4YWZceDlhIgorICAgICJceGFjXHg0N1x4M2ZceGJhXHg3NVx4ZmVceGYyXHgyM1x4MmRceDc3XHhiMFx4MWRceDM0XHg1N1x4MWZceDczXHg3N1x4OTEiCisgICAgIlx4YzhceGY4XHhjOVx4MWRceGMzXHhlNFx4MjZceGM4XHhlZVx4MmNceGYwXHhhN1x4ODNceDE0XHg3YVx4YzNceDU5XHg0OSIKKyAgICAiXHgwZlx4MDJceDJjXHgwMFx4OGNceDRmXHg3OFx4MThceDcyXHhlYlx4MTFceGQ4XHg0NVx4NzhceDk4XHhmMVx4YzJceDkzIgorICAgICJceDQxXHhjYVx4ZTVceDkyXHhjZVx4NTdceDkxXHhkYVx4NmZceGQ2XHgwN1x4YTlceGJmXHgxOVx4MDNceDc2XHhkYVx4NjIiCisgICAgIlx4MTdceDQ5XHhjZVx4ZTZceDliXHhlY1x4ZWJceGI4XHg4YVx4YjRceDg3XHgwMlx4MmNceDAwXHhhM1x4YzJceDI5XHhhNiIKKyAgICAiXHhhN1x4ZTFceDNjXHhlOVx4Y2ZceDBmXHg1MFx4NTFceDFjXHhjY1x4YzhceDViXHgwOFx4OWNceDk3XHgyNFx4M2FceDg2IgorICAgICJceDIzXHhhOFx4MGJceGJiXHg1NFx4YTZceGI5XHg3MFx4M2RceDFkXHhkMFx4MWJceGEzXHhhY1x4ZDlceGIyXHgwM1x4ODAiCisgICAgIlx4ZDdceDY3XHhlY1x4MzBceDgyXHgwMlx4MjlceDMwXHg4MVx4ODhceDAyXHgyY1x4MDBceDk3XHg1ZFx4M2JceGYyXHhjYyIKKyAgICAiXHhiYVx4ZDlceDc3XHg2N1x4YWFceGQyXHgyMlx4YTdceGEzXHg0OVx4MDhceGM3XHhiOFx4MjdceGExXHg1OVx4NGJceGE3IgorICAgICJceGE1XHhkMlx4NzRceDA1XHhlN1x4NWFceDM1XHhkN1x4MjVceDc5XHgxOFx4MjBceDhhXHgyNVx4ZWNceDNiXHg1Mlx4YWYiCisgICAgIlx4Y2JceGRiXHgwMlx4MmJceDY0XHhlOFx4ZDJceGExXHhkZFx4ZDFceGU2XHg0Zlx4OWFceDcxXHhlMVx4NmNceDZmXHhjMiIKKyAgICAiXHgzMFx4YjBceDg1XHgyNVx4NmZceGMwXHhlNlx4MzJceDZmXHhjM1x4ZTFceGEyXHhhZVx4OWFceDNjXHgyM1x4ZTRceGMzIgorICAgICJceGE2XHgxMFx4MTVceGIxXHg2ZVx4OWRceDdjXHhlMVx4Y2FceDg3XHhlN1x4MDJceDJiXHg1ZVx4ZWZceDI1XHgyOVx4ZWQiCisgICAgIlx4ZjZceDUyXHgxNVx4ZDNceDYwXHhiNlx4ODhceGNmXHgwZlx4ZTJceDI0XHhhNFx4MDRceDk3XHg5Y1x4OWRceDU4XHgxMyIKKyAgICAiXHhiYlx4MDBceDZkXHgzOVx4ZjZceGFkXHgyMVx4N2VceDU2XHgyY1x4MmVceDA2XHgwNlx4YzRceDZkXHg0NFx4YWNceDc5IgorICAgICJceDFmXHhlNVx4MzBceDgxXHg4OVx4MDJceDJjXHgwMFx4ZGJceGYxXHg3OFx4ZjlceGE0XHg5NFx4ZWFceDM5XHg4YVx4M2YiCisgICAgIlx4MjNceDQ4XHgyYVx4MjNceDhmXHhkMlx4MThceDk3XHhkMlx4ZGZceDBmXHhiOFx4MmJceDMzXHhhMFx4ZThceDhmXHhiYyIKKyAgICAiXHg0ZVx4NDJceGZkXHg1NFx4YzdceDBmXHhkZVx4YmFceDZkXHhiYVx4OTZceGE3XHhjZVx4NjdceDNkXHgwMlx4MmNceDAwIgorICAgICJceDkyXHhhMFx4ZmJceDUxXHgxOFx4NjNceDQ2XHhkMVx4MDZceGQ0XHhjMlx4MzBceDFjXHgxN1x4YjVceDM2XHhiYlx4MGYiCisgICAgIlx4ZTFceGVhXHgwYVx4N2FceGM3XHg3N1x4YzBceDliXHgwYVx4N2RceDg5XHg4MVx4ZmVceDM4XHg4NFx4YjVceDNmXHgyNiIKKyAgICAiXHhmM1x4ZDFceGI5XHhjNVx4MzRceDQ0XHhkM1x4MDJceDJiXHg0Y1x4YmRceDFkXHg0NFx4YzhceDE5XHgyM1x4ZDhceGIzIgorICAgICJceDk2XHg2Nlx4NGJceDYyXHhjYlx4M2VceGU2XHg2Y1x4MTFceGRmXHhiMlx4OTJceGQzXHhjOFx4MzRceGI5XHhhNlx4NWEiCisgICAgIlx4MmZceDE5XHhmNFx4MGJceGIyXHhlNlx4OGVceGE2XHhhZlx4YTNceGFlXHhhNFx4YjNceDkyXHhjNFx4NzlceDMwXHg4MSIKKyAgICAiXHg4NVx4MDJceDJiXHgwMFx4ODlceGFiXHgzMFx4ZmNceDdiXHgzN1x4OTRceDExXHg5Zlx4NGRceDMxXHgzYlx4YWNceDA5IgorICAgICJceDU3XHhlNlx4NjRceGVjXHhhMFx4YzhceGY4XHgwNFx4MWFceGY5XHgyYVx4YTRceDRiXHgzNlx4MThceGJiXHg1Zlx4ZGMiCisgICAgIlx4Y2RceGYwXHhjOFx4Y2JceDk3XHhkMVx4ZGZceDEzXHgxMlx4M2ZceDAyXHgyYVx4NWJceGM3XHg3NVx4ZmRceGE3XHg3YSIKKyAgICAiXHg2Mlx4YjZceDZhXHgzM1x4NzZceDI3XHhjOFx4MDZceDNhXHg5OVx4OThceDlkXHhjMFx4ODVceGZhXHhhZFx4NjdceDUwIgorICAgICJceGM3XHgxOFx4MzJceDI0XHgxMFx4N2NceGVhXHg5M1x4MzNceGY1XHhkYlx4MzJceDY1XHgzNlx4OTRceGI3XHg2MVx4N2YiCisgICAgIlx4MDJceDJhXHgxNlx4NmNceDk2XHhhMVx4NTBceDZmXHgzYVx4OTJceGMwXHg3NVx4NDNceGI1XHg2Ylx4OWNceDE3XHgwOSIKKyAgICAiXHhkM1x4ZjBceDY3XHg2OVx4NDVceDkyXHhmYlx4N2JceDUwXHhhOFx4NDJceDliXHgzM1x4OTJceGFiXHhkNVx4ZTZceDQ5IgorICAgICJceGIzXHgyNlx4OTlceDU1XHgxNlx4M2FceDM5XHg2M1x4MzBceDgxXHg4N1x4MDJceDJiXHgwMFx4YzFceDI1XHgxOVx4MWQiCisgICAgIlx4NmVceDE4XHhjYlx4MmRceDY0XHhlMlx4ZTZceGI2XHgxY1x4ZTRceGFhXHg5Y1x4YjlceGVlXHgxOFx4ZDRceGY3XHg1ZiIKKyAgICAiXHg2Nlx4NDBceGYwXHhlMVx4MzFceDM4XHhmMlx4NTNceDAwXHg4Ylx4Y2NceGU0XHgwZFx4YjdceDgxXHhiNFx4ZTZceDFjIgorICAgICJceDE5XHhhZlx4MDJceDJiXHgwMFx4ODBceGMzXHg2Nlx4MTNceDllXHhiYlx4MzJceDFlXHg0M1x4NDFceGVmXHgyNFx4MTMiCisgICAgIlx4NDNceDFjXHg2OFx4N2JceGY0XHgxMFx4OGRceGZhXHgzZlx4OTlceDgwXHhhMFx4OTZceDIwXHhkMFx4YTFceDhjXHhhYiIKKyAgICAiXHgwN1x4ZGRceGVkXHg1ZVx4N2FceDU2XHg3OFx4OTlceDY4XHgxMVx4MWZceDAyXHgyYlx4MDBceGIwXHg1OVx4ZWFceDY3IgorICAgICJceDkzXHg0Mlx4YmZceDA3XHg1NFx4MzhceDQxXHhjYlx4NzNceGE0XHgwZVx4YzJceGFlXHg1Nlx4MTlceDQxXHhjOVx4OGEiCisgICAgIlx4YjJceDJmXHhhOFx4MGFceGIxXHg0ZVx4MTJceDM5XHgyZVx4YzBceDk0XHg5YVx4YzZceGEzXHhlNFx4YWZceDhhXHgxNiIKKyAgICAiXHgwNlx4YjgiOworCitzdGF0aWMgY29uc3QgdWludDhfdCBrU2l4UHJpbWVFbmNyeXB0ZWRNZXNzYWdlW10gPSB7CisgICAgMHgwYSwgMHhjYiwgMHg2YywgMHgwMiwgMHg5ZCwgMHgxYSwgMHg3YywgMHhmMywgMHg0ZSwgMHhmZiwgMHgxNiwgMHg4OCwKKyAgICAweGVlLCAweDIyLCAweDFkLCAweDhkLCAweGQyLCAweGZkLCAweGRlLCAweDgzLCAweGIzLCAweGQ5LCAweDM1LCAweDJjLAorICAgIDB4ODIsIDB4ZTAsIDB4ZmYsIDB4ZTYsIDB4NzksIDB4NmQsIDB4MDYsIDB4MjEsIDB4NzQsIDB4YTgsIDB4MDQsIDB4MGMsCisgICAgMHhlMiwgMHhkMywgMHg5OCwgMHgzZiwgMHhiZiwgMHhkMCwgMHhlOSwgMHg4OCwgMHgyNCwgMHhlMiwgMHgwNSwgMHhhNCwKKyAgICAweDQ1LCAweDUxLCAweDg3LCAweDZiLCAweDFjLCAweGVmLCAweDVmLCAweDJkLCAweDYxLCAweGI2LCAweGYxLCAweDRjLAorICAgIDB4MWYsIDB4M2QsIDB4YmYsIDB4NGIsIDB4ZjIsIDB4ZGEsIDB4MDksIDB4OTcsIDB4ODEsIDB4ZGUsIDB4OTEsIDB4YjcsCisgICAgMHgwZCwgMHhiNCwgMHhjMiwgMHhhYiwgMHg0MSwgMHg2NCwgMHg5ZCwgMHhkOSwgMHgzOSwgMHg0NiwgMHg3OSwgMHg2NiwKKyAgICAweDQzLCAweGYxLCAweDM0LCAweDIxLCAweDU2LCAweDJmLCAweGM2LCAweDY4LCAweDQwLCAweDRhLCAweDJkLCAweDczLAorICAgIDB4OTYsIDB4NTAsIDB4ZTEsIDB4YjAsIDB4YWYsIDB4NDksIDB4MzksIDB4YjQsIDB4ZjAsIDB4M2EsIDB4NzgsIDB4MzgsCisgICAgMHg3MCwgMHhhOSwgMHg5MSwgMHg1ZCwgMHg1ZSwgMHgwNywgMHhmNCwgMHhlYywgMHhiYiwgMHhjNCwgMHhlNSwgMHg4YSwKKyAgICAweGI4LCAweDA2LCAweGJhLCAweGRmLCAweGM2LCAweDQ4LCAweDc4LCAweDRiLCAweGNhLCAweDJhLCAweDhhLCAweDkyLAorICAgIDB4NjQsIDB4ZTMsIDB4YTYsIDB4YWUsIDB4ODcsIDB4OTcsIDB4MTIsIDB4MTYsIDB4NDYsIDB4NjcsIDB4NTksIDB4ZGYsCisgICAgMHhmMiwgMHhmMywgMHg4OSwgMHg2ZiwgMHhlOCwgMHhhOSwgMHgxMywgMHg1NywgMHg2MywgMHg0ZSwgMHgwNywgMHg5OCwKKyAgICAweGNjLCAweDczLCAweGEwLCAweDg0LCAweDlkLCAweGU4LCAweGIzLCAweDUwLCAweDU5LCAweGI1LCAweDUxLCAweGIzLAorICAgIDB4NDEsIDB4N2QsIDB4NTUsIDB4ZmUsIDB4ZDksIDB4ZjAsIDB4YzYsIDB4ZmYsIDB4NmUsIDB4OTYsIDB4NGYsIDB4MjIsCisgICAgMHhiMiwgMHgwZCwgMHg2YiwgMHhjOSwgMHg4MywgMHgyZCwgMHg5OCwgMHg5OCwgMHhiMiwgMHhkMSwgMHhiNywgMHhlNCwKKyAgICAweDUwLCAweDgzLCAweDFhLCAweGE5LCAweDAyLCAweDlmLCAweGFmLCAweDU0LCAweDc0LCAweDJhLCAweDJjLCAweDYzLAorICAgIDB4MTAsIDB4NzksIDB4NDUsIDB4NWMsIDB4OTUsIDB4MGQsIDB4YTEsIDB4OWIsIDB4NTUsIDB4ZjMsIDB4MWUsIDB4YjcsCisgICAgMHg1NiwgMHg1OSwgMHhmMSwgMHg1OSwgMHg4ZCwgMHhkNiwgMHgxNSwgMHg4OSwgMHhmNiwgMHhmZSwgMHhjMCwgMHgwMCwKKyAgICAweGRkLCAweDFmLCAweDJiLCAweGYwLCAweGY3LCAweDVkLCAweDY0LCAweDg0LCAweDc2LCAweGQzLCAweGMyLCAweDkyLAorICAgIDB4MzUsIDB4YWMsIDB4YjUsIDB4ZjksIDB4ZjYsIDB4YTgsIDB4MDUsIDB4ODksIDB4NGMsIDB4OTUsIDB4NDEsIDB4NGUsCisgICAgMHgzNCwgMHgyNSwgMHgxMSwgMHgxNCwKK307CisKKy8vIGtFc3RvbmlhblJTQUtleSBpcyBhbiBSU0FQdWJsaWNLZXkgZW5jb2RlZCB3aXRoIGEgbmVnYXRpdmUgbW9kdWx1cy4gU2VlCisvLyBodHRwczovL2NyYnVnLmNvbS81MzIwNDguCitzdGF0aWMgY29uc3QgdWludDhfdCBrRXN0b25pYW5SU0FLZXlbXSA9IHsKKyAgICAweDMwLCAweDgyLCAweDAxLCAweDA5LCAweDAyLCAweDgyLCAweDAxLCAweDAwLCAweDk2LCAweGE2LCAweDJlLCAweDljLAorICAgIDB4NGUsIDB4NmEsIDB4YzMsIDB4Y2MsIDB4Y2QsIDB4OGYsIDB4NzAsIDB4YzMsIDB4NTUsIDB4YmYsIDB4NWUsIDB4OWMsCisgICAgMHhkNCwgMHhmMywgMHgxNywgMHhjMywgMHg5NywgMHg3MCwgMHhhZSwgMHhkZiwgMHgxMiwgMHg1YywgMHgxNSwgMHg4MCwKKyAgICAweDAzLCAweGVmLCAweDJiLCAweDE4LCAweDlkLCAweDZhLCAweGNiLCAweDUyLCAweDIyLCAweGMxLCAweDgxLCAweGI4LAorICAgIDB4N2UsIDB4NjEsIDB4ZTgsIDB4MGYsIDB4NzksIDB4MjQsIDB4MGYsIDB4ODIsIDB4NzAsIDB4MjQsIDB4NGUsIDB4MjksCisgICAgMHgyMCwgMHgwNSwgMHg1NCwgMHhlYiwgMHhkNCwgMHhhOSwgMHg2NSwgMHg1OSwgMHhiNiwgMHgzYywgMHg3NSwgMHg5NSwKKyAgICAweDJmLCAweDRjLCAweGY2LCAweDlkLCAweGQxLCAweGFmLCAweDVmLCAweDE0LCAweDE0LCAweGU3LCAweDI1LCAweGVhLAorICAgIDB4YTUsIDB4NDcsIDB4NWQsIDB4YzYsIDB4M2UsIDB4MjgsIDB4OGQsIDB4ZGMsIDB4NTQsIDB4ODcsIDB4MmEsIDB4N2MsCisgICAgMHgxMCwgMHhlOSwgMHhjNiwgMHg3NiwgMHgyZCwgMHhlNywgMHg3OSwgMHhkOCwgMHgwZSwgMHhiYiwgMHhhOSwgMHhhYywKKyAgICAweGI1LCAweDE4LCAweDk4LCAweGQ2LCAweDQ3LCAweDZlLCAweDA2LCAweDcwLCAweGJmLCAweDllLCAweDgyLCAweDI1LAorICAgIDB4OTUsIDB4NGUsIDB4ZmQsIDB4NzAsIDB4ZDcsIDB4NzMsIDB4NDUsIDB4MmUsIDB4YzEsIDB4MWYsIDB4N2EsIDB4OWEsCisgICAgMHg5ZCwgMHg2MCwgMHhjMCwgMHgxZiwgMHg2NywgMHgwNiwgMHgyYSwgMHg0ZSwgMHg4NywgMHgzZiwgMHgxOSwgMHg4OCwKKyAgICAweDY5LCAweDY0LCAweDRkLCAweDlmLCAweDc1LCAweGY1LCAweGQzLCAweDFhLCAweDQxLCAweDNkLCAweDM1LCAweDE3LAorICAgIDB4YjYsIDB4ZDEsIDB4NDQsIDB4MGQsIDB4MjUsIDB4OGIsIDB4ZTcsIDB4OTQsIDB4MzksIDB4YjAsIDB4N2MsIDB4YWYsCisgICAgMHgzZSwgMHg2YSwgMHhmYSwgMHg4ZCwgMHg5MCwgMHgyMSwgMHgwZiwgMHg4YSwgMHg0MywgMHg5NCwgMHgzNywgMHg3YywKKyAgICAweDJhLCAweDE1LCAweDRjLCAweGEwLCAweGZhLCAweGE5LCAweDJmLCAweDIxLCAweGE2LCAweDZmLCAweDhlLCAweDJmLAorICAgIDB4ODksIDB4YmMsIDB4YmIsIDB4MzMsIDB4ZjgsIDB4MzEsIDB4ZmMsIDB4ZGYsIDB4Y2QsIDB4NjgsIDB4OWEsIDB4YmMsCisgICAgMHg3NSwgMHgwNiwgMHg5NSwgMHhmMSwgMHgzZCwgMHhlZiwgMHhjYSwgMHg3NiwgMHgyNywgMHhkMiwgMHhiYSwgMHg4ZSwKKyAgICAweDBlLCAweDFjLCAweDQzLCAweGQ3LCAweDcwLCAweGI5LCAweGM2LCAweDE1LCAweGNhLCAweGQ1LCAweDRkLCAweDg3LAorICAgIDB4YjksIDB4ZDEsIDB4YWUsIDB4ZGUsIDB4NjksIDB4NzMsIDB4MDAsIDB4MmEsIDB4OTcsIDB4NTEsIDB4NGIsIDB4MzAsCisgICAgMHgwMSwgMHhjMiwgMHg4NSwgMHhkMCwgMHgwNSwgMHhjYywgMHgyZSwgMHhlOCwgMHhjNywgMHg0MiwgMHhlNywgMHg5NCwKKyAgICAweDUxLCAweGUzLCAweGY1LCAweDE5LCAweDM1LCAweGRjLCAweDU3LCAweDk2LCAweGU3LCAweGQ5LCAweGI0LCAweDQ5LAorICAgIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDAsIDB4MDEsCit9OworCitzdGF0aWMgYm9vbCBUZXN0UlNBKGNvbnN0IHVpbnQ4X3QgKmRlciwgc2l6ZV90IGRlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9hZXBfY2lwaGVydGV4dCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9hZXBfY2lwaGVydGV4dF9sZW4pIHsKKyAgU2NvcGVkUlNBIGtleShkMmlfUlNBUHJpdmF0ZUtleShudWxscHRyLCAmZGVyLCBkZXJfbGVuKSk7CisgIGlmICgha2V5KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFSU0FfY2hlY2tfa2V5KGtleS5nZXQoKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1aW50OF90IGNpcGhlcnRleHRbMjU2XTsKKworICBpbnQgbnVtID0gUlNBX3B1YmxpY19lbmNyeXB0KGtQbGFpbnRleHRMZW4sIGtQbGFpbnRleHQsIGNpcGhlcnRleHQsIGtleS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfUEFERElORyk7CisgIGlmIChudW0gPCAwIHx8IChzaXplX3QpbnVtICE9IFJTQV9zaXplKGtleS5nZXQoKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBLQ1MjMSB2MS41IGVuY3J5cHRpb24gZmFpbGVkIVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDhfdCBwbGFpbnRleHRbMjU2XTsKKyAgbnVtID0gUlNBX3ByaXZhdGVfZGVjcnlwdChudW0sIGNpcGhlcnRleHQsIHBsYWludGV4dCwga2V5LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9QS0NTMV9QQURESU5HKTsKKyAgaWYgKG51bSA8IDAgfHwKKyAgICAgIChzaXplX3QpbnVtICE9IGtQbGFpbnRleHRMZW4gfHwgbWVtY21wKHBsYWludGV4dCwga1BsYWludGV4dCwgbnVtKSAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJQS0NTIzEgdjEuNSBkZWNyeXB0aW9uIGZhaWxlZCFcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG51bSA9IFJTQV9wdWJsaWNfZW5jcnlwdChrUGxhaW50ZXh0TGVuLCBrUGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCBrZXkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgaWYgKG51bSA8IDAgfHwgKHNpemVfdCludW0gIT0gUlNBX3NpemUoa2V5LmdldCgpKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT0FFUCBlbmNyeXB0aW9uIGZhaWxlZCFcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIGtleS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKyAgaWYgKG51bSA8IDAgfHwKKyAgICAgIChzaXplX3QpbnVtICE9IGtQbGFpbnRleHRMZW4gfHwgbWVtY21wKHBsYWludGV4dCwga1BsYWludGV4dCwgbnVtKSAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPQUVQIGRlY3J5cHRpb24gKGVuY3J5cHRlZCBkYXRhKSBmYWlsZWQhXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyB8b2FlcF9jaXBoZXJ0ZXh0fCBzaG91bGQgZGVjcnlwdCB0byB8a1BsYWludGV4dHwuCisgIG51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQob2FlcF9jaXBoZXJ0ZXh0X2xlbiwgb2FlcF9jaXBoZXJ0ZXh0LCBwbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmdldCgpLCBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKworICBpZiAobnVtIDwgMCB8fAorICAgICAgKHNpemVfdCludW0gIT0ga1BsYWludGV4dExlbiB8fCBtZW1jbXAocGxhaW50ZXh0LCBrUGxhaW50ZXh0LCBudW0pICE9IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk9BRVAgZGVjcnlwdGlvbiAodGVzdCB2ZWN0b3IgZGF0YSkgZmFpbGVkIVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVHJ5IGRlY3J5cHRpbmcgY29ycnVwdGVkIGNpcGhlcnRleHRzLgorICBtZW1jcHkoY2lwaGVydGV4dCwgb2FlcF9jaXBoZXJ0ZXh0LCBvYWVwX2NpcGhlcnRleHRfbGVuKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvYWVwX2NpcGhlcnRleHRfbGVuOyBpKyspIHsKKyAgICB1aW50OF90IHNhdmVkID0gY2lwaGVydGV4dFtpXTsKKyAgICBmb3IgKHVuc2lnbmVkIGIgPSAwOyBiIDwgMjU2OyBiKyspIHsKKyAgICAgIGlmIChiID09IHNhdmVkKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2lwaGVydGV4dFtpXSA9IGI7CisgICAgICBudW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG51bSwgY2lwaGVydGV4dCwgcGxhaW50ZXh0LCBrZXkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpOworICAgICAgaWYgKG51bSA+IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3JydXB0IGRhdGEgZGVjcnlwdGVkIVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgY2lwaGVydGV4dFtpXSA9IHNhdmVkOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFRlc3RNdWx0aVByaW1lS2V5KGludCBucHJpbWVzLCBjb25zdCB1aW50OF90ICpkZXIsIHNpemVfdCBkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuYywgc2l6ZV90IGVuY19zaXplKSB7CisgIFNjb3BlZFJTQSByc2EoZDJpX1JTQVByaXZhdGVLZXkobnVsbHB0ciwgJmRlciwgZGVyX3NpemUpKTsKKyAgaWYgKCFyc2EpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVkLXByaW1lIGtleSBmYWlsZWQgdG8gcGFyc2UuXG4iLCBucHJpbWVzKTsKKyAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFSU0FfY2hlY2tfa2V5KHJzYS5nZXQoKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgZmFpbGVkIGZvciAlZC1wcmltZSBrZXkuXG4iLCBucHJpbWVzKTsKKyAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDhfdCBvdXRbMjU2XTsKKyAgc2l6ZV90IG91dF9sZW47CisgIGlmICghUlNBX2RlY3J5cHQocnNhLmdldCgpLCAmb3V0X2xlbiwgb3V0LCBzaXplb2Yob3V0KSwgZW5jLCBlbmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBSU0FfUEtDUzFfUEFERElORykgfHwKKyAgICAgIG91dF9sZW4gIT0gMTEgfHwKKyAgICAgIG1lbWNtcChvdXQsICJoZWxsbyB3b3JsZCIsIDExKSAhPSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlZC1wcmltZSBrZXkgZmFpbGVkIHRvIGRlY3J5cHQuXG4iLCBucHJpbWVzKTsKKyAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFRlc3RNdWx0aVByaW1lS2V5Z2VuKCkgeworICBzdGF0aWMgY29uc3QgY2hhciBrTWVzc2FnZVtdID0gIkhlbGxvIHdvcmxkLiI7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JpdHMgPSAxMDI0OworICB1aW50OF90IGVuY3J5cHRlZFtrQml0cyAvIDhdLCBkZWNyeXB0ZWRba0JpdHMgLyA4XTsKKyAgc2l6ZV90IGVuY3J5cHRlZF9sZW4sIGRlY3J5cHRlZF9sZW47CisKKyAgU2NvcGVkUlNBIHJzYShSU0FfbmV3KCkpOworICBTY29wZWRCSUdOVU0gZShCTl9uZXcoKSk7CisgIGlmICghcnNhIHx8ICFlIHx8CisgICAgICAhQk5fc2V0X3dvcmQoZS5nZXQoKSwgUlNBX0Y0KSB8fAorICAgICAgIVJTQV9nZW5lcmF0ZV9tdWx0aV9wcmltZV9rZXkocnNhLmdldCgpLCBrQml0cywgMywgZS5nZXQoKSwgbnVsbHB0cikgfHwKKyAgICAgICFSU0FfY2hlY2tfa2V5KHJzYS5nZXQoKSkgfHwKKyAgICAgICFSU0FfZW5jcnlwdChyc2EuZ2V0KCksICZlbmNyeXB0ZWRfbGVuLCBlbmNyeXB0ZWQsIHNpemVvZihlbmNyeXB0ZWQpLAorICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopa01lc3NhZ2UsIHNpemVvZihrTWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgUlNBX1BLQ1MxX1BBRERJTkcpIHx8CisgICAgICAhUlNBX2RlY3J5cHQocnNhLmdldCgpLCAmZGVjcnlwdGVkX2xlbiwgZGVjcnlwdGVkLCBzaXplb2YoZGVjcnlwdGVkKSwKKyAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQsIGVuY3J5cHRlZF9sZW4sIFJTQV9QS0NTMV9QQURESU5HKSB8fAorICAgICAgZGVjcnlwdGVkX2xlbiAhPSBzaXplb2Yoa01lc3NhZ2UpIHx8CisgICAgICBtZW1jbXAoZGVjcnlwdGVkLCBrTWVzc2FnZSwgc2l6ZW9mKGtNZXNzYWdlKSkgIT0gMCkgeworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgVGVzdEJhZEtleSgpIHsKKyAgU2NvcGVkUlNBIGtleShSU0FfbmV3KCkpOworICBTY29wZWRCSUdOVU0gZShCTl9uZXcoKSk7CisKKyAgaWYgKCFrZXkgfHwgIWUgfHwgIUJOX3NldF93b3JkKGUuZ2V0KCksIFJTQV9GNCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIVJTQV9nZW5lcmF0ZV9rZXlfZXgoa2V5LmdldCgpLCA1MTIsIGUuZ2V0KCksIG51bGxwdHIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSU0FfZ2VuZXJhdGVfa2V5X2V4IGZhaWxlZC5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIUJOX2FkZChrZXktPnAsIGtleS0+cCwgQk5fdmFsdWVfb25lKCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJCTiBlcnJvci5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoUlNBX2NoZWNrX2tleShrZXkuZ2V0KCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IHBhc3NlZCB3aXRoIGludmFsaWQga2V5IVxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBUZXN0T25seURHaXZlbigpIHsKKyAgdWludDhfdCBidWZbNjRdOworICB1bnNpZ25lZCBidWZfbGVuID0gc2l6ZW9mKGJ1Zik7CisgIFNjb3BlZFJTQSBrZXkoUlNBX25ldygpKTsKKyAgaWYgKCFrZXkgfHwKKyAgICAgICFCTl9oZXgyYm4oJmtleS0+biwKKyAgICAgICAgICAgICAgICAgIjAwZTc3YmJmMzg4OWQ0ZWYzNmE5YTI1ZDRkNjlmM2Y2MzJlYjQzNjIyMTRjNzQ1MTdkYTZkNmFlYWE5YmQiCisgICAgICAgICAgICAgICAgICIwOWFjNDJiMjY2MjFjZDg4ZjNhNmViMDEzNzcyZmMzYmY5ZjgzOTE0YjY0NjcyMzFjNjMwMjAyYzM1YjNlIgorICAgICAgICAgICAgICAgICAiNTgwOGM2NTkiKSB8fAorICAgICAgIUJOX2hleDJibigma2V5LT5lLCAiMDEwMDAxIikgfHwKKyAgICAgICFCTl9oZXgyYm4oJmtleS0+ZCwKKyAgICAgICAgICAgICAgICAgIjAzNjVkYjllYjZkNzNiNTNiMDE1YzQwY2Q4ZGI0ZGU3ZGQ3MDM1YzY4YjVhYzFiZjc4NmQ3YTRlZTJjZWEiCisgICAgICAgICAgICAgICAgICIzMTZlYWVjYTIxYTczYWMzNjVlNTg3MTMxOTVmMmFlOTg0OTM0ODUyNWNhODU1Mzg2YjZkMDI4ZTQzN2E5IgorICAgICAgICAgICAgICAgICAiNDk1YTAxIikgfHwKKyAgICAgIFJTQV9zaXplKGtleS5nZXQoKSkgPiBzaXplb2YoYnVmKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghUlNBX2NoZWNrX2tleShrZXkuZ2V0KCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSU0FfY2hlY2tfa2V5IGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCB1aW50OF90IGtEdW1teUhhc2hbMTZdID0gezB9OworCisgIGlmICghUlNBX3NpZ24oTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsICZidWZfbGVuLAorICAgICAgICAgICAgICAgIGtleS5nZXQoKSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9zaWduIGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIVJTQV92ZXJpZnkoTklEX3NoYTI1Niwga0R1bW15SGFzaCwgc2l6ZW9mKGtEdW1teUhhc2gpLCBidWYsIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICBrZXkuZ2V0KCkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJSU0FfdmVyaWZ5IGZhaWxlZCB3aXRoIG9ubHkgZCBnaXZlbi5cbiIpOworICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgVGVzdFJlY292ZXJDUlRQYXJhbXMoKSB7CisgIFNjb3BlZEJJR05VTSBlKEJOX25ldygpKTsKKyAgaWYgKCFlIHx8ICFCTl9zZXRfd29yZChlLmdldCgpLCBSU0FfRjQpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgIFNjb3BlZFJTQSBrZXkxKFJTQV9uZXcoKSk7CisgICAgaWYgKCFrZXkxIHx8CisgICAgICAgICFSU0FfZ2VuZXJhdGVfa2V5X2V4KGtleTEuZ2V0KCksIDUxMiwgZS5nZXQoKSwgbnVsbHB0cikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2dlbmVyYXRlX2tleV9leCBmYWlsZWQuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVJTQV9jaGVja19rZXkoa2V5MS5nZXQoKSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX2NoZWNrX2tleSBmYWlsZWQgd2l0aCBvcmlnaW5hbCBrZXkuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTY29wZWRSU0Ega2V5MihSU0FfbmV3KCkpOworICAgIGlmICgha2V5MikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBrZXkyLT5uID0gQk5fZHVwKGtleTEtPm4pOworICAgIGtleTItPmUgPSBCTl9kdXAoa2V5MS0+ZSk7CisgICAga2V5Mi0+ZCA9IEJOX2R1cChrZXkxLT5kKTsKKyAgICBpZiAoa2V5Mi0+biA9PSBudWxscHRyIHx8IGtleTItPmUgPT0gbnVsbHB0ciB8fCBrZXkyLT5kID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIVJTQV9yZWNvdmVyX2NydF9wYXJhbXMoa2V5Mi5nZXQoKSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBX3JlY292ZXJfY3J0X3BhcmFtcyBmYWlsZWQuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50OF90IGJ1ZlsxMjhdOworICAgIHVuc2lnbmVkIGJ1Zl9sZW4gPSBzaXplb2YoYnVmKTsKKyAgICBpZiAoUlNBX3NpemUoa2V5Mi5nZXQoKSkgPiBidWZfbGVuKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFSU0FfY2hlY2tfa2V5KGtleTIuZ2V0KCkpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQV9jaGVja19rZXkgZmFpbGVkIHdpdGggcmVjb3ZlcmVkIGtleS5cbiIpOworICAgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3Qga0R1bW15SGFzaFsxNl0gPSB7MH07CisgICAgaWYgKCFSU0Ffc2lnbihOSURfc2hhMjU2LCBrRHVtbXlIYXNoLCBzaXplb2Yoa0R1bW15SGFzaCksIGJ1ZiwgJmJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICBrZXkyLmdldCgpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSU0Ffc2lnbiBmYWlsZWQgd2l0aCByZWNvdmVyZWQga2V5LlxuIik7CisgICAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFSU0FfdmVyaWZ5KE5JRF9zaGEyNTYsIGtEdW1teUhhc2gsIHNpemVvZihrRHVtbXlIYXNoKSwgYnVmLCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICBrZXkyLmdldCgpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSU0FfdmVyaWZ5IGZhaWxlZCB3aXRoIHJlY292ZXJlZCBrZXkuXG4iKTsKKyAgICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgVGVzdEFTTjEoKSB7CisgIC8vIFRlc3QgdGhhdCBwcml2YXRlIGtleXMgbWF5IGJlIGRlY29kZWQuCisgIFNjb3BlZFJTQSByc2EoUlNBX3ByaXZhdGVfa2V5X2Zyb21fYnl0ZXMoa0tleTEsIHNpemVvZihrS2V5MSkgLSAxKSk7CisgIGlmICghcnNhKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVGVzdCB0aGF0IHRoZSBzZXJpYWxpemF0aW9uIHJvdW5kLXRyaXBzLgorICB1aW50OF90ICpkZXI7CisgIHNpemVfdCBkZXJfbGVuOworICBpZiAoIVJTQV9wcml2YXRlX2tleV90b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgcnNhLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBTY29wZWRPcGVuU1NMQnl0ZXMgZGVsZXRlX2RlcihkZXIpOworICBpZiAoZGVyX2xlbiAhPSBzaXplb2Yoa0tleTEpIC0gMSB8fCBtZW1jbXAoZGVyLCBrS2V5MSwgZGVyX2xlbikgIT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRlc3QgdGhhdCBzZXJpYWxpemluZyBwdWJsaWMga2V5cyB3b3Jrcy4KKyAgaWYgKCFSU0FfcHVibGljX2tleV90b19ieXRlcygmZGVyLCAmZGVyX2xlbiwgcnNhLmdldCgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBkZWxldGVfZGVyLnJlc2V0KGRlcik7CisKKyAgLy8gUHVibGljIGtleXMgbWF5IGJlIHBhcnNlZCBiYWNrIG91dC4KKyAgcnNhLnJlc2V0KFJTQV9wdWJsaWNfa2V5X2Zyb21fYnl0ZXMoZGVyLCBkZXJfbGVuKSk7CisgIGlmICghcnNhIHx8IHJzYS0+cCAhPSBOVUxMIHx8IHJzYS0+cSAhPSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gU2VyaWFsaXppbmcgdGhlIHJlc3VsdCByb3VuZC10cmlwcy4KKyAgdWludDhfdCAqZGVyMjsKKyAgc2l6ZV90IGRlcjJfbGVuOworICBpZiAoIVJTQV9wdWJsaWNfa2V5X3RvX2J5dGVzKCZkZXIyLCAmZGVyMl9sZW4sIHJzYS5nZXQoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgU2NvcGVkT3BlblNTTEJ5dGVzIGRlbGV0ZV9kZXIyKGRlcjIpOworICBpZiAoZGVyX2xlbiAhPSBkZXIyX2xlbiB8fCBtZW1jbXAoZGVyLCBkZXIyLCBkZXJfbGVuKSAhPSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUHVibGljIGtleXMgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYXMgcHJpdmF0ZSBrZXlzLgorICBpZiAoUlNBX3ByaXZhdGVfa2V5X3RvX2J5dGVzKCZkZXIsICZkZXJfbGVuLCByc2EuZ2V0KCkpKSB7CisgICAgT1BFTlNTTF9mcmVlKGRlcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEVSUl9jbGVhcl9lcnJvcigpOworCisgIC8vIFB1YmxpYyBrZXlzIHdpdGggbmVnYXRpdmUgbW9kdWxpIGFyZSBpbnZhbGlkLgorICByc2EucmVzZXQoUlNBX3B1YmxpY19rZXlfZnJvbV9ieXRlcyhrRXN0b25pYW5SU0FLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrRXN0b25pYW5SU0FLZXkpKSk7CisgIGlmIChyc2EpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgLy8gQnV0IHxSU0FfcGFyc2VfcHVibGljX2tleV9idWdneXwgd2lsbCBhY2NlcHQgaXQuCisgIENCUyBjYnM7CisgIENCU19pbml0KCZjYnMsIGtFc3RvbmlhblJTQUtleSwgc2l6ZW9mKGtFc3RvbmlhblJTQUtleSkpOworICByc2EucmVzZXQoUlNBX3BhcnNlX3B1YmxpY19rZXlfYnVnZ3koJmNicykpOworICBpZiAoIXJzYSB8fCBDQlNfbGVuKCZjYnMpICE9IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworICBDUllQVE9fbGlicmFyeV9pbml0KCk7CisKKyAgaWYgKCFUZXN0UlNBKGtLZXkxLCBzaXplb2Yoa0tleTEpIC0gMSwga09BRVBDaXBoZXJ0ZXh0MSwKKyAgICAgICAgICAgICAgIHNpemVvZihrT0FFUENpcGhlcnRleHQxKSAtIDEpIHx8CisgICAgICAhVGVzdFJTQShrS2V5Miwgc2l6ZW9mKGtLZXkyKSAtIDEsIGtPQUVQQ2lwaGVydGV4dDIsCisgICAgICAgICAgICAgICBzaXplb2Yoa09BRVBDaXBoZXJ0ZXh0MikgLSAxKSB8fAorICAgICAgIVRlc3RSU0Eoa0tleTMsIHNpemVvZihrS2V5MykgLSAxLCBrT0FFUENpcGhlcnRleHQzLAorICAgICAgICAgICAgICAgc2l6ZW9mKGtPQUVQQ2lwaGVydGV4dDMpIC0gMSkgfHwKKyAgICAgICFUZXN0T25seURHaXZlbigpIHx8CisgICAgICAhVGVzdFJlY292ZXJDUlRQYXJhbXMoKSB8fAorICAgICAgIVRlc3RCYWRLZXkoKSB8fAorICAgICAgIVRlc3RNdWx0aVByaW1lS2V5KDIsIGtUd29QcmltZUtleSwgc2l6ZW9mKGtUd29QcmltZUtleSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUd29QcmltZUVuY3J5cHRlZE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtUd29QcmltZUVuY3J5cHRlZE1lc3NhZ2UpKSB8fAorICAgICAgIVRlc3RNdWx0aVByaW1lS2V5KDMsIGtUaHJlZVByaW1lS2V5LCBzaXplb2Yoa1RocmVlUHJpbWVLZXkpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGhyZWVQcmltZUVuY3J5cHRlZE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtUaHJlZVByaW1lRW5jcnlwdGVkTWVzc2FnZSkpIHx8CisgICAgICAhVGVzdE11bHRpUHJpbWVLZXkoNiwga1NpeFByaW1lS2V5LCBzaXplb2Yoa1NpeFByaW1lS2V5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NpeFByaW1lRW5jcnlwdGVkTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa1NpeFByaW1lRW5jcnlwdGVkTWVzc2FnZSkpIHx8CisgICAgICAhVGVzdE11bHRpUHJpbWVLZXlnZW4oKSB8fAorICAgICAgIVRlc3RBU04xKCkpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHByaW50ZigiUEFTU1xuIik7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3NoYS9DTWFrZUxpc3RzLnR4dAppbmRleCA1YTEwYzg1Li5lY2ZmMDliIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9DTWFrZUxpc3RzLnR4dAorKysgYi9zcmMvY3J5cHRvL3NoYS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBpZiAoJHtBUkNIfSBTVFJFUVVBTCAieDg2XzY0IikKICAgc2V0KApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsCmluZGV4IDQ4OTVlYjMuLmUwYjVkODMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS01ODYucGwKQEAgLTY2LDkgKzY2LDkgQEAKICMgc3dpdGNoIHRvIEFWWCBhbG9uZSBpbXByb3ZlcyBwZXJmb3JtYW5jZSBieSBhcyBsaXR0bGUgYXMgNCUgaW4KICMgY29tcGFyaXNvbiB0byBTU1NFMyBjb2RlIHBhdGguIEJ1dCBiZWxvdyByZXN1bHQgZG9lc24ndCBsb29rIGxpa2UKICMgNCUgaW1wcm92ZW1lbnQuLi4gVHJvdWJsZSBpcyB0aGF0IFNhbmR5IEJyaWRnZSBkZWNvZGVzICdyb1tybF0nIGFzCi0jIHBhaXIgb2YgtS1vcHMsIGFuZCBpdCdzIHRoZSBhZGRpdGlvbmFsILUtb3BzLCB0d28gcGVyIHJvdW5kLCB0aGF0CisjIHBhaXIgb2YgwrUtb3BzLCBhbmQgaXQncyB0aGUgYWRkaXRpb25hbCDCtS1vcHMsIHR3byBwZXIgcm91bmQsIHRoYXQKICMgbWFrZSBpdCBydW4gc2xvd2VyIHRoYW4gQ29yZTIgYW5kIFdlc3RtZXJlLiBCdXQgJ3NoW3JsXWQnIGlzIGRlY29kZWQKLSMgYXMgc2luZ2xlILUtb3AgYnkgU2FuZHkgQnJpZGdlIGFuZCBpdCdzIHJlcGxhY2luZyAncm9bcmxdJyB3aXRoCisjIGFzIHNpbmdsZSDCtS1vcCBieSBTYW5keSBCcmlkZ2UgYW5kIGl0J3MgcmVwbGFjaW5nICdyb1tybF0nIHdpdGgKICMgZXF1aXZhbGVudCAnc2hbcmxdZCcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGltcHJlc3NpdmUgNS4xCiAjIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuIEJ1dCAnc2hbcmxdZCcgaXMgbm90IHNvbWV0aGluZyB0aGF0IHVzZWQKICMgdG8gYmUgZmFzdCwgbm9yIGRvZXMgaXQgYXBwZWFyIHRvIGJlIGZhc3QgaW4gdXBjb21pbmcgQnVsbGRvemVyCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLWFybXY0LWxhcmdlLnBsCmluZGV4IGEyMGQzMzYuLjY0ZTJlZDYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLWFybXY0LWxhcmdlLnBsCisrKyBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGExLWFybXY0LWxhcmdlLnBsCkBAIC0xNzgsNyArMTc4LDcgQEAKIH0KIAogJGNvZGU9PDxfX187Ci0jaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAKIC50ZXh0CiAuY29kZQkzMgpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjgucGwgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12OC5wbAppbmRleCBhOGMwOGMyLi4xYzRmZTRhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12OC5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12OC5wbApAQCAtMTYyLDcgKzE2Miw3IEBACiB9CiAKICRjb2RlLj08PF9fXzsKLSNpbmNsdWRlICJhcm1fYXJjaC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXJtX2FyY2guaD4KIAogLnRleHQKIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni01ODYucGwgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbAppbmRleCA2NDYyZTQ1Li5lOTA3NzE0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbAorKysgYi9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbApAQCAtMTAsNyArMTAsNyBAQAogIyBTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYuIFNlcHRlbWJlciAyMDA3LgogIwogIyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHZhcmllcyBmcm9tCi0jIDEwJSB0byA0MCUgW3NlZSBiZWxvd10uIE5vdCB2ZXJ5IGltcHJlc3NpdmUgb24gc29tZSC1LWFyY2hzLCBidXQKKyMgMTAlIHRvIDQwJSBbc2VlIGJlbG93XS4gTm90IHZlcnkgaW1wcmVzc2l2ZSBvbiBzb21lIMK1LWFyY2hzLCBidXQKICMgaXQncyA1IHRpbWVzIHNtYWxsZXIgYW5kIG9wdGltaXppZXMgYW1vdW50IG9mIHdyaXRlcy4KICMKICMgTWF5IDIwMTIuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbAppbmRleCBkZjcxNjc2Li43ZTA3MTQ3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsCisrKyBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtYXJtdjQucGwKQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAkY29kZT08PF9fXzsKICNpZm5kZWYgX19LRVJORUxfXwotIyBpbmNsdWRlICJhcm1fYXJjaC5oIgorIyBpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAjZWxzZQogIyBkZWZpbmUgX19BUk1fQVJDSF9fIF9fTElOVVhfQVJNX0FSQ0hfXwogIyBkZWZpbmUgX19BUk1fTUFYX0FSQ0hfXyA3CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLTU4Ni5wbCBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCmluZGV4IGU5NmVjMDAuLjJmNmEyMDIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCisrKyBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCkBAIC0zNyw3ICszNyw3IEBACiAjCiAjIElBTFUgY29kZS1wYXRoIGlzIG9wdGltaXplZCBmb3IgZWxkZXIgUGVudGl1bXMuIE9uIHZhbmlsbGEgUGVudGl1bQogIyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHJlYWNoZXMgfjYwJSwKLSMgd2hpbGUgb24gUElJSSAtIH4zNSUuIE9uIG5ld2VyILUtYXJjaHMgaW1wcm92ZW1lbnQgdmFyaWVzIGZyb20gMTUlCisjIHdoaWxlIG9uIFBJSUkgLSB+MzUlLiBPbiBuZXdlciDCtS1hcmNocyBpbXByb3ZlbWVudCB2YXJpZXMgZnJvbSAxNSUKICMgdG8gNTAlLCBidXQgaXQncyBsZXNzIGltcG9ydGFudCBhcyB0aGV5IGFyZSBleHBlY3RlZCB0byBleGVjdXRlIFNTRTIKICMgY29kZS1wYXRoLCB3aGljaCBpcyBjb21tb25seSB+Mi0zeCBmYXN0ZXIgW3RoYW4gY29tcGlsZXIgZ2VuZXJhdGVkCiAjIGNvZGVdLiBTU0UyIGNvZGUtcGF0aCBpcyBhcyBmYXN0IGFzIG9yaWdpbmFsIHNoYTUxMi1zc2UyLnBsLCBldmVuCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbAppbmRleCAyOTY0YTM5Li5jZDM2NjJhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsCisrKyBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItYXJtdjQucGwKQEAgLTE5MSw3ICsxOTEsNyBAQAogfQogJGNvZGU9PDxfX187CiAjaWZuZGVmIF9fS0VSTkVMX18KLSMgaW5jbHVkZSAiYXJtX2FyY2guaCIKKyMgaW5jbHVkZSA8b3BlbnNzbC9hcm1fYXJjaC5oPgogIyBkZWZpbmUgVkZQX0FCSV9QVVNICXZzdG1kYglzcCEse2Q4LWQxNX0KICMgZGVmaW5lIFZGUF9BQklfUE9QCXZsZG1pYQlzcCEse2Q4LWQxNX0KICNlbHNlCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY4LnBsIGIvc3JjL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12OC5wbAppbmRleCA0M2U3MjkzLi40MGViMTdhIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY4LnBsCisrKyBiL3NyYy9jcnlwdG8vc2hhL2FzbS9zaGE1MTItYXJtdjgucGwKQEAgLTE2NCw3ICsxNjQsNyBAQAogfQogCiAkY29kZS49PDxfX187Ci0jaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FybV9hcmNoLmg+CiAKIC50ZXh0CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vc3RhY2svQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3N0YWNrL0NNYWtlTGlzdHMudHh0CmluZGV4IGJkYjA1OTkuLmRjZDhlZjQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vc3RhY2svQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by9zdGFjay9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgc3RhY2sKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8vdGVzdC9DTWFrZUxpc3RzLnR4dAppbmRleCA4NGE2MTc0Li44Yzc1MzE0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3Rlc3QvQ01ha2VMaXN0cy50eHQKKysrIGIvc3JjL2NyeXB0by90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC01LDQgKzUsNSBAQAogCiAgIGZpbGVfdGVzdC5jYwogICBtYWxsb2MuY2MKKyAgdGVzdF91dGlsLmNjCiApCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3Rlc3QvZmlsZV90ZXN0LmNjIGIvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5jYwppbmRleCA4ZGY2ZjlhLi42NzIzMzUwIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3Rlc3QvZmlsZV90ZXN0LmNjCisrKyBiL3NyYy9jcnlwdG8vdGVzdC9maWxlX3Rlc3QuY2MKQEAgLTEyOCw2ICsxMjgsNyBAQAogICAgICAgY29uc3QgY2hhciAqZGVsaW1pdGVyID0gRmluZERlbGltaXRlcihidWYpOwogICAgICAgaWYgKGRlbGltaXRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGluZSAldTogQ291bGQgbm90IHBhcnNlIGF0dHJpYnV0ZS5cbiIsIGxpbmVfKTsKKyAgICAgICAgcmV0dXJuIGtSZWFkRXJyb3I7CiAgICAgICB9CiAgICAgICBzdGQ6OnN0cmluZyBrZXkgPSBTdHJpcFNwYWNlKGJ1ZiwgZGVsaW1pdGVyIC0gYnVmKTsKICAgICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gU3RyaXBTcGFjZShkZWxpbWl0ZXIgKyAxLApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5oIGIvc3JjL2NyeXB0by90ZXN0L2ZpbGVfdGVzdC5oCmluZGV4IDczMDNkOGEuLjI0NjUxYWIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8vdGVzdC9maWxlX3Rlc3QuaAorKysgYi9zcmMvY3J5cHRvL3Rlc3QvZmlsZV90ZXN0LmgKQEAgLTE4LDExICsxOCwxOSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcwMikKKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKIAogLy8gRmlsZS1iYXNlZCB0ZXN0IGZyYW1ld29yay4KIC8vCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3Rlc3QvbWFsbG9jLmNjIGIvc3JjL2NyeXB0by90ZXN0L21hbGxvYy5jYwppbmRleCA5ZmZkZjAxLi44OThmMmE3IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3Rlc3QvbWFsbG9jLmNjCisrKyBiL3NyYy9jcnlwdG8vdGVzdC9tYWxsb2MuY2MKQEAgLTM0LDYgKzM0LDggQEAKICNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChPUEVOU1NMX0dMSUJDKSAmJiAhZGVmaW5lZChPUEVOU1NMX0FSTSkgJiYgXAogICAgICFkZWZpbmVkKE9QRU5TU0xfQUFSQ0g2NCkgJiYgIWRlZmluZWQoT1BFTlNTTF9BU0FOKQogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtNDUsMTQgKzQ3LDE0IEBACiAvKiBUaGlzIGZpbGUgZGVmaW5lcyBvdmVycmlkZXMgZm9yIHRoZSBzdGFuZGFyZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucyB0aGF0IGFsbG93CiAgKiBhIGdpdmVuIGFsbG9jYXRpb24gdG8gYmUgbWFkZSB0byBmYWlsIGZvciB0ZXN0aW5nLiBJZiB0aGUgcHJvZ3JhbSBpcyBydW4KICAqIHdpdGggTUFMTE9DX05VTUJFUl9UT19GQUlMIHNldCB0byBhIGJhc2UtMTAgbnVtYmVyIHRoZW4gdGhhdCBhbGxvY2F0aW9uIHdpbGwKLSAqIHJldHVybiBOVUxMLiBJZiBNQUxMT0NfQUJPUlRfT05fRkFJTCBpcyBhbHNvIGRlZmluZWQgdGhlbiB0aGUgYWxsb2NhdGlvbgotICogd2lsbCBhYm9ydCgpIHJhdGhlciB0aGFuIHJldHVybiBOVUxMLgorICogcmV0dXJuIE5VTEwuIElmIE1BTExPQ19CUkVBS19PTl9GQUlMIGlzIGFsc28gZGVmaW5lZCB0aGVuIHRoZSBhbGxvY2F0aW9uCisgKiB3aWxsIHNpZ25hbCBTSUdUUkFQIHJhdGhlciB0aGFuIHJldHVybiBOVUxMLgogICoKICAqIFRoaXMgY29kZSBpcyBub3QgdGhyZWFkIHNhZmUuICovCiAKIHN0YXRpYyB1aW50NjRfdCBjdXJyZW50X21hbGxvY19jb3VudCA9IDA7CiBzdGF0aWMgdWludDY0X3QgbWFsbG9jX251bWJlcl90b19mYWlsID0gMDsKLXN0YXRpYyBjaGFyIGZhaWx1cmVfZW5hYmxlZCA9IDAsIGFib3J0X29uX2ZhaWwgPSAwOworc3RhdGljIGNoYXIgZmFpbHVyZV9lbmFibGVkID0gMCwgYnJlYWtfb25fZmFpbCA9IDA7CiBzdGF0aWMgaW50IGluX2NhbGwgPSAwOwogCiBleHRlcm4gIkMiIHsKQEAgLTk1LDcgKzk3LDcgQEAKICAgICAgICAgc3RkOjpzZXRfbmV3X2hhbmRsZXIoY3BwX25ld19oYW5kbGVyKTsKICAgICAgIH0KICAgICB9Ci0gICAgYWJvcnRfb25fZmFpbCA9IChOVUxMICE9IGdldGVudigiTUFMTE9DX0FCT1JUX09OX0ZBSUwiKSk7CisgICAgYnJlYWtfb25fZmFpbCA9IChOVUxMICE9IGdldGVudigiTUFMTE9DX0JSRUFLX09OX0ZBSUwiKSk7CiAgICAgaW5pdCA9IDE7CiAgIH0KIApAQCAtMTA4LDggKzExMCw4IEBACiAgIHNob3VsZF9mYWlsID0gKGN1cnJlbnRfbWFsbG9jX2NvdW50ID09IG1hbGxvY19udW1iZXJfdG9fZmFpbCk7CiAgIGN1cnJlbnRfbWFsbG9jX2NvdW50Kys7CiAKLSAgaWYgKHNob3VsZF9mYWlsICYmIGFib3J0X29uX2ZhaWwpIHsKLSAgICBhYm9ydCgpOworICBpZiAoc2hvdWxkX2ZhaWwgJiYgYnJlYWtfb25fZmFpbCkgeworICAgIHJhaXNlKFNJR1RSQVApOwogICB9CiAgIHJldHVybiBzaG91bGRfZmFpbDsKIH0KQEAgLTExOCw2ICsxMjAsNyBAQAogCiB2b2lkICptYWxsb2Moc2l6ZV90IHNpemUpIHsKICAgaWYgKHNob3VsZF9mYWlsX2FsbG9jYXRpb24oKSkgeworICAgIGVycm5vID0gRU5PTUVNOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTEyNiw2ICsxMjksNyBAQAogCiB2b2lkICpjYWxsb2Moc2l6ZV90IG51bV9lbGVtcywgc2l6ZV90IHNpemUpIHsKICAgaWYgKHNob3VsZF9mYWlsX2FsbG9jYXRpb24oKSkgeworICAgIGVycm5vID0gRU5PTUVNOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTEzNCw2ICsxMzgsNyBAQAogCiB2b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKICAgaWYgKHNob3VsZF9mYWlsX2FsbG9jYXRpb24oKSkgeworICAgIGVycm5vID0gRU5PTUVNOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8vdGVzdC9zY29wZWRfdHlwZXMuaCBiL3NyYy9jcnlwdG8vdGVzdC9zY29wZWRfdHlwZXMuaAppbmRleCBjNWM4Y2ZlLi5lNDRjNmVkIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3Rlc3Qvc2NvcGVkX3R5cGVzLmgKKysrIGIvc3JjL2NyeXB0by90ZXN0L3Njb3BlZF90eXBlcy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPG9wZW5zc2wvYWVhZC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgogI2luY2x1ZGUgPG9wZW5zc2wvY21hYy5oPgpAQCAtMTEyLDkgKzExMywxMyBAQAogdXNpbmcgU2NvcGVkUlNBID0gU2NvcGVkT3BlblNTTFR5cGU8UlNBLCBSU0FfZnJlZT47CiB1c2luZyBTY29wZWRYNTA5ID0gU2NvcGVkT3BlblNTTFR5cGU8WDUwOSwgWDUwOV9mcmVlPjsKIHVzaW5nIFNjb3BlZFg1MDlfQUxHT1IgPSBTY29wZWRPcGVuU1NMVHlwZTxYNTA5X0FMR09SLCBYNTA5X0FMR09SX2ZyZWU+OwordXNpbmcgU2NvcGVkWDUwOV9TSUcgPSBTY29wZWRPcGVuU1NMVHlwZTxYNTA5X1NJRywgWDUwOV9TSUdfZnJlZT47CiAKIHVzaW5nIFNjb3BlZFg1MDlTdGFjayA9IFNjb3BlZE9wZW5TU0xTdGFjazxTVEFDS19PRihYNTA5KSwgWDUwOSwgWDUwOV9mcmVlPjsKIAordXNpbmcgU2NvcGVkRVZQX0FFQURfQ1RYID0gU2NvcGVkT3BlblNTTENvbnRleHQ8RVZQX0FFQURfQ1RYLCB2b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX0FFQURfQ1RYX3plcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlBfQUVBRF9DVFhfY2xlYW51cD47CiB1c2luZyBTY29wZWRFVlBfQ0lQSEVSX0NUWCA9IFNjb3BlZE9wZW5TU0xDb250ZXh0PEVWUF9DSVBIRVJfQ1RYLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYX2luaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXA+OwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by90ZXN0L3Rlc3RfdXRpbC5jYyBiL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyMWFhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuY2MKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgInRlc3RfdXRpbC5oIgorCisKK3ZvaWQgaGV4ZHVtcChGSUxFICpmcCwgY29uc3QgY2hhciAqbXNnLCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGxlbikgeworICBjb25zdCB1aW50OF90ICpkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW4pOworICBzaXplX3QgaTsKKworICBmcHV0cyhtc2csIGZwKTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgZnByaW50ZihmcCwgIiUwMngiLCBkYXRhW2ldKTsKKyAgfQorICBmcHV0cygiXG4iLCBmcCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3Rlc3QvdGVzdF91dGlsLmggYi9zcmMvY3J5cHRvL3Rlc3QvdGVzdF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyZTIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jcnlwdG8vdGVzdC90ZXN0X3V0aWwuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEdvb2dsZSBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuICovCisKKyNpZm5kZWYgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX1RFU1RfVEVTVF9VVElMX0gKKyNkZWZpbmUgT1BFTlNTTF9IRUFERVJfQ1JZUFRPX1RFU1RfVEVTVF9VVElMX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBoZXhkdW1wIHdyaXRlcyB8bXNnfCB0byB8ZnB8IGZvbGxvd2VkIGJ5IHRoZSBoZXggZW5jb2Rpbmcgb2YgfGxlbnwgYnl0ZXMKKyAqIGZyb20gfGlufC4gKi8KK3ZvaWQgaGV4ZHVtcChGSUxFICpmcCwgY29uc3QgY2hhciAqbXNnLCBjb25zdCB2b2lkICppbiwgc2l6ZV90IGxlbik7CisKKworI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCit9CisjZW5kaWYKKworI2VuZGlmIC8qIE9QRU5TU0xfSEVBREVSX0NSWVBUT19URVNUX1RFU1RfVVRJTF9IICovCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvQ01ha2VMaXN0cy50eHQgYi9zcmMvY3J5cHRvL3g1MDkvQ01ha2VMaXN0cy50eHQKaW5kZXggM2JiNTcwNC4uMjU4YzI2MyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8veDUwOS9DTWFrZUxpc3RzLnR4dApAQCAtMSw0ICsxLDQgQEAKLWluY2x1ZGVfZGlyZWN0b3JpZXMoLiAuLiAuLi8uLi9pbmNsdWRlKQoraW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9pbmNsdWRlKQogCiBhZGRfbGlicmFyeSgKICAgeDUwOQpAQCAtMTUsNiArMTUsNyBAQAogICBpMmRfcHIuYwogICBwa2NzNy5jCiAgIHRfY3JsLmMKKyAgdF9yZXEuYwogICB0X3g1MDkuYwogICB0X3g1MDlhLmMKICAgeDUwOS5jCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvYV9kaWdlc3QuYyBiL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCmluZGV4IDYwNjBiYmQuLjQzMGUyZTYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9hX2RpZ2VzdC5jCkBAIC03MSw3ICs3MSw3IEBACiAJaT1pMmQoZGF0YSxOVUxMKTsKIAlpZiAoKHN0cj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfZGlnZXN0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJcD1zdHI7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvYV9zaWduLmMgYi9zcmMvY3J5cHRvL3g1MDkvYV9zaWduLmMKaW5kZXggZjIxOWMyMy4uNGU5YmU4YSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L2Ffc2lnbi5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9hX3NpZ24uYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJaWYgKChidWZfaW4gPT0gTlVMTCkgfHwgKGJ1Zl9vdXQgPT0gTlVMTCkpCiAJCXsKIAkJb3V0bD0wOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fc2lnbl9jdHgsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJfHwgIUVWUF9EaWdlc3RTaWduRmluYWwoY3R4LCBidWZfb3V0LCAmb3V0bCkpCiAJCXsKIAkJb3V0bD0wOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fc2lnbl9jdHgsIEVSUl9SX0VWUF9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9FVlBfTElCKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZiAoc2lnbmF0dXJlLT5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzaWduYXR1cmUtPmRhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L2FfdmVyaWZ5LmMgYi9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYwppbmRleCA3MmUwYTYyLi41NzJhMTM5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYworKysgYi9zcmMvY3J5cHRvL3g1MDkvYV92ZXJpZnkuYwpAQCAtODAsMTMgKzgwLDEzIEBACiAKIAlpZiAoIXBrZXkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAogCWlmIChzaWduYXR1cmUtPnR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcgJiYgc2lnbmF0dXJlLT5mbGFncyAmIDB4NykKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBBU04xX2l0ZW1fdmVyaWZ5LCBYNTA5X1JfSU5WQUxJRF9CSVRfU1RSSU5HX0JJVFNfTEVGVCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JTlZBTElEX0JJVF9TVFJJTkdfQklUU19MRUZUKTsKIAkJcmV0dXJuIDA7CiAJCX0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAJCiAJaWYgKGJ1Zl9pbiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV92ZXJpZnksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJewogCQlPUEVOU1NMX2NsZWFuc2UoYnVmX2luLCh1bnNpZ25lZCBpbnQpaW5sKTsKIAkJT1BFTlNTTF9mcmVlKGJ1Zl9pbik7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEFTTjFfaXRlbV92ZXJpZnksIEVSUl9SX0VWUF9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9FVlBfTElCKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTE5LDcgKzExOSw3IEBACiAJaWYgKEVWUF9EaWdlc3RWZXJpZnlGaW5hbCgmY3R4LHNpZ25hdHVyZS0+ZGF0YSwKIAkJCShzaXplX3Qpc2lnbmF0dXJlLT5sZW5ndGgpIDw9IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgQVNOMV9pdGVtX3ZlcmlmeSwgRVJSX1JfRVZQX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0VWUF9MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCS8qIHdlIGRvbid0IG5lZWQgdG8gemVybyB0aGUgJ2N0eCcgYmVjYXVzZSB3ZSBqdXN0IGNoZWNrZWQKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9hc24xX2dlbi5jIGIvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKaW5kZXggZDRkMWVlNi4uODUwYTgxNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2FzbjFfZ2VuLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCQl7CiAJCWlmICghY25mKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9nZW5lcmF0ZV92MywgQVNOMV9SX1NFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1NFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcpOwogCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCXJldCA9IGFzbjFfbXVsdGkoYXNuMV90YWdzLnV0eXBlLCBhc24xX3RhZ3Muc3RyLCBjbmYpOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAKIAlpZiAodXR5cGUgPT0gLTEpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jYiwgQVNOMV9SX1VOS05PV05fVEFHKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VOS05PV05fVEFHKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ0YWc9IiwgZWxlbSk7CiAJCXJldHVybiAtMTsKIAkJfQpAQCAtMzI3LDcgKzMyNyw3IEBACiAJCS8qIElmIG5vIHZhbHVlIGFuZCBub3QgZW5kIG9mIHN0cmluZywgZXJyb3IgKi8KIAkJaWYgKCF2c3RhcnQgJiYgZWxlbVtsZW5dKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9jYiwgQVNOMV9SX01JU1NJTkdfVkFMVUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX01JU1NJTkdfVkFMVUUpOwogCQkJcmV0dXJuIC0xOwogCQkJfQogCQlyZXR1cm4gMDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQkvKiBDaGVjayBmb3IgaWxsZWdhbCBtdWx0aXBsZSBJTVBMSUNJVCB0YWdnaW5nICovCiAJCWlmIChhcmctPmltcF90YWcgIT0gLTEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NiLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyk7CiAJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCWlmICghcGFyc2VfdGFnZ2luZyh2c3RhcnQsIHZsZW4sICZhcmctPmltcF90YWcsICZhcmctPmltcF9jbGFzcykpCkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJY2FzZSBBU04xX0dFTl9GTEFHX0ZPUk1BVDoKIAkJaWYgKCF2c3RhcnQpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX2NiLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1VOS05PV05fRk9STUFUKTsKIAkJCXJldHVybiAtMTsKIAkJCX0KIAkJaWYgKCFzdHJuY21wKHZzdGFydCwgIkFTQ0lJIiwgNSkpCkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJCWFyZy0+Zm9ybWF0ID0gQVNOMV9HRU5fRk9STUFUX0JJVExJU1Q7CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfY2IsIEFTTjFfUl9VTktOT1dOX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOwogCQkJcmV0dXJuIC0xOwogCQkJfQogCQlicmVhazsKQEAgLTQxNSw3ICs0MTUsNyBAQAogCQlyZXR1cm4gMDsKIAlpZiAodGFnX251bSA8IDApCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgcGFyc2VfdGFnZ2luZywgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAkqcHRhZyA9IHRhZ19udW07CkBAIC00NDgsNyArNDQ4LDcgQEAKIAkJCWRlZmF1bHQ6CiAJCQllcmNoWzBdID0gKmVwdHI7CiAJCQllcmNoWzFdID0gMDsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIHBhcnNlX3RhZ2dpbmcsIEFTTjFfUl9JTlZBTElEX01PRElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTlZBTElEX01PRElGSUVSKTsKIAkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiQ2hhcj0iLCBlcmNoKTsKIAkJCXJldHVybiAwOwogCQkJYnJlYWs7CkBAIC01MzQsMTMgKzUzNCwxMyBAQAogCS8qIENhbiBvbmx5IGhhdmUgSU1QTElDSVQgaWYgcGVybWl0dGVkICovCiAJaWYgKChhcmctPmltcF90YWcgIT0gLTEpICYmICFpbXBfb2spCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXBwZW5kX2V4cCwgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAogCWlmIChhcmctPmV4cF9jb3VudCA9PSBBU04xX0ZMQUdfRVhQX01BWCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhcHBlbmRfZXhwLCBBU04xX1JfREVQVEhfRVhDRUVERUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfREVQVEhfRVhDRUVERUQpOwogCQlyZXR1cm4gMDsKIAkJfQogCkBAIC02NTgsNyArNjU4LDcgQEAKIAogCWlmICghKGF0bXAgPSBBU04xX1RZUEVfbmV3KCkpKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC02NzEsNyArNjcxLDcgQEAKIAkJY2FzZSBWX0FTTjFfTlVMTDoKIAkJaWYgKHN0ciAmJiAqc3RyKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfTlVMTF9WQUxVRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9OVUxMX1ZBTFVFKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWJyZWFrOwpAQCAtNjc5LDcgKzY3OSw3IEBACiAJCWNhc2UgVl9BU04xX0JPT0xFQU46CiAJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQpOwogCQkJZ290byBiYWRfZm9ybTsKIAkJCX0KIAkJdnRtcC5uYW1lID0gTlVMTDsKQEAgLTY4Nyw3ICs2ODcsNyBAQAogCQl2dG1wLnZhbHVlID0gKGNoYXIgKilzdHI7CiAJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKCZ2dG1wLCAmYXRtcC0+dmFsdWUuYm9vbGVhbikpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9CT09MRUFOKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0JPT0xFQU4pOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlicmVhazsKQEAgLTY5NiwxMiArNjk2LDEyIEBACiAJCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CiAJCWlmIChmb3JtYXQgIT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lOVEVHRVJfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWlmICghKGF0bXAtPnZhbHVlLmludGVnZXIgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIChjaGFyICopc3RyKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9JTlRFR0VSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX0lOVEVHRVIpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlicmVhazsKQEAgLTcwOSwxMiArNzA5LDEyIEBACiAJCWNhc2UgVl9BU04xX09CSkVDVDoKIAkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX09CSkVDVF9OT1RfQVNDSUlfRk9STUFUKTsKIAkJCWdvdG8gYmFkX2Zvcm07CiAJCQl9CiAJCWlmICghKGF0bXAtPnZhbHVlLm9iamVjdCA9IE9CSl90eHQyb2JqKHN0ciwgMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX09CSkVDVCk7CiAJCQlnb3RvIGJhZF9zdHI7CiAJCQl9CiAJCWJyZWFrOwpAQCAtNzIzLDIzICs3MjMsMjMgQEAKIAkJY2FzZSBWX0FTTjFfR0VORVJBTElaRURUSU1FOgogCQlpZiAoZm9ybWF0ICE9IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9USU1FX05PVF9BU0NJSV9GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX1RJTUVfTk9UX0FTQ0lJX0ZPUk1BVCk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCQlpZiAoIShhdG1wLT52YWx1ZS5hc24xX3N0cmluZyA9IEFTTjFfU1RSSU5HX25ldygpKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gYmFkX3N0cjsKIAkJCX0KIAkJaWYgKCFBU04xX1NUUklOR19zZXQoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcsIHN0ciwgLTEpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+dHlwZSA9IHV0eXBlOwogCQlpZiAoIUFTTjFfVElNRV9jaGVjayhhdG1wLT52YWx1ZS5hc24xX3N0cmluZykpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBBU04xX1JfSUxMRUdBTF9USU1FX1ZBTFVFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUpOwogCQkJZ290byBiYWRfc3RyOwogCQkJfQogCkBAIC03NjEsNyArNzYxLDcgQEAKIAkJCWZvcm1hdCA9IE1CU1RSSU5HX1VURjg7CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX0ZPUk1BVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9GT1JNQVQpOwogCQkJZ290byBiYWRfZm9ybTsKIAkJCX0KIApAQCAtNzY5LDcgKzc2OSw3IEBACiAJCWlmIChBU04xX21ic3RyaW5nX2NvcHkoJmF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLCAodW5zaWduZWQgY2hhciAqKXN0ciwKIAkJCQkJCS0xLCBmb3JtYXQsIEFTTjFfdGFnMmJpdCh1dHlwZSkpIDw9IDApCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGJhZF9zdHI7CiAJCQl9CiAJCQpAQCAtNzgyLDcgKzc4Miw3IEBACiAKIAkJaWYgKCEoYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmcgPSBBU04xX1NUUklOR19uZXcoKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBhc24xX3N0cjJ0eXBlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCkBAIC03OTEsNyArNzkxLDcgQEAKIAogCQkJaWYgKCEocmRhdGEgPSBzdHJpbmdfdG9faGV4KChjaGFyICopc3RyLCAmcmRsZW4pKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX0lMTEVHQUxfSEVYKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfSUxMRUdBTF9IRVgpOwogCQkJCWdvdG8gYmFkX3N0cjsKIAkJCQl9CiAKQEAgLTgwNiw3ICs4MDYsNyBAQAogCQkJewogCQkJaWYgKCFDT05GX3BhcnNlX2xpc3Qoc3RyLCAnLCcsIDEsIGJpdHN0cl9jYiwgYXRtcC0+dmFsdWUuYml0X3N0cmluZykpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9MSVNUX0VSUk9SKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfTElTVF9FUlJPUik7CiAJCQkJZ290byBiYWRfc3RyOwogCQkJCX0KIAkJCW5vX3VudXNlZCA9IDA7CkBAIC04MTQsNyArODE0LDcgQEAKIAkJCX0KIAkJZWxzZSAKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGFzbjFfc3RyMnR5cGUsIEFTTjFfUl9JTExFR0FMX0JJVFNUUklOR19GT1JNQVQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCk7CiAJCQlnb3RvIGJhZF9mb3JtOwogCQkJfQogCkBAIC04MzAsNyArODMwLDcgQEAKIAkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgYXNuMV9zdHIydHlwZSwgQVNOMV9SX1VOU1VQUE9SVEVEX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5TVVBQT1JURURfVFlQRSk7CiAJCWdvdG8gYmFkX3N0cjsKIAkJYnJlYWs7CiAJCX0KQEAgLTg2MCwxMiArODYwLDEyIEBACiAJCXJldHVybiAwOwogCWlmIChiaXRudW0gPCAwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGJpdHN0cl9jYiwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKIAkJcmV0dXJuIDA7CiAJCX0KIAlpZiAoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KGJpdHN0ciwgYml0bnVtLCAxKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBiaXRzdHJfY2IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoQVNOMSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAkJfQogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L2J5X2Rpci5jIGIvc3JjL2NyeXB0by94NTA5L2J5X2Rpci5jCmluZGV4IDM0YmIxZTQuLjMzOTNkZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9ieV9kaXIuYworKysgYi9zcmMvY3J5cHRvL3g1MDkvYnlfZGlyLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCQkJCQlYNTA5X0ZJTEVUWVBFX1BFTSk7CiAJCQlpZiAoIXJldCkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgZGlyX2N0cmwsIFg1MDlfUl9MT0FESU5HX0NFUlRfRElSKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTE9BRElOR19DRVJUX0RJUik7CiAJCQkJfQogCQkJfQogCQllbHNlCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCWlmIChkaXIgPT0gTlVMTCB8fCAhKmRpcikKIAkgICAgewotCSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBhZGRfY2VydF9kaXIsIFg1MDlfUl9JTlZBTElEX0RJUkVDVE9SWSk7CisJICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9JTlZBTElEX0RJUkVDVE9SWSk7CiAJICAgIHJldHVybiAwOwogCSAgICB9CiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJCWN0eC0+ZGlycyA9IHNrX0JZX0RJUl9FTlRSWV9uZXdfbnVsbCgpOwogCQkJCWlmICghY3R4LT5kaXJzKQogCQkJCQl7Ci0JCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGFkZF9jZXJ0X2RpciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJCXJldHVybiAwOwogCQkJCQl9CiAJCQkJfQpAQCAtMzExLDEzICszMTEsMTMgQEAKIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBnZXRfY2VydF9ieV9zdWJqZWN0LCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOwogCQlnb3RvIGZpbmlzaDsKIAkJfQogCiAJaWYgKChiPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgZ2V0X2NlcnRfYnlfc3ViamVjdCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0JVRl9MSUIpOwogCQlnb3RvIGZpbmlzaDsKIAkJfQogCQpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCQlqPXN0cmxlbihlbnQtPmRpcikrMSs4KzYrMSsxOwogCQkJaWYgKCFCVUZfTUVNX2dyb3coYixqKSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgZ2V0X2NlcnRfYnlfc3ViamVjdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlnb3RvIGZpbmlzaDsKIAkJCQl9CiAJCQlpZiAodHlwZSA9PSBYNTA5X0xVX0NSTCAmJiBlbnQtPmhhc2hlcykKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMgYi9zcmMvY3J5cHRvL3g1MDkvYnlfZmlsZS5jCmluZGV4IDJmZGJjZTQuLmYxZDYxOTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9ieV9maWxlLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2J5X2ZpbGUuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAkJCWlmICghb2spCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGJ5X2ZpbGVfY3RybCwgWDUwOV9SX0xPQURJTkdfREVGQVVMVFMpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9MT0FESU5HX0RFRkFVTFRTKTsKIAkJCQl9CiAJCQl9CiAJCWVsc2UKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfZmlsZSwgRVJSX1JfU1lTX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1NZU19MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCQkJfQogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9maWxlLCBFUlJfUl9QRU1fTElCKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfUEVNX0xJQik7CiAJCQkJCWdvdG8gZXJyOwogCQkJCQl9CiAJCQkJfQpAQCAtMTczLDcgKzE3Myw3IEBACiAJCXg9ZDJpX1g1MDlfYmlvKGluLE5VTEwpOwogCQlpZiAoeCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NlcnRfZmlsZSwgRVJSX1JfQVNOMV9MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQVNOMV9MSUIpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWk9WDUwOV9TVE9SRV9hZGRfY2VydChjdHgtPnN0b3JlX2N0eCx4KTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCQl9CiAJZWxzZQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jZXJ0X2ZpbGUsIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CiAJCWdvdG8gZXJyOwogCQl9CiBlcnI6CkBAIC0yMDMsNyArMjAzLDcgQEAKIAogCWlmICgoaW4gPT0gTlVMTCkgfHwgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jcmxfZmlsZSwgRVJSX1JfU1lTX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1NZU19MSUIpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJCQkJfQogCQkJCWVsc2UKIAkJCQkJewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY3JsX2ZpbGUsIEVSUl9SX1BFTV9MSUIpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QRU1fTElCKTsKIAkJCQkJZ290byBlcnI7CiAJCQkJCX0KIAkJCQl9CkBAIC0yMzksNyArMjM5LDcgQEAKIAkJeD1kMmlfWDUwOV9DUkxfYmlvKGluLE5VTEwpOwogCQlpZiAoeCA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9sb2FkX2NybF9maWxlLCBFUlJfUl9BU04xX0xJQik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9BU04xX0xJQik7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaT1YNTA5X1NUT1JFX2FkZF9jcmwoY3R4LT5zdG9yZV9jdHgseCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY3JsX2ZpbGUsIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9CQURfWDUwOV9GSUxFVFlQRSk7CiAJCWdvdG8gZXJyOwogCQl9CiBlcnI6CkBAIC0yNjgsMTMgKzI2OCwxMyBAQAogCQlyZXR1cm4gWDUwOV9sb2FkX2NlcnRfZmlsZShjdHgsIGZpbGUsIHR5cGUpOwogCWluID0gQklPX25ld19maWxlKGZpbGUsICJyIik7CiAJaWYoIWluKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlLCBFUlJfUl9TWVNfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfU1lTX0xJQik7CiAJCXJldHVybiAwOwogCX0KIAlpbmYgPSBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKGluLCBOVUxMLCBOVUxMLCBOVUxMKTsKIAlCSU9fZnJlZShpbik7CiAJaWYoIWluZikgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2xvYWRfY2VydF9jcmxfZmlsZSwgRVJSX1JfUEVNX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1BFTV9MSUIpOwogCQlyZXR1cm4gMDsKIAl9CiAJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9JTkZPX251bShpbmYpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS9pMmRfcHIuYyBiL3NyYy9jcnlwdG8veDUwOS9pMmRfcHIuYwppbmRleCA0NDNjYTUzLi5lN2Y0MjY5IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkvaTJkX3ByLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L2kyZF9wci5jCkBAIC03OCw3ICs3OCw3IEBACiAJfQogCS8qIEFsdGhvdWdoIHRoaXMgZmlsZSBpcyBpbiBjcnlwdG8veDUwOSBmb3IgbGF5ZXJpbmcgcmVhc29ucywgaXQgZW1pdHMKIAkgKiBhbiBlcnJvciBjb2RlIGZyb20gQVNOMSBmb3IgT3BlblNTTCBjb21wYXRpYmlsaXR5LiAqLwotCU9QRU5TU0xfUFVUX0VSUk9SKEFTTjEsIGkyZF9Qcml2YXRlS2V5LCBBU04xX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihBU04xLCBBU04xX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKIAlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvcGtjczcuYyBiL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCmluZGV4IDk5ZWUzZGEuLjIwODdmOTQgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS9wa2NzNy5jCkBAIC01Nyw4ICs1Nyw3IEBACiAgIH0KIAogICBpZiAoT0JKX2NiczJuaWQoJmNvbnRlbnRfdHlwZSkgIT0gTklEX3BrY3M3X3NpZ25lZCkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHBrY3M3X3BhcnNlX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICBYNTA5X1JfTk9UX1BLQ1M3X1NJR05FRF9EQVRBKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9UX1BLQ1M3X1NJR05FRF9EQVRBKTsKICAgICBnb3RvIGVycjsKICAgfQogCkBAIC03Myw4ICs3Miw3IEBACiAgIH0KIAogICBpZiAodmVyc2lvbiA8IDEpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBwa2NzN19wYXJzZV9oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgWDUwOV9SX0JBRF9QS0NTN19WRVJTSU9OKTsKKyAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQkFEX1BLQ1M3X1ZFUlNJT04pOwogICAgIGdvdG8gZXJyOwogICB9CiAKQEAgLTEwMyw4ICsxMDEsNyBAQAogICAvKiBTZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIzMTUjc2VjdGlvbi05LjEgKi8KICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnNpZ25lZF9kYXRhLCAmY2VydGlmaWNhdGVzLAogICAgICAgICAgICAgICAgICAgICBDQlNfQVNOMV9DT05URVhUX1NQRUNJRklDIHwgQ0JTX0FTTjFfQ09OU1RSVUNURUQgfCAwKSkgewotICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFBLQ1M3X2dldF9jZXJ0aWZpY2F0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgWDUwOV9SX05PX0NFUlRJRklDQVRFU19JTkNMVURFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX05PX0NFUlRJRklDQVRFU19JTkNMVURFRCk7CiAgICAgZ290byBlcnI7CiAgIH0KIApAQCAtMTcxLDggKzE2OCw3IEBACiAKICAgaWYgKCFDQlNfZ2V0X2FzbjEoJnNpZ25lZF9kYXRhLCAmY3JscywKICAgICAgICAgICAgICAgICAgICAgQ0JTX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyB8IENCU19BU04xX0NPTlNUUlVDVEVEIHwgMSkpIHsKLSAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBQS0NTN19nZXRfQ1JMcywKLSAgICAgICAgICAgICAgICAgICAgICBYNTA5X1JfTk9fQ1JMU19JTkNMVURFRCk7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX05PX0NSTFNfSU5DTFVERUQpOwogICAgIGdvdG8gZXJyOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS90X2NybC5jIGIvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKaW5kZXggOTNhN2FmYi4uYTJkOGJjNyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3RfY3JsLmMKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX3ByaW50X2ZwLCBFUlJfUl9CVUZfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQlVGX0xJQik7CiAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwogCQl9CiAgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkvdF9yZXEuYyBiL3NyYy9jcnlwdG8veDUwOS90X3JlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzgzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY3J5cHRvL3g1MDkvdF9yZXEuYwpAQCAtMCwwICsxLDI0NiBAQAorLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKworaW50IFg1MDlfUkVRX3ByaW50X2ZwKEZJTEUgKmZwLCBYNTA5X1JFUSAqeCkgeworICBCSU8gKmJpbyA9IEJJT19uZXcoQklPX3NfZmlsZSgpKTsKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfQlVGX0xJQik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBCSU9fc2V0X2ZwKGJpbywgZnAsIEJJT19OT0NMT1NFKTsKKyAgaW50IHJldCA9IFg1MDlfUkVRX3ByaW50KGJpbywgeCk7CisgIEJJT19mcmVlKGJpbyk7CisgIHJldHVybiByZXQ7Cit9CisKK2ludCBYNTA5X1JFUV9wcmludF9leChCSU8gKmJpbywgWDUwOV9SRVEgKngsIHVuc2lnbmVkIGxvbmcgbm1mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNmbGFnKSB7CisgIGxvbmcgbDsKKyAgRVZQX1BLRVkgKnBrZXk7CisgIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqIHNrOworICBjaGFyIG1sY2ggPSAnICc7CisKKyAgaW50IG5taW5kZW50ID0gMDsKKworICBpZiAoKG5tZmxhZ3MgJiBYTl9GTEFHX1NFUF9NQVNLKSA9PSBYTl9GTEFHX1NFUF9NVUxUSUxJTkUpIHsKKyAgICBtbGNoID0gJ1xuJzsKKyAgICBubWluZGVudCA9IDEyOworICB9CisKKyAgaWYgKG5tZmxhZ3MgPT0gWDUwOV9GTEFHX0NPTVBBVCkgeworICAgIG5taW5kZW50ID0gMTY7CisgIH0KKworICBYNTA5X1JFUV9JTkZPICpyaSA9IHgtPnJlcV9pbmZvOworICBpZiAoIShjZmxhZyAmIFg1MDlfRkxBR19OT19IRUFERVIpKSB7CisgICAgaWYgKEJJT193cml0ZShiaW8sICJDZXJ0aWZpY2F0ZSBSZXF1ZXN0OlxuIiwgMjEpIDw9IDAgfHwKKyAgICAgICAgQklPX3dyaXRlKGJpbywgIiAgICBEYXRhOlxuIiwgMTApIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICBpZiAoIShjZmxhZyAmIFg1MDlfRkxBR19OT19WRVJTSU9OKSkgeworICAgIGwgPSBYNTA5X1JFUV9nZXRfdmVyc2lvbih4KTsKKyAgICBpZiAoQklPX3ByaW50ZihiaW8sICIlOHNWZXJzaW9uOiAlbGQgKDB4JWx4KVxuIiwgIiIsIGwgKyAxLCBsKSA8PSAwKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKyAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fU1VCSkVDVCkpIHsKKyAgICBpZiAoQklPX3ByaW50ZihiaW8sICIgICAgICAgIFN1YmplY3Q6JWMiLCBtbGNoKSA8PSAwIHx8CisgICAgICAgIFg1MDlfTkFNRV9wcmludF9leChiaW8sIHJpLT5zdWJqZWN0LCBubWluZGVudCwgbm1mbGFncykgPCAwIHx8CisgICAgICAgIEJJT193cml0ZShiaW8sICJcbiIsIDEpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgfQorICBpZiAoIShjZmxhZyAmIFg1MDlfRkxBR19OT19QVUJLRVkpKSB7CisgICAgaWYgKEJJT193cml0ZShiaW8sICIgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOlxuIiwgMzMpIDw9IDAgfHwKKyAgICAgICAgQklPX3ByaW50ZihiaW8sICIlMTJzUHVibGljIEtleSBBbGdvcml0aG06ICIsICIiKSA8PSAwIHx8CisgICAgICAgIGkyYV9BU04xX09CSkVDVChiaW8sIHJpLT5wdWJrZXktPmFsZ29yLT5hbGdvcml0aG0pIDw9IDAgfHwKKyAgICAgICAgQklPX3B1dHMoYmlvLCAiXG4iKSA8PSAwKSB7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBwa2V5ID0gWDUwOV9SRVFfZ2V0X3B1YmtleSh4KTsKKyAgICBpZiAocGtleSA9PSBOVUxMKSB7CisgICAgICBCSU9fcHJpbnRmKGJpbywgIiUxMnNVbmFibGUgdG8gbG9hZCBQdWJsaWMgS2V5XG4iLCAiIik7CisgICAgICBFUlJfcHJpbnRfZXJyb3JzKGJpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVWUF9QS0VZX3ByaW50X3B1YmxpYyhiaW8sIHBrZXksIDE2LCBOVUxMKTsKKyAgICAgIEVWUF9QS0VZX2ZyZWUocGtleSk7CisgICAgfQorICB9CisKKyAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fQVRUUklCVVRFUykpIHsKKyAgICBpZiAoQklPX3ByaW50ZihiaW8sICIlOHNBdHRyaWJ1dGVzOlxuIiwgIiIpIDw9IDApIHsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIHNrID0geC0+cmVxX2luZm8tPmF0dHJpYnV0ZXM7CisgICAgaWYgKHNrX1g1MDlfQVRUUklCVVRFX251bShzaykgPT0gMCkgeworICAgICAgaWYgKEJJT19wcmludGYoYmlvLCAiJTEyc2EwOjAwXG4iLCAiIikgPD0gMCkgeworICAgICAgICBnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHNrKTsgaSsrKSB7CisgICAgICAgIFg1MDlfQVRUUklCVVRFICphID0gc2tfWDUwOV9BVFRSSUJVVEVfdmFsdWUoc2ssIGkpOworICAgICAgICBBU04xX09CSkVDVCAqYW9iaiA9IFg1MDlfQVRUUklCVVRFX2dldDBfb2JqZWN0KGEpOworCisgICAgICAgIGlmIChYNTA5X1JFUV9leHRlbnNpb25fbmlkKE9CSl9vYmoybmlkKGFvYmopKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEJJT19wcmludGYoYmlvLCAiJTEycyIsICIiKSA8PSAwKSB7CisgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgbnVtX2F0dHJzID0gWDUwOV9BVFRSSUJVVEVfY291bnQoYSk7CisgICAgICAgIGNvbnN0IGludCBvYmpfc3RyX2xlbiA9IGkyYV9BU04xX09CSkVDVChiaW8sIGFvYmopOworICAgICAgICBpZiAob2JqX3N0cl9sZW4gPD0gMCkgeworICAgICAgICAgIGlmIChCSU9fcHV0cyhiaW8sICIoVW5hYmxlIHRvIHByaW50IGF0dHJpYnV0ZSBJRC4pXG4iKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9hdHRyczsgaisrKSB7CisgICAgICAgICAgY29uc3QgQVNOMV9UWVBFICphdCA9IFg1MDlfQVRUUklCVVRFX2dldDBfdHlwZShhLCBqKTsKKyAgICAgICAgICBjb25zdCBpbnQgdHlwZSA9IGF0LT50eXBlOworICAgICAgICAgIEFTTjFfQklUX1NUUklORyAqYnMgPSBhdC0+dmFsdWUuYXNuMV9zdHJpbmc7CisKKyAgICAgICAgICBpbnQgazsKKyAgICAgICAgICBmb3IgKGsgPSAyNSAtIG9ial9zdHJfbGVuOyBrID4gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAoQklPX3dyaXRlKGJpbywgIiAiLCAxKSAhPSAxKSB7CisgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChCSU9fcHV0cyhiaW8sICI6IikgPD0gMCkgeworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKHR5cGUgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORyB8fAorICAgICAgICAgICAgICB0eXBlID09IFZfQVNOMV9VVEY4U1RSSU5HIHx8CisgICAgICAgICAgICAgIHR5cGUgPT0gVl9BU04xX0lBNVNUUklORyB8fAorICAgICAgICAgICAgICB0eXBlID09IFZfQVNOMV9UNjFTVFJJTkcpIHsKKyAgICAgICAgICAgIGlmIChCSU9fd3JpdGUoYmlvLCAoY2hhciAqKWJzLT5kYXRhLCBicy0+bGVuZ3RoKSAhPSBicy0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQklPX3B1dHMoYmlvLCAiXG4iKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQklPX3B1dHMoYmlvLCAidW5hYmxlIHRvIHByaW50IGF0dHJpYnV0ZVxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fRVhURU5TSU9OUykpIHsKKyAgICBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMgPSBYNTA5X1JFUV9nZXRfZXh0ZW5zaW9ucyh4KTsKKyAgICBpZiAoZXh0cykgeworICAgICAgQklPX3ByaW50ZihiaW8sICIlOHNSZXF1ZXN0ZWQgRXh0ZW5zaW9uczpcbiIsICIiKTsKKworICAgICAgc2l6ZV90IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9FWFRFTlNJT05fbnVtKGV4dHMpOyBpKyspIHsKKyAgICAgICAgWDUwOV9FWFRFTlNJT04gKmV4ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaSk7CisgICAgICAgIGlmIChCSU9fcHJpbnRmKGJpbywgIiUxMnMiLCAiIikgPD0gMCkgeworICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIEFTTjFfT0JKRUNUICpvYmogPSBYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KGV4KTsKKyAgICAgICAgaTJhX0FTTjFfT0JKRUNUKGJpbywgb2JqKTsKKyAgICAgICAgY29uc3QgaW50IGlzX2NyaXRpY2FsID0gWDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKGV4KTsKKyAgICAgICAgaWYgKEJJT19wcmludGYoYmlvLCAiOiAlc1xuIiwgaXNfY3JpdGljYWwgPyAiY3JpdGljYWwiIDogIiIpIDw9IDApIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVg1MDlWM19FWFRfcHJpbnQoYmlvLCBleCwgY2ZsYWcsIDE2KSkgeworICAgICAgICAgIEJJT19wcmludGYoYmlvLCAiJTE2cyIsICIiKTsKKyAgICAgICAgICBBU04xX1NUUklOR19wcmludChiaW8sIFg1MDlfRVhURU5TSU9OX2dldF9kYXRhKGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJJT193cml0ZShiaW8sICJcbiIsIDEpIDw9IDApIHsKKyAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2tfWDUwOV9FWFRFTlNJT05fcG9wX2ZyZWUoZXh0cywgWDUwOV9FWFRFTlNJT05fZnJlZSk7CisgICAgfQorICB9CisKKyAgaWYgKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fU0lHRFVNUCkgJiYKKyAgICAgICFYNTA5X3NpZ25hdHVyZV9wcmludChiaW8sIHgtPnNpZ19hbGcsIHgtPnNpZ25hdHVyZSkpIHsKKyAgICBnb3RvIGVycjsKKyAgfQorCisgIHJldHVybiAxOworCitlcnI6CisgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0JVRl9MSUIpOworICByZXR1cm4gMDsKK30KKworaW50IFg1MDlfUkVRX3ByaW50KEJJTyAqYmlvLCBYNTA5X1JFUSAqcmVxKSB7CisgIHJldHVybiBYNTA5X1JFUV9wcmludF9leChiaW8sIHJlcSwgWE5fRkxBR19DT01QQVQsIFg1MDlfRkxBR19DT01QQVQpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3RfeDUwOS5jIGIvc3JjL2NyeXB0by94NTA5L3RfeDUwOS5jCmluZGV4IDJiOWE0MjEuLjc3ODVlYmYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS90X3g1MDkuYworKysgYi9zcmMvY3J5cHRvL3g1MDkvdF94NTA5LmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfcHJpbnRfZXhfZnAsIEVSUl9SX0JVRl9MSUIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9CVUZfTElCKTsKICAgICAgICAgICAgICAgICByZXR1cm4oMCk7CiAJCX0KICAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCWlmICgwKQogCQl7CiBlcnI6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9wcmludCwgRVJSX1JfQlVGX0xJQik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0JVRl9MSUIpOwogCQl9CiAJT1BFTlNTTF9mcmVlKGIpOwogCXJldHVybihyZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfYXR0LmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9hdHQuYwppbmRleCA5MGU3ODEwLi4xNDkxNDg0IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9hdHQuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9hdHQuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIAlpZiAoeCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlhdF9hZGQxX2F0dHIsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CiAJCWdvdG8gZXJyMjsKIAkJfSAKIApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCSp4PXNrOwogCXJldHVybihzayk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOWF0X2FkZDFfYXR0ciwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIGVycjI6CiAJaWYgKG5ld19hdHRyICE9IE5VTEwpIFg1MDlfQVRUUklCVVRFX2ZyZWUobmV3X2F0dHIpOwogCWlmIChzayAhPSBOVUxMKSBza19YNTA5X0FUVFJJQlVURV9mcmVlKHNrKTsKQEAgLTIxNCw3ICsyMTQsNyBAQAogCW9iaj1PQkpfbmlkMm9iaihuaWQpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9OSUQpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAlyZXR1cm4gWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSihhdHRyLG9iaixhdHJ0eXBlLGRhdGEsbGVuKTsKQEAgLTIyOSw3ICsyMjksNyBAQAogCQl7CiAJCWlmICgocmV0PVg1MDlfQVRUUklCVVRFX25ldygpKSA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuKE5VTEwpOwogCQkJfQogCQl9CkBAIC0yNTgsNyArMjU4LDcgQEAKIAlvYmo9T0JKX3R4dDJvYmooYXRybmFtZSwgMCk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQsIFg1MDlfUl9JTlZBTElEX0ZJRUxEX05BTUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIGF0cm5hbWUpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KQEAgLTI4Niw3ICsyODYsNyBAQAogCQlzdG1wID0gQVNOMV9TVFJJTkdfc2V0X2J5X05JRChOVUxMLCBkYXRhLCBsZW4sIGF0dHJ0eXBlLAogCQkJCQkJT0JKX29iajJuaWQoYXR0ci0+b2JqZWN0KSk7CiAJCWlmKCFzdG1wKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0FUVFJJQlVURV9zZXQxX2RhdGEsIEVSUl9SX0FTTjFfTElCKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX0FTTjFfTElCKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWF0eXBlID0gc3RtcC0+dHlwZTsKQEAgLTMxNCw3ICszMTQsNyBAQAogCWlmKCFza19BU04xX1RZUEVfcHVzaChhdHRyLT52YWx1ZS5zZXQsIHR0bXApKSBnb3RvIGVycjsKIAlyZXR1cm4gMTsKIAllcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzgsNyArMzM4LDcgQEAKIAl0dG1wID0gWDUwOV9BVFRSSUJVVEVfZ2V0MF90eXBlKGF0dHIsIGlkeCk7CiAJaWYoIXR0bXApIHJldHVybiBOVUxMOwogCWlmKGF0cnR5cGUgIT0gQVNOMV9UWVBFX2dldCh0dG1wKSl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQVRUUklCVVRFX2dldDBfZGF0YSwgWDUwOV9SX1dST05HX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfV1JPTkdfVFlQRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gdHRtcC0+dmFsdWUucHRyOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfY21wLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwppbmRleCA3MTJlMzZiLi4wZTM1ZjNlIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9jbXAuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwpAQCAtMzMzLDEzICszMzMsMTMgQEAKIAljYXNlIDE6CiAJCWJyZWFrOwogCWNhc2UgMDoKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCk7CiAJCWJyZWFrOwogCWNhc2UgLTE6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfY2hlY2tfcHJpdmF0ZV9rZXksIFg1MDlfUl9LRVlfVFlQRV9NSVNNQVRDSCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9LRVlfVFlQRV9NSVNNQVRDSCk7CiAJCWJyZWFrOwogCWNhc2UgLTI6Ci0JICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfVU5LTk9XTl9LRVlfVFlQRSk7CisJICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9LRVlfVFlQRSk7CiAJCX0KIAlpZiAoeGspCiAJCUVWUF9QS0VZX2ZyZWUoeGspOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfbHUuYyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X2x1LmMKaW5kZXggYTY2MjMwNS4uNmQ3YmMyNiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlfbHUuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9sdS5jCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlvYmo9KFg1MDlfT0JKRUNUICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfT0JKRUNUKSk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfYWRkX2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAkJfQogCW9iai0+dHlwZT1YNTA5X0xVX1g1MDk7CkBAIC0zNTksNyArMzU5LDcgQEAKIAkJewogCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKG9iaik7CiAJCU9QRU5TU0xfZnJlZShvYmopOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jZXJ0LCBYNTA5X1JfQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUpOwogCQlyZXQ9MDsKIAkJfSAKIAllbHNlIHNrX1g1MDlfT0JKRUNUX3B1c2goY3R4LT5vYmpzLCBvYmopOwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJb2JqPShYNTA5X09CSkVDVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X09CSkVDVCkpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX2FkZF9jcmwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAkJfQogCW9iai0+dHlwZT1YNTA5X0xVX0NSTDsKQEAgLTM5Miw3ICszOTIsNyBAQAogCQl7CiAJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMob2JqKTsKIAkJT1BFTlNTTF9mcmVlKG9iaik7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfU1RPUkVfYWRkX2NybCwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKIAkJcmV0PTA7CiAJCX0KIAllbHNlIHNrX1g1MDlfT0JKRUNUX3B1c2goY3R4LT5vYmpzLCBvYmopOwpAQCAtNDEwLDcgKzQxMCw3IEBACiAJCVg1MDlfdXBfcmVmKGEtPmRhdGEueDUwOSk7CiAJCWJyZWFrOwogCWNhc2UgWDUwOV9MVV9DUkw6Ci0JCUNSWVBUT19yZWZjb3VudF9pbmMoJmEtPmRhdGEuY3JsLT5yZWZlcmVuY2VzKTsKKwkJWDUwOV9DUkxfdXBfcmVmKGEtPmRhdGEuY3JsKTsKIAkJYnJlYWs7CiAJCX0KIAl9CkBAIC01NzIsNyArNTcyLDcgQEAKIAkJewogCQlvYmogPSBza19YNTA5X09CSkVDVF92YWx1ZShjdHgtPmN0eC0+b2JqcywgaWR4KTsKIAkJeCA9IG9iai0+ZGF0YS5jcmw7Ci0JCUNSWVBUT19yZWZjb3VudF9pbmMoJngtPnJlZmVyZW5jZXMpOworCQlYNTA5X0NSTF91cF9yZWYoeCk7CiAJCWlmICghc2tfWDUwOV9DUkxfcHVzaChzaywgeCkpCiAJCQl7CiAJCQlDUllQVE9fTVVURVhfdW5sb2NrKCZjdHgtPmN0eC0+b2Jqc19sb2NrKTsKQEAgLTY0MSw3ICs2NDEsNyBAQAogCQlpZiAob2sgPT0gWDUwOV9MVV9SRVRSWSkKIAkJCXsKIAkJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlciwgWDUwOV9SX1NIT1VMRF9SRVRSWSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfU0hPVUxEX1JFVFJZKTsKIAkJCXJldHVybiAtMTsKIAkJCX0KIAkJZWxzZSBpZiAob2sgIT0gWDUwOV9MVV9GQUlMKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDlfb2JqLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9vYmouYwppbmRleCA5MTRlMGRlLi5iNmYwODE2IDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9vYmouYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV9vYmouYwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCSpwID0gJ1wwJzsKIAlyZXR1cm4ocCk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9OQU1FX29uZWxpbmUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJaWYgKGIgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGIpOwogCXJldHVybihOVUxMKTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9yMnguYyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3IyeC5jCmluZGV4IDNjOGU5YzAuLjg1OTc5YWMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3IyeC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3IyeC5jCkBAIC03Miw3ICs3Miw3IEBACiAKIAlpZiAoKHJldD1YNTA5X25ldygpKSA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX3RvX1g1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveDUwOV9yZXEuYyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3JlcS5jCmluZGV4IDI3MzJkNmUuLjAxYzUxMTMgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3JlcS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3JlcS5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJcmV0PVg1MDlfUkVRX25ldygpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3RvX1g1MDlfUkVRLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIApAQCAtMTI4LDI0ICsxMjgsMjQgQEAKIAkJb2s9MTsKIAkJYnJlYWs7CiAJY2FzZSAwOgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JFUV9jaGVja19wcml2YXRlX2tleSwgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCk7CiAJCWJyZWFrOwogCWNhc2UgLTE6Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpOwogCQlicmVhazsKIAljYXNlIC0yOgogCQlpZiAoay0+dHlwZSA9PSBFVlBfUEtFWV9FQykKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBFUlJfUl9FQ19MSUIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfRUNfTElCKTsKIAkJCWJyZWFrOwogCQkJfQogCQlpZiAoay0+dHlwZSA9PSBFVlBfUEtFWV9ESCkKIAkJCXsKIAkJCS8qIE5vIGlkZWEgKi8KLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5LCBYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NBTlRfQ0hFQ0tfREhfS0VZKTsKIAkJCWJyZWFrOwogCQkJfQotCSAgICAgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXksIFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFKTsKKwkgICAgICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFKTsKIAkJfQogCiAJRVZQX1BLRVlfZnJlZSh4ayk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveDUwOV90cnMuYyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3Rycy5jCmluZGV4IDliN2NjOWMuLjgyMGU2MDUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3Rycy5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3Rycy5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIGludCBYNTA5X1RSVVNUX3NldChpbnQgKnQsIGludCB0cnVzdCkKIHsKIAlpZihYNTA5X1RSVVNUX2dldF9ieV9pZCh0cnVzdCkgPT0gLTEpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9zZXQsIFg1MDlfUl9JTlZBTElEX1RSVVNUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lOVkFMSURfVFJVU1QpOwogCQlyZXR1cm4gMDsKIAl9CiAJKnQgPSB0cnVzdDsKQEAgLTE3OSw3ICsxNzksNyBAQAogCS8qIE5lZWQgYSBuZXcgZW50cnkgKi8KIAlpZihpZHggPT0gLTEpIHsKIAkJaWYoISh0cnRtcCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1RSVVNUKSkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJdHJ0bXAtPmZsYWdzID0gWDUwOV9UUlVTVF9EWU5BTUlDOwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJLyogRHVwbGljYXRlIHRoZSBzdXBwbGllZCBuYW1lLiAqLwogCW5hbWVfZHVwID0gQlVGX3N0cmR1cChuYW1lKTsKIAlpZiAobmFtZV9kdXAgPT0gTlVMTCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1RSVVNUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWlmIChpZHggPT0gLTEpCiAJCQlPUEVOU1NMX2ZyZWUodHJ0bXApOwogCQlyZXR1cm4gMDsKQEAgLTIxMCwxMiArMjEwLDEyIEBACiAJLyogSWYgaXRzIGEgbmV3IGVudHJ5IG1hbmFnZSB0aGUgZHluYW1pYyB0YWJsZSAqLwogCWlmKGlkeCA9PSAtMSkgewogCQlpZighdHJ0YWJsZSAmJiAhKHRydGFibGUgPSBza19YNTA5X1RSVVNUX25ldyh0cl9jbXApKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9UUlVTVF9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXRydGFibGVfZnJlZSh0cnRtcCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAoIXNrX1g1MDlfVFJVU1RfcHVzaCh0cnRhYmxlLCB0cnRtcCkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfVFJVU1RfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQl0cnRhYmxlX2ZyZWUodHJ0bXApOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3YzLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOV92My5jCmluZGV4IDBmYzlhOWEuLmIwNDI5ODUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3YzLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlfdjMuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKIAlpZiAoeCA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDl2M19hZGRfZXh0LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOwogCQlnb3RvIGVycjI7CiAJCX0KIApAQCAtMTcxLDcgKzE3MSw3IEBACiAJCSp4PXNrOwogCXJldHVybihzayk7CiBlcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOXYzX2FkZF9leHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiBlcnIyOgogCWlmIChuZXdfZXggIT0gTlVMTCkgWDUwOV9FWFRFTlNJT05fZnJlZShuZXdfZXgpOwogCWlmIChzayAhPSBOVUxMKSBza19YNTA5X0VYVEVOU0lPTl9mcmVlKHNrKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCW9iaj1PQkpfbmlkMm9iaihuaWQpOwogCWlmIChvYmogPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9OSUQpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAlyZXQ9WDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSihleCxvYmosY3JpdCxkYXRhKTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQl7CiAJCWlmICgocmV0PVg1MDlfRVhURU5TSU9OX25ldygpKSA9PSBOVUxMKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuKE5VTEwpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveDUwOV92ZnkuYyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCmluZGV4IGY1M2YyNzkuLjVkODU2ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94NTA5X3ZmeS5jCkBAIC03Miw3ICs3Miw4IEBACiAjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKIAogCi1zdGF0aWMgQ1JZUFRPX0VYX0RBVEFfQ0xBU1MgZ19leF9kYXRhX2NsYXNzID0gQ1JZUFRPX0VYX0RBVEFfQ0xBU1NfSU5JVDsKK3N0YXRpYyBDUllQVE9fRVhfREFUQV9DTEFTUyBnX2V4X2RhdGFfY2xhc3MgPQorCUNSWVBUT19FWF9EQVRBX0NMQVNTX0lOSVRfV0lUSF9BUFBfREFUQTsKIAogLyogQ1JMIHNjb3JlIHZhbHVlcyAqLwogCkBAIC0yMDEsNyArMjAyLDcgQEAKIAlTVEFDS19PRihYNTA5KSAqc2t0bXA9TlVMTDsKIAlpZiAoY3R4LT5jZXJ0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV92ZXJpZnlfY2VydCwgWDUwOV9SX05PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ0VSVF9TRVRfRk9SX1VTX1RPX1ZFUklGWSk7CiAJCXJldHVybiAtMTsKIAkJfQogCkBAIC0yMTQsNyArMjE1LDcgQEAKIAkJaWYgKAkoKGN0eC0+Y2hhaW49c2tfWDUwOV9uZXdfbnVsbCgpKSA9PSBOVUxMKSB8fAogCQkJKCFza19YNTA5X3B1c2goY3R4LT5jaGFpbixjdHgtPmNlcnQpKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZW5kOwogCQkJfQogCQlYNTA5X3VwX3JlZihjdHgtPmNlcnQpOwpAQCAtMjI1LDcgKzIyNiw3IEBACiAJaWYgKGN0eC0+dW50cnVzdGVkICE9IE5VTEwKIAkgICAgJiYgKHNrdG1wPXNrX1g1MDlfZHVwKGN0eC0+dW50cnVzdGVkKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X3ZlcmlmeV9jZXJ0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlbmQ7CiAJCX0KIApAQCAtMjUxLDcgKzI1Miw3IEBACiAJCQl7CiAJCQlvayA9IGN0eC0+Z2V0X2lzc3VlcigmeHRtcCwgY3R4LCB4KTsKIAkJCWlmIChvayA8IDApCi0JCQkJcmV0dXJuIG9rOworCQkJCWdvdG8gZW5kOwogCQkJLyogSWYgc3VjY2Vzc2Z1bCBmb3Igbm93IGZyZWUgdXAgY2VydCBzbyBpdAogCQkJICogd2lsbCBiZSBwaWNrZWQgdXAgYWdhaW4gbGF0ZXIuCiAJCQkgKi8KQEAgLTI3MCwxMCArMjcxLDEwIEBACiAJCQkJewogCQkJCWlmICghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4seHRtcCkpCiAJCQkJCXsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV92ZXJpZnlfY2VydCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJCWdvdG8gZW5kOwogCQkJCQl9Ci0JCQkJQ1JZUFRPX3JlZmNvdW50X2luYygmeHRtcC0+cmVmZXJlbmNlcyk7CisJCQkJWDUwOV91cF9yZWYoeHRtcCk7CiAJCQkJKHZvaWQpc2tfWDUwOV9kZWxldGVfcHRyKHNrdG1wLHh0bXApOwogCQkJCWN0eC0+bGFzdF91bnRydXN0ZWQrKzsKIAkJCQl4PXh0bXA7CkBAIC0zNDksMTUgKzM1MCwxNiBAQAogCiAJCW9rID0gY3R4LT5nZXRfaXNzdWVyKCZ4dG1wLCBjdHgsIHgpOwogCi0JCWlmIChvayA8IDApIHJldHVybiBvazsKKwkJaWYgKG9rIDwgMCkgZ290byBlbmQ7CiAJCWlmIChvayA9PSAwKSBicmVhazsKIAogCQl4ID0geHRtcDsKIAkJaWYgKCFza19YNTA5X3B1c2goY3R4LT5jaGFpbix4KSkKIAkJCXsKIAkJCVg1MDlfZnJlZSh4dG1wKTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfdmVyaWZ5X2NlcnQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKLQkJCXJldHVybiAwOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJb2sgPSAwOworCQkJZ290byBlbmQ7CiAJCQl9CiAJCW51bSsrOwogCQl9CkBAIC05OTAsNyArOTkyLDcgQEAKIAkJKnBpc3N1ZXIgPSBiZXN0X2NybF9pc3N1ZXI7CiAJCSpwc2NvcmUgPSBiZXN0X3Njb3JlOwogCQkqcHJlYXNvbnMgPSBiZXN0X3JlYXNvbnM7Ci0JCUNSWVBUT19yZWZjb3VudF9pbmMoJmJlc3RfY3JsLT5yZWZlcmVuY2VzKTsKKwkJWDUwOV9DUkxfdXBfcmVmKGJlc3RfY3JsKTsKIAkJaWYgKCpwZGNybCkKIAkJCXsKIAkJCVg1MDlfQ1JMX2ZyZWUoKnBkY3JsKTsKQEAgLTEwOTcsNyArMTA5OSw3IEBACiAJCQl7CiAJCQlpZiAoY2hlY2tfY3JsX3RpbWUoY3R4LCBkZWx0YSwgMCkpCiAJCQkJKnBzY29yZSB8PSBDUkxfU0NPUkVfVElNRV9ERUxUQTsKLQkJCUNSWVBUT19yZWZjb3VudF9pbmMoJmRlbHRhLT5yZWZlcmVuY2VzKTsKKwkJCVg1MDlfQ1JMX3VwX3JlZihkZWx0YSk7CiAJCQkqZGNybCA9IGRlbHRhOwogCQkJcmV0dXJuOwogCQkJfQpAQCAtMTYzNCw3ICsxNjM2LDcgQEAKIAkJCQljdHgtPnBhcmFtLT5wb2xpY2llcywgY3R4LT5wYXJhbS0+ZmxhZ3MpOwogCWlmIChyZXQgPT0gMCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBjaGVja19wb2xpY3ksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAkJfQogCS8qIEludmFsaWQgb3IgaW5jb25zaXN0ZW50IGV4dGVuc2lvbnMgKi8KQEAgLTE5ODMsNDQgKzE5ODUsNDQgQEAKIAkvKiBDUkxzIGNhbid0IGJlIGRlbHRhIGFscmVhZHkgKi8KIAlpZiAoYmFzZS0+YmFzZV9jcmxfbnVtYmVyIHx8IG5ld2VyLT5iYXNlX2NybF9udW1iZXIpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfQ1JMX0FMUkVBRFlfREVMVEEpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NSTF9BTFJFQURZX0RFTFRBKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCS8qIEJhc2UgYW5kIG5ldyBDUkwgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLwogCWlmICghYmFzZS0+Y3JsX251bWJlciB8fCAhbmV3ZXItPmNybF9udW1iZXIpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfTk9fQ1JMX05VTUJFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTk9fQ1JMX05VTUJFUik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkvKiBJc3N1ZXIgbmFtZXMgbXVzdCBtYXRjaCAqLwogCWlmIChYNTA5X05BTUVfY21wKFg1MDlfQ1JMX2dldF9pc3N1ZXIoYmFzZSksCiAJCQkJWDUwOV9DUkxfZ2V0X2lzc3VlcihuZXdlcikpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX0lTU1VFUl9NSVNNQVRDSCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfSVNTVUVSX01JU01BVENIKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCS8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCiAJaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGJhc2UsIG5ld2VyLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9BS0lEX01JU01BVENIKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9BS0lEX01JU01BVENIKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCWlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChiYXNlLCBuZXdlciwgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfQ1JMX2RpZmYsIFg1MDlfUl9JRFBfTUlTTUFUQ0gpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lEUF9NSVNNQVRDSCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkvKiBOZXdlciBDUkwgbnVtYmVyIG11c3QgZXhjZWVkIGZ1bGwgQ1JMIG51bWJlciAqLwogCWlmIChBU04xX0lOVEVHRVJfY21wKG5ld2VyLT5jcmxfbnVtYmVyLCBiYXNlLT5jcmxfbnVtYmVyKSA8PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9DUkxfZGlmZiwgWDUwOV9SX05FV0VSX0NSTF9OT1RfTkVXRVIpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX05FV0VSX0NSTF9OT1RfTkVXRVIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJLyogQ1JMcyBtdXN0IHZlcmlmeSAqLwogCWlmIChza2V5ICYmIChYNTA5X0NSTF92ZXJpZnkoYmFzZSwgc2tleSkgPD0gMCB8fAogCQkJWDUwOV9DUkxfdmVyaWZ5KG5ld2VyLCBza2V5KSA8PSAwKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBYNTA5X1JfQ1JMX1ZFUklGWV9GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0NSTF9WRVJJRllfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJLyogQ3JlYXRlIG5ldyBDUkwgKi8KQEAgLTIwODUsNyArMjA4Nyw3IEBACiAJcmV0dXJuIGNybDsKIAogCW1lbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9kaWZmLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWlmIChjcmwpCiAJCVg1MDlfQ1JMX2ZyZWUoY3JsKTsKIAlyZXR1cm4gTlVMTDsKQEAgLTIyMTAsNyArMjIxMiw3IEBACiAJCWlkeCA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQocHVycG9zZSk7CiAJCWlmIChpZHggPT0gLTEpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQsIFg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CkBAIC0yMjE5LDcgKzIyMjEsNyBAQAogCQkJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChkZWZfcHVycG9zZSk7CiAJCQlpZiAoaWR4ID09IC0xKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQsIFg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQpOwogCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCXB0bXAgPSBYNTA5X1BVUlBPU0VfZ2V0MChpZHgpOwpAQCAtMjIzMiw3ICsyMjM0LDcgQEAKIAkJaWR4ID0gWDUwOV9UUlVTVF9nZXRfYnlfaWQodHJ1c3QpOwogCQlpZiAoaWR4ID09IC0xKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0LCBYNTA5X1JfVU5LTk9XTl9UUlVTVF9JRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9UUlVTVF9JRCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMjI0OCw3ICsyMjUwLDcgQEAKIAljdHggPSAoWDUwOV9TVE9SRV9DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9TVE9SRV9DVFgpKTsKIAlpZiAoIWN0eCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1NUT1JFX0NUWF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCW1lbXNldChjdHgsIDAsIHNpemVvZihYNTA5X1NUT1JFX0NUWCkpOwpAQCAtMjM3MSw3ICsyMzczLDcgQEAKIAkJfQogCiAJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9TVE9SRV9DVFhfaW5pdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5Y3NldC5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKaW5kZXggYjUyNmM2OS4uODJkNjFkMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDljc2V0LmMKQEAgLTU3LDYgKzU3LDggQEAKICNpbmNsdWRlIDxvcGVuc3NsL29iai5oPgogI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgogCisjaW5jbHVkZSAiLi4vaW50ZXJuYWwuaCIKKwogCiBpbnQgWDUwOV9DUkxfc2V0X3ZlcnNpb24oWDUwOV9DUkwgKngsIGxvbmcgdmVyc2lvbikKIAl7CkBAIC0xMjgsNiArMTMwLDExIEBACiAJcmV0dXJuIDE7CiAJfQogCit2b2lkIFg1MDlfQ1JMX3VwX3JlZihYNTA5X0NSTCAqY3JsKQorCXsKKwlDUllQVE9fcmVmY291bnRfaW5jKCZjcmwtPnJlZmVyZW5jZXMpOworCX0KKwogaW50IFg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUoWDUwOV9SRVZPS0VEICp4LCBBU04xX1RJTUUgKnRtKQogCXsKIAlBU04xX1RJTUUgKmluOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3g1MDluYW1lLmMgYi9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwppbmRleCAwNDJkMThiLi43YmIzYWExIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveDUwOW5hbWUuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJbmV3X25hbWUtPnNldD1zZXQ7CiAJaWYgKCFza19YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHNrLG5ld19uYW1lLGxvYykpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9OQU1FX2FkZF9lbnRyeSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAJaWYgKGluYykKQEAgLTI3OSw3ICsyNzksNyBAQAogCW9iaj1PQkpfdHh0Mm9iaihmaWVsZCwgMCk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0LCBYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRSk7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBmaWVsZCk7CiAJCXJldHVybihOVUxMKTsKIAkJfQpAQCAtMjk3LDcgKzI5Nyw3IEBACiAJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CiAJaWYgKG9iaiA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfTklELCBYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5LTk9XTl9OSUQpOwogCQlyZXR1cm4oTlVMTCk7CiAJCX0KIAluZW50cnkgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihuZSxvYmosdHlwZSxieXRlcyxsZW4pOwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJewogCWlmICgobmUgPT0gTlVMTCkgfHwgKG9iaiA9PSBOVUxMKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKIAkJcmV0dXJuKDApOwogCQl9CiAJQVNOMV9PQkpFQ1RfZnJlZShuZS0+b2JqZWN0KTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOS94NTA5c3BraS5jIGIvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKaW5kZXggOWJhYjk1Ny4uY2NmOTNlMCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKKysrIGIvc3JjL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKQEAgLTg0LDE1ICs4NCwxNSBAQAogCWlmIChsZW4gPD0gMCkKIAkJbGVuID0gc3RybGVuKHN0cik7CiAJaWYgKCFFVlBfRGVjb2RlZExlbmd0aCgmc3BraV9sZW4sIGxlbikpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlLCBYNTA5X1JfQkFTRTY0X0RFQ09ERV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmICghKHNwa2lfZGVyID0gT1BFTlNTTF9tYWxsb2Moc3BraV9sZW4pKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYgKCFFVlBfRGVjb2RlQmFzZTY0KHNwa2lfZGVyLCAmc3BraV9sZW4sIHNwa2lfbGVuLCAoY29uc3QgdWludDhfdCAqKXN0ciwgbGVuKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUsIFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX0JBU0U2NF9ERUNPREVfRVJST1IpOwogCQlPUEVOU1NMX2ZyZWUoc3BraV9kZXIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMTMsMTggKzExMywxOCBAQAogCWRlcl9sZW4gPSBpMmRfTkVUU0NBUEVfU1BLSShzcGtpLCBOVUxMKTsKIAlpZiAoIUVWUF9FbmNvZGVkTGVuZ3RoKCZiNjRfbGVuLCBkZXJfbGVuKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBORVRTQ0FQRV9TUEtJX2I2NF9lbmNvZGUsIEVSUl9SX09WRVJGTE9XKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfT1ZFUkZMT1cpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCWRlcl9zcGtpID0gT1BFTlNTTF9tYWxsb2MoZGVyX2xlbik7CiAJaWYgKGRlcl9zcGtpID09IE5VTEwpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWI2NF9zdHIgPSBPUEVOU1NMX21hbGxvYyhiNjRfbGVuKTsKIAlpZiAoYjY0X3N0ciA9PSBOVUxMKSB7CiAJCU9QRU5TU0xfZnJlZShkZXJfc3BraSk7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlwID0gZGVyX3Nwa2k7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9hbGwuYyBiL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCmluZGV4IDc4NWZkMWUuLmQ3ZjJkMjkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X2FsbC5jCkBAIC02NCw5ICs2NCw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CiAKIAotZXh0ZXJuIGNvbnN0IEFTTjFfSVRFTSBSU0FQcml2YXRlS2V5X2l0OwotZXh0ZXJuIGNvbnN0IEFTTjFfSVRFTSBSU0FQdWJsaWNLZXlfaXQ7Ci0KIGludCBYNTA5X3ZlcmlmeShYNTA5ICphLCBFVlBfUEtFWSAqcikKIAl7CiAJaWYgKFg1MDlfQUxHT1JfY21wKGEtPnNpZ19hbGcsIGEtPmNlcnRfaW5mby0+c2lnbmF0dXJlKSkKQEAgLTE0NCw2ICsxNDEsMTIgQEAKIAkJeC0+c2lnbmF0dXJlLCB4LT5zcGthYyxwa2V5LG1kKSk7CiAJfQogCitpbnQgTkVUU0NBUEVfU1BLSV92ZXJpZnkoTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiAoQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihORVRTQ0FQRV9TUEtBQyksIHgtPnNpZ19hbGdvciwKKwkJeC0+c2lnbmF0dXJlLCB4LT5zcGthYywgcGtleSkpOworCX0KKwogI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQogWDUwOSAqZDJpX1g1MDlfZnAoRklMRSAqZnAsIFg1MDkgKip4NTA5KQogCXsKQEAgLTIzOSwxNyArMjQyLDE3IEBACiAjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCiBSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKipyc2EpCiAJewotCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCBmcCwgcnNhKTsKKwlyZXR1cm4gQVNOMV9kMmlfZnBfb2YoUlNBLCBSU0FfbmV3LCBkMmlfUlNBUHJpdmF0ZUtleSwgZnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgZnAsIHJzYSk7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mX2NvbnN0KFJTQSwgaTJkX1JTQVByaXZhdGVLZXksIGZwLCByc2EpOwogCX0KIAogUlNBICpkMmlfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKipyc2EpCiAJewotCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGZwLCByc2EpOworCXJldHVybiBBU04xX2QyaV9mcF9vZihSU0EsIFJTQV9uZXcsIGQyaV9SU0FQdWJsaWNLZXksIGZwLCByc2EpOwogCX0KIAogUlNBICpkMmlfUlNBX1BVQktFWV9mcChGSUxFICpmcCwgUlNBICoqcnNhKQpAQCAtMjYxLDcgKzI2NCw3IEBACiAKIGludCBpMmRfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfaXRlbV9pMmRfZnAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgZnAsIHJzYSk7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mX2NvbnN0KFJTQSwgaTJkX1JTQVB1YmxpY0tleSwgZnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQpAQCAtMjcyLDE3ICsyNzUsMTcgQEAKIAogUlNBICpkMmlfUlNBUHJpdmF0ZUtleV9iaW8oQklPICpicCwgUlNBICoqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9pdGVtX2QyaV9iaW8oQVNOMV9JVEVNX3JwdHIoUlNBUHJpdmF0ZUtleSksIGJwLCByc2EpOworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoUlNBLCBSU0FfbmV3LCBkMmlfUlNBUHJpdmF0ZUtleSwgYnAsIHJzYSk7CiAJfQogCiBpbnQgaTJkX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIFJTQSAqcnNhKQogCXsKLQlyZXR1cm4gQVNOMV9pdGVtX2kyZF9iaW8oQVNOMV9JVEVNX3JwdHIoUlNBUHJpdmF0ZUtleSksIGJwLCByc2EpOworCXJldHVybiBBU04xX2kyZF9iaW9fb2ZfY29uc3QoUlNBLCBpMmRfUlNBUHJpdmF0ZUtleSwgYnAsIHJzYSk7CiAJfQogCiBSU0EgKmQyaV9SU0FQdWJsaWNLZXlfYmlvKEJJTyAqYnAsIFJTQSAqKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGJwLCByc2EpOworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoUlNBLCBSU0FfbmV3LCBkMmlfUlNBUHVibGljS2V5LCBicCwgcnNhKTsKIAl9CiAKIApAQCAtMjkzLDcgKzI5Niw3IEBACiAKIGludCBpMmRfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLCBSU0EgKnJzYSkKIAl7Ci0JcmV0dXJuIEFTTjFfaXRlbV9pMmRfYmlvKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGJwLCByc2EpOworCXJldHVybiBBU04xX2kyZF9iaW9fb2ZfY29uc3QoUlNBLCBpMmRfUlNBUHVibGljS2V5LCBicCwgcnNhKTsKIAl9CiAKIGludCBpMmRfUlNBX1BVQktFWV9iaW8oQklPICpicCwgUlNBICpyc2EpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9jcmwuYyBiL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCmluZGV4IDJmNDFiYjEuLmQ1MTY4NzIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X2NybC5jCkBAIC00MDAsNyArNDAwLDcgQEAKIAlpZighaW5mLT5yZXZva2VkKQogCQlpbmYtPnJldm9rZWQgPSBza19YNTA5X1JFVk9LRURfbmV3KFg1MDlfUkVWT0tFRF9jbXApOwogCWlmKCFpbmYtPnJldm9rZWQgfHwgIXNrX1g1MDlfUkVWT0tFRF9wdXNoKGluZi0+cmV2b2tlZCwgcmV2KSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X0NSTF9hZGQwX3Jldm9rZWQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gMDsKIAl9CiAJaW5mLT5lbmMubW9kaWZpZWQgPSAxOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3hfaW5mby5jIGIvc3JjL2NyeXB0by94NTA5L3hfaW5mby5jCmluZGV4IGY5ZTlhYjguLmJlNTc5ZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X2luZm8uYworKysgYi9zcmMvY3J5cHRvL3g1MDkveF9pbmZvLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlyZXQ9KFg1MDlfSU5GTyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X0lORk8pKTsKIAlpZiAocmV0ID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9JTkZPX25ldywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybihOVUxMKTsKIAkJfQogIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5L3hfbmFtZS5jIGIvc3JjL2NyeXB0by94NTA5L3hfbmFtZS5jCmluZGV4IDVjZmIzYWUuLjc2Mjc1NmIgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X25hbWUuYworKysgYi9zcmMvY3J5cHRvL3g1MDkveF9uYW1lLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXJldHVybiAxOwogCiAgbWVtZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHg1MDlfbmFtZV9leF9uZXcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJaWYgKHJldCkKIAkJewogCQlpZiAocmV0LT5lbnRyaWVzKQpAQCAtMjM5LDcgKzIzOSw3IEBACiBlcnI6CiAgICAgICAgIGlmIChubS54ICE9IE5VTEwpCiAJCVg1MDlfTkFNRV9mcmVlKG5tLngpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHg1MDlfbmFtZV9leF9kMmksIEVSUl9SX0FTTjFfTElCKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9BU04xX0xJQik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogbWVtZXJyOgogCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZShpbnRuYW1lLnMsCiAJCQkJCSAgICAgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIHg1MDlfbmFtZV9lbmNvZGUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJcmV0dXJuIC0xOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9wa2V5LmMgYi9zcmMvY3J5cHRvL3g1MDkveF9wa2V5LmMKaW5kZXggNWJjNjQxNS4uZjVlOThiOCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5L3hfcGtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3BrZXkuYwpAQCAtNjksNyArNjksNyBAQAogCVg1MDlfUEtFWSAqcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUEtFWSkpOwogCWlmIChyZXQgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BLRVlfbmV3LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJCX0KIAltZW1zZXQocmV0LCAwLCBzaXplb2YoWDUwOV9QS0VZKSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF9wdWJrZXkuYyBiL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCmluZGV4IGMyZTA4NjMuLmExNmVkY2EgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3B1YmtleS5jCkBAIC0xMDAsMTkgKzEwMCwxOSBAQAogCQkJewogCQkJaWYgKCFwa2V5LT5hbWV0aC0+cHViX2VuY29kZShwaywgcGtleSkpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIFg1MDlfUFVCS0VZX3NldCwgWDUwOV9SX1BVQkxJQ19LRVlfRU5DT0RFX0VSUk9SKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfUFVCTElDX0tFWV9FTkNPREVfRVJST1IpOwogCQkJCWdvdG8gZXJyb3I7CiAJCQkJfQogCQkJfQogCQllbHNlCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9zZXQsIFg1MDlfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOwogCQkJZ290byBlcnJvcjsKIAkJCX0KIAkJfQogCWVsc2UKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9zZXQsIFg1MDlfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKIAkJZ290byBlcnJvcjsKIAkJfQogCkBAIC0xNTEsMTMgKzE1MSwxMyBAQAogCiAJaWYgKChyZXQgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1BVQktFWV9nZXQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycm9yOwogCQl9CiAKIAlpZiAoIUVWUF9QS0VZX3NldF90eXBlKHJldCwgT0JKX29iajJuaWQoa2V5LT5hbGdvci0+YWxnb3JpdGhtKSkpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CiAJCWdvdG8gZXJyb3I7CiAJCX0KIApAQCAtMTY1LDEzICsxNjUsMTMgQEAKIAkJewogCQlpZiAoIXJldC0+YW1ldGgtPnB1Yl9kZWNvZGUocmV0LCBrZXkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9SX1BVQkxJQ19LRVlfREVDT0RFX0VSUk9SKTsKIAkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCX0KIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOSwgWDUwOV9QVUJLRVlfZ2V0LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOwogCQlnb3RvIGVycm9yOwogCQl9CiAKQEAgLTI2Miw3ICsyNjIsNyBAQAogCXBrdG1wID0gRVZQX1BLRVlfbmV3KCk7CiAJaWYgKCFwa3RtcCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBpMmRfUlNBX1BVQktFWSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAwOwogCQl9CiAJRVZQX1BLRVlfc2V0MV9SU0EocGt0bXAsIChSU0EqKSBhKTsKQEAgLTMwMSw3ICszMDEsNyBAQAogCXBrdG1wID0gRVZQX1BLRVlfbmV3KCk7CiAJaWYoIXBrdG1wKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDksIGkyZF9EU0FfUFVCS0VZLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiAwOwogCQl9CiAJRVZQX1BLRVlfc2V0MV9EU0EocGt0bXAsIChEU0EqKSBhKTsKQEAgLTMzOCw3ICszMzgsNyBAQAogCWlmICghYSkJcmV0dXJuKDApOwogCWlmICgocGt0bXAgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBpMmRfRUNfUFVCS0VZLCAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybigwKTsKIAkJfQogCUVWUF9QS0VZX3NldDFfRUNfS0VZKHBrdG1wLCAoRUNfS0VZKikgYSk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDkveF94NTA5YS5jIGIvc3JjL2NyeXB0by94NTA5L3hfeDUwOWEuYwppbmRleCBlMTMyMDRiLi5mYjcxNzJiIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDkveF94NTA5YS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOS94X3g1MDlhLmMKQEAgLTEzMywyNCArMTMzLDQ0IEBACiAKIGludCBYNTA5X2FkZDFfdHJ1c3Rfb2JqZWN0KFg1MDkgKngsIEFTTjFfT0JKRUNUICpvYmopCiB7Ci0JWDUwOV9DRVJUX0FVWCAqYXV4OwotCUFTTjFfT0JKRUNUICpvYmp0bXA7Ci0JaWYoIShvYmp0bXAgPSBPQkpfZHVwKG9iaikpKSByZXR1cm4gMDsKLQlpZighKGF1eCA9IGF1eF9nZXQoeCkpKSByZXR1cm4gMDsKLQlpZighYXV4LT50cnVzdAotCQkmJiAhKGF1eC0+dHJ1c3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIHNrX0FTTjFfT0JKRUNUX3B1c2goYXV4LT50cnVzdCwgb2JqdG1wKTsKKwlBU04xX09CSkVDVCAqb2JqdG1wID0gT0JKX2R1cChvYmopOworCWlmIChvYmp0bXAgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJWDUwOV9DRVJUX0FVWCAqYXV4ID0gYXV4X2dldCh4KTsKKwlpZiAoYXV4LT50cnVzdCA9PSBOVUxMKQorCQl7CisJCWF1eC0+dHJ1c3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpOworCQlpZiAoYXV4LT50cnVzdCA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCX0KKwlpZiAoIXNrX0FTTjFfT0JKRUNUX3B1c2goYXV4LT50cnVzdCwgb2JqdG1wKSkKKwkJZ290byBlcnI7CisJcmV0dXJuIDE7CisKK2VycjoKKwlBU04xX09CSkVDVF9mcmVlKG9ianRtcCk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBYNTA5X2FkZDFfcmVqZWN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQogewotCVg1MDlfQ0VSVF9BVVggKmF1eDsKLQlBU04xX09CSkVDVCAqb2JqdG1wOwotCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7Ci0JaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7Ci0JaWYoIWF1eC0+cmVqZWN0Ci0JCSYmICEoYXV4LT5yZWplY3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIHNrX0FTTjFfT0JKRUNUX3B1c2goYXV4LT5yZWplY3QsIG9ianRtcCk7CisJQVNOMV9PQkpFQ1QgKm9ianRtcCA9IE9CSl9kdXAob2JqKTsKKwlpZiAob2JqdG1wID09IE5VTEwpCisJCWdvdG8gZXJyOworCVg1MDlfQ0VSVF9BVVggKmF1eCA9IGF1eF9nZXQoeCk7CisJaWYgKGF1eC0+cmVqZWN0ID09IE5VTEwpCisJCXsKKwkJYXV4LT5yZWplY3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpOworCQlpZiAoYXV4LT5yZWplY3QgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYgKCFza19BU04xX09CSkVDVF9wdXNoKGF1eC0+cmVqZWN0LCBvYmp0bXApKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMTsKKworZXJyOgorCUFTTjFfT0JKRUNUX2ZyZWUob2JqdG1wKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBYNTA5X3RydXN0X2NsZWFyKFg1MDkgKngpCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My9DTWFrZUxpc3RzLnR4dCBiL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CmluZGV4IGM3ZTYwNTQuLjVjYzFiNDkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL0NNYWtlTGlzdHMudHh0CkBAIC0xLDQgKzEsNCBAQAotaW5jbHVkZV9kaXJlY3RvcmllcyguIC4uIC4uLy4uL2luY2x1ZGUpCitpbmNsdWRlX2RpcmVjdG9yaWVzKC4uLy4uL2luY2x1ZGUpCiAKIGFkZF9saWJyYXJ5KAogICB4NTA5djMKQEAgLTQ2LDcgKzQ2LDcgQEAKIGFkZF9leGVjdXRhYmxlKAogICB2M25hbWVfdGVzdAogCi0gIHYzbmFtZXRlc3QuYworICB2M25hbWVfdGVzdC5jCiAKICAgJDxUQVJHRVRfT0JKRUNUUzp0ZXN0X3N1cHBvcnQ+CiApCkBAIC01Niw3ICs1Niw3IEBACiBhZGRfZXhlY3V0YWJsZSgKICAgdGFiX3Rlc3QKIAotICB0YWJ0ZXN0LmMKKyAgdGFiX3Rlc3QuYwogCiAgICQ8VEFSR0VUX09CSkVDVFM6dGVzdF9zdXBwb3J0PgogKQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdGFidGVzdC5jIGIvc3JjL2NyeXB0by94NTA5djMvdGFiX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NyeXB0by94NTA5djMvdGFidGVzdC5jCnJlbmFtZSB0byBzcmMvY3J5cHRvL3g1MDl2My90YWJfdGVzdC5jCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19ha2V5LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19ha2V5LmMKaW5kZXggZjZlNmI2OS4uOTU3OGE1NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfYWtleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FrZXkuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCQl9CiAJCWVsc2UKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9LRVlJRCwgWDUwOVYzX1JfVU5LTk9XTl9PUFRJT04pOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9VTktOT1dOX09QVElPTik7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgY25mLT5uYW1lKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCXsKIAkJaWYoY3R4ICYmIChjdHgtPmZsYWdzPT1DVFhfVEVTVCkpCiAJCQlyZXR1cm4gQVVUSE9SSVRZX0tFWUlEX25ldygpOwotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfS0VZSUQsIFg1MDlWM19SX05PX0lTU1VFUl9DRVJUSUZJQ0FURSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fSVNTVUVSX0NFUlRJRklDQVRFKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCQlpa2V5aWQgPSBYNTA5VjNfRVhUX2QyaShleHQpOwogCQlpZihrZXlpZD09MiAmJiAhaWtleWlkKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0tFWUlELCBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlEKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJc2VyaWFsID0gTV9BU04xX0lOVEVHRVJfZHVwKFg1MDlfZ2V0X3NlcmlhbE51bWJlcihjZXJ0KSk7CiAJCWlmKCFpc25hbWUgfHwgIXNlcmlhbCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9LRVlJRCwgWDUwOVYzX1JfVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KQEAgLTE5MSw3ICsxOTEsNyBAQAogCQkJfHwgIShnZW4gPSBHRU5FUkFMX05BTUVfbmV3KCkpCiAJCQl8fCAhc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0FVVEhPUklUWV9LRVlJRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJZ2VuLT50eXBlID0gR0VOX0RJUk5BTUU7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19hbHQuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCmluZGV4IGY1NDczMTYuLmU2MzlmNDUgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2FsdC5jCkBAIC0yNTAsNyArMjUwLDcgQEAKIAlDT05GX1ZBTFVFICpjbmY7CiAJc2l6ZV90IGk7CiAJaWYoIShnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX2lzc3Vlcl9hbHQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CkBAIC0yODIsMjEgKzI4MiwyMSBAQAogCXNpemVfdCBqOwogCWlmKGN0eCAmJiAoY3R4LT5mbGFncyA9PSBDVFhfVEVTVCkpIHJldHVybiAxOwogCWlmKCFjdHggfHwgIWN0eC0+aXNzdWVyX2NlcnQpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2lzc3VlciwgWDUwOVYzX1JfTk9fSVNTVUVSX0RFVEFJTFMpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05PX0lTU1VFUl9ERVRBSUxTKTsKIAkJZ290byBlcnI7CiAJfQogICAgICAgICBpID0gWDUwOV9nZXRfZXh0X2J5X05JRChjdHgtPmlzc3Vlcl9jZXJ0LCBOSURfc3ViamVjdF9hbHRfbmFtZSwgLTEpOwogCWlmKGkgPCAwKSByZXR1cm4gMTsKICAgICAgICAgaWYoIShleHQgPSBYNTA5X2dldF9leHQoY3R4LT5pc3N1ZXJfY2VydCwgaSkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAhKGlhbHQgPSBYNTA5VjNfRVhUX2QyaShleHQpKSApIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2lzc3VlciwgWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUik7CiAJCWdvdG8gZXJyOwogCX0KIAogCWZvcihqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCk7IGorKykgewogCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoaWFsdCwgaik7CiAJCWlmKCFza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGNvcHlfaXNzdWVyLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQpAQCAtMzE2LDcgKzMxNiw3IEBACiAJQ09ORl9WQUxVRSAqY25mOwogCXNpemVfdCBpOwogCWlmKCEoZ2VucyA9IHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9zdWJqZWN0X2FsdCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKQEAgLTM1NCw3ICszNTQsNyBAQAogCWlmKGN0eCAhPSBOVUxMICYmIGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpCiAJCXJldHVybiAxOwogCWlmKCFjdHggfHwgKCFjdHgtPnN1YmplY3RfY2VydCAmJiAhY3R4LT5zdWJqZWN0X3JlcSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBYNTA5VjNfUl9OT19TVUJKRUNUX0RFVEFJTFMpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05PX1NVQkpFQ1RfREVUQUlMUyk7CiAJCWdvdG8gZXJyOwogCX0KIAkvKiBGaW5kIHRoZSBzdWJqZWN0IG5hbWUgKi8KQEAgLTM3NCwxNCArMzc0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCWlmKCFlbWFpbCB8fCAhKGdlbiA9IEdFTkVSQUxfTkFNRV9uZXcoKSkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgY29weV9lbWFpbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJfQogCQlnZW4tPmQuaWE1ID0gZW1haWw7CiAJCWVtYWlsID0gTlVMTDsKIAkJZ2VuLT50eXBlID0gR0VOX0VNQUlMOwogCQlpZighc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBjb3B5X2VtYWlsLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWdlbiA9IE5VTEw7CkBAIC00MDUsNyArNDA1LDcgQEAKIAlDT05GX1ZBTFVFICpjbmY7CiAJc2l6ZV90IGk7CiAJaWYoIShnZW5zID0gc2tfR0VORVJBTF9OQU1FX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0dFTkVSQUxfTkFNRVMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CkBAIC00MzQsNyArNDM0LDcgQEAKIAogCWlmKCF2YWx1ZSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX01JU1NJTkdfVkFMVUUpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkJZ2VuID0gR0VORVJBTF9OQU1FX25ldygpOwogCQlpZihnZW4gPT0gTlVMTCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJfQpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJCUFTTjFfT0JKRUNUICpvYmo7CiAJCWlmKCEob2JqID0gT0JKX3R4dDJvYmoodmFsdWUsMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBYNTA5VjNfUl9CQURfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQkFEX09CSkVDVCk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInZhbHVlPSIsIHZhbHVlKTsKIAkJCWdvdG8gZXJyOwogCQkJfQpAQCAtNDc4LDcgKzQ3OCw3IEBACiAJCQlnZW4tPmQuaXAgPSBhMmlfSVBBRERSRVNTKHZhbHVlKTsKIAkJaWYoZ2VuLT5kLmlwID09IE5VTEwpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX0JBRF9JUF9BRERSRVNTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQkFEX0lQX0FERFJFU1MpOwogCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCB2YWx1ZSk7CiAJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCQljYXNlIEdFTl9ESVJOQU1FOgogCQlpZiAoIWRvX2Rpcm5hbWUoZ2VuLCB2YWx1ZSwgY3R4KSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgYTJpX0dFTkVSQUxfTkFNRSwgWDUwOVYzX1JfRElSTkFNRV9FUlJPUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0RJUk5BTUVfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWJyZWFrOwpAQCAtNDk1LDEyICs0OTUsMTIgQEAKIAkJY2FzZSBHRU5fT1RIRVJOQU1FOgogCQlpZiAoIWRvX290aGVybmFtZShnZW4sIHZhbHVlLCBjdHgpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBhMmlfR0VORVJBTF9OQU1FLCBYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCWJyZWFrOwogCQlkZWZhdWx0OgotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC01MTAsNyArNTEwLDcgQEAKIAkJCSAgICAgICFBU04xX1NUUklOR19zZXQoZ2VuLT5kLmlhNSwgKHVuc2lnbmVkIGNoYXIqKXZhbHVlLAogCQkJCQkgICAgICAgc3RybGVuKHZhbHVlKSkpCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGEyaV9HRU5FUkFMX05BTUUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCQl9CiAJCX0KQEAgLTUzOCw3ICs1MzgsNyBAQAogCiAJaWYoIXZhbHVlKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0dFTkVSQUxfTkFNRV9leCwgWDUwOVYzX1JfTUlTU0lOR19WQUxVRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTUlTU0lOR19WQUxVRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQl0eXBlID0gR0VOX09USEVSTkFNRTsKIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfR0VORVJBTF9OQU1FX2V4LCBYNTA5VjNfUl9VTlNVUFBPUlRFRF9PUFRJT04pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOU1VQUE9SVEVEX09QVElPTik7CiAJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibmFtZT0iLCBuYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KQEAgLTYwNCw3ICs2MDQsNyBAQAogCXNrID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgdmFsdWUpOwogCWlmICghc2spCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19kaXJuYW1lLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInNlY3Rpb249IiwgdmFsdWUpOwogCQlYNTA5X05BTUVfZnJlZShubSk7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Jjb25zLmMKaW5kZXggYTEzODFiNC4uNzNlZjIxZSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19iY29ucy5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAlDT05GX1ZBTFVFICp2YWw7CiAJc2l6ZV90IGk7CiAJaWYoIShiY29ucyA9IEJBU0lDX0NPTlNUUkFJTlRTX25ldygpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9CQVNJQ19DT05TVFJBSU5UUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgewpAQCAtMTEzLDcgKzExMyw3IEBACiAJCX0gZWxzZSBpZighc3RyY21wKHZhbC0+bmFtZSwgInBhdGhsZW4iKSkgewogCQkJaWYoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgJmJjb25zLT5wYXRobGVuKSkgZ290byBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9CQVNJQ19DT05TVFJBSU5UUywgWDUwOVYzX1JfSU5WQUxJRF9OQU1FKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OQU1FKTsKIAkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJZ290byBlcnI7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19iaXRzdC5jCmluZGV4IDE1ZTk4NTkuLmUxZTIwODcgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2JpdHN0LmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfYml0c3QuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJc2l6ZV90IGk7CiAJY29uc3QgQklUX1NUUklOR19CSVROQU1FICpibmFtOwogCWlmKCEoYnMgPSBNX0FTTjFfQklUX1NUUklOR19uZXcoKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVNOMV9CSVRfU1RSSU5HLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgewpAQCAtMTIxLDcgKzEyMSw3IEBACiAJCQlpZighc3RyY21wKGJuYW0tPnNuYW1lLCB2YWwtPm5hbWUpIHx8CiAJCQkJIXN0cmNtcChibmFtLT5sbmFtZSwgdmFsLT5uYW1lKSApIHsKIAkJCQlpZighQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoYnMsIGJuYW0tPmJpdG51bSwgMSkpIHsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVNOMV9CSVRfU1RSSU5HLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCQlNX0FTTjFfQklUX1NUUklOR19mcmVlKGJzKTsKIAkJCQkJcmV0dXJuIE5VTEw7CiAJCQkJfQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQl9CiAJCX0KIAkJaWYoIWJuYW0tPmxuYW1lKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BU04xX0JJVF9TVFJJTkcsIFg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCk7CiAJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCU1fQVNOMV9CSVRfU1RSSU5HX2ZyZWUoYnMpOwogCQkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19jb25mLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jb25mLmMKaW5kZXggY2I2NTY5Zi4uZmU3MTU2NiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfY29uZi5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2NvbmYuYwpAQCAtOTIsNyArOTIsNyBAQAogCXJldCA9IGRvX2V4dF9uY29uZihjb25mLCBjdHgsIE9CSl9zbjJuaWQobmFtZSksIGNyaXQsIHZhbHVlKTsKIAlpZiAoIXJldCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19FWFRfbmNvbmYsIFg1MDlWM19SX0VSUk9SX0lOX0VYVEVOU0lPTik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVJST1JfSU5fRVhURU5TSU9OKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsIm5hbWU9IiwgbmFtZSwgIiwgdmFsdWU9IiwgdmFsdWUpOwogCQl9CiAJcmV0dXJuIHJldDsKQEAgLTEyMywxMiArMTIzLDEyIEBACiAJdm9pZCAqZXh0X3N0cnVjOwogCWlmIChleHRfbmlkID09IE5JRF91bmRlZikKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRSk7CiAJCXJldHVybiBOVUxMOwogCQl9CiAJaWYgKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXRfbmlkKGV4dF9uaWQpKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9uY29uZiwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT04pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAkvKiBOb3cgZ2V0IGludGVybmFsIGV4dGVuc2lvbiByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiB0eXBlICovCkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJZWxzZSBudmFsID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOwogCQlpZihza19DT05GX1ZBTFVFX251bShudmFsKSA8PSAwKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX0lOVkFMSURfRVhURU5TSU9OX1NUUklORyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfRVhURU5TSU9OX1NUUklORyk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwgIm5hbWU9IiwgT0JKX25pZDJzbihleHRfbmlkKSwgIixzZWN0aW9uPSIsIHZhbHVlKTsKIAkJCXJldHVybiBOVUxMOwogCQkJfQpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKIAkJewogCQlpZighY3R4LT5kYiB8fCAhY3R4LT5kYl9tZXRoKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX05PX0NPTkZJR19EQVRBQkFTRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05PX0NPTkZJR19EQVRBQkFTRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJaWYoIShleHRfc3RydWMgPSBtZXRob2QtPnIyaShtZXRob2QsIGN0eCwgdmFsdWUpKSkgcmV0dXJuIE5VTEw7CiAJCX0KIAllbHNlCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBkb19leHRfbmNvbmYsIFg1MDlWM19SX0VYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgT0JKX25pZDJzbihleHRfbmlkKSk7CiAJCXJldHVybiBOVUxMOwogCQl9CkBAIC0yMDcsNyArMjA3LDcgQEAKIAlyZXR1cm4gZXh0OwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGRvX2V4dF9pMmQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlyZXR1cm4gTlVMTDsKIAogCX0KQEAgLTIxOCw3ICsyMTgsNyBAQAogCXsKIAljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOwogCWlmICghKG1ldGhvZCA9IFg1MDlWM19FWFRfZ2V0X25pZChleHRfbmlkKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2kyZCwgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT04pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBkb19leHRfaTJkKG1ldGhvZCwgZXh0X25pZCwgY3JpdCwgZXh0X3N0cnVjKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCVg1MDlfRVhURU5TSU9OICpleHRlbnNpb249TlVMTDsKIAlpZiAoIShvYmogPSBPQkpfdHh0Mm9iaihleHQsIDApKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYzX2dlbmVyaWNfZXh0ZW5zaW9uLCBYNTA5VjNfUl9FWFRFTlNJT05fTkFNRV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVhURU5TSU9OX05BTUVfRVJST1IpOwogCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgZXh0KTsKIAkJZ290byBlcnI7CiAJCX0KQEAgLTI4MywxNCArMjgzLDE0IEBACiAKIAlpZiAoZXh0X2RlciA9PSBOVUxMKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjNfZ2VuZXJpY19leHRlbnNpb24sIFg1MDlWM19SX0VYVEVOU0lPTl9WQUxVRV9FUlJPUik7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SKTsKIAkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCB2YWx1ZSk7CiAJCWdvdG8gZXJyOwogCQl9CiAKIAlpZiAoIShvY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYzX2dlbmVyaWNfZXh0ZW5zaW9uLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0zODksNyArMzg5LDcgQEAKIAl7CiAJaWYoIWN0eC0+ZGIgfHwgIWN0eC0+ZGJfbWV0aCB8fCAhY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX2dldF9zdHJpbmcsIFg1MDlWM19SX09QRVJBVElPTl9OT1RfREVGSU5FRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQpAQCAtNDAxLDcgKzQwMSw3IEBACiAJewogCWlmKCFjdHgtPmRiIHx8ICFjdHgtPmRiX21ldGggfHwgIWN0eC0+ZGJfbWV0aC0+Z2V0X3NlY3Rpb24pCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfZ2V0X3NlY3Rpb24sIFg1MDlWM19SX09QRVJBVElPTl9OT1RfREVGSU5FRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKIAkJcmV0dXJuIE5VTEw7CiAJCX0KIAlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc2VjdGlvbikKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jcG9scy5jCmluZGV4IGNiZTU5NmIuLjBiNTg2NzYgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2Nwb2xzLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwpAQCAtMTQ2LDE5ICsxNDYsMTkgQEAKIAlpbnQgaWE1b3JnOwogCXBvbHMgPSBza19QT0xJQ1lJTkZPX25ld19udWxsKCk7CiAJaWYgKHBvbHMgPT0gTlVMTCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJdmFscyA9ICBYNTA5VjNfcGFyc2VfbGlzdCh2YWx1ZSk7CiAJaWYgKHZhbHMgPT0gTlVMTCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBFUlJfUl9YNTA5VjNfTElCKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9YNTA5VjNfTElCKTsKIAkJZ290byBlcnI7CiAJfQogCWlhNW9yZyA9IDA7CiAJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFscyk7IGkrKykgewogCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwogCQlpZihjbmYtPnZhbHVlIHx8ICFjbmYtPm5hbWUgKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9jZXJ0cG9sLCBYNTA5VjNfUl9JTlZBTElEX1BPTElDWV9JREVOVElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUik7CiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQl9CkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xzZWN0OwogCQkJcG9sc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIHBzdHIgKyAxKTsKIAkJCWlmKCFwb2xzZWN0KSB7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CiAKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKQEAgLTE4MCw3ICsxODAsNyBAQAogCQkJaWYoIXBvbCkgZ290byBlcnI7CiAJCX0gZWxzZSB7CiAJCQlpZighKHBvYmogPSBPQkpfdHh0Mm9iaihjbmYtPm5hbWUsIDApKSkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX2NlcnRwb2wsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CiAJCQl9CkBAIC0xODksNyArMTg5LDcgQEAKIAkJfQogCQlpZiAoIXNrX1BPTElDWUlORk9fcHVzaChwb2xzLCBwb2wpKXsKIAkJCVBPTElDWUlORk9fZnJlZShwb2wpOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfY2VydHBvbCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlnb3RvIGVycjsKIAkJfQogCX0KQEAgLTIxNCw3ICsyMTQsNyBAQAogCQlpZighc3RyY21wKGNuZi0+bmFtZSwgInBvbGljeUlkZW50aWZpZXIiKSkgewogCQkJQVNOMV9PQkpFQ1QgKnBvYmo7CiAJCQlpZighKHBvYmogPSBPQkpfdHh0Mm9iaihjbmYtPnZhbHVlLCAwKSkpIHsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHBvbGljeV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJCVg1MDlWM19jb25mX2VycihjbmYpOwogCQkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPKGZvcmspOiBjb25zdCBjb3JyZWN0bmVzcyAqLwogCQkJcXVhbC0+cHF1YWxpZCA9IChBU04xX09CSkVDVCopIE9CSl9uaWQyb2JqKE5JRF9pZF9xdF9jcHMpOwogCQkJaWYgKHF1YWwtPnBxdWFsaWQgPT0gTlVMTCkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCXF1YWwtPmQuY3BzdXJpID0gTV9BU04xX0lBNVNUUklOR19uZXcoKTsKQEAgLTI0MSwxMyArMjQxLDEzIEBACiAJCX0gZWxzZSBpZighbmFtZV9jbXAoY25mLT5uYW1lLCAidXNlck5vdGljZSIpKSB7CiAJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqdW5vdDsKIAkJCWlmKCpjbmYtPnZhbHVlICE9ICdAJykgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0VYUEVDVEVEX0FfU0VDVElPTl9OQU1FKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VYUEVDVEVEX0FfU0VDVElPTl9OQU1FKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KIAkJCXVub3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPnZhbHVlICsgMSk7CiAJCQlpZighdW5vdCkgewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOwogCiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CkBAIC0yNjAsMjEgKzI2MCwyMSBAQAogCQkJaWYoIXNrX1BPTElDWVFVQUxJTkZPX3B1c2gocG9sLT5xdWFsaWZpZXJzLCBxdWFsKSkKIAkJCQkJCQkJIGdvdG8gbWVycjsKIAkJfSBlbHNlIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PUFRJT04pOwogCiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJfQogCWlmKCFwb2wtPnBvbGljeWlkKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIFg1MDlWM19SX05PX1BPTElDWV9JREVOVElGSUVSKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9OT19QT0xJQ1lfSURFTlRJRklFUik7CiAJCWdvdG8gZXJyOwogCX0KIAogCXJldHVybiBwb2w7CiAKIAltZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcG9saWN5X3NlY3Rpb24sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAogCWVycjoKIAlQT0xJQ1lJTkZPX2ZyZWUocG9sKTsKQEAgLTI5Niw3ICsyOTYsNyBAQAogCXF1YWwtPnBxdWFsaWQgPSAoQVNOMV9PQkpFQ1QgKikgT0JKX25pZDJvYmooTklEX2lkX3F0X3Vub3RpY2UpOwogCWlmIChxdWFsLT5wcXVhbGlkID09IE5VTEwpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBub3RpY2Vfc2VjdGlvbiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKIAkJZ290byBlcnI7CiAJCX0KIAlpZighKG5vdCA9IFVTRVJOT1RJQ0VfbmV3KCkpKSBnb3RvIG1lcnI7CkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJCX0gZWxzZSBucmVmID0gbm90LT5ub3RpY2VyZWY7CiAJCQlub3MgPSBYNTA5VjNfcGFyc2VfbGlzdChjbmYtPnZhbHVlKTsKIAkJCWlmKCFub3MgfHwgIXNrX0NPTkZfVkFMVUVfbnVtKG5vcykpIHsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX05VTUJFUlMpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVJTKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJaWYgKCFyZXQpCiAJCQkJZ290byBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBYNTA5VjNfUl9JTlZBTElEX09QVElPTik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKTsKIAkJCVg1MDlWM19jb25mX2VycihjbmYpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTM0NSwxNCArMzQ1LDE0IEBACiAKIAlpZihub3QtPm5vdGljZXJlZiAmJiAKIAkgICAgICAoIW5vdC0+bm90aWNlcmVmLT5ub3RpY2Vub3MgfHwgIW5vdC0+bm90aWNlcmVmLT5vcmdhbml6YXRpb24pKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBYNTA5VjNfUl9ORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUyk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05FRURfT1JHQU5JWkFUSU9OX0FORF9OVU1CRVJTKTsKIAkJCWdvdG8gZXJyOwogCX0KIAogCXJldHVybiBxdWFsOwogCiAJbWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIG5vdGljZV9zZWN0aW9uLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAKIAllcnI6CiAJUE9MSUNZUVVBTElORk9fZnJlZShxdWFsKTsKQEAgLTM2OSw3ICszNjksNyBAQAogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG5vcyk7IGkrKykgewogCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG5vcywgaSk7CiAJCWlmKCEoYWludCA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgY25mLT5uYW1lKSkpIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbnJlZl9ub3MsIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVIpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJaWYoIXNrX0FTTjFfSU5URUdFUl9wdXNoKG5udW1zLCBhaW50KSkgZ290byBtZXJyOwpAQCAtMzc3LDcgKzM3Nyw3IEBACiAJcmV0dXJuIDE7CiAKIAltZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgbnJlZl9ub3MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAogCWVycjoKIAlza19BU04xX0lOVEVHRVJfcG9wX2ZyZWUobm51bXMsIEFTTjFfU1RSSU5HX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfY3JsZC5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfY3JsZC5jCmluZGV4IGU0MWRkNjUuLjM5ODRjMzEgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX2NybGQuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19jcmxkLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQlnbnNlY3QgPSBYNTA5VjNfcGFyc2VfbGlzdChzZWN0KTsKIAlpZiAoIWduc2VjdCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGduYW1lc19mcm9tX3NlY3RuYW1lLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOwogCQlyZXR1cm4gTlVMTDsKIAkJfQogCWdlbnMgPSB2MmlfR0VORVJBTF9OQU1FUyhOVUxMLCBjdHgsIGduc2VjdCk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJZG5zZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT52YWx1ZSk7CiAJCWlmICghZG5zZWN0KQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzZXRfZGlzdF9wb2ludF9uYW1lLCBYNTA5VjNfUl9TRUNUSU9OX05PVF9GT1VORCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5EKTsKIAkJCXJldHVybiAtMTsKIAkJCX0KIAkJcmV0ID0gWDUwOVYzX05BTUVfZnJvbV9zZWN0aW9uKG5tLCBkbnNlY3QsIE1CU1RSSU5HX0FTQyk7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJaWYgKHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShybm0sCiAJCQkJc2tfWDUwOV9OQU1FX0VOVFJZX251bShybm0pIC0gMSktPnNldCkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc2V0X2Rpc3RfcG9pbnRfbmFtZSwgWDUwOVYzX1JfSU5WQUxJRF9NVUxUSVBMRV9SRE5TKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9NVUxUSVBMRV9SRE5TKTsKIAkJCWdvdG8gZXJyOwogCQkJfQogCQl9CkBAIC0xNjEsNyArMTYxLDcgQEAKIAogCWlmICgqcGRwKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc2V0X2Rpc3RfcG9pbnRfbmFtZSwgWDUwOVYzX1JfRElTVFBPSU5UX0FMUkVBRFlfU0VUKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9ESVNUUE9JTlRfQUxSRUFEWV9TRVQpOwogCQlnb3RvIGVycjsKIAkJfQogCkBAIC0zNjIsNyArMzYyLDcgQEAKIAlyZXR1cm4gY3JsZDsKIAogCW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfY3JsZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWVycjoKIAlHRU5FUkFMX05BTUVfZnJlZShnZW4pOwogCUdFTkVSQUxfTkFNRVNfZnJlZShnZW5zKTsKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQkJfQogCQllbHNlCiAJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9pZHAsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5VjNfY29uZl9lcnIoY25mKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogCQkJfQpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJcmV0dXJuIGlkcDsKIAogCW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfaWRwLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJZXJyOgogCUlTU1VJTkdfRElTVF9QT0lOVF9mcmVlKGlkcCk7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19leHRrdS5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfZXh0a3UuYwppbmRleCBmNGI4YWY4Li5kNjRlYjljIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19leHRrdS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2V4dGt1LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXNpemVfdCBpOwogCiAJaWYoIShleHRrdSA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0VYVEVOREVEX0tFWV9VU0FHRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJZWxzZSBleHR2YWwgPSB2YWwtPm5hbWU7CiAJCWlmKCEob2JqdG1wID0gT0JKX3R4dDJvYmooZXh0dmFsLCAwKSkpIHsKIAkJCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKGV4dGt1LCBBU04xX09CSkVDVF9mcmVlKTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX0VYVEVOREVEX0tFWV9VU0FHRSwgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfaWE1LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYwppbmRleCBlYzU3ZTliLi41YTI3MjMzIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pYTUuYwpAQCAtODcsNyArODcsNyBAQAogCWNoYXIgKnRtcDsKIAlpZighaWE1IHx8ICFpYTUtPmxlbmd0aCkgcmV0dXJuIE5VTEw7CiAJaWYoISh0bXAgPSBPUEVOU1NMX21hbGxvYyhpYTUtPmxlbmd0aCArIDEpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGkyc19BU04xX0lBNVNUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW1lbWNweSh0bXAsIGlhNS0+ZGF0YSwgaWE1LT5sZW5ndGgpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiB7CiAJQVNOMV9JQTVTVFJJTkcgKmlhNTsKIAlpZighc3RyKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX0FTTjFfSUE1U1RSSU5HLCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZighKGlhNSA9IE1fQVNOMV9JQTVTVFJJTkdfbmV3KCkpKSBnb3RvIGVycjsKQEAgLTExMSw3ICsxMTEsNyBAQAogCX0KIAlyZXR1cm4gaWE1OwogCWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX0lBNVNUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCXJldHVybiBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19pbmZvLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19pbmZvLmMKaW5kZXggNzU1OGIyZC4uNDc1YzU2ZiAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfaW5mby5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX2luZm8uYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAJCW5sZW4gPSBzdHJsZW4ob2JqdG1wKSArIHN0cmxlbih2dG1wLT5uYW1lKSArIDU7CiAJCW50bXAgPSBPUEVOU1NMX21hbGxvYyhubGVuKTsKIAkJaWYoIW50bXApIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlCVUZfc3RybGNweShudG1wLCBvYmp0bXAsIG5sZW4pOwpAQCAtMTQ4LDE5ICsxNDgsMTkgQEAKIAlpbnQgb2JqbGVuOwogCWNoYXIgKm9ianRtcCwgKnB0bXA7CiAJaWYoIShhaW5mbyA9IHNrX0FDQ0VTU19ERVNDUklQVElPTl9uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CiAJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CiAJCWlmKCEoYWNjID0gQUNDRVNTX0RFU0NSSVBUSU9OX25ldygpKQogCQkJfHwgIXNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKGFpbmZvLCBhY2MpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJcHRtcCA9IHN0cmNocihjbmYtPm5hbWUsICc7Jyk7CiAJCWlmKCFwdG1wKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIFg1MDlWM19SX0lOVkFMSURfU1lOVEFYKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJb2JqbGVuID0gcHRtcCAtIGNuZi0+bmFtZTsKQEAgLTE2OSwxNCArMTY5LDE0IEBACiAJCWlmKCF2MmlfR0VORVJBTF9OQU1FX2V4KGFjYy0+bG9jYXRpb24sIG1ldGhvZCwgY3R4LCAmY3RtcCwgMCkpCiAJCQkJCQkJCSBnb3RvIGVycjsgCiAJCWlmKCEob2JqdG1wID0gT1BFTlNTTF9tYWxsb2Mob2JqbGVuICsgMSkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJc3RybmNweShvYmp0bXAsIGNuZi0+bmFtZSwgb2JqbGVuKTsKIAkJb2JqdG1wW29iamxlbl0gPSAwOwogCQlhY2MtPm1ldGhvZCA9IE9CSl90eHQyb2JqKG9ianRtcCwgMCk7CiAJCWlmKCFhY2MtPm1ldGhvZCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLCBYNTA5VjNfUl9CQURfT0JKRUNUKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQkFEX09CSkVDVCk7CiAJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInZhbHVlPSIsIG9ianRtcCk7CiAJCQlPUEVOU1NMX2ZyZWUob2JqdG1wKTsKIAkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfbGliLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYwppbmRleCBkNGU0ZTc4Li5mOGU1NTMxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19saWIuYwpAQCAtNzgsMTIgKzc4LDEyIEBACiBpbnQgWDUwOVYzX0VYVF9hZGQoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCkKIHsKIAlpZighZXh0X2xpc3QgJiYgIShleHRfbGlzdCA9IHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhleHRfc3RhY2tfY21wKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZXh0X2xpc3RfZnJlZShleHQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYoIXNrX1g1MDlWM19FWFRfTUVUSE9EX3B1c2goZXh0X2xpc3QsIGV4dCkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZXh0X2xpc3RfZnJlZShleHQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMjcsNyArMTI3LDcgQEAKIAkgICAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKmV4dF9tZXRob2QgPSBYNTA5VjNfRVhUX2dldF9uaWQobmlkKTsKIAkgICAgaWYgKGV4dF9tZXRob2QgPT0gTlVMTCkKIAkgICAgewotCQkgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2ZyZWUsIFg1MDlWM19SX0NBTk5PVF9GSU5EX0ZSRUVfRlVOQ1RJT04pOworCQkgICAgT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9DQU5OT1RfRklORF9GUkVFX0ZVTkNUSU9OKTsKIAkJICAgIHJldHVybiAwOwogCSAgICB9CiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkgICAgZXh0X21ldGhvZC0+ZXh0X2ZyZWUoZXh0X2RhdGEpOwogCSAgICBlbHNlCiAJICAgIHsKLQkJICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9mcmVlLCBYNTA5VjNfUl9DQU5OT1RfRklORF9GUkVFX0ZVTkNUSU9OKTsKKwkJICAgIE9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfQ0FOTk9UX0ZJTkRfRlJFRV9GVU5DVElPTik7CiAJCSAgICByZXR1cm4gMDsKIAkgICAgfQogCkBAIC0xNTcsMTEgKzE1NywxMSBAQAogCVg1MDlWM19FWFRfTUVUSE9EICp0bXBleHQ7CiAKIAlpZighKGV4dCA9IFg1MDlWM19FWFRfZ2V0X25pZChuaWRfZnJvbSkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX0VYVF9hZGRfYWxpYXMsIFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYoISh0bXBleHQgPSAoWDUwOVYzX0VYVF9NRVRIT0QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOVYzX0VYVF9NRVRIT0QpKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfRVhUX2FkZF9hbGlhcywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIDA7CiAJfQogCSp0bXBleHQgPSAqZXh0OwpAQCAtMzExLDcgKzMxMSw3IEBACiAJZXh0ID0gWDUwOVYzX0VYVF9pMmQobmlkLCBjcml0LCB2YWx1ZSk7CiAKIAlpZighZXh0KSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX2FkZDFfaTJkLCBYNTA5VjNfUl9FUlJPUl9DUkVBVElOR19FWFRFTlNJT04pOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzMwLDYgKzMzMCw2IEBACiAKIAllcnI6CiAJaWYoIShmbGFncyAmIFg1MDlWM19BRERfU0lMRU5UKSkKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkMV9pMmQsIGVycmNvZGUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGVycmNvZGUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMKaW5kZXggYzQyYTY2NS4uMTlmNWU5NCAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19uY29ucy5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIAkJCX0KIAkJZWxzZQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfTkFNRV9DT05TVFJBSU5UUywgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX1NZTlRBWCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJdHZhbC52YWx1ZSA9IHZhbC0+dmFsdWU7CkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZXR1cm4gbmNvbnM7CiAKIAltZW1lcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfTkFNRV9DT05TVFJBSU5UUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCWVycjoKIAlpZiAobmNvbnMpCiAJCU5BTUVfQ09OU1RSQUlOVFNfZnJlZShuY29ucyk7CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19wY2kuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCmluZGV4IGFhOTM4OTEuLmYxOWEzN2EgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BjaS5jCkBAIC04NywxMyArODcsMTMgQEAKIAkJewogCQlpZiAoKmxhbmd1YWdlKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1BPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJaWYgKCEoKmxhbmd1YWdlID0gT0JKX3R4dDJvYmoodmFsLT52YWx1ZSwgMCkpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTEwMiwxMyArMTAyLDEzIEBACiAJCXsKIAkJaWYgKCpwYXRobGVuKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRCk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSF9BTFJFQURZX0RFRklORUQpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gMDsKIAkJCX0KIAkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsIHBhdGhsZW4pKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIKTsKIAkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJCSpwb2xpY3kgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKIAkJCWlmICghKnBvbGljeSkKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJCXJldHVybiAwOwogCQkJCX0KQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJCQlpZiAoIXRtcF9kYXRhMikgCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xNTYsNyArMTU2LDcgQEAKIAkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLwogCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CiAJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOwotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xNjksNyArMTY5LDcgQEAKIAkJCUJJTyAqYiA9IEJJT19uZXdfZmlsZSh2YWwtPnZhbHVlICsgNSwgInIiKTsKIAkJCWlmICghYikKIAkJCQl7Ci0JCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBwcm9jZXNzX3BjaV92YWx1ZSwgRVJSX1JfQklPX0xJQik7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9CSU9fTElCKTsKIAkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCQlnb3RvIGVycjsKIAkJCQl9CkBAIC0xOTQsNyArMTk0LDcgQEAKIAogCQkJaWYgKG4gPCAwKQogCQkJCXsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9CSU9fTElCKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX0JJT19MSUIpOwogCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOwogCQkJCWdvdG8gZXJyOwogCQkJCX0KQEAgLTIxNywyMCArMjE3LDIwIEBACiAJCQkJLyogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkIHRvbyEgKi8KIAkJCQkoKnBvbGljeSktPmRhdGEgPSBOVUxMOwogCQkJCSgqcG9saWN5KS0+bGVuZ3RoID0gMDsKLQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQkJZ290byBlcnI7CiAJCQkJfQogCQkJfQogCQllbHNlCiAJCQl7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHByb2Nlc3NfcGNpX3ZhbHVlLCBYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KIAkJaWYgKCF0bXBfZGF0YSkKIAkJCXsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcHJvY2Vzc19wY2lfdmFsdWUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTI2Miw3ICsyNjIsNyBAQAogCQlDT05GX1ZBTFVFICpjbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHMsIGkpOwogCQlpZiAoIWNuZi0+bmFtZSB8fCAoKmNuZi0+bmFtZSAhPSAnQCcgJiYgIWNuZi0+dmFsdWUpKQogCQkJewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORyk7CiAJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKIAkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCQlzZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT5uYW1lICsgMSk7CiAJCQlpZiAoIXNlY3QpCiAJCQkJewotCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKKwkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CiAJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CiAJCQkJZ290byBlcnI7CiAJCQkJfQpAQCAtMzAyLDIwICszMDIsMjEgQEAKIAkvKiBMYW5ndWFnZSBpcyBtYW5kYXRvcnkgKi8KIAlpZiAoIWxhbmd1YWdlKQogCQl7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgcjJpX3BjaSwgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CiAJCWdvdG8gZXJyOwogCQl9CiAJbmlkID0gT0JKX29iajJuaWQobGFuZ3VhZ2UpOwogCWlmICgobmlkID09IE5JRF9JbmRlcGVuZGVudCB8fCBuaWQgPT0gTklEX2lkX3BwbF9pbmhlcml0QWxsKSAmJiBwb2xpY3kpCiAJCXsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCByMmlfcGNpLCBYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsCisJCQlYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kpOwogCQlnb3RvIGVycjsKIAkJfQogCiAJcGNpID0gUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9uZXcoKTsKIAlpZiAoIXBjaSkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHIyaV9wY2ksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCWdvdG8gZXJyOwogCQl9CiAKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19wY29ucy5jCmluZGV4IGY4N2M2YTAuLmI3NTIyOTAgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfcGNvbnMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJQ09ORl9WQUxVRSAqdmFsOwogCXNpemVfdCBpOwogCWlmKCEocGNvbnMgPSBQT0xJQ1lfQ09OU1RSQUlOVFNfbmV3KCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX1BPTElDWV9DT05TVFJBSU5UUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgewpAQCAtMTI0LDEzICsxMjQsMTMgQEAKIAkJCWlmKCFYNTA5VjNfZ2V0X3ZhbHVlX2ludCh2YWwsCiAJCQkJJnBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZykpIGdvdG8gZXJyOwogCQl9IGVsc2UgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOworCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlnb3RvIGVycjsKIAkJfQogCX0KIAlpZiAoIXBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZyAmJiAhcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfQ09OU1RSQUlOVFMsIFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTExFR0FMX0VNUFRZX0VYVEVOU0lPTik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3BtYXBzLmMKaW5kZXggZmJjMTY5ZC4uNWI5MDk3NyAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYworKysgYi9zcmMvY3J5cHRvL3g1MDl2My92M19wbWFwcy5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzaXplX3QgaTsKIAogCWlmKCEocG1hcHMgPSBza19QT0xJQ1lfTUFQUElOR19uZXdfbnVsbCgpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfTUFQUElOR1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CiAJCWlmKCF2YWwtPnZhbHVlIHx8ICF2YWwtPm5hbWUpIHsKIAkJCXNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHBtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgdjJpX1BPTElDWV9NQVBQSU5HUywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOwogCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtMTM4LDE0ICsxMzgsMTQgQEAKIAkJb2JqMiA9IE9CSl90eHQyb2JqKHZhbC0+dmFsdWUsIDApOwogCQlpZighb2JqMSB8fCAhb2JqMikgewogCQkJc2tfUE9MSUNZX01BUFBJTkdfcG9wX2ZyZWUocG1hcHMsIFBPTElDWV9NQVBQSU5HX2ZyZWUpOwotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCB2MmlfUE9MSUNZX01BUFBJTkdTLCBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CiAJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCXBtYXAgPSBQT0xJQ1lfTUFQUElOR19uZXcoKTsKIAkJaWYgKCFwbWFwKSB7CiAJCQlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShwbWFwcywgUE9MSUNZX01BUFBJTkdfZnJlZSk7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHYyaV9QT0xJQ1lfTUFQUElOR1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJcG1hcC0+aXNzdWVyRG9tYWluUG9saWN5ID0gb2JqMTsKZGlmZiAtLWdpdCBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3B1cnAuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3B1cnAuYwppbmRleCA4YWU4YTA2Li5mNTNjMGYxIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19wdXJwLmMKKysrIGIvc3JjL2NyeXB0by94NTA5djMvdjNfcHVycC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIGludCBYNTA5X1BVUlBPU0Vfc2V0KGludCAqcCwgaW50IHB1cnBvc2UpCiB7CiAJaWYoWDUwOV9QVVJQT1NFX2dldF9ieV9pZChwdXJwb3NlKSA9PSAtMSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9zZXQsIFg1MDlWM19SX0lOVkFMSURfUFVSUE9TRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9QVVJQT1NFKTsKIAkJcmV0dXJuIDA7CiAJfQogCSpwID0gcHVycG9zZTsKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS8qIE5lZWQgYSBuZXcgZW50cnkgKi8KIAlpZihpZHggPT0gLTEpIHsKIAkJaWYoIShwdG1wID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUFVSUE9TRSkpKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5X1BVUlBPU0VfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCXB0bXAtPmZsYWdzID0gWDUwOV9QVVJQT1NFX0RZTkFNSUM7CkBAIC0yMDEsNyArMjAxLDcgQEAKIAluYW1lX2R1cCA9IEJVRl9zdHJkdXAobmFtZSk7CiAJc25hbWVfZHVwID0gQlVGX3N0cmR1cChzbmFtZSk7CiAJaWYgKG5hbWVfZHVwID09IE5VTEwgfHwgc25hbWVfZHVwID09IE5VTEwpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5X1BVUlBPU0VfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlpZiAobmFtZV9kdXAgIT0gTlVMTCkKIAkJCU9QRU5TU0xfZnJlZShuYW1lX2R1cCk7CiAJCWlmIChzbmFtZV9kdXAgIT0gTlVMTCkKQEAgLTIzMiwxMiArMjMyLDEyIEBACiAJLyogSWYgaXRzIGEgbmV3IGVudHJ5IG1hbmFnZSB0aGUgZHluYW1pYyB0YWJsZSAqLwogCWlmKGlkeCA9PSAtMSkgewogCQlpZigheHB0YWJsZSAmJiAhKHhwdGFibGUgPSBza19YNTA5X1BVUlBPU0VfbmV3KHhwX2NtcCkpKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlfUFVSUE9TRV9hZGQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQkJeHB0YWJsZV9mcmVlKHB0bXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKCFza19YNTA5X1BVUlBPU0VfcHVzaCh4cHRhYmxlLCBwdG1wKSkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5X1BVUlBPU0VfYWRkLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJCXhwdGFibGVfZnJlZShwdG1wKTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19za2V5LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M19za2V5LmMKaW5kZXggNDcxYTFhYi4uZTM5NmYwNSAxMDA2NDQKLS0tIGEvc3JjL2NyeXB0by94NTA5djMvdjNfc2tleS5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYwpAQCAtODYsNyArODYsNyBAQAogCWxvbmcgbGVuZ3RoOwogCiAJaWYoIShvY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHMyaV9BU04xX09DVEVUX1NUUklORywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMTIsMTQgKzExMiwxNCBAQAogCWlmKHN0cmNtcChzdHIsICJoYXNoIikpIHJldHVybiBzMmlfQVNOMV9PQ1RFVF9TVFJJTkcobWV0aG9kLCBjdHgsIHN0cik7CiAKIAlpZighKG9jdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX3NrZXlfaWQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCWlmKGN0eCAmJiAoY3R4LT5mbGFncyA9PSBDVFhfVEVTVCkpIHJldHVybiBvY3Q7CiAKIAlpZighY3R4IHx8ICghY3R4LT5zdWJqZWN0X3JlcSAmJiAhY3R4LT5zdWJqZWN0X2NlcnQpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX3NrZXlfaWQsIFg1MDlWM19SX05PX1BVQkxJQ19LRVkpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX05PX1BVQkxJQ19LRVkpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQAogCWVsc2UgcGsgPSBjdHgtPnN1YmplY3RfY2VydC0+Y2VydF9pbmZvLT5rZXktPnB1YmxpY19rZXk7CiAKIAlpZighcGspIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfc2tleV9pZCwgWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtMTM2LDcgKzEzNiw3IEBACiAJCWdvdG8gZXJyOwogCiAJaWYoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9jdCwgcGtleV9kaWcsIGRpZ2xlbikpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfc2tleV9pZCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJZ290byBlcnI7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jIGIvc3JjL2NyeXB0by94NTA5djMvdjNfc3huZXQuYwppbmRleCBiYjVlMjE0Li40ZGQ1YmZjIDEwMDY0NAotLS0gYS9zcmMvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3N4bmV0LmMKQEAgLTE1OSw3ICsxNTksNyBAQAogewogCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOwogCWlmKCEoaXpvbmUgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHpvbmUpKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9hc2MsIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfRVJST1JfQ09OVkVSVElOR19aT05FKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiBTWE5FVF9hZGRfaWRfSU5URUdFUihwc3gsIGl6b25lLCB1c2VyLCB1c2VybGVuKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogewogCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOwogCWlmKCEoaXpvbmUgPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkgfHwgIUFTTjFfSU5URUdFUl9zZXQoaXpvbmUsIGx6b25lKSkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF91bG9uZywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE5MSwxMiArMTkxLDEyIEBACiAJU1hORVQgKnN4ID0gTlVMTDsKIAlTWE5FVElEICppZCA9IE5VTEw7CiAJaWYoIXBzeCB8fCAhem9uZSB8fCAhdXNlcikgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CiAJCXJldHVybiAwOwogCX0KIAlpZih1c2VybGVuID09IC0xKSB1c2VybGVuID0gc3RybGVuKHVzZXIpOwogCWlmKHVzZXJsZW4gPiA2NCkgewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFNYTkVUX2FkZF9pZF9JTlRFR0VSLCBYNTA5VjNfUl9VU0VSX1RPT19MT05HKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9VU0VSX1RPT19MT05HKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmKCEqcHN4KSB7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJKnBzeCA9IHN4OwogCX0gZWxzZSBzeCA9ICpwc3g7CiAJaWYoU1hORVRfZ2V0X2lkX0lOVEVHRVIoc3gsIHpvbmUpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX0lOVEVHRVIsIFg1MDlWM19SX0RVUExJQ0FURV9aT05FX0lEKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9EVVBMSUNBVEVfWk9ORV9JRCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjE4LDcgKzIxOCw3IEBACiAJcmV0dXJuIDE7CiAJCiAJZXJyOgotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgU1hORVRfYWRkX2lkX0lOVEVHRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlTWE5FVElEX2ZyZWUoaWQpOwogCVNYTkVUX2ZyZWUoc3gpOwogCSpwc3ggPSBOVUxMOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJQVNOMV9JTlRFR0VSICppem9uZSA9IE5VTEw7CiAJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKIAlpZighKGl6b25lID0gczJpX0FTTjFfSU5URUdFUihOVUxMLCB6b25lKSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9nZXRfaWRfYXNjLCBYNTA5VjNfUl9FUlJPUl9DT05WRVJUSU5HX1pPTkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlvY3QgPSBTWE5FVF9nZXRfaWRfSU5URUdFUihzeCwgaXpvbmUpOwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJQVNOMV9JTlRFR0VSICppem9uZSA9IE5VTEw7CiAJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKIAlpZighKGl6b25lID0gTV9BU04xX0lOVEVHRVJfbmV3KCkpIHx8ICFBU04xX0lOVEVHRVJfc2V0KGl6b25lLCBsem9uZSkpIHsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBTWE5FVF9nZXRfaWRfdWxvbmcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJCU1fQVNOMV9JTlRFR0VSX2ZyZWUoaXpvbmUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M191dGwuYyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCmluZGV4IDc3ZmM2NWMuLmFhNjVjNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCisrKyBiL3NyYy9jcnlwdG8veDUwOXYzL3YzX3V0bC5jCkBAIC03MCw2ICs3MCw4IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9vYmouaD4KICNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgogCisjaW5jbHVkZSAiLi4vY29uZi9pbnRlcm5hbC5oIgorCiAKIHN0YXRpYyBjaGFyICpzdHJpcF9zcGFjZXMoY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IHNrX3N0cmNtcChjb25zdCBPUEVOU1NMX1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9TVFJJTkcgKmIpOwpAQCAtOTEsNyArOTMsNyBAQAogCWNoYXIgKnRuYW1lID0gTlVMTCwgKnR2YWx1ZSA9IE5VTEw7CiAJaWYobmFtZSAmJiAhKHRuYW1lID0gQlVGX3N0cmR1cChuYW1lKSkpIGdvdG8gZXJyOwogCWlmKHZhbHVlICYmICEodHZhbHVlID0gQlVGX3N0cmR1cCh2YWx1ZSkpKSBnb3RvIGVycjsKLQlpZighKHZ0bXAgPSAoQ09ORl9WQUxVRSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSkpKSBnb3RvIGVycjsKKwlpZighKHZ0bXAgPSBDT05GX1ZBTFVFX25ldygpKSkgZ290byBlcnI7CiAJaWYoISpleHRsaXN0ICYmICEoKmV4dGxpc3QgPSBza19DT05GX1ZBTFVFX25ld19udWxsKCkpKSBnb3RvIGVycjsKIAl2dG1wLT5zZWN0aW9uID0gTlVMTDsKIAl2dG1wLT5uYW1lID0gdG5hbWU7CkBAIC05OSw3ICsxMDEsNyBAQAogCWlmKCFza19DT05GX1ZBTFVFX3B1c2goKmV4dGxpc3QsIHZ0bXApKSBnb3RvIGVycjsKIAlyZXR1cm4gMTsKIAllcnI6Ci0JT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfYWRkX3ZhbHVlLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJaWYodnRtcCkgT1BFTlNTTF9mcmVlKHZ0bXApOwogCWlmKHRuYW1lKSBPUEVOU1NMX2ZyZWUodG5hbWUpOwogCWlmKHR2YWx1ZSkgT1BFTlNTTF9mcmVlKHR2YWx1ZSk7CkBAIC0xNDUsNyArMTQ3LDcgQEAKIAlpZighYSkgcmV0dXJuIE5VTEw7CiAJaWYoIShibnRtcCA9IEFTTjFfRU5VTUVSQVRFRF90b19CTihhLCBOVUxMKSkgfHwKIAkgICAgIShzdHJ0bXAgPSBCTl9ibjJkZWMoYm50bXApKSApCi0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgaTJzX0FTTjFfRU5VTUVSQVRFRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAlCTl9mcmVlKGJudG1wKTsKIAlyZXR1cm4gc3RydG1wOwogfQpAQCAtMTU3LDcgKzE1OSw3IEBACiAJaWYoIWEpIHJldHVybiBOVUxMOwogCWlmKCEoYm50bXAgPSBBU04xX0lOVEVHRVJfdG9fQk4oYSwgTlVMTCkpIHx8CiAJICAgICEoc3RydG1wID0gQk5fYm4yZGVjKGJudG1wKSkgKQotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIGkyc19BU04xX0lOVEVHRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CiAJQk5fZnJlZShibnRtcCk7CiAJcmV0dXJuIHN0cnRtcDsKIH0KQEAgLTE2OSw3ICsxNzEsNyBAQAogCWludCBpc25lZywgaXNoZXg7CiAJaW50IHJldDsKIAlpZiAoIXZhbHVlKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX0FTTjFfSU5URUdFUiwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOwogCQlyZXR1cm4gMDsKIAl9CiAJYm4gPSBCTl9uZXcoKTsKQEAgLTE4OCw3ICsxOTAsNyBAQAogCiAJaWYgKCFyZXQgfHwgdmFsdWVbcmV0XSkgewogCQlCTl9mcmVlKGJuKTsKLQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBzMmlfQVNOMV9JTlRFR0VSLCBYNTA5VjNfUl9CTl9ERUMyQk5fRVJST1IpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19SX0JOX0RFQzJCTl9FUlJPUik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTk3LDcgKzE5OSw3IEBACiAJYWludCA9IEJOX3RvX0FTTjFfSU5URUdFUihibiwgTlVMTCk7CiAJQk5fZnJlZShibik7CiAJaWYgKCFhaW50KSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgczJpX0FTTjFfSU5URUdFUiwgWDUwOVYzX1JfQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9CTl9UT19BU04xX0lOVEVHRVJfRVJST1IpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGlzbmVnKSBhaW50LT50eXBlIHw9IFZfQVNOMV9ORUc7CkBAIC0yMzIsNyArMjM0LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCWVycjoKLQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19nZXRfdmFsdWVfYm9vbCwgWDUwOVYzX1JfSU5WQUxJRF9CT09MRUFOX1NUUklORyk7CisJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX0JPT0xFQU5fU1RSSU5HKTsKIAlYNTA5VjNfY29uZl9lcnIodmFsdWUpOwogCXJldHVybiAwOwogfQpAQCAtMjY0LDcgKzI2Niw3IEBACiAJbGluZWJ1ZiA9IEJVRl9zdHJkdXAobGluZSk7CiAJaWYgKGxpbmVidWYgPT0gTlVMTCkKIAkJewotCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCQlnb3RvIGVycjsKIAkJfQogCXN0YXRlID0gSERSX05BTUU7CkBAIC0yNzksNyArMjgxLDcgQEAKIAkJCQkqcCA9IDA7CiAJCQkJbnRtcCA9IHN0cmlwX3NwYWNlcyhxKTsKIAkJCQlpZighbnRtcCkgewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBYNTA5VjNfUl9JTlZBTElEX05VTExfTkFNRSk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJcSA9IHAgKyAxOwpAQCAtMjkxLDcgKzI5Myw3IEBACiAJCQkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CiAjZW5kaWYKIAkJCQlpZighbnRtcCkgewotCQkJCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIFg1MDlWM19wYXJzZV9saXN0LCBYNTA5VjNfUl9JTlZBTElEX05VTExfTkFNRSk7CisJCQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKQEAgLTMwNyw3ICszMDksNyBAQAogCQkJCXByaW50ZigiJXNcbiIsIG50bXApOwogI2VuZGlmCiAJCQkJaWYoIXZ0bXApIHsKLQkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKKwkJCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOwogCQkJCQlnb3RvIGVycjsKIAkJCQl9CiAJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCB2dG1wLCAmdmFsdWVzKTsKQEAgLTMyNCw3ICszMjYsNyBAQAogCQlwcmludGYoIiVzPSVzXG4iLCBudG1wLCB2dG1wKTsKICNlbmRpZgogCQlpZighdnRtcCkgewotCQkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfcGFyc2VfbGlzdCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKIAkJCWdvdG8gZXJyOwogCQl9CiAJCVg1MDlWM19hZGRfdmFsdWUobnRtcCwgdnRtcCwgJnZhbHVlcyk7CkBAIC0zMzQsNyArMzM2LDcgQEAKIAkJcHJpbnRmKCIlc1xuIiwgbnRtcCk7CiAjZW5kaWYKIAkJaWYoIW50bXApIHsKLQkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX3BhcnNlX2xpc3QsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOwogCQkJZ290byBlcnI7CiAJCX0KIAkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKQEAgLTM3OSw3ICszODEsNyBAQAogCXN0YXRpYyBjb25zdCBjaGFyIGhleGRpZ1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwogCWlmKCFidWZmZXIgfHwgIWxlbikgcmV0dXJuIE5VTEw7CiAJaWYoISh0bXAgPSBPUEVOU1NMX21hbGxvYyhsZW4gKiAzICsgMSkpKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgaGV4X3RvX3N0cmluZywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXEgPSB0bXA7CkBAIC00MDIsNyArNDA0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpoZXhidWYsICpxOwogCXVuc2lnbmVkIGNoYXIgY2gsIGNsLCAqcDsKIAlpZighc3RyKSB7Ci0JCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UKTsKKwkJT1BFTlNTTF9QVVRfRVJST1IoWDUwOVYzLCBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJaWYoIShoZXhidWYgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oc3RyKSA+PiAxKSkpIGdvdG8gZXJyOwpAQCAtNDExLDcgKzQxMyw3IEBACiAJCWlmKGNoID09ICc6JykgY29udGludWU7CiAJCWNsID0gKnArKzsKIAkJaWYoIWNsKSB7Ci0JCQlPUEVOU1NMX1BVVF9FUlJPUihYNTA5VjMsIHN0cmluZ190b19oZXgsIFg1MDlWM19SX09ERF9OVU1CRVJfT0ZfRElHSVRTKTsKKwkJCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfT0REX05VTUJFUl9PRl9ESUdJVFMpOwogCQkJT1BFTlNTTF9mcmVlKGhleGJ1Zik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtNDM1LDEyICs0MzcsMTIgQEAKIAogCWVycjoKIAlpZihoZXhidWYpIE9QRU5TU0xfZnJlZShoZXhidWYpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOwogCXJldHVybiBOVUxMOwogCiAJYmFkaGV4OgogCU9QRU5TU0xfZnJlZShoZXhidWYpOwotCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgc3RyaW5nX3RvX2hleCwgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCU9QRU5TU0xfUFVUX0VSUk9SKFg1MDlWMywgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOwogCXJldHVybiBOVUxMOwogCiB9CmRpZmYgLS1naXQgYS9zcmMvY3J5cHRvL3g1MDl2My92M25hbWV0ZXN0LmMgYi9zcmMvY3J5cHRvL3g1MDl2My92M25hbWVfdGVzdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY3J5cHRvL3g1MDl2My92M25hbWV0ZXN0LmMKcmVuYW1lIHRvIHNyYy9jcnlwdG8veDUwOXYzL3YzbmFtZV90ZXN0LmMK