ZGlmZiAtLWdpdCBhL0FTU0VNQkxZX0VYQ0VQVElPTiBiL0FTU0VNQkxZX0VYQ0VQVElPTgppbmRleCAwNjViOGQ5Li44YjdhYzFkIDEwMDY0NAotLS0gYS9BU1NFTUJMWV9FWENFUFRJT04KKysrIGIvQVNTRU1CTFlfRVhDRVBUSU9OCkBAIC0xLDI3ICsxLDI3IEBACiAKIE9QRU5KREsgQVNTRU1CTFkgRVhDRVBUSU9OCiAKLVRoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIChPcmFjbGUpIGF0Ci1vcGVuamRrLmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCitUaGUgT3BlbkpESyBzb3VyY2UgY29kZSBtYWRlIGF2YWlsYWJsZSBieSBTdW4gYXQgb3Blbmpkay5qYXZhLm5ldCBhbmQKK29wZW5qZGsuZGV2LmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCiBvbmx5ICgiR1BMMiIpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24uCiAKICAgICBMaW5raW5nIHRoaXMgT3BlbkpESyBDb2RlIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBjb2RlCiAgICAgaXMgbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMKICAgICBhbmQgY29uZGl0aW9ucyBvZiBHUEwyIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KIAotICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIE9yYWNsZSBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKLSAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgT3JhY2xlIGFzIGluZGljYXRlZCBhdAorICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIFN1biBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKKyAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgU3VuIGFzIGluZGljYXRlZCBhdAogICAgIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2xlZ2FsL2V4Y2VwdGlvbi1tb2R1bGVzLTIwMDctMDUtMDguaHRtbAogICAgICgiRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyIpIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKICAgICByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZSBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzLAogICAgIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciBHUEwyLAogICAgIHByb3ZpZGVkIHRoYXQgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgY29udGludWUgdG8gYmUKLSAgICBnb3Zlcm5lZCBieSB0aGUgbGljZW5zZXMgdW5kZXIgd2hpY2ggdGhleSB3ZXJlIG9mZmVyZWQgYnkgT3JhY2xlLgorICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBTdW4uCiAKLUFzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBPcmFjbGUncyBHUEwyIE9wZW5KREsgQ29kZQotdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQKLU9yYWNsZSBjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IE9yYWNsZSBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMgotd2l0aCB0aGUgQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLAotdGhhdCBuZXcgR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMKLWlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCitBcyBzdWNoLCBpdCBhbGxvd3MgbGljZW5zZWVzIGFuZCBzdWJsaWNlbnNlZXMgb2YgU3VuJ3MgR1BMMiBPcGVuSkRLIENvZGUgdG8KK2J1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBpbmNsdWRlcyB0aG9zZSBwb3J0aW9ucyBvZiBuZWNlc3NhcnkgY29kZSB0aGF0IFN1bgorY291bGQgbm90IHByb3ZpZGUgdW5kZXIgR1BMMiAob3IgdGhhdCBTdW4gaGFzIHByb3ZpZGVkIHVuZGVyIEdQTDIgd2l0aCB0aGUKK0NsYXNzcGF0aCBleGNlcHRpb24pLiAgSWYgeW91IG1vZGlmeSBvciBhZGQgdG8gdGhlIE9wZW5KREsgY29kZSwgdGhhdCBuZXcKK0dQTDIgY29kZSBtYXkgc3RpbGwgYmUgY29tYmluZWQgd2l0aCBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIGlmIHRoZQorbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHRoaXMgZXhjZXB0aW9uIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVyLgpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKaW5kZXggOGI0MDBjNy4uYjQwYTBmNCAxMDA2NDQKLS0tIGEvTElDRU5TRQorKysgYi9MSUNFTlNFCkBAIC0zLDcgKzMsNyBAQAogVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQogZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KQEAgLTI4Nyw4ICsyODcsOCBAQAogICAgIG1vcmUgZGV0YWlscy4KIAogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgICAgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9nZW5lcmF0ZWQtY29uZmlndXJlLnNoIGIvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKaW5kZXggYzlkNzQyOS4uZDNkMGNjZCAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKKysrIGIvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKQEAgLTY3OSw5ICs2NzksNiBAQAogQ0ZMQUdTX0pES0xJQgogTUFDT1NYX1ZFUlNJT05fTUlOCiBQQUNLQUdFX1BBVEgKLU5PX0xJRkVUSU1FX0RTRV9DRkxBRwotTk9fREVMRVRFX05VTExfUE9JTlRFUl9DSEVDS1NfQ0ZMQUcKLUNYWFNURF9DWFhGTEFHCiBMRUdBQ1lfRVhUUkFfTERGTEFHUwogTEVHQUNZX0VYVFJBX0NYWEZMQUdTCiBMRUdBQ1lfRVhUUkFfQ0ZMQUdTCkBAIC03NDYsOCArNzQzLDYgQEAKIGFjX2N0X09CSkMKIE9CSkNGTEFHUwogT0JKQwotQ1hYX1ZFUlNJT04KLUNDX1ZFUlNJT04KIGFjX2N0X0NYWAogQ1hYRkxBR1MKIENYWApAQCAtMzY3Nyw3ICszNjcyLDcgQEAKIAogCiAjCi0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zODAwLDE5ICszNzk1LDYgQEAKICMgcXVlc3Rpb25zLgogIwogCi0jIFByZXBhcmUgdGhlIHN5c3RlbSBzbyB0aGF0IFRPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OIGNhbiBiZSBjYWxsZWQuCi0jIE11c3QgaGF2ZSBDQ19WRVJTSU9OX05VTUJFUiBhbmQgQ1hYX1ZFUlNJT05fTlVNQkVSLgotCi0KLSMgQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgY29tcGlsZXIgKEMgYW5kIEMrKykgaXMgb2YgYSBzcGVjaWZpYyB2ZXJzaW9uIG9yCi0jIG5ld2VyLiBUT09MQ0hBSU5fUFJFUEFSRV9GT1JfVkVSU0lPTl9DT01QQVJJU09OUyBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLgotIwotIyBBcmd1bWVudHM6Ci0jICAgJDE6ICAgVGhlIHZlcnNpb24gc3RyaW5nIHRvIGNoZWNrIGFnYWluc3QgdGhlIGZvdW5kIHZlcnNpb24KLSMgICAkMjogICBibG9jayB0byBydW4gaWYgdGhlIGNvbXBpbGVyIGlzIGF0IGxlYXN0IHRoaXMgdmVyc2lvbiAoPj0pCi0jICAgJDM6ICAgYmxvY2sgdG8gcnVuIGlmIHRoZSBjb21waWxlciBpcyBvbGRlciB0aGFuIHRoaXMgdmVyc2lvbiAoPCkKLQotCiAjICQxID0gY29tcGlsZXIgdG8gdGVzdCAoQ0Mgb3IgQ1hYKQogIyAkMiA9IGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgY29tcGlsZXIgKEMgb3IgQysrKQogCkBAIC0zODM2LDIyICszODE4LDEwIEBACiAKIAogCi0jIFRPT0xDSEFJTl9DX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UUyhbQVJHVU1FTlRdLCBbUlVOLUlGLVRSVUVdLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JVTi1JRi1GQUxTRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0aGF0IHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIGFuIGFyZ3VtZW50Ci0KLQotIyBUT09MQ0hBSU5fQ1hYX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UUyhbQVJHVU1FTlRdLCBbUlVOLUlGLVRSVUVdLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUlVOLUlGLUZBTFNFXSkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRoYXQgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyBhbiBhcmd1bWVudAotCi0KICMgVE9PTENIQUlOX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UUyhbQVJHVU1FTlRdLCBbUlVOLUlGLVRSVUVdLAotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSVU4tSUYtRkFMU0VdKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JVTi1JRi1GQUxTRV0pCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0aGF0IHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHN1cHBvcnQgYW4gYXJndW1lbnQKKyMgQ2hlY2sgdGhhdCB0aGUgYyBhbmQgYysrIGNvbXBpbGVycyBzdXBwb3J0IGFuIGFyZ3VtZW50CiAKIAogCkBAIC0zODU5LDggKzM4MjksNiBAQAogIyBTZXR1cCB0aGUgSlRSRUcgcGF0aHMKIAogCi0KLQogIwogIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KQEAgLTM5MTIsNyArMzg4MCw3IEBACiAjQ1VTVE9NX0FVVE9DT05GX0lOQ0xVREUKIAogIyBEbyBub3QgY2hhbmdlIG9yIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUsIGl0IGlzIG5lZWRlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2tzOgotREFURV9XSEVOX0dFTkVSQVRFRD0xNDY4MjA3Nzk1CitEQVRFX1dIRU5fR0VORVJBVEVEPTE0NDkwOTYyNjAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwpAQCAtMjA0MDAsOCArMjAzNjgsNyBAQAogCiAgICAgIyBGaXJzdCBsaW5lIHR5cGljYWxseSBsb29rcyBzb21ldGhpbmcgbGlrZToKICAgICAjIGdjYyAoVWJ1bnR1L0xpbmFybyA0LjUuMi04dWJ1bnR1NCkgNC41LjIKLSAgICBDT01QSUxFUl9WRVJTSU9OPWAkRUNITyAkQ09NUElMRVJfVkVSU0lPTl9URVNUIHwgXAotICAgICAgICAkU0VEIC1lICdzL14uKiBcKFsxLTldXC5bMC05Ll0qXClbXjAtOS5dLiokL1wxLydgCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qIFwoWzEtOV1bMC05Ll0qXCkvXDEvcCJgCiAgICAgQ09NUElMRVJfVkVORE9SPWAkRUNITyAkQ09NUElMRVJfVkVSU0lPTl9URVNUIHwgJFNFRCAtbiAicy9eXCguKlwpIFsxLTldWzAtOS5dKi9cMS9wImAKICAgZmkKICAgIyBUaGlzIHNldHMgQ0NfVkVSU0lPTiBvciBDWFhfVkVSU0lPTi4gKFRoaXMgY29tbWVudCBpcyBhIGdyZXAgbWFya2VyKQpAQCAtMjIwMDIsOCArMjE5NjksNyBAQAogCiAgICAgIyBGaXJzdCBsaW5lIHR5cGljYWxseSBsb29rcyBzb21ldGhpbmcgbGlrZToKICAgICAjIGdjYyAoVWJ1bnR1L0xpbmFybyA0LjUuMi04dWJ1bnR1NCkgNC41LjIKLSAgICBDT01QSUxFUl9WRVJTSU9OPWAkRUNITyAkQ09NUElMRVJfVkVSU0lPTl9URVNUIHwgXAotICAgICAgICAkU0VEIC1lICdzL14uKiBcKFsxLTldXC5bMC05Ll0qXClbXjAtOS5dLiokL1wxLydgCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qIFwoWzEtOV1bMC05Ll0qXCkvXDEvcCJgCiAgICAgQ09NUElMRVJfVkVORE9SPWAkRUNITyAkQ09NUElMRVJfVkVSU0lPTl9URVNUIHwgJFNFRCAtbiAicy9eXCguKlwpIFsxLTldWzAtOS5dKi9cMS9wImAKICAgZmkKICAgIyBUaGlzIHNldHMgQ0NfVkVSU0lPTiBvciBDWFhfVkVSU0lPTi4gKFRoaXMgY29tbWVudCBpcyBhIGdyZXAgbWFya2VyKQpAQCAtMjIyNzQsMzIgKzIyMjQwLDYgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQogCiAKLSAgIyBUaGlzIGlzIHRoZSBjb21waWxlciB2ZXJzaW9uIG51bWJlciBvbiB0aGUgZm9ybSBYLllbLlpdCi0KLQotCi0KLSAgaWYgdGVzdCAieCRDQ19WRVJTSU9OIiAhPSAieCRDWFhfVkVSU0lPTiI7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IEMgYW5kIEMrKyBjb21waWxlciBoYXMgZGlmZmVyZW50IHZlcnNpb24gbnVtYmVycywgJENDX1ZFUlNJT04gdnMgJENYWF9WRVJTSU9OLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDIGFuZCBDKysgY29tcGlsZXIgaGFzIGRpZmZlcmVudCB2ZXJzaW9uIG51bWJlcnMsICRDQ19WRVJTSU9OIHZzICRDWFhfVkVSU0lPTi4iID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBUaGlzIHR5cGljYWxseSBpbmRpY2F0ZXMgYSBicm9rZW4gc2V0dXAsIGFuZCBpcyBub3Qgc3VwcG9ydGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IFRoaXMgdHlwaWNhbGx5IGluZGljYXRlcyBhIGJyb2tlbiBzZXR1cCwgYW5kIGlzIG5vdCBzdXBwb3J0ZWQiID4mMjt9Ci0gIGZpCi0KLSAgIyBXZSBvbmx5IGNoZWNrIENDX1ZFUlNJT04gc2luY2Ugd2UgYXNzdW1lIENYWF9WRVJTSU9OIGlzIGVxdWFsLgotICBpZiAgW1sgIiRDQ19WRVJTSU9OIiA9fiAoLipcLil7M30gXV0gOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBDIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIGhhcyBtb3JlIHRoYW4gdGhyZWUgcGFydHMgKFguWS5aKTogJENDX1ZFUlNJT04uIENvbXBhcmlzb25zIG1pZ2h0IGJlIHdyb25nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBDIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIGhhcyBtb3JlIHRoYW4gdGhyZWUgcGFydHMgKFguWS5aKTogJENDX1ZFUlNJT04uIENvbXBhcmlzb25zIG1pZ2h0IGJlIHdyb25nLiIgPiYyO30KLSAgZmkKLQotICBpZiAgW1sgICIkQ0NfVkVSU0lPTiIgPX4gWzAtOV17Nn0gXV0gOyB0aGVuCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBDIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIGhhcyBhIHBhcnQgbGFyZ2VyIHRoYW4gOTk5OTk6ICRDQ19WRVJTSU9OLiBDb21wYXJpc29ucyBtaWdodCBiZSB3cm9uZy4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogQyBjb21waWxlciB2ZXJzaW9uIG51bWJlciBoYXMgYSBwYXJ0IGxhcmdlciB0aGFuIDk5OTk5OiAkQ0NfVkVSU0lPTi4gQ29tcGFyaXNvbnMgbWlnaHQgYmUgd3JvbmcuIiA+JjI7fQotICBmaQotCi0gIENPTVBBUkFCTEVfQUNUVUFMX1ZFUlNJT049YCRBV0sgLUYuICd7IHByaW50ZigiJTA1ZCUwNWQlMDVkXG4iLCAkMSwgJDIsICQzKSB9JyA8PDwgIiRDQ19WRVJTSU9OImAKLQotCiAgICMjIyBMb2NhdGUgb3RoZXIgdG9vbHMKIAogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhtYWNvc3g7IHRoZW4KQEAgLTI0ODkxLDggKzI0ODMxLDcgQEAKIAogCiAgICAgICBDT01QSUxFUl9UWVBFPUNMCi0gICAgICAjIHNpbGVuY2UgY29weXJpZ2h0IG5vdGljZSBhbmQgb3RoZXIgaGVhZGVycy4KLSAgICAgIENPTU1PTl9DQ1hYRkxBR1M9IiRDT01NT05fQ0NYWEZMQUdTIC1ub2xvZ28iCisgICAgICBDQ1hYRkxBR1M9IiRDQ1hYRkxBR1MgLW5vbG9nbyIKIAogZmkKIApAQCAtMjk3MjUsNTcgKzI5NjY0LDEyIEBACiAgICMKICAgIyBOb3cgc2V0dXAgdGhlIENGTEFHUyBhbmQgTERGTEFHUyBmb3IgdGhlIEpESyBidWlsZC4KICAgIyBMYXRlciB3ZSB3aWxsIGFsc28gaGF2ZSBDRkxBR1MgYW5kIExERkxBR1MgZm9yIHRoZSBob3RzcG90IHN1YnJlcG8gYnVpbGQuCi0gICMgICAgQ0ZMQUdTX0pESyAgICAtIEMgQ29tcGlsZXIgZmxhZ3MKLSAgIyAgICBDWFhGTEFHU19KREsgIC0gQysrIENvbXBpbGVyIGZsYWdzCi0gICMgICAgQ09NTU9OX0NDWFhGTEFHU19KREsgLSBjb21tb24gdG8gQyBhbmQgQysrCiAgICMKICAgY2FzZSAkQ09NUElMRVJfTkFNRSBpbgogICAgIGdjYyApCi0gICAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1MgJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1XIC1XYWxsIC1Xbm8tdW51c2VkIC1Xbm8tcGFyZW50aGVzZXMgXAorICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHUyAkQ0NYWEZMQUdTX0pESyAtVyAtV2FsbCAtV25vLXVudXNlZCAtV25vLXBhcmVudGhlc2VzIFwKICAgICAgIC1waXBlIFwKICAgICAgIC1EX0dOVV9TT1VSQ0UgLURfUkVFTlRSQU5UIC1EX0xBUkdFRklMRTY0X1NPVVJDRSIKLSAgICAgIENYWFNURF9DWFhGTEFHPSItc3RkPWdudSsrOTgiCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIFwiJENYWFNURF9DWFhGTEFHICRDRkxBR1NfV0FSTklOR1NfQVJFX0VSUk9SU1wiIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBDKysgY29tcGlsZXIgc3VwcG9ydHMgXCIkQ1hYU1REX0NYWEZMQUcgJENGTEFHU19XQVJOSU5HU19BUkVfRVJST1JTXCIuLi4gIiA+JjY7IH0KLSAgc3VwcG9ydHM9eWVzCi0KLSAgc2F2ZWRfY3h4ZmxhZ3M9IiRDWFhGTEFHUyIKLSAgQ1hYRkxBR1M9IiRDWFhGTEFHICRDWFhTVERfQ1hYRkxBRyAkQ0ZMQUdTX1dBUk5JTkdTX0FSRV9FUlJPUlMiCi0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotaW50IGk7Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIHN1cHBvcnRzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgQ1hYRkxBR1M9IiRzYXZlZF9jeHhmbGFncyIKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN1cHBvcnRzIiA+JjUKLSRhc19lY2hvICIkc3VwcG9ydHMiID4mNjsgfQotICBpZiB0ZXN0ICJ4JHN1cHBvcnRzIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICA6Ci0gIGVsc2UKLSAgICBDWFhTVERfQ1hYRkxBRz0iIgotICBmaQotCi0gICAgICBDWFhGTEFHU19KREs9IiR7Q1hYRkxBR1NfSkRLfSAke0NYWFNURF9DWFhGTEFHfSIKLQogICAgICAgY2FzZSAkT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0ggaW4KICAgICAgICAgYXJtICkKICAgICAgICAgICAjIG9uIGFybSB3ZSBkb24ndCBwcmV2ZW50IGdjYyB0byBvbWl0IGZyYW1lIHBvaW50ZXIgYnV0IGRvIHByZXZlbnQgc3RyaWN0IGFsaWFzaW5nCkBAIC0yOTc4NSwyMzQgKzI5Njc5LDE2IEBACiAgICAgICAgICAgIyBvbiBwcGMgd2UgZG9uJ3QgcHJldmVudCBnY2MgdG8gb21pdCBmcmFtZSBwb2ludGVyIG5vciBzdHJpY3QtYWxpYXNpbmcKICAgICAgICAgICA7OwogICAgICAgICAqICkKLSAgICAgICAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgorICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgogICAgICAgICAgIENGTEFHU19KREs9IiR7Q0ZMQUdTX0pES30gLWZuby1zdHJpY3QtYWxpYXNpbmciCiAgICAgICAgICAgOzsKICAgICAgIGVzYWMKLQotICBSRUZFUkVOQ0VfVkVSU0lPTj02Ci0KLSAgaWYgIFtbICIkUkVGRVJFTkNFX1ZFUlNJT04iID1+ICguKlwuKXszfSBdXSA7IHRoZW4KLSAgICBhc19mbl9lcnJvciAkPyAiSW50ZXJuYWwgZXJyb3I6IENhbm5vdCBjb21wYXJlIHRvICRSRUZFUkVOQ0VfVkVSU0lPTiwgb25seSB0aHJlZSBwYXJ0cyAoWC5ZLlopIGlzIHN1cHBvcnRlZCIgIiRMSU5FTk8iIDUKLSAgZmkKLQotICBpZiAgW1sgIiRSRUZFUkVOQ0VfVkVSU0lPTiIgPX4gWzAtOV17Nn0gXV0gOyB0aGVuCi0gICAgYXNfZm5fZXJyb3IgJD8gIkludGVybmFsIGVycm9yOiBDYW5ub3QgY29tcGFyZSB0byAkUkVGRVJFTkNFX1ZFUlNJT04sIG9ubHkgcGFydHMgPCA5OTk5OSBpcyBzdXBwb3J0ZWQiICIkTElORU5PIiA1Ci0gIGZpCi0KLSAgIyBWZXJzaW9uIGNvbXBhcmlzb24gbWV0aG9kIGluc3BpcmVkIGJ5IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI0MDY3MjQzCi0gIENPTVBBUkFCTEVfUkVGRVJFTkNFX1ZFUlNJT049YCRBV0sgLUYuICd7IHByaW50ZigiJTA1ZCUwNWQlMDVkXG4iLCAkMSwgJDIsICQzKSB9JyA8PDwgIiRSRUZFUkVOQ0VfVkVSU0lPTiJgCi0KLSAgaWYgdGVzdCAkQ09NUEFSQUJMRV9BQ1RVQUxfVkVSU0lPTiAtZ2UgJENPTVBBUkFCTEVfUkVGRVJFTkNFX1ZFUlNJT04gOyB0aGVuCi0KLSAgIyBUaGVzZSBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIEdDQyA2IGJ1aWxkcyBhcyB1bmRlZmluZWQgYmVoYXZpb3VyIGluIE9wZW5KREsgY29kZQotICAjIHJ1bnMgYWZvdWwgb2YgdGhlIG1vcmUgYWdncmVzc2l2ZSB2ZXJzaW9ucyBvZiB0aGVzZSBvcHRpbWlzYXRpb25zLgotICAjIE5vdGFibHksIHZhbHVlIHJhbmdlIHByb3BhZ2F0aW9uIG5vdyBhc3N1bWVzIHRoYXQgdGhlIHRoaXMgcG9pbnRlciBvZiBDKysKLSAgIyBtZW1iZXIgZnVuY3Rpb25zIGlzIG5vbi1udWxsLgotICBOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBRz0iLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcyIKLQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgXCIkTk9fREVMRVRFX05VTExfUE9JTlRFUl9DSEVDS1NfQ0ZMQUcgLVdlcnJvclwiIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIFwiJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JcIi4uLiAiID4mNjsgfQotICBzdXBwb3J0cz15ZXMKLQotICBzYXZlZF9jZmxhZ3M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAkTk9fREVMRVRFX05VTExfUE9JTlRFUl9DSEVDS1NfQ0ZMQUcgLVdlcnJvciIKLSAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0KLWNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBpOwotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgc3VwcG9ydHM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfZXh0PWNwcAotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLQotICBDRkxBR1M9IiRzYXZlZF9jZmxhZ3MiCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1Ci0kYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCi0gICAgQ19DT01QX1NVUFBPUlRTPSJ5ZXMiCi0gIGVsc2UKLSAgICBDX0NPTVBfU1VQUE9SVFM9Im5vIgotICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIFwiJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JcIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIFwiJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JcIi4uLiAiID4mNjsgfQotICBzdXBwb3J0cz15ZXMKLQotICBzYXZlZF9jeHhmbGFncz0iJENYWEZMQUdTIgotICBDWFhGTEFHUz0iJENYWEZMQUcgJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3IiCi0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotaW50IGk7Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIHN1cHBvcnRzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgQ1hYRkxBR1M9IiRzYXZlZF9jeHhmbGFncyIKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN1cHBvcnRzIiA+JjUKLSRhc19lY2hvICIkc3VwcG9ydHMiID4mNjsgfQotICBpZiB0ZXN0ICJ4JHN1cHBvcnRzIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICBDWFhfQ09NUF9TVVBQT1JUUz0ieWVzIgotICBlbHNlCi0gICAgQ1hYX0NPTVBfU1VQUE9SVFM9Im5vIgotICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBib3RoIGNvbXBpbGVycyBzdXBwb3J0IFwiJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JcIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBib3RoIGNvbXBpbGVycyBzdXBwb3J0IFwiJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JcIi4uLiAiID4mNjsgfQotICBzdXBwb3J0cz1ubwotICBpZiB0ZXN0ICJ4JENfQ09NUF9TVVBQT1JUUyIgPSAieHllcyIgLWEgIngkQ1hYX0NPTVBfU1VQUE9SVFMiID0gInh5ZXMiOyB0aGVuIHN1cHBvcnRzPXllczsgZmkKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN1cHBvcnRzIiA+JjUKLSRhc19lY2hvICIkc3VwcG9ydHMiID4mNjsgfQotICBpZiB0ZXN0ICJ4JHN1cHBvcnRzIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICA6Ci0gIGVsc2UKLSAgICBOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBRz0iIgotICBmaQotCi0KLSAgTk9fTElGRVRJTUVfRFNFX0NGTEFHPSItZm5vLWxpZmV0aW1lLWRzZSIKLQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgXCIkTk9fTElGRVRJTUVfRFNFX0NGTEFHIC1XZXJyb3JcIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBcIiROT19MSUZFVElNRV9EU0VfQ0ZMQUcgLVdlcnJvclwiLi4uICIgPiY2OyB9Ci0gIHN1cHBvcnRzPXllcwotCi0gIHNhdmVkX2NmbGFncz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTICROT19MSUZFVElNRV9EU0VfQ0ZMQUcgLVdlcnJvciIKLSAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0gIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLWludCBpOwotX0FDRU9GCi1pZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6Ci0KLWVsc2UKLSAgc3VwcG9ydHM9bm8KLWZpCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfZXh0PWNwcAotYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKLQotICBDRkxBR1M9IiRzYXZlZF9jZmxhZ3MiCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1Ci0kYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCi0gICAgQ19DT01QX1NVUFBPUlRTPSJ5ZXMiCi0gIGVsc2UKLSAgICBDX0NPTVBfU1VQUE9SVFM9Im5vIgotICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIFwiJE5PX0xJRkVUSU1FX0RTRV9DRkxBRyAtV2Vycm9yXCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyBcIiROT19MSUZFVElNRV9EU0VfQ0ZMQUcgLVdlcnJvclwiLi4uICIgPiY2OyB9Ci0gIHN1cHBvcnRzPXllcwotCi0gIHNhdmVkX2N4eGZsYWdzPSIkQ1hYRkxBR1MiCi0gIENYWEZMQUdTPSIkQ1hYRkxBRyAkTk9fTElGRVRJTUVfRFNFX0NGTEFHIC1XZXJyb3IiCi0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAotLyogZW5kIGNvbmZkZWZzLmguICAqLwotaW50IGk7Ci1fQUNFT0YKLWlmIGFjX2ZuX2N4eF90cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgotCi1lbHNlCi0gIHN1cHBvcnRzPW5vCi1maQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2V4dD1jcHAKLWFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Ci0KLSAgQ1hYRkxBR1M9IiRzYXZlZF9jeHhmbGFncyIKLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN1cHBvcnRzIiA+JjUKLSRhc19lY2hvICIkc3VwcG9ydHMiID4mNjsgfQotICBpZiB0ZXN0ICJ4JHN1cHBvcnRzIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICBDWFhfQ09NUF9TVVBQT1JUUz0ieWVzIgotICBlbHNlCi0gICAgQ1hYX0NPTVBfU1VQUE9SVFM9Im5vIgotICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBib3RoIGNvbXBpbGVycyBzdXBwb3J0IFwiJE5PX0xJRkVUSU1FX0RTRV9DRkxBRyAtV2Vycm9yXCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgYm90aCBjb21waWxlcnMgc3VwcG9ydCBcIiROT19MSUZFVElNRV9EU0VfQ0ZMQUcgLVdlcnJvclwiLi4uICIgPiY2OyB9Ci0gIHN1cHBvcnRzPW5vCi0gIGlmIHRlc3QgIngkQ19DT01QX1NVUFBPUlRTIiA9ICJ4eWVzIiAtYSAieCRDWFhfQ09NUF9TVVBQT1JUUyIgPSAieHllcyI7IHRoZW4gc3VwcG9ydHM9eWVzOyBmaQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkc3VwcG9ydHMiID4mNQotJGFzX2VjaG8gIiRzdXBwb3J0cyIgPiY2OyB9Ci0gIGlmIHRlc3QgIngkc3VwcG9ydHMiID0gInh5ZXMiIDsgdGhlbgotICAgIDoKLSAgZWxzZQotICAgIE5PX0xJRkVUSU1FX0RTRV9DRkxBRz0iIgotICBmaQotCi0gIENGTEFHU19KREs9IiR7Q0ZMQUdTX0pES30gJHtOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBR30gJHtOT19MSUZFVElNRV9EU0VfQ0ZMQUd9IgotCi0KLQotICBlbHNlCi0gICAgOgotICBmaQotCiAgICAgICA7OwogICAgIG9zc2MgKQotICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTICRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFRSQUNJTkcgLURNQUNST19NRU1TWVNfT1BTIC1EQlJFQUtQVFMiCisgICAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTICRDQ1hYRkxBR1NfSkRLIC1EVFJBQ0lORyAtRE1BQ1JPX01FTVNZU19PUFMgLURCUkVBS1BUUyIKICAgICAgIGNhc2UgJE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIGluCiAgICAgICAgIHg4NiApCi0gICAgICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRGNwdUludGVsIC1EaTU4NiAtRCRPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZX0xJQiIKKyAgICAgICAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRGNwdUludGVsIC1EaTU4NiAtRCRPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZX0xJQiIKICAgICAgICAgICBDRkxBR1NfSkRLPSIkQ0ZMQUdTX0pESyAtZXJyb2ZmPUVfQkFEX1BSQUdNQV9QQUNLX1ZBTFVFIgogICAgICAgICAgIDs7CiAgICAgICBlc2FjCkBAIC0zMDAzMSwxNiArMjk3MDcsMTYgQEAKICAgICAgIExERkxBR1NfQ1hYX0pESz0iJExERkxBR1NfQ1hYX0pESyIKICAgICAgIDs7CiAgICAgY2wgKQotICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTICRDT01NT05fQ0NYWEZMQUdTX0pESyAtWmkgLU1EIC1aYzp3Y2hhcl90LSAtVzMgLXdkNDgwMCBcCisgICAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTICRDQ1hYRkxBR1NfSkRLIC1aaSAtTUQgLVpjOndjaGFyX3QtIC1XMyAtd2Q0ODAwIFwKICAgICAgIC1EX1NUQVRJQ19DUFBMSUIgLURfRElTQUJMRV9ERVBSRUNBVEVfU1RBVElDX0NQUExJQiAtRFdJTjMyX0xFQU5fQU5EX01FQU4gXAogICAgICAgLURfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLURfQ1JUX05PTlNURENfTk9fREVQUkVDQVRFIFwKICAgICAgIC1EV0lOMzIgLURJQUwiCiAgICAgICBjYXNlICRPUEVOSkRLX1RBUkdFVF9DUFUgaW4KICAgICAgICAgeDg2ICkKLSAgICAgICAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1EX1g4Nl8gLUR4ODYiCisgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURfWDg2XyAtRHg4NiIKICAgICAgICAgICA7OwogICAgICAgICB4ODZfNjQgKQotICAgICAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURfQU1ENjRfIC1EYW1kNjQiCisgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURfQU1ENjRfIC1EYW1kNjQiCiAgICAgICAgICAgOzsKICAgICAgIGVzYWMKICAgICAgIDs7CkBAIC0zMDA3MCw3ICsyOTc0Niw3IEBACiAgICAgICA7OwogICBlc2FjCiAKLSAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAkQUREX0xQNjQiCisgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLICRBRERfTFA2NCIKIAogICAjIFRoZSBwYWNrYWdlIHBhdGggaXMgdXNlZCBvbmx5IG9uIG1hY29zeD8KICAgUEFDS0FHRV9QQVRIPS9vcHQvbG9jYWwKQEAgLTMwMDgzLDI3ICsyOTc1OSwyNyBAQAogICAgICMgICBOb3RlOiAtRG1hY3JvICAgICAgICAgaXMgdGhlIHNhbWUgYXMgICAgI2RlZmluZSBtYWNybyAxCiAgICAgIyAgICAgICAgIC1EbWFjcm89ICAgICAgICBpcyB0aGUgc2FtZSBhcyAgICAjZGVmaW5lIG1hY3JvCiAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpczsgdGhlbgotICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRF9MSVRUTEVfRU5ESUFOPSIKKyAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX0xJVFRMRV9FTkRJQU49IgogICAgIGVsc2UKLSAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURfTElUVExFX0VORElBTiIKKyAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX0xJVFRMRV9FTkRJQU4iCiAgICAgZmkKICAgZWxzZQotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURfQklHX0VORElBTiIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRF9CSUdfRU5ESUFOIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbgotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURMSU5VWCIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRExJTlVYIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFdJTkRPV1MiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURXSU5ET1dTIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFNPTEFSSVMiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURTT0xBUklTIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhhaXg7IHRoZW4KLSAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1EQUlYIC1EUFBDNjQiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURBSVggLURQUEM2NCIKICAgZmkKICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRE1BQ09TWCAtRF9BTExCU0RfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1ETUFDT1NYIC1EX0FMTEJTRF9TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QiCiAgICAgIyBTZXR0aW5nIHRoZXNlIHBhcmFtZXRlcnMgbWFrZXMgaXQgYW4gZXJyb3IgdG8gbGluayB0byBtYWNvc3ggQVBJcyB0aGF0IGFyZQogICAgICMgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gT1MgdmVyc2lvbiBhbmQgbWFrZXMgdGhlIGxpbmtlZCBiaW5hcmllcyBjb21wYXRpYmxlIGV2ZW4KICAgICAjIGlmIGJ1aWx0IG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgT1MuCkBAIC0zMDExMywyNSArMjk3ODksMjUgQEAKICAgICAjIFRoZSBtYWNybyB0YWtlcyB0aGUgdmVyc2lvbiB3aXRoIG5vIGRvdHMsIGV4OiAxMDcwCiAgICAgIyBMZXQgdGhlIGZsYWdzIHZhcmlhYmxlcyBnZXQgcmVzb2x2ZWQgaW4gbWFrZSBmb3IgZWFzaWVyIG92ZXJyaWRlIG9uIG1ha2UKICAgICAjIGNvbW1hbmQgbGluZS4KLSAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1ETUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRD1cJChzdWJzdCAuLCxcJChNQUNPU1hfVkVSU0lPTl9NSU4pKSAtbW1hY29zeC12ZXJzaW9uLW1pbj1cJChNQUNPU1hfVkVSU0lPTl9NSU4pIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1ETUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRD1cJChzdWJzdCAuLCxcJChNQUNPU1hfVkVSU0lPTl9NSU4pKSAtbW1hY29zeC12ZXJzaW9uLW1pbj1cJChNQUNPU1hfVkVSU0lPTl9NSU4pIgogICAgIExERkxBR1NfSkRLPSIkTERGTEFHU19KREsgLW1tYWNvc3gtdmVyc2lvbi1taW49XCQoTUFDT1NYX1ZFUlNJT05fTUlOKSIKICAgZmkKICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4YnNkOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtREJTRCAtRF9BTExCU0RfU09VUkNFIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EQlNEIC1EX0FMTEJTRF9TT1VSQ0UiCiAgIGZpCiAgIGlmIHRlc3QgIngkREVCVUdfTEVWRUwiID0geHJlbGVhc2U7IHRoZW4KLSAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1ETkRFQlVHIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1ETkRFQlVHIgogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFRSSU1NRUQiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURUUklNTUVEIgogICBmaQogICBlbHNlCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRERFQlVHIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EREVCVUciCiAgIGZpCiAKLSAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtREFSQ0g9J1wiJE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1lcIicgLUQkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWSIKLSAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFJFTEVBU0U9J1wiXCQoUkVMRUFTRSlcIiciCisgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EQVJDSD0nXCIkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWVwiJyAtRCRPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZIgorICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRFJFTEVBU0U9J1wiXCQoUkVMRUFTRSlcIiciCiAKLSAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyBcCisgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIFwKICAgICAgIC1JJHtKREtfT1VUUFVURElSfS9pbmNsdWRlIFwKICAgICAgIC1JJHtKREtfT1VUUFVURElSfS9pbmNsdWRlLyRPUEVOSkRLX1RBUkdFVF9PUyBcCiAgICAgICAtSSR7SkRLX1RPUERJUn0vc3JjL3NoYXJlL2phdmF2bS9leHBvcnQgXApAQCAtMzAxNDAsMTIgKzI5ODE2LDEyIEBACiAgICAgICAtSSR7SkRLX1RPUERJUn0vc3JjLyRPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSL25hdGl2ZS9jb21tb24iCiAKICAgIyBUaGUgc2hhcmVkIGxpYnJhcmllcyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHBpY2ZsYWcuCi0gIENGTEFHU19KREtMSUI9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAkQ0ZMQUdTX0pESyAkUElDRkxBRyAkQ0ZMQUdTX0pES0xJQl9FWFRSQSIKLSAgQ1hYRkxBR1NfSkRLTElCPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgJENYWEZMQUdTX0pESyAkUElDRkxBRyAkQ1hYRkxBR1NfSkRLTElCX0VYVFJBICIKKyAgQ0ZMQUdTX0pES0xJQj0iJENDWFhGTEFHU19KREsgJENGTEFHU19KREsgJFBJQ0ZMQUcgJENGTEFHU19KREtMSUJfRVhUUkEiCisgIENYWEZMQUdTX0pES0xJQj0iJENDWFhGTEFHU19KREsgJENYWEZMQUdTX0pESyAkUElDRkxBRyAkQ1hYRkxBR1NfSkRLTElCX0VYVFJBICIKIAogICAjIEV4ZWN1dGFibGUgZmxhZ3MKLSAgQ0ZMQUdTX0pES0VYRT0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLICRDRkxBR1NfSkRLIgotICBDWFhGTEFHU19KREtFWEU9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAkQ1hYRkxBR1NfSkRLIgorICBDRkxBR1NfSkRLRVhFPSIkQ0NYWEZMQUdTX0pESyAkQ0ZMQUdTX0pESyIKKyAgQ1hYRkxBR1NfSkRLRVhFPSIkQ0NYWEZMQUdTX0pESyAkQ1hYRkxBR1NfSkRLIgogCiAgICMgTm93IHRoaXMgaXMgb2RkLiBUaGUgSkRLIG5hdGl2ZSBsaWJyYXJpZXMgaGF2ZSB0byBsaW5rIGFnYWluc3QgbGlianZtLnNvCiAgICMgT24gMzItYml0IG1hY2hpbmVzIHRoZXJlIGlzIG5vcm1hbGx5IHR3byBkaXN0aW5jdCBsaWJqdm0uc286cywgY2xpZW50IGFuZCBzZXJ2ZXIuCkBAIC0zMDIyOSw2ICsyOTkwNSw3IEBACiAKIAogCisKICAgIyBTb21lIFplcm8gYW5kIFNoYXJrIHNldHRpbmdzLgogICAjIFpFUk9fQVJDSEZMQUcgdGVsbHMgdGhlIGNvbXBpbGVyIHdoaWNoIG1vZGUgdG8gYnVpbGQgZm9yCiAgIGNhc2UgIiR7T1BFTkpES19UQVJHRVRfQ1BVfSIgaW4KQEAgLTMwMjM5LDkgKzI5OTE2LDggQEAKICAgICAgIFpFUk9fQVJDSEZMQUc9IiR7Q09NUElMRVJfVEFSR0VUX0JJVFNfRkxBR30ke09QRU5KREtfVEFSR0VUX0NQVV9CSVRTfSIKICAgZXNhYwogCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBcIiRaRVJPX0FSQ0hGTEFHXCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgXCIkWkVST19BUkNIRkxBR1wiLi4uICIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgY29tcGlsZXIgc3VwcG9ydHMgXCIkWkVST19BUkNIRkxBR1wiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGNvbXBpbGVyIHN1cHBvcnRzIFwiJFpFUk9fQVJDSEZMQUdcIi4uLiAiID4mNjsgfQogICBzdXBwb3J0cz15ZXMKIAogICBzYXZlZF9jZmxhZ3M9IiRDRkxBR1MiCkBAIC0zMDI3MCwxOSArMjk5NDYsNiBAQAogCiAgIENGTEFHUz0iJHNhdmVkX2NmbGFncyIKIAotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHN1cHBvcnRzIiA+JjUKLSRhc19lY2hvICIkc3VwcG9ydHMiID4mNjsgfQotICBpZiB0ZXN0ICJ4JHN1cHBvcnRzIiA9ICJ4eWVzIiA7IHRoZW4KLSAgICBDX0NPTVBfU1VQUE9SVFM9InllcyIKLSAgZWxzZQotICAgIENfQ09NUF9TVVBQT1JUUz0ibm8iCi0gIGZpCi0KLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBDKysgY29tcGlsZXIgc3VwcG9ydHMgXCIkWkVST19BUkNIRkxBR1wiIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBDKysgY29tcGlsZXIgc3VwcG9ydHMgXCIkWkVST19BUkNIRkxBR1wiLi4uICIgPiY2OyB9Ci0gIHN1cHBvcnRzPXllcwotCiAgIHNhdmVkX2N4eGZsYWdzPSIkQ1hYRkxBR1MiCiAgIENYWEZMQUdTPSIkQ1hYRkxBRyAkWkVST19BUkNIRkxBRyIKICAgYWNfZXh0PWNwcApAQCAtMzAzMTIsMjAgKzI5OTc1LDYgQEAKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1CiAkYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KICAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCi0gICAgQ1hYX0NPTVBfU1VQUE9SVFM9InllcyIKLSAgZWxzZQotICAgIENYWF9DT01QX1NVUFBPUlRTPSJubyIKLSAgZmkKLQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgYm90aCBjb21waWxlcnMgc3VwcG9ydCBcIiRaRVJPX0FSQ0hGTEFHXCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgYm90aCBjb21waWxlcnMgc3VwcG9ydCBcIiRaRVJPX0FSQ0hGTEFHXCIuLi4gIiA+JjY7IH0KLSAgc3VwcG9ydHM9bm8KLSAgaWYgdGVzdCAieCRDX0NPTVBfU1VQUE9SVFMiID0gInh5ZXMiIC1hICJ4JENYWF9DT01QX1NVUFBPUlRTIiA9ICJ4eWVzIjsgdGhlbiBzdXBwb3J0cz15ZXM7IGZpCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1Ci0kYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCiAgICAgOgogICBlbHNlCiAgICAgWkVST19BUkNIRkxBRz0iIgpAQCAtMzAzMzYsOSArMjk5ODUsOCBAQAogICAjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIC1tWCAob3IgLXFYIG9uIEFJWCkgZmxhZ3MKICAgIyBTZXQgQ09NUElMRVJfU1VQUE9SVFNfVEFSR0VUX0JJVFNfRkxBRyB0byAndHJ1ZScgaWYgaXQgZG9lcwogCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBcIiR7Q09NUElMRVJfVEFSR0VUX0JJVFNfRkxBR30ke09QRU5KREtfVEFSR0VUX0NQVV9CSVRTfVwiIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIFwiJHtDT01QSUxFUl9UQVJHRVRfQklUU19GTEFHfSR7T1BFTkpES19UQVJHRVRfQ1BVX0JJVFN9XCIuLi4gIiA+JjY7IH0KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBjb21waWxlciBzdXBwb3J0cyBcIiR7Q09NUElMRVJfVEFSR0VUX0JJVFNfRkxBR30ke09QRU5KREtfVEFSR0VUX0NQVV9CSVRTfVwiIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGNvbXBpbGVyIHN1cHBvcnRzIFwiJHtDT01QSUxFUl9UQVJHRVRfQklUU19GTEFHfSR7T1BFTkpES19UQVJHRVRfQ1BVX0JJVFN9XCIuLi4gIiA+JjY7IH0KICAgc3VwcG9ydHM9eWVzCiAKICAgc2F2ZWRfY2ZsYWdzPSIkQ0ZMQUdTIgpAQCAtMzAzNjcsMTkgKzMwMDE1LDYgQEAKIAogICBDRkxBR1M9IiRzYXZlZF9jZmxhZ3MiCiAKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1Ci0kYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCi0gICAgQ19DT01QX1NVUFBPUlRTPSJ5ZXMiCi0gIGVsc2UKLSAgICBDX0NPTVBfU1VQUE9SVFM9Im5vIgotICBmaQotCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB0aGUgQysrIGNvbXBpbGVyIHN1cHBvcnRzIFwiJHtDT01QSUxFUl9UQVJHRVRfQklUU19GTEFHfSR7T1BFTkpES19UQVJHRVRfQ1BVX0JJVFN9XCIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyBcIiR7Q09NUElMRVJfVEFSR0VUX0JJVFNfRkxBR30ke09QRU5KREtfVEFSR0VUX0NQVV9CSVRTfVwiLi4uICIgPiY2OyB9Ci0gIHN1cHBvcnRzPXllcwotCiAgIHNhdmVkX2N4eGZsYWdzPSIkQ1hYRkxBR1MiCiAgIENYWEZMQUdTPSIkQ1hYRkxBRyAke0NPTVBJTEVSX1RBUkdFVF9CSVRTX0ZMQUd9JHtPUEVOSkRLX1RBUkdFVF9DUFVfQklUU30iCiAgIGFjX2V4dD1jcHAKQEAgLTMwNDA5LDIwICszMDA0NCw2IEBACiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkc3VwcG9ydHMiID4mNQogJGFzX2VjaG8gIiRzdXBwb3J0cyIgPiY2OyB9CiAgIGlmIHRlc3QgIngkc3VwcG9ydHMiID0gInh5ZXMiIDsgdGhlbgotICAgIENYWF9DT01QX1NVUFBPUlRTPSJ5ZXMiCi0gIGVsc2UKLSAgICBDWFhfQ09NUF9TVVBQT1JUUz0ibm8iCi0gIGZpCi0KLQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGJvdGggY29tcGlsZXJzIHN1cHBvcnQgXCIke0NPTVBJTEVSX1RBUkdFVF9CSVRTX0ZMQUd9JHtPUEVOSkRLX1RBUkdFVF9DUFVfQklUU31cIiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBpZiBib3RoIGNvbXBpbGVycyBzdXBwb3J0IFwiJHtDT01QSUxFUl9UQVJHRVRfQklUU19GTEFHfSR7T1BFTkpES19UQVJHRVRfQ1BVX0JJVFN9XCIuLi4gIiA+JjY7IH0KLSAgc3VwcG9ydHM9bm8KLSAgaWYgdGVzdCAieCRDX0NPTVBfU1VQUE9SVFMiID0gInh5ZXMiIC1hICJ4JENYWF9DT01QX1NVUFBPUlRTIiA9ICJ4eWVzIjsgdGhlbiBzdXBwb3J0cz15ZXM7IGZpCi0KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRzdXBwb3J0cyIgPiY1Ci0kYXNfZWNobyAiJHN1cHBvcnRzIiA+JjY7IH0KLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCiAgICAgQ09NUElMRVJfU1VQUE9SVFNfVEFSR0VUX0JJVFNfRkxBRz10cnVlCiAgIGVsc2UKICAgICBDT01QSUxFUl9TVVBQT1JUU19UQVJHRVRfQklUU19GTEFHPWZhbHNlCmRpZmYgLS1naXQgYS9jb21tb24vYXV0b2NvbmYvaG90c3BvdC1zcGVjLmdtay5pbiBiL2NvbW1vbi9hdXRvY29uZi9ob3RzcG90LXNwZWMuZ21rLmluCmluZGV4IDgxNDZmZTUuLjY1ZDE0ZGMgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRvY29uZi9ob3RzcG90LXNwZWMuZ21rLmluCisrKyBiL2NvbW1vbi9hdXRvY29uZi9ob3RzcG90LXNwZWMuZ21rLmluCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTA5LDggKzEwOSw3IEBACiBNVDo9QEhPVFNQT1RfTVRACiBSQzo9QEhPVFNQT1RfUkNACiAKLUVYVFJBX0NGTEFHUz1ATEVHQUNZX0VYVFJBX0NGTEFHU0AgJChOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBRykgXAotCQkJCSAgICQoTk9fTElGRVRJTUVfRFNFX0NGTEFHKSAkKENYWFNURF9DWFhGTEFHKQorRVhUUkFfQ0ZMQUdTPUBMRUdBQ1lfRVhUUkFfQ0ZMQUdTQAogRVhUUkFfQ1hYRkxBR1M9QExFR0FDWV9FWFRSQV9DWFhGTEFHU0AKIEVYVFJBX0xERkxBR1M9QExFR0FDWV9FWFRSQV9MREZMQUdTQAogCmRpZmYgLS1naXQgYS9jb21tb24vYXV0b2NvbmYvc3BlYy5nbWsuaW4gYi9jb21tb24vYXV0b2NvbmYvc3BlYy5nbWsuaW4KaW5kZXggMWM0MThmMi4uZWQzZWY4YiAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL3NwZWMuZ21rLmluCisrKyBiL2NvbW1vbi9hdXRvY29uZi9zcGVjLmdtay5pbgpAQCAtMzMxLDEwICszMzEsNiBAQAogQ0ZMQUdTX0pES0VYRTo9QENGTEFHU19KREtFWEVACiBDWFhGTEFHU19KREtFWEU6PUBDWFhGTEFHU19KREtFWEVACiAKLU5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHPUBOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBR0AKLU5PX0xJRkVUSU1FX0RTRV9DRkxBRz1ATk9fTElGRVRJTUVfRFNFX0NGTEFHQAotQ1hYU1REX0NYWEZMQUc9QENYWFNURF9DWFhGTEFHQAotCiBDWFg6PUBGSVhQQVRIQCBAQ0NBQ0hFQCBAQ1hYQAogI0NYWEZMQUdTOj1AQ1hYRkxBR1NACiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi90b29sY2hhaW4ubTQgYi9jb21tb24vYXV0b2NvbmYvdG9vbGNoYWluLm00CmluZGV4IDFhZjhmYTMuLjQ0Y2VhZGYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRvY29uZi90b29sY2hhaW4ubTQKKysrIGIvY29tbW9uL2F1dG9jb25mL3Rvb2xjaGFpbi5tNApAQCAtMjMsNTkgKzIzLDkgQEAKICMgcXVlc3Rpb25zLgogIwogCi0jIFByZXBhcmUgdGhlIHN5c3RlbSBzbyB0aGF0IFRPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OIGNhbiBiZSBjYWxsZWQuCi0jIE11c3QgaGF2ZSBDQ19WRVJTSU9OX05VTUJFUiBhbmQgQ1hYX1ZFUlNJT05fTlVNQkVSLgotQUNfREVGVU4oW1RPT0xDSEFJTl9QUkVQQVJFX0ZPUl9WRVJTSU9OX0NPTVBBUklTT05TXSwKLVsKLSAgaWYgdGVzdCAieCRDQ19WRVJTSU9OIiAhPSAieCRDWFhfVkVSU0lPTiI7IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQyBhbmQgQysrIGNvbXBpbGVyIGhhcyBkaWZmZXJlbnQgdmVyc2lvbiBudW1iZXJzLCAkQ0NfVkVSU0lPTiB2cyAkQ1hYX1ZFUlNJT04uXSkKLSAgICBBQ19NU0dfV0FSTihbVGhpcyB0eXBpY2FsbHkgaW5kaWNhdGVzIGEgYnJva2VuIHNldHVwLCBhbmQgaXMgbm90IHN1cHBvcnRlZF0pCi0gIGZpCi0KLSAgIyBXZSBvbmx5IGNoZWNrIENDX1ZFUlNJT04gc2luY2Ugd2UgYXNzdW1lIENYWF9WRVJTSU9OIGlzIGVxdWFsLgotICBpZiBbIFtbICIkQ0NfVkVSU0lPTiIgPX4gKC4qXC4pezN9IF1dIF07IHRoZW4KLSAgICBBQ19NU0dfV0FSTihbQyBjb21waWxlciB2ZXJzaW9uIG51bWJlciBoYXMgbW9yZSB0aGFuIHRocmVlIHBhcnRzIChYLlkuWik6ICRDQ19WRVJTSU9OLiBDb21wYXJpc29ucyBtaWdodCBiZSB3cm9uZy5dKQotICBmaQotCi0gIGlmIFsgW1sgICIkQ0NfVkVSU0lPTiIgPX4gWzAtOV17Nn0gXV0gXTsgdGhlbgotICAgIEFDX01TR19XQVJOKFtDIGNvbXBpbGVyIHZlcnNpb24gbnVtYmVyIGhhcyBhIHBhcnQgbGFyZ2VyIHRoYW4gOTk5OTk6ICRDQ19WRVJTSU9OLiBDb21wYXJpc29ucyBtaWdodCBiZSB3cm9uZy5dKQotICBmaQotCi0gIENPTVBBUkFCTEVfQUNUVUFMX1ZFUlNJT049YCRBV0sgLUYuICd7IHByaW50ZigiJTA1ZCUwNWQlMDVkXG4iLCBbJF0xLCBbJF0yLCBbJF0zKSB9JyA8PDwgIiRDQ19WRVJTSU9OImAKLV0pCi0KLSMgQ2hlY2sgaWYgdGhlIGNvbmZpZ3VyZWQgY29tcGlsZXIgKEMgYW5kIEMrKykgaXMgb2YgYSBzcGVjaWZpYyB2ZXJzaW9uIG9yCi0jIG5ld2VyLiBUT09MQ0hBSU5fUFJFUEFSRV9GT1JfVkVSU0lPTl9DT01QQVJJU09OUyBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLgotIwotIyBBcmd1bWVudHM6Ci0jICAgJDE6ICAgVGhlIHZlcnNpb24gc3RyaW5nIHRvIGNoZWNrIGFnYWluc3QgdGhlIGZvdW5kIHZlcnNpb24KLSMgICAkMjogICBibG9jayB0byBydW4gaWYgdGhlIGNvbXBpbGVyIGlzIGF0IGxlYXN0IHRoaXMgdmVyc2lvbiAoPj0pCi0jICAgJDM6ICAgYmxvY2sgdG8gcnVuIGlmIHRoZSBjb21waWxlciBpcyBvbGRlciB0aGFuIHRoaXMgdmVyc2lvbiAoPCkKLUFDX0RFRlVOKFtUT09MQ0hBSU5fQ0hFQ0tfQ09NUElMRVJfVkVSU0lPTl0sCi1bCi0gIFJFRkVSRU5DRV9WRVJTSU9OPSQxCi0KLSAgaWYgWyBbWyAiJFJFRkVSRU5DRV9WRVJTSU9OIiA9fiAoLipcLil7M30gXV0gXTsgdGhlbgotICAgIEFDX01TR19FUlJPUihbSW50ZXJuYWwgZXJyb3I6IENhbm5vdCBjb21wYXJlIHRvICRSRUZFUkVOQ0VfVkVSU0lPTiwgb25seSB0aHJlZSBwYXJ0cyAoWC5ZLlopIGlzIHN1cHBvcnRlZF0pCi0gIGZpCi0KLSAgaWYgWyBbWyAiJFJFRkVSRU5DRV9WRVJTSU9OIiA9fiBbMC05XXs2fSBdXSBdOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtJbnRlcm5hbCBlcnJvcjogQ2Fubm90IGNvbXBhcmUgdG8gJFJFRkVSRU5DRV9WRVJTSU9OLCBvbmx5IHBhcnRzIDwgOTk5OTkgaXMgc3VwcG9ydGVkXSkKLSAgZmkKLQotICAjIFZlcnNpb24gY29tcGFyaXNvbiBtZXRob2QgaW5zcGlyZWQgYnkgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjQwNjcyNDMKLSAgQ09NUEFSQUJMRV9SRUZFUkVOQ0VfVkVSU0lPTj1gJEFXSyAtRi4gJ3sgcHJpbnRmKCIlMDVkJTA1ZCUwNWRcbiIsIFskXTEsIFskXTIsIFskXTMpIH0nIDw8PCAiJFJFRkVSRU5DRV9WRVJTSU9OImAKLQotICBpZiB0ZXN0ICRDT01QQVJBQkxFX0FDVFVBTF9WRVJTSU9OIC1nZSAkQ09NUEFSQUJMRV9SRUZFUkVOQ0VfVkVSU0lPTiA7IHRoZW4KLSAgICBtNF9pZnZhbChbJDJdLCBbJDJdLCBbOl0pCi0gIGVsc2UKLSAgICBtNF9pZnZhbChbJDNdLCBbJDNdLCBbOl0pCi0gIGZpCi1dKQotCiAjICQxID0gY29tcGlsZXIgdG8gdGVzdCAoQ0Mgb3IgQ1hYKQogIyAkMiA9IGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgY29tcGlsZXIgKEMgb3IgQysrKQotQUNfREVGVU4oW1RPT0xDSEFJTl9FWFRSQUNUX0NPTVBJTEVSX1ZFUlNJT05dLAorQUNfREVGVU4oW1RPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OXSwKIFsKICAgQ09NUElMRVI9WyRdJDEKICAgQ09NUElMRVJfTkFNRT0kMgpAQCAtMTMxLDggKzgxLDcgQEAKIAogICAgICMgRmlyc3QgbGluZSB0eXBpY2FsbHkgbG9va3Mgc29tZXRoaW5nIGxpa2U6CiAgICAgIyBnY2MgKFVidW50dS9MaW5hcm8gNC41LjItOHVidW50dTQpIDQuNS4yCi0gICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8IFwKLSAgICAgICAgJFNFRCAtZSAncy9eLiogXChAPDpAMS05QDo+QFwuQDw6QDAtOS5AOj5AKlwpQDw6QF4wLTkuQDo+QC4qJC9cMS8nYAorICAgIENPTVBJTEVSX1ZFUlNJT049YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKiBcKEA8OkAxLTlAOj5AQDw6QDAtOS5AOj5AKlwpL1wxL3AiYAogICAgIENPTVBJTEVSX1ZFTkRPUj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXlwoLipcKSBAPDpAMS05QDo+QEA8OkAwLTkuQDo+QCovXDEvcCJgCiAgIGZpCiAgICMgVGhpcyBzZXRzIENDX1ZFUlNJT04gb3IgQ1hYX1ZFUlNJT04uIChUaGlzIGNvbW1lbnQgaXMgYSBncmVwIG1hcmtlcikKQEAgLTIzMiw3ICsxODEsNyBAQAogICAgIEFDX01TR19SRVNVTFQoW25vLCBrZWVwaW5nICQxXSkKICAgICAkMT0iJFRFU1RfQ09NUElMRVIiCiAgIGZpCi0gIFRPT0xDSEFJTl9FWFRSQUNUX0NPTVBJTEVSX1ZFUlNJT04oWyQxXSwgWyRDT01QSUxFUl9OQU1FXSkKKyAgVE9PTENIQUlOX0NIRUNLX0NPTVBJTEVSX1ZFUlNJT04oWyQxXSwgWyRDT01QSUxFUl9OQU1FXSkKIF0pCiAKIApAQCAtNDM2LDEyICszODUsNiBAQAogICAjIE5vdyB0aGF0IHdlIGhhdmUgcmVzb2x2ZWQgQ1hYIG91cnNlbGYsIGxldCBhdXRvY29uZiBoYXZlIGl0cyBnbyBhdCBpdAogICBBQ19QUk9HX0NYWChbJENYWF0pCiAKLSAgIyBUaGlzIGlzIHRoZSBjb21waWxlciB2ZXJzaW9uIG51bWJlciBvbiB0aGUgZm9ybSBYLllbLlpdCi0gIEFDX1NVQlNUKENDX1ZFUlNJT04pCi0gIEFDX1NVQlNUKENYWF9WRVJTSU9OKQotCi0gIFRPT0xDSEFJTl9QUkVQQVJFX0ZPUl9WRVJTSU9OX0NPTVBBUklTT05TCi0KICAgIyMjIExvY2F0ZSBvdGhlciB0b29scwogCiAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgpAQCAtNTY0LDggKzUwNyw3IEBACiAgICAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKERVTVBCSU4pCiAKICAgICAgIENPTVBJTEVSX1RZUEU9Q0wKLSAgICAgICMgc2lsZW5jZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBvdGhlciBoZWFkZXJzLgotICAgICAgQ09NTU9OX0NDWFhGTEFHUz0iJENPTU1PTl9DQ1hYRkxBR1MgLW5vbG9nbyIKKyAgICAgIENDWFhGTEFHUz0iJENDWFhGTEFHUyAtbm9sb2dvIgogICBdKQogICBBQ19TVUJTVChSQ19GTEFHUykKICAgQUNfU1VCU1QoQ09NUElMRVJfVFlQRSkKQEAgLTEwMTIsMjAgKzk1NCwxMiBAQAogICAjCiAgICMgTm93IHNldHVwIHRoZSBDRkxBR1MgYW5kIExERkxBR1MgZm9yIHRoZSBKREsgYnVpbGQuCiAgICMgTGF0ZXIgd2Ugd2lsbCBhbHNvIGhhdmUgQ0ZMQUdTIGFuZCBMREZMQUdTIGZvciB0aGUgaG90c3BvdCBzdWJyZXBvIGJ1aWxkLgotICAjICAgIENGTEFHU19KREsgICAgLSBDIENvbXBpbGVyIGZsYWdzCi0gICMgICAgQ1hYRkxBR1NfSkRLICAtIEMrKyBDb21waWxlciBmbGFncwotICAjICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLIC0gY29tbW9uIHRvIEMgYW5kIEMrKwogICAjCiAgIGNhc2UgJENPTVBJTEVSX05BTUUgaW4KICAgICBnY2MgKQotICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTICRDT01NT05fQ0NYWEZMQUdTX0pESyAtVyAtV2FsbCAtV25vLXVudXNlZCAtV25vLXBhcmVudGhlc2VzIFwKKyAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1MgJENDWFhGTEFHU19KREsgLVcgLVdhbGwgLVduby11bnVzZWQgLVduby1wYXJlbnRoZXNlcyBcCiAgICAgICAtcGlwZSBcCiAgICAgICAtRF9HTlVfU09VUkNFIC1EX1JFRU5UUkFOVCAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UiCi0gICAgICBDWFhTVERfQ1hYRkxBRz0iLXN0ZD1nbnUrKzk4IgotICAgICAgVE9PTENIQUlOX0NYWF9DT01QSUxFUl9DSEVDS19BUkdVTUVOVFMoWyRDWFhTVERfQ1hYRkxBRyAkQ0ZMQUdTX1dBUk5JTkdTX0FSRV9FUlJPUlNdLAotICAgIAkJCQkJICAgICBbXSwgW0NYWFNURF9DWFhGTEFHPSIiXSkKLSAgICAgIENYWEZMQUdTX0pESz0iJHtDWFhGTEFHU19KREt9ICR7Q1hYU1REX0NYWEZMQUd9IgotICAgICAgQUNfU1VCU1QoW0NYWFNURF9DWFhGTEFHXSkKICAgICAgIGNhc2UgJE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIGluCiAgICAgICAgIGFybSApCiAgICAgICAgICAgIyBvbiBhcm0gd2UgZG9uJ3QgcHJldmVudCBnY2MgdG8gb21pdCBmcmFtZSBwb2ludGVyIGJ1dCBkbyBwcmV2ZW50IHN0cmljdCBhbGlhc2luZwpAQCAtMTAzNSwxNyArOTY5LDE2IEBACiAgICAgICAgICAgIyBvbiBwcGMgd2UgZG9uJ3QgcHJldmVudCBnY2MgdG8gb21pdCBmcmFtZSBwb2ludGVyIG5vciBzdHJpY3QtYWxpYXNpbmcKICAgICAgICAgICA7OwogICAgICAgICAqICkKLSAgICAgICAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgorICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgogICAgICAgICAgIENGTEFHU19KREs9IiR7Q0ZMQUdTX0pES30gLWZuby1zdHJpY3QtYWxpYXNpbmciCiAgICAgICAgICAgOzsKICAgICAgIGVzYWMKLSAgICAgIFRPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OKDYsIFRPT0xDSEFJTl9TRVRVUF9HQ0M2X0NPTVBJTEVSX0ZMQUdTKQogICAgICAgOzsKICAgICBvc3NjICkKLSAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHUyAkQ09NTU9OX0NDWFhGTEFHU19KREsgLURUUkFDSU5HIC1ETUFDUk9fTUVNU1lTX09QUyAtREJSRUFLUFRTIgorICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHUyAkQ0NYWEZMQUdTX0pESyAtRFRSQUNJTkcgLURNQUNST19NRU1TWVNfT1BTIC1EQlJFQUtQVFMiCiAgICAgICBjYXNlICRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCBpbgogICAgICAgICB4ODYgKQotICAgICAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURjcHVJbnRlbCAtRGk1ODYgLUQkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUIiCisgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURjcHVJbnRlbCAtRGk1ODYgLUQkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUIiCiAgICAgICAgICAgQ0ZMQUdTX0pESz0iJENGTEFHU19KREsgLWVycm9mZj1FX0JBRF9QUkFHTUFfUEFDS19WQUxVRSIKICAgICAgICAgICA7OwogICAgICAgZXNhYwpAQCAtMTA2NCwxNiArOTk3LDE2IEBACiAgICAgICBMREZMQUdTX0NYWF9KREs9IiRMREZMQUdTX0NYWF9KREsiCiAgICAgICA7OwogICAgIGNsICkKLSAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHUyAkQ09NTU9OX0NDWFhGTEFHU19KREsgLVppIC1NRCAtWmM6d2NoYXJfdC0gLVczIC13ZDQ4MDAgXAorICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHUyAkQ0NYWEZMQUdTX0pESyAtWmkgLU1EIC1aYzp3Y2hhcl90LSAtVzMgLXdkNDgwMCBcCiAgICAgICAtRF9TVEFUSUNfQ1BQTElCIC1EX0RJU0FCTEVfREVQUkVDQVRFX1NUQVRJQ19DUFBMSUIgLURXSU4zMl9MRUFOX0FORF9NRUFOIFwKICAgICAgIC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSBcCiAgICAgICAtRFdJTjMyIC1ESUFMIgogICAgICAgY2FzZSAkT1BFTkpES19UQVJHRVRfQ1BVIGluCiAgICAgICAgIHg4NiApCi0gICAgICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRF9YODZfIC1EeDg2IgorICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX1g4Nl8gLUR4ODYiCiAgICAgICAgICAgOzsKICAgICAgICAgeDg2XzY0ICkKLSAgICAgICAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1EX0FNRDY0XyAtRGFtZDY0IgorICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX0FNRDY0XyAtRGFtZDY0IgogICAgICAgICAgIDs7CiAgICAgICBlc2FjCiAgICAgICA7OwpAQCAtMTEwMyw3ICsxMDM2LDcgQEAKICAgICAgIDs7CiAgIGVzYWMKIAotICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLICRBRERfTFA2NCIKKyAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgJEFERF9MUDY0IgogCiAgICMgVGhlIHBhY2thZ2UgcGF0aCBpcyB1c2VkIG9ubHkgb24gbWFjb3N4PwogICBQQUNLQUdFX1BBVEg9L29wdC9sb2NhbApAQCAtMTExNiwyNyArMTA0OSwyNyBAQAogICAgICMgICBOb3RlOiAtRG1hY3JvICAgICAgICAgaXMgdGhlIHNhbWUgYXMgICAgI2RlZmluZSBtYWNybyAxCiAgICAgIyAgICAgICAgIC1EbWFjcm89ICAgICAgICBpcyB0aGUgc2FtZSBhcyAgICAjZGVmaW5lIG1hY3JvCiAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpczsgdGhlbgotICAgICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRF9MSVRUTEVfRU5ESUFOPSIKKyAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX0xJVFRMRV9FTkRJQU49IgogICAgIGVsc2UKLSAgICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURfTElUVExFX0VORElBTiIKKyAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EX0xJVFRMRV9FTkRJQU4iCiAgICAgZmkKICAgZWxzZQotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURfQklHX0VORElBTiIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRF9CSUdfRU5ESUFOIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbgotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURMSU5VWCIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRExJTlVYIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFdJTkRPV1MiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURXSU5ET1dTIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRFNPTEFSSVMiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURTT0xBUklTIgogICBmaQogICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhhaXg7IHRoZW4KLSAgICBDT01NT05fQ0NYWEZMQUdTX0pESz0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLIC1EQUlYIC1EUFBDNjQiCisgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURBSVggLURQUEM2NCIKICAgZmkKICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRE1BQ09TWCAtRF9BTExCU0RfU09VUkNFIC1EX0RBUldJTl9VTkxJTUlURURfU0VMRUNUIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1ETUFDT1NYIC1EX0FMTEJTRF9TT1VSQ0UgLURfREFSV0lOX1VOTElNSVRFRF9TRUxFQ1QiCiAgICAgIyBTZXR0aW5nIHRoZXNlIHBhcmFtZXRlcnMgbWFrZXMgaXQgYW4gZXJyb3IgdG8gbGluayB0byBtYWNvc3ggQVBJcyB0aGF0IGFyZQogICAgICMgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gT1MgdmVyc2lvbiBhbmQgbWFrZXMgdGhlIGxpbmtlZCBiaW5hcmllcyBjb21wYXRpYmxlIGV2ZW4KICAgICAjIGlmIGJ1aWx0IG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgT1MuCkBAIC0xMTQ2LDI1ICsxMDc5LDI1IEBACiAgICAgIyBUaGUgbWFjcm8gdGFrZXMgdGhlIHZlcnNpb24gd2l0aCBubyBkb3RzLCBleDogMTA3MAogICAgICMgTGV0IHRoZSBmbGFncyB2YXJpYWJsZXMgZ2V0IHJlc29sdmVkIGluIG1ha2UgZm9yIGVhc2llciBvdmVycmlkZSBvbiBtYWtlCiAgICAgIyBjb21tYW5kIGxpbmUuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQ9XCQoc3Vic3QgLiwsXCQoTUFDT1NYX1ZFUlNJT05fTUlOKSkgLW1tYWNvc3gtdmVyc2lvbi1taW49XCQoTUFDT1NYX1ZFUlNJT05fTUlOKSIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQ9XCQoc3Vic3QgLiwsXCQoTUFDT1NYX1ZFUlNJT05fTUlOKSkgLW1tYWNvc3gtdmVyc2lvbi1taW49XCQoTUFDT1NYX1ZFUlNJT05fTUlOKSIKICAgICBMREZMQUdTX0pESz0iJExERkxBR1NfSkRLIC1tbWFjb3N4LXZlcnNpb24tbWluPVwkKE1BQ09TWF9WRVJTSU9OX01JTikiCiAgIGZpCiAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geGJzZDsgdGhlbgotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURCU0QgLURfQUxMQlNEX1NPVVJDRSIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtREJTRCAtRF9BTExCU0RfU09VUkNFIgogICBmaQogICBpZiB0ZXN0ICJ4JERFQlVHX0xFVkVMIiA9IHhyZWxlYXNlOyB0aGVuCi0gICAgQ09NTU9OX0NDWFhGTEFHU19KREs9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAtRE5ERUJVRyIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRE5ERUJVRyIKICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpczsgdGhlbgotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURUUklNTUVEIgorICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EVFJJTU1FRCIKICAgZmkKICAgZWxzZQotICAgIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURERUJVRyIKKyAgICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtRERFQlVHIgogICBmaQogCi0gIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURBUkNIPSdcIiRPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZXCInIC1EJE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1kiCi0gIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgLURSRUxFQVNFPSdcIlwkKFJFTEVBU0UpXCInIgorICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyAtREFSQ0g9J1wiJE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1lcIicgLUQkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWSIKKyAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURSRUxFQVNFPSdcIlwkKFJFTEVBU0UpXCInIgogCi0gIENPTU1PTl9DQ1hYRkxBR1NfSkRLPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgXAorICBDQ1hYRkxBR1NfSkRLPSIkQ0NYWEZMQUdTX0pESyBcCiAgICAgICAtSSR7SkRLX09VVFBVVERJUn0vaW5jbHVkZSBcCiAgICAgICAtSSR7SkRLX09VVFBVVERJUn0vaW5jbHVkZS8kT1BFTkpES19UQVJHRVRfT1MgXAogICAgICAgLUkke0pES19UT1BESVJ9L3NyYy9zaGFyZS9qYXZhdm0vZXhwb3J0IFwKQEAgLTExNzMsMTIgKzExMDYsMTIgQEAKICAgICAgIC1JJHtKREtfVE9QRElSfS9zcmMvJE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIvbmF0aXZlL2NvbW1vbiIKIAogICAjIFRoZSBzaGFyZWQgbGlicmFyaWVzIGFyZSBjb21waWxlZCB1c2luZyB0aGUgcGljZmxhZy4KLSAgQ0ZMQUdTX0pES0xJQj0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLICRDRkxBR1NfSkRLICRQSUNGTEFHICRDRkxBR1NfSkRLTElCX0VYVFJBIgotICBDWFhGTEFHU19KREtMSUI9IiRDT01NT05fQ0NYWEZMQUdTX0pESyAkQ1hYRkxBR1NfSkRLICRQSUNGTEFHICRDWFhGTEFHU19KREtMSUJfRVhUUkEgIgorICBDRkxBR1NfSkRLTElCPSIkQ0NYWEZMQUdTX0pESyAkQ0ZMQUdTX0pESyAkUElDRkxBRyAkQ0ZMQUdTX0pES0xJQl9FWFRSQSIKKyAgQ1hYRkxBR1NfSkRLTElCPSIkQ0NYWEZMQUdTX0pESyAkQ1hYRkxBR1NfSkRLICRQSUNGTEFHICRDWFhGTEFHU19KREtMSUJfRVhUUkEgIgogCiAgICMgRXhlY3V0YWJsZSBmbGFncwotICBDRkxBR1NfSkRLRVhFPSIkQ09NTU9OX0NDWFhGTEFHU19KREsgJENGTEFHU19KREsiCi0gIENYWEZMQUdTX0pES0VYRT0iJENPTU1PTl9DQ1hYRkxBR1NfSkRLICRDWFhGTEFHU19KREsiCisgIENGTEFHU19KREtFWEU9IiRDQ1hYRkxBR1NfSkRLICRDRkxBR1NfSkRLIgorICBDWFhGTEFHU19KREtFWEU9IiRDQ1hYRkxBR1NfSkRLICRDWFhGTEFHU19KREsiCiAKICAgIyBOb3cgdGhpcyBpcyBvZGQuIFRoZSBKREsgbmF0aXZlIGxpYnJhcmllcyBoYXZlIHRvIGxpbmsgYWdhaW5zdCBsaWJqdm0uc28KICAgIyBPbiAzMi1iaXQgbWFjaGluZXMgdGhlcmUgaXMgbm9ybWFsbHkgdHdvIGRpc3RpbmN0IGxpYmp2bS5zbzpzLCBjbGllbnQgYW5kIHNlcnZlci4KQEAgLTEyNjMsMTMgKzExOTYsMTMgQEAKIF0pCiAKIAotIyBUT09MQ0hBSU5fQ19DT01QSUxFUl9DSEVDS19BUkdVTUVOVFMoW0FSR1VNRU5UXSwgW1JVTi1JRi1UUlVFXSwKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSVU4tSUYtRkFMU0VdKQorIyBUT09MQ0hBSU5fQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTKFtBUkdVTUVOVF0sIFtSVU4tSUYtVFJVRV0sCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUlVOLUlGLUZBTFNFXSkKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENoZWNrIHRoYXQgdGhlIEMgY29tcGlsZXIgc3VwcG9ydHMgYW4gYXJndW1lbnQKLUFDX0RFRlVOKFtUT09MQ0hBSU5fQ19DT01QSUxFUl9DSEVDS19BUkdVTUVOVFNdLAorIyBDaGVjayB0aGF0IHRoZSBjIGFuZCBjKysgY29tcGlsZXJzIHN1cHBvcnQgYW4gYXJndW1lbnQKK0FDX0RFRlVOKFtUT09MQ0hBSU5fQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTXSwKIFsKLSAgQUNfTVNHX0NIRUNLSU5HKFtpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyAiJDEiXSkKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBjb21waWxlciBzdXBwb3J0cyAiJDEiXSkKICAgc3VwcG9ydHM9eWVzCiAKICAgc2F2ZWRfY2ZsYWdzPSIkQ0ZMQUdTIgpAQCAtMTI4MCwyMyArMTIxMyw2IEBACiAgIEFDX0xBTkdfUE9QKFtDXSkKICAgQ0ZMQUdTPSIkc2F2ZWRfY2ZsYWdzIgogCi0gIEFDX01TR19SRVNVTFQoWyRzdXBwb3J0c10pCi0gIGlmIHRlc3QgIngkc3VwcG9ydHMiID0gInh5ZXMiIDsgdGhlbgotICAgIG00X2lmdmFsKFskMl0sIFskMl0sIFs6XSkKLSAgZWxzZQotICAgIG00X2lmdmFsKFskM10sIFskM10sIFs6XSkKLSAgZmkKLV0pCi0KLSMgVE9PTENIQUlOX0NYWF9DT01QSUxFUl9DSEVDS19BUkdVTUVOVFMoW0FSR1VNRU5UXSwgW1JVTi1JRi1UUlVFXSwKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JVTi1JRi1GQUxTRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0aGF0IHRoZSBDKysgY29tcGlsZXIgc3VwcG9ydHMgYW4gYXJndW1lbnQKLUFDX0RFRlVOKFtUT09MQ0hBSU5fQ1hYX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UU10sCi1bCi0gIEFDX01TR19DSEVDS0lORyhbaWYgdGhlIEMrKyBjb21waWxlciBzdXBwb3J0cyAiJDEiXSkKLSAgc3VwcG9ydHM9eWVzCi0KICAgc2F2ZWRfY3h4ZmxhZ3M9IiRDWFhGTEFHUyIKICAgQ1hYRkxBR1M9IiRDWFhGTEFHICQxIgogICBBQ19MQU5HX1BVU0goW0MrK10pCkBAIC0xMzA0LDMyICsxMjIwLDcgQEAKICAgICAgIFtzdXBwb3J0cz1ub10pCiAgIEFDX0xBTkdfUE9QKFtDKytdKQogICBDWFhGTEFHUz0iJHNhdmVkX2N4eGZsYWdzIgotICAKLSAgQUNfTVNHX1JFU1VMVChbJHN1cHBvcnRzXSkKLSAgaWYgdGVzdCAieCRzdXBwb3J0cyIgPSAieHllcyIgOyB0aGVuCi0gICAgbTRfaWZ2YWwoWyQyXSwgWyQyXSwgWzpdKQotICBlbHNlCi0gICAgbTRfaWZ2YWwoWyQzXSwgWyQzXSwgWzpdKQotICBmaQotXSkKIAotIyBUT09MQ0hBSU5fQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTKFtBUkdVTUVOVF0sIFtSVU4tSUYtVFJVRV0sCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1JVTi1JRi1GQUxTRV0pCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDaGVjayB0aGF0IHRoZSBDIGFuZCBDKysgY29tcGlsZXJzIHN1cHBvcnQgYW4gYXJndW1lbnQKLUFDX0RFRlVOKFtUT09MQ0hBSU5fQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTXSwKLVsKLSAgVE9PTENIQUlOX0NfQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTKFskMV0sCi0gIAkJCQkgICAgICAgW0NfQ09NUF9TVVBQT1JUUz0ieWVzIl0sCi0JCQkJICAgICAgIFtDX0NPTVBfU1VQUE9SVFM9Im5vIl0pCi0gIFRPT0xDSEFJTl9DWFhfQ09NUElMRVJfQ0hFQ0tfQVJHVU1FTlRTKFskMV0sCi0gIAkJCQkJIFtDWFhfQ09NUF9TVVBQT1JUUz0ieWVzIl0sCi0JCQkJCSBbQ1hYX0NPTVBfU1VQUE9SVFM9Im5vIl0pCi0KLSAgQUNfTVNHX0NIRUNLSU5HKFtpZiBib3RoIGNvbXBpbGVycyBzdXBwb3J0ICIkMSJdKQotICBzdXBwb3J0cz1ubwotICBpZiB0ZXN0ICJ4JENfQ09NUF9TVVBQT1JUUyIgPSAieHllcyIgLWEgIngkQ1hYX0NPTVBfU1VQUE9SVFMiID0gInh5ZXMiOyB0aGVuIHN1cHBvcnRzPXllczsgZmkKLSAgCiAgIEFDX01TR19SRVNVTFQoWyRzdXBwb3J0c10pCiAgIGlmIHRlc3QgIngkc3VwcG9ydHMiID0gInh5ZXMiIDsgdGhlbgogICAgIG00X2lmdmFsKFskMl0sIFskMl0sIFs6XSkKQEAgLTE0MjAsMjAgKzEzMTEsMyBAQAogICBBQ19TVUJTVChKVF9IT01FKQogICBBQ19TVUJTVChKVFJFR0VYRSkKIF0pCi0KLUFDX0RFRlVOX09OQ0UoW1RPT0xDSEFJTl9TRVRVUF9HQ0M2X0NPTVBJTEVSX0ZMQUdTXSwKLVsKLSAgIyBUaGVzZSBmbGFncyBhcmUgcmVxdWlyZWQgZm9yIEdDQyA2IGJ1aWxkcyBhcyB1bmRlZmluZWQgYmVoYXZpb3VyIGluIE9wZW5KREsgY29kZQotICAjIHJ1bnMgYWZvdWwgb2YgdGhlIG1vcmUgYWdncmVzc2l2ZSB2ZXJzaW9ucyBvZiB0aGVzZSBvcHRpbWlzYXRpb25zLgotICAjIE5vdGFibHksIHZhbHVlIHJhbmdlIHByb3BhZ2F0aW9uIG5vdyBhc3N1bWVzIHRoYXQgdGhlIHRoaXMgcG9pbnRlciBvZiBDKysKLSAgIyBtZW1iZXIgZnVuY3Rpb25zIGlzIG5vbi1udWxsLgotICBOT19ERUxFVEVfTlVMTF9QT0lOVEVSX0NIRUNLU19DRkxBRz0iLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcyIKLSAgVE9PTENIQUlOX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UUyhbJE5PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHIC1XZXJyb3JdLAotICAJCQkJICAgICBbXSwgW05PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHPSIiXSkKLSAgQUNfU1VCU1QoW05PX0RFTEVURV9OVUxMX1BPSU5URVJfQ0hFQ0tTX0NGTEFHXSkKLSAgTk9fTElGRVRJTUVfRFNFX0NGTEFHPSItZm5vLWxpZmV0aW1lLWRzZSIKLSAgVE9PTENIQUlOX0NPTVBJTEVSX0NIRUNLX0FSR1VNRU5UUyhbJE5PX0xJRkVUSU1FX0RTRV9DRkxBRyAtV2Vycm9yXSwKLSAgCQkJCSAgICAgW10sIFtOT19MSUZFVElNRV9EU0VfQ0ZMQUc9IiJdKQotICBDRkxBR1NfSkRLPSIke0NGTEFHU19KREt9ICR7Tk9fREVMRVRFX05VTExfUE9JTlRFUl9DSEVDS1NfQ0ZMQUd9ICR7Tk9fTElGRVRJTUVfRFNFX0NGTEFHfSIKLSAgQUNfU1VCU1QoW05PX0xJRkVUSU1FX0RTRV9DRkxBR10pCi1dKQpkaWZmIC0tZ2l0IGEvY29yYmEvQVNTRU1CTFlfRVhDRVBUSU9OIGIvY29yYmEvQVNTRU1CTFlfRVhDRVBUSU9OCmluZGV4IDA2NWI4ZDkuLjhiN2FjMWQgMTAwNjQ0Ci0tLSBhL2NvcmJhL0FTU0VNQkxZX0VYQ0VQVElPTgorKysgYi9jb3JiYS9BU1NFTUJMWV9FWENFUFRJT04KQEAgLTEsMjcgKzEsMjcgQEAKIAogT1BFTkpESyBBU1NFTUJMWSBFWENFUFRJT04KIAotVGhlIE9wZW5KREsgc291cmNlIGNvZGUgbWFkZSBhdmFpbGFibGUgYnkgT3JhY2xlIEFtZXJpY2EsIEluYy4gKE9yYWNsZSkgYXQKLW9wZW5qZGsuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKK1RoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IFN1biBhdCBvcGVuamRrLmphdmEubmV0IGFuZAorb3Blbmpkay5kZXYuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKIG9ubHkgKCJHUEwyIiksIHdpdGggdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbi4KIAogICAgIExpbmtpbmcgdGhpcyBPcGVuSkRLIENvZGUgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIGNvZGUKICAgICBpcyBtYWtpbmcgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIFRodXMsIHRoZSB0ZXJtcwogICAgIGFuZCBjb25kaXRpb25zIG9mIEdQTDIgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgogCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgT3JhY2xlIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcwotICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBPcmFjbGUgYXMgaW5kaWNhdGVkIGF0CisgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgU3VuIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcworICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBTdW4gYXMgaW5kaWNhdGVkIGF0CiAgICAgaHR0cDovL29wZW5qZGsuamF2YS5uZXQvbGVnYWwvZXhjZXB0aW9uLW1vZHVsZXMtMjAwNy0wNS0wOC5odG1sCiAgICAgKCJEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIikgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAogICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMsCiAgICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIEdQTDIsCiAgICAgcHJvdmlkZWQgdGhhdCB0aGUgRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyBjb250aW51ZSB0byBiZQotICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBPcmFjbGUuCisgICAgZ292ZXJuZWQgYnkgdGhlIGxpY2Vuc2VzIHVuZGVyIHdoaWNoIHRoZXkgd2VyZSBvZmZlcmVkIGJ5IFN1bi4KIAotQXMgc3VjaCwgaXQgYWxsb3dzIGxpY2Vuc2VlcyBhbmQgc3VibGljZW5zZWVzIG9mIE9yYWNsZSdzIEdQTDIgT3BlbkpESyBDb2RlCi10byBidWlsZCBhbiBleGVjdXRhYmxlIHRoYXQgaW5jbHVkZXMgdGhvc2UgcG9ydGlvbnMgb2YgbmVjZXNzYXJ5IGNvZGUgdGhhdAotT3JhY2xlIGNvdWxkIG5vdCBwcm92aWRlIHVuZGVyIEdQTDIgKG9yIHRoYXQgT3JhY2xlIGhhcyBwcm92aWRlZCB1bmRlciBHUEwyCi13aXRoIHRoZSBDbGFzc3BhdGggZXhjZXB0aW9uKS4gIElmIHlvdSBtb2RpZnkgb3IgYWRkIHRvIHRoZSBPcGVuSkRLIGNvZGUsCi10aGF0IG5ldyBHUEwyIGNvZGUgbWF5IHN0aWxsIGJlIGNvbWJpbmVkIHdpdGggRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcwotaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byB0aGlzIGV4Y2VwdGlvbiBieSBpdHMgY29weXJpZ2h0IGhvbGRlci4KK0FzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBTdW4ncyBHUEwyIE9wZW5KREsgQ29kZSB0bworYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQgU3VuCitjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IFN1biBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMiB3aXRoIHRoZQorQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLCB0aGF0IG5ldworR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgaWYgdGhlCituZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCmRpZmYgLS1naXQgYS9jb3JiYS9MSUNFTlNFIGIvY29yYmEvTElDRU5TRQppbmRleCA4YjQwMGM3Li5iNDBhMGY0IDEwMDY0NAotLS0gYS9jb3JiYS9MSUNFTlNFCisrKyBiL2NvcmJhL0xJQ0VOU0UKQEAgLTMsNyArMyw3IEBACiBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCiBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgpAQCAtMjg3LDggKzI4Nyw4IEBACiAgICAgbW9yZSBkZXRhaWxzLgogCiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgICBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KIApkaWZmIC0tZ2l0IGEvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2lvL0lJT1BJbnB1dFN0cmVhbS5qYXZhIGIvY29yYmEvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2lvL0lJT1BJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDdlZmY3YzMuLmM5ZDYzMjAgMTAwNjQ0Ci0tLSBhL2NvcmJhL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9pby9JSU9QSW5wdXRTdHJlYW0uamF2YQorKysgYi9jb3JiYS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvaW8vSUlPUElucHV0U3RyZWFtLmphdmEKQEAgLTIyMzAsNyArMjIzMCw3IEBACiAgICAgICogUkVWSVNJVCAtLSBUaGlzIGNvZGUgZG9lc24ndCBkbyB3aGF0IHRoZSBjb21tZW50IHNheXMgdG8gd2hlbgogICAgICAqIGdldEZpZWxkKCkgaXMgbnVsbCEKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5wdXRDbGFzc0ZpZWxkcyhPYmplY3QgbywgZmluYWwgQ2xhc3M8Pz4gY2wsCisgICAgcHJpdmF0ZSB2b2lkIGlucHV0Q2xhc3NGaWVsZHMoT2JqZWN0IG8sIENsYXNzIGNsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFN0cmVhbUZpZWxkW10gZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ub3JnLm9tZy5TZW5kaW5nQ29udGV4dC5Db2RlQmFzZSBzZW5kZXIpCiAgICAgICAgIHRocm93cyBJbnZhbGlkQ2xhc3NFeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiwKQEAgLTIyNjQsMzEgKzIyNjQsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBmaWVsZENsID0gZmllbGRzW2ldLmdldENsYXp6KCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzIGZpZWxkQ2wgPSBmaWVsZHNbaV0uZ2V0Q2xhenooKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChvYmplY3RWYWx1ZSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghZmllbGRDbC5pc0Fzc2lnbmFibGVGcm9tKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VmFsdWUuZ2V0Q2xhc3MoKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBtaXNtYXRjaCIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpZWxkIGRlY2xhcmVkQ2xhc3NGaWVsZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dFN0cmVhbUZpZWxkTmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgRmllbGQgY2xhc3NGaWVsZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZENsYXNzRmllbGQgPSBnZXREZWNsYXJlZEZpZWxkKCBjbCwgaW5wdXRTdHJlYW1GaWVsZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhRXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vU3VjaEZpZWxkRXhjZXB0aW9uKSBwYUV4LmdldEV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRmllbGQgPSBjbC5nZXREZWNsYXJlZEZpZWxkKGZpZWxkc1tpXS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZFeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuc2ZFeCk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlY0V4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNlY0V4KTsKLSAgICAgICAgICAgICAgICAgICAgfSAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wRXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc2VjRXguZ2V0Q2F1c2UoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyZWRDbGFzc0ZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmVkRmllbGRDbGFzcyA9IGRlY2xhcmVkQ2xhc3NGaWVsZC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmVkRmllbGRDbGFzcyA9IGNsYXNzRmllbGQuZ2V0VHlwZSgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlucHV0IGZpZWxkIHR5cGUgaXMgYSBkZWNsYXJlZCBmaWVsZCB0eXBlCiAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGZpZWxkIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGRlY2xhcmVkIGZpZWxkCkBAIC0yMzAxLDI0ICsyMjkxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJpZGdlLnB1dE9iamVjdCggbywgZmllbGRzW2ldLmdldEZpZWxkSUQoKSwgb2JqZWN0VmFsdWUgKSA7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RpdmUgY29kZTogZmllbGRzW2ldLmdldEZpZWxkKCkuc2V0KCBvLCBvYmplY3RWYWx1ZSApIDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFFeCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWVDbGFzc05hbWUgPSAibnVsbCI7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50Q2xhc3NEZXNjQ2xhc3NOYW1lID0gIm51bGwiOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gIm51bGwiOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0VmFsdWVDbGFzc05hbWUgPSBvYmplY3RWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENsYXNzRGVzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NEZXNjQ2xhc3NOYW1lID0gY3VycmVudENsYXNzRGVzYy5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXSAhPSBudWxsICYmIGZpZWxkc1tpXS5nZXRGaWVsZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkc1tpXS5nZXRGaWVsZCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDbGFzc0Nhc3RFeGNlcHRpb24gY2NFeCA9IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc2lnbmluZyBpbnN0YW5jZSBvZiBjbGFzcyAiICsgb2JqZWN0VmFsdWVDbGFzc05hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0byBmaWVsZCAiICsgY3VycmVudENsYXNzRGVzY0NsYXNzTmFtZSArICcjJyArIGZpZWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNjRXguaW5pdENhdXNlKCBpYUV4ICkgOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBjY0V4IDsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBDbGFzc0Nhc3RFeGNlcHRpb24gZXhjID0gbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiQXNzaWduaW5nIGluc3RhbmNlIG9mIGNsYXNzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvIGZpZWxkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzc0Rlc2MuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tpXS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGV4Yy5pbml0Q2F1c2UoIGUgKSA7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4YyA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyBlbmQgOiBmb3IgbG9vcAogICAgICAgICAgICAgfQpAQCAtMjYxNCw5ICsyNTk1LDkgQEAKIAogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0T2JqZWN0RmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGMsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2KSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRPYmplY3RGaWVsZChPYmplY3QgbywgQ2xhc3MgYywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHYpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZsZCA9IGdldERlY2xhcmVkRmllbGQoIGMsIGZpZWxkTmFtZSApIDsKKyAgICAgICAgICAgIEZpZWxkIGZsZCA9IGMuZ2V0RGVjbGFyZWRGaWVsZCggZmllbGROYW1lICkgOwogICAgICAgICAgICAgQ2xhc3MgZmllbGRDbCA9IGZsZC5nZXRUeXBlKCk7CiAgICAgICAgICAgICBpZih2ICE9IG51bGwgJiYgIWZpZWxkQ2wuaXNJbnN0YW5jZSh2KSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKQEAgLTI2MzYsMTAgKzI2MTcsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0Qm9vbGVhbkZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBjLCBTdHJpbmcgZmllbGROYW1lLCBib29sZWFuIHYpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRCb29sZWFuRmllbGQoT2JqZWN0IG8sIENsYXNzIGMsIFN0cmluZyBmaWVsZE5hbWUsIGJvb2xlYW4gdikKICAgICB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmbGQgPSBnZXREZWNsYXJlZEZpZWxkKCBjLCBmaWVsZE5hbWUgKSA7CisgICAgICAgICAgICBGaWVsZCBmbGQgPSBjLmdldERlY2xhcmVkRmllbGQoIGZpZWxkTmFtZSApIDsKICAgICAgICAgICAgIGlmICgoZmxkICE9IG51bGwpICYmIChmbGQuZ2V0VHlwZSgpID09IEJvb2xlYW4uVFlQRSkpIHsKICAgICAgICAgICAgICAgICBsb25nIGtleSA9IGJyaWRnZS5vYmplY3RGaWVsZE9mZnNldCggZmxkICkgOwogICAgICAgICAgICAgICAgIGJyaWRnZS5wdXRCb29sZWFuKCBvLCBrZXksIHYgKSA7CkBAIC0yNjU5LDEwICsyNjQwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEJ5dGVGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gYywgU3RyaW5nIGZpZWxkTmFtZSwgYnl0ZSB2KQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0Qnl0ZUZpZWxkKE9iamVjdCBvLCBDbGFzcyBjLCBTdHJpbmcgZmllbGROYW1lLCBieXRlIHYpCiAgICAgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgRmllbGQgZmxkID0gZ2V0RGVjbGFyZWRGaWVsZCggYywgZmllbGROYW1lICkgOworICAgICAgICAgICAgRmllbGQgZmxkID0gYy5nZXREZWNsYXJlZEZpZWxkKCBmaWVsZE5hbWUgKSA7CiAgICAgICAgICAgICBpZiAoKGZsZCAhPSBudWxsKSAmJiAoZmxkLmdldFR5cGUoKSA9PSBCeXRlLlRZUEUpKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBrZXkgPSBicmlkZ2Uub2JqZWN0RmllbGRPZmZzZXQoIGZsZCApIDsKICAgICAgICAgICAgICAgICBicmlkZ2UucHV0Qnl0ZSggbywga2V5LCB2ICkgOwpAQCAtMjY4MiwxMCArMjY2MywxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRDaGFyRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGMsIFN0cmluZyBmaWVsZE5hbWUsIGNoYXIgdikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldENoYXJGaWVsZChPYmplY3QgbywgQ2xhc3MgYywgU3RyaW5nIGZpZWxkTmFtZSwgY2hhciB2KQogICAgIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZsZCA9IGdldERlY2xhcmVkRmllbGQoIGMsIGZpZWxkTmFtZSApIDsKKyAgICAgICAgICAgIEZpZWxkIGZsZCA9IGMuZ2V0RGVjbGFyZWRGaWVsZCggZmllbGROYW1lICkgOwogICAgICAgICAgICAgaWYgKChmbGQgIT0gbnVsbCkgJiYgKGZsZC5nZXRUeXBlKCkgPT0gQ2hhcmFjdGVyLlRZUEUpKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBrZXkgPSBicmlkZ2Uub2JqZWN0RmllbGRPZmZzZXQoIGZsZCApIDsKICAgICAgICAgICAgICAgICBicmlkZ2UucHV0Q2hhciggbywga2V5LCB2ICkgOwpAQCAtMjcwNSwxMCArMjY4NiwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTaG9ydEZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBjLCBTdHJpbmcgZmllbGROYW1lLCBzaG9ydCB2KQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0U2hvcnRGaWVsZChPYmplY3QgbywgQ2xhc3MgYywgU3RyaW5nIGZpZWxkTmFtZSwgc2hvcnQgdikKICAgICB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmbGQgPSBnZXREZWNsYXJlZEZpZWxkKCBjLCBmaWVsZE5hbWUgKSA7CisgICAgICAgICAgICBGaWVsZCBmbGQgPSBjLmdldERlY2xhcmVkRmllbGQoIGZpZWxkTmFtZSApIDsKICAgICAgICAgICAgIGlmICgoZmxkICE9IG51bGwpICYmIChmbGQuZ2V0VHlwZSgpID09IFNob3J0LlRZUEUpKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBrZXkgPSBicmlkZ2Uub2JqZWN0RmllbGRPZmZzZXQoIGZsZCApIDsKICAgICAgICAgICAgICAgICBicmlkZ2UucHV0U2hvcnQoIG8sIGtleSwgdiApIDsKQEAgLTI3MjgsMTAgKzI3MDksMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW50RmllbGQoT2JqZWN0IG8sIGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGludCB2KQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW50RmllbGQoT2JqZWN0IG8sIENsYXNzIGMsIFN0cmluZyBmaWVsZE5hbWUsIGludCB2KQogICAgIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZsZCA9IGdldERlY2xhcmVkRmllbGQoIGMsIGZpZWxkTmFtZSApIDsKKyAgICAgICAgICAgIEZpZWxkIGZsZCA9IGMuZ2V0RGVjbGFyZWRGaWVsZCggZmllbGROYW1lICkgOwogICAgICAgICAgICAgaWYgKChmbGQgIT0gbnVsbCkgJiYgKGZsZC5nZXRUeXBlKCkgPT0gSW50ZWdlci5UWVBFKSkgewogICAgICAgICAgICAgICAgIGxvbmcga2V5ID0gYnJpZGdlLm9iamVjdEZpZWxkT2Zmc2V0KCBmbGQgKSA7CiAgICAgICAgICAgICAgICAgYnJpZGdlLnB1dEludCggbywga2V5LCB2ICkgOwpAQCAtMjc1MSwxMCArMjczMiwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRMb25nRmllbGQoT2JqZWN0IG8sIENsYXNzPD8+IGMsIFN0cmluZyBmaWVsZE5hbWUsIGxvbmcgdikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldExvbmdGaWVsZChPYmplY3QgbywgQ2xhc3MgYywgU3RyaW5nIGZpZWxkTmFtZSwgbG9uZyB2KQogICAgIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZsZCA9IGdldERlY2xhcmVkRmllbGQoIGMsIGZpZWxkTmFtZSApIDsKKyAgICAgICAgICAgIEZpZWxkIGZsZCA9IGMuZ2V0RGVjbGFyZWRGaWVsZCggZmllbGROYW1lICkgOwogICAgICAgICAgICAgaWYgKChmbGQgIT0gbnVsbCkgJiYgKGZsZC5nZXRUeXBlKCkgPT0gTG9uZy5UWVBFKSkgewogICAgICAgICAgICAgICAgIGxvbmcga2V5ID0gYnJpZGdlLm9iamVjdEZpZWxkT2Zmc2V0KCBmbGQgKSA7CiAgICAgICAgICAgICAgICAgYnJpZGdlLnB1dExvbmcoIG8sIGtleSwgdiApIDsKQEAgLTI3NzQsMTAgKzI3NTUsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0RmxvYXRGaWVsZChPYmplY3QgbywgQ2xhc3M8Pz4gYywgU3RyaW5nIGZpZWxkTmFtZSwgZmxvYXQgdikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEZsb2F0RmllbGQoT2JqZWN0IG8sIENsYXNzIGMsIFN0cmluZyBmaWVsZE5hbWUsIGZsb2F0IHYpCiAgICAgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgRmllbGQgZmxkID0gZ2V0RGVjbGFyZWRGaWVsZCggYywgZmllbGROYW1lICkgOworICAgICAgICAgICAgRmllbGQgZmxkID0gYy5nZXREZWNsYXJlZEZpZWxkKCBmaWVsZE5hbWUgKSA7CiAgICAgICAgICAgICBpZiAoKGZsZCAhPSBudWxsKSAmJiAoZmxkLmdldFR5cGUoKSA9PSBGbG9hdC5UWVBFKSkgewogICAgICAgICAgICAgICAgIGxvbmcga2V5ID0gYnJpZGdlLm9iamVjdEZpZWxkT2Zmc2V0KCBmbGQgKSA7CiAgICAgICAgICAgICAgICAgYnJpZGdlLnB1dEZsb2F0KCBvLCBrZXksIHYgKSA7CkBAIC0yNzk3LDEwICsyNzc4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERvdWJsZUZpZWxkKE9iamVjdCBvLCBDbGFzczw/PiBjLCBTdHJpbmcgZmllbGROYW1lLCBkb3VibGUgdikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERvdWJsZUZpZWxkKE9iamVjdCBvLCBDbGFzcyBjLCBTdHJpbmcgZmllbGROYW1lLCBkb3VibGUgdikKICAgICB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmbGQgPSBnZXREZWNsYXJlZEZpZWxkKGMsIGZpZWxkTmFtZSApIDsKKyAgICAgICAgICAgIEZpZWxkIGZsZCA9IGMuZ2V0RGVjbGFyZWRGaWVsZCggZmllbGROYW1lICkgOwogICAgICAgICAgICAgaWYgKChmbGQgIT0gbnVsbCkgJiYgKGZsZC5nZXRUeXBlKCkgPT0gRG91YmxlLlRZUEUpKSB7CiAgICAgICAgICAgICAgICAgbG9uZyBrZXkgPSBicmlkZ2Uub2JqZWN0RmllbGRPZmZzZXQoIGZsZCApIDsKICAgICAgICAgICAgICAgICBicmlkZ2UucHV0RG91YmxlKCBvLCBrZXksIHYgKSA7CkBAIC0yODIwLDIzICsyODAxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0RGVjbGFyZWRGaWVsZChmaW5hbCBDbGFzczw/PiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpCi0gICAgICAgIHRocm93cyBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gewotICAgICAgICBpZiAoU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyCi0gICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxGaWVsZD4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBGaWVsZCBydW4oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGEgbWFwIG9mIHN0cmVhbSBwb3NpdGlvbiB0bwogICAgICAqIGFuIE9iamVjdCBjdXJyZW50bHkgYmVpbmcgZGVzZXJpYWxpemVkLiAgSXQgaXMgdXNlZApAQCAtMjg0NywxMiArMjgxMSwxMiBAQAogICAgICAqLwogICAgIHN0YXRpYyBjbGFzcyBBY3RpdmVSZWN1cnNpb25NYW5hZ2VyCiAgICAgewotICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG9mZnNldFRvT2JqZWN0TWFwOworICAgICAgICBwcml2YXRlIE1hcCBvZmZzZXRUb09iamVjdE1hcDsKIAogICAgICAgICBwdWJsaWMgQWN0aXZlUmVjdXJzaW9uTWFuYWdlcigpIHsKICAgICAgICAgICAgIC8vIEEgaGFzaCBtYXAgaXMgdW5zeW5jaHJvbml6ZWQgYW5kIGFsbG93cwogICAgICAgICAgICAgLy8gbnVsbCB2YWx1ZXMKLSAgICAgICAgICAgIG9mZnNldFRvT2JqZWN0TWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgb2Zmc2V0VG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ2FsbGVkIHJpZ2h0IGFmdGVyIGFsbG9jYXRpbmcgYSBuZXcgb2JqZWN0LgpkaWZmIC0tZ2l0IGEvZ2V0X3NvdXJjZS5zaCBiL2dldF9zb3VyY2Uuc2gKaW5kZXggNzIwNDliZC4uNWU4NzRkMSAxMDA3NTUKLS0tIGEvZ2V0X3NvdXJjZS5zaAorKysgYi9nZXRfc291cmNlLnNoCkBAIC02Nyw3ICs2Nyw3IEBACiAgIGVycm9yICJDb3VsZCBub3QgbG9jYXRlIE1lcmN1cmlhbCBjb21tYW5kIgogZmkKIAotaGd2ZXJzaW9uPSJgTEFOR1VBR0U9ZW4gaGcgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCB8IHNlZCAtbiAtZSAnc0BeTWVyY3VyaWFsIERpc3RyaWJ1dGVkIFNDTSAodmVyc2lvbiBcKFteK10qXCkuKilcJEBcMUBwJ2AiCitoZ3ZlcnNpb249ImBoZyAtLXZlcnNpb24gMj4gL2Rldi9udWxsIHwgc2VkIC1uIC1lICdzQF5NZXJjdXJpYWwgRGlzdHJpYnV0ZWQgU0NNICh2ZXJzaW9uIFwoW14rXSpcKS4qKVwkQFwxQHAnYCIKIGlmIFsgIngke2hndmVyc2lvbn0iID0gIngiIF0gOyB0aGVuCiAgIGVycm9yICJDb3VsZCBub3QgZGV0ZXJtaW5lIE1lcmN1cmlhbCB2ZXJzaW9uIG9mICRoZ3doZXJlIgogZmkKZGlmZiAtLWdpdCBhL2hvdHNwb3QvQVNTRU1CTFlfRVhDRVBUSU9OIGIvaG90c3BvdC9BU1NFTUJMWV9FWENFUFRJT04KaW5kZXggMDY1YjhkOS4uM2U3ODM5OCAxMDA2NDQKLS0tIGEvaG90c3BvdC9BU1NFTUJMWV9FWENFUFRJT04KKysrIGIvaG90c3BvdC9BU1NFTUJMWV9FWENFUFRJT04KQEAgLTEsOSArMSw5IEBACiAKIE9QRU5KREsgQVNTRU1CTFkgRVhDRVBUSU9OCiAKLVRoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIChPcmFjbGUpIGF0Ci1vcGVuamRrLmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCitUaGUgT3BlbkpESyBzb3VyY2UgY29kZSBtYWRlIGF2YWlsYWJsZSBieSBPcmFjbGUgYXQgb3Blbmpkay5qYXZhLm5ldCBhbmQKK29wZW5qZGsuZGV2LmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCiBvbmx5ICgiR1BMMiIpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24uCiAKICAgICBMaW5raW5nIHRoaXMgT3BlbkpESyBDb2RlIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBjb2RlCkBAIC0xOSw5ICsxOSw5IEBACiAgICAgcHJvdmlkZWQgdGhhdCB0aGUgRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyBjb250aW51ZSB0byBiZQogICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBPcmFjbGUuCiAKLUFzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBPcmFjbGUncyBHUEwyIE9wZW5KREsgQ29kZQotdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQKLU9yYWNsZSBjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IE9yYWNsZSBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMgotd2l0aCB0aGUgQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLAotdGhhdCBuZXcgR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMKLWlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCitBcyBzdWNoLCBpdCBhbGxvd3MgbGljZW5zZWVzIGFuZCBzdWJsaWNlbnNlZXMgb2YgT3JhY2xlJ3MgR1BMMiBPcGVuSkRLIENvZGUgdG8KK2J1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBpbmNsdWRlcyB0aG9zZSBwb3J0aW9ucyBvZiBuZWNlc3NhcnkgY29kZSB0aGF0IE9yYWNsZQorY291bGQgbm90IHByb3ZpZGUgdW5kZXIgR1BMMiAob3IgdGhhdCBPcmFjbGUgaGFzIHByb3ZpZGVkIHVuZGVyIEdQTDIgd2l0aCB0aGUKK0NsYXNzcGF0aCBleGNlcHRpb24pLiAgSWYgeW91IG1vZGlmeSBvciBhZGQgdG8gdGhlIE9wZW5KREsgY29kZSwgdGhhdCBuZXcKK0dQTDIgY29kZSBtYXkgc3RpbGwgYmUgY29tYmluZWQgd2l0aCBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIGlmIHRoZQorbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHRoaXMgZXhjZXB0aW9uIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVyLgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9MSUNFTlNFIGIvaG90c3BvdC9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvTElDRU5TRQorKysgYi9ob3RzcG90L0xJQ0VOU0UKQEAgLTMsNyArMyw3IEBACiBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCiBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgpAQCAtMjg3LDggKzI4Nyw4IEBACiAgICAgbW9yZSBkZXRhaWxzLgogCiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgICBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9hc3NlbWJsZXJfcHBjLmhwcCBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vYXNzZW1ibGVyX3BwYy5ocHAKaW5kZXggYTQ4OGQ2ZC4uN2Q5YWVjYiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9hc3NlbWJsZXJfcHBjLmhwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL2Fzc2VtYmxlcl9wcGMuaHBwCkBAIC01ODksNyArNTg5LDYgQEAKICAgICBWTk9SX09QQ09ERSAgICA9ICg0dSAgPDwgT1BDT0RFX1NISUZUIHwgMTI4NHUgICAgICksCiAgICAgVk9SX09QQ09ERSAgICAgPSAoNHUgIDw8IE9QQ09ERV9TSElGVCB8IDExNTZ1ICAgICApLAogICAgIFZYT1JfT1BDT0RFICAgID0gKDR1ICA8PCBPUENPREVfU0hJRlQgfCAxMjIwdSAgICAgKSwKLSAgICBWUkxEX09QQ09ERSAgICA9ICg0dSAgPDwgT1BDT0RFX1NISUZUIHwgIDE5NnUgICAgICksCiAgICAgVlJMQl9PUENPREUgICAgPSAoNHUgIDw8IE9QQ09ERV9TSElGVCB8ICAgIDR1ICAgICApLAogICAgIFZSTFdfT1BDT0RFICAgID0gKDR1ICA8PCBPUENPREVfU0hJRlQgfCAgMTMydSAgICAgKSwKICAgICBWUkxIX09QQ09ERSAgICA9ICg0dSAgPDwgT1BDT0RFX1NISUZUIHwgICA2OHUgICAgICksCkBAIC0xOTE5LDcgKzE5MTgsNiBAQAogICBpbmxpbmUgdm9pZCB2bm9yKCAgICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYik7CiAgIGlubGluZSB2b2lkIHZvciggICAgICBWZWN0b3JSZWdpc3RlciBkLCBWZWN0b3JSZWdpc3RlciBhLCBWZWN0b3JSZWdpc3RlciBiKTsKICAgaW5saW5lIHZvaWQgdnhvciggICAgIFZlY3RvclJlZ2lzdGVyIGQsIFZlY3RvclJlZ2lzdGVyIGEsIFZlY3RvclJlZ2lzdGVyIGIpOwotICBpbmxpbmUgdm9pZCB2cmxkKCAgICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYik7CiAgIGlubGluZSB2b2lkIHZybGIoICAgICBWZWN0b3JSZWdpc3RlciBkLCBWZWN0b3JSZWdpc3RlciBhLCBWZWN0b3JSZWdpc3RlciBiKTsKICAgaW5saW5lIHZvaWQgdnJsdyggICAgIFZlY3RvclJlZ2lzdGVyIGQsIFZlY3RvclJlZ2lzdGVyIGEsIFZlY3RvclJlZ2lzdGVyIGIpOwogICBpbmxpbmUgdm9pZCB2cmxoKCAgICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYik7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL2Fzc2VtYmxlcl9wcGMuaW5saW5lLmhwcCBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vYXNzZW1ibGVyX3BwYy5pbmxpbmUuaHBwCmluZGV4IDBmNzY0MzUuLmI0YTczNzAgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vYXNzZW1ibGVyX3BwYy5pbmxpbmUuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vYXNzZW1ibGVyX3BwYy5pbmxpbmUuaHBwCkBAIC03MzksNyArNzM5LDYgQEAKIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6dm5vciggICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYikgeyBlbWl0X2ludDMyKCBWTk9SX09QQ09ERSAgICAgfCB2cnQoZCkgfCB2cmEoYSkgfCB2cmIoYikpOyB9CiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnZvciggICAgIFZlY3RvclJlZ2lzdGVyIGQsIFZlY3RvclJlZ2lzdGVyIGEsIFZlY3RvclJlZ2lzdGVyIGIpIHsgZW1pdF9pbnQzMiggVk9SX09QQ09ERSAgICAgIHwgdnJ0KGQpIHwgdnJhKGEpIHwgdnJiKGIpKTsgfQogaW5saW5lIHZvaWQgQXNzZW1ibGVyOjp2eG9yKCAgICBWZWN0b3JSZWdpc3RlciBkLCBWZWN0b3JSZWdpc3RlciBhLCBWZWN0b3JSZWdpc3RlciBiKSB7IGVtaXRfaW50MzIoIFZYT1JfT1BDT0RFICAgICB8IHZydChkKSB8IHZyYShhKSB8IHZyYihiKSk7IH0KLWlubGluZSB2b2lkIEFzc2VtYmxlcjo6dnJsZCggICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYikgeyBlbWl0X2ludDMyKCBWUkxEX09QQ09ERSAgICAgfCB2cnQoZCkgfCB2cmEoYSkgfCB2cmIoYikpOyB9CiBpbmxpbmUgdm9pZCBBc3NlbWJsZXI6OnZybGIoICAgIFZlY3RvclJlZ2lzdGVyIGQsIFZlY3RvclJlZ2lzdGVyIGEsIFZlY3RvclJlZ2lzdGVyIGIpIHsgZW1pdF9pbnQzMiggVlJMQl9PUENPREUgICAgIHwgdnJ0KGQpIHwgdnJhKGEpIHwgdnJiKGIpKTsgfQogaW5saW5lIHZvaWQgQXNzZW1ibGVyOjp2cmx3KCAgICBWZWN0b3JSZWdpc3RlciBkLCBWZWN0b3JSZWdpc3RlciBhLCBWZWN0b3JSZWdpc3RlciBiKSB7IGVtaXRfaW50MzIoIFZSTFdfT1BDT0RFICAgICB8IHZydChkKSB8IHZyYShhKSB8IHZyYihiKSk7IH0KIGlubGluZSB2b2lkIEFzc2VtYmxlcjo6dnJsaCggICAgVmVjdG9yUmVnaXN0ZXIgZCwgVmVjdG9yUmVnaXN0ZXIgYSwgVmVjdG9yUmVnaXN0ZXIgYikgeyBlbWl0X2ludDMyKCBWUkxIX09QQ09ERSAgICAgfCB2cnQoZCkgfCB2cmEoYSkgfCB2cmIoYikpOyB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL2NvbXBpbGVkSUNfcHBjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vY29tcGlsZWRJQ19wcGMuY3BwCmluZGV4IDc2MmEzMjkuLjFiNTQ1OTQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vY29tcGlsZWRJQ19wcGMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vY29tcGlsZWRJQ19wcGMuY3BwCkBAIC05NCw3ICs5NCw3IEBACiAKIGNvbnN0IGludCBJQ19wb3NfaW5famF2YV90b19pbnRlcnBfc3R1YiA9IDg7CiAjZGVmaW5lIF9fIF9tYXNtLgotYWRkcmVzcyBDb21waWxlZFN0YXRpY0NhbGw6OmVtaXRfdG9faW50ZXJwX3N0dWIoQ29kZUJ1ZmZlciAmY2J1Zikgewordm9pZCBDb21waWxlZFN0YXRpY0NhbGw6OmVtaXRfdG9faW50ZXJwX3N0dWIoQ29kZUJ1ZmZlciAmY2J1ZikgewogI2lmZGVmIENPTVBJTEVSMgogICAvLyBHZXQgdGhlIG1hcmsgd2l0aGluIG1haW4gaW5zdHJzIHNlY3Rpb24gd2hpY2ggaXMgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWxsLgogICBhZGRyZXNzIGNhbGxfYWRkciA9IGNidWYuaW5zdHNfbWFyaygpOwpAQCAtMTA2LDcgKzEwNiw4IEBACiAgIC8vIFN0YXJ0IHRoZSBzdHViLgogICBhZGRyZXNzIHN0dWIgPSBfXyBzdGFydF9hX3N0dWIoQ29tcGlsZWRTdGF0aWNDYWxsOjp0b19pbnRlcnBfc3R1Yl9zaXplKCkpOwogICBpZiAoc3R1YiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7IC8vIENvZGVDYWNoZSBpcyBmdWxsCisgICAgQ29tcGlsZTo6Y3VycmVudCgpLT5lbnYoKS0+cmVjb3JkX291dF9vZl9tZW1vcnlfZmFpbHVyZSgpOworICAgIHJldHVybjsKICAgfQogCiAgIC8vIEZvciBqYXZhX3RvX2ludGVycCBzdHVicyB3ZSB1c2UgUjExX3NjcmF0Y2gxIGFzIHNjcmF0Y2ggcmVnaXN0ZXIKQEAgLTE0OCw3ICsxNDksNiBAQAogCiAgLy8gRW5kIHRoZSBzdHViLgogICBfXyBlbmRfYV9zdHViKCk7Ci0gIHJldHVybiBzdHViOwogI2Vsc2UKICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vcHBjLmFkIGIvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9wcGMuYWQKaW5kZXggNTRjMjM2MS4uOWZkNGQ3MyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9wcGMuYWQKKysrIGIvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9wcGMuYWQKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgIC8vIFN0YXJ0IHRoZSBzdHViLgogICBhZGRyZXNzIHN0dWIgPSBfXyBzdGFydF9hX3N0dWIoQ29tcGlsZTo6TUFYX3N0dWJzX3NpemUvMik7CiAgIGlmIChzdHViID09IE5VTEwpIHsKLSAgICBjaUVudjo6Y3VycmVudCgpLT5yZWNvcmRfZmFpbHVyZSgiQ29kZUNhY2hlIGlzIGZ1bGwiKTsKKyAgICBDb21waWxlOjpjdXJyZW50KCktPmVudigpLT5yZWNvcmRfb3V0X29mX21lbW9yeV9mYWlsdXJlKCk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTEyNDksNyArMTI0OSw3IEBACiAKICAgICAvLyBFbWl0IHRoZSB0cmFtcG9saW5lIHN0dWIgd2hpY2ggd2lsbCBiZSByZWxhdGVkIHRvIHRoZSBicmFuY2gtYW5kLWxpbmsgYmVsb3cuCiAgICAgQ2FsbFN0dWJJbXBsOjplbWl0X3RyYW1wb2xpbmVfc3R1YihfbWFzbSwgZW50cnlfcG9pbnRfdG9jX29mZnNldCwgb2Zmc2V0cy5pbnN0c19jYWxsX2luc3RydWN0aW9uX29mZnNldCk7Ci0gICAgaWYgKGNpRW52OjpjdXJyZW50KCktPmZhaWxpbmcoKSkgeyByZXR1cm4gb2Zmc2V0czsgfSAvLyBDb2RlIGNhY2hlIG1heSBiZSBmdWxsLgorICAgIGlmIChDb21waWxlOjpjdXJyZW50KCktPmVudigpLT5mYWlsaW5nKCkpIHsgcmV0dXJuIG9mZnNldHM7IH0gLy8gQ29kZSBjYWNoZSBtYXkgYmUgZnVsbC4KICAgICBfXyByZWxvY2F0ZShydHlwZSk7CiAgIH0KIApAQCAtMzQ4OCw3ICszNDg4LDcgQEAKIAogICAgICAgICAvLyBFbWl0IHRoZSB0cmFtcG9saW5lIHN0dWIgd2hpY2ggd2lsbCBiZSByZWxhdGVkIHRvIHRoZSBicmFuY2gtYW5kLWxpbmsgYmVsb3cuCiAgICAgICAgIENhbGxTdHViSW1wbDo6ZW1pdF90cmFtcG9saW5lX3N0dWIoX21hc20sIGVudHJ5X3BvaW50X3RvY19vZmZzZXQsIHN0YXJ0X29mZnNldCk7Ci0gICAgICAgIGlmIChjaUVudjo6Y3VycmVudCgpLT5mYWlsaW5nKCkpIHsgcmV0dXJuOyB9IC8vIENvZGUgY2FjaGUgbWF5IGJlIGZ1bGwuCisgICAgICAgIGlmIChDb21waWxlOjpjdXJyZW50KCktPmVudigpLT5mYWlsaW5nKCkpIHsgcmV0dXJuOyB9IC8vIENvZGUgY2FjaGUgbWF5IGJlIGZ1bGwuCiAgICAgICAgIF9fIHJlbG9jYXRlKF9vcHRpbWl6ZWRfdmlydHVhbCA/CiAgICAgICAgICAgICAgICAgICAgIHJlbG9jSW5mbzo6b3B0X3ZpcnR1YWxfY2FsbF90eXBlIDogcmVsb2NJbmZvOjpzdGF0aWNfY2FsbF90eXBlKTsKICAgICAgIH0KQEAgLTM1MDEsMTEgKzM1MDEsNyBAQAogICAgICAgX18gYmwoX18gcGMoKSk7ICAvLyBFbWl0cyBhIHJlbG9jYXRpb24uCiAKICAgICAgIC8vIFRoZSBzdHViIGZvciBjYWxsIHRvIGludGVycHJldGVyLgotICAgICAgYWRkcmVzcyBzdHViID0gQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKGNidWYpOwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkgewotICAgICAgICBjaUVudjo6Y3VycmVudCgpLT5yZWNvcmRfZmFpbHVyZSgiQ29kZUNhY2hlIGlzIGZ1bGwiKTsgCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgICAgIENvbXBpbGVkU3RhdGljQ2FsbDo6ZW1pdF90b19pbnRlcnBfc3R1YihjYnVmKTsKICAgICB9CiAgICV9CiAKQEAgLTM1NTAsMTEgKzM1NDYsNyBAQAogCiAgICAgYXNzZXJ0KF9tZXRob2QsICJleGVjdXRlIG5leHQgc3RhdGVtZW50IGNvbmRpdGlvbmFsbHkiKTsKICAgICAvLyBUaGUgc3R1YiBmb3IgY2FsbCB0byBpbnRlcnByZXRlci4KLSAgICBhZGRyZXNzIHN0dWIgPSBDb21waWxlZFN0YXRpY0NhbGw6OmVtaXRfdG9faW50ZXJwX3N0dWIoY2J1Zik7Ci0gICAgaWYgKHN0dWIgPT0gTlVMTCkgewotICAgICAgY2lFbnY6OmN1cnJlbnQoKS0+cmVjb3JkX2ZhaWx1cmUoIkNvZGVDYWNoZSBpcyBmdWxsIik7IAotICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBDb21waWxlZFN0YXRpY0NhbGw6OmVtaXRfdG9faW50ZXJwX3N0dWIoY2J1Zik7CiAKICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNwLgogICAgIF9fIGxkKFIxMV9zY3JhdGNoMSwgMCwgUjFfU1ApOyAvLyBMb2FkIGNhbGxlciBzcC4KQEAgLTU0NjksNyArNTQ2MSw3IEBACiAlfQogCiAvLyBNYXRjaCBsb2FkaW5nIGludGVnZXIgYW5kIGNhc3RpbmcgaXQgdG8gbG9uZy4KLWluc3RydWN0IGxvYWRJMkwoaVJlZ0xkc3QgZHN0LCBtZW1vcnlBbGc0IG1lbSkgJXsKK2luc3RydWN0IGxvYWRJMkwoaVJlZ0xkc3QgZHN0LCBtZW1vcnkgbWVtKSAlewogICBtYXRjaChTZXQgZHN0IChDb252STJMIChMb2FkSSBtZW0pKSk7CiAgIHByZWRpY2F0ZShfa2lkc1swXS0+X2xlYWYtPmFzX0xvYWQoKS0+aXNfdW5vcmRlcmVkKCkpOwogICBpbnNfY29zdChNRU1PUllfUkVGX0NPU1QpOwpAQCAtNTQ4NSw3ICs1NDc3LDcgQEAKICV9CiAKIC8vIE1hdGNoIGxvYWRpbmcgaW50ZWdlciBhbmQgY2FzdGluZyBpdCB0byBsb25nIC0gYWNxdWlyZS4KLWluc3RydWN0IGxvYWRJMkxfYWMoaVJlZ0xkc3QgZHN0LCBtZW1vcnlBbGc0IG1lbSkgJXsKK2luc3RydWN0IGxvYWRJMkxfYWMoaVJlZ0xkc3QgZHN0LCBtZW1vcnkgbWVtKSAlewogICBtYXRjaChTZXQgZHN0IChDb252STJMIChMb2FkSSBtZW0pKSk7CiAgIGluc19jb3N0KDMqTUVNT1JZX1JFRl9DT1NUKTsKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9yZWxvY0luZm9fcHBjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vcmVsb2NJbmZvX3BwYy5jcHAKaW5kZXggYjQ4Y2JhMC4uNGYzNjVhNCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9yZWxvY0luZm9fcHBjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3JlbG9jSW5mb19wcGMuY3BwCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICBuYXRpdmVNb3ZDb25zdFJlZ19hdChhZGRyKCkpLT5zZXRfbmFycm93X29vcChubywgY29kZSgpKTsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgZ3VhcmFudGVlKChhZGRyZXNzKSAobmF0aXZlTW92Q29uc3RSZWdfYXQoYWRkcigpKS0+ZGF0YSgpKSA9PSB4LCAiZGF0YSBtdXN0IG1hdGNoIik7CisgICAgYXNzZXJ0KChhZGRyZXNzKSAobmF0aXZlTW92Q29uc3RSZWdfYXQoYWRkcigpKS0+ZGF0YSgpKSA9PSB4LCAiZGF0YSBtdXN0IG1hdGNoIik7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS9zdHViR2VuZXJhdG9yX3BwYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3N0dWJHZW5lcmF0b3JfcHBjLmNwcAppbmRleCAzMjViNTI3Li5lZDI5MmNiIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3N0dWJHZW5lcmF0b3JfcHBjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3N0dWJHZW5lcmF0b3JfcHBjLmNwcApAQCAtMTk2MSw0MzQgKzE5NjEsNiBAQAogICAgIHJldHVybiBzdGFydDsKICAgfQogCi0gIC8vIEFyZ3VtZW50cyBmb3IgZ2VuZXJhdGVkIHN0dWIgKGxpdHRsZSBlbmRpYW4gb25seSk6Ci0gIC8vICAgUjNfQVJHMSAgIC0gc291cmNlIGJ5dGUgYXJyYXkgYWRkcmVzcwotICAvLyAgIFI0X0FSRzIgICAtIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgYWRkcmVzcwotICAvLyAgIFI1X0FSRzMgICAtIHJvdW5kIGtleSBhcnJheQotICBhZGRyZXNzIGdlbmVyYXRlX2Flc2NyeXB0X2VuY3J5cHRCbG9jaygpIHsKLSAgICBhc3NlcnQoVXNlQUVTLCAibmVlZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBtaXNhbGlnbmVkIFNTRSBzdXBwb3J0Iik7Ci0gICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJhZXNjcnlwdF9lbmNyeXB0QmxvY2siKTsKLQotICAgIGFkZHJlc3Mgc3RhcnQgPSBfXyBmdW5jdGlvbl9lbnRyeSgpOwotCi0gICAgTGFiZWwgTF9kb0xhc3Q7Ci0KLSAgICBSZWdpc3RlciBmcm9tICAgICAgICAgICA9IFIzX0FSRzE7ICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcwotICAgIFJlZ2lzdGVyIHRvICAgICAgICAgICAgID0gUjRfQVJHMjsgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKLSAgICBSZWdpc3RlciBrZXkgICAgICAgICAgICA9IFI1X0FSRzM7ICAvLyByb3VuZCBrZXkgYXJyYXkKLQotICAgIFJlZ2lzdGVyIGtleWxlbiAgICAgICAgID0gUjg7Ci0gICAgUmVnaXN0ZXIgdGVtcCAgICAgICAgICAgPSBSOTsKLSAgICBSZWdpc3RlciBrZXlwb3MgICAgICAgICA9IFIxMDsKLSAgICBSZWdpc3RlciBoZXggICAgICAgICAgICA9IFIxMTsKLSAgICBSZWdpc3RlciBmaWZ0ZWVuICAgICAgICA9IFIxMjsKLQotICAgIFZlY3RvclJlZ2lzdGVyIHZSZXQgICAgID0gVlIwOwotCi0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTEgICAgPSBWUjE7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTIgICAgPSBWUjI7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTMgICAgPSBWUjM7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTQgICAgPSBWUjQ7Ci0KLSAgICBWZWN0b3JSZWdpc3RlciBmcm9tUGVybSA9IFZSNTsKLSAgICBWZWN0b3JSZWdpc3RlciBrZXlQZXJtICA9IFZSNjsKLSAgICBWZWN0b3JSZWdpc3RlciB0b1Blcm0gICA9IFZSNzsKLSAgICBWZWN0b3JSZWdpc3RlciBmU3BsdCAgICA9IFZSODsKLQotICAgIFZlY3RvclJlZ2lzdGVyIHZUbXAxICAgID0gVlI5OwotICAgIFZlY3RvclJlZ2lzdGVyIHZUbXAyICAgID0gVlIxMDsKLSAgICBWZWN0b3JSZWdpc3RlciB2VG1wMyAgICA9IFZSMTE7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdlRtcDQgICAgPSBWUjEyOwotCi0gICAgVmVjdG9yUmVnaXN0ZXIgdkxvdyAgICAgPSBWUjEzOwotICAgIFZlY3RvclJlZ2lzdGVyIHZIaWdoICAgID0gVlIxNDsKLQotICAgIF9fIGxpICAgICAgICAgICAgICAoaGV4LCAxNik7Ci0gICAgX18gbGkgICAgICAgICAgICAgIChmaWZ0ZWVuLCAxNSk7Ci0gICAgX18gdnNwbHRpc2IgICAgICAgIChmU3BsdCwgMHgwZik7Ci0KLSAgICAvLyBsb2FkIHVuYWxpZ25lZCBmcm9tWzAtMTVdIHRvIHZzUmV0Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2UmV0LCBmcm9tKTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBmaWZ0ZWVuLCBmcm9tKTsKLSAgICBfXyBsdnNsICAgICAgICAgICAgKGZyb21QZXJtLCBmcm9tKTsKLSAgICBfXyB2eG9yICAgICAgICAgICAgKGZyb21QZXJtLCBmcm9tUGVybSwgZlNwbHQpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodlJldCwgdlJldCwgdlRtcDEsIGZyb21QZXJtKTsKLQotICAgIC8vIGxvYWQga2V5bGVuICg0NCBvciA1MiBvciA2MCkKLSAgICBfXyBsd3ogICAgICAgICAgICAgKGtleWxlbiwgYXJyYXlPb3BEZXNjOjpsZW5ndGhfb2Zmc2V0X2luX2J5dGVzKCkgLSBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfSU5UKSwga2V5KTsKLQotICAgIC8vIHRvIGxvYWQga2V5cwotICAgIF9fIGx2c3IgICAgICAgICAgICAoa2V5UGVybSwga2V5KTsKLSAgICBfXyB2eG9yICAgICAgICAgICAgKHZUbXAyLCB2VG1wMiwgdlRtcDIpOwotICAgIF9fIHZzcGx0aXNiICAgICAgICAodlRtcDIsIC0xNik7Ci0gICAgX18gdnJsZCAgICAgICAgICAgIChrZXlQZXJtLCBrZXlQZXJtLCB2VG1wMik7Ci0gICAgX18gdnJsZCAgICAgICAgICAgIChrZXlQZXJtLCBrZXlQZXJtLCB2VG1wMik7Ci0gICAgX18gdnNsZG9pICAgICAgICAgIChrZXlQZXJtLCBrZXlQZXJtLCBrZXlQZXJtLCAtOCk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxc3Qgcm91bmQga2V5IHRvIHZLZXkxCi0gICAgX18gbGkgICAgICAgICAgICAgIChrZXlwb3MsIDApOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodktleTEsIGtleXBvcywga2V5KTsKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAxLCB2S2V5MSwga2V5UGVybSk7Ci0KLSAgICAvLyAxc3Qgcm91bmQKLSAgICBfXyB2eG9yICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAybmQgcm91bmQga2V5IHRvIHZLZXkxCi0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDIsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXkxLCB2VG1wMiwgdlRtcDEsIGtleVBlcm0pOwotCi0gICAgLy8gbG9hZCB0aGUgM3JkIHJvdW5kIGtleSB0byB2S2V5MgotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIDE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MiwgdlRtcDEsIHZUbXAyLCBrZXlQZXJtKTsKLQotICAgIC8vIGxvYWQgdGhlIDR0aCByb3VuZCBrZXkgdG8gdktleTMKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTMsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA1dGggcm91bmQga2V5IHRvIHZLZXk0Ci0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDEsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXk0LCB2VG1wMSwgdlRtcDIsIGtleVBlcm0pOwotCi0gICAgLy8gMm5kIC0gNXRoIHJvdW5kcwotICAgIF9fIHZjaXBoZXIgKHZSZXQsIHZSZXQsIHZLZXkxKTsKLSAgICBfXyB2Y2lwaGVyICh2UmV0LCB2UmV0LCB2S2V5Mik7Ci0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTMpOwotICAgIF9fIHZjaXBoZXIgKHZSZXQsIHZSZXQsIHZLZXk0KTsKLQotICAgIC8vIGxvYWQgdGhlIDZ0aCByb3VuZCBrZXkgdG8gdktleTEKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA3dGggcm91bmQga2V5IHRvIHZLZXkyCi0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDEsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXkyLCB2VG1wMSwgdlRtcDIsIGtleVBlcm0pOwotCi0gICAgLy8gbG9hZCB0aGUgOHRoIHJvdW5kIGtleSB0byB2S2V5MwotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIDE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAyLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MywgdlRtcDIsIHZUbXAxLCBrZXlQZXJtKTsKLQotICAgIC8vIGxvYWQgdGhlIDl0aCByb3VuZCBrZXkgdG8gdktleTQKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTQsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyA2dGggLSA5dGggcm91bmRzCi0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTEpOwotICAgIF9fIHZjaXBoZXIgKHZSZXQsIHZSZXQsIHZLZXkyKTsKLSAgICBfXyB2Y2lwaGVyICh2UmV0LCB2UmV0LCB2S2V5Myk7Ci0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTQpOwotCi0gICAgLy8gbG9hZCB0aGUgMTB0aCByb3VuZCBrZXkgdG8gdktleTEKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxMXRoIHJvdW5kIGtleSB0byB2S2V5MgotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIDE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MiwgdlRtcDEsIHZUbXAyLCBrZXlQZXJtKTsKLQotICAgIC8vIGlmIGFsbCByb3VuZCBrZXlzIGFyZSBsb2FkZWQsIHNraXAgbmV4dCA0IHJvdW5kcwotICAgIF9fIGNtcHdpICAgICAgICAgICAoQ0NSMCwga2V5bGVuLCA0NCk7Ci0gICAgX18gYmVxICAgICAgICAgICAgIChDQ1IwLCBMX2RvTGFzdCk7Ci0KLSAgICAvLyAxMHRoIC0gMTF0aCByb3VuZHMKLSAgICBfXyB2Y2lwaGVyICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTIpOwotCi0gICAgLy8gbG9hZCB0aGUgMTJ0aCByb3VuZCBrZXkgdG8gdktleTEKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxM3RoIHJvdW5kIGtleSB0byB2S2V5MgotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIDE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MiwgdlRtcDEsIHZUbXAyLCBrZXlQZXJtKTsKLQotICAgIC8vIGlmIGFsbCByb3VuZCBrZXlzIGFyZSBsb2FkZWQsIHNraXAgbmV4dCAyIHJvdW5kcwotICAgIF9fIGNtcHdpICAgICAgICAgICAoQ0NSMCwga2V5bGVuLCA1Mik7Ci0gICAgX18gYmVxICAgICAgICAgICAgIChDQ1IwLCBMX2RvTGFzdCk7Ci0KLSAgICAvLyAxMnRoIC0gMTN0aCByb3VuZHMKLSAgICBfXyB2Y2lwaGVyICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTIpOwotCi0gICAgLy8gbG9hZCB0aGUgMTR0aCByb3VuZCBrZXkgdG8gdktleTEKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAxNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxNXRoIHJvdW5kIGtleSB0byB2S2V5MgotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIDE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MiwgdlRtcDEsIHZUbXAyLCBrZXlQZXJtKTsKLQotICAgIF9fIGJpbmQoTF9kb0xhc3QpOwotCi0gICAgLy8gbGFzdCB0d28gcm91bmRzCi0gICAgX18gdmNpcGhlciAodlJldCwgdlJldCwgdktleTEpOwotICAgIF9fIHZjaXBoZXJsYXN0ICh2UmV0LCB2UmV0LCB2S2V5Mik7Ci0KLSAgICBfXyBuZWcgICAgICAgICAgICAgKHRlbXAsIHRvKTsKLSAgICBfXyBsdnNyICAgICAgICAgICAgKHRvUGVybSwgdGVtcCk7Ci0gICAgX18gdnNwbHRpc2IgICAgICAgICh2VG1wMiwgLTEpOwotICAgIF9fIHZ4b3IgICAgICAgICAgICAodlRtcDEsIHZUbXAxLCB2VG1wMSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2VG1wMiwgdlRtcDIsIHZUbXAxLCB0b1Blcm0pOwotICAgIF9fIHZ4b3IgICAgICAgICAgICAodG9QZXJtLCB0b1Blcm0sIGZTcGx0KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCB0byk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2UmV0LCB2UmV0LCB2UmV0LCB0b1Blcm0pOwotICAgIF9fIHZzZWwgICAgICAgICAgICAodlRtcDEsIHZUbXAxLCB2UmV0LCB2VG1wMik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wNCwgZmlmdGVlbiwgdG8pOwotICAgIF9fIHN0dnggICAgICAgICAgICAodlRtcDEsIHRvKTsKLSAgICBfXyB2c2VsICAgICAgICAgICAgKHZSZXQsIHZSZXQsIHZUbXA0LCB2VG1wMik7Ci0gICAgX18gc3R2eCAgICAgICAgICAgICh2UmV0LCBmaWZ0ZWVuLCB0byk7Ci0KLSAgICBfXyBibHIoKTsKLSAgICAgcmV0dXJuIHN0YXJ0OwotICB9Ci0KLSAgLy8gQXJndW1lbnRzIGZvciBnZW5lcmF0ZWQgc3R1YiAobGl0dGxlIGVuZGlhbiBvbmx5KToKLSAgLy8gICBSM19BUkcxICAgLSBzb3VyY2UgYnl0ZSBhcnJheSBhZGRyZXNzCi0gIC8vICAgUjRfQVJHMiAgIC0gZGVzdGluYXRpb24gYnl0ZSBhcnJheSBhZGRyZXNzCi0gIC8vICAgUjVfQVJHMyAgIC0gSyAoa2V5KSBpbiBsaXR0bGUgZW5kaWFuIGludCBhcnJheQotICBhZGRyZXNzIGdlbmVyYXRlX2Flc2NyeXB0X2RlY3J5cHRCbG9jaygpIHsKLSAgICBhc3NlcnQoVXNlQUVTLCAibmVlZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBtaXNhbGlnbmVkIFNTRSBzdXBwb3J0Iik7Ci0gICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJhZXNjcnlwdF9kZWNyeXB0QmxvY2siKTsKLQotICAgIGFkZHJlc3Mgc3RhcnQgPSBfXyBmdW5jdGlvbl9lbnRyeSgpOwotCi0gICAgTGFiZWwgTF9kb0xhc3Q7Ci0gICAgTGFiZWwgTF9kbzQ0OwotICAgIExhYmVsIExfZG81MjsKLSAgICBMYWJlbCBMX2RvNjA7Ci0KLSAgICBSZWdpc3RlciBmcm9tICAgICAgICAgICA9IFIzX0FSRzE7ICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcwotICAgIFJlZ2lzdGVyIHRvICAgICAgICAgICAgID0gUjRfQVJHMjsgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKLSAgICBSZWdpc3RlciBrZXkgICAgICAgICAgICA9IFI1X0FSRzM7ICAvLyByb3VuZCBrZXkgYXJyYXkKLQotICAgIFJlZ2lzdGVyIGtleWxlbiAgICAgICAgID0gUjg7Ci0gICAgUmVnaXN0ZXIgdGVtcCAgICAgICAgICAgPSBSOTsKLSAgICBSZWdpc3RlciBrZXlwb3MgICAgICAgICA9IFIxMDsKLSAgICBSZWdpc3RlciBoZXggICAgICAgICAgICA9IFIxMTsKLSAgICBSZWdpc3RlciBmaWZ0ZWVuICAgICAgICA9IFIxMjsKLQotICAgIFZlY3RvclJlZ2lzdGVyIHZSZXQgICAgID0gVlIwOwotCi0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTEgICAgPSBWUjE7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTIgICAgPSBWUjI7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTMgICAgPSBWUjM7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTQgICAgPSBWUjQ7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdktleTUgICAgPSBWUjU7Ci0KLSAgICBWZWN0b3JSZWdpc3RlciBmcm9tUGVybSA9IFZSNjsKLSAgICBWZWN0b3JSZWdpc3RlciBrZXlQZXJtICA9IFZSNzsKLSAgICBWZWN0b3JSZWdpc3RlciB0b1Blcm0gICA9IFZSODsKLSAgICBWZWN0b3JSZWdpc3RlciBmU3BsdCAgICA9IFZSOTsKLQotICAgIFZlY3RvclJlZ2lzdGVyIHZUbXAxICAgID0gVlIxMDsKLSAgICBWZWN0b3JSZWdpc3RlciB2VG1wMiAgICA9IFZSMTE7Ci0gICAgVmVjdG9yUmVnaXN0ZXIgdlRtcDMgICAgPSBWUjEyOwotICAgIFZlY3RvclJlZ2lzdGVyIHZUbXA0ICAgID0gVlIxMzsKLQotICAgIFZlY3RvclJlZ2lzdGVyIHZMb3cgICAgID0gVlIxNDsKLSAgICBWZWN0b3JSZWdpc3RlciB2SGlnaCAgICA9IFZSMTU7Ci0KLSAgICBfXyBsaSAgICAgICAgICAgICAgKGhleCwgMTYpOwotICAgIF9fIGxpICAgICAgICAgICAgICAoZmlmdGVlbiwgMTUpOwotICAgIF9fIHZzcGx0aXNiICAgICAgICAoZlNwbHQsIDB4MGYpOwotCi0gICAgLy8gbG9hZCB1bmFsaWduZWQgZnJvbVswLTE1XSB0byB2c1JldAotICAgIF9fIGx2eCAgICAgICAgICAgICAodlJldCwgZnJvbSk7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwgZmlmdGVlbiwgZnJvbSk7Ci0gICAgX18gbHZzbCAgICAgICAgICAgIChmcm9tUGVybSwgZnJvbSk7Ci0gICAgX18gdnhvciAgICAgICAgICAgIChmcm9tUGVybSwgZnJvbVBlcm0sIGZTcGx0KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZSZXQsIHZSZXQsIHZUbXAxLCBmcm9tUGVybSk7IC8vIGFsaWduIFthbmQgYnl0ZSBzd2FwIGluIExFXQotCi0gICAgLy8gbG9hZCBrZXlsZW4gKDQ0IG9yIDUyIG9yIDYwKQotICAgIF9fIGx3eiAgICAgICAgICAgICAoa2V5bGVuLCBhcnJheU9vcERlc2M6Omxlbmd0aF9vZmZzZXRfaW5fYnl0ZXMoKSAtIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9JTlQpLCBrZXkpOwotCi0gICAgLy8gdG8gbG9hZCBrZXlzCi0gICAgX18gbHZzciAgICAgICAgICAgIChrZXlQZXJtLCBrZXkpOwotICAgIF9fIHZ4b3IgICAgICAgICAgICAodlRtcDIsIHZUbXAyLCB2VG1wMik7Ci0gICAgX18gdnNwbHRpc2IgICAgICAgICh2VG1wMiwgLTE2KTsKLSAgICBfXyB2cmxkICAgICAgICAgICAgKGtleVBlcm0sIGtleVBlcm0sIHZUbXAyKTsKLSAgICBfXyB2cmxkICAgICAgICAgICAgKGtleVBlcm0sIGtleVBlcm0sIHZUbXAyKTsKLSAgICBfXyB2c2xkb2kgICAgICAgICAgKGtleVBlcm0sIGtleVBlcm0sIGtleVBlcm0sIC04KTsKLQotICAgIF9fIGNtcHdpICAgICAgICAgICAoQ0NSMCwga2V5bGVuLCA0NCk7Ci0gICAgX18gYmVxICAgICAgICAgICAgIChDQ1IwLCBMX2RvNDQpOwotCi0gICAgX18gY21wd2kgICAgICAgICAgIChDQ1IwLCBrZXlsZW4sIDUyKTsKLSAgICBfXyBiZXEgICAgICAgICAgICAgKENDUjAsIExfZG81Mik7Ci0KLSAgICAvLyBsb2FkIHRoZSAxNXRoIHJvdW5kIGtleSB0byB2S2V5MTEKLSAgICBfXyBsaSAgICAgICAgICAgICAgKGtleXBvcywgMjQwKTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgLTE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAyLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MSwgdlRtcDEsIHZUbXAyLCBrZXlQZXJtKTsKLQotICAgIC8vIGxvYWQgdGhlIDE0dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTIsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxM3RoIHJvdW5kIGtleSB0byB2S2V5MTAKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAtMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDIsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXkzLCB2VG1wMSwgdlRtcDIsIGtleVBlcm0pOwotCi0gICAgLy8gbG9hZCB0aGUgMTJ0aCByb3VuZCBrZXkgdG8gdktleTEwCi0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgLTE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5NCwgdlRtcDIsIHZUbXAxLCBrZXlQZXJtKTsKLQotICAgIC8vIGxvYWQgdGhlIDExdGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTUsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyAxc3QgLSA1dGggcm91bmRzCi0gICAgX18gdnhvciAgICAgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Mik7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Myk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5NCk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5NSk7Ci0KLSAgICBfXyBiICAgICAgICAgICAgICAgKExfZG9MYXN0KTsKLQotICAgIF9fIGJpbmQgICAgICAgICAgICAoTF9kbzUyKTsKLQotICAgIC8vIGxvYWQgdGhlIDEzdGggcm91bmQga2V5IHRvIHZLZXkxMQotICAgIF9fIGxpICAgICAgICAgICAgICAoa2V5cG9zLCAyMDgpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDEsIGtleXBvcywga2V5KTsKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAtMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDIsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXkxLCB2VG1wMSwgdlRtcDIsIGtleVBlcm0pOwotCi0gICAgLy8gbG9hZCB0aGUgMTJ0aCByb3VuZCBrZXkgdG8gdktleTEwCi0gICAgX18gYWRkaSAgICAgICAgICAgIChrZXlwb3MsIGtleXBvcywgLTE2KTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXAxLCBrZXlwb3MsIGtleSk7Ci0gICAgX18gdnBlcm0gICAgICAgICAgICh2S2V5MiwgdlRtcDIsIHZUbXAxLCBrZXlQZXJtKTsKLQotICAgIC8vIGxvYWQgdGhlIDExdGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTMsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyAxc3QgLSAzcmQgcm91bmRzCi0gICAgX18gdnhvciAgICAgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Mik7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Myk7Ci0KLSAgICBfXyBiICAgICAgICAgICAgICAgKExfZG9MYXN0KTsKLQotICAgIF9fIGJpbmQgICAgICAgICAgICAoTF9kbzQ0KTsKLQotICAgIC8vIGxvYWQgdGhlIDExdGggcm91bmQga2V5IHRvIHZLZXkxMQotICAgIF9fIGxpICAgICAgICAgICAgICAoa2V5cG9zLCAxNzYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDEsIGtleXBvcywga2V5KTsKLSAgICBfXyBhZGRpICAgICAgICAgICAgKGtleXBvcywga2V5cG9zLCAtMTYpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDIsIGtleXBvcywga2V5KTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZLZXkxLCB2VG1wMSwgdlRtcDIsIGtleVBlcm0pOwotCi0gICAgLy8gMXN0IHJvdW5kCi0gICAgX18gdnhvciAgICAgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0KLSAgICBfXyBiaW5kICAgICAgICAgICAgKExfZG9MYXN0KTsKLQotICAgIC8vIGxvYWQgdGhlIDEwdGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA5dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTIsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA4dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTMsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA3dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTQsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA2dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTUsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsYXN0IDEwdGggLSA2dGggcm91bmRzCi0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5MSk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Mik7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5Myk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5NCk7Ci0gICAgX18gdm5jaXBoZXIgICAgICAgICh2UmV0LCB2UmV0LCB2S2V5NSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA1dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTEsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSA0dGggcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTIsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAzcmQgcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTMsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAybmQgcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMSwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTQsIHZUbXAyLCB2VG1wMSwga2V5UGVybSk7Ci0KLSAgICAvLyBsb2FkIHRoZSAxc3Qgcm91bmQga2V5IHRvIHZLZXkxMAotICAgIF9fIGFkZGkgICAgICAgICAgICAoa2V5cG9zLCBrZXlwb3MsIC0xNik7Ci0gICAgX18gbHZ4ICAgICAgICAgICAgICh2VG1wMiwga2V5cG9zLCBrZXkpOwotICAgIF9fIHZwZXJtICAgICAgICAgICAodktleTUsIHZUbXAxLCB2VG1wMiwga2V5UGVybSk7Ci0KLSAgICAvLyBsYXN0IDV0aCAtIDF0aCByb3VuZHMKLSAgICBfXyB2bmNpcGhlciAgICAgICAgKHZSZXQsIHZSZXQsIHZLZXkxKTsKLSAgICBfXyB2bmNpcGhlciAgICAgICAgKHZSZXQsIHZSZXQsIHZLZXkyKTsKLSAgICBfXyB2bmNpcGhlciAgICAgICAgKHZSZXQsIHZSZXQsIHZLZXkzKTsKLSAgICBfXyB2bmNpcGhlciAgICAgICAgKHZSZXQsIHZSZXQsIHZLZXk0KTsKLSAgICBfXyB2bmNpcGhlcmxhc3QgICAgKHZSZXQsIHZSZXQsIHZLZXk1KTsKLQotICAgIF9fIG5lZyAgICAgICAgICAgICAodGVtcCwgdG8pOwotICAgIF9fIGx2c3IgICAgICAgICAgICAodG9QZXJtLCB0ZW1wKTsKLSAgICBfXyB2c3BsdGlzYiAgICAgICAgKHZUbXAyLCAtMSk7Ci0gICAgX18gdnhvciAgICAgICAgICAgICh2VG1wMSwgdlRtcDEsIHZUbXAxKTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZUbXAyLCB2VG1wMiwgdlRtcDEsIHRvUGVybSk7Ci0gICAgX18gdnhvciAgICAgICAgICAgICh0b1Blcm0sIHRvUGVybSwgZlNwbHQpOwotICAgIF9fIGx2eCAgICAgICAgICAgICAodlRtcDEsIHRvKTsKLSAgICBfXyB2cGVybSAgICAgICAgICAgKHZSZXQsIHZSZXQsIHZSZXQsIHRvUGVybSk7Ci0gICAgX18gdnNlbCAgICAgICAgICAgICh2VG1wMSwgdlRtcDEsIHZSZXQsIHZUbXAyKTsKLSAgICBfXyBsdnggICAgICAgICAgICAgKHZUbXA0LCBmaWZ0ZWVuLCB0byk7Ci0gICAgX18gc3R2eCAgICAgICAgICAgICh2VG1wMSwgdG8pOwotICAgIF9fIHZzZWwgICAgICAgICAgICAodlJldCwgdlJldCwgdlRtcDQsIHZUbXAyKTsKLSAgICBfXyBzdHZ4ICAgICAgICAgICAgKHZSZXQsIGZpZnRlZW4sIHRvKTsKLQotICAgIF9fIGJscigpOwotICAgICByZXR1cm4gc3RhcnQ7Ci0gIH0KLQogICB2b2lkIGdlbmVyYXRlX2FycmF5Y29weV9zdHVicygpIHsKICAgICAvLyBOb3RlOiB0aGUgZGlzam9pbnQgc3R1YnMgbXVzdCBiZSBnZW5lcmF0ZWQgZmlyc3QsIHNvbWUgb2YKICAgICAvLyB0aGUgY29uam9pbnQgc3R1YnMgdXNlIHRoZW0uCkBAIC0yNTExLDYgKzIwODMsMTAgQEAKICAgICAvLyBhcnJheWNvcHkgc3R1YnMgdXNlZCBieSBjb21waWxlcnMKICAgICBnZW5lcmF0ZV9hcnJheWNvcHlfc3R1YnMoKTsKIAorICAgIGlmIChVc2VBRVNJbnRyaW5zaWNzKSB7CisgICAgICBndWFyYW50ZWUoIVVzZUFFU0ludHJpbnNpY3MsICJub3QgeWV0IGltcGxlbWVudGVkLiIpOworICAgIH0KKwogICAgIC8vIFNhZmVmZXRjaCBzdHVicy4KICAgICBnZW5lcmF0ZV9zYWZlZmV0Y2goIlNhZmVGZXRjaDMyIiwgc2l6ZW9mKGludCksICAgICAmU3R1YlJvdXRpbmVzOjpfc2FmZWZldGNoMzJfZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0dWJSb3V0aW5lczo6X3NhZmVmZXRjaDMyX2ZhdWx0X3BjLApAQCAtMjUxOCwxMiArMjA5NCw2IEBACiAgICAgZ2VuZXJhdGVfc2FmZWZldGNoKCJTYWZlRmV0Y2hOIiwgc2l6ZW9mKGludHB0cl90KSwgJlN0dWJSb3V0aW5lczo6X3NhZmVmZXRjaE5fZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0dWJSb3V0aW5lczo6X3NhZmVmZXRjaE5fZmF1bHRfcGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0dWJSb3V0aW5lczo6X3NhZmVmZXRjaE5fY29udGludWF0aW9uX3BjKTsKLQotICAgIGlmIChVc2VBRVNJbnRyaW5zaWNzKSB7Ci0gICAgICBTdHViUm91dGluZXM6Ol9hZXNjcnlwdF9lbmNyeXB0QmxvY2sgPSBnZW5lcmF0ZV9hZXNjcnlwdF9lbmNyeXB0QmxvY2soKTsKLSAgICAgIFN0dWJSb3V0aW5lczo6X2Flc2NyeXB0X2RlY3J5cHRCbG9jayA9IGdlbmVyYXRlX2Flc2NyeXB0X2RlY3J5cHRCbG9jaygpOwotICAgIH0KLQogICB9CiAKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3ZtX3ZlcnNpb25fcHBjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vdm1fdmVyc2lvbl9wcGMuY3BwCmluZGV4IGQ4MjE0YTguLjFmODM3NWYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vdm1fdmVyc2lvbl9wcGMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9wcGMvdm0vdm1fdmVyc2lvbl9wcGMuY3BwCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgLy8gQ3JlYXRlIGFuZCBwcmludCBmZWF0dXJlLXN0cmluZy4KICAgY2hhciBidWZbKG51bV9mZWF0dXJlcysxKSAqIDE2XTsgLy8gTWF4IDE2IGNoYXJzIHBlciBmZWF0dXJlLgogICBqaW9fc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLSAgICAgICAgICAgICAgICJwcGM2NCVzJXMlcyVzJXMlcyVzJXMlcyIsCisgICAgICAgICAgICAgICAicHBjNjQlcyVzJXMlcyVzJXMlcyVzIiwKICAgICAgICAgICAgICAgIChoYXNfZnNxcnQoKSAgID8gIiBmc3FydCIgICA6ICIiKSwKICAgICAgICAgICAgICAgIChoYXNfaXNlbCgpICAgID8gIiBpc2VsIiAgICA6ICIiKSwKICAgICAgICAgICAgICAgIChoYXNfbHhhcnhlaCgpID8gIiBseGFyeGVoIiA6ICIiKSwKQEAgLTExMSw4ICsxMTEsNyBAQAogICAgICAgICAgICAgICAgKGhhc19wb3BjbnRiKCkgPyAiIHBvcGNudGIiIDogIiIpLAogICAgICAgICAgICAgICAgKGhhc19wb3BjbnR3KCkgPyAiIHBvcGNudHciIDogIiIpLAogICAgICAgICAgICAgICAgKGhhc19mY2ZpZHMoKSAgPyAiIGZjZmlkcyIgIDogIiIpLAotICAgICAgICAgICAgICAgKGhhc192YW5kKCkgICAgPyAiIHZhbmQiICAgIDogIiIpLAotICAgICAgICAgICAgICAgKGhhc192Y2lwaGVyKCkgPyAiIGFlcyIgICAgIDogIiIpCisgICAgICAgICAgICAgICAoaGFzX3ZhbmQoKSAgICA/ICIgdmFuZCIgICAgOiAiIikKICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBudW1iZXIgb2YgJXMgbWF0Y2hlcyBudW1fZmVhdHVyZXMhCiAgICAgICAgICAgICAgICk7CiAgIF9mZWF0dXJlc19zdHIgPSBzdHJkdXAoYnVmKTsKQEAgLTE1NywyOCArMTU2LDYgQEAKICAgfQogCiAgIC8vIFRoZSBBRVMgaW50cmluc2ljIHN0dWJzIHJlcXVpcmUgQUVTIGluc3RydWN0aW9uIHN1cHBvcnQuCi0jaWYgZGVmaW5lZChWTV9MSVRUTEVfRU5ESUFOKQotICBpZiAoaGFzX3ZjaXBoZXIoKSkgewotICAgIGlmIChGTEFHX0lTX0RFRkFVTFQoVXNlQUVTKSkgewotICAgICAgVXNlQUVTID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoVXNlQUVTKSB7Ci0gICAgaWYgKCFGTEFHX0lTX0RFRkFVTFQoVXNlQUVTKSkKLSAgICAgIHdhcm5pbmcoIkFFUyBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhpcyBDUFUiKTsKLSAgICBGTEFHX1NFVF9ERUZBVUxUKFVzZUFFUywgZmFsc2UpOwotICB9Ci0KLSAgaWYgKFVzZUFFUyAmJiBoYXNfdmNpcGhlcigpKSB7Ci0gICAgaWYgKEZMQUdfSVNfREVGQVVMVChVc2VBRVNJbnRyaW5zaWNzKSkgewotICAgICAgVXNlQUVTSW50cmluc2ljcyA9IHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKFVzZUFFU0ludHJpbnNpY3MpIHsKLSAgICBpZiAoIUZMQUdfSVNfREVGQVVMVChVc2VBRVNJbnRyaW5zaWNzKSkKLSAgICAgIHdhcm5pbmcoIkFFUyBpbnRyaW5zaWNzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgQ1BVIik7Ci0gICAgRkxBR19TRVRfREVGQVVMVChVc2VBRVNJbnRyaW5zaWNzLCBmYWxzZSk7Ci0gIH0KLQotI2Vsc2UKICAgaWYgKFVzZUFFUykgewogICAgIHdhcm5pbmcoIkFFUyBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhpcyBDUFUiKTsKICAgICBGTEFHX1NFVF9ERUZBVUxUKFVzZUFFUywgZmFsc2UpOwpAQCAtMTg4LDcgKzE2NSw2IEBACiAgICAgICB3YXJuaW5nKCJBRVMgaW50cmluc2ljcyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGlzIENQVSIpOwogICAgIEZMQUdfU0VUX0RFRkFVTFQoVXNlQUVTSW50cmluc2ljcywgZmFsc2UpOwogICB9Ci0jZW5kaWYKIAogICBpZiAoVXNlU0hBKSB7CiAgICAgd2FybmluZygiU0hBIGluc3RydWN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGlzIENQVSIpOwpAQCAtNDc2LDcgKzQ1Miw2IEBACiAgIGEtPnBvcGNudHcoUjcsIFI1KTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGVbN10gLT4gcG9wY250dwogICBhLT5mY2ZpZHMoRjMsIEY0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlWzhdIC0+IGZjZmlkcwogICBhLT52YW5kKFZSMCwgVlIwLCBWUjApOyAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlWzldIC0+IHZhbmQKLSAgYS0+dmNpcGhlcihWUjAsIFZSMSwgVlIyKTsgICAgICAgICAgICAgICAgICAgLy8gY29kZVsxMF0gLT4gdmNpcGhlcgogICBhLT5ibHIoKTsKIAogICAvLyBFbWl0IGZ1bmN0aW9uIHRvIHNldCBvbmUgY2FjaGUgbGluZSB0byB6ZXJvLiBFbWl0IGZ1bmN0aW9uIGRlc2NyaXB0b3IgYW5kIGdldCBwb2ludGVyIHRvIGl0LgpAQCAtNTIwLDcgKzQ5NSw2IEBACiAgIGlmIChjb2RlW2ZlYXR1cmVfY250cisrXSkgZmVhdHVyZXMgfD0gcG9wY250d19tOwogICBpZiAoY29kZVtmZWF0dXJlX2NudHIrK10pIGZlYXR1cmVzIHw9IGZjZmlkc19tOwogICBpZiAoY29kZVtmZWF0dXJlX2NudHIrK10pIGZlYXR1cmVzIHw9IHZhbmRfbTsKLSAgaWYgKGNvZGVbZmVhdHVyZV9jbnRyKytdKSBmZWF0dXJlcyB8PSB2Y2lwaGVyX207CiAKICAgLy8gUHJpbnQgdGhlIGRldGVjdGlvbiBjb2RlLgogICBpZiAoUHJpbnRBc3NlbWJseSkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3BwYy92bS92bV92ZXJzaW9uX3BwYy5ocHAgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3ZtX3ZlcnNpb25fcHBjLmhwcAppbmRleCBkNzgzOWI0Li4yYmJmZGRkIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3ZtX3ZlcnNpb25fcHBjLmhwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvcHBjL3ZtL3ZtX3ZlcnNpb25fcHBjLmhwcApAQCAtNDIsNyArNDIsNiBAQAogICAgIGZjZmlkcywKICAgICB2YW5kLAogICAgIGRjYmEsCi0gICAgdmNpcGhlciwKICAgICBudW1fZmVhdHVyZXMgLy8gbGFzdCBlbnRyeSB0byBjb3VudCBmZWF0dXJlcwogICB9OwogICBlbnVtIEZlYXR1cmVfRmxhZ19TZXQgewpAQCAtNTcsNyArNTYsNiBAQAogICAgIGZjZmlkc19tICAgICAgICAgICAgICA9ICgxIDw8IGZjZmlkcyApLAogICAgIHZhbmRfbSAgICAgICAgICAgICAgICA9ICgxIDw8IHZhbmQgICApLAogICAgIGRjYmFfbSAgICAgICAgICAgICAgICA9ICgxIDw8IGRjYmEgICApLAotICAgIHZjaXBoZXJfbSAgICAgICAgICAgICA9ICgxIDw8IHZjaXBoZXIpLAogICAgIGFsbF9mZWF0dXJlc19tICAgICAgICA9IC0xCiAgIH07CiAgIHN0YXRpYyBpbnQgIF9mZWF0dXJlczsKQEAgLTg1LDcgKzgzLDYgQEAKICAgc3RhdGljIGJvb2wgaGFzX2ZjZmlkcygpICB7IHJldHVybiAoX2ZlYXR1cmVzICYgZmNmaWRzX20pICE9IDA7IH0KICAgc3RhdGljIGJvb2wgaGFzX3ZhbmQoKSAgICB7IHJldHVybiAoX2ZlYXR1cmVzICYgdmFuZF9tKSAhPSAwOyB9CiAgIHN0YXRpYyBib29sIGhhc19kY2JhKCkgICAgeyByZXR1cm4gKF9mZWF0dXJlcyAmIGRjYmFfbSkgIT0gMDsgfQotICBzdGF0aWMgYm9vbCBoYXNfdmNpcGhlcigpIHsgcmV0dXJuIChfZmVhdHVyZXMgJiB2Y2lwaGVyX20pICE9IDA7IH0KIAogICBzdGF0aWMgY29uc3QgY2hhciogY3B1X2ZlYXR1cmVzKCkgeyByZXR1cm4gX2ZlYXR1cmVzX3N0cjsgfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vYzFfQ29kZVN0dWJzX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9Db2RlU3R1YnNfc3BhcmMuY3BwCmluZGV4IDdjNmExZDcuLjg1ODQwMzcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9Db2RlU3R1YnNfc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jMV9Db2RlU3R1YnNfc3BhcmMuY3BwCkBAIC00MzEsOSArNDMxLDYgQEAKICAgX18gbW92KGxlbmd0aCgpLT5hc19yZWdpc3RlcigpLCAgTzQpOwogCiAgIGNlLT5lbWl0X3N0YXRpY19jYWxsX3N0dWIoKTsKLSAgaWYgKGNlLT5jb21waWxhdGlvbigpLT5iYWlsZWRfb3V0KCkpIHsKLSAgICByZXR1cm47IC8vIENvZGVDYWNoZSBpcyBmdWxsCi0gIH0KIAogICBfXyBjYWxsKFNoYXJlZFJ1bnRpbWU6OmdldF9yZXNvbHZlX3N0YXRpY19jYWxsX3N0dWIoKSwgcmVsb2NJbmZvOjpzdGF0aWNfY2FsbF90eXBlKTsKICAgX18gZGVsYXllZCgpLT5ub3AoKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jb21waWxlZElDX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9jb21waWxlZElDX3NwYXJjLmNwcAppbmRleCA1NDI5ZTMzLi5kZWU2NGRmIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vY29tcGlsZWRJQ19zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL2NvbXBpbGVkSUNfc3BhcmMuY3BwCkBAIC01Myw3ICs1Myw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICNkZWZpbmUgX18gX21hc20uCi1hZGRyZXNzIENvbXBpbGVkU3RhdGljQ2FsbDo6ZW1pdF90b19pbnRlcnBfc3R1YihDb2RlQnVmZmVyICZjYnVmKSB7Cit2b2lkIENvbXBpbGVkU3RhdGljQ2FsbDo6ZW1pdF90b19pbnRlcnBfc3R1YihDb2RlQnVmZmVyICZjYnVmKSB7CiAjaWZkZWYgQ09NUElMRVIyCiAgIC8vIFN0dWIgaXMgZml4ZWQgdXAgd2hlbiB0aGUgY29ycmVzcG9uZGluZyBjYWxsIGlzIGNvbnZlcnRlZCBmcm9tIGNhbGxpbmcKICAgLy8gY29tcGlsZWQgY29kZSB0byBjYWxsaW5nIGludGVycHJldGVkIGNvZGUuCkBAIC02NCwxMCArNjQsOSBAQAogCiAgIE1hY3JvQXNzZW1ibGVyIF9tYXNtKCZjYnVmKTsKIAotICBhZGRyZXNzIGJhc2UgPSBfXyBzdGFydF9hX3N0dWIodG9faW50ZXJwX3N0dWJfc2l6ZSgpKTsKLSAgaWYgKGJhc2UgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOyAgLy8gQ29kZUJ1ZmZlcjo6ZXhwYW5kIGZhaWxlZC4KLSAgfQorICBhZGRyZXNzIGJhc2UgPQorICBfXyBzdGFydF9hX3N0dWIodG9faW50ZXJwX3N0dWJfc2l6ZSgpKjIpOworICBpZiAoYmFzZSA9PSBOVUxMKSByZXR1cm47ICAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkLgogCiAgIC8vIFN0YXRpYyBzdHViIHJlbG9jYXRpb24gc3RvcmVzIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIG9mIHRoZSBjYWxsLgogICBfXyByZWxvY2F0ZShzdGF0aWNfc3R1Yl9SZWxvY2F0aW9uOjpzcGVjKG1hcmspKTsKQEAgLTgyLDcgKzgxLDYgQEAKIAogICAvLyBVcGRhdGUgY3VycmVudCBzdHVicyBwb2ludGVyIGFuZCByZXN0b3JlIGNvZGVfZW5kLgogICBfXyBlbmRfYV9zdHViKCk7Ci0gIHJldHVybiBiYXNlOwogI2Vsc2UKICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9tYWNyb0Fzc2VtYmxlcl9zcGFyYy5jcHAgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vbWFjcm9Bc3NlbWJsZXJfc3BhcmMuY3BwCmluZGV4IDRkZmMxZGIuLmQ3Mzk2ZjYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9tYWNyb0Fzc2VtYmxlcl9zcGFyYy5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL21hY3JvQXNzZW1ibGVyX3NwYXJjLmNwcApAQCAtNDI2MSw3ICs0MjYxLDYgQEAKICAgYXNzZXJ0KFVzZUJsb2NrWmVyb2luZyAmJiBWTV9WZXJzaW9uOjpoYXNfYmxvY2tfemVyb2luZygpLCAib25seSB3b3JrcyB3aXRoIEJJUyB6ZXJvaW5nIik7CiAgIFJlZ2lzdGVyIGVuZCA9IGNvdW50OwogICBpbnQgY2FjaGVfbGluZV9zaXplID0gVk1fVmVyc2lvbjo6cHJlZmV0Y2hfZGF0YV9zaXplKCk7Ci0gIGFzc2VydChjYWNoZV9saW5lX3NpemUgPiAwLCAiY2FjaGUgbGluZSBzaXplIHNob3VsZCBiZSBrbm93biBmb3IgdGhpcyBjb2RlIik7CiAgIC8vIE1pbmltdW0gY291bnQgd2hlbiBCSVMgemVyb2luZyBjYW4gYmUgdXNlZCBzaW5jZQogICAvLyBpdCBuZWVkcyBtZW1iYXIgd2hpY2ggaXMgZXhwZW5zaXZlLgogICBpbnQgYmxvY2tfemVyb19zaXplICA9IE1BWDIoY2FjaGVfbGluZV9zaXplKjMsIChpbnQpQmxvY2taZXJvaW5nTG93TGltaXQpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL25hdGl2ZUluc3Rfc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL25hdGl2ZUluc3Rfc3BhcmMuY3BwCmluZGV4IDQxM2NmZTIuLmY1YWMzN2MgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9uYXRpdmVJbnN0X3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vbmF0aXZlSW5zdF9zcGFyYy5jcHAKQEAgLTY0LDcgKzY0LDcgQEAKICAgbWFzbS5wYXRjaGFibGVfc2V0aGkoeCwgZGVzdHJlZyk7CiAgIGludCBsZW4gPSBidWZmZXIgLSBtYXNtLnBjKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBndWFyYW50ZWUoaW5zdGFkZHJbaV0gPT0gYnVmZmVyW2ldLCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKKyAgICBhc3NlcnQoaW5zdGFkZHJbaV0gPT0gYnVmZmVyW2ldLCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vcmVsb2NJbmZvX3NwYXJjLmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9yZWxvY0luZm9fc3BhcmMuY3BwCmluZGV4IDQ5MDBlMTQuLmUxMzJjNDIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9yZWxvY0luZm9fc3BhcmMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9yZWxvY0luZm9fc3BhcmMuY3BwCkBAIC04Myw3ICs4Myw3IEBACiAgICAgaW5zdCAmPSB+QXNzZW1ibGVyOjpzaW1tKCAgICAtMSwgMTMpOwogICAgIGluc3QgfD0gIEFzc2VtYmxlcjo6c2ltbShzaW1tMTMsIDEzKTsKICAgICBpZiAodmVyaWZ5X29ubHkpIHsKLSAgICAgIGd1YXJhbnRlZShpcC0+bG9uZ19hdCgwKSA9PSBpbnN0LCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKKyAgICAgIGFzc2VydChpcC0+bG9uZ19hdCgwKSA9PSBpbnN0LCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKICAgICB9IGVsc2UgewogICAgICAgaXAtPnNldF9sb25nX2F0KDAsIGluc3QpOwogICAgIH0KQEAgLTEwMSwxNSArMTAxLDE1IEBACiAgICAgICBpbnN0ICY9IH5Bc3NlbWJsZXI6OmhpMjIoLTEpOwogICAgICAgaW5zdCB8PSAgQXNzZW1ibGVyOjpoaTIyKChpbnRwdHJfdClucCk7CiAgICAgICBpZiAodmVyaWZ5X29ubHkpIHsKLSAgICAgICAgZ3VhcmFudGVlKGlwLT5sb25nX2F0KDApID09IGluc3QsICJpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaCIpOworICAgICAgICBhc3NlcnQoaXAtPmxvbmdfYXQoMCkgPT0gaW5zdCwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CiAgICAgICB9IGVsc2UgewogICAgICAgICBpcC0+c2V0X2xvbmdfYXQoMCwgaW5zdCk7CiAgICAgICB9CiAgICAgICBpbnN0MiA9IGlwLT5sb25nX2F0KCBOYXRpdmVJbnN0cnVjdGlvbjo6bm9wX2luc3RydWN0aW9uX3NpemUgKTsKICAgICAgIGd1YXJhbnRlZShBc3NlbWJsZXI6Omludl9vcChpbnN0Mik9PUFzc2VtYmxlcjo6YXJpdGhfb3AsICJhcml0aCBvcCIpOwogICAgICAgaWYgKHZlcmlmeV9vbmx5KSB7Ci0gICAgICAgIGd1YXJhbnRlZShpcC0+bG9uZ19hdChOYXRpdmVJbnN0cnVjdGlvbjo6bm9wX2luc3RydWN0aW9uX3NpemUpID09IE5hdGl2ZUluc3RydWN0aW9uOjpzZXRfZGF0YTMyX3NpbW0xMyggaW5zdDIsIChpbnRwdHJfdClucCksCi0gICAgICAgICAgICAgICAgICAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKKyAgICAgICAgYXNzZXJ0KGlwLT5sb25nX2F0KE5hdGl2ZUluc3RydWN0aW9uOjpub3BfaW5zdHJ1Y3Rpb25fc2l6ZSkgPT0gTmF0aXZlSW5zdHJ1Y3Rpb246OnNldF9kYXRhMzJfc2ltbTEzKCBpbnN0MiwgKGludHB0cl90KW5wKSwKKyAgICAgICAgICAgICAgICJpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaCIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaXAtPnNldF9sb25nX2F0KE5hdGl2ZUluc3RydWN0aW9uOjpub3BfaW5zdHJ1Y3Rpb25fc2l6ZSwgTmF0aXZlSW5zdHJ1Y3Rpb246OnNldF9kYXRhMzJfc2ltbTEzKCBpbnN0MiwgKGludHB0cl90KW5wKSk7CiAgICAgICB9CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICBpbnN0IHw9ICBBc3NlbWJsZXI6OmhpMjIoKGludHB0cl90KXgpOwogICAgIC8vIChpZ25vcmUgb2Zmc2V0OyBpdCBkb2Vzbid0IHBsYXkgaW50byB0aGUgc2V0aGkpCiAgICAgaWYgKHZlcmlmeV9vbmx5KSB7Ci0gICAgICBndWFyYW50ZWUoaXAtPmxvbmdfYXQoMCkgPT0gaW5zdCwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CisgICAgICBhc3NlcnQoaXAtPmxvbmdfYXQoMCkgPT0gaW5zdCwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CiAgICAgfSBlbHNlIHsKICAgICAgIGlwLT5zZXRfbG9uZ19hdCgwLCBpbnN0KTsKICAgICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc3BhcmMuYWQgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vc3BhcmMuYWQKaW5kZXggMGI0NmYzMi4uM2Q0M2Y2YiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3NwYXJjLmFkCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS9zcGFyYy5hZApAQCAtMTc3NSwxMSArMTc3NSw5IEBACiAgIEFkZHJlc3NMaXRlcmFsIGV4Y2VwdGlvbl9ibG9iKE9wdG9SdW50aW1lOjpleGNlcHRpb25fYmxvYigpLT5lbnRyeV9wb2ludCgpKTsKICAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwogCi0gIGFkZHJlc3MgYmFzZSA9IF9fIHN0YXJ0X2Ffc3R1YihzaXplX2V4Y2VwdGlvbl9oYW5kbGVyKCkpOwotICBpZiAoYmFzZSA9PSBOVUxMKSB7Ci0gICAgY2lFbnY6OmN1cnJlbnQoKS0+cmVjb3JkX2ZhaWx1cmUoIkNvZGVDYWNoZSBpcyBmdWxsIik7Ci0gICAgcmV0dXJuIDA7ICAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkCi0gIH0KKyAgYWRkcmVzcyBiYXNlID0KKyAgX18gc3RhcnRfYV9zdHViKHNpemVfZXhjZXB0aW9uX2hhbmRsZXIoKSk7CisgIGlmIChiYXNlID09IE5VTEwpICByZXR1cm4gMDsgIC8vIENvZGVCdWZmZXI6OmV4cGFuZCBmYWlsZWQKIAogICBpbnQgb2Zmc2V0ID0gX18gb2Zmc2V0KCk7CiAKQEAgLTE4MDAsMTEgKzE3OTgsOSBAQAogICBBZGRyZXNzTGl0ZXJhbCBkZW9wdF9ibG9iKFNoYXJlZFJ1bnRpbWU6OmRlb3B0X2Jsb2IoKS0+dW5wYWNrKCkpOwogICBNYWNyb0Fzc2VtYmxlciBfbWFzbSgmY2J1Zik7CiAKLSAgYWRkcmVzcyBiYXNlID0gX18gc3RhcnRfYV9zdHViKHNpemVfZGVvcHRfaGFuZGxlcigpKTsKLSAgaWYgKGJhc2UgPT0gTlVMTCkgewotICAgIGNpRW52OjpjdXJyZW50KCktPnJlY29yZF9mYWlsdXJlKCJDb2RlQ2FjaGUgaXMgZnVsbCIpOwotICAgIHJldHVybiAwOyAgLy8gQ29kZUJ1ZmZlcjo6ZXhwYW5kIGZhaWxlZAotICB9CisgIGFkZHJlc3MgYmFzZSA9CisgIF9fIHN0YXJ0X2Ffc3R1YihzaXplX2Rlb3B0X2hhbmRsZXIoKSk7CisgIGlmIChiYXNlID09IE5VTEwpICByZXR1cm4gMDsgIC8vIENvZGVCdWZmZXI6OmV4cGFuZCBmYWlsZWQKIAogICBpbnQgb2Zmc2V0ID0gX18gb2Zmc2V0KCk7CiAgIF9fIHNhdmVfZnJhbWUoMCk7CkBAIC0yNjA1LDEyICsyNjAxLDcgQEAKICAgICAgIGVtaXRfY2FsbF9yZWxvYyhjYnVmLCAkbWV0aCQkbWV0aG9kLCByZWxvY0luZm86OnN0YXRpY19jYWxsX3R5cGUpOwogICAgIH0KICAgICBpZiAoX21ldGhvZCkgeyAgLy8gRW1pdCBzdHViIGZvciBzdGF0aWMgY2FsbC4KLSAgICAgIGFkZHJlc3Mgc3R1YiA9IENvbXBpbGVkU3RhdGljQ2FsbDo6ZW1pdF90b19pbnRlcnBfc3R1YihjYnVmKTsKLSAgICAgIC8vIFN0dWIgZG9lcyBub3QgZml0IGludG8gc2NyYXRjaCBidWZmZXIgaWYgVHJhY2VKdW1wcyBpcyBlbmFibGVkCi0gICAgICBpZiAoc3R1YiA9PSBOVUxMICYmICEoVHJhY2VKdW1wcyAmJiBDb21waWxlOjpjdXJyZW50KCktPmluX3NjcmF0Y2hfZW1pdF9zaXplKCkpKSB7Ci0gICAgICAgIGNpRW52OjpjdXJyZW50KCktPnJlY29yZF9mYWlsdXJlKCJDb2RlQ2FjaGUgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IAorICAgICAgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKGNidWYpOwogICAgIH0KICAgJX0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3ZtX3ZlcnNpb25fc3BhcmMuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3NwYXJjL3ZtL3ZtX3ZlcnNpb25fc3BhcmMuY3BwCmluZGV4IGIxNGE2ZTkuLjcyZTk4YzYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS9zcGFyYy92bS92bV92ZXJzaW9uX3NwYXJjLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvc3BhcmMvdm0vdm1fdmVyc2lvbl9zcGFyYy5jcHAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBBbGxvY2F0ZVByZWZldGNoRGlzdGFuY2UgPSBBbGxvY2F0ZVByZWZldGNoU3RlcFNpemU7CiAgIH0KIAotICBpZiAoQWxsb2NhdGVQcmVmZXRjaFN0eWxlID09IDMgJiYgKCFoYXNfYmxrX2luaXQoKSB8fCBjYWNoZV9saW5lX3NpemUgPD0gMCkpIHsKKyAgaWYgKEFsbG9jYXRlUHJlZmV0Y2hTdHlsZSA9PSAzICYmICFoYXNfYmxrX2luaXQoKSkgewogICAgIHdhcm5pbmcoIkJJUyBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhpcyBDUFUiKTsKICAgICBGTEFHX1NFVF9ERUZBVUxUKEFsbG9jYXRlUHJlZmV0Y2hTdHlsZSwgMSk7CiAgIH0KQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgRkxBR19TRVRfREVGQVVMVChJbnRlcmlvckVudHJ5QWxpZ25tZW50LCA0KTsKICAgICB9CiAgICAgaWYgKGlzX25pYWdhcmFfcGx1cygpKSB7Ci0gICAgICBpZiAoaGFzX2Jsa19pbml0KCkgJiYgKGNhY2hlX2xpbmVfc2l6ZSA+IDApICYmIFVzZVRMQUIgJiYKKyAgICAgIGlmIChoYXNfYmxrX2luaXQoKSAmJiBVc2VUTEFCICYmCiAgICAgICAgICAgRkxBR19JU19ERUZBVUxUKEFsbG9jYXRlUHJlZmV0Y2hJbnN0cikpIHsKICAgICAgICAgLy8gVXNlIEJJUyBpbnN0cnVjdGlvbiBmb3IgVExBQiBhbGxvY2F0aW9uIHByZWZldGNoLgogICAgICAgICBGTEFHX1NFVF9FUkdPKGludHgsIEFsbG9jYXRlUHJlZmV0Y2hJbnN0ciwgMSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2MxX0NvZGVTdHVic194ODYuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9jMV9Db2RlU3R1YnNfeDg2LmNwcAppbmRleCBiOTZjYjEzLi5hNmU3NzMxIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2MxX0NvZGVTdHVic194ODYuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vYzFfQ29kZVN0dWJzX3g4Ni5jcHAKQEAgLTUwMiw5ICs1MDIsNiBAQAogICBjZS0+YWxpZ25fY2FsbChsaXJfc3RhdGljX2NhbGwpOwogCiAgIGNlLT5lbWl0X3N0YXRpY19jYWxsX3N0dWIoKTsKLSAgaWYgKGNlLT5jb21waWxhdGlvbigpLT5iYWlsZWRfb3V0KCkpIHsKLSAgICByZXR1cm47IC8vIENvZGVDYWNoZSBpcyBmdWxsCi0gIH0KICAgQWRkcmVzc0xpdGVyYWwgcmVzb2x2ZShTaGFyZWRSdW50aW1lOjpnZXRfcmVzb2x2ZV9zdGF0aWNfY2FsbF9zdHViKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NJbmZvOjpzdGF0aWNfY2FsbF90eXBlKTsKICAgX18gY2FsbChyZXNvbHZlKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vY29tcGlsZWRJQ194ODYuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9jb21waWxlZElDX3g4Ni5jcHAKaW5kZXggMjllYmEyZi4uOTUzN2VmOSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9jb21waWxlZElDX3g4Ni5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9jb21waWxlZElDX3g4Ni5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2RlZmluZSBfXyBfbWFzbS4KLWFkZHJlc3MgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKENvZGVCdWZmZXIgJmNidWYpIHsKK3ZvaWQgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKENvZGVCdWZmZXIgJmNidWYpIHsKICAgLy8gU3R1YiBpcyBmaXhlZCB1cCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgaXMgY29udmVydGVkIGZyb20KICAgLy8gY2FsbGluZyBjb21waWxlZCBjb2RlIHRvIGNhbGxpbmcgaW50ZXJwcmV0ZWQgY29kZS4KICAgLy8gbW92cSByYngsIDAKQEAgLTYyLDEwICs2Miw5IEBACiAgIC8vIFRoYXQncyB3aHkgd2UgbXVzdCB1c2UgdGhlIG1hY3JvYXNzZW1ibGVyIHRvIGdlbmVyYXRlIGEgc3R1Yi4KICAgTWFjcm9Bc3NlbWJsZXIgX21hc20oJmNidWYpOwogCi0gIGFkZHJlc3MgYmFzZSA9IF9fIHN0YXJ0X2Ffc3R1Yih0b19pbnRlcnBfc3R1Yl9zaXplKCkpOwotICBpZiAoYmFzZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7ICAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkLgotICB9CisgIGFkZHJlc3MgYmFzZSA9CisgIF9fIHN0YXJ0X2Ffc3R1Yih0b19pbnRlcnBfc3R1Yl9zaXplKCkqMik7CisgIGlmIChiYXNlID09IE5VTEwpIHJldHVybjsgIC8vIENvZGVCdWZmZXI6OmV4cGFuZCBmYWlsZWQuCiAgIC8vIFN0YXRpYyBzdHViIHJlbG9jYXRpb24gc3RvcmVzIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIG9mIHRoZSBjYWxsLgogICBfXyByZWxvY2F0ZShzdGF0aWNfc3R1Yl9SZWxvY2F0aW9uOjpzcGVjKG1hcmspLCBBc3NlbWJsZXI6OmltbV9vcGVyYW5kKTsKICAgLy8gU3RhdGljIHN0dWIgcmVsb2NhdGlvbiBhbHNvIHRhZ3MgdGhlIE1ldGhvZCogaW4gdGhlIGNvZGUtc3RyZWFtLgpAQCAtNzUsNyArNzQsNiBAQAogCiAgIC8vIFVwZGF0ZSBjdXJyZW50IHN0dWJzIHBvaW50ZXIgYW5kIHJlc3RvcmUgaW5zdHNfZW5kLgogICBfXyBlbmRfYV9zdHViKCk7Ci0gIHJldHVybiBiYXNlOwogfQogI3VuZGVmIF9fCiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vcmVsb2NJbmZvX3g4Ni5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3JlbG9jSW5mb194ODYuY3BwCmluZGV4IDkxOGI2ZjIuLjE0ODY4Y2IgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vcmVsb2NJbmZvX3g4Ni5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9yZWxvY0luZm9feDg2LmNwcApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICAgd2hpY2ggPT0gQXNzZW1ibGVyOjppbW1fb3BlcmFuZCwgImZvcm1hdCB1bnBhY2tzIG9rIik7CiAgIGlmICh3aGljaCA9PSBBc3NlbWJsZXI6OmltbV9vcGVyYW5kKSB7CiAgICAgaWYgKHZlcmlmeV9vbmx5KSB7Ci0gICAgICBndWFyYW50ZWUoKnBkX2FkZHJlc3NfaW5fY29kZSgpID09IHgsICJpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaCIpOworICAgICAgYXNzZXJ0KCpwZF9hZGRyZXNzX2luX2NvZGUoKSA9PSB4LCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKICAgICB9IGVsc2UgewogICAgICAgKnBkX2FkZHJlc3NfaW5fY29kZSgpID0geDsKICAgICB9CkBAIC00OSwxMyArNDksMTMgQEAKICAgICAvLyBib3RoIGNvbXByZXNzZWQgb29wcyBhbmQgY29tcHJlc3NlZCBjbGFzc2VzIGxvb2sgdGhlIHNhbWUKICAgICBpZiAoVW5pdmVyc2U6OmhlYXAoKS0+aXNfaW5fcmVzZXJ2ZWQoKG9vcCl4KSkgewogICAgIGlmICh2ZXJpZnlfb25seSkgewotICAgICAgZ3VhcmFudGVlKCoodWludDMyX3QqKSBkaXNwID09IG9vcERlc2M6OmVuY29kZV9oZWFwX29vcCgob29wKXgpLCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKKyAgICAgIGFzc2VydCgqKHVpbnQzMl90KikgZGlzcCA9PSBvb3BEZXNjOjplbmNvZGVfaGVhcF9vb3AoKG9vcCl4KSwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CiAgICAgfSBlbHNlIHsKICAgICAgICooaW50MzJfdCopIGRpc3AgPSBvb3BEZXNjOjplbmNvZGVfaGVhcF9vb3AoKG9vcCl4KTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgICBpZiAodmVyaWZ5X29ubHkpIHsKLSAgICAgICAgZ3VhcmFudGVlKCoodWludDMyX3QqKSBkaXNwID09IEtsYXNzOjplbmNvZGVfa2xhc3MoKEtsYXNzKil4KSwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CisgICAgICAgIGFzc2VydCgqKHVpbnQzMl90KikgZGlzcCA9PSBLbGFzczo6ZW5jb2RlX2tsYXNzKChLbGFzcyopeCksICJpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaCIpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgKihpbnQzMl90KikgZGlzcCA9IEtsYXNzOjplbmNvZGVfa2xhc3MoKEtsYXNzKil4KTsKICAgICAgIH0KQEAgLTY2LDE0ICs2NiwxNCBAQAogICAgIGFkZHJlc3MgZGlzcCA9IEFzc2VtYmxlcjo6bG9jYXRlX29wZXJhbmQoaXAsIHdoaWNoKTsKICAgICBhZGRyZXNzIG5leHRfaXAgPSBBc3NlbWJsZXI6OmxvY2F0ZV9uZXh0X2luc3RydWN0aW9uKGlwKTsKICAgICBpZiAodmVyaWZ5X29ubHkpIHsKLSAgICAgIGd1YXJhbnRlZSgqKGludDMyX3QqKSBkaXNwID09ICh4IC0gbmV4dF9pcCksICJpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaCIpOworICAgICAgYXNzZXJ0KCooaW50MzJfdCopIGRpc3AgPT0gKHggLSBuZXh0X2lwKSwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CiAgICAgfSBlbHNlIHsKICAgICAgICooaW50MzJfdCopIGRpc3AgPSB4IC0gbmV4dF9pcDsKICAgICB9CiAgIH0KICNlbHNlCiAgIGlmICh2ZXJpZnlfb25seSkgewotICAgIGd1YXJhbnRlZSgqcGRfYWRkcmVzc19pbl9jb2RlKCkgPT0gKHggKyBvKSwgImluc3RydWN0aW9ucyBtdXN0IG1hdGNoIik7CisgICAgYXNzZXJ0KCpwZF9hZGRyZXNzX2luX2NvZGUoKSA9PSAoeCArIG8pLCAiaW5zdHJ1Y3Rpb25zIG11c3QgbWF0Y2giKTsKICAgfSBlbHNlIHsKICAgICAqcGRfYWRkcmVzc19pbl9jb2RlKCkgPSB4ICsgbzsKICAgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS92bV92ZXJzaW9uX3g4Ni5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmNwcAppbmRleCAxMzRmYTI0Li4yOGFhNDhlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmNwcApAQCAtNzA0LDE2ICs3MDQsMTYgQEAKICAgICBVc2VNdWx0aXBseVRvTGVuSW50cmluc2ljID0gdHJ1ZTsKICAgfQogICBpZiAoRkxBR19JU19ERUZBVUxUKFVzZVNxdWFyZVRvTGVuSW50cmluc2ljKSkgewotICAgIFVzZVNxdWFyZVRvTGVuSW50cmluc2ljID0gdHJ1ZTsKKyAgICBVc2VTcXVhcmVUb0xlbkludHJpbnNpYyA9IGZhbHNlOwogICB9CiAgIGlmIChGTEFHX0lTX0RFRkFVTFQoVXNlTXVsQWRkSW50cmluc2ljKSkgewotICAgIFVzZU11bEFkZEludHJpbnNpYyA9IHRydWU7CisgICAgVXNlTXVsQWRkSW50cmluc2ljID0gZmFsc2U7CiAgIH0KICAgaWYgKEZMQUdfSVNfREVGQVVMVChVc2VNb250Z29tZXJ5TXVsdGlwbHlJbnRyaW5zaWMpKSB7Ci0gICAgVXNlTW9udGdvbWVyeU11bHRpcGx5SW50cmluc2ljID0gdHJ1ZTsKKyAgICBVc2VNb250Z29tZXJ5TXVsdGlwbHlJbnRyaW5zaWMgPSBmYWxzZTsKICAgfQogICBpZiAoRkxBR19JU19ERUZBVUxUKFVzZU1vbnRnb21lcnlTcXVhcmVJbnRyaW5zaWMpKSB7Ci0gICAgVXNlTW9udGdvbWVyeVNxdWFyZUludHJpbnNpYyA9IHRydWU7CisgICAgVXNlTW9udGdvbWVyeVNxdWFyZUludHJpbnNpYyA9IGZhbHNlOwogICB9CiAjZWxzZQogICBpZiAoVXNlTXVsdGlwbHlUb0xlbkludHJpbnNpYykgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS94ODYuYWQgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Ni5hZAppbmRleCA0ZTI0OTlhLi44ZDQwMmMxIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Ni5hZAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Ni5hZApAQCAtNTUwLDEwICs1NTAsNyBAQAogICAvLyBUaGF0J3Mgd2h5IHdlIG11c3QgdXNlIHRoZSBtYWNyb2Fzc2VtYmxlciB0byBnZW5lcmF0ZSBhIGhhbmRsZXIuCiAgIE1hY3JvQXNzZW1ibGVyIF9tYXNtKCZjYnVmKTsKICAgYWRkcmVzcyBiYXNlID0gX18gc3RhcnRfYV9zdHViKHNpemVfZXhjZXB0aW9uX2hhbmRsZXIoKSk7Ci0gIGlmIChiYXNlID09IE5VTEwpIHsKLSAgICBjaUVudjo6Y3VycmVudCgpLT5yZWNvcmRfZmFpbHVyZSgiQ29kZUNhY2hlIGlzIGZ1bGwiKTsKLSAgICByZXR1cm4gMDsgIC8vIENvZGVCdWZmZXI6OmV4cGFuZCBmYWlsZWQKLSAgfQorICBpZiAoYmFzZSA9PSBOVUxMKSAgcmV0dXJuIDA7ICAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkCiAgIGludCBvZmZzZXQgPSBfXyBvZmZzZXQoKTsKICAgX18ganVtcChSdW50aW1lQWRkcmVzcyhPcHRvUnVudGltZTo6ZXhjZXB0aW9uX2Jsb2IoKS0+ZW50cnlfcG9pbnQoKSkpOwogICBhc3NlcnQoX18gb2Zmc2V0KCkgLSBvZmZzZXQgPD0gKGludCkgc2l6ZV9leGNlcHRpb25faGFuZGxlcigpLCAib3ZlcmZsb3ciKTsKQEAgLTU2OCwxMCArNTY1LDcgQEAKICAgLy8gVGhhdCdzIHdoeSB3ZSBtdXN0IHVzZSB0aGUgbWFjcm9hc3NlbWJsZXIgdG8gZ2VuZXJhdGUgYSBoYW5kbGVyLgogICBNYWNyb0Fzc2VtYmxlciBfbWFzbSgmY2J1Zik7CiAgIGFkZHJlc3MgYmFzZSA9IF9fIHN0YXJ0X2Ffc3R1YihzaXplX2Rlb3B0X2hhbmRsZXIoKSk7Ci0gIGlmIChiYXNlID09IE5VTEwpIHsKLSAgICBjaUVudjo6Y3VycmVudCgpLT5yZWNvcmRfZmFpbHVyZSgiQ29kZUNhY2hlIGlzIGZ1bGwiKTsKLSAgICByZXR1cm4gMDsgIC8vIENvZGVCdWZmZXI6OmV4cGFuZCBmYWlsZWQKLSAgfQorICBpZiAoYmFzZSA9PSBOVUxMKSAgcmV0dXJuIDA7ICAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkCiAgIGludCBvZmZzZXQgPSBfXyBvZmZzZXQoKTsKIAogI2lmZGVmIF9MUDY0CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Nl8zMi5hZCBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0veDg2XzMyLmFkCmluZGV4IDUxMmVjMjAuLjQyYWJhNWIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0veDg2XzMyLmFkCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0veDg2XzMyLmFkCkBAIC0xODcwLDExICsxODcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYWxsX1JlbG9jYXRpb246OnNwZWMoKSwgUkVMT0NfSU1NMzIgKTsKICAgICB9CiAgICAgaWYgKF9tZXRob2QpIHsgIC8vIEVtaXQgc3R1YiBmb3Igc3RhdGljIGNhbGwuCi0gICAgICBhZGRyZXNzIHN0dWIgPSBDb21waWxlZFN0YXRpY0NhbGw6OmVtaXRfdG9faW50ZXJwX3N0dWIoY2J1Zik7Ci0gICAgICBpZiAoc3R1YiA9PSBOVUxMKSB7Ci0gICAgICAgIGNpRW52OjpjdXJyZW50KCktPnJlY29yZF9mYWlsdXJlKCJDb2RlQ2FjaGUgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IAorICAgICAgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKGNidWYpOwogICAgIH0KICAgJX0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS94ODZfNjQuYWQgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Nl82NC5hZAppbmRleCBlZDMwNGRmLi41MmJjNjM1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Nl82NC5hZAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3g4Nl82NC5hZApAQCAtMjEyNSwxMSArMjEyNSw3IEBACiAgICAgfQogICAgIGlmIChfbWV0aG9kKSB7CiAgICAgICAvLyBFbWl0IHN0dWIgZm9yIHN0YXRpYyBjYWxsLgotICAgICAgYWRkcmVzcyBzdHViID0gQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKGNidWYpOwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkgewotICAgICAgICBjaUVudjo6Y3VycmVudCgpLT5yZWNvcmRfZmFpbHVyZSgiQ29kZUNhY2hlIGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSAKKyAgICAgIENvbXBpbGVkU3RhdGljQ2FsbDo6ZW1pdF90b19pbnRlcnBfc3R1YihjYnVmKTsKICAgICB9CiAgICV9CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS96ZXJvL3ZtL2NvbXBpbGVkSUNfemVyby5jcHAgYi9ob3RzcG90L3NyYy9jcHUvemVyby92bS9jb21waWxlZElDX3plcm8uY3BwCmluZGV4IDE4NWE4YjEuLjE0M2RjMzEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS96ZXJvL3ZtL2NvbXBpbGVkSUNfemVyby5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3plcm8vdm0vY29tcGlsZWRJQ196ZXJvLmNwcApAQCAtNjAsOSArNjAsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWFkZHJlc3MgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKENvZGVCdWZmZXIgJmNidWYpIHsKK3ZvaWQgQ29tcGlsZWRTdGF0aWNDYWxsOjplbWl0X3RvX2ludGVycF9zdHViKENvZGVCdWZmZXIgJmNidWYpIHsKICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7IC8vIE9ubHkgbmVlZGVkIGZvciBDT01QSUxFUjIuCi0gIHJldHVybiBOVUxMOwogfQogCiBpbnQgQ29tcGlsZWRTdGF0aWNDYWxsOjp0b19pbnRlcnBfc3R1Yl9zaXplKCkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3plcm8vdm0vY3BwSW50ZXJwcmV0ZXJfemVyby5jcHAgYi9ob3RzcG90L3NyYy9jcHUvemVyby92bS9jcHBJbnRlcnByZXRlcl96ZXJvLmNwcAppbmRleCAyNDJjZTFjLi4xNWNmYzg2IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUvemVyby92bS9jcHBJbnRlcnByZXRlcl96ZXJvLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUvemVyby92bS9jcHBJbnRlcnByZXRlcl96ZXJvLmNwcApAQCAtMjIwLDE2ICsyMjAsOSBAQAogICAvLyBQdXNoIG91ciByZXN1bHQKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRfc2xvdHM7IGkrKykgewogICAgIC8vIEFkanVzdCByZXN1bHQgdG8gc21hbGxlcgotICAgIHVuaW9uIHsKLSAgICAgIGludHB0cl90IHJlczsKLSAgICAgIGppbnQgcmVzX2ppbnQ7Ci0gICAgfTsKLSAgICByZXMgPSByZXN1bHRbLWldOworICAgIGludHB0cl90IHJlcyA9IHJlc3VsdFstaV07CiAgICAgaWYgKHJlc3VsdF9zbG90cyA9PSAxKSB7Ci0gICAgICBCYXNpY1R5cGUgdCA9IG1ldGhvZC0+cmVzdWx0X3R5cGUoKTsKLSAgICAgIGlmIChpc19zdWJ3b3JkX3R5cGUodCkpIHsKLSAgICAgICAgcmVzX2ppbnQgPSAoamludCluYXJyb3codCwgcmVzX2ppbnQpOwotICAgICAgfQorICAgICAgcmVzID0gbmFycm93KG1ldGhvZC0+cmVzdWx0X3R5cGUoKSwgcmVzKTsKICAgICB9CiAgICAgc3RhY2stPnB1c2gocmVzKTsKICAgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3MvbGludXgvdm0vZ2xvYmFsc19saW51eC5ocHAgYi9ob3RzcG90L3NyYy9vcy9saW51eC92bS9nbG9iYWxzX2xpbnV4LmhwcAppbmRleCAzMmQ0NjE5Li44MzQyNGYyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9vcy9saW51eC92bS9nbG9iYWxzX2xpbnV4LmhwcAorKysgYi9ob3RzcG90L3NyYy9vcy9saW51eC92bS9nbG9iYWxzX2xpbnV4LmhwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ3LDEwICs0Nyw3IEBACiAgICAgICAgICAgIkxvYWQgRExMcyB3aXRoIGV4ZWN1dGFibGUtc3RhY2sgYXR0cmlidXRlIGluIHRoZSBWTSBUaHJlYWQiKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHByb2R1Y3QoYm9vbCwgVXNlU0hNLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIlVzZSBTWVNWIHNoYXJlZCBtZW1vcnkgZm9yIGxhcmdlIHBhZ2VzIikgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRpYWdub3N0aWMoYm9vbCwgUHJpbnRBY3RpdmVDcHVzLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIlByaW50IHRoZSBudW1iZXIgb2YgQ1BVcyBkZXRlY3RlZCBpbiBvczo6YWN0aXZlX3Byb2Nlc3Nvcl9jb3VudCIpCisgICAgICAgICAgIlVzZSBTWVNWIHNoYXJlZCBtZW1vcnkgZm9yIGxhcmdlIHBhZ2VzIikKIAogLy8KIC8vIERlZmluZXMgTGludXgtc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZXMuIFRoZSBmbGFncyBhcmUgYXZhaWxhYmxlIG9uIGFsbApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3MvbGludXgvdm0vb3NfbGludXguY3BwIGIvaG90c3BvdC9zcmMvb3MvbGludXgvdm0vb3NfbGludXguY3BwCmluZGV4IDI5MmQ0NzguLmM1OWI3MDIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL29zL2xpbnV4L3ZtL29zX2xpbnV4LmNwcAorKysgYi9ob3RzcG90L3NyYy9vcy9saW51eC92bS9vc19saW51eC5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMDQsMTQgKzEwNCw2IEBACiAKIFBSQUdNQV9GT1JNQVRfTVVURV9XQVJOSU5HU19GT1JfR0NDCiAKLSNpZm5kZWYgX0dOVV9TT1VSQ0UKLSAgI2RlZmluZSBfR05VX1NPVVJDRQotICAjaW5jbHVkZSA8c2NoZWQuaD4KLSAgI3VuZGVmIF9HTlVfU09VUkNFCi0jZWxzZQotICAjaW5jbHVkZSA8c2NoZWQuaD4KLSNlbmRpZgotCiAvLyBpZiBSVVNBR0VfVEhSRUFEIGZvciBnZXRydXNhZ2UoKSBoYXMgbm90IGJlZW4gZGVmaW5lZCwgZG8gaXQgaGVyZS4gVGhlIGNvZGUgY2FsbGluZwogLy8gZ2V0cnVzYWdlKCkgaXMgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZSBhc3NvY2lhdGVkIGZhaWx1cmUuCiAjaWZuZGVmIFJVU0FHRV9USFJFQUQKQEAgLTI4NTQsNyArMjg0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbGlicmFyeS4KICAgY29uc3Qgc2l6ZV90IEJpdHNQZXJDTG9uZyA9IHNpemVvZihsb25nKSAqIENIQVJfQklUOwogCi0gIHNpemVfdCBjcHVfbnVtID0gcHJvY2Vzc29yX2NvdW50KCk7CisgIHNpemVfdCBjcHVfbnVtID0gb3M6OmFjdGl2ZV9wcm9jZXNzb3JfY291bnQoKTsKICAgc2l6ZV90IGNwdV9tYXBfc2l6ZSA9IE5DUFVTIC8gQml0c1BlckNMb25nOwogICBzaXplX3QgY3B1X21hcF92YWxpZF9zaXplID0KICAgICBNSU4yKChjcHVfbnVtICsgQml0c1BlckNMb25nIC0gMSkgLyBCaXRzUGVyQ0xvbmcsIGNwdV9tYXBfc2l6ZSk7CkBAIC0zMDU1LDQ4ICszMDQ3LDYgQEAKICAgcmV0dXJuIGFkZHIgPT0gTUFQX0ZBSUxFRCA/IE5VTEwgOiBhZGRyOwogfQogCi0vLyBBbGxvY2F0ZSAodXNpbmcgbW1hcCwgTk9fUkVTRVJWRSwgd2l0aCBzbWFsbCBwYWdlcykgYXQgZWl0aGVyIGEgZ2l2ZW4gcmVxdWVzdCBhZGRyZXNzCi0vLyAgIChyZXFfYWRkciAhPSBOVUxMKSBvciB3aXRoIGEgZ2l2ZW4gYWxpZ25tZW50LgotLy8gIC0gYnl0ZXMgc2hhbGwgYmUgYSBtdWx0aXBsZSBvZiBhbGlnbm1lbnQuCi0vLyAgLSByZXFfYWRkciBjYW4gYmUgTlVMTC4gSWYgbm90IE5VTEwsIGl0IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBhbGlnbm1lbnQuCi0vLyAgLSBhbGlnbm1lbnQgc2V0cyB0aGUgYWxpZ25tZW50IGF0IHdoaWNoIG1lbW9yeSBzaGFsbCBiZSBhbGxvY2F0ZWQuCi0vLyAgICAgSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGFsbG9jYXRpb24gZ3JhbnVsYXJpdHkuCi0vLyBSZXR1cm5zIGFkZHJlc3Mgb2YgbWVtb3J5IG9yIE5VTEwuIElmIHJlcV9hZGRyIHdhcyBub3QgTlVMTCwgd2lsbCBvbmx5IHJldHVybgotLy8gIHJlcV9hZGRyIG9yIE5VTEwuCi1zdGF0aWMgY2hhciogYW5vbl9tbWFwX2FsaWduZWQoc2l6ZV90IGJ5dGVzLCBzaXplX3QgYWxpZ25tZW50LCBjaGFyKiByZXFfYWRkcikgewotCi0gIHNpemVfdCBleHRyYV9zaXplID0gYnl0ZXM7Ci0gIGlmIChyZXFfYWRkciA9PSBOVUxMICYmIGFsaWdubWVudCA+IDApIHsKLSAgICBleHRyYV9zaXplICs9IGFsaWdubWVudDsKLSAgfQotCi0gIGNoYXIqIHN0YXJ0ID0gKGNoYXIqKSA6Om1tYXAocmVxX2FkZHIsIGV4dHJhX3NpemUsIFBST1RfTk9ORSwKLSAgICBNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTfE1BUF9OT1JFU0VSVkUsCi0gICAgLTEsIDApOwotICBpZiAoc3RhcnQgPT0gTUFQX0ZBSUxFRCkgewotICAgIHN0YXJ0ID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBpZiAocmVxX2FkZHIgIT0gTlVMTCkgewotICAgICAgaWYgKHN0YXJ0ICE9IHJlcV9hZGRyKSB7Ci0gICAgICAgIDo6bXVubWFwKHN0YXJ0LCBleHRyYV9zaXplKTsKLSAgICAgICAgc3RhcnQgPSBOVUxMOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBjaGFyKiBjb25zdCBzdGFydF9hbGlnbmVkID0gKGNoYXIqKSBhbGlnbl9wdHJfdXAoc3RhcnQsIGFsaWdubWVudCk7Ci0gICAgICBjaGFyKiBjb25zdCBlbmRfYWxpZ25lZCA9IHN0YXJ0X2FsaWduZWQgKyBieXRlczsKLSAgICAgIGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZXh0cmFfc2l6ZTsKLSAgICAgIGlmIChzdGFydF9hbGlnbmVkID4gc3RhcnQpIHsKLSAgICAgICAgOjptdW5tYXAoc3RhcnQsIHN0YXJ0X2FsaWduZWQgLSBzdGFydCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZW5kX2FsaWduZWQgPCBlbmQpIHsKLSAgICAgICAgOjptdW5tYXAoZW5kX2FsaWduZWQsIGVuZCAtIGVuZF9hbGlnbmVkKTsKLSAgICAgIH0KLSAgICAgIHN0YXJ0ID0gc3RhcnRfYWxpZ25lZDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0YXJ0OwotfQotCiAvLyBEb24ndCB1cGRhdGUgX2hpZ2hlc3Rfdm1fcmVzZXJ2ZWRfYWRkcmVzcywgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBtZW1vcnkKIC8vIHJlZ2lvbnMgYWJvdmUgYWRkciArIHNpemUuIElmIHNvLCByZWxlYXNpbmcgYSBtZW1vcnkgcmVnaW9uIG9ubHkgY3JlYXRlcwogLy8gYSBob2xlIGluIHRoZSBhZGRyZXNzIHNwYWNlLCBpdCBkb2Vzbid0IGhlbHAgcHJldmVudCBoZWFwLXN0YWNrIGNvbGxpc2lvbi4KQEAgLTMzODEsMTMzICszMzMxLDU0IEBACiAjZGVmaW5lIFNITV9IVUdFVExCIDA0MDAwCiAjZW5kaWYKIAotI2RlZmluZSBzaG1fd2FybmluZ19mb3JtYXQoZm9ybWF0LCAuLi4pICAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoVXNlTGFyZ2VQYWdlcyAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoIUZMQUdfSVNfREVGQVVMVChVc2VMYXJnZVBhZ2VzKSB8fCAgICAgICAgICBcCi0gICAgICAgICAhRkxBR19JU19ERUZBVUxUKFVzZVNITSkgfHwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICFGTEFHX0lTX0RFRkFVTFQoTGFyZ2VQYWdlU2l6ZUluQnl0ZXMpKSkgeyAgXAotICAgICAgd2FybmluZyhmb3JtYXQsIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBzaG1fd2FybmluZyhzdHIpIHNobV93YXJuaW5nX2Zvcm1hdCgiJXMiLCBzdHIpCi0KLSNkZWZpbmUgc2htX3dhcm5pbmdfd2l0aF9lcnJubyhzdHIpICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgZXJyID0gZXJybm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzaG1fd2FybmluZ19mb3JtYXQoc3RyICIgKGVycm9yID0gJWQpIiwgZXJyKTsgIFwKLSAgfSB3aGlsZSAoMCkKLQotc3RhdGljIGNoYXIqIHNobWF0X3dpdGhfYWxpZ25tZW50KGludCBzaG1pZCwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgYWxpZ25tZW50KSB7Ci0gIGFzc2VydChpc19zaXplX2FsaWduZWQoYnl0ZXMsIGFsaWdubWVudCksICJNdXN0IGJlIGRpdmlzaWJsZSBieSB0aGUgYWxpZ25tZW50Iik7Ci0KLSAgaWYgKCFpc19zaXplX2FsaWduZWQoYWxpZ25tZW50LCBTSE1MQkEpKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCAiQ29kZSBiZWxvdyBhc3N1bWVzIHRoYXQgYWxpZ25tZW50IGlzIGF0IGxlYXN0IFNITUxCQSBhbGlnbmVkIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBUbyBlbnN1cmUgdGhhdCB3ZSBnZXQgJ2FsaWdubWVudCcgYWxpZ25lZCBtZW1vcnkgZnJvbSBzaG1hdCwKLSAgLy8gd2UgcHJlLXJlc2VydmUgYWxpZ25lZCB2aXJ0dWFsIG1lbW9yeSBhbmQgdGhlbiBhdHRhY2ggdG8gdGhhdC4KLQotICBjaGFyKiBwcmVfcmVzZXJ2ZWRfYWRkciA9IGFub25fbW1hcF9hbGlnbmVkKGJ5dGVzLCBhbGlnbm1lbnQsIE5VTEwpOwotICBpZiAocHJlX3Jlc2VydmVkX2FkZHIgPT0gTlVMTCkgewotICAgIC8vIENvdWxkbid0IHByZS1yZXNlcnZlIGFsaWduZWQgbWVtb3J5LgotICAgIHNobV93YXJuaW5nKCJGYWlsZWQgdG8gcHJlLXJlc2VydmUgYWxpZ25lZCBtZW1vcnkgZm9yIHNobWF0LiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gU0hNX1JFTUFQIGlzIG5lZWRlZCB0byBhbGxvdyBzaG1hdCB0byBtYXAgb3ZlciBhbiBleGlzdGluZyBtYXBwaW5nLgotICBjaGFyKiBhZGRyID0gKGNoYXIqKXNobWF0KHNobWlkLCBwcmVfcmVzZXJ2ZWRfYWRkciwgU0hNX1JFTUFQKTsKLQotICBpZiAoKGludHB0cl90KWFkZHIgPT0gLTEpIHsKLSAgICBpbnQgZXJyID0gZXJybm87Ci0gICAgc2htX3dhcm5pbmdfd2l0aF9lcnJubygiRmFpbGVkIHRvIGF0dGFjaCBzaGFyZWQgbWVtb3J5LiIpOwotCi0gICAgYXNzZXJ0KGVyciAhPSBFQUNDRVMsICJVbmV4cGVjdGVkIGVycm9yIik7Ci0gICAgYXNzZXJ0KGVyciAhPSBFSURSTSwgICJVbmV4cGVjdGVkIGVycm9yIik7Ci0gICAgYXNzZXJ0KGVyciAhPSBFSU5WQUwsICJVbmV4cGVjdGVkIGVycm9yIik7Ci0KLSAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBrZXJuZWwgdW5tYXBwZWQgdGhlIHByZS1yZXNlcnZlZCBtZW1vcnkgYXJlYQotICAgIC8vIHdlIGNhbid0IHVubWFwIGl0LCBzaW5jZSB0aGF0IHdvdWxkIHBvdGVudGlhbGx5IHVubWFwIG1lbW9yeSB0aGF0IHdhcwotICAgIC8vIG1hcHBlZCBmcm9tIG90aGVyIHRocmVhZHMuCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gYWRkcjsKLX0KLQotc3RhdGljIGNoYXIqIHNobWF0X2F0X2FkZHJlc3MoaW50IHNobWlkLCBjaGFyKiByZXFfYWRkcikgewotICBpZiAoIWlzX3B0cl9hbGlnbmVkKHJlcV9hZGRyLCBTSE1MQkEpKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCAiUmVxdWVzdGVkIGFkZHJlc3MgbmVlZHMgdG8gYmUgU0hNTEJBIGFsaWduZWQiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNoYXIqIGFkZHIgPSAoY2hhciopc2htYXQoc2htaWQsIHJlcV9hZGRyLCAwKTsKLQotICBpZiAoKGludHB0cl90KWFkZHIgPT0gLTEpIHsKLSAgICBzaG1fd2FybmluZ193aXRoX2Vycm5vKCJGYWlsZWQgdG8gYXR0YWNoIHNoYXJlZCBtZW1vcnkuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gYWRkcjsKLX0KLQotc3RhdGljIGNoYXIqIHNobWF0X2xhcmdlX3BhZ2VzKGludCBzaG1pZCwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgYWxpZ25tZW50LCBjaGFyKiByZXFfYWRkcikgewotICAvLyBJZiBhIHJlcV9hZGRyIGhhcyBiZWVuIHByb3ZpZGVkLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGFsaWduZWQgdGhlIGFkZHJlc3MuCi0gIGlmIChyZXFfYWRkciAhPSBOVUxMKSB7Ci0gICAgYXNzZXJ0KGlzX3B0cl9hbGlnbmVkKHJlcV9hZGRyLCBvczo6bGFyZ2VfcGFnZV9zaXplKCkpLCAiTXVzdCBiZSBkaXZpc2libGUgYnkgdGhlIGxhcmdlIHBhZ2Ugc2l6ZSIpOwotICAgIGFzc2VydChpc19wdHJfYWxpZ25lZChyZXFfYWRkciwgYWxpZ25tZW50KSwgIk11c3QgYmUgZGl2aXNpYmxlIGJ5IGdpdmVuIGFsaWdubWVudCIpOwotICAgIHJldHVybiBzaG1hdF9hdF9hZGRyZXNzKHNobWlkLCByZXFfYWRkcik7Ci0gIH0KLQotICAvLyBTaW5jZSBzaG1pZCBoYXMgYmVlbiBzZXR1cCB3aXRoIFNITV9IVUdFVExCLCBzaG1hdCB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgLy8gcmV0dXJuIGxhcmdlIHBhZ2Ugc2l6ZSBhbGlnbmVkIG1lbW9yeSBhZGRyZXNzZXMgd2hlbiByZXFfYWRkciA9PSBOVUxMLgotICAvLyBIb3dldmVyLCBpZiB0aGUgYWxpZ25tZW50IGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZSBwYWdlIHNpemUsIHdlIGhhdmUKLSAgLy8gdG8gbWFudWFsbHkgZW5zdXJlIHRoYXQgdGhlIG1lbW9yeSByZXR1cm5lZCBpcyAnYWxpZ25tZW50JyBhbGlnbmVkLgotICBpZiAoYWxpZ25tZW50ID4gb3M6OmxhcmdlX3BhZ2Vfc2l6ZSgpKSB7Ci0gICAgYXNzZXJ0KGlzX3NpemVfYWxpZ25lZChhbGlnbm1lbnQsIG9zOjpsYXJnZV9wYWdlX3NpemUoKSksICJNdXN0IGJlIGRpdmlzaWJsZSBieSB0aGUgbGFyZ2UgcGFnZSBzaXplIik7Ci0gICAgcmV0dXJuIHNobWF0X3dpdGhfYWxpZ25tZW50KHNobWlkLCBieXRlcywgYWxpZ25tZW50KTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc2htYXRfYXRfYWRkcmVzcyhzaG1pZCwgTlVMTCk7Ci0gIH0KLX0KLQogY2hhciogb3M6OkxpbnV4OjpyZXNlcnZlX21lbW9yeV9zcGVjaWFsX3NobShzaXplX3QgYnl0ZXMsIHNpemVfdCBhbGlnbm1lbnQsIGNoYXIqIHJlcV9hZGRyLCBib29sIGV4ZWMpIHsKICAgLy8gImV4ZWMiIGlzIHBhc3NlZCBpbiBidXQgbm90IHVzZWQuICBDcmVhdGluZyB0aGUgc2hhcmVkIGltYWdlIGZvcgogICAvLyB0aGUgY29kZSBjYWNoZSBkb2Vzbid0IGhhdmUgYW4gU0hNX1ggZXhlY3V0YWJsZSBwZXJtaXNzaW9uIHRvIGNoZWNrLgogICBhc3NlcnQoVXNlTGFyZ2VQYWdlcyAmJiBVc2VTSE0sICJvbmx5IGZvciBTSE0gbGFyZ2UgcGFnZXMiKTsKICAgYXNzZXJ0KGlzX3B0cl9hbGlnbmVkKHJlcV9hZGRyLCBvczo6bGFyZ2VfcGFnZV9zaXplKCkpLCAiVW5hbGlnbmVkIGFkZHJlc3MiKTsKLSAgYXNzZXJ0KGlzX3B0cl9hbGlnbmVkKHJlcV9hZGRyLCBhbGlnbm1lbnQpLCAiVW5hbGlnbmVkIGFkZHJlc3MiKTsKIAotICBpZiAoIWlzX3NpemVfYWxpZ25lZChieXRlcywgb3M6OmxhcmdlX3BhZ2Vfc2l6ZSgpKSkgeworICBpZiAoIWlzX3NpemVfYWxpZ25lZChieXRlcywgb3M6OmxhcmdlX3BhZ2Vfc2l6ZSgpKSB8fCBhbGlnbm1lbnQgPiBvczo6bGFyZ2VfcGFnZV9zaXplKCkpIHsKICAgICByZXR1cm4gTlVMTDsgLy8gRmFsbGJhY2sgdG8gc21hbGwgcGFnZXMuCiAgIH0KIAorICBrZXlfdCBrZXkgPSBJUENfUFJJVkFURTsKKyAgY2hhciAqYWRkcjsKKworICBib29sIHdhcm5fb25fZmFpbHVyZSA9IFVzZUxhcmdlUGFnZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICghRkxBR19JU19ERUZBVUxUKFVzZUxhcmdlUGFnZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIUZMQUdfSVNfREVGQVVMVChVc2VTSE0pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIUZMQUdfSVNfREVGQVVMVChMYXJnZVBhZ2VTaXplSW5CeXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIGNoYXIgbXNnWzEyOF07CisKICAgLy8gQ3JlYXRlIGEgbGFyZ2Ugc2hhcmVkIG1lbW9yeSByZWdpb24gdG8gYXR0YWNoIHRvIGJhc2VkIG9uIHNpemUuCi0gIC8vIEN1cnJlbnRseSwgc2l6ZSBpcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaGVhcC4KLSAgaW50IHNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBieXRlcywgU0hNX0hVR0VUTEJ8SVBDX0NSRUFUfFNITV9SfFNITV9XKTsKKyAgLy8gQ3VycmVudGx5LCBzaXplIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBoZWFwCisgIGludCBzaG1pZCA9IHNobWdldChrZXksIGJ5dGVzLCBTSE1fSFVHRVRMQnxJUENfQ1JFQVR8U0hNX1J8U0hNX1cpOwogICBpZiAoc2htaWQgPT0gLTEpIHsKLSAgICAvLyBQb3NzaWJsZSByZWFzb25zIGZvciBzaG1nZXQgZmFpbHVyZToKLSAgICAvLyAxLiBzaG1tYXggaXMgdG9vIHNtYWxsIGZvciBKYXZhIGhlYXAuCi0gICAgLy8gICAgPiBjaGVjayBzaG1tYXggdmFsdWU6IGNhdCAvcHJvYy9zeXMva2VybmVsL3NobW1heAotICAgIC8vICAgID4gaW5jcmVhc2Ugc2htbWF4IHZhbHVlOiBlY2hvICIweGZmZmZmZmZmIiA+IC9wcm9jL3N5cy9rZXJuZWwvc2htbWF4Ci0gICAgLy8gMi4gbm90IGVub3VnaCBsYXJnZSBwYWdlIG1lbW9yeS4KLSAgICAvLyAgICA+IGNoZWNrIGF2YWlsYWJsZSBsYXJnZSBwYWdlczogY2F0IC9wcm9jL21lbWluZm8KLSAgICAvLyAgICA+IGluY3JlYXNlIGFtb3VudCBvZiBsYXJnZSBwYWdlczoKLSAgICAvLyAgICAgICAgICBlY2hvIG5ld192YWx1ZSA+IC9wcm9jL3N5cy92bS9ucl9odWdlcGFnZXMKLSAgICAvLyAgICAgIE5vdGUgMTogZGlmZmVyZW50IExpbnV4IG1heSB1c2UgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgcHJvcGVydHksCi0gICAgLy8gICAgICAgICAgICBlLmcuIG9uIFJlZGhhdCBBUy0zIGl0IGlzICJodWdldGxiX3Bvb2wiLgotICAgIC8vICAgICAgTm90ZSAyOiBpdCdzIHBvc3NpYmxlIHRoZXJlJ3MgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBhdmFpbGFibGUgYnV0Ci0gICAgLy8gICAgICAgICAgICB0aGV5IGFyZSBzbyBmcmFnbWVudGVkIGFmdGVyIGEgbG9uZyBydW4gdGhhdCB0aGV5IGNhbid0Ci0gICAgLy8gICAgICAgICAgICBjb2FsZXNjZSBpbnRvIGxhcmdlIHBhZ2VzLiBUcnkgdG8gcmVzZXJ2ZSBsYXJnZSBwYWdlcyB3aGVuCi0gICAgLy8gICAgICAgICAgICB0aGUgc3lzdGVtIGlzIHN0aWxsICJmcmVzaCIuCi0gICAgc2htX3dhcm5pbmdfd2l0aF9lcnJubygiRmFpbGVkIHRvIHJlc2VydmUgc2hhcmVkIG1lbW9yeS4iKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICAgLy8gUG9zc2libGUgcmVhc29ucyBmb3Igc2htZ2V0IGZhaWx1cmU6CisgICAgIC8vIDEuIHNobW1heCBpcyB0b28gc21hbGwgZm9yIEphdmEgaGVhcC4KKyAgICAgLy8gICAgPiBjaGVjayBzaG1tYXggdmFsdWU6IGNhdCAvcHJvYy9zeXMva2VybmVsL3NobW1heAorICAgICAvLyAgICA+IGluY3JlYXNlIHNobW1heCB2YWx1ZTogZWNobyAiMHhmZmZmZmZmZiIgPiAvcHJvYy9zeXMva2VybmVsL3NobW1heAorICAgICAvLyAyLiBub3QgZW5vdWdoIGxhcmdlIHBhZ2UgbWVtb3J5LgorICAgICAvLyAgICA+IGNoZWNrIGF2YWlsYWJsZSBsYXJnZSBwYWdlczogY2F0IC9wcm9jL21lbWluZm8KKyAgICAgLy8gICAgPiBpbmNyZWFzZSBhbW91bnQgb2YgbGFyZ2UgcGFnZXM6CisgICAgIC8vICAgICAgICAgIGVjaG8gbmV3X3ZhbHVlID4gL3Byb2Mvc3lzL3ZtL25yX2h1Z2VwYWdlcworICAgICAvLyAgICAgIE5vdGUgMTogZGlmZmVyZW50IExpbnV4IG1heSB1c2UgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgcHJvcGVydHksCisgICAgIC8vICAgICAgICAgICAgZS5nLiBvbiBSZWRoYXQgQVMtMyBpdCBpcyAiaHVnZXRsYl9wb29sIi4KKyAgICAgLy8gICAgICBOb3RlIDI6IGl0J3MgcG9zc2libGUgdGhlcmUncyBlbm91Z2ggcGh5c2ljYWwgbWVtb3J5IGF2YWlsYWJsZSBidXQKKyAgICAgLy8gICAgICAgICAgICB0aGV5IGFyZSBzbyBmcmFnbWVudGVkIGFmdGVyIGEgbG9uZyBydW4gdGhhdCB0aGV5IGNhbid0CisgICAgIC8vICAgICAgICAgICAgY29hbGVzY2UgaW50byBsYXJnZSBwYWdlcy4gVHJ5IHRvIHJlc2VydmUgbGFyZ2UgcGFnZXMgd2hlbgorICAgICAvLyAgICAgICAgICAgIHRoZSBzeXN0ZW0gaXMgc3RpbGwgImZyZXNoIi4KKyAgICAgaWYgKHdhcm5fb25fZmFpbHVyZSkgeworICAgICAgIGppb19zbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiRmFpbGVkIHRvIHJlc2VydmUgc2hhcmVkIG1lbW9yeSAoZXJybm8gPSAlZCkuIiwgZXJybm8pOworICAgICAgIHdhcm5pbmcoIiVzIiwgbXNnKTsKKyAgICAgfQorICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIC8vIEF0dGFjaCB0byB0aGUgcmVnaW9uLgotICBjaGFyKiBhZGRyID0gc2htYXRfbGFyZ2VfcGFnZXMoc2htaWQsIGJ5dGVzLCBhbGlnbm1lbnQsIHJlcV9hZGRyKTsKKyAgLy8gYXR0YWNoIHRvIHRoZSByZWdpb24KKyAgYWRkciA9IChjaGFyKilzaG1hdChzaG1pZCwgcmVxX2FkZHIsIDApOworICBpbnQgZXJyID0gZXJybm87CiAKICAgLy8gUmVtb3ZlIHNobWlkLiBJZiBzaG1hdCgpIGlzIHN1Y2Nlc3NmdWwsIHRoZSBhY3R1YWwgc2hhcmVkIG1lbW9yeSBzZWdtZW50CiAgIC8vIHdpbGwgYmUgZGVsZXRlZCB3aGVuIGl0J3MgZGV0YWNoZWQgYnkgc2htZHQoKSBvciB3aGVuIHRoZSBwcm9jZXNzCkBAIC0zNTE1LDYgKzMzODYsMTQgQEAKICAgLy8gc2VnbWVudCBpbW1lZGlhdGVseS4KICAgc2htY3RsKHNobWlkLCBJUENfUk1JRCwgTlVMTCk7CiAKKyAgaWYgKChpbnRwdHJfdClhZGRyID09IC0xKSB7CisgICAgIGlmICh3YXJuX29uX2ZhaWx1cmUpIHsKKyAgICAgICBqaW9fc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkZhaWxlZCB0byBhdHRhY2ggc2hhcmVkIG1lbW9yeSAoZXJybm8gPSAlZCkuIiwgZXJyKTsKKyAgICAgICB3YXJuaW5nKCIlcyIsIG1zZyk7CisgICAgIH0KKyAgICAgcmV0dXJuIE5VTEw7CisgIH0KKwogICByZXR1cm4gYWRkcjsKIH0KIApAQCAtMzU1NCwyMiArMzQzMywyMiBAQAogICByZXR1cm4gYWRkcjsKIH0KIAotLy8gUmVzZXJ2ZSBtZW1vcnkgdXNpbmcgbW1hcChNQVBfSFVHRVRMQikuCi0vLyAgLSBieXRlcyBzaGFsbCBiZSBhIG11bHRpcGxlIG9mIGFsaWdubWVudC4KLS8vICAtIHJlcV9hZGRyIGNhbiBiZSBOVUxMLiBJZiBub3QgTlVMTCwgaXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGFsaWdubWVudC4KLS8vICAtIGFsaWdubWVudCBzZXRzIHRoZSBhbGlnbm1lbnQgYXQgd2hpY2ggbWVtb3J5IHNoYWxsIGJlIGFsbG9jYXRlZC4KLS8vICAgICBJdCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgYWxsb2NhdGlvbiBncmFudWxhcml0eS4KLS8vIFJldHVybnMgYWRkcmVzcyBvZiBtZW1vcnkgb3IgTlVMTC4gSWYgcmVxX2FkZHIgd2FzIG5vdCBOVUxMLCB3aWxsIG9ubHkgcmV0dXJuCi0vLyAgcmVxX2FkZHIgb3IgTlVMTC4KIGNoYXIqIG9zOjpMaW51eDo6cmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbF9odWdlX3RsYmZzX21peGVkKHNpemVfdCBieXRlcywgc2l6ZV90IGFsaWdubWVudCwgY2hhciogcmVxX2FkZHIsIGJvb2wgZXhlYykgewogICBzaXplX3QgbGFyZ2VfcGFnZV9zaXplID0gb3M6OmxhcmdlX3BhZ2Vfc2l6ZSgpOworCiAgIGFzc2VydChieXRlcyA+PSBsYXJnZV9wYWdlX3NpemUsICJTaG91bGRuJ3QgYWxsb2NhdGUgbGFyZ2UgcGFnZXMgZm9yIHNtYWxsIHNpemVzIik7CiAKLSAgYXNzZXJ0KGlzX3B0cl9hbGlnbmVkKHJlcV9hZGRyLCBhbGlnbm1lbnQpLCAiTXVzdCBiZSIpOwotICBhc3NlcnQoaXNfc2l6ZV9hbGlnbmVkKGJ5dGVzLCBhbGlnbm1lbnQpLCAiTXVzdCBiZSIpOworICAvLyBBbGxvY2F0ZSBzbWFsbCBwYWdlcy4KIAotICAvLyBGaXJzdCByZXNlcnZlIC0gYnV0IG5vdCBjb21taXQgLSB0aGUgYWRkcmVzcyByYW5nZSBpbiBzbWFsbCBwYWdlcy4KLSAgY2hhciogY29uc3Qgc3RhcnQgPSBhbm9uX21tYXBfYWxpZ25lZChieXRlcywgYWxpZ25tZW50LCByZXFfYWRkcik7CisgIGNoYXIqIHN0YXJ0OworICBpZiAocmVxX2FkZHIgIT0gTlVMTCkgeworICAgIGFzc2VydChpc19wdHJfYWxpZ25lZChyZXFfYWRkciwgYWxpZ25tZW50KSwgIk11c3QgYmUiKTsKKyAgICBhc3NlcnQoaXNfc2l6ZV9hbGlnbmVkKGJ5dGVzLCBhbGlnbm1lbnQpLCAiTXVzdCBiZSIpOworICAgIHN0YXJ0ID0gb3M6OnJlc2VydmVfbWVtb3J5KGJ5dGVzLCByZXFfYWRkcik7CisgICAgYXNzZXJ0KHN0YXJ0ID09IE5VTEwgfHwgc3RhcnQgPT0gcmVxX2FkZHIsICJNdXN0IGJlIik7CisgIH0gZWxzZSB7CisgICAgc3RhcnQgPSBvczo6cmVzZXJ2ZV9tZW1vcnlfYWxpZ25lZChieXRlcywgYWxpZ25tZW50KTsKKyAgfQogCiAgIGlmIChzdGFydCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNTc3LDYgKzM0NTYsMTMgQEAKIAogICBhc3NlcnQoaXNfcHRyX2FsaWduZWQoc3RhcnQsIGFsaWdubWVudCksICJNdXN0IGJlIik7CiAKKyAgaWYgKE1lbVRyYWNrZXI6OnRyYWNraW5nX2xldmVsKCkgPiBOTVRfbWluaW1hbCkgeworICAgIC8vIG9zOjpyZXNlcnZlX21lbW9yeV9zcGVjaWFsIHdpbGwgcmVjb3JkIHRoaXMgbWVtb3J5IGFyZWEuCisgICAgLy8gTmVlZCB0byByZWxlYXNlIGl0IGhlcmUgdG8gcHJldmVudCBvdmVybGFwcGluZyByZXNlcnZhdGlvbnMuCisgICAgVHJhY2tlciB0a3IgPSBNZW1UcmFja2VyOjpnZXRfdmlydHVhbF9tZW1vcnlfcmVsZWFzZV90cmFja2VyKCk7CisgICAgdGtyLnJlY29yZCgoYWRkcmVzcylzdGFydCwgYnl0ZXMpOworICB9CisKICAgY2hhciogZW5kID0gc3RhcnQgKyBieXRlczsKIAogICAvLyBGaW5kIHRoZSByZWdpb25zIG9mIHRoZSBhbGxvY2F0ZWQgY2h1bmsgdGhhdCBjYW4gYmUgcHJvbW90ZWQgdG8gbGFyZ2UgcGFnZXMuCkBAIC0zNTk2LDkgKzM0ODIsOSBAQAogCiAgIGludCBwcm90ID0gZXhlYyA/IFBST1RfUkVBRHxQUk9UX1dSSVRFfFBST1RfRVhFQyA6IFBST1RfUkVBRHxQUk9UX1dSSVRFOwogCisKICAgdm9pZCogcmVzdWx0OwogCi0gIC8vIENvbW1pdCBzbWFsbC1wYWdlZCBsZWFkaW5nIGFyZWEuCiAgIGlmIChzdGFydCAhPSBscF9zdGFydCkgewogICAgIHJlc3VsdCA9IDo6bW1hcChzdGFydCwgbHBfc3RhcnQgLSBzdGFydCwgcHJvdCwKICAgICAgICAgICAgICAgICAgICAgTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VU3xNQVBfRklYRUQsCkBAIC0zNjA5LDEyICszNDk1LDExIEBACiAgICAgfQogICB9CiAKLSAgLy8gQ29tbWl0IGxhcmdlLXBhZ2VkIGFyZWEuCiAgIHJlc3VsdCA9IDo6bW1hcChscF9zdGFydCwgbHBfYnl0ZXMsIHByb3QsCiAgICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTfE1BUF9GSVhFRHxNQVBfSFVHRVRMQiwKICAgICAgICAgICAgICAgICAgIC0xLCAwKTsKICAgaWYgKHJlc3VsdCA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgd2Fybl9vbl9sYXJnZV9wYWdlc19mYWlsdXJlKGxwX3N0YXJ0LCBscF9ieXRlcywgZXJybm8pOworICAgIHdhcm5fb25fbGFyZ2VfcGFnZXNfZmFpbHVyZShyZXFfYWRkciwgYnl0ZXMsIGVycm5vKTsKICAgICAvLyBJZiB0aGUgbW1hcCBhYm92ZSBmYWlscywgdGhlIGxhcmdlIHBhZ2VzIHJlZ2lvbiB3aWxsIGJlIHVubWFwcGVkIGFuZCB3ZQogICAgIC8vIGhhdmUgcmVnaW9ucyBiZWZvcmUgYW5kIGFmdGVyIHdpdGggc21hbGwgcGFnZXMuIFJlbGVhc2UgdGhlc2UgcmVnaW9ucy4KICAgICAvLwpAQCAtMzYyNyw3ICszNTEyLDYgQEAKICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIC8vIENvbW1pdCBzbWFsbC1wYWdlZCB0cmFpbGluZyBhcmVhLgogICBpZiAobHBfZW5kICE9IGVuZCkgewogICAgICAgcmVzdWx0ID0gOjptbWFwKGxwX2VuZCwgZW5kIC0gbHBfZW5kLCBwcm90LAogICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFfE1BUF9BTk9OWU1PVVN8TUFQX0ZJWEVELApAQCAtMzY0NCw3ICszNTI4LDcgQEAKIGNoYXIqIG9zOjpMaW51eDo6cmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbF9odWdlX3RsYmZzKHNpemVfdCBieXRlcywgc2l6ZV90IGFsaWdubWVudCwgY2hhciogcmVxX2FkZHIsIGJvb2wgZXhlYykgewogICBhc3NlcnQoVXNlTGFyZ2VQYWdlcyAmJiBVc2VIdWdlVExCRlMsICJvbmx5IGZvciBIdWdlIFRMQkZTIGxhcmdlIHBhZ2VzIik7CiAgIGFzc2VydChpc19wdHJfYWxpZ25lZChyZXFfYWRkciwgYWxpZ25tZW50KSwgIk11c3QgYmUiKTsKLSAgYXNzZXJ0KGlzX3NpemVfYWxpZ25lZChhbGlnbm1lbnQsIG9zOjp2bV9hbGxvY2F0aW9uX2dyYW51bGFyaXR5KCkpLCAiTXVzdCBiZSIpOworICBhc3NlcnQoaXNfcG93ZXJfb2ZfMihhbGlnbm1lbnQpLCAiTXVzdCBiZSIpOwogICBhc3NlcnQoaXNfcG93ZXJfb2ZfMihvczo6bGFyZ2VfcGFnZV9zaXplKCkpLCAiTXVzdCBiZSIpOwogICBhc3NlcnQoYnl0ZXMgPj0gb3M6OmxhcmdlX3BhZ2Vfc2l6ZSgpLCAiU2hvdWxkbid0IGFsbG9jYXRlIGxhcmdlIHBhZ2VzIGZvciBzbWFsbCBzaXplcyIpOwogCkBAIC01MDI0LDQyICs0OTA4LDEyIEBACiAgIH0KIH07CiAKLXN0YXRpYyBpbnQgb3NfY3B1X2NvdW50KGNvbnN0IGNwdV9zZXRfdCogY3B1cykgewotICBpbnQgY291bnQgPSAwOwotICAvLyBvbmx5IGxvb2sgdXAgdG8gdGhlIG51bWJlciBvZiBjb25maWd1cmVkIHByb2Nlc3NvcnMKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBvczo6cHJvY2Vzc29yX2NvdW50KCk7IGkrKykgewotICAgIGlmIChDUFVfSVNTRVQoaSwgY3B1cykpIHsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotLy8gR2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29ycyBmb3IgdGhpcyBwcm9jZXNzLgotLy8gVGhpcyB2YWx1ZSBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIGR1cmluZyBhIHByb2Nlc3MncyBsaWZldGltZS4KLS8vIHNjaGVkX2dldGFmZmluaXR5IGdpdmVzIGFuIGFjY3VyYXRlIGFuc3dlciBhcyBpdCBhY2NvdW50cyBmb3IgY3B1c2V0cy4KLS8vIElmIGFueXRoaW5nIGdvZXMgd3Jvbmcgd2UgZmFsbGJhY2sgdG8gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2Ygb25saW5lCi0vLyBwcm9jZXNzb3JzIC0gd2hpY2ggY2FuIGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIGF2YWlsYWJsZSB0byB0aGUgcHJvY2Vzcy4KIGludCBvczo6YWN0aXZlX3Byb2Nlc3Nvcl9jb3VudCgpIHsKLSAgY3B1X3NldF90IGNwdXM7ICAvLyBjYW4gcmVwcmVzZW50IGF0IG1vc3QgMTAyNCAoQ1BVX1NFVFNJWkUpIHByb2Nlc3NvcnMKLSAgaW50IGNwdXNfc2l6ZSA9IHNpemVvZihjcHVfc2V0X3QpOwotICBpbnQgY3B1X2NvdW50ID0gMDsKLQotICAvLyBwaWQgMCBtZWFucyB0aGUgY3VycmVudCB0aHJlYWQgLSB3aGljaCB3ZSBoYXZlIHRvIGFzc3VtZSByZXByZXNlbnRzIHRoZSBwcm9jZXNzCi0gIGlmIChzY2hlZF9nZXRhZmZpbml0eSgwLCBjcHVzX3NpemUsICZjcHVzKSA9PSAwKSB7Ci0gICAgY3B1X2NvdW50ID0gb3NfY3B1X2NvdW50KCZjcHVzKTsKLSAgICBpZiAoUHJpbnRBY3RpdmVDcHVzKSB7Ci0gICAgICB0dHktPnByaW50X2NyKCJhY3RpdmVfcHJvY2Vzc29yX2NvdW50OiBzY2hlZF9nZXRhZmZpbml0eSBwcm9jZXNzb3IgY291bnQ6ICVkIiwgY3B1X2NvdW50KTsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY3B1X2NvdW50ID0gOjpzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKLSAgICB3YXJuaW5nKCJzY2hlZF9nZXRhZmZpbml0eSBmYWlsZWQgKCVzKS0gdXNpbmcgb25saW5lIHByb2Nlc3NvciBjb3VudCAoJWQpICIKLSAgICAgICAgICAgICJ3aGljaCBtYXkgZXhjZWVkIGF2YWlsYWJsZSBwcm9jZXNzb3JzIiwgc3RyZXJyb3IoZXJybm8pLCBjcHVfY291bnQpOwotICB9Ci0KLSAgYXNzZXJ0KGNwdV9jb3VudCA+IDAgJiYgY3B1X2NvdW50IDw9IHByb2Nlc3Nvcl9jb3VudCgpLCAic2FuaXR5IGNoZWNrIik7Ci0gIHJldHVybiBjcHVfY291bnQ7CisgIC8vIExpbnV4IGRvZXNuJ3QgeWV0IGhhdmUgYSAob2ZmaWNpYWwpIG5vdGlvbiBvZiBwcm9jZXNzb3Igc2V0cywKKyAgLy8gc28ganVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBvbmxpbmUgcHJvY2Vzc29ycy4KKyAgaW50IG9ubGluZV9jcHVzID0gOjpzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyAgYXNzZXJ0KG9ubGluZV9jcHVzID4gMCAmJiBvbmxpbmVfY3B1cyA8PSBwcm9jZXNzb3JfY291bnQoKSwgInNhbml0eSBjaGVjayIpOworICByZXR1cm4gb25saW5lX2NwdXM7CiB9CiAKIHZvaWQgb3M6OnNldF9uYXRpdmVfdGhyZWFkX25hbWUoY29uc3QgY2hhciAqbmFtZSkgewpAQCAtNjI0OCwxMDAgKzYxMDIsNDcgQEAKICAgICB9CiAgIH0KIAorICBzdGF0aWMgdm9pZCB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZChzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCkgeworICAgIGlmICghVXNlSHVnZVRMQkZTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXN0X2xvZygidGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWQoIiBTSVpFX0ZPUk1BVCAiLCAiIFNJWkVfRk9STUFUICIpIiwKKyAgICAgICAgc2l6ZSwgYWxpZ25tZW50KTsKKworICAgIGFzc2VydChzaXplID49IG9zOjpsYXJnZV9wYWdlX3NpemUoKSwgIkluY29ycmVjdCBpbnB1dCB0byB0ZXN0Iik7CisKKyAgICBjaGFyKiBhZGRyID0gb3M6OkxpbnV4OjpyZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWQoc2l6ZSwgYWxpZ25tZW50LCBOVUxMLCBmYWxzZSk7CisKKyAgICBpZiAoYWRkciAhPSBOVUxMKSB7CisgICAgICBzbWFsbF9wYWdlX3dyaXRlKGFkZHIsIHNpemUpOworCisgICAgICBvczo6TGludXg6OnJlbGVhc2VfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmcyhhZGRyLCBzaXplKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZF9hbGxfYWxpZ25tZW50cyhzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBscCA9IG9zOjpsYXJnZV9wYWdlX3NpemUoKTsKKyAgICBzaXplX3QgYWcgPSBvczo6dm1fYWxsb2NhdGlvbl9ncmFudWxhcml0eSgpOworCisgICAgZm9yIChzaXplX3QgYWxpZ25tZW50ID0gYWc7IGlzX3NpemVfYWxpZ25lZChzaXplLCBhbGlnbm1lbnQpOyBhbGlnbm1lbnQgKj0gMikgeworICAgICAgdGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWQoc2l6ZSwgYWxpZ25tZW50KTsKKyAgICB9CisgIH0KKwogICBzdGF0aWMgdm9pZCB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZCgpIHsKICAgICBzaXplX3QgbHAgPSBvczo6bGFyZ2VfcGFnZV9zaXplKCk7CiAgICAgc2l6ZV90IGFnID0gb3M6OnZtX2FsbG9jYXRpb25fZ3JhbnVsYXJpdHkoKTsKIAotICAgIC8vIHNpemVzIHRvIHRlc3QKLSAgICBjb25zdCBzaXplX3Qgc2l6ZXNbXSA9IHsKLSAgICAgIGxwLCBscCArIGFnLCBscCArIGxwIC8gMiwgbHAgKiAyLAotICAgICAgbHAgKiAyICsgYWcsIGxwICogMiAtIGFnLCBscCAqIDIgKyBscCAvIDIsCi0gICAgICBscCAqIDEwLCBscCAqIDEwICsgbHAgLyAyCi0gICAgfTsKLSAgICBjb25zdCBpbnQgbnVtX3NpemVzID0gc2l6ZW9mKHNpemVzKSAvIHNpemVvZihzaXplX3QpOwotCi0gICAgLy8gRm9yIGVhY2ggc2l6ZS9hbGlnbm1lbnQgY29tYmluYXRpb24sIHdlIHRlc3QgdGhyZWUgc2NlbmFyaW9zOgotICAgIC8vIDEpIHdpdGggcmVxX2FkZHIgPT0gTlVMTAotICAgIC8vIDIpIHdpdGggYSBub24tbnVsbCByZXFfYWRkciBhdCB3aGljaCB3ZSBleHBlY3QgdG8gc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlCi0gICAgLy8gMykgd2l0aCBhIG5vbi1udWxsIHJlcV9hZGRyIHdoaWNoIGNvbnRhaW5zIGEgcHJlLWV4aXN0aW5nIG1hcHBpbmcsIGF0IHdoaWNoIHdlCi0gICAgLy8gICAgZXhwZWN0IHRoZSBhbGxvY2F0aW9uIHRvIGVpdGhlciBmYWlsIG9yIHRvIGlnbm9yZSByZXFfYWRkcgotCi0gICAgLy8gUHJlLWFsbG9jYXRlIHR3byBhcmVhczsgdGhleSBzaGFsbCBiZSBhcyBsYXJnZSBhcyB0aGUgbGFyZ2VzdCBhbGxvY2F0aW9uCi0gICAgLy8gIGFuZCBhbGlnbmVkIHRvIHRoZSBsYXJnZXN0IGFsaWdubWVudCB3ZSB3aWxsIGJlIHRlc3RpbmcuCi0gICAgY29uc3Qgc2l6ZV90IG1hcHBpbmdfc2l6ZSA9IHNpemVzW251bV9zaXplcyAtIDFdICogMjsKLSAgICBjaGFyKiBjb25zdCBtYXBwaW5nMSA9IChjaGFyKikgOjptbWFwKE5VTEwsIG1hcHBpbmdfc2l6ZSwKLSAgICAgIFBST1RfTk9ORSwgTUFQX1BSSVZBVEV8TUFQX0FOT05ZTU9VU3xNQVBfTk9SRVNFUlZFLAotICAgICAgLTEsIDApOwotICAgIGFzc2VydChtYXBwaW5nMSAhPSBNQVBfRkFJTEVELCAic2hvdWxkIHdvcmsiKTsKLQotICAgIGNoYXIqIGNvbnN0IG1hcHBpbmcyID0gKGNoYXIqKSA6Om1tYXAoTlVMTCwgbWFwcGluZ19zaXplLAotICAgICAgUFJPVF9OT05FLCBNQVBfUFJJVkFURXxNQVBfQU5PTllNT1VTfE1BUF9OT1JFU0VSVkUsCi0gICAgICAtMSwgMCk7Ci0gICAgYXNzZXJ0KG1hcHBpbmcyICE9IE1BUF9GQUlMRUQsICJzaG91bGQgd29yayIpOwotCi0gICAgLy8gVW5tYXAgdGhlIGZpcnN0IG1hcHBpbmcsIGJ1dCBsZWF2ZSB0aGUgc2Vjb25kIG1hcHBpbmcgaW50YWN0OiB0aGUgZmlyc3QKLSAgICAvLyBtYXBwaW5nIHdpbGwgc2VydmUgYXMgYSB2YWx1ZSBmb3IgYSAiZ29vZCIgcmVxX2FkZHIgKGNhc2UgMikuIFRoZSBzZWNvbmQKLSAgICAvLyBtYXBwaW5nLCBzdGlsbCBpbnRhY3QsIGFzICJiYWQiIHJlcV9hZGRyIChjYXNlIDMpLgotICAgIDo6bXVubWFwKG1hcHBpbmcxLCBtYXBwaW5nX3NpemUpOwotCi0gICAgLy8gQ2FzZSAxCi0gICAgdGVzdF9sb2coIiVzLCByZXFfYWRkciBOVUxMOiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgdGVzdF9sb2coInNpemUgICAgICAgICAgICBhbGlnbiAgICAgICAgICAgcmVzdWx0Iik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9zaXplczsgaSsrKSB7Ci0gICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVzW2ldOwotICAgICAgZm9yIChzaXplX3QgYWxpZ25tZW50ID0gYWc7IGlzX3NpemVfYWxpZ25lZChzaXplLCBhbGlnbm1lbnQpOyBhbGlnbm1lbnQgKj0gMikgewotICAgICAgICBjaGFyKiBwID0gb3M6OkxpbnV4OjpyZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWQoc2l6ZSwgYWxpZ25tZW50LCBOVUxMLCBmYWxzZSk7Ci0gICAgICAgIHRlc3RfbG9nKFNJWkVfRk9STUFUX0hFWCAiICIgU0laRV9GT1JNQVRfSEVYICIgLT4gICIgUFRSX0ZPUk1BVCAiICVzIiwKLSAgICAgICAgICAgIHNpemUsIGFsaWdubWVudCwgcCwgKHAgIT0gTlVMTCA/ICIiIDogIihmYWlsZWQpIikpOwotICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgYXNzZXJ0KGlzX3B0cl9hbGlnbmVkKHAsIGFsaWdubWVudCksICJtdXN0IGJlIik7Ci0gICAgICAgICAgc21hbGxfcGFnZV93cml0ZShwLCBzaXplKTsKLSAgICAgICAgICBvczo6TGludXg6OnJlbGVhc2VfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmcyhwLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENhc2UgMgotICAgIHRlc3RfbG9nKCIlcywgcmVxX2FkZHIgbm9uLU5VTEw6IiwgX19GVU5DVElPTl9fKTsKLSAgICB0ZXN0X2xvZygic2l6ZSAgICAgICAgICAgIGFsaWduICAgICAgICAgICByZXFfYWRkciAgICAgICAgIHJlc3VsdCIpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fc2l6ZXM7IGkrKykgewotICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplc1tpXTsKLSAgICAgIGZvciAoc2l6ZV90IGFsaWdubWVudCA9IGFnOyBpc19zaXplX2FsaWduZWQoc2l6ZSwgYWxpZ25tZW50KTsgYWxpZ25tZW50ICo9IDIpIHsKLSAgICAgICAgY2hhciogY29uc3QgcmVxX2FkZHIgPSAoY2hhciopIGFsaWduX3B0cl91cChtYXBwaW5nMSwgYWxpZ25tZW50KTsKLSAgICAgICAgY2hhciogcCA9IG9zOjpMaW51eDo6cmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbF9odWdlX3RsYmZzX21peGVkKHNpemUsIGFsaWdubWVudCwgcmVxX2FkZHIsIGZhbHNlKTsKLSAgICAgICAgdGVzdF9sb2coU0laRV9GT1JNQVRfSEVYICIgIiBTSVpFX0ZPUk1BVF9IRVggIiAiIFBUUl9GT1JNQVQgIiAtPiAgIiBQVFJfRk9STUFUICIgJXMiLAotICAgICAgICAgICAgc2l6ZSwgYWxpZ25tZW50LCByZXFfYWRkciwgcCwKLSAgICAgICAgICAgICgocCAhPSBOVUxMID8gKHAgPT0gcmVxX2FkZHIgPyAiKGV4YWN0IG1hdGNoKSIgOiAiIikgOiAiKGZhaWxlZCkiKSkpOwotICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgYXNzZXJ0KHAgPT0gcmVxX2FkZHIsICJtdXN0IGJlIik7Ci0gICAgICAgICAgc21hbGxfcGFnZV93cml0ZShwLCBzaXplKTsKLSAgICAgICAgICBvczo6TGludXg6OnJlbGVhc2VfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmcyhwLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENhc2UgMwotICAgIHRlc3RfbG9nKCIlcywgcmVxX2FkZHIgbm9uLU5VTEwgd2l0aCBwcmVleGlzdGluZyBtYXBwaW5nOiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgdGVzdF9sb2coInNpemUgICAgICAgICAgICBhbGlnbiAgICAgICAgICAgcmVxX2FkZHIgICAgICAgICByZXN1bHQiKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3NpemVzOyBpKyspIHsKLSAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZXNbaV07Ci0gICAgICBmb3IgKHNpemVfdCBhbGlnbm1lbnQgPSBhZzsgaXNfc2l6ZV9hbGlnbmVkKHNpemUsIGFsaWdubWVudCk7IGFsaWdubWVudCAqPSAyKSB7Ci0gICAgICAgIGNoYXIqIGNvbnN0IHJlcV9hZGRyID0gKGNoYXIqKSBhbGlnbl9wdHJfdXAobWFwcGluZzIsIGFsaWdubWVudCk7Ci0gICAgICAgIGNoYXIqIHAgPSBvczo6TGludXg6OnJlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZChzaXplLCBhbGlnbm1lbnQsIHJlcV9hZGRyLCBmYWxzZSk7Ci0gICAgICAgIHRlc3RfbG9nKFNJWkVfRk9STUFUX0hFWCAiICIgU0laRV9GT1JNQVRfSEVYICIgIiBQVFJfRk9STUFUICIgLT4gICIgUFRSX0ZPUk1BVCAiICVzIiwKLSAgICAgICAgICAgIHNpemUsIGFsaWdubWVudCwgcmVxX2FkZHIsIHAsCi0gICAgICAgICAgICAoKHAgIT0gTlVMTCA/ICIiIDogIihmYWlsZWQpIikpKTsKLSAgICAgICAgLy8gYXMgdGhlIGFyZWEgYXJvdW5kIHJlcV9hZGRyIGNvbnRhaW5zIGFscmVhZHkgZXhpc3RpbmcgbWFwcGluZ3MsIHRoZSBBUEkgc2hvdWxkIGFsd2F5cwotICAgICAgICAvLyByZXR1cm4gTlVMTCAoYXMgcGVyIGNvbnRyYWN0LCBpdCBjYW5ub3QgcmV0dXJuIGFub3RoZXIgYWRkcmVzcykKLSAgICAgICAgYXNzZXJ0KHAgPT0gTlVMTCwgIm11c3QgYmUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICA6Om11bm1hcChtYXBwaW5nMiwgbWFwcGluZ19zaXplKTsKLQorICAgIHRlc3RfcmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbF9odWdlX3RsYmZzX21peGVkX2FsbF9hbGlnbm1lbnRzKGxwKTsKKyAgICB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZF9hbGxfYWxpZ25tZW50cyhscCArIGFnKTsKKyAgICB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZF9hbGxfYWxpZ25tZW50cyhscCArIGxwIC8gMik7CisgICAgdGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWRfYWxsX2FsaWdubWVudHMobHAgKiAyKTsKKyAgICB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmc19taXhlZF9hbGxfYWxpZ25tZW50cyhscCAqIDIgKyBhZyk7CisgICAgdGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWRfYWxsX2FsaWdubWVudHMobHAgKiAyIC0gYWcpOworICAgIHRlc3RfcmVzZXJ2ZV9tZW1vcnlfc3BlY2lhbF9odWdlX3RsYmZzX21peGVkX2FsbF9hbGlnbm1lbnRzKGxwICogMiArIGxwIC8gMik7CisgICAgdGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWRfYWxsX2FsaWdubWVudHMobHAgKiAxMCk7CisgICAgdGVzdF9yZXNlcnZlX21lbW9yeV9zcGVjaWFsX2h1Z2VfdGxiZnNfbWl4ZWRfYWxsX2FsaWdubWVudHMobHAgKiAxMCArIGxwIC8gMik7CiAgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3Jlc2VydmVfbWVtb3J5X3NwZWNpYWxfaHVnZV90bGJmcygpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0xJUkFzc2VtYmxlci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jMS9jMV9MSVJBc3NlbWJsZXIuY3BwCmluZGV4IDM0NDdlMDcuLmVmMmIxMDYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0xJUkFzc2VtYmxlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vYzEvYzFfTElSQXNzZW1ibGVyLmNwcApAQCAtNDY0LDcgKzQ2NCw2IEBACiAKICAgLy8gZW1pdCB0aGUgc3RhdGljIGNhbGwgc3R1YiBzdHVmZiBvdXQgb2YgbGluZQogICBlbWl0X3N0YXRpY19jYWxsX3N0dWIoKTsKLSAgQ0hFQ0tfQkFJTE9VVCgpOwogCiAgIHN3aXRjaCAob3AtPmNvZGUoKSkgewogICBjYXNlIGxpcl9zdGF0aWNfY2FsbDoKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0ZpbGVQYXJzZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzRmlsZVBhcnNlci5jcHAKaW5kZXggOTY3ODI4Ny4uMjNhMGNlYyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzRmlsZVBhcnNlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzRmlsZVBhcnNlci5jcHAKQEAgLTUzNyw5ICs1MzcsNiBAQAogICAgICAgICAgIGludCBuYW1lX2luZGV4ID0gY3AtPm5hbWVfcmVmX2luZGV4X2F0KGluZGV4KTsKICAgICAgICAgICBTeW1ib2wqICBuYW1lID0gY3AtPnN5bWJvbF9hdChuYW1lX2luZGV4KTsKICAgICAgICAgICBTeW1ib2wqICBzaWcgPSBjcC0+c3ltYm9sX2F0KHNpZ19pbmRleCk7Ci0gICAgICAgICAgZ3VhcmFudGVlX3Byb3BlcnR5KHNpZy0+dXRmOF9sZW5ndGgoKSAhPSAwLAotICAgICAgICAgICAgIklsbGVnYWwgemVybyBsZW5ndGggY29uc3RhbnQgcG9vbCBlbnRyeSBhdCAlZCBpbiBjbGFzcyAlcyIsCi0gICAgICAgICAgICBzaWdfaW5kZXgsIENIRUNLXyhudWxsSGFuZGxlKSk7CiAgICAgICAgICAgaWYgKHNpZy0+Ynl0ZV9hdCgwKSA9PSBKVk1fU0lHTkFUVVJFX0ZVTkMpIHsKICAgICAgICAgICAgIHZlcmlmeV9sZWdhbF9tZXRob2Rfc2lnbmF0dXJlKG5hbWUsIHNpZywgQ0hFQ0tfKG51bGxIYW5kbGUpKTsKICAgICAgICAgICB9IGVsc2UgewpAQCAtNTYzLDkgKzU2MCw4IEBACiAgICAgICAgICAgdmVyaWZ5X2xlZ2FsX2ZpZWxkX25hbWUobmFtZSwgQ0hFQ0tfKG51bGxIYW5kbGUpKTsKICAgICAgICAgICBpZiAoX25lZWRfdmVyaWZ5ICYmIF9tYWpvcl92ZXJzaW9uID49IEpBVkFfN19WRVJTSU9OKSB7CiAgICAgICAgICAgICAvLyBTaWduYXR1cmUgaXMgdmVyaWZpZWQgYWJvdmUsIHdoZW4gaXRlcmF0aW5nIE5hbWVBbmRUeXBlX2luZm8uCi0gICAgICAgICAgICAvLyBOZWVkIG9ubHkgdG8gYmUgc3VyZSBpdCdzIG5vbi16ZXJvIGxlbmd0aCBhbmQgdGhlIHJpZ2h0IHR5cGUuCi0gICAgICAgICAgICBpZiAoc2lnbmF0dXJlLT51dGY4X2xlbmd0aCgpID09IDAgfHwKLSAgICAgICAgICAgICAgICBzaWduYXR1cmUtPmJ5dGVfYXQoMCkgPT0gSlZNX1NJR05BVFVSRV9GVU5DKSB7CisgICAgICAgICAgICAvLyBOZWVkIG9ubHkgdG8gYmUgc3VyZSBpdCdzIHRoZSByaWdodCB0eXBlLgorICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS0+Ynl0ZV9hdCgwKSA9PSBKVk1fU0lHTkFUVVJFX0ZVTkMpIHsKICAgICAgICAgICAgICAgdGhyb3dJbGxlZ2FsU2lnbmF0dXJlKAogICAgICAgICAgICAgICAgICAgIkZpZWxkIiwgbmFtZSwgc2lnbmF0dXJlLCBDSEVDS18obnVsbEhhbmRsZSkpOwogICAgICAgICAgICAgfQpAQCAtNTc2LDkgKzU3Miw4IEBACiAgICAgICAgICAgdmVyaWZ5X2xlZ2FsX21ldGhvZF9uYW1lKG5hbWUsIENIRUNLXyhudWxsSGFuZGxlKSk7CiAgICAgICAgICAgaWYgKF9uZWVkX3ZlcmlmeSAmJiBfbWFqb3JfdmVyc2lvbiA+PSBKQVZBXzdfVkVSU0lPTikgewogICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGlzIHZlcmlmaWVkIGFib3ZlLCB3aGVuIGl0ZXJhdGluZyBOYW1lQW5kVHlwZV9pbmZvLgotICAgICAgICAgICAgLy8gTmVlZCBvbmx5IHRvIGJlIHN1cmUgaXQncyBub24temVybyBsZW5ndGggYW5kIHRoZSByaWdodCB0eXBlLgotICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS0+dXRmOF9sZW5ndGgoKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgc2lnbmF0dXJlLT5ieXRlX2F0KDApICE9IEpWTV9TSUdOQVRVUkVfRlVOQykgeworICAgICAgICAgICAgLy8gTmVlZCBvbmx5IHRvIGJlIHN1cmUgaXQncyB0aGUgcmlnaHQgdHlwZS4KKyAgICAgICAgICAgIGlmIChzaWduYXR1cmUtPmJ5dGVfYXQoMCkgIT0gSlZNX1NJR05BVFVSRV9GVU5DKSB7CiAgICAgICAgICAgICAgIHRocm93SWxsZWdhbFNpZ25hdHVyZSgKICAgICAgICAgICAgICAgICAgICJNZXRob2QiLCBuYW1lLCBzaWduYXR1cmUsIENIRUNLXyhudWxsSGFuZGxlKSk7CiAgICAgICAgICAgICB9CkBAIC01ODksNyArNTg0LDggQEAKICAgICAgICAgICAgIC8vIDQ1MDkwMTQ6IElmIGEgY2xhc3MgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggJzwnLCBpdCBtdXN0IGJlICI8aW5pdD4iLgogICAgICAgICAgICAgYXNzZXJ0KG5hbWUgIT0gTlVMTCwgIm1ldGhvZCBuYW1lIGluIGNvbnN0YW50IHBvb2wgaXMgbnVsbCIpOwogICAgICAgICAgICAgdW5zaWduZWQgaW50IG5hbWVfbGVuID0gbmFtZS0+dXRmOF9sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChuYW1lX2xlbiAhPSAwICYmIG5hbWUtPmJ5dGVfYXQoMCkgPT0gJzwnKSB7CisgICAgICAgICAgICBhc3NlcnQobmFtZV9sZW4gPiAwLCAiYmFkIG1ldGhvZCBuYW1lIik7ICAvLyBhbHJlYWR5IHZlcmlmaWVkIGFzIGxlZ2FsIG5hbWUKKyAgICAgICAgICAgIGlmIChuYW1lLT5ieXRlX2F0KDApID09ICc8JykgewogICAgICAgICAgICAgICBpZiAobmFtZSAhPSB2bVN5bWJvbHM6Om9iamVjdF9pbml0aWFsaXplcl9uYW1lKCkpIHsKICAgICAgICAgICAgICAgICBjbGFzc2ZpbGVfcGFyc2VfZXJyb3IoCiAgICAgICAgICAgICAgICAgICAiQmFkIG1ldGhvZCBuYW1lIGF0IGNvbnN0YW50IHBvb2wgaW5kZXggJXUgaW4gY2xhc3MgZmlsZSAlcyIsCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvY2xhc3NMb2FkZXJEYXRhLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0xvYWRlckRhdGEuY3BwCmluZGV4IDFmMjVlMTUuLjJlODUyZjMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0xvYWRlckRhdGEuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0xvYWRlckRhdGEuY3BwCkBAIC04MTMsMTIgKzgxMyw2IEBACiAgICAgLy8gY2FsbGVkIG9uIGFsbCBhbGl2ZSBjbGFzc2VzLiBTZWUgdGhlIGNvbW1lbnQgaW4gQ2xhc3NMb2FkZXJEYXRhR3JhcGg6OmNsZWFuX21ldGFzcGFjZXMuCiAgICAgY2xkLT5mcmVlX2RlYWxsb2NhdGVfbGlzdCgpOwogICB9Ci0KLSAgLy8gSW4gc29tZSByYXJlIGNhc2VzIGl0ZW1zIGFkZGVkIHRvIHRoZSB1bmxvYWRpbmcgbGlzdCB3aWxsIG5vdCBiZSBmcmVlZCBlbHNld2hlcmUuCi0gIC8vIFRvIGtlZXAgaXQgc2ltcGxlLCB3YWxrIHRoZSBfdW5sb2FkaW5nIGxpc3QgYWxzby4KLSAgZm9yIChDbGFzc0xvYWRlckRhdGEqIGNsZCA9IF91bmxvYWRpbmc7IGNsZCAhPSBfc2F2ZWRfdW5sb2FkaW5nOyBjbGQgPSBjbGQtPm5leHQoKSkgewotICAgIGNsZC0+ZnJlZV9kZWFsbG9jYXRlX2xpc3QoKTsKLSAgfQogfQogCiAvLyBDRFMgc3VwcG9ydApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzTG9hZGVyRGF0YS5pbmxpbmUuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL2NsYXNzTG9hZGVyRGF0YS5pbmxpbmUuaHBwCmluZGV4IDc1NWFjNTQuLjExMDE0ZjIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9jbGFzc0xvYWRlckRhdGEuaW5saW5lLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvY2xhc3NMb2FkZXJEYXRhLmlubGluZS5ocHAKQEAgLTQwLDcgKzQwLDcgQEAKIAogCiBpbmxpbmUgQ2xhc3NMb2FkZXJEYXRhICpDbGFzc0xvYWRlckRhdGFHcmFwaDo6ZmluZF9vcl9jcmVhdGUoSGFuZGxlIGxvYWRlciwgVFJBUFMpIHsKLSAgZ3VhcmFudGVlKGxvYWRlcigpICE9IE5VTEwgJiYgbG9hZGVyKCktPmlzX29vcCgpLCAiTG9hZGVyIG11c3QgYmUgb29wIik7CisgIGFzc2VydChsb2FkZXIoKSAhPSBOVUxMLCJNdXN0IGJlIGEgY2xhc3MgbG9hZGVyIik7CiAgIC8vIEdldHMgdGhlIGNsYXNzIGxvYWRlciBkYXRhIG91dCBvZiB0aGUgamF2YS9sYW5nL0NsYXNzTG9hZGVyIG9iamVjdCwgaWYgbm9uLW51bGwKICAgLy8gaXQncyBhbHJlYWR5IGluIHRoZSBsb2FkZXJfZGF0YSwgc28gbm8gbmVlZCB0byBhZGQKICAgQ2xhc3NMb2FkZXJEYXRhKiBsb2FkZXJfZGF0YT0gamF2YV9sYW5nX0NsYXNzTG9hZGVyOjpsb2FkZXJfZGF0YShsb2FkZXIoKSk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvc3lzdGVtRGljdGlvbmFyeS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvc3lzdGVtRGljdGlvbmFyeS5jcHAKaW5kZXggMWRmZTNiNi4uMzFiZTE0YiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL3N5c3RlbURpY3Rpb25hcnkuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS9zeXN0ZW1EaWN0aW9uYXJ5LmNwcApAQCAtMTA4NCwxOCArMTA4NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVBRCk7CiAKICAgY29uc3QgY2hhciogcGtnID0gImphdmEvIjsKLSAgc2l6ZV90IHBrZ2xlbiA9IHN0cmxlbihwa2cpOwogICBpZiAoIUhBU19QRU5ESU5HX0VYQ0VQVElPTiAmJgogICAgICAgIWNsYXNzX2xvYWRlci5pc19udWxsKCkgJiYKICAgICAgIHBhcnNlZF9uYW1lICE9IE5VTEwgJiYKLSAgICAgIHBhcnNlZF9uYW1lLT51dGY4X2xlbmd0aCgpID49IChpbnQpcGtnbGVuICYmCi0gICAgICAhc3RybmNtcCgoY29uc3QgY2hhciopcGFyc2VkX25hbWUtPmJ5dGVzKCksIHBrZywgcGtnbGVuKSkgeworICAgICAgIXN0cm5jbXAoKGNvbnN0IGNoYXIqKXBhcnNlZF9uYW1lLT5ieXRlcygpLCBwa2csIHN0cmxlbihwa2cpKSkgewogICAgIC8vIEl0IGlzIGlsbGVnYWwgdG8gZGVmaW5lIGNsYXNzZXMgaW4gdGhlICJqYXZhLiIgcGFja2FnZSBmcm9tCiAgICAgLy8gSlZNX0RlZmluZUNsYXNzIG9yIGpuaV9EZWZpbmVDbGFzcyB1bmxlc3MgeW91J3JlIHRoZSBib290Y2xhc3Nsb2FkZXIKICAgICBSZXNvdXJjZU1hcmsgcm0oVEhSRUFEKTsKICAgICBjaGFyKiBuYW1lID0gcGFyc2VkX25hbWUtPmFzX0Nfc3RyaW5nKCk7CiAgICAgY2hhciogaW5kZXggPSBzdHJyY2hyKG5hbWUsICcvJyk7Ci0gICAgYXNzZXJ0KGluZGV4ICE9IE5VTEwsICJtdXN0IGJlIik7CiAgICAgKmluZGV4ID0gJ1wwJzsgLy8gY2hvcCB0byBqdXN0IHRoZSBwYWNrYWdlIG5hbWUKICAgICB3aGlsZSAoKGluZGV4ID0gc3RyY2hyKG5hbWUsICcvJykpICE9IE5VTEwpIHsKICAgICAgICppbmRleCA9ICcuJzsgLy8gcmVwbGFjZSAnLycgd2l0aCAnLicgaW4gcGFja2FnZSBuYW1lCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdm1TeW1ib2xzLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCmluZGV4IDUyODE3NTguLmI4NTdjYjMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NsYXNzZmlsZS92bVN5bWJvbHMuaHBwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTE3LDcgKzUxNyw2IEBACiAgIHRlbXBsYXRlKGludF9TdHJpbmdCdWZmZXJfc2lnbmF0dXJlLCAgICAgICAgICAgICAgICAiKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKGNoYXJfU3RyaW5nQnVmZmVyX3NpZ25hdHVyZSwgICAgICAgICAgICAgICAiKEMpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKGludF9TdHJpbmdfc2lnbmF0dXJlLCAgICAgICAgICAgICAgICAgICAgICAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlKGNvZGVzb3VyY2VfcGVybWlzc2lvbmNvbGxlY3Rpb25fc2lnbmF0dXJlLCAiKExqYXZhL3NlY3VyaXR5L0NvZGVTb3VyY2U7TGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb247KVYiKSBcCiAgIC8qIHNpZ25hdHVyZSBzeW1ib2xzIG5lZWRlZCBieSBpbnRyaW5zaWNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFZNX0lOVFJJTlNJQ1NfRE8oVk1fSU5UUklOU0lDX0lHTk9SRSwgVk1fU1lNQk9MX0lHTk9SRSwgVk1fU1lNQk9MX0lHTk9SRSwgdGVtcGxhdGUsIFZNX0FMSUFTX0lHTk9SRSkgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jb2RlL2NvbXBpbGVkSUMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29kZS9jb21waWxlZElDLmhwcAppbmRleCBkZTcyNDIzLi5iNzk3MzI5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jb2RlL2NvbXBpbGVkSUMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NvZGUvY29tcGlsZWRJQy5ocHAKQEAgLTMyMCw3ICszMjAsNyBAQAogICBmcmllbmQgQ29tcGlsZWRTdGF0aWNDYWxsKiBjb21waWxlZFN0YXRpY0NhbGxfYXQoUmVsb2NhdGlvbiogY2FsbF9zaXRlKTsKIAogICAvLyBDb2RlCi0gIHN0YXRpYyBhZGRyZXNzIGVtaXRfdG9faW50ZXJwX3N0dWIoQ29kZUJ1ZmZlciAmY2J1Zik7CisgIHN0YXRpYyB2b2lkIGVtaXRfdG9faW50ZXJwX3N0dWIoQ29kZUJ1ZmZlciAmY2J1Zik7CiAgIHN0YXRpYyBpbnQgdG9faW50ZXJwX3N0dWJfc2l6ZSgpOwogICBzdGF0aWMgaW50IHJlbG9jX3RvX2ludGVycF9zdHViKCk7CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NvZGUvbm1ldGhvZC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jb2RlL25tZXRob2QuY3BwCmluZGV4IGUyMGY1MDcuLjZlYTM5YWUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NvZGUvbm1ldGhvZC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29kZS9ubWV0aG9kLmNwcApAQCAtMjI5MCw3ICsyMjkwLDcgQEAKICAgICBhc3NlcnQoY3VyICE9IE5VTEwsICJub3QgTlVMTC10ZXJtaW5hdGVkIik7CiAgICAgbm1ldGhvZCogbmV4dCA9IGN1ci0+X29vcHNfZG9fbWFya19saW5rOwogICAgIGN1ci0+X29vcHNfZG9fbWFya19saW5rID0gTlVMTDsKLSAgICBERUJVR19PTkxZKGN1ci0+dmVyaWZ5X29vcF9yZWxvY2F0aW9ucygpKTsKKyAgICBjdXItPnZlcmlmeV9vb3BfcmVsb2NhdGlvbnMoKTsKICAgICBOT1RfUFJPRFVDVChpZiAoVHJhY2VTY2F2ZW5nZSkgIGN1ci0+cHJpbnRfb24odHR5LCAib29wc19kbywgdW5tYXJrIikpOwogICAgIGN1ciA9IG5leHQ7CiAgIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NvbXBpbGVyL2NvbXBpbGVCcm9rZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29tcGlsZXIvY29tcGlsZUJyb2tlci5jcHAKaW5kZXggMzJhNzUzYy4uZGFkOTllYyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29tcGlsZXIvY29tcGlsZUJyb2tlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29tcGlsZXIvY29tcGlsZUJyb2tlci5jcHAKQEAgLTE4NTEsMTAgKzE4NTEsNiBAQAogICAgICAgICAgIHR0eS0+cHJpbnRfY3IoIk9wZW5pbmcgY29tcGlsYXRpb24gbG9nICVzIiwgZmlsZV9uYW1lKTsKICAgICAgICAgfQogICAgICAgICBDb21waWxlTG9nKiBsb2cgPSBuZXcoUmVzb3VyY2VPYmo6OkNfSEVBUCwgbXRDb21waWxlcikgQ29tcGlsZUxvZyhmaWxlX25hbWUsIGZwLCB0aHJlYWRfaWQpOwotICAgICAgICBpZiAobG9nID09IE5VTEwpIHsKLSAgICAgICAgICBmY2xvc2UoZnApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICB0aHJlYWQtPmluaXRfbG9nKGxvZyk7CiAKICAgICAgICAgaWYgKHh0dHkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFQYXJTY2FuVGhyZWFkU3RhdGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFQYXJTY2FuVGhyZWFkU3RhdGUuY3BwCmluZGV4IGZjODZhNTAuLjQwNmFjNzMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxUGFyU2NhblRocmVhZFN0YXRlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVBhclNjYW5UaHJlYWRTdGF0ZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xNDgsOSArMTQ4LDcgQEAKICAgZG8gewogICAgIC8vIERyYWluIHRoZSBvdmVyZmxvdyBzdGFjayBmaXJzdCwgc28gb3RoZXIgdGhyZWFkcyBjYW4gc3RlYWwuCiAgICAgd2hpbGUgKF9yZWZzLT5wb3Bfb3ZlcmZsb3cocmVmKSkgewotICAgICAgaWYgKCFfcmVmcy0+dHJ5X3B1c2hfdG9fdGFza3F1ZXVlKHJlZikpIHsKLSAgICAgICAgZGlzcGF0Y2hfcmVmZXJlbmNlKHJlZik7Ci0gICAgICB9CisgICAgICBkaXNwYXRjaF9yZWZlcmVuY2UocmVmKTsKICAgICB9CiAKICAgICB3aGlsZSAoX3JlZnMtPnBvcF9sb2NhbChyZWYpKSB7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVJlbVNldFN1bW1hcnkuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFSZW1TZXRTdW1tYXJ5LmNwcAppbmRleCA0NWJjMzY0Li5jNTUxNjViIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVJlbVNldFN1bW1hcnkuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxUmVtU2V0U3VtbWFyeS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMzMsNiArMTMzLDEwIEBACiAgIH0KIH0KIAorc3RhdGljIHNpemVfdCByb3VuZF90b19LKHNpemVfdCB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUgLyBLOworfQorCiBjbGFzcyBSZWdpb25UeXBlQ291bnRlciBWQUxVRV9PQkpfQ0xBU1NfU1BFQyB7CiBwcml2YXRlOgogICBjb25zdCBjaGFyKiBfbmFtZTsKQEAgLTE4MywxMCArMTg3LDggQEAKICAgc2l6ZV90IGNvZGVfcm9vdF9lbGVtcygpIGNvbnN0IHsgcmV0dXJuIF9jb2RlX3Jvb3RfZWxlbXM7IH0KIAogICB2b2lkIHByaW50X3JzX21lbV9pbmZvX29uKG91dHB1dFN0cmVhbSAqIG91dCwgc2l6ZV90IHRvdGFsKSB7Ci0gICAgb3V0LT5wcmludF9jcigiICAgICJTSVpFX0ZPUk1BVF9XKDgpICIlcyAoJTUuMWYlJSkgYnkgIlNJWkVfRk9STUFUIiAlcyByZWdpb25zIiwKLSAgICAgICAgYnl0ZV9zaXplX2luX3Byb3Blcl91bml0KHJzX21lbV9zaXplKCkpLAotICAgICAgICBwcm9wZXJfdW5pdF9mb3JfYnl0ZV9zaXplKHJzX21lbV9zaXplKCkpLAotICAgICAgICByc19tZW1fc2l6ZV9wZXJjZW50X29mKHRvdGFsKSwgYW1vdW50KCksIF9uYW1lKTsKKyAgICBvdXQtPnByaW50X2NyKCIgICAgIlNJWkVfRk9STUFUX1coOCkiSyAoJTUuMWYlJSkgYnkgIlNJWkVfRk9STUFUIiAlcyByZWdpb25zIiwKKyAgICAgICAgcm91bmRfdG9fSyhyc19tZW1fc2l6ZSgpKSwgcnNfbWVtX3NpemVfcGVyY2VudF9vZih0b3RhbCksIGFtb3VudCgpLCBfbmFtZSk7CiAgIH0KIAogICB2b2lkIHByaW50X2NhcmRzX29jY3VwaWVkX2luZm9fb24ob3V0cHV0U3RyZWFtICogb3V0LCBzaXplX3QgdG90YWwpIHsKQEAgLTE5NSwxMCArMTk3LDggQEAKICAgfQogCiAgIHZvaWQgcHJpbnRfY29kZV9yb290X21lbV9pbmZvX29uKG91dHB1dFN0cmVhbSAqIG91dCwgc2l6ZV90IHRvdGFsKSB7Ci0gICAgb3V0LT5wcmludF9jcigiICAgICJTSVpFX0ZPUk1BVF9XKDgpICIlcyAoJTUuMWYlJSkgYnkgIlNJWkVfRk9STUFUIiAlcyByZWdpb25zIiwKLSAgICAgICAgYnl0ZV9zaXplX2luX3Byb3Blcl91bml0KGNvZGVfcm9vdF9tZW1fc2l6ZSgpKSwKLSAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZShjb2RlX3Jvb3RfbWVtX3NpemUoKSksCi0gICAgICAgIGNvZGVfcm9vdF9tZW1fc2l6ZV9wZXJjZW50X29mKHRvdGFsKSwgYW1vdW50KCksIF9uYW1lKTsKKyAgICBvdXQtPnByaW50X2NyKCIgICAgIlNJWkVfRk9STUFUX1coOCkiSyAoJTUuMWYlJSkgYnkgIlNJWkVfRk9STUFUIiAlcyByZWdpb25zIiwKKyAgICAgICAgcm91bmRfdG9fSyhjb2RlX3Jvb3RfbWVtX3NpemUoKSksIGNvZGVfcm9vdF9tZW1fc2l6ZV9wZXJjZW50X29mKHRvdGFsKSwgYW1vdW50KCksIF9uYW1lKTsKICAgfQogCiAgIHZvaWQgcHJpbnRfY29kZV9yb290X2VsZW1zX2luZm9fb24ob3V0cHV0U3RyZWFtICogb3V0LCBzaXplX3QgdG90YWwpIHsKQEAgLTI4MCwyMyArMjgwLDE3IEBACiAgICAgUmVnaW9uVHlwZUNvdW50ZXIqIGNvdW50ZXJzW10gPSB7ICZfeW91bmcsICZfaHVtb25ndW91cywgJl9mcmVlLCAmX29sZCwgTlVMTCB9OwogCiAgICAgb3V0LT5wcmludF9jcigiXG4gQ3VycmVudCByZW0gc2V0IHN0YXRpc3RpY3MiKTsKLSAgICBvdXQtPnByaW50X2NyKCIgIFRvdGFsIHBlciByZWdpb24gcmVtIHNldHMgc2l6ZXMgPSAiIFNJWkVfRk9STUFUICIlcy4iCi0gICAgICAgICAgICAgICAgICAiIE1heCA9ICIgU0laRV9GT1JNQVQgIiVzLiIsCi0gICAgICAgICAgICAgICAgICBieXRlX3NpemVfaW5fcHJvcGVyX3VuaXQodG90YWxfcnNfbWVtX3N6KCkpLAotICAgICAgICAgICAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZSh0b3RhbF9yc19tZW1fc3ooKSksCi0gICAgICAgICAgICAgICAgICBieXRlX3NpemVfaW5fcHJvcGVyX3VuaXQobWF4X3JzX21lbV9zeigpKSwKLSAgICAgICAgICAgICAgICAgIHByb3Blcl91bml0X2Zvcl9ieXRlX3NpemUobWF4X3JzX21lbV9zeigpKSk7Ci0KKyAgICBvdXQtPnByaW50X2NyKCIgIFRvdGFsIHBlciByZWdpb24gcmVtIHNldHMgc2l6ZXMgPSAiU0laRV9GT1JNQVQiSy4iCisgICAgICAgICAgICAgICAgICAiIE1heCA9ICJTSVpFX0ZPUk1BVCJLLiIsCisgICAgICAgICAgICAgICAgICByb3VuZF90b19LKHRvdGFsX3JzX21lbV9zeigpKSwgcm91bmRfdG9fSyhtYXhfcnNfbWVtX3N6KCkpKTsKICAgICBmb3IgKFJlZ2lvblR5cGVDb3VudGVyKiogY3VycmVudCA9ICZjb3VudGVyc1swXTsgKmN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCsrKSB7CiAgICAgICAoKmN1cnJlbnQpLT5wcmludF9yc19tZW1faW5mb19vbihvdXQsIHRvdGFsX3JzX21lbV9zeigpKTsKICAgICB9CiAKLSAgICBvdXQtPnByaW50X2NyKCIgICBTdGF0aWMgc3RydWN0dXJlcyA9ICIgU0laRV9GT1JNQVQgIiVzLCIKLSAgICAgICAgICAgICAgICAgICIgZnJlZV9saXN0cyA9ICIgU0laRV9GT1JNQVQgIiVzLiIsCi0gICAgICAgICAgICAgICAgICBieXRlX3NpemVfaW5fcHJvcGVyX3VuaXQoSGVhcFJlZ2lvblJlbVNldDo6c3RhdGljX21lbV9zaXplKCkpLAotICAgICAgICAgICAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZShIZWFwUmVnaW9uUmVtU2V0OjpzdGF0aWNfbWVtX3NpemUoKSksCi0gICAgICAgICAgICAgICAgICBieXRlX3NpemVfaW5fcHJvcGVyX3VuaXQoSGVhcFJlZ2lvblJlbVNldDo6ZmxfbWVtX3NpemUoKSksCi0gICAgICAgICAgICAgICAgICBwcm9wZXJfdW5pdF9mb3JfYnl0ZV9zaXplKEhlYXBSZWdpb25SZW1TZXQ6OmZsX21lbV9zaXplKCkpKTsKKyAgICBvdXQtPnByaW50X2NyKCIgICBTdGF0aWMgc3RydWN0dXJlcyA9ICJTSVpFX0ZPUk1BVCJLLCIKKyAgICAgICAgICAgICAgICAgICIgZnJlZV9saXN0cyA9ICJTSVpFX0ZPUk1BVCJLLiIsCisgICAgICAgICAgICAgICAgICByb3VuZF90b19LKEhlYXBSZWdpb25SZW1TZXQ6OnN0YXRpY19tZW1fc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX0soSGVhcFJlZ2lvblJlbVNldDo6ZmxfbWVtX3NpemUoKSkpOwogCiAgICAgb3V0LT5wcmludF9jcigiICAgICJTSVpFX0ZPUk1BVCIgb2NjdXBpZWQgY2FyZHMgcmVwcmVzZW50ZWQuIiwKICAgICAgICAgICAgICAgICAgIHRvdGFsX2NhcmRzX29jY3VwaWVkKCkpOwpAQCAtMzA3LDIxICszMDEsMTcgQEAKICAgICAvLyBMYXJnZXN0IHNpemVkIHJlbSBzZXQgcmVnaW9uIHN0YXRpc3RpY3MKICAgICBIZWFwUmVnaW9uUmVtU2V0KiByZW1fc2V0ID0gbWF4X3JzX21lbV9zel9yZWdpb24oKS0+cmVtX3NldCgpOwogICAgIG91dC0+cHJpbnRfY3IoIiAgICBSZWdpb24gd2l0aCBsYXJnZXN0IHJlbSBzZXQgPSAiSFJfRk9STUFUIiwgIgotICAgICAgICAgICAgICAgICAgInNpemUgPSAiU0laRV9GT1JNQVQgIiVzLCBvY2N1cGllZCA9ICJTSVpFX0ZPUk1BVCAiJXMuIiwKKyAgICAgICAgICAgICAgICAgICJzaXplID0gIlNJWkVfRk9STUFUICJLLCBvY2N1cGllZCA9ICJTSVpFX0ZPUk1BVCJLLiIsCiAgICAgICAgICAgICAgICAgICBIUl9GT1JNQVRfUEFSQU1TKG1heF9yc19tZW1fc3pfcmVnaW9uKCkpLAotICAgICAgICAgICAgICAgICAgYnl0ZV9zaXplX2luX3Byb3Blcl91bml0KHJlbV9zZXQtPm1lbV9zaXplKCkpLAotICAgICAgICAgICAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZShyZW1fc2V0LT5tZW1fc2l6ZSgpKSwKLSAgICAgICAgICAgICAgICAgIGJ5dGVfc2l6ZV9pbl9wcm9wZXJfdW5pdChyZW1fc2V0LT5vY2N1cGllZCgpKSwKLSAgICAgICAgICAgICAgICAgIHByb3Blcl91bml0X2Zvcl9ieXRlX3NpemUocmVtX3NldC0+b2NjdXBpZWQoKSkpOworICAgICAgICAgICAgICAgICAgcm91bmRfdG9fSyhyZW1fc2V0LT5tZW1fc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX0socmVtX3NldC0+b2NjdXBpZWQoKSkpOworCiAgICAgLy8gU3Ryb25nIGNvZGUgcm9vdCBzdGF0aXN0aWNzCiAgICAgSGVhcFJlZ2lvblJlbVNldCogbWF4X2NvZGVfcm9vdF9yZW1fc2V0ID0gbWF4X2NvZGVfcm9vdF9tZW1fc3pfcmVnaW9uKCktPnJlbV9zZXQoKTsKLSAgICBvdXQtPnByaW50X2NyKCIgIFRvdGFsIGhlYXAgcmVnaW9uIGNvZGUgcm9vdCBzZXRzIHNpemVzID0gIiBTSVpFX0ZPUk1BVCAiJXMuIgotICAgICAgICAgICAgICAgICAgIiAgTWF4ID0gIiBTSVpFX0ZPUk1BVCAiJXMuIiwKLSAgICAgICAgICAgICAgICAgIGJ5dGVfc2l6ZV9pbl9wcm9wZXJfdW5pdCh0b3RhbF9jb2RlX3Jvb3RfbWVtX3N6KCkpLAotICAgICAgICAgICAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZSh0b3RhbF9jb2RlX3Jvb3RfbWVtX3N6KCkpLAotICAgICAgICAgICAgICAgICAgYnl0ZV9zaXplX2luX3Byb3Blcl91bml0KG1heF9jb2RlX3Jvb3RfcmVtX3NldC0+c3Ryb25nX2NvZGVfcm9vdHNfbWVtX3NpemUoKSksCi0gICAgICAgICAgICAgICAgICBwcm9wZXJfdW5pdF9mb3JfYnl0ZV9zaXplKG1heF9jb2RlX3Jvb3RfcmVtX3NldC0+c3Ryb25nX2NvZGVfcm9vdHNfbWVtX3NpemUoKSkpOwotCisgICAgb3V0LT5wcmludF9jcigiICBUb3RhbCBoZWFwIHJlZ2lvbiBjb2RlIHJvb3Qgc2V0cyBzaXplcyA9ICJTSVpFX0ZPUk1BVCJLLiIKKyAgICAgICAgICAgICAgICAgICIgIE1heCA9ICJTSVpFX0ZPUk1BVCJLLiIsCisgICAgICAgICAgICAgICAgICByb3VuZF90b19LKHRvdGFsX2NvZGVfcm9vdF9tZW1fc3ooKSksCisgICAgICAgICAgICAgICAgICByb3VuZF90b19LKG1heF9jb2RlX3Jvb3RfcmVtX3NldC0+c3Ryb25nX2NvZGVfcm9vdHNfbWVtX3NpemUoKSkpOwogICAgIGZvciAoUmVnaW9uVHlwZUNvdW50ZXIqKiBjdXJyZW50ID0gJmNvdW50ZXJzWzBdOyAqY3VycmVudCAhPSBOVUxMOyBjdXJyZW50KyspIHsKICAgICAgICgqY3VycmVudCktPnByaW50X2NvZGVfcm9vdF9tZW1faW5mb19vbihvdXQsIHRvdGFsX2NvZGVfcm9vdF9tZW1fc3ooKSk7CiAgICAgfQpAQCAtMzMzLDEyICszMjMsMTAgQEAKICAgICB9CiAKICAgICBvdXQtPnByaW50X2NyKCIgICAgUmVnaW9uIHdpdGggbGFyZ2VzdCBhbW91bnQgb2YgY29kZSByb290cyA9ICJIUl9GT1JNQVQiLCAiCi0gICAgICAgICAgICAgICAgICAic2l6ZSA9ICJTSVpFX0ZPUk1BVCAiJXMsIG51bV9lbGVtcyA9ICJTSVpFX0ZPUk1BVCIuIiwKKyAgICAgICAgICAgICAgICAgICJzaXplID0gIlNJWkVfRk9STUFUICJLLCBudW1fZWxlbXMgPSAiU0laRV9GT1JNQVQiLiIsCiAgICAgICAgICAgICAgICAgICBIUl9GT1JNQVRfUEFSQU1TKG1heF9jb2RlX3Jvb3RfbWVtX3N6X3JlZ2lvbigpKSwKLSAgICAgICAgICAgICAgICAgIGJ5dGVfc2l6ZV9pbl9wcm9wZXJfdW5pdChtYXhfY29kZV9yb290X3JlbV9zZXQtPnN0cm9uZ19jb2RlX3Jvb3RzX21lbV9zaXplKCkpLAotICAgICAgICAgICAgICAgICAgcHJvcGVyX3VuaXRfZm9yX2J5dGVfc2l6ZShtYXhfY29kZV9yb290X3JlbV9zZXQtPnN0cm9uZ19jb2RlX3Jvb3RzX21lbV9zaXplKCkpLAotICAgICAgICAgICAgICAgICAgbWF4X2NvZGVfcm9vdF9yZW1fc2V0LT5zdHJvbmdfY29kZV9yb290c19saXN0X2xlbmd0aCgpKTsKLQorICAgICAgICAgICAgICAgICAgcm91bmRfdG9fSyhtYXhfY29kZV9yb290X3JlbV9zZXQtPnN0cm9uZ19jb2RlX3Jvb3RzX21lbV9zaXplKCkpLAorICAgICAgICAgICAgICAgICAgcm91bmRfdG9fSyhtYXhfY29kZV9yb290X3JlbV9zZXQtPnN0cm9uZ19jb2RlX3Jvb3RzX2xpc3RfbGVuZ3RoKCkpKTsKICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFTdHJpbmdEZWR1cFRhYmxlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUYWJsZS5jcHAKaW5kZXggNzFlN2U1My4uMmI0MTY4OCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFTdHJpbmdEZWR1cFRhYmxlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVN0cmluZ0RlZHVwVGFibGUuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsMjMgKzI4LDIyIEBACiAjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFDb2xsZWN0ZWRIZWFwLmlubGluZS5ocHAiCiAjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFTQVRCQ2FyZFRhYmxlTW9kUmVmQlMuaHBwIgogI2luY2x1ZGUgImdjX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUYWJsZS5ocHAiCi0jaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vc2hhcmVkL2NvbmN1cnJlbnRHQ1RocmVhZC5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L2djTG9ja2VyLmhwcCIKICNpbmNsdWRlICJtZW1vcnkvcGFkZGVkLmlubGluZS5ocHAiCiAjaW5jbHVkZSAib29wcy90eXBlQXJyYXlPb3AuaHBwIgogI2luY2x1ZGUgInJ1bnRpbWUvbXV0ZXhMb2NrZXIuaHBwIgogCiAvLwotLy8gTGlzdCBvZiBkZWR1cGxpY2F0aW9uIHRhYmxlIGVudHJpZXMuIExpbmtzIHRhYmxlCisvLyBGcmVlbGlzdCBpbiB0aGUgZGVkdXBsaWNhdGlvbiB0YWJsZSBlbnRyeSBjYWNoZS4gTGlua3MgdGFibGUKIC8vIGVudHJpZXMgdG9nZXRoZXIgdXNpbmcgdGhlaXIgX25leHQgZmllbGRzLgogLy8KLWNsYXNzIEcxU3RyaW5nRGVkdXBFbnRyeUxpc3QgOiBwdWJsaWMgQ0hlYXBPYmo8bXRHQz4geworY2xhc3MgRzFTdHJpbmdEZWR1cEVudHJ5RnJlZUxpc3QgOiBwdWJsaWMgQ0hlYXBPYmo8bXRHQz4gewogcHJpdmF0ZToKICAgRzFTdHJpbmdEZWR1cEVudHJ5KiBfbGlzdDsKICAgc2l6ZV90ICAgICAgICAgICAgICBfbGVuZ3RoOwogCiBwdWJsaWM6Ci0gIEcxU3RyaW5nRGVkdXBFbnRyeUxpc3QoKSA6CisgIEcxU3RyaW5nRGVkdXBFbnRyeUZyZWVMaXN0KCkgOgogICAgIF9saXN0KE5VTEwpLAogICAgIF9sZW5ndGgoMCkgewogICB9CkBAIC02NCwxMiArNjMsNiBAQAogICAgIHJldHVybiBlbnRyeTsKICAgfQogCi0gIEcxU3RyaW5nRGVkdXBFbnRyeSogcmVtb3ZlX2FsbCgpIHsKLSAgICBHMVN0cmluZ0RlZHVwRW50cnkqIGxpc3QgPSBfbGlzdDsKLSAgICBfbGlzdCA9IE5VTEw7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLQogICBzaXplX3QgbGVuZ3RoKCkgewogICAgIHJldHVybiBfbGVuZ3RoOwogICB9CkBAIC05MSw1MyArODQsNDMgQEAKIC8vCiBjbGFzcyBHMVN0cmluZ0RlZHVwRW50cnlDYWNoZSA6IHB1YmxpYyBDSGVhcE9iajxtdEdDPiB7CiBwcml2YXRlOgotICAvLyBPbmUgY2FjaGUvb3ZlcmZsb3cgbGlzdCBwZXIgR0Mgd29ya2VyIHRvIGFsbG93IGxvY2sgbGVzcyBmcmVlaW5nIG9mCi0gIC8vIGVudHJpZXMgd2hpbGUgZG9pbmcgYSBwYXJhbGxlbCBzY2FuIG9mIHRoZSB0YWJsZS4gVXNpbmcgUGFkZGVkRW5kIHRvCi0gIC8vIGF2b2lkIGZhbHNlIHNoYXJpbmcuCi0gIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25saXN0czsKLSAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWF4X2xpc3RfbGVuZ3RoOwotICBQYWRkZWRFbmQ8RzFTdHJpbmdEZWR1cEVudHJ5TGlzdD4qIF9jYWNoZWQ7Ci0gIFBhZGRlZEVuZDxHMVN0cmluZ0RlZHVwRW50cnlMaXN0PiogX292ZXJmbG93ZWQ7CisgIC8vIE9uZSBmcmVlbGlzdCBwZXIgR0Mgd29ya2VyIHRvIGFsbG93IGxvY2sgbGVzcyBmcmVlaW5nIG9mCisgIC8vIGVudHJpZXMgd2hpbGUgZG9pbmcgYSBwYXJhbGxlbCBzY2FuIG9mIHRoZSB0YWJsZS4gVXNpbmcKKyAgLy8gUGFkZGVkRW5kIHRvIGF2b2lkIGZhbHNlIHNoYXJpbmcuCisgIFBhZGRlZEVuZDxHMVN0cmluZ0RlZHVwRW50cnlGcmVlTGlzdD4qIF9saXN0czsKKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX25saXN0czsKIAogcHVibGljOgotICBHMVN0cmluZ0RlZHVwRW50cnlDYWNoZShzaXplX3QgbWF4X3NpemUpOworICBHMVN0cmluZ0RlZHVwRW50cnlDYWNoZSgpOwogICB+RzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGUoKTsKIAotICAvLyBTZXQgbWF4IG51bWJlciBvZiB0YWJsZSBlbnRyaWVzIHRvIGNhY2hlLgotICB2b2lkIHNldF9tYXhfc2l6ZShzaXplX3QgbWF4X3NpemUpOwotCi0gIC8vIEdldCBhIHRhYmxlIGVudHJ5IGZyb20gdGhlIGNhY2hlLCBvciBhbGxvY2F0ZSBhIG5ldyBlbnRyeSBpZiB0aGUgY2FjaGUgaXMgZW1wdHkuCisgIC8vIEdldCBhIHRhYmxlIGVudHJ5IGZyb20gdGhlIGNhY2hlIGZyZWVsaXN0LCBvciBhbGxvY2F0ZSBhIG5ldworICAvLyBlbnRyeSBpZiB0aGUgY2FjaGUgaXMgZW1wdHkuCiAgIEcxU3RyaW5nRGVkdXBFbnRyeSogYWxsb2MoKTsKIAotICAvLyBJbnNlcnQgYSB0YWJsZSBlbnRyeSBpbnRvIHRoZSBjYWNoZS4KKyAgLy8gSW5zZXJ0IGEgdGFibGUgZW50cnkgaW50byB0aGUgY2FjaGUgZnJlZWxpc3QuCiAgIHZvaWQgZnJlZShHMVN0cmluZ0RlZHVwRW50cnkqIGVudHJ5LCB1aW50IHdvcmtlcl9pZCk7CiAKICAgLy8gUmV0dXJucyBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjYWNoZS4KICAgc2l6ZV90IHNpemUoKTsKIAotICAvLyBEZWxldGVzIG92ZXJmbG93ZWQgZW50cmllcy4KLSAgdm9pZCBkZWxldGVfb3ZlcmZsb3dlZCgpOworICAvLyBJZiB0aGUgY2FjaGUgaGFzIGdyb3duIGFib3ZlIHRoZSBnaXZlbiBtYXggc2l6ZSwgdHJpbSBpdCBkb3duCisgIC8vIGFuZCBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdHJpbW1lZCBvZiBlbnRyaWVzLgorICB2b2lkIHRyaW0oc2l6ZV90IG1heF9zaXplKTsKIH07CiAKLUcxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjpHMVN0cmluZ0RlZHVwRW50cnlDYWNoZShzaXplX3QgbWF4X3NpemUpIDoKLSAgX25saXN0cyhNQVgyKFBhcmFsbGVsR0NUaHJlYWRzLCAoc2l6ZV90KTEpKSwKLSAgX21heF9saXN0X2xlbmd0aCgwKSwKLSAgX2NhY2hlZChQYWRkZWRBcnJheTxHMVN0cmluZ0RlZHVwRW50cnlMaXN0LCBtdEdDPjo6Y3JlYXRlX3VuZnJlZWFibGUoKHVpbnQpX25saXN0cykpLAotICBfb3ZlcmZsb3dlZChQYWRkZWRBcnJheTxHMVN0cmluZ0RlZHVwRW50cnlMaXN0LCBtdEdDPjo6Y3JlYXRlX3VuZnJlZWFibGUoKHVpbnQpX25saXN0cykpIHsKLSAgc2V0X21heF9zaXplKG1heF9zaXplKTsKK0cxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjpHMVN0cmluZ0RlZHVwRW50cnlDYWNoZSgpIHsKKyAgX25saXN0cyA9IE1BWDIoUGFyYWxsZWxHQ1RocmVhZHMsIChzaXplX3QpMSk7CisgIF9saXN0cyA9IFBhZGRlZEFycmF5PEcxU3RyaW5nRGVkdXBFbnRyeUZyZWVMaXN0LCBtdEdDPjo6Y3JlYXRlX3VuZnJlZWFibGUoKHVpbnQpX25saXN0cyk7CiB9CiAKIEcxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjp+RzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGUoKSB7CiAgIFNob3VsZE5vdFJlYWNoSGVyZSgpOwogfQogCi12b2lkIEcxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjpzZXRfbWF4X3NpemUoc2l6ZV90IHNpemUpIHsKLSAgX21heF9saXN0X2xlbmd0aCA9IHNpemUgLyBfbmxpc3RzOwotfQotCiBHMVN0cmluZ0RlZHVwRW50cnkqIEcxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjphbGxvYygpIHsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfbmxpc3RzOyBpKyspIHsKLSAgICBHMVN0cmluZ0RlZHVwRW50cnkqIGVudHJ5ID0gX2NhY2hlZFtpXS5yZW1vdmUoKTsKKyAgICBHMVN0cmluZ0RlZHVwRW50cnkqIGVudHJ5ID0gX2xpc3RzW2ldLnJlbW92ZSgpOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CiAgICAgICByZXR1cm4gZW50cnk7CiAgICAgfQpAQCAtMTQ4LDU1ICsxMzEsMzEgQEAKIHZvaWQgRzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGU6OmZyZWUoRzFTdHJpbmdEZWR1cEVudHJ5KiBlbnRyeSwgdWludCB3b3JrZXJfaWQpIHsKICAgYXNzZXJ0KGVudHJ5LT5vYmooKSAhPSBOVUxMLCAiRG91YmxlIGZyZWUiKTsKICAgYXNzZXJ0KHdvcmtlcl9pZCA8IF9ubGlzdHMsICJJbnZhbGlkIHdvcmtlciBpZCIpOwotCiAgIGVudHJ5LT5zZXRfb2JqKE5VTEwpOwogICBlbnRyeS0+c2V0X2hhc2goMCk7Ci0KLSAgaWYgKF9jYWNoZWRbd29ya2VyX2lkXS5sZW5ndGgoKSA8IF9tYXhfbGlzdF9sZW5ndGgpIHsKLSAgICAvLyBDYWNoZSBpcyBub3QgZnVsbAotICAgIF9jYWNoZWRbd29ya2VyX2lkXS5hZGQoZW50cnkpOwotICB9IGVsc2UgewotICAgIC8vIENhY2hlIGlzIGZ1bGwsIGFkZCB0byBvdmVyZmxvdyBsaXN0IGZvciBsYXRlciBkZWxldGlvbgotICAgIF9vdmVyZmxvd2VkW3dvcmtlcl9pZF0uYWRkKGVudHJ5KTsKLSAgfQorICBfbGlzdHNbd29ya2VyX2lkXS5hZGQoZW50cnkpOwogfQogCiBzaXplX3QgRzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGU6OnNpemUoKSB7CiAgIHNpemVfdCBzaXplID0gMDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBfbmxpc3RzOyBpKyspIHsKLSAgICBzaXplICs9IF9jYWNoZWRbaV0ubGVuZ3RoKCk7CisgICAgc2l6ZSArPSBfbGlzdHNbaV0ubGVuZ3RoKCk7CiAgIH0KICAgcmV0dXJuIHNpemU7CiB9CiAKLXZvaWQgRzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGU6OmRlbGV0ZV9vdmVyZmxvd2VkKCkgewotICBkb3VibGUgc3RhcnQgPSBvczo6ZWxhcHNlZFRpbWUoKTsKLSAgdWludHggY291bnQgPSAwOwotCit2b2lkIEcxU3RyaW5nRGVkdXBFbnRyeUNhY2hlOjp0cmltKHNpemVfdCBtYXhfc2l6ZSkgeworICBzaXplX3QgY2FjaGVfc2l6ZSA9IDA7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgX25saXN0czsgaSsrKSB7Ci0gICAgRzFTdHJpbmdEZWR1cEVudHJ5KiBlbnRyeTsKLQotICAgIHsKLSAgICAgIC8vIFRoZSBvdmVyZmxvdyBsaXN0IGNhbiBiZSBtb2RpZmllZCBkdXJpbmcgc2FmZXBvaW50cywgdGhlcmVmb3JlCi0gICAgICAvLyB3ZSB0ZW1wb3JhcmlseSBqb2luIHRoZSBzdXNwZW5kaWJsZSB0aHJlYWQgc2V0IHdoaWxlIHJlbW92aW5nCi0gICAgICAvLyBhbGwgZW50cmllcyBmcm9tIHRoZSBsaXN0LgotICAgICAgU3VzcGVuZGlibGVUaHJlYWRTZXRKb2luZXIgc3RzX2pvaW47Ci0gICAgICBlbnRyeSA9IF9vdmVyZmxvd2VkW2ldLnJlbW92ZV9hbGwoKTsKLSAgICB9Ci0KLSAgICAvLyBEZWxldGUgYWxsIGVudHJpZXMKLSAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewotICAgICAgRzFTdHJpbmdEZWR1cEVudHJ5KiBuZXh0ID0gZW50cnktPm5leHQoKTsKKyAgICBHMVN0cmluZ0RlZHVwRW50cnlGcmVlTGlzdCogbGlzdCA9ICZfbGlzdHNbaV07CisgICAgY2FjaGVfc2l6ZSArPSBsaXN0LT5sZW5ndGgoKTsKKyAgICB3aGlsZSAoY2FjaGVfc2l6ZSA+IG1heF9zaXplKSB7CisgICAgICBHMVN0cmluZ0RlZHVwRW50cnkqIGVudHJ5ID0gbGlzdC0+cmVtb3ZlKCk7CisgICAgICBhc3NlcnQoZW50cnkgIT0gTlVMTCwgIlNob3VsZCBub3QgYmUgbnVsbCIpOworICAgICAgY2FjaGVfc2l6ZS0tOwogICAgICAgZGVsZXRlIGVudHJ5OwotICAgICAgZW50cnkgPSBuZXh0OwotICAgICAgY291bnQrKzsKICAgICB9CiAgIH0KLQotICBkb3VibGUgZW5kID0gb3M6OmVsYXBzZWRUaW1lKCk7Ci0gIGlmIChQcmludFN0cmluZ0RlZHVwbGljYXRpb25TdGF0aXN0aWNzKSB7Ci0gICAgZ2Nsb2dfb3JfdHR5LT5wcmludF9jcigiW0dDIGNvbmN1cnJlbnQtc3RyaW5nLWRlZHVwbGljYXRpb24sIGRlbGV0ZWQgIiBVSU5UWF9GT1JNQVQgIiBlbnRyaWVzLCAiIEcxX1NUUkRFRFVQX1RJTUVfRk9STUFUICJdIiwgY291bnQsIGVuZCAtIHN0YXJ0KTsKLSAgfQogfQogCiBHMVN0cmluZ0RlZHVwVGFibGUqICAgICAgRzFTdHJpbmdEZWR1cFRhYmxlOjpfdGFibGUgPSBOVUxMOwpAQCAtMjMzLDcgKzE5Miw3IEBACiAKIHZvaWQgRzFTdHJpbmdEZWR1cFRhYmxlOjpjcmVhdGUoKSB7CiAgIGFzc2VydChfdGFibGUgPT0gTlVMTCwgIk9uZSBzdHJpbmcgZGVkdXBsaWNhdGlvbiB0YWJsZSBhbGxvd2VkIik7Ci0gIF9lbnRyeV9jYWNoZSA9IG5ldyBHMVN0cmluZ0RlZHVwRW50cnlDYWNoZSgoc2l6ZV90KShfbWluX3NpemUgKiBfbWF4X2NhY2hlX2ZhY3RvcikpOworICBfZW50cnlfY2FjaGUgPSBuZXcgRzFTdHJpbmdEZWR1cEVudHJ5Q2FjaGUoKTsKICAgX3RhYmxlID0gbmV3IEcxU3RyaW5nRGVkdXBUYWJsZShfbWluX3NpemUpOwogfQogCkBAIC00MTYsOSArMzc1LDYgQEAKICAgLy8gVXBkYXRlIHN0YXRpc3RpY3MKICAgX3Jlc2l6ZV9jb3VudCsrOwogCi0gIC8vIFVwZGF0ZSBtYXggY2FjaGUgc2l6ZQotICBfZW50cnlfY2FjaGUtPnNldF9tYXhfc2l6ZSgoc2l6ZV90KShzaXplICogX21heF9jYWNoZV9mYWN0b3IpKTsKLQogICAvLyBBbGxvY2F0ZSB0aGUgbmV3IHRhYmxlLiBUaGUgbmV3IHRhYmxlIHdpbGwgYmUgcG9wdWxhdGVkIGJ5IHdvcmtlcnMKICAgLy8gY2FsbGluZyB1bmxpbmtfb3Jfb29wc19kbygpIGFuZCBmaW5hbGx5IGluc3RhbGxlZCBieSBmaW5pc2hfcmVzaXplKCkuCiAgIHJldHVybiBuZXcgRzFTdHJpbmdEZWR1cFRhYmxlKHNpemUsIF90YWJsZS0+X2hhc2hfc2VlZCk7CkBAIC00NzEsNyArNDI3LDcgQEAKICAgICByZW1vdmVkICs9IHVubGlua19vcl9vb3BzX2RvKGNsLCB0YWJsZV9oYWxmICsgcGFydGl0aW9uX2JlZ2luLCB0YWJsZV9oYWxmICsgcGFydGl0aW9uX2VuZCwgd29ya2VyX2lkKTsKICAgfQogCi0gIC8vIERlbGF5ZWQgdXBkYXRlIHRvIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIHRhYmxlIGxvY2sKKyAgLy8gRGVsYXllZCB1cGRhdGUgYXZvaWQgY29udGVudGlvbiBvbiB0aGUgdGFibGUgbG9jawogICBpZiAocmVtb3ZlZCA+IDApIHsKICAgICBNdXRleExvY2tlckV4IG1sKFN0cmluZ0RlZHVwVGFibGVfbG9jaywgTXV0ZXg6Ol9ub19zYWZlcG9pbnRfY2hlY2tfZmxhZyk7CiAgICAgX3RhYmxlLT5fZW50cmllcyAtPSByZW1vdmVkOwpAQCAtNTg5LDggKzU0NSwxMCBAQAogICB9CiB9CiAKLXZvaWQgRzFTdHJpbmdEZWR1cFRhYmxlOjpjbGVhbl9lbnRyeV9jYWNoZSgpIHsKLSAgX2VudHJ5X2NhY2hlLT5kZWxldGVfb3ZlcmZsb3dlZCgpOwordm9pZCBHMVN0cmluZ0RlZHVwVGFibGU6OnRyaW1fZW50cnlfY2FjaGUoKSB7CisgIE11dGV4TG9ja2VyRXggbWwoU3RyaW5nRGVkdXBUYWJsZV9sb2NrLCBNdXRleDo6X25vX3NhZmVwb2ludF9jaGVja19mbGFnKTsKKyAgc2l6ZV90IG1heF9jYWNoZV9zaXplID0gKHNpemVfdCkoX3RhYmxlLT5fc2l6ZSAqIF9tYXhfY2FjaGVfZmFjdG9yKTsKKyAgX2VudHJ5X2NhY2hlLT50cmltKG1heF9jYWNoZV9zaXplKTsKIH0KIAogdm9pZCBHMVN0cmluZ0RlZHVwVGFibGU6OnByaW50X3N0YXRpc3RpY3Mob3V0cHV0U3RyZWFtKiBzdCkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFTdHJpbmdEZWR1cFRhYmxlLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUYWJsZS5ocHAKaW5kZXggZDc3MTIxOS4uZjM1NzUyMyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vZzEvZzFTdHJpbmdEZWR1cFRhYmxlLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVN0cmluZ0RlZHVwVGFibGUuaHBwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjE4LDggKzIxOCw4IEBACiAgIC8vIGFuZCBkZWxldGVzIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSB0YWJsZS4KICAgc3RhdGljIHZvaWQgZmluaXNoX3JlaGFzaChHMVN0cmluZ0RlZHVwVGFibGUqIHJlaGFzaGVkX3RhYmxlKTsKIAotICAvLyBJZiB0aGUgdGFibGUgZW50cnkgY2FjaGUgaGFzIGdyb3duIHRvbyBsYXJnZSwgZGVsZXRlIG92ZXJmbG93ZWQgZW50cmllcy4KLSAgc3RhdGljIHZvaWQgY2xlYW5fZW50cnlfY2FjaGUoKTsKKyAgLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGNhY2hlIGhhcyBncm93biB0b28gbGFyZ2UsIHRyaW0gaXQgZG93biBhY2NvcmRpbmcgdG8gcG9saWN5CisgIHN0YXRpYyB2b2lkIHRyaW1fZW50cnlfY2FjaGUoKTsKIAogICBzdGF0aWMgdm9pZCB1bmxpbmtfb3Jfb29wc19kbyhHMVN0cmluZ0RlZHVwVW5saW5rT3JPb3BzRG9DbG9zdXJlKiBjbCwgdWludCB3b3JrZXJfaWQpOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9nMS9nMVN0cmluZ0RlZHVwVGhyZWFkLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUaHJlYWQuY3BwCmluZGV4IDA5YzU2N2UuLmU1OWVmYTcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUaHJlYWQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2cxL2cxU3RyaW5nRGVkdXBUaHJlYWQuY3BwCkBAIC0xMDAsMTQgKzEwMCwxNCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIEcxU3RyaW5nRGVkdXBUYWJsZTo6dHJpbV9lbnRyeV9jYWNoZSgpOworCiAgICAgICBzdGF0Lm1hcmtfZG9uZSgpOwogCiAgICAgICAvLyBQcmludCBzdGF0aXN0aWNzCiAgICAgICB0b3RhbF9zdGF0LmFkZChzdGF0KTsKICAgICAgIHByaW50KGdjbG9nX29yX3R0eSwgc3RhdCwgdG90YWxfc3RhdCk7CiAgICAgfQotCi0gICAgRzFTdHJpbmdEZWR1cFRhYmxlOjpjbGVhbl9lbnRyeV9jYWNoZSgpOwogICB9CiAKICAgdGVybWluYXRlKCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9wYXJhbGxlbFNjYXZlbmdlL3BjVGFza3MuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vcGFyYWxsZWxTY2F2ZW5nZS9wY1Rhc2tzLmNwcAppbmRleCA3ZDg1YzM0Li4yNjBkYzcyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9wYXJhbGxlbFNjYXZlbmdlL3BjVGFza3MuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL3BhcmFsbGVsU2NhdmVuZ2UvcGNUYXNrcy5jcHAKQEAgLTE3MSw3ICsxNzEsNyBAQAogICBQYXJhbGxlbFNjYXZlbmdlSGVhcCogaGVhcCA9IFBTUGFyYWxsZWxDb21wYWN0OjpnY19oZWFwKCk7CiAgIHVpbnQgcGFyYWxsZWxfZ2NfdGhyZWFkcyA9IGhlYXAtPmdjX3Rhc2tfbWFuYWdlcigpLT53b3JrZXJzKCk7CiAgIHVpbnQgYWN0aXZlX2djX3RocmVhZHMgPSBoZWFwLT5nY190YXNrX21hbmFnZXIoKS0+YWN0aXZlX3dvcmtlcnMoKTsKLSAgT29wVGFza1F1ZXVlU2V0KiBxc2V0ID0gUGFyQ29tcGFjdGlvbk1hbmFnZXI6OnN0YWNrX2FycmF5KCk7CisgIFJlZ2lvblRhc2tRdWV1ZVNldCogcXNldCA9IFBhckNvbXBhY3Rpb25NYW5hZ2VyOjpyZWdpb25fYXJyYXkoKTsKICAgUGFyYWxsZWxUYXNrVGVybWluYXRvciB0ZXJtaW5hdG9yKGFjdGl2ZV9nY190aHJlYWRzLCBxc2V0KTsKICAgR0NUYXNrUXVldWUqIHEgPSBHQ1Rhc2tRdWV1ZTo6Y3JlYXRlKCk7CiAgIGZvcih1aW50IGk9MDsgaTxwYXJhbGxlbF9nY190aHJlYWRzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL3BhcmFsbGVsU2NhdmVuZ2UvcHNQYXJhbGxlbENvbXBhY3QuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vcGFyYWxsZWxTY2F2ZW5nZS9wc1BhcmFsbGVsQ29tcGFjdC5jcHAKaW5kZXggYjJjM2IwNi4uODE3NWRlZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vcGFyYWxsZWxTY2F2ZW5nZS9wc1BhcmFsbGVsQ29tcGFjdC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vcGFyYWxsZWxTY2F2ZW5nZS9wc1BhcmFsbGVsQ29tcGFjdC5jcHAKQEAgLTIzNTUsNyArMjM1NSw3IEBACiAgIFBhcmFsbGVsU2NhdmVuZ2VIZWFwKiBoZWFwID0gZ2NfaGVhcCgpOwogICB1aW50IHBhcmFsbGVsX2djX3RocmVhZHMgPSBoZWFwLT5nY190YXNrX21hbmFnZXIoKS0+d29ya2VycygpOwogICB1aW50IGFjdGl2ZV9nY190aHJlYWRzID0gaGVhcC0+Z2NfdGFza19tYW5hZ2VyKCktPmFjdGl2ZV93b3JrZXJzKCk7Ci0gIFRhc2tRdWV1ZVNldFN1cGVyKiBxc2V0ID0gUGFyQ29tcGFjdGlvbk1hbmFnZXI6OnN0YWNrX2FycmF5KCk7CisgIFRhc2tRdWV1ZVNldFN1cGVyKiBxc2V0ID0gUGFyQ29tcGFjdGlvbk1hbmFnZXI6OnJlZ2lvbl9hcnJheSgpOwogICBQYXJhbGxlbFRhc2tUZXJtaW5hdG9yIHRlcm1pbmF0b3IoYWN0aXZlX2djX3RocmVhZHMsIHFzZXQpOwogCiAgIFBTUGFyYWxsZWxDb21wYWN0OjpNYXJrQW5kUHVzaENsb3N1cmUgbWFya19hbmRfcHVzaF9jbG9zdXJlKGNtKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2ludGVycHJldGVyL2J5dGVjb2RlSW50ZXJwcmV0ZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVJbnRlcnByZXRlci5jcHAKaW5kZXggNTllMWZiOS4uZWVkNGEzNSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVJbnRlcnByZXRlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vaW50ZXJwcmV0ZXIvYnl0ZWNvZGVJbnRlcnByZXRlci5jcHAKQEAgLTU5Myw5ICs1OTMsOCBAQAogLyogMHhEQyAqLyAmJm9wY19kZWZhdWx0LCAgICAgJiZvcGNfZGVmYXVsdCwgICAgICAgICYmb3BjX2RlZmF1bHQsICAgICAgJiZvcGNfZGVmYXVsdCwKIAogLyogMHhFMCAqLyAmJm9wY19kZWZhdWx0LCAgICAgJiZvcGNfZGVmYXVsdCwgICAgICAgICYmb3BjX2RlZmF1bHQsICAgICAgJiZvcGNfZGVmYXVsdCwKLS8qIDB4RTQgKi8gJiZvcGNfZGVmYXVsdCwgICAgICYmb3BjX2RlZmF1bHQsICAgICAgICAmJm9wY19mYXN0X2FsZGMsICAgICYmb3BjX2Zhc3RfYWxkY193LAotLyogMHhFOCAqLyAmJm9wY19yZXR1cm5fcmVnaXN0ZXJfZmluYWxpemVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiZvcGNfaW52b2tlaGFuZGxlLCAgICYmb3BjX2RlZmF1bHQsICAgICAgJiZvcGNfZGVmYXVsdCwKKy8qIDB4RTQgKi8gJiZvcGNfZGVmYXVsdCwgICAgICYmb3BjX2Zhc3RfYWxkYywgICAgICAmJm9wY19mYXN0X2FsZGNfdywgICYmb3BjX3JldHVybl9yZWdpc3Rlcl9maW5hbGl6ZXIsCisvKiAweEU4ICovICYmb3BjX2ludm9rZWhhbmRsZSwmJm9wY19kZWZhdWx0LCAgICAgICAgJiZvcGNfZGVmYXVsdCwgICAgICAmJm9wY19kZWZhdWx0LAogLyogMHhFQyAqLyAmJm9wY19kZWZhdWx0LCAgICAgJiZvcGNfZGVmYXVsdCwgICAgICAgICYmb3BjX2RlZmF1bHQsICAgICAgJiZvcGNfZGVmYXVsdCwKIAogLyogMHhGMCAqLyAmJm9wY19kZWZhdWx0LCAgICAgJiZvcGNfZGVmYXVsdCwgICAgICAgICYmb3BjX2RlZmF1bHQsICAgICAgJiZvcGNfZGVmYXVsdCwKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvaW5zdGFuY2VLbGFzcy5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL2luc3RhbmNlS2xhc3MuY3BwCmluZGV4IDRlY2M4N2UuLjQ4MTc0MmQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvaW5zdGFuY2VLbGFzcy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9pbnN0YW5jZUtsYXNzLmNwcApAQCAtNjE2LDExICs2MTYsNyBAQAogCiBib29sIEluc3RhbmNlS2xhc3M6OmxpbmtfY2xhc3NfaW1wbCgKICAgICBpbnN0YW5jZUtsYXNzSGFuZGxlIHRoaXNfb29wLCBib29sIHRocm93X3ZlcmlmeWVycm9yLCBUUkFQUykgewotICAvLyBjaGVjayBmb3IgZXJyb3Igc3RhdGUuCi0gIC8vIFRoaXMgaXMgY2hlY2tpbmcgZm9yIHRoZSB3cm9uZyBzdGF0ZS4gIElmIHRoZSBzdGF0ZSBpcyBpbml0aWFsaXphdGlvbl9lcnJvciwKLSAgLy8gdGhlbiB0aGlzIGNsYXNzICp3YXMqIGxpbmtlZC4gIFRoZSBDRFMgY29kZSBkb2VzIGEgdHJ5X2xpbmtfY2xhc3MgYW5kIHVzZXMKLSAgLy8gaW5pdGlhbGl6YXRpb25fZXJyb3IgdG8gbWFyayBjbGFzc2VzIHRvIG5vdCBpbmNsdWRlIGluIHRoZSBhcmNoaXZlIGR1cmluZwotICAvLyBEdW1wU2hhcmVkU3BhY2VzLiAgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZSBDRFMgYnVnIGlzIGZpeGVkLgorICAvLyBjaGVjayBmb3IgZXJyb3Igc3RhdGUKICAgaWYgKHRoaXNfb29wLT5pc19pbl9lcnJvcl9zdGF0ZSgpKSB7CiAgICAgUmVzb3VyY2VNYXJrIHJtKFRIUkVBRCk7CiAgICAgVEhST1dfTVNHXyh2bVN5bWJvbHM6OmphdmFfbGFuZ19Ob0NsYXNzRGVmRm91bmRFcnJvcigpLApAQCAtODA1LDIyICs4MDEsMzcgQEAKIH0KIAogLy8gRWFnZXJseSBpbml0aWFsaXplIHN1cGVyaW50ZXJmYWNlcyB0aGF0IGRlY2xhcmUgZGVmYXVsdCBtZXRob2RzIChjb25jcmV0ZSBpbnN0YW5jZTogYW55IGFjY2VzcykKLXZvaWQgSW5zdGFuY2VLbGFzczo6aW5pdGlhbGl6ZV9zdXBlcl9pbnRlcmZhY2VzKGluc3RhbmNlS2xhc3NIYW5kbGUgdGhpc19rLCBUUkFQUykgewotICBhc3NlcnQgKHRoaXNfay0+aGFzX2RlZmF1bHRfbWV0aG9kcygpLCAiY2FsbGVyIHNob3VsZCBoYXZlIGNoZWNrZWQgdGhpcyIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXNfay0+bG9jYWxfaW50ZXJmYWNlcygpLT5sZW5ndGgoKTsgKytpKSB7Ci0gICAgS2xhc3MqIGlmYWNlID0gdGhpc19rLT5sb2NhbF9pbnRlcmZhY2VzKCktPmF0KGkpOwotICAgIEluc3RhbmNlS2xhc3MqIGlrID0gSW5zdGFuY2VLbGFzczo6Y2FzdChpZmFjZSk7Cit2b2lkIEluc3RhbmNlS2xhc3M6OmluaXRpYWxpemVfc3VwZXJfaW50ZXJmYWNlcyhpbnN0YW5jZUtsYXNzSGFuZGxlIHRoaXNfb29wLCBUUkFQUykgeworICBpZiAodGhpc19vb3AtPmhhc19kZWZhdWx0X21ldGhvZHMoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpc19vb3AtPmxvY2FsX2ludGVyZmFjZXMoKS0+bGVuZ3RoKCk7ICsraSkgeworICAgICAgS2xhc3MqIGlmYWNlID0gdGhpc19vb3AtPmxvY2FsX2ludGVyZmFjZXMoKS0+YXQoaSk7CisgICAgICBJbnN0YW5jZUtsYXNzKiBpayA9IEluc3RhbmNlS2xhc3M6OmNhc3QoaWZhY2UpOworICAgICAgaWYgKGlrLT5zaG91bGRfYmVfaW5pdGlhbGl6ZWQoKSkgeworICAgICAgICBpZiAoaWstPmhhc19kZWZhdWx0X21ldGhvZHMoKSkgeworICAgICAgICAgIGlrLT5pbml0aWFsaXplX3N1cGVyX2ludGVyZmFjZXMoaWssIFRIUkVBRCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gT25seSBpbml0aWFsaXplKCkgaW50ZXJmYWNlcyB0aGF0ICJkZWNsYXJlIiBjb25jcmV0ZSBtZXRob2RzLgorICAgICAgICAvLyBoYXNfZGVmYXVsdF9tZXRob2RzIGRyaXZlcyBzZWFyY2hpbmcgc3VwZXJpbnRlcmZhY2VzIHNpbmNlIGl0CisgICAgICAgIC8vIG1lYW5zIGhhc19kZWZhdWx0X21ldGhvZHMgaW4gaXRzIHN1cGVyaW50ZXJmYWNlIGhpZXJhcmNoeQorICAgICAgICBpZiAoIUhBU19QRU5ESU5HX0VYQ0VQVElPTiAmJiBpay0+ZGVjbGFyZXNfZGVmYXVsdF9tZXRob2RzKCkpIHsKKyAgICAgICAgICBpay0+aW5pdGlhbGl6ZShUSFJFQUQpOworICAgICAgICB9CisgICAgICAgIGlmIChIQVNfUEVORElOR19FWENFUFRJT04pIHsKKyAgICAgICAgICBIYW5kbGUgZShUSFJFQUQsIFBFTkRJTkdfRVhDRVBUSU9OKTsKKyAgICAgICAgICBDTEVBUl9QRU5ESU5HX0VYQ0VQVElPTjsKKyAgICAgICAgICB7CisgICAgICAgICAgICBFWENFUFRJT05fTUFSSzsKKyAgICAgICAgICAgIC8vIExvY2tzIG9iamVjdCwgc2V0IHN0YXRlLCBhbmQgbm90aWZ5IGFsbCB3YWl0aW5nIHRocmVhZHMKKyAgICAgICAgICAgIHRoaXNfb29wLT5zZXRfaW5pdGlhbGl6YXRpb25fc3RhdGVfYW5kX25vdGlmeSgKKyAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbl9lcnJvciwgVEhSRUFEKTsKIAotICAgIC8vIEluaXRpYWxpemF0aW9uIGlzIGRlcHRoIGZpcnN0IHNlYXJjaCBpZS4gd2Ugc3RhcnQgd2l0aCB0b3Agb2YgdGhlIGluaGVyaXRhbmNlIHRyZWUKLSAgICAvLyBoYXNfZGVmYXVsdF9tZXRob2RzIGRyaXZlcyBzZWFyY2hpbmcgc3VwZXJpbnRlcmZhY2VzIHNpbmNlIGl0Ci0gICAgLy8gbWVhbnMgaGFzX2RlZmF1bHRfbWV0aG9kcyBpbiBpdHMgc3VwZXJpbnRlcmZhY2UgaGllcmFyY2h5Ci0gICAgaWYgKGlrLT5oYXNfZGVmYXVsdF9tZXRob2RzKCkpIHsKLSAgICAgIGlrLT5pbml0aWFsaXplX3N1cGVyX2ludGVyZmFjZXMoaWssIENIRUNLKTsKLSAgICB9Ci0KLSAgICAvLyBPbmx5IGluaXRpYWxpemUoKSBpbnRlcmZhY2VzIHRoYXQgImRlY2xhcmUiIGNvbmNyZXRlIG1ldGhvZHMuCi0gICAgaWYgKGlrLT5zaG91bGRfYmVfaW5pdGlhbGl6ZWQoKSAmJiBpay0+ZGVjbGFyZXNfZGVmYXVsdF9tZXRob2RzKCkpIHsKLSAgICAgIGlrLT5pbml0aWFsaXplKENIRUNLKTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBhbnkgZXhjZXB0aW9uIHRocm93biwgc3VwZXJjbGFzcyBpbml0aWFsaXphdGlvbiBlcnJvciBpcworICAgICAgICAgICAgLy8gdGhyb3duIGJlbG93CisgICAgICAgICAgICBDTEVBUl9QRU5ESU5HX0VYQ0VQVElPTjsKKyAgICAgICAgICB9CisgICAgICAgICAgVEhST1dfT09QKGUoKSk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAgIH0KIH0KQEAgLTg4NiwzNiArODk3LDMwIEBACiAgIH0KIAogICAvLyBTdGVwIDcKLSAgLy8gTmV4dCwgaWYgQyBpcyBhIGNsYXNzIHJhdGhlciB0aGFuIGFuIGludGVyZmFjZSwgaW5pdGlhbGl6ZSBpdHMgc3VwZXIgY2xhc3MgYW5kIHN1cGVyCi0gIC8vIGludGVyZmFjZXMuCi0gIGlmICghdGhpc19vb3AtPmlzX2ludGVyZmFjZSgpKSB7Ci0gICAgS2xhc3MqIHN1cGVyX2tsYXNzID0gdGhpc19vb3AtPnN1cGVyKCk7Ci0gICAgaWYgKHN1cGVyX2tsYXNzICE9IE5VTEwgJiYgc3VwZXJfa2xhc3MtPnNob3VsZF9iZV9pbml0aWFsaXplZCgpKSB7Ci0gICAgICBzdXBlcl9rbGFzcy0+aW5pdGlhbGl6ZShUSFJFQUQpOwotICAgIH0KLSAgICAvLyBJZiBDIGltcGxlbWVudHMgYW55IGludGVyZmFjZXMgdGhhdCBkZWNsYXJlcyBhIG5vbi1hYnN0cmFjdCwgbm9uLXN0YXRpYyBtZXRob2QsCi0gICAgLy8gdGhlIGluaXRpYWxpemF0aW9uIG9mIEMgdHJpZ2dlcnMgaW5pdGlhbGl6YXRpb24gb2YgaXRzIHN1cGVyIGludGVyZmFjZXMuCi0gICAgLy8gT25seSBuZWVkIHRvIHJlY3Vyc2UgaWYgaGFzX2RlZmF1bHRfbWV0aG9kcyB3aGljaCBpbmNsdWRlcyBkZWNsYXJpbmcgYW5kCi0gICAgLy8gaW5oZXJpdGluZyBkZWZhdWx0IG1ldGhvZHMKLSAgICBpZiAoIUhBU19QRU5ESU5HX0VYQ0VQVElPTiAmJiB0aGlzX29vcC0+aGFzX2RlZmF1bHRfbWV0aG9kcygpKSB7Ci0gICAgICB0aGlzX29vcC0+aW5pdGlhbGl6ZV9zdXBlcl9pbnRlcmZhY2VzKHRoaXNfb29wLCBUSFJFQUQpOwotICAgIH0KKyAgS2xhc3MqIHN1cGVyX2tsYXNzID0gdGhpc19vb3AtPnN1cGVyKCk7CisgIGlmIChzdXBlcl9rbGFzcyAhPSBOVUxMICYmICF0aGlzX29vcC0+aXNfaW50ZXJmYWNlKCkgJiYgc3VwZXJfa2xhc3MtPnNob3VsZF9iZV9pbml0aWFsaXplZCgpKSB7CisgICAgc3VwZXJfa2xhc3MtPmluaXRpYWxpemUoVEhSRUFEKTsKIAotICAgIC8vIElmIGFueSBleGNlcHRpb25zLCBjb21wbGV0ZSBhYnJ1cHRseSwgdGhyb3dpbmcgdGhlIHNhbWUgZXhjZXB0aW9uIGFzIGFib3ZlLgogICAgIGlmIChIQVNfUEVORElOR19FWENFUFRJT04pIHsKICAgICAgIEhhbmRsZSBlKFRIUkVBRCwgUEVORElOR19FWENFUFRJT04pOwogICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047CiAgICAgICB7CiAgICAgICAgIEVYQ0VQVElPTl9NQVJLOwotICAgICAgICAvLyBMb2NrcyBvYmplY3QsIHNldCBzdGF0ZSwgYW5kIG5vdGlmeSBhbGwgd2FpdGluZyB0aHJlYWRzCi0gICAgICAgIHRoaXNfb29wLT5zZXRfaW5pdGlhbGl6YXRpb25fc3RhdGVfYW5kX25vdGlmeShpbml0aWFsaXphdGlvbl9lcnJvciwgVEhSRUFEKTsKLSAgICAgICAgQ0xFQVJfUEVORElOR19FWENFUFRJT047CisgICAgICAgIHRoaXNfb29wLT5zZXRfaW5pdGlhbGl6YXRpb25fc3RhdGVfYW5kX25vdGlmeShpbml0aWFsaXphdGlvbl9lcnJvciwgVEhSRUFEKTsgLy8gTG9ja3Mgb2JqZWN0LCBzZXQgc3RhdGUsIGFuZCBub3RpZnkgYWxsIHdhaXRpbmcgdGhyZWFkcworICAgICAgICBDTEVBUl9QRU5ESU5HX0VYQ0VQVElPTjsgICAvLyBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aHJvd24sIHN1cGVyY2xhc3MgaW5pdGlhbGl6YXRpb24gZXJyb3IgaXMgdGhyb3duIGJlbG93CiAgICAgICB9CiAgICAgICBEVFJBQ0VfQ0xBU1NJTklUX1BST0JFX1dBSVQoc3VwZXJfX2ZhaWxlZCwgSW5zdGFuY2VLbGFzczo6Y2FzdCh0aGlzX29vcCgpKSwgLTEsd2FpdCk7CiAgICAgICBUSFJPV19PT1AoZSgpKTsKICAgICB9CiAgIH0KIAorICAvLyBSZWN1cnNpdmVseSBpbml0aWFsaXplIGFueSBzdXBlcmludGVyZmFjZXMgdGhhdCBkZWNsYXJlIGRlZmF1bHQgbWV0aG9kcworICAvLyBPbmx5IG5lZWQgdG8gcmVjdXJzZSBpZiBoYXNfZGVmYXVsdF9tZXRob2RzIHdoaWNoIGluY2x1ZGVzIGRlY2xhcmluZyBhbmQKKyAgLy8gaW5oZXJpdGluZyBkZWZhdWx0IG1ldGhvZHMKKyAgaWYgKHRoaXNfb29wLT5oYXNfZGVmYXVsdF9tZXRob2RzKCkpIHsKKyAgICB0aGlzX29vcC0+aW5pdGlhbGl6ZV9zdXBlcl9pbnRlcmZhY2VzKHRoaXNfb29wLCBDSEVDSyk7CisgIH0KKwogICAvLyBTdGVwIDgKICAgewogICAgIGFzc2VydChUSFJFQUQtPmlzX0phdmFfdGhyZWFkKCksICJub24tSmF2YVRocmVhZCBpbiBpbml0aWFsaXplX2ltcGwiKTsKQEAgLTk3NiwxNSArOTgxLDEwIEBACiAKIHZvaWQgSW5zdGFuY2VLbGFzczo6c2V0X2luaXRpYWxpemF0aW9uX3N0YXRlX2FuZF9ub3RpZnlfaW1wbChpbnN0YW5jZUtsYXNzSGFuZGxlIHRoaXNfb29wLCBDbGFzc1N0YXRlIHN0YXRlLCBUUkFQUykgewogICBvb3AgaW5pdF9sb2NrID0gdGhpc19vb3AtPmluaXRfbG9jaygpOwotICBpZiAoaW5pdF9sb2NrICE9IE5VTEwpIHsKLSAgICBPYmplY3RMb2NrZXIgb2woaW5pdF9sb2NrLCBUSFJFQUQpOwotICAgIHRoaXNfb29wLT5zZXRfaW5pdF9zdGF0ZShzdGF0ZSk7Ci0gICAgdGhpc19vb3AtPmZlbmNlX2FuZF9jbGVhcl9pbml0X2xvY2soKTsKLSAgICBvbC5ub3RpZnlfYWxsKENIRUNLKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoaW5pdF9sb2NrICE9IE5VTEwsICJUaGUgaW5pdGlhbGl6YXRpb24gc3RhdGUgc2hvdWxkIG5ldmVyIGJlIHNldCB0d2ljZSIpOwotICAgIHRoaXNfb29wLT5zZXRfaW5pdF9zdGF0ZShzdGF0ZSk7Ci0gIH0KKyAgT2JqZWN0TG9ja2VyIG9sKGluaXRfbG9jaywgVEhSRUFELCBpbml0X2xvY2sgIT0gTlVMTCk7CisgIHRoaXNfb29wLT5zZXRfaW5pdF9zdGF0ZShzdGF0ZSk7CisgIHRoaXNfb29wLT5mZW5jZV9hbmRfY2xlYXJfaW5pdF9sb2NrKCk7CisgIG9sLm5vdGlmeV9hbGwoQ0hFQ0spOwogfQogCiAvLyBUaGUgZW1iZWRkZWQgX2ltcGxlbWVudG9yIGZpZWxkIGNhbiBvbmx5IHJlY29yZCBvbmUgaW1wbGVtZW50b3IuCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZC5jcHAKaW5kZXggYjFkYjRkYy4uMTcyYzYxMiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2QuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kLmNwcApAQCAtMTExLDcgKzExMSw2IEBACiAvLyBSZWxlYXNlIE1ldGhvZCouICBUaGUgbm1ldGhvZCB3aWxsIGJlIGdvbmUgd2hlbiB3ZSBnZXQgaGVyZSBiZWNhdXNlCiAvLyB3ZSd2ZSB3YWxrZWQgdGhlIGNvZGUgY2FjaGUuCiB2b2lkIE1ldGhvZDo6ZGVhbGxvY2F0ZV9jb250ZW50cyhDbGFzc0xvYWRlckRhdGEqIGxvYWRlcl9kYXRhKSB7Ci0gIGNsZWFyX2ptZXRob2RfaWQobG9hZGVyX2RhdGEpOwogICBNZXRhZGF0YUZhY3Rvcnk6OmZyZWVfbWV0YWRhdGEobG9hZGVyX2RhdGEsIGNvbnN0TWV0aG9kKCkpOwogICBzZXRfY29uc3RNZXRob2QoTlVMTCk7CiAgIE1ldGFkYXRhRmFjdG9yeTo6ZnJlZV9tZXRhZGF0YShsb2FkZXJfZGF0YSwgbWV0aG9kX2RhdGEoKSk7CkBAIC0xODAxLDI0ICsxODAwLDEzIEBACiAjZW5kaWYgLy8gQVNTRVJUCiAgICAgKm0gPSBfZnJlZV9tZXRob2Q7CiAgIH0KLSAgdm9pZCBjbGVhcl9tZXRob2QoTWV0aG9kKiBtKSB7Ci0gICAgZm9yIChKTklNZXRob2RCbG9jayogYiA9IHRoaXM7IGIgIT0gTlVMTDsgYiA9IGItPl9uZXh0KSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlcl9vZl9tZXRob2RzOyBpKyspIHsKLSAgICAgICAgaWYgKGItPl9tZXRob2RzW2ldID09IG0pIHsKLSAgICAgICAgICBiLT5fbWV0aG9kc1tpXSA9IE5VTEw7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIG5vdCBmb3VuZAotICB9CiAKICAgLy8gRHVyaW5nIGNsYXNzIHVubG9hZGluZyB0aGUgbWV0aG9kcyBhcmUgY2xlYXJlZCwgd2hpY2ggaXMgZGlmZmVyZW50CiAgIC8vIHRoYW4gZnJlZWQuCiAgIHZvaWQgY2xlYXJfYWxsX21ldGhvZHMoKSB7CiAgICAgZm9yIChKTklNZXRob2RCbG9jayogYiA9IHRoaXM7IGIgIT0gTlVMTDsgYiA9IGItPl9uZXh0KSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaTwgbnVtYmVyX29mX21ldGhvZHM7IGkrKykgewotICAgICAgICBiLT5fbWV0aG9kc1tpXSA9IE5VTEw7CisgICAgICAgIF9tZXRob2RzW2ldID0gTlVMTDsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE4MjgsNyArMTgxNiw3IEBACiAgICAgaW50IGNvdW50ID0gMDsKICAgICBmb3IgKEpOSU1ldGhvZEJsb2NrKiBiID0gdGhpczsgYiAhPSBOVUxMOyBiID0gYi0+X25leHQpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpPCBudW1iZXJfb2ZfbWV0aG9kczsgaSsrKSB7Ci0gICAgICAgIGlmIChiLT5fbWV0aG9kc1tpXSAhPSBfZnJlZV9tZXRob2QpIGNvdW50Kys7CisgICAgICAgIGlmIChfbWV0aG9kc1tpXSAhPSBfZnJlZV9tZXRob2QpIGNvdW50Kys7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBjb3VudDsKQEAgLTE4ODQsMTMgKzE4NzIsOCBAQAogCiBib29sIE1ldGhvZDo6aXNfbWV0aG9kX2lkKGptZXRob2RJRCBtaWQpIHsKICAgTWV0aG9kKiBtID0gcmVzb2x2ZV9qbWV0aG9kX2lkKG1pZCk7Ci0gIGlmIChtID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgYXNzZXJ0KG0gIT0gTlVMTCwgInNob3VsZCBiZSBjYWxsZWQgd2l0aCBub24tbnVsbCBtZXRob2QiKTsKICAgSW5zdGFuY2VLbGFzcyogaWsgPSBtLT5tZXRob2RfaG9sZGVyKCk7Ci0gIGlmIChpayA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CiAgIENsYXNzTG9hZGVyRGF0YSogY2xkID0gaWstPmNsYXNzX2xvYWRlcl9kYXRhKCk7CiAgIGlmIChjbGQtPmptZXRob2RfaWRzKCkgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gKGNsZC0+am1ldGhvZF9pZHMoKS0+Y29udGFpbnMoKE1ldGhvZCoqKW1pZCkpOwpAQCAtMTg5OCw5ICsxODgxLDYgQEAKIAogTWV0aG9kKiBNZXRob2Q6OmNoZWNrZWRfcmVzb2x2ZV9qbWV0aG9kX2lkKGptZXRob2RJRCBtaWQpIHsKICAgaWYgKG1pZCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgaWYgKCFNZXRob2Q6OmlzX21ldGhvZF9pZChtaWQpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KICAgTWV0aG9kKiBvID0gcmVzb2x2ZV9qbWV0aG9kX2lkKG1pZCk7CiAgIGlmIChvID09IE5VTEwgfHwgbyA9PSBKTklNZXRob2RCbG9jazo6X2ZyZWVfbWV0aG9kIHx8ICEoKE1ldGFkYXRhKilvKS0+aXNfbWV0aG9kKCkpIHsKICAgICByZXR1cm4gTlVMTDsKQEAgLTE5MTksMTAgKzE4OTksNiBAQAogICB9CiB9CiAKLXZvaWQgTWV0aG9kOjpjbGVhcl9qbWV0aG9kX2lkKENsYXNzTG9hZGVyRGF0YSogbG9hZGVyX2RhdGEpIHsKLSAgbG9hZGVyX2RhdGEtPmptZXRob2RfaWRzKCktPmNsZWFyX21ldGhvZCh0aGlzKTsKLX0KLQogLy8gQ2FsbGVkIHdoZW4gdGhlIGNsYXNzIGxvYWRlciBpcyB1bmxvYWRlZCB0byBtYWtlIGFsbCBtZXRob2RzIHdlYWsuCiB2b2lkIE1ldGhvZDo6Y2xlYXJfam1ldGhvZF9pZHMoQ2xhc3NMb2FkZXJEYXRhKiBsb2FkZXJfZGF0YSkgewogICBsb2FkZXJfZGF0YS0+am1ldGhvZF9pZHMoKS0+Y2xlYXJfYWxsX21ldGhvZHMoKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kLmhwcAppbmRleCA5NzRiY2VkLi4yMTI2MDMzIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZC5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2QuaHBwCkBAIC03NjgsOCArNzY4LDYgQEAKIAogICAvLyBIZWxwZXIgcm91dGluZXMgZm9yIGludHJpbnNpY19pZCgpIGFuZCB2bUludHJpbnNpY3M6Om1ldGhvZCgpLgogICB2b2lkIGluaXRfaW50cmluc2ljX2lkKCk7ICAgICAvLyB1cGRhdGVzIGZyb20gX25vbmUgaWYgYSBtYXRjaAotICB2b2lkIGNsZWFyX2ptZXRob2RfaWQoQ2xhc3NMb2FkZXJEYXRhKiBsb2FkZXJfZGF0YSk7Ci0KICAgc3RhdGljIHZtU3ltYm9sczo6U0lEIGtsYXNzX2lkX2Zvcl9pbnRyaW5zaWNzKEtsYXNzKiBob2xkZXIpOwogCiAgIGJvb2wgICAgIGpmcl90b3dyaXRlKCkgICAgICAgICAgICAgICAgeyByZXR1cm4gX2pmcl90b3dyaXRlOyAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ibG9jay5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmNwcAppbmRleCAyNDVjZTQyLi5mMDU5OWExIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmNwcApAQCAtMTIwOCw5ICsxMjA4LDYgQEAKICAgICAgIGlmIChqID49IDEgJiYgbi0+aXNfTWFjaCgpICYmIG4tPmFzX01hY2goKS0+aWRlYWxfT3Bjb2RlKCkgPT0gT3BfQ3JlYXRlRXgpIHsKICAgICAgICAgYXNzZXJ0KGogPT0gMSB8fCBibG9jay0+Z2V0X25vZGUoai0xKS0+aXNfUGhpKCksICJDcmVhdGVFeCBtdXN0IGJlIGZpcnN0IGluc3RydWN0aW9uIGluIGJsb2NrIik7CiAgICAgICB9Ci0gICAgICBpZiAobi0+bmVlZHNfYW50aV9kZXBlbmRlbmNlX2NoZWNrKCkpIHsKLSAgICAgICAgdmVyaWZ5X2FudGlfZGVwZW5kZW5jZXMoYmxvY2ssIG4pOwotICAgICAgfQogICAgICAgZm9yICh1aW50IGsgPSAwOyBrIDwgbi0+cmVxKCk7IGsrKykgewogICAgICAgICBOb2RlICpkZWYgPSBuLT5pbihrKTsKICAgICAgICAgaWYgKGRlZiAmJiBkZWYgIT0gbikgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ibG9jay5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmhwcAppbmRleCAwYzczNjNlLi5kMDg1YjI5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Jsb2NrLmhwcApAQCAtMTg1LDEzICsxODUsMTQgQEAKICAgQmxvY2sqIGxvbmVfZmFsbF90aHJvdWdoKCk7ICAgLy8gUmV0dXJuIGxvbmUgZmFsbC10aHJvdWdoIEJsb2NrIG9yIG51bGwKIAogICBCbG9jayogZG9tX2xjYShCbG9jayogdGhhdCk7ICAvLyBDb21wdXRlIExDQSBpbiBkb21pbmF0b3IgdHJlZS4KLQorI2lmZGVmIEFTU0VSVAogICBib29sIGRvbWluYXRlcyhCbG9jayogdGhhdCkgewogICAgIGludCBkb21fZGlmZiA9IHRoaXMtPl9kb21fZGVwdGggLSB0aGF0LT5fZG9tX2RlcHRoOwogICAgIGlmIChkb21fZGlmZiA+IDApICByZXR1cm4gZmFsc2U7CiAgICAgZm9yICg7IGRvbV9kaWZmIDwgMDsgZG9tX2RpZmYrKykgIHRoYXQgPSB0aGF0LT5faWRvbTsKICAgICByZXR1cm4gdGhpcyA9PSB0aGF0OwogICB9CisjZW5kaWYKIAogICAvLyBSZXBvcnQgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGlzIGJsb2NrLiAgTXVzdCBiZSBhIHBvd2VyIG9mIDIuCiAgIC8vIFRoZSBwcmV2aW91cyBibG9jayB3aWxsIGluc2VydCBub3BzIHRvIGdldCB0aGlzIGFsaWdubWVudC4KQEAgLTQ3Miw5ICs0NzMsOSBAQAogICBNYWNoTm9kZSogX2dvdG87CiAKICAgQmxvY2sqIGluc2VydF9hbnRpX2RlcGVuZGVuY2VzKEJsb2NrKiBMQ0EsIE5vZGUqIGxvYWQsIGJvb2wgdmVyaWZ5ID0gZmFsc2UpOwotICB2b2lkIHZlcmlmeV9hbnRpX2RlcGVuZGVuY2VzKEJsb2NrKiBMQ0EsIE5vZGUqIGxvYWQpIGNvbnN0IHsKKyAgdm9pZCB2ZXJpZnlfYW50aV9kZXBlbmRlbmNlcyhCbG9jayogTENBLCBOb2RlKiBsb2FkKSB7CiAgICAgYXNzZXJ0KExDQSA9PSBnZXRfYmxvY2tfZm9yX25vZGUobG9hZCksICJzaG91bGQgYWxyZWFkeSBiZSBzY2hlZHVsZWQiKTsKLSAgICBjb25zdF9jYXN0PFBoYXNlQ0ZHKj4odGhpcyktPmluc2VydF9hbnRpX2RlcGVuZGVuY2VzKExDQSwgbG9hZCwgdHJ1ZSk7CisgICAgaW5zZXJ0X2FudGlfZGVwZW5kZW5jZXMoTENBLCBsb2FkLCB0cnVlKTsKICAgfQogCiAgIGJvb2wgbW92ZV90b19uZXh0KEJsb2NrKiBieCwgdWludCBiX2luZGV4KTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2Znbm9kZS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NmZ25vZGUuaHBwCmluZGV4IDc0NDYxYWEuLmU3OTU0ODMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2Znbm9kZS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jZmdub2RlLmhwcApAQCAtMTE5LDkgKzExOSw2IEBACiAvLyBpbnB1dCBpbiBzbG90IDAuCiBjbGFzcyBQaGlOb2RlIDogcHVibGljIFR5cGVOb2RlIHsKICAgY29uc3QgVHlwZVB0ciogY29uc3QgX2Fkcl90eXBlOyAvLyBub24tbnVsbCBvbmx5IGZvciBUeXBlOjpNRU1PUlkgbm9kZXMuCi0gIC8vIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgZm9yIGRhdGEgUGhpTm9kZXMgdG8gaW5kaWNhdGUKLSAgLy8gdGhhdCB0aGUgUGhpTm9kZSByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiBhIGtub3duIGluc3RhbmNlIGZpZWxkLgotICAgICAgICBpbnQgX2luc3RfbWVtX2lkOyAvLyBJbnN0YW5jZSBtZW1vcnkgaWQgKG5vZGUgaW5kZXggb2YgdGhlIG1lbW9yeSBQaGkpCiAgIGNvbnN0IGludCBfaW5zdF9pZDsgICAgIC8vIEluc3RhbmNlIGlkIG9mIHRoZSBtZW1vcnkgc2xpY2UuCiAgIGNvbnN0IGludCBfaW5zdF9pbmRleDsgIC8vIEFsaWFzIGluZGV4IG9mIHRoZSBpbnN0YW5jZSBtZW1vcnkgc2xpY2UuCiAgIC8vIEFycmF5IGVsZW1lbnRzIHJlZmVyZW5jZXMgaGF2ZSB0aGUgc2FtZSBhbGlhc19pZHggYnV0IGRpZmZlcmVudCBvZmZzZXQuCkBAIC0xNDEsMTMgKzEzOCwxMSBAQAogICB9OwogCiAgIFBoaU5vZGUoIE5vZGUgKnIsIGNvbnN0IFR5cGUgKnQsIGNvbnN0IFR5cGVQdHIqIGF0ID0gTlVMTCwKLSAgICAgICAgICAgY29uc3QgaW50IGltaWQgPSAtMSwKICAgICAgICAgICAgY29uc3QgaW50IGlpZCA9IFR5cGVPb3BQdHI6Okluc3RhbmNlVG9wLAogICAgICAgICAgICBjb25zdCBpbnQgaWlkeCA9IENvbXBpbGU6OkFsaWFzSWR4VG9wLAogICAgICAgICAgICBjb25zdCBpbnQgaW9mZnMgPSBUeXBlOjpPZmZzZXRUb3AgKQogICAgIDogVHlwZU5vZGUodCxyLT5yZXEoKSksCiAgICAgICBfYWRyX3R5cGUoYXQpLAotICAgICAgX2luc3RfbWVtX2lkKGltaWQpLAogICAgICAgX2luc3RfaWQoaWlkKSwKICAgICAgIF9pbnN0X2luZGV4KGlpZHgpLAogICAgICAgX2luc3Rfb2Zmc2V0KGlvZmZzKQpAQCAtMTkyLDE0ICsxODcsMTEgQEAKICAgdmlydHVhbCBib29sIHBpbm5lZCgpIGNvbnN0IHsgcmV0dXJuIGluKDApICE9IDA7IH0KICAgdmlydHVhbCBjb25zdCBUeXBlUHRyICphZHJfdHlwZSgpIGNvbnN0IHsgdmVyaWZ5X2Fkcl90eXBlKHRydWUpOyByZXR1cm4gX2Fkcl90eXBlOyB9CiAKLSAgdm9pZCAgc2V0X2luc3RfbWVtX2lkKGludCBpbnN0X21lbV9pZCkgeyBfaW5zdF9tZW1faWQgPSBpbnN0X21lbV9pZDsgfQotICBjb25zdCBpbnQgaW5zdF9tZW1faWQoKSBjb25zdCB7IHJldHVybiBfaW5zdF9tZW1faWQ7IH0KICAgY29uc3QgaW50IGluc3RfaWQoKSAgICAgY29uc3QgeyByZXR1cm4gX2luc3RfaWQ7IH0KICAgY29uc3QgaW50IGluc3RfaW5kZXgoKSAgY29uc3QgeyByZXR1cm4gX2luc3RfaW5kZXg7IH0KICAgY29uc3QgaW50IGluc3Rfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gX2luc3Rfb2Zmc2V0OyB9Ci0gIGJvb2wgaXNfc2FtZV9pbnN0X2ZpZWxkKGNvbnN0IFR5cGUqIHRwLCBpbnQgbWVtX2lkLCBpbnQgaWQsIGludCBpbmRleCwgaW50IG9mZnNldCkgeworICBib29sIGlzX3NhbWVfaW5zdF9maWVsZChjb25zdCBUeXBlKiB0cCwgaW50IGlkLCBpbnQgaW5kZXgsIGludCBvZmZzZXQpIHsKICAgICByZXR1cm4gdHlwZSgpLT5iYXNpY190eXBlKCkgPT0gdHAtPmJhc2ljX3R5cGUoKSAmJgotICAgICAgICAgICBpbnN0X21lbV9pZCgpID09IG1lbV9pZCAmJgogICAgICAgICAgICBpbnN0X2lkKCkgICAgID09IGlkICAgICAmJgogICAgICAgICAgICBpbnN0X2luZGV4KCkgID09IGluZGV4ICAmJgogICAgICAgICAgICBpbnN0X29mZnNldCgpID09IG9mZnNldCAmJgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jb21waWxlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29tcGlsZS5jcHAKaW5kZXggZTAyMTkyNC4uZGM4ODM4MSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jb21waWxlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NvbXBpbGUuY3BwCkBAIC02MDgsMTAgKzYwOCw2IEBACiAgICAgbi0+YXNfTWFjaEJyYW5jaCgpLT5sYWJlbF9zZXQoJmZha2VMLCAwKTsKICAgfQogICBuLT5lbWl0KGJ1ZiwgdGhpcy0+cmVnYWxsb2MoKSk7Ci0KLSAgLy8gRW1pdHRpbmcgaW50byB0aGUgc2NyYXRjaCBidWZmZXIgc2hvdWxkIG5vdCBmYWlsCi0gIGFzc2VydCAoIWZhaWxpbmcoKSwgZXJyX21zZ19yZXMoIk11c3Qgbm90IGhhdmUgcGVuZGluZyBmYWlsdXJlLiBSZWFzb24gaXM6ICVzIiwgZmFpbHVyZV9yZWFzb24oKSkpOwotCiAgIGlmIChpc19icmFuY2gpIC8vIFJlc3RvcmUgbGFiZWwuCiAgICAgbi0+YXNfTWFjaEJyYW5jaCgpLT5sYWJlbF9zZXQoc2F2ZUwsIHNhdmVfYm51bSk7CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29ubm9kZS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2Nvbm5vZGUuY3BwCmluZGV4IDNkOTkyNDkuLjAwYWVlNTEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29ubm9kZS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jb25ub2RlLmNwcApAQCAtNDQ2LDkgKzQ0Niw3IEBACiB9CiAKIHVpbnQgQ2FzdElJTm9kZTo6Y21wKGNvbnN0IE5vZGUgJm4pIGNvbnN0IHsKLSAgcmV0dXJuIFR5cGVOb2RlOjpjbXAobikgJiYKLSAgICAgICAgICgoQ2FzdElJTm9kZSYpbikuX2NhcnJ5X2RlcGVuZGVuY3kgPT0gX2NhcnJ5X2RlcGVuZGVuY3kgJiYKLSAgICAgICAgICgoQ2FzdElJTm9kZSYpbikuX3JhbmdlX2NoZWNrX2RlcGVuZGVuY3kgPT0gX3JhbmdlX2NoZWNrX2RlcGVuZGVuY3k7CisgIHJldHVybiBUeXBlTm9kZTo6Y21wKG4pICYmICgoQ2FzdElJTm9kZSYpbikuX2NhcnJ5X2RlcGVuZGVuY3kgPT0gX2NhcnJ5X2RlcGVuZGVuY3k7CiB9CiAKIE5vZGUgKkNhc3RJSU5vZGU6OklkZW50aXR5KFBoYXNlVHJhbnNmb3JtICpwaGFzZSkgewpAQCAtNTI1LDcgKzUyMyw3IEBACiB9CiAKIE5vZGUgKkNhc3RJSU5vZGU6OklkZWFsX0RVX3Bvc3RDQ1AoUGhhc2VDQ1AgKmNjcCkgewotICBpZiAoX2NhcnJ5X2RlcGVuZGVuY3kgfHwgX3JhbmdlX2NoZWNrX2RlcGVuZGVuY3kpIHsKKyAgaWYgKF9jYXJyeV9kZXBlbmRlbmN5KSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgcmV0dXJuIENvbnN0cmFpbnRDYXN0Tm9kZTo6SWRlYWxfRFVfcG9zdENDUChjY3ApOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9kb0NhbGwuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9kb0NhbGwuY3BwCmluZGV4IGZlZTZlYjcuLmY0ZWQxYWUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZG9DYWxsLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2RvQ2FsbC5jcHAKQEAgLTIwNSwyMiArMjA1LDE2IEBACiAKICAgICAgIGludCBtb3JwaGlzbSA9IHByb2ZpbGUubW9ycGhpc20oKTsKICAgICAgIGlmIChzcGVjdWxhdGl2ZV9yZWNlaXZlcl90eXBlICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF0b29fbWFueV90cmFwcyhjYWxsZXIsIGJjaSwgRGVvcHRpbWl6YXRpb246OlJlYXNvbl9zcGVjdWxhdGVfY2xhc3NfY2hlY2spKSB7Ci0gICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWN1bGF0aXZlIHR5cGUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlc29sdmUKLSAgICAgICAgICAvLyB0aGUgY2FsbC4gV2UgZG8gdGhhdCBiZWZvcmUgbG9va2luZyBhdCB0aGUgcHJvZmlsaW5nIGF0Ci0gICAgICAgICAgLy8gdGhpcyBpbnZva2UgYmVjYXVzZSBpdCBtYXkgbGVhZCB0byBiaW1vcnBoaWMgaW5saW5pbmcgd2hpY2gKLSAgICAgICAgICAvLyBhIHNwZWN1bGF0aXZlIHR5cGUgc2hvdWxkIGhlbHAgdXMgYXZvaWQuCi0gICAgICAgICAgcmVjZWl2ZXJfbWV0aG9kID0gY2FsbGVlLT5yZXNvbHZlX2ludm9rZShqdm1zLT5tZXRob2QoKS0+aG9sZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdWxhdGl2ZV9yZWNlaXZlcl90eXBlKTsKLSAgICAgICAgICBpZiAocmVjZWl2ZXJfbWV0aG9kID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNwZWN1bGF0aXZlX3JlY2VpdmVyX3R5cGUgPSBOVUxMOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtb3JwaGlzbSA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHNwZWN1bGF0aW9uIGZhaWxlZCBiZWZvcmUuIFVzZSBwcm9maWxpbmcgYXQgdGhlIGNhbGwKLSAgICAgICAgICAvLyAoY291bGQgYWxsb3cgYmltb3JwaGljIGlubGluaW5nIGZvciBpbnN0YW5jZSkuCisgICAgICAgIC8vIFdlIGhhdmUgYSBzcGVjdWxhdGl2ZSB0eXBlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byByZXNvbHZlCisgICAgICAgIC8vIHRoZSBjYWxsLiBXZSBkbyB0aGF0IGJlZm9yZSBsb29raW5nIGF0IHRoZSBwcm9maWxpbmcgYXQKKyAgICAgICAgLy8gdGhpcyBpbnZva2UgYmVjYXVzZSBpdCBtYXkgbGVhZCB0byBiaW1vcnBoaWMgaW5saW5pbmcgd2hpY2gKKyAgICAgICAgLy8gYSBzcGVjdWxhdGl2ZSB0eXBlIHNob3VsZCBoZWxwIHVzIGF2b2lkLgorICAgICAgICByZWNlaXZlcl9tZXRob2QgPSBjYWxsZWUtPnJlc29sdmVfaW52b2tlKGp2bXMtPm1ldGhvZCgpLT5ob2xkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjdWxhdGl2ZV9yZWNlaXZlcl90eXBlKTsKKyAgICAgICAgaWYgKHJlY2VpdmVyX21ldGhvZCA9PSBOVUxMKSB7CiAgICAgICAgICAgc3BlY3VsYXRpdmVfcmVjZWl2ZXJfdHlwZSA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbW9ycGhpc20gPSAxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAocmVjZWl2ZXJfbWV0aG9kID09IE5VTEwgJiYKQEAgLTI1OCw3ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVvcHRpbWl6YXRpb246OlJlYXNvbl9iaW1vcnBoaWMgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWN1bGF0aXZlX3JlY2VpdmVyX3R5cGUgPT0gTlVMTCA/IERlb3B0aW1pemF0aW9uOjpSZWFzb25fY2xhc3NfY2hlY2sgOiBEZW9wdGltaXphdGlvbjo6UmVhc29uX3NwZWN1bGF0ZV9jbGFzc19jaGVjayk7CiAgICAgICAgICAgaWYgKChtb3JwaGlzbSA9PSAxIHx8IChtb3JwaGlzbSA9PSAyICYmIG5leHRfaGl0X2NnICE9IE5VTEwpKSAmJgotICAgICAgICAgICAgICAhdG9vX21hbnlfdHJhcHMoY2FsbGVyLCBiY2ksIHJlYXNvbikKKyAgICAgICAgICAgICAgIXRvb19tYW55X3RyYXBzKGp2bXMtPm1ldGhvZCgpLCBqdm1zLT5iY2koKSwgcmVhc29uKQogICAgICAgICAgICAgICkgewogICAgICAgICAgICAgLy8gR2VuZXJhdGUgdW5jb21tb24gdHJhcCBmb3IgY2xhc3MgY2hlY2sgZmFpbHVyZSBwYXRoCiAgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIG1vbm9tb3JwaGljIG9yIGJpbW9ycGhpYyB2aXJ0dWFsIGNhbGwgc2l0ZS4KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZ3JhcGhLaXQuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5jcHAKaW5kZXggYmZiYTNlOS4uMzhlMGNlMiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ncmFwaEtpdC5jcHAKQEAgLTE2ODMsOSArMTY4Myw2IEBACiAgIGNvbnN0IFR5cGUqIGVsZW10eXBlID0gYXJ5dHlwZS0+ZWxlbSgpOwogICBCYXNpY1R5cGUgZWxlbWJ0ID0gZWxlbXR5cGUtPmFycmF5X2VsZW1lbnRfYmFzaWNfdHlwZSgpOwogICBOb2RlKiBhZHIgPSBhcnJheV9lbGVtZW50X2FkZHJlc3MoYXJ5LCBpZHgsIGVsZW1idCwgYXJ5dHlwZS0+c2l6ZSgpKTsKLSAgaWYgKGVsZW1idCA9PSBUX05BUlJPV09PUCkgewotICAgIGVsZW1idCA9IFRfT0JKRUNUOyAvLyBUbyBzYXRpc2Z5IHN3aXRjaCBpbiBMb2FkTm9kZTo6bWFrZSgpCi0gIH0KICAgTm9kZSogbGQgPSBtYWtlX2xvYWQoY3RsLCBhZHIsIGVsZW10eXBlLCBlbGVtYnQsIGFyeXR5cGUsIE1lbU5vZGU6OnVub3JkZXJlZCk7CiAgIHJldHVybiBsZDsKIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGNtLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGNtLmNwcAppbmRleCBkZDkzYjBmLi44ZjY4NDRmIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xjbS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9sY20uY3BwCkBAIC0yNDYsMTQgKzI0Niw2IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICAvLyBDaGVjayB0aGF0IG5vZGUncyBjb250cm9sIGVkZ2UgaXMgbm90LW51bGwgYmxvY2sncyBoZWFkIG9yIGRvbWluYXRlcyBpdCwKLSAgICAvLyBvdGhlcndpc2Ugd2UgY2FuJ3QgaG9pc3QgaXQgYmVjYXVzZSB0aGVyZSBhcmUgb3RoZXIgY29udHJvbCBkZXBlbmRlbmNpZXMuCi0gICAgTm9kZSogY3RybCA9IG1hY2gtPmluKDApOwotICAgIGlmIChjdHJsICE9IE5VTEwgJiYgIShjdHJsID09IG5vdF9udWxsX2Jsb2NrLT5oZWFkKCkgfHwKLSAgICAgICAgZ2V0X2Jsb2NrX2Zvcl9ub2RlKGN0cmwpLT5kb21pbmF0ZXMobm90X251bGxfYmxvY2spKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCiAgICAgLy8gY2hlY2sgaWYgdGhlIG9mZnNldCBpcyBub3QgdG9vIGhpZ2ggZm9yIGltcGxpY2l0IGV4Y2VwdGlvbgogICAgIHsKICAgICAgIGludHB0cl90IG9mZnNldCA9IDA7CkBAIC0zOTEsMTIgKzM4Myw5IEBACiAgIGJsb2NrLT5hZGRfaW5zdChiZXN0KTsKICAgbWFwX25vZGVfdG9fYmxvY2soYmVzdCwgYmxvY2spOwogCi0gIC8vIE1vdmUgdGhlIGNvbnRyb2wgZGVwZW5kZW5jZSBpZiBpdCBpcyBwaW5uZWQgdG8gbm90LW51bGwgYmxvY2suCi0gIC8vIERvbid0IGNoYW5nZSBpdCBpbiBvdGhlciBjYXNlczogTlVMTCBvciBkb21pbmF0aW5nIGNvbnRyb2wuCi0gIGlmIChiZXN0LT5pbigwKSA9PSBub3RfbnVsbF9ibG9jay0+aGVhZCgpKSB7Ci0gICAgLy8gU2V0IGl0IHRvIGNvbnRyb2wgZWRnZSBvZiBudWxsIGNoZWNrLgotICAgIGJlc3QtPnNldF9yZXEoMCwgcHJvai0+aW4oMCktPmluKDApKTsKLSAgfQorICAvLyBNb3ZlIHRoZSBjb250cm9sIGRlcGVuZGVuY2UKKyAgaWYgKGJlc3QtPmluKDApICYmIGJlc3QtPmluKDApID09IG9sZF9ibG9jay0+aGVhZCgpKQorICAgIGJlc3QtPnNldF9yZXEoMCwgYmxvY2stPmhlYWQoKSk7CiAKICAgLy8gQ2hlY2sgZm9yIGZsYWcta2lsbGluZyBwcm9qZWN0aW9ucyB0aGF0IGFsc28gbmVlZCB0byBiZSBob2lzdGVkCiAgIC8vIFNob3VsZCBiZSBEVSBzYWZlIGJlY2F1c2Ugbm8gZWRnZSB1cGRhdGVzLgpAQCAtNDUyLDE4ICs0NDEsNiBAQAogCiAgIGxhdGVuY3lfZnJvbV91c2VzKG51bF9jaGspOwogICBsYXRlbmN5X2Zyb21fdXNlcyhiZXN0KTsKLQotICAvLyBpbnNlcnQgYW50aS1kZXBlbmRlbmNlcyB0byBkZWZzIGluIHRoaXMgYmxvY2sKLSAgaWYgKCEgYmVzdC0+bmVlZHNfYW50aV9kZXBlbmRlbmNlX2NoZWNrKCkpIHsKLSAgICBmb3IgKHVpbnQgayA9IDE7IGsgPCBibG9jay0+bnVtYmVyX29mX25vZGVzKCk7IGsrKykgewotICAgICAgTm9kZSAqbiA9IGJsb2NrLT5nZXRfbm9kZShrKTsKLSAgICAgIGlmIChuLT5uZWVkc19hbnRpX2RlcGVuZGVuY2VfY2hlY2soKSAmJgotICAgICAgICAgIG4tPmluKExvYWROb2RlOjpNZW1vcnkpID09IGJlc3QtPmluKFN0b3JlTm9kZTo6TWVtb3J5KSkgewotICAgICAgICAvLyBGb3VuZCBhbnRpLWRlcGVuZGVudCBsb2FkCi0gICAgICAgIGluc2VydF9hbnRpX2RlcGVuZGVuY2VzKGJsb2NrLCBuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KIH0KIAogCkBAIC0xMTExLDEyICsxMDg4LDExIEBACiAgICAgQmxvY2sgKnNiID0gYmxvY2stPl9zdWNjc1tpXTsKICAgICAvLyBDbG9uZSB0aGUgZW50aXJlIGFyZWE7IGlnbm9yaW5nIHRoZSBlZGdlIGZpeHVwIGZvciBub3cuCiAgICAgZm9yKCB1aW50IGogPSBlbmQ7IGogPiBiZWc7IGotLSApIHsKKyAgICAgIC8vIEl0IGlzIHNhZmUgaGVyZSB0byBjbG9uZSBhIG5vZGUgd2l0aCBhbnRpX2RlcGVuZGVuY2UKKyAgICAgIC8vIHNpbmNlIGNsb25lcyBkb21pbmF0ZSBvbiBlYWNoIHBhdGguCiAgICAgICBOb2RlICpjbG9uZSA9IGJsb2NrLT5nZXRfbm9kZShqLTEpLT5jbG9uZSgpOwogICAgICAgc2ItPmluc2VydF9ub2RlKGNsb25lLCAxKTsKICAgICAgIG1hcF9ub2RlX3RvX2Jsb2NrKGNsb25lLCBzYik7Ci0gICAgICBpZiAoY2xvbmUtPm5lZWRzX2FudGlfZGVwZW5kZW5jZV9jaGVjaygpKSB7Ci0gICAgICAgIGluc2VydF9hbnRpX2RlcGVuZGVuY2VzKHNiLCBjbG9uZSk7Ci0gICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGlicmFyeV9jYWxsLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGlicmFyeV9jYWxsLmNwcAppbmRleCBlYjk5NTE3Li5mMmEyOTM3IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xpYnJhcnlfY2FsbC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9saWJyYXJ5X2NhbGwuY3BwCkBAIC02NDU5LDIwICs2NDU5LDcgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1nZXRfa2V5X3N0YXJ0X2Zyb21fYWVzY3J5cHRfb2JqZWN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5vZGUgKiBMaWJyYXJ5Q2FsbEtpdDo6Z2V0X2tleV9zdGFydF9mcm9tX2Flc2NyeXB0X29iamVjdChOb2RlICphZXNjcnlwdF9vYmplY3QpIHsKLSNpZmRlZiBQUEM2NAotICAvLyBNaXhDb2x1bW5zIGZvciBkZWNyeXB0aW9uIGNhbiBiZSByZWR1Y2VkIGJ5IHByZXByb2Nlc3NpbmcgTWl4Q29sdW1ucyB3aXRoIHJvdW5kIGtleXMuCi0gIC8vIEludGVsJ3MgZXh0ZW50aW9uIGlzIGJhc2VkIG9uIHRoaXMgb3B0aW1pemF0aW9uIGFuZCBBRVNDcnlwdCBnZW5lcmF0ZXMgcm91bmQga2V5cyBieSBwcmVwcm9jZXNzaW5nIE1peENvbHVtbnMuCi0gIC8vIEhvd2V2ZXIsIHBwYzY0IHZuY2lwaGVyIHByb2Nlc3NlcyBNaXhDb2x1bW5zIGFuZCByZXF1aXJlcyB0aGUgc2FtZSByb3VuZCBrZXlzIHdpdGggZW5jcnlwdGlvbi4KLSAgLy8gVGhlIHBwYzY0IHN0dWJzIG9mIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gdXNlIHRoZSBzYW1lIHJvdW5kIGtleXMgKHNlc3Npb25LWzBdKS4KLSAgTm9kZSogb2JqU2Vzc2lvbksgPSBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KGFlc2NyeXB0X29iamVjdCwgInNlc3Npb25LIiwgIltbSSIsIC8qaXNfZXhhY3QqLyBmYWxzZSk7Ci0gIGFzc2VydCAob2JqU2Vzc2lvbksgIT0gTlVMTCwgIndyb25nIHZlcnNpb24gb2YgY29tLnN1bi5jcnlwdG8ucHJvdmlkZXIuQUVTQ3J5cHQiKTsKLSAgaWYgKG9ialNlc3Npb25LID09IE5VTEwpIHsKLSAgICByZXR1cm4gKE5vZGUgKikgTlVMTDsKLSAgfQotICBOb2RlKiBvYmpBRVNDcnlwdEtleSA9IGxvYWRfYXJyYXlfZWxlbWVudChjb250cm9sKCksIG9ialNlc3Npb25LLCBpbnRjb24oMCksIFR5cGVBcnlQdHI6Ok9PUFMpOwotI2Vsc2UKICAgTm9kZSogb2JqQUVTQ3J5cHRLZXkgPSBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KGFlc2NyeXB0X29iamVjdCwgIksiLCAiW0kiLCAvKmlzX2V4YWN0Ki8gZmFsc2UpOwotI2VuZGlmIC8vIFBQQzY0CiAgIGFzc2VydCAob2JqQUVTQ3J5cHRLZXkgIT0gTlVMTCwgIndyb25nIHZlcnNpb24gb2YgY29tLnN1bi5jcnlwdG8ucHJvdmlkZXIuQUVTQ3J5cHQiKTsKICAgaWYgKG9iakFFU0NyeXB0S2V5ID09IE5VTEwpIHJldHVybiAoTm9kZSAqKSBOVUxMOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xvb3Bub2RlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbG9vcG5vZGUuY3BwCmluZGV4IDhmMmYyMjguLmU2NTM1NTcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbG9vcG5vZGUuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbG9vcG5vZGUuY3BwCkBAIC0yNzgsMTYgKzI3OCw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIEFsbG93IGZ1bm55IHBsYWNlbWVudCBvZiBTYWZlcG9pbnQKLSAgaWYgKGJhY2tfY29udHJvbC0+T3Bjb2RlKCkgPT0gT3BfU2FmZVBvaW50KSB7Ci0gICAgaWYgKFVzZUNvdW50ZWRMb29wU2FmZXBvaW50cykgewotICAgICAgLy8gTGVhdmluZyB0aGUgc2FmZXBvaW50IG9uIHRoZSBiYWNrZWRnZSBhbmQgY3JlYXRpbmcgYQotICAgICAgLy8gQ291bnRlZExvb3Agd2lsbCBjb25mdXNlIG9wdGltaXphdGlvbnMuIFdlIGNhbid0IG1vdmUgdGhlCi0gICAgICAvLyBzYWZlcG9pbnQgYXJvdW5kIGJlY2F1c2UgaXRzIGp2bSBzdGF0ZSB3b3VsZG4ndCBtYXRjaCBhIG5ldwotICAgICAgLy8gbG9jYXRpb24uIEdpdmUgdXAgb24gdGhhdCBsb29wLgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgaWYgKGJhY2tfY29udHJvbC0+T3Bjb2RlKCkgPT0gT3BfU2FmZVBvaW50KQogICAgIGJhY2tfY29udHJvbCA9IGJhY2tfY29udHJvbC0+aW4oVHlwZUZ1bmM6OkNvbnRyb2wpOwotICB9CiAKICAgLy8gQ29udHJvbGxpbmcgdGVzdCBmb3IgbG9vcAogICBOb2RlICppZnRydWUgPSBiYWNrX2NvbnRyb2w7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL21hY3JvLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWFjcm8uY3BwCmluZGV4IGQxZTFmMzIuLjAxYjMyOWMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWFjcm8uY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWFjcm8uY3BwCkBAIC00MDEsNyArNDAxLDcgQEAKICAgZm9yIChEVUl0ZXJhdG9yX0Zhc3Qga21heCwgayA9IHJlZ2lvbi0+ZmFzdF9vdXRzKGttYXgpOyBrIDwga21heDsgaysrKSB7CiAgICAgTm9kZSogcGhpID0gcmVnaW9uLT5mYXN0X291dChrKTsKICAgICBpZiAocGhpLT5pc19QaGkoKSAmJiBwaGkgIT0gbWVtICYmCi0gICAgICAgIHBoaS0+YXNfUGhpKCktPmlzX3NhbWVfaW5zdF9maWVsZChwaGlfdHlwZSwgKGludCltZW0tPl9pZHgsIGluc3RhbmNlX2lkLCBhbGlhc19pZHgsIG9mZnNldCkpIHsKKyAgICAgICAgcGhpLT5hc19QaGkoKS0+aXNfc2FtZV9pbnN0X2ZpZWxkKHBoaV90eXBlLCBpbnN0YW5jZV9pZCwgYWxpYXNfaWR4LCBvZmZzZXQpKSB7CiAgICAgICByZXR1cm4gcGhpOwogICAgIH0KICAgfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAgIEdyb3dhYmxlQXJyYXkgPE5vZGUgKj4gdmFsdWVzKGxlbmd0aCwgbGVuZ3RoLCBOVUxMLCBmYWxzZSk7CiAKICAgLy8gY3JlYXRlIGEgbmV3IFBoaSBmb3IgdGhlIHZhbHVlCi0gIFBoaU5vZGUgKnBoaSA9IG5ldyAoQykgUGhpTm9kZShtZW0tPmluKDApLCBwaGlfdHlwZSwgTlVMTCwgbWVtLT5faWR4LCBpbnN0YW5jZV9pZCwgYWxpYXNfaWR4LCBvZmZzZXQpOworICBQaGlOb2RlICpwaGkgPSBuZXcgKEMpIFBoaU5vZGUobWVtLT5pbigwKSwgcGhpX3R5cGUsIE5VTEwsIGluc3RhbmNlX2lkLCBhbGlhc19pZHgsIG9mZnNldCk7CiAgIHRyYW5zZm9ybV9sYXRlcihwaGkpOwogICB2YWx1ZV9waGlzLT5wdXNoKHBoaSwgbWVtLT5faWR4KTsKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9tZW1ub2RlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbWVtbm9kZS5jcHAKaW5kZXggYTkyMmE0ZS4uODBlMjVjOSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9tZW1ub2RlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL21lbW5vZGUuY3BwCkBAIC0xMTU1LDcgKzExNTUsNyBAQAogICAgIGZvciAoRFVJdGVyYXRvcl9GYXN0IGltYXgsIGkgPSByZWdpb24tPmZhc3Rfb3V0cyhpbWF4KTsgaSA8IGltYXg7IGkrKykgewogICAgICAgTm9kZSogcGhpID0gcmVnaW9uLT5mYXN0X291dChpKTsKICAgICAgIGlmIChwaGktPmlzX1BoaSgpICYmIHBoaSAhPSBtZW0gJiYKLSAgICAgICAgICBwaGktPmFzX1BoaSgpLT5pc19zYW1lX2luc3RfZmllbGQodGhpc190eXBlLCAoaW50KW1lbS0+X2lkeCwgdGhpc19paWQsIHRoaXNfaW5kZXgsIHRoaXNfb2Zmc2V0KSkgeworICAgICAgICAgIHBoaS0+YXNfUGhpKCktPmlzX3NhbWVfaW5zdF9maWVsZCh0aGlzX3R5cGUsIHRoaXNfaWlkLCB0aGlzX2luZGV4LCB0aGlzX29mZnNldCkpIHsKICAgICAgICAgcmV0dXJuIHBoaTsKICAgICAgIH0KICAgICB9CkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogICAgIHRoaXNfaWlkID0gYmFzZS0+X2lkeDsKICAgfQogICBQaGFzZUl0ZXJHVk4qIGlndm4gPSBwaGFzZS0+aXNfSXRlckdWTigpOwotICBOb2RlKiBwaGkgPSBuZXcgKEMpIFBoaU5vZGUocmVnaW9uLCB0aGlzX3R5cGUsIE5VTEwsIG1lbS0+X2lkeCwgdGhpc19paWQsIHRoaXNfaW5kZXgsIHRoaXNfb2Zmc2V0KTsKKyAgTm9kZSogcGhpID0gbmV3IChDKSBQaGlOb2RlKHJlZ2lvbiwgdGhpc190eXBlLCBOVUxMLCB0aGlzX2lpZCwgdGhpc19pbmRleCwgdGhpc19vZmZzZXQpOwogICBmb3IgKHVpbnQgaSA9IDE7IGkgPCByZWdpb24tPnJlcSgpOyBpKyspIHsKICAgICBOb2RlKiB4OwogICAgIE5vZGUqIHRoZV9jbG9uZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL291dHB1dC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL291dHB1dC5jcHAKaW5kZXggOTVkZTJkNi4uMDU2M2ViYiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9vdXRwdXQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vb3V0cHV0LmNwcApAQCAtMTUwMiwxMyArMTUwMiw2IEBACiAgICAgICBuLT5lbWl0KCpjYiwgX3JlZ2FsbG9jKTsKICAgICAgIGN1cnJlbnRfb2Zmc2V0ICA9IGNiLT5pbnN0c19zaXplKCk7CiAKLSAgICAgIC8vIEFib3ZlIHdlIG9ubHkgdmVyaWZpZWQgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGluc3RydWN0aW9uIHNlY3Rpb24uCi0gICAgICAvLyBIb3dldmVyLCB0aGUgaW5zdHJ1Y3Rpb24gbWF5IGVtaXQgc3R1YnMgdGhhdCBjYXVzZSBjb2RlIGJ1ZmZlciBleHBhbnNpb24uCi0gICAgICAvLyBCYWlsIG91dCBoZXJlIGlmIGV4cGFuc2lvbiBmYWlsZWQgZHVlIHRvIGEgbGFjayBvZiBjb2RlIGNhY2hlIHNwYWNlLgotICAgICAgaWYgKGZhaWxpbmcoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KICNpZmRlZiBBU1NFUlQKICAgICAgIGlmIChuLT5zaXplKF9yZWdhbGxvYykgPCAoY3VycmVudF9vZmZzZXQtaW5zdHJfb2Zmc2V0KSkgewogICAgICAgICBuLT5kdW1wKCk7CkBAIC0xNjM3LDE0ICsxNjMwLDExIEBACiAgIGlmIChfbWV0aG9kKSB7CiAgICAgLy8gRW1pdCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgY29kZS4KICAgICBfY29kZV9vZmZzZXRzLnNldF92YWx1ZShDb2RlT2Zmc2V0czo6RXhjZXB0aW9ucywgSGFuZGxlckltcGw6OmVtaXRfZXhjZXB0aW9uX2hhbmRsZXIoKmNiKSk7Ci0gICAgaWYgKGZhaWxpbmcoKSkgewotICAgICAgcmV0dXJuOyAvLyBDb2RlQnVmZmVyOjpleHBhbmQgZmFpbGVkCi0gICAgfQogICAgIC8vIEVtaXQgdGhlIGRlb3B0IGhhbmRsZXIgY29kZS4KICAgICBfY29kZV9vZmZzZXRzLnNldF92YWx1ZShDb2RlT2Zmc2V0czo6RGVvcHQsIEhhbmRsZXJJbXBsOjplbWl0X2Rlb3B0X2hhbmRsZXIoKmNiKSk7CiAKICAgICAvLyBFbWl0IHRoZSBNZXRob2RIYW5kbGUgZGVvcHQgaGFuZGxlciBjb2RlIChpZiByZXF1aXJlZCkuCi0gICAgaWYgKGhhc19tZXRob2RfaGFuZGxlX2ludm9rZXMoKSAmJiAhZmFpbGluZygpKSB7CisgICAgaWYgKGhhc19tZXRob2RfaGFuZGxlX2ludm9rZXMoKSkgewogICAgICAgLy8gV2UgY2FuIHVzZSB0aGUgc2FtZSBjb2RlIGFzIGZvciB0aGUgbm9ybWFsIGRlb3B0IGhhbmRsZXIsIHdlCiAgICAgICAvLyBqdXN0IG5lZWQgYSBkaWZmZXJlbnQgZW50cnkgcG9pbnQgYWRkcmVzcy4KICAgICAgIF9jb2RlX29mZnNldHMuc2V0X3ZhbHVlKENvZGVPZmZzZXRzOjpEZW9wdE1ILCBIYW5kbGVySW1wbDo6ZW1pdF9kZW9wdF9oYW5kbGVyKCpjYikpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9waGFzZVguY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9waGFzZVguY3BwCmluZGV4IDE3ODJjYjkuLmYwOTBmY2MgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcGhhc2VYLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3BoYXNlWC5jcHAKQEAgLTQ4MSw4ICs0ODEsNiBAQAogICB1aW50IGN1cnJlbnRfaWR4ID0gMDsgLy8gVGhlIGN1cnJlbnQgbmV3IG5vZGUgSUQuIEluY3JlbWVudGVkIGFmdGVyIGV2ZXJ5IGFzc2lnbm1lbnQuCiAgIGZvciAodWludCBpID0gMDsgaSA8IF91c2VmdWwuc2l6ZSgpOyBpKyspIHsKICAgICBOb2RlKiBuID0gX3VzZWZ1bC5hdChpKTsKLSAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCBmYWlscyBpZiB3ZSBldmVyIGRlY2lkZSB0byBleGVjdXRlIHRoaXMgcGhhc2UgYWZ0ZXIgRUEKLSAgICBhc3NlcnQoIW4tPmlzX1BoaSgpIHx8IG4tPmFzX1BoaSgpLT5pbnN0X21lbV9pZCgpID09IC0xLCAic2hvdWxkIG5vdCBiZSBsaW5rZWQgdG8gZGF0YSBQaGkiKTsKICAgICBjb25zdCBUeXBlKiB0eXBlID0gZ3ZuLT50eXBlX29yX251bGwobik7CiAgICAgbmV3X3R5cGVfYXJyYXkubWFwKGN1cnJlbnRfaWR4LCB0eXBlKTsKIApAQCAtMTM4MCwxOCArMTM3OCw2IEBACiAgICAgaSAtPSBudW1fZWRnZXM7ICAgIC8vIHdlIGRlbGV0ZWQgMSBvciBtb3JlIGNvcGllcyBvZiB0aGlzIGVkZ2UKICAgfQogCi0gIC8vIFNlYXJjaCBmb3IgaW5zdGFuY2UgZmllbGQgZGF0YSBQaGlOb2RlcyBpbiB0aGUgc2FtZSByZWdpb24gcG9pbnRpbmcgdG8gdGhlIG9sZAotICAvLyBtZW1vcnkgUGhpTm9kZSBhbmQgdXBkYXRlIHRoZWlyIGluc3RhbmNlIG1lbW9yeSBpZHMgdG8gcG9pbnQgdG8gdGhlIG5ldyBub2RlLgotICBpZiAob2xkLT5pc19QaGkoKSAmJiBvbGQtPmFzX1BoaSgpLT50eXBlKCktPmhhc19tZW1vcnkoKSAmJiBvbGQtPmluKDApICE9IE5VTEwpIHsKLSAgICBOb2RlKiByZWdpb24gPSBvbGQtPmluKDApOwotICAgIGZvciAoRFVJdGVyYXRvcl9GYXN0IGltYXgsIGkgPSByZWdpb24tPmZhc3Rfb3V0cyhpbWF4KTsgaSA8IGltYXg7IGkrKykgewotICAgICAgUGhpTm9kZSogcGhpID0gcmVnaW9uLT5mYXN0X291dChpKS0+aXNhX1BoaSgpOwotICAgICAgaWYgKHBoaSAhPSBOVUxMICYmIHBoaS0+aW5zdF9tZW1faWQoKSA9PSAoaW50KW9sZC0+X2lkeCkgewotICAgICAgICBwaGktPnNldF9pbnN0X21lbV9pZCgoaW50KW5uLT5faWR4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogICAvLyBTbWFzaCBhbGwgaW5wdXRzIHRvICdvbGQnLCBpc29sYXRpbmcgaGltIGNvbXBsZXRlbHkKICAgTm9kZSAqdGVtcCA9IG5ldyAoQykgTm9kZSgxKTsKICAgdGVtcC0+aW5pdF9yZXEoMCxubik7ICAgICAvLyBBZGQgYSB1c2UgdG8gbm4gdG8gcHJldmVudCBoaW0gZnJvbSBkeWluZwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9zdHJpbmdvcHRzLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vc3RyaW5nb3B0cy5jcHAKaW5kZXggNzA5NjJlMy4uMGY4ZTY3MSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9zdHJpbmdvcHRzLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3N0cmluZ29wdHMuY3BwCkBAIC0xNjQxLDExICsxNjQxLDE2IEBACiAgICAgfQogICAgIGtpdC5zdG9yZV9TdHJpbmdfdmFsdWUoa2l0LmNvbnRyb2woKSwgcmVzdWx0LCBjaGFyX2FycmF5KTsKIAotICAgIC8vIFRoZSB2YWx1ZSBmaWVsZCBpcyBmaW5hbC4gRW1pdCBhIGJhcnJpZXIgaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgZWZmZWN0Ci0gICAgLy8gb2YgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbW1pdHRlZCB0byBtZW1vcnkgYmVmb3JlIGFueSBjb2RlIHB1Ymxpc2hlcwotICAgIC8vIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBvYmplY3QgKHNlZSBQYXJzZTo6ZG9fZXhpdHMoKSkuCi0gICAgYXNzZXJ0KEFsbG9jYXRlTm9kZTo6SWRlYWxfYWxsb2NhdGlvbihyZXN1bHQsIF9ndm4pICE9IE5VTEwsICJzaG91bGQgYmUgbmV3bHkgYWxsb2NhdGVkIik7Ci0gICAga2l0Lmluc2VydF9tZW1fYmFyKE9wX01lbUJhclJlbGVhc2UsIHJlc3VsdCk7CisgICAgLy8gRG8gbm90IGxldCBzdG9yZXMgdGhhdCBpbml0aWFsaXplIHRoaXMgb2JqZWN0IGJlIHJlb3JkZXJlZCB3aXRoCisgICAgLy8gYSBzdWJzZXF1ZW50IHN0b3JlIHRoYXQgd291bGQgbWFrZSB0aGlzIG9iamVjdCBhY2Nlc3NpYmxlIGJ5CisgICAgLy8gb3RoZXIgdGhyZWFkcy4KKyAgICAvLyBSZWNvcmQgd2hhdCBBbGxvY2F0ZU5vZGUgdGhpcyBTdG9yZVN0b3JlIHByb3RlY3RzIHNvIHRoYXQKKyAgICAvLyBlc2NhcGUgYW5hbHlzaXMgY2FuIGdvIGZyb20gdGhlIE1lbUJhclN0b3JlU3RvcmVOb2RlIHRvIHRoZQorICAgIC8vIEFsbG9jYXRlTm9kZSBhbmQgZWxpbWluYXRlIHRoZSBNZW1CYXJTdG9yZVN0b3JlTm9kZSBpZiBwb3NzaWJsZQorICAgIC8vIGJhc2VkIG9uIHRoZSBlc2NhcGUgc3RhdHVzIG9mIHRoZSBBbGxvY2F0ZU5vZGUuCisgICAgQWxsb2NhdGVOb2RlKiBhbGxvYyA9IEFsbG9jYXRlTm9kZTo6SWRlYWxfYWxsb2NhdGlvbihyZXN1bHQsIF9ndm4pOworICAgIGFzc2VydChhbGxvYyAhPSBOVUxMLCAic2hvdWxkIGJlIG5ld2x5IGFsbG9jYXRlZCIpOworICAgIGtpdC5pbnNlcnRfbWVtX2JhcihPcF9NZW1CYXJTdG9yZVN0b3JlLCBhbGxvYy0+cHJval9vdXQoQWxsb2NhdGVOb2RlOjpSYXdBZGRyZXNzKSk7CiAgIH0gZWxzZSB7CiAgICAgcmVzdWx0ID0gQy0+dG9wKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vc3Vibm9kZS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3N1Ym5vZGUuY3BwCmluZGV4IDMwM2QzMzMuLjFlNmMwNjEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vc3Vibm9kZS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9zdWJub2RlLmNwcApAQCAtNTQ3LDEyICs1NDcsOCBAQAogICAgIC8vIEFsbCB1bnNpZ25lZCB2YWx1ZXMgYXJlIExFIC0xIGFuZCBHRSAwLgogICAgIGlmIChsbzAgPT0gMCAmJiBoaTAgPT0gMCkgewogICAgICAgcmV0dXJuIFR5cGVJbnQ6OkNDX0xFOyAgICAgICAgICAgIC8vICAgMCA8PSBib3QKLSAgICB9IGVsc2UgaWYgKChqaW50KWxvMCA9PSAtMSAmJiAoamludCloaTAgPT0gLTEpIHsKLSAgICAgIHJldHVybiBUeXBlSW50OjpDQ19HRTsgICAgICAgICAgICAvLyAtMSA+PSBib3QKICAgICB9IGVsc2UgaWYgKGxvMSA9PSAwICYmIGhpMSA9PSAwKSB7CiAgICAgICByZXR1cm4gVHlwZUludDo6Q0NfR0U7ICAgICAgICAgICAgLy8gYm90ID49IDAKLSAgICB9IGVsc2UgaWYgKChqaW50KWxvMSA9PSAtMSAmJiAoamludCloaTEgPT0gLTEpIHsKLSAgICAgIHJldHVybiBUeXBlSW50OjpDQ19MRTsgICAgICAgICAgICAvLyBib3QgPD0gLTEKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLy8gV2UgY2FuIHVzZSByYW5nZXMgb2YgdGhlIGZvcm0gW2xvLi5oaV0gaWYgc2lnbnMgYXJlIHRoZSBzYW1lLgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by90eXBlLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vdHlwZS5ocHAKaW5kZXggM2M2OTQ0NS4uNDUwNmMzYSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by90eXBlLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3R5cGUuaHBwCkBAIC04ODIsNyArODgyLDcgQEAKIAogICAvLyBJZiBub3QgSW5zdGFuY2VUb3Agb3IgSW5zdGFuY2VCb3QsIGluZGljYXRlcyB0aGF0IHRoaXMgaXMKICAgLy8gYSBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoaXMgdHlwZSB3aGljaCBpcyBkaXN0aW5jdC4KLSAgLy8gVGhpcyBpcyB0aGUgbm9kZSBpbmRleCBvZiB0aGUgYWxsb2NhdGlvbiBub2RlIGNyZWF0aW5nIHRoaXMgaW5zdGFuY2UuCisgIC8vIFRoaXMgaXMgdGhlIHRoZSBub2RlIGluZGV4IG9mIHRoZSBhbGxvY2F0aW9uIG5vZGUgY3JlYXRpbmcgdGhpcyBpbnN0YW5jZS4KICAgaW50ICAgICAgICAgICBfaW5zdGFuY2VfaWQ7CiAKICAgLy8gRXh0cmEgdHlwZSBpbmZvcm1hdGlvbiBwcm9maWxpbmcgZ2F2ZSB1cy4gV2UgcHJvcGFnYXRlIGl0IHRoZQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvam5pQ2hlY2suY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvam5pQ2hlY2suY3BwCmluZGV4IDA3ZTQwYWUuLmU5NTkzN2EgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2puaUNoZWNrLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9qbmlDaGVjay5jcHAKQEAgLTQ2MSwxMSArNDYxLDE2IEBACiAKIE1ldGhvZCogam5pQ2hlY2s6OnZhbGlkYXRlX2ptZXRob2RfaWQoSmF2YVRocmVhZCogdGhyLCBqbWV0aG9kSUQgbWV0aG9kX2lkKSB7CiAgIEFTU0VSVF9PT1BTX0FMTE9XRUQ7Ci0gIC8vIERvIHRoZSBqbWV0aG9kSUQgY2hlY2sKKyAgLy8gZG8gdGhlIGZhc3Qgam1ldGhvZElEIGNoZWNrIGZpcnN0CiAgIE1ldGhvZCogbW9vcCA9IE1ldGhvZDo6Y2hlY2tlZF9yZXNvbHZlX2ptZXRob2RfaWQobWV0aG9kX2lkKTsKICAgaWYgKG1vb3AgPT0gTlVMTCkgewogICAgIFJlcG9ydEpOSUZhdGFsRXJyb3IodGhyLCBmYXRhbF93cm9uZ19jbGFzc19vcl9tZXRob2QpOwogICB9CisgIC8vIGptZXRob2RJRHMgYXJlIHN1cHBvc2VkIHRvIGJlIHdlYWsgaGFuZGxlcyBpbiB0aGUgY2xhc3MgbG9hZGVyIGRhdGEsCisgIC8vIGJ1dCB0aGF0IGNhbiBiZSBleHBlbnNpdmUgc28gY2hlY2sgaXQgbGFzdAorICBlbHNlIGlmICghTWV0aG9kOjppc19tZXRob2RfaWQobWV0aG9kX2lkKSkgeworICAgIFJlcG9ydEpOSUZhdGFsRXJyb3IodGhyLCBmYXRhbF9ub25fd2Vha19tZXRob2QpOworICB9CiAgIHJldHVybiBtb29wOwogfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9qdm0uY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvanZtLmNwcAppbmRleCBmMWIxM2YyLi5lNmY1ZTg4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy9qdm0uY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL2p2bS5jcHAKQEAgLTEyOTAsMjIgKzEyOTAsMTggQEAKIC8vIGFuZCBudWxsIHBlcm1pc3Npb25zIC0gd2hpY2ggZ2l2ZXMgbm8gcGVybWlzc2lvbnMuCiBvb3AgY3JlYXRlX2R1bW15X2FjY2Vzc19jb250cm9sX2NvbnRleHQoVFJBUFMpIHsKICAgSW5zdGFuY2VLbGFzcyogcGRfa2xhc3MgPSBJbnN0YW5jZUtsYXNzOjpjYXN0KFN5c3RlbURpY3Rpb25hcnk6OlByb3RlY3Rpb25Eb21haW5fa2xhc3MoKSk7Ci0gIEhhbmRsZSBvYmogPSBwZF9rbGFzcy0+YWxsb2NhdGVfaW5zdGFuY2VfaGFuZGxlKENIRUNLX05VTEwpOwotICAvLyBDYWxsIGNvbnN0cnVjdG9yIFByb3RlY3Rpb25Eb21haW4obnVsbCwgbnVsbCk7Ci0gIEphdmFWYWx1ZSByZXN1bHQoVF9WT0lEKTsKLSAgSmF2YUNhbGxzOjpjYWxsX3NwZWNpYWwoJnJlc3VsdCwgb2JqLCBLbGFzc0hhbmRsZShUSFJFQUQsIHBkX2tsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm1TeW1ib2xzOjpvYmplY3RfaW5pdGlhbGl6ZXJfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2bVN5bWJvbHM6OmNvZGVzb3VyY2VfcGVybWlzc2lvbmNvbGxlY3Rpb25fc2lnbmF0dXJlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSgpLCBIYW5kbGUoKSwgQ0hFQ0tfTlVMTCk7CisgIC8vIG5ldyBQcm90ZWN0aW9uRG9tYWluKG51bGwsbnVsbCk7CisgIG9vcCBudWxsX3Byb3RlY3Rpb25fZG9tYWluID0gcGRfa2xhc3MtPmFsbG9jYXRlX2luc3RhbmNlKENIRUNLX05VTEwpOworICBIYW5kbGUgbnVsbF9wZChUSFJFQUQsIG51bGxfcHJvdGVjdGlvbl9kb21haW4pOwogCiAgIC8vIG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge3BkfTsKICAgb2JqQXJyYXlPb3AgY29udGV4dCA9IG9vcEZhY3Rvcnk6Om5ld19vYmpBcnJheShwZF9rbGFzcywgMSwgQ0hFQ0tfTlVMTCk7Ci0gIGNvbnRleHQtPm9ial9hdF9wdXQoMCwgb2JqKCkpOworICBjb250ZXh0LT5vYmpfYXRfcHV0KDAsIG51bGxfcGQoKSk7CiAKICAgLy8gbmV3IEFjY2Vzc0NvbnRyb2xDb250ZXh0KG5ldyBQcm90ZWN0aW9uRG9tYWluW10ge3BkfSkKICAgb2JqQXJyYXlIYW5kbGUgaF9jb250ZXh0KFRIUkVBRCwgY29udGV4dCk7Ci0gIG9vcCBhY2MgPSBqYXZhX3NlY3VyaXR5X0FjY2Vzc0NvbnRyb2xDb250ZXh0OjpjcmVhdGUoaF9jb250ZXh0LCBmYWxzZSwgSGFuZGxlKCksIENIRUNLX05VTEwpOwotICByZXR1cm4gYWNjOworICBvb3AgcmVzdWx0ID0gamF2YV9zZWN1cml0eV9BY2Nlc3NDb250cm9sQ29udGV4dDo6Y3JlYXRlKGhfY29udGV4dCwgZmFsc2UsIEhhbmRsZSgpLCBDSEVDS19OVUxMKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogSlZNX0VOVFJZKGpvYmplY3QsIEpWTV9Eb1ByaXZpbGVnZWQoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpvYmplY3QgYWN0aW9uLCBqb2JqZWN0IGNvbnRleHQsIGpib29sZWFuIHdyYXBFeGNlcHRpb24pKQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvdW5zYWZlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL3Vuc2FmZS5jcHAKaW5kZXggNWUzOWIzOC4uMDg0NmIyMCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvdW5zYWZlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy91bnNhZmUuY3BwCkBAIC05ODUsNiArOTg1LDE0IEBACiAgIH0KIFVOU0FGRV9FTkQKIAorc3RhdGljIGpvYmplY3QgZ2V0X2NsYXNzX2xvYWRlcihKTklFbnYqIGVudiwgamNsYXNzIGNscykgeworICBpZiAoamF2YV9sYW5nX0NsYXNzOjppc19wcmltaXRpdmUoSk5JSGFuZGxlczo6cmVzb2x2ZV9ub25fbnVsbChjbHMpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIEtsYXNzKiBrID0gamF2YV9sYW5nX0NsYXNzOjphc19LbGFzcyhKTklIYW5kbGVzOjpyZXNvbHZlX25vbl9udWxsKGNscykpOworICBvb3AgbG9hZGVyID0gay0+Y2xhc3NfbG9hZGVyKCk7CisgIHJldHVybiBKTklIYW5kbGVzOjptYWtlX2xvY2FsKGVudiwgbG9hZGVyKTsKK30KIAogVU5TQUZFX0VOVFJZKGpjbGFzcywgVW5zYWZlX0RlZmluZUNsYXNzMChKTklFbnYgKmVudiwgam9iamVjdCB1bnNhZmUsIGpzdHJpbmcgbmFtZSwgamJ5dGVBcnJheSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSkKICAgVW5zYWZlV3JhcHBlcigiVW5zYWZlX0RlZmluZUNsYXNzIik7CkBAIC05OTMsNyArMTAwMSw3IEBACiAKICAgICBpbnQgZGVwdGhGcm9tRGVmaW5lQ2xhc3MwID0gMTsKICAgICBqY2xhc3MgIGNhbGxlciA9IEpWTV9HZXRDYWxsZXJDbGFzcyhlbnYsIGRlcHRoRnJvbURlZmluZUNsYXNzMCk7Ci0gICAgam9iamVjdCBsb2FkZXIgPSAoY2FsbGVyID09IE5VTEwpID8gTlVMTCA6IEpWTV9HZXRDbGFzc0xvYWRlcihlbnYsIGNhbGxlcik7CisgICAgam9iamVjdCBsb2FkZXIgPSAoY2FsbGVyID09IE5VTEwpID8gTlVMTCA6IGdldF9jbGFzc19sb2FkZXIoZW52LCBjYWxsZXIpOwogICAgIGpvYmplY3QgcGQgICAgID0gKGNhbGxlciA9PSBOVUxMKSA/IE5VTEwgOiBKVk1fR2V0UHJvdGVjdGlvbkRvbWFpbihlbnYsIGNhbGxlcik7CiAKICAgICByZXR1cm4gVW5zYWZlX0RlZmluZUNsYXNzX2ltcGwoZW52LCBuYW1lLCBkYXRhLCBvZmZzZXQsIGxlbmd0aCwgbG9hZGVyLCBwZCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS91dGlsaXRpZXMvdGFza3F1ZXVlLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3V0aWxpdGllcy90YXNrcXVldWUuaHBwCmluZGV4IDhiZGIzOGQuLmZiOWVhNjEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3V0aWxpdGllcy90YXNrcXVldWUuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3V0aWxpdGllcy90YXNrcXVldWUuaHBwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDUzLDkgKzQ1Myw2IEBACiAgIC8vIFB1c2ggdGFzayB0IG9udG8gdGhlIHF1ZXVlIG9yIG9udG8gdGhlIG92ZXJmbG93IHN0YWNrLiAgUmV0dXJuIHRydWUuCiAgIGlubGluZSBib29sIHB1c2goRSB0KTsKIAotICAvLyBUcnkgdG8gcHVzaCB0YXNrIHQgb250byB0aGUgcXVldWUgb25seS4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KLSAgaW5saW5lIGJvb2wgdHJ5X3B1c2hfdG9fdGFza3F1ZXVlKEUgdCk7Ci0KICAgLy8gQXR0ZW1wdCB0byBwb3AgZnJvbSB0aGUgb3ZlcmZsb3cgc3RhY2s7IHJldHVybiB0cnVlIGlmIGFueXRoaW5nIHdhcyBwb3BwZWQuCiAgIGlubGluZSBib29sIHBvcF9vdmVyZmxvdyhFJiB0KTsKIApAQCAtNDg5LDEwICs0ODYsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIEUsIE1FTUZMQUdTIEYsIHVuc2lnbmVkIGludCBOPgotYm9vbCBPdmVyZmxvd1Rhc2tRdWV1ZTxFLCBGLCBOPjo6dHJ5X3B1c2hfdG9fdGFza3F1ZXVlKEUgdCkgewotICByZXR1cm4gdGFza3F1ZXVlX3Q6OnB1c2godCk7Ci19CiBjbGFzcyBUYXNrUXVldWVTZXRTdXBlciB7CiBwcm90ZWN0ZWQ6CiAgIHN0YXRpYyBpbnQgcmFuZG9tUGFya0FuZE1pbGxlcihpbnQqIHNlZWQwKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci9qc3IyOTIvVk1Bbm9ueW1vdXNDbGFzc2VzLmphdmEgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvanNyMjkyL1ZNQW5vbnltb3VzQ2xhc3Nlcy5qYXZhCmluZGV4IDNiMGEwYzEuLmRjOGI1NzcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvdGVzdC9jb21waWxlci9qc3IyOTIvVk1Bbm9ueW1vdXNDbGFzc2VzLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyL2pzcjI5Mi9WTUFub255bW91c0NsYXNzZXMuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogLyoqCiAgKiBAdGVzdAogICogQGJ1ZyA4MDU4ODI4Ci0gKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aC9vdGhlcnZtIC1YYmF0Y2ggVk1Bbm9ueW1vdXNDbGFzc2VzCisgKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aCAtWGJhdGNoIFZNQW5vbnltb3VzQ2xhc3NlcwogICovCiAKIGltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NXcml0ZXI7CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvY29tcGlsZXIvbG9vcG9wdHMvVGVzdENvdW50ZWRMb29wU2FmZXBvaW50QmFja2VkZ2UuamF2YSBiL2hvdHNwb3QvdGVzdC9jb21waWxlci9sb29wb3B0cy9UZXN0Q291bnRlZExvb3BTYWZlcG9pbnRCYWNrZWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWMzMmYyLi4wMDAwMDAwCi0tLSBhL2hvdHNwb3QvdGVzdC9jb21waWxlci9sb29wb3B0cy9UZXN0Q291bnRlZExvb3BTYWZlcG9pbnRCYWNrZWRnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MTYxMTQ3Ci0gKiBAcmVxdWlyZXMgdm0uZmxhdm9yID09ICJzZXJ2ZXIiCi0gKiBAc3VtbWFyeSBTYWZlcG9pbnQgb24gYmFja2VkZ2UgYnJlYWtzIFVzZUNvdW50ZWRMb29wU2FmZXBvaW50cwotICogQHJ1biBtYWluL290aGVydm0gLVhYOi1CYWNrZ3JvdW5kQ29tcGlsYXRpb24gLVhYOi1Vc2VPblN0YWNrUmVwbGFjZW1lbnQgLVhYOitVc2VDb3VudGVkTG9vcFNhZmVwb2ludHMgVGVzdENvdW50ZWRMb29wU2FmZXBvaW50QmFja2VkZ2UKLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RDb3VudGVkTG9vcFNhZmVwb2ludEJhY2tlZGdlIHsKLSAgICBzdGF0aWMgdm9pZCB0ZXN0KGludFtdIGFyciwgaW50IGluYykgewotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKyk7Ci0gICAgICAgICAgICBhcnJbaV0gPSBpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgaWYgKGkgPj0gMTAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHB1YmxpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpbnRbXSBhcnIgPSBuZXcgaW50WzEwMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDA7IGkrKykgewotICAgICAgICAgICAgIHRlc3QoYXJyLCAxKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci9uYXRpdmUvVGVzdERpcnR5SW50LnNoIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyL25hdGl2ZS9UZXN0RGlydHlJbnQuc2gKaW5kZXggMzFmMjUzZi4uNzk3NDliNCAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyL25hdGl2ZS9UZXN0RGlydHlJbnQuc2gKKysrIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyL25hdGl2ZS9UZXN0RGlydHlJbnQuc2gKQEAgLTMwLDE5ICszMCwyMCBAQAogIyMgQHJ1biBzaGVsbC90aW1lb3V0PTMwIFRlc3REaXJ0eUludC5zaAogIyMKIAotaWYgWyAteiAiJHtURVNUU1JDfSIgXTsgdGhlbgotICAgIFRFU1RTUkM9IiR7UFdEfSIKLSAgICBlY2hvICJURVNUU1JDIG5vdCBzZXQuICBVc2luZyAiJHtURVNUU1JDfSIgYXMgZGVmYXVsdCIKK2lmIFsgIiR7VEVTVFNSQ30iID0gIiIgXQordGhlbgorICBURVNUU1JDPSR7UFdEfQorICBlY2hvICJURVNUU1JDIG5vdCBzZXQuICBVc2luZyAiJHtURVNUU1JDfSIgYXMgZGVmYXVsdCIKIGZpCiBlY2hvICJURVNUU1JDPSR7VEVTVFNSQ30iCiAjIyBBZGRpbmcgY29tbW9uIHNldHVwIFZhcmlhYmxlcyBmb3IgcnVubmluZyBzaGVsbCB0ZXN0cy4KIC4gJHtURVNUU1JDfS8uLi8uLi90ZXN0X2Vudi5zaAogCiAjIHNldCBwbGF0Zm9ybS1kZXBlbmRlbnQgdmFyaWFibGVzCi1pZiBbICIkVk1fT1MiID0gImxpbnV4IiAtYSAiJFZNX0NQVSIgPSAic3BhcmN2OSIgXTsgdGhlbgoraWYgWyAkVk1fT1MgPT0gImxpbnV4IiAtYSAkVk1fQ1BVID09ICJzcGFyY3Y5IiBdOyB0aGVuCiAgICAgZWNobyAiVGVzdGluZyBvbiBsaW51eC1zcGFyYyIKICAgICBnY2NfY21kPWB3aGljaCBnY2NgCi0gICAgaWYgWyAteiAiJGdjY19jbWQiIF07IHRoZW4KKyAgICBpZiBbICJ4JGdjY19jbWQiID09ICJ4IiBdOyB0aGVuCiAgICAgICAgIGVjaG8gIldBUk5JTkc6IGdjYyBub3QgZm91bmQuIENhbm5vdCBleGVjdXRlIHRlc3QuIiAyPiYxCiAgICAgICAgIGV4aXQgMDsKICAgICBmaQpAQCAtNjcsOSArNjgsMTAgQEAKICAgICAtRGphdmEubGlicmFyeS5wYXRoPSR7VEVTVFNSQ30ke0ZTfSBUZXN0RGlydHlJbnQiCiAKIGVjaG8gIiRjbWQiCi1ldmFsICRjbWQKK2V2YWwgJGNtZCAKIAotaWYgWyAkPyA9IDAgXTsgdGhlbgoraWYgWyAkPyA9IDAgXQordGhlbgogICAgIGVjaG8gIlRlc3QgUGFzc2VkIgogICAgIGV4aXQgMAogZmkKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci9zdHJpbmdvcHRzL1Rlc3RTdHJpbmdPYmplY3RJbml0aWFsaXphdGlvbi5qYXZhIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyL3N0cmluZ29wdHMvVGVzdFN0cmluZ09iamVjdEluaXRpYWxpemF0aW9uLmphdmEKaW5kZXggMmQwOWJlMS4uNmM2ZmE3ZSAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyL3N0cmluZ29wdHMvVGVzdFN0cmluZ09iamVjdEluaXRpYWxpemF0aW9uLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyL3N0cmluZ29wdHMvVGVzdFN0cmluZ09iamVjdEluaXRpYWxpemF0aW9uLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIC8qCiAgKiBAdGVzdAogICogQGJ1ZyA4MTU5MjQ0Ci0gKiBAcmVxdWlyZXMgdm0uZ2MgPT0gIlBhcmFsbGVsIiB8IHZtLmdjID09ICJudWxsIgogICogQHN1bW1hcnkgVmVyaWZpZXMgdGhhdCBubyBwYXJ0aWFsbHkgaW5pdGlhbGl6ZWQgU3RyaW5nIG9iamVjdCBlc2NhcGVzIGZyb20KICAqICAgICAgICAgIEMyJ3MgU3RyaW5nIGNvbmNhdCBvcHRpbWl6YXRpb24gaW4gYSBoaWdobHkgY29uY3VycmVudCBzZXR0aW5nLgogICogICAgICAgICAgVGhpcyB0ZXN0IHRyaWdnZXJzIHRoZSBidWcgaW4gYWJvdXQgMSBvdXQgb2YgMTAgcnVucy4KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9nYy9UZXN0U29mdFJlZmVyZW5jZXNCZWhhdmlvck9uT09NRS5qYXZhIGIvaG90c3BvdC90ZXN0L2djL1Rlc3RTb2Z0UmVmZXJlbmNlc0JlaGF2aW9yT25PT01FLmphdmEKaW5kZXggODdlNTYxNi4uNTVmYTU5OCAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L2djL1Rlc3RTb2Z0UmVmZXJlbmNlc0JlaGF2aW9yT25PT01FLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L2djL1Rlc3RTb2Z0UmVmZXJlbmNlc0JlaGF2aW9yT25PT01FLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9ydW50aW1lL2NsYXNzRmlsZVBhcnNlckJ1Zy9CYWROYW1lQW5kVHlwZS5qYXZhIGIvaG90c3BvdC90ZXN0L3J1bnRpbWUvY2xhc3NGaWxlUGFyc2VyQnVnL0JhZE5hbWVBbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTM1Y2IuLjAwMDAwMDAKLS0tIGEvaG90c3BvdC90ZXN0L3J1bnRpbWUvY2xhc3NGaWxlUGFyc2VyQnVnL0JhZE5hbWVBbmRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQyNjYwCi0gKiBAc3VtbWFyeSBDb25zdGFudCBwb29sIE5hbWVBbmRUeXBlIGVudHJpZXMgbXVzdCBwb2ludCB0byBub24temVybyBsZW5ndGggVXRmOCBzdHJpbmdzCi0gKiBAY29tcGlsZSBlbXB0eVNpZ1V0ZjguamNvZAotICogQGNvbXBpbGUgZW1wdHlOYW1lVXRmOC5qY29kCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSAtWHZlcmlmeTphbGwgQmFkTmFtZUFuZFR5cGUKLSAqLwotCi0vLyBUZXN0IHRoYXQgYSBjb25zdGFudCBwb29sIE5hbWVBbmRUeXBlIGRlc2NyaXB0b3JfaW5kZXggYW5kL29yIG5hbWVfaW5kZXgKLS8vIHRoYXQgcG9pbnRzIHRvIGEgemVybyBsZW5ndGggVXRmOCBzdHJpbmcgY2F1c2VzIGEgQ2xhc3NGb3JtYXRFcnJvci4KLXB1YmxpYyBjbGFzcyBCYWROYW1lQW5kVHlwZSB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIFRocm93YWJsZSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWdyZXNzaW9uIHRlc3QgZm9yIGJ1ZyA4MDQyNjYwIik7Ci0KLSAgICAgICAgLy8gVGVzdCBkZXNjcmlwdG9yX2luZGV4IHBvaW50aW5nIHRvIHplcm8tbGVuZ3RoIHN0cmluZy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIG5ld0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiZW1wdHlTaWdVdGY4Iik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgQ2xhc3NGb3JtYXRFcnJvciBleGNlcHRpb24gbm90IHRocm93biIpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvciBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgQmFkTmFtZUFuZFR5cGUgcGFzc2VkIHRlc3QgY2FzZSBlbXB0eVNpZ1V0ZjgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgbmFtZV9pbmRleCBwb2ludGluZyB0byB6ZXJvLWxlbmd0aCBzdHJpbmcuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBuZXdDbGFzcyA9IENsYXNzLmZvck5hbWUoImVtcHR5TmFtZVV0ZjgiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBDbGFzc0Zvcm1hdEVycm9yIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5DbGFzc0Zvcm1hdEVycm9yIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBCYWROYW1lQW5kVHlwZSBwYXNzZWQgdGVzdCBjYXNlIGVtcHR5TmFtZVV0ZjgiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9ydW50aW1lL2NsYXNzRmlsZVBhcnNlckJ1Zy9lbXB0eU5hbWVVdGY4Lmpjb2QgYi9ob3RzcG90L3Rlc3QvcnVudGltZS9jbGFzc0ZpbGVQYXJzZXJCdWcvZW1wdHlOYW1lVXRmOC5qY29kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk2YWFjLi4wMDAwMDAwCi0tLSBhL2hvdHNwb3QvdGVzdC9ydW50aW1lL2NsYXNzRmlsZVBhcnNlckJ1Zy9lbXB0eU5hbWVVdGY4Lmpjb2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICoKLSAqLwotCi0vLyBUaGlzIGNsYXNzIGhhcyBhbiBpbGxlZ2FsIE5hbWVBbmRUeXBlIGF0IGNvbnN0YW50IHBvb2wgIzQuICBJdCdzIGlsbGVnYWwgYmVjYXVzZQotLy8gdGhlIFV0ZjggdGhhdCBpdCBwb2ludHMgdG8gYXQgIzI3IGlzIGEgemVybyBsZW5ndGggc3RyaW5nIHdoaWNoIGlzIG5vdCBhIHZhbGlkCi0vLyBuYW1lLiAgTG9hZGluZyB0aGlzIGNsYXNzIHNob3VsZCBjYXVzZSBhIENsYXNzRm9ybWF0RXJyb3IgZXhjZXB0aW9uLgotY2xhc3MgZW1wdHlOYW1lVXRmOCB7Ci0gIDB4Q0FGRUJBQkU7Ci0gIDA7IC8vIG1pbm9yIHZlcnNpb24KLSAgNTI7IC8vIHZlcnNpb24KLSAgWzI5XSB7IC8vIENvbnN0YW50IFBvb2wKLSAgICA7IC8vIGZpcnN0IGVsZW1lbnQgaXMgZW1wdHkKLSAgICBNZXRob2QgIzYgIzE1OyAvLyAjMSAgICAgYXQgMHgwQQotICAgIEZpZWxkICMxNiAjMTc7IC8vICMyICAgICBhdCAweDBGCi0gICAgU3RyaW5nICMxODsgLy8gIzMgICAgIGF0IDB4MTQKLSAgICBOYW1lQW5kVHlwZSAjMjcgIzI4OyAvLyAjNCAgICAgYXQgMHg5RgotICAgIGNsYXNzICMyMTsgLy8gIzUgICAgIGF0IDB4MUMKLSAgICBjbGFzcyAjMjI7IC8vICM2ICAgICBhdCAweDFGCi0gICAgVXRmOCAiPGluaXQ+IjsgLy8gIzcgICAgIGF0IDB4MjIKLSAgICBVdGY4ICIoKVYiOyAvLyAjOCAgICAgYXQgMHgyQgotICAgIFV0ZjggIkNvZGUiOyAvLyAjOSAgICAgYXQgMHgyRQotICAgIFV0ZjggIkxpbmVOdW1iZXJUYWJsZSI7IC8vICMxMCAgICAgYXQgMHgzNQotICAgIFV0ZjggIm1haW4iOyAvLyAjMTEgICAgIGF0IDB4NDcKLSAgICBVdGY4ICIoW0xqYXZhL2xhbmcvU3RyaW5nOylWIjsgLy8gIzEyICAgICBhdCAweDRFCi0gICAgVXRmOCAiU291cmNlRmlsZSI7IC8vICMxMyAgICAgYXQgMHg2NwotICAgIFV0ZjggImVtcHR5TmFtZVV0ZjguamF2YSI7IC8vICMxNCAgICAgYXQgMHg3NAotICAgIE5hbWVBbmRUeXBlICM3ICM4OyAvLyAjMTUgICAgIGF0IDB4ODEKLSAgICBjbGFzcyAjMjM7IC8vICMxNiAgICAgYXQgMHg4NgotICAgIE5hbWVBbmRUeXBlICMyNCAjMjU7IC8vICMxNyAgICAgYXQgMHg4OQotICAgIFV0ZjggIkhlbGxvIFdvcmxkIjsgLy8gIzE4ICAgICBhdCAweDhFCi0gICAgY2xhc3MgIzI2OyAvLyAjMTkgICAgIGF0IDB4OUMKLSAgICBNZXRob2QgIzE5ICM0OyAvLyAjMjAgICAgIGF0IDB4MTcKLSAgICBVdGY4ICJlbXB0eU5hbWVVdGY4IjsgLy8gIzIxICAgICBhdCAweEE0Ci0gICAgVXRmOCAiamF2YS9sYW5nL09iamVjdCI7IC8vICMyMiAgICAgYXQgMHhBQwotICAgIFV0ZjggImphdmEvbGFuZy9TeXN0ZW0iOyAvLyAjMjMgICAgIGF0IDB4QkYKLSAgICBVdGY4ICJvdXQiOyAvLyAjMjQgICAgIGF0IDB4RDIKLSAgICBVdGY4ICJMamF2YS9pby9QcmludFN0cmVhbTsiOyAvLyAjMjUgICAgIGF0IDB4RDgKLSAgICBVdGY4ICJqYXZhL2lvL1ByaW50U3RyZWFtIjsgLy8gIzI2ICAgICBhdCAweEYwCi0gICAgVXRmOCAiIjsgLy8gIzI3ICAgICBhdCAweDAxMDYKLSAgICBVdGY4ICIoKVYiOyAvLyAjMjggICAgIGF0IDB4MDExMAotICB9IC8vIENvbnN0YW50IFBvb2wKLQotICAweDAwMjE7IC8vIGFjY2VzcwotICAjNTsvLyB0aGlzX2NweAotICAjNjsvLyBzdXBlcl9jcHgKLQotICBbMF0geyAvLyBJbnRlcmZhY2VzCi0gIH0gLy8gSW50ZXJmYWNlcwotCi0gIFswXSB7IC8vIGZpZWxkcwotICB9IC8vIGZpZWxkcwotCi0gIFsyXSB7IC8vIG1ldGhvZHMKLSAgICB7IC8vIE1lbWJlciBhdCAweDAxMzQKLSAgICAgIDB4MDAwMTsgLy8gYWNjZXNzCi0gICAgICAjNzsgLy8gbmFtZV9jcHgKLSAgICAgICM4OyAvLyBzaWdfY3B4Ci0gICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgIEF0dHIoIzksIDI5KSB7IC8vIENvZGUgYXQgMHgwMTNDCi0gICAgICAgICAgMTsgLy8gbWF4X3N0YWNrCi0gICAgICAgICAgMTsgLy8gbWF4X2xvY2FscwotICAgICAgICAgIEJ5dGVzWzVdewotICAgICAgICAgICAgMHgyQUI3MDAwMUIxOwotICAgICAgICAgIH07Ci0gICAgICAgICAgWzBdIHsgLy8gVHJhcHMKLSAgICAgICAgICB9IC8vIGVuZCBUcmFwcwotICAgICAgICAgIFsxXSB7IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgICAgIEF0dHIoIzEwLCA2KSB7IC8vIExpbmVOdW1iZXJUYWJsZSBhdCAweDAxNTMKLSAgICAgICAgICAgICAgWzFdIHsgLy8gTGluZU51bWJlclRhYmxlCi0gICAgICAgICAgICAgICAgMCAgMjsgLy8gIGF0IDB4MDE1RgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZCBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICB9IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgfSAvLyBlbmQgQ29kZQotICAgICAgfSAvLyBBdHRyaWJ1dGVzCi0gICAgfSAvLyBNZW1iZXIKLSAgICA7Ci0gICAgeyAvLyBNZW1iZXIgYXQgMHgwMTVGCi0gICAgICAweDAwMDk7IC8vIGFjY2VzcwotICAgICAgIzExOyAvLyBuYW1lX2NweAotICAgICAgIzEyOyAvLyBzaWdfY3B4Ci0gICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgIEF0dHIoIzksIDM3KSB7IC8vIENvZGUgYXQgMHgwMTY3Ci0gICAgICAgICAgMjsgLy8gbWF4X3N0YWNrCi0gICAgICAgICAgMTsgLy8gbWF4X2xvY2FscwotICAgICAgICAgIEJ5dGVzWzldewotICAgICAgICAgICAgMHhCMjAwMDIxMjAzQjYwMDA0OwotICAgICAgICAgICAgMHhCMTsKLSAgICAgICAgICB9OwotICAgICAgICAgIFswXSB7IC8vIFRyYXBzCi0gICAgICAgICAgfSAvLyBlbmQgVHJhcHMKLSAgICAgICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgICAgICBBdHRyKCMxMCwgMTApIHsgLy8gTGluZU51bWJlclRhYmxlIGF0IDB4MDE4MgotICAgICAgICAgICAgICBbMl0geyAvLyBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICAgICAgICAwICA0OyAvLyAgYXQgMHgwMThFCi0gICAgICAgICAgICAgICAgOCAgNTsgLy8gIGF0IDB4MDE5MgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZCBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICB9IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgfSAvLyBlbmQgQ29kZQotICAgICAgfSAvLyBBdHRyaWJ1dGVzCi0gICAgfSAvLyBNZW1iZXIKLSAgfSAvLyBtZXRob2RzCi0KLSAgWzFdIHsgLy8gQXR0cmlidXRlcwotICAgIEF0dHIoIzEzLCAyKSB7IC8vIFNvdXJjZUZpbGUgYXQgMHgwMTk0Ci0gICAgICAjMTQ7Ci0gICAgfSAvLyBlbmQgU291cmNlRmlsZQotICB9IC8vIEF0dHJpYnV0ZXMKLX0gLy8gZW5kIGNsYXNzIGVtcHR5TmFtZVV0ZjgKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9ydW50aW1lL2NsYXNzRmlsZVBhcnNlckJ1Zy9lbXB0eVNpZ1V0ZjguamNvZCBiL2hvdHNwb3QvdGVzdC9ydW50aW1lL2NsYXNzRmlsZVBhcnNlckJ1Zy9lbXB0eVNpZ1V0ZjguamNvZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxOTU3Zi4uMDAwMDAwMAotLS0gYS9ob3RzcG90L3Rlc3QvcnVudGltZS9jbGFzc0ZpbGVQYXJzZXJCdWcvZW1wdHlTaWdVdGY4Lmpjb2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICoKLSAqLwotCi0vLyBUaGlzIGNsYXNzIGhhcyBhbiBpbGxlZ2FsIE5hbWVBbmRUeXBlIGF0IGNvbnN0YW50IHBvb2wgIzQuICBJdCdzIGlsbGVnYWwgYmVjYXVzZQotLy8gdGhlIHR5cGUgdGhhdCBpdCBwb2ludHMgdG8gYXQgIzI4IGlzIGEgemVybyBsZW5ndGggVXRmOCBzdHJpbmcgd2hpY2ggaXMgbm90IGEKLS8vIHZhbGlkIHNpZ25hdHVyZS4gIExvYWRpbmcgdGhpcyBjbGFzcyBzaG91bGQgY2F1c2UgYSBDbGFzc0Zvcm1hdEVycm9yIGV4Y2VwdGlvbi4KLWNsYXNzIGVtcHR5U2lnVXRmOCB7Ci0gIDB4Q0FGRUJBQkU7Ci0gIDA7IC8vIG1pbm9yIHZlcnNpb24KLSAgNTI7IC8vIHZlcnNpb24KLSAgWzI5XSB7IC8vIENvbnN0YW50IFBvb2wKLSAgICA7IC8vIGZpcnN0IGVsZW1lbnQgaXMgZW1wdHkKLSAgICBNZXRob2QgIzYgIzE1OyAvLyAjMSAgICAgYXQgMHgwQQotICAgIEZpZWxkICMxNiAjMTc7IC8vICMyICAgICBhdCAweDBGCi0gICAgU3RyaW5nICMxODsgLy8gIzMgICAgIGF0IDB4MTQKLSAgICBOYW1lQW5kVHlwZSAjMjcgIzI4OyAvLyAjNCAgICAgYXQgMHg5RgotICAgIGNsYXNzICMyMTsgLy8gIzUgICAgIGF0IDB4MUMKLSAgICBjbGFzcyAjMjI7IC8vICM2ICAgICBhdCAweDFGCi0gICAgVXRmOCAiPGluaXQ+IjsgLy8gIzcgICAgIGF0IDB4MjIKLSAgICBVdGY4ICIoKVYiOyAvLyAjOCAgICAgYXQgMHgyQgotICAgIFV0ZjggIkNvZGUiOyAvLyAjOSAgICAgYXQgMHgyRQotICAgIFV0ZjggIkxpbmVOdW1iZXJUYWJsZSI7IC8vICMxMCAgICAgYXQgMHgzNQotICAgIFV0ZjggIm1haW4iOyAvLyAjMTEgICAgIGF0IDB4NDcKLSAgICBVdGY4ICIoW0xqYXZhL2xhbmcvU3RyaW5nOylWIjsgLy8gIzEyICAgICBhdCAweDRFCi0gICAgVXRmOCAiU291cmNlRmlsZSI7IC8vICMxMyAgICAgYXQgMHg2NwotICAgIFV0ZjggImVtcHR5U2lnVXRmOC5qYXZhIjsgLy8gIzE0ICAgICBhdCAweDc0Ci0gICAgTmFtZUFuZFR5cGUgIzcgIzg7IC8vICMxNSAgICAgYXQgMHg4MQotICAgIGNsYXNzICMyMzsgLy8gIzE2ICAgICBhdCAweDg2Ci0gICAgTmFtZUFuZFR5cGUgIzI0ICMyNTsgLy8gIzE3ICAgICBhdCAweDg5Ci0gICAgVXRmOCAiSGVsbG8gV29ybGQiOyAvLyAjMTggICAgIGF0IDB4OEUKLSAgICBjbGFzcyAjMjY7IC8vICMxOSAgICAgYXQgMHg5QwotICAgIE1ldGhvZCAjMTkgIzQ7IC8vICMyMCAgICAgYXQgMHgxNwotICAgIFV0ZjggImVtcHR5U2lnVXRmOCI7IC8vICMyMSAgICAgYXQgMHhBNAotICAgIFV0ZjggImphdmEvbGFuZy9PYmplY3QiOyAvLyAjMjIgICAgIGF0IDB4QUMKLSAgICBVdGY4ICJqYXZhL2xhbmcvU3lzdGVtIjsgLy8gIzIzICAgICBhdCAweEJGCi0gICAgVXRmOCAib3V0IjsgLy8gIzI0ICAgICBhdCAweEQyCi0gICAgVXRmOCAiTGphdmEvaW8vUHJpbnRTdHJlYW07IjsgLy8gIzI1ICAgICBhdCAweEQ4Ci0gICAgVXRmOCAiamF2YS9pby9QcmludFN0cmVhbSI7IC8vICMyNiAgICAgYXQgMHhGMAotICAgIFV0ZjggImhpIjsgLy8gIzI3ICAgICBhdCAweDAxMDYKLSAgICBVdGY4ICIiOyAvLyAjMjggICAgIGF0IDB4MDExMAotICB9IC8vIENvbnN0YW50IFBvb2wKLQotICAweDAwMjE7IC8vIGFjY2VzcwotICAjNTsvLyB0aGlzX2NweAotICAjNjsvLyBzdXBlcl9jcHgKLQotICBbMF0geyAvLyBJbnRlcmZhY2VzCi0gIH0gLy8gSW50ZXJmYWNlcwotCi0gIFswXSB7IC8vIGZpZWxkcwotICB9IC8vIGZpZWxkcwotCi0gIFsyXSB7IC8vIG1ldGhvZHMKLSAgICB7IC8vIE1lbWJlciBhdCAweDAxMzQKLSAgICAgIDB4MDAwMTsgLy8gYWNjZXNzCi0gICAgICAjNzsgLy8gbmFtZV9jcHgKLSAgICAgICM4OyAvLyBzaWdfY3B4Ci0gICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgIEF0dHIoIzksIDI5KSB7IC8vIENvZGUgYXQgMHgwMTNDCi0gICAgICAgICAgMTsgLy8gbWF4X3N0YWNrCi0gICAgICAgICAgMTsgLy8gbWF4X2xvY2FscwotICAgICAgICAgIEJ5dGVzWzVdewotICAgICAgICAgICAgMHgyQUI3MDAwMUIxOwotICAgICAgICAgIH07Ci0gICAgICAgICAgWzBdIHsgLy8gVHJhcHMKLSAgICAgICAgICB9IC8vIGVuZCBUcmFwcwotICAgICAgICAgIFsxXSB7IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgICAgIEF0dHIoIzEwLCA2KSB7IC8vIExpbmVOdW1iZXJUYWJsZSBhdCAweDAxNTMKLSAgICAgICAgICAgICAgWzFdIHsgLy8gTGluZU51bWJlclRhYmxlCi0gICAgICAgICAgICAgICAgMCAgMjsgLy8gIGF0IDB4MDE1RgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZCBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICB9IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgfSAvLyBlbmQgQ29kZQotICAgICAgfSAvLyBBdHRyaWJ1dGVzCi0gICAgfSAvLyBNZW1iZXIKLSAgICA7Ci0gICAgeyAvLyBNZW1iZXIgYXQgMHgwMTVGCi0gICAgICAweDAwMDk7IC8vIGFjY2VzcwotICAgICAgIzExOyAvLyBuYW1lX2NweAotICAgICAgIzEyOyAvLyBzaWdfY3B4Ci0gICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgIEF0dHIoIzksIDM3KSB7IC8vIENvZGUgYXQgMHgwMTY3Ci0gICAgICAgICAgMjsgLy8gbWF4X3N0YWNrCi0gICAgICAgICAgMTsgLy8gbWF4X2xvY2FscwotICAgICAgICAgIEJ5dGVzWzldewotICAgICAgICAgICAgMHhCMjAwMDIxMjAzQjYwMDA0OwotICAgICAgICAgICAgMHhCMTsKLSAgICAgICAgICB9OwotICAgICAgICAgIFswXSB7IC8vIFRyYXBzCi0gICAgICAgICAgfSAvLyBlbmQgVHJhcHMKLSAgICAgICAgICBbMV0geyAvLyBBdHRyaWJ1dGVzCi0gICAgICAgICAgICBBdHRyKCMxMCwgMTApIHsgLy8gTGluZU51bWJlclRhYmxlIGF0IDB4MDE4MgotICAgICAgICAgICAgICBbMl0geyAvLyBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICAgICAgICAwICA0OyAvLyAgYXQgMHgwMThFCi0gICAgICAgICAgICAgICAgOCAgNTsgLy8gIGF0IDB4MDE5MgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8vIGVuZCBMaW5lTnVtYmVyVGFibGUKLSAgICAgICAgICB9IC8vIEF0dHJpYnV0ZXMKLSAgICAgICAgfSAvLyBlbmQgQ29kZQotICAgICAgfSAvLyBBdHRyaWJ1dGVzCi0gICAgfSAvLyBNZW1iZXIKLSAgfSAvLyBtZXRob2RzCi0KLSAgWzFdIHsgLy8gQXR0cmlidXRlcwotICAgIEF0dHIoIzEzLCAyKSB7IC8vIFNvdXJjZUZpbGUgYXQgMHgwMTk0Ci0gICAgICAjMTQ7Ci0gICAgfSAvLyBlbmQgU291cmNlRmlsZQotICB9IC8vIEF0dHJpYnV0ZXMKLX0gLy8gZW5kIGNsYXNzIGVtcHR5U2lnVXRmOApkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L3J1bnRpbWUvbGFtYmRhLWZlYXR1cmVzL1Rlc3RJbnRlcmZhY2VJbml0LmphdmEgYi9ob3RzcG90L3Rlc3QvcnVudGltZS9sYW1iZGEtZmVhdHVyZXMvVGVzdEludGVyZmFjZUluaXQuamF2YQppbmRleCBhNmYwNTdjLi4wNDkzYTYwIDEwMDY0NAotLS0gYS9ob3RzcG90L3Rlc3QvcnVudGltZS9sYW1iZGEtZmVhdHVyZXMvVGVzdEludGVyZmFjZUluaXQuamF2YQorKysgYi9ob3RzcG90L3Rlc3QvcnVudGltZS9sYW1iZGEtZmVhdHVyZXMvVGVzdEludGVyZmFjZUluaXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDggKzI1LDcgQEAKIC8qCiAgKiBAdGVzdAogICogQGJ1ZyA4MDM0Mjc1Ci0gKiBAYnVnIDgxNjM5NjkKLSAqIEBzdW1tYXJ5IFtKREsgOHU0MF0gVGVzdCBpbnRlcmZhY2UgaW5pdDogb25seSBmb3IgaW50ZXJmYWNlcyBkZWNsYXJpbmcgZGVmYXVsdCBtZXRob2RzLCB3aGVuIHN1YmNsYXNzIGluaXRzCisgKiBAc3VtbWFyeSBbSkRLIDh1NDBdIFRlc3QgaW50ZXJmYWNlIGluaXRpYWxpemF0aW9uOiBvbmx5IGZvciBpbnRlcmZhY2VzIGRlY2xhcmluZyBkZWZhdWx0IG1ldGhvZHMKICAqIEBydW4gbWFpbiBUZXN0SW50ZXJmYWNlSW5pdAogICovCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC00MCw1OSArMzksNDMgQEAKICAgIC8vIERlY2xhcmVzIGEgZGVmYXVsdCBtZXRob2QgYW5kIGluaXRpYWxpemVzCiAgICBpbnRlcmZhY2UgSSB7CiAgICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KEkuY2xhc3MpOwotICAgICAgICBkZWZhdWx0IHZvaWQgaXgoKSB7fQorICAgICAgICBkZWZhdWx0IHZvaWQgeCgpIHt9CiAgICB9CiAKICAgIC8vIERlY2xhcmVzIGEgZGVmYXVsdCBtZXRob2QgYW5kIGluaXRpYWxpemVzCiAgICBpbnRlcmZhY2UgSiBleHRlbmRzIEkgewogICAgICAgIGJvb2xlYW4gdiA9IFRlc3RJbnRlcmZhY2VJbml0Lm91dChKLmNsYXNzKTsKLSAgICAgICBkZWZhdWx0IHZvaWQgangoKSB7fQorICAgICAgIGRlZmF1bHQgdm9pZCB4KCkge30KICAgIH0KLSAgIC8vIE5vIGRlZmF1bHQgbWV0aG9kLCBoYXMgYW4gYWJzdHJhY3QgbWV0aG9kLCBkb2VzIG5vdCBpbml0aWFsaXplCisgICAvLyBObyBkZWZhdWx0IG1ldGhvZCwgZG9lcyBub3QgaW5pdGlhbGl6ZQogICAgaW50ZXJmYWNlIEpOIGV4dGVuZHMgSiB7CiAgICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KEpOLmNsYXNzKTsKLSAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBqbngoKTsKICAgIH0KIAogICAgLy8gRGVjbGFyZXMgYSBkZWZhdWx0IG1ldGhvZCBhbmQgaW5pdGlhbGl6ZXMKICAgIGludGVyZmFjZSBLIGV4dGVuZHMgSSB7CiAgICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KEsuY2xhc3MpOwotICAgICAgICBkZWZhdWx0IHZvaWQga3goKSB7fQorICAgICAgICBkZWZhdWx0IHZvaWQgeCgpIHt9CiAgICB9CiAKLSAgIC8vIE5vIGRlZmF1bHQgbWV0aG9kLCBoYXMgYSBzdGF0aWMgbWV0aG9kLCBkb2VzIG5vdCBpbml0aWFsaXplCisgICAvLyBObyBkZWZhdWx0IG1ldGhvZCwgZG9lcyBub3QgaW5pdGlhbGl6ZQogICAgaW50ZXJmYWNlIEtOIGV4dGVuZHMgSyB7CiAgICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KEtOLmNsYXNzKTsKLSAgICAgICBzdGF0aWMgdm9pZCBrbngoKSB7fQogICAgfQogCiAgICBpbnRlcmZhY2UgTCBleHRlbmRzIEpOLCBLTiB7CiAgICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KEwuY2xhc3MpOwotICAgICAgICBkZWZhdWx0IHZvaWQgbHgoKSB7fQotICAgfQotCi0gICBzdGF0aWMgY2xhc3MgQ2hpbGRDbGFzcyBpbXBsZW1lbnRzIEpOLCBLTiB7Ci0gICAgICAgYm9vbGVhbiB2ID0gVGVzdEludGVyZmFjZUluaXQub3V0KENoaWxkQ2xhc3MuY2xhc3MpOwotICAgICAgIHB1YmxpYyB2b2lkIGpueCgpIHt9CisgICAgICAgIGRlZmF1bHQgdm9pZCB4KCkge30KICAgIH0KIAogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIC8vIFRyaWdnZXIgaW5pdGlhbGl6YXRpb24KICAgICAgICBib29sZWFuIHYgPSBMLnY7CiAKLSAgICAgICBMaXN0PENsYXNzPD8+PiBleHBlY3RlZENJbml0T3JkZXIgPSBBcnJheXMuYXNMaXN0KEwuY2xhc3MpOworICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGV4cGVjdGVkQ0luaXRPcmRlciA9IEFycmF5cy5hc0xpc3QoSS5jbGFzcyxKLmNsYXNzLEsuY2xhc3MsTC5jbGFzcyk7CiAgICAgICAgaWYgKCFjSW5pdE9yZGVyLmVxdWFscyhleHBlY3RlZENJbml0T3JkZXIpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDbGFzcyBpbml0aWFsaXphdGlvbiBhcnJheSAlcyBub3QgZXF1YWwgdG8gZXhwZWN0ZWQgYXJyYXkgJXMiLCBjSW5pdE9yZGVyLCBleHBlY3RlZENJbml0T3JkZXIpKTsKICAgICAgICB9Ci0KLSAgICAgICBDaGlsZENsYXNzIG15QyA9IG5ldyBDaGlsZENsYXNzKCk7Ci0gICAgICAgYm9vbGVhbiB3ID0gbXlDLnY7Ci0KLSAgICAgICBleHBlY3RlZENJbml0T3JkZXIgPSBBcnJheXMuYXNMaXN0KEwuY2xhc3MsSS5jbGFzcyxKLmNsYXNzLEsuY2xhc3MsQ2hpbGRDbGFzcy5jbGFzcyk7Ci0gICAgICAgaWYgKCFjSW5pdE9yZGVyLmVxdWFscyhleHBlY3RlZENJbml0T3JkZXIpKSB7Ci0gICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDbGFzcyBpbml0aWFsaXphdGlvbiBhcnJheSAlcyBub3QgZXF1YWwgdG8gZXhwZWN0ZWQgYXJyYXkgJXMiLCBjSW5pdE9yZGVyLCBleHBlY3RlZENJbml0T3JkZXIpKTsKLSAgICAgICB9Ci0KICAgIH0KIAogICAgc3RhdGljIGJvb2xlYW4gb3V0KENsYXNzIGMpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9ydW50aW1lL29zL0F2YWlsYWJsZVByb2Nlc3NvcnMuamF2YSBiL2hvdHNwb3QvdGVzdC9ydW50aW1lL29zL0F2YWlsYWJsZVByb2Nlc3NvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyZDc2Mi4uMDAwMDAwMAotLS0gYS9ob3RzcG90L3Rlc3QvcnVudGltZS9vcy9BdmFpbGFibGVQcm9jZXNzb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGNvbS5vcmFjbGUuamF2YS50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgY29tLm9yYWNsZS5qYXZhLnRlc3RsaWJyYXJ5Lk91dHB1dEFuYWx5emVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA2NTE1MTcyCi0gKiBAc3VtbWFyeSBDaGVjayB0aGF0IGF2YWlsYWJsZVByb2Nlc3NvcnMgcmVwb3J0cyB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIHJ1bm5pbmcgaW4gYSBjcHVzZXQgb24gbGludXgKLSAqIEByZXF1aXJlcyBvcy5mYW1pbHkgPT0gImxpbnV4IgotICogQGxpYnJhcnkgL3Rlc3RsaWJyYXJ5Ci0gKiBAYnVpbGQgY29tLm9yYWNsZS5qYXZhLnRlc3RsaWJyYXJ5LioKLSAqIEBydW4gZHJpdmVyIEF2YWlsYWJsZVByb2Nlc3NvcnMKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJsZVByb2Nlc3NvcnMgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTX1NUUklORyA9ICJGb3VuZCBleHBlY3RlZCBwcm9jZXNzb3JzOiAiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApCi0gICAgICAgICAgICBjaGVja1Byb2Nlc3NvcnMoSW50ZWdlci5wYXJzZUludChhcmdzWzBdKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gcnVuIG91cnNlbHZlcyB1bmRlciBkaWZmZXJlbnQgY3B1IGNvbmZpZ3VyYXRpb25zCi0gICAgICAgICAgICAvLyB1c2luZyB0aGUgdGFza3NldCBjb21tYW5kCi0gICAgICAgICAgICBTdHJpbmcgdGFza3NldDsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXNrc2V0MSA9ICIvYmluL3Rhc2tzZXQiOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhc2tzZXQyID0gIi91c3IvYmluL3Rhc2tzZXQiOwotICAgICAgICAgICAgaWYgKG5ldyBGaWxlKHRhc2tzZXQxKS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICB0YXNrc2V0ID0gdGFza3NldDE7Ci0gICAgICAgICAgICBlbHNlIGlmIChuZXcgRmlsZSh0YXNrc2V0MikuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgdGFza3NldCA9IHRhc2tzZXQyOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyB0ZXN0OiBjb3VsZCBub3QgZmluZCB0YXNrc2V0IGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBhdmFpbGFibGUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPT0gMSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgdGVzdDogb25seSBvbmUgcHJvY2Vzc29yIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IHRoZSBqYXZhIGNvbW1hbmQgd2Ugd2FudCB0byBleGVjdXRlCi0gICAgICAgICAgICAvLyBFbmFibGUgbG9nZ2luZyBmb3IgZWFzaWVyIGZhaWx1cmUgZGlhZ25vc2lzCi0gICAgICAgICAgICBQcm9jZXNzQnVpbGRlciBtYXN0ZXIgPQotICAgICAgICAgICAgICAgICAgICBQcm9jZXNzVG9vbHMuY3JlYXRlSmF2YVByb2Nlc3NCdWlsZGVyKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItWFg6K1VubG9ja0RpYWdub3N0aWNWTU9wdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItWFg6K1ByaW50QWN0aXZlQ3B1cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2YWlsYWJsZVByb2Nlc3NvcnMiKTsKLQotICAgICAgICAgICAgaW50W10gZXhwZWN0ZWQgPSBuZXcgaW50W10geyAxLCBhdmFpbGFibGUvMiwgYXZhaWxhYmxlLTEsIGF2YWlsYWJsZSB9OwotCi0gICAgICAgICAgICBmb3IgKGludCBpIDogZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RpbmcgZm9yICIgKyBpICsgIiBwcm9jZXNzb3JzIC4uLiIpOwotICAgICAgICAgICAgICAgIGludCBtYXggPSBpIC0gMTsKLSAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBjbWRsaW5lID0gbmV3IEFycmF5TGlzdDw+KG1hc3Rlci5jb21tYW5kKCkpOwotICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgdGFza3NldCBjb21tYW5kCi0gICAgICAgICAgICAgICAgY21kbGluZS5hZGQoMCwgIjAtIiArIG1heCk7Ci0gICAgICAgICAgICAgICAgY21kbGluZS5hZGQoMCwgIi1jIik7Ci0gICAgICAgICAgICAgICAgY21kbGluZS5hZGQoMCwgdGFza3NldCk7Ci0gICAgICAgICAgICAgICAgLy8gYXBwZW5kIGV4cGVjdGVkIHByb2Nlc3NvciBjb3VudAotICAgICAgICAgICAgICAgIGNtZGxpbmUuYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihjbWRsaW5lKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbmFsIGNvbW1hbmQgbGluZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NUb29scy5nZXRDb21tYW5kTGluZShwYikpOwotICAgICAgICAgICAgICAgIE91dHB1dEFuYWx5emVyIG91dHB1dCA9IFByb2Nlc3NUb29scy5leGVjdXRlUHJvY2VzcyhwYik7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnNob3VsZENvbnRhaW4oU1VDQ0VTU19TVFJJTkcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY2hlY2tQcm9jZXNzb3JzKGludCBleHBlY3RlZCkgewotICAgICAgICBpbnQgYXZhaWxhYmxlID0gUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpOwotICAgICAgICBpZiAoYXZhaWxhYmxlICE9IGV4cGVjdGVkKQotICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCAiICsgZXhwZWN0ZWQgKyAiIHByb2Nlc3NvcnMsIGJ1dCBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdmFpbGFibGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU1VDQ0VTU19TVFJJTkcgKyBhdmFpbGFibGUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvT3V0cHV0QW5hbHl6ZXIuamF2YSBiL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvT3V0cHV0QW5hbHl6ZXIuamF2YQppbmRleCAxOTFhNzVjLi5iODFmMjFhIDEwMDY0NAotLS0gYS9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnkvY29tL29yYWNsZS9qYXZhL3Rlc3RsaWJyYXJ5L091dHB1dEFuYWx5emVyLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L3Rlc3RsaWJyYXJ5L2NvbS9vcmFjbGUvamF2YS90ZXN0bGlicmFyeS9PdXRwdXRBbmFseXplci5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBwYWNrYWdlIGNvbS5vcmFjbGUuamF2YS50ZXN0bGlicmFyeTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIApAQCAtNzEsNTggKzY5LDYgQEAKICAgfQogCiAgIC8qKgotICAgKiBWZXJpZnkgdGhhdCB0aGUgc3Rkb3V0IGNvbnRlbnRzIG9mIG91dHB1dCBidWZmZXIgaXMgZW1wdHkKLSAgICoKLSAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCi0gICAqICAgICAgICAgICAgIElmIHN0ZG91dCB3YXMgbm90IGVtcHR5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzdGRvdXRTaG91bGRCZUVtcHR5KCkgewotICAgIGlmICghZ2V0U3Rkb3V0KCkuaXNFbXB0eSgpKSB7Ci0gICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN0ZG91dCB3YXMgbm90IGVtcHR5Iik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmeSB0aGF0IHRoZSBzdGRlcnIgY29udGVudHMgb2Ygb3V0cHV0IGJ1ZmZlciBpcyBlbXB0eQotICAgKgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgc3RkZXJyIHdhcyBub3QgZW1wdHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0ZGVyclNob3VsZEJlRW1wdHkoKSB7Ci0gICAgaWYgKCFnZXRTdGRlcnIoKS5pc0VtcHR5KCkpIHsKLSAgICAgIHJlcG9ydERpYWdub3N0aWNTdW1tYXJ5KCk7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigic3RkZXJyIHdhcyBub3QgZW1wdHkiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIHN0ZG91dCBjb250ZW50cyBvZiBvdXRwdXQgYnVmZmVyIGlzIG5vdCBlbXB0eQotICAgKgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgc3Rkb3V0IHdhcyBlbXB0eQotICAgKi8KLSAgcHVibGljIHZvaWQgc3Rkb3V0U2hvdWxkTm90QmVFbXB0eSgpIHsKLSAgICBpZiAoZ2V0U3Rkb3V0KCkuaXNFbXB0eSgpKSB7Ci0gICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN0ZG91dCB3YXMgZW1wdHkiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmVyaWZ5IHRoYXQgdGhlIHN0ZGVyciBjb250ZW50cyBvZiBvdXRwdXQgYnVmZmVyIGlzIG5vdCBlbXB0eQotICAgKgotICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KLSAgICogICAgICAgICAgICAgSWYgc3RkZXJyIHdhcyBlbXB0eQotICAgKi8KLSAgcHVibGljIHZvaWQgc3RkZXJyU2hvdWxkTm90QmVFbXB0eSgpIHsKLSAgICBpZiAoZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKSB7Ci0gICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInN0ZGVyciB3YXMgZW1wdHkiKTsKLSAgICB9Ci0gIH0KLQotICAgIC8qKgogICAgKiBWZXJpZnkgdGhhdCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIgY29udGVudHMgb2Ygb3V0cHV0IGJ1ZmZlciBjb250YWlucyB0aGUgc3RyaW5nCiAgICAqCiAgICAqIEBwYXJhbSBleHBlY3RlZFN0cmluZyBTdHJpbmcgdGhhdCBidWZmZXIgc2hvdWxkIGNvbnRhaW4KQEAgLTQxOSwxOCArMzY1LDQgQEAKICAgcHVibGljIGludCBnZXRFeGl0VmFsdWUoKSB7CiAgICAgcmV0dXJuIGV4aXRWYWx1ZTsKICAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgYnVmZmVyIChzdGRvdXQgYW5kIHN0ZGVycikgYXMgbGlzdCBvZiBzdHJpbmdzLgotICAgKiBPdXRwdXQgd2lsbCBiZSBzcGxpdCBieSBuZXdsaW5lcy4KLSAgICoKLSAgICogQHJldHVybiBDb250ZW50cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBhcyBsaXN0IG9mIHN0cmluZ3MKLSAgICovCi0gIHB1YmxpYyBMaXN0PFN0cmluZz4gYXNMaW5lcygpIHsKLSAgICByZXR1cm4gYXNMaW5lcyhnZXRPdXRwdXQoKSk7Ci0gIH0KLQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBhc0xpbmVzKFN0cmluZyBidWZmZXIpIHsKLSAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChidWZmZXIuc3BsaXQoIihcXHJcXG58XFxufFxccikiKSk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvUHJvY2Vzc1Rvb2xzLmphdmEgYi9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnkvY29tL29yYWNsZS9qYXZhL3Rlc3RsaWJyYXJ5L1Byb2Nlc3NUb29scy5qYXZhCmluZGV4IDE5NTNkMTguLjY0OWI3YTEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvUHJvY2Vzc1Rvb2xzLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L3Rlc3RsaWJyYXJ5L2NvbS9vcmFjbGUvamF2YS90ZXN0bGlicmFyeS9Qcm9jZXNzVG9vbHMuamF2YQpAQCAtMTg3LDM2ICsxODcsMjMgQEAKICAgICByZXR1cm4gZXhlY3V0ZVByb2Nlc3MocGIpOwogICB9CiAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlcyBhIHByb2Nlc3MsIHdhaXRzIGZvciBpdCB0byBmaW5pc2ggYW5kIHJldHVybnMgdGhlIHByb2Nlc3Mgb3V0cHV0LgotICAgICAqIFRoZSBwcm9jZXNzIHdpbGwgaGF2ZSBleGl0ZWQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMuCi0gICAgICogQHBhcmFtIHBiIFRoZSBQcm9jZXNzQnVpbGRlciB0byBleGVjdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHtAbGlua3BsYWluIE91dHB1dEFuYWx5emVyfSBpbnN0YW5jZSB3cmFwcGluZyB0aGUgcHJvY2Vzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE91dHB1dEFuYWx5emVyIGV4ZWN1dGVQcm9jZXNzKFByb2Nlc3NCdWlsZGVyIHBiKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0QW5hbHl6ZXIgb3V0cHV0ID0gbnVsbDsKLSAgICAgICAgUHJvY2VzcyBwID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAgPSBwYi5zdGFydCgpOwotICAgICAgICAgICAgb3V0cHV0ID0gbmV3IE91dHB1dEFuYWx5emVyKHApOwotICAgICAgICAgICAgcC53YWl0Rm9yKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcC5kZXN0cm95Rm9yY2libHkoKS53YWl0Rm9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4ZWN1dGVQcm9jZXNzKCkgZmFpbGVkOiAiICsgdCk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZhaWxlZCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihnZXRQcm9jZXNzTG9nKHBiLCBvdXRwdXQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvKioKKyAgICogRXhlY3V0ZXMgYSBwcm9jZXNzLCB3YWl0cyBmb3IgaXQgdG8gZmluaXNoIGFuZCByZXR1cm5zIHRoZSBwcm9jZXNzIG91dHB1dC4KKyAgICogQHBhcmFtIHBiIFRoZSBQcm9jZXNzQnVpbGRlciB0byBleGVjdXRlLgorICAgKiBAcmV0dXJuIFRoZSBvdXRwdXQgZnJvbSB0aGUgcHJvY2Vzcy4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgT3V0cHV0QW5hbHl6ZXIgZXhlY3V0ZVByb2Nlc3MoUHJvY2Vzc0J1aWxkZXIgcGIpIHRocm93cyBUaHJvd2FibGUgeworICAgIE91dHB1dEFuYWx5emVyIG91dHB1dCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dCA9IG5ldyBPdXRwdXRBbmFseXplcihwYi5zdGFydCgpKTsKKyAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZXhlY3V0ZVByb2Nlc3MoKSBmYWlsZWQ6ICIgKyB0KTsKKyAgICAgIHRocm93IHQ7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRQcm9jZXNzTG9nKHBiLCBvdXRwdXQpKTsKICAgICB9CisgIH0KIAogICAvKioKICAgICogRXhlY3V0ZXMgYSBwcm9jZXNzLCB3YWl0cyBmb3IgaXQgdG8gZmluaXNoIGFuZCByZXR1cm5zIHRoZSBwcm9jZXNzIG91dHB1dC4KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvVXRpbHMuamF2YSBiL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeS9jb20vb3JhY2xlL2phdmEvdGVzdGxpYnJhcnkvVXRpbHMuamF2YQppbmRleCBiMzMyYzFlLi44NDIxNTE5IDEwMDY0NAotLS0gYS9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnkvY29tL29yYWNsZS9qYXZhL3Rlc3RsaWJyYXJ5L1V0aWxzLmphdmEKKysrIGIvaG90c3BvdC90ZXN0L3Rlc3RsaWJyYXJ5L2NvbS9vcmFjbGUvamF2YS90ZXN0bGlicmFyeS9VdGlscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYwLDggKzI2MCw4IEBACiAgICAgICAgICAgICBvdXRwdXQgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZVByb2Nlc3MoamNtZExhdW5jaGVyLmdldENvbW1hbmQoKSk7CiAgICAgICAgICAgICBvdXRwdXQuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKIAotICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBhIGxpbmUgc3RhcnRpbmcgd2l0aCBudW1iZXJzIChwaWQpLCBmb2xsb3dlZCBieSB0aGUga2V5LgotICAgICAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJeKFswLTldKylcXHMuKigiICsga2V5ICsgIikiLCBQYXR0ZXJuLk1VTFRJTElORSk7CisgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIGEgbGluZSBzdGFydGluZyB3aXRoIG51bWJlcnMgKHBpZCksIGZvbGx3ZWQgYnkgdGhlIGtleS4KKyAgICAgICAgICAgIFBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiKFswLTldKylcXHMuKigiICsga2V5ICsgIikuKlxccj9cXG4iKTsKICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvdXRwdXQuZ2V0U3Rkb3V0KCkpOwogCiAgICAgICAgICAgICBpbnQgcGlkID0gLTE7CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnlfdGVzdHMvd2hpdGVib3gvdm1fZmxhZ3MvVWludHhUZXN0LmphdmEgYi9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnlfdGVzdHMvd2hpdGVib3gvdm1fZmxhZ3MvVWludHhUZXN0LmphdmEKaW5kZXggNzE0MTIyMS4uNjg4OTYyZiAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L3Rlc3RsaWJyYXJ5X3Rlc3RzL3doaXRlYm94L3ZtX2ZsYWdzL1VpbnR4VGVzdC5qYXZhCisrKyBiL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeV90ZXN0cy93aGl0ZWJveC92bV9mbGFncy9VaW50eFRlc3QuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogaW1wb3J0IGNvbS5vcmFjbGUuamF2YS50ZXN0bGlicmFyeS5QbGF0Zm9ybTsKIAogcHVibGljIGNsYXNzIFVpbnR4VGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTkFNRSA9ICJWZXJpZnlHQ1N0YXJ0QXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05BTUUgPSAiVHlwZVByb2ZpbGVMZXZlbCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ1tdIFRFU1RTID0gezBMLCAxMDBMLCAobG9uZykgSW50ZWdlci5NQVhfVkFMVUUsCiAgICAgICAgICgxTCA8PCAzMkwpIC0gMUwsIDFMIDw8IDMyTH07CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ1tdIEVYUEVDVEVEXzY0ID0gVEVTVFM7CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnlfdGVzdHMvd2hpdGVib3gvdm1fZmxhZ3MvVm1GbGFnVGVzdC5qYXZhIGIvaG90c3BvdC90ZXN0L3Rlc3RsaWJyYXJ5X3Rlc3RzL3doaXRlYm94L3ZtX2ZsYWdzL1ZtRmxhZ1Rlc3QuamF2YQppbmRleCAwODE4ZjIxLi5mYTg5MTVmIDEwMDY0NAotLS0gYS9ob3RzcG90L3Rlc3QvdGVzdGxpYnJhcnlfdGVzdHMvd2hpdGVib3gvdm1fZmxhZ3MvVm1GbGFnVGVzdC5qYXZhCisrKyBiL2hvdHNwb3QvdGVzdC90ZXN0bGlicmFyeV90ZXN0cy93aGl0ZWJveC92bV9mbGFncy9WbUZsYWdUZXN0LmphdmEKQEAgLTU1LDcgKzU1LDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFQgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiBnZXQuYXBwbHkoZmxhZ05hbWUpOworICAgICAgICBUIHQgPSBnZXQuYXBwbHkoZmxhZ05hbWUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlQgPSAiICsgdCk7CisgICAgICAgIHJldHVybiB0OwogICAgIH0KIAogICAgIHByb3RlY3RlZCBzdGF0aWMgPFQ+IHZvaWQgcnVuVGVzdChTdHJpbmcgZXhpc3RlbnRGbGFnLCBUW10gdGVzdHMsCmRpZmYgLS1naXQgYS9qYXhwL0FTU0VNQkxZX0VYQ0VQVElPTiBiL2pheHAvQVNTRU1CTFlfRVhDRVBUSU9OCmluZGV4IDA2NWI4ZDkuLjhiN2FjMWQgMTAwNjQ0Ci0tLSBhL2pheHAvQVNTRU1CTFlfRVhDRVBUSU9OCisrKyBiL2pheHAvQVNTRU1CTFlfRVhDRVBUSU9OCkBAIC0xLDI3ICsxLDI3IEBACiAKIE9QRU5KREsgQVNTRU1CTFkgRVhDRVBUSU9OCiAKLVRoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIChPcmFjbGUpIGF0Ci1vcGVuamRrLmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCitUaGUgT3BlbkpESyBzb3VyY2UgY29kZSBtYWRlIGF2YWlsYWJsZSBieSBTdW4gYXQgb3Blbmpkay5qYXZhLm5ldCBhbmQKK29wZW5qZGsuZGV2LmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCiBvbmx5ICgiR1BMMiIpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24uCiAKICAgICBMaW5raW5nIHRoaXMgT3BlbkpESyBDb2RlIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBjb2RlCiAgICAgaXMgbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMKICAgICBhbmQgY29uZGl0aW9ucyBvZiBHUEwyIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KIAotICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIE9yYWNsZSBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKLSAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgT3JhY2xlIGFzIGluZGljYXRlZCBhdAorICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIFN1biBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKKyAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgU3VuIGFzIGluZGljYXRlZCBhdAogICAgIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2xlZ2FsL2V4Y2VwdGlvbi1tb2R1bGVzLTIwMDctMDUtMDguaHRtbAogICAgICgiRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyIpIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKICAgICByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZSBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzLAogICAgIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciBHUEwyLAogICAgIHByb3ZpZGVkIHRoYXQgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgY29udGludWUgdG8gYmUKLSAgICBnb3Zlcm5lZCBieSB0aGUgbGljZW5zZXMgdW5kZXIgd2hpY2ggdGhleSB3ZXJlIG9mZmVyZWQgYnkgT3JhY2xlLgorICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBTdW4uCiAKLUFzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBPcmFjbGUncyBHUEwyIE9wZW5KREsgQ29kZQotdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQKLU9yYWNsZSBjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IE9yYWNsZSBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMgotd2l0aCB0aGUgQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLAotdGhhdCBuZXcgR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMKLWlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCitBcyBzdWNoLCBpdCBhbGxvd3MgbGljZW5zZWVzIGFuZCBzdWJsaWNlbnNlZXMgb2YgU3VuJ3MgR1BMMiBPcGVuSkRLIENvZGUgdG8KK2J1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBpbmNsdWRlcyB0aG9zZSBwb3J0aW9ucyBvZiBuZWNlc3NhcnkgY29kZSB0aGF0IFN1bgorY291bGQgbm90IHByb3ZpZGUgdW5kZXIgR1BMMiAob3IgdGhhdCBTdW4gaGFzIHByb3ZpZGVkIHVuZGVyIEdQTDIgd2l0aCB0aGUKK0NsYXNzcGF0aCBleGNlcHRpb24pLiAgSWYgeW91IG1vZGlmeSBvciBhZGQgdG8gdGhlIE9wZW5KREsgY29kZSwgdGhhdCBuZXcKK0dQTDIgY29kZSBtYXkgc3RpbGwgYmUgY29tYmluZWQgd2l0aCBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIGlmIHRoZQorbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHRoaXMgZXhjZXB0aW9uIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVyLgpkaWZmIC0tZ2l0IGEvamF4cC9MSUNFTlNFIGIvamF4cC9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL2pheHAvTElDRU5TRQorKysgYi9qYXhwL0xJQ0VOU0UKQEAgLTMsNyArMyw3IEBACiBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCiBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgpAQCAtMjg3LDggKzI4Nyw4IEBACiAgICAgbW9yZSBkZXRhaWxzLgogCiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgICBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KIApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL0xpdGVyYWxFbGVtZW50LmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvTGl0ZXJhbEVsZW1lbnQuamF2YQppbmRleCBjMzkyY2JlLi5lMTM2MzU3IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvTGl0ZXJhbEVsZW1lbnQuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvTGl0ZXJhbEVsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKQEAgLTksNyArOSw3IEBACiAgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw5IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLworLyoKKyAqICRJZDogTGl0ZXJhbEVsZW1lbnQuamF2YSx2IDEuMi40LjEgMjAwNS8wOS8xMyAxMjozODozMyBwdmVkdWxhIEV4cCAkCisgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMuY29tcGlsZXI7CiAKQEAgLTU1LDYgKzU4LDggQEAKICAgICAvLyBuYW1lcyBhcmUgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS4KICAgICBwcml2YXRlIGJvb2xlYW4gX2FsbEF0dHJpYnV0ZXNVbmlxdWUgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYTUxOU19TVFJJTkcgPSAieG1sbnMiOworCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgUU5hbWUgZm9yIHRoaXMgbGl0ZXJhbCBlbGVtZW50CiAgICAgICovCkBAIC0xMzUsOCArMTQwLDggQEAKICAgICAgICAgLy8gVHJlYXQgZGVmYXVsdCBuYW1lc3BhY2UgYXMgIiIgYW5kIG5vdCBudWxsCiAgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkKICAgICAgICAgICAgIHByZWZpeCA9IENvbnN0YW50cy5FTVBUWVNUUklORzsKLSAgICAgICAgZWxzZSBpZiAocHJlZml4LmVxdWFscyhYTUxOU19QUkVGSVgpKQotICAgICAgICAgICAgcmV0dXJuKFhNTE5TX1BSRUZJWCk7CisgICAgICAgIGVsc2UgaWYgKHByZWZpeC5lcXVhbHMoWE1MTlNfU1RSSU5HKSkKKyAgICAgICAgICAgIHJldHVybihYTUxOU19TVFJJTkcpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHdlIG11c3QgdHJhbnNsYXRlIHRoZSBwcmVmaXgKICAgICAgICAgZmluYWwgU3RyaW5nIGFsdGVybmF0aXZlID0gc3RhYmxlLmxvb2t1cFByZWZpeEFsaWFzKHByZWZpeCk7CkBAIC0yNjEsNyArMjY2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgc3BlY2lhbCBhdHRyaWJ1dGVzIChlLmcuIHhtbG5zOnByZWZpeCBhbmQgeG1sbnMpCiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IHFuYW1lLmdldFByZWZpeCgpOwogICAgICAgICAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKFhNTE5TX1BSRUZJWCkgfHwKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09IG51bGwgJiYgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKFhNTE5TX1BSRUZJWCkgfHwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID09IG51bGwgJiYgcW5hbWUuZ2V0TG9jYWxQYXJ0KCkuZXF1YWxzKCJ4bWxucyIpIHx8CiAgICAgICAgICAgICAgICAgICAgIHVyaSAhPSBudWxsICYmIHVyaS5lcXVhbHMoWFNMVF9VUkkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0zMzQsOSArMzM5LDkgQEAKICAgICAgICAgaWwuYXBwZW5kKG1ldGhvZEdlbi5zdGFydEVsZW1lbnQoKSk7CiAKICAgICAgICAgLy8gVGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBtYXkgZGVwZW5kIG9uIGEgKHNpYmxpbmcpIHZhcmlhYmxlCi0gICAgICAgIGludCBqID0gMDsKKyAgICAgICAgaW50IGo9MDsKICAgICAgICAgd2hpbGUgKGogPCBlbGVtZW50Q291bnQoKSkgIHsKLSAgICAgICAgICAgIGZpbmFsIFN5bnRheFRyZWVOb2RlIGl0ZW0gPSBlbGVtZW50QXQoaik7CisgICAgICAgICAgICBmaW5hbCBTeW50YXhUcmVlTm9kZSBpdGVtID0gKFN5bnRheFRyZWVOb2RlKSBlbGVtZW50QXQoaik7CiAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFZhcmlhYmxlKSB7CiAgICAgICAgICAgICAgICAgaXRlbS50cmFuc2xhdGUoY2xhc3NHZW4sIG1ldGhvZEdlbik7CiAgICAgICAgICAgICB9CkBAIC0zNDUsMTIgKzM1MCwzNSBAQAogCiAgICAgICAgIC8vIENvbXBpbGUgY29kZSB0byBlbWl0IG5hbWVzcGFjZSBhdHRyaWJ1dGVzCiAgICAgICAgIGlmIChfYWNjZXNzZWRQcmVmaXhlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRlY2xhcmVzRGVmYXVsdE5TID0gZmFsc2U7CisKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IF9hY2Nlc3NlZFByZWZpeGVzLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAodXJpICE9IENvbnN0YW50cy5FTVBUWVNUUklORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICE9IENvbnN0YW50cy5FTVBUWVNUUklORykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVmaXggPT0gQ29uc3RhbnRzLkVNUFRZU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlc0RlZmF1bHROUyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG1ldGhvZEdlbi5sb2FkSGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZyxwcmVmaXgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZyx1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG1ldGhvZEdlbi5uYW1lc3BhY2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgb3VyIFhzbEVsZW1lbnQgcGFyZW50IHJlZGVjbGFyZXMgdGhlIGRlZmF1bHQgTlMsIGFuZCB0aGlzCisgICAgICAgICAgICAgKiBlbGVtZW50IGRvZXNuJ3QsIGl0IG11c3QgYmUgcmVkZWNsYXJlZCBvbmUgbW9yZSB0aW1lLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoIWRlY2xhcmVzRGVmYXVsdE5TICYmIChfcGFyZW50IGluc3RhbmNlb2YgWHNsRWxlbWVudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKChYc2xFbGVtZW50KSBfcGFyZW50KS5kZWNsYXJlc0RlZmF1bHROUygpKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlsLmFwcGVuZChtZXRob2RHZW4ubG9hZEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZywgcHJlZml4KSk7Ci0gICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZywgdXJpKSk7CisgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZywgQ29uc3RhbnRzLkVNUFRZU1RSSU5HKSk7CisgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG5ldyBQVVNIKGNwZywgQ29uc3RhbnRzLkVNUFRZU1RSSU5HKSk7CiAgICAgICAgICAgICAgICAgaWwuYXBwZW5kKG1ldGhvZEdlbi5uYW1lc3BhY2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9QYXJzZXIuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9QYXJzZXIuamF2YQppbmRleCA3MDg4ODUwLi5kMTVkOTBlIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvUGFyc2VyLmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1BhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQpAQCAtMTcsNiArMTcsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiAkSWQ6IFBhcnNlci5qYXZhLHYgMS4yLjQuMSAyMDA1LzA5LzEzIDEyOjE0OjMyIHB2ZWR1bGEgRXhwICQKKyAqLwogCiBwYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy5jb21waWxlcjsKIApAQCAtMzQsNyArMzcsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNDIsNiArNDQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiBpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKQEAgLTY1LDIwICs2OCwyMCBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFyc2VyIGltcGxlbWVudHMgQ29uc3RhbnRzLCBDb250ZW50SGFuZGxlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMID0gInhzbCI7ICAgICAgICAgICAvLyBzdGFuZGFyZCBwcmVmaXgKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNMID0gInhzbCI7ICAgICAgICAgICAgLy8gc3RhbmRhcmQgcHJlZml4CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TTEVUID0gInRyYW5zbGV0IjsgLy8gZXh0ZW5zaW9uIHByZWZpeAogCiAgICAgcHJpdmF0ZSBMb2NhdG9yIF9sb2NhdG9yID0gbnVsbDsKIAotICAgIHByaXZhdGUgWFNMVEMgX3hzbHRjOyAgICAgICAgICAgICAgICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgY29tcGlsZXIgb2JqZWN0LgotICAgIHByaXZhdGUgWFBhdGhQYXJzZXIgX3hwYXRoUGFyc2VyOyAgICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgWFBhdGggcGFyc2VyLgotICAgIHByaXZhdGUgQXJyYXlMaXN0PEVycm9yTXNnPiBfZXJyb3JzOyAgIC8vIENvbnRhaW5zIGFsbCBjb21waWxhdGlvbiBlcnJvcnMKLSAgICBwcml2YXRlIEFycmF5TGlzdDxFcnJvck1zZz4gX3dhcm5pbmdzOyAvLyBDb250YWlucyBhbGwgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICBwcml2YXRlIFhTTFRDIF94c2x0YzsgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHRvIHRoZSBjb21waWxlciBvYmplY3QuCisgICAgcHJpdmF0ZSBYUGF0aFBhcnNlciBfeHBhdGhQYXJzZXI7IC8vIFJlZmVyZW5jZSB0byB0aGUgWFBhdGggcGFyc2VyLgorICAgIHByaXZhdGUgVmVjdG9yIF9lcnJvcnM7ICAgICAgICAgICAvLyBDb250YWlucyBhbGwgY29tcGlsYXRpb24gZXJyb3JzCisgICAgcHJpdmF0ZSBWZWN0b3IgX3dhcm5pbmdzOyAgICAgICAgIC8vIENvbnRhaW5zIGFsbCBjb21waWxhdGlvbiBlcnJvcnMKIAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiAgIF9pbnN0cnVjdGlvbkNsYXNzZXM7IC8vIE1hcHMgaW5zdHJ1Y3Rpb25zIHRvIGNsYXNzZXMKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBfaW5zdHJ1Y3Rpb25BdHRyczsgIC8vIHJlcWQgYW5kIG9wdCBhdHRycwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgUU5hbWU+ICAgIF9xTmFtZXM7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBRTmFtZT4+IF9uYW1lc3BhY2VzOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgUU5hbWU+ICAgX3FOYW1lczsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hcD4gICAgIF9uYW1lc3BhY2VzOwogICAgIHByaXZhdGUgUU5hbWUgICAgICAgX3VzZUF0dHJpYnV0ZVNldHM7CiAgICAgcHJpdmF0ZSBRTmFtZSAgICAgICBfZXhjbHVkZVJlc3VsdFByZWZpeGVzOwogICAgIHByaXZhdGUgUU5hbWUgICAgICAgX2V4dGVuc2lvbkVsZW1lbnRQcmVmaXhlczsKQEAgLTExMCw4ICsxMTMsOCBAQAogICAgICAgICBfaW5zdHJ1Y3Rpb25BdHRycyAgICA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgX3ZhcmlhYmxlU2NvcGUgICAgICAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIF90ZW1wbGF0ZSAgICAgICAgICAgID0gbnVsbDsKLSAgICAgICAgX2Vycm9ycyAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgX3dhcm5pbmdzICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgX2Vycm9ycyAgICAgICAgICAgICAgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIF93YXJuaW5ncyAgICAgICAgICAgID0gbmV3IFZlY3RvcigpOwogICAgICAgICBfc3ltYm9sVGFibGUgICAgICAgICA9IG5ldyBTeW1ib2xUYWJsZSgpOwogICAgICAgICBfeHBhdGhQYXJzZXIgICAgICAgICA9IG5ldyBYUGF0aFBhcnNlcih0aGlzKTsKICAgICAgICAgX2N1cnJlbnRTdHlsZXNoZWV0ICAgPSBudWxsOwpAQCAtMTM2LDYgKzEzOSw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dCBvdXRwdXQpIHsKICAgICAgICAgaWYgKF9vdXRwdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKF9vdXRwdXQuZ2V0SW1wb3J0UHJlY2VkZW5jZSgpIDw9IG91dHB1dC5nZXRJbXBvcnRQcmVjZWRlbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2RhdGEgPSBfb3V0cHV0LmdldENkYXRhKCk7CiAgICAgICAgICAgICAgICAgb3V0cHV0Lm1lcmdlT3V0cHV0KF9vdXRwdXQpOwogICAgICAgICAgICAgICAgIF9vdXRwdXQuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgIF9vdXRwdXQgPSBvdXRwdXQ7CkBAIC0xNjksMTMgKzE3MywxMiBAQAogICAgICAgICBPYmplY3QgZXhpc3RpbmcgPSBfdmFyaWFibGVTY29wZS5nZXQodmFyLmdldE5hbWUoKS5nZXRTdHJpbmdSZXAoKSk7CiAgICAgICAgIGlmIChleGlzdGluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBTdGFjaykgewotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIFN0YWNrPFZhcmlhYmxlQmFzZT4gc3RhY2sgPSAoU3RhY2s8VmFyaWFibGVCYXNlPilleGlzdGluZzsKKyAgICAgICAgICAgICAgICBTdGFjayBzdGFjayA9IChTdGFjaylleGlzdGluZzsKICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHZhcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIFZhcmlhYmxlQmFzZSkgewotICAgICAgICAgICAgICAgIFN0YWNrPFZhcmlhYmxlQmFzZT4gc3RhY2sgPSBuZXcgU3RhY2s8PigpOwotICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goKFZhcmlhYmxlQmFzZSlleGlzdGluZyk7CisgICAgICAgICAgICAgICAgU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoKGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHZhcik7CiAgICAgICAgICAgICAgICAgX3ZhcmlhYmxlU2NvcGUucHV0KHZhci5nZXROYW1lKCkuZ2V0U3RyaW5nUmVwKCksIHN0YWNrKTsKICAgICAgICAgICAgIH0KQEAgLTE4OCw4ICsxOTEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVZhcmlhYmxlKFFOYW1lIG5hbWUpIHsKICAgICAgICAgT2JqZWN0IGV4aXN0aW5nID0gX3ZhcmlhYmxlU2NvcGUuZ2V0KG5hbWUuZ2V0U3RyaW5nUmVwKCkpOwogICAgICAgICBpZiAoZXhpc3RpbmcgaW5zdGFuY2VvZiBTdGFjaykgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBTdGFjazxWYXJpYWJsZUJhc2U+IHN0YWNrID0gKFN0YWNrPFZhcmlhYmxlQmFzZT4pZXhpc3Rpbmc7CisgICAgICAgICAgICBTdGFjayBzdGFjayA9IChTdGFjaylleGlzdGluZzsKICAgICAgICAgICAgIGlmICghc3RhY2suaXNFbXB0eSgpKSBzdGFjay5wb3AoKTsKICAgICAgICAgICAgIGlmICghc3RhY2suaXNFbXB0eSgpKSByZXR1cm47CiAgICAgICAgIH0KQEAgLTE5OSwxNCArMjAxLDEzIEBACiAgICAgcHVibGljIFZhcmlhYmxlQmFzZSBsb29rdXBWYXJpYWJsZShRTmFtZSBuYW1lKSB7CiAgICAgICAgIE9iamVjdCBleGlzdGluZyA9IF92YXJpYWJsZVNjb3BlLmdldChuYW1lLmdldFN0cmluZ1JlcCgpKTsKICAgICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgVmFyaWFibGVCYXNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKFZhcmlhYmxlQmFzZSlleGlzdGluZzsKKyAgICAgICAgICAgIHJldHVybigoVmFyaWFibGVCYXNlKWV4aXN0aW5nKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIFN0YWNrKSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIFN0YWNrPFZhcmlhYmxlQmFzZT4gc3RhY2sgPSAoU3RhY2s8VmFyaWFibGVCYXNlPilleGlzdGluZzsKLSAgICAgICAgICAgIHJldHVybiBzdGFjay5wZWVrKCk7CisgICAgICAgICAgICBTdGFjayBzdGFjayA9IChTdGFjaylleGlzdGluZzsKKyAgICAgICAgICAgIHJldHVybigoVmFyaWFibGVCYXNlKXN0YWNrLnBlZWsoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybihudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRYU0xUQyhYU0xUQyB4c2x0YykgewpAQCAtMzk2LDYgKzM5Nyw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoc3R5bGVzaGVldCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc3R5bGVzaGVldC5wYXJzZUNvbnRlbnRzKHRoaXMpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwcmVjZWRlbmNlID0gc3R5bGVzaGVldC5nZXRJbXBvcnRQcmVjZWRlbmNlKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3ludGF4VHJlZU5vZGU+IGVsZW1lbnRzID0gc3R5bGVzaGVldC5lbGVtZW50cygpOwogICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50cy5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgU3ludGF4VHJlZU5vZGUgY2hpbGQgPSBlbGVtZW50cy5uZXh0KCk7CkBAIC03MDIsNiArNzA0LDggQEAKICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsic3R5bGVzaGVldC1wcmVmaXgiLCAicmVzdWx0LXByZWZpeCJ9KTsKICAgICB9CiAKKworCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgX2luc3RydWN0aW9uQ2xhc3NlcyBtYXAsIHdoaWNoIG1hcHMgWFNMIGVsZW1lbnQKICAgICAgKiBuYW1lcyB0byBKYXZhIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlLgpAQCAtNzc1LDcgKzc3OSw2IEBACiAgICAgLyoqCiAgICAgICogQWRkIHByaW1vcHMgYW5kIGJhc2UgZnVuY3Rpb25zIHRvIHRoZSBzeW1ib2wgdGFibGUuCiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRTeW1ib2xUYWJsZSgpIHsKICAgICAgICAgTWV0aG9kVHlwZSBJX1YgID0gbmV3IE1ldGhvZFR5cGUoVHlwZS5JbnQsIFR5cGUuVm9pZCk7CiAgICAgICAgIE1ldGhvZFR5cGUgSV9SICA9IG5ldyBNZXRob2RUeXBlKFR5cGUuSW50LCBUeXBlLlJlYWwpOwpAQCAtOTY4LDEyICs5NzEsMTIgQEAKICAgICAgICAgU3RyaW5nIGxvY2FsLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpCiAgICAgewogICAgICAgICBTeW50YXhUcmVlTm9kZSBub2RlID0gbnVsbDsKLSAgICAgICAgUU5hbWUgcW5hbWUgPSBnZXRRTmFtZSh1cmksIHByZWZpeCwgbG9jYWwpOworICAgICAgICBRTmFtZSAgcW5hbWUgPSBnZXRRTmFtZSh1cmksIHByZWZpeCwgbG9jYWwpOwogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gX2luc3RydWN0aW9uQ2xhc3Nlcy5nZXQocW5hbWUuZ2V0U3RyaW5nUmVwKCkpOwogCiAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eiA9IE9iamVjdEZhY3RvcnkuZmluZFByb3ZpZGVyQ2xhc3MoY2xhc3NOYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IE9iamVjdEZhY3RvcnkuZmluZFByb3ZpZGVyQ2xhc3MoY2xhc3NOYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICBub2RlID0gKFN5bnRheFRyZWVOb2RlKWNsYXp6Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgbm9kZS5zZXRRTmFtZShxbmFtZSk7CiAgICAgICAgICAgICAgICAgbm9kZS5zZXRQYXJzZXIodGhpcyk7CkBAIC0xMDIwLDcgKzEwMjMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICBTdHlsZXNoZWV0IHNoZWV0ID0gX3hzbHRjLmdldFN0eWxlc2hlZXQoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChzaGVldCAhPSBudWxsKSAmJiAoc2hlZXQuaXNFeHRlbnNpb24odXJpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGVldCAhPSBfcGFyZW50U3RhY2sucGVlaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgIT0gKFN5bnRheFRyZWVOb2RlKV9wYXJlbnRTdGFjay5wZWVrKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3IFVuc3VwcG9ydGVkRWxlbWVudCh1cmksIHByZWZpeCwgbG9jYWwsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkRWxlbWVudCBlbGVtID0gKFVuc3VwcG9ydGVkRWxlbWVudClub2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTXNnIG1zZyA9CkBAIC0xMTUzLDYgKzExNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICBub2RlLnNldFBhcnNlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRQYXJlbnQocGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRMaW5lTnVtYmVyKGxpbmUpOworLy8gU3lzdGVtLm91dC5wcmludGxuKCJlID0gIiArIHRleHQgKyAiICIgKyBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTE4Nyw3ICsxMTkxLDcgQEAKICAgICAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4obmV3IEVycm9yTXNnKEVycm9yTXNnLkNPTVBJTEVSX0VSUk9SX0tFWSkpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIF9lcnJvcnMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIF9lcnJvcnMuZWxlbWVudEF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEyMDAsNyArMTIwNCw3IEBACiAgICAgICAgIGlmIChzaXplID4gMCkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG5ldyBFcnJvck1zZyhFcnJvck1zZy5DT01QSUxFUl9XQVJOSU5HX0tFWSkpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiAgIiArIF93YXJuaW5ncy5nZXQoaSkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAiICsgX3dhcm5pbmdzLmVsZW1lbnRBdChpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjEzLDQyICsxMjE3LDQyIEBACiAgICAgICAgIGNhc2UgQ29uc3RhbnRzLklOVEVSTkFMOgogICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvcnMsIHN1Y2ggYXMgbnVsbC1wdHIgZXhjZXB0aW9ucywgZXRjLgogICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgdGVybWluYXRlcyBjb21waWxhdGlvbiwgbm8gdHJhbnNsZXQgcHJvZHVjZWQKLSAgICAgICAgICAgIF9lcnJvcnMuYWRkKGVycm9yKTsKKyAgICAgICAgICAgIF9lcnJvcnMuYWRkRWxlbWVudChlcnJvcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDb25zdGFudHMuVU5TVVBQT1JURUQ6CiAgICAgICAgICAgICAvLyBYU0xUIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbXBsZW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQgZXh0LgogICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgdGVybWluYXRlcyBjb21waWxhdGlvbiwgbm8gdHJhbnNsZXQgcHJvZHVjZWQKLSAgICAgICAgICAgIF9lcnJvcnMuYWRkKGVycm9yKTsKKyAgICAgICAgICAgIF9lcnJvcnMuYWRkRWxlbWVudChlcnJvcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDb25zdGFudHMuRkFUQUw6CiAgICAgICAgICAgICAvLyBGYXRhbCBlcnJvciBpbiB0aGUgc3R5bGVzaGVldCBpbnB1dCAocGFyc2luZyBvciBjb250ZW50KQogICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgdGVybWluYXRlcyBjb21waWxhdGlvbiwgbm8gdHJhbnNsZXQgcHJvZHVjZWQKLSAgICAgICAgICAgIF9lcnJvcnMuYWRkKGVycm9yKTsKKyAgICAgICAgICAgIF9lcnJvcnMuYWRkRWxlbWVudChlcnJvcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDb25zdGFudHMuRVJST1I6CiAgICAgICAgICAgICAvLyBPdGhlciBlcnJvciBpbiB0aGUgc3R5bGVzaGVldCBpbnB1dCAocGFyc2luZyBvciBjb250ZW50KQogICAgICAgICAgICAgLy8gRG9lcyBub3QgdGVybWluYXRlIGNvbXBpbGF0aW9uLCBubyB0cmFuc2xldCBwcm9kdWNlZAotICAgICAgICAgICAgX2Vycm9ycy5hZGQoZXJyb3IpOworICAgICAgICAgICAgX2Vycm9ycy5hZGRFbGVtZW50KGVycm9yKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIENvbnN0YW50cy5XQVJOSU5HOgogICAgICAgICAgICAgLy8gT3RoZXIgZXJyb3IgaW4gdGhlIHN0eWxlc2hlZXQgaW5wdXQgKGNvbnRlbnQgZXJyb3JzIG9ubHkpCiAgICAgICAgICAgICAvLyBEb2VzIG5vdCB0ZXJtaW5hdGUgY29tcGlsYXRpb24sIGEgdHJhbnNsZXQgaXMgcHJvZHVjZWQKLSAgICAgICAgICAgIF93YXJuaW5ncy5hZGQoZXJyb3IpOworICAgICAgICAgICAgX3dhcm5pbmdzLmFkZEVsZW1lbnQoZXJyb3IpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgQXJyYXlMaXN0PEVycm9yTXNnPiBnZXRFcnJvcnMoKSB7CisgICAgcHVibGljIFZlY3RvciBnZXRFcnJvcnMoKSB7CiAgICAgICAgIHJldHVybiBfZXJyb3JzOwogICAgIH0KIAotICAgIHB1YmxpYyBBcnJheUxpc3Q8RXJyb3JNc2c+IGdldFdhcm5pbmdzKCkgeworICAgIHB1YmxpYyBWZWN0b3IgZ2V0V2FybmluZ3MoKSB7CiAgICAgICAgIHJldHVybiBfd2FybmluZ3M7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBTQVgyIENvbnRlbnRIYW5kbGVyIElOVEVSRkFDRSAqKioqKioqKioqKioqKioqKi8KIAotICAgIHByaXZhdGUgU3RhY2s8U3ludGF4VHJlZU5vZGU+IF9wYXJlbnRTdGFjayA9IG51bGw7CisgICAgcHJpdmF0ZSBTdGFjayBfcGFyZW50U3RhY2sgPSBudWxsOwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBfcHJlZml4TWFwcGluZyA9IG51bGw7CiAKICAgICAvKioKQEAgLTEyNTgsNyArMTI2Miw3IEBACiAgICAgICAgIF9yb290ID0gbnVsbDsKICAgICAgICAgX3RhcmdldCA9IG51bGw7CiAgICAgICAgIF9wcmVmaXhNYXBwaW5nID0gbnVsbDsKLSAgICAgICAgX3BhcmVudFN0YWNrID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgX3BhcmVudFN0YWNrID0gbmV3IFN0YWNrKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzE0LDcgKzEzMTgsNyBAQAogICAgICAgICAgICAgX3Jvb3QgPSBlbGVtZW50OwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgU3ludGF4VHJlZU5vZGUgcGFyZW50ID0gX3BhcmVudFN0YWNrLnBlZWsoKTsKKyAgICAgICAgICAgIFN5bnRheFRyZWVOb2RlIHBhcmVudCA9IChTeW50YXhUcmVlTm9kZSlfcGFyZW50U3RhY2sucGVlaygpOwogICAgICAgICAgICAgcGFyZW50LmFkZEVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgICAgICBlbGVtZW50LnNldFBhcmVudChwYXJlbnQpOwogICAgICAgICB9CkBAIC0xMzQ1LDcgKzEzNDksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKICAgICAgICAgU3RyaW5nIHN0cmluZyA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgICAgICBTeW50YXhUcmVlTm9kZSBwYXJlbnQgPSBfcGFyZW50U3RhY2sucGVlaygpOworICAgICAgICBTeW50YXhUcmVlTm9kZSBwYXJlbnQgPSAoU3ludGF4VHJlZU5vZGUpX3BhcmVudFN0YWNrLnBlZWsoKTsKIAogICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1N0eWxlc2hlZXQuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9TdHlsZXNoZWV0LmphdmEKaW5kZXggMDkwNjFlYS4uNTg5NDk5NiAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1N0eWxlc2hlZXQuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvU3R5bGVzaGVldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQpAQCAtMzEsNyArMzEsNiBAQAogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS5iY2VsLmludGVybmFsLmdlbmVyaWMuR0VUU1RBVElDOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS5iY2VsLmludGVybmFsLmdlbmVyaWMuSU5WT0tFSU5URVJGQUNFOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS5iY2VsLmludGVybmFsLmdlbmVyaWMuSU5WT0tFU1BFQ0lBTDsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUuYmNlbC5pbnRlcm5hbC5nZW5lcmljLklOVk9LRVNUQVRJQzsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUuYmNlbC5pbnRlcm5hbC5nZW5lcmljLklOVk9LRVZJUlRVQUw7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLmJjZWwuaW50ZXJuYWwuZ2VuZXJpYy5JU1RPUkU7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLmJjZWwuaW50ZXJuYWwuZ2VuZXJpYy5JbnN0cnVjdGlvbkhhbmRsZTsKQEAgLTEyNTMsMTAgKzEyNTIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0dlbi5nZXRDb25zdGFudFBvb2woKSk7CiAgICAgICAgIHRyYW5zZi5hZGRFeGNlcHRpb24oImNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy5UcmFuc2xldEV4Y2VwdGlvbiIpOwogCi0gICAgICAgIC8vIGNhbGwgcmVzZXRQcmVmaXhJbmRleCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRyYW5zZm9ybQotICAgICAgICBmaW5hbCBpbnQgY2hlY2sgPSBjcGcuYWRkTWV0aG9kcmVmKEJBU0lTX0xJQlJBUllfQ0xBU1MsICJyZXNldFByZWZpeEluZGV4IiwgIigpViIpOwotICAgICAgICBpbC5hcHBlbmQobmV3IElOVk9LRVNUQVRJQyhjaGVjaykpOwotCiAgICAgICAgIC8vIERlZmluZSBhbmQgaW5pdGlhbGl6ZSBjdXJyZW50IHdpdGggdGhlIHJvb3Qgbm9kZQogICAgICAgICBmaW5hbCBMb2NhbFZhcmlhYmxlR2VuIGN1cnJlbnQgPQogICAgICAgICAgICAgdHJhbnNmLmFkZExvY2FsVmFyaWFibGUoImN1cnJlbnQiLApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1N5bnRheFRyZWVOb2RlLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvU3ludGF4VHJlZU5vZGUuamF2YQppbmRleCAwMWVmMzhiLi4xZThhZDg2IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvU3ludGF4VHJlZU5vZGUuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvU3ludGF4VHJlZU5vZGUuamF2YQpAQCAtNzMsNyArNzMsNyBAQAogICAgIHByb3RlY3RlZCBRTmFtZSBfcW5hbWU7ICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBRTmFtZQogICAgIHByaXZhdGUgaW50IF9saW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgZmlsZSBsaW5lIG51bWJlcgogICAgIHByb3RlY3RlZCBBdHRyaWJ1dGVzSW1wbCBfYXR0cmlidXRlcyA9IG51bGw7ICAgLy8gQXR0cmlidXRlcyBvZiB0aGlzIGVsZW1lbnQKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gX3ByZWZpeE1hcHBpbmcgPSBudWxsOyAvLyBOYW1lc3BhY2UgZGVjbGFyYXRpb25zCisgICAgcHJpdmF0ZSAgIE1hcDxTdHJpbmcsIFN0cmluZz4gX3ByZWZpeE1hcHBpbmcgPSBudWxsOyAvLyBOYW1lc3BhY2UgZGVjbGFyYXRpb25zCiAKICAgICAvLyBTZW50aW5lbCAtIHVzZWQgdG8gZGVub3RlIHVucmVjb2duaXNlZCBzeW50YXh0IHRyZWUgbm9kZXMuCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTeW50YXhUcmVlTm9kZSBEdW1teSA9IG5ldyBBYnNvbHV0ZVBhdGhQYXR0ZXJuKG51bGwpOwpAQCAtODI5LDcgKzgyOSw3IEBACiAgICAgICogQHBhcmFtIHBvcyBUaGUgY2hpbGQgbm9kZSdzIHBvc2l0aW9uLgogICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIG5vZGUuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN5bnRheFRyZWVOb2RlIGVsZW1lbnRBdChpbnQgcG9zKSB7CisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBlbGVtZW50QXQoaW50IHBvcykgewogICAgICAgICByZXR1cm4gX2NvbnRlbnRzLmdldChwb3MpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1hTTFRDLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvWFNMVEMuamF2YQppbmRleCA2MzFlZGJkLi4zMjE4MTgxIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvWFNMVEMuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvWFNMVEMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKQEAgLTE3LDYgKzE3LDkgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisvKgorICogJElkOiBYU0xUQy5qYXZhLHYgMS4yLjQuMSAyMDA1LzA5LzA1IDA5OjUxOjM4IHB2ZWR1bGEgRXhwICQKKyAqLwogCiBwYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy5jb21waWxlcjsKIApAQCAtMzYsNyArMzksNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwpAQCAtMjgxLDcgKzI4Myw3IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBGdW5jdGlvbiBsb2FkcyBhbiBleHRlcm5hbCBleHRlbnNpb24gZnVuY3Rpb24uCisgICAgICogRnVuY3Rpb24gbG9hZHMgYW4gZXh0ZXJuYWwgZXh0ZW5zaW9uIGZ1bmN0aW9ucy4KICAgICAgKiBUaGUgZmlsdGVyaW5nIG9mIGZ1bmN0aW9uIHR5cGVzIChleHRlcm5hbCxpbnRlcm5hbCkgdGFrZXMgcGxhY2UgaW4gRnVuY3Rpb25DYWxsIGNsYXNzCiAgICAgICoKICAgICAgKi8KQEAgLTU5NiwxOCArNTk4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgY29tcGlsZSBlcnJvciBtZXNzYWdlcwotICAgICAqIEByZXR1cm4gQSBMaXN0IGNvbnRhaW5pbmcgYWxsIGNvbXBpbGUgZXJyb3IgbWVzc2FnZXMKKyAgICAgKiBHZXQgYSBWZWN0b3IgY29udGFpbmluZyBhbGwgY29tcGlsZSBlcnJvciBtZXNzYWdlcworICAgICAqIEByZXR1cm4gQSBWZWN0b3IgY29udGFpbmluZyBhbGwgY29tcGlsZSBlcnJvciBtZXNzYWdlcwogICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3Q8RXJyb3JNc2c+IGdldEVycm9ycygpIHsKKyAgICBwdWJsaWMgVmVjdG9yIGdldEVycm9ycygpIHsKICAgICAgICAgcmV0dXJuIF9wYXJzZXIuZ2V0RXJyb3JzKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IGEgbGlzdCBvZiBhbGwgY29tcGlsZSB3YXJuaW5nIG1lc3NhZ2VzCi0gICAgICogQHJldHVybiBBIExpc3QgY29udGFpbmluZyBhbGwgY29tcGlsZSBlcnJvciBtZXNzYWdlcworICAgICAqIEdldCBhIFZlY3RvciBjb250YWluaW5nIGFsbCBjb21waWxlIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgKiBAcmV0dXJuIEEgVmVjdG9yIGNvbnRhaW5pbmcgYWxsIGNvbXBpbGUgZXJyb3IgbWVzc2FnZXMKICAgICAgKi8KLSAgICBwdWJsaWMgQXJyYXlMaXN0PEVycm9yTXNnPiBnZXRXYXJuaW5ncygpIHsKKyAgICBwdWJsaWMgVmVjdG9yIGdldFdhcm5pbmdzKCkgewogICAgICAgICByZXR1cm4gX3BhcnNlci5nZXRXYXJuaW5ncygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1hzbEVsZW1lbnQuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9jb21waWxlci9Yc2xFbGVtZW50LmphdmEKaW5kZXggZTk0ZWJiMS4uZTA0YmFiNyAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL2NvbXBpbGVyL1hzbEVsZW1lbnQuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvY29tcGlsZXIvWHNsRWxlbWVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQpAQCAtMTcsNiArMTcsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiAkSWQ6IFhzbEVsZW1lbnQuamF2YSx2IDEuMi40LjEgMjAwNS8wOS8xMiAxMTozOTo1NSBwdmVkdWxhIEV4cCAkCisgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMuY29tcGlsZXI7CiAKQEAgLTU3LDYgKzYwLDE0IEBACiAgICAgICAgIGRpc3BsYXlDb250ZW50cyhpbmRlbnQgKyBJbmRlbnRJbmNyZW1lbnQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG5vdyBkZXByZWNhdGVkLiBUaGUgbmV3IGltcGxlbWF0aW9uIG9mIHRoaXMgY2xhc3MKKyAgICAgKiBuZXZlciBkZWNsYXJlcyB0aGUgZGVmYXVsdCBOUy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBkZWNsYXJlc0RlZmF1bHROUygpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHBhcnNlQ29udGVudHMoUGFyc2VyIHBhcnNlcikgewogICAgICAgICBmaW5hbCBTeW1ib2xUYWJsZSBzdGFibGUgPSBwYXJzZXIuZ2V0U3ltYm9sVGFibGUoKTsKIApAQCAtMTk5LDYgKzIxMCw3IEBACiAgICAgICogb24gdGhlIGhhbmRsZXIgKHZpaSkgZXZhbHVhdGVzIHRoZSBjb250ZW50cyAodmlpaSkgY2FsbHMgZW5kRWxlbWVudCgpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHRyYW5zbGF0ZShDbGFzc0dlbmVyYXRvciBjbGFzc0dlbiwgTWV0aG9kR2VuZXJhdG9yIG1ldGhvZEdlbikgeworICAgICAgICBMb2NhbFZhcmlhYmxlR2VuIGxvY2FsID0gbnVsbDsKICAgICAgICAgZmluYWwgQ29uc3RhbnRQb29sR2VuIGNwZyA9IGNsYXNzR2VuLmdldENvbnN0YW50UG9vbCgpOwogICAgICAgICBmaW5hbCBJbnN0cnVjdGlvbkxpc3QgaWwgPSBtZXRob2RHZW4uZ2V0SW5zdHJ1Y3Rpb25MaXN0KCk7CiAKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ydW50aW1lL0Jhc2lzTGlicmFyeS5qYXZhIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQmFzaXNMaWJyYXJ5LmphdmEKaW5kZXggODA0YjE1NC4uZGMzYTNjZSAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQmFzaXNMaWJyYXJ5LmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3J1bnRpbWUvQmFzaXNMaWJyYXJ5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICovCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCkBAIC00OCw3ICs0OCw2IEBACiBpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTE1MzEsMjUgKzE1MzAsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgaW4gdGhlIGV4ZWN1dGlvbiBvZiB4c2w6ZWxlbWVudCB0byBnZW5lcmF0ZQotICAgICAqIGFuZCByZXNldCBuYW1lc3BhY2UgcHJlZml4IGluZGV4IGxvY2FsIHRvIGN1cnJlbnQgdHJhbnNmb3JtYXRpb24gcHJvY2VzcworICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0aGUgZXhlY3V0aW9uIG9mIHhzbDplbGVtZW50CiAgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHByZWZpeEluZGV4ID0gMDsKKwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlUHJlZml4KCkgewotICAgICAgICByZXR1cm4gKCJucyIgKyB0aHJlYWRMb2NhbFByZWZpeEluZGV4LmdldCgpLmdldEFuZEluY3JlbWVudCgpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChCYXNpc0xpYnJhcnkuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoIm5zIiArIHByZWZpeEluZGV4KyspOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0UHJlZml4SW5kZXgoKSB7Ci0gICAgICAgIHRocmVhZExvY2FsUHJlZml4SW5kZXguZ2V0KCkuc2V0KDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPEF0b21pY0ludGVnZXI+IHRocmVhZExvY2FsUHJlZml4SW5kZXggPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWw8QXRvbWljSW50ZWdlcj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBBdG9taWNJbnRlZ2VyIGluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEF0b21pY0ludGVnZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9USU1FX0lOVEVSTkFMX0VSUiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJVTl9USU1FX0lOVEVSTkFMX0VSUiI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX1RJTUVfQ09QWV9FUlIgPQpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVGVtcGxhdGVzSGFuZGxlckltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy90cmF4L1RlbXBsYXRlc0hhbmRsZXJJbXBsLmphdmEKaW5kZXggYmNlMmMzYS4uOGJiYzU0MSAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVGVtcGxhdGVzSGFuZGxlckltcGwuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UZW1wbGF0ZXNIYW5kbGVySW1wbC5qYXZhCkBAIC0xLDEzICsxLDEzIEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogcmVzZXJ2ZWQgY29tbWVudCBibG9jaworICogRE8gTk9UIFJFTU9WRSBPUiBBTFRFUiEKICAqLwogLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBDb3B5cmlnaHQgMjAwMS0yMDA0IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKICAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCkBAIC0xNyw5ICsxNywxOCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiAkSWQ6IFRlbXBsYXRlc0hhbmRsZXJJbXBsLmphdmEsdiAxLjIuNC4xIDIwMDUvMDkvMDYgMTI6MDk6MDMgcHZlZHVsYSBFeHAgJAorICovCiAKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXg7CiAKK2ltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC5YYWxhbkNvbnN0YW50czsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMuY29tcGlsZXIuQ29tcGlsZXJFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLmNvbXBpbGVyLlBhcnNlcjsKQEAgLTI4LDE5ICszNywxNSBAQAogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC54c2x0Yy5jb21waWxlci5TeW50YXhUcmVlTm9kZTsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMuY29tcGlsZXIuWFNMVEM7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLmNvbXBpbGVyLnV0aWwuRXJyb3JNc2c7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVGVtcGxhdGVzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5UZW1wbGF0ZXNIYW5kbGVyOworCiBpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKIAoraW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgYSBKQVhQMS4xIFRlbXBsYXRlc0hhbmRsZXIKICAqIEBhdXRob3IgTW9ydGVuIEpvcmdlbnNlbgpAQCAtMjYzLDEzICsyNjgsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEVycm9yTXNnPiBlcnJvcnMgPSBfcGFyc2VyLmdldEVycm9ycygpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgVmVjdG9yIGVycm9ycyA9IF9wYXJzZXIuZ2V0RXJyb3JzKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZXJyb3JzLnNpemUoKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5sZW5ndGgoKSA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuYXBwZW5kKGVycm9ycy5nZXQoaSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS5hcHBlbmQoZXJyb3JzLmVsZW1lbnRBdChpKS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihFcnJvck1zZy5KQVhQX0NPTVBJTEVfRVJSLCBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCkpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy90cmF4L1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy90cmF4L1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YQppbmRleCBlMzBmZmZkLi5iMzdjOGY0IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvdHJheC9UcmFuc2Zvcm1lckZhY3RvcnlJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQpAQCAtMTcsNiArMTcsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKy8qCisgKiAkSWQ6IFRyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YSx2IDEuOCAyMDA3LzA0LzA5IDIxOjMwOjQxIGpvZWh3IEV4cCAkCisgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwueHNsdGMudHJheDsKIApAQCAtNDUsNyArNDgsNiBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwpAQCAtNTkwLDcgKzU5Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBJbmVmZmljaWVudCwgYnV0IGFycmF5IGlzIHNtYWxsCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9MDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoZmVhdHVyZXNbaV0pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CkBAIC03OTcsNyArNzk5LDcgQEAKICAgICAvKioKICAgICAgKiBQYXNzIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIGVycm9yIGxpc3RlbmVyCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NXYXJuaW5nc1RvTGlzdGVuZXIoQXJyYXlMaXN0PEVycm9yTXNnPiBtZXNzYWdlcykKKyAgICBwcml2YXRlIHZvaWQgcGFzc1dhcm5pbmdzVG9MaXN0ZW5lcihWZWN0b3IgbWVzc2FnZXMpCiAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKF9lcnJvckxpc3RlbmVyID09IG51bGwgfHwgbWVzc2FnZXMgPT0gbnVsbCkgewpAQCAtODA2LDcgKzgwOCw3IEBACiAgICAgICAgIC8vIFBhc3MgbWVzc2FnZXMgdG8gbGlzdGVuZXIsIG9uZSBieSBvbmUKICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbWVzc2FnZXMuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBjb3VudDsgcG9zKyspIHsKLSAgICAgICAgICAgIEVycm9yTXNnIG1zZyA9IG1lc3NhZ2VzLmdldChwb3MpOworICAgICAgICAgICAgRXJyb3JNc2cgbXNnID0gKEVycm9yTXNnKW1lc3NhZ2VzLmVsZW1lbnRBdChwb3MpOwogICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgdGhlIFRDSyBmYWlsdXJlIEVycm9yTGlzdGVuZXIuZXJyb3JUZXN0cy5lcnJvcjAwMS4KICAgICAgICAgICAgIGlmIChtc2cuaXNXYXJuaW5nRXJyb3IoKSkKICAgICAgICAgICAgICAgICBfZXJyb3JMaXN0ZW5lci5lcnJvcigKQEAgLTgyMCw3ICs4MjIsNyBAQAogICAgIC8qKgogICAgICAqIFBhc3MgZXJyb3IgbWVzc2FnZXMgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIGVycm9yIGxpc3RlbmVyCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhc3NFcnJvcnNUb0xpc3RlbmVyKEFycmF5TGlzdDxFcnJvck1zZz4gbWVzc2FnZXMpIHsKKyAgICBwcml2YXRlIHZvaWQgcGFzc0Vycm9yc1RvTGlzdGVuZXIoVmVjdG9yIG1lc3NhZ2VzKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgPT0gbnVsbCB8fCBtZXNzYWdlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtODI4LDcgKzgzMCw3IEBACiAgICAgICAgICAgICAvLyBQYXNzIG1lc3NhZ2VzIHRvIGxpc3RlbmVyLCBvbmUgYnkgb25lCiAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtZXNzYWdlcy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBjb3VudDsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IG1lc3NhZ2VzLmdldChwb3MpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtZXNzYWdlcy5lbGVtZW50QXQocG9zKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmVycm9yKG5ldyBUcmFuc2Zvcm1lckV4Y2VwdGlvbihtZXNzYWdlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwMDIsMzkgKzEwMDQsNDAgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIHdlbnQgd2VsbCBiZWZvcmUgcmV0dXJuaW5nCi0gICAgICAgIGlmIChieXRlY29kZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEVycm9yTXNnPiBlcnJzID0geHNsdGMuZ2V0RXJyb3JzKCk7Ci0gICAgICAgICAgICBFcnJvck1zZyBlcnI7Ci0gICAgICAgICAgICBpZiAoZXJycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gZXJycy5nZXQoZXJycy5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yTXNnKEVycm9yTXNnLkpBWFBfQ09NUElMRV9FUlIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXJyLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXhjOwotICAgICAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBleGMgPSAgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihjYXVzZS5nZXRNZXNzYWdlKCksIGNhdXNlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhjID0gIG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oZXJyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBQYXNzIGNvbXBpbGVyIGVycm9ycyB0byB0aGUgZXJyb3IgbGlzdGVuZXIKLSAgICAgICAgICAgIGlmIChfZXJyb3JMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGFzc0Vycm9yc1RvTGlzdGVuZXIoeHNsdGMuZ2V0RXJyb3JzKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gQXMgcmVxdWlyZWQgYnkgVENLIDEuMiwgc2VuZCBhIGZhdGFsRXJyb3IgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IgbGlzdGVuZXIgYmVjYXVzZSBjb21waWxhdGlvbiBvZiB0aGUgc3R5bGVzaGVldAotICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBhbmQgbm8gZnVydGhlciBwcm9jZXNzaW5nIHdpbGwgYmUgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgX2Vycm9yTGlzdGVuZXIuZmF0YWxFcnJvcihleGMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlbGwsIHdlIHRyaWVkLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgeHNsdGMucHJpbnRFcnJvcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IGV4YzsKKyAgICBpZiAoYnl0ZWNvZGVzID09IG51bGwpIHsKKyAgICAgICAgVmVjdG9yIGVycnMgPSB4c2x0Yy5nZXRFcnJvcnMoKTsKKyAgICAgICAgRXJyb3JNc2cgZXJyOworICAgICAgICBpZiAoZXJycyAhPSBudWxsKSB7CisgICAgICAgICAgICBlcnIgPSAoRXJyb3JNc2cpZXJycy5lbGVtZW50QXQoZXJycy5zaXplKCktMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3JNc2coRXJyb3JNc2cuSkFYUF9DT01QSUxFX0VSUik7CiAgICAgICAgIH0KKyAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXJyLmdldENhdXNlKCk7CisgICAgICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleGM7CisgICAgICAgIGlmIChjYXVzZSAhPSBudWxsKSB7CisgICAgICAgICAgICBleGMgPSAgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihjYXVzZS5nZXRNZXNzYWdlKCksIGNhdXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4YyA9ICBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKGVyci50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhc3MgY29tcGlsZXIgZXJyb3JzIHRvIHRoZSBlcnJvciBsaXN0ZW5lcgorICAgICAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFzc0Vycm9yc1RvTGlzdGVuZXIoeHNsdGMuZ2V0RXJyb3JzKCkpOworCisgICAgICAgICAgICAvLyBBcyByZXF1aXJlZCBieSBUQ0sgMS4yLCBzZW5kIGEgZmF0YWxFcnJvciB0byB0aGUKKyAgICAgICAgICAgIC8vIGVycm9yIGxpc3RlbmVyIGJlY2F1c2UgY29tcGlsYXRpb24gb2YgdGhlIHN0eWxlc2hlZXQKKyAgICAgICAgICAgIC8vIGZhaWxlZCBhbmQgbm8gZnVydGhlciBwcm9jZXNzaW5nIHdpbGwgYmUgcG9zc2libGUuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIF9lcnJvckxpc3RlbmVyLmZhdGFsRXJyb3IoZXhjKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICAgICAgLy8gd2VsbCwgd2UgdHJpZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB4c2x0Yy5wcmludEVycm9ycygpOworICAgICAgICB9CisgICAgICAgIHRocm93IGV4YzsKKyAgICB9CiAKICAgICAgICAgcmV0dXJuIG5ldyBUZW1wbGF0ZXNJbXBsKGJ5dGVjb2RlcywgdHJhbnNsZXROYW1lLAogICAgICAgICAgICAgeHNsdGMuZ2V0T3V0cHV0UHJvcGVydGllcygpLCBfaW5kZW50TnVtYmVyLCB0aGlzKTsKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvZG9tL0Fib3J0RXhjZXB0aW9uLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2RvbS9BYm9ydEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE3OGRkLi4wMDAwMDAwCi0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvZG9tL0Fib3J0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwuZG9tOwotCi1wdWJsaWMgY2xhc3MgQWJvcnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNjA4MzAyMTc1NDc1NzQwNDE3TDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgQWJvcnRFeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBYm9ydEV4Y2VwdGlvbigpIHsgc3VwZXIobnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlKTsgfQotfQpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9kb20vRE9NTm9ybWFsaXplci5qYXZhIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9kb20vRE9NTm9ybWFsaXplci5qYXZhCmluZGV4IGM0MjY4ZGMuLjM3NThmMzkgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvZG9tL0RPTU5vcm1hbGl6ZXIuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2RvbS9ET01Ob3JtYWxpemVyLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5kb20uQWJvcnRFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsLkNvbnN0YW50czsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGwuUmV2YWxpZGF0aW9uSGFuZGxlcjsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGwuZHRkLkRUREdyYW1tYXI7CkBAIC0xNTksNiArMTU4LDExIEBACiAgICAgLy8gYXR0cmlidXRlIHZhbHVlIG5vcm1hbGl6YXRpb24KICAgICBmaW5hbCBYTUxTdHJpbmcgZk5vcm1hbGl6ZWRWYWx1ZSA9IG5ldyBYTUxTdHJpbmcobmV3IGNoYXJbMTZdLCAwLCAwKTsKIAorICAgIC8qKgorICAgICAqIElmIHRoZSB1c2VyIHN0b3BzIHRoZSBwcm9jZXNzLCB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gYWJvcnQgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworCiAgICAgLy9EVEQgdmFsaWRhdG9yCiAgICAgcHJpdmF0ZSBYTUxEVERWYWxpZGF0b3IgZkRURFZhbGlkYXRvcjsKIApAQCAtMjM5LDEwICsyNDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSwgZlZhbGlkYXRpb25IYW5kbGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlZhbGlkYXRpb25IYW5kbGVyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBYm9ydEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsgICAgLy8gb3RoZXJ3aXNlIHJlLXRocm93LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiggZT09YWJvcnQgKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gcHJvY2Vzc2luZyBhYm9ydGVkIGJ5IHRoZSB1c2VyCisgICAgICAgICAgICB0aHJvdyBlOyAgICAvLyBvdGhlcndpc2UgcmUtdGhyb3cuCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgIH0KQEAgLTEzNjcsMTAgKzEzNzIsMTAgQEAKICAgICAgICAgICAgIGVycm9yLmZSZWxhdGVkRGF0YSA9IGxvY2F0b3IuZlJlbGF0ZWROb2RlOwogCiAgICAgICAgICAgICBpZighZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycm9yKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQWJvcnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBhYm9ydDsKICAgICAgICAgfQogICAgICAgICBpZiggc2V2ZXJpdHk9PURPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SICkKLSAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhyb3cgYWJvcnQ7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlUU5hbWUgKE5vZGUgbm9kZSwgUU5hbWUgcW5hbWUpewpAQCAtMjAzOSw0ICsyMDQ0LDUgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisKIH0gIC8vIERPTU5vcm1hbGl6ZXIgY2xhc3MKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUwxMUVudGl0eVNjYW5uZXIuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUwxMUVudGl0eVNjYW5uZXIuamF2YQppbmRleCBlMjlkMjk2Li5hYzI2ZjgwIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MMTFFbnRpdHlTY2FubmVyLmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTDExRW50aXR5U2Nhbm5lci5qYXZhCkBAIC03NTIsNyArNzUyLDcgQEAKICAgICAgICAgICAgIGxvYWQoMCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7Ci0gICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMSk7CisgICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMCk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LmNvdW50IC0gMV07CiAgICAgICAgICAgICBsb2FkKDEsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IDA7CkBAIC05MDQsNyArOTA0LDcgQEAKICAgICAgICAgICAgIGxvYWQoMCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7Ci0gICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMSk7CisgICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMCk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LmNvdW50IC0gMV07CiAgICAgICAgICAgICBsb2FkKDEsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5zdGFydFBvc2l0aW9uID0gMDsKQEAgLTEzNTIsNyArMTM1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUxpc3RlbmVycygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkN1cnJlbnRFbnRpdHkuY2hbMF0gPSAoY2hhciljOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eUNoYW5nZWQgPSBsb2FkKDEsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eUNoYW5nZWQpIHsKQEAgLTE0MDYsOSArMTQwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZDdXJyZW50RW50aXR5LmxpbmVOdW1iZXIrKzsKICAgICAgICAgICAgICAgICAgICAgZkN1cnJlbnRFbnRpdHkuY29sdW1uTnVtYmVyID0gMTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlTGlzdGVuZXJzKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgZkN1cnJlbnRFbnRpdHkuY2hbMF0gPSAoY2hhciljOwotICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5Q2hhbmdlZCA9IGxvYWQoMSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5Q2hhbmdlZCA9IGxvYWQoMSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVudGl0eUNoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZCBjaGFuZ2UgdGhlIHBvc2l0aW9uIHRvIGJlIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byByZXN0b3JlIGl0IHdoZW4gZW50aXR5IG5vdCBjaGFuZ2VkCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRFREU2Nhbm5lckltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEVERTY2FubmVySW1wbC5qYXZhCmluZGV4IGQ2M2RmNjQuLjEzNWViNWUgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEVERTY2FubmVySW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEVERTY2FubmVySW1wbC5qYXZhCkBAIC0zLDEzICszLDExIEBACiAgKi8KIAogLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KKyAqIENvcHlyaWdodCAyMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKICAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgpAQCAtMjEsMTkgKzE5LDE3IEBACiAgKi8KIAogcGFja2FnZSBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGw7CitpbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmR0ZC5ub252YWxpZGF0aW5nLkRUREdyYW1tYXI7CitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwuaW1wbC5Db25zdGFudHM7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsLm1zZy5YTUxNZXNzYWdlRm9ybWF0dGVyOwogCi1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsLlhNTEVudGl0eUhhbmRsZXI7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlsLlN5bWJvbFRhYmxlOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbC5YTUxBdHRyaWJ1dGVzSW1wbDsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWwuWE1MQ2hhcjsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWwuWE1MU3RyaW5nQnVmZmVyOwogCi1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy5YTUxMaW1pdEFuYWx5emVyOwotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuWE1MU2VjdXJpdHlNYW5hZ2VyOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwueG5pLlhNTERURENvbnRlbnRNb2RlbEhhbmRsZXI7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkuWE1MRFRESGFuZGxlcjsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7CkBAIC00NSw5ICs0MSw4IEBACiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkucGFyc2VyLlhNTERURFNjYW5uZXI7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkucGFyc2VyLlhNTElucHV0U291cmNlOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgY29tLnN1bi54bWwuaW50ZXJuYWwuc3RyZWFtLmR0ZC5ub252YWxpZGF0aW5nLkRUREdyYW1tYXI7Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLlhNTExpbWl0QW5hbHl6ZXI7CitpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy5YTUxTZWN1cml0eU1hbmFnZXI7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igc2Nhbm5pbmcgdGhlIGRlY2xhcmF0aW9ucyBmb3VuZApAQCAtMzkxLDI1ICszODYsMTUgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBza2lwRFREKGJvb2xlYW4gc3VwcG9ydERURCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN1cHBvcnREVEQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgZlN0cmluZ0J1ZmZlci5jbGVhcigpOwotICAgICAgICB3aGlsZSAoZkVudGl0eVNjYW5uZXIuc2NhbkRhdGEoIl0iLCBmU3RyaW5nQnVmZmVyKSkgewotICAgICAgICAgICAgaW50IGMgPSBmRW50aXR5U2Nhbm5lci5wZWVrQ2hhcigpOwotICAgICAgICAgICAgaWYgKGMgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoYykpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NhblN1cnJvZ2F0ZXMoZlN0cmluZ0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpc0ludmFsaWRMaXRlcmFsKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3IoIkludmFsaWRDaGFySW5EVEQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgSW50ZWdlci50b0hleFN0cmluZyhjKSB9KTsKLSAgICAgICAgICAgICAgICAgICAgZkVudGl0eVNjYW5uZXIuc2NhbkNoYXIobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoIXN1cHBvcnREVEQpIHsKKyAgICAgICAgICAgIGZTdHJpbmdCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmICghZkVudGl0eVNjYW5uZXIuc2NhbkRhdGEoIl0iLCBmU3RyaW5nQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGZFbnRpdHlTY2FubmVyLmZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGZFbnRpdHlTY2FubmVyLmZDdXJyZW50RW50aXR5LnBvc2l0aW9uLS07Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8KZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEb2N1bWVudEZyYWdtZW50U2Nhbm5lckltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEb2N1bWVudEZyYWdtZW50U2Nhbm5lckltcGwuamF2YQppbmRleCA2ZDE5N2M1Li5lZjExOGYwIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50RnJhZ21lbnRTY2FubmVySW1wbC5qYXZhCkBAIC0zLDE0ICszLDEzIEBACiAgKi8KIAogLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBDb3B5cmlnaHQgMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsOwogCiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsLm1zZy5YTUxNZXNzYWdlRm9ybWF0dGVyOwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50U2Nhbm5lckltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEb2N1bWVudFNjYW5uZXJJbXBsLmphdmEKaW5kZXggNmM2MjM0NS4uNDMzMDQ5MiAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50U2Nhbm5lckltcGwuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRTY2FubmVySW1wbC5qYXZhCkBAIC0zLDE0ICszLDEzIEBACiAgKi8KIAogLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBDb3B5cmlnaHQgMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMCw3IEBACiAKIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5pbXBsOwogCisKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGwuZHRkLlhNTERURERlc2NyaXB0aW9uOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwuaW1wbC52YWxpZGF0aW9uLlZhbGlkYXRpb25NYW5hZ2VyOwogaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbC5OYW1lc3BhY2VTdXBwb3J0OwpAQCAtMTEwNyw3ICsxMTA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vcmVUb1NjYW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIGRvY3R5cGUgZGVjbGFyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmRW50aXR5U2Nhbm5lci5za2lwQ2hhcignXScsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRGYXRhbEVycm9yKCJEb2N0eXBlZGVjbE5vdENsb3NlZCIsIG5ldyBPYmplY3RbXXtmRG9jdHlwZU5hbWV9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsRXJyb3IoIkVYUEVDVEVEX1NRVUFSRV9CUkFDS0VUX1RPX0NMT1NFX0lOVEVSTkFMX1NVQlNFVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZFbnRpdHlTY2FubmVyLnNraXBTcGFjZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmRW50aXR5U2Nhbm5lci5za2lwQ2hhcignPicsIG51bGwpKSB7CmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRW50aXR5U2Nhbm5lci5qYXZhIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTEVudGl0eVNjYW5uZXIuamF2YQppbmRleCBmZjAyYmJhLi44YjAyYjJlIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRW50aXR5U2Nhbm5lci5qYXZhCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxFbnRpdHlTY2FubmVyLmphdmEKQEAgLTQ0LDggKzQ0LDggQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgogICogSW1wbGVtZW50cyB0aGUgZW50aXR5IHNjYW5uZXIgbWV0aG9kcy4KQEAgLTU4LDEwICs1OCwxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgWE1MRW50aXR5U2Nhbm5lciBpbXBsZW1lbnRzIFhNTExvY2F0b3IgIHsKIAotICAgIHByb3RlY3RlZCBFbnRpdHkuU2Nhbm5lZEVudGl0eSBmQ3VycmVudEVudGl0eSA9IG51bGw7CisKKyAgICBwcm90ZWN0ZWQgRW50aXR5LlNjYW5uZWRFbnRpdHkgZkN1cnJlbnRFbnRpdHkgPSBudWxsIDsKICAgICBwcm90ZWN0ZWQgaW50IGZCdWZmZXJTaXplID0gWE1MRW50aXR5TWFuYWdlci5ERUZBVUxUX0JVRkZFUl9TSVpFOwogCi0gICAgcHJvdGVjdGVkIFhNTEVudGl0eU1hbmFnZXIgZkVudGl0eU1hbmFnZXI7CisgICAgcHJvdGVjdGVkIFhNTEVudGl0eU1hbmFnZXIgZkVudGl0eU1hbmFnZXIgOwogCiAgICAgLyoqIFNlY3VyaXR5IG1hbmFnZXIuICovCiAgICAgcHJvdGVjdGVkIFhNTFNlY3VyaXR5TWFuYWdlciBmU2VjdXJpdHlNYW5hZ2VyID0gbnVsbDsKQEAgLTcxLDkgKzcyLDggQEAKIAogICAgIC8qKiBEZWJ1ZyBzd2l0Y2hpbmcgcmVhZGVycyBmb3IgZW5jb2RpbmdzLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfRU5DT0RJTkdTID0gZmFsc2U7Ci0KICAgICAvKiogTGlzdGVuZXJzIHdoaWNoIHNob3VsZCBrbm93IHdoZW4gbG9hZCBpcyBiZWluZyBjYWxsZWQgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxYTUxCdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBbXSBWQUxJRF9OQU1FUyA9IG5ldyBib29sZWFuWzEyN107CiAKQEAgLTE0MCwxMCArMTQwLDkgQEAKICAgICAgICAgVkFMSURfTkFNRVNbNThdPXRydWU7CiAgICAgICAgIFZBTElEX05BTUVTWzk1XT10cnVlOwogICAgIH0KLQotICAgIC8vIFJlbWVtYmVyLCB0aGF0IHRoZSBYTUwgdmVyc2lvbiBoYXMgZXhwbGljaXRseSBiZWVuIHNldCwKKyAgICAvLyBTQVBKVk06IFJlbWVtYmVyLCB0aGF0IHRoZSBYTUwgdmVyc2lvbiBoYXMgZXhwbGljaXRseSBiZWVuIHNldCwKICAgICAvLyBzbyB0aGF0IFhNTFN0cmVhbVJlYWRlci5nZXRWZXJzaW9uKCkgY2FuIGZpbmQgdGhhdCBvdXQuCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geG1sVmVyc2lvblNldEV4cGxpY2l0bHkgPSBmYWxzZTsKKyAgICBib29sZWFuIHhtbFZlcnNpb25TZXRFeHBsaWNpdGx5ID0gZmFsc2U7CiAKICAgICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgb3BlcmF0aW9uIGlzIGZvciBkZXRlY3RpbmcgWE1MIHZlcnNpb24KICAgICBib29sZWFuIGRldGVjdGluZ1ZlcnNpb24gPSBmYWxzZTsKQEAgLTI2Miw3ICsyNjEsNyBAQAogICAgICAqIEBwYXJhbSB4bWxWZXJzaW9uIHRoZSBYTUwgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBlbnRpdHkKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRYTUxWZXJzaW9uKFN0cmluZyB4bWxWZXJzaW9uKSB7Ci0gICAgICAgIHhtbFZlcnNpb25TZXRFeHBsaWNpdGx5ID0gdHJ1ZTsKKyAgICAgICAgeG1sVmVyc2lvblNldEV4cGxpY2l0bHkgPSB0cnVlOyAvLyBTQVBKVk0KICAgICAgICAgZkN1cnJlbnRFbnRpdHkueG1sVmVyc2lvbiA9IHhtbFZlcnNpb247CiAgICAgfSAvLyBzZXRYTUxWZXJzaW9uKFN0cmluZykKIApAQCAtNTU0LDcgKzU1Myw4IEBACiAgICAgICAgIC8vIHNjYW4gY2hhcmFjdGVyCiAgICAgICAgIGludCBvZmZzZXQgPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbjsKICAgICAgICAgaW50IGMgPSBmQ3VycmVudEVudGl0eS5jaFtmQ3VycmVudEVudGl0eS5wb3NpdGlvbisrXTsKLSAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCAoYyA9PSAnXHInICYmIGlzRXh0ZXJuYWwpKSB7CisgICAgICAgIGlmIChjID09ICdcbicgfHwKKyAgICAgICAgICAgICAgICAoYyA9PSAnXHInICYmIGlzRXh0ZXJuYWwpKSB7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jb2x1bW5OdW1iZXIgPSAxOwogICAgICAgICAgICAgaWYgKGZDdXJyZW50RW50aXR5LnBvc2l0aW9uID09IGZDdXJyZW50RW50aXR5LmNvdW50KSB7CkBAIC0xMDI3LDcgKzEwMjcsNyBAQAogICAgICAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKICAgICAgICAgICAgIGxvYWQoMCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7Ci0gICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMSk7CisgICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMCk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LmNvdW50IC0gMV07CiAgICAgICAgICAgICBsb2FkKDEsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IDA7CkBAIC0xMTg2LDcgKzExODYsNyBAQAogICAgICAgICBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQpIHsKICAgICAgICAgICAgIGxvYWQoMCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gPT0gZkN1cnJlbnRFbnRpdHkuY291bnQgLSAxKSB7Ci0gICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMSk7CisgICAgICAgICAgICBpbnZva2VMaXN0ZW5lcnMoMCk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5jaFswXSA9IGZDdXJyZW50RW50aXR5LmNoW2ZDdXJyZW50RW50aXR5LmNvdW50IC0gMV07CiAgICAgICAgICAgICBsb2FkKDEsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9IDA7CkBAIC0xMzM5LDggKzEzMzksOCBAQAogICAgICAqIDxwPgogICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnN1bWVkLgogICAgICAqIDxwPgotICAgICAqIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGRlbGltaXRlciBjb250YWlucyBhdAotICAgICAqIGxlYXN0IG9uZSBjaGFyYWN0ZXIuCisgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBkZWxpbWl0ZXIKKyAgICAgKiBhbmQgdGhhdCB0aGUgZGVsaW1pdGVyIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIuCiAgICAgICogPHA+CiAgICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBndWFyYW50ZWUgdG8gcmV0dXJuCiAgICAgICogdGhlIGxvbmdlc3QgcnVuIG9mIGNoYXJhY3RlciBkYXRhLiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIGJlZm9yZQpAQCAtMTUyMyw3ICsxNTIzLDcgQEAKICAgICAgICAgfSB3aGlsZSAoIWRvbmUpOwogICAgICAgICByZXR1cm4gIWRvbmU7CiAKLSAgICB9IC8vIHNjYW5EYXRhKFN0cmluZywgWE1MU3RyaW5nQnVmZmVyKQorICAgIH0gLy8gc2NhbkRhdGEoU3RyaW5nLFhNTFN0cmluZykKIAogICAgIC8qKgogICAgICAqIFNraXBzIGEgY2hhcmFjdGVyIGFwcGVhcmluZyBpbW1lZGlhdGVseSBvbiB0aGUgaW5wdXQuCkBAIC0xNjUwLDcgKzE2NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICBmQ3VycmVudEVudGl0eS5saW5lTnVtYmVyKys7CiAgICAgICAgICAgICAgICAgICAgIGZDdXJyZW50RW50aXR5LmNvbHVtbk51bWJlciA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmQ3VycmVudEVudGl0eS5wb3NpdGlvbiA9PSBmQ3VycmVudEVudGl0eS5jb3VudCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUxpc3RlbmVycygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUxpc3RlbmVycygwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZDdXJyZW50RW50aXR5LmNoWzBdID0gKGNoYXIpYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eUNoYW5nZWQgPSBsb2FkKDEsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW50aXR5Q2hhbmdlZCl7CkBAIC0xODI3LDcgKzE4MjcsOCBAQAogICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcy5sZW5ndGg7CiAgICAgICAgIC8vZmlyc3QgbWFrZSBzdXJlIHRoYXQgcmVxdWlyZWQgY2FwYWNpdHkgaXMgYXZhaWJsZQogICAgICAgICBpZihhcnJhbmdlQ2FwYWNpdHkobGVuZ3RoLCBmYWxzZSkpewotICAgICAgICAgICAgaW50IGJlZm9yZVNraXAgPSBmQ3VycmVudEVudGl0eS5wb3NpdGlvbjsKKyAgICAgICAgICAgIGludCBiZWZvcmVTa2lwID0gZkN1cnJlbnRFbnRpdHkucG9zaXRpb24gOworICAgICAgICAgICAgaW50IGFmdGVyU2tpcCA9IGZDdXJyZW50RW50aXR5LnBvc2l0aW9uICsgbGVuZ3RoICA7CiAKICAgICAgICAgICAgIGlmKERFQlVHX1NLSVBfU1RSSU5HKXsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNraXBTdHJpbmcsbGVuZ3RoID0gIiArIG5ldyBTdHJpbmcocykgKyAiLCIgKyBsZW5ndGgpOwpAQCAtMjIwOSw5ICsyMjEwLDggQEAKICAgICAgKiBpcyBiZWluZyBjaGFuZ2VkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoWE1MQnVmZmVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7CisgICAgICAgIGlmKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQogICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIyMTksOCArMjIxOSw5IEBACiAgICAgICogQHBhcmFtIGxvYWRQb3MgU3RhcnRpbmcgcG9zaXRpb24gZnJvbSB3aGljaCBuZXcgZGF0YSBpcyBiZWluZyBsb2FkZWQgaW50byBzY2FubmVyIGJ1ZmZlci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbnZva2VMaXN0ZW5lcnMoaW50IGxvYWRQb3MpewotICAgICAgICBmb3IgKGludCBpPTA7IGk8bGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lcnMuZ2V0KGkpLnJlZnJlc2gobG9hZFBvcyk7CisgICAgICAgIGZvcihpbnQgaT0wO2k8bGlzdGVuZXJzLnNpemUoKTtpKyspeworICAgICAgICAgICAgWE1MQnVmZmVyTGlzdGVuZXIgbGlzdGVuZXIgPShYTUxCdWZmZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlZnJlc2gobG9hZFBvcyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxTY2FubmVyLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MU2Nhbm5lci5qYXZhCmluZGV4IGZiMTJiNDIuLjc2NDVjY2UgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxTY2FubmVyLmphdmEKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTFNjYW5uZXIuamF2YQpAQCAtMywxNCArMywxMyBAQAogICovCiAKIC8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogQ29weXJpZ2h0IDIwMDUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNiArMjAsNyBAQAogCiBwYWNrYWdlIGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwuaW1wbDsKIAorCiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlsLlN0YXR1czsKIGltcG9ydCBjb20uc3VuLnhtbC5pbnRlcm5hbC5zdHJlYW0uWE1MRW50aXR5U3RvcmFnZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlcy5wcm9wZXJ0aWVzCmluZGV4IDAxNTMxZjcuLmM3YTIzYzIgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXMucHJvcGVydGllcworKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTE0NSw3ICsxNDUsNiBAQAogICAgICAgICBNU0dfU1BBQ0VfUkVRVUlSRURfQkVGT1JFX1JPT1RfRUxFTUVOVF9UWVBFX0lOX0RPQ1RZUEVERUNMID0gV2hpdGUgc3BhY2UgaXMgcmVxdWlyZWQgYWZ0ZXIgXCI8IURPQ1RZUEVcIiBpbiB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbi4KICAgICAgICAgTVNHX1JPT1RfRUxFTUVOVF9UWVBFX1JFUVVJUkVEID0gVGhlIHJvb3QgZWxlbWVudCB0eXBlIG11c3QgYXBwZWFyIGFmdGVyIFwiPCFET0NUWVBFXCIgaW4gdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24uCiAgICAgICAgIERvY3R5cGVkZWNsVW50ZXJtaW5hdGVkID0gVGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gZm9yIHJvb3QgZWxlbWVudCB0eXBlIFwiezB9XCIgbXVzdCBlbmQgd2l0aCAnJz4nJy4KLSAgICAgICAgRG9jdHlwZWRlY2xOb3RDbG9zZWQgPSBUaGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBmb3Igcm9vdCBlbGVtZW50IHR5cGUgXCJ7MH1cIiBtdXN0IGJlIGNsb3NlZCB3aXRoICcnXScnLgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IFRoZSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBcIiV7MH07XCIgY2Fubm90IG9jY3VyIHdpdGhpbiBtYXJrdXAgaW4gdGhlIGludGVybmFsIHN1YnNldCBvZiB0aGUgRFRELgogICAgICAgICBNU0dfTUFSS1VQX05PVF9SRUNPR05JWkVEX0lOX0RURCA9IFRoZSBtYXJrdXAgZGVjbGFyYXRpb25zIGNvbnRhaW5lZCBvciBwb2ludGVkIHRvIGJ5IHRoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIG11c3QgYmUgd2VsbC1mb3JtZWQuCiAjIDIuMTAgV2hpdGUgU3BhY2UgSGFuZGxpbmcKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfZGUucHJvcGVydGllcyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfZGUucHJvcGVydGllcwppbmRleCAwODQ4MjcwLi45MWZmMGRjIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2RlLnByb3BlcnRpZXMKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19kZS5wcm9wZXJ0aWVzCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICAgICAgTVNHX1NQQUNFX1JFUVVJUkVEX0JFRk9SRV9ST09UX0VMRU1FTlRfVFlQRV9JTl9ET0NUWVBFREVDTCA9IExlZXJzdGVsbGUgbmFjaCAiPCFET0NUWVBFIiBpbiBkZXIgRG9rdW1lbnR0eXBkZWtsYXJhdGlvbiBlcmZvcmRlcmxpY2guCiAgICAgICAgIE1TR19ST09UX0VMRU1FTlRfVFlQRV9SRVFVSVJFRCA9IFJvb3QtRWxlbWVudHR5cCBtdXNzIG5hY2ggIjwhRE9DVFlQRSIgaW4gZGVyIERva3VtZW50dHlwZGVrbGFyYXRpb24gZW50aGFsdGVuIHNlaW4uCiAgICAgICAgIERvY3R5cGVkZWNsVW50ZXJtaW5hdGVkID0gRG9rdW1lbnR0eXBkZWtsYXJhdGlvbiBmXHUwMEZDciBSb290LUVsZW1lbnR0eXAgInswfSIgbXVzcyBtaXQgIj4iIGVuZGVuLgotICAgICAgICBEb2N0eXBlZGVjbE5vdENsb3NlZCA9IERva3VtZW50dHlwZGVrbGFyYXRpb24gZlx1MDBGQ3IgUm9vdC1FbGVtZW50dHlwICJ7MH0iIG11c3MgbWl0ICcnXScnIGVuZGVuLgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IFBhcmFtZXRlcmVudGl0eXJlZmVyZW56ICIlezB9OyIgZGFyZiBuaWNodCBpbiBNYXJrdXAgaW4gZGVyIGludGVybmVuIFRlaWxtZW5nZSBkZXIgRFREIHZvcmtvbW1lbi4KICAgICAgICAgTVNHX01BUktVUF9OT1RfUkVDT0dOSVpFRF9JTl9EVEQgPSBEaWUgTWFya3VwLURla2xhcmF0aW9uZW4sIGRpZSBpbiBkZXIgRG9rdW1lbnR0eXBkZWtsYXJhdGlvbiBlbnRoYWx0ZW4gc2luZCBiencuIGF1ZiBkaWUgdm9uIGRlciBEb2t1bWVudHR5cGRla2xhcmF0aW9uIHZlcndpZXNlbiB3aXJkLCBtXHUwMEZDc3NlbiBvcmRudW5nc2dlbVx1MDBFNFx1MDBERiBmb3JtYXRpZXJ0IHNlaW4uCiAjIDIuMTAgV2hpdGUgU3BhY2UgSGFuZGxpbmcKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfZXMucHJvcGVydGllcyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfZXMucHJvcGVydGllcwppbmRleCAxMDhlZWViLi45YzRkNWIwIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2VzLnByb3BlcnRpZXMKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19lcy5wcm9wZXJ0aWVzCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICAgICAgTVNHX1NQQUNFX1JFUVVJUkVEX0JFRk9SRV9ST09UX0VMRU1FTlRfVFlQRV9JTl9ET0NUWVBFREVDTCA9IEVzIG5lY2VzYXJpbyB1biBlc3BhY2lvIGVuIGJsYW5jbyBkZXNwdVx1MDBFOXMgZGUgIjwhRE9DVFlQRSIgZW4gbGEgZGVjbGFyYWNpXHUwMEYzbiBkZSB0aXBvIGRlIGRvY3VtZW50by4KICAgICAgICAgTVNHX1JPT1RfRUxFTUVOVF9UWVBFX1JFUVVJUkVEID0gRWwgdGlwbyBkZSBlbGVtZW50byByYVx1MDBFRHogZGViZSBhcGFyZWNlciBkZXNwdVx1MDBFOXMgZGUgIjwhRE9DVFlQRSIgZW4gbGEgZGVjbGFyYWNpXHUwMEYzbiBkZSB0aXBvIGRlIGRvY3VtZW50by4KICAgICAgICAgRG9jdHlwZWRlY2xVbnRlcm1pbmF0ZWQgPSBMYSBkZWNsYXJhY2lcdTAwRjNuIGRlIHRpcG8gZGUgZG9jdW1lbnRvIHBhcmEgZWwgdGlwbyBkZSBlbGVtZW50byByYVx1MDBFRHogInswfSIgZGViZSBmaW5hbGl6YXIgZW4gJyc+JycuCi0gICAgICAgIERvY3R5cGVkZWNsTm90Q2xvc2VkID0gTGEgZGVjbGFyYWNpXHUwMEYzbiBkZSB0aXBvIGRlIGRvY3VtZW50byBwYXJhIGVsIHRpcG8gZGUgZWxlbWVudG8gcmFcdTAwRUR6ICJ7MH0iIGRlYmUgZmluYWxpemFyIGVuICcnXScnLgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IExhIHJlZmVyZW5jaWEgZGUgZW50aWRhZCBkZWwgcGFyXHUwMEUxbWV0cm8gIiV7MH07IiBubyBwdWVkZSBwcm9kdWNpcnNlIGVuIGVsIG1hcmNhZG9yIGVuIGVsIHN1YmNvbmp1bnRvIGludGVybm8gZGVsIERURC4KICAgICAgICAgTVNHX01BUktVUF9OT1RfUkVDT0dOSVpFRF9JTl9EVEQgPSBMYXMgZGVjbGFyYWNpb25lcyBkZSBtYXJjYWRvciBxdWUgc2UgaW5jbHV5ZW4gbyBhIGxhcyBxdWUgYXB1bnRhIGxhIGRlY2xhcmFjaVx1MDBGM24gZGUgdGlwbyBkZSBkb2N1bWVudG8gZGViZW4gdGVuZXIgZWwgZm9ybWF0byBjb3JyZWN0by4KICMgMi4xMCBXaGl0ZSBTcGFjZSBIYW5kbGluZwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19mci5wcm9wZXJ0aWVzIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19mci5wcm9wZXJ0aWVzCmluZGV4IGM5YzMxYmIuLjMwMGZmMDMgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfZnIucHJvcGVydGllcworKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2ZyLnByb3BlcnRpZXMKQEAgLTE0NSw3ICsxNDUsNiBAQAogICAgICAgICBNU0dfU1BBQ0VfUkVRVUlSRURfQkVGT1JFX1JPT1RfRUxFTUVOVF9UWVBFX0lOX0RPQ1RZUEVERUNMID0gVW4gZXNwYWNlIGVzdCBvYmxpZ2F0b2lyZSBhcHJcdTAwRThzICI8IURPQ1RZUEUiIGRhbnMgbGEgZFx1MDBFOWNsYXJhdGlvbiBkZSB0eXBlIGRlIGRvY3VtZW50LgogICAgICAgICBNU0dfUk9PVF9FTEVNRU5UX1RZUEVfUkVRVUlSRUQgPSBMZSB0eXBlIGQnXHUwMEU5bFx1MDBFOW1lbnQgcmFjaW5lIGRvaXQgZmlndXJlciBhcHJcdTAwRThzICI8IURPQ1RZUEUiIGRhbnMgbGEgZFx1MDBFOWNsYXJhdGlvbiBkZSB0eXBlIGRlIGRvY3VtZW50LgogICAgICAgICBEb2N0eXBlZGVjbFVudGVybWluYXRlZCA9IExhIGRcdTAwRTljbGFyYXRpb24gZGUgdHlwZSBkZSBkb2N1bWVudCBwb3VyIGxlIHR5cGUgZCcnXHUwMEU5bFx1MDBFOW1lbnQgcmFjaW5lICJ7MH0iIGRvaXQgc2UgdGVybWluZXIgcGFyICcnPicnLgotICAgICAgICBEb2N0eXBlZGVjbE5vdENsb3NlZCA9IExhIGRcdTAwRTljbGFyYXRpb24gZGUgdHlwZSBkZSBkb2N1bWVudCBwb3VyIGxlIHR5cGUgZCcnXHUwMEU5bFx1MDBFOW1lbnQgcmFjaW5lICJ7MH0iIGRvaXQgc2UgdGVybWluZXIgcGFyICcnXScnLgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IExhIHJcdTAwRTlmXHUwMEU5cmVuY2UgZCcnZW50aXRcdTAwRTkgZGUgcGFyYW1cdTAwRTh0cmUgIiV7MH07IiBuZSBwZXV0IHBhcyBzdXJ2ZW5pciBkYW5zIGxlIGJhbGlzYWdlIGR1IHNvdXMtZW5zZW1ibGUgaW50ZXJuZSBkZSBsYSBEVEQuCiAgICAgICAgIE1TR19NQVJLVVBfTk9UX1JFQ09HTklaRURfSU5fRFREID0gTGVzIGRcdTAwRTljbGFyYXRpb25zIGRlIGJhbGlzYWdlIGNvbnRlbnVlcyBkYW5zIGxhIGRcdTAwRTljbGFyYXRpb24gZGUgdHlwZSBkZSBkb2N1bWVudCBvdSBzdXIgbGVzcXVlbGxlcyBwb2ludGUgY2V0dGUgZGVybmlcdTAwRThyZSBkb2l2ZW50IGF2b2lyIHVuIGZvcm1hdCBjb3JyZWN0LgogIyAyLjEwIFdoaXRlIFNwYWNlIEhhbmRsaW5nCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2l0LnByb3BlcnRpZXMgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2l0LnByb3BlcnRpZXMKaW5kZXggMWNjYTYwNC4uZmJiOTVkMyAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19pdC5wcm9wZXJ0aWVzCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfaXQucHJvcGVydGllcwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIE1TR19TUEFDRV9SRVFVSVJFRF9CRUZPUkVfUk9PVF9FTEVNRU5UX1RZUEVfSU5fRE9DVFlQRURFQ0wgPSBcdTAwQzggcmljaGllc3RvIHVubyBzcGF6aW8gZG9wbyAiPCFET0NUWVBFIiBuZWxsYSBkaWNoaWFyYXppb25lIGRlbCB0aXBvIGRpIGRvY3VtZW50by4KICAgICAgICAgTVNHX1JPT1RfRUxFTUVOVF9UWVBFX1JFUVVJUkVEID0gSWwgdGlwbyBkaSBlbGVtZW50byByYWRpY2UgZGV2ZSBjb21wYXJpcmUgZG9wbyAiPCFET0NUWVBFIiBuZWxsYSBkaWNoaWFyYXppb25lIGRlbCB0aXBvIGRpIGRvY3VtZW50by4KICAgICAgICAgRG9jdHlwZWRlY2xVbnRlcm1pbmF0ZWQgPSBMYSBkaWNoaWFyYXppb25lIGRlbCB0aXBvIGRpIGRvY3VtZW50byBwZXIgaWwgdGlwbyBkaSBlbGVtZW50byByYWRpY2UgInswfSIgZGV2ZSB0ZXJtaW5hcmUgY29uICcnPicnLgotICAgICAgICBEb2N0eXBlZGVjbE5vdENsb3NlZCA9IExhIGRpY2hpYXJhemlvbmUgZGVsIHRpcG8gZGkgZG9jdW1lbnRvIHBlciBpbCB0aXBvIGRpIGVsZW1lbnRvIHJhZGljZSAiezB9IiBkZXZlIHRlcm1pbmFyZSBjb24gJyddJycuCiAgICAgICAgIFBFUmVmZXJlbmNlV2l0aGluTWFya3VwID0gSWwgcmlmZXJpbWVudG8gZGkgZW50aXRcdTAwRTAgZGkgcGFyYW1ldHJvICIlezB9OyIgbm9uIHB1XHUwMEYyIGVzc2VyZSBwcmVzZW50ZSBuZWwgbWFya3VwIGRlbCBzZXQgc2Vjb25kYXJpbyBpbnRlcm5vIGRlbCBEVEQuCiAgICAgICAgIE1TR19NQVJLVVBfTk9UX1JFQ09HTklaRURfSU5fRFREID0gTGUgZGljaGlhcmF6aW9uaSBkaSBtYXJrdXAgY29udGVudXRlIG8gaW5kaWNhdGUgZGFsbGEgZGljaGlhcmF6aW9uZSBkZWwgdGlwbyBkaSBkb2N1bWVudG8gZGV2b25vIGF2ZXJlIHVuIGZvcm1hdG8gY29ycmV0dG8uCiAjIDIuMTAgV2hpdGUgU3BhY2UgSGFuZGxpbmcKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfamEucHJvcGVydGllcyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfamEucHJvcGVydGllcwppbmRleCA3NGUwNTk0Li5lNjU2ZGQ4IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2phLnByb3BlcnRpZXMKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19qYS5wcm9wZXJ0aWVzCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICAgICAgTVNHX1NQQUNFX1JFUVVJUkVEX0JFRk9SRV9ST09UX0VMRU1FTlRfVFlQRV9JTl9ET0NUWVBFREVDTCA9IFx1MzBDOVx1MzBBRFx1MzBFNVx1MzBFMVx1MzBGM1x1MzBDOFx1MzBGQlx1MzBCRlx1MzBBNFx1MzBEN1x1NUJBM1x1OEEwMFx1MzA2N1x1MzA2Rlx1MzAwMSI8IURPQ1RZUEUiXHUzMDZFXHU1RjhDXHUzMDZCXHU3QTdBXHU3NjdEXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyCiAgICAgICAgIE1TR19ST09UX0VMRU1FTlRfVFlQRV9SRVFVSVJFRCA9IFx1MzBDOVx1MzBBRFx1MzBFNVx1MzBFMVx1MzBGM1x1MzBDOFx1MzBGQlx1MzBCRlx1MzBBNFx1MzBEN1x1NUJBM1x1OEEwMFx1MzA2N1x1MzA2Rlx1MzAwMSI8IURPQ1RZUEUiXHUzMDZFXHU1RjhDXHUzMDZCXHUzMEVCXHUzMEZDXHUzMEM4XHU4OTgxXHU3RDIwXHUzMEJGXHUzMEE0XHUzMEQ3XHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyCiAgICAgICAgIERvY3R5cGVkZWNsVW50ZXJtaW5hdGVkID0gXHUzMEVCXHUzMEZDXHUzMEM4XHU4OTgxXHU3RDIwXHUzMEJGXHUzMEE0XHUzMEQ3InswfSJcdTMwNkVcdTMwQzlcdTMwQURcdTMwRTVcdTMwRTFcdTMwRjNcdTMwQzhcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDdcdTVCQTNcdThBMDBcdTMwNkYnJz4nJ1x1MzA2N1x1N0Q0Mlx1NEU4Nlx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMgotICAgICAgICBEb2N0eXBlZGVjbE5vdENsb3NlZCA9IFx1MzBFQlx1MzBGQ1x1MzBDOFx1ODk4MVx1N0QyMFx1MzBCRlx1MzBBNFx1MzBENyJ7MH0iXHUzMDZFXHUzMEM5XHUzMEFEXHUzMEU1XHUzMEUxXHUzMEYzXHUzMEM4XHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3XHU1QkEzXHU4QTAwXHUzMDZGJyddJydcdTMwNjdcdTk1ODlcdTMwNThcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDIKICAgICAgICAgUEVSZWZlcmVuY2VXaXRoaW5NYXJrdXAgPSBcdTMwRDFcdTMwRTlcdTMwRTFcdTMwRkNcdTMwQkZcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzZcdTMwQTNcdTUzQzJcdTcxNjciJXswfTsiXHUzMDZGXHUzMDAxRFREXHUzMDZFXHU1MTg1XHU5MEU4XHUzMEI1XHUzMEQ2XHUzMEJCXHUzMEMzXHUzMEM4XHUzMDZFXHUzMERFXHUzMEZDXHUzMEFGXHUzMEEyXHUzMEMzXHUzMEQ3XHU1MTg1XHUzMDZCXHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyCiAgICAgICAgIE1TR19NQVJLVVBfTk9UX1JFQ09HTklaRURfSU5fRFREID0gXHUzMEM5XHUzMEFEXHUzMEU1XHUzMEUxXHUzMEYzXHUzMEM4XHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3XHU1QkEzXHU4QTAwXHUzMDZCXHU1NDJCXHUzMDdFXHUzMDhDXHUzMDhCXHUzMDRCXHUzMDAxXHUzMEM5XHUzMEFEXHUzMEU1XHUzMEUxXHUzMEYzXHUzMEM4XHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3XHU1QkEzXHU4QTAwXHUzMDRDXHU2MzA3XHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhCXHUzMERFXHUzMEZDXHUzMEFGXHUzMEEyXHUzMEMzXHUzMEQ3XHU1QkEzXHU4QTAwXHUzMDZGXHU2NTc0XHU1RjYyXHU1RjBGXHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyCiAjIDIuMTAgV2hpdGUgU3BhY2UgSGFuZGxpbmcKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfa28ucHJvcGVydGllcyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfa28ucHJvcGVydGllcwppbmRleCBlOTBiZTMzLi4wOTk4NTVlIDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX2tvLnByb3BlcnRpZXMKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19rby5wcm9wZXJ0aWVzCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICAgICAgTVNHX1NQQUNFX1JFUVVJUkVEX0JFRk9SRV9ST09UX0VMRU1FTlRfVFlQRV9JTl9ET0NUWVBFREVDTCA9IFx1QkIzOFx1QzExQyBcdUM3MjBcdUQ2MTUgXHVDMTIwXHVDNUI4XHVDNUQwXHVDMTFDXHVCMjk0ICI8IURPQ1RZUEUiIFx1QjJFNFx1Qzc0Q1x1QzVEMCBcdUFDRjVcdUJDMzFcdUM3NzQgXHVENTQ0XHVDNjk0XHVENTY5XHVCMkM4XHVCMkU0LgogICAgICAgICBNU0dfUk9PVF9FTEVNRU5UX1RZUEVfUkVRVUlSRUQgPSBcdUJCMzhcdUMxMUMgXHVDNzIwXHVENjE1IFx1QzEyMFx1QzVCOFx1QzVEMFx1QzExQ1x1QjI5NCAiPCFET0NUWVBFIiBcdUIyRTRcdUM3NENcdUM1RDAgXHVCOEU4XHVEMkI4IFx1QzY5NFx1QzE4QyBcdUM3MjBcdUQ2MTVcdUM3NzQgXHVCMDk4XHVEMEMwXHVCMDk4XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4KICAgICAgICAgRG9jdHlwZWRlY2xVbnRlcm1pbmF0ZWQgPSBcdUI4RThcdUQyQjggXHVDNjk0XHVDMThDIFx1QzcyMFx1RDYxNSAiezB9Ilx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVCQjM4XHVDMTFDIFx1QzcyMFx1RDYxNSBcdUMxMjBcdUM1QjhcdUM3NDAgJyc+JydcdUI4NUMgXHVCMDVEXHVCMDk4XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4KLSAgICAgICAgRG9jdHlwZWRlY2xOb3RDbG9zZWQgPSBcdUI4RThcdUQyQjggXHVDNjk0XHVDMThDIFx1QzcyMFx1RDYxNSAiezB9Ilx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVCQjM4XHVDMTFDIFx1QzcyMFx1RDYxNSBcdUMxMjBcdUM1QjhcdUM3NDAgJyddJydcdUI4NUMgXHVCMDVEXHVCMDk4XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4KICAgICAgICAgUEVSZWZlcmVuY2VXaXRoaW5NYXJrdXAgPSBcdUI5RTRcdUFDMUNcdUJDQzBcdUMyMTggXHVDNUQ0XHVEMkYwXHVEMkYwIFx1Q0MzOFx1Qzg3MCAiJXswfTsiXHVDNzQwIERURFx1Qzc1OCBcdUIwQjRcdUJEODAgXHVCRDgwXHVCRDg0IFx1QzlEMVx1RDU2OVx1QzVEMCBcdUM3ODhcdUIyOTQgXHVCOUM4XHVEMDZDXHVDNUM1IFx1QzU0OFx1QzVEMCBcdUQ0NUNcdUMyRENcdUI0MjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4KICAgICAgICAgTVNHX01BUktVUF9OT1RfUkVDT0dOSVpFRF9JTl9EVEQgPSBcdUJCMzhcdUMxMUMgXHVDNzIwXHVENjE1IFx1QzEyMFx1QzVCOFx1Qzc0NCBcdUQzRUNcdUQ1NjhcdUQ1NThcdUFDNzBcdUIwOTggXHVCQjM4XHVDMTFDIFx1QzcyMFx1RDYxNSBcdUMxMjBcdUM1QjhcdUM3NzQgXHVBQzAwXHVCOUFDXHVEMEE0XHVCMjk0IFx1QjlDOFx1RDA2Q1x1QzVDNSBcdUMxMjBcdUM1QjhcdUM3NDAgXHVDNjJDXHVCQzE0XHVCOTc4IFx1RDYxNVx1QzJERFx1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuCiAjIDIuMTAgV2hpdGUgU3BhY2UgSGFuZGxpbmcKZGlmZiAtLWdpdCBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfcHRfQlIucHJvcGVydGllcyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfcHRfQlIucHJvcGVydGllcwppbmRleCA5M2FlNDhlLi4xZTAwNTg3IDEwMDY0NAotLS0gYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3B0X0JSLnByb3BlcnRpZXMKKysrIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19wdF9CUi5wcm9wZXJ0aWVzCkBAIC0xNDUsNyArMTQ1LDYgQEAKICAgICAgICAgTVNHX1NQQUNFX1JFUVVJUkVEX0JFRk9SRV9ST09UX0VMRU1FTlRfVFlQRV9JTl9ET0NUWVBFREVDTCA9IE8gZXNwYVx1MDBFN28gZW0gYnJhbmNvIFx1MDBFOSBuZWNlc3NcdTAwRTFyaW8gYXBcdTAwRjNzICI8IURPQ1RZUEUiIG5hIGRlY2xhcmFcdTAwRTdcdTAwRTNvIGRvIHRpcG8gZGUgZG9jdW1lbnRvLgogICAgICAgICBNU0dfUk9PVF9FTEVNRU5UX1RZUEVfUkVRVUlSRUQgPSBPIHRpcG8gZGUgZWxlbWVudG8tcmFpeiBkZXZlIGFwYXJlY2VyIGFwXHUwMEYzcyAiPCFET0NUWVBFIiBuYSBkZWNsYXJhXHUwMEU3XHUwMEUzbyBkbyB0aXBvIGRlIGRvY3VtZW50by4KICAgICAgICAgRG9jdHlwZWRlY2xVbnRlcm1pbmF0ZWQgPSBBIGRlY2xhcmFcdTAwRTdcdTAwRTNvIGRvIHRpcG8gZGUgZG9jdW1lbnRvIGRvIHRpcG8gZGUgZWxlbWVudG8gInswfSIgZGV2ZSB0ZXJtaW5hciBjb20gJyc+JycuCi0gICAgICAgIERvY3R5cGVkZWNsTm90Q2xvc2VkID0gQSBkZWNsYXJhXHUwMEU3XHUwMEUzbyBkbyB0aXBvIGRlIGRvY3VtZW50byBkbyB0aXBvIGRlIGVsZW1lbnRvICJ7MH0iIGRldmUgdGVybWluYXIgY29tICcnXScnLgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IEEgcmVmZXJcdTAwRUFuY2lhIGRhIGVudGlkYWRlIGRvIHBhclx1MDBFMm1ldHJvICIlezB9OyIgblx1MDBFM28gcG9kZSBvY29ycmVyIG5hIG1hcmNhXHUwMEU3XHUwMEUzbyBubyBzdWJjb25qdW50byBpbnRlcm5vIGRvIERURC4KICAgICAgICAgTVNHX01BUktVUF9OT1RfUkVDT0dOSVpFRF9JTl9EVEQgPSBBcyBkZWNsYXJhXHUwMEU3XHUwMEY1ZXMgZGUgbWFyY2FcdTAwRTdcdTAwRTNvIGNvbnRpZGFzIG91IGFwb250YWRhcyBwZWxhIGRlY2xhcmFcdTAwRTdcdTAwRTNvIGRvIHRpcG8gZGUgZG9jdW1lbnRvIGRldmVtIGVzdGFyIGNvcnJldGFzLgogIyAyLjEwIFdoaXRlIFNwYWNlIEhhbmRsaW5nCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3N2LnByb3BlcnRpZXMgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3N2LnByb3BlcnRpZXMKaW5kZXggNGY1NGU1Zi4uYWRkNDczZSAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc19zdi5wcm9wZXJ0aWVzCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfc3YucHJvcGVydGllcwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIE1TR19TUEFDRV9SRVFVSVJFRF9CRUZPUkVfUk9PVF9FTEVNRU5UX1RZUEVfSU5fRE9DVFlQRURFQ0wgPSBUb210IHV0cnltbWUga3JcdTAwRTR2cyBlZnRlciAiPCFET0NUWVBFIiBpIGRva3VtZW50dHlwZGVrbGFyYXRpb25lbi4KICAgICAgICAgTVNHX1JPT1RfRUxFTUVOVF9UWVBFX1JFUVVJUkVEID0gUm90ZWxlbWVudHR5cCBtXHUwMEU1c3RlIGFuZ2VzIGVmdGVyICI8IURPQ1RZUEUiIGkgZG9rdW1lbnR0eXBkZWtsYXJhdGlvbmVuLgogICAgICAgICBEb2N0eXBlZGVjbFVudGVybWluYXRlZCA9IERva3VtZW50dHlwZGVrbGFyYXRpb25lbiBmXHUwMEY2ciByb3RlbGVtZW50dHlwICJ7MH0iIG1cdTAwRTVzdGUgYXZzbHV0YXMgbWVkICcnPicnLgotICAgICAgICBEb2N0eXBlZGVjbE5vdENsb3NlZCA9IERva3VtZW50dHlwc2Rla2xhcmF0aW9uZW4gZlx1MDBGNnIgcm90ZWxlbWVudHR5cGVuICJ7MH0iIG1cdTAwRTVzdGUgc3RcdTAwRTRuZ2FzIG1lZCAnJ10nJy4KICAgICAgICAgUEVSZWZlcmVuY2VXaXRoaW5NYXJrdXAgPSBQYXJhbWV0ZXJyZWZlcmVuc2VuICIlezB9OyIgZlx1MDBFNXIgaW50ZSBmXHUwMEY2cmVrb21tYSBpIGtvZHRleHRlbiBpIGRlbiBpbnRlcm5hIGRlbG1cdTAwRTRuZ2RlbiBpIERURC4KICAgICAgICAgTVNHX01BUktVUF9OT1RfUkVDT0dOSVpFRF9JTl9EVEQgPSBLb2R0ZXh0ZGVrbGFyYXRpb25lcm5hIHNvbSBmaW5ucyBtZWQgZWxsZXIgcGVrYXMgdGlsbCBmclx1MDBFNW4gZG9rdW1lbnR0eXBkZWtsYXJhdGlvbmVuIG1cdTAwRTVzdGUgdmFyYSB2XHUwMEU0bGZvcm11bGVyYWRlLgogIyAyLjEwIFdoaXRlIFNwYWNlIEhhbmRsaW5nCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3poX0NOLnByb3BlcnRpZXMgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3poX0NOLnByb3BlcnRpZXMKaW5kZXggZGMyZTFkMC4uZGM2YmNhMCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc196aF9DTi5wcm9wZXJ0aWVzCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfemhfQ04ucHJvcGVydGllcwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIE1TR19TUEFDRV9SRVFVSVJFRF9CRUZPUkVfUk9PVF9FTEVNRU5UX1RZUEVfSU5fRE9DVFlQRURFQ0wgPSBcdTU3MjhcdTY1ODdcdTY4NjNcdTdDN0JcdTU3OEJcdTU4RjBcdTY2MEVcdTRFMkRcdTc2ODQgIjwhRE9DVFlQRSIgXHU1NDBFXHU5NzYyXHU5NzAwXHU4OTgxXHU2NzA5XHU3QTdBXHU2ODNDXHUzMDAyCiAgICAgICAgIE1TR19ST09UX0VMRU1FTlRfVFlQRV9SRVFVSVJFRCA9IFx1NTcyOFx1NjU4N1x1Njg2M1x1N0M3Qlx1NTc4Qlx1NThGMFx1NjYwRVx1NEUyRCwgXHU2ODM5XHU1MTQzXHU3RDIwXHU3QzdCXHU1NzhCXHU1RkM1XHU5ODdCXHU1MUZBXHU3M0IwXHU1NzI4ICI8IURPQ1RZUEUiIFx1NTQwRVx1OTc2Mlx1MzAwMgogICAgICAgICBEb2N0eXBlZGVjbFVudGVybWluYXRlZCA9IFx1NjgzOVx1NTE0M1x1N0QyMFx1N0M3Qlx1NTc4QiAiezB9IiBcdTc2ODRcdTY1ODdcdTY4NjNcdTdDN0JcdTU3OEJcdTU4RjBcdTY2MEVcdTVGQzVcdTk4N0JcdTRFRTUgJyc+JycgXHU3RUQzXHU1QzNFXHUzMDAyCi0gICAgICAgIERvY3R5cGVkZWNsTm90Q2xvc2VkID0gXHU2ODM5XHU1MTQzXHU3RDIwXHU3QzdCXHU1NzhCICJ7MH0iIFx1NzY4NFx1NjU4N1x1Njg2M1x1N0M3Qlx1NTc4Qlx1NThGMFx1NjYwRVx1NUZDNVx1OTg3Qlx1NEVFNSAnJ10nJyBcdTdFRDNcdTVDM0VcdTMwMDIKICAgICAgICAgUEVSZWZlcmVuY2VXaXRoaW5NYXJrdXAgPSBcdTUzQzJcdTY1NzBcdTVCOUVcdTRGNTNcdTVGMTVcdTc1MjggIiV7MH07IiBcdTRFMERcdTgwRkRcdTUxRkFcdTczQjBcdTU3MjggRFREIFx1NzY4NFx1NTE4NVx1OTBFOFx1NUI1MFx1OTZDNlx1NEUyRFx1NzY4NFx1NjgwN1x1OEJCMFx1NTE4NVx1MzAwMgogICAgICAgICBNU0dfTUFSS1VQX05PVF9SRUNPR05JWkVEX0lOX0RURCA9IFx1NjU4N1x1Njg2M1x1N0M3Qlx1NTc4Qlx1NThGMFx1NjYwRVx1NTMwNVx1NTQyQlx1NjIxNlx1NjMwN1x1NTQxMVx1NzY4NFx1NjgwN1x1OEJCMFx1NThGMFx1NjYwRVx1NUZDNVx1OTg3Qlx1NjgzQ1x1NUYwRlx1NkI2M1x1Nzg2RVx1MzAwMgogIyAyLjEwIFdoaXRlIFNwYWNlIEhhbmRsaW5nCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3poX1RXLnByb3BlcnRpZXMgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvbXNnL1hNTE1lc3NhZ2VzX3poX1RXLnByb3BlcnRpZXMKaW5kZXggODBlMDFmMi4uOWQyMjU2OSAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL21zZy9YTUxNZXNzYWdlc196aF9UVy5wcm9wZXJ0aWVzCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9tc2cvWE1MTWVzc2FnZXNfemhfVFcucHJvcGVydGllcwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgICAgIE1TR19TUEFDRV9SRVFVSVJFRF9CRUZPUkVfUk9PVF9FTEVNRU5UX1RZUEVfSU5fRE9DVFlQRURFQ0wgPSBcdTU3MjhcdTY1ODdcdTRFRjZcdTk4NUVcdTU3OEJcdTVCQTNcdTU0NEFcdTRFMkQgIjwhRE9DVFlQRSIgXHU0RTRCXHU1RjhDXHU5NzAwXHU4OTgxXHU3QTdBXHU2ODNDXHUzMDAyCiAgICAgICAgIE1TR19ST09UX0VMRU1FTlRfVFlQRV9SRVFVSVJFRCA9IFx1NTcyOFx1NjU4N1x1NEVGNlx1OTg1RVx1NTc4Qlx1NUJBM1x1NTQ0QVx1NEUyRFx1RkYwQ1x1NjgzOVx1NTE0M1x1N0QyMFx1OTg1RVx1NTc4Qlx1NUZDNVx1OTgwOFx1NTFGQVx1NzNGRVx1NTcyOCAiPCFET0NUWVBFIiBcdTRFNEJcdTVGOENcdTMwMDIKICAgICAgICAgRG9jdHlwZWRlY2xVbnRlcm1pbmF0ZWQgPSBcdTY4MzlcdTUxNDNcdTdEMjBcdTk4NUVcdTU3OEIgInswfSIgXHU3Njg0XHU2NTg3XHU0RUY2XHU5ODVFXHU1NzhCXHU1QkEzXHU1NDRBXHU3RDUwXHU1QzNFXHU1RkM1XHU5ODA4XHU3MEJBICcnPicnXHUzMDAyCi0gICAgICAgIERvY3R5cGVkZWNsTm90Q2xvc2VkID0gXHU2ODM5XHU1MTQzXHU3RDIwXHU5ODVFXHU1NzhCICJ7MH0iIFx1NzY4NFx1NjU4N1x1NEVGNlx1OTg1RVx1NTc4Qlx1NUJBM1x1NTQ0QVx1N0Q1MFx1NUMzRVx1NUZDNVx1OTgwOFx1NzBCQSAnJ10nJ1x1MzAwMgogICAgICAgICBQRVJlZmVyZW5jZVdpdGhpbk1hcmt1cCA9IERURCBcdTUxNjdcdTkwRThcdTVCNTdcdTk2QzZcdTc2ODRcdTZBMTlcdThBMThcdTUxNjdcdTRFMERcdTgwRkRcdTUxRkFcdTczRkVcdTUzQzNcdTY1NzhcdTVCRTZcdTlBRDRcdTUzQzNcdTcxNjcgIiV7MH07Ilx1MzAwMgogICAgICAgICBNU0dfTUFSS1VQX05PVF9SRUNPR05JWkVEX0lOX0RURCA9IFx1NjU4N1x1NEVGNlx1OTg1RVx1NTc4Qlx1NUJBM1x1NTQ0QVx1NTMwNVx1NTQyQlx1NjIxNlx1NjMwN1x1NTQxMVx1NzY4NFx1NkExOVx1OEExOFx1NUJBM1x1NTQ0QVx1NUZDNVx1OTgwOFx1NjgzQ1x1NUYwRlx1NkI2M1x1NzhCQVx1MzAwMgogIyAyLjEwIFdoaXRlIFNwYWNlIEhhbmRsaW5nCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2pheHAvZGF0YXR5cGUvWE1MR3JlZ29yaWFuQ2FsZW5kYXJJbXBsLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2pheHAvZGF0YXR5cGUvWE1MR3JlZ29yaWFuQ2FsZW5kYXJJbXBsLmphdmEKaW5kZXggODQ1NDNlYy4uZGFjN2ZiZiAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9qYXhwL2RhdGF0eXBlL1hNTEdyZWdvcmlhbkNhbGVuZGFySW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvamF4cC9kYXRhdHlwZS9YTUxHcmVnb3JpYW5DYWxlbmRhckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2NzEsOSArMjY3MSw2IEBACiAgICAgICAgICAgICBjdXN0b21UaW1lem9uZUlkLmFwcGVuZChzaWduKTsKICAgICAgICAgICAgIGN1c3RvbVRpbWV6b25lSWQuYXBwZW5kKGhvdXIpOwogICAgICAgICAgICAgaWYgKG1pbnV0ZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChtaW51dGVzIDwgMTApIHsKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tVGltZXpvbmVJZC5hcHBlbmQoJzAnKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY3VzdG9tVGltZXpvbmVJZC5hcHBlbmQobWludXRlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZShjdXN0b21UaW1lem9uZUlkLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC91dGlsL0hUVFBJbnB1dFNvdXJjZS5qYXZhIGIvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC91dGlsL0hUVFBJbnB1dFNvdXJjZS5qYXZhCmluZGV4IGM5YmJlZDkuLmJkZDA3NTAgMTAwNjQ0Ci0tLSBhL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvdXRpbC9IVFRQSW5wdXRTb3VyY2UuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL3V0aWwvSFRUUElucHV0U291cmNlLmphdmEKQEAgLTEsMTYgKzEsMTUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiByZXNlcnZlZCBjb21tZW50IGJsb2NrCisgKiBETyBOT1QgUkVNT1ZFIE9SIEFMVEVSIQogICovCi0KIC8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogQ29weXJpZ2h0IDIwMDQsMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNyArMTcsMTggQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwueG5pLnBhcnNlci5YTUxJbnB1dFNvdXJjZTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7CitpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC54bmkucGFyc2VyLlhNTElucHV0U291cmNlOworCiAvKioKICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBpbnB1dCBzb3VyY2UgZm9yIGFuIFhNTCByZXNvdXJjZQogICogcmV0cmlldmFibGUgb3ZlciBIVFRQLiBJbiBhZGRpdGlvbiB0byB0aGUgcHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemUvRE9NU2VyaWFsaXplckltcGwuamF2YSBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplL0RPTVNlcmlhbGl6ZXJJbXBsLmphdmEKaW5kZXggOGYxNGQ3NC4uZDE3Y2YzMyAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3htbC9pbnRlcm5hbC9zZXJpYWxpemUvRE9NU2VyaWFsaXplckltcGwuamF2YQorKysgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL3NlcmlhbGl6ZS9ET01TZXJpYWxpemVySW1wbC5qYXZhCkBAIC0zMyw3ICszMyw2IEBACiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi1pbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5kb20uQWJvcnRFeGNlcHRpb247CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5kb20uQ29yZURvY3VtZW50SW1wbDsKIGltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmRvbS5ET01FcnJvckltcGw7CiBpbXBvcnQgY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5kb20uRE9NTG9jYXRvckltcGw7CkBAIC0xMTgsNiArMTE3LDcgQEAKICAgICBwcml2YXRlIERPTUVycm9ySGFuZGxlciBmRXJyb3JIYW5kbGVyID0gbnVsbDsKICAgICBwcml2YXRlIGZpbmFsIERPTUVycm9ySW1wbCBmRXJyb3IgPSBuZXcgRE9NRXJyb3JJbXBsKCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBET01Mb2NhdG9ySW1wbCBmTG9jYXRvciA9IG5ldyBET01Mb2NhdG9ySW1wbCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gYWJvcnQgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIG5ldyBMU1NlcmlhbGl6ZXIuCkBAIC01MzksOSArNTM5LDExIEBACiAgICAgICAgIH0gY2F0Y2ggKExTRXhjZXB0aW9uIGxzZSkgewogICAgICAgICAgICAgLy8gUmV0aHJvdyBMU0V4Y2VwdGlvbi4KICAgICAgICAgICAgIHRocm93IGxzZTsKLSAgICAgICAgfSBjYXRjaCAoQWJvcnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGUgPT0gRE9NTm9ybWFsaXplci5hYm9ydCl7CisgICAgICAgICAgICAgICAgLy8gc3RvcHBlZCBhdCB1c2VyIHJlcXVlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IChMU0V4Y2VwdGlvbikgbmV3IExTRXhjZXB0aW9uKExTRXhjZXB0aW9uLlNFUklBTElaRV9FUlIsIGUudG9TdHJpbmcoKSkuaW5pdENhdXNlKGUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIC8vIFJFVklTSVQ6IEEgZ2VuZXJpYyBJT0V4Y2VwdGlvbiBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIGluZm9ybWF0aW9uCkBAIC04MzQsOSArODM2LDExIEBACiAgICAgICAgIH0gY2F0Y2ggKExTRXhjZXB0aW9uIGxzZSkgewogICAgICAgICAgICAgLy8gUmV0aHJvdyBMU0V4Y2VwdGlvbi4KICAgICAgICAgICAgIHRocm93IGxzZTsKLSAgICAgICAgfSBjYXRjaCAoQWJvcnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlID09IERPTU5vcm1hbGl6ZXIuYWJvcnQpeworICAgICAgICAgICAgICAgIC8vIHN0b3BwZWQgYXQgdXNlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgKExTRXhjZXB0aW9uKSBET01VdGlsLmNyZWF0ZUxTRXhjZXB0aW9uKExTRXhjZXB0aW9uLlNFUklBTElaRV9FUlIsIGUpLmZpbGxJblN0YWNrVHJhY2UoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChzZXIuZkRPTUVycm9ySGFuZGxlciAhPSBudWxsKSB7CkBAIC05ODgsOSArOTkyLDExIEBACiAgICAgICAgIH0gY2F0Y2ggKExTRXhjZXB0aW9uIGxzZSkgewogICAgICAgICAgICAgLy8gUmV0aHJvdyBMU0V4Y2VwdGlvbi4KICAgICAgICAgICAgIHRocm93IGxzZTsKLSAgICAgICAgfSBjYXRjaCAoQWJvcnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChlID09IERPTU5vcm1hbGl6ZXIuYWJvcnQpeworICAgICAgICAgICAgICAgIC8vIHN0b3BwZWQgYXQgdXNlciByZXF1ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgKExTRXhjZXB0aW9uKSBET01VdGlsLmNyZWF0ZUxTRXhjZXB0aW9uKExTRXhjZXB0aW9uLlNFUklBTElaRV9FUlIsIGUpLmZpbGxJblN0YWNrVHJhY2UoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChzZXIuZkRPTUVycm9ySGFuZGxlciAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9qYXh3cy9BU1NFTUJMWV9FWENFUFRJT04gYi9qYXh3cy9BU1NFTUJMWV9FWENFUFRJT04KaW5kZXggMDY1YjhkOS4uOGI3YWMxZCAxMDA2NDQKLS0tIGEvamF4d3MvQVNTRU1CTFlfRVhDRVBUSU9OCisrKyBiL2pheHdzL0FTU0VNQkxZX0VYQ0VQVElPTgpAQCAtMSwyNyArMSwyNyBAQAogCiBPUEVOSkRLIEFTU0VNQkxZIEVYQ0VQVElPTgogCi1UaGUgT3BlbkpESyBzb3VyY2UgY29kZSBtYWRlIGF2YWlsYWJsZSBieSBPcmFjbGUgQW1lcmljYSwgSW5jLiAoT3JhY2xlKSBhdAotb3Blbmpkay5qYXZhLm5ldCAoIk9wZW5KREsgQ29kZSIpIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDxodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWw+IHZlcnNpb24gMgorVGhlIE9wZW5KREsgc291cmNlIGNvZGUgbWFkZSBhdmFpbGFibGUgYnkgU3VuIGF0IG9wZW5qZGsuamF2YS5uZXQgYW5kCitvcGVuamRrLmRldi5qYXZhLm5ldCAoIk9wZW5KREsgQ29kZSIpIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIDxodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWw+IHZlcnNpb24gMgogb25seSAoIkdQTDIiKSwgd2l0aCB0aGUgZm9sbG93aW5nIGNsYXJpZmljYXRpb24gYW5kIHNwZWNpYWwgZXhjZXB0aW9uLgogCiAgICAgTGlua2luZyB0aGlzIE9wZW5KREsgQ29kZSBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgY29kZQogICAgIGlzIG1ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgVGh1cywgdGhlIHRlcm1zCiAgICAgYW5kIGNvbmRpdGlvbnMgb2YgR1BMMiBjb3ZlciB0aGUgd2hvbGUgY29tYmluYXRpb24uCiAKLSAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBPcmFjbGUgZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzCi0gICAgT3BlbkpESyBDb2RlIHdpdGggY2VydGFpbiBjb2RlIGxpY2Vuc2VkIGJ5IE9yYWNsZSBhcyBpbmRpY2F0ZWQgYXQKKyAgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBTdW4gZ2l2ZXMgeW91IHBlcm1pc3Npb24gdG8gbGluayB0aGlzCisgICAgT3BlbkpESyBDb2RlIHdpdGggY2VydGFpbiBjb2RlIGxpY2Vuc2VkIGJ5IFN1biBhcyBpbmRpY2F0ZWQgYXQKICAgICBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9sZWdhbC9leGNlcHRpb24tbW9kdWxlcy0yMDA3LTA1LTA4Lmh0bWwKICAgICAoIkRlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMiKSB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsCiAgICAgcmVnYXJkbGVzcyBvZiB0aGUgbGljZW5zZSB0ZXJtcyBvZiB0aGUgRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcywKICAgICBhbmQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdW5kZXIgR1BMMiwKICAgICBwcm92aWRlZCB0aGF0IHRoZSBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIGNvbnRpbnVlIHRvIGJlCi0gICAgZ292ZXJuZWQgYnkgdGhlIGxpY2Vuc2VzIHVuZGVyIHdoaWNoIHRoZXkgd2VyZSBvZmZlcmVkIGJ5IE9yYWNsZS4KKyAgICBnb3Zlcm5lZCBieSB0aGUgbGljZW5zZXMgdW5kZXIgd2hpY2ggdGhleSB3ZXJlIG9mZmVyZWQgYnkgU3VuLgogCi1BcyBzdWNoLCBpdCBhbGxvd3MgbGljZW5zZWVzIGFuZCBzdWJsaWNlbnNlZXMgb2YgT3JhY2xlJ3MgR1BMMiBPcGVuSkRLIENvZGUKLXRvIGJ1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBpbmNsdWRlcyB0aG9zZSBwb3J0aW9ucyBvZiBuZWNlc3NhcnkgY29kZSB0aGF0Ci1PcmFjbGUgY291bGQgbm90IHByb3ZpZGUgdW5kZXIgR1BMMiAob3IgdGhhdCBPcmFjbGUgaGFzIHByb3ZpZGVkIHVuZGVyIEdQTDIKLXdpdGggdGhlIENsYXNzcGF0aCBleGNlcHRpb24pLiAgSWYgeW91IG1vZGlmeSBvciBhZGQgdG8gdGhlIE9wZW5KREsgY29kZSwKLXRoYXQgbmV3IEdQTDIgY29kZSBtYXkgc3RpbGwgYmUgY29tYmluZWQgd2l0aCBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzCi1pZiB0aGUgbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHRoaXMgZXhjZXB0aW9uIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVyLgorQXMgc3VjaCwgaXQgYWxsb3dzIGxpY2Vuc2VlcyBhbmQgc3VibGljZW5zZWVzIG9mIFN1bidzIEdQTDIgT3BlbkpESyBDb2RlIHRvCitidWlsZCBhbiBleGVjdXRhYmxlIHRoYXQgaW5jbHVkZXMgdGhvc2UgcG9ydGlvbnMgb2YgbmVjZXNzYXJ5IGNvZGUgdGhhdCBTdW4KK2NvdWxkIG5vdCBwcm92aWRlIHVuZGVyIEdQTDIgKG9yIHRoYXQgU3VuIGhhcyBwcm92aWRlZCB1bmRlciBHUEwyIHdpdGggdGhlCitDbGFzc3BhdGggZXhjZXB0aW9uKS4gIElmIHlvdSBtb2RpZnkgb3IgYWRkIHRvIHRoZSBPcGVuSkRLIGNvZGUsIHRoYXQgbmV3CitHUEwyIGNvZGUgbWF5IHN0aWxsIGJlIGNvbWJpbmVkIHdpdGggRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyBpZiB0aGUKK25ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byB0aGlzIGV4Y2VwdGlvbiBieSBpdHMgY29weXJpZ2h0IGhvbGRlci4KZGlmZiAtLWdpdCBhL2pheHdzL0xJQ0VOU0UgYi9qYXh3cy9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL2pheHdzL0xJQ0VOU0UKKysrIGIvamF4d3MvTElDRU5TRQpAQCAtMyw3ICszLDcgQEAKIFZlcnNpb24gMiwgSnVuZSAxOTkxCiAKIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLTUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAKIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGxpY2Vuc2UKIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCkBAIC0yODcsOCArMjg3LDggQEAKICAgICBtb3JlIGRldGFpbHMuCiAKICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICAgIFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAKIEFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgogCmRpZmYgLS1naXQgYS9qZGsvQVNTRU1CTFlfRVhDRVBUSU9OIGIvamRrL0FTU0VNQkxZX0VYQ0VQVElPTgppbmRleCAwNjViOGQ5Li44YjdhYzFkIDEwMDY0NAotLS0gYS9qZGsvQVNTRU1CTFlfRVhDRVBUSU9OCisrKyBiL2pkay9BU1NFTUJMWV9FWENFUFRJT04KQEAgLTEsMjcgKzEsMjcgQEAKIAogT1BFTkpESyBBU1NFTUJMWSBFWENFUFRJT04KIAotVGhlIE9wZW5KREsgc291cmNlIGNvZGUgbWFkZSBhdmFpbGFibGUgYnkgT3JhY2xlIEFtZXJpY2EsIEluYy4gKE9yYWNsZSkgYXQKLW9wZW5qZGsuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKK1RoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IFN1biBhdCBvcGVuamRrLmphdmEubmV0IGFuZAorb3Blbmpkay5kZXYuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKIG9ubHkgKCJHUEwyIiksIHdpdGggdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbi4KIAogICAgIExpbmtpbmcgdGhpcyBPcGVuSkRLIENvZGUgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIGNvZGUKICAgICBpcyBtYWtpbmcgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIFRodXMsIHRoZSB0ZXJtcwogICAgIGFuZCBjb25kaXRpb25zIG9mIEdQTDIgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgogCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgT3JhY2xlIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcwotICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBPcmFjbGUgYXMgaW5kaWNhdGVkIGF0CisgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgU3VuIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcworICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBTdW4gYXMgaW5kaWNhdGVkIGF0CiAgICAgaHR0cDovL29wZW5qZGsuamF2YS5uZXQvbGVnYWwvZXhjZXB0aW9uLW1vZHVsZXMtMjAwNy0wNS0wOC5odG1sCiAgICAgKCJEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIikgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAogICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMsCiAgICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIEdQTDIsCiAgICAgcHJvdmlkZWQgdGhhdCB0aGUgRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyBjb250aW51ZSB0byBiZQotICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBPcmFjbGUuCisgICAgZ292ZXJuZWQgYnkgdGhlIGxpY2Vuc2VzIHVuZGVyIHdoaWNoIHRoZXkgd2VyZSBvZmZlcmVkIGJ5IFN1bi4KIAotQXMgc3VjaCwgaXQgYWxsb3dzIGxpY2Vuc2VlcyBhbmQgc3VibGljZW5zZWVzIG9mIE9yYWNsZSdzIEdQTDIgT3BlbkpESyBDb2RlCi10byBidWlsZCBhbiBleGVjdXRhYmxlIHRoYXQgaW5jbHVkZXMgdGhvc2UgcG9ydGlvbnMgb2YgbmVjZXNzYXJ5IGNvZGUgdGhhdAotT3JhY2xlIGNvdWxkIG5vdCBwcm92aWRlIHVuZGVyIEdQTDIgKG9yIHRoYXQgT3JhY2xlIGhhcyBwcm92aWRlZCB1bmRlciBHUEwyCi13aXRoIHRoZSBDbGFzc3BhdGggZXhjZXB0aW9uKS4gIElmIHlvdSBtb2RpZnkgb3IgYWRkIHRvIHRoZSBPcGVuSkRLIGNvZGUsCi10aGF0IG5ldyBHUEwyIGNvZGUgbWF5IHN0aWxsIGJlIGNvbWJpbmVkIHdpdGggRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcwotaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byB0aGlzIGV4Y2VwdGlvbiBieSBpdHMgY29weXJpZ2h0IGhvbGRlci4KK0FzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBTdW4ncyBHUEwyIE9wZW5KREsgQ29kZSB0bworYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQgU3VuCitjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IFN1biBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMiB3aXRoIHRoZQorQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLCB0aGF0IG5ldworR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgaWYgdGhlCituZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCmRpZmYgLS1naXQgYS9qZGsvTElDRU5TRSBiL2pkay9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL2pkay9MSUNFTlNFCisrKyBiL2pkay9MSUNFTlNFCkBAIC0zLDcgKzMsNyBAQAogVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQogZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KQEAgLTI4Nyw4ICsyODcsOCBAQAogICAgIG1vcmUgZGV0YWlscy4KIAogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgICAgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCiAKZGlmZiAtLWdpdCBhL2pkay9tYWtlL0NvcHlGaWxlcy5nbWsgYi9qZGsvbWFrZS9Db3B5RmlsZXMuZ21rCmluZGV4IGJjMDcwZjAuLjljN2U3YmMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL0NvcHlGaWxlcy5nbWsKKysrIGIvamRrL21ha2UvQ29weUZpbGVzLmdtawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1NywyMSArMzU3LDE4IEBACiBSRVNUUklDVEVEX1BLR1NfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9saWIvc2VjdXJpdHkvcmVzdHJpY3RlZC5wa2dzCiBSRVNUUklDVEVEX1BLR1MgOj0gJChzaGVsbCAkKENBVCkgJChSRVNUUklDVEVEX1BLR1NfU1JDKSB8ICQoVFIpICJcbiIgIiAiKQogCi1lbmRpZgotCiAkKFBST1BTX0RTVCk6ICQoUFJPUFNfU1JDKQogCSQoTUtESVIpIC1wICQoQEQpCi0gICAgICAgIGlmbmRlZiBPUEVOSkRLCi0JICAkKFRPT0xfQUREVE9SRVNUUklDVEVEUEtHUykgJF4gJEAudG1wICQoUkVTVFJJQ1RFRF9QS0dTKQotICAgICAgICBlbHNlCi0JICAkKENQKSAkXiAkQC50bXAKLSAgICAgICAgZW5kaWYKLSAgICAgICAgaWZlcSAoJChVTkxJTUlURURfQ1JZUFRPKSwgdHJ1ZSkKLQkgICQoVE9PTF9DUllQVE9MRVZFTCkgJEAudG1wICRALnRtcDIgdW5saW1pdGVkCi0JICAkKE1WKSAkQC50bXAyICRALnRtcAotICAgICAgICBlbmRpZgorCSQoVE9PTF9BRERUT1JFU1RSSUNURURQS0dTKSAkXiAkQC50bXAgJChSRVNUUklDVEVEX1BLR1MpCiAJJChNVikgJEAudG1wICRACiAKK2Vsc2UKKworJChQUk9QU19EU1QpOiAkKFBST1BTX1NSQykKKwkkKGNhbGwgaW5zdGFsbC1maWxlKQorCitlbmRpZgorCiBDT1BZX0ZJTEVTICs9ICQoUFJPUFNfRFNUKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pkay9tYWtlL0NyZWF0ZVNlY3VyaXR5SmFycy5nbWsgYi9qZGsvbWFrZS9DcmVhdGVTZWN1cml0eUphcnMuZ21rCmluZGV4IGRhOWNjMjAuLmQ1YjNiOGUgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL0NyZWF0ZVNlY3VyaXR5SmFycy5nbWsKKysrIGIvamRrL21ha2UvQ3JlYXRlU2VjdXJpdHlKYXJzLmdtawpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE3OCwxMCArMTc4LDcgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLVVTX0VYUE9SVF9QT0xJQ1lfSkFSX1VOTElNSVRFRF9EU1QgOj0gXAotICAgICQoSkRLX09VVFBVVERJUikvbGliL3NlY3VyaXR5L3BvbGljeS91bmxpbWl0ZWQvVVNfZXhwb3J0X3BvbGljeS5qYXIKLVVTX0VYUE9SVF9QT0xJQ1lfSkFSX0xJTUlURURfRFNUIDo9IFwKLSAgICAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9wb2xpY3kvbGltaXRlZC9VU19leHBvcnRfcG9saWN5LmphcgorVVNfRVhQT1JUX1BPTElDWV9KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL3NlY3VyaXR5L1VTX2V4cG9ydF9wb2xpY3kuamFyCiAKIGlmbmVxICgkKEJVSUxEX0NSWVBUTyksIG5vKQogCkBAIC0yMjMsMjkgKzIyMCwyNyBAQAogZW5kaWYKIAogaWZuZGVmIE9QRU5KREsKLSAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9VTkxJTUlURURfRFNUKTogXAotICAgICQoSkRLX1RPUERJUikvbWFrZS9jbG9zZWQvdG9vbHMvY3J5cHRvL2pjZS91bmxpbWl0ZWQvVVNfZXhwb3J0X3BvbGljeS5qYXIKLQkkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgcHJlYnVpbHQgJChARikKLQkkKGluc3RhbGwtZmlsZSkKLSAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9MSU1JVEVEX0RTVCk6IFwKLSAgICAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvbGltaXRlZC9VU19leHBvcnRfcG9saWN5LmphcgorICBpZmVxICgkKFVOTElNSVRFRF9DUllQVE8pLCB0cnVlKQorICAgICQoZXJyb3IgTm8gcHJlYnVpbHQgdW5saW1pdGVkIGNyeXB0byBqYXJzIGF2YWlsYWJsZSkKKyAgZW5kaWYKKyAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9EU1QpOiAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvVVNfZXhwb3J0X3BvbGljeS5qYXIKIAkkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgcHJlYnVpbHQgJChARikKIAkkKGluc3RhbGwtZmlsZSkKIGVsc2UKLSAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9VTkxJTUlURURfRFNUKTogJChVU19FWFBPUlRfUE9MSUNZX0pBUl9VTkxJTUlURURfVU5TSUdORUQpCisgIGlmZXEgKCQoVU5MSU1JVEVEX0NSWVBUTyksIHRydWUpCisgICAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9EU1QpOiAkKFVTX0VYUE9SVF9QT0xJQ1lfSkFSX1VOTElNSVRFRF9VTlNJR05FRCkKIAkkKGluc3RhbGwtZmlsZSkKLSAgJChVU19FWFBPUlRfUE9MSUNZX0pBUl9MSU1JVEVEX0RTVCk6ICQoVVNfRVhQT1JUX1BPTElDWV9KQVJfTElNSVRFRF9VTlNJR05FRCkKKyAgZWxzZQorICAgICQoVVNfRVhQT1JUX1BPTElDWV9KQVJfRFNUKTogJChVU19FWFBPUlRfUE9MSUNZX0pBUl9MSU1JVEVEX1VOU0lHTkVEKQogCSQoaW5zdGFsbC1maWxlKQogICBlbmRpZgorZW5kaWYKIAotVEFSR0VUUyArPSAkKFVTX0VYUE9SVF9QT0xJQ1lfSkFSX1VOTElNSVRFRF9EU1QpICQoVVNfRVhQT1JUX1BPTElDWV9KQVJfTElNSVRFRF9EU1QpCitUQVJHRVRTICs9ICQoVVNfRVhQT1JUX1BPTElDWV9KQVJfRFNUKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotTE9DQUxfUE9MSUNZX0pBUl9MSU1JVEVEX0RTVCA6PSBcCi0gICAgJChKREtfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvcG9saWN5L2xpbWl0ZWQvbG9jYWxfcG9saWN5LmphcgotTE9DQUxfUE9MSUNZX0pBUl9VTkxJTUlURURfRFNUIDo9IFwKLSAgICAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9wb2xpY3kvdW5saW1pdGVkL2xvY2FsX3BvbGljeS5qYXIKK0xPQ0FMX1BPTElDWV9KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL3NlY3VyaXR5L2xvY2FsX3BvbGljeS5qYXIKIAogaWZuZXEgKCQoQlVJTERfQ1JZUFRPKSwgbm8pCiAKQEAgLTI5OCwyMCArMjkzLDIwIEBACiBlbmRpZgogCiBpZm5kZWYgT1BFTkpESwotICAkKExPQ0FMX1BPTElDWV9KQVJfVU5MSU1JVEVEX0RTVCk6ICQoSkRLX1RPUERJUikvbWFrZS9jbG9zZWQvdG9vbHMvY3J5cHRvL2pjZS91bmxpbWl0ZWQvbG9jYWxfcG9saWN5LmphcgotCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyBwcmVidWlsdCAkKEBGKQotCSQoaW5zdGFsbC1maWxlKQotICAkKExPQ0FMX1BPTElDWV9KQVJfTElNSVRFRF9EU1QpOiAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvbGltaXRlZC9sb2NhbF9wb2xpY3kuamFyCisgICQoTE9DQUxfUE9MSUNZX0pBUl9EU1QpOiAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvbG9jYWxfcG9saWN5LmphcgogCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyBwcmVidWlsdCAkKEBGKQogCSQoaW5zdGFsbC1maWxlKQogZWxzZQotICAkKExPQ0FMX1BPTElDWV9KQVJfVU5MSU1JVEVEX0RTVCk6ICQoTE9DQUxfUE9MSUNZX0pBUl9VTkxJTUlURURfVU5TSUdORUQpCisgIGlmZXEgKCQoVU5MSU1JVEVEX0NSWVBUTyksIHRydWUpCisgICAgJChMT0NBTF9QT0xJQ1lfSkFSX0RTVCk6ICQoTE9DQUxfUE9MSUNZX0pBUl9VTkxJTUlURURfVU5TSUdORUQpCiAJJChpbnN0YWxsLWZpbGUpCi0gICQoTE9DQUxfUE9MSUNZX0pBUl9MSU1JVEVEX0RTVCk6ICQoTE9DQUxfUE9MSUNZX0pBUl9MSU1JVEVEX1VOU0lHTkVEKQorICBlbHNlCisgICAgJChMT0NBTF9QT0xJQ1lfSkFSX0RTVCk6ICQoTE9DQUxfUE9MSUNZX0pBUl9MSU1JVEVEX1VOU0lHTkVEKQogCSQoaW5zdGFsbC1maWxlKQogICBlbmRpZgorZW5kaWYKIAotVEFSR0VUUyArPSAkKExPQ0FMX1BPTElDWV9KQVJfVU5MSU1JVEVEX0RTVCkgJChMT0NBTF9QT0xJQ1lfSkFSX0xJTUlURURfRFNUKQorVEFSR0VUUyArPSAkKExPQ0FMX1BPTElDWV9KQVJfRFNUKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApkaWZmIC0tZ2l0IGEvamRrL21ha2UvVG9vbHMuZ21rIGIvamRrL21ha2UvVG9vbHMuZ21rCmluZGV4IGFmYjlmODYuLmI0NWQ1ZGMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL1Rvb2xzLmdtaworKysgYi9qZGsvbWFrZS9Ub29scy5nbWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMzIsMTAgKzEzMiw3IEBACiAgICAgYnVpbGQudG9vbHMuZGVwcy5DaGVja0RlcHMKIAogVE9PTF9BRERUT1JFU1RSSUNURURQS0dTPSQoSkFWQV9TTUFMTCkgLWNwICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzIFwKLSAgICBidWlsZC50b29scy5jdXN0b21pemVzZWN1cml0eWZpbGUuQWRkVG9SZXN0cmljdGVkUGtncwotCi1UT09MX0NSWVBUT0xFVkVMPSQoSkFWQV9TTUFMTCkgLWNwICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzIFwKLSAgICBidWlsZC50b29scy5jdXN0b21pemVzZWN1cml0eWZpbGUuQ3J5cHRvTGV2ZWwKKyAgICBidWlsZC50b29scy5hZGR0b3Jlc3RyaWN0ZWRwa2dzLkFkZFRvUmVzdHJpY3RlZFBrZ3MKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL1ZFUlNJT04gYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9WRVJTSU9OCmluZGV4IGY1ODdjYjcuLjZiZjM2NjEgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL1ZFUlNJT04KKysrIGIvamRrL21ha2UvZGF0YS90emRhdGEvVkVSU0lPTgpAQCAtMjEsNCArMjEsNCBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKLXR6ZGF0YTIwMTZnCit0emRhdGEyMDE2ZgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvYWZyaWNhIGIvamRrL21ha2UvZGF0YS90emRhdGEvYWZyaWNhCmluZGV4IGNiZGUyMzguLmI1MjNkYzMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2FmcmljYQorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9hZnJpY2EKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogIyBodHRwOi8vd3d3LmxpYnlhaGVyYWxkLmNvbS8yMDEzLzEwLzI0L2NvcnJlY3Rpb24tbm8tdGltZS1jaGFuZ2UtdG9tb3Jyb3cvCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMTAtMjUpOgotIyBGb3Igbm93LCBhc3N1bWUgdGhleSdyZSByZXZlcnRpbmcgdG8gdGhlIHByZS0yMDEyIHJ1bGVzIG9mIHBlcm1hbmVudCBVVCArMDIuCisjIEZvciBub3csIGFzc3VtZSB0aGV5J3JlIHJldmVydGluZyB0byB0aGUgcHJlLTIwMTIgcnVsZXMgb2YgcGVybWFuZW50IFVUQysyLgogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlMaWJ5YQkxOTUxCW9ubHkJLQlPY3QJMTQJMjowMAkxOjAwCVMKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2FudGFyY3RpY2EgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9hbnRhcmN0aWNhCmluZGV4IGY5Njk0N2EuLmUxMmM3NjQgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2FudGFyY3RpY2EKKysrIGIvamRrL21ha2UvZGF0YS90emRhdGEvYW50YXJjdGljYQpAQCAtMzMsNyArMzMsOSBAQAogIyBodHRwOi8vd3d3LnNwcmkuY2FtLmFjLnVrL2JvYi9wZXJpYW50Lmh0bQogIyBmb3IgaW5mb3JtYXRpb24uCiAjIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB3ZSBoYXZlIG5vIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4KLQorIworIyBFeGNlcHQgZm9yIHRoZSBGcmVuY2ggZW50cmllcywKKyMgSSBtYWRlIHVwIGFsbCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBtZW50aW9uZWQgaGVyZTsgY29ycmVjdGlvbnMgd2VsY29tZSEKICMgRk9STUFUIGlzICctMDAnIGFuZCBHTVRPRkYgaXMgMCBmb3IgbG9jYXRpb25zIHdoaWxlIHVuaW5oYWJpdGVkLgogCiAjIEFyZ2VudGluYSAtIHllYXItcm91bmQgYmFzZXMKQEAgLTUwLDcgKzUyLDcgQEAKICMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAogIwlNYXJnYXJldCBUdXJuZXIgcmVwb3J0cwogIwlodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTIwNDIyMjI0NS9odHRwOi8vd3d3LmRzdGMucXV0LmVkdS5hdS9EU1QvbWFyZy9kYXlsaWdodC5odG1sCi0jCSgxOTk5LTA5LTMwKSB0aGF0IHRoZXkncmUgVVQgKzA1LCB3aXRoIG5vIERTVDsKKyMJKDE5OTktMDktMzApIHRoYXQgdGhleSdyZSBVVEMrNSwgd2l0aCBubyBEU1Q7CiAjCXByZXN1bWFibHkgdGhpcyBpcyB3aGVuIHRoZXkgaGF2ZSB2aXNpdG9ycy4KICMKICMgeWVhci1yb3VuZCBiYXNlcwpAQCAtODksMjIgKzkxLDIzIEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9DYXNleQkwCS0JLTAwCTE5NjkKLQkJCTg6MDAJLQkrMDgJMjAwOSBPY3QgMTggIDI6MDAKLQkJCTExOjAwCS0JKzExCTIwMTAgTWFyICA1ICAyOjAwCi0JCQk4OjAwCS0JKzA4CTIwMTEgT2N0IDI4ICAyOjAwCi0JCQkxMTowMAktCSsxMQkyMDEyIEZlYiAyMSAxNzowMHUKLQkJCTg6MDAJLQkrMDgKKwkJCTg6MDAJLQlBV1NUCTIwMDkgT2N0IDE4ICAyOjAwCisJCQkJCQkjIEF1c3RyYWxpYW4gV2VzdGVybiBTdGQgVGltZQorCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyICA1ICAyOjAwICAjIENhc2V5IFRpbWUKKwkJCTg6MDAJLQlBV1NUCTIwMTEgT2N0IDI4ICAyOjAwCisJCQkxMTowMAktCUNBU1QJMjAxMiBGZWIgMjEgMTc6MDB1CisJCQk4OjAwCS0JQVdTVAogWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQktMDAJMTk1NyBKYW4gMTMKLQkJCTc6MDAJLQkrMDcJMTk2NCBOb3YKKwkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICAgICMgRGF2aXMgVGltZQogCQkJMAktCS0wMAkxOTY5IEZlYgotCQkJNzowMAktCSswNwkyMDA5IE9jdCAxOCAgMjowMAotCQkJNTowMAktCSswNQkyMDEwIE1hciAxMCAyMDowMHUKLQkJCTc6MDAJLQkrMDcJMjAxMSBPY3QgMjggIDI6MDAKLQkJCTU6MDAJLQkrMDUJMjAxMiBGZWIgMjEgMjA6MDB1Ci0JCQk3OjAwCS0JKzA3CisJCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAgMjowMAorCQkJNTowMAktCURBVlQJMjAxMCBNYXIgMTAgMjA6MDB1CisJCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAgMjowMAorCQkJNTowMAktCURBVlQJMjAxMiBGZWIgMjEgMjA6MDB1CisJCQk3OjAwCS0JREFWVAogWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0JLTAwCTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JKzA2CTIwMDkgT2N0IDE4ICAyOjAwCi0JCQk1OjAwCS0JKzA1CisJCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAgMjowMCAjIE1hd3NvbiBUaW1lCisJCQk1OjAwCS0JTUFXVAogIyBSZWZlcmVuY2VzOgogIyBDYXNleSBXZWF0aGVyICgxOTk4LTAyLTI2KQogIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sCkBAIC0xNTgsNyArMTYxLDcgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgSW5kaWFuL0tlcmd1ZWxlbgkwCS0JLTAwCTE5NTAgIyBQb3J0LWF1eC1GcmFuw6dhaXMKLQkJCTU6MDAJLQkrMDUKKwkJCTU6MDAJLQlURlQJIyBJU08gY29kZSBURiBUaW1lCiAjCiAjIHllYXItcm91bmQgYmFzZSBpbiB0aGUgbWFpbiBjb250aW5lbnQKICMgRHVtb250IGQnVXJ2aWxsZSwgw45sZSBkZXMgUMOpdHJlbHMsIC02NjQwKzE0MDAxLCBzaW5jZSAxOTU2LTExCkBAIC0xNjksOSArMTcyLDkgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZSAwIC0JLTAwCTE5NDcKLQkJCTEwOjAwCS0JKzEwCTE5NTIgSmFuIDE0CisJCQkxMDowMAktCVBNVAkxOTUyIEphbiAxNCAjIFBvcnQtTWFydGluIFRpbWUKIAkJCTAJLQktMDAJMTk1NiBOb3YKLQkJCTEwOjAwCS0JKzEwCisJCQkxMDowMAktCUREVVQJIyBEdW1vbnQtZCdVcnZpbGxlIFRpbWUKIAogIyBGcmFuY2UgJiBJdGFseSAtIHllYXItcm91bmQgYmFzZQogIyBDb25jb3JkaWEsIC03NTA2MDArMTIzMjAwMCwgc2luY2UgMjAwNQpAQCAtMTk3LDcgKzIwMCw3IEBACiAjIHN0YXRpb24gb2YgSmFwYW4sIGl0J3MgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcmluY2lwYWwgbG9jYXRpb24uCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFudGFyY3RpY2EvU3lvd2EJMAktCS0wMAkxOTU3IEphbiAyOQotCQkJMzowMAktCSswMworCQkJMzowMAktCVNZT1QJIyBTeW93YSBUaW1lCiAjIFNlZToKICMgTklQUiBBbnRhcmN0aWMgUmVzZWFyY2ggQWN0aXZpdGllcyAoMTk5OS0wOC0xNykKICMgaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbApAQCAtMjM0LDE3ICsyMzcsMTcgQEAKICMgY29ycmVjdCwgYnV0IHRoZXkgc2hvdWxkIGJlIHF1aXRlIGNsb3NlIHRvIHRoZSBhY3R1YWwgZGF0ZXMuCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDMtMjEpOgotIyBUaGUgQ0VULXN3aXRjaGluZyBUcm9sbCBydWxlcyByZXF1aXJlIHppYyBmcm9tIHR6IDIwMTRiIG9yIGxhdGVyLCBzbyBhcworIyBUaGUgQ0VULXN3aXRjaGluZyBUcm9sbCBydWxlcyByZXF1aXJlIHppYyBmcm9tIHR6Y29kZSAyMDE0YiBvciBsYXRlciwgc28gYXMKICMgc3VnZ2VzdGVkIGJ5IEJlbmd0LUluZ2UgTGFyc3NvbiBjb21tZW50IHRoZW0gb3V0IGZvciBub3csIGFuZCBhcHByb3hpbWF0ZQogIyB3aXRoIG9ubHkgVVRDIGFuZCBDRVNULiAgVW5jb21tZW50IHRoZW0gd2hlbiAyMDE0YiBpcyBtb3JlIHByZXZhbGVudC4KICMKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jUnVsZQlUcm9sbAkyMDA1CW1heAktCU1hcgkgMQkxOjAwdQkxOjAwCSswMQotUnVsZQlUcm9sbAkyMDA1CW1heAktCU1hcglsYXN0U3VuCTE6MDB1CTI6MDAJKzAyCi0jUnVsZQlUcm9sbAkyMDA1CW1heAktCU9jdAlsYXN0U3VuCTE6MDB1CTE6MDAJKzAxCi0jUnVsZQlUcm9sbAkyMDA0CW1heAktCU5vdgkgNwkxOjAwdQkwOjAwCSswMAorI1J1bGUJVHJvbGwJMjAwNQltYXgJLQlNYXIJIDEJMTowMHUJMTowMAlDRVQKK1J1bGUJVHJvbGwJMjAwNQltYXgJLQlNYXIJbGFzdFN1bgkxOjAwdQkyOjAwCUNFU1QKKyNSdWxlCVRyb2xsCTIwMDUJbWF4CS0JT2N0CWxhc3RTdW4JMTowMHUJMTowMAlDRVQKKyNSdWxlCVRyb2xsCTIwMDQJbWF4CS0JTm92CSA3CTE6MDB1CTA6MDAJVVRDCiAjIFJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgd2hlbiB1bmNvbW1lbnRpbmcgdGhlIGFib3ZlICcjUnVsZScgbGluZXMuCi1SdWxlCVRyb2xsCTIwMDQJbWF4CS0JT2N0CWxhc3RTdW4JMTowMHUJMDowMAkrMDAKK1J1bGUJVHJvbGwJMjAwNAltYXgJLQlPY3QJbGFzdFN1bgkxOjAwdQkwOjAwCVVUQwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL1Ryb2xsCTAJLQktMDAJMjAwNSBGZWIgMTIKIAkJCTA6MDAJVHJvbGwJJXMKQEAgLTI4NSwxMCArMjg4LDEwIEBACiAjIGNoYW5nZXMgZHVyaW5nIHRoZSB5ZWFyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lYW4KICMgc29sYXIgbm9vbi4gIFNvIHRoZSBWb3N0b2sgdGltZSBtaWdodCBoYXZlIGJlZW4gd2hhdGV2ZXIgdGhlIGNsb2NrcwogIyBoYXBwZW5lZCB0byBiZSBkdXJpbmcgdGhlaXIgdmlzaXQuICBTbyB3ZSBzdGlsbCBkb24ndCByZWFsbHkga25vdyB3aGF0IHRpbWUKLSMgaXQgaXMgYXQgVm9zdG9rLiAgQnV0IHdlJ2xsIGd1ZXNzICswNi4KKyMgaXQgaXMgYXQgVm9zdG9rLiAgQnV0IHdlJ2xsIGd1ZXNzIFVUQys2LgogIwogWm9uZSBBbnRhcmN0aWNhL1Zvc3RvawkwCS0JLTAwCTE5NTcgRGVjIDE2Ci0JCQk2OjAwCS0JKzA2CisJCQk2OjAwCS0JVk9TVAkjIFZvc3RvayB0aW1lCiAKICMgUyBBZnJpY2EgLSB5ZWFyLXJvdW5kIGJhc2VzCiAjIE1hcmlvbiBJc2xhbmQsIC00NjUzKzAzNzUyCkBAIC0zMjEsNyArMzI0LDcgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9Sb3RoZXJhCTAJLQktMDAJMTk3NiBEZWMgIDEKLQkJCS0zOjAwCS0JLTAzCisJCQktMzowMAktCVJPVFQJIyBSb3RoZXJhIHRpbWUKIAogIyBVcnVndWF5IC0geWVhciByb3VuZCBiYXNlCiAjIEFydGlnYXMsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTEwNC0wNTg1MTA3CmRpZmYgLS1naXQgYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9hc2lhIGIvamRrL21ha2UvZGF0YS90emRhdGEvYXNpYQppbmRleCA2NWU1Zjk0Li4zNWFjMzdjIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9hc2lhCisrKyBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2FzaWEKQEAgLTEzOSwxMSArMTM5LDEzIEBACiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfYXJtZW5pYTAzLmh0bWwKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9ZZXJldmFuCTI6NTg6MDAgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTM6MDAJLQkrMDMJMTk1NyBNYXIKLQkJCTQ6MDAgUnVzc2lhQXNpYSArMDQvKzA1CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJMzowMCBSdXNzaWFBc2lhCSswMy8rMDQJMTk5NSBTZXAgMjQgIDI6MDBzCi0JCQk0OjAwCS0JKzA0CTE5OTcKLQkJCTQ6MDAgUnVzc2lhQXNpYQkrMDQvKzA1CisJCQkzOjAwCS0JWUVSVAkxOTU3IE1hciAgICAjIFllcmV2YW4gVGltZQorCQkJNDowMCBSdXNzaWFBc2lhIFlFUiVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTM6MDAJMTowMAlZRVJTVAkxOTkxIFNlcCAyMyAjIGluZGVwZW5kZW5jZQorCQkJMzowMCBSdXNzaWFBc2lhCUFNJXNUCTE5OTUgU2VwIDI0ICAyOjAwcworCQkJNDowMAktCUFNVAkxOTk3CisJCQk0OjAwIFJ1c3NpYUFzaWEJQU0lc1QJMjAxMiBGZWIgIDkKKwkJCTQ6MDAJLQlBTVQKIAogIyBBemVyYmFpamFuCiAKQEAgLTE2NCwxMiArMTY2LDEzIEBACiBSdWxlCUF6ZXIJMTk5NwkyMDE1CS0JT2N0CWxhc3RTdW4JIDU6MDAJMAktCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvQmFrdQkzOjE5OjI0IC0JTE1UCTE5MjQgTWF5ICAyCi0JCQkzOjAwCS0JKzAzCTE5NTcgTWFyCi0JCQk0OjAwIFJ1c3NpYUFzaWEgKzA0LyswNQkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTM6MDAgUnVzc2lhQXNpYQkrMDMvKzA0CTE5OTIgU2VwIGxhc3RTdW4gIDI6MDBzCi0JCQk0OjAwCS0JKzA0CTE5OTYKLQkJCTQ6MDAJRVVBc2lhCSswNC8rMDUJMTk5NwotCQkJNDowMAlBemVyCSswNC8rMDUKKwkJCTM6MDAJLQlCQUtUCTE5NTcgTWFyICAgICMgQmFrdSBUaW1lCisJCQk0OjAwIFJ1c3NpYUFzaWEgQkFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMzowMAkxOjAwCUJBS1NUCTE5OTEgQXVnIDMwICMgaW5kZXBlbmRlbmNlCisJCQkzOjAwIFJ1c3NpYUFzaWEJQVolc1QJMTk5MiBTZXAgbGFzdFN1biAgMjowMHMKKwkJCTQ6MDAJLQlBWlQJMTk5NiAgICAgIyBBemVyYmFpamFuIFRpbWUKKwkJCTQ6MDAJRVVBc2lhCUFaJXNUCTE5OTcKKwkJCTQ6MDAJQXplcglBWiVzVAogCiAjIEJhaHJhaW4KICMgU2VlIEFzaWEvUWF0YXIuCkBAIC0yODgsNyArMjkxLDcgQEAKICMgTWlsbmUgc2F5cyA2OjI0OjQwIHdhcyB0aGUgbWVyaWRpYW4gb2YgdGhlIHRpbWUgYmFsbCBvYnNlcnZhdG9yeSBhdCBSYW5nb29uLgogCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCi1ab25lCUFzaWEvWWFuZ29uCTY6MjQ6NDAgLQlMTVQJMTg4MCAgICAgICAgIyBvciBSYW5nb29uCitab25lCUFzaWEvUmFuZ29vbgk2OjI0OjQwIC0JTE1UCTE4ODAgICAgICAgICMgb3IgWWFuZ29uCiAJCQk2OjI0OjQwCS0JUk1UCTE5MjAgICAgICAgICMgUmFuZ29vbiBNZWFuIFRpbWU/CiAJCQk2OjMwCS0JQlVSVAkxOTQyIE1heSAgICAjIEJ1cm1hIFRpbWUKIAkJCTk6MDAJLQlKU1QJMTk0NSBNYXkgIDMKQEAgLTQwMyw3ICs0MDYsNyBAQAogIyBMZXdpc3RvbiAoTUUpIERhaWx5IFN1biAoMTkzOS0wNS0yOSksIHAgMTcsIHNhaWQgIkV2ZW4gdGhlIHRpbWUgaXMKICMgZGlmZmVyZW50IC0gdGhlIG9jY3VwaWVkIGRpc3RyaWN0cyBnb2luZyBieSBUb2t5byB0aW1lLCBhbiBob3VyCiAjIGFoZWFkIG9mIHRoYXQgcHJldmFpbGluZyBpbiB0aGUgcmVzdCBvZiBTaGFuZ2hhaS4iICBHdWVzcyB0aGF0IHRoZQotIyBYdWppYWh1aSBPYnNlcnZhdG9yeSB3YXMgdW5kZXIgRnJlbmNoIGNvbnRyb2wgYW5kIHN0dWNrIHdpdGggVVQgKzA4LgorIyBYdWppYWh1aSBPYnNlcnZhdG9yeSB3YXMgdW5kZXIgRnJlbmNoIGNvbnRyb2wgYW5kIHN0dWNrIHdpdGggVVQrOC4KICMKICMgSW4gZWFybGllciB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUsIENoaW5hIGhhZCBtYW55IHNlcGFyYXRlIFpvbmUgZW50cmllcywgYnV0CiAjIHRoaXMgd2FzIGJhc2VkIG9uIHdoYXQgd2VyZSBhcHBhcmVudGx5IGluY29ycmVjdCBkYXRhIGluIFNoYW5rcyAmIFBvdHRlbmdlci4KQEAgLTQxMiwyNiArNDE1LDI2IEBACiAjIFByb3Bvc2VkIGluIDE5MTggYW5kIHRoZW9yZXRpY2FsbHkgaW4gZWZmZWN0IHVudGlsIDE5NDkgKGFsdGhvdWdoIGluIHByYWN0aWNlCiAjIG1haW5seSBvYnNlcnZlZCBpbiBjb2FzdGFsIGFyZWFzKSwgdGhlIGZpdmUgem9uZXMgd2VyZToKICMKLSMgQ2hhbmdiYWkgVGltZSAoIkxvbmctd2hpdGUgVGltZSIsIExvbmctd2hpdGUgPSBIZWlsb25namlhbmcgYXJlYSkgVVQgKzA4OjMwCisjIENoYW5nYmFpIFRpbWUgKCJMb25nLXdoaXRlIFRpbWUiLCBMb25nLXdoaXRlID0gSGVpbG9uZ2ppYW5nIGFyZWEpIFVUKzguNQogIyBBc2lhL0hhcmJpbiAoY3VycmVudGx5IGEgbGluayB0byBBc2lhL1NoYW5naGFpKQogIyBIZWlsb25namlhbmcgKGV4Y2VwdCBNb2hlIGNvdW50eSksIEppbGluCiAjCi0jIFpob25neXVhbiBUaW1lICgiQ2VudHJhbCBwbGFpbiBUaW1lIikgVVQgKzA4CisjIFpob25neXVhbiBUaW1lICgiQ2VudHJhbCBwbGFpbiBUaW1lIikgVVQrOAogIyBBc2lhL1NoYW5naGFpCiAjIG1vc3Qgb2YgQ2hpbmEKICMgVGhpcyBjdXJyZW50bHkgcmVwcmVzZW50cyBtb3N0IG90aGVyIHpvbmVzIGFzIHdlbGwsCiAjIGFzIGFwcGFyZW50bHkgdGhlc2UgcmVnaW9ucyBoYXZlIGJlZW4gdGhlIHNhbWUgc2luY2UgMTk3MC4KICMgTWlsbmUgZ2l2ZXMgODowNTo0My4yIGZvciBYdWppYWh1aSBPYnNlcnZhdG9yeSB0aW1lOyByb3VuZCB0byBuZWFyZXN0LgotIyBHdW8gc2F5cyBTaGFuZ2hhaSBzd2l0Y2hlZCB0byBVVCArMDggImZyb20gdGhlIGVuZCBvZiB0aGUgMTl0aCBjZW50dXJ5Ii4KKyMgR3VvIHNheXMgU2hhbmdoYWkgc3dpdGNoZWQgdG8gVVQrOCAiZnJvbSB0aGUgZW5kIG9mIHRoZSAxOXRoIGNlbnR1cnkiLgogIwotIyBMb25nLXNodSBUaW1lIChwcm9iYWJseSBkdWUgdG8gTG9uZyBhbmQgU2h1IGJlaW5nIHR3byBuYW1lcyBvZiB0aGUgYXJlYSkgVVQgKzA3CisjIExvbmctc2h1IFRpbWUgKHByb2JhYmx5IGR1ZSB0byBMb25nIGFuZCBTaHUgYmVpbmcgdHdvIG5hbWVzIG9mIHRoYXQgYXJlYSkgVVQrNwogIyBBc2lhL0Nob25ncWluZyAoY3VycmVudGx5IGEgbGluayB0byBBc2lhL1NoYW5naGFpKQogIyBHdWFuZ3hpLCBHdWl6aG91LCBIYWluYW4sIE5pbmd4aWEsIFNpY2h1YW4sIFNoYWFueGksIGFuZCBZdW5uYW47CiAjIG1vc3Qgb2YgR2Fuc3U7IHdlc3QgSW5uZXIgTW9uZ29saWE7IHdlc3QgUWluZ2hhaTsgYW5kIHRoZSBHdWFuZ2RvbmcKICMgY291bnRpZXMgRGVxaW5nLCBFbnBpbmcsIEthaXBpbmcsIEx1b2RpbmcsIFRhaXNoYW4sIFhpbnhpbmcsCiAjIFlhbmdjaHVuLCBZYW5namlhbmcsIFl1J25hbiwgYW5kIFl1bmZ1LgogIwotIyBYaW4temFuZyBUaW1lICgiWGluamlhbmctVGliZXQgVGltZSIpIFVUICswNgorIyBYaW4temFuZyBUaW1lICgiWGluamlhbmctVGliZXQgVGltZSIpIFVUKzYKICMgQXNpYS9VcnVtcWkKICMgVGhpcyBjdXJyZW50bHkgcmVwcmVzZW50cyBLdW5sdW4gVGltZSBhcyB3ZWxsLAogIyBhcyBhcHBhcmVudGx5IHRoZSB0d28gcmVnaW9ucyBoYXZlIGJlZW4gdGhlIHNhbWUgc2luY2UgMTk3MC4KQEAgLTQ0NCw3ICs0NDcsNyBAQAogIyBTaGloZXppLCBDaGFuZ2ppLCBZYW5xaSwgSGVzaHVvLCBUdW9rZXh1biwgVHVsdWZhbiwgU2hhbnNoYW4sIEhhbWksCiAjIEZ1a2FuZywgS3VpdHVuLCBLdW11a3VsaSwgTWlxdWFuLCBRaXRhaSwgYW5kIFR1cmZhbi4KICMKLSMgS3VubHVuIFRpbWUgVVQgKzA1OjMwCisjIEt1bmx1biBUaW1lIFVUKzUuNQogIyBBc2lhL0thc2hnYXIgKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9VcnVtcWkpCiAjIFdlc3QgVGliZXQsIGluY2x1ZGluZyBQdWxhbiwgQWhlcWksIFNodWZ1LCBTaHVsZTsKICMgV2VzdCBYaW5qaWFuZywgaW5jbHVkaW5nIEFrc3UsIEF0dXNoaSwgWWluaW5nLCBIZXRpYW4sIENlbGUsIEx1b3B1LCBOaWxla2UsCkBAIC00NjAsNyArNDYzLDcgQEAKICMKICMgT24gdGhlIG90aGVyIGhhbmQsIGV0aG5pYyBVeWdodXJzLCB3aG8gbWFrZSB1cCBhYm91dCBoYWxmIHRoZQogIyBwb3B1bGF0aW9uIG9mIFhpbmppYW5nLCB0eXBpY2FsbHkgdXNlICJYaW5qaWFuZyB0aW1lIiB3aGljaCBpcyB0d28KLSMgaG91cnMgYmVoaW5kIEJlaWppbmcgdGltZSwgb3IgVVQgKzA2LiBUaGUgZ292ZXJubWVudCBvZiB0aGUgWGluamlhbmcKKyMgaG91cnMgYmVoaW5kIEJlaWppbmcgdGltZSwgb3IgVVRDICswNjAwLiBUaGUgZ292ZXJubWVudCBvZiB0aGUgWGluamlhbmcKICMgVXlnaHVyIEF1dG9ub21vdXMgUmVnaW9uLCAoWEFVUiwgb3IganVzdCBYaW5qaWFuZyBmb3Igc2hvcnQpIGFzIHdlbGwgYXMKICMgbG9jYWwgZ292ZXJubWVudHMgc3VjaCBhcyB0aGUgw5xyw7xtcWkgY2l0eSBnb3Zlcm5tZW50IHVzZSBib3RoIHRpbWVzIGluCiAjIHB1YmxpY2F0aW9ucywgcmVmZXJyaW5nIHRvIHdoYXQgaXMgcG9wdWxhcmx5IGNhbGxlZCBYaW5qaWFuZyB0aW1lIGFzCkBAIC01MTYsOCArNTE5LDggQEAKICMgaGF2aW5nIHRoZSBzYW1lIHRpbWUgYXMgQmVpamluZy4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTMwKToKLSMgSW4gdGhlIGVhcmx5IGRheXMgb2YgdGhlIFBSQywgVGliZXQgd2FzIGdpdmVuIGl0cyBvd24gdGltZSB6b25lIChVVCArMDYpCi0jIGJ1dCB0aGlzIHdhcyB3aXRoZHJhd24gaW4gMTk1OSBhbmQgbmV2ZXIgcmVpbnN0YXRlZDsgc2VlIFR1YnRlbiBLaMOpdHN1biwKKyMgSW4gdGhlIGVhcmx5IGRheXMgb2YgdGhlIFBSQywgVGliZXQgd2FzIGdpdmVuIGl0cyBvd24gdGltZSB6b25lIChVVCs2KSBidXQKKyMgdGhpcyB3YXMgd2l0aGRyYXduIGluIDE5NTkgYW5kIG5ldmVyIHJlaW5zdGF0ZWQ7IHNlZSBUdWJ0ZW4gS2jDqXRzdW4sCiAjIE1lbW9yaWVzIG9mIGxpZmUgaW4gTGhhc2EgdW5kZXIgQ2hpbmVzZSBSdWxlLCBDb2x1bWJpYSBVIFByZXNzLCBJU0JOCiAjIDk3OC0wMjMxMTQyODYxICgyMDA4KSwgdHJhbnNsYXRvcidzIGludHJvZHVjdGlvbiBieSBNYXR0aGV3IEFrZXN0ZXIsIHAgeC4KICMgQXMgdGhpcyBpcyBiZWZvcmUgb3VyIDE5NzAgY3V0b2ZmLCBUaWJldCBkb2Vzbid0IG5lZWQgYSBzZXBhcmF0ZSB6b25lLgpAQCAtNTMxLDEyICs1MzQsMTIgQEAKICMgUmVwdWJsaWNzLCB0aGUgU292aWV0IFVuaW9uLCB0aGUgS3VvbWludGFuZywgYW5kIHRoZSBQZW9wbGUncyBSZXB1YmxpYyBvZgogIyBDaGluYSwgYW5kIHRyYWNraW5nIGRvd24gYWxsIHRoZXNlIG9yZ2FuaXphdGlvbnMnIHRpbWVrZWVwaW5nIHJ1bGVzIHdvdWxkIGJlCiAjIHF1aXRlIGEgdHJpY2suICBBcHByb3hpbWF0ZSB0aGlzIGxvc3QgaGlzdG9yeSBieSBhIHRyYW5zaXRpb24gZnJvbSBMTVQgdG8KLSMgVVQgKzA2IGF0IHRoZSBzdGFydCBvZiAxOTI4LCB0aGUgeWVhciBvZiBhY2Nlc3Npb24gb2YgdGhlIHdhcmxvcmQgSmluIFNodXJlbiwKKyMgWEpUIGF0IHRoZSBzdGFydCBvZiAxOTI4LCB0aGUgeWVhciBvZiBhY2Nlc3Npb24gb2YgdGhlIHdhcmxvcmQgSmluIFNodXJlbiwKICMgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGF0ZSBnaXZlbiBieSBTaGFua3MgJiBQb3R0ZW5nZXIgKG5vIGRvdWJ0IGFzIGEKLSMgZ3Vlc3MpIGFzIHRoZSB0cmFuc2l0aW9uIGZyb20gTE1ULiAgSWdub3JlIHRoZSB1c2FnZSBvZiArMDggYmVmb3JlCi0jIDE5ODYtMDItMDEgdW5kZXIgdGhlIHRoZW9yeSB0aGF0IHRoZSB0cmFuc2l0aW9uIGRhdGUgdG8gKzA4IGlzIHVua25vd24gYW5kCisjIGd1ZXNzKSBhcyB0aGUgdHJhbnNpdGlvbiBmcm9tIExNVC4gIElnbm9yZSB0aGUgdXNhZ2Ugb2YgVVQrOCBiZWZvcmUKKyMgMTk4Ni0wMi0wMSB1bmRlciB0aGUgdGhlb3J5IHRoYXQgdGhlIHRyYW5zaXRpb24gZGF0ZSB0byBVVCs4IGlzIHVua25vd24gYW5kCiAjIHRoYXQgdGhlIHNvcnQgb2YgdXNlcnMgd2hvIHByZWZlciBBc2lhL1VydW1xaSBub3cgdHlwaWNhbGx5IGlnbm9yZWQgdGhlCi0jICswOCBtYW5kYXRlIGJhY2sgdGhlbi4KKyMgVVQrOCBtYW5kYXRlIGJhY2sgdGhlbi4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIyBCZWlqaW5nIHRpbWUsIHVzZWQgdGhyb3VnaG91dCBDaGluYTsgcmVwcmVzZW50ZWQgYnkgU2hhbmdoYWkuCkBAIC03NDEsNyArNzQ0LDcgQEAKICMgYmUgZm91bmQgZnJvbSBoaXN0b3JpY2FsIGdvdmVybm1lbnQgYW5ub3VuY2VtZW50IGRhdGFiYXNlLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDctMDMpOgotIyBBcyBwZXIgWXUtQ2hlbmcgQ2h1YW5nLCBzYXkgdGhhdCBUYWl3YW4gd2FzIGF0IFVUICswOSBmcm9tIDE5MzctMTAtMDEKKyMgQXMgcGVyIFl1LUNoZW5nIENodWFuZywgc2F5IHRoYXQgVGFpd2FuIHdhcyBhdCBVVCs5IGZyb20gMTkzNy0xMC0wMQogIyB1bnRpbCAxOTQ1LTA5LTIxIGF0IDAxOjAwLCBvdmVycmlkaW5nIFNoYW5rcyAmIFBvdHRlbmdlci4KICMgTGlrZXdpc2UsIHVzZSBZdS1DaGVuZyBDaHVhbmcncyBkYXRhIGZvciBEU1QgaW4gVGFpd2FuLgogCkBAIC04NTUsMTUgKzg1OCwxNiBAQAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1RiaWxpc2kJMjo1OToxMSAtCUxNVAkxODgwCiAJCQkyOjU5OjExCS0JVEJNVAkxOTI0IE1heSAgMiAjIFRiaWxpc2kgTWVhbiBUaW1lCi0JCQkzOjAwCS0JKzAzCTE5NTcgTWFyCi0JCQk0OjAwIFJ1c3NpYUFzaWEgKzA0LyswNQkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTM6MDAgUnVzc2lhQXNpYSArMDMvKzA0CTE5OTIKLQkJCTM6MDAgRS1FdXJBc2lhCSswMy8rMDQJMTk5NCBTZXAgbGFzdFN1bgotCQkJNDowMCBFLUV1ckFzaWEJKzA0LyswNQkxOTk2IE9jdCBsYXN0U3VuCi0JCQk0OjAwCTE6MDAJKzA1CTE5OTcgTWFyIGxhc3RTdW4KLQkJCTQ6MDAgRS1FdXJBc2lhCSswNC8rMDUJMjAwNCBKdW4gMjcKLQkJCTM6MDAgUnVzc2lhQXNpYQkrMDMvKzA0CTIwMDUgTWFyIGxhc3RTdW4gIDI6MDAKLQkJCTQ6MDAJLQkrMDQKKwkJCTM6MDAJLQlUQklUCTE5NTcgTWFyICAgICMgVGJpbGlzaSBUaW1lCisJCQk0OjAwIFJ1c3NpYUFzaWEgVEJJJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMzowMAkxOjAwCVRCSVNUCTE5OTEgQXByICA5ICMgaW5kZXBlbmRlbmNlCisJCQkzOjAwIFJ1c3NpYUFzaWEgR0Ulc1QJMTk5MiAgICAgICAgIyBHZW9yZ2lhIFRpbWUKKwkJCTM6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTQgU2VwIGxhc3RTdW4KKwkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTE5OTYgT2N0IGxhc3RTdW4KKwkJCTQ6MDAJMTowMAlHRVNUCTE5OTcgTWFyIGxhc3RTdW4KKwkJCTQ6MDAgRS1FdXJBc2lhCUdFJXNUCTIwMDQgSnVuIDI3CisJCQkzOjAwIFJ1c3NpYUFzaWEJR0Ulc1QJMjAwNSBNYXIgbGFzdFN1biAgMjowMAorCQkJNDowMAktCUdFVAogCiAjIEVhc3QgVGltb3IKIApAQCAtOTQwLDcgKzk0NCw3IEBACiAjIFRoZXNlIHdvdWxkIGJlIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lcyBmb3IgYSBjaGFuZ2UuCiAjIFLDqWdpbWVzIGhvcmFpcmVzIHBvdXIgbGUgbW9uZGUgZW50aWVyLCBieSBIZW5yaSBMZSBDb3JyZSwgKMOJZGl0aW9ucwogIyBUcmFkaXRpb25uZWxsZXMsIDE5ODcsIFBhcmlzKSBzYXlzIHRoYXQgSmF2YSBhbmQgTWFkdXJhIHN3aXRjaGVkCi0jIGZyb20gVVQgKzA5IHRvICswNzozMCBvbiAxOTQ1LTA5LTIzLCBhbmQgZ2l2ZXMgMTk0NC0wOS0wMSBmb3IgSmF5YXB1cmEKKyMgZnJvbSBKU1QgdG8gVVRDKzA3OjMwIG9uIDE5NDUtMDktMjMsIGFuZCBnaXZlcyAxOTQ0LTA5LTAxIGZvciBKYXlhcHVyYQogIyAoSG9sbGFuZGlhKS4gIEZvciBub3csIGFzc3VtZSBhbGwgSW5kb25lc2lhbiBsb2NhdGlvbnMgb3RoZXIgdGhhbiBKYXlhcHVyYQogIyBzd2l0Y2hlZCBvbiAxOTQ1LTA5LTIzLgogIwpAQCAtOTUxLDExICs5NTUsMTEgQEAKICMgc3VtbWFyeSBwdWJsaXNoZWQgYnkgdGhlIFRpbWUgYW5kIEZyZXF1ZW5jeSBMYWJvcmF0b3J5IG9mIHRoZQogIyBSZXNlYXJjaCBDZW50ZXIgZm9yIENhbGlicmF0aW9uLCBJbnN0cnVtZW50YXRpb24gYW5kIE1ldHJvbG9neSwKICMgSW5kb25lc2lhLCA8aHR0cDovL3RpbWUua2ltLmxpcGkuZ28uaWQvdGltZS1lbmcucGhwPiAoMjAwNi0wOS0yOSkuCi0jIFRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBhbmQgVVQgb2Zmc2V0cyBhcmU6CisjIFRoZSBhYmJyZXZpYXRpb25zIGFyZToKICMKLSMgV0lCICAtICswNyAtIFdha3R1IEluZG9uZXNpYSBCYXJhdCAoSW5kb25lc2lhIHdlc3Rlcm4gdGltZSkKLSMgV0lUQSAtICswOCAtIFdha3R1IEluZG9uZXNpYSBUZW5nYWggKEluZG9uZXNpYSBjZW50cmFsIHRpbWUpCi0jIFdJVCAgLSArMDkgLSBXYWt0dSBJbmRvbmVzaWEgVGltdXIgKEluZG9uZXNpYSBlYXN0ZXJuIHRpbWUpCisjIFdJQiAgLSBVVEMrNyAtIFdha3R1IEluZG9uZXNpYSBCYXJhdCAoSW5kb25lc2lhIHdlc3Rlcm4gdGltZSkKKyMgV0lUQSAtIFVUQys4IC0gV2FrdHUgSW5kb25lc2lhIFRlbmdhaCAoSW5kb25lc2lhIGNlbnRyYWwgdGltZSkKKyMgV0lUICAtIFVUQys5IC0gV2FrdHUgSW5kb25lc2lhIFRpbXVyIChJbmRvbmVzaWEgZWFzdGVybiB0aW1lKQogIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogIyBKYXZhLCBTdW1hdHJhCkBAIC0xODQ0LDExICsxODQ4LDExIEBACiBSdWxlCUt5cmd5egkxOTk3CTIwMDQJLQlPY3QJbGFzdFN1bgkyOjMwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0Jpc2hrZWsJNDo1ODoyNCAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCSswNQkxOTMwIEp1biAyMQotCQkJNjowMCBSdXNzaWFBc2lhICswNi8rMDcJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQk1OjAwIFJ1c3NpYUFzaWEJKzA1LyswNgkxOTkxIEF1ZyAzMSAgMjowMAotCQkJNTowMAlLeXJneXoJKzA1LyswNgkyMDA1IEF1ZyAxMgotCQkJNjowMAktCSswNgorCQkJNTowMAktCUZSVVQJMTkzMCBKdW4gMjEgIyBGcnVuemUgVGltZQorCQkJNjowMCBSdXNzaWFBc2lhIEZSVSVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTU6MDAJMTowMAlGUlVTVAkxOTkxIEF1ZyAzMSAgMjowMCAjIGluZGVwZW5kZW5jZQorCQkJNTowMAlLeXJneXoJS0clc1QJMjAwNSBBdWcgMTIgIyBLeXJneXpzdGFuIFRpbWUKKwkJCTY6MDAJLQlLR1QKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCkBAIC0xODg3LDI0ICsxODkxLDI1IEBACiBSdWxlCVJPSwkxOTg3CTE5ODgJLQlNYXkJU3VuPj04CTI6MDAJMTowMAlECiBSdWxlCVJPSwkxOTg3CTE5ODgJLQlPY3QJU3VuPj04CTM6MDAJMAlTCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wOC0yMyk6CisjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMTAtMzApOgogIyBUaGUgS29yZWFuIFdpa2lwZWRpYSBlbnRyeSBnaXZlcyB0aGUgZm9sbG93aW5nIHNvdXJjZXMgZm9yIFVUIG9mZnNldHM6CiAjCi0jIDE5MDg6IE9mZmljaWFsIEpvdXJuYWwgQXJ0aWNsZSBOby4gMzk5NCAoZGVjcmVlIE5vLiA1KQorIyAxOTA4OiBPZmZpY2lhbCBKb3VybmFsIEFydGljbGUgTm8uIDM5OTQgKEVkaWN0IE5vLiA1KQogIyAxOTEyOiBHb3Zlcm5vci1HZW5lcmFsIG9mIEtvcmVhIE9mZmljaWFsIEdhemV0dGUgSXNzdWUgTm8uIDM2NwogIyAgICAgICAoQW5ub3VuY2VtZW50IE5vLiAzMzgpCiAjIDE5NTQ6IFByZXNpZGVudGlhbCBEZWNyZWUgTm8uIDg3NiAoMTk1NC0wMy0xNykKICMgMTk2MTogTGF3IE5vLiA2NzYgKDE5NjEtMDgtMDcpCisjIDE5ODc6IExhdyBOby4gMzkxOSAoMTk4Ni0xMi0zMSkKICMKLSMgKEFub3RoZXIgc291cmNlICIxOTg3OiBMYXcgTm8uIDM5MTkgKDE5ODYtMTItMzEpIiB3YXMgaW4gdGhlIDIwMTQtMTAtMzAKLSMgZWRpdGlvbiBvZiB0aGUgS29yZWFuIFdpa2lwZWRpYSBlbnRyeS4pCisjIFRoZSBXaWtpcGVkaWEgZW50cnkgYWxzbyBoYXMgY29uZnVzaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY2hhbmdlCisjIHRvIFVUKzkgaW4gQXByaWwgMTkxMCwgYnV0IHRoZW4gd2hhdCB3b3VsZCBiZSB0aGUgcG9pbnQgb2YgdGhlIGxhdGVyIGNoYW5nZQorIyB0byBVVCs5IG9uIDE5MTItMDEtMDE/ICBPbWl0IHRoZSAxOTEwIGNoYW5nZSBmb3Igbm93LgogIwogIyBJIGd1ZXNzZWQgdGhhdCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyB0aHJvdWdoIDE5NDUgZm9sbG93ZWQgdGhlIHNhbWUKICMgcnVsZXMgYXMgZGlzY3Vzc2VkIHVuZGVyIFRhaXdhbiwgd2l0aCBub21pbmFsIHN3aXRjaGVzIGZyb20gSlNUIHRvIEtTVAogIyB3aGVuIHRoZSByZXNwZWN0aXZlIGNpdGllcyB3ZXJlIHRha2VuIG92ZXIgYnkgdGhlIEFsbGllcyBhZnRlciBXV0lJLgogIwotIyBGb3IgUHlvbmd5YW5nLCBndWVzcyBubyBjaGFuZ2VzIGZyb20gV29ybGQgV2FyIElJIHVudGlsIDIwMTUsIGFzIHdlCi0jIGhhdmUgbm8gaW5mb3JtYXRpb24gb3RoZXJ3aXNlLgorIyBGb3IgUHlvbmd5YW5nIHdlIGhhdmUgbm8gaW5mb3JtYXRpb247IGd1ZXNzIG5vIGNoYW5nZXMgc2luY2UgV29ybGQgV2FyIElJLgogCiAjIEZyb20gU3RlZmZlbiBUaG9yc2VuICgyMDE1LTA4LTA3KToKICMgQWNjb3JkaW5nIHRvIG1hbnkgbmV3cyBzb3VyY2VzLCBOb3J0aCBLb3JlYSBpcyBnb2luZyB0byBjaGFuZ2UgdG8KQEAgLTIwNjQsNyArMjA2OSw3IEBACiAjIEJpbGwgQm9ubmV0ICgyMDA1LTA1LTE5KSByZXBvcnRzIHRoYXQgdGhlIFVTIEVtYmFzc3kgaW4gVWxhYW5iYWF0YXIgc2F5cwogIyB0aGVyZSBpcyBvbmx5IG9uZSB0aW1lIHpvbmUgYW5kIHRoYXQgRFNUIGlzIG9ic2VydmVkLCBjaXRpbmcgTWljcm9zb2Z0CiAjIFdpbmRvd3MgWFAgYXMgdGhlIHNvdXJjZS4gIFJpc3RvIE55a8OkbmVuICgyMDA1LTA1LTE2KSByZXBvcnRzIHRoYXQKLSMgdHJhdmVsbW9uZ29saWEub3JnIHNheXMgdGhlcmUgYXJlIHR3byB0aW1lIHpvbmVzIChVVCArMDcsICswOCkgd2l0aCBubyBEU1QuCisjIHRyYXZlbG1vbmdvbGlhLm9yZyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcyAoVVRDKzcsIFVUQys4KSB3aXRoIG5vIERTVC4KICMgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDUtMDUtMjApIHJlcG9ydHMgdGhhdCB0aGUgTW9uZ29saWFuIEVtYmFzc3kgaW4KICMgV2FzaGluZ3RvbiwgREMgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMsIHdpdGggRFNUIG9ic2VydmVkLgogIyBIZSBhbHNvIGZvdW5kCkBAIC0yNzAwLDcgKzI3MDUsNyBAQAogIyBlYXJsaWVyIGRhdGUuCiAjCiAjIFNoYW5rcyAmIFBvdHRlbmdlciBhbHNvIHN0YXRlIHRoYXQgdW50aWwgMTk2OC0wNS0wMSBTYXVkaSBBcmFiaWEgaGFkIHR3bwotIyB0aW1lIHpvbmVzOyB0aGUgb3RoZXIgem9uZSwgYXQgVVQgKzA0LCB3YXMgaW4gdGhlIGZhciBlYXN0ZXJuIHBhcnQgb2YKKyMgdGltZSB6b25lczsgdGhlIG90aGVyIHpvbmUsIGF0IFVUQys0LCB3YXMgaW4gdGhlIGZhciBlYXN0ZXJuIHBhcnQgb2YKICMgdGhlIGNvdW50cnkuICBJZ25vcmUgdGhpcywgYXMgaXQncyBiZWZvcmUgb3VyIDE5NzAgY3V0b2ZmLgogIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMjk2OSwxMCArMjk3NCwxMCBAQAogIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9EdXNoYW5iZQk0OjM1OjEyIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQk1OjAwCS0JKzA1CTE5MzAgSnVuIDIxCi0JCQk2OjAwIFJ1c3NpYUFzaWEgKzA2LyswNwkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTU6MDAJMTowMAkrMDUvKzA2CTE5OTEgU2VwICA5ICAyOjAwcwotCQkJNTowMAktCSswNQorCQkJNTowMAktCURVU1QJMTkzMCBKdW4gMjEgIyBEdXNoYW5iZSBUaW1lCisJCQk2OjAwIFJ1c3NpYUFzaWEgRFVTJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJNTowMAkxOjAwCURVU1NUCTE5OTEgU2VwICA5ICAyOjAwcworCQkJNTowMAktCVRKVAkjIFRhamlraXN0YW4gVGltZQogCiAjIFRoYWlsYW5kCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0yOTg2LDEwICsyOTkxLDExIEBACiAjIEZyb20gU2hhbmtzICYgUG90dGVuZ2VyLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0FzaGdhYmF0CTM6NTM6MzIgLQlMTVQJMTkyNCBNYXkgIDIgIyBvciBBc2hraGFiYWQKLQkJCTQ6MDAJLQkrMDQJMTkzMCBKdW4gMjEKLQkJCTU6MDAgUnVzc2lhQXNpYQkrMDUvKzA2CTE5OTEgTWFyIDMxICAyOjAwCi0JCQk0OjAwIFJ1c3NpYUFzaWEJKzA0LyswNQkxOTkyIEphbiAxOSAgMjowMAotCQkJNTowMAktCSswNQorCQkJNDowMAktCUFTSFQJMTkzMCBKdW4gMjEgIyBBc2hraGFiYWQgVGltZQorCQkJNTowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE1hciAzMSAgMjowMAorCQkJNDowMCBSdXNzaWFBc2lhCUFTSCVzVAkxOTkxIE9jdCAyNyAjIGluZGVwZW5kZW5jZQorCQkJNDowMCBSdXNzaWFBc2lhCVRNJXNUCTE5OTIgSmFuIDE5ICAyOjAwCisJCQk1OjAwCS0JVE1UCiAKICMgVW5pdGVkIEFyYWIgRW1pcmF0ZXMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTMwMDEsMTggKzMwMDcsMjAgQEAKICMgQnlhbG9rb3ogMTkxOSBzYXlzIFV6YmVraXN0YW4gd2FzIDQ6Mjc6NTMuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvU2FtYXJrYW5kCTQ6Mjc6NTMgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTQ6MDAJLQkrMDQJMTkzMCBKdW4gMjEKLQkJCTU6MDAJLQkrMDUJMTk4MSBBcHIgIDEKLQkJCTU6MDAJMTowMAkrMDYJMTk4MSBPY3QgIDEKLQkJCTY6MDAJLQkrMDYJMTk4MiBBcHIgIDEKLQkJCTU6MDAgUnVzc2lhQXNpYQkrMDUvKzA2CTE5OTIKLQkJCTU6MDAJLQkrMDUKKwkJCTQ6MDAJLQlTQU1UCTE5MzAgSnVuIDIxICMgU2FtYXJrYW5kIFRpbWUKKwkJCTU6MDAJLQlTQU1UCTE5ODEgQXByICAxCisJCQk1OjAwCTE6MDAJU0FNU1QJMTk4MSBPY3QgIDEKKwkJCTY6MDAJLQlUQVNUCTE5ODIgQXByICAxICMgVGFzaGtlbnQgVGltZQorCQkJNTowMCBSdXNzaWFBc2lhCVNBTSVzVAkxOTkxIFNlcCAgMSAjIGluZGVwZW5kZW5jZQorCQkJNTowMCBSdXNzaWFBc2lhCVVaJXNUCTE5OTIKKwkJCTU6MDAJLQlVWlQKICMgTWlsbmUgc2F5cyBUYXNoa2VudCB3YXMgNDozNzoxMC44OyByb3VuZCB0byBuZWFyZXN0LgogWm9uZQlBc2lhL1Rhc2hrZW50CTQ6Mzc6MTEgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTU6MDAJLQkrMDUJMTkzMCBKdW4gMjEKLQkJCTY6MDAgUnVzc2lhQXNpYQkrMDYvKzA3CTE5OTEgTWFyIDMxICAyOjAwCi0JCQk1OjAwIFJ1c3NpYUFzaWEJKzA1LyswNgkxOTkyCi0JCQk1OjAwCS0JKzA1CisJCQk1OjAwCS0JVEFTVAkxOTMwIEp1biAyMSAjIFRhc2hrZW50IFRpbWUKKwkJCTY6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBNYXIgMzEgIDI6MDAKKwkJCTU6MDAgUnVzc2lhQXNpYQlUQVMlc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCisJCQk1OjAwCS0JVVpUCiAKICMgVmlldG5hbQogCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9hdXN0cmFsYXNpYSBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2F1c3RyYWxhc2lhCmluZGV4IDIwYTQwMjAuLjEzNGEwMWUgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2F1c3RyYWxhc2lhCisrKyBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2F1c3RyYWxhc2lhCkBAIC01NjgsNyArNTY4LDcgQEAKICMgQmFzZSB0aGUgQm91Z2FpbnZpbGxlIGVudHJ5IG9uIHRoZSBBcmF3YS1LaWV0YSByZWdpb24sIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZQogIyB0aGUgbW9zdCBwZW9wbGUgZXZlbiB0aG91Z2ggaXQgd2FzIGRldmFzdGF0ZWQgaW4gdGhlIEJvdWdhaW52aWxsZSBDaXZpbCBXYXIuCiAjCi0jIEFsdGhvdWdoIFNoYW5rcyBnaXZlcyAxOTQyLTAzLTE1IC8gMTk0My0xMS0wMSBmb3IgVVQgKzA5LCB0aGVzZSBkYXRlcworIyBBbHRob3VnaCBTaGFua3MgZ2l2ZXMgMTk0Mi0wMy0xNSAvIDE5NDMtMTEtMDEgZm9yIEpTVCwgdGhlc2UgZGF0ZXMKICMgYXJlIGFwcGFyZW50bHkgcm91Z2ggZ3Vlc3N3b3JrIGZyb20gdGhlIHN0YXJ0cyBvZiBtaWxpdGFyeSBjYW1wYWlnbnMuCiAjIFRoZSBXb3JsZCBXYXIgSUkgZW50cmllcyBiZWxvdyBhcmUgaW5zdGVhZCBiYXNlZCBvbiBBcmF3YS1LaWV0YS4KICMgVGhlIEphcGFuZXNlIG9jY3VwaWVkIEtpZXRhIGluIEp1bHkgMTk0MiwKQEAgLTU3Niw4ICs1NzYsOCBAQAogIyBodHRwOi8vcHdlbmN5Y2wua2didWRnZS5jb20vQi9vL0JvdWdhaW52aWxsZS5odG0KICMgYW5kIHNlZW0gdG8gaGF2ZSBjb250cm9sbGVkIGl0IHVudGlsIHRoZWlyIDE5NDUtMDgtMjEgc3VycmVuZGVyLgogIwotIyBUaGUgQXV0b25vbW91cyBSZWdpb24gb2YgQm91Z2FpbnZpbGxlIHN3aXRjaGVkIGZyb20gVVQgKzEwIHRvICsxMQotIyBvbiAyMDE0LTEyLTI4IGF0IDAyOjAwLiAgVGhleSBjYWxsICsxMSAiQm91Z2FpbnZpbGxlIFN0YW5kYXJkIFRpbWUiOworIyBUaGUgQXV0b25vbW91cyBSZWdpb24gb2YgQm91Z2FpbnZpbGxlIHBsYW5zIHRvIHN3aXRjaCBmcm9tIFVUQysxMCB0byBVVEMrMTEKKyMgb24gMjAxNC0xMi0yOCBhdCAwMjowMC4gIFRoZXkgY2FsbCBVVEMrMTEgIkJvdWdhaW52aWxsZSBTdGFuZGFyZCBUaW1lIjsKICMgYWJicmV2aWF0ZSB0aGlzIGFzIEJTVC4gIFNlZToKICMgaHR0cDovL3d3dy5ib3VnYWludmlsbGUyNC5jb20vYm91Z2FpbnZpbGxlLWlzc3Vlcy9ib3VnYWludmlsbGUtZ2V0cy1vd24tdGltZXpvbmUvCiAjCkBAIC02NDMsNyArNjQzLDcgQEAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0yNyk6CiAjIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBBY3QgMjAxMQogIyBodHRwOi8vd3d3LnBhcmxpYW1lbnQuZ292LndzL2ltYWdlcy9BQ1RTL0ludGVybmF0aW9uYWxfRGF0ZV9MaW5lX0FjdF9fMjAxMV8tX0VuZy5wZGYKLSMgY2hhbmdlZCBTYW1vYSBmcm9tIFVUIC0xMSB0byArMTMsIGVmZmVjdGl2ZSAiMTIgbydjbG9jayBtaWRuaWdodCwgb24KKyMgY2hhbmdlZCBTYW1vYSBmcm9tIFVUQy0xMSB0byBVVEMrMTMsIGVmZmVjdGl2ZSAiMTIgbydjbG9jayBtaWRuaWdodCwgb24KICMgVGh1cnNkYXkgMjl0aCBEZWNlbWJlciAyMDExIi4gIFRoZSBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSB3YXMgYWRqdXN0ZWQKICMgYWNjb3JkaW5nbHkuCiAKQEAgLTczOCw3ICs3MzgsNyBAQAogIyAxODg2LTE4OTE7IEJha2VyIHdhcyBzaW1pbGFyIGJ1dCBleGFjdCBkYXRlcyBhcmUgbm90IGtub3duLgogIyBJbmhhYml0ZWQgYnkgY2l2aWxpYW5zIDE5MzUtMTk0MjsgVS5TLiBtaWxpdGFyeSBiYXNlcyAxOTQzLTE5NDQ7CiAjIHVuaW5oYWJpdGVkIHRoZXJlYWZ0ZXIuCi0jIEhvd2xhbmQgb2JzZXJ2ZWQgSGF3YWlpIFN0YW5kYXJkIFRpbWUgKFVUIC0xMDozMCkgaW4gMTkzNzsKKyMgSG93bGFuZCBvYnNlcnZlZCBIYXdhaWkgU3RhbmRhcmQgVGltZSAoVVQtMTA6MzApIGluIDE5Mzc7CiAjIHNlZSBwYWdlIDIwNiBvZiBFbGdlbiBNLiBMb25nIGFuZCBNYXJpZSBLLiBMb25nLAogIyBBbWVsaWEgRWFyaGFydDogdGhlIE15c3RlcnkgU29sdmVkLCBTaW1vbiAmIFNjaHVzdGVyICgyMDAwKS4KICMgU28gbW9zdCBsaWtlbHkgSG93bGFuZCBhbmQgQmFrZXIgb2JzZXJ2ZWQgSGF3YWlpIFRpbWUgZnJvbSAxOTM1CkBAIC0xNDk2LDcgKzE0OTYsNyBAQAogIyBaZWFsYW5kIHRpbWUuICBJIHVuZGVyc3RhbmQgdGhhdCBpcyB0aGUgdGltZSB0aGV5IGtlZXAgbG9jYWxseSwgYW55aG93LiIKICMgRm9yIG5vdywgYXNzdW1lIHRoaXMgcHJhY3RpY2UgZ29lcyBiYWNrIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygc3RhbmRhcmQgdGltZQogIyBpbiBOZXcgWmVhbGFuZCwgYXMgdGhpcyB3b3VsZCBtYWtlIENoYXRoYW0gSXNsYW5kcyB0aW1lIGFsbW9zdCBleGFjdGx5IG1hdGNoCi0jIExNVCBiYWNrIHdoZW4gTmV3IFplYWxhbmQgd2FzIGF0IFVUICsxMTozMDsgYWxzbywgYXNzdW1lIENoYXRoYW0gSXNsYW5kcyBkaWQKKyMgTE1UIGJhY2sgd2hlbiBOZXcgWmVhbGFuZCB3YXMgYXQgVVRDKzExOjMwOyBhbHNvLCBhc3N1bWUgQ2hhdGhhbSBJc2xhbmRzIGRpZAogIyBub3Qgb2JzZXJ2ZSBOZXcgWmVhbGFuZCdzIHByZXdhciBEU1QuCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTE1NTIsNyArMTU1Miw3IEBACiAjIEZvciBub3csIHdlIGFzc3VtZSB0aGUgTGFkcm9uZXMgc3dpdGNoZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgUGhpbGlwcGluZXM7CiAjIHNlZSBBc2lhL01hbmlsYS4KIAotIyBVUyBQdWJsaWMgTGF3IDEwNi01NjQgKDIwMDAtMTItMjMpIG1hZGUgVVQgKzEwIHRoZSBvZmZpY2lhbCBzdGFuZGFyZCB0aW1lLAorIyBVUyBQdWJsaWMgTGF3IDEwNi01NjQgKDIwMDAtMTItMjMpIG1hZGUgVVRDKzEwIHRoZSBvZmZpY2lhbCBzdGFuZGFyZCB0aW1lLAogIyB1bmRlciB0aGUgbmFtZSAiQ2hhbW9ycm8gU3RhbmRhcmQgVGltZSIuICBUaGVyZSBpcyBubyBvZmZpY2lhbCBhYmJyZXZpYXRpb24sCiAjIGJ1dCBDb25ncmVzc21hbiBSb2JlcnQgQS4gVW5kZXJ3b29kLCBhdXRob3Igb2YgdGhlIGJpbGwgdGhhdCBiZWNhbWUgbGF3LAogIyB3cm90ZSBpbiBhIHByZXNzIHJlbGVhc2UgKDIwMDAtMTItMjcpIHRoYXQgaGUgd2lsbCBzZWVrIHRoZSB1c2Ugb2YgIkNoU1QiLgpAQCAtMTU2NCwxNSArMTU2NCwxNSBAQAogIyAiSSBhbSBjZXJ0YWluLCBoYXZpbmcgbGl2ZWQgdGhlcmUgZm9yIHRoZSBwYXN0IGRlY2FkZSwgdGhhdCAnVHJ1aycKICMgKG5vdyBwcm9wZXJseSBrbm93biBhcyBDaHV1aykgLi4uIGlzIGluIHRoZSB0aW1lIHpvbmUgR01UKzEwLiIKICMKLSMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgVHJ1ayBzd2l0Y2hlZCBmcm9tIFVUICsxMCB0byArMTEKKyMgU2hhbmtzICYgUG90dGVuZ2VyIHdyaXRlIHRoYXQgVHJ1ayBzd2l0Y2hlZCBmcm9tIFVUQysxMCB0byBVVEMrMTEKICMgb24gMTk3OC0xMC0wMTsgaWdub3JlIHRoaXMgZm9yIG5vdy4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgxOTk5LTEwLTI5KToKICMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSBWaXNpdG9ycyBCb2FyZCB3cml0ZXMgaW4KICMgVGhlIEZlZGVyYXRlZCBTdGF0ZXMgb2YgTWljcm9uZXNpYSAtIFZpc2l0b3IgSW5mb3JtYXRpb24gKDE5OTktMDEtMjYpCiAjIGh0dHA6Ly93d3cuZnNtZ292Lm9yZy9pbmZvL2Nsb2Nrcy5odG1sCi0jIHRoYXQgVHJ1ayBhbmQgWWFwIGFyZSBVVCArMTAsIGFuZCBQb25hcGUgYW5kIEtvc3JhZSBhcmUgKzExLgotIyBXZSBkb24ndCBrbm93IHdoZW4gS29zcmFlIHN3aXRjaGVkIGZyb20gKzEyOyBhc3N1bWUgSmFudWFyeSAxIGZvciBub3cuCisjIHRoYXQgVHJ1ayBhbmQgWWFwIGFyZSBVVEMrMTAsIGFuZCBQb25hcGUgYW5kIEtvc3JhZSBhcmUgVVRDKzExLgorIyBXZSBkb24ndCBrbm93IHdoZW4gS29zcmFlIHN3aXRjaGVkIGZyb20gVVRDKzEyOyBhc3N1bWUgSmFudWFyeSAxIGZvciBub3cuCiAKIAogIyBNaWR3YXkKQEAgLTE2MzgsMTEgKzE2MzgsMTEgQEAKICMgb3JkYWluaW5nIC0gYnkgYSBtYXN0ZXJwaWVjZSBvZiBkaXBsb21hdGljIGZsYXR0ZXJ5IC0gdGhhdAogIyB0aGUgRm91cnRoIG9mIEp1bHkgc2hvdWxkIGJlIGNlbGVicmF0ZWQgdHdpY2UgaW4gdGhhdCB5ZWFyLiIKIAotIyBBbHRob3VnaCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5cyB0aGV5IGJvdGggc3dpdGNoZWQgdG8gVVQgLTExOjMwCi0jIGluIDE5MTEsIGFuZCB0byAtMTEgaW4gMTk1MC4gbWFueSBlYXJsaWVyIHNvdXJjZXMgZ2l2ZSAtMTEKKyMgQWx0aG91Z2ggU2hhbmtzICYgUG90dGVuZ2VyIHNheXMgdGhleSBib3RoIHN3aXRjaGVkIHRvIFVUQy0xMTozMAorIyBpbiAxOTExLCBhbmQgdG8gVVRDLTExIGluIDE5NTAuIG1hbnkgZWFybGllciBzb3VyY2VzIGdpdmUgVVRDLTExCiAjIGZvciBBbWVyaWNhbiBTYW1vYSwgZS5nLiwgdGhlIFVTIE5hdGlvbmFsIEJ1cmVhdSBvZiBTdGFuZGFyZHMKICMgY2lyY3VsYXIgIlN0YW5kYXJkIFRpbWUgVGhyb3VnaG91dCB0aGUgV29ybGQiLCAxOTMyLgotIyBBc3N1bWUgQW1lcmljYW4gU2Ftb2Egc3dpdGNoZWQgdG8gLTExIGluIDE5MTEsIG5vdCAxOTUwLAorIyBBc3N1bWUgQW1lcmljYW4gU2Ftb2Egc3dpdGNoZWQgdG8gVVRDLTExIGluIDE5MTEsIG5vdCAxOTUwLAogIyBhbmQgdGhhdCBhZnRlciAxOTUwIHRoZXkgYWdyZWVkIHVudGlsICh3ZXN0ZXJuKSBTYW1vYSBza2lwcGVkIGEKICMgZGF5IGluIDIwMTEuICBBc3N1bWUgYWxzbyB0aGF0IHRoZSBTYW1vYXMgZm9sbG93IHRoZSBVUyBhbmQgTmV3CiAjIFplYWxhbmQncyAiU1QiLyJEVCIgc3R5bGUgb2YgZGF5bGlnaHQtc2F2aW5nIGFiYnJldmlhdGlvbnMuCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9iYWNrd2FyZCBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2JhY2t3YXJkCmluZGV4IGVjOTZjN2UuLjgzNTI3MDUgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2JhY2t3YXJkCisrKyBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2JhY2t3YXJkCkBAIC01OSw3ICs1OSw2IEBACiBMaW5rCUFzaWEvVXJ1bXFpCQlBc2lhL0thc2hnYXIKIExpbmsJQXNpYS9LYXRobWFuZHUJCUFzaWEvS2F0bWFuZHUKIExpbmsJQXNpYS9NYWNhdQkJQXNpYS9NYWNhbwotTGluawlBc2lhL1lhbmdvbgkJQXNpYS9SYW5nb29uCiBMaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KIExpbmsJQXNpYS9KZXJ1c2FsZW0JCUFzaWEvVGVsX0F2aXYKIExpbmsJQXNpYS9UaGltcGh1CQlBc2lhL1RoaW1idQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvZXRjZXRlcmEgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9ldGNldGVyYQppbmRleCBlYzMxZjFiLi5kMmZiOTFjIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9ldGNldGVyYQorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9ldGNldGVyYQpAQCAtMzEsMTMgKzMxLDYgQEAKICMgbmVlZCBub3cgZm9yIHRoZSBlbnRyaWVzIHRoYXQgYXJlIG5vdCBvbiBVVEMgYXJlIGZvciBzaGlwcyBhdCBzZWEKICMgdGhhdCBjYW5ub3QgdXNlIFBPU0lYIFRaIHNldHRpbmdzLgogCi0jIFN0YXJ0aW5nIHdpdGggUE9TSVggMTAwMy4xLTIwMDEsIHRoZSBlbnRyaWVzIGJlbG93IGFyZSBhbGwKLSMgdW5uZWNlc3NhcnkgYXMgc2V0dGluZ3MgZm9yIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEUuZy4sCi0jIGluc3RlYWQgb2YgVFo9J0V0Yy9HTVQrNCcgb25lIGNhbiB1c2UgdGhlIFBPU0lYIHNldHRpbmcgVFo9JzwtMDQ+KzQnLgotIwotIyBEbyBub3QgdXNlIGEgUE9TSVggVFogc2V0dGluZyBsaWtlIFRaPSdHTVQrNCcsIHdoaWNoIGlzIGZvdXIgaG91cnMKLSMgYmVoaW5kIEdNVCBidXQgdXNlcyB0aGUgY29tcGxldGVseSBtaXNsZWFkaW5nIGFiYnJldmlhdGlvbiAiR01UIi4KLQogWm9uZQlFdGMvR01UCQkwCS0JR01UCiBab25lCUV0Yy9VVEMJCTAJLQlVVEMKIFpvbmUJRXRjL1VDVAkJMAktCVVDVApAQCAtNTYsMTMgKzQ5LDIzIEBACiBMaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVCswCiBMaW5rCUV0Yy9HTVQJCQkJRXRjL0dNVDAKIAotIyBCZSBjb25zaXN0ZW50IHdpdGggUE9TSVggVFogc2V0dGluZ3MgaW4gdGhlIFpvbmUgbmFtZXMsCisjIFdlIHVzZSBQT1NJWC1zdHlsZSBzaWducyBpbiB0aGUgWm9uZSBuYW1lcyBhbmQgdGhlIG91dHB1dCBhYmJyZXZpYXRpb25zLAogIyBldmVuIHRob3VnaCB0aGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IG1hbnkgcGVvcGxlIGV4cGVjdC4KICMgUE9TSVggaGFzIHBvc2l0aXZlIHNpZ25zIHdlc3Qgb2YgR3JlZW53aWNoLCBidXQgbWFueSBwZW9wbGUgZXhwZWN0CiAjIHBvc2l0aXZlIHNpZ25zIGVhc3Qgb2YgR3JlZW53aWNoLiAgRm9yIGV4YW1wbGUsIFRaPSdFdGMvR01UKzQnIHVzZXMKLSMgdGhlIGFiYnJldmlhdGlvbiAiLTA0IiBhbmQgY29ycmVzcG9uZHMgdG8gNCBob3VycyBiZWhpbmQgVVQKKyMgdGhlIGFiYnJldmlhdGlvbiAiR01UKzQiIGFuZCBjb3JyZXNwb25kcyB0byA0IGhvdXJzIGJlaGluZCBVVAogIyAoaS5lLiB3ZXN0IG9mIEdyZWVud2ljaCkgZXZlbiB0aG91Z2ggbWFueSBwZW9wbGUgd291bGQgZXhwZWN0IGl0IHRvCiAjIG1lYW4gNCBob3VycyBhaGVhZCBvZiBVVCAoaS5lLiBlYXN0IG9mIEdyZWVud2ljaCkuCisjCisjIEluIHRoZSBkcmFmdCA1IG9mIFBPU0lYIDEwMDMuMS0yMDB4LCB0aGUgYW5nbGUgYnJhY2tldCBub3RhdGlvbiBhbGxvd3MgZm9yCisjIFRaPSc8R01ULTQ+KzQnOyBpZiB5b3Ugd2FudCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBjb25mb3JtaW5nIHRvCisjIElTTyA4NjAxIHlvdSBjYW4gdXNlIFRaPSc8LTA0MDA+KzQnLiAgVGh1cyB0aGUgY29tbW9ubHktZXhwZWN0ZWQKKyMgb2Zmc2V0IGlzIGtlcHQgd2l0aGluIHRoZSBhbmdsZSBicmFja2V0IChhbmQgaXMgdXNlZCBmb3IgZGlzcGxheSkKKyMgd2hpbGUgdGhlIFBPU0lYIHNpZ24gaXMga2VwdCBvdXRzaWRlIHRoZSBhbmdsZSBicmFja2V0IChhbmQgaXMgdXNlZAorIyBmb3IgY2FsY3VsYXRpb24pLgorIworIyBEbyBub3QgdXNlIGEgVFogc2V0dGluZyBsaWtlIFRaPSdHTVQrNCcsIHdoaWNoIGlzIGZvdXIgaG91cnMgYmVoaW5kCisjIEdNVCBidXQgdXNlcyB0aGUgY29tcGxldGVseSBtaXNsZWFkaW5nIGFiYnJldmlhdGlvbiAiR01UIi4KIAogIyBFYXJsaWVyIGluY2FybmF0aW9ucyBvZiB0aGlzIHBhY2thZ2Ugd2VyZSBub3QgUE9TSVgtY29tcGxpYW50LAogIyBhbmQgaGFkIGxpbmVzIHN1Y2ggYXMKQEAgLTcxLDMxICs3NCwzMCBAQAogIyB3YXkgZG9lcyBhCiAjCQl6aWMgLWwgR01ULTEyCiAjIHNvIHdlIG1vdmVkIHRoZSBuYW1lcyBpbnRvIHRoZSBFdGMgc3ViZGlyZWN0b3J5LgotIyBBbHNvLCB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgYXJlIG5vdyBjb21wYXRpYmxlIHdpdGggJXouCiAKLVpvbmUJRXRjL0dNVC0xNAkxNAktCSsxNAotWm9uZQlFdGMvR01ULTEzCTEzCS0JKzEzCi1ab25lCUV0Yy9HTVQtMTIJMTIJLQkrMTIKLVpvbmUJRXRjL0dNVC0xMQkxMQktCSsxMQotWm9uZQlFdGMvR01ULTEwCTEwCS0JKzEwCi1ab25lCUV0Yy9HTVQtOQk5CS0JKzA5Ci1ab25lCUV0Yy9HTVQtOAk4CS0JKzA4Ci1ab25lCUV0Yy9HTVQtNwk3CS0JKzA3Ci1ab25lCUV0Yy9HTVQtNgk2CS0JKzA2Ci1ab25lCUV0Yy9HTVQtNQk1CS0JKzA1Ci1ab25lCUV0Yy9HTVQtNAk0CS0JKzA0Ci1ab25lCUV0Yy9HTVQtMwkzCS0JKzAzCi1ab25lCUV0Yy9HTVQtMgkyCS0JKzAyCi1ab25lCUV0Yy9HTVQtMQkxCS0JKzAxCi1ab25lCUV0Yy9HTVQrMQktMQktCS0wMQotWm9uZQlFdGMvR01UKzIJLTIJLQktMDIKLVpvbmUJRXRjL0dNVCszCS0zCS0JLTAzCi1ab25lCUV0Yy9HTVQrNAktNAktCS0wNAotWm9uZQlFdGMvR01UKzUJLTUJLQktMDUKLVpvbmUJRXRjL0dNVCs2CS02CS0JLTA2Ci1ab25lCUV0Yy9HTVQrNwktNwktCS0wNwotWm9uZQlFdGMvR01UKzgJLTgJLQktMDgKLVpvbmUJRXRjL0dNVCs5CS05CS0JLTA5Ci1ab25lCUV0Yy9HTVQrMTAJLTEwCS0JLTEwCi1ab25lCUV0Yy9HTVQrMTEJLTExCS0JLTExCi1ab25lCUV0Yy9HTVQrMTIJLTEyCS0JLTEyCitab25lCUV0Yy9HTVQtMTQJMTQJLQlHTVQtMTQJIyAxNCBob3VycyBhaGVhZCBvZiBHTVQKK1pvbmUJRXRjL0dNVC0xMwkxMwktCUdNVC0xMworWm9uZQlFdGMvR01ULTEyCTEyCS0JR01ULTEyCitab25lCUV0Yy9HTVQtMTEJMTEJLQlHTVQtMTEKK1pvbmUJRXRjL0dNVC0xMAkxMAktCUdNVC0xMAorWm9uZQlFdGMvR01ULTkJOQktCUdNVC05Citab25lCUV0Yy9HTVQtOAk4CS0JR01ULTgKK1pvbmUJRXRjL0dNVC03CTcJLQlHTVQtNworWm9uZQlFdGMvR01ULTYJNgktCUdNVC02Citab25lCUV0Yy9HTVQtNQk1CS0JR01ULTUKK1pvbmUJRXRjL0dNVC00CTQJLQlHTVQtNAorWm9uZQlFdGMvR01ULTMJMwktCUdNVC0zCitab25lCUV0Yy9HTVQtMgkyCS0JR01ULTIKK1pvbmUJRXRjL0dNVC0xCTEJLQlHTVQtMQorWm9uZQlFdGMvR01UKzEJLTEJLQlHTVQrMQorWm9uZQlFdGMvR01UKzIJLTIJLQlHTVQrMgorWm9uZQlFdGMvR01UKzMJLTMJLQlHTVQrMworWm9uZQlFdGMvR01UKzQJLTQJLQlHTVQrNAorWm9uZQlFdGMvR01UKzUJLTUJLQlHTVQrNQorWm9uZQlFdGMvR01UKzYJLTYJLQlHTVQrNgorWm9uZQlFdGMvR01UKzcJLTcJLQlHTVQrNworWm9uZQlFdGMvR01UKzgJLTgJLQlHTVQrOAorWm9uZQlFdGMvR01UKzkJLTkJLQlHTVQrOQorWm9uZQlFdGMvR01UKzEwCS0xMAktCUdNVCsxMAorWm9uZQlFdGMvR01UKzExCS0xMQktCUdNVCsxMQorWm9uZQlFdGMvR01UKzEyCS0xMgktCUdNVCsxMgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvZXVyb3BlIGIvamRrL21ha2UvZGF0YS90emRhdGEvZXVyb3BlCmluZGV4IGFlZGVkYjEuLjhlZDdkNGIgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2V1cm9wZQorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9ldXJvcGUKQEAgLTk4LDcgKzk4LDggQEAKICMgICAgICAgIDE6MDAgICAgICAgQ0VUIENFU1QgQ0VNVCBDZW50cmFsIEV1cm9wZQogIyAgICAgICAgMTowMDoxNCAgICBTRVQgICAgICAgICAgIFN3ZWRpc2ggKDE4NzktMTg5OSkqCiAjICAgICAgICAyOjAwICAgICAgIEVFVCBFRVNUICAgICAgRWFzdGVybiBFdXJvcGUKLSMgICAgICAgIDM6MDAgICAgICAgTVNLIE1TRCAgICAgICBNb3Njb3cKKyMgICAgICAgIDM6MDAgICAgICAgRkVUICAgICAgICAgICBGdXJ0aGVyLWVhc3Rlcm4gRXVyb3BlICgyMDExLTIwMTQpKgorIyAgICAgICAgMzowMCAgICAgICBNU0sgTVNEICBNU00qIE1pbnNrLCBNb3Njb3cKIAogIyBGcm9tIFBldGVyIElsaWV2ZSAoMTk5NC0xMi0wNCksCiAjIFRoZSBvcmlnaW5hbCBzaXggW0VVIG1lbWJlcnNdOiBCZWxnaXVtLCBGcmFuY2UsIChXZXN0KSBHZXJtYW55LCBJdGFseSwKQEAgLTYwNSwzMyArNjA2LDE2IEBACiBSdWxlCUUtRXVyCTE5ODEJbWF4CS0JTWFyCWxhc3RTdW4JIDA6MDAJMTowMAlTCiBSdWxlCUUtRXVyCTE5OTYJbWF4CS0JT2N0CWxhc3RTdW4JIDA6MDAJMAktCiAKLQotIyBEYXlsaWdodCBzYXZpbmcgdGltZSBmb3IgUnVzc2lhIGFuZCB0aGUgU292aWV0IFVuaW9uCi0jCi0jIFRoZSAxOTE3LTE5MjEgZGVjcmVlIFVSTHMgYXJlIGZyb20gQWxleGFuZGVyIEJlbG9wb2xza3kgKDIwMTYtMDgtMjMpLgotCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JSnVsCSAxCTIzOjAwCTE6MDAJTVNUICAjIE1vc2NvdyBTdW1tZXIgVGltZQotIwotIyBEZWNyZWUgTm8uIDE0MiAoMTkxNy0xMi0yMikgaHR0cDovL2lzdG1hdC5pbmZvL25vZGUvMjgxMzcKIFJ1bGUJUnVzc2lhCTE5MTcJb25seQktCURlYwkyOAkgMDowMAkwCU1NVCAgIyBNb3Njb3cgTWVhbiBUaW1lCi0jCi0jIERlY3JlZSBOby4gNDk3ICgxOTE4LTA1LTMwKSBodHRwOi8vaXN0bWF0LmluZm8vbm9kZS8zMDAwMQogUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JTWF5CTMxCTIyOjAwCTI6MDAJTURTVCAjIE1vc2NvdyBEb3VibGUgU3VtbWVyIFRpbWUKIFJ1bGUJUnVzc2lhCTE5MTgJb25seQktCVNlcAkxNgkgMTowMAkxOjAwCU1TVAotIwotIyBEZWNyZWUgTm8uIDI1OCAoMTkxOS0wNS0yOSkgaHR0cDovL2lzdG1hdC5pbmZvL25vZGUvMzc5NDkKIFJ1bGUJUnVzc2lhCTE5MTkJb25seQktCU1heQkzMQkyMzowMAkyOjAwCU1EU1QKLSMKLVJ1bGUJUnVzc2lhCTE5MTkJb25seQktCUp1bAkgMQkgMDowMHUJMTowMAlNU0QKK1J1bGUJUnVzc2lhCTE5MTkJb25seQktCUp1bAkgMQkgMjowMAkxOjAwCU1TRAogUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JQXVnCTE2CSAwOjAwCTAJTVNLCi0jCi0jIERlY3JlZSBOby4gNjMgKDE5MjEtMDItMDMpIGh0dHA6Ly9pc3RtYXQuaW5mby9ub2RlLzQ1ODQwCiBSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlGZWIJMTQJMjM6MDAJMTowMAlNU0QKLSMKLSMgRGVjcmVlIE5vLiAxMjEgKDE5MjEtMDMtMDcpIGh0dHA6Ly9pc3RtYXQuaW5mby9ub2RlLzQ1OTQ5Ci1SdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlNYXIJMjAJMjM6MDAJMjowMAkrMDUKLSMKK1J1bGUJUnVzc2lhCTE5MjEJb25seQktCU1hcgkyMAkyMzowMAkyOjAwCU1TTSAgIyBNaWRzdW1tZXIKIFJ1bGUJUnVzc2lhCTE5MjEJb25seQktCVNlcAkgMQkgMDowMAkxOjAwCU1TRAogUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JT2N0CSAxCSAwOjAwCTAJLQogIyBBY3QgTm8uIDkyNSBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMgb2YgdGhlIFVTU1IgKDE5ODAtMTAtMjQpOgpAQCAtODE0LDYgKzc5OCw4IEBACiAjIEZyb20gQWxleGFuZGVyIEJva292b3kgKDIwMTQtMTAtMDkpOgogIyBCZWxhcnVzc2lhbiBnb3Zlcm5tZW50IGRlY2lkZWQgYWdhaW5zdCBjaGFuZ2luZyB0byB3aW50ZXIgdGltZS4uLi4KICMgaHR0cDovL2VuZy5iZWx0YS5ieS9hbGxfbmV3cy9zb2NpZXR5L0JlbGFydXMtZGVjaWRlcy1hZ2FpbnN0LWFkanVzdGluZy10aW1lLWluLVJ1c3NpYXMtd2FrZV9pXzc2MzM1Lmh0bWwKKyMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0xMC0wOCk6CisjIEhlbmNlIEJlbGFydXMgY2FuIHNoYXJlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIHdpdGggTW9zY293IGFnYWluLgogIwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlFdXJvcGUvTWluc2sJMTo1MDoxNiAtCUxNVAkxODgwCkBAIC04MjQsNyArODEwLDggQEAKIAkJCTM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MAogCQkJMzowMAktCU1TSwkxOTkxIE1hciAzMSAgMjowMHMKIAkJCTI6MDAJUnVzc2lhCUVFJXNUCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJMzowMAktCSswMworCQkJMzowMAktCUZFVAkyMDE0IE9jdCAyNiAgMTowMHMKKwkJCTM6MDAJLQlNU0sKIAogIyBCZWxnaXVtCiAjCkBAIC0xMzMyLDcgKzEzMTksNyBAQAogIyBodHRwOi8vd3d3LnBhcmxhbWVudC1iZXJsaW4uZGUvcGRzLWZyYWt0aW9uLm5zZi83Mjc0NTkxMjdjOGI2NmVlODUyNTY2MjMwMDQ1OTA5OS9kZWZjNzdjYjc4NGYxODBhYzEyNTZjMmIwMDMwMjc0Yi8kRklMRS9iZXJzYXJpbnQucGRmCiAjIHNheXMgdGhhdCBCZXJzYXJpbiBpc3N1ZWQgYW4gb3JkZXIgdG8gdXNlIE1vc2NvdyB0aW1lIG9uIE1heSAyMC4KICMgSG93ZXZlciwgTW9zY293IGRpZCBub3Qgb2JzZXJ2ZSBkYXlsaWdodCBzYXZpbmcgaW4gMTk0NSwgc28KLSMgdGhpcyB3YXMgZXF1aXZhbGVudCB0byBVVCArMDMsIG5vdCArMDQuCisjIHRoaXMgd2FzIGVxdWl2YWxlbnQgdG8gQ0VNVCAoR01UKzMpLCBub3QgR01UKzQuCiAKIAogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSL1MKQEAgLTIyOTYsNiArMjI4Myw3IEBACiAjIGh0dHA6Ly93d3cud29ybGR0aW1lem9uZS5jb20vZHN0X25ld3MvZHN0X25ld3NfcnVzc2lhLW1hcC0yMDE0LTA3Lmh0bWwKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDA2LTAzLTIyKToKKyMgRXhjZXB0IGZvciBNb3Njb3cgYWZ0ZXIgMTkxOS0wNy0wMSwgSSBpbnZlbnRlZCB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMuCiAjIE1vc2NvdyB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBhZnRlciAxOTE5LTA3LTAxLCBhbmQgTW9zY293IHJ1bGVzIGFmdGVyIDE5OTEsCiAjIGFyZSBmcm9tIEFuZHJleSBBLiBDaGVybm92LiAgVGhlIHJlc3QgaXMgZnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIsCiAjIGV4Y2VwdCB3ZSBmb2xsb3cgQ2hlcm5vdidzIHJlcG9ydCB0aGF0IDE5OTIgRFNUIHRyYW5zaXRpb25zIHdlcmUgU2F0CkBAIC0yMzcxLDcgKzIzNTksNyBAQAogCQkJIDI6MDAJUG9sYW5kCUNFJXNUCTE5NDYKIAkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTE5ODkgTWFyIDI2ICAyOjAwcwogCQkJIDI6MDAJUnVzc2lhCUVFJXNUCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJIDM6MDAJLQkrMDMJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgMzowMAktCUZFVAkyMDE0IE9jdCAyNiAgMjowMHMKIAkJCSAyOjAwCS0JRUVUCiAKIApAQCAtMjQyNCwxNiArMjQxMiw2IEBACiAjIDc4CVJVLVNQRQlTYWludCBQZXRlcnNidXJnCiAjIDgzCVJVLU5FTglOZW5ldHMgQXV0b25vbW91cyBPa3J1ZwogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTYtMDgtMjMpOgotIyBUaGUgU292aWV0cyBzd2l0Y2hlZCB0byBVVC1iYXNlZCB0aW1lIGluIDE5MTkuICBEZWNyZWUgTm8uIDU5Ci0jICgxOTE5LTAyLTA4KSBodHRwOi8vaXN0bWF0LmluZm8vbm9kZS8zNTU2NyBlc3RhYmxpc2hlZCBVVC1iYXNlZCB0aW1lCi0jIHpvbmVzLCBhbmQgRGVjcmVlIE5vLiAxNDcgKDE5MTktMDMtMjkpIGh0dHA6Ly9pc3RtYXQuaW5mby9ub2RlLzM1ODU0Ci0jIHNwZWNpZmllZCBhIHRyYW5zaXRpb24gZGF0ZSBvZiAxOTE5LTA3LTAxLCBhcHBhcmVudGx5IGF0IDAwOjAwIFVULgotIyBObyBkb3VidCBvbmx5IHRoZSBTb3ZpZXQtY29udHJvbGxlZCByZWdpb25zIHN3aXRjaGVkIG9uIHRoYXQgZGF0ZTsKLSMgbGF0ZXIgdHJhbnNpdGlvbnMgdG8gVVQtYmFzZWQgdGltZSBpbiBvdGhlciBwYXJ0cyBvZiBSdXNzaWEgYXJlCi0jIHRha2VuIGZyb20gd2hhdCBhcHBlYXIgdG8gYmUgZ3Vlc3NlcyBieSBTaGFua3MuCi0jIChUaGFua3MgdG8gQWxleGFuZGVyIEJlbG9wb2xza3kgZm9yIHBvaW50ZXJzIHRvIHRoZSBkZWNyZWVzLikKLQogIyBGcm9tIFN0ZXBhbiBHb2xvc3Vub3YgKDIwMTYtMDMtMDcpOgogIyAxMS4gUmVnaW9ucy12aW9sYXRvcnMsIDE5ODEtMTk4Mi4KICMgV2lraXBlZGlhIHJlZmVycyB0bwpAQCAtMjQ3NSw3ICsyNDUzLDcgQEAKICMgYXR0cmlidXRlcyB0aGUgMTk4MiBjaGFuZ2VzIHRvIHRoZSBBY3Qgb2YgdGhlIENvdW5jaWwgb2YgTWluaXN0ZXJzCiAjIG9mIHRoZSBVU1NSIE5vLiAxMjYgZnJvbSAxOC4wMi4xOTgyLiAgMTk4MC05MjUudHh0IGFsc28gYWRkcwogIyBVZG11cnRpYSB0byB0aGUgbGlzdCBvZiBhZmZlY3RlZCB0ZXJyaXRvcmllcyBhbmQgbGlzdHMgS2hhdGFuZ3NreQotIyBkaXN0cmljdCBzZXBhcmF0ZWx5IGZyb20gVGF5bXlyIEF1dG9ub21vdXMgT2tydWcuICBQcm9iYWJseSBlcnJvbmVvdXNseS4KKyMgZGlzdHJpY3Qgc2VwYXJhdGVseSBmcm9tIFRheW15ciBBdXRvbm9tb3VzIE9rdXJnLiAgUHJvYmFibHkgZXJyb25lb3VzbHkuCiAjCiAjIFRoZSBhZmZlY3RlZCB0ZXJyaXRvcmllcyBhcmUgY3VycmVudGx5IGxpc3RlZCB1bmRlciBFdXJvcGUvTW9zY293LAogIyBBc2lhL1lla2F0ZXJpbmJ1cmcgYW5kIEFzaWEvS3Jhc25veWFyc2suCkBAIC0yNTM1LDcgKzI1MTMsNyBAQAogCiBab25lIEV1cm9wZS9Nb3Njb3cJIDI6MzA6MTcgLQlMTVQJMTg4MAogCQkJIDI6MzA6MTcgLQlNTVQJMTkxNiBKdWwgIDMgIyBNb3Njb3cgTWVhbiBUaW1lCi0JCQkgMjozMToxOSBSdXNzaWEJJXMJMTkxOSBKdWwgIDEgIDA6MDB1CisJCQkgMjozMToxOSBSdXNzaWEJJXMJMTkxOSBKdWwgIDEgIDI6MDAKIAkJCSAzOjAwCVJ1c3NpYQklcwkxOTIxIE9jdAogCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTkyMiBPY3QKIAkJCSAyOjAwCS0JRUVUCTE5MzAgSnVuIDIxCkBAIC0yNjE4LDIxICsyNTk2LDIyIEBACiAjIFRoZSAxOTg4IHRyYW5zaXRpb24gaXMgZnJvbSBVU1NSIGFjdCBOby4gNSAoMTk4OC0wMS0wNCkuCiAKIFpvbmUgRXVyb3BlL1ZvbGdvZ3JhZAkgMjo1Nzo0MCAtCUxNVAkxOTIwIEphbiAgMwotCQkJIDM6MDAJLQkrMDMJMTkzMCBKdW4gMjEKLQkJCSA0OjAwCS0JKzA0CTE5NjEgTm92IDExCi0JCQkgNDowMAlSdXNzaWEJKzA0LyswNQkxOTg4IE1hciAyNyAgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQkrMDMvKzA0CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDQ6MDAJLQkrMDQJMTk5MiBNYXIgMjkgIDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJKzAzLyswNAkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA0OjAwCS0JKzA0CTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDM6MDAJLQkrMDMKKwkJCSAzOjAwCS0JVFNBVAkxOTI1IEFwciAgNiAjIFRzYXJpdHN5biBUaW1lCisJCQkgMzowMAktCVNUQVQJMTkzMCBKdW4gMjEgIyBTdGFsaW5ncmFkIFRpbWUKKwkJCSA0OjAwCS0JU1RBVAkxOTYxIE5vdiAxMQorCQkJIDQ6MDAJUnVzc2lhCVZPTCVzVAkxOTg4IE1hciAyNyAgMjowMHMgIyBWb2xnb2dyYWQgVAorCQkJIDM6MDAJUnVzc2lhCVZPTCVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA0OjAwCS0JVk9MVAkxOTkyIE1hciAyOSAgMjowMHMKKwkJCSAzOjAwCVJ1c3NpYQlNU0svTVNECTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDQ6MDAJLQlNU0sJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgMzowMAktCU1TSwogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTYtMDMtMTgpOgogIyBFdXJvcGUvS2lyb3YgY292ZXJzOgogIyA0MwlSVS1LSVIJS2lyb3YgT2JsYXN0CiAjIFRoZSAxOTg5IHRyYW5zaXRpb24gaXMgZnJvbSBVU1NSIGFjdCBOby4gMjI3ICgxOTg5LTAzLTE0KS4KICMKLVpvbmUgRXVyb3BlL0tpcm92CSAzOjE4OjQ4IC0JTE1UCTE5MTkgSnVsICAxICAwOjAwdQorWm9uZSBFdXJvcGUvS2lyb3YJIDM6MTg6NDggLQlMTVQJMTkxOSBKdWwgIDEgIDI6MDAKIAkJCSAzOjAwCS0JKzAzCTE5MzAgSnVuIDIxCiAJCQkgNDowMAlSdXNzaWEJKzA0LyswNQkxOTg5IE1hciAyNiAgMjowMHMKIAkJCSAzOjAwCVJ1c3NpYQkrMDMvKzA0CTE5OTEgTWFyIDMxICAyOjAwcwpAQCAtMjY1MCwxNiArMjYyOSwxNiBAQAogIyBCeWFsb2tveiAxOTE5IHNheXMgU2FtYXJhIHdhcyAzOjIwOjIwLgogIyBUaGUgMTk4OSB0cmFuc2l0aW9uIGlzIGZyb20gVVNTUiBhY3QgTm8uIDIyNyAoMTk4OS0wMy0xNCkuCiAKLVpvbmUgRXVyb3BlL1NhbWFyYQkgMzoyMDoyMCAtCUxNVAkxOTE5IEp1bCAgMSAgMDowMHUKLQkJCSAzOjAwCS0JKzAzCTE5MzAgSnVuIDIxCi0JCQkgNDowMAktCSswNAkxOTM1IEphbiAyNwotCQkJIDQ6MDAJUnVzc2lhCSswNC8rMDUJMTk4OSBNYXIgMjYgIDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJKzAzLyswNAkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSAyOjAwCVJ1c3NpYQkrMDIvKzAzCTE5OTEgU2VwIDI5ICAyOjAwcwotCQkJIDM6MDAJLQkrMDMJMTk5MSBPY3QgMjAgIDM6MDAKLQkJCSA0OjAwCVJ1c3NpYQkrMDQvKzA1CTIwMTAgTWFyIDI4ICAyOjAwcwotCQkJIDM6MDAJUnVzc2lhCSswMy8rMDQJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkgNDowMAktCSswNAorWm9uZSBFdXJvcGUvU2FtYXJhCSAzOjIwOjIwIC0JTE1UCTE5MTkgSnVsICAxICAyOjAwCisJCQkgMzowMAktCVNBTVQJMTkzMCBKdW4gMjEgIyBTYW1hcmEgVGltZQorCQkJIDQ6MDAJLQlTQU1UCTE5MzUgSmFuIDI3CisJCQkgNDowMAlSdXNzaWEJS1VZJXNUCTE5ODkgTWFyIDI2ICAyOjAwcyAjIEt1eWJ5c2hldgorCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgMjowMAlSdXNzaWEJRUUlc1QJMTk5MSBTZXAgMjkgIDI6MDBzCisJCQkgMzowMAktCVNBTVQJMTk5MSBPY3QgMjAgIDM6MDAKKwkJCSA0OjAwCVJ1c3NpYQlTQU0lc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkgMzowMAlSdXNzaWEJU0FNJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDQ6MDAJLQlTQU1UCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wMy0xOCk6CiAjIEV1cm9wZS9VbHlhbm92c2sgY292ZXJzOgpAQCAtMjY3NCw3ICsyNjUzLDcgQEAKICMgRnJvbSBNYXR0IEpvaG5zb24gKDIwMTYtMDMtMDkpOgogIyBodHRwOi8vcHVibGljYXRpb24ucHJhdm8uZ292LnJ1L0RvY3VtZW50L1ZpZXcvMDAwMTIwMTYwMzA5MDA1MQogCi1ab25lIEV1cm9wZS9VbHlhbm92c2sJIDM6MTM6MzYgLQlMTVQJMTkxOSBKdWwgIDEgIDA6MDB1Citab25lIEV1cm9wZS9VbHlhbm92c2sJIDM6MTM6MzYgLQlMTVQJMTkxOSBKdWwgIDEgIDI6MDAKIAkJCSAzOjAwCS0JKzAzCTE5MzAgSnVuIDIxCiAJCQkgNDowMAlSdXNzaWEJKzA0LyswNQkxOTg5IE1hciAyNiAgMjowMHMKIAkJCSAzOjAwCVJ1c3NpYQkrMDMvKzA0CTE5OTEgTWFyIDMxICAyOjAwcwpAQCAtMjcwNiwxMiArMjY4NSwxMiBAQAogCiBab25lIEFzaWEvWWVrYXRlcmluYnVyZwkgNDowMjozMyAtCUxNVAkxOTE2IEp1bCAgMwogCQkJIDM6NDU6MDUgLQlQTVQJMTkxOSBKdWwgMTUgIDQ6MDAKLQkJCSA0OjAwCS0JKzA0CTE5MzAgSnVuIDIxCi0JCQkgNTowMAlSdXNzaWEJKzA1LyswNgkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA0OjAwCVJ1c3NpYQkrMDQvKzA1CTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJIDU6MDAJUnVzc2lhCSswNS8rMDYJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkgNjowMAktCSswNgkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCSA1OjAwCS0JKzA1CisJCQkgNDowMAktCVNWRVQJMTkzMCBKdW4gMjEgIyBTdmVyZGxvdnNrIFRpbWUKKwkJCSA1OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNDowMAlSdXNzaWEJU1ZFJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDU6MDAJUnVzc2lhCVlFSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA2OjAwCS0JWUVLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA1OjAwCS0JWUVLVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CkBAIC0yNzIxLDEyICsyNzAwLDEyIEBACiAjIEJ5YWxva296IDE5MTkgc2F5cyBPbXNrIHdhcyA0OjUzOjMwLgogCiBab25lIEFzaWEvT21zawkJIDQ6NTM6MzAgLQlMTVQJMTkxOSBOb3YgMTQKLQkJCSA1OjAwCS0JKzA1CTE5MzAgSnVuIDIxCi0JCQkgNjowMAlSdXNzaWEJKzA2LyswNwkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA1OjAwCVJ1c3NpYQkrMDUvKzA2CTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCSswNi8rMDcJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkgNzowMAktCSswNwkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCSA2OjAwCS0JKzA2CisJCQkgNTowMAktCU9NU1QJMTkzMCBKdW4gMjEgIyBPbXNrIFRpbWUKKwkJCSA2OjAwCVJ1c3NpYQlPTVMlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNTowMAlSdXNzaWEJT01TJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA3OjAwCS0JT01TVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA2OjAwCS0JT01TVAogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTYtMDItMjIpOgogIyBBc2lhL0Jhcm5hdWwgY292ZXJzOgpAQCAtMjgwNiw3ICsyNzg1LDcgQEAKICMgTm90ZSB0aGF0IHRpbWUgYmVsdHMgKG51bWJlcmVkIGZyb20gMiAoTW9zY293KSB0byAxMiBhY2NvcmRpbmcgdG8gdGhlaXIKICMgR01UL1VUQyBvZmZzZXQgYW5kIGhhdmluZyB0b28gbWFueSBleGNlcHRpb25zIGxpa2UgcmVnaW9ucyBmb3JtYWxseQogIyBiZWxvbmdpbmcgdG8gb25lIGJlbHQgYnV0IHVzaW5nIHRpbWUgZnJvbSBhbm90aGVyKSB3ZXJlIHJlcGxhY2VkCi0jIHdpdGggdGltZSB6b25lcyBpbiAyMDExIHdpdGggZGlmZmVyZW50IG51bWJlcmluZyAodGhlcmUgd2FzIGEKKyMgd2l0aCB0aW1lIHpvbmVzIGluIDIwMTEgd2l0aCBkaWZmZXJlbnQgbnVtYmVyaW5ncyAodGhlcmUgd2FzIGEKICMgMi1ob3VyIGdhcCBiZXR3ZWVuIHNlY29uZCBhbmQgdGhpcmQgem9uZXMgaW4gMjAxMS0yMDE0KS4KIAogIyBGcm9tIFN0ZXBhbiBHb2xvc3Vub3YgKDIwMTYtMDQtMTIpOgpAQCAtMjg4OSwxMiArMjg2OCwxMiBAQAogIyBCeWFsb2tveiAxOTE5IHNheXMgS3Jhc25veWFyc2sgd2FzIDY6MTE6MjYuCiAKIFpvbmUgQXNpYS9LcmFzbm95YXJzawkgNjoxMToyNiAtCUxNVAkxOTIwIEphbiAgNgotCQkJIDY6MDAJLQkrMDYJMTkzMCBKdW4gMjEKLQkJCSA3OjAwCVJ1c3NpYQkrMDcvKzA4CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDY6MDAJUnVzc2lhCSswNi8rMDcJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgNzowMAlSdXNzaWEJKzA3LyswOAkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA4OjAwCS0JKzA4CTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDc6MDAJLQkrMDcKKwkJCSA2OjAwCS0JS1JBVAkxOTMwIEp1biAyMSAjIEtyYXNub3lhcnNrIFRpbWUKKwkJCSA3OjAwCVJ1c3NpYQlLUkElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJS1JBJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA4OjAwCS0JS1JBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA3OjAwCS0JS1JBVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CkBAIC0yOTExLDEyICsyODkwLDEyIEBACiAKIFpvbmUgQXNpYS9Jcmt1dHNrCSA2OjU3OjA1IC0JTE1UCTE4ODAKIAkJCSA2OjU3OjA1IC0JSU1UCTE5MjAgSmFuIDI1ICMgSXJrdXRzayBNZWFuIFRpbWUKLQkJCSA3OjAwCS0JKzA3CTE5MzAgSnVuIDIxCi0JCQkgODowMAlSdXNzaWEJKzA4LyswOQkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQkrMDcvKzA4CTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCSswOC8rMDkJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkgOTowMAktCSswOQkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCSA4OjAwCS0JKzA4CisJCQkgNzowMAktCUlSS1QJMTkzMCBKdW4gMjEgIyBJcmt1dHNrIFRpbWUKKwkJCSA4OjAwCVJ1c3NpYQlJUkslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgNzowMAlSdXNzaWEJSVJLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCUlSSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCSA5OjAwCS0JSVJLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA4OjAwCS0JSVJLVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CkBAIC0yOTMzLDEzICsyOTEyLDEzIEBACiAjIGh0dHA6Ly9wdWJsaWNhdGlvbi5wcmF2by5nb3YucnUvRG9jdW1lbnQvVmlldy8wMDAxMjAxNTEyMzAwMTA3CiAKIFpvbmUgQXNpYS9DaGl0YQkgNzozMzo1MiAtCUxNVAkxOTE5IERlYyAxNQotCQkJIDg6MDAJLQkrMDgJMTkzMCBKdW4gMjEKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCSswOC8rMDkJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgOTowMAlSdXNzaWEJKzA5LysxMAkyMDExIE1hciAyNyAgMjowMHMKLQkJCTEwOjAwCS0JKzEwCTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDg6MDAJLQkrMDgJMjAxNiBNYXIgMjcgIDI6MDAKLQkJCSA5OjAwCS0JKzA5CisJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEwOjAwCS0JWUFLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA4OjAwCS0JSVJLVAkyMDE2IE1hciAyNyAgMjowMAorCQkJIDk6MDAJLQlZQUtUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA5LTExLTI5KToKQEAgLTI5NzksMTIgKzI5NTgsMTIgQEAKICMgQnlhbG9rb3ogMTkxOSBzYXlzIFlha3V0c2sgd2FzIDg6Mzg6NTguCiAKIFpvbmUgQXNpYS9ZYWt1dHNrCSA4OjM4OjU4IC0JTE1UCTE5MTkgRGVjIDE1Ci0JCQkgODowMAktCSswOAkxOTMwIEp1biAyMQotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkgODowMAlSdXNzaWEJKzA4LyswOQkxOTkyIEphbiAxOSAgMjowMHMKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJMTA6MDAJLQkrMTAJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkgOTowMAktCSswOQorCQkJIDg6MDAJLQlZQUtUCTE5MzAgSnVuIDIxICMgWWFrdXRzayBUaW1lCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMDowMAktCVlBS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgOTowMAktCVlBS1QKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgpAQCAtMzAwMiwxMiArMjk4MSwxMiBAQAogIyBHbyB3aXRoIEJ5YWxva296LgogCiBab25lIEFzaWEvVmxhZGl2b3N0b2sJIDg6NDc6MzEgLQlMTVQJMTkyMiBOb3YgMTUKLQkJCSA5OjAwCS0JKzA5CTE5MzAgSnVuIDIxCi0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMTowMAktCSsxMQkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCTEwOjAwCS0JKzEwCisJCQkgOTowMAktCVZMQVQJMTkzMCBKdW4gMjEgIyBWbGFkaXZvc3RvayBUaW1lCisJCQkxMDowMAlSdXNzaWEJVkxBJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVZMQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVZMQVQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCVZMQVQKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgpAQCAtMzAyNSwxNCArMzAwNCwxNCBAQAogIyBUaGlzIHRyYW5zaXRpb24gaXMgbm8gZG91YnQgd3JvbmcsIGJ1dCB3ZSBoYXZlIG5vIGJldHRlciBpbmZvLgogCiBab25lIEFzaWEvS2hhbmR5Z2EJIDk6MDI6MTMgLQlMTVQJMTkxOSBEZWMgMTUKLQkJCSA4OjAwCS0JKzA4CTE5MzAgSnVuIDIxCi0JCQkgOTowMAlSdXNzaWEJKzA5LysxMAkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA4OjAwCVJ1c3NpYQkrMDgvKzA5CTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMjAwNAotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMTowMAktCSsxMQkyMDExIFNlcCAxMyAgMDowMHMgIyBEZWNyZWUgNzI1PwotCQkJMTA6MDAJLQkrMTAJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkgOTowMAktCSswOQorCQkJIDg6MDAJLQlZQUtUCTE5MzAgSnVuIDIxICMgWWFrdXRzayBUaW1lCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDg6MDAJUnVzc2lhCVlBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMjAwNAorCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JVkxBVAkyMDExIFNlcCAxMyAgMDowMHMgIyBEZWNyZWUgNzI1PworCQkJMTA6MDAJLQlZQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDk6MDAJLQlZQUtUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKQEAgLTMwNDgsMTQgKzMwMjcsMTUgQEAKIAogIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1l1emhuby1TYWtoYWxpbnNrLCBidXQgdGhhdCdzIHRvbyBsb25nLgogWm9uZSBBc2lhL1Nha2hhbGluCSA5OjMwOjQ4IC0JTE1UCTE5MDUgQXVnIDIzCi0JCQkgOTowMAktCSswOQkxOTQ1IEF1ZyAyNQotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMTk5MSBNYXIgMzEgIDI6MDBzICMgU2FraGFsaW4gVAotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTk3IE1hciBsYXN0U3VuICAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMTowMAktCSsxMQkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCTEwOjAwCS0JKzEwCTIwMTYgTWFyIDI3ICAyOjAwcwotCQkJMTE6MDAJLQkrMTEKKwkJCSA5OjAwCS0JSkNTVAkxOTM3IE9jdCAgMQorCQkJIDk6MDAJLQlKU1QJMTk0NSBBdWcgMjUKKwkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzICMgU2FraGFsaW4gVAorCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlTQUslc1QJMTk5NyBNYXIgbGFzdFN1biAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlTQUslc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVNBS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCVNBS1QJMjAxNiBNYXIgMjcgIDI6MDBzCisJCQkxMTowMAktCVNBS1QKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgpAQCAtMzA3OCwxMyArMzA1OCwxMyBAQAogIyBodHRwOi8vcHVibGljYXRpb24ucHJhdm8uZ292LnJ1L0RvY3VtZW50L1ZpZXcvMDAwMTIwMTYwNDA1MDAzOAogCiBab25lIEFzaWEvTWFnYWRhbgkxMDowMzoxMiAtCUxNVAkxOTI0IE1heSAgMgotCQkJMTA6MDAJLQkrMTAJMTkzMCBKdW4gMjEgIyBNYWdhZGFuIFRpbWUKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkyMDExIE1hciAyNyAgMjowMHMKLQkJCTEyOjAwCS0JKzEyCTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJMTA6MDAJLQkrMTAJMjAxNiBBcHIgMjQgIDI6MDBzCi0JCQkxMTowMAktCSsxMQorCQkJMTA6MDAJLQlNQUdUCTE5MzAgSnVuIDIxICMgTWFnYWRhbiBUaW1lCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCU1BR1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCU1BR1QJMjAxNiBBcHIgMjQgIDI6MDBzCisJCQkxMTowMAktCU1BR1QKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDYpOgpAQCAtMzEyNywxNCArMzEwNywxNyBAQAogIyBpbiBSdXNzaWFuLikgIEluIGFkZGl0aW9uLCBTcmVkbmVrb2x5bXNrIGFwcGVhcnMgdG8gYmUgYSBtdWNoIG9sZGVyCiAjIHNldHRsZW1lbnQgYW5kIHRoZSBwb3B1bGF0aW9uIG9mIFp5cnlhbmthIHNlZW1zIHRvIGJlIGRlY2xpbmluZy4KICMgR28gd2l0aCBTcmVkbmVrb2x5bXNrLgorIworIyBTaW5jZSBNYWdhZGFuIE9ibGFzdCBtb3ZlcyB0byBVVEMrMTAgb24gMjAxNC0xMC0yNiwgd2UgY2Fubm90IGtlZXAgdXNpbmcgTUFHVAorIyBhcyB0aGUgYWJicmV2aWF0aW9uLiAgVXNlIFNSRVQgaW5zdGVhZC4KIAogWm9uZSBBc2lhL1NyZWRuZWtvbHltc2sJMTA6MTQ6NTIgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTEwOjAwCS0JKzEwCTE5MzAgSnVuIDIxCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTEwOjAwCVJ1c3NpYQkrMTAvKzExCTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMjowMAktCSsxMgkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCTExOjAwCS0JKzExCisJCQkxMDowMAktCU1BR1QJMTkzMCBKdW4gMjEgIyBNYWdhZGFuIFRpbWUKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEyOjAwCS0JTUFHVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTExOjAwCS0JU1JFVAkjIFNyZWRuZWtvbHltc2sgVGltZQogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CkBAIC0zMTUyLDE0ICszMTM1LDE0IEBACiAjIFVUQysxMiBzaW5jZSBhdCBsZWFzdCB0aGVuLCB0b28uCiAKIFpvbmUgQXNpYS9Vc3QtTmVyYQkgOTozMjo1NCAtCUxNVAkxOTE5IERlYyAxNQotCQkJIDg6MDAJLQkrMDgJMTkzMCBKdW4gMjEKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTE5ODEgQXByICAxCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTEwOjAwCVJ1c3NpYQkrMTAvKzExCTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMjowMAktCSsxMgkyMDExIFNlcCAxMyAgMDowMHMgIyBEZWNyZWUgNzI1PwotCQkJMTE6MDAJLQkrMTEJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkxMDowMAktCSsxMAorCQkJIDg6MDAJLQlZQUtUCTE5MzAgSnVuIDIxICMgWWFrdXRzayBUaW1lCisJCQkgOTowMAlSdXNzaWEJWUFLVAkxOTgxIEFwciAgMQorCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlNQUclc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTI6MDAJLQlNQUdUCTIwMTEgU2VwIDEzICAwOjAwcyAjIERlY3JlZSA3MjU/CisJCQkxMTowMAktCVZMQVQJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkxMDowMAktCVZMQVQKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDEtMDgtMjUpOgpAQCAtMzE3MiwxMiArMzE1NSwxMiBAQAogIyBUaGUgWm9uZSBuYW1lIHNob3VsZCBiZSBBc2lhL1BldHJvcGF2bG92c2stS2FtY2hhdHNraSBvciBwZXJoYXBzCiAjIEFzaWEvUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2t5LCBidXQgdGhlc2UgYXJlIHRvbyBsb25nLgogWm9uZSBBc2lhL0thbWNoYXRrYQkxMDozNDozNiAtCUxNVAkxOTIyIE5vdiAxMAotCQkJMTE6MDAJLQkrMTEJMTkzMCBKdW4gMjEKLQkJCTEyOjAwCVJ1c3NpYQkrMTIvKzEzCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMjowMAlSdXNzaWEJKzEyLysxMwkyMDEwIE1hciAyOCAgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJMTI6MDAJLQkrMTIKKwkJCTExOjAwCS0JUEVUVAkxOTMwIEp1biAyMSAjIFAtSyBUaW1lCisJCQkxMjowMAlSdXNzaWEJUEVUJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCVBFVCVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEyOjAwCVJ1c3NpYQlQRVQlc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJUEVUJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTI6MDAJLQlQRVRUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKQEAgLTMxODUsMTMgKzMxNjgsMTMgQEAKICMgODcJUlUtQ0hVCUNodWtvdGthIEF1dG9ub21vdXMgT2tydWcKIAogWm9uZSBBc2lhL0FuYWR5cgkxMTo0OTo1NiAtCUxNVAkxOTI0IE1heSAgMgotCQkJMTI6MDAJLQkrMTIJMTkzMCBKdW4gMjEKLQkJCTEzOjAwCVJ1c3NpYQkrMTMvKzE0CTE5ODIgQXByICAxICAwOjAwcwotCQkJMTI6MDAJUnVzc2lhCSsxMi8rMTMJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTkyIEphbiAxOSAgMjowMHMKLQkJCTEyOjAwCVJ1c3NpYQkrMTIvKzEzCTIwMTAgTWFyIDI4ICAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMjowMAktCSsxMgorCQkJMTI6MDAJLQlBTkFUCTE5MzAgSnVuIDIxICMgQW5hZHlyIFRpbWUKKwkJCTEzOjAwCVJ1c3NpYQlBTkElc1QJMTk4MiBBcHIgIDEgIDA6MDBzCisJCQkxMjowMAlSdXNzaWEJQU5BJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCUFOQSVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMjAxMCBNYXIgMjggIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJQU5BJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTI6MDAJLQlBTkFUCiAKIAogIyBTYW4gTWFyaW5vCkBAIC0zNTEyLDE0ICszNDk1LDYgQEAKICMgRW5naW5lZXJlZCBTdGFuZGFyZCBUaW1lLCIgc2FpZCBUd2l0dGVyIHVzZXIgQGF5c2VrYXJhaGFzYW4uCiAjIGh0dHA6Ly93d3cuYmJjLmNvbS9uZXdzL3dvcmxkLWV1cm9wZS0zNDYzMTMyNgogCi0jIEZyb20gQnVyYWsgQVlESU4gKDIwMTYtMDktMDgpOgotIyBUdXJrZXkgd2lsbCBzdGF5IGluIERheWxpZ2h0IFNhdmluZyBUaW1lIGV2ZW4gaW4gd2ludGVyLi4uLgotIyBodHRwOi8vd3d3LnJlc21pZ2F6ZXRlLmdvdi50ci9lc2tpbGVyLzIwMTYvMDkvMjAxNjA5MDgtMi5wZGYKLSMKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wOS0wNyk6Ci0jIFRoZSBjaGFuZ2UgaXMgcGVybWFuZW50LCBzbyB0aGlzIGlzIHRoZSBuZXcgc3RhbmRhcmQgdGltZSBpbiBUdXJrZXkuCi0jIEl0IHRha2VzIGVmZmVjdCB0b2RheSwgd2hpY2ggaXMgbm90IG11Y2ggbm90aWNlLgotCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwogUnVsZQlUdXJrZXkJMTkxNglvbmx5CS0JTWF5CSAxCTA6MDAJMTowMAlTCiBSdWxlCVR1cmtleQkxOTE2CW9ubHkJLQlPY3QJIDEJMDowMAkwCS0KQEAgLTM1ODMsNyArMzU1OCw3IEBACiBab25lCUV1cm9wZS9Jc3RhbmJ1bAkxOjU1OjUyIC0JTE1UCTE4ODAKIAkJCTE6NTY6NTYJLQlJTVQJMTkxMCBPY3QgIyBJc3RhbmJ1bCBNZWFuIFRpbWU/CiAJCQkyOjAwCVR1cmtleQlFRSVzVAkxOTc4IE9jdCAxNQotCQkJMzowMAlUdXJrZXkJKzAzLyswNAkxOTg1IEFwciAyMAorCQkJMzowMAlUdXJrZXkJVFIlc1QJMTk4NSBBcHIgMjAgIyBUdXJrZXkgVGltZQogCQkJMjowMAlUdXJrZXkJRUUlc1QJMjAwNwogCQkJMjowMAlFVQlFRSVzVAkyMDExIE1hciAyNyAgMTowMHUKIAkJCTI6MDAJLQlFRVQJMjAxMSBNYXIgMjggIDE6MDB1CkBAIC0zNTkxLDggKzM1NjYsNyBAQAogCQkJMjowMAktCUVFVAkyMDE0IE1hciAzMSAgMTowMHUKIAkJCTI6MDAJRVUJRUUlc1QJMjAxNSBPY3QgMjUgIDE6MDB1CiAJCQkyOjAwCTE6MDAJRUVTVAkyMDE1IE5vdiAgOCAgMTowMHUKLQkJCTI6MDAJRVUJRUUlc1QJMjAxNiBTZXAgIDcKLQkJCTM6MDAJLQkrMDMKKwkJCTI6MDAJRVUJRUUlc1QKIExpbmsJRXVyb3BlL0lzdGFuYnVsCUFzaWEvSXN0YW5idWwJIyBJc3RhbmJ1bCBpcyBpbiBib3RoIGNvbnRpbmVudHMuCiAKICMgVWtyYWluZQpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvZmFjdG9yeSBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL2ZhY3RvcnkKaW5kZXggN2Q3OTY5My4uMGE2MDQxZCAxMDA2NDQKLS0tIGEvamRrL21ha2UvZGF0YS90emRhdGEvZmFjdG9yeQorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9mYWN0b3J5CkBAIC0yNCwxMCArMjQsOSBAQAogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAotIyBGb3IgZGlzdHJpYnV0b3JzIHdobyBkb24ndCB3YW50IHRvIHB1dCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBpbgotIyB0aGVpciBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcy4gIFVzZXJzIHRoYXQgcnVuICdkYXRlJyB3aWxsIGdldCB0aGUKLSMgdGltZSB6b25lIGFiYnJldmlhdGlvbiAiLTAwIiwgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgdGltZSB6b25lCi0jIGlzIHVua25vd24uCisjIEZvciBjb21wYW5pZXMgd2hvIGRvbid0IHdhbnQgdG8gcHV0IHRpbWUgem9uZSBzcGVjaWZpY2F0aW9uIGluCisjIHRoZWlyIGluc3RhbGxhdGlvbiBwcm9jZWR1cmVzLiAgV2hlbiB1c2VycyBydW4gZGF0ZSwgdGhleSdsbCBnZXQgdGhlIG1lc3NhZ2UuCisjIEFsc28gdXNlZnVsIGZvciB0aGUgImNvbXAuc291cmNlcyIgdmVyc2lvbi4KIAogIyBab25lCU5BTUUJR01UT0ZGCVJVTEVTCUZPUk1BVAotWm9uZQlGYWN0b3J5CTAJLQktMDAKK1pvbmUJRmFjdG9yeQkwCS0gIkxvY2FsIHRpbWUgem9uZSBtdXN0IGJlIHNldC0tc2VlIHppYyBtYW51YWwgcGFnZSIKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL2xlYXBzZWNvbmRzIGIvamRrL21ha2UvZGF0YS90emRhdGEvbGVhcHNlY29uZHMKaW5kZXggNzFkNzc0ZC4uYTA4ZmJjNyAxMDA2NDQKLS0tIGEvamRrL21ha2UvZGF0YS90emRhdGEvbGVhcHNlY29uZHMKKysrIGIvamRrL21ha2UvZGF0YS90emRhdGEvbGVhcHNlY29uZHMKQEAgLTc5LDcgKzc5LDYgQEAKIExlYXAJMjAwOAlEZWMJMzEJMjM6NTk6NjAJKwlTCiBMZWFwCTIwMTIJSnVuCTMwCTIzOjU5OjYwCSsJUwogTGVhcAkyMDE1CUp1bgkzMAkyMzo1OTo2MAkrCVMKLUxlYXAJMjAxNglEZWMJMzEJMjM6NTk6NjAJKwlTCiAKLSMJVXBkYXRlZCB0aHJvdWdoIElFUlMgQnVsbGV0aW4gQzUyCi0jCUZpbGUgZXhwaXJlcyBvbjogIDI4IEp1bmUgMjAxNworIwlVcGRhdGVkIHRocm91Z2ggSUVSUyBCdWxsZXRpbiBDNTEKKyMJRmlsZSBleHBpcmVzIG9uOiAgMjggRGVjZW1iZXIgMjAxNgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvbm9ydGhhbWVyaWNhIGIvamRrL21ha2UvZGF0YS90emRhdGEvbm9ydGhhbWVyaWNhCmluZGV4IDhhYjYzNWQuLmVjNTk1MTAgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2RhdGEvdHpkYXRhL25vcnRoYW1lcmljYQorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9ub3J0aGFtZXJpY2EKQEAgLTQzNiw0MiArNDM2LDExIEBACiAjIG5vcnRoIG9mIHRoZSBTYWxtb24gUml2ZXIsIGFuZCB0aGUgdG93bnMgb2YgQnVyZ2RvcmYgYW5kIFdhcnJlbiksCiAjIE5ldmFkYSAoZXhjZXB0IFdlc3QgV2VuZG92ZXIpLCBPcmVnb24gKGV4Y2VwdCB0aGUgbm9ydGhlcm4gMy80IG9mCiAjIE1hbGhldXIgY291bnR5KSwgYW5kIFdhc2hpbmd0b24KLQotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE2LTA4LTIwKToKLSMgSW4gZWFybHkgRmVicnVhcnkgMTk0OCwgaW4gcmVzcG9uc2UgdG8gQ2FsaWZvcm5pYSdzIGVsZWN0cmljaXR5IHNob3J0YWdlLAotIyBQRyZFIGNoYW5nZWQgcG93ZXIgZnJlcXVlbmN5IGZyb20gNjAgdG8gNTkuNSBIeiBkdXJpbmcgZGF5bGlnaHQgaG91cnMsCi0jIGNhdXNpbmcgZWxlY3RyaWMgY2xvY2tzIHRvIGxvc2Ugc2l4IG1pbnV0ZXMgcGVyIGRheS4gIChUaGlzIGRpZCBub3QgY2hhbmdlCi0jIGxlZ2FsIHRpbWUsIGFuZCBpcyBub3QgcGFydCBvZiB0aGUgZGF0YSBoZXJlLikgIFNlZToKLSMgUm9zcyBTQS4gQW4gZW5lcmd5IGNyaXNpcyBmcm9tIHRoZSBwYXN0OiBOb3J0aGVybiBDYWxpZm9ybmlhIGluIDE5NDguCi0jIFdvcmtpbmcgUGFwZXIgTm8uIDgsIEluc3RpdHV0ZSBvZiBHb3Zlcm5tZW50YWwgU3R1ZGllcywgVUMgQmVya2VsZXksCi0jIDE5NzMtMTEuICBodHRwOi8vZXNjaG9sYXJzaGlwLm9yZy91Yy9pdGVtLzh4MjJrMzBjCi0jCi0jIEluIGFub3RoZXIgbWVhc3VyZSB0byBzYXZlIGVsZWN0cmljaXR5LCBEU1Qgd2FzIGluc3RpdHV0ZWQgZnJvbSAxOTQ4LTAzLTE0Ci0jIGF0IDAyOjAxIHRvIDE5NDktMDEtMTYgYXQgMDI6MDAsIHdpdGggdGhlIGdvdmVybm9yIGhhdmluZyB0aGUgb3B0aW9uIHRvIG1vdmUKLSMgdGhlIGZhbGxiYWNrIHRyYW5zaXRpb24gZWFybGllci4gIFNlZSBwYWdlcyAzLTQgb2Y6Ci0jIGh0dHA6Ly9jbGVyay5hc3NlbWJseS5jYS5nb3Yvc2l0ZXMvY2xlcmsuYXNzZW1ibHkuY2EuZ292L2ZpbGVzL2FyY2hpdmUvU3RhdHV0ZXMvMTk0OC80OFZvbDFfQ2hhcHRlcnMucGRmCi0jCi0jIEluIHJlc3BvbnNlOgotIwotIyAgIEdvdmVybm9yIFdhcnJlbiByZWNlaXZlZCBhIHRvcnJlbnQgb2Ygb2JqZWN0aW5nIG1haWwsIGFuZCBpdCBpcyBub3QgdG9vIG11Y2gKLSMgICB0byBzcGVjdWxhdGUgdGhhdCB0aGUgb2JqZWN0aW9ucyB0byBEYXlsaWdodCBTYXZpbmcgVGltZSB3ZXJlIG9uZSBpbXBvcnRhbnQKLSMgICBmYWN0b3IgaW4gdGhlIGRlZmVhdCBvZiB0aGUgRGV3ZXktV2FycmVuIFByZXNpZGVudGlhbCB0aWNrZXQgaW4gQ2FsaWZvcm5pYS4KLSMgICAgIC0tIFJvc3MsIHAgMjUKLSMKLSMgT24gRGVjZW1iZXIgOCB0aGUgZ292ZXJub3IgZXhlcmNpc2VkIHRoZSBvcHRpb24sIHNldHRpbmcgdGhlIGRhdGUgdG8gSmFudWFyeSAxCi0jIChMQSBUaW1lcyAxOTQ4LTEyLTA5KS4gIFRoZSB0cmFuc2l0aW9uIHRpbWUgd2FzIDAyOjAwIChMQSBUaW1lcyAxOTQ5LTAxLTAxKS4KLSMKLSMgRGVzcGl0ZSB0aGUgY29udHJvdmVyc3ksIGluIDE5NDkgQ2FsaWZvcm5pYSB2b3RlcnMgYXBwcm92ZWQgUHJvcG9zaXRpb24gMTIsCi0jIHdoaWNoIGVzdGFibGlzaGVkIERTVCBmcm9tIEFwcmlsJ3MgbGFzdCBTdW5kYXkgYXQgMDE6MDAgdW50aWwgU2VwdGVtYmVyJ3MKLSMgbGFzdCBTdW5kYXkgYXQgMDI6MDAuIFRoaXMgd2FzIGFtZW5kZWQgYnkgMTk2MidzIFByb3Bvc2l0aW9uIDYsIHdoaWNoIGNoYW5nZWQKLSMgdGhlIGZhbGwtYmFjayBkYXRlIHRvIE9jdG9iZXIncyBsYXN0IFN1bmRheS4gU2VlOgotIyBodHRwOi8vcmVwb3NpdG9yeS51Y2hhc3RpbmdzLmVkdS9jZ2kvdmlld2NvbnRlbnQuY2dpP2FydGljbGU9MTUwMSZjb250ZXh0PWNhX2JhbGxvdF9wcm9wcwotIyBodHRwOi8vcmVwb3NpdG9yeS51Y2hhc3RpbmdzLmVkdS9jZ2kvdmlld2NvbnRlbnQuY2dpP2FydGljbGU9MTYzNiZjb250ZXh0PWNhX2JhbGxvdF9wcm9wcwogIwogIyBSdWxlCU5BTUUJRlJPTQlUTwlUWVBFCUlOCU9OCUFUCVNBVkUJTEVUVEVSCi1SdWxlCUNBCTE5NDgJb25seQktCU1hcgkxNAkyOjAxCTE6MDAJRAorUnVsZQlDQQkxOTQ4CW9ubHkJLQlNYXIJMTQJMjowMAkxOjAwCUQKIFJ1bGUJQ0EJMTk0OQlvbmx5CS0JSmFuCSAxCTI6MDAJMAlTCi1SdWxlCUNBCTE5NTAJMTk2NgktCUFwcglsYXN0U3VuCTE6MDAJMTowMAlECitSdWxlCUNBCTE5NTAJMTk2NgktCUFwcglsYXN0U3VuCTI6MDAJMTowMAlECiBSdWxlCUNBCTE5NTAJMTk2MQktCVNlcAlsYXN0U3VuCTI6MDAJMAlTCiBSdWxlCUNBCTE5NjIJMTk2NgktCU9jdAlsYXN0U3VuCTI6MDAJMAlTCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0zMzM1LDcgKzMzMDQsNyBAQAogIyBpbmRpY2F0aW5nIHRoYXQgdGhlIG5vcm1hbCBFVCBydWxlcyBhcmUgZm9sbG93ZWQuCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDgtMTkpOgotIyBUaGUgMjAxNC0wOC0xMyBDYWJpbmV0IG1lZXRpbmcgZGVjaWRlZCB0byBzdGF5IG9uIFVUIC0wNCB5ZWFyLXJvdW5kLiAgU2VlOgorIyBUaGUgMjAxNC0wOC0xMyBDYWJpbmV0IG1lZXRpbmcgZGVjaWRlZCB0byBzdGF5IG9uIFVUQy00IHllYXItcm91bmQuICBTZWU6CiAjIGh0dHA6Ly90Y3dlZWtseW5ld3MuY29tL2RheWxpZ2h0LXNhdmluZ3MtdGltZS10by1iZS1tYWludGFpbmVkLXA1MzUzLTEyNy5odG0KICMgTW9kZWwgdGhpcyBhcyBhIHN3aXRjaCBmcm9tIEVTVC9FRFQgdG8gQVNUIC4uLgogIyBGcm9tIENocmlzIFdhbHRvbiAoMjAxNC0xMS0wNCk6CmRpZmYgLS1naXQgYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9zb3V0aGFtZXJpY2EgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS9zb3V0aGFtZXJpY2EKaW5kZXggYmJjMGE5NS4uMDhjODljYSAxMDA2NDQKLS0tIGEvamRrL21ha2UvZGF0YS90emRhdGEvc291dGhhbWVyaWNhCisrKyBiL2pkay9tYWtlL2RhdGEvdHpkYXRhL3NvdXRoYW1lcmljYQpAQCAtNDMzLDkgKzQzMyw5IEBACiAjIHN0dWNrIG9uIFN1bW1lciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZXZlbiB0aG91Z2ggdGhlIHN1bW1lciBpcyBvdmVyLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDktMDUpOgotIyBQZXJoYXBzIFNhbiBMdWlzIG9wZXJhdGVzIG9uIHRoZSBsZWdhbCBmaWN0aW9uIHRoYXQgaXQgaXMgYXQgLTA0CisjIFBlcmhhcHMgU2FuIEx1aXMgb3BlcmF0ZXMgb24gdGhlIGxlZ2FsIGZpY3Rpb24gdGhhdCBpdCBpcyBhdCBVVEMtNAogIyB3aXRoIHBlcnBldHVhbCBzdW1tZXIgdGltZSwgYnV0IG9yZGluYXJ5IHVzYWdlIHR5cGljYWxseSBzZWVtcyB0bwotIyBqdXN0IHNheSBpdCdzIGF0IC0wMzsgc2VlLCBmb3IgZXhhbXBsZSwKKyMganVzdCBzYXkgaXQncyBhdCBVVEMtMzsgc2VlLCBmb3IgZXhhbXBsZSwKICMgaHR0cDovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JhX29maWNpYWxfYXJnZW50aW5hCiAjIFdlJ3ZlIGRvY3VtZW50ZWQgc2ltaWxhciBzaXR1YXRpb25zIGFzIGJlaW5nIHBsYWluIGNoYW5nZXMgdG8KICMgc3RhbmRhcmQgdGltZSwgc28gbGV0J3MgZG8gdGhhdCBoZXJlIHRvby4gIFRoaXMgZG9lcyBub3QgY2hhbmdlIFVUQwpkaWZmIC0tZ2l0IGEvamRrL21ha2UvZGF0YS90emRhdGEvem9uZS50YWIgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS96b25lLnRhYgppbmRleCBkYjA1MDYwLi41NjQ5NjkxIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9kYXRhL3R6ZGF0YS96b25lLnRhYgorKysgYi9qZGsvbWFrZS9kYXRhL3R6ZGF0YS96b25lLnRhYgpAQCAtMjg0LDcgKzI4NCw3IEBACiBNSAkrMDkwNSsxNjcyMAlQYWNpZmljL0t3YWphbGVpbglLd2FqYWxlaW4KIE1LCSs0MTU5KzAyMTI2CUV1cm9wZS9Ta29wamUKIE1MCSsxMjM5LTAwODAwCUFmcmljYS9CYW1ha28KLU1NCSsxNjQ3KzA5NjEwCUFzaWEvWWFuZ29uCitNTQkrMTY0NyswOTYxMAlBc2lhL1Jhbmdvb24KIE1OCSs0NzU1KzEwNjUzCUFzaWEvVWxhYW5iYWF0YXIJTW9uZ29saWEgKG1vc3QgYXJlYXMpCiBNTgkrNDgwMSswOTEzOQlBc2lhL0hvdmQJQmF5YW4tT2xnaXksIEdvdmktQWx0YWksIEhvdmQsIFV2cywgWmF2a2hhbgogTU4JKzQ4MDQrMTE0MzAJQXNpYS9DaG9pYmFsc2FuCURvcm5vZCwgU3VraGJhYXRhcgpkaWZmIC0tZ2l0IGEvamRrL21ha2UvbWFwZmlsZXMvbGlibmV0L21hcGZpbGUtdmVycyBiL2pkay9tYWtlL21hcGZpbGVzL2xpYm5ldC9tYXBmaWxlLXZlcnMKaW5kZXggYTM3NjY4YS4uMGU0MzJkMyAxMDA2NDQKLS0tIGEvamRrL21ha2UvbWFwZmlsZXMvbGlibmV0L21hcGZpbGUtdmVycworKysgYi9qZGsvbWFrZS9tYXBmaWxlcy9saWJuZXQvbWFwZmlsZS12ZXJzCkBAIC0xMTIsNyArMTEyLDYgQEAKIAkJTkVUX0VuYWJsZUZhc3RUY3BMb29wYmFjazsKIAkJTkVUX1Rocm93TmV3OwogICAgICAgICAgICAgICAgIGlwdjZfYXZhaWxhYmxlOwotICAgICAgICAgICAgICAgIGluaXRJbmV0QWRkcmVzc0lEczsKIAogCWxvY2FsOgogCQkqOwpkaWZmIC0tZ2l0IGEvamRrL21ha2UvcHJvZmlsZS1pbmNsdWRlcy50eHQgYi9qZGsvbWFrZS9wcm9maWxlLWluY2x1ZGVzLnR4dAppbmRleCBlNmRlOThlLi4zMDE0YTcxIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9wcm9maWxlLWluY2x1ZGVzLnR4dAorKysgYi9qZGsvbWFrZS9wcm9maWxlLWluY2x1ZGVzLnR4dApAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE4MywxNSArMTgzLDEzIEBACiAgICAgbmV0LnByb3BlcnRpZXMgXAogICAgIHJlc291cmNlcy5qYXIgXAogICAgIHJ0LmphciBcCi0gICAgc2VjdXJpdHkvcG9saWN5L2xpbWl0ZWQvVVNfZXhwb3J0X3BvbGljeS5qYXIgXAotICAgIHNlY3VyaXR5L3BvbGljeS91bmxpbWl0ZWQvVVNfZXhwb3J0X3BvbGljeS5qYXIgXAorICAgIHNlY3VyaXR5L1VTX2V4cG9ydF9wb2xpY3kuamFyIFwKICAgICBzZWN1cml0eS9ibGFja2xpc3QgXAogICAgIHNlY3VyaXR5L2JsYWNrbGlzdGVkLmNlcnRzIFwKICAgICBzZWN1cml0eS9jYWNlcnRzIFwKICAgICBzZWN1cml0eS9qYXZhLnBvbGljeSBcCiAgICAgc2VjdXJpdHkvamF2YS5zZWN1cml0eSBcCi0gICAgc2VjdXJpdHkvcG9saWN5L2xpbWl0ZWQvbG9jYWxfcG9saWN5LmphciBcCi0gICAgc2VjdXJpdHkvcG9saWN5L3VubGltaXRlZC9sb2NhbF9wb2xpY3kuamFyIFwKKyAgICBzZWN1cml0eS9sb2NhbF9wb2xpY3kuamFyIFwKICAgICBzZWN1cml0eS90cnVzdGVkLmxpYnJhcmllcyBcCiAgICAgdHpkYi5kYXQKIApAQCAtMjIwLDEwICsyMTgsOCBAQAogICAgIGpzc2UuamFyIFwKICAgICByZXNvdXJjZXMuamFyIFwKICAgICBydC5qYXIgXAotICAgIHNlY3VyaXR5L3BvbGljeS9saW1pdGVkL1VTX2V4cG9ydF9wb2xpY3kuamFyIFwKLSAgICBzZWN1cml0eS9wb2xpY3kvdW5saW1pdGVkL1VTX2V4cG9ydF9wb2xpY3kuamFyIFwKLSAgICBzZWN1cml0eS9wb2xpY3kvbGltaXRlZC9sb2NhbF9wb2xpY3kuamFyIFwKLSAgICBzZWN1cml0eS9wb2xpY3kvdW5saW1pdGVkL2xvY2FsX3BvbGljeS5qYXIKKyAgICBzZWN1cml0eS9VU19leHBvcnRfcG9saWN5LmphciBcCisgICAgc2VjdXJpdHkvbG9jYWxfcG9saWN5LmphcgogCiAKIFBST0ZJTEVfMl9KUkVfQklOX0ZJTEVTIDo9IFwKZGlmZiAtLWdpdCBhL2pkay9tYWtlL3Byb2ZpbGUtcnRqYXItaW5jbHVkZXMudHh0IGIvamRrL21ha2UvcHJvZmlsZS1ydGphci1pbmNsdWRlcy50eHQKaW5kZXggODRjNmEwZi4uYmRhMzIyZiAxMDA2NDQKLS0tIGEvamRrL21ha2UvcHJvZmlsZS1ydGphci1pbmNsdWRlcy50eHQKKysrIGIvamRrL21ha2UvcHJvZmlsZS1ydGphci1pbmNsdWRlcy50eHQKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMTksNyArMTE5LDYgQEAKICAgICBjb20vc3VuL3RyYWNpbmcgXAogICAgIGpkay9tYW5hZ2VtZW50IFwKICAgICBqZGsvaW50ZXJuYWwvY21tIFwKLSAgICBqZGsvaW50ZXJuYWwvaW5zdHJ1bWVudGF0aW9uIFwKICAgICBqYXZhL2xhbmcvaW5zdHJ1bWVudCBcCiAgICAgamF2YS9sYW5nL21hbmFnZW1lbnQgXAogICAgIGphdmEvc2VjdXJpdHkvYWNsIFwKQEAgLTIwOCw2ICsyMDcsNyBAQAogICAgIGphdmF4L3htbC9iaW5kIFwKICAgICBqYXZheC94bWwvc29hcCBcCiAgICAgamF2YXgveG1sL3dzIFwKKyAgICBqZGsvaW50ZXJuYWwvaW5zdHJ1bWVudGF0aW9uIFwKICAgICBqZGsvbWFuYWdlbWVudC9yZXNvdXJjZSBcCiAgICAgb3JnL29tZyBcCiAgICAgc3VuL2FwcGxldCBcCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL2NvbS9hcHBsZS9sYWYvQXF1YVByb2dyZXNzQmFyVUkuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhUHJvZ3Jlc3NCYXJVSS5qYXZhCmluZGV4IDgwYTVlMzYuLjFhYzE2YzMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhUHJvZ3Jlc3NCYXJVSS5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhUHJvZ3Jlc3NCYXJVSS5qYXZhCkBAIC0xMjQsOSArMTI0LDcgQEAKICAgICAgICAgICAgIGlmICghcHJvZ3Jlc3NCYXIuaXNJbmRldGVybWluYXRlKCkpIHJldHVybjsKICAgICAgICAgICAgIHN0b3BBbmltYXRpb25UaW1lcigpOwogICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGFuaW1hdGlvbiB0aHJlYWQKLSAgICAgICAgICAgIGlmIChwcm9ncmVzc0Jhci5pc0Rpc3BsYXlhYmxlKCkpIHsKLSAgICAgICAgICAgICAgc3RhcnRBbmltYXRpb25UaW1lcigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnRBbmltYXRpb25UaW1lcigpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCJKUHJvZ3Jlc3NCYXIuc3R5bGUiLmVxdWFscyhwcm9wKSkgewpAQCAtMTQzLDkgKzE0MSw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBhbmNlc3RvckFkZGVkKGZpbmFsIEFuY2VzdG9yRXZlbnQgZSkgewogICAgICAgICBpZiAoIXByb2dyZXNzQmFyLmlzSW5kZXRlcm1pbmF0ZSgpKSByZXR1cm47Ci0gICAgICAgIGlmIChwcm9ncmVzc0Jhci5pc0Rpc3BsYXlhYmxlKCkpIHsKLSAgICAgICAgICBzdGFydEFuaW1hdGlvblRpbWVyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgc3RhcnRBbmltYXRpb25UaW1lcigpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFuY2VzdG9yTW92ZWQoZmluYWwgQW5jZXN0b3JFdmVudCBlKSB7IH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9TY3JlZW5NZW51LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL2NvbS9hcHBsZS9sYWYvU2NyZWVuTWVudS5qYXZhCmluZGV4IGJjOGMwY2MuLjg3MzkzNDAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9TY3JlZW5NZW51LmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9jb20vYXBwbGUvbGFmL1NjcmVlbk1lbnUuamF2YQpAQCAtMTA5LDcgKzEwOSw2IEBACiAgICAgICAgIGZpbmFsIENvbXBvbmVudFtdIGl0ZW1zID0gZkludm9rZXIuZ2V0TWVudUNvbXBvbmVudHMoKTsKICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKGl0ZW1zLCBjaGlsZEhhc2hBcnJheSkpIHsKICAgICAgICAgICAgIHJlbW92ZUFsbCgpOwotICAgICAgICAgICAgZkl0ZW1zLmNsZWFyKCk7CiAgICAgICAgICAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuOwogCiAgICAgICAgICAgICBjaGlsZEhhc2hBcnJheSA9IG5ldyBpbnRbY291bnRdOwpAQCAtMjMzLDcgKzIzMiw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAoZ2V0VHJlZUxvY2soKSkgewogICAgICAgICAgICAgc3VwZXIuYWRkTm90aWZ5KCk7CiAgICAgICAgICAgICBpZiAoZk1vZGVsUHRyID09IDApIHsKLSAgICAgICAgICAgICAgICBmSW52b2tlci5nZXRQb3B1cE1lbnUoKS5hZGRDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICBmSW52b2tlci5hZGRDb250YWluZXJMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgICAgICBmSW52b2tlci5hZGRDb21wb25lbnRMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgICAgICBmUHJvcGVydHlMaXN0ZW5lciA9IG5ldyBTY3JlZW5NZW51UHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgICAgICBmSW52b2tlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKQEAgLTI2Nyw3ICsyNjYsNyBAQAogICAgICAgICAgICAgaWYgKGZNb2RlbFB0ciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlTWVudUxpc3RlbmVycyhmTW9kZWxQdHIpOwogICAgICAgICAgICAgICAgIGZNb2RlbFB0ciA9IDA7Ci0gICAgICAgICAgICAgICAgZkludm9rZXIuZ2V0UG9wdXBNZW51KCkucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICAgICAgZkludm9rZXIucmVtb3ZlQ29udGFpbmVyTGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICAgICAgZkludm9rZXIucmVtb3ZlQ29tcG9uZW50TGlzdGVuZXIodGhpcyk7CiAgICAgICAgICAgICAgICAgZkludm9rZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7CiAgICAgICAgICAgICB9CkBAIC0yODgsMTAgKzI4NywxMSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXBvbmVudFJlbW92ZWQoZmluYWwgQ29udGFpbmVyRXZlbnQgZSkgewogICAgICAgICBmaW5hbCBDb21wb25lbnQgY2hpbGQgPSBlLmdldENoaWxkKCk7Ci0gICAgICAgIGZpbmFsIE1lbnVJdGVtIHNtID0gZkl0ZW1zLnJlbW92ZShjaGlsZCk7CisgICAgICAgIGZpbmFsIE1lbnVJdGVtIHNtID0gZkl0ZW1zLmdldChjaGlsZCk7CiAgICAgICAgIGlmIChzbSA9PSBudWxsKSByZXR1cm47CiAKICAgICAgICAgcmVtb3ZlKHNtKTsKKyAgICAgICAgZkl0ZW1zLnJlbW92ZShzbSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9MV1dpbmRvd1BlZXIuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L0xXV2luZG93UGVlci5qYXZhCmluZGV4IDY0ODgwNTEuLmIxYmY4NzggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L0xXV2luZG93UGVlci5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L0xXV2luZG93UGVlci5qYXZhCkBAIC0xODMsNyArMTgzLDYgQEAKIAogICAgICAgICB1cGRhdGVBbHdheXNPblRvcFN0YXRlKCk7CiAgICAgICAgIHVwZGF0ZU1pbmltdW1TaXplKCk7Ci0gICAgICAgIHVwZGF0ZUZvY3VzYWJsZVdpbmRvd1N0YXRlKCk7CiAKICAgICAgICAgZmluYWwgU2hhcGUgc2hhcGUgPSBnZXRUYXJnZXQoKS5nZXRTaGFwZSgpOwogICAgICAgICBpZiAoc2hhcGUgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NBY2Nlc3NpYmlsaXR5LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0FjY2Vzc2liaWxpdHkuamF2YQppbmRleCA3YmM5OGU3Li5kM2FiNmE2IDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0FjY2Vzc2liaWxpdHkuamF2YQorKysgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0FjY2Vzc2liaWxpdHkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDggKzI1LDYgQEAKIAogcGFja2FnZSBzdW4ubHdhd3QubWFjb3N4OwogCi1pbXBvcnQgc3VuLmx3YXd0LkxXV2luZG93UGVlcjsKLQogaW1wb3J0IGphdmEuYXd0Lio7CiBpbXBvcnQgamF2YS5iZWFucy4qOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpAQCAtODQsMTUgKzgyLDYgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgc3RhdGljIDxUPiBUIGludm9rZUFuZFdhaXQoZmluYWwgQ2FsbGFibGU8VD4gY2FsbGFibGUsIGZpbmFsIENvbXBvbmVudCBjLCBmaW5hbCBUIGRlZlZhbHVlKSB7Ci0gICAgICAgIFQgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdmFsdWUgPSBMV0NUb29sa2l0Lmludm9rZUFuZFdhaXQoY2FsbGFibGUsIGMpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeyBlLnByaW50U3RhY2tUcmFjZSgpOyB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IGRlZlZhbHVlOwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIGludm9rZUxhdGVyKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBmaW5hbCBDb21wb25lbnQgYykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTFdDVG9vbGtpdC5pbnZva2VMYXRlcihydW5uYWJsZSwgYyk7CkBAIC0xODgsNyArMTc3LDcgQEAKIAogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbihhcy5pc0FjY2Vzc2libGVDaGlsZFNlbGVjdGVkKGluZGV4KSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0sIGMsIGZhbHNlKTsKKyAgICAgICAgfSwgYyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmxlU3RhdGVTZXQgZ2V0QWNjZXNzaWJsZVN0YXRlU2V0KGZpbmFsIEFjY2Vzc2libGVDb250ZXh0IGFjLCBmaW5hbCBDb21wb25lbnQgYykgewpAQCAtMjEwLDcgKzE5OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGFzcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICByZXR1cm4gYXNzLmNvbnRhaW5zKGFzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSwgYywgZmFsc2UpOworICAgICAgICB9LCBjKTsKICAgICB9CiAKICAgICBzdGF0aWMgRmllbGQgZ2V0QWNjZXNzaWJsZUJ1bmRsZUtleUZpZWxkV2l0aFJlZmxlY3Rpb24oKSB7CkBAIC0yNzYsNyArMjY1LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICByZXR1cm4gYXQuZ2V0Q2hhckNvdW50KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0sIGMsIDApOworICAgICAgICB9LCBjKTsKICAgICB9CiAKICAgICAvLyBBY2Nlc3NpYmlsaXR5IFRocmVhZHNhZmV0eSBmb3IgSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkubQpAQCAtMzAxLDcgKzI5MCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGFjID09IG51bGwpIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIHJldHVybiBhYy5nZXRBY2Nlc3NpYmxlSW5kZXhJblBhcmVudCgpOwogICAgICAgICAgICAgfQotICAgICAgICB9LCBjLCAtMSk7CisgICAgICAgIH0sIGMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJsZUNvbXBvbmVudCBnZXRBY2Nlc3NpYmxlQ29tcG9uZW50KGZpbmFsIEFjY2Vzc2libGUgYSwgZmluYWwgQ29tcG9uZW50IGMpIHsKQEAgLTM5Nyw3ICszODYsNyBAQAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGFDb21wLmlzRm9jdXNUcmF2ZXJzYWJsZSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9LCBjLCBmYWxzZSk7CisgICAgICAgIH0sIGMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJsZSBhY2Nlc3NpYmlsaXR5SGl0VGVzdChmaW5hbCBDb250YWluZXIgcGFyZW50LCBmaW5hbCBmbG9hdCBoaXRQb2ludFgsIGZpbmFsIGZsb2F0IGhpdFBvaW50WSkgewpAQCAtNDMyLDggKzQyMSw2IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmxlQWN0aW9uIGdldEFjY2Vzc2libGVBY3Rpb24oZmluYWwgQWNjZXNzaWJsZSBhLCBmaW5hbCBDb21wb25lbnQgYykgewotICAgICAgICBpZiAoYSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQogICAgICAgICByZXR1cm4gaW52b2tlQW5kV2FpdChuZXcgQ2FsbGFibGU8QWNjZXNzaWJsZUFjdGlvbj4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgQWNjZXNzaWJsZUFjdGlvbiBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgZmluYWwgQWNjZXNzaWJsZUNvbnRleHQgYWMgPSBhLmdldEFjY2Vzc2libGVDb250ZXh0KCk7CkBAIC00NTYsNyArNDQzLDcgQEAKIAogICAgICAgICAgICAgICAgIHJldHVybiBhQ29tcC5pc0VuYWJsZWQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSwgYywgZmFsc2UpOworICAgICAgICB9LCBjKTsKICAgICB9CiAKICAgICAvLyBLQ0ggLSBjYW4gd2UgbWFrZSB0aGlzIGEgcG9zdEV2ZW50IGluc3RlYWQ/CkBAIC02ODAsMjggKzY2Nyw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0sIGMpOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gQVdUVmlldyBwdHIsIGEgcGVlciBvZiB0aGUgQ1BsYXRmb3JtVmlldyBhc3NvY2lhdGVkIHdpdGggdGhlIHRvcGxldmVsIGNvbnRhaW5lciBvZiB0aGUgQWNjZXNzaWJsZSwgaWYgYW55Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRBV1RWaWV3KEFjY2Vzc2libGUgYSkgewotICAgICAgICBBY2Nlc3NpYmxlIGF4ID0gQ0FjY2Vzc2libGUuZ2V0U3dpbmdBY2Nlc3NpYmxlKGEpOwotICAgICAgICBpZiAoIShheCBpbnN0YW5jZW9mIENvbXBvbmVudCkpIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiBpbnZva2VBbmRXYWl0KG5ldyBDYWxsYWJsZTxMb25nPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBMb25nIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBDb21wb25lbnQgY29udCA9IChDb21wb25lbnQpIGF4OwotICAgICAgICAgICAgICAgIHdoaWxlIChjb250ICE9IG51bGwgJiYgIShjb250IGluc3RhbmNlb2YgV2luZG93KSkgewotICAgICAgICAgICAgICAgICAgICBjb250ID0gY29udC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMV1dpbmRvd1BlZXIgcGVlciA9IChMV1dpbmRvd1BlZXIpIGNvbnQuZ2V0UGVlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGVlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChDUGxhdGZvcm1XaW5kb3cpIHBlZXIuZ2V0UGxhdGZvcm1XaW5kb3coKSkuZ2V0Q29udGVudFZpZXcoKS5nZXRBV1RWaWV3KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDBMOwotICAgICAgICAgICAgfQotICAgICAgICB9LCAoQ29tcG9uZW50KWF4KTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0FjY2Vzc2libGVUZXh0LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0FjY2Vzc2libGVUZXh0LmphdmEKaW5kZXggNmFiZjA2ZS4uMDIzN2VmOSAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NBY2Nlc3NpYmxlVGV4dC5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DQWNjZXNzaWJsZVRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2NCw4ICsyNjQsNiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBsb2NhbFkgPSBib3VuZHNVbmlvbi5nZXRZKCk7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCBjb21wb25lbnRMb2NhdGlvbiA9IGFjLmdldEFjY2Vzc2libGVDb21wb25lbnQoKS5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudExvY2F0aW9uID09IG51bGwpIHJldHVybiByZXQ7Ci0KICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgc2NyZWVuWCA9IGNvbXBvbmVudExvY2F0aW9uLmdldFgoKSArIGxvY2FsWDsKICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgc2NyZWVuWSA9IGNvbXBvbmVudExvY2F0aW9uLmdldFkoKSArIGxvY2FsWTsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NEYXRhVHJhbnNmZXJlci5qYXZhIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NEYXRhVHJhbnNmZXJlci5qYXZhCmluZGV4IDczYTg4NzUuLjQyOWEzOTUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DRGF0YVRyYW5zZmVyZXIuamF2YQorKysgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0RhdGFUcmFuc2ZlcmVyLmphdmEKQEAgLTE0Nyw3ICsxNDcsOCBAQAogICAgICAgICAgICAgU3RyaW5nIHNlcGFyYXRvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgaWYoc3RyaW5ncy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nc1swXSk7CisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ0VtYmVkZGVkRnJhbWUuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DRW1iZWRkZWRGcmFtZS5qYXZhCmluZGV4IDExZjA1YjUuLmYyMThjOTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DRW1iZWRkZWRGcmFtZS5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DRW1iZWRkZWRGcmFtZS5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgIGludCB4ID0gKGludClwbHVnaW5YOwogICAgICAgICBpbnQgeSA9IChpbnQpcGx1Z2luWTsKIAotICAgICAgICByZXNwb25kZXIuaGFuZGxlU2Nyb2xsRXZlbnQoeCwgeSwgbW9kaWZpZXJGbGFncywgZGVsdGFYLCBkZWx0YVksIE5TRXZlbnQuU0NST0xMX1BIQVNFX1VOU1VQUE9SVEVEKTsKKyAgICAgICAgcmVzcG9uZGVyLmhhbmRsZVNjcm9sbEV2ZW50KHgsIHksIG1vZGlmaWVyRmxhZ3MsIGRlbHRhWCwgZGVsdGFZKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVLZXlFdmVudChpbnQgZXZlbnRUeXBlLCBpbnQgbW9kaWZpZXJGbGFncywgU3RyaW5nIGNoYXJhY3RlcnMsCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtUmVzcG9uZGVyLmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtUmVzcG9uZGVyLmphdmEKaW5kZXggMTVjMzc3Zi4uNTkxYzE2ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVJlc3BvbmRlci5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1SZXNwb25kZXIuamF2YQpAQCAtMzQsNyArMzQsNiBAQAogaW1wb3J0IGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQ7CiBpbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VXaGVlbEV2ZW50OwogaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIC8qKgogICogVHJhbnNsYXRlcyBOU0V2ZW50cy9OUENvY29hRXZlbnRzIGludG8gQVdUIGV2ZW50cy4KQEAgLTQ0LDggKzQzLDYgQEAKICAgICBwcml2YXRlIGZpbmFsIFBsYXRmb3JtRXZlbnROb3RpZmllciBldmVudE5vdGlmaWVyOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc05wYXBpQ2FsbGJhY2s7CiAgICAgcHJpdmF0ZSBpbnQgbGFzdEtleVByZXNzQ29kZSA9IEtleUV2ZW50LlZLX1VOREVGSU5FRDsKLSAgICBwcml2YXRlIGZpbmFsIERlbHRhQWNjdW11bGF0b3IgZGVsdGFBY2N1bXVsYXRvclggPSBuZXcgRGVsdGFBY2N1bXVsYXRvcigpOwotICAgIHByaXZhdGUgZmluYWwgRGVsdGFBY2N1bXVsYXRvciBkZWx0YUFjY3VtdWxhdG9yWSA9IG5ldyBEZWx0YUFjY3VtdWxhdG9yKCk7CiAKICAgICBDUGxhdGZvcm1SZXNwb25kZXIoZmluYWwgUGxhdGZvcm1FdmVudE5vdGlmaWVyIGV2ZW50Tm90aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNOcGFwaUNhbGxiYWNrKSB7CkBAIC05MiwzOCArODksMzcgQEAKICAgICAgKiBIYW5kbGVzIHNjcm9sbCBldmVudHMuCiAgICAgICovCiAgICAgdm9pZCBoYW5kbGVTY3JvbGxFdmVudChmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGludCBtb2RpZmllckZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZG91YmxlIGRlbHRhWCwgZmluYWwgZG91YmxlIGRlbHRhWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzY3JvbGxQaGFzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZG91YmxlIGRlbHRhWCwgZmluYWwgZG91YmxlIGRlbHRhWSkgewogICAgICAgICBmaW5hbCBpbnQgYnV0dG9uTnVtYmVyID0gQ29jb2FDb25zdGFudHMua0NHTW91c2VCdXR0b25DZW50ZXI7CiAgICAgICAgIGludCBqbW9kaWZpZXJzID0gTlNFdmVudC5uc1RvSmF2YU1vdXNlTW9kaWZpZXJzKGJ1dHRvbk51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJGbGFncyk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTaGlmdCA9IChqbW9kaWZpZXJzICYgSW5wdXRFdmVudC5TSElGVF9ET1dOX01BU0spICE9IDA7CiAKLSAgICAgICAgaW50IHJvdW5kRGVsdGFYID0gZGVsdGFBY2N1bXVsYXRvclguZ2V0Um91bmRlZERlbHRhKGRlbHRhWCwgc2Nyb2xsUGhhc2UpOwotICAgICAgICBpbnQgcm91bmREZWx0YVkgPSBkZWx0YUFjY3VtdWxhdG9yWS5nZXRSb3VuZGVkRGVsdGEoZGVsdGFZLCBzY3JvbGxQaGFzZSk7Ci0KICAgICAgICAgLy8gVmVydGljYWwgc2Nyb2xsLgotICAgICAgICBpZiAoIWlzU2hpZnQgJiYgKGRlbHRhWSAhPSAwLjAgfHwgcm91bmREZWx0YVkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoU2Nyb2xsRXZlbnQoeCwgeSwgam1vZGlmaWVycywgcm91bmREZWx0YVksIGRlbHRhWSk7CisgICAgICAgIGlmICghaXNTaGlmdCAmJiBkZWx0YVkgIT0gMC4wKSB7CisgICAgICAgICAgICBkaXNwYXRjaFNjcm9sbEV2ZW50KHgsIHksIGptb2RpZmllcnMsIGRlbHRhWSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gSG9yaXpvbnRhbCBzY3JvbGwgb3Igc2hpcnQrdmVydGljYWwgc2Nyb2xsLgogICAgICAgICBmaW5hbCBkb3VibGUgZGVsdGEgPSBpc1NoaWZ0ICYmIGRlbHRhWSAhPSAwLjAgPyBkZWx0YVkgOiBkZWx0YVg7Ci0gICAgICAgIGZpbmFsIGludCByb3VuZERlbHRhID0gaXNTaGlmdCAmJiByb3VuZERlbHRhWSAhPSAwID8gcm91bmREZWx0YVkgOiByb3VuZERlbHRhWDsKLSAgICAgICAgaWYgKGRlbHRhICE9IDAuMCB8fCByb3VuZERlbHRhICE9IDApIHsKKyAgICAgICAgaWYgKGRlbHRhICE9IDAuMCkgewogICAgICAgICAgICAgam1vZGlmaWVycyB8PSBJbnB1dEV2ZW50LlNISUZUX0RPV05fTUFTSzsKLSAgICAgICAgICAgIGRpc3BhdGNoU2Nyb2xsRXZlbnQoeCwgeSwgam1vZGlmaWVycywgcm91bmREZWx0YSwgZGVsdGEpOworICAgICAgICAgICAgZGlzcGF0Y2hTY3JvbGxFdmVudCh4LCB5LCBqbW9kaWZpZXJzLCBkZWx0YSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hTY3JvbGxFdmVudChmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vZGlmaWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcm91bmREZWx0YSwgZmluYWwgZG91YmxlIGRlbHRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1vZGlmaWVycywgZmluYWwgZG91YmxlIGRlbHRhKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgd2hlbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBmaW5hbCBpbnQgc2Nyb2xsVHlwZSA9IE1vdXNlV2hlZWxFdmVudC5XSEVFTF9VTklUX1NDUk9MTDsKICAgICAgICAgZmluYWwgaW50IHNjcm9sbEFtb3VudCA9IDE7CisgICAgICAgIGludCB3aGVlbFJvdGF0aW9uID0gKGludCkgZGVsdGE7CisgICAgICAgIGludCBzaWdudW0gPSAoaW50KSBNYXRoLnNpZ251bShkZWx0YSk7CisgICAgICAgIGlmIChzaWdudW0gKiBkZWx0YSA8IDEpIHsKKyAgICAgICAgICAgIHdoZWVsUm90YXRpb24gPSBzaWdudW07CisgICAgICAgIH0KICAgICAgICAgLy8gaW52ZXJ0IHRoZSB3aGVlbFJvdGF0aW9uIGZvciB0aGUgcGVlcgogICAgICAgICBldmVudE5vdGlmaWVyLm5vdGlmeU1vdXNlV2hlZWxFdmVudCh3aGVuLCB4LCB5LCBtb2RpZmllcnMsIHNjcm9sbFR5cGUsCi0gICAgICAgICAgICAgICAgc2Nyb2xsQW1vdW50LCAtcm91bmREZWx0YSwgLWRlbHRhLCBudWxsKTsKKyAgICAgICAgICAgICAgICBzY3JvbGxBbW91bnQsIC13aGVlbFJvdGF0aW9uLCAtZGVsdGEsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc1LDE2ICsxNzEsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgUGlueWluIFNpbXBsaWZpZWQgaW5wdXQgbWV0aG9kIGlzIHNlbGVjdGVkLCBDQVBTX0xPQ0sga2V5IGlzIHN1cHBvc2VkIHRvIHN3aXRjaAotICAgICAgICAgICAgLy8gaW5wdXQgdG8gbGF0aW4gbGV0dGVycy4KLSAgICAgICAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgdGVzdENoYXJJZ25vcmluZ01vZGlmaWVycyBpbnN0ZWFkIG9mIHRlc3RDaGFyIGZvciBldmVudAotICAgICAgICAgICAgLy8gZ2VuZXJhdGlvbiBpbiBzdWNoIGNhc2UgdG8gYXZvaWQgdXBwZXJjYXNlIGxldHRlcnMgaW4gdGV4dCBjb21wb25lbnRzLgotICAgICAgICAgICAgTFdDVG9vbGtpdCBsd2NUb29sa2l0ID0gKExXQ1Rvb2xraXQpVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpOwotICAgICAgICAgICAgaWYgKGx3Y1Rvb2xraXQuZ2V0TG9ja2luZ0tleVN0YXRlKEtleUV2ZW50LlZLX0NBUFNfTE9DSykgJiYKLSAgICAgICAgICAgICAgICAgICAgTG9jYWxlLlNJTVBMSUZJRURfQ0hJTkVTRS5lcXVhbHMobHdjVG9vbGtpdC5nZXREZWZhdWx0S2V5Ym9hcmRMb2NhbGUoKSkpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Q2hhciA9IHRlc3RDaGFySWdub3JpbmdNb2RpZmllcnM7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGprZXlDb2RlID0gb3V0WzBdOwogICAgICAgICAgICAgamtleUxvY2F0aW9uID0gb3V0WzFdOwogICAgICAgICAgICAgamV2ZW50VHlwZSA9IGlzTnBhcGlDYWxsYmFjayA/IE5TRXZlbnQubnBUb0phdmFFdmVudFR5cGUoZXZlbnRUeXBlKSA6CkBAIC0yNTksNDYgKzI0NSw0IEBACiAgICAgdm9pZCBoYW5kbGVXaW5kb3dGb2N1c0V2ZW50KGJvb2xlYW4gZ2FpbmVkLCBMV1dpbmRvd1BlZXIgb3Bwb3NpdGUpIHsKICAgICAgICAgZXZlbnROb3RpZmllci5ub3RpZnlBY3RpdmF0aW9uKGdhaW5lZCwgb3Bwb3NpdGUpOwogICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBEZWx0YUFjY3VtdWxhdG9yIHsKLQotICAgICAgICBzdGF0aWMgZmluYWwgZG91YmxlIE1JTl9USFJFU0hPTEQgPSAwLjE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgTUFYX1RIUkVTSE9MRCA9IDAuNTsKLSAgICAgICAgZG91YmxlIGFjY3VtdWxhdGVkRGVsdGE7Ci0KLSAgICAgICAgaW50IGdldFJvdW5kZWREZWx0YShkb3VibGUgZGVsdGEsIGludCBzY3JvbGxQaGFzZSkgewotCi0gICAgICAgICAgICBpbnQgcm91bmREZWx0YSA9IChpbnQpIE1hdGgucm91bmQoZGVsdGEpOwotCi0gICAgICAgICAgICBpZiAoc2Nyb2xsUGhhc2UgPT0gTlNFdmVudC5TQ1JPTExfUEhBU0VfVU5TVVBQT1JURUQpIHsgLy8gbW91c2Ugd2hlZWwKLSAgICAgICAgICAgICAgICBpZiAocm91bmREZWx0YSA9PSAwICYmIGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcm91bmREZWx0YSA9IGRlbHRhID4gMCA/IDEgOiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyB0cmFja3BhZAotICAgICAgICAgICAgICAgIGJvb2xlYW4gYmVnaW4gPSBzY3JvbGxQaGFzZSA9PSBOU0V2ZW50LlNDUk9MTF9QSEFTRV9CRUdBTjsKLSAgICAgICAgICAgICAgICBib29sZWFuIGVuZCA9IHNjcm9sbFBoYXNlID09IE5TRXZlbnQuU0NST0xMX01BU0tfUEhBU0VfRU5ERUQKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNjcm9sbFBoYXNlID09IE5TRXZlbnQuU0NST0xMX01BU0tfUEhBU0VfQ0FOQ0VMTEVEOwotCi0gICAgICAgICAgICAgICAgaWYgKGJlZ2luKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkRGVsdGEgKz0gZGVsdGE7Ci0KLSAgICAgICAgICAgICAgICBkb3VibGUgYWJzQWNjdW11bGF0ZWREZWx0YSA9IE1hdGguYWJzKGFjY3VtdWxhdGVkRGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChhYnNBY2N1bXVsYXRlZERlbHRhID4gTUFYX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgICAgICByb3VuZERlbHRhID0gKGludCkgTWF0aC5yb3VuZChhY2N1bXVsYXRlZERlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWREZWx0YSAtPSByb3VuZERlbHRhOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvdW5kRGVsdGEgPT0gMCAmJiBhYnNBY2N1bXVsYXRlZERlbHRhID4gTUlOX1RIUkVTSE9MRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcm91bmREZWx0YSA9IGFjY3VtdWxhdGVkRGVsdGEgPiAwID8gMSA6IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcm91bmREZWx0YTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1WaWV3LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtVmlldy5qYXZhCmluZGV4IDlkMWFjYWYuLjNjMmNkMjMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1WaWV3LmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVZpZXcuamF2YQpAQCAtMTkyLDggKzE5Miw3IEBACiAKICAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBDb2NvYUNvbnN0YW50cy5OU1Njcm9sbFdoZWVsKSB7CiAgICAgICAgICAgICByZXNwb25kZXIuaGFuZGxlU2Nyb2xsRXZlbnQoeCwgeSwgZXZlbnQuZ2V0TW9kaWZpZXJGbGFncygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFNjcm9sbERlbHRhWCgpLCBldmVudC5nZXRTY3JvbGxEZWx0YVkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRTY3JvbGxQaGFzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRTY3JvbGxEZWx0YVgoKSwgZXZlbnQuZ2V0U2Nyb2xsRGVsdGFZKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzcG9uZGVyLmhhbmRsZU1vdXNlRXZlbnQoZXZlbnQuZ2V0VHlwZSgpLCBldmVudC5nZXRNb2RpZmllckZsYWdzKCksIGV2ZW50LmdldEJ1dHRvbk51bWJlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0Q2xpY2tDb3VudCgpLCB4LCB5LCBldmVudC5nZXRBYnNYKCksIGV2ZW50LmdldEFic1koKSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtV2luZG93LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtV2luZG93LmphdmEKaW5kZXggYTk3MzEwYS4uZTQ0OTIyNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVdpbmRvdy5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1XaW5kb3cuamF2YQpAQCAtNjEsNyArNjEsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldE5TV2luZG93UmVwcmVzZW50ZWRGaWxlbmFtZShsb25nIG5zV2luZG93UHRyLCBTdHJpbmcgcmVwcmVzZW50ZWRGaWxlbmFtZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU2V0RW5hYmxlZChsb25nIG5zV2luZG93UHRyLCBib29sZWFuIGlzRW5hYmxlZCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlU3ludGhlc2l6ZU1vdXNlRW50ZXJlZEV4aXRlZEV2ZW50cygpOwotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHMobG9uZyBuc1dpbmRvd1B0ciwgaW50IGV2ZW50VHlwZSk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGlzcG9zZShsb25nIG5zV2luZG93UHRyKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQ1BsYXRmb3JtV2luZG93IG5hdGl2ZUdldFRvcG1vc3RQbGF0Zm9ybVdpbmRvd1VuZGVyTW91c2UoKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVFbnRlckZ1bGxTY3JlZW5Nb2RlKGxvbmcgbnNXaW5kb3dQdHIpOwpAQCAtNDI4LDYgKzQyNyw5IEBACiAKICAgICBAT3ZlcnJpZGUgLy8gUGxhdGZvcm1XaW5kb3cKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZiAob3duZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cucmVtb3ZlQ2hpbGRXaW5kb3cob3duZXIuZ2V0TlNXaW5kb3dQdHIoKSwgZ2V0TlNXaW5kb3dQdHIoKSk7CisgICAgICAgIH0KICAgICAgICAgY29udGVudFZpZXcuZGlzcG9zZSgpOwogICAgICAgICBuYXRpdmVEaXNwb3NlKGdldE5TV2luZG93UHRyKCkpOwogICAgICAgICBDUGxhdGZvcm1XaW5kb3cuc3VwZXIuZGlzcG9zZSgpOwpAQCAtNTI0LDYgKzUyNiwyNSBAQAogICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgbnNXaW5kb3dQdHIgPSBnZXROU1dpbmRvd1B0cigpOwogCisgICAgICAgIC8vIFByb2Nlc3MgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCB3aGVuIGhpZGluZworICAgICAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgICAgIC8vIFVucGFyZW50IG15IGNoaWxkcmVuCisgICAgICAgICAgICBmb3IgKFdpbmRvdyB3IDogdGFyZ2V0LmdldE93bmVkV2luZG93cygpKSB7CisgICAgICAgICAgICAgICAgV2luZG93UGVlciBwID0gKFdpbmRvd1BlZXIpdy5nZXRQZWVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBMV1dpbmRvd1BlZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1BsYXRmb3JtV2luZG93IHB3ID0gKENQbGF0Zm9ybVdpbmRvdykoKExXV2luZG93UGVlcilwKS5nZXRQbGF0Zm9ybVdpbmRvdygpOworICAgICAgICAgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCAmJiBwdy5pc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cucmVtb3ZlQ2hpbGRXaW5kb3cobnNXaW5kb3dQdHIsIHB3LmdldE5TV2luZG93UHRyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbnBhcmVudCBteXNlbGYKKyAgICAgICAgICAgIGlmIChvd25lciAhPSBudWxsICYmIG93bmVyLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cucmVtb3ZlQ2hpbGRXaW5kb3cob3duZXIuZ2V0TlNXaW5kb3dQdHIoKSwgbnNXaW5kb3dQdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gQ29uZmlndXJlIHN0dWZmCiAgICAgICAgIHVwZGF0ZUljb25JbWFnZXMoKTsKICAgICAgICAgdXBkYXRlRm9jdXNhYmlsaXR5Rm9yQXV0b1JlcXVlc3RGb2N1cyhmYWxzZSk7CkBAIC01OTcsMTkgKzYxOCwxOSBAQAogCiAgICAgICAgIC8vIE1hbmFnZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIHdoZW4gc2hvd2luZwogICAgICAgICBpZiAodmlzaWJsZSkgewotICAgICAgICAgICAgLy8gT3JkZXIgbXlzZWxmIGFib3ZlIG15IHBhcmVudAorICAgICAgICAgICAgLy8gQWRkIG15c2VsZiBhcyBhIGNoaWxkCiAgICAgICAgICAgICBpZiAob3duZXIgIT0gbnVsbCAmJiBvd25lci5pc1Zpc2libGUoKSkgewotICAgICAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93Lm9yZGVyV2luZG93KG5zV2luZG93UHRyLCBDV3JhcHBlci5OU1dpbmRvdy5OU1dpbmRvd0Fib3ZlLCBvd25lci5nZXROU1dpbmRvd1B0cigpKTsKKyAgICAgICAgICAgICAgICBDV3JhcHBlci5OU1dpbmRvdy5hZGRDaGlsZFdpbmRvdyhvd25lci5nZXROU1dpbmRvd1B0cigpLCBuc1dpbmRvd1B0ciwgQ1dyYXBwZXIuTlNXaW5kb3cuTlNXaW5kb3dBYm92ZSk7CiAgICAgICAgICAgICAgICAgYXBwbHlXaW5kb3dMZXZlbCh0YXJnZXQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBPcmRlciBteSBvd24gY2hpbGRyZW4gYWJvdmUgbXlzZWxmCisgICAgICAgICAgICAvLyBBZGQgbXkgb3duIGNoaWxkcmVuIHRvIG15c2VsZgogICAgICAgICAgICAgZm9yIChXaW5kb3cgdyA6IHRhcmdldC5nZXRPd25lZFdpbmRvd3MoKSkgewogICAgICAgICAgICAgICAgIFdpbmRvd1BlZXIgcCA9IChXaW5kb3dQZWVyKXcuZ2V0UGVlcigpOwogICAgICAgICAgICAgICAgIGlmIChwIGluc3RhbmNlb2YgTFdXaW5kb3dQZWVyKSB7CiAgICAgICAgICAgICAgICAgICAgIENQbGF0Zm9ybVdpbmRvdyBwdyA9IChDUGxhdGZvcm1XaW5kb3cpKChMV1dpbmRvd1BlZXIpcCkuZ2V0UGxhdGZvcm1XaW5kb3coKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHB3ICE9IG51bGwgJiYgcHcuaXNWaXNpYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93Lm9yZGVyV2luZG93KHB3LmdldE5TV2luZG93UHRyKCksIENXcmFwcGVyLk5TV2luZG93Lk5TV2luZG93QWJvdmUsIG5zV2luZG93UHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93LmFkZENoaWxkV2luZG93KG5zV2luZG93UHRyLCBwdy5nZXROU1dpbmRvd1B0cigpLCBDV3JhcHBlci5OU1dpbmRvdy5OU1dpbmRvd0Fib3ZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LmFwcGx5V2luZG93TGV2ZWwodyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC04MjcsMTMgKzg0OCw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoYmxvY2tlZCkgewotICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIHNob3cgYSBtb2RhbCB3aW5kb3cuIFByZXZpb3VzbHkgZGlzcGxheWVkIHdpbmRvdyB3aWxsIGJlCi0gICAgICAgICAgICAvLyBibG9ja2VkL2Rpc2FibGVkLiBTbyB3ZSBoYXZlIHRvIHNlbmQgbW91c2UgZXhpdGVkIGV2ZW50IHRvIGl0IG5vdywgc2luY2UKLSAgICAgICAgICAgIC8vIGFsbCBtb3VzZSBldmVudHMgYXJlIGRpc2NhcmRlZCBmb3IgYmxvY2tlZC9kaXNhYmxlZCB3aW5kb3dzLgotICAgICAgICAgICAgbmF0aXZlU3ludGhlc2l6ZU1vdXNlRW50ZXJlZEV4aXRlZEV2ZW50cyhnZXROU1dpbmRvd1B0cigpLCBDb2NvYUNvbnN0YW50cy5OU01vdXNlRXhpdGVkKTsKLSAgICAgICAgfQotCiAgICAgICAgIG5hdGl2ZVNldEVuYWJsZWQoZ2V0TlNXaW5kb3dQdHIoKSwgIWJsb2NrZWQpOwogICAgICAgICBjaGVja0Jsb2NraW5nQW5kT3JkZXIoKTsKICAgICB9CkBAIC0xMDQ1LDggKzEwNTksOCBAQAogICAgICAgICAgICAgLy8gT3JkZXIgdGhlIHdpbmRvdyB0byBmcm9udCBvZiB0aGUgc3RhY2sgb2YgY2hpbGQgd2luZG93cwogICAgICAgICAgICAgZmluYWwgbG9uZyBuc1dpbmRvd1NlbGZQdHIgPSBnZXROU1dpbmRvd1B0cigpOwogICAgICAgICAgICAgZmluYWwgbG9uZyBuc1dpbmRvd093bmVyUHRyID0gb3duZXIuZ2V0TlNXaW5kb3dQdHIoKTsKLSAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93Lm9yZGVyRnJvbnQobnNXaW5kb3dPd25lclB0cik7Ci0gICAgICAgICAgICBDV3JhcHBlci5OU1dpbmRvdy5vcmRlcldpbmRvdyhuc1dpbmRvd1NlbGZQdHIsIENXcmFwcGVyLk5TV2luZG93Lk5TV2luZG93QWJvdmUsIG5zV2luZG93T3duZXJQdHIpOworICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cucmVtb3ZlQ2hpbGRXaW5kb3cobnNXaW5kb3dPd25lclB0ciwgbnNXaW5kb3dTZWxmUHRyKTsKKyAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93LmFkZENoaWxkV2luZG93KG5zV2luZG93T3duZXJQdHIsIG5zV2luZG93U2VsZlB0ciwgQ1dyYXBwZXIuTlNXaW5kb3cuTlNXaW5kb3dBYm92ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBhcHBseVdpbmRvd0xldmVsKHRhcmdldCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1ByaW50ZXJKb2IuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUHJpbnRlckpvYi5qYXZhCmluZGV4IDBhNmJjMjMuLjRkZTRkNTcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUHJpbnRlckpvYi5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUHJpbnRlckpvYi5qYXZhCkBAIC0xNzcsNiArMTc3LDEyIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICAvLyBTZWUgaWYgdGhpcyBoYXMgYW4gTlNQcmludEluZm8gaW4gaXQuCisgICAgICAgIE5TUHJpbnRJbmZvIG5zUHJpbnRJbmZvID0gKE5TUHJpbnRJbmZvKWF0dHJpYnV0ZXMuZ2V0KE5TUHJpbnRJbmZvLmNsYXNzKTsKKyAgICAgICAgaWYgKG5zUHJpbnRJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZOU1ByaW50SW5mbyA9IG5zUHJpbnRJbmZvLmdldFZhbHVlKCk7CisgICAgICAgIH0KKwogICAgICAgICBQYWdlUmFuZ2VzIHBhZ2VSYW5nZXNBdHRyID0gIChQYWdlUmFuZ2VzKWF0dHJpYnV0ZXMuZ2V0KFBhZ2VSYW5nZXMuY2xhc3MpOwogICAgICAgICBpZiAoaXNTdXBwb3J0ZWRWYWx1ZShwYWdlUmFuZ2VzQXR0ciwgYXR0cmlidXRlcykpIHsKICAgICAgICAgICAgIFN1blBhZ2VTZWxlY3Rpb24gcmFuZ2VTZWxlY3QgPSAoU3VuUGFnZVNlbGVjdGlvbilhdHRyaWJ1dGVzLmdldChTdW5QYWdlU2VsZWN0aW9uLmNsYXNzKTsKQEAgLTUyOSwxMSArNTM1LDggQEAKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKGZOU1ByaW50SW5mb0xvY2spIHsKLSAgICAgICAgICAgIGlmIChmTlNQcmludEluZm8gIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBkaXNwb3NlKGZOU1ByaW50SW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmTlNQcmludEluZm8gPSAtMTsKKyAgICAgICAgaWYgKGZOU1ByaW50SW5mbyAhPSAtMSkgeworICAgICAgICAgICAgZGlzcG9zZShmTlNQcmludEluZm8pOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1dhcm5pbmdXaW5kb3cuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DV2FybmluZ1dpbmRvdy5qYXZhCmluZGV4IDU5NjJiN2YuLjgwMGQ3NmYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DV2FybmluZ1dpbmRvdy5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DV2FybmluZ1dpbmRvdy5qYXZhCkBAIC0yMjEsNiArMjIxLDE1IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewogICAgICAgICAgICAgZmluYWwgbG9uZyBuc1dpbmRvd1B0ciA9IGdldE5TV2luZG93UHRyKCk7CiAKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCB3aGVuIGhpZGluZworICAgICAgICAgICAgaWYgKCF2aXNpYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gVW5wYXJlbnQgbXlzZWxmCisgICAgICAgICAgICAgICAgaWYgKG93bmVyICE9IG51bGwgJiYgb3duZXIuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cucmVtb3ZlQ2hpbGRXaW5kb3coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIuZ2V0TlNXaW5kb3dQdHIoKSwgbnNXaW5kb3dQdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gQWN0dWFsbHkgc2hvdyBvciBoaWRlIHRoZSB3aW5kb3cKICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgICAgICAgICAgQ1dyYXBwZXIuTlNXaW5kb3cub3JkZXJGcm9udChuc1dpbmRvd1B0cik7CkBAIC0yMzIsMTAgKzI0MSwxMCBAQAogCiAgICAgICAgICAgICAvLyBNYW5hZ2UgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCB3aGVuIHNob3dpbmcKICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3JkZXIgbXlzZWxmIGFib3ZlIG15IHBhcmVudAorICAgICAgICAgICAgICAgIC8vIEFkZCBteXNlbGYgYXMgYSBjaGlsZAogICAgICAgICAgICAgICAgIGlmIChvd25lciAhPSBudWxsICYmIG93bmVyLmlzVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93Lm9yZGVyV2luZG93KG5zV2luZG93UHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXcmFwcGVyLk5TV2luZG93Lk5TV2luZG93QWJvdmUsIG93bmVyLmdldE5TV2luZG93UHRyKCkpOworICAgICAgICAgICAgICAgICAgICBDV3JhcHBlci5OU1dpbmRvdy5hZGRDaGlsZFdpbmRvdyhvd25lci5nZXROU1dpbmRvd1B0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zV2luZG93UHRyLCBDV3JhcHBlci5OU1dpbmRvdy5OU1dpbmRvd0Fib3ZlKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgc2VjdXJpdHkgd2FybmluZyB0byBiZSBvYnNjdXJlZCBieSBvdGhlciB3aW5kb3dzCiAgICAgICAgICAgICAgICAgICAgIGFwcGx5V2luZG93TGV2ZWwob3duZXJXaW5kb3cpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L05TRXZlbnQuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9OU0V2ZW50LmphdmEKaW5kZXggZWNjYzI1Ny4uZDMwYTM5YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L05TRXZlbnQuamF2YQorKysgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvTlNFdmVudC5qYXZhCkBAIC0zMiwxMyArMzIsNiBAQAogICogSkRLIGZ1bmN0aW9uYWxpdHkuCiAgKi8KIGZpbmFsIGNsYXNzIE5TRXZlbnQgewotCi0gICAgc3RhdGljIGZpbmFsIGludCBTQ1JPTExfUEhBU0VfVU5TVVBQT1JURUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX1BIQVNFX0JFR0FOID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9QSEFTRV9DT05USU5VRUQgPSAzOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgU0NST0xMX01BU0tfUEhBU0VfQ0FOQ0VMTEVEID0gNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IFNDUk9MTF9NQVNLX1BIQVNFX0VOREVEID0gNTsKLQogICAgIHByaXZhdGUgaW50IHR5cGU7CiAgICAgcHJpdmF0ZSBpbnQgbW9kaWZpZXJGbGFnczsKIApAQCAtNDksNyArNDIsNiBAQAogICAgIHByaXZhdGUgaW50IHk7CiAgICAgcHJpdmF0ZSBkb3VibGUgc2Nyb2xsRGVsdGFZOwogICAgIHByaXZhdGUgZG91YmxlIHNjcm9sbERlbHRhWDsKLSAgICBwcml2YXRlIGludCBzY3JvbGxQaGFzZTsKICAgICBwcml2YXRlIGludCBhYnNYOwogICAgIHByaXZhdGUgaW50IGFic1k7CiAKQEAgLTcwLDcgKzYyLDcgQEAKICAgICAvLyBDYWxsZWQgZnJvbSBuYXRpdmUKICAgICBOU0V2ZW50KGludCB0eXBlLCBpbnQgbW9kaWZpZXJGbGFncywgaW50IGNsaWNrQ291bnQsIGludCBidXR0b25OdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgYWJzWCwgaW50IGFic1ksCi0gICAgICAgICAgICAgICAgICAgZG91YmxlIHNjcm9sbERlbHRhWSwgZG91YmxlIHNjcm9sbERlbHRhWCwgaW50IHNjcm9sbFBoYXNlKSB7CisgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjcm9sbERlbHRhWSwgZG91YmxlIHNjcm9sbERlbHRhWCkgewogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB0aGlzLm1vZGlmaWVyRmxhZ3MgPSBtb2RpZmllckZsYWdzOwogICAgICAgICB0aGlzLmNsaWNrQ291bnQgPSBjbGlja0NvdW50OwpAQCAtODEsNyArNzMsNiBAQAogICAgICAgICB0aGlzLmFic1kgPSBhYnNZOwogICAgICAgICB0aGlzLnNjcm9sbERlbHRhWSA9IHNjcm9sbERlbHRhWTsKICAgICAgICAgdGhpcy5zY3JvbGxEZWx0YVggPSBzY3JvbGxEZWx0YVg7Ci0gICAgICAgIHRoaXMuc2Nyb2xsUGhhc2UgPSBzY3JvbGxQaGFzZTsKICAgICB9CiAKICAgICBpbnQgZ2V0VHlwZSgpIHsKQEAgLTExNiwxMCArMTA3LDYgQEAKICAgICAgICAgcmV0dXJuIHNjcm9sbERlbHRhWDsKICAgICB9CiAKLSAgICBpbnQgZ2V0U2Nyb2xsUGhhc2UoKSB7Ci0gICAgICAgIHJldHVybiBzY3JvbGxQaGFzZTsKLSAgICB9Ci0KICAgICBpbnQgZ2V0QWJzWCgpIHsKICAgICAgICAgcmV0dXJuIGFic1g7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L05TUHJpbnRJbmZvLmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvTlNQcmludEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njk4ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L05TUHJpbnRJbmZvLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4ubHdhd3QubWFjb3N4OworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXgucHJpbnQuYXR0cmlidXRlLio7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBOU1ByaW50SW5mbyBpbXBsZW1lbnRzIFByaW50Sm9iQXR0cmlidXRlLCBQcmludFJlcXVlc3RBdHRyaWJ1dGUsIFNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlIHsKKworICAgIHByaXZhdGUgbG9uZyBmTlNQcmludEluZm87CisKKyAgICBwdWJsaWMgTlNQcmludEluZm8obG9uZyBuc1ByaW50SW5mbykgeworICAgICAgICBmTlNQcmludEluZm8gPSBuc1ByaW50SW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZOU1ByaW50SW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIE5TUHJpbnRJbmZvICYmIGZOU1ByaW50SW5mbyA9PSAoKE5TUHJpbnRJbmZvKW9iamVjdCkuZk5TUHJpbnRJbmZvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gKGludClmTlNQcmludEluZm87CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICIiICsgZk5TUHJpbnRJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXR0cmlidXRlPiBnZXRDYXRlZ29yeSgpIHsKKyAgICAgICAgcmV0dXJuIE5TUHJpbnRJbmZvLmNsYXNzOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJuc1ByaW50SW5mbyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUVmlldy5oIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUVmlldy5oCmluZGV4IDFiYTA2ZmUuLjU5MjIzNWIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFZpZXcuaAorKysgYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RWaWV3LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02Myw4ICs2Myw2IEBACiAtICh2b2lkKSBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IChOU0V2ZW50ICopIGV2ZW50OwogLSAoam9iamVjdCkgYXd0Q29tcG9uZW50OihKTklFbnYgKillbnY7CiAKLSsgKEFXVFZpZXcgKikgYXd0VmlldzooSk5JRW52ICopZW52IG9mQWNjZXNzaWJsZTooam9iamVjdClqYWNjZXNzaWJsZTsKLQogLy8gSW5wdXQgbWV0aG9kLXJlbGF0ZWQgZXZlbnRzCiAtICh2b2lkKXNldElucHV0TWV0aG9kOihqb2JqZWN0KWlucHV0TWV0aG9kOwogLSAodm9pZClhYmFuZG9uSW5wdXQ7CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RWaWV3Lm0gYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RWaWV3Lm0KaW5kZXggMDgwODU4MC4uNjZhZDUxNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUVmlldy5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFZpZXcubQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1LDcgKzM1LDYgQEAKICNpbXBvcnQgIkxXQ1Rvb2xraXQuaCIKICNpbXBvcnQgIkphdmFDb21wb25lbnRBY2Nlc3NpYmlsaXR5LmgiCiAjaW1wb3J0ICJKYXZhVGV4dEFjY2Vzc2liaWxpdHkuaCIKLSNpbXBvcnQgIkphdmFBY2Nlc3NpYmlsaXR5VXRpbGl0aWVzLmgiCiAjaW1wb3J0ICJHZW9tVXRpbGl0aWVzLmgiCiAjaW1wb3J0ICJPU1ZlcnNpb24uaCIKICNpbXBvcnQgIkNHTExheWVyLmgiCkBAIC0xMzMsNyArMTMyLDcgQEAKICAgICBzZWxmLmNnbExheWVyID0gbmlsOwogCiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudlVuY2FjaGVkXTsKLSAgICAoKmVudiktPkRlbGV0ZVdlYWtHbG9iYWxSZWYoZW52LCBtX2NQbGF0Zm9ybVZpZXcpOworICAgICgqZW52KS0+RGVsZXRlR2xvYmFsUmVmKGVudiwgbV9jUGxhdGZvcm1WaWV3KTsKICAgICBtX2NQbGF0Zm9ybVZpZXcgPSBOVUxMOwogCiAgICAgaWYgKGZJbnB1dE1ldGhvZExPQ0tBQkxFICE9IE5VTEwpCkBAIC0zODYsNyArMzg1LDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgSk5GX0NMQVNTX0NBQ0hFKGpjX05TRXZlbnQsICJzdW4vbHdhd3QvbWFjb3N4L05TRXZlbnQiKTsKLSAgICBzdGF0aWMgSk5GX0NUT1JfQ0FDSEUoamN0b3JfTlNFdmVudCwgamNfTlNFdmVudCwgIihJSUlJSUlJSURESSlWIik7CisgICAgc3RhdGljIEpORl9DVE9SX0NBQ0hFKGpjdG9yX05TRXZlbnQsIGpjX05TRXZlbnQsICIoSUlJSUlJSUlERClWIik7CiAgICAgam9iamVjdCBqRXZlbnQgPSBKTkZOZXdPYmplY3QoZW52LCBqY3Rvcl9OU0V2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudCB0eXBlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXZlbnQgbW9kaWZpZXJGbGFnc10sCkBAIC0zOTUsOCArMzk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamludClsb2NhbFBvaW50LngsIChqaW50KWxvY2FsUG9pbnQueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamludClhYnNQLngsIChqaW50KWFic1AueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXZlbnQgZGVsdGFZXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXZlbnQgZGVsdGFYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQVdUVG9vbGtpdCBzY3JvbGxTdGF0ZVdpdGhFdmVudDogZXZlbnRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXZlbnQgZGVsdGFYXSk7CiAgICAgaWYgKGpFdmVudCA9PSBuaWwpIHsKICAgICAgICAgLy8gVW5hYmxlIHRvIGNyZWF0ZSBldmVudCBieSBzb21lIHJlYXNvbi4KICAgICAgICAgcmV0dXJuOwpAQCAtNDA0LDEyICs0MDIsNyBAQAogCiAgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19QbGF0Zm9ybVZpZXcsICJzdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVZpZXciKTsKICAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kZWxpdmVyTW91c2VFdmVudCwgamNfUGxhdGZvcm1WaWV3LCAiZGVsaXZlck1vdXNlRXZlbnQiLCAiKExzdW4vbHdhd3QvbWFjb3N4L05TRXZlbnQ7KVYiKTsKLQotICAgIGpvYmplY3QgamxvY2FsID0gKCplbnYpLT5OZXdMb2NhbFJlZihlbnYsIG1fY1BsYXRmb3JtVmlldyk7Ci0gICAgaWYgKCEoKmVudiktPklzU2FtZU9iamVjdChlbnYsIGpsb2NhbCwgTlVMTCkpIHsKLSAgICAgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBqbG9jYWwsIGptX2RlbGl2ZXJNb3VzZUV2ZW50LCBqRXZlbnQpOwotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamxvY2FsKTsKLSAgICB9CisgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBtX2NQbGF0Zm9ybVZpZXcsIGptX2RlbGl2ZXJNb3VzZUV2ZW50LCBqRXZlbnQpOwogfQogCiAtICh2b2lkKSByZXNldFRyYWNraW5nQXJlYSB7CkBAIC00NzAsMTIgKzQ2Myw3IEBACiAgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19QbGF0Zm9ybVZpZXcsICJzdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVZpZXciKTsKICAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kZWxpdmVyS2V5RXZlbnQsIGpjX1BsYXRmb3JtVmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsaXZlcktleUV2ZW50IiwgIihMc3VuL2x3YXd0L21hY29zeC9OU0V2ZW50OylWIik7Ci0KLSAgICBqb2JqZWN0IGpsb2NhbCA9ICgqZW52KS0+TmV3TG9jYWxSZWYoZW52LCBtX2NQbGF0Zm9ybVZpZXcpOwotICAgIGlmICghKCplbnYpLT5Jc1NhbWVPYmplY3QoZW52LCBqbG9jYWwsIE5VTEwpKSB7Ci0gICAgICAgIEpORkNhbGxWb2lkTWV0aG9kKGVudiwgamxvY2FsLCBqbV9kZWxpdmVyS2V5RXZlbnQsIGpldmVudCk7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqbG9jYWwpOwotICAgIH0KKyAgICBKTkZDYWxsVm9pZE1ldGhvZChlbnYsIG1fY1BsYXRmb3JtVmlldywgam1fZGVsaXZlcktleUV2ZW50LCBqZXZlbnQpOwogCiAgICAgaWYgKGNoYXJhY3RlcnMgIT0gTlVMTCkgewogICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgY2hhcmFjdGVycyk7CkBAIC00OTAsMTIgKzQ3OCw3IEBACiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19QbGF0Zm9ybVZpZXcsICJzdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVZpZXciKTsKICAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kZWxpdmVyUmVzaXplLCBqY19QbGF0Zm9ybVZpZXcsICJkZWxpdmVyUmVzaXplIiwgIihJSUlJKVYiKTsKLQotICAgIGpvYmplY3QgamxvY2FsID0gKCplbnYpLT5OZXdMb2NhbFJlZihlbnYsIG1fY1BsYXRmb3JtVmlldyk7Ci0gICAgaWYgKCEoKmVudiktPklzU2FtZU9iamVjdChlbnYsIGpsb2NhbCwgTlVMTCkpIHsKLSAgICAgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBqbG9jYWwsIGptX2RlbGl2ZXJSZXNpemUsIHgseSx3LGgpOwotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamxvY2FsKTsKLSAgICB9CisgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBtX2NQbGF0Zm9ybVZpZXcsIGptX2RlbGl2ZXJSZXNpemUsIHgseSx3LGgpOwogfQogCiAKQEAgLTUyNCwxMiArNTA3LDcgQEAKICovCiAgICAgICAgIHN0YXRpYyBKTkZfQ0xBU1NfQ0FDSEUoamNfQ1BsYXRmb3JtVmlldywgInN1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtVmlldyIpOwogICAgICAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kZWxpdmVyV2luZG93RGlkRXhwb3NlRXZlbnQsIGpjX0NQbGF0Zm9ybVZpZXcsICJkZWxpdmVyV2luZG93RGlkRXhwb3NlRXZlbnQiLCAiKClWIik7Ci0KLSAgICAgICAgam9iamVjdCBqbG9jYWwgPSAoKmVudiktPk5ld0xvY2FsUmVmKGVudiwgbV9jUGxhdGZvcm1WaWV3KTsKLSAgICAgICAgaWYgKCEoKmVudiktPklzU2FtZU9iamVjdChlbnYsIGpsb2NhbCwgTlVMTCkpIHsKLSAgICAgICAgICAgIEpORkNhbGxWb2lkTWV0aG9kKGVudiwgamxvY2FsLCBqbV9kZWxpdmVyV2luZG93RGlkRXhwb3NlRXZlbnQpOwotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpsb2NhbCk7Ci0gICAgICAgIH0KKyAgICAgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBtX2NQbGF0Zm9ybVZpZXcsIGptX2RlbGl2ZXJXaW5kb3dEaWRFeHBvc2VFdmVudCk7CiAvKgogICAgICAgICB9CiAqLwpAQCAtNTM3LDEwICs1MTUsOCBAQAogfQogCiAtKEJPT0wpIGlzQ29kZVBvaW50SW5Vbmljb2RlQmxvY2tOZWVkaW5nSU1FdmVudDogKHVuaWNoYXIpIGNvZGVQb2ludCB7Ci0gICAgaWYgKCgoY29kZVBvaW50ID49IDB4MzAwMCkgJiYgKGNvZGVQb2ludCA8PSAweDMwM0YpKSB8fAotICAgICAgICAoKGNvZGVQb2ludCA+PSAweEZGMDApICYmIChjb2RlUG9pbnQgPD0gMHhGRkVGKSkpIHsKLSAgICAgICAgLy8gQ29kZSBwb2ludCBpcyBpbiAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJyBvcgotICAgICAgICAvLyAnSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMnIFVuaWNvZGUgYmxvY2suCisgICAgaWYgKChjb2RlUG9pbnQgPj0gMHgzMDAwKSAmJiAoY29kZVBvaW50IDw9IDB4MzAzRikpIHsKKyAgICAgICAgLy8gQ29kZSBwb2ludCBpcyBpbiAnQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uJyBVbmljb2RlIGJsb2NrLgogICAgICAgICByZXR1cm4gWUVTOwogICAgIH0KICAgICByZXR1cm4gTk87CkBAIC01NTksMTMgKzUzNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCi0gICAgam9iamVjdCBwZWVyID0gTlVMTDsKLSAgICBqb2JqZWN0IGpsb2NhbCA9ICgqZW52KS0+TmV3TG9jYWxSZWYoZW52LCBtX2NQbGF0Zm9ybVZpZXcpOwotICAgIGlmICghKCplbnYpLT5Jc1NhbWVPYmplY3QoZW52LCBqbG9jYWwsIE5VTEwpKSB7Ci0gICAgICAgIHBlZXIgPSBKTkZHZXRPYmplY3RGaWVsZChlbnYsIGpsb2NhbCwgamZfUGVlcik7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqbG9jYWwpOwotICAgIH0KKyAgICBqb2JqZWN0IHBlZXIgPSBKTkZHZXRPYmplY3RGaWVsZChlbnYsIG1fY1BsYXRmb3JtVmlldywgamZfUGVlcik7CiAgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19MV1dpbmRvd1BlZXIsICJzdW4vbHdhd3QvTFdXaW5kb3dQZWVyIik7CiAgICAgc3RhdGljIEpORl9NRU1CRVJfQ0FDSEUoamZfVGFyZ2V0LCBqY19MV1dpbmRvd1BlZXIsICJ0YXJnZXQiLCAiTGphdmEvYXd0L0NvbXBvbmVudDsiKTsKICAgICBpZiAocGVlciA9PSBOVUxMKSB7CkBAIC01NzMsMjcgKzU0MywxMiBAQAogICAgICAgICBKTkZEdW1wSmF2YVN0YWNrKGVudik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBqb2JqZWN0IGNvbXAgPSBKTkZHZXRPYmplY3RGaWVsZChlbnYsIHBlZXIsIGpmX1RhcmdldCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHBlZXIpOwotICAgIHJldHVybiBjb21wOwotfQotCi0rIChBV1RWaWV3ICopIGF3dFZpZXc6KEpOSUVudiopZW52IG9mQWNjZXNzaWJsZTooam9iamVjdClqYWNjZXNzaWJsZQotewotICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9nZXRBV1RWaWV3LCBzamNfQ0FjY2Vzc2liaWxpdHksICJnZXRBV1RWaWV3IiwgIihMamF2YXgvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlOylKIik7Ci0KLSAgICBqbG9uZyBqcHRyID0gSk5GQ2FsbFN0YXRpY0xvbmdNZXRob2QoZW52LCBqbV9nZXRBV1RWaWV3LCBqYWNjZXNzaWJsZSk7Ci0gICAgaWYgKGpwdHIgPT0gMCkgcmV0dXJuIG5pbDsKLQotICAgIHJldHVybiAoQVdUVmlldyAqKWpsb25nX3RvX3B0cihqcHRyKTsKKyAgICByZXR1cm4gSk5GR2V0T2JqZWN0RmllbGQoZW52LCBwZWVyLCBqZl9UYXJnZXQpOwogfQogCiAtIChpZClnZXRBeERhdGE6KEpOSUVudiopZW52CiB7Ci0gICAgam9iamVjdCBqY29tcG9uZW50ID0gW3NlbGYgYXd0Q29tcG9uZW50OmVudl07Ci0gICAgaWQgYXggPSBbW1tKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBhbGxvY10gaW5pdFdpdGhQYXJlbnQ6c2VsZiB3aXRoRW52OmVudiB3aXRoQWNjZXNzaWJsZTpqY29tcG9uZW50IHdpdGhJbmRleDotMSB3aXRoVmlldzpzZWxmIHdpdGhKYXZhUm9sZTpuaWxdIGF1dG9yZWxlYXNlXTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamNvbXBvbmVudCk7Ci0gICAgcmV0dXJuIGF4OworICAgIHJldHVybiBbW1tKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBhbGxvY10gaW5pdFdpdGhQYXJlbnQ6c2VsZiB3aXRoRW52OmVudiB3aXRoQWNjZXNzaWJsZTpbc2VsZiBhd3RDb21wb25lbnQ6ZW52XSB3aXRoSW5kZXg6LTEgd2l0aFZpZXc6c2VsZiB3aXRoSmF2YVJvbGU6bmlsXSBhdXRvcmVsZWFzZV07CiB9CiAKIC0gKE5TQXJyYXkgKilhY2Nlc3NpYmlsaXR5QXR0cmlidXRlTmFtZXMKQEAgLTEzMzYsNyArMTI5MSw3IEBACiBKTkZfQ09DT0FfRU5URVIoZW52KTsKIAogICAgIE5TUmVjdCByZWN0ID0gTlNNYWtlUmVjdChvcmlnaW5YLCBvcmlnaW5ZLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBqb2JqZWN0IGNQbGF0Zm9ybVZpZXcgPSAoKmVudiktPk5ld1dlYWtHbG9iYWxSZWYoZW52LCBvYmopOworICAgIGpvYmplY3QgY1BsYXRmb3JtVmlldyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgb2JqKTsKIAogICAgIFtUaHJlYWRVdGlsaXRpZXMgcGVyZm9ybU9uTWFpblRocmVhZFdhaXRpbmc6WUVTIGJsb2NrOl4oKXsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUV2luZG93LmggYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RXaW5kb3cuaAppbmRleCBlZTAxMTgxLi43ZjdiYWM3IDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RXaW5kb3cuaAorKysgYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RXaW5kb3cuaApAQCAtNDYsNyArNDYsNiBAQAogICAgIE5TV2luZG93ICpuc1dpbmRvdzsKICAgICBBV1RXaW5kb3cgKm93bmVyV2luZG93OwogICAgIGppbnQgcHJlRnVsbFNjcmVlbkxldmVsOwotICAgIEJPT0wgaXNNaW5pbWl6aW5nOwogfQogCiAvLyBBbiBpbnN0YW5jZSBvZiBlaXRoZXIgQVdUV2luZG93X05vcm1hbCBvciBBV1RXaW5kb3dfUGFuZWwKQEAgLTYwLDcgKzU5LDYgQEAKIEBwcm9wZXJ0eSAobm9uYXRvbWljKSBqaW50IHN0eWxlQml0czsKIEBwcm9wZXJ0eSAobm9uYXRvbWljKSBCT09MIGlzRW5hYmxlZDsKIEBwcm9wZXJ0eSAobm9uYXRvbWljKSBqaW50IHByZUZ1bGxTY3JlZW5MZXZlbDsKLUBwcm9wZXJ0eSAobm9uYXRvbWljKSBCT09MIGlzTWluaW1pemluZzsKIAogCiAtIChpZCkgaW5pdFdpdGhQbGF0Zm9ybVdpbmRvdzooSk5GV2Vha0pPYmplY3RXcmFwcGVyICopamF2YVBsYXRmb3JtV2luZG93CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9BV1RXaW5kb3cubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFdpbmRvdy5tCmluZGV4IDYwZjQ2NWYuLjMyNGY5ZDUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFdpbmRvdy5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFdpbmRvdy5tCkBAIC0xODQsNyArMTg0LDYgQEAKIEBzeW50aGVzaXplIGlzRW5hYmxlZDsKIEBzeW50aGVzaXplIG93bmVyV2luZG93OwogQHN5bnRoZXNpemUgcHJlRnVsbFNjcmVlbkxldmVsOwotQHN5bnRoZXNpemUgaXNNaW5pbWl6aW5nOwogCiAtICh2b2lkKSB1cGRhdGVNaW5NYXhTaXplOihCT09MKXJlc2l6YWJsZSB7CiAgICAgaWYgKHJlc2l6YWJsZSkgewpAQCAtMzA5LDcgKzMwOCw2IEBACiAgICAgW3NlbGYubnNXaW5kb3cgcmVsZWFzZV07IC8vIHRoZSBwcm9wZXJ0eSByZXRhaW5zIHRoZSBvYmplY3QgYWxyZWFkeQogCiAgICAgc2VsZi5pc0VuYWJsZWQgPSBZRVM7Ci0gICAgc2VsZi5pc01pbmltaXppbmcgPSBOTzsKICAgICBzZWxmLmphdmFQbGF0Zm9ybVdpbmRvdyA9IHBsYXRmb3JtV2luZG93OwogICAgIHNlbGYuc3R5bGVCaXRzID0gYml0czsKICAgICBzZWxmLm93bmVyV2luZG93ID0gb3duZXI7CkBAIC00MjksNjggKzQyNyw2IEBACiAgICAgW3N1cGVyIGRlYWxsb2NdOwogfQogCi0vLyBUZXN0cyB3aGVhdGhlciB0aGUgY29ycmVzcG9uZGluZyBKYXZhIHBhbHRmb3JtIHdpbmRvdyBpcyB2aXNpYmxlIG9yIG5vdAotKyAoQk9PTCkgaXNKYXZhUGxhdGZvcm1XaW5kb3dWaXNpYmxlOihOU1dpbmRvdyAqKXdpbmRvdyB7Ci0gICAgQk9PTCBpc1Zpc2libGUgPSBOTzsKLSAgICAKLSAgICBpZiAoW0FXVFdpbmRvdyBpc0FXVFdpbmRvdzp3aW5kb3ddICYmIFt3aW5kb3cgZGVsZWdhdGVdICE9IG5pbCkgewotICAgICAgICBBV1RXaW5kb3cgKmF3dFdpbmRvdyA9IChBV1RXaW5kb3cgKilbd2luZG93IGRlbGVnYXRlXTsKLSAgICAgICAgW0FXVFRvb2xraXQgZXZlbnRDb3VudFBsdXNQbHVzXTsKLSAgICAgICAgCi0gICAgICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwotICAgICAgICBqb2JqZWN0IHBsYXRmb3JtV2luZG93ID0gW2F3dFdpbmRvdy5qYXZhUGxhdGZvcm1XaW5kb3cgak9iamVjdFdpdGhFbnY6ZW52XTsKLSAgICAgICAgaWYgKHBsYXRmb3JtV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXRpYyBKTkZfTUVNQkVSX0NBQ0hFKGptX2lzVmlzaWJsZSwgamNfQ1BsYXRmb3JtV2luZG93LCAiaXNWaXNpYmxlIiwgIigpWiIpOwotICAgICAgICAgICAgaXNWaXNpYmxlID0gSk5GQ2FsbEJvb2xlYW5NZXRob2QoZW52LCBwbGF0Zm9ybVdpbmRvdywgam1faXNWaXNpYmxlKSA9PSBKTklfVFJVRSA/IFlFUyA6IE5POwotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHBsYXRmb3JtV2luZG93KTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpc1Zpc2libGU7Ci19Ci0KLS8vIE9yZGVycyB3aW5kb3cncyBjaGlsZHMgYmFzZWQgb24gdGhlIGN1cnJlbnQgZm9jdXMgc3RhdGUKLS0gKHZvaWQpIG9yZGVyQ2hpbGRXaW5kb3dzOihCT09MKWZvY3VzIHsKLUFXVF9BU1NFUlRfQVBQS0lUX1RIUkVBRDsKLQotICAgIGlmIChzZWxmLmlzTWluaW1pemluZykgewotICAgICAgICAvLyBEbyBub3QgcGVyZm9ybSBhbnkgb3JkZXJpbmcsIGlmIGljb25pZnkgaXMgaW4gcHJvZ3Jlc3MKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE5TRW51bWVyYXRvciAqd2luZG93RW51bWVyYXRvciA9IFtbTlNBcHAgd2luZG93c11vYmplY3RFbnVtZXJhdG9yXTsKLSAgICBOU1dpbmRvdyAqd2luZG93OwotICAgIHdoaWxlICgod2luZG93ID0gW3dpbmRvd0VudW1lcmF0b3IgbmV4dE9iamVjdF0pICE9IG5pbCkgewotICAgICAgICBpZiAoW0FXVFdpbmRvdyBpc0phdmFQbGF0Zm9ybVdpbmRvd1Zpc2libGU6d2luZG93XSkgewotICAgICAgICAgICAgQVdUV2luZG93ICphd3RXaW5kb3cgPSAoQVdUV2luZG93ICopW3dpbmRvdyBkZWxlZ2F0ZV07Ci0gICAgICAgICAgICBBV1RXaW5kb3cgKm93bmVyID0gYXd0V2luZG93Lm93bmVyV2luZG93OwotICAgICAgICAgICAgaWYgKElTKGF3dFdpbmRvdy5zdHlsZUJpdHMsIEFMV0FZU19PTl9UT1ApKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90IG9yZGVyICdhbHdheXMgb24gdG9wJyB3aW5kb3dzCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYXd0V2luZG93Lm93bmVyV2luZG93ICE9IG5pbCkgewotICAgICAgICAgICAgICAgIGlmIChhd3RXaW5kb3cub3duZXJXaW5kb3cgPT0gc2VsZikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIGNoaWxkV2luZG93IHRvIGZsb2F0aW5nIGxldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBpdCB3aWxsIGFwcGVhciBpbiBmcm9udCBvZiBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmVudCB3aGljaCBvd25zIHRoZSBmb2N1cwotICAgICAgICAgICAgICAgICAgICAgICAgW3dpbmRvdyBzZXRMZXZlbDpOU0Zsb2F0aW5nV2luZG93TGV2ZWxdOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9jdXMgb3duZXIgaGFzIGNoYW5nZWQsIG1vdmUgdGhlIGNoaWxkV2luZG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiYWNrIHRvIG5vcm1hbCB3aW5kb3cgbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIFt3aW5kb3cgc2V0TGV2ZWw6TlNOb3JtYWxXaW5kb3dMZXZlbF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoaWxkV2luZG93IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gZnJvbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRzIG5lYXJlc3QgcGFyZW50V2luZG93Ci0gICAgICAgICAgICAgICAgICAgIFt3aW5kb3cgb3JkZXJXaW5kb3c6TlNXaW5kb3dBYm92ZSByZWxhdGl2ZVRvOltvd25lci5uc1dpbmRvdyB3aW5kb3dOdW1iZXJdXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF3dFdpbmRvdyA9IGF3dFdpbmRvdy5vd25lcldpbmRvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQogLy8gTlNXaW5kb3cgb3ZlcnJpZGVzCiAtIChCT09MKSBjYW5CZWNvbWVLZXlXaW5kb3cgewogQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwpAQCAtNTczLDMwICs1MDksNiBAQAogICAgIC8vIHdpbmRvdyBleHBvc2luZyBpbiBfc2V0VmlzaWJsZTooQk9PTCkKIH0KIAotLy8gSGlkZXMvc2hvd3Mgd2luZG93J3MgY2hpbGRzIGR1cmluZyBpY29uaWZ5L2RlLWljb25pZnkgb3BlcmF0aW9uCi0tICh2b2lkKSBpY29uaWZ5Q2hpbGRXaW5kb3dzOihCT09MKWljb25pZnkgewotQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwotCi0gICAgTlNFbnVtZXJhdG9yICp3aW5kb3dFbnVtZXJhdG9yID0gW1tOU0FwcCB3aW5kb3dzXW9iamVjdEVudW1lcmF0b3JdOwotICAgIE5TV2luZG93ICp3aW5kb3c7Ci0gICAgd2hpbGUgKCh3aW5kb3cgPSBbd2luZG93RW51bWVyYXRvciBuZXh0T2JqZWN0XSkgIT0gbmlsKSB7Ci0gICAgICAgIGlmIChbQVdUV2luZG93IGlzSmF2YVBsYXRmb3JtV2luZG93VmlzaWJsZTp3aW5kb3ddKSB7Ci0gICAgICAgICAgICBBV1RXaW5kb3cgKmF3dFdpbmRvdyA9IChBV1RXaW5kb3cgKilbd2luZG93IGRlbGVnYXRlXTsKLSAgICAgICAgICAgIHdoaWxlIChhd3RXaW5kb3cub3duZXJXaW5kb3cgIT0gbmlsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF3dFdpbmRvdy5vd25lcldpbmRvdyA9PSBzZWxmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpY29uaWZ5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBbd2luZG93IG9yZGVyT3V0OndpbmRvd107Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBbd2luZG93IG9yZGVyRnJvbnQ6d2luZG93XTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXd0V2luZG93ID0gYXd0V2luZG93Lm93bmVyV2luZG93OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCiAtICh2b2lkKSBfZGVsaXZlckljb25pZnk6KEJPT0wpaWNvbmlmeSB7CiBBV1RfQVNTRVJUX0FQUEtJVF9USFJFQUQ7CiAKQEAgLTYxMCwyOCArNTIyLDE2IEBACiAgICAgfQogfQogCi0tICh2b2lkKXdpbmRvd1dpbGxNaW5pYXR1cml6ZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24gewotQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwotCi0gICAgc2VsZi5pc01pbmltaXppbmcgPSBZRVM7Ci0gICAgLy8gRXhjcGxpY2l0bHkgbWFrZSBteXNlbGYgYSBrZXkgd2luZG93IHRvIGF2b2lkIHBvc3NpYmxlCi0gICAgLy8gbmVnYXRpdmUgdmlzdWFsIGVmZmVjdHMgZHVyaW5nIGljb25pZnkgb3BlcmF0aW9uCi0gICAgW3NlbGYubnNXaW5kb3cgbWFrZUtleUFuZE9yZGVyRnJvbnQ6c2VsZi5uc1dpbmRvd107Ci0gICAgW3NlbGYgaWNvbmlmeUNoaWxkV2luZG93czpZRVNdOwotfQotCiAtICh2b2lkKXdpbmRvd0RpZE1pbmlhdHVyaXplOihOU05vdGlmaWNhdGlvbiAqKW5vdGlmaWNhdGlvbiB7CiBBV1RfQVNTRVJUX0FQUEtJVF9USFJFQUQ7CiAKICAgICBbc2VsZiBfZGVsaXZlckljb25pZnk6Sk5JX1RSVUVdOwotICAgIHNlbGYuaXNNaW5pbWl6aW5nID0gTk87CiB9CiAKIC0gKHZvaWQpd2luZG93RGlkRGVtaW5pYXR1cml6ZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24gewogQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwogCiAgICAgW3NlbGYgX2RlbGl2ZXJJY29uaWZ5OkpOSV9GQUxTRV07Ci0gICAgW3NlbGYgaWNvbmlmeUNoaWxkV2luZG93czpOT107CiB9CiAKIC0gKHZvaWQpIF9kZWxpdmVyV2luZG93Rm9jdXNFdmVudDooQk9PTClmb2N1c2VkIG9wcG9zaXRlV2luZG93OihBV1RXaW5kb3cgKilvcHBvc2l0ZSB7CkBAIC02NzcsNyArNTc3LDYgQEAKICAgICBbQVdUV2luZG93IHNldExhc3RLZXlXaW5kb3c6bmlsXTsKIAogICAgIFtzZWxmIF9kZWxpdmVyV2luZG93Rm9jdXNFdmVudDpZRVMgb3Bwb3NpdGVXaW5kb3c6IG9wcG9zaXRlXTsKLSAgICBbc2VsZiBvcmRlckNoaWxkV2luZG93czpZRVNdOwogfQogCiAtICh2b2lkKSB3aW5kb3dEaWRSZXNpZ25LZXk6IChOU05vdGlmaWNhdGlvbiAqKSBub3RpZmljYXRpb24gewpAQCAtNzA1LDcgKzYwNCw2IEBACiAgICAgfQogCiAgICAgW3NlbGYgX2RlbGl2ZXJXaW5kb3dGb2N1c0V2ZW50Ok5PIG9wcG9zaXRlV2luZG93OiBvcHBvc2l0ZV07Ci0gICAgW3NlbGYgb3JkZXJDaGlsZFdpbmRvd3M6Tk9dOwogfQogCiAtICh2b2lkKSB3aW5kb3dEaWRCZWNvbWVNYWluOiAoTlNOb3RpZmljYXRpb24gKikgbm90aWZpY2F0aW9uIHsKQEAgLTgwMCwxOCArNjk4LDYgQEAKIAogLSAodm9pZClzZW5kRXZlbnQ6KE5TRXZlbnQgKilldmVudCB7CiAgICAgICAgIGlmIChbZXZlbnQgdHlwZV0gPT0gTlNMZWZ0TW91c2VEb3duIHx8IFtldmVudCB0eXBlXSA9PSBOU1JpZ2h0TW91c2VEb3duIHx8IFtldmVudCB0eXBlXSA9PSBOU090aGVyTW91c2VEb3duKSB7Ci0gICAgICAgICAgICAvLyBNb3ZlIHBhcmVudCB3aW5kb3dzIHRvIGZyb250IGFuZCBtYWtlIHN1cmUgdGhhdCBhIGNoaWxkIHdpbmRvdyBpcyBkaXNwbGF5ZWQKLSAgICAgICAgICAgIC8vIGluIGZyb250IG9mIGl0cyBuZWFyZXN0IHBhcmVudC4KLSAgICAgICAgICAgIGlmIChzZWxmLm93bmVyV2luZG93ICE9IG5pbCkgewotICAgICAgICAgICAgICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07Ci0gICAgICAgICAgICAgICAgam9iamVjdCBwbGF0Zm9ybVdpbmRvdyA9IFtzZWxmLmphdmFQbGF0Zm9ybVdpbmRvdyBqT2JqZWN0V2l0aEVudjplbnZdOwotICAgICAgICAgICAgICAgIGlmIChwbGF0Zm9ybVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpYyBKTkZfTUVNQkVSX0NBQ0hFKGptX29yZGVyQWJvdmVTaWJsaW5ncywgamNfQ1BsYXRmb3JtV2luZG93LCAib3JkZXJBYm92ZVNpYmxpbmdzIiwgIigpViIpOwotICAgICAgICAgICAgICAgICAgICBKTkZDYWxsVm9pZE1ldGhvZChlbnYscGxhdGZvcm1XaW5kb3csIGptX29yZGVyQWJvdmVTaWJsaW5ncyk7Ci0gICAgICAgICAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBwbGF0Zm9ybVdpbmRvdyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgW3NlbGYgb3JkZXJDaGlsZFdpbmRvd3M6WUVTXTsKIAogICAgICAgICAgICAgTlNQb2ludCBwID0gW05TRXZlbnQgbW91c2VMb2NhdGlvbl07CiAgICAgICAgICAgICBOU1JlY3QgZnJhbWUgPSBbc2VsZi5uc1dpbmRvdyBmcmFtZV07CkBAIC04MjEsMTIgKzcwNyw5IEBACiAgICAgICAgICAgICBpZiAocC55ID49IChmcmFtZS5vcmlnaW4ueSArIGNvbnRlbnRSZWN0LnNpemUuaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07CiAgICAgICAgICAgICAgICAgam9iamVjdCBwbGF0Zm9ybVdpbmRvdyA9IFtzZWxmLmphdmFQbGF0Zm9ybVdpbmRvdyBqT2JqZWN0V2l0aEVudjplbnZdOwotICAgICAgICAgICAgICAgIGlmIChwbGF0Zm9ybVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSwgbm8gbmVlZCB0byBkZWxpdmVyIHRoZSB3aG9sZSBOU0V2ZW50LgotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kZWxpdmVyTkNNb3VzZURvd24sIGpjX0NQbGF0Zm9ybVdpbmRvdywgImRlbGl2ZXJOQ01vdXNlRG93biIsICIoKVYiKTsKLSAgICAgICAgICAgICAgICAgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBwbGF0Zm9ybVdpbmRvdywgam1fZGVsaXZlck5DTW91c2VEb3duKTsKLSAgICAgICAgICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHBsYXRmb3JtV2luZG93KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBubyBuZWVkIHRvIGRlbGl2ZXIgdGhlIHdob2xlIE5TRXZlbnQuCisgICAgICAgICAgICAgICAgc3RhdGljIEpORl9NRU1CRVJfQ0FDSEUoam1fZGVsaXZlck5DTW91c2VEb3duLCBqY19DUGxhdGZvcm1XaW5kb3csICJkZWxpdmVyTkNNb3VzZURvd24iLCAiKClWIik7CisgICAgICAgICAgICAgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBwbGF0Zm9ybVdpbmRvdywgam1fZGVsaXZlck5DTW91c2VEb3duKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogfQpAQCAtMTExNSwxNiArOTk4LDYgQEAKICAgICBOU1dpbmRvdyAqbnNXaW5kb3cgPSBPQkpDKHdpbmRvd1B0cik7CiAgICAgW1RocmVhZFV0aWxpdGllcyBwZXJmb3JtT25NYWluVGhyZWFkV2FpdGluZzpOTyBibG9jazpeKCl7CiAgICAgICAgIFtuc1dpbmRvdyBvcmRlckJhY2s6bmlsXTsKLSAgICAgICAgLy8gT3JkZXIgcGFyZW50IHdpbmRvd3MKLSAgICAgICAgQVdUV2luZG93ICphd3RXaW5kb3cgPSAoQVdUV2luZG93KilbbnNXaW5kb3cgZGVsZWdhdGVdOwotICAgICAgICB3aGlsZSAoYXd0V2luZG93Lm93bmVyV2luZG93ICE9IG5pbCkgewotICAgICAgICAgICAgYXd0V2luZG93ID0gYXd0V2luZG93Lm93bmVyV2luZG93OwotICAgICAgICAgICAgaWYgKFtBV1RXaW5kb3cgaXNKYXZhUGxhdGZvcm1XaW5kb3dWaXNpYmxlOmF3dFdpbmRvdy5uc1dpbmRvd10pIHsKLSAgICAgICAgICAgICAgICBbYXd0V2luZG93Lm5zV2luZG93IG9yZGVyQmFjazpuaWxdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE9yZGVyIGNoaWxkIHdpbmRvd3MKLSAgICAgICAgWyhBV1RXaW5kb3cqKVtuc1dpbmRvdyBkZWxlZ2F0ZV0gb3JkZXJDaGlsZFdpbmRvd3M6Tk9dOwogICAgIH1dOwogCiBKTkZfQ09DT0FfRVhJVChlbnYpOwpAQCAtMTI3Niw5ICsxMTQ5LDkgQEAKIC8qCiAgKiBDbGFzczogICAgIHN1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93CiAgKiBNZXRob2Q6ICAgIG5hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHMKLSAqIFNpZ25hdHVyZTogKClWCisgKiBTaWduYXR1cmU6IChKKVYKICAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX3N1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93X25hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHNfXworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX3N1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93X25hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHMKIChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6KQogewogICAgIEpORl9DT0NPQV9FTlRFUihlbnYpOwpAQCAtMTI5MiwyOSArMTE2NSw2IEBACiAKIC8qCiAgKiBDbGFzczogICAgIHN1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93Ci0gKiBNZXRob2Q6ICAgIG5hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHMKLSAqIFNpZ25hdHVyZTogKEpJKVYKLSAqLwotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX3N1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93X25hdGl2ZVN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHNfX0pJCi0oSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamxvbmcgd2luZG93UHRyLCBqaW50IGV2ZW50VHlwZSkKLXsKLUpORl9DT0NPQV9FTlRFUihlbnYpOwotCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBOU01vdXNlRW50ZXJlZCB8fCBldmVudFR5cGUgPT0gTlNNb3VzZUV4aXRlZCkgewotICAgICAgICBOU1dpbmRvdyAqbnNXaW5kb3cgPSBPQkpDKHdpbmRvd1B0cik7Ci0KLSAgICAgICAgW1RocmVhZFV0aWxpdGllcyBwZXJmb3JtT25NYWluVGhyZWFkV2FpdGluZzpOTyBibG9jazpeKCl7Ci0gICAgICAgICAgICBbQVdUV2luZG93IHN5bnRoZXNpemVNb3VzZUVudGVyZWRFeGl0ZWRFdmVudHM6bnNXaW5kb3cgd2l0aFR5cGU6ZXZlbnRUeXBlXTsKLSAgICAgICAgfV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgW0pORkV4Y2VwdGlvbiByYWlzZTplbnYgYXM6a0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiByZWFzb246InVua25vd24gZXZlbnQgdHlwZSJdOwotICAgIH0KLSAgICAKLUpORl9DT0NPQV9FWElUKGVudik7Ci19Ci0KLS8qCi0gKiBDbGFzczogICAgIHN1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93CiAgKiBNZXRob2Q6ICAgIF90b2dnbGVGdWxsU2NyZWVuTW9kZQogICogU2lnbmF0dXJlOiAoSilWCiAgKi8KZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0NHcmFwaGljc0Vudi5tIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ0dyYXBoaWNzRW52Lm0KaW5kZXggMjNkOGVlZS4uYzgwNDRkMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ0dyYXBoaWNzRW52Lm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ0dyYXBoaWNzRW52Lm0KQEAgLTE0Niw3ICsxNDYsNiBAQAogICAgICAgICAgICAgICAgICAgICBqY19DR3JhcGhpY3NFbnZpcm9ubWVudCwgIl9kaXNwbGF5UmVjb25maWd1cmF0aW9uIiwiKElaKVYiKTsKICAgICAgICAgICAgIEpORkNhbGxWb2lkTWV0aG9kKGVudiwgZ3JhcGhpY3NFbnYsIGptX2Rpc3BsYXlSZWNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgIChqaW50KSBkaXNwbGF5LCAoamJvb2xlYW4pIGZsYWdzICYga0NHRGlzcGxheVJlbW92ZUZsYWcpOwotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGdyYXBoaWNzRW52KTsKICAgICAgICAgfSk7CiAgICAgfV07CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9DVHJheUljb24ubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0NUcmF5SWNvbi5tCmluZGV4IGIzOTY3ZGYuLjc5YWUwMjQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0NUcmF5SWNvbi5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0NUcmF5SWNvbi5tCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICBjbGlja0NvdW50ID0gW2V2ZW50IGNsaWNrQ291bnRdOwogCiAgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19OU0V2ZW50LCAic3VuL2x3YXd0L21hY29zeC9OU0V2ZW50Iik7Ci0gICAgc3RhdGljIEpORl9DVE9SX0NBQ0hFKGpjdG9yX05TRXZlbnQsIGpjX05TRXZlbnQsICIoSUlJSUlJSUlEREkpViIpOworICAgIHN0YXRpYyBKTkZfQ1RPUl9DQUNIRShqY3Rvcl9OU0V2ZW50LCBqY19OU0V2ZW50LCAiKElJSUlJSUlJREQpViIpOwogICAgIGpvYmplY3QgakV2ZW50ID0gSk5GTmV3T2JqZWN0KGVudiwgamN0b3JfTlNFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXZlbnQgdHlwZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50IG1vZGlmaWVyRmxhZ3NdLApAQCAtMTQ1LDggKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpbG9jYWxQb2ludC54LCAoamludClsb2NhbFBvaW50LnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGppbnQpYWJzUC54LCAoamludClhYnNQLnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50IGRlbHRhWV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50IGRlbHRhWF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FXVFRvb2xraXQgc2Nyb2xsU3RhdGVXaXRoRXZlbnQ6IGV2ZW50XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50IGRlbHRhWF0pOwogICAgIGlmIChqRXZlbnQgPT0gbmlsKSB7CiAgICAgICAgIC8vIFVuYWJsZSB0byBjcmVhdGUgZXZlbnQgYnkgc29tZSByZWFzb24uCiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFBY2Nlc3NpYmlsaXR5QWN0aW9uLm0gYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9KYXZhQWNjZXNzaWJpbGl0eUFjdGlvbi5tCmluZGV4IDIwNzhlMWQuLjlhZmQxZmYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFBY2Nlc3NpYmlsaXR5QWN0aW9uLm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvSmF2YUFjY2Vzc2liaWxpdHlBY3Rpb24ubQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1LDkgKzM1LDkgQEAKIHsKICAgICBzZWxmID0gW3N1cGVyIGluaXRdOwogICAgIGlmIChzZWxmKSB7Ci0gICAgICAgIGZBY2Nlc3NpYmxlQWN0aW9uID0gSk5GTmV3V2Vha0dsb2JhbFJlZihlbnYsIGFjY2Vzc2libGVBY3Rpb24pOworICAgICAgICBmQWNjZXNzaWJsZUFjdGlvbiA9IEpORk5ld0dsb2JhbFJlZihlbnYsIGFjY2Vzc2libGVBY3Rpb24pOwogICAgICAgICBmSW5kZXggPSBpbmRleDsKLSAgICAgICAgZkNvbXBvbmVudCA9IEpORk5ld1dlYWtHbG9iYWxSZWYoZW52LCBjb21wb25lbnQpOworICAgICAgICBmQ29tcG9uZW50ID0gSk5GTmV3R2xvYmFsUmVmKGVudiwgY29tcG9uZW50KTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00NiwxMCArNDYsMTAgQEAKIHsKICAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52VW5jYWNoZWRdOwogCi0gICAgSk5GRGVsZXRlV2Vha0dsb2JhbFJlZihlbnYsIGZBY2Nlc3NpYmxlQWN0aW9uKTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmQWNjZXNzaWJsZUFjdGlvbik7CiAgICAgZkFjY2Vzc2libGVBY3Rpb24gPSBOVUxMOwogCi0gICAgSk5GRGVsZXRlV2Vha0dsb2JhbFJlZihlbnYsIGZDb21wb25lbnQpOworICAgIEpORkRlbGV0ZUdsb2JhbFJlZihlbnYsIGZDb21wb25lbnQpOwogICAgIGZDb21wb25lbnQgPSBOVUxMOwogCiAgICAgW3N1cGVyIGRlYWxsb2NdOwpAQCAtNTksMTAgKzU5LDEwIEBACiB7CiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudlVuY2FjaGVkXTsKIAotICAgIEpORkRlbGV0ZVdlYWtHbG9iYWxSZWYoZW52LCBmQWNjZXNzaWJsZUFjdGlvbik7CisgICAgSk5GRGVsZXRlR2xvYmFsUmVmKGVudiwgZkFjY2Vzc2libGVBY3Rpb24pOwogICAgIGZBY2Nlc3NpYmxlQWN0aW9uID0gTlVMTDsKIAotICAgIEpORkRlbGV0ZVdlYWtHbG9iYWxSZWYoZW52LCBmQ29tcG9uZW50KTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmQ29tcG9uZW50KTsKICAgICBmQ29tcG9uZW50ID0gTlVMTDsKIAogICAgIFtzdXBlciBmaW5hbGl6ZV07CkBAIC03NSwxOCArNzUsNyBAQAogCiAgICAgSk5JRW52KiBlbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAKLSAgICBqb2JqZWN0IGZDb21wTG9jYWwgPSAoKmVudiktPk5ld0xvY2FsUmVmKGVudiwgZkNvbXBvbmVudCk7Ci0gICAgaWYgKCgqZW52KS0+SXNTYW1lT2JqZWN0KGVudiwgZkNvbXBMb2NhbCwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuIEAidW5rbm93biI7Ci0gICAgfQotICAgIE5TU3RyaW5nICpzdHIgPSBuaWw7Ci0gICAgam9iamVjdCBqc3RyID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldEFjY2Vzc2libGVBY3Rpb25EZXNjcmlwdGlvbiwgZkFjY2Vzc2libGVBY3Rpb24sIGZJbmRleCwgZkNvbXBMb2NhbCk7Ci0gICAgaWYgKGpzdHIgIT0gTlVMTCkgewotICAgICAgICBOU1N0cmluZyAqc3RyID0gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBqc3RyKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wTW9kZSkKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpzdHIpOwotICAgIH0KLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgZkNvbXBMb2NhbCk7Ci0gICAgcmV0dXJuIHN0ciA9PSBuaWwgPyBAInVua25vd24iIDogc3RyOworICAgIHJldHVybiBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRBY2Nlc3NpYmxlQWN0aW9uRGVzY3JpcHRpb24sIGZBY2Nlc3NpYmxlQWN0aW9uLCBmSW5kZXgsIGZDb21wb25lbnQpKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wTW9kZSkKIH0KIAogLSAodm9pZClwZXJmb3JtCkBAIC0xMDcsOSArOTYsOSBAQAogewogICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07CiAgICAgaWYgKHNlbGYpIHsKLSAgICAgICAgZlRhYkdyb3VwID0gSk5GTmV3V2Vha0dsb2JhbFJlZihlbnYsIHRhYkdyb3VwKTsKKyAgICAgICAgZlRhYkdyb3VwID0gSk5GTmV3R2xvYmFsUmVmKGVudiwgdGFiR3JvdXApOwogICAgICAgICBmSW5kZXggPSBpbmRleDsKLSAgICAgICAgZkNvbXBvbmVudCA9IEpORk5ld1dlYWtHbG9iYWxSZWYoZW52LCBjb21wb25lbnQpOworICAgICAgICBmQ29tcG9uZW50ID0gSk5GTmV3R2xvYmFsUmVmKGVudiwgY29tcG9uZW50KTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC0xMTgsMTAgKzEwNywxMCBAQAogewogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07CiAKLSAgICBKTkZEZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZlRhYkdyb3VwKTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmVGFiR3JvdXApOwogICAgIGZUYWJHcm91cCA9IE5VTEw7CiAKLSAgICBKTkZEZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CisgICAgSk5GRGVsZXRlR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CiAgICAgZkNvbXBvbmVudCA9IE5VTEw7CiAKICAgICBbc3VwZXIgZGVhbGxvY107CkBAIC0xMzEsMTAgKzEyMCwxMCBAQAogewogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07CiAKLSAgICBKTkZEZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZlRhYkdyb3VwKTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmVGFiR3JvdXApOwogICAgIGZUYWJHcm91cCA9IE5VTEw7CiAKLSAgICBKTkZEZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CisgICAgSk5GRGVsZXRlR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CiAgICAgZkNvbXBvbmVudCA9IE5VTEw7CiAKICAgICBbc3VwZXIgZmluYWxpemVdOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvSmF2YUFjY2Vzc2liaWxpdHlVdGlsaXRpZXMubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFBY2Nlc3NpYmlsaXR5VXRpbGl0aWVzLm0KaW5kZXggMmI5OTkzNi4uMDgxYzdmNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvSmF2YUFjY2Vzc2liaWxpdHlVdGlsaXRpZXMubQorKysgYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9KYXZhQWNjZXNzaWJpbGl0eVV0aWxpdGllcy5tCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzcsOSArNzcsNyBAQAogICAgIGpvYmplY3QgYXhSb2xlID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIHNqbV9nZXRBY2Nlc3NpYmxlUm9sZSwgYXhDb21wb25lbnQsIGNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcE1vZGUpCiAgICAgaWYgKGF4Um9sZSA9PSBOVUxMKSByZXR1cm4gQCJ1bmtub3duIjsKIAotICAgIE5TU3RyaW5nKiBzdHIgPSBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIGF4Um9sZSk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4Um9sZSk7Ci0gICAgcmV0dXJuIHN0cjsKKyAgICByZXR1cm4gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBheFJvbGUpOwogfQogCiBqb2JqZWN0IGdldEF4U2VsZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IGF4Q29udGV4dCwgam9iamVjdCBjb21wb25lbnQpCkBAIC0xMjgsMjcgKzEyNiwyMSBAQAogewogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9WRVJUSUNBTCwgc2pjX0FjY2Vzc2libGVTdGF0ZSwgIlZFUlRJQ0FMIiwgIkxqYXZheC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGVTdGF0ZTsiKTsKICAgICBqb2JqZWN0IGF4VmVydFN0YXRlID0gSk5GR2V0U3RhdGljT2JqZWN0RmllbGQoZW52LCBqbV9WRVJUSUNBTCk7Ci0gICAgQk9PTCB2ZXJ0aWNhbCA9IGNvbnRhaW5zQXhTdGF0ZShlbnYsIGF4Q29udGV4dCwgYXhWZXJ0U3RhdGUsIGNvbXBvbmVudCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4VmVydFN0YXRlKTsKLSAgICByZXR1cm4gdmVydGljYWw7CisgICAgcmV0dXJuIGNvbnRhaW5zQXhTdGF0ZShlbnYsIGF4Q29udGV4dCwgYXhWZXJ0U3RhdGUsIGNvbXBvbmVudCk7CiB9CiAKIEJPT0wgaXNIb3Jpem9udGFsKEpOSUVudiAqZW52LCBqb2JqZWN0IGF4Q29udGV4dCwgam9iamVjdCBjb21wb25lbnQpCiB7CiAgICAgc3RhdGljIEpORl9TVEFUSUNfTUVNQkVSX0NBQ0hFKGptX0hPUklaT05UQUwsIHNqY19BY2Nlc3NpYmxlU3RhdGUsICJIT1JJWk9OVEFMIiwgIkxqYXZheC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGVTdGF0ZTsiKTsKICAgICBqb2JqZWN0IGF4SG9yaXpTdGF0ZSA9IEpORkdldFN0YXRpY09iamVjdEZpZWxkKGVudiwgam1fSE9SSVpPTlRBTCk7Ci0gICAgQk9PTCBob3Jpem9udGFsID0gY29udGFpbnNBeFN0YXRlKGVudiwgYXhDb250ZXh0LCBheEhvcml6U3RhdGUsIGNvbXBvbmVudCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4SG9yaXpTdGF0ZSk7Ci0gICAgcmV0dXJuIGhvcml6b250YWw7CisgICAgcmV0dXJuIGNvbnRhaW5zQXhTdGF0ZShlbnYsIGF4Q29udGV4dCwgYXhIb3JpelN0YXRlLCBjb21wb25lbnQpOwogfQogCiBCT09MIGlzU2hvd2luZyhKTklFbnYgKmVudiwgam9iamVjdCBheENvbnRleHQsIGpvYmplY3QgY29tcG9uZW50KQogewogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9TSE9XSU5HLCBzamNfQWNjZXNzaWJsZVN0YXRlLCAiU0hPV0lORyIsICJMamF2YXgvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlU3RhdGU7Iik7CiAgICAgam9iamVjdCBheFZpc2libGVTdGF0ZSA9IEpORkdldFN0YXRpY09iamVjdEZpZWxkKGVudiwgam1fU0hPV0lORyk7Ci0gICAgQk9PTCBzaG93aW5nID0gY29udGFpbnNBeFN0YXRlKGVudiwgYXhDb250ZXh0LCBheFZpc2libGVTdGF0ZSwgY29tcG9uZW50KTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhWaXNpYmxlU3RhdGUpOwotICAgIHJldHVybiBzaG93aW5nOworICAgIHJldHVybiBjb250YWluc0F4U3RhdGUoZW52LCBheENvbnRleHQsIGF4VmlzaWJsZVN0YXRlLCBjb21wb25lbnQpOwogfQogCiBOU1BvaW50IGdldEF4Q29tcG9uZW50TG9jYXRpb25PblNjcmVlbihKTklFbnYgKmVudiwgam9iamVjdCBheENvbXBvbmVudCwgam9iamVjdCBjb21wb25lbnQpCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9KYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eS5tIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkubQppbmRleCBmYmJhNmEyLi5mZmVhNDBmIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9KYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eS5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFDb21wb25lbnRBY2Nlc3NpYmlsaXR5Lm0KQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03NSw2ICs3NSw3IEBACiBzdGF0aWMgTlNNdXRhYmxlRGljdGlvbmFyeSAqc0F0dHJpYnV0ZU5hbWVzRm9yUm9sZUNhY2hlID0gbmlsOwogc3RhdGljIE5TT2JqZWN0ICpzQXR0cmlidXRlTmFtZXNMT0NLID0gbmlsOwogCisKIEBpbnRlcmZhY2UgVGFiR3JvdXBBY2Nlc3NpYmlsaXR5IDogSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgewogICAgIE5TSW50ZWdlciBfbnVtVGFiczsKIH0KQEAgLTEzNiwxMSArMTM3LDggQEAKICAgICAgICAgZlZpZXcgPSBbdmlldyByZXRhaW5dOwogICAgICAgICBmSmF2YVJvbGUgPSBbamF2YVJvbGUgcmV0YWluXTsKIAotICAgICAgICBmQWNjZXNzaWJsZSA9ICgqZW52KS0+TmV3V2Vha0dsb2JhbFJlZihlbnYsIGFjY2Vzc2libGUpOwotICAgICAgICAKLSAgICAgICAgam9iamVjdCBqY29tcG9uZW50ID0gWyhBV1RWaWV3ICopZlZpZXcgYXd0Q29tcG9uZW50OmVudl07Ci0gICAgICAgIGZDb21wb25lbnQgPSAoKmVudiktPk5ld1dlYWtHbG9iYWxSZWYoZW52LCBqY29tcG9uZW50KTsKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpjb21wb25lbnQpOworICAgICAgICBmQWNjZXNzaWJsZSA9IEpORk5ld0dsb2JhbFJlZihlbnYsIGFjY2Vzc2libGUpOworICAgICAgICBmQ29tcG9uZW50ID0gSk5GTmV3R2xvYmFsUmVmKGVudiwgWyhBV1RWaWV3ICopZlZpZXcgYXd0Q29tcG9uZW50OmVudl0pOwogCiAgICAgICAgIGZJbmRleCA9IGluZGV4OwogCkBAIC0xNjgsMTAgKzE2NiwxMCBAQAogCiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudlVuY2FjaGVkXTsKIAotICAgICgqZW52KS0+RGVsZXRlV2Vha0dsb2JhbFJlZihlbnYsIGZBY2Nlc3NpYmxlKTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmQWNjZXNzaWJsZSk7CiAgICAgZkFjY2Vzc2libGUgPSBOVUxMOwogCi0gICAgKCplbnYpLT5EZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CisgICAgSk5GRGVsZXRlR2xvYmFsUmVmKGVudiwgZkNvbXBvbmVudCk7CiAgICAgZkNvbXBvbmVudCA9IE5VTEw7CiAKICAgICBbZlBhcmVudCByZWxlYXNlXTsKQEAgLTIwMCwxMCArMTk4LDEwIEBACiAKICAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52VW5jYWNoZWRdOwogCi0gICAgKCplbnYpLT5EZWxldGVXZWFrR2xvYmFsUmVmKGVudiwgZkFjY2Vzc2libGUpOworICAgIEpORkRlbGV0ZUdsb2JhbFJlZihlbnYsIGZBY2Nlc3NpYmxlKTsKICAgICBmQWNjZXNzaWJsZSA9IE5VTEw7CiAKLSAgICAoKmVudiktPkRlbGV0ZVdlYWtHbG9iYWxSZWYoZW52LCBmQ29tcG9uZW50KTsKKyAgICBKTkZEZWxldGVHbG9iYWxSZWYoZW52LCBmQ29tcG9uZW50KTsKICAgICBmQ29tcG9uZW50ID0gTlVMTDsKIAogICAgIFtzdXBlciBmaW5hbGl6ZV07CkBAIC0yOTUsNyArMjkzLDcgQEAKIAogKyAoTlNBcnJheSAqKWNoaWxkcmVuT2ZQYXJlbnQ6KEphdmFDb21wb25lbnRBY2Nlc3NpYmlsaXR5ICopcGFyZW50IHdpdGhFbnY6KEpOSUVudiAqKWVudiB3aXRoQ2hpbGRyZW5Db2RlOihOU0ludGVnZXIpd2hpY2hDaGlsZHJlbiBhbGxvd0lnbm9yZWQ6KEJPT0wpYWxsb3dJZ25vcmVkCiB7Ci0gICAgam9iamVjdEFycmF5IGpjaGlsZHJlbkFuZFJvbGVzID0gKGpvYmplY3RBcnJheSlKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0Q2hpbGRyZW5BbmRSb2xlcywgcGFyZW50LT5mQWNjZXNzaWJsZSwgcGFyZW50LT5mQ29tcG9uZW50LCB3aGljaENoaWxkcmVuLCBhbGxvd0lnbm9yZWQpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCisgICAgam9iamVjdEFycmF5IGpjaGlsZHJlbkFuZFJvbGVzID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldENoaWxkcmVuQW5kUm9sZXMsIHBhcmVudC0+ZkFjY2Vzc2libGUsIHBhcmVudC0+ZkNvbXBvbmVudCwgd2hpY2hDaGlsZHJlbiwgYWxsb3dJZ25vcmVkKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgIGlmIChqY2hpbGRyZW5BbmRSb2xlcyA9PSBOVUxMKSByZXR1cm4gbmlsOwogCiAgICAganNpemUgYXJyYXlMZW4gPSAoKmVudiktPkdldEFycmF5TGVuZ3RoKGVudiwgamNoaWxkcmVuQW5kUm9sZXMpOwpAQCAtMzEwLDM1ICszMDgsMjQgQEAKIAogICAgICAgICBOU1N0cmluZyAqY2hpbGRKYXZhUm9sZSA9IG5pbDsKICAgICAgICAgaWYgKGpjaGlsZEphdmFSb2xlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGpvYmplY3QgamtleSA9IEpORkdldE9iamVjdEZpZWxkKGVudiwgamNoaWxkSmF2YVJvbGUsIHNqZl9rZXkpOwotICAgICAgICAgICAgY2hpbGRKYXZhUm9sZSA9IEpORkphdmFUb05TU3RyaW5nKGVudiwgamtleSk7Ci0gICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamtleSk7CisgICAgICAgICAgICBjaGlsZEphdmFSb2xlID0gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBKTkZHZXRPYmplY3RGaWVsZChlbnYsIGpjaGlsZEphdmFSb2xlLCBzamZfa2V5KSk7CiAgICAgICAgIH0KIAogICAgICAgICBKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSAqY2hpbGQgPSBbc2VsZiBjcmVhdGVXaXRoUGFyZW50OnBhcmVudCBhY2Nlc3NpYmxlOmpjaGlsZCByb2xlOmNoaWxkSmF2YVJvbGUgaW5kZXg6Y2hpbGRJbmRleCB3aXRoRW52OmVudiB3aXRoVmlldzpwYXJlbnQtPmZWaWV3XTsKLSAgICAgICAgCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqY2hpbGQpOwotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamNoaWxkSmF2YVJvbGUpOwotICAgICAgICAKICAgICAgICAgW2NoaWxkcmVuIGFkZE9iamVjdDpjaGlsZF07CiAgICAgICAgIGNoaWxkSW5kZXgrKzsKICAgICB9Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpjaGlsZHJlbkFuZFJvbGVzKTsKLSAgICAKKwogICAgIHJldHVybiBjaGlsZHJlbjsKIH0KIAogKyAoSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgKiljcmVhdGVXaXRoQWNjZXNzaWJsZTooam9iamVjdClqYWNjZXNzaWJsZSB3aXRoRW52OihKTklFbnYgKillbnYgd2l0aFZpZXc6KE5TVmlldyAqKXZpZXcKIHsKLSAgICBKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSAqcmV0ID0gbmlsOwogICAgIGpvYmplY3QgamNvbXBvbmVudCA9IFsoQVdUVmlldyAqKXZpZXcgYXd0Q29tcG9uZW50OmVudl07CiAgICAgamludCBpbmRleCA9IEpORkNhbGxTdGF0aWNJbnRNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZUluZGV4SW5QYXJlbnQsIGphY2Nlc3NpYmxlLCBqY29tcG9uZW50KTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgTlNTdHJpbmcgKmphdmFSb2xlID0gZ2V0SmF2YVJvbGUoZW52LCBqYWNjZXNzaWJsZSwgamNvbXBvbmVudCk7Ci0gICAgICByZXQgPSBbc2VsZiBjcmVhdGVXaXRoQWNjZXNzaWJsZTpqYWNjZXNzaWJsZSByb2xlOmphdmFSb2xlIGluZGV4OmluZGV4IHdpdGhFbnY6ZW52IHdpdGhWaWV3OnZpZXddOwotICAgIH0KLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamNvbXBvbmVudCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBOU1N0cmluZyAqamF2YVJvbGUgPSBnZXRKYXZhUm9sZShlbnYsIGphY2Nlc3NpYmxlLCBqY29tcG9uZW50KTsKKworICAgIHJldHVybiBbc2VsZiBjcmVhdGVXaXRoQWNjZXNzaWJsZTpqYWNjZXNzaWJsZSByb2xlOmphdmFSb2xlIGluZGV4OmluZGV4IHdpdGhFbnY6ZW52IHdpdGhWaWV3OnZpZXddOwogfQogCiArIChKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSAqKSBjcmVhdGVXaXRoQWNjZXNzaWJsZTooam9iamVjdClqYWNjZXNzaWJsZSByb2xlOihOU1N0cmluZyAqKWphdmFSb2xlIGluZGV4OihqaW50KWluZGV4IHdpdGhFbnY6KEpOSUVudiAqKWVudiB3aXRoVmlldzooTlNWaWV3ICopdmlldwpAQCAtMzUyLDEwICszMzksNyBAQAogICAgIGpvYmplY3QgakNBWCA9IFtKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBnZXRDQWNjZXNzaWJsZTpqYWNjZXNzaWJsZSB3aXRoRW52OmVudl07CiAgICAgaWYgKGpDQVggPT0gTlVMTCkgcmV0dXJuIG5pbDsKICAgICBKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSAqdmFsdWUgPSAoSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgKikgamxvbmdfdG9fcHRyKEpORkdldExvbmdGaWVsZChlbnYsIGpDQVgsIGpmX3B0cikpOwotICAgIGlmICh2YWx1ZSAhPSBuaWwpIHsKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpDQVgpOwotICAgICAgICByZXR1cm4gW1t2YWx1ZSByZXRhaW5dIGF1dG9yZWxlYXNlXTsKLSAgICB9CisgICAgaWYgKHZhbHVlICE9IG5pbCkgcmV0dXJuIFtbdmFsdWUgcmV0YWluXSBhdXRvcmVsZWFzZV07CiAKICAgICAvLyBvdGhlcndpc2UsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZQogICAgIEphdmFDb21wb25lbnRBY2Nlc3NpYmlsaXR5ICpuZXdDaGlsZCA9IG5pbDsKQEAgLTM3OCw3ICszNjIsNiBAQAogICAgIC8vIG11c3QgaGFyZCBDRlJldGFpbigpIHBvaW50ZXIgcG9rZWQgaW50byBKYXZhIG9iamVjdAogICAgIENGUmV0YWluKG5ld0NoaWxkKTsKICAgICBKTkZTZXRMb25nRmllbGQoZW52LCBqQ0FYLCBqZl9wdHIsIHB0cl90b19qbG9uZyhuZXdDaGlsZCkpOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqQ0FYKTsKIAogICAgIC8vIHJldHVybiBhdXRvcmVsZWFzZWQgaW5zdGFuY2UKICAgICByZXR1cm4gW25ld0NoaWxkIGF1dG9yZWxlYXNlXTsKQEAgLTQxMSw3ICszOTQsNyBAQAogCiAgICAgLy8gR2V0IGFsbCB0aGUgb3RoZXIgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzIHN0YXRlcyB3ZSBuZWVkIGluIG9uZSBzd2VsbCBmb29wLgogICAgIC8vIGphdmFSb2xlIGlzbid0IHB1bGxlZCBpbiBiZWNhdXNlIHdlIG5lZWQgcHJvdGVjdGVkIGFjY2VzcyB0byBBY2Nlc3NpYmxlUm9sZS5rZXkKLSAgICBqYm9vbGVhbkFycmF5IGF0dHJpYnV0ZVN0YXRlcyA9IChqYm9vbGVhbkFycmF5KUpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRJbml0aWFsQXR0cmlidXRlU3RhdGVzLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKKyAgICBqYm9vbGVhbkFycmF5IGF0dHJpYnV0ZVN0YXRlcyA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRJbml0aWFsQXR0cmlidXRlU3RhdGVzLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKICAgICBpZiAoYXR0cmlidXRlU3RhdGVzID09IE5VTEwpIHJldHVybiBuaWw7CiAgICAgamJvb2xlYW4gKmF0dHJpYnV0ZVN0YXRlc0FycmF5ID0gKCplbnYpLT5HZXRCb29sZWFuQXJyYXlFbGVtZW50cyhlbnYsIGF0dHJpYnV0ZVN0YXRlcywgMCk7CiAgICAgaWYgKGF0dHJpYnV0ZVN0YXRlc0FycmF5ID09IE5VTEwpIHsKQEAgLTUwNiw3ICs0ODksNiBAQAogICAgICAgICBKYXZhQXhBY3Rpb24gKmFjdGlvbiA9IFtbSmF2YUF4QWN0aW9uIGFsbG9jXSBpbml0V2l0aEVudjplbnYgd2l0aEFjY2Vzc2libGVBY3Rpb246YXhBY3Rpb24gd2l0aEluZGV4OjAgd2l0aENvbXBvbmVudDpmQ29tcG9uZW50XTsKICAgICAgICAgW2ZBY3Rpb25zIHNldE9iamVjdDphY3Rpb24gZm9yS2V5OltzZWxmIGlzTWVudV0gPyBOU0FjY2Vzc2liaWxpdHlQaWNrQWN0aW9uIDogTlNBY2Nlc3NpYmlsaXR5UHJlc3NBY3Rpb25dOwogICAgICAgICBbYWN0aW9uIHJlbGVhc2VdOwotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhBY3Rpb24pOwogICAgIH0KIH0KIApAQCAtNTE3LDkgKzQ5OSw3IEBACiAKIC0gKGlkKXBhcmVudAogewotICAgIHN0YXRpYyBKTkZfQ0xBU1NfQ0FDSEUoc2pjX1dpbmRvdywgImphdmEvYXd0L1dpbmRvdyIpOwogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShzam1fZ2V0QWNjZXNzaWJsZVBhcmVudCwgc2pjX0NBY2Nlc3NpYmlsaXR5LCAiZ2V0QWNjZXNzaWJsZVBhcmVudCIsICIoTGphdmF4L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZTtMamF2YS9hd3QvQ29tcG9uZW50OylMamF2YXgvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlOyIpOwotICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShzam1fZ2V0U3dpbmdBY2Nlc3NpYmxlLCBzamNfQ0FjY2Vzc2libGUsICJnZXRTd2luZ0FjY2Vzc2libGUiLCAiKExqYXZheC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGU7KUxqYXZheC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGU7Iik7CiAKICAgICBpZihmUGFyZW50ID09IG5pbCkgewogICAgICAgICBKTklFbnYqIGVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKQEAgLTUyOSwyMSArNTA5LDEwIEBACiAgICAgICAgIGlmIChqcGFyZW50ID09IE5VTEwpIHsKICAgICAgICAgICAgIGZQYXJlbnQgPSBmVmlldzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFXVFZpZXcgKnZpZXcgPSBmVmlldzsKLSAgICAgICAgICAgIGpvYmplY3QgamF4ID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIHNqbV9nZXRTd2luZ0FjY2Vzc2libGUsIGZBY2Nlc3NpYmxlKTsKLQotICAgICAgICAgICAgaWYgKEpORklzSW5zdGFuY2VPZihlbnYsIGpheCwgJnNqY19XaW5kb3cpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGpwYXJlbnQgaXMgYW4gb3duZXIgdG9wbGV2ZWwgYW5kIHdlIHNob3VsZCByZXRyaWV2ZSBpdHMgb3duIHZpZXcKLSAgICAgICAgICAgICAgICB2aWV3ID0gW0FXVFZpZXcgYXd0VmlldzplbnYgb2ZBY2Nlc3NpYmxlOmpwYXJlbnRdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZpZXcgIT0gbmlsKSB7Ci0gICAgICAgICAgICAgICAgZlBhcmVudCA9IFtKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBjcmVhdGVXaXRoQWNjZXNzaWJsZTpqcGFyZW50IHdpdGhFbnY6ZW52IHdpdGhWaWV3OnZpZXddOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZlBhcmVudCA9IFtKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBjcmVhdGVXaXRoQWNjZXNzaWJsZTpqcGFyZW50IHdpdGhFbnY6ZW52IHdpdGhWaWV3OmZWaWV3XTsKICAgICAgICAgICAgIGlmIChmUGFyZW50ID09IG5pbCkgewogICAgICAgICAgICAgICAgIGZQYXJlbnQgPSBmVmlldzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqcGFyZW50KTsKLSAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqYXggKTsKICAgICAgICAgfQogICAgICAgICBbZlBhcmVudCByZXRhaW5dOwogICAgIH0KQEAgLTU5MSwxMCArNTYwLDcgQEAKICAgICAgICAgcmV0dXJuIE5POwogICAgIH0KIAotICAgIGpvYmplY3QgYXhDb250ZXh0ID0gW3NlbGYgYXhDb250ZXh0V2l0aEVudjplbnZdOwotICAgIEJPT0wgc2hvd2luZyA9IGlzU2hvd2luZyhlbnYsIGF4Q29udGV4dCwgZkNvbXBvbmVudCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4Q29udGV4dCk7Ci0gICAgcmV0dXJuIHNob3dpbmc7CisgICAgcmV0dXJuIGlzU2hvd2luZyhlbnYsIFtzZWxmIGF4Q29udGV4dFdpdGhFbnY6ZW52XSwgZkNvbXBvbmVudCk7CiB9CiAKIC8vIHRoZSBhcnJheSBvZiBuYW1lcyBmb3IgZWFjaCByb2xlIGlzIGNhY2hlZCBpbiB0aGUgc0F0dHJpYnV0ZU5hbWVzRm9yUm9sZUNhY2hlCkBAIC03NzEsMTIgKzczNyw3IEBACiAgICAgSk5JRW52KiBlbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAKICAgICBqb2JqZWN0IHZhbCA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZURlc2NyaXB0aW9uLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKLSAgICBpZiAodmFsID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEAidW5rbm93biI7Ci0gICAgfQotICAgIE5TU3RyaW5nKiBzdHIgPSBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIHZhbCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHZhbCk7Ci0gICAgcmV0dXJuIHN0cjsKKyAgICByZXR1cm4gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCB2YWwpOwogfQogCiAtIChCT09MKWFjY2Vzc2liaWxpdHlJc0hlbHBBdHRyaWJ1dGVTZXR0YWJsZQpAQCAtNzkyLDEyICs3NTMsNyBAQAogICAgIEpOSUVudiogZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogCiAgICAgam9iamVjdCBheFZhbHVlID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldE1heGltdW1BY2Nlc3NpYmxlVmFsdWUsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQotICAgIGlmIChheFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoSW50OjBdOwotICAgIH0KLSAgICBOU051bWJlciogbnVtID0gSk5GSmF2YVRvTlNOdW1iZXIoZW52LCBheFZhbHVlKTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhWYWx1ZSk7Ci0gICAgcmV0dXJuIG51bTsKKyAgICByZXR1cm4gSk5GSmF2YVRvTlNOdW1iZXIoZW52LCBheFZhbHVlKTsKIH0KIAogLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNNYXhWYWx1ZUF0dHJpYnV0ZVNldHRhYmxlCkBAIC04MTMsMTIgKzc2OSw3IEBACiAgICAgSk5JRW52KiBlbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAKICAgICBqb2JqZWN0IGF4VmFsdWUgPSBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0TWluaW11bUFjY2Vzc2libGVWYWx1ZSwgZkFjY2Vzc2libGUsIGZDb21wb25lbnQpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCi0gICAgaWYgKGF4VmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6MF07Ci0gICAgfQotICAgIE5TTnVtYmVyKiBudW0gPSBKTkZKYXZhVG9OU051bWJlcihlbnYsIGF4VmFsdWUpOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheFZhbHVlKTsKLSAgICByZXR1cm4gbnVtOworICAgIHJldHVybiBKTkZKYXZhVG9OU051bWJlcihlbnYsIGF4VmFsdWUpOwogfQogCiAtIChCT09MKWFjY2Vzc2liaWxpdHlJc01pblZhbHVlQXR0cmlidXRlU2V0dGFibGUKQEAgLTgzMywxNiArNzg0LDEzIEBACiAKICAgICAvLyBjbWNub3RlIC0gc2hvdWxkIGJhdGNoIHRoZXNlIHR3byBjYWxscyBpbnRvIG9uZSB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgdHdvIGJvb2xzLCBvbmUgZm9yIHZlcnRpY2FsIGFuZCBvbmUgZm9yIGhvcml6CiAgICAgaWYgKGlzVmVydGljYWwoZW52LCBheENvbnRleHQsIGZDb21wb25lbnQpKSB7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheENvbnRleHQpOwogICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5VmVydGljYWxPcmllbnRhdGlvblZhbHVlOwogICAgIH0KIAogICAgIGlmIChpc0hvcml6b250YWwoZW52LCBheENvbnRleHQsIGZDb21wb25lbnQpKSB7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheENvbnRleHQpOwogICAgICAgICByZXR1cm4gTlNBY2Nlc3NpYmlsaXR5SG9yaXpvbnRhbE9yaWVudGF0aW9uVmFsdWU7CiAgICAgfQogCi0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4Q29udGV4dCk7CiAgICAgcmV0dXJuIG5pbDsKIH0KIApAQCAtODc0LDcgKzgyMiw2IEBACiAgICAgLy8gR2V0IHRoZSBqYXZhIHNjcmVlbiBjb29yZHMsIGFuZCBtYWtlIGEgTlNQb2ludCBvZiB0aGUgYm90dG9tIGxlZnQgb2YgdGhlIEF4Q29tcG9uZW50LgogICAgIE5TU2l6ZSBzaXplID0gZ2V0QXhDb21wb25lbnRTaXplKGVudiwgYXhDb21wb25lbnQsIGZDb21wb25lbnQpOwogICAgIE5TUG9pbnQgcG9pbnQgPSBnZXRBeENvbXBvbmVudExvY2F0aW9uT25TY3JlZW4oZW52LCBheENvbXBvbmVudCwgZkNvbXBvbmVudCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4Q29tcG9uZW50KTsKIAogICAgIHBvaW50LnkgKz0gc2l6ZS5oZWlnaHQ7CiAKQEAgLTkyNCw5ICs4NzEsOCBAQAogICAgICAgICBKTklFbnYqIGVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKIAogICAgICAgICBqb2JqZWN0IGF4Um9sZSA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRBY2Nlc3NpYmxlUm9sZURpc3BsYXlTdHJpbmcsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsKLSAgICAgICAgaWYgKGF4Um9sZSAhPSBOVUxMKSB7CisgICAgICAgIGlmKGF4Um9sZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IEpORkphdmFUb05TU3RyaW5nKGVudiwgYXhSb2xlKTsKLSAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheFJvbGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdmFsdWUgPSBAInVua25vd24iOwogICAgICAgICB9CkBAIC05NjEsOSArOTA3LDcgQEAKIC0gKE5TVmFsdWUgKilhY2Nlc3NpYmlsaXR5U2l6ZUF0dHJpYnV0ZSB7CiAgICAgSk5JRW52KiBlbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAgICAgam9iamVjdCBheENvbXBvbmVudCA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZUNvbXBvbmVudCwgZkFjY2Vzc2libGUsIGZDb21wb25lbnQpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCi0gICAgTlNWYWx1ZSogc2l6ZSA9IFtOU1ZhbHVlIHZhbHVlV2l0aFNpemU6Z2V0QXhDb21wb25lbnRTaXplKGVudiwgYXhDb21wb25lbnQsIGZDb21wb25lbnQpXTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhDb21wb25lbnQpOwotICAgIHJldHVybiBzaXplOworICAgIHJldHVybiBbTlNWYWx1ZSB2YWx1ZVdpdGhTaXplOmdldEF4Q29tcG9uZW50U2l6ZShlbnYsIGF4Q29tcG9uZW50LCBmQ29tcG9uZW50KV07CiB9CiAKIC0gKEJPT0wpYWNjZXNzaWJpbGl0eUlzU2l6ZUF0dHJpYnV0ZVNldHRhYmxlCkBAIC0xMDIyLDEyICs5NjYsNyBAQAogICAgIEpOSUVudiogZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogCiAgICAgam9iamVjdCB2YWwgPSBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgc2ptX2dldEFjY2Vzc2libGVOYW1lLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKLSAgICBpZiAodmFsID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEAidW5rbm93biI7Ci0gICAgfQotICAgIE5TU3RyaW5nKiBzdHIgPSBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIHZhbCk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHZhbCk7Ci0gICAgcmV0dXJuIHN0cjsKKyAgICByZXR1cm4gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCB2YWwpOwogfQogCiAtIChCT09MKWFjY2Vzc2liaWxpdHlJc1RpdGxlQXR0cmlidXRlU2V0dGFibGUKQEAgLTEwNTksMjAgKzk5OCw4IEBACiAgICAgLy8gYSB0ZXh0IHZhbHVlIGlzIHRha2VuIGNhcmUgb2YgaW4gSmF2YVRleHRBY2Nlc3NpYmlsaXR5CiAKICAgICAvLyBjbWNub3RlIHNob3VsZCBjb2FsZXNjZSB0aGVzZSBjYWxscyBpbnRvIG9uZSBqYXZhIGNhbGwKLSAgICBOU051bWJlciAqbnVtID0gbmlsOwogICAgIGpvYmplY3QgYXhWYWx1ZSA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZVZhbHVlLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKLSAgICBpZiAoYXhWYWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIGpvYmplY3Qgc3RyID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldEN1cnJlbnRBY2Nlc3NpYmxlVmFsdWUsIGF4VmFsdWUsIGZDb21wb25lbnQpOwotICAgICAgICBpZiAoc3RyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG51bSA9IEpORkphdmFUb05TTnVtYmVyKGVudiwgc3RyKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHN0cik7Ci0gICAgICAgIH0KLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4VmFsdWUpOwotICAgIH0KLSAgICBpZiAobnVtID09IG5pbCkgewotICAgICAgICBudW0gPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEludDowXTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bTsKKyAgICByZXR1cm4gSk5GSmF2YVRvTlNOdW1iZXIoZW52LCBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0Q3VycmVudEFjY2Vzc2libGVWYWx1ZSwgYXhWYWx1ZSwgZkNvbXBvbmVudCkpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCiB9CiAKIC0gKEJPT0wpYWNjZXNzaWJpbGl0eUlzVmFsdWVBdHRyaWJ1dGVTZXR0YWJsZQpAQCAtMTE3MSwxMCArMTA5OCw3IEBACiAgICAgaWQgdmFsdWUgPSBuaWw7CiAgICAgaWYgKEpORklzSW5zdGFuY2VPZihlbnYsIGpwYXJlbnQsICZqY19Db250YWluZXIpKSB7CiAgICAgICAgIGpvYmplY3QgamFjY2Vzc2libGUgPSBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fYWNjZXNzaWJpbGl0eUhpdFRlc3QsIGpwYXJlbnQsIChqZmxvYXQpcG9pbnQueCwgKGpmbG9hdClwb2ludC55KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQotICAgICAgICBpZiAoamFjY2Vzc2libGUgIT0gTlVMTCkgewotICAgICAgICAgICAgdmFsdWUgPSBbSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgY3JlYXRlV2l0aEFjY2Vzc2libGU6amFjY2Vzc2libGUgd2l0aEVudjplbnYgd2l0aFZpZXc6ZlZpZXddOwotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGphY2Nlc3NpYmxlKTsKLSAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IFtKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSBjcmVhdGVXaXRoQWNjZXNzaWJsZTpqYWNjZXNzaWJsZSB3aXRoRW52OmVudiB3aXRoVmlldzpmVmlld107CiAgICAgfQogCiAgICAgaWYgKHZhbHVlID09IG5pbCkgewpAQCAtMTIwNiw3ICsxMTMwLDYgQEAKICAgICAgICAgaWYgKEpORklzSW5zdGFuY2VPZihlbnYsIGZvY3VzZWQsICZzamNfQWNjZXNzaWJsZSkpIHsKICAgICAgICAgICAgIHZhbHVlID0gW0phdmFDb21wb25lbnRBY2Nlc3NpYmlsaXR5IGNyZWF0ZVdpdGhBY2Nlc3NpYmxlOmZvY3VzZWQgd2l0aEVudjplbnYgd2l0aFZpZXc6ZlZpZXddOwogICAgICAgICB9Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBmb2N1c2VkKTsKICAgICB9CiAKICAgICBpZiAodmFsdWUgPT0gbmlsKSB7CkBAIC0xMzEzLDQ2ICsxMjM2LDM4IEBACiAgICAgZm9yIChpID0gMDsgaSA8IF9udW1UYWJzOyBpKyspIHsKICAgICAgICAgYVRhYiA9IChKYXZhQ29tcG9uZW50QWNjZXNzaWJpbGl0eSAqKVt0YWJzIG9iamVjdEF0SW5kZXg6aV07CiAgICAgICAgIGlmIChbYVRhYiBpc0FjY2Vzc2libGVXaXRoRW52OmVudiBmb3JBY2Nlc3NpYmxlOnNlbEFjY2Vzc2libGVdKSB7Ci0gICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc2VsQWNjZXNzaWJsZSk7CiAgICAgICAgICAgICByZXR1cm4gYVRhYjsKICAgICAgICAgfQogICAgIH0KLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc2VsQWNjZXNzaWJsZSk7CisKICAgICByZXR1cm4gbmlsOwogfQogCiAtIChOU0FycmF5ICopdGFiQ29udHJvbHNXaXRoRW52OihKTklFbnYgKillbnYgd2l0aFRhYkdyb3VwQXhDb250ZXh0Oihqb2JqZWN0KWF4Q29udGV4dCB3aXRoVGFiQ29kZTooTlNJbnRlZ2VyKXdoaWNoVGFicyBhbGxvd0lnbm9yZWQ6KEJPT0wpYWxsb3dJZ25vcmVkCiB7Ci0gICAgam9iamVjdEFycmF5IGp0YWJzQW5kUm9sZXMgPSAoam9iamVjdEFycmF5KUpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRDaGlsZHJlbkFuZFJvbGVzLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCwgd2hpY2hUYWJzLCBhbGxvd0lnbm9yZWQpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCisgICAgam9iamVjdEFycmF5IGp0YWJzQW5kUm9sZXMgPSBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0Q2hpbGRyZW5BbmRSb2xlcywgZkFjY2Vzc2libGUsIGZDb21wb25lbnQsIHdoaWNoVGFicywgYWxsb3dJZ25vcmVkKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgIGlmKGp0YWJzQW5kUm9sZXMgPT0gTlVMTCkgcmV0dXJuIG5pbDsKIAogICAgIGpzaXplIGFycmF5TGVuID0gKCplbnYpLT5HZXRBcnJheUxlbmd0aChlbnYsIGp0YWJzQW5kUm9sZXMpOwotICAgIGlmIChhcnJheUxlbiA9PSAwKSB7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqdGFic0FuZFJvbGVzKTsKLSAgICAgICAgcmV0dXJuIG5pbDsKLSAgICB9CisgICAgaWYgKGFycmF5TGVuID09IDApIHJldHVybiBuaWw7CisKICAgICBOU011dGFibGVBcnJheSAqdGFicyA9IFtOU011dGFibGVBcnJheSBhcnJheVdpdGhDYXBhY2l0eTooYXJyYXlMZW4vMildOwogCiAgICAgLy8gYWxsIG9mIHRoZSB0YWJzIGhhdmUgdGhlIHNhbWUgcm9sZSwgc28gd2UgY2FuIGp1c3QgZmluZCBvdXQgd2hhdCB0aGF0IGlzIGhlcmUgYW5kIHVzZSBpdCBmb3IgYWxsIHRoZSB0YWJzCiAgICAgam9iamVjdCBqdGFiSmF2YVJvbGUgPSAoKmVudiktPkdldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGp0YWJzQW5kUm9sZXMsIDEpOyAvLyB0aGUgYXJyYXkgZW50cmllcyBhbHRlcm5hdGUgYmV0d2VlbiB0YWIvcm9sZSwgc3RhcnRpbmcgd2l0aCB0YWIuIHNvIHRoZSBmaXJzdCByb2xlIGlzIGVudHJ5IDEuCi0gICAgaWYgKGp0YWJKYXZhUm9sZSA9PSBOVUxMKSB7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqdGFic0FuZFJvbGVzKTsKLSAgICAgICAgcmV0dXJuIG5pbDsKLSAgICB9Ci0gICAgam9iamVjdCBqa2V5ID0gSk5GR2V0T2JqZWN0RmllbGQoZW52LCBqdGFiSmF2YVJvbGUsIHNqZl9rZXkpOwotICAgIE5TU3RyaW5nICp0YWJKYXZhUm9sZSA9IEpORkphdmFUb05TU3RyaW5nKGVudiwgamtleSk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGprZXkpOworICAgIGlmIChqdGFiSmF2YVJvbGUgPT0gTlVMTCkgcmV0dXJuIG5pbDsKKworICAgIE5TU3RyaW5nICp0YWJKYXZhUm9sZSA9IEpORkphdmFUb05TU3RyaW5nKGVudiwgSk5GR2V0T2JqZWN0RmllbGQoZW52LCBqdGFiSmF2YVJvbGUsIHNqZl9rZXkpKTsKIAogICAgIE5TSW50ZWdlciBpOwogICAgIE5TVUludGVnZXIgdGFiSW5kZXggPSAod2hpY2hUYWJzID49IDApID8gd2hpY2hUYWJzIDogMDsgLy8gaWYgd2UncmUgZ2V0dGluZyBvbmUgcGFydGljdWxhciBjaGlsZCwgbWFrZSBzdXJlIHRvIHNldCBpdHMgaW5kZXggY29ycmVjdGx5CiAgICAgZm9yKGkgPSAwOyBpIDwgYXJyYXlMZW47IGkrPTIpIHsKICAgICAgICAgam9iamVjdCBqdGFiID0gKCplbnYpLT5HZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBqdGFic0FuZFJvbGVzLCBpKTsKICAgICAgICAgSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgKnRhYiA9IFtbW1RhYkdyb3VwQ29udHJvbEFjY2Vzc2liaWxpdHkgYWxsb2NdIGluaXRXaXRoUGFyZW50OnNlbGYgd2l0aEVudjplbnYgd2l0aEFjY2Vzc2libGU6anRhYiB3aXRoSW5kZXg6dGFiSW5kZXggd2l0aFRhYkdyb3VwOmF4Q29udGV4dCB3aXRoVmlldzpbc2VsZiB2aWV3XSB3aXRoSmF2YVJvbGU6dGFiSmF2YVJvbGVdIGF1dG9yZWxlYXNlXTsKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGp0YWIpOwogICAgICAgICBbdGFicyBhZGRPYmplY3Q6dGFiXTsKICAgICAgICAgdGFiSW5kZXgrKzsKICAgICB9Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGp0YWJzQW5kUm9sZXMpOworCiAgICAgcmV0dXJuIHRhYnM7CiB9CiAKQEAgLTEzNzEsOSArMTI4Niw3IEBACiB7CiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAgICAgam9iamVjdCBheENvbnRleHQgPSBbc2VsZiBheENvbnRleHRXaXRoRW52OmVudl07Ci0gICAgaWQgdGFicyA9IFtzZWxmIHRhYkNvbnRyb2xzV2l0aEVudjplbnYgd2l0aFRhYkdyb3VwQXhDb250ZXh0OmF4Q29udGV4dCB3aXRoVGFiQ29kZTpKQVZBX0FYX0FMTF9DSElMRFJFTiBhbGxvd0lnbm9yZWQ6Tk9dOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheENvbnRleHQpOwotICAgIHJldHVybiB0YWJzOworICAgIHJldHVybiBbc2VsZiB0YWJDb250cm9sc1dpdGhFbnY6ZW52IHdpdGhUYWJHcm91cEF4Q29udGV4dDpheENvbnRleHQgd2l0aFRhYkNvZGU6SkFWQV9BWF9BTExfQ0hJTERSRU4gYWxsb3dJZ25vcmVkOk5PXTsKIH0KIAogLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNUYWJzQXR0cmlidXRlU2V0dGFibGUKQEAgLTEzOTMsOSArMTMwNiw3IEBACiB7CiAgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CiAgICAgam9iamVjdCBheENvbnRleHQgPSBbc2VsZiBheENvbnRleHRXaXRoRW52OmVudl07Ci0gICAgTlNBcnJheSogY29udCA9IFtzZWxmIGNvbnRlbnRzV2l0aEVudjplbnYgd2l0aFRhYkdyb3VwQXhDb250ZXh0OmF4Q29udGV4dCB3aXRoVGFiQ29kZTpKQVZBX0FYX0FMTF9DSElMRFJFTiBhbGxvd0lnbm9yZWQ6Tk9dOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheENvbnRleHQpOwotICAgIHJldHVybiBjb250OworICAgIHJldHVybiBbc2VsZiBjb250ZW50c1dpdGhFbnY6ZW52IHdpdGhUYWJHcm91cEF4Q29udGV4dDpheENvbnRleHQgd2l0aFRhYkNvZGU6SkFWQV9BWF9BTExfQ0hJTERSRU4gYWxsb3dJZ25vcmVkOk5PXTsKIH0KIAogLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNDb250ZW50c0F0dHJpYnV0ZVNldHRhYmxlCkBAIC0xNDA4LDkgKzEzMTksNyBAQAogewogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIGpvYmplY3QgYXhDb250ZXh0ID0gW3NlbGYgYXhDb250ZXh0V2l0aEVudjplbnZdOwotICAgIGlkIHZhbCA9IFtzZWxmIGN1cnJlbnRUYWJXaXRoRW52OmVudiB3aXRoQXhDb250ZXh0OmF4Q29udGV4dF07Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4Q29udGV4dCk7Ci0gICAgcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gW3NlbGYgY3VycmVudFRhYldpdGhFbnY6ZW52IHdpdGhBeENvbnRleHQ6YXhDb250ZXh0XTsKIH0KIAogLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNWYWx1ZUF0dHJpYnV0ZVNldHRhYmxlCkBAIC0xNDI3LDcgKzEzMzYsNiBAQAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIGpvYmplY3QgYXhDb250ZXh0ID0gW3NlbGYgYXhDb250ZXh0V2l0aEVudjplbnZdOwogICAgIHNldEF4Q29udGV4dFNlbGVjdGlvbihlbnYsIGF4Q29udGV4dCwgZkluZGV4LCBmQ29tcG9uZW50KTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhDb250ZXh0KTsKIH0KIAogLSAoTlNBcnJheSAqKWFjY2Vzc2liaWxpdHlDaGlsZHJlbkF0dHJpYnV0ZQpAQCAtMTQ2Myw3ICsxMzcxLDYgQEAKICAgICAgICAgICAgICAgICByZXN1bHQgPSBjaGlsZHJlbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhDb250ZXh0KTsKICAgICB9IGVsc2UgewogICAgICAgICByZXN1bHQgPSBbc3VwZXIgYWNjZXNzaWJpbGl0eUFycmF5QXR0cmlidXRlVmFsdWVzOmF0dHJpYnV0ZSBpbmRleDppbmRleCBtYXhDb3VudDptYXhDb3VudF07CiAgICAgfQpAQCAtMTQ4Miw3ICsxMzg5LDcgQEAKICAgICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUGFyZW50OnBhcmVudCB3aXRoRW52OmVudiB3aXRoQWNjZXNzaWJsZTphY2Nlc3NpYmxlIHdpdGhJbmRleDppbmRleCB3aXRoVmlldzp2aWV3IHdpdGhKYXZhUm9sZTpqYXZhUm9sZV07CiAgICAgaWYgKHNlbGYpIHsKICAgICAgICAgaWYgKHRhYkdyb3VwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZUYWJHcm91cEF4Q29udGV4dCA9IEpORk5ld1dlYWtHbG9iYWxSZWYoZW52LCB0YWJHcm91cCk7CisgICAgICAgICAgICBmVGFiR3JvdXBBeENvbnRleHQgPSBKTkZOZXdHbG9iYWxSZWYoZW52LCB0YWJHcm91cCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmVGFiR3JvdXBBeENvbnRleHQgPSBOVUxMOwogICAgICAgICB9CkBAIC0xNDk1LDcgKzE0MDIsNyBAQAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07CiAKICAgICBpZiAoZlRhYkdyb3VwQXhDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgSk5GRGVsZXRlV2Vha0dsb2JhbFJlZihlbnYsIGZUYWJHcm91cEF4Q29udGV4dCk7CisgICAgICAgIEpORkRlbGV0ZUdsb2JhbFJlZihlbnYsIGZUYWJHcm91cEF4Q29udGV4dCk7CiAgICAgICAgIGZUYWJHcm91cEF4Q29udGV4dCA9IE5VTEw7CiAgICAgfQogCkBAIC0xNTA3LDcgKzE0MTQsNyBAQAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZVbmNhY2hlZF07CiAKICAgICBpZiAoZlRhYkdyb3VwQXhDb250ZXh0ICE9IE5VTEwpIHsKLSAgICAgICAgSk5GRGVsZXRlV2Vha0dsb2JhbFJlZihlbnYsIGZUYWJHcm91cEF4Q29udGV4dCk7CisgICAgICAgIEpORkRlbGV0ZUdsb2JhbFJlZihlbnYsIGZUYWJHcm91cEF4Q29udGV4dCk7CiAgICAgICAgIGZUYWJHcm91cEF4Q29udGV4dCA9IE5VTEw7CiAgICAgfQogCkBAIC0xNTE4LDE0ICsxNDI1LDkgQEAKIHsKICAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKICAgICBqb2JqZWN0IGF4Q29udGV4dCA9IFtzZWxmIGF4Q29udGV4dFdpdGhFbnY6ZW52XTsKLSAgICBqb2JqZWN0IHNlbEFjY2Vzc2libGUgPSBnZXRBeENvbnRleHRTZWxlY3Rpb24oZW52LCBbc2VsZiB0YWJHcm91cF0sIGZJbmRleCwgZkNvbXBvbmVudCk7CiAKICAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBvZiB0aGUgcGFnZSB0YWIgbGlzdAotICAgIGlkIHZhbCA9IFtOU051bWJlciBudW1iZXJXaXRoQm9vbDpPYmplY3RFcXVhbHMoZW52LCBheENvbnRleHQsIHNlbEFjY2Vzc2libGUsIGZDb21wb25lbnQpXTsKLQotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBzZWxBY2Nlc3NpYmxlKTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhDb250ZXh0KTsKLSAgICByZXR1cm4gdmFsOworICAgIHJldHVybiBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6T2JqZWN0RXF1YWxzKGVudiwgYXhDb250ZXh0LCBnZXRBeENvbnRleHRTZWxlY3Rpb24oZW52LCBbc2VsZiB0YWJHcm91cF0sIGZJbmRleCwgZkNvbXBvbmVudCksIGZDb21wb25lbnQpXTsKIH0KIAogLSAodm9pZClnZXRBY3Rpb25zV2l0aEVudjooSk5JRW52ICopZW52CkBAIC0xNTQwLDggKzE0NDIsNyBAQAogICAgIGlmIChmVGFiR3JvdXBBeENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBKTklFbnYqIGVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKICAgICAgICAgam9iamVjdCB0YWJHcm91cEF4Q29udGV4dCA9IFsoSmF2YUNvbXBvbmVudEFjY2Vzc2liaWxpdHkgKilbc2VsZiBwYXJlbnRdIGF4Q29udGV4dFdpdGhFbnY6ZW52XTsKLSAgICAgICAgZlRhYkdyb3VwQXhDb250ZXh0ID0gSk5GTmV3V2Vha0dsb2JhbFJlZihlbnYsIHRhYkdyb3VwQXhDb250ZXh0KTsKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHRhYkdyb3VwQXhDb250ZXh0KTsKKyAgICAgICAgZlRhYkdyb3VwQXhDb250ZXh0ID0gSk5GTmV3R2xvYmFsUmVmKGVudiwgdGFiR3JvdXBBeENvbnRleHQpOwogICAgIH0KICAgICByZXR1cm4gZlRhYkdyb3VwQXhDb250ZXh0OwogfQpAQCAtMTU3NiwxMCArMTQ3Nyw4IEBACiAgICAgICAgIGlmIChbW2FFbGVtZW50IGFjY2Vzc2liaWxpdHlSb2xlQXR0cmlidXRlXSBpc0VxdWFsVG9TdHJpbmc6TlNBY2Nlc3NpYmlsaXR5U2Nyb2xsQmFyUm9sZV0pIHsKICAgICAgICAgICAgIGpvYmplY3QgZWxlbWVudEF4Q29udGV4dCA9IFthRWxlbWVudCBheENvbnRleHRXaXRoRW52OmVudl07CiAgICAgICAgICAgICBpZiAoaXNIb3Jpem9udGFsKGVudiwgZWxlbWVudEF4Q29udGV4dCwgZkNvbXBvbmVudCkpIHsKLSAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgZWxlbWVudEF4Q29udGV4dCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFFbGVtZW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGVsZW1lbnRBeENvbnRleHQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjA1LDEwICsxNTA0LDggQEAKICAgICAgICAgaWYgKFtbYUVsZW1lbnQgYWNjZXNzaWJpbGl0eVJvbGVBdHRyaWJ1dGVdIGlzRXF1YWxUb1N0cmluZzpOU0FjY2Vzc2liaWxpdHlTY3JvbGxCYXJSb2xlXSkgewogICAgICAgICAgICAgam9iamVjdCBlbGVtZW50QXhDb250ZXh0ID0gW2FFbGVtZW50IGF4Q29udGV4dFdpdGhFbnY6ZW52XTsKICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKGVudiwgZWxlbWVudEF4Q29udGV4dCwgZkNvbXBvbmVudCkpIHsKLSAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgZWxlbWVudEF4Q29udGV4dCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFFbGVtZW50OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGVsZW1lbnRBeENvbnRleHQpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9KYXZhVGV4dEFjY2Vzc2liaWxpdHkubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFUZXh0QWNjZXNzaWJpbGl0eS5tCmluZGV4IGY3ZTE3YjAuLjI4MDlkOGIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFUZXh0QWNjZXNzaWJpbGl0eS5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0phdmFUZXh0QWNjZXNzaWJpbGl0eS5tCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTEyLDkgKzExMiw3IEBACiAgICAgICAgIC8vIGlmIGl0J3Mgc3RhdGljIHRleHQsIHRoZSBBcHBLaXQgQVhWYWx1ZSBpcyB0aGUgamF2YSBhY2Nlc3NpYmxlTmFtZQogICAgICAgICBqb2JqZWN0IGF4TmFtZSA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZU5hbWUsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgICAgICBpZiAoYXhOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgIE5TU3RyaW5nKiBzdHIgPSBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIGF4TmFtZSk7Ci0gICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgICAgICByZXR1cm4gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBheE5hbWUpOwogICAgICAgICB9CiAgICAgICAgIC8vIHZhbHVlIGlzIHN0aWxsIG5pbCBpZiBubyBhY2Nlc3NpYmxlTmFtZSBmb3Igc3RhdGljIHRleHQuIEJlbG93LCB0cnkgdG8gZ2V0IHRoZSBhY2Nlc3NpYmxlVGV4dC4KICAgICB9CkBAIC0xMjIsMTggKzEyMCwxMiBAQAogICAgIC8vIGNtY25vdGU6IGluZWZmaWNpZW50IHRvIG1ha2UgdGhyZWUgZGlzdGluY3QgSk5JIGNhbGxzLiBDb2FsZXNjZS4gcmFkcjovLzM5NTE5MjMKICAgICBqb2JqZWN0IGF4VGV4dCA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBzam1fZ2V0QWNjZXNzaWJsZVRleHQsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgIGlmIChheFRleHQgPT0gTlVMTCkgcmV0dXJuIG5pbDsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYXhUZXh0KTsKLSAgICAKKwogICAgIGpvYmplY3QgYXhFZGl0YWJsZVRleHQgPSBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgc2ptX2dldEFjY2Vzc2libGVFZGl0YWJsZVRleHQsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgIGlmIChheEVkaXRhYmxlVGV4dCA9PSBOVUxMKSByZXR1cm4gbmlsOwogCiAgICAgc3RhdGljIEpORl9TVEFUSUNfTUVNQkVSX0NBQ0hFKGptX2dldFRleHRSYW5nZSwgc2pjX0NBY2Nlc3NpYmxlVGV4dCwgImdldFRleHRSYW5nZSIsICIoTGphdmF4L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZUVkaXRhYmxlVGV4dDtJSUxqYXZhL2F3dC9Db21wb25lbnQ7KUxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgIGpvYmplY3QganJhbmdlID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldFRleHRSYW5nZSwgYXhFZGl0YWJsZVRleHQsIDAsIGdldEF4VGV4dENoYXJDb3VudChlbnYsIGF4RWRpdGFibGVUZXh0LCBmQ29tcG9uZW50KSwgZkNvbXBvbmVudCk7Ci0gICAgTlNTdHJpbmcgKnN0cmluZyA9IEpORkphdmFUb05TU3RyaW5nKGVudiwganJhbmdlKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQotCi0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpyYW5nZSk7Ci0gICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGF4RWRpdGFibGVUZXh0KTsKLSAgICAKKyAgICBOU1N0cmluZyAqc3RyaW5nID0gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0VGV4dFJhbmdlLCBheEVkaXRhYmxlVGV4dCwgMCwgZ2V0QXhUZXh0Q2hhckNvdW50KGVudiwgYXhFZGl0YWJsZVRleHQsIGZDb21wb25lbnQpLCBmQ29tcG9uZW50KSk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKICAgICBpZiAoc3RyaW5nID09IG5pbCkgc3RyaW5nID0gQCIiOwogICAgIHJldHVybiBzdHJpbmc7CiB9CkBAIC0xNDcsNyArMTM5LDYgQEAKICAgICBKTklFbnYqIGVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKICAgICBqb2JqZWN0IGF4RWRpdGFibGVUZXh0ID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIHNqbV9nZXRBY2Nlc3NpYmxlRWRpdGFibGVUZXh0LCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKICAgICBpZiAoYXhFZGl0YWJsZVRleHQgPT0gTlVMTCkgcmV0dXJuIE5POwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheEVkaXRhYmxlVGV4dCk7CiAgICAgcmV0dXJuIFlFUzsKIH0KIApAQCAtMTY2LDkgKzE1Nyw3IEBACiAgICAgc3RhdGljIEpORl9TVEFUSUNfTUVNQkVSX0NBQ0hFKGptX2dldFNlbGVjdGVkVGV4dCwgc2pjX0NBY2Nlc3NpYmxlVGV4dCwgImdldFNlbGVjdGVkVGV4dCIsICIoTGphdmF4L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZTtMamF2YS9hd3QvQ29tcG9uZW50OylMamF2YS9sYW5nL1N0cmluZzsiKTsKICAgICBqb2JqZWN0IGF4VGV4dCA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRTZWxlY3RlZFRleHQsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50KTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQogICAgIGlmIChheFRleHQgPT0gTlVMTCkgcmV0dXJuIEAiIjsKLSAgICBOU1N0cmluZyogc3RyID0gSk5GSmF2YVRvTlNTdHJpbmcoZW52LCBheFRleHQpOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheFRleHQpOwotICAgIHJldHVybiBzdHI7CisgICAgcmV0dXJuIEpORkphdmFUb05TU3RyaW5nKGVudiwgYXhUZXh0KTsKIH0KIAogLSAoQk9PTClhY2Nlc3NpYmlsaXR5SXNTZWxlY3RlZFRleHRBdHRyaWJ1dGVTZXR0YWJsZQpAQCAtMjMxLDkgKzIyMCw3IEBACiAgICAgLy8gYWxzbywgc3RhdGljIHRleHQgZG9lc24ndCBhbHdheXMgaGF2ZSBhY2Nlc3NpYmxlVGV4dC4gaWYgYXhUZXh0IGlzIG51bGwsIHNob3VsZCBnZXQgdGhlIGNoYXJjb3VudCBvZiB0aGUgYWNjZXNzaWJsZU5hbWUgaW5zdGVhZAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIGpvYmplY3QgYXhUZXh0ID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIHNqbV9nZXRBY2Nlc3NpYmxlVGV4dCwgZkFjY2Vzc2libGUsIGZDb21wb25lbnQpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCi0gICAgTlNOdW1iZXIqIG51bSA9IFtOU051bWJlciBudW1iZXJXaXRoSW50OmdldEF4VGV4dENoYXJDb3VudChlbnYsIGF4VGV4dCwgZkNvbXBvbmVudCldOwotICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBheFRleHQpOwotICAgIHJldHVybiBudW07CisgICAgcmV0dXJuIFtOU051bWJlciBudW1iZXJXaXRoSW50OmdldEF4VGV4dENoYXJDb3VudChlbnYsIGF4VGV4dCwgZkNvbXBvbmVudCldOwogfQogCiAtIChCT09MKWFjY2Vzc2liaWxpdHlJc051bWJlck9mQ2hhcmFjdGVyc0F0dHJpYnV0ZVNldHRhYmxlCkBAIC0yOTgsNyArMjg1LDcgQEAKIAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9nZXRCb3VuZHNGb3JSYW5nZSwgc2pjX0NBY2Nlc3NpYmxlVGV4dCwgImdldEJvdW5kc0ZvclJhbmdlIiwgIihMamF2YXgvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmxlO0xqYXZhL2F3dC9Db21wb25lbnQ7SUkpW0QiKTsKLSAgICBqZG91YmxlQXJyYXkgYXhCb3VuZHMgPSAoamRvdWJsZUFycmF5KUpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRCb3VuZHNGb3JSYW5nZSwgZkFjY2Vzc2libGUsIGZDb21wb25lbnQsIHJhbmdlLmxvY2F0aW9uLCByYW5nZS5sZW5ndGgpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCisgICAgamRvdWJsZUFycmF5IGF4Qm91bmRzID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldEJvdW5kc0ZvclJhbmdlLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCwgcmFuZ2UubG9jYXRpb24sIHJhbmdlLmxlbmd0aCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKICAgICBpZiAoYXhCb3VuZHMgPT0gTlVMTCkgcmV0dXJuIG5pbDsKIAogICAgIC8vIFdlIGNoZWF0IGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBhcnJheSBpcyA0IGVsZW1lbnRzIGxvbmcgKHgsIHksIHdpZHRoLCBoZWlnaHQpCkBAIC0zMzcsNyArMzI0LDcgQEAKIAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9nZXRSYW5nZUZvckxpbmUsIHNqY19DQWNjZXNzaWJsZVRleHQsICJnZXRSYW5nZUZvckxpbmUiLCAiKExqYXZheC9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2libGU7TGphdmEvYXd0L0NvbXBvbmVudDtJKVtJIik7Ci0gICAgamludEFycmF5IGF4VGV4dFJhbmdlID0gKGppbnRBcnJheSlKTkZDYWxsU3RhdGljT2JqZWN0TWV0aG9kKGVudiwgam1fZ2V0UmFuZ2VGb3JMaW5lLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCwgW2xpbmUgaW50VmFsdWVdKTsgLy8gQVdUX1RIUkVBRElORyBTYWZlIChBV1RSdW5Mb29wKQorICAgIGppbnRBcnJheSBheFRleHRSYW5nZSA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRSYW5nZUZvckxpbmUsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50LCBbbGluZSBpbnRWYWx1ZV0pOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCiAgICAgaWYgKGF4VGV4dFJhbmdlID09IE5VTEwpIHJldHVybiBuaWw7CiAKICAgICByZXR1cm4gamF2YUludEFycmF5VG9OU1JhbmdlVmFsdWUoZW52LGF4VGV4dFJhbmdlKTsKQEAgLTM2MywxMiArMzUwLDEwIEBACiAKICAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKICAgICBzdGF0aWMgSk5GX1NUQVRJQ19NRU1CRVJfQ0FDSEUoam1fZ2V0U3RyaW5nRm9yUmFuZ2UsIHNqY19DQWNjZXNzaWJsZVRleHQsICJnZXRTdHJpbmdGb3JSYW5nZSIsICIoTGphdmF4L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZTtMamF2YS9hd3QvQ29tcG9uZW50O0lJKUxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgIGpzdHJpbmcganN0cmluZ0ZvclJhbmdlID0gKGpzdHJpbmcpSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldFN0cmluZ0ZvclJhbmdlLCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCwgcmFuZ2UubG9jYXRpb24sIHJhbmdlLmxlbmd0aCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKKyAgICBqc3RyaW5nIGpzdHJpbmdGb3JSYW5nZSA9IEpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRTdHJpbmdGb3JSYW5nZSwgZkFjY2Vzc2libGUsIGZDb21wb25lbnQsIHJhbmdlLmxvY2F0aW9uLCByYW5nZS5sZW5ndGgpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCiAKICAgICBpZiAoanN0cmluZ0ZvclJhbmdlID09IE5VTEwpIHJldHVybiBAIiI7Ci0gICAgTlNTdHJpbmcqIHN0ciA9IEpORkphdmFUb05TU3RyaW5nKGVudiwganN0cmluZ0ZvclJhbmdlKTsKLSAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwganN0cmluZ0ZvclJhbmdlKTsKLSAgICByZXR1cm4gc3RyOworICAgIHJldHVybiBKTkZKYXZhVG9OU1N0cmluZyhlbnYsIGpzdHJpbmdGb3JSYW5nZSk7CiB9CiAKIC8vCkBAIC00MjEsNyArNDA2LDcgQEAKIAogICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwogICAgIHN0YXRpYyBKTkZfU1RBVElDX01FTUJFUl9DQUNIRShqbV9nZXRSYW5nZUZvckluZGV4LCBzamNfQ0FjY2Vzc2libGVUZXh0LCAiZ2V0UmFuZ2VGb3JJbmRleCIsICIoTGphdmF4L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJsZTtMamF2YS9hd3QvQ29tcG9uZW50O0kpW0kiKTsKLSAgICBqaW50QXJyYXkgYXhUZXh0UmFuZ2UgPSAoamludEFycmF5KUpORkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqbV9nZXRSYW5nZUZvckluZGV4LCBmQWNjZXNzaWJsZSwgZkNvbXBvbmVudCwgaW5kZXgpOyAvLyBBV1RfVEhSRUFESU5HIFNhZmUgKEFXVFJ1bkxvb3ApCisgICAgamludEFycmF5IGF4VGV4dFJhbmdlID0gSk5GQ2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsIGptX2dldFJhbmdlRm9ySW5kZXgsIGZBY2Nlc3NpYmxlLCBmQ29tcG9uZW50LCBpbmRleCk7IC8vIEFXVF9USFJFQURJTkcgU2FmZSAoQVdUUnVuTG9vcCkKICAgICBpZiAoYXhUZXh0UmFuZ2UgPT0gTlVMTCkgcmV0dXJuIG5pbDsKIAogICAgIHJldHVybiBqYXZhSW50QXJyYXlUb05TUmFuZ2VWYWx1ZShlbnYsIGF4VGV4dFJhbmdlKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0xXQ1Rvb2xraXQuaCBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0xXQ1Rvb2xraXQuaAppbmRleCAwYTU3NTAxLi5jM2UxYjUzIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9MV0NUb29sa2l0LmgKKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvTFdDVG9vbGtpdC5oCkBAIC00MCw3ICs0MCw2IEBACiBAaW50ZXJmYWNlIEFXVFRvb2xraXQgOiBOU09iamVjdCB7IH0KICsgKGxvbmcpIGdldEV2ZW50Q291bnQ7CiArICh2b2lkKSBldmVudENvdW50UGx1c1BsdXM7Ci0rIChqaW50KSBzY3JvbGxTdGF0ZVdpdGhFdmVudDogKE5TRXZlbnQqKSBldmVudDsKIEBlbmQKIAogLyoKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0xXQ1Rvb2xraXQubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0xXQ1Rvb2xraXQubQppbmRleCA4ZjBhMjkwLi44YjM0ZWJhIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9MV0NUb29sa2l0Lm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvTFdDVG9vbGtpdC5tCkBAIC0zOSwxMyArMzksNiBAQAogCiAjaW1wb3J0ICJzaXplY2FsYy5oIgogCi0vLyBTQ1JPTEwgUEhBU0UgU1RBVEUKLSNkZWZpbmUgU0NST0xMX1BIQVNFX1VOU1VQUE9SVEVEIDEKLSNkZWZpbmUgU0NST0xMX1BIQVNFX0JFR0FOIDIKLSNkZWZpbmUgU0NST0xMX1BIQVNFX0NPTlRJTlVFRCAzCi0jZGVmaW5lIFNDUk9MTF9QSEFTRV9DQU5DRUxMRUQgNAotI2RlZmluZSBTQ1JPTExfUEhBU0VfRU5ERUQgNQotCiBpbnQgZ051bWJlck9mQnV0dG9uczsKIGppbnQqIGdCdXR0b25Eb3duTWFza3M7CiAKQEAgLTYxLDIzICs1NCw2IEBACiAgICAgZXZlbnRDb3VudCsrOwogfQogCi0rIChqaW50KSBzY3JvbGxTdGF0ZVdpdGhFdmVudDogKE5TRXZlbnQqKSBldmVudCB7Ci0KLSAgICBpZiAoW2V2ZW50IHR5cGVdICE9IE5TU2Nyb2xsV2hlZWwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgTlNFdmVudFBoYXNlIHBoYXNlID0gW2V2ZW50IHBoYXNlXTsKLSAgICBOU0V2ZW50UGhhc2UgbW9tZW50dW1QaGFzZSA9IFtldmVudCBtb21lbnR1bVBoYXNlXTsKLQotICAgIGlmICghcGhhc2UgJiYgIW1vbWVudHVtUGhhc2UpIHJldHVybiBTQ1JPTExfUEhBU0VfVU5TVVBQT1JURUQ7Ci0gICAgc3dpdGNoIChwaGFzZSkgewotICAgICAgICBjYXNlIE5TRXZlbnRQaGFzZUJlZ2FuOiByZXR1cm4gU0NST0xMX1BIQVNFX0JFR0FOOwotICAgICAgICBjYXNlIE5TRXZlbnRQaGFzZUNhbmNlbGxlZDogcmV0dXJuIFNDUk9MTF9QSEFTRV9DQU5DRUxMRUQ7Ci0gICAgICAgIGNhc2UgTlNFdmVudFBoYXNlRW5kZWQ6IHJldHVybiBTQ1JPTExfUEhBU0VfRU5ERUQ7Ci0gICAgfQotICAgIHJldHVybiBTQ1JPTExfUEhBU0VfQ09OVElOVUVEOwotfQogQGVuZAogCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vZm9udC9BV1RGb250Lm0gYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2ZvbnQvQVdURm9udC5tCmluZGV4IDY0NThmMTcuLmJmYjkwZWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vZm9udC9BV1RGb250Lm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9mb250L0FXVEZvbnQubQpAQCAtMTYyLDQ0ICsxNjIsNiBAQAogICAgIHJldHVybiBbc0ZvbnRGYW1pbHlUYWJsZSBvYmplY3RGb3JLZXk6Zm9udG5hbWVdOwogfQogCi1zdGF0aWMgdm9pZCBhZGRGb250KENURm9udFVJRm9udFR5cGUgdWlUeXBlLCAKLSAgICAgICAgICAgICAgICAgICAgTlNNdXRhYmxlQXJyYXkgKmFsbEZvbnRzLAotICAgICAgICAgICAgICAgICAgICBOU011dGFibGVEaWN0aW9uYXJ5KiBmb250RmFtaWx5VGFibGUpIHsKLQotICAgICAgICBDVEZvbnRSZWYgZm9udCA9IENURm9udENyZWF0ZVVJRm9udEZvckxhbmd1YWdlKHVpVHlwZSwgMC4wLCBOVUxMKTsKLSAgICAgICAgaWYgKGZvbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENURm9udERlc2NyaXB0b3JSZWYgZGVzYyA9IENURm9udENvcHlGb250RGVzY3JpcHRvcihmb250KTsKLSAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgQ0ZSZWxlYXNlKGZvbnQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENGU3RyaW5nUmVmIGZhbWlseSA9IENURm9udERlc2NyaXB0b3JDb3B5QXR0cmlidXRlKGRlc2MsIGtDVEZvbnRGYW1pbHlOYW1lQXR0cmlidXRlKTsKLSAgICAgICAgaWYgKGZhbWlseSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBDRlJlbGVhc2UoZGVzYyk7Ci0gICAgICAgICAgICBDRlJlbGVhc2UoZm9udCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZTdHJpbmdSZWYgbmFtZSA9IENURm9udERlc2NyaXB0b3JDb3B5QXR0cmlidXRlKGRlc2MsIGtDVEZvbnROYW1lQXR0cmlidXRlKTsKLSAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQ0ZSZWxlYXNlKGZhbWlseSk7Ci0gICAgICAgICAgICBDRlJlbGVhc2UoZGVzYyk7Ci0gICAgICAgICAgICBDRlJlbGVhc2UoZm9udCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgW2FsbEZvbnRzIGFkZE9iamVjdDpuYW1lXTsKLSAgICAgICAgW2ZvbnRGYW1pbHlUYWJsZSBzZXRPYmplY3Q6ZmFtaWx5IGZvcktleTpuYW1lXTsKLSNpZmRlZiBERUJVRwotICAgICAgICBOU0xvZyhAIm5hbWUgaXMgOiAlQCIsIChOU1N0cmluZyopbmFtZSk7Ci0gICAgICAgIE5TTG9nKEAiZmFtaWx5IGlzIDogJUAiLCAoTlNTdHJpbmcqKWZhbWlseSk7Ci0jZW5kaWYKLSAgICAgICAgQ0ZSZWxlYXNlKGZhbWlseSk7Ci0gICAgICAgIENGUmVsZWFzZShuYW1lKTsKLSAgICAgICAgQ0ZSZWxlYXNlKGRlc2MpOwotICAgICAgICBDRlJlbGVhc2UoZm9udCk7Ci19Ci0gCiBzdGF0aWMgTlNBcnJheSoKIEdldEZpbHRlcmVkRm9udHMoKQogewpAQCAtMjM0LDE2ICsxOTYsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogSmF2YUZYIHJlZ2lzdGVycyB0aGVzZSBmb250cyBhbmQgc28gSkRLIG5lZWRzIHRvIGRvIHNvIGFzIHdlbGwuCi0gICAgICAgICAqIElmIHRoaXMgaXNuJ3QgZG9uZSB3ZSB3aWxsIGhhdmUgbWlzLW1hdGNoZWQgcmVuZGVyaW5nLCBzaW5jZQotICAgICAgICAgKiBhbHRob3VnaCB0aGVzZSBtYXkgaW5jbHVkZSBmb250cyB0aGF0IGFyZSBlbnVtZXJhdGVkIG5vcm1hbGx5Ci0gICAgICAgICAqIHRoZXkgYWxzbyBkZW1vbnN0cmFibHkgaW5jbHVkZXMgZm9udHMgdGhhdCBhcmUgbm90LgotICAgICAgICAgKi8KLSAgICAgICAgYWRkRm9udChrQ1RGb250VUlGb250U3lzdGVtLCBhbGxGb250cywgZm9udEZhbWlseVRhYmxlKTsKLSAgICAgICAgYWRkRm9udChrQ1RGb250VUlGb250RW1waGFzaXplZFN5c3RlbSwgYWxsRm9udHMsIGZvbnRGYW1pbHlUYWJsZSk7Ci0gICAgICAgIGFkZEZvbnQoa0NURm9udFVJRm9udFVzZXJGaXhlZFBpdGNoLCBhbGxGb250cywgZm9udEZhbWlseVRhYmxlKTsKLQogICAgICAgICBzRmlsdGVyZWRGb250cyA9IGFsbEZvbnRzOwogICAgICAgICBzRm9udEZhbWlseVRhYmxlID0gZm9udEZhbWlseVRhYmxlOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9DR0xMYXllci5oIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9qYXZhMmQvb3BlbmdsL0NHTExheWVyLmgKaW5kZXggM2QwMzBlNS4uNDM3MjRjMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9qYXZhMmQvb3BlbmdsL0NHTExheWVyLmgKKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9qYXZhMmQvb3BlbmdsL0NHTExheWVyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw3ICszMSw3IEBACiBAaW50ZXJmYWNlIENHTExheWVyIDogQ0FPcGVuR0xMYXllcgogewogQHByaXZhdGUKLSAgICBKTkZXZWFrSk9iamVjdFdyYXBwZXIgKmphdmFMYXllcjsKKyAgICBKTkZKT2JqZWN0V3JhcHBlciAqamF2YUxheWVyOwogCiAgICAgLy8gaW50ZXJtZWRpYXRlIGJ1ZmZlciwgdXNlZCB0aGUgUlEgbG9jayB0byBzeW5jaHJvbml6ZQogICAgIEdMdWludCB0ZXh0dXJlSUQ7CkBAIC00NSw3ICs0NSw3IEBACiAjZW5kaWYgLyogUkVNT1RFTEFZRVIgKi8KIH0KIAotQHByb3BlcnR5IChub25hdG9taWMsIHJldGFpbikgSk5GV2Vha0pPYmplY3RXcmFwcGVyICpqYXZhTGF5ZXI7CitAcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBKTkZKT2JqZWN0V3JhcHBlciAqamF2YUxheWVyOwogQHByb3BlcnR5IChyZWFkd3JpdGUsIGFzc2lnbikgR0x1aW50IHRleHR1cmVJRDsKIEBwcm9wZXJ0eSAocmVhZHdyaXRlLCBhc3NpZ24pIEdMZW51bSB0YXJnZXQ7CiBAcHJvcGVydHkgKHJlYWR3cml0ZSwgYXNzaWduKSBmbG9hdCB0ZXh0dXJlV2lkdGg7CkBAIC01Nyw3ICs1Nyw3IEBACiBAcHJvcGVydHkgKG5vbmF0b21pYywgcmV0YWluKSBOU09iamVjdDxKUlNSZW1vdGVMYXllcj4gKmpyc1JlbW90ZUxheWVyOwogI2VuZGlmCiAKLS0gKGlkKSBpbml0V2l0aEphdmFMYXllcjooSk5GV2Vha0pPYmplY3RXcmFwcGVyICopamF2YUxheWVyOworLSAoaWQpIGluaXRXaXRoSmF2YUxheWVyOihKTkZKT2JqZWN0V3JhcHBlciAqKWphdmFMYXllcjsKIC0gKHZvaWQpIGJsaXRUZXh0dXJlOwogQGVuZAogCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2phdmEyZC9vcGVuZ2wvQ0dMTGF5ZXIubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9DR0xMYXllci5tCmluZGV4IDg3ZGNmMWQuLmYzMDBlYTQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9DR0xMYXllci5tCisrKyBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9DR0xMYXllci5tCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDYsNyArNDYsNyBAQAogQHN5bnRoZXNpemUganJzUmVtb3RlTGF5ZXI7CiAjZW5kaWYKIAotLSAoaWQpIGluaXRXaXRoSmF2YUxheWVyOihKTkZXZWFrSk9iamVjdFdyYXBwZXIgKilsYXllcjsKKy0gKGlkKSBpbml0V2l0aEphdmFMYXllcjooSk5GSk9iamVjdFdyYXBwZXIgKilsYXllcjsKIHsKIEFXVF9BU1NFUlRfQVBQS0lUX1RIUkVBRDsKICAgICAvLyBJbml0aWFsaXplIG91cnNlbHZlcwpAQCAtMTMzLDE1ICsxMzMsNiBAQAogewogICAgIEFXVF9BU1NFUlRfQVBQS0lUX1RIUkVBRDsKIAotICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwotICAgIHN0YXRpYyBKTkZfQ0xBU1NfQ0FDSEUoamNfSmF2YUxheWVyLCAic3VuL2phdmEyZC9vcGVuZ2wvQ0dMTGF5ZXIiKTsKLSAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9kcmF3SW5DR0xDb250ZXh0LCBqY19KYXZhTGF5ZXIsICJkcmF3SW5DR0xDb250ZXh0IiwgIigpViIpOwotCi0gICAgam9iamVjdCBqYXZhTGF5ZXJMb2NhbFJlZiA9IFtzZWxmLmphdmFMYXllciBqT2JqZWN0V2l0aEVudjplbnZdOwotICAgIGlmICgoKmVudiktPklzU2FtZU9iamVjdChlbnYsIGphdmFMYXllckxvY2FsUmVmLCBOVUxMKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgLy8gU2V0IHRoZSBjdXJyZW50IGNvbnRleHQgdG8gdGhlIG9uZSBnaXZlbiB0byB1cy4KICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChnbENvbnRleHQpOwogCkBAIC0xNTAsNyArMTQxLDEyIEBACiAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKIAogICAgIGdsVmlld3BvcnQoMCwgMCwgdGV4dHVyZVdpZHRoLCB0ZXh0dXJlSGVpZ2h0KTsKKyAgICAKKyAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKKyAgICBzdGF0aWMgSk5GX0NMQVNTX0NBQ0hFKGpjX0phdmFMYXllciwgInN1bi9qYXZhMmQvb3BlbmdsL0NHTExheWVyIik7CisgICAgc3RhdGljIEpORl9NRU1CRVJfQ0FDSEUoam1fZHJhd0luQ0dMQ29udGV4dCwgamNfSmF2YUxheWVyLCAiZHJhd0luQ0dMQ29udGV4dCIsICIoKVYiKTsKIAorICAgIGpvYmplY3QgamF2YUxheWVyTG9jYWxSZWYgPSBbc2VsZi5qYXZhTGF5ZXIgak9iamVjdFdpdGhFbnY6ZW52XTsKICAgICBKTkZDYWxsVm9pZE1ldGhvZChlbnYsIGphdmFMYXllckxvY2FsUmVmLCBqbV9kcmF3SW5DR0xDb250ZXh0KTsKICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamF2YUxheWVyTG9jYWxSZWYpOwogCkBAIC0xNzUsNyArMTcxLDcgQEAKIAogSk5GX0NPQ09BX0VOVEVSKGVudik7CiAKLSAgICBKTkZXZWFrSk9iamVjdFdyYXBwZXIgKmphdmFMYXllciA9IFtKTkZXZWFrSk9iamVjdFdyYXBwZXIgd3JhcHBlcldpdGhKT2JqZWN0Om9iaiB3aXRoRW52OmVudl07CisgICAgSk5GSk9iamVjdFdyYXBwZXIgKmphdmFMYXllciA9IFtKTkZKT2JqZWN0V3JhcHBlciB3cmFwcGVyV2l0aEpPYmplY3Q6b2JqIHdpdGhFbnY6ZW52XTsKIAogICAgIFtUaHJlYWRVdGlsaXRpZXMgcGVyZm9ybU9uTWFpblRocmVhZFdhaXRpbmc6WUVTIGJsb2NrOl4oKXsKICAgICAgICAgICAgIEFXVF9BU1NFUlRfQVBQS0lUX1RIUkVBRDsKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vb3N4YXBwL05TQXBwbGljYXRpb25BV1QubSBiL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vb3N4YXBwL05TQXBwbGljYXRpb25BV1QubQppbmRleCBkMjI5ODNhLi41ZGY5OWE0IDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL29zeGFwcC9OU0FwcGxpY2F0aW9uQVdULm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9vc3hhcHAvTlNBcHBsaWNhdGlvbkFXVC5tCkBAIC0zNjMsNiArMzYzLDcgQEAKIHsKICAgICB2b2lkICheY29weSkoKSA9IFtibG9jayBjb3B5XTsKICAgICBOU0ludGVnZXIgZW5jb2RlID0gKE5TSW50ZWdlcikgY29weTsKKyAgICBbY29weSByZXRhaW5dOwogICAgIE5TQXV0b3JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07ICAgIAogICAgIE5TRXZlbnQqIGV2ZW50ID0gW05TRXZlbnQgb3RoZXJFdmVudFdpdGhUeXBlOiBOU0FwcGxpY2F0aW9uRGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBOU01ha2VQb2ludCgwLDApCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2JhY2svZGVidWdJbml0LmMgYi9qZGsvc3JjL3NoYXJlL2JhY2svZGVidWdJbml0LmMKaW5kZXggMzQ3NTM5Ny4uMjVmZmJmZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9iYWNrL2RlYnVnSW5pdC5jCisrKyBiL2pkay9zcmMvc2hhcmUvYmFjay9kZWJ1Z0luaXQuYwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIGF0ZXhpdF9maW5pc2hfbG9nZ2luZyh2b2lkKQogewogICAgIC8qIE5vcm1hbCBleGl0KDApIChub3QgX2V4aXQoKSkgbWF5IG9ubHkgcmVhY2ggaGVyZSAqLwotICAgIGZpbmlzaF9sb2dnaW5nKCk7ICAvKiBPbmx5IGZpcnN0IGNhbGwgbWF0dGVycyAqLworICAgIGZpbmlzaF9sb2dnaW5nKDApOyAgLyogT25seSBmaXJzdCBjYWxsIG1hdHRlcnMgKi8KIH0KIAogc3RhdGljIGpib29sZWFuCkBAIC0xMzAxLDQ5ICsxMzAxLDM5IEBACiB2b2lkCiBkZWJ1Z0luaXRfZXhpdChqdm10aUVycm9yIGVycm9yLCBjb25zdCBjaGFyICptc2cpCiB7Ci0gICAgZW51bSBleGl0X2NvZGVzIHsgRVhJVF9OT19FUlJPUlMgPSAwLCBFWElUX0pWTVRJX0VSUk9SID0gMSwgRVhJVF9UUkFOU1BPUlRfRVJST1IgPSAyIH07CisgICAgaW50IGV4aXRfY29kZSA9IDA7CiAKLSAgICAvLyBQcmVwYXJlIHRvIGV4aXQuIExvZyBlcnJvciBhbmQgZmluaXNoIGxvZ2dpbmcKLSAgICBMT0dfTUlTQygoIkV4aXRpbmcgd2l0aCBlcnJvciAlcyglZCk6ICVzIiwganZtdGlFcnJvclRleHQoZXJyb3IpLCBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtc2cgPT0gTlVMTCkgPyAiIiA6IG1zZykpKTsKLQotICAgIC8vIGNvcmVkdW1wIHJlcXVlc3RlZCBieSBjb21tYW5kIGxpbmUuIEtlZXAgSlZNVEkgZGF0YSBkaXJ0eQotICAgIGlmIChlcnJvciAhPSBKVk1USV9FUlJPUl9OT05FICYmIGRvY29yZWR1bXApIHsKLSAgICAgICAgTE9HX01JU0MoKCJEdW1waW5nIGNvcmUgYXMgcmVxdWVzdGVkIGJ5IGNvbW1hbmQgbGluZSIpKTsKLSAgICAgICAgZmluaXNoX2xvZ2dpbmcoKTsKLSAgICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgICBmaW5pc2hfbG9nZ2luZygpOwotCi0gICAgLy8gQ2xlYW51cCB0aGUgSlZNVEkgaWYgd2UgaGF2ZSBvbmUKLSAgICBpZiAoZ2RhdGEgIT0gTlVMTCkgewotICAgICAgICBnZGF0YS0+dm1EZWFkID0gSk5JX1RSVUU7Ci0gICAgICAgIGlmIChnZGF0YS0+anZtdGkgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gRGlzcG9zZSBvZiBqdm10aSAoZ2RhdGEtPmp2bXRpIGJlY29tZXMgTlVMTCkKLSAgICAgICAgICAgIGRpc3Bvc2VFbnZpcm9ubWVudChnZGF0YS0+anZtdGkpOworICAgIC8qIFBpY2sgYW4gZXJyb3IgY29kZSAqLworICAgIGlmICggZXJyb3IgIT0gSlZNVElfRVJST1JfTk9ORSApIHsKKyAgICAgICAgZXhpdF9jb2RlID0gMTsKKyAgICAgICAgaWYgKCBkb2NvcmVkdW1wICkgeworICAgICAgICAgICAgZmluaXNoX2xvZ2dpbmcoZXhpdF9jb2RlKTsKKyAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBXZSBhcmUgaGVyZSB3aXRoIG5vIGVycm9ycy4gS2lsbCBlbnRpcmUgcHJvY2VzcyBhbmQgZXhpdCB3aXRoIHplcm8gZXhpdCBjb2RlCi0gICAgaWYgKGVycm9yID09IEpWTVRJX0VSUk9SX05PTkUpIHsKLSAgICAgICAgZm9yY2VFeGl0KEVYSVRfTk9fRVJST1JTKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICggbXNnPT1OVUxMICkgeworICAgICAgICBtc2cgPSAiIjsKICAgICB9CiAKLSAgICAvLyBObyB0cmFuc3BvcnQgaW5pdGlsaXplZC4KLSAgICAvLyBBcyB3ZSBkb24ndCBoYXZlIGFueSBkZXRhaWxzIGhlcmUgZXhpdGluZyB3aXRoIHNlcGFyYXRlIGV4aXQgY29kZQotICAgIGlmIChlcnJvciA9PSBBR0VOVF9FUlJPUl9UUkFOU1BPUlRfSU5JVCkgewotICAgICAgICBmb3JjZUV4aXQoRVhJVF9UUkFOU1BPUlRfRVJST1IpOwotICAgICAgICByZXR1cm47CisgICAgTE9HX01JU0MoKCJFeGl0aW5nIHdpdGggZXJyb3IgJXMoJWQpOiAlcyIsIGp2bXRpRXJyb3JUZXh0KGVycm9yKSwgZXJyb3IsIG1zZykpOworCisgICAgZ2RhdGEtPnZtRGVhZCA9IEpOSV9UUlVFOworCisgICAgLyogTGV0J3MgdHJ5IGFuZCBjbGVhbnVwIHRoZSBKVk1USSwgaWYgd2UgZXZlbiBoYXZlIG9uZSAqLworICAgIGlmICggZ2RhdGEtPmp2bXRpICE9IE5VTEwgKSB7CisgICAgICAgIC8qIERpc3Bvc2Ugb2YganZtdGkgKGdkYXRhLT5qdm10aSBiZWNvbWVzIE5VTEwpICovCisgICAgICAgIGRpc3Bvc2VFbnZpcm9ubWVudChnZGF0YS0+anZtdGkpOwogICAgIH0KIAotICAgIC8vIFdlIGhhdmUgSlZNVEkgZXJyb3IuIENhbGwgaG90c3BvdCBqbmlfRmF0YWxFcnJvciBoYW5kbGVyCi0gICAgam5pRmF0YWxFcnJvcihOVUxMLCBtc2csIGVycm9yLCBFWElUX0pWTVRJX0VSUk9SKTsKKyAgICAvKiBGaW5pc2ggdXAgbG9nZ2luZy4gV2UgcmVhY2ggaGVyZSBpZiBKRFdQIGlzIGRvaW5nIHRoZSBleGl0aW5nLiAqLworICAgIGZpbmlzaF9sb2dnaW5nKGV4aXRfY29kZSk7ICAvKiBPbmx5IGZpcnN0IGNhbGwgbWF0dGVycyAqLwogCi0gICAgLy8gaG90c3BvdCBjYWxscyBvczphYm9ydCgpIHNvIHdlIHNob3VsZCBuZXZlciByZWFjaCBjb2RlIGJlbG93LAotICAgIC8vIGJ1dCBndWFyZCBhZ2FpbnN0IHBvc3NpYmxlIGhvdHNwb3QgY2hhbmdlcworICAgIC8qIExldCdzIGdpdmUgdGhlIEpOSSBhIEZhdGFsRXJyb3IgaWYgbm9uLWV4aXQgMCwgd2hpY2ggaXMgaGlzdG9yaWMgd2F5ICovCisgICAgaWYgKCBleGl0X2NvZGUgIT0gMCApIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgICAgICBqbmlGYXRhbEVycm9yKGVudiwgbXNnLCBlcnJvciwgZXhpdF9jb2RlKTsKKyAgICB9CiAKLSAgICAvLyBMYXN0IGNoYW5jZSB0byBkaWUsIHRoaXMga2lsbHMgdGhlIGVudGlyZSBwcm9jZXNzLgotICAgIGZvcmNlRXhpdChFWElUX0pWTVRJX0VSUk9SKTsKKyAgICAvKiBMYXN0IGNoYW5jZSB0byBkaWUsIHRoaXMga2lsbHMgdGhlIGVudGlyZSBwcm9jZXNzLiAqLworICAgIGZvcmNlRXhpdChleGl0X2NvZGUpOwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9iYWNrL2ludm9rZXIuYyBiL2pkay9zcmMvc2hhcmUvYmFjay9pbnZva2VyLmMKaW5kZXggYmQzMTZkYy4uY2QxY2QyZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9iYWNrL2ludm9rZXIuYworKysgYi9qZGsvc3JjL3NoYXJlL2JhY2svaW52b2tlci5jCkBAIC0yMTEsNjIgKzIxMSw2IEBACiAgICAgcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogRGVsZXRlIHNhdmVkIGdsb2JhbCByZWZlcmVuY2VzIC0gaWYgYW55IC0gZm9yOgotICogLSBhIHBvdGVudGlhbGx5IHRocm93biBFeGNlcHRpb24KLSAqIC0gYSByZXR1cm5lZCByZWZlcm5jZS9hcnJheSB2YWx1ZQotICogU2VlIGludm9rZXJfZG9JbnZva2UoKSBhbmQgaW52b2tlKiBtZXRob2RzIHdoZXJlIGdsb2JhbCByZWZlcmVuY2VzCi0gKiBhcmUgYmVpbmcgc2F2ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1kZWxldGVQb3RlbnRpYWxseVNhdmVkR2xvYmFsUmVmcyhKTklFbnYgKmVudiwgSW52b2tlUmVxdWVzdCAqcmVxdWVzdCkKLXsKLSAgICAvKiBEZWxldGUgcG90ZW50aWFsbHkgc2F2ZWQgcmV0dXJuIHZhbHVlICovCi0gICAgaWYgKChyZXF1ZXN0LT5pbnZva2VUeXBlID09IElOVk9LRV9DT05TVFJVQ1RPUikgfHwKLSAgICAgICAgKHJldHVyblR5cGVUYWcocmVxdWVzdC0+bWV0aG9kU2lnbmF0dXJlKSA9PSBKRFdQX1RBRyhPQkpFQ1QpKSB8fAotICAgICAgICAocmV0dXJuVHlwZVRhZyhyZXF1ZXN0LT5tZXRob2RTaWduYXR1cmUpID09IEpEV1BfVEFHKEFSUkFZKSkpIHsKLSAgICAgICAgaWYgKHJlcXVlc3QtPnJldHVyblZhbHVlLmwgIT0gTlVMTCkgewotICAgICAgICAgICAgdG9zc0dsb2JhbFJlZihlbnYsICYocmVxdWVzdC0+cmV0dXJuVmFsdWUubCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIERlbGV0ZSBwb3RlbnRpYWxseSBzYXZlZCBleGNlcHRpb24gKi8KLSAgICBpZiAocmVxdWVzdC0+ZXhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgdG9zc0dsb2JhbFJlZihlbnYsICYocmVxdWVzdC0+ZXhjZXB0aW9uKSk7Ci0gICAgfQotfQotCi0vKgotICogRGVsZXRlIGdsb2JhbCBhcmd1bWVudCByZWZlcmVuY2VzIGZyb20gdGhlIHJlcXVlc3Qgd2hpY2ggZ290IHB1dCB0aGVyZSBiZWZvcmUgYQotICogaW52b2tlIHJlcXVlc3Qgd2FzIGNhcnJpZWQgb3V0LiBTZWUgZmlsbEludm9rZVJlcXVlc3QoKS4KLSAqLwotc3RhdGljIHZvaWQKLWRlbGV0ZUdsb2JhbEFyZ3VtZW50UmVmcyhKTklFbnYgKmVudiwgSW52b2tlUmVxdWVzdCAqcmVxdWVzdCkKLXsKLSAgICB2b2lkICpjdXJzb3I7Ci0gICAgamludCBhcmdJbmRleCA9IDA7Ci0gICAganZhbHVlICphcmd1bWVudCA9IHJlcXVlc3QtPmFyZ3VtZW50czsKLSAgICBqYnl0ZSBhcmd1bWVudFRhZyA9IGZpcnN0QXJndW1lbnRUeXBlVGFnKHJlcXVlc3QtPm1ldGhvZFNpZ25hdHVyZSwgJmN1cnNvcik7Ci0KLSAgICBpZiAocmVxdWVzdC0+Y2xhenogIT0gTlVMTCkgewotICAgICAgICB0b3NzR2xvYmFsUmVmKGVudiwgJihyZXF1ZXN0LT5jbGF6eikpOwotICAgIH0KLSAgICBpZiAocmVxdWVzdC0+aW5zdGFuY2UgIT0gTlVMTCkgewotICAgICAgICB0b3NzR2xvYmFsUmVmKGVudiwgJihyZXF1ZXN0LT5pbnN0YW5jZSkpOwotICAgIH0KLSAgICAvKiBEZWxldGUgZ2xvYmFsIGFyZ3VtZW50IHJlZmVyZW5jZXMgKi8KLSAgICB3aGlsZSAoYXJnSW5kZXggPCByZXF1ZXN0LT5hcmd1bWVudENvdW50KSB7Ci0gICAgICAgIGlmICgoYXJndW1lbnRUYWcgPT0gSkRXUF9UQUcoT0JKRUNUKSkgfHwKLSAgICAgICAgICAgIChhcmd1bWVudFRhZyA9PSBKRFdQX1RBRyhBUlJBWSkpKSB7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQtPmwgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHRvc3NHbG9iYWxSZWYoZW52LCAmKGFyZ3VtZW50LT5sKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXJndW1lbnQrKzsKLSAgICAgICAgYXJnSW5kZXgrKzsKLSAgICAgICAgYXJndW1lbnRUYWcgPSBuZXh0QXJndW1lbnRUeXBlVGFnKCZjdXJzb3IpOwotICAgIH0KLX0KLQogc3RhdGljIGp2bXRpRXJyb3IKIGZpbGxJbnZva2VSZXF1ZXN0KEpOSUVudiAqZW52LCBJbnZva2VSZXF1ZXN0ICpyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgamJ5dGUgaW52b2tlVHlwZSwgamJ5dGUgb3B0aW9ucywgamludCBpZCwKQEAgLTM3Niw4ICszMjAsNiBAQAogaW52b2tlQ29uc3RydWN0b3IoSk5JRW52ICplbnYsIEludm9rZVJlcXVlc3QgKnJlcXVlc3QpCiB7CiAgICAgam9iamVjdCBvYmplY3Q7Ci0KLSAgICBKRElfQVNTRVJUX01TRyhyZXF1ZXN0LT5jbGF6eiwgIlJlcXVlc3QgY2xhenogbnVsbCIpOwogICAgIG9iamVjdCA9IEpOSV9GVU5DX1BUUihlbnYsTmV3T2JqZWN0QSkoZW52LCByZXF1ZXN0LT5jbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+YXJndW1lbnRzKTsKQEAgLTM5NCw3ICszMzYsNiBAQAogICAgICAgICBjYXNlIEpEV1BfVEFHKE9CSkVDVCk6CiAgICAgICAgIGNhc2UgSkRXUF9UQUcoQVJSQVkpOiB7CiAgICAgICAgICAgICBqb2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgIEpESV9BU1NFUlRfTVNHKHJlcXVlc3QtPmNsYXp6LCAiUmVxdWVzdCBjbGF6eiBudWxsIik7CiAgICAgICAgICAgICBvYmplY3QgPSBKTklfRlVOQ19QVFIoZW52LENhbGxTdGF0aWNPYmplY3RNZXRob2RBKShlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5jbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1ldGhvZCwKQEAgLTQ4Myw3ICs0MjQsNiBAQAogICAgICAgICBjYXNlIEpEV1BfVEFHKE9CSkVDVCk6CiAgICAgICAgIGNhc2UgSkRXUF9UQUcoQVJSQVkpOiB7CiAgICAgICAgICAgICBqb2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgIEpESV9BU1NFUlRfTVNHKHJlcXVlc3QtPmluc3RhbmNlLCAiUmVxdWVzdCBpbnN0YW5jZSBudWxsIik7CiAgICAgICAgICAgICBvYmplY3QgPSBKTklfRlVOQ19QVFIoZW52LENhbGxPYmplY3RNZXRob2RBKShlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1ldGhvZCwKQEAgLTU3MSw4ICs1MTEsNiBAQAogICAgICAgICBjYXNlIEpEV1BfVEFHKE9CSkVDVCk6CiAgICAgICAgIGNhc2UgSkRXUF9UQUcoQVJSQVkpOiB7CiAgICAgICAgICAgICBqb2JqZWN0IG9iamVjdDsKLSAgICAgICAgICAgIEpESV9BU1NFUlRfTVNHKHJlcXVlc3QtPmNsYXp6LCAiUmVxdWVzdCBjbGF6eiBudWxsIik7Ci0gICAgICAgICAgICBKRElfQVNTRVJUX01TRyhyZXF1ZXN0LT5pbnN0YW5jZSwgIlJlcXVlc3QgaW5zdGFuY2UgbnVsbCIpOwogICAgICAgICAgICAgb2JqZWN0ID0gSk5JX0ZVTkNfUFRSKGVudixDYWxsTm9udmlydHVhbE9iamVjdE1ldGhvZEEpKGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5jbGF6eiwKQEAgLTY2OSw4ICs2MDcsNiBAQAogICAgIEpOSUVudiAqZW52OwogICAgIGpib29sZWFuIHN0YXJ0Tm93OwogICAgIEludm9rZVJlcXVlc3QgKnJlcXVlc3Q7Ci0gICAgamJ5dGUgb3B0aW9uczsKLSAgICBqYnl0ZSBpbnZva2VUeXBlOwogCiAgICAgSkRJX0FTU0VSVCh0aHJlYWQpOwogCkBAIC02ODcsOSArNjIzLDYgQEAKICAgICBpZiAoc3RhcnROb3cpIHsKICAgICAgICAgcmVxdWVzdC0+c3RhcnRlZCA9IEpOSV9UUlVFOwogICAgIH0KLSAgICBvcHRpb25zID0gcmVxdWVzdC0+b3B0aW9uczsKLSAgICBpbnZva2VUeXBlID0gcmVxdWVzdC0+aW52b2tlVHlwZTsKLQogICAgIGRlYnVnTW9uaXRvckV4aXQoaW52b2tlckxvY2spOwogCiAgICAgaWYgKCFzdGFydE5vdykgewpAQCAtNzA0LDcgKzYzNyw3IEBACiAKICAgICAgICAgSk5JX0ZVTkNfUFRSKGVudixFeGNlcHRpb25DbGVhcikoZW52KTsKIAotICAgICAgICBzd2l0Y2ggKGludm9rZVR5cGUpIHsKKyAgICAgICAgc3dpdGNoIChyZXF1ZXN0LT5pbnZva2VUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIElOVk9LRV9DT05TVFJVQ1RPUjoKICAgICAgICAgICAgICAgICBpbnZva2VDb25zdHJ1Y3RvcihlbnYsIHJlcXVlc3QpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzEyLDcgKzY0NSw3IEBACiAgICAgICAgICAgICAgICAgaW52b2tlU3RhdGljKGVudiwgcmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIElOVk9LRV9JTlNUQU5DRToKLSAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyAmIEpEV1BfSU5WT0tFX09QVElPTlMoTk9OVklSVFVBTCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPm9wdGlvbnMgJiBKRFdQX0lOVk9LRV9PUFRJT05TKE5PTlZJUlRVQUwpICkgewogICAgICAgICAgICAgICAgICAgICBpbnZva2VOb252aXJ0dWFsKGVudiwgcmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW52b2tlVmlydHVhbChlbnYsIHJlcXVlc3QpOwpAQCAtNzkwLDIzICs3MjMsMTIgQEAKICAgICB9CiAKICAgICAvKgotICAgICAqIEF0IHRoaXMgdGltZSwgdGhlcmUncyBubyBuZWVkIHRvIHJldGFpbiBnbG9iYWwgcmVmZXJlbmNlcyBvbgotICAgICAqIGFyZ3VtZW50cyBzaW5jZSB0aGUgcmVwbHkgaXMgcHJvY2Vzc2VkLiBObyBvbmUgd2lsbCBkZWFsIHdpdGgKLSAgICAgKiB0aGlzIHJlcXVlc3QgSUQgYW55bW9yZSwgc28gd2UgbXVzdCBjYWxsIGRlbGV0ZUdsb2JhbEFyZ3VtZW50UmVmcygpLgotICAgICAqCi0gICAgICogV2UgY2Fubm90IGRlbGV0ZSBzYXZlZCBleGNlcHRpb24gb3IgcmV0dXJuIHZhbHVlIHJlZmVyZW5jZXMKLSAgICAgKiBzaW5jZSBvdGhlcndpc2UgYSBkZWxldGVkIGhhbmRsZSB3b3VsZCBlc2NhcGUgd2hlbiB3cml0aW5nCi0gICAgICogdGhlIHJlc3BvbnNlIHRvIHRoZSBzdHJlYW0uIEluc3RlYWQsIHdlIGNsZWFuIHRob3NlIHJlZnMgdXAKLSAgICAgKiBhZnRlciB3cml0aW5nIHRoZSByZXNwb25lLgotICAgICAqLwotICAgIGRlbGV0ZUdsb2JhbEFyZ3VtZW50UmVmcyhlbnYsIHJlcXVlc3QpOwotCi0gICAgLyoKICAgICAgKiBHaXZlIHVwIHRoZSBsb2NrIGJlZm9yZSBJL08gb3BlcmF0aW9uCiAgICAgICovCiAgICAgZGVidWdNb25pdG9yRXhpdChpbnZva2VyTG9jayk7CiAgICAgZXZlbnRIYW5kbGVyX3VubG9jaygpOwogCisKICAgICBpZiAoIWRldGFjaGVkKSB7CiAgICAgICAgIG91dFN0cmVhbV9pbml0UmVwbHkoJm91dCwgaWQpOwogICAgICAgICAodm9pZClvdXRTdHJlYW1fd3JpdGVWYWx1ZShlbnYsICZvdXQsIHRhZywgcmV0dXJuVmFsdWUpOwpAQCAtODE0LDE2ICs3MzYsNiBAQAogICAgICAgICAodm9pZClvdXRTdHJlYW1fd3JpdGVPYmplY3RSZWYoZW52LCAmb3V0LCBleGMpOwogICAgICAgICBvdXRTdHJlYW1fc2VuZFJlcGx5KCZvdXQpOwogICAgIH0KLQotICAgIC8qCi0gICAgICogRGVsZXRlIHBvdGVudGlhbGx5IHNhdmVkIGdsb2JhbCByZWZlcmVuY2VzIG9mIHJldHVybiB2YWx1ZQotICAgICAqIGFuZCBleGNlcHRpb24KLSAgICAgKi8KLSAgICBldmVudEhhbmRsZXJfbG9jaygpOyAvLyBmb3IgcHJvcGVyIGxvY2sgb3JkZXIKLSAgICBkZWJ1Z01vbml0b3JFbnRlcihpbnZva2VyTG9jayk7Ci0gICAgZGVsZXRlUG90ZW50aWFsbHlTYXZlZEdsb2JhbFJlZnMoZW52LCByZXF1ZXN0KTsKLSAgICBkZWJ1Z01vbml0b3JFeGl0KGludm9rZXJMb2NrKTsKLSAgICBldmVudEhhbmRsZXJfdW5sb2NrKCk7CiB9CiAKIGpib29sZWFuCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2JhY2svbG9nX21lc3NhZ2VzLmMgYi9qZGsvc3JjL3NoYXJlL2JhY2svbG9nX21lc3NhZ2VzLmMKaW5kZXggMzJiZWEyOS4uZGU4YjY5ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9iYWNrL2xvZ19tZXNzYWdlcy5jCisrKyBiL2pkay9zcmMvc2hhcmUvYmFjay9sb2dfbWVzc2FnZXMuYwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIC8qIEZpbmlzaCB1cCBsb2dnaW5nLCBmbHVzaCBvdXRwdXQgdG8gdGhlIGxvZ2ZpbGUuICovCiB2b2lkCi1maW5pc2hfbG9nZ2luZygpCitmaW5pc2hfbG9nZ2luZyhpbnQgZXhpdF9jb2RlKQogewogI2lmZGVmIEpEV1BfTE9HR0lORwogICAgIE1VVEVYX0xPQ0sobXlfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9iYWNrL2xvZ19tZXNzYWdlcy5oIGIvamRrL3NyYy9zaGFyZS9iYWNrL2xvZ19tZXNzYWdlcy5oCmluZGV4IDEyOWZhYjYuLjBhNDQyZTkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvYmFjay9sb2dfbWVzc2FnZXMuaAorKysgYi9qZGsvc3JjL3NoYXJlL2JhY2svbG9nX21lc3NhZ2VzLmgKQEAgLTI5LDcgKzI5LDcgQEAKIC8qIExPRzogTXVzdCBiZSBjYWxsZWQgbGlrZTogIExPR19jYXRlZ29yeSgoImFueXRoaW5nIikpIG9yIExPR19jYXRlZ29yeSgoZm9ybWF0LGFyZ3MpKSAqLwogCiB2b2lkIHNldHVwX2xvZ2dpbmcoY29uc3QgY2hhciAqLCB1bnNpZ25lZCk7Ci12b2lkIGZpbmlzaF9sb2dnaW5nKCk7Cit2b2lkIGZpbmlzaF9sb2dnaW5nKGludCk7CiAKICNkZWZpbmUgTE9HX05VTEwgKCh2b2lkKTApCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9BRVNDcnlwdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0FFU0NyeXB0LmphdmEKaW5kZXggYzg1ZjcxNS4uMTJmZmU4OSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0FFU0NyeXB0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0FFU0NyeXB0LmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gUk9VTkRTXzE0ID0gZmFsc2U7CiAKICAgICAvKiogU2Vzc2lvbiBhbmQgU3ViIGtleXMgKi8KLSAgICBwcml2YXRlIGludFtdW10gc2Vzc2lvbksgPSBudWxsOworICAgIHByaXZhdGUgT2JqZWN0W10gc2Vzc2lvbksgPSBudWxsOwogICAgIHByaXZhdGUgaW50W10gSyA9IG51bGw7CiAKICAgICAvKiogQ2lwaGVyIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBrZXkgKi8KQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHNldCBzdWIga2V5IHRvIHRoZSBjb3JyZXNwb25kaW5nIHNlc3Npb24gS2V5Ci0gICAgICAgIHRoaXMuSyA9IHNlc3Npb25LWyhkZWNyeXB0aW5nPyAxOjApXTsKKyAgICAgICAgdGhpcy5LID0gKGludFtdKSBzZXNzaW9uS1soZGVjcnlwdGluZz8gMTowKV07CiAgICAgfQogCiAgICAgLyoqCkBAIC02NjAsNyArNjYwLDcgQEAKICAgICAgICAgbGltaXQgPSBST1VORFMqNDsKIAogICAgICAgICAvLyBzdG9yZSB0aGUgZXhwYW5kZWQgc3ViIGtleXMgaW50byAnc2Vzc2lvbksnCi0gICAgICAgIHNlc3Npb25LID0gbmV3IGludFtdW10geyBleHBhbmRlZEtlLCBleHBhbmRlZEtkIH07CisgICAgICAgIHNlc3Npb25LID0gbmV3IE9iamVjdFtdIHsgZXhwYW5kZWRLZSwgZXhwYW5kZWRLZCB9OwogICAgIH0KIAogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyQmxvY2tDaGFpbmluZy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlckJsb2NrQ2hhaW5pbmcuamF2YQppbmRleCA1MTU0Nzg4Li41MWQ5NWMxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyQmxvY2tDaGFpbmluZy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXJCbG9ja0NoYWluaW5nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw4ICsyNiw2IEBACiBwYWNrYWdlIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247Ci0KIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgY2lwaGVycyBpbiBjaXBoZXIgYmxvY2sgY2hhaW5pbmcgKENCQykgbW9kZS4KQEAgLTEyNCwzMSArMTIyLDMxIEBACiAgICAgICoKICAgICAgKiA8cD5UaGUgaW5wdXQgcGxhaW4gdGV4dCA8Y29kZT5wbGFpbjwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+cGxhaW5PZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKLSAgICAgKiA8Y29kZT4ocGxhaW5PZmZzZXQgKyBwbGFpbkxlbiAtIDEpPC9jb2RlPiwgaXMgZW5jcnlwdGVkLgorICAgICAqIDxjb2RlPihwbGFpbk9mZnNldCArIGxlbiAtIDEpPC9jb2RlPiwgaXMgZW5jcnlwdGVkLgogICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPmNpcGhlcjwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPi4KICAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+cGxhaW5MZW48L2NvZGU+IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrIHNpemUsCisgICAgICogYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgogICAgICAqIEBwYXJhbSBwbGFpbiB0aGUgYnVmZmVyIHdpdGggdGhlIGlucHV0IGRhdGEgdG8gYmUgZW5jcnlwdGVkCiAgICAgICogQHBhcmFtIHBsYWluT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+cGxhaW48L2NvZGU+CiAgICAgICogQHBhcmFtIHBsYWluTGVuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKICAgICAgKiBAcGFyYW0gY2lwaGVyIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gY2lwaGVyT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gUHJvdmlkZXJFeGNlcHRpb24gaWYgPGNvZGU+bGVuPC9jb2RlPiBpcyBub3QKLSAgICAgKiBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplCiAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNyeXB0ZWQgZGF0YQogICAgICAqLwogICAgIGludCBlbmNyeXB0KGJ5dGVbXSBwbGFpbiwgaW50IHBsYWluT2Zmc2V0LCBpbnQgcGxhaW5MZW4sCiAgICAgICAgICAgICAgICAgYnl0ZVtdIGNpcGhlciwgaW50IGNpcGhlck9mZnNldCkKICAgICB7Ci0gICAgICAgIGlmICgocGxhaW5MZW4gJSBibG9ja1NpemUpICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gaW5wdXQgYnVmZmVyaW5nIik7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IGk7CiAgICAgICAgIGludCBlbmRJbmRleCA9IHBsYWluT2Zmc2V0ICsgcGxhaW5MZW47CiAKICAgICAgICAgZm9yICg7IHBsYWluT2Zmc2V0IDwgZW5kSW5kZXg7CiAgICAgICAgICAgICAgcGxhaW5PZmZzZXQrPWJsb2NrU2l6ZSwgY2lwaGVyT2Zmc2V0ICs9IGJsb2NrU2l6ZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGtbaV0gPSAoYnl0ZSkocGxhaW5baSArIHBsYWluT2Zmc2V0XSBeIHJbaV0pOworICAgICAgICAgICAgZm9yIChpPTA7IGk8YmxvY2tTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBrW2ldID0gKGJ5dGUpKHBsYWluW2krcGxhaW5PZmZzZXRdIF4gcltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2soaywgMCwgY2lwaGVyLCBjaXBoZXJPZmZzZXQpOwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjaXBoZXIsIGNpcGhlck9mZnNldCwgciwgMCwgYmxvY2tTaXplKTsKQEAgLTE2MSwxMCArMTU5LDE0IEBACiAgICAgICoKICAgICAgKiA8cD5UaGUgaW5wdXQgY2lwaGVyIHRleHQgPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKLSAgICAgKiA8Y29kZT4oY2lwaGVyT2Zmc2V0ICsgY2lwaGVyTGVuIC0gMSk8L2NvZGU+LCBpcyBkZWNyeXB0ZWQuCisgICAgICogPGNvZGU+KGNpcGhlck9mZnNldCArIGxlbiAtIDEpPC9jb2RlPiwgaXMgZGVjcnlwdGVkLgogICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4uCiAgICAgICoKKyAgICAgKiA8cD5JdCBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmNpcGhlckxlbjwvY29kZT4gaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW1iZWRkZWQgY2lwaGVyJ3MgYmxvY2sKKyAgICAgKiBzaXplLCBhcyBhbnkgZXhjZXNzIGJ5dGVzIGFyZSBpZ25vcmVkLgorICAgICAqCiAgICAgICogPHA+SXQgaXMgYWxzbyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAogICAgICAqIDxjb2RlPmluaXQ8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogICAgICAqIChUaGlzIGNoZWNrIGlzIG9taXR0ZWQgaGVyZSwgdG8gYXZvaWQgZG91YmxlIGNoZWNraW5nLikKQEAgLTE3NCwyMyArMTc2LDIzIEBACiAgICAgICogQHBhcmFtIGNpcGhlckxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCiAgICAgICogQHBhcmFtIHBsYWluIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gcGxhaW5PZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5wbGFpbjwvY29kZT4KLSAgICAgKiBAZXhjZXB0aW9uIFByb3ZpZGVyRXhjZXB0aW9uIGlmIDxjb2RlPmxlbjwvY29kZT4gaXMgbm90Ci0gICAgICogYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZQogICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZGVjcnlwdGVkIGRhdGEKKyAgICAgKgorICAgICAqIEBleGNlcHRpb24gSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiBpZiBpbnB1dCBkYXRhIHdob3NlIGxlbmd0aCBkb2VzCisgICAgICogbm90IGNvcnJlc3BvbmQgdG8gdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrIHNpemUgaXMgcGFzc2VkIHRvIHRoZQorICAgICAqIGVtYmVkZGVkIGNpcGhlcgogICAgICAqLwogICAgIGludCBkZWNyeXB0KGJ5dGVbXSBjaXBoZXIsIGludCBjaXBoZXJPZmZzZXQsIGludCBjaXBoZXJMZW4sCiAgICAgICAgICAgICAgICAgYnl0ZVtdIHBsYWluLCBpbnQgcGxhaW5PZmZzZXQpCiAgICAgewotICAgICAgICBpZiAoKGNpcGhlckxlbiAlIGJsb2NrU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBpbnB1dCBidWZmZXJpbmciKTsKLSAgICAgICAgfQorICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IGVuZEluZGV4ID0gY2lwaGVyT2Zmc2V0ICsgY2lwaGVyTGVuOwogCiAgICAgICAgIGZvciAoOyBjaXBoZXJPZmZzZXQgPCBlbmRJbmRleDsKICAgICAgICAgICAgICBjaXBoZXJPZmZzZXQgKz0gYmxvY2tTaXplLCBwbGFpbk9mZnNldCArPSBibG9ja1NpemUpIHsKICAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmRlY3J5cHRCbG9jayhjaXBoZXIsIGNpcGhlck9mZnNldCwgaywgMCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGxhaW5baSArIHBsYWluT2Zmc2V0XSA9IChieXRlKShrW2ldIF4gcltpXSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwbGFpbltpK3BsYWluT2Zmc2V0XSA9IChieXRlKShrW2ldIF4gcltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNpcGhlciwgY2lwaGVyT2Zmc2V0LCByLCAwLCBibG9ja1NpemUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyQ29yZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlckNvcmUuamF2YQppbmRleCA1OTJlYzQxLi43OWY2NmNkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyQ29yZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXJDb3JlLmphdmEKQEAgLTcxNyw3ICs3MTcsNyBAQAogICAgICAgICAgICAgbGVuIC09IGJsb2NrU2l6ZTsKICAgICAgICAgfQogICAgICAgICAvLyBkbyBub3QgY291bnQgdGhlIHRyYWlsaW5nIGJ5dGVzIHdoaWNoIGRvIG5vdCBtYWtlIHVwIGEgdW5pdAotICAgICAgICBsZW4gPSAobGVuID4gMCA/IChsZW4gLSAobGVuICUgdW5pdEJ5dGVzKSkgOiAwKTsKKyAgICAgICAgbGVuID0gKGxlbiA+IDAgPyAobGVuIC0gKGxlbiV1bml0Qnl0ZXMpKSA6IDApOwogCiAgICAgICAgIC8vIGNoZWNrIG91dHB1dCBidWZmZXIgY2FwYWNpdHkKICAgICAgICAgaWYgKChvdXRwdXQgPT0gbnVsbCkgfHwKQEAgLTcyOSwxNSArNzI5LDYgQEAKIAogICAgICAgICBpbnQgb3V0TGVuID0gMDsKICAgICAgICAgaWYgKGxlbiAhPSAwKSB7IC8vIHRoZXJlIGlzIHNvbWUgd29yayB0byBkbwotICAgICAgICAgICAgaWYgKChpbnB1dCA9PSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICYmIChvdXRwdXRPZmZzZXQgPCAoaW5wdXRPZmZzZXQgKyBpbnB1dExlbikpCi0gICAgICAgICAgICAgICAgICYmIChpbnB1dE9mZnNldCA8IChvdXRwdXRPZmZzZXQgKyBidWZmZXIubGVuZ3RoKSkpIHsKLSAgICAgICAgICAgICAgICAvLyBjb3B5ICdpbnB1dCcgb3V0IHRvIGF2b2lkIGl0cyBjb250ZW50IGJlaW5nCi0gICAgICAgICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgaW5wdXQgPSBBcnJheXMuY29weU9mUmFuZ2UoaW5wdXQsIGlucHV0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBpbnB1dE9mZnNldCArIGlucHV0TGVuKTsKLSAgICAgICAgICAgICAgICBpbnB1dE9mZnNldCA9IDA7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobGVuIDw9IGJ1ZmZlcmVkKSB7CiAgICAgICAgICAgICAgICAgLy8gYWxsIHRvLWJlLXByb2Nlc3NlZCBkYXRhIGFyZSBmcm9tICdidWZmZXInCiAgICAgICAgICAgICAgICAgaWYgKGRlY3J5cHRpbmcpIHsKQEAgLTc1MCw0MCArNzQxLDM3IEBACiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBsZW4sIGJ1ZmZlciwgMCwgYnVmZmVyZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGxlbiA+IGJ1ZmZlcmVkCi0gICAgICAgICAgICAgICAgaW50IGlucHV0Q29uc3VtZWQgPSBsZW4gLSBidWZmZXJlZDsKLSAgICAgICAgICAgICAgICBpbnQgdGVtcDsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJDYXBhY2l0eSA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckNhcGFjaXR5ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBNYXRoLm1pbihidWZmZXJDYXBhY2l0eSwgaW5wdXRDb25zdW1lZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5pdEJ5dGVzICE9IGJsb2NrU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgLT0gKChidWZmZXJlZCArIHRlbXApICUgdW5pdEJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaW5wdXQsIGlucHV0T2Zmc2V0LCBidWZmZXIsIGJ1ZmZlcmVkLCB0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0T2Zmc2V0ICs9IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENvbnN1bWVkIC09IHRlbXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dExlbiAtPSB0ZW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgKz0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzICdidWZmZXInCisgICAgICAgICAgICAgICAgaWYgKChpbnB1dCAhPSBvdXRwdXQpICYmIChidWZmZXJlZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdG8tYmUtcHJvY2Vzc2VkIGRhdGEgYXJlIGZyb20gJ2lucHV0JworICAgICAgICAgICAgICAgICAgICAvLyBob3dldmVyLCBub3RlIHRoYXQgaWYgJ2lucHV0JyBhbmQgJ291dHB1dCcgYXJlIHRoZSBzYW1lLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXkgY2FuJ3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSB1bmRlcmx5aW5nIGNpcGhlcgorICAgICAgICAgICAgICAgICAgICAvLyBlbmdpbmUgb3BlcmF0aW9ucyBhcyBkYXRhIG1heSBiZSBvdmVyd3JpdHRlbiBiZWZvcmUgdGhleQorICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcmVhZC4KICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY3J5cHRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRMZW4gPSBjaXBoZXIuZGVjcnlwdChidWZmZXIsIDAsIGJ1ZmZlcmVkLCBvdXRwdXQsIG91dHB1dE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRMZW4gPSBjaXBoZXIuZGVjcnlwdChpbnB1dCwgaW5wdXRPZmZzZXQsIGxlbiwgb3V0cHV0LCBvdXRwdXRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIG91dExlbiA9IGNpcGhlci5lbmNyeXB0KGJ1ZmZlciwgMCwgYnVmZmVyZWQsIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dExlbiA9IGNpcGhlci5lbmNyeXB0KGlucHV0LCBpbnB1dE9mZnNldCwgbGVuLCBvdXRwdXQsIG91dHB1dE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0T2Zmc2V0ICs9IG91dExlbjsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRDb25zdW1lZCA+IDApIHsgLy8gc3RpbGwgaGFzIGlucHV0IHRvIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRPZmZzZXQgKz0gbGVuOworICAgICAgICAgICAgICAgICAgICBpbnB1dExlbiAtPSBsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXNzZW1ibGUgdGhlIGRhdGEgdXNpbmcgYm90aCAnYnVmZmVyJyBhbmQgJ2lucHV0JworICAgICAgICAgICAgICAgICAgICBieXRlW10gaW4gPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5Db25zdW1lZCA9IGxlbiAtIGJ1ZmZlcmVkOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGluLCAwLCBidWZmZXJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluQ29uc3VtZWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShpbnB1dCwgaW5wdXRPZmZzZXQsIGluLCBsZW4gLSBpbkNvbnN1bWVkLCBpbkNvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0T2Zmc2V0ICs9IGluQ29uc3VtZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dExlbiAtPSBpbkNvbnN1bWVkOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNyeXB0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRMZW4gKz0gY2lwaGVyLmRlY3J5cHQoaW5wdXQsIGlucHV0T2Zmc2V0LCBpbnB1dENvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dExlbiA9IGNpcGhlci5kZWNyeXB0KGluLCAwLCBsZW4sIG91dHB1dCwgb3V0cHV0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dExlbiArPSBjaXBoZXIuZW5jcnlwdChpbnB1dCwgaW5wdXRPZmZzZXQsIGlucHV0Q29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBvdXRwdXRPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0TGVuID0gY2lwaGVyLmVuY3J5cHQoaW4sIDAsIGxlbiwgb3V0cHV0LCBvdXRwdXRPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0T2Zmc2V0ICs9IGlucHV0Q29uc3VtZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0TGVuIC09IGlucHV0Q29uc3VtZWQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTGV0J3Mga2VlcCB0cmFjayBvZiBob3cgbWFueSBieXRlcyBhcmUgbmVlZGVkIHRvIG1ha2UKQEAgLTk0NiwxMCArOTM0LDggQEAKICAgICAgICAgYnl0ZVtdIGZpbmFsQnVmID0gaW5wdXQ7CiAgICAgICAgIGludCBmaW5hbE9mZnNldCA9IGlucHV0T2Zmc2V0OwogICAgICAgICBpbnQgZmluYWxCdWZMZW4gPSBpbnB1dExlbjsKLSAgICAgICAgaWYgKChidWZmZXJlZCAhPSAwKSB8fCAoIWRlY3J5cHRpbmcgJiYgcGFkZGluZyAhPSBudWxsKSB8fAotICAgICAgICAgICAgKChpbnB1dCA9PSBvdXRwdXQpCi0gICAgICAgICAgICAgICYmIChvdXRwdXRPZmZzZXQgPCAoaW5wdXRPZmZzZXQgKyBpbnB1dExlbikpCi0gICAgICAgICAgICAgICYmIChpbnB1dE9mZnNldCA8IChvdXRwdXRPZmZzZXQgKyBidWZmZXIubGVuZ3RoKSkpKSB7CisgICAgICAgIGlmICgoaW5wdXQgPT0gb3V0cHV0KSB8fCAoYnVmZmVyZWQgIT0gMCkgfHwKKyAgICAgICAgICAgICghZGVjcnlwdGluZyAmJiBwYWRkaW5nICE9IG51bGwpKSB7CiAgICAgICAgICAgICBpZiAoZGVjcnlwdGluZyB8fCBwYWRkaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBwYWRkaW5nTGVuID0gMDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXJGZWVkYmFjay5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlckZlZWRiYWNrLmphdmEKaW5kZXggODRiNTI3ZS4uZjhlNjExNSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlckZlZWRiYWNrLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlckZlZWRiYWNrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGNpcGhlcnMgaW4gY2lwaGVyLWZlZWRiYWNrIChDRkIpIG1vZGUuCkBAIC0xMzQsNzIgKzEzMyw2NiBAQAogICAgICAqCiAgICAgICogPHA+VGhlIGlucHV0IHBsYWluIHRleHQgPGNvZGU+cGxhaW48L2NvZGU+LCBzdGFydGluZyBhdAogICAgICAqIDxjb2RlPnBsYWluT2Zmc2V0PC9jb2RlPiBhbmQgZW5kaW5nIGF0Ci0gICAgICogPGNvZGU+KHBsYWluT2Zmc2V0ICsgcGxhaW5MZW4gLSAxKTwvY29kZT4sIGlzIGVuY3J5cHRlZC4KKyAgICAgKiA8Y29kZT4ocGxhaW5PZmZzZXQgKyBsZW4gLSAxKTwvY29kZT4sIGlzIGVuY3J5cHRlZC4KICAgICAgKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiA8Y29kZT5jaXBoZXI8L2NvZGU+LCBzdGFydGluZyBhdAogICAgICAqIDxjb2RlPmNpcGhlck9mZnNldDwvY29kZT4uCiAgICAgICoKKyAgICAgKiA8cD5JdCBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPnBsYWluTGVuPC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIHRoZSBzdHJlYW0gdW5pdCBzaXplCisgICAgICogPGNvZGU+bnVtQnl0ZXM8L2NvZGU+LCBhcyBhbnkgZXhjZXNzIGJ5dGVzIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmluaXQ8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIChUaGlzIGNoZWNrIGlzIG9taXR0ZWQgaGVyZSwgdG8gYXZvaWQgZG91YmxlIGNoZWNraW5nLikKKyAgICAgKgogICAgICAqIEBwYXJhbSBwbGFpbiB0aGUgYnVmZmVyIHdpdGggdGhlIGlucHV0IGRhdGEgdG8gYmUgZW5jcnlwdGVkCiAgICAgICogQHBhcmFtIHBsYWluT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+cGxhaW48L2NvZGU+CiAgICAgICogQHBhcmFtIHBsYWluTGVuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKICAgICAgKiBAcGFyYW0gY2lwaGVyIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gY2lwaGVyT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gUHJvdmlkZXJFeGNlcHRpb24gaWYgPGNvZGU+cGxhaW5MZW48L2NvZGU+IGlzIG5vdAotICAgICAqIGEgbXVsdGlwbGUgb2YgdGhlIDxjb2RlPm51bUJ5dGVzPC9jb2RlPgogICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZW5jcnlwdGVkIGRhdGEKICAgICAgKi8KICAgICBpbnQgZW5jcnlwdChieXRlW10gcGxhaW4sIGludCBwbGFpbk9mZnNldCwgaW50IHBsYWluTGVuLAotICAgICAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXIsIGludCBjaXBoZXJPZmZzZXQpIHsKLSAgICAgICAgaWYgKChwbGFpbkxlbiAlIG51bUJ5dGVzKSAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGlucHV0IGJ1ZmZlcmluZyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5TaGlmdCA9IGJsb2NrU2l6ZSAtIG51bUJ5dGVzOworICAgICAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXIsIGludCBjaXBoZXJPZmZzZXQpCisgICAgeworICAgICAgICBpbnQgaSwgbGVuOworICAgICAgICBsZW4gPSBibG9ja1NpemUgLSBudW1CeXRlczsKICAgICAgICAgaW50IGxvb3BDb3VudCA9IHBsYWluTGVuIC8gbnVtQnl0ZXM7Ci0KLSAgICAgICAgZm9yICg7IGxvb3BDb3VudCA+IDAgOwotICAgICAgICAgICAgIHBsYWluT2Zmc2V0ICs9IG51bUJ5dGVzLCBjaXBoZXJPZmZzZXQgKz0gbnVtQnl0ZXMsCi0gICAgICAgICAgICAgbG9vcENvdW50LS0pIHsKLSAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmVuY3J5cHRCbG9jayhyZWdpc3RlciwgMCwgaywgMCk7Ci0gICAgICAgICAgICBpZiAoblNoaWZ0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlZ2lzdGVyLCBudW1CeXRlcywgcmVnaXN0ZXIsIDAsIG5TaGlmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ5dGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWdpc3RlcltuU2hpZnQgKyBpXSA9IGNpcGhlcltpICsgY2lwaGVyT2Zmc2V0XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkoa1tpXSBeIHBsYWluW2kgKyBwbGFpbk9mZnNldF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwbGFpbkxlbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgbGFzdCBlbmNyeXB0aW9uIG9wZXJhdGlvbi4KLSAgICAgKgotICAgICAqIDxwPlRoZSBpbnB1dCBwbGFpbiB0ZXh0IDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4gYW5kIGVuZGluZyBhdAotICAgICAqIDxjb2RlPihwbGFpbk9mZnNldCArIHBsYWluTGVuIC0gMSk8L2NvZGU+LCBpcyBlbmNyeXB0ZWQuCi0gICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+LgotICAgICAqCi0gICAgICogQHBhcmFtIHBsYWluIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBlbmNyeXB0ZWQKLSAgICAgKiBAcGFyYW0gcGxhaW5PZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5wbGFpbjwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGxhaW5MZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQotICAgICAqIEBwYXJhbSBjaXBoZXIgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdAotICAgICAqIEBwYXJhbSBjaXBoZXJPZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXI8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbnRvIDxjb2RlPmNpcGhlcjwvY29kZT4KLSAgICAgKi8KLSAgICBpbnQgZW5jcnlwdEZpbmFsKGJ5dGVbXSBwbGFpbiwgaW50IHBsYWluT2Zmc2V0LCBpbnQgcGxhaW5MZW4sCi0gICAgICAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0KSB7Ci0KICAgICAgICAgaW50IG9kZEJ5dGVzID0gcGxhaW5MZW4gJSBudW1CeXRlczsKLSAgICAgICAgaW50IGxlbiA9IGVuY3J5cHQocGxhaW4sIHBsYWluT2Zmc2V0LCAocGxhaW5MZW4gLSBvZGRCeXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlciwgY2lwaGVyT2Zmc2V0KTsKLSAgICAgICAgcGxhaW5PZmZzZXQgKz0gbGVuOwotICAgICAgICBjaXBoZXJPZmZzZXQgKz0gbGVuOwotICAgICAgICBpZiAob2RkQnl0ZXMgIT0gMCkgewotICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2RkQnl0ZXM7IGkrKykgewotICAgICAgICAgICAgICAgICBjaXBoZXJbaSArIGNpcGhlck9mZnNldF0gPQotICAgICAgICAgICAgICAgICAgICAoYnl0ZSkoa1tpXSBeIHBsYWluW2kgKyBwbGFpbk9mZnNldF0pOworCisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgZm9yICg7IGxvb3BDb3VudCA+IDAgOworICAgICAgICAgICAgICAgICBwbGFpbk9mZnNldCArPSBudW1CeXRlcywgY2lwaGVyT2Zmc2V0ICs9IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICBsb29wQ291bnQtLSkgeworICAgICAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmVuY3J5cHRCbG9jayhyZWdpc3RlciwgMCwgaywgMCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICByZWdpc3RlcltpXSA9IGNpcGhlcltpK2NpcGhlck9mZnNldF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKGtbaV0gXiBwbGFpbltpK3BsYWluT2Zmc2V0XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2RkQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxvZGRCeXRlczsgaSsrKQorICAgICAgICAgICAgICAgICAgICByZWdpc3RlcltpXSA9IGNpcGhlcltpK2NpcGhlck9mZnNldF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKGtbaV0gXiBwbGFpbltpK3BsYWluT2Zmc2V0XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKDsgbG9vcENvdW50ID4gMCA7CisgICAgICAgICAgICAgICAgIHBsYWluT2Zmc2V0ICs9IG51bUJ5dGVzLCBjaXBoZXJPZmZzZXQgKz0gbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgIGxvb3BDb3VudC0tKSB7CisgICAgICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlZ2lzdGVyLCBudW1CeXRlcywgcmVnaXN0ZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bnVtQnl0ZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJbaStsZW5dID0gY2lwaGVyW2krY2lwaGVyT2Zmc2V0XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkoa1tpXSBeIHBsYWluW2krcGxhaW5PZmZzZXRdKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9kZEJ5dGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVnaXN0ZXIsIG51bUJ5dGVzLCByZWdpc3RlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxvZGRCeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyW2krbGVuXSA9IGNpcGhlcltpK2NpcGhlck9mZnNldF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKGtbaV0gXiBwbGFpbltpK3BsYWluT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwbGFpbkxlbjsKQEAgLTIxMCw3MyArMjAzLDcyIEBACiAgICAgICoKICAgICAgKiA8cD5UaGUgaW5wdXQgY2lwaGVyIHRleHQgPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKLSAgICAgKiA8Y29kZT4oY2lwaGVyT2Zmc2V0ICsgY2lwaGVyTGVuIC0gMSk8L2NvZGU+LCBpcyBkZWNyeXB0ZWQuCisgICAgICogPGNvZGU+KGNpcGhlck9mZnNldCArIGxlbiAtIDEpPC9jb2RlPiwgaXMgZGVjcnlwdGVkLgogICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4uCiAgICAgICoKKyAgICAgKiA8cD5JdCBpcyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmNpcGhlckxlbjwvY29kZT4gaXMgYSBtdWx0aXBsZSBvZiB0aGUgc3RyZWFtIHVuaXQgc2l6ZQorICAgICAqIDxjb2RlPm51bUJ5dGVzPC9jb2RlPiwgYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIGFsc28gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5pbml0PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiAoVGhpcyBjaGVjayBpcyBvbWl0dGVkIGhlcmUsIHRvIGF2b2lkIGRvdWJsZSBjaGVja2luZy4pCisgICAgICoKICAgICAgKiBAcGFyYW0gY2lwaGVyIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBkZWNyeXB0ZWQKICAgICAgKiBAcGFyYW0gY2lwaGVyT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPgogICAgICAqIEBwYXJhbSBjaXBoZXJMZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQogICAgICAqIEBwYXJhbSBwbGFpbiB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAgICAgICogQHBhcmFtIHBsYWluT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+cGxhaW48L2NvZGU+Ci0gICAgICogQGV4Y2VwdGlvbiBQcm92aWRlckV4Y2VwdGlvbiBpZiA8Y29kZT5jaXBoZXJMZW48L2NvZGU+IGlzIG5vdAotICAgICAqIGEgbXVsdGlwbGUgb2YgdGhlIDxjb2RlPm51bUJ5dGVzPC9jb2RlPgogICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZGVjcnlwdGVkIGRhdGEKICAgICAgKi8KICAgICBpbnQgZGVjcnlwdChieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0LCBpbnQgY2lwaGVyTGVuLAotICAgICAgICAgICAgICAgIGJ5dGVbXSBwbGFpbiwgaW50IHBsYWluT2Zmc2V0KSB7Ci0gICAgICAgIGlmICgoY2lwaGVyTGVuICUgbnVtQnl0ZXMpICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gaW5wdXQgYnVmZmVyaW5nIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgblNoaWZ0ID0gYmxvY2tTaXplIC0gbnVtQnl0ZXM7CisgICAgICAgICAgICAgICAgYnl0ZVtdIHBsYWluLCBpbnQgcGxhaW5PZmZzZXQpCisgICAgeworICAgICAgICBpbnQgaSwgbGVuOworICAgICAgICBsZW4gPSBibG9ja1NpemUgLSBudW1CeXRlczsKICAgICAgICAgaW50IGxvb3BDb3VudCA9IGNpcGhlckxlbiAvIG51bUJ5dGVzOwotCi0gICAgICAgIGZvciAoOyBsb29wQ291bnQgPiAwOwotICAgICAgICAgICAgIHBsYWluT2Zmc2V0ICs9IG51bUJ5dGVzLCBjaXBoZXJPZmZzZXQgKz0gbnVtQnl0ZXMsCi0gICAgICAgICAgICAgbG9vcENvdW50LS0pIHsKLSAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmVuY3J5cHRCbG9jayhyZWdpc3RlciwgMCwgaywgMCk7Ci0gICAgICAgICAgICBpZiAoblNoaWZ0ICE9IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHJlZ2lzdGVyLCBudW1CeXRlcywgcmVnaXN0ZXIsIDAsIG5TaGlmdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ5dGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZWdpc3RlcltpICsgblNoaWZ0XSA9IGNpcGhlcltpICsgY2lwaGVyT2Zmc2V0XTsKLSAgICAgICAgICAgICAgICBwbGFpbltpICsgcGxhaW5PZmZzZXRdCi0gICAgICAgICAgICAgICAgICAgID0gKGJ5dGUpKGNpcGhlcltpICsgY2lwaGVyT2Zmc2V0XSBeIGtbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaXBoZXJMZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdGhlIGxhc3QgZGVjcnlwdGlvbiBvcGVyYXRpb24uCi0gICAgICoKLSAgICAgKiA8cD5UaGUgaW5wdXQgY2lwaGVyIHRleHQgPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKLSAgICAgKiA8Y29kZT4oY2lwaGVyT2Zmc2V0ICsgY2lwaGVyTGVuIC0gMSk8L2NvZGU+LCBpcyBkZWNyeXB0ZWQuCi0gICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+cGxhaW48L2NvZGU+LCBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPnBsYWluT2Zmc2V0PC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjaXBoZXIgdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGRlY3J5cHRlZAotICAgICAqIEBwYXJhbSBjaXBoZXJPZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+Ci0gICAgICogQHBhcmFtIGNpcGhlckxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCi0gICAgICogQHBhcmFtIHBsYWluIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKLSAgICAgKiBAcGFyYW0gcGxhaW5PZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5wbGFpbjwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRlY3J5cHRlZCBkYXRhCi0gICAgICovCi0gICAgaW50IGRlY3J5cHRGaW5hbChieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0LCBpbnQgY2lwaGVyTGVuLAotICAgICAgICAgICAgICAgIGJ5dGVbXSBwbGFpbiwgaW50IHBsYWluT2Zmc2V0KSB7Ci0KICAgICAgICAgaW50IG9kZEJ5dGVzID0gY2lwaGVyTGVuICUgbnVtQnl0ZXM7Ci0gICAgICAgIGludCBsZW4gPSBkZWNyeXB0KGNpcGhlciwgY2lwaGVyT2Zmc2V0LCAoY2lwaGVyTGVuIC0gb2RkQnl0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbiwgcGxhaW5PZmZzZXQpOwotICAgICAgICBjaXBoZXJPZmZzZXQgKz0gbGVuOwotICAgICAgICBwbGFpbk9mZnNldCArPSBsZW47Ci0gICAgICAgIGlmIChvZGRCeXRlcyAhPSAwKSB7Ci0gICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvZGRCeXRlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGxhaW5baSArIHBsYWluT2Zmc2V0XQotICAgICAgICAgICAgICAgICAgICA9IChieXRlKShjaXBoZXJbaSArIGNpcGhlck9mZnNldF0gXiBrW2ldKTsKKworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIGZvciAoOyBsb29wQ291bnQgPiAwOworICAgICAgICAgICAgICAgICBwbGFpbk9mZnNldCArPSBudW1CeXRlcywgY2lwaGVyT2Zmc2V0ICs9IG51bUJ5dGVzLAorICAgICAgICAgICAgICAgICBsb29wQ291bnQtLSkgeworICAgICAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmVuY3J5cHRCbG9jayhyZWdpc3RlciwgMCwgaywgMCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyW2ldID0gY2lwaGVyW2krY2lwaGVyT2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5baStwbGFpbk9mZnNldF0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gKGJ5dGUpKGNpcGhlcltpK2NpcGhlck9mZnNldF0gXiBrW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2RkQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxvZGRCeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyW2ldID0gY2lwaGVyW2krY2lwaGVyT2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5baStwbGFpbk9mZnNldF0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gKGJ5dGUpKGNpcGhlcltpK2NpcGhlck9mZnNldF0gXiBrW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKDsgbG9vcENvdW50ID4gMDsKKyAgICAgICAgICAgICAgICAgcGxhaW5PZmZzZXQgKz0gbnVtQnl0ZXMsIGNpcGhlck9mZnNldCArPSBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgbG9vcENvdW50LS0pIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVnaXN0ZXIsIG51bUJ5dGVzLCByZWdpc3RlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxudW1CeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyW2krbGVuXSA9IGNpcGhlcltpK2NpcGhlck9mZnNldF07CisgICAgICAgICAgICAgICAgICAgIHBsYWluW2krcGxhaW5PZmZzZXRdCisgICAgICAgICAgICAgICAgICAgICAgICA9IChieXRlKShjaXBoZXJbaStjaXBoZXJPZmZzZXRdIF4ga1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9kZEJ5dGVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVnaXN0ZXIsIG51bUJ5dGVzLCByZWdpc3RlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxvZGRCeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyW2krbGVuXSA9IGNpcGhlcltpK2NpcGhlck9mZnNldF07CisgICAgICAgICAgICAgICAgICAgIHBsYWluW2krcGxhaW5PZmZzZXRdCisgICAgICAgICAgICAgICAgICAgICAgICA9IChieXRlKShjaXBoZXJbaStjaXBoZXJPZmZzZXRdIF4ga1tpXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjaXBoZXJMZW47CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ291bnRlck1vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9Db3VudGVyTW9kZS5qYXZhCmluZGV4IGFmNTJiZDcuLjQzODk5OGUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9Db3VudGVyTW9kZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9Db3VudGVyTW9kZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMzEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNyw3ICsyNyw2IEBACiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CiAKLQogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgY2lwaGVycyBpbiBjb3VudGVyIChDVFIpIG1vZGUuCiAgKgpAQCAtMTM3LDYgKzEzNiwxNCBAQAogICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPmNpcGhlcjwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPi4KICAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+cGxhaW5MZW48L2NvZGU+IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrIHNpemUsCisgICAgICogYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIGFsc28gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5pbml0PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiAoVGhpcyBjaGVjayBpcyBvbWl0dGVkIGhlcmUsIHRvIGF2b2lkIGRvdWJsZSBjaGVja2luZy4pCisgICAgICoKICAgICAgKiBAcGFyYW0gaW4gdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGVuY3J5cHRlZAogICAgICAqIEBwYXJhbSBpbk9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgogICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQpAQCAtMTQ4LDcgKzE1NSwzMCBAQAogICAgICAgICByZXR1cm4gY3J5cHQoaW4sIGluT2ZmLCBsZW4sIG91dCwgb3V0T2ZmKTsKICAgICB9CiAKLSAgICAvLyBDVFIgZW5jcnlwdCBhbmQgZGVjcnlwdCBhcmUgaWRlbnRpY2FsCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgZGVjcnlwdGlvbiBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiA8cD5UaGUgaW5wdXQgY2lwaGVyIHRleHQgPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKKyAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKKyAgICAgKiA8Y29kZT4oY2lwaGVyT2Zmc2V0ICsgbGVuIC0gMSk8L2NvZGU+LCBpcyBkZWNyeXB0ZWQuCisgICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+cGxhaW48L2NvZGU+LCBzdGFydGluZyBhdAorICAgICAqIDxjb2RlPnBsYWluT2Zmc2V0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+Y2lwaGVyTGVuPC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbWJlZGRlZCBjaXBoZXIncyBibG9jaworICAgICAqIHNpemUsIGFzIGFueSBleGNlc3MgYnl0ZXMgYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD5JdCBpcyBhbHNvIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+aW5pdDwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogKFRoaXMgY2hlY2sgaXMgb21pdHRlZCBoZXJlLCB0byBhdm9pZCBkb3VibGUgY2hlY2tpbmcuKQorICAgICAqCisgICAgICogQHBhcmFtIGluIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBkZWNyeXB0ZWQKKyAgICAgKiBAcGFyYW0gaW5PZmYgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+CisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgICAgICogQHBhcmFtIG91dCB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CisgICAgICogQHBhcmFtIG91dE9mZiB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZGVjcnlwdGVkIGRhdGEKKyAgICAgKi8KICAgICBpbnQgZGVjcnlwdChieXRlW10gaW4sIGludCBpbk9mZiwgaW50IGxlbiwgYnl0ZVtdIG91dCwgaW50IG91dE9mZikgewogICAgICAgICByZXR1cm4gY3J5cHQoaW4sIGluT2ZmLCBsZW4sIG91dCwgb3V0T2ZmKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvREhLZXlQYWlyR2VuZXJhdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvREhLZXlQYWlyR2VuZXJhdG9yLmphdmEKaW5kZXggYmQyYmE2Zi4uYzcxZDZhYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0RIS2V5UGFpckdlbmVyYXRvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9ESEtleVBhaXJHZW5lcmF0b3IuamF2YQpAQCAtNzEsMTcgKzcxLDYgQEAKICAgICAgICAgaW5pdGlhbGl6ZSgxMDI0LCBudWxsKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrS2V5U2l6ZShpbnQga2V5c2l6ZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoKGtleXNpemUgPCA1MTIpIHx8IChrZXlzaXplID4gMjA0OCkgfHwgKChrZXlzaXplICYgMHgzRikgIT0gMCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiREgga2V5IHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiA2NCwgYW5kIGNhbiBvbmx5IHJhbmdlICIgKwotICAgICAgICAgICAgICAgICAgICAiZnJvbSA1MTIgdG8gMjA0OCAoaW5jbHVzaXZlKS4gIiArCi0gICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWMga2V5IHNpemUgIiArIGtleXNpemUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIEluaXRpYWxpemVzIHRoaXMga2V5IHBhaXIgZ2VuZXJhdG9yIGZvciBhIGNlcnRhaW4ga2V5c2l6ZSBhbmQgc291cmNlIG9mCiAgICAgICogcmFuZG9tbmVzcy4KQEAgLTkxLDggKzgwLDEyIEBACiAgICAgICogQHBhcmFtIHJhbmRvbSB0aGUgc291cmNlIG9mIHJhbmRvbW5lc3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGludCBrZXlzaXplLCBTZWN1cmVSYW5kb20gcmFuZG9tKSB7Ci0gICAgICAgIGNoZWNrS2V5U2l6ZShrZXlzaXplKTsKLQorICAgICAgICBpZiAoKGtleXNpemUgPCA1MTIpIHx8IChrZXlzaXplID4gMjA0OCkgfHwgKGtleXNpemUgJSA2NCAhPSAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oIktleXNpemUgbXVzdCBiZSBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvZiA2NCwgYW5kIGNhbiBvbmx5IHJhbmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gNTEyIHRvIDIwNDggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKGluY2x1c2l2ZSkiKTsKKyAgICAgICAgfQogICAgICAgICB0aGlzLnBTaXplID0ga2V5c2l6ZTsKICAgICAgICAgdGhpcy5sU2l6ZSA9IDA7CiAgICAgICAgIHRoaXMucmFuZG9tID0gcmFuZG9tOwpAQCAtMTIyLDEwICsxMTUsMTEgQEAKIAogICAgICAgICBwYXJhbXMgPSAoREhQYXJhbWV0ZXJTcGVjKWFsZ1BhcmFtczsKICAgICAgICAgcFNpemUgPSBwYXJhbXMuZ2V0UCgpLmJpdExlbmd0aCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY2hlY2tLZXlTaXplKHBTaXplKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBpcGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKGlwZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBpZiAoKHBTaXplIDwgNTEyKSB8fCAocFNpemUgPiAyMDQ4KSB8fAorICAgICAgICAgICAgKHBTaXplICUgNjQgIT0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgKCJQcmltZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgNjQsIGFuZCBjYW4gb25seSByYW5nZSAiCisgICAgICAgICAgICAgICAgICsgImZyb20gNTEyIHRvIDIwNDggKGluY2x1c2l2ZSkiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGV4cG9uZW50IHNpemUgaXMgb3B0aW9uYWwsIGNvdWxkIGJlIDAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9ESFBhcmFtZXRlckdlbmVyYXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0RIUGFyYW1ldGVyR2VuZXJhdG9yLmphdmEKaW5kZXggOTJkNGY2Zi4uYTEyZTk0NSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0RIUGFyYW1ldGVyR2VuZXJhdG9yLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0RIUGFyYW1ldGVyR2VuZXJhdG9yLmphdmEKQEAgLTU5LDEzICs1OSwxMiBAQAogICAgIHByaXZhdGUgU2VjdXJlUmFuZG9tIHJhbmRvbSA9IG51bGw7CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrS2V5U2l6ZShpbnQga2V5c2l6ZSkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUGFyYW1ldGVyRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICgoa2V5c2l6ZSAhPSAyMDQ4KSAmJgorICAgICAgICB0aHJvd3MgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoa2V5c2l6ZSAhPSAyMDQ4KSAmJgogICAgICAgICAgICAgKChrZXlzaXplIDwgNTEyKSB8fCAoa2V5c2l6ZSA+IDEwMjQpIHx8IChrZXlzaXplICUgNjQgIT0gMCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkRIIGtleSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgNjQgYW5kIHJhbmdlICIgKwotICAgICAgICAgICAgICAgICAgICAiZnJvbSA1MTIgdG8gMTAyNCAoaW5jbHVzaXZlKSwgb3IgMjA0OC4gIiArCi0gICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWMga2V5IHNpemUgIiArIGtleXNpemUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJLZXlzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgNjQgcmFuZ2luZyBmcm9tICIKKyAgICAgICAgICAgICAgICArICI1MTIgdG8gMTAyNCAoaW5jbHVzaXZlKSwgb3IgMjA0OCIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03OSw3ICs3OCwxMSBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoaW50IGtleXNpemUsIFNlY3VyZVJhbmRvbSByYW5kb20pIHsKICAgICAgICAgLy8gUmUtdXNlcyBEU0EgcGFyYW1ldGVycyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIHJhbmdlCi0gICAgICAgIGNoZWNrS2V5U2l6ZShrZXlzaXplKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoZWNrS2V5U2l6ZShrZXlzaXplKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQogICAgICAgICB0aGlzLnByaW1lU2l6ZSA9IGtleXNpemU7CiAgICAgICAgIHRoaXMucmFuZG9tID0gcmFuZG9tOwogICAgIH0KQEAgLTEwOCwxMSArMTExLDcgQEAKICAgICAgICAgcHJpbWVTaXplID0gZGhQYXJhbVNwZWMuZ2V0UHJpbWVTaXplKCk7CiAKICAgICAgICAgLy8gUmUtdXNlcyBEU0EgcGFyYW1ldGVycyBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIHJhbmdlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGVja0tleVNpemUocHJpbWVTaXplKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFBhcmFtZXRlckV4Y2VwdGlvbiBpcGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKGlwZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIGNoZWNrS2V5U2l6ZShwcmltZVNpemUpOwogCiAgICAgICAgIGV4cG9uZW50U2l6ZSA9IGRoUGFyYW1TcGVjLmdldEV4cG9uZW50U2l6ZSgpOwogICAgICAgICBpZiAoZXhwb25lbnRTaXplIDw9IDApIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9FbGVjdHJvbmljQ29kZUJvb2suamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9FbGVjdHJvbmljQ29kZUJvb2suamF2YQppbmRleCAzMzRlNDI0Li5hNDA3YjZhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvRWxlY3Ryb25pY0NvZGVCb29rLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0VsZWN0cm9uaWNDb2RlQm9vay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsNyArMjYsNiBAQAogcGFja2FnZSBjb20uc3VuLmNyeXB0by5wcm92aWRlcjsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyRXhjZXB0aW9uOwogCiAvKioKICAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBjaXBoZXJzIGluIGVsZWN0cm9uaWMgY29kZWJvb2sgKEVDQikgbW9kZS4KQEAgLTk3LDI0ICs5NiwyOCBAQAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIGVuY3J5cHRpb24gb3BlcmF0aW9uLgogICAgICAqCi0gICAgICogPHA+VGhlIGlucHV0IHBsYWluIHRleHQgPGNvZGU+aW48L2NvZGU+LCBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPmluT2ZmPC9jb2RlPiBhbmQgZW5kaW5nIGF0ICogPGNvZGU+KGluT2ZmICsgbGVuIC0gMSk8L2NvZGU+LAotICAgICAqIGlzIGVuY3J5cHRlZC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+b3V0PC9jb2RlPiwgc3RhcnRpbmcgYXQKLSAgICAgKiA8Y29kZT5vdXRPZmY8L2NvZGU+LgorICAgICAqIDxwPlRoZSBpbnB1dCBwbGFpbiB0ZXh0IDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKKyAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4gYW5kIGVuZGluZyBhdAorICAgICAqIDxjb2RlPihwbGFpbk9mZnNldCArIGxlbiAtIDEpPC9jb2RlPiwgaXMgZW5jcnlwdGVkLgorICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPmNpcGhlcjwvY29kZT4sIHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+cGxhaW5MZW48L2NvZGU+IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrIHNpemUsCisgICAgICogYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIGFsc28gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5pbml0PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiAoVGhpcyBjaGVjayBpcyBvbWl0dGVkIGhlcmUsIHRvIGF2b2lkIGRvdWJsZSBjaGVja2luZy4pCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW4gdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGVuY3J5cHRlZAotICAgICAqIEBwYXJhbSBpbk9mZiB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgorICAgICAqIEBwYXJhbSBpbk9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgogICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQogICAgICAqIEBwYXJhbSBvdXQgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdAogICAgICAqIEBwYXJhbSBvdXRPZmYgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXI8L2NvZGU+Ci0gICAgICogQGV4Y2VwdGlvbiBQcm92aWRlckV4Y2VwdGlvbiBpZiA8Y29kZT5sZW48L2NvZGU+IGlzIG5vdAotICAgICAqIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUKICAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY3J5cHRlZCBkYXRhCiAgICAgICovCiAgICAgaW50IGVuY3J5cHQoYnl0ZVtdIGluLCBpbnQgaW5PZmYsIGludCBsZW4sIGJ5dGVbXSBvdXQsIGludCBvdXRPZmYpIHsKLSAgICAgICAgaWYgKChsZW4gJSBibG9ja1NpemUpICE9IDApIHsKLSAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGlucHV0IGJ1ZmZlcmluZyIpOwotICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSBsZW47IGkgPj0gYmxvY2tTaXplOyBpIC09IGJsb2NrU2l6ZSkgewogICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKGluLCBpbk9mZiwgb3V0LCBvdXRPZmYpOwogICAgICAgICAgICAgaW5PZmYgKz0gYmxvY2tTaXplOwpAQCAtMTI2LDI0ICsxMjksMjggQEAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBkZWNyeXB0aW9uIG9wZXJhdGlvbi4KICAgICAgKgotICAgICAqIDxwPlRoZSBpbnB1dCBjaXBoZXIgdGV4dCA8Y29kZT5pbjwvY29kZT4sIHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+aW5PZmY8L2NvZGU+IGFuZCBlbmRpbmcgYXQgKiA8Y29kZT4oaW5PZmYgKyBsZW4gLSAxKTwvY29kZT4sCi0gICAgICogaXMgZGVjcnlwdGVkLlRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPm91dDwvY29kZT4sIHN0YXJ0aW5nIGF0Ci0gICAgICogPGNvZGU+b3V0T2ZmPC9jb2RlPi4KKyAgICAgKiA8cD5UaGUgaW5wdXQgY2lwaGVyIHRleHQgPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKKyAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+IGFuZCBlbmRpbmcgYXQKKyAgICAgKiA8Y29kZT4oY2lwaGVyT2Zmc2V0ICsgbGVuIC0gMSk8L2NvZGU+LCBpcyBkZWNyeXB0ZWQuCisgICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+cGxhaW48L2NvZGU+LCBzdGFydGluZyBhdAorICAgICAqIDxjb2RlPnBsYWluT2Zmc2V0PC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+Y2lwaGVyTGVuPC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbWJlZGRlZCBjaXBoZXIncyBibG9jaworICAgICAqIHNpemUsIGFzIGFueSBleGNlc3MgYnl0ZXMgYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD5JdCBpcyBhbHNvIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+aW5pdDwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogKFRoaXMgY2hlY2sgaXMgb21pdHRlZCBoZXJlLCB0byBhdm9pZCBkb3VibGUgY2hlY2tpbmcuKQogICAgICAqCiAgICAgICogQHBhcmFtIGluIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBkZWNyeXB0ZWQKICAgICAgKiBAcGFyYW0gaW5PZmYgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+CiAgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCiAgICAgICogQHBhcmFtIG91dCB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAgICAgICogQHBhcmFtIG91dE9mZiB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gUHJvdmlkZXJFeGNlcHRpb24gaWYgPGNvZGU+bGVuPC9jb2RlPiBpcyBub3QKLSAgICAgKiBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplCiAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkZWNyeXB0ZWQgZGF0YQogICAgICAqLwogICAgIGludCBkZWNyeXB0KGJ5dGVbXSBpbiwgaW50IGluT2ZmLCBpbnQgbGVuLCBieXRlW10gb3V0LCBpbnQgb3V0T2ZmKSB7Ci0gICAgICAgIGlmICgobGVuICUgYmxvY2tTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBpbnB1dCBidWZmZXJpbmciKTsKLSAgICAgICAgfQogICAgICAgICBmb3IgKGludCBpID0gbGVuOyBpID49IGJsb2NrU2l6ZTsgaSAtPSBibG9ja1NpemUpIHsKICAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmRlY3J5cHRCbG9jayhpbiwgaW5PZmYsIG91dCwgb3V0T2ZmKTsKICAgICAgICAgICAgIGluT2ZmICs9IGJsb2NrU2l6ZTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9HYWxvaXNDb3VudGVyTW9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0dhbG9pc0NvdW50ZXJNb2RlLmphdmEKaW5kZXggNGNiNzZmZi4uZTRlZGJmMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0dhbG9pc0NvdW50ZXJNb2RlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0dhbG9pc0NvdW50ZXJNb2RlLmphdmEKQEAgLTQwMywyMSArNDAzLDIzIEBACiAgICAgICogYW5kIGVuZGluZyBhdCA8Y29kZT4oaW5PZmYgKyBsZW4gLSAxKTwvY29kZT4sIGlzIGVuY3J5cHRlZC4gVGhlIHJlc3VsdAogICAgICAqIGlzIHN0b3JlZCBpbiA8Y29kZT5vdXQ8L2NvZGU+LCBzdGFydGluZyBhdCA8Y29kZT5vdXRPZnM8L2NvZGU+LgogICAgICAqCisgICAgICogPHA+SXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5sZW48L2NvZGU+IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrIHNpemUsCisgICAgICogb3RoZXJ3aXNlLCBhIFByb3ZpZGVyRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmluaXQ8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIChUaGlzIGNoZWNrIGlzIG9taXR0ZWQgaGVyZSwgdG8gYXZvaWQgZG91YmxlIGNoZWNraW5nLikKKyAgICAgKgogICAgICAqIEBwYXJhbSBpbiB0aGUgYnVmZmVyIHdpdGggdGhlIGlucHV0IGRhdGEgdG8gYmUgZW5jcnlwdGVkCiAgICAgICogQHBhcmFtIGluT2ZzIHRoZSBvZmZzZXQgaW4gPGNvZGU+aW48L2NvZGU+CiAgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCiAgICAgICogQHBhcmFtIG91dCB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAgICAgICogQHBhcmFtIG91dE9mcyB0aGUgb2Zmc2V0IGluIDxjb2RlPm91dDwvY29kZT4KLSAgICAgKiBAZXhjZXB0aW9uIFByb3ZpZGVyRXhjZXB0aW9uIGlmIDxjb2RlPmxlbjwvY29kZT4gaXMgbm90Ci0gICAgICogYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZQotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBwbGFjZWQgaW50byB0aGUgPGNvZGU+b3V0PC9jb2RlPiBidWZmZXIKICAgICAgKi8KICAgICBpbnQgZW5jcnlwdChieXRlW10gaW4sIGludCBpbk9mcywgaW50IGxlbiwgYnl0ZVtdIG91dCwgaW50IG91dE9mcykgewogICAgICAgICBjaGVja0RhdGFMZW5ndGgocHJvY2Vzc2VkLCBsZW4pOwogCi0gICAgICAgIGlmICgobGVuICUgYmxvY2tTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBpbnB1dCBidWZmZXJpbmciKTsKLSAgICAgICAgfQogICAgICAgICBwcm9jZXNzQUFEKCk7CiAgICAgICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgICAgICBnY3RyUEFuZEMudXBkYXRlKGluLCBpbk9mcywgbGVuLCBvdXQsIG91dE9mcyk7CkBAIC00MzAsNiArNDMyLDkgQEAKICAgICAvKioKICAgICAgKiBQZXJmb3JtcyBlbmNyeXB0aW9uIG9wZXJhdGlvbiBmb3IgdGhlIGxhc3QgdGltZS4KICAgICAgKgorICAgICAqIDxwPk5PVEU6IDxjb2RlPmxlbjwvY29kZT4gbWF5IG5vdCBiZSBtdWx0aXBsZSBvZiB0aGUgZW1iZWRkZWQKKyAgICAgKiBjaXBoZXIncyBibG9jayBzaXplIGZvciB0aGlzIGNhbGwuCisgICAgICoKICAgICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IGJ1ZmZlciB3aXRoIHRoZSBkYXRhIHRvIGJlIGVuY3J5cHRlZAogICAgICAqIEBwYXJhbSBpbk9mcyB0aGUgb2Zmc2V0IGluIDxjb2RlPmluPC9jb2RlPgogICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQpAQCAtNDc0LDIxICs0NzksMjMgQEAKICAgICAgKiBpcyBkZWNyeXB0ZWQuIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPm91dDwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+b3V0T2ZzPC9jb2RlPi4KICAgICAgKgorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+bGVuPC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIHRoZSBlbWJlZGRlZCBjaXBoZXIncyBibG9jaworICAgICAqIHNpemUsIGFzIGFueSBleGNlc3MgYnl0ZXMgYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiA8cD5JdCBpcyBhbHNvIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+aW5pdDwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICogKFRoaXMgY2hlY2sgaXMgb21pdHRlZCBoZXJlLCB0byBhdm9pZCBkb3VibGUgY2hlY2tpbmcuKQorICAgICAqCiAgICAgICogQHBhcmFtIGluIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBkZWNyeXB0ZWQKICAgICAgKiBAcGFyYW0gaW5PZnMgdGhlIG9mZnNldCBpbiA8Y29kZT5pbjwvY29kZT4KICAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKICAgICAgKiBAcGFyYW0gb3V0IHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gb3V0T2ZzIHRoZSBvZmZzZXQgaW4gPGNvZGU+b3V0PC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gUHJvdmlkZXJFeGNlcHRpb24gaWYgPGNvZGU+bGVuPC9jb2RlPiBpcyBub3QKLSAgICAgKiBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbnRvIHRoZSA8Y29kZT5vdXQ8L2NvZGU+IGJ1ZmZlcgogICAgICAqLwogICAgIGludCBkZWNyeXB0KGJ5dGVbXSBpbiwgaW50IGluT2ZzLCBpbnQgbGVuLCBieXRlW10gb3V0LCBpbnQgb3V0T2ZzKSB7CiAgICAgICAgIGNoZWNrRGF0YUxlbmd0aChpYnVmZmVyLnNpemUoKSwgbGVuKTsKIAotICAgICAgICBpZiAoKGxlbiAlIGJsb2NrU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgIHRocm93IG5ldyBQcm92aWRlckV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgaW4gaW5wdXQgYnVmZmVyaW5nIik7Ci0gICAgICAgIH0KICAgICAgICAgcHJvY2Vzc0FBRCgpOwogCiAgICAgICAgIGlmIChsZW4gPiAwKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvSmNlS2V5U3RvcmUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9KY2VLZXlTdG9yZS5qYXZhCmluZGV4IDVlYzM2ZmQuLmNiYmM1NGUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9KY2VLZXlTdG9yZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9KY2VLZXlTdG9yZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtODY0LDkgKzg2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRbaV0gIT0gYWN0dWFsW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5c3RvcmUgd2FzIHRhbXBlcmVkIHdpdGgsIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicGFzc3dvcmQgd2FzIGluY29ycmVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhc3N3b3JkIHZlcmlmaWNhdGlvbiBmYWlsZWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBhc3N3b3JkIHdhcyBpbmNvcnJlY3QiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9PdXRwdXRGZWVkYmFjay5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL091dHB1dEZlZWRiYWNrLmphdmEKaW5kZXggMjUwZTYwZS4uZWE1ODkwZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL091dHB1dEZlZWRiYWNrLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL091dHB1dEZlZWRiYWNrLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGNpcGhlcnMgaW4gb3V0cHV0LWZlZWRiYWNrIChPRkIpIG1vZGUuCkBAIC0xMzMsODggKzEzMiwxMDEgQEAKICAgICAgKgogICAgICAqIDxwPlRoZSBpbnB1dCBwbGFpbiB0ZXh0IDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4gYW5kIGVuZGluZyBhdAotICAgICAqIDxjb2RlPihwbGFpbk9mZnNldCArIHBsYWluTGVuIC0gMSk8L2NvZGU+LCBpcyBlbmNyeXB0ZWQuCisgICAgICogPGNvZGU+KHBsYWluT2Zmc2V0ICsgbGVuIC0gMSk8L2NvZGU+LCBpcyBlbmNyeXB0ZWQuCiAgICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+LgogICAgICAqCisgICAgICogPHA+SXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5wbGFpbkxlbjwvY29kZT4gaXMgYSBtdWx0aXBsZSBvZiB0aGUgc3RyZWFtIHVuaXQgc2l6ZQorICAgICAqIDxjb2RlPm51bUJ5dGVzPC9jb2RlPiwgYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIGFsc28gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5pbml0PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiAoVGhpcyBjaGVjayBpcyBvbWl0dGVkIGhlcmUsIHRvIGF2b2lkIGRvdWJsZSBjaGVja2luZy4pCisgICAgICoKICAgICAgKiBAcGFyYW0gcGxhaW4gdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGVuY3J5cHRlZAogICAgICAqIEBwYXJhbSBwbGFpbk9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPnBsYWluPC9jb2RlPgogICAgICAqIEBwYXJhbSBwbGFpbkxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCiAgICAgICogQHBhcmFtIGNpcGhlciB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAgICAgICogQHBhcmFtIGNpcGhlck9mZnNldCB0aGUgb2Zmc2V0IGluIDxjb2RlPmNpcGhlcjwvY29kZT4KLSAgICAgKiBAZXhjZXB0aW9uIFByb3ZpZGVyRXhjZXB0aW9uIGlmIDxjb2RlPnBsYWluTGVuPC9jb2RlPiBpcyBub3QKLSAgICAgKiBhIG11bHRpcGxlIG9mIHRoZSA8Y29kZT5udW1CeXRlczwvY29kZT4KICAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY3J5cHRlZCBkYXRhCiAgICAgICovCiAgICAgaW50IGVuY3J5cHQoYnl0ZVtdIHBsYWluLCBpbnQgcGxhaW5PZmZzZXQsIGludCBwbGFpbkxlbiwKLSAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0KSB7Ci0KLSAgICAgICAgaWYgKChwbGFpbkxlbiAlIG51bUJ5dGVzKSAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlkZXJFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGlucHV0IGJ1ZmZlcmluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGludCBuU2hpZnQgPSBibG9ja1NpemUgLSBudW1CeXRlczsKKyAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0KQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBsZW4gPSBibG9ja1NpemUgLSBudW1CeXRlczsKICAgICAgICAgaW50IGxvb3BDb3VudCA9IHBsYWluTGVuIC8gbnVtQnl0ZXM7CisgICAgICAgIGludCBvZGRCeXRlcyA9IHBsYWluTGVuICUgbnVtQnl0ZXM7CiAKLSAgICAgICAgZm9yICg7IGxvb3BDb3VudCA+IDA7Ci0gICAgICAgICAgICAgcGxhaW5PZmZzZXQgKz0gbnVtQnl0ZXMsIGNpcGhlck9mZnNldCArPSBudW1CeXRlcywKLSAgICAgICAgICAgICBsb29wQ291bnQtLSkgewotICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnl0ZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGNpcGhlcltpICsgY2lwaGVyT2Zmc2V0XSA9Ci0gICAgICAgICAgICAgICAgICAgIChieXRlKShrW2ldIF4gcGxhaW5baSArIHBsYWluT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5TaGlmdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVnaXN0ZXIsIG51bUJ5dGVzLCByZWdpc3RlciwgMCwgblNoaWZ0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShrLCAwLCByZWdpc3RlciwgblNoaWZ0LCBudW1CeXRlcyk7CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgZm9yICg7IGxvb3BDb3VudCA+IDA7CisgICAgICAgICAgICAgICAgIHBsYWluT2Zmc2V0ICs9IG51bUJ5dGVzLCBjaXBoZXJPZmZzZXQgKz0gbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgIGxvb3BDb3VudC0tKSB7CisgICAgICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxudW1CeXRlczsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaXBoZXJbaStjaXBoZXJPZmZzZXRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKShrW2ldIF4gcGxhaW5baStwbGFpbk9mZnNldF0pOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaywgMCwgcmVnaXN0ZXIsIDAsIG51bUJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvZGRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG9kZEJ5dGVzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNpcGhlcltpK2NpcGhlck9mZnNldF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKGtbaV0gXiBwbGFpbltpK3BsYWluT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShrLCAwLCByZWdpc3RlciwgMCwgbnVtQnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICg7IGxvb3BDb3VudCA+IDA7CisgICAgICAgICAgICAgICAgIHBsYWluT2Zmc2V0ICs9IG51bUJ5dGVzLCBjaXBoZXJPZmZzZXQgKz0gbnVtQnl0ZXMsCisgICAgICAgICAgICAgICAgIGxvb3BDb3VudC0tKSB7CisgICAgICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxudW1CeXRlczsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjaXBoZXJbaStjaXBoZXJPZmZzZXRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKShrW2ldIF4gcGxhaW5baStwbGFpbk9mZnNldF0pOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocmVnaXN0ZXIsIG51bUJ5dGVzLCByZWdpc3RlciwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGssIDAsIHJlZ2lzdGVyLCBsZW4sIG51bUJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvZGRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBlbWJlZGRlZENpcGhlci5lbmNyeXB0QmxvY2socmVnaXN0ZXIsIDAsIGssIDApOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPG9kZEJ5dGVzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGNpcGhlcltpK2NpcGhlck9mZnNldF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpKGtbaV0gXiBwbGFpbltpK3BsYWluT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyZWdpc3RlciwgbnVtQnl0ZXMsIHJlZ2lzdGVyLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaywgMCwgcmVnaXN0ZXIsIGxlbiwgbnVtQnl0ZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwbGFpbkxlbjsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyBsYXN0IGVuY3J5cHRpb24gb3BlcmF0aW9uLgorICAgICAqIFBlcmZvcm1zIGRlY3J5cHRpb24gb3BlcmF0aW9uLgogICAgICAqCi0gICAgICogPHA+VGhlIGlucHV0IHBsYWluIHRleHQgPGNvZGU+cGxhaW48L2NvZGU+LCBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPnBsYWluT2Zmc2V0PC9jb2RlPiBhbmQgZW5kaW5nIGF0Ci0gICAgICogPGNvZGU+KHBsYWluT2Zmc2V0ICsgcGxhaW5MZW4gLSAxKTwvY29kZT4sIGlzIGVuY3J5cHRlZC4KLSAgICAgKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiA8Y29kZT5jaXBoZXI8L2NvZGU+LCBzdGFydGluZyBhdAotICAgICAqIDxjb2RlPmNpcGhlck9mZnNldDwvY29kZT4uCisgICAgICogPHA+VGhlIGlucHV0IGNpcGhlciB0ZXh0IDxjb2RlPmNpcGhlcjwvY29kZT4sIHN0YXJ0aW5nIGF0CisgICAgICogPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPiBhbmQgZW5kaW5nIGF0CisgICAgICogPGNvZGU+KGNpcGhlck9mZnNldCArIGxlbiAtIDEpPC9jb2RlPiwgaXMgZGVjcnlwdGVkLgorICAgICAqIFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKKyAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGxhaW4gdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGVuY3J5cHRlZAorICAgICAqIDxwPkl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICogPGNvZGU+Y2lwaGVyTGVuPC9jb2RlPiBpcyBhIG11bHRpcGxlIG9mIHRoZSBzdHJlYW0gdW5pdCBzaXplCisgICAgICogPGNvZGU+bnVtQnl0ZXM8L2NvZGU+LCBhcyBhbnkgZXhjZXNzIGJ5dGVzIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmluaXQ8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIChUaGlzIGNoZWNrIGlzIG9taXR0ZWQgaGVyZSwgdG8gYXZvaWQgZG91YmxlIGNoZWNraW5nLikKKyAgICAgKgorICAgICAqIEBwYXJhbSBjaXBoZXIgdGhlIGJ1ZmZlciB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGJlIGRlY3J5cHRlZAorICAgICAqIEBwYXJhbSBjaXBoZXJPZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+CisgICAgICogQHBhcmFtIGNpcGhlckxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBkYXRhCisgICAgICogQHBhcmFtIHBsYWluIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gcGxhaW5PZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5wbGFpbjwvY29kZT4KLSAgICAgKiBAcGFyYW0gcGxhaW5MZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQotICAgICAqIEBwYXJhbSBjaXBoZXIgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdAotICAgICAqIEBwYXJhbSBjaXBoZXJPZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5jaXBoZXI8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNyeXB0ZWQgZGF0YQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZGVjcnlwdGVkIGRhdGEKICAgICAgKi8KLSAgICBpbnQgZW5jcnlwdEZpbmFsKGJ5dGVbXSBwbGFpbiwgaW50IHBsYWluT2Zmc2V0LCBpbnQgcGxhaW5MZW4sCi0gICAgICAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0KSB7Ci0gICAgICAgIGludCBvZGRCeXRlcyA9IHBsYWluTGVuICUgbnVtQnl0ZXM7Ci0gICAgICAgIGludCBsZW4gPSBlbmNyeXB0KHBsYWluLCBwbGFpbk9mZnNldCwgKHBsYWluTGVuIC0gb2RkQnl0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIsIGNpcGhlck9mZnNldCk7Ci0gICAgICAgIHBsYWluT2Zmc2V0ICs9IGxlbjsKLSAgICAgICAgY2lwaGVyT2Zmc2V0ICs9IGxlbjsKLQotICAgICAgICBpZiAob2RkQnl0ZXMgIT0gMCkgewotICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZW5jcnlwdEJsb2NrKHJlZ2lzdGVyLCAwLCBrLCAwKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2RkQnl0ZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGNpcGhlcltpICsgY2lwaGVyT2Zmc2V0XSA9Ci0gICAgICAgICAgICAgICAgICAgIChieXRlKShrW2ldIF4gcGxhaW5bIGkgKyBwbGFpbk9mZnNldF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwbGFpbkxlbjsKLSAgICB9Ci0KLSAgICAvLyBPRkIgZW5jcnlwdCBhbmQgZGVjcnlwdCBhcmUgaWRlbnRpY2FsCiAgICAgaW50IGRlY3J5cHQoYnl0ZVtdIGNpcGhlciwgaW50IGNpcGhlck9mZnNldCwgaW50IGNpcGhlckxlbiwKLSAgICAgICAgICAgICAgICBieXRlW10gcGxhaW4sIGludCBwbGFpbk9mZnNldCkgewotICAgICAgICByZXR1cm4gZW5jcnlwdChjaXBoZXIsIGNpcGhlck9mZnNldCwgY2lwaGVyTGVuLCBwbGFpbiwgcGxhaW5PZmZzZXQpOwotICAgIH0KLQotICAgIC8vIE9GQiBlbmNyeXB0IGFuZCBkZWNyeXB0IGFyZSBpZGVudGljYWwKLSAgICBpbnQgZGVjcnlwdEZpbmFsKGJ5dGVbXSBjaXBoZXIsIGludCBjaXBoZXJPZmZzZXQsIGludCBjaXBoZXJMZW4sCi0gICAgICAgICAgICAgICAgICAgICBieXRlW10gcGxhaW4sIGludCBwbGFpbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBsYWluLCBpbnQgcGxhaW5PZmZzZXQpCisgICAgewogICAgICAgICAvLyBPRkIgZW5jcnlwdCBhbmQgZGVjcnlwdCBhcmUgaWRlbnRpY2FsCi0gICAgICAgIHJldHVybiBlbmNyeXB0RmluYWwoY2lwaGVyLCBjaXBoZXJPZmZzZXQsIGNpcGhlckxlbiwgcGxhaW4sIHBsYWluT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIGVuY3J5cHQoY2lwaGVyLCBjaXBoZXJPZmZzZXQsIGNpcGhlckxlbiwgcGxhaW4sIHBsYWluT2Zmc2V0KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvUENCQy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL1BDQkMuamF2YQppbmRleCBmZDk5YmIwLi5hZWZjNDVlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvUENCQy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NyeXB0by9wcm92aWRlci9QQ0JDLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiw4ICsyNiw2IEBACiBwYWNrYWdlIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247Ci0KIAogLyoqCiAgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgY2lwaGVycyBpbiBQbGFpbnRleHQgQ2lwaGVyIEJsb2NrIENoYWluaW5nIChQQ0JDKQpAQCAtMTIwLDM2ICsxMTgsMzggQEAKICAgICAgKgogICAgICAqIDxwPlRoZSBpbnB1dCBwbGFpbiB0ZXh0IDxjb2RlPnBsYWluPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5wbGFpbk9mZnNldDwvY29kZT4gYW5kIGVuZGluZyBhdAotICAgICAqIDxjb2RlPihwbGFpbk9mZnNldCArIHBsYWluTGVuIC0gMSk8L2NvZGU+LCBpcyBlbmNyeXB0ZWQuCisgICAgICogPGNvZGU+KHBsYWluT2Zmc2V0ICsgbGVuIC0gMSk8L2NvZGU+LCBpcyBlbmNyeXB0ZWQuCiAgICAgICogVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPiwgc3RhcnRpbmcgYXQKICAgICAgKiA8Y29kZT5jaXBoZXJPZmZzZXQ8L2NvZGU+LgogICAgICAqCisgICAgICogPHA+SXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5wbGFpbkxlbjwvY29kZT4gaXMgYSBtdWx0aXBsZSBvZiB0aGUgZW1iZWRkZWQgY2lwaGVyJ3MgYmxvY2sgc2l6ZSwKKyAgICAgKiBhcyBhbnkgZXhjZXNzIGJ5dGVzIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogPHA+SXQgaXMgYWxzbyB0aGUgYXBwbGljYXRpb24ncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdAorICAgICAqIDxjb2RlPmluaXQ8L2NvZGU+IGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgICAqIChUaGlzIGNoZWNrIGlzIG9taXR0ZWQgaGVyZSwgdG8gYXZvaWQgZG91YmxlIGNoZWNraW5nLikKKyAgICAgKgogICAgICAqIEBwYXJhbSBwbGFpbiB0aGUgYnVmZmVyIHdpdGggdGhlIGlucHV0IGRhdGEgdG8gYmUgZW5jcnlwdGVkCiAgICAgICogQHBhcmFtIHBsYWluT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+cGxhaW48L2NvZGU+CiAgICAgICogQHBhcmFtIHBsYWluTGVuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGRhdGEKICAgICAgKiBAcGFyYW0gY2lwaGVyIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICAgICAgKiBAcGFyYW0gY2lwaGVyT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+Y2lwaGVyPC9jb2RlPgotICAgICAqIEBleGNlcHRpb24gUHJvdmlkZXJFeGNlcHRpb24gaWYgPGNvZGU+cGxhaW5MZW48L2NvZGU+IGlzIG5vdAotICAgICAqIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY3J5cHRlZCBkYXRhCiAgICAgICovCiAgICAgaW50IGVuY3J5cHQoYnl0ZVtdIHBsYWluLCBpbnQgcGxhaW5PZmZzZXQsIGludCBwbGFpbkxlbiwKICAgICAgICAgICAgICAgICBieXRlW10gY2lwaGVyLCBpbnQgY2lwaGVyT2Zmc2V0KQogICAgIHsKLSAgICAgICAgaWYgKChwbGFpbkxlbiAlIGJsb2NrU2l6ZSkgIT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBpbnB1dCBidWZmZXJpbmciKTsKLSAgICAgICAgfQogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IGVuZEluZGV4ID0gcGxhaW5PZmZzZXQgKyBwbGFpbkxlbjsKIAogICAgICAgICBmb3IgKDsgcGxhaW5PZmZzZXQgPCBlbmRJbmRleDsKICAgICAgICAgICAgICBwbGFpbk9mZnNldCArPSBibG9ja1NpemUsIGNpcGhlck9mZnNldCArPSBibG9ja1NpemUpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGtbaV0gXj0gcGxhaW5baSArIHBsYWluT2Zmc2V0XTsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGJsb2NrU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAga1tpXSBePSBwbGFpbltpK3BsYWluT2Zmc2V0XTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVtYmVkZGVkQ2lwaGVyLmVuY3J5cHRCbG9jayhrLCAwLCBjaXBoZXIsIGNpcGhlck9mZnNldCk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBrW2ldID0gKGJ5dGUpKHBsYWluW2kgKyBwbGFpbk9mZnNldF0gXiBjaXBoZXJbaSArIGNpcGhlck9mZnNldF0pOworICAgICAgICAgICAgICAgIGtbaV0gPSAoYnl0ZSkocGxhaW5baStwbGFpbk9mZnNldF0gXiBjaXBoZXJbaStjaXBoZXJPZmZzZXRdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcGxhaW5MZW47CkBAIC0xNjAsMjUgKzE2MCwyNyBAQAogICAgICAqCiAgICAgICogPHA+VGhlIGlucHV0IGNpcGhlciB0ZXh0IDxjb2RlPmNpcGhlcjwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPiBhbmQgZW5kaW5nIGF0Ci0gICAgICogPGNvZGU+KGNpcGhlck9mZnNldCArIGNpcGhlckxlbiAtIDEpPC9jb2RlPiwgaXMgZGVjcnlwdGVkLgorICAgICAqIDxjb2RlPihjaXBoZXJPZmZzZXQgKyBsZW4gLSAxKTwvY29kZT4sIGlzIGRlY3J5cHRlZC4KICAgICAgKiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiA8Y29kZT5wbGFpbjwvY29kZT4sIHN0YXJ0aW5nIGF0CiAgICAgICogPGNvZGU+cGxhaW5PZmZzZXQ8L2NvZGU+LgogICAgICAqCisgICAgICogPHA+SXQgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5jaXBoZXJMZW48L2NvZGU+IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGVtYmVkZGVkIGNpcGhlcidzIGJsb2NrCisgICAgICogc2l6ZSwgYXMgYW55IGV4Y2VzcyBieXRlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIDxwPkl0IGlzIGFsc28gdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiA8Y29kZT5pbml0PC9jb2RlPiBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiAoVGhpcyBjaGVjayBpcyBvbWl0dGVkIGhlcmUsIHRvIGF2b2lkIGRvdWJsZSBjaGVja2luZy4pCisgICAgICoKICAgICAgKiBAcGFyYW0gY2lwaGVyIHRoZSBidWZmZXIgd2l0aCB0aGUgaW5wdXQgZGF0YSB0byBiZSBkZWNyeXB0ZWQKICAgICAgKiBAcGFyYW0gY2lwaGVyT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+Y2lwaGVyT2Zmc2V0PC9jb2RlPgogICAgICAqIEBwYXJhbSBjaXBoZXJMZW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZGF0YQogICAgICAqIEBwYXJhbSBwbGFpbiB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0CiAgICAgICogQHBhcmFtIHBsYWluT2Zmc2V0IHRoZSBvZmZzZXQgaW4gPGNvZGU+cGxhaW48L2NvZGU+Ci0gICAgICogQGV4Y2VwdGlvbiBQcm92aWRlckV4Y2VwdGlvbiBpZiA8Y29kZT5jaXBoZXJMZW48L2NvZGU+IGlzIG5vdAotICAgICAqIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUKLSAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGRlY3J5cHRlZCBkYXRhCiAgICAgICovCiAgICAgaW50IGRlY3J5cHQoYnl0ZVtdIGNpcGhlciwgaW50IGNpcGhlck9mZnNldCwgaW50IGNpcGhlckxlbiwKICAgICAgICAgICAgICAgICBieXRlW10gcGxhaW4sIGludCBwbGFpbk9mZnNldCkKICAgICB7Ci0gICAgICAgIGlmICgoY2lwaGVyTGVuICUgYmxvY2tTaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciBpbiBpbnB1dCBidWZmZXJpbmciKTsKLSAgICAgICAgfQogICAgICAgICBpbnQgaTsKICAgICAgICAgaW50IGVuZEluZGV4ID0gY2lwaGVyT2Zmc2V0ICsgY2lwaGVyTGVuOwogCkBAIC0xODcsMTAgKzE4OSwxMCBAQAogICAgICAgICAgICAgZW1iZWRkZWRDaXBoZXIuZGVjcnlwdEJsb2NrKGNpcGhlciwgY2lwaGVyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbiwgcGxhaW5PZmZzZXQpOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGxhaW5baSArIHBsYWluT2Zmc2V0XSBePSBrW2ldOworICAgICAgICAgICAgICAgIHBsYWluW2krcGxhaW5PZmZzZXRdIF49IGtbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBrW2ldID0gKGJ5dGUpKHBsYWluW2kgKyBwbGFpbk9mZnNldF0gXiBjaXBoZXJbaSArIGNpcGhlck9mZnNldF0pOworICAgICAgICAgICAgICAgIGtbaV0gPSAoYnl0ZSkocGxhaW5baStwbGFpbk9mZnNldF0gXiBjaXBoZXJbaStjaXBoZXJPZmZzZXRdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2lwaGVyTGVuOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS9hY2Nlc3NpYmlsaXR5L3V0aWwvcGFja2FnZS1pbmZvLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL2FjY2Vzc2liaWxpdHkvdXRpbC9wYWNrYWdlLWluZm8uamF2YQppbmRleCA3ZDgxZWQ2Li4yYWU3OWQxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL2FjY2Vzc2liaWxpdHkvdXRpbC9wYWNrYWdlLWluZm8uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL2FjY2Vzc2liaWxpdHkvdXRpbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YS91dGlsL2phci9wYWNrL0RyaXZlclJlc291cmNlX2phLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svRHJpdmVyUmVzb3VyY2VfamEuamF2YQppbmRleCA2NjU3OWVmLi4wMjJiMmJlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svRHJpdmVyUmVzb3VyY2VfamEuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhL3V0aWwvamFyL3BhY2svRHJpdmVyUmVzb3VyY2VfamEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTYxLDggKzYxLDggQEAKICAgICAgICAgICAgICAgICAiXHU0RjdGXHU3NTI4XHU2NUI5XHU2Q0Q1OiAgcGFjazIwMCBbLW9wdC4uLiB8IC0tb3B0aW9uPXZhbHVlXS4uLiB4LnBhY2tbLmd6XSB5LmphciIsCiAgICAgICAgICAgICAgICAgIiIsCiAgICAgICAgICAgICAgICAgIlx1NTcyN1x1N0UyRVx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGMyIsCi0gICAgICAgICAgICAgICAgIiAgLWdcdTMwMDEtLW5vLWd6aXAgICAgICAgICAgICAgICAgICAgXHU1NzI3XHU3RTJFXHUzMDVCXHUzMDVBXHUzMDZCXHUzMEQ3XHUzMEVDXHUzMEZDXHUzMEYzXHUzMDZBKi5wYWNrXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDkyXHU1MUZBXHU1MjlCXHUzMDU3XHUzMDdFXHUzMDU5IiwKLSAgICAgICAgICAgICAgICAiICAtLWd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgIChcdTMwQzdcdTMwRDVcdTMwQTlcdTMwRUJcdTMwQzgpIHBhY2tcdTUxRkFcdTUyOUJcdTMwOTJnemlwXHUzMDY3XHU1RjhDXHU1MUU2XHU3NDA2XHUzMDU3XHUzMDdFXHUzMDU5IiwKKyAgICAgICAgICAgICAgICAiICAtZ1x1MzAwMS0tbm8tZ3ppcCAgICAgICAgICAgICAgICAgICBcdTMwRDdcdTMwRUNcdTMwRkNcdTMwRjNcdTMwNkEqLnBhY2tcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwOTJcdTU3MjdcdTdFMkVcdTMwNUJcdTMwNUFcdTMwNkJcdTUxRkFcdTUyOUJcdTMwNTdcdTMwN0VcdTMwNTkiLAorICAgICAgICAgICAgICAgICIgIC0tZ3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgKFx1MzBDN1x1MzBENVx1MzBBOVx1MzBFQlx1MzBDOClcdTU3MjdcdTdFMkVcdTUxRkFcdTUyOUJcdTMwOTJnemlwXHUzMDY3XHU1RjhDXHU1MUU2XHU3NDA2XHUzMDU3XHUzMDdFXHUzMDU5IiwKICAgICAgICAgICAgICAgICAiICAtR1x1MzAwMS0tc3RyaXAtZGVidWcgICAgICAgICAgICAgICBcdTU3MjdcdTdFMkVcdTRFMkRcdTMwNkJcdTMwQzdcdTMwRDBcdTMwQzNcdTMwQjBcdTVDNUVcdTYwMjdcdTMwOTJcdTUyNEFcdTk2NjRcdTMwNTdcdTMwN0VcdTMwNTkiLAogICAgICAgICAgICAgICAgICIgIC1PXHUzMDAxLS1uby1rZWVwLWZpbGUtb3JkZXIgICAgICAgIFx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2RVx1OTgwNlx1NUU4Rlx1NEVEOFx1MzA1MVx1NjBDNVx1NTgzMVx1MzA5Mlx1OEVFMlx1OTAwMVx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5MyIsCiAgICAgICAgICAgICAgICAgIiAgLS1rZWVwLWZpbGUtb3JkZXIgICAgICAgICAgICAgICAoXHUzMEM3XHUzMEQ1XHUzMEE5XHUzMEVCXHUzMEM4KVx1NTE2NVx1NTI5Qlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2RVx1OTgwNlx1NUU4Rlx1NEVEOFx1MzA1MVx1MzA5Mlx1NEZERFx1NjMwMVx1MzA1N1x1MzA3RVx1MzA1OSIsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvQWJzdHJhY3RMZGFwTmFtaW5nRW51bWVyYXRpb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9BYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbi5qYXZhCmluZGV4IDRiOTc1OTEuLjI0MTEwNWIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9BYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9BYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICAgICAgZXJyRXggPSBlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbjw/IGV4dGVuZHMgTmFtZUNsYXNzUGFpcj4gZ2V0UmVmZXJyZWRSZXN1bHRzKAorICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbjxUPiBnZXRSZWZlcnJlZFJlc3VsdHMoCiAgICAgICAgICAgICBMZGFwUmVmZXJyYWxDb250ZXh0IHJlZkN0eCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbjsKIAogICAgIC8qCkBAIC0zNjAsNyArMzYwLDcgQEAKICAgICAgKiBNZXJnZSB0aGUgZW50cmllcyBhbmQvb3IgcmVmZXJyYWxzIGZyb20gdGhlIHN1cHBsaWVkIGVudW1lcmF0aW9uCiAgICAgICogd2l0aCB0aG9zZSBvZiB0aGUgY3VycmVudCBlbnVtZXJhdGlvbi4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoQWJzdHJhY3RMZGFwTmFtaW5nRW51bWVyYXRpb248PyBleHRlbmRzIE5hbWVDbGFzc1BhaXI+IG5lKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPFQ+IG5lKSB7CiAgICAgICAgIC8vIENsZWFudXAgcHJldmlvdXMgY29udGV4dCBmaXJzdAogICAgICAgICBob21lQ3R4LmRlY0VudW1Db3VudCgpOwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvRGlnZXN0Q2xpZW50SWQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9EaWdlc3RDbGllbnRJZC5qYXZhCmluZGV4IDZlYWM0NGEuLmI0ZjE5ZDAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9EaWdlc3RDbGllbnRJZC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9EaWdlc3RDbGllbnRJZC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjAsNiArNjAsNyBAQAogCiAgICAgZmluYWwgcHJpdmF0ZSBTdHJpbmdbXSBwcm9wdmFsczsKICAgICBmaW5hbCBwcml2YXRlIGludCBteUhhc2g7CisgICAgcHJpdmF0ZSBpbnQgcEhhc2ggPSAwOwogCiAgICAgRGlnZXN0Q2xpZW50SWQoaW50IHZlcnNpb24sIFN0cmluZyBob3N0bmFtZSwgaW50IHBvcnQsCiAgICAgICAgIFN0cmluZyBwcm90b2NvbCwgQ29udHJvbFtdIGJpbmRDdGxzLCBPdXRwdXRTdHJlYW0gdHJhY2UsCkBAIC03Nyw5ICs3OCwxMiBAQAogICAgICAgICAgICAgcHJvcHZhbHMgPSBuZXcgU3RyaW5nW1NBU0xfUFJPUFMubGVuZ3RoXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0FTTF9QUk9QUy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIHByb3B2YWxzW2ldID0gKFN0cmluZykgZW52LmdldChTQVNMX1BST1BTW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcHZhbHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwSGFzaCA9IHBIYXNoICogMzEgKyBwcm9wdmFsc1tpXS5oYXNoQ29kZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBteUhhc2ggPSBzdXBlci5oYXNoQ29kZSgpIF4gQXJyYXlzLmhhc2hDb2RlKHByb3B2YWxzKTsKKyAgICAgICAgbXlIYXNoID0gc3VwZXIuaGFzaENvZGUoKSArIHBIYXNoOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CkBAIC04OCw2ICs5Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgRGlnZXN0Q2xpZW50SWQgb3RoZXIgPSAoRGlnZXN0Q2xpZW50SWQpb2JqOwogICAgICAgICByZXR1cm4gbXlIYXNoID09IG90aGVyLm15SGFzaAorICAgICAgICAgICAgJiYgcEhhc2ggPT0gb3RoZXIucEhhc2gKICAgICAgICAgICAgICYmIHN1cGVyLmVxdWFscyhvYmopCiAgICAgICAgICAgICAmJiBBcnJheXMuZXF1YWxzKHByb3B2YWxzLCBvdGhlci5wcm9wdmFscyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBCaW5kaW5nRW51bWVyYXRpb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwQmluZGluZ0VudW1lcmF0aW9uLmphdmEKaW5kZXggOGQzODVkMy4uNjVjODA1MSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBCaW5kaW5nRW51bWVyYXRpb24uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcEJpbmRpbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC0xMDQsOSArMTA0LDkgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQWJzdHJhY3RMZGFwTmFtaW5nRW51bWVyYXRpb248PyBleHRlbmRzIE5hbWVDbGFzc1BhaXI+IGdldFJlZmVycmVkUmVzdWx0cygKKyAgICBwcm90ZWN0ZWQgTGRhcEJpbmRpbmdFbnVtZXJhdGlvbiBnZXRSZWZlcnJlZFJlc3VsdHMoCiAgICAgICAgICAgICBMZGFwUmVmZXJyYWxDb250ZXh0IHJlZkN0eCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbnsKICAgICAgICAgLy8gcmVwZWF0IHRoZSBvcmlnaW5hbCBvcGVyYXRpb24gYXQgdGhlIG5ldyBjb250ZXh0Ci0gICAgICAgIHJldHVybiAoQWJzdHJhY3RMZGFwTmFtaW5nRW51bWVyYXRpb248PyBleHRlbmRzIE5hbWVDbGFzc1BhaXI+KXJlZkN0eC5saXN0QmluZGluZ3MobGlzdEFyZyk7CisgICAgICAgIHJldHVybiAoTGRhcEJpbmRpbmdFbnVtZXJhdGlvbilyZWZDdHgubGlzdEJpbmRpbmdzKGxpc3RBcmcpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwTmFtaW5nRW51bWVyYXRpb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwTmFtaW5nRW51bWVyYXRpb24uamF2YQppbmRleCBjOTIzZmRhLi40MjJjZTc5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcE5hbWluZ0VudW1lcmF0aW9uLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBOYW1pbmdFbnVtZXJhdGlvbi5qYXZhCkBAIC03Miw5ICs3Miw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPD8gZXh0ZW5kcyBOYW1lQ2xhc3NQYWlyPiBnZXRSZWZlcnJlZFJlc3VsdHMoCisgICAgcHJvdGVjdGVkIExkYXBOYW1pbmdFbnVtZXJhdGlvbiBnZXRSZWZlcnJlZFJlc3VsdHMoCiAgICAgICAgICAgICBMZGFwUmVmZXJyYWxDb250ZXh0IHJlZkN0eCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlcGVhdCB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIGF0IHRoZSBuZXcgY29udGV4dAotICAgICAgICByZXR1cm4gKEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPD8gZXh0ZW5kcyBOYW1lQ2xhc3NQYWlyPilyZWZDdHgubGlzdChsaXN0QXJnKTsKKyAgICAgICAgcmV0dXJuIChMZGFwTmFtaW5nRW51bWVyYXRpb24pcmVmQ3R4Lmxpc3QobGlzdEFyZyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBTZWFyY2hFbnVtZXJhdGlvbi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBTZWFyY2hFbnVtZXJhdGlvbi5qYXZhCmluZGV4IDI0YzQyMWUuLjMyOWIxZDIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwU2VhcmNoRW51bWVyYXRpb24uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcFNlYXJjaEVudW1lcmF0aW9uLmphdmEKQEAgLTE5OSwxNSArMTk5LDE1IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPD8gZXh0ZW5kcyBOYW1lQ2xhc3NQYWlyPiBnZXRSZWZlcnJlZFJlc3VsdHMoCisgICAgcHJvdGVjdGVkIExkYXBTZWFyY2hFbnVtZXJhdGlvbiBnZXRSZWZlcnJlZFJlc3VsdHMoCiAgICAgICAgICAgICBMZGFwUmVmZXJyYWxDb250ZXh0IHJlZkN0eCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHJlcGVhdCB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIGF0IHRoZSBuZXcgY29udGV4dAotICAgICAgICByZXR1cm4gKEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPD8gZXh0ZW5kcyBOYW1lQ2xhc3NQYWlyPilyZWZDdHguc2VhcmNoKAorICAgICAgICByZXR1cm4gKExkYXBTZWFyY2hFbnVtZXJhdGlvbilyZWZDdHguc2VhcmNoKAogICAgICAgICAgICAgICAgIHNlYXJjaEFyZ3MubmFtZSwgc2VhcmNoQXJncy5maWx0ZXIsIHNlYXJjaEFyZ3MuY29ucyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlKEFic3RyYWN0TGRhcE5hbWluZ0VudW1lcmF0aW9uPD8gZXh0ZW5kcyBOYW1lQ2xhc3NQYWlyPiBuZSkgeworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZShBYnN0cmFjdExkYXBOYW1pbmdFbnVtZXJhdGlvbjxTZWFyY2hSZXN1bHQ+IG5lKSB7CiAgICAgICAgIHN1cGVyLnVwZGF0ZShuZSk7CiAKICAgICAgICAgLy8gVXBkYXRlIHNlYXJjaC1zcGVjaWZpYyB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9TaW1wbGVDbGllbnRJZC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL1NpbXBsZUNsaWVudElkLmphdmEKaW5kZXggMjkxNTExMC4uNmZhNTQ3MSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL1NpbXBsZUNsaWVudElkLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL1NpbXBsZUNsaWVudElkLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00OSwyMyArNDksMjEgQEAKICAgICAgICAgICAgICAgICBzb2NrZXRGYWN0b3J5KTsKIAogICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7Ci0gICAgICAgIGludCBwd2RIYXNoQ29kZSA9IDA7CiAgICAgICAgIGlmIChwYXNzd2QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhpcy5wYXNzd2QgPSBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHBhc3N3ZCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgdGhpcy5wYXNzd2QgPSBwYXNzd2Q7CiAgICAgICAgIH0gZWxzZSBpZiAocGFzc3dkIGluc3RhbmNlb2YgYnl0ZVtdKSB7CiAgICAgICAgICAgICB0aGlzLnBhc3N3ZCA9ICgoYnl0ZVtdKXBhc3N3ZCkuY2xvbmUoKTsKLSAgICAgICAgICAgIHB3ZEhhc2hDb2RlID0gQXJyYXlzLmhhc2hDb2RlKChieXRlW10pcGFzc3dkKTsKICAgICAgICAgfSBlbHNlIGlmIChwYXNzd2QgaW5zdGFuY2VvZiBjaGFyW10pIHsKICAgICAgICAgICAgIHRoaXMucGFzc3dkID0gKChjaGFyW10pcGFzc3dkKS5jbG9uZSgpOwotICAgICAgICAgICAgcHdkSGFzaENvZGUgPSBBcnJheXMuaGFzaENvZGUoKGNoYXJbXSlwYXNzd2QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdGhpcy5wYXNzd2QgPSBwYXNzd2Q7Ci0gICAgICAgICAgICBwd2RIYXNoQ29kZSA9IHBhc3N3ZC5oYXNoQ29kZSgpOwogICAgICAgICB9CiAKICAgICAgICAgbXlIYXNoID0gc3VwZXIuaGFzaENvZGUoKQotICAgICAgICAgICAgXiAodXNlcm5hbWUgIT0gbnVsbCA/IHVzZXJuYW1lLmhhc2hDb2RlKCkgOiAwKQotICAgICAgICAgICAgXiBwd2RIYXNoQ29kZTsKKyAgICAgICAgICAgICsgKHVzZXJuYW1lICE9IG51bGwgPyB1c2VybmFtZS5oYXNoQ29kZSgpIDogMCkKKyAgICAgICAgICAgICsgKHBhc3N3ZCAhPSBudWxsID8gcGFzc3dkLmhhc2hDb2RlKCkgOiAwKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL3Bvb2wvUG9vbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL3Bvb2wvUG9vbC5qYXZhCmluZGV4IDI5YzRkMzIuLmY5Nzg2Y2EgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9wb29sL1Bvb2wuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvcG9vbC9Qb29sLmphdmEKQEAgLTExOCwxMSArMTE4LDcgQEAKICAgICAgICAgUG9vbGVkQ29ubmVjdGlvbkZhY3RvcnkgZmFjdG9yeSkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAKICAgICAgICAgZCgiZ2V0KCk6ICIsIGlkKTsKLSAgICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1hcCkgewotICAgICAgICAgICAgICAgIGQoInNpemU6ICIsIG1hcC5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGQoInNpemU6ICIsIG1hcC5zaXplKCkpOwogCiAgICAgICAgIGV4cHVuZ2VTdGFsZUNvbm5lY3Rpb25zKCk7CiAKQEAgLTE0NSw5ICsxNDEsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBLZWVwIHRoZSB3ZWFrIHJlZmVyZW5jZSB0aHJvdWdoIHRoZSBlbGVtZW50IG9mIGEgbGlua2VkIGxpc3QKICAgICAgICAgICAgICAgICB3ZWFrUmVmcy5hZGQod2Vha1JlZik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkKCJnZXQoKTogc2l6ZSBhZnRlcjogIiwgbWFwLnNpemUoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBkKCJnZXQoKTogc2l6ZSBhZnRlcjogIiwgbWFwLnNpemUoKSk7CisKICAgICAgICAgcmV0dXJuIGNvbm5zLmdldCh0aW1lb3V0LCBmYWN0b3J5KTsgLy8gZ2V0IG9uZSBjb25uZWN0aW9uIGZyb20gbGlzdAogICAgIH0KIApAQCAtMjEyLDI0ICsyMDksMTkgQEAKICAgICAgICAgb3V0LnByaW50bG4oIm1heGltdW0gcG9vbCBzaXplOiAiICsgbWF4U2l6ZSk7CiAgICAgICAgIG91dC5wcmludGxuKCJwcmVmZXJyZWQgcG9vbCBzaXplOiAiICsgcHJlZlNpemUpOwogICAgICAgICBvdXQucHJpbnRsbigiaW5pdGlhbCBwb29sIHNpemU6ICIgKyBpbml0U2l6ZSk7CisgICAgICAgIG91dC5wcmludGxuKCJjdXJyZW50IHBvb2wgc2l6ZTogIiArIG1hcC5zaXplKCkpOwogCi0gICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiY3VycmVudCBwb29sIHNpemU6ICIgKyBtYXAuc2l6ZSgpKTsKLQotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBDb25uZWN0aW9uc1JlZj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGlkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgY29ubnMgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldENvbm5lY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgICIgKyBpZCArICI6IiArIGNvbm5zLmdldFN0YXRzKCkpOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIENvbm5lY3Rpb25zUmVmPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgY29ubnMgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldENvbm5lY3Rpb25zKCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgIiArIGlkICsgIjoiICsgY29ubnMuZ2V0U3RhdHMoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBvdXQucHJpbnRsbigiPT09PT09IFBvb2wgZW5kID09PT09PT09PT09PT09PT09PT09PSIpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIiArIG1hcC50b1N0cmluZygpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAiICsgbWFwLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGQoU3RyaW5nIG1zZywgaW50IGkpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V4YW1wbGUvZGVidWcvdHR5L0V2ZW50SGFuZGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZXhhbXBsZS9kZWJ1Zy90dHkvRXZlbnRIYW5kbGVyLmphdmEKaW5kZXggY2Q0MTZjYy4uZmU2ZGQwNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZXhhbXBsZS9kZWJ1Zy90dHkvRXZlbnRIYW5kbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZXhhbXBsZS9kZWJ1Zy90dHkvRXZlbnRIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMzMsMTAgKzEzMyw2IEBACiAgICAgICAgICAgICBpZiAoIXZtRGllZCkgewogICAgICAgICAgICAgICAgIHZtRGlzY29ubmVjdEV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBJbmZvcm0gamRiIGNvbW1hbmQgbGluZSBwcm9jZXNzb3IgdGhhdCBqZGIgaXMgYmVpbmcgc2h1dGRvd24uIEpESy04MTU0MTQ0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAoKFRUWSlub3RpZmllcikuc2V0U2h1dHRpbmdEb3duKHRydWUpOwogICAgICAgICAgICAgRW52LnNodXRkb3duKHNodXRkb3duTWVzc2FnZUtleSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9leGFtcGxlL2RlYnVnL3R0eS9UVFkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V4YW1wbGUvZGVidWcvdHR5L1RUWS5qYXZhCmluZGV4IDUzMzg2NjUuLjE5NThiOWEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V4YW1wbGUvZGVidWcvdHR5L1RUWS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V4YW1wbGUvZGVidWcvdHR5L1RUWS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTYsMTYgKzU2LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJvZ25hbWUgPSAiamRiIjsKIAotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSBmYWxzZTsKLQotICAgIHB1YmxpYyB2b2lkIHNldFNodXR0aW5nRG93bihib29sZWFuIHMpIHsKLSAgICAgICBzaHV0dGluZ0Rvd24gPSBzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2h1dHRpbmdEb3duKCkgewotICAgICAgICByZXR1cm4gc2h1dHRpbmdEb3duOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZtU3RhcnRFdmVudChWTVN0YXJ0RXZlbnQgc2UpICB7CiAgICAgICAgIFRocmVhZC55aWVsZCgpOyAgLy8gZmV0Y2ggb3V0cHV0CkBAIC03NjAsMTMgKzc1MCw3IEBACiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBsbiA9IGluLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEpkYiBpcyBiZWluZyBzaHV0ZG93biBiZWNhdXNlIGRlYnVnZ2VlIGV4aXRlZCwgaWdub3JlIGFueSAnbnVsbCcKLSAgICAgICAgICAgICAgICAgICAgICogIHJldHVybmVkIGJ5IHJlYWRMaW5lKCkgZHVyaW5nIHNodXRkb3duLiBKREstODE1NDE0NC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTaHV0dGluZ0Rvd24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZU91dHB1dC5wcmludGxuKCJJbnB1dCBzdHJlYW0gY2xvc2VkLiIpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VPdXRwdXQucHJpbnRsbigiSW5wdXQgc3RyZWFtIGNsb3NlZC4iKTsKICAgICAgICAgICAgICAgICAgICAgbG4gPSAicXVpdCI7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvQ29udGFpbmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvQ29udGFpbmVyLmphdmEKaW5kZXggYjllNGY5MS4uNDdlNTgwYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L0NvbnRhaW5lci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9Db250YWluZXIuamF2YQpAQCAtMTA4OSwxOCArMTA4OSwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2hlY2tBZGRUb1NlbGYoY29tcCk7CiAgICAgICAgICAgICBjaGVja05vdEFXaW5kb3coY29tcCk7Ci0gICAgICAgICAgICAvKiBSZXBhcmVudCB0aGUgY29tcG9uZW50IGFuZCB0aWR5IHVwIHRoZSB0cmVlJ3Mgc3RhdGUuICovCi0gICAgICAgICAgICBpZiAoY29tcC5wYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbXAucGFyZW50LnJlbW92ZShjb21wKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiBjb21wb25lbnQuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgY29tcG9uZW50IHBvc2l0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRoaXNHQyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY29tcC5jaGVja0dEKHRoaXNHQy5nZXREZXZpY2UoKS5nZXRJRHN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCisgICAgICAgICAgICAvKiBSZXBhcmVudCB0aGUgY29tcG9uZW50IGFuZCB0aWR5IHVwIHRoZSB0cmVlJ3Mgc3RhdGUuICovCisgICAgICAgICAgICBpZiAoY29tcC5wYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbXAucGFyZW50LnJlbW92ZShjb21wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gY29tcG9uZW50LnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjb21wb25lbnQgcG9zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL2luZGV4ID09IC0xIG1lYW5zIGFkZCB0byB0aGUgZW5kLgogICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvU3BsYXNoU2NyZWVuLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvU3BsYXNoU2NyZWVuLmphdmEKaW5kZXggYzUxYWE2Zi4uMDVhMzhlNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L1NwbGFzaFNjcmVlbi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2F3dC9TcGxhc2hTY3JlZW4uamF2YQpAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgICAgICAgICBhc3NlcnQgc2NhbGUgPiAwOwogICAgICAgICAgICAgaWYgKHNjYWxlID4gMCAmJiBzY2FsZSAhPSAxKSB7CiAgICAgICAgICAgICAgICAgYm91bmRzLnNldFNpemUoKGludCkgKGJvdW5kcy5nZXRXaWR0aCgpIC8gc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdW5kcy5nZXRIZWlnaHQoKSAvIHNjYWxlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm91bmRzLmdldFdpZHRoKCkgLyBzY2FsZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGJvdW5kczsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYXd0L1RleHRBcmVhLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvVGV4dEFyZWEuamF2YQppbmRleCA3YzJhY2YwLi4zNGIyMTM3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvVGV4dEFyZWEuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9hd3QvVGV4dEFyZWEuamF2YQpAQCAtMzIyLDggKzMyMiw5IEBACiAgICAgICAgIFRleHRBcmVhUGVlciBwZWVyID0gKFRleHRBcmVhUGVlcil0aGlzLnBlZXI7CiAgICAgICAgIGlmIChwZWVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHBlZXIuaW5zZXJ0KHN0ciwgcG9zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBwb3MpICsgc3RyICsgdGV4dC5zdWJzdHJpbmcocG9zKTsKICAgICAgICAgfQotICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zKSArIHN0ciArIHRleHQuc3Vic3RyaW5nKHBvcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNDYsNyArMzQ3LDExIEBACiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYXBwZW5kVGV4dChTdHJpbmcgc3RyKSB7CisgICAgICAgIGlmIChwZWVyICE9IG51bGwpIHsKICAgICAgICAgICAgIGluc2VydFRleHQoc3RyLCBnZXRUZXh0KCkubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGV4dCA9IHRleHQgKyBzdHI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTM4MSw4ICszODYsOSBAQAogICAgICAgICBUZXh0QXJlYVBlZXIgcGVlciA9IChUZXh0QXJlYVBlZXIpdGhpcy5wZWVyOwogICAgICAgICBpZiAocGVlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBwZWVyLnJlcGxhY2VSYW5nZShzdHIsIHN0YXJ0LCBlbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIHN0ciArIHRleHQuc3Vic3RyaW5nKGVuZCk7CiAgICAgICAgIH0KLSAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0KSArIHN0ciArIHRleHQuc3Vic3RyaW5nKGVuZCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9iZWFucy9NZXRob2RSZWYuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2JlYW5zL01ldGhvZFJlZi5qYXZhCmluZGV4IDZiZTYxN2YuLjU5YjI2OTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2JlYW5zL01ldGhvZFJlZi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2JlYW5zL01ldGhvZFJlZi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjQsOSArNjQsMTAgQEAKICAgICAgICAgICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgdGhpcy5tZXRob2RSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgIHRoaXMudHlwZVJlZiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLm1ldGhvZFJlZiA9IG5ldyBTb2Z0UmVmZXJlbmNlPD4obWV0aG9kKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kUmVmID0gbmV3IFNvZnRSZWZlcmVuY2U8PihtZXRob2QpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpc1BhY2thZ2VBY2Nlc3NpYmxlKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKSA/IG1ldGhvZCA6IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvaW8vQ2hhckFycmF5UmVhZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQppbmRleCAyMTkwYmUzLi4wOGQ0NDdhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIuamF2YQpAQCAtMTMwLDEwICsxMzAsOCBAQAogICAgICAgICAgICAgaWYgKHBvcyA+PSBjb3VudCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGF2YWlsID0gY291bnQgLSBwb3M7Ci0gICAgICAgICAgICBpZiAobGVuID4gYXZhaWwpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBhdmFpbDsKKyAgICAgICAgICAgIGlmIChwb3MgKyBsZW4gPiBjb3VudCkgeworICAgICAgICAgICAgICAgIGxlbiA9IGNvdW50IC0gcG9zOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNTksMTAgKzE1Nyw4IEBACiAgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewogICAgICAgICAgICAgZW5zdXJlT3BlbigpOwotCi0gICAgICAgICAgICBsb25nIGF2YWlsID0gY291bnQgLSBwb3M7Ci0gICAgICAgICAgICBpZiAobiA+IGF2YWlsKSB7Ci0gICAgICAgICAgICAgICAgbiA9IGF2YWlsOworICAgICAgICAgICAgaWYgKHBvcyArIG4gPiBjb3VudCkgeworICAgICAgICAgICAgICAgIG4gPSBjb3VudCAtIHBvczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvaW8vU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtLmphdmEKaW5kZXggZjQ3ZWViYy4uNTA5YTk2YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvaW8vU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9pby9TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMTgsMTAgKzExOCw4IEBACiAgICAgICAgIGlmIChwb3MgPj0gY291bnQpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotCi0gICAgICAgIGludCBhdmFpbCA9IGNvdW50IC0gcG9zOwotICAgICAgICBpZiAobGVuID4gYXZhaWwpIHsKLSAgICAgICAgICAgIGxlbiA9IGF2YWlsOworICAgICAgICBpZiAocG9zICsgbGVuID4gY291bnQpIHsKKyAgICAgICAgICAgIGxlbiA9IGNvdW50IC0gcG9zOwogICAgICAgICB9CiAgICAgICAgIGlmIChsZW4gPD0gMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzLmphdmEKaW5kZXggYWNhYzI5Yi4uZGZkODYyOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTkxNSw5ICs5MTUsNiBAQAogICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBhcmd1bWVudCBpcyBudWxsCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGZpbmRDb25zdHJ1Y3RvcihDbGFzczw/PiByZWZjLCBNZXRob2RUeXBlIHR5cGUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKHJlZmMuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigibm8gY29uc3RydWN0b3IgZm9yIGFycmF5IGNsYXNzOiAiICsgcmVmYy5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiPGluaXQ+IjsKICAgICAgICAgICAgIE1lbWJlck5hbWUgY3RvciA9IHJlc29sdmVPckZhaWwoUkVGX25ld0ludm9rZVNwZWNpYWwsIHJlZmMsIG5hbWUsIHR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIGdldERpcmVjdENvbnN0cnVjdG9yKHJlZmMsIGN0b3IpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0JpdHMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pby9CaXRzLmphdmEKaW5kZXggNzcxMWI1YS4uYzdmMmI3OCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvL0JpdHMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uaW8vQml0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjE0LDggKzYxNCw3IEBACiAgICAgICAgIFN0cmluZyBhcmNoID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCiAgICAgICAgICAgICBuZXcgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRQcm9wZXJ0eUFjdGlvbigib3MuYXJjaCIpKTsKICAgICAgICAgdW5hbGlnbmVkID0gYXJjaC5lcXVhbHMoImkzODYiKSB8fCBhcmNoLmVxdWFscygieDg2IikKLSAgICAgICAgICAgIHx8IGFyY2guZXF1YWxzKCJhbWQ2NCIpIHx8IGFyY2guZXF1YWxzKCJ4ODZfNjQiKQotICAgICAgICAgICAgfHwgYXJjaC5lcXVhbHMoInBwYzY0IikgfHwgYXJjaC5lcXVhbHMoInBwYzY0bGUiKTsKKyAgICAgICAgICAgIHx8IGFyY2guZXF1YWxzKCJhbWQ2NCIpIHx8IGFyY2guZXF1YWxzKCJ4ODZfNjQiKTsKICAgICAgICAgdW5hbGlnbmVkS25vd24gPSB0cnVlOwogICAgICAgICByZXR1cm4gdW5hbGlnbmVkOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW4uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L1Byb3RlY3Rpb25Eb21haW4uamF2YQppbmRleCA5ZTU5N2JjLi5mZmQyZGVmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9Qcm90ZWN0aW9uRG9tYWluLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvUHJvdGVjdGlvbkRvbWFpbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTYgKzI1LDEyIEBACiAKIHBhY2thZ2UgamF2YS5zZWN1cml0eTsKIAotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiBpbXBvcnQgc3VuLm1pc2MuSmF2YVNlY3VyaXR5UHJvdGVjdGlvbkRvbWFpbkFjY2VzczsKIGltcG9ydCBzdGF0aWMgc3VuLm1pc2MuSmF2YVNlY3VyaXR5UHJvdGVjdGlvbkRvbWFpbkFjY2Vzcy5Qcm90ZWN0aW9uRG9tYWluQ2FjaGU7CiBpbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuRGVidWc7CkBAIC00NjAsMTQgKzQ1NiwyNCBAQAogICAgIC8qKgogICAgICAqIFVzZWQgZm9yIHN0b3JpbmcgUHJvdGVjdGlvbkRvbWFpbnMgYXMga2V5cyBpbiBhIE1hcC4KICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgS2V5IHt9CisgICAgZmluYWwgY2xhc3MgS2V5IHt9CiAKICAgICBzdGF0aWMgewogICAgICAgICBTaGFyZWRTZWNyZXRzLnNldEphdmFTZWN1cml0eVByb3RlY3Rpb25Eb21haW5BY2Nlc3MoCiAgICAgICAgICAgICBuZXcgSmF2YVNlY3VyaXR5UHJvdGVjdGlvbkRvbWFpbkFjY2VzcygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgUHJvdGVjdGlvbkRvbWFpbkNhY2hlIGdldFByb3RlY3Rpb25Eb21haW5DYWNoZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQRENhY2hlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvdGVjdGlvbkRvbWFpbkNhY2hlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8S2V5LCBQZXJtaXNzaW9uQ29sbGVjdGlvbj4gbWFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBXZWFrSGFzaE1hcDxLZXksIFBlcm1pc3Npb25Db2xsZWN0aW9uPigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHB1dChQcm90ZWN0aW9uRG9tYWluIHBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dCgocGQgPT0gbnVsbCA/IG51bGwgOiBwZC5rZXkpLCBwYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gZ2V0KFByb3RlY3Rpb25Eb21haW4gcGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGQgPT0gbnVsbCA/IG1hcC5nZXQobnVsbCkgOiBtYXAuZ2V0KHBkLmtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC00NzYsMTE5ICs0ODIsNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FjaGUgb2YgUHJvdGVjdGlvbkRvbWFpbnMgYW5kIHRoZWlyIFBlcm1pc3Npb25zLgotICAgICAqCi0gICAgICogVGhpcyBjbGFzcyBzdG9yZXMgUHJvdGVjdGlvbkRvbWFpbnMgYXMgd2VhayBrZXlzIGluIGEgQ29uY3VycmVudEhhc2hNYXAKLSAgICAgKiB3aXRoIGFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgY2hlY2tpbmcgYW5kIHJlbW92aW5nIHdlYWsga2V5cyB0aGF0IGFyZSBubwotICAgICAqIGxvbmdlciBpbiB1c2UuIFRoZXJlIGNhbiBiZSBjYXNlcyB3aGVyZSB0aGUgcGVybWlzc2lvbiBjb2xsZWN0aW9uIG1heQotICAgICAqIGhhdmUgYSBjaGFpbiBvZiBzdHJvbmcgcmVmZXJlbmNlcyBiYWNrIHRvIHRoZSBQcm90ZWN0aW9uRG9tYWluLCB3aGljaAotICAgICAqIG9yZGluYXJpbHkgd291bGQgcHJldmVudCB0aGUgZW50cnkgZnJvbSBiZWluZyByZW1vdmVkIGZyb20gdGhlIG1hcC4gVG8KLSAgICAgKiBhZGRyZXNzIHRoYXQsIHdlIHdyYXAgdGhlIHBlcm1pc3Npb24gY29sbGVjdGlvbiBpbiBhIFNvZnRSZWZlcmVuY2Ugc28KLSAgICAgKiB0aGF0IGl0IGNhbiBiZSByZWNsYWltZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGR1ZSB0byBtZW1vcnkgZGVtYW5kLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBEQ2FjaGUgaW1wbGVtZW50cyBQcm90ZWN0aW9uRG9tYWluQ2FjaGUgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvZnRSZWZlcmVuY2U8UGVybWlzc2lvbkNvbGxlY3Rpb24+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkTWFwID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWZlcmVuY2VRdWV1ZTxLZXk+IHF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlPD4oKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHV0KFByb3RlY3Rpb25Eb21haW4gcGQsIFBlcm1pc3Npb25Db2xsZWN0aW9uIHBjKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUXVldWUocXVldWUsIHBkTWFwKTsKLSAgICAgICAgICAgIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5IHdlYWtQZCA9Ci0gICAgICAgICAgICAgICAgbmV3IFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5KHBkLCBxdWV1ZSk7Ci0gICAgICAgICAgICBwZE1hcC5wdXQod2Vha1BkLCBuZXcgU29mdFJlZmVyZW5jZTw+KHBjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIGdldChQcm90ZWN0aW9uRG9tYWluIHBkKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUXVldWUocXVldWUsIHBkTWFwKTsKLSAgICAgICAgICAgIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5IHdlYWtQZCA9IG5ldyBXZWFrUHJvdGVjdGlvbkRvbWFpbktleShwZCk7Ci0gICAgICAgICAgICBTb2Z0UmVmZXJlbmNlPFBlcm1pc3Npb25Db2xsZWN0aW9uPiBzciA9IHBkTWFwLmdldCh3ZWFrUGQpOwotICAgICAgICAgICAgcmV0dXJuIChzciA9PSBudWxsKSA/IG51bGwgOiBzci5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW1vdmVzIHdlYWsga2V5cyBmcm9tIHRoZSBtYXAgdGhhdCBoYXZlIGJlZW4gZW5xdWV1ZWQKLSAgICAgICAgICogb24gdGhlIHJlZmVyZW5jZSBxdWV1ZSBhbmQgYXJlIG5vIGxvbmdlciBpbiB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NRdWV1ZShSZWZlcmVuY2VRdWV1ZTxLZXk+IHF1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50SGFzaE1hcDw/IGV4dGVuZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vha1JlZmVyZW5jZTxLZXk+LCA/PiBwZE1hcCkgewotICAgICAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBLZXk+IHJlZjsKLSAgICAgICAgICAgIHdoaWxlICgocmVmID0gcXVldWUucG9sbCgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGRNYXAucmVtb3ZlKHJlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHdlYWsga2V5IGZvciBhIFByb3RlY3Rpb25Eb21haW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2Vha1Byb3RlY3Rpb25Eb21haW5LZXkgZXh0ZW5kcyBXZWFrUmVmZXJlbmNlPEtleT4gewotICAgICAgICAvKioKLSAgICAgICAgICogU2F2ZWQgdmFsdWUgb2YgdGhlIHJlZmVyZW50J3MgaWRlbnRpdHkgaGFzaCBjb2RlLCB0byBtYWludGFpbgotICAgICAgICAgKiBhIGNvbnNpc3RlbnQgaGFzaCBjb2RlIGFmdGVyIHRoZSByZWZlcmVudCBoYXMgYmVlbiBjbGVhcmVkCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBoYXNoOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGtleSByZXByZXNlbnRpbmcgYSBudWxsIFByb3RlY3Rpb25Eb21haW4uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBLZXkgTlVMTF9LRVkgPSBuZXcgS2V5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXZWFrUHJvdGVjdGlvbkRvbWFpbiB3aXRoIHRoZSBzcGVjaWZpZWQgZG9tYWluIGFuZAotICAgICAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBxdWV1ZS4KLSAgICAgICAgICovCi0gICAgICAgIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5KFByb3RlY3Rpb25Eb21haW4gcGQsIFJlZmVyZW5jZVF1ZXVlPEtleT4gcnEpIHsKLSAgICAgICAgICAgIHRoaXMoKHBkID09IG51bGwgPyBOVUxMX0tFWSA6IHBkLmtleSksIHJxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5KFByb3RlY3Rpb25Eb21haW4gcGQpIHsKLSAgICAgICAgICAgIHRoaXMocGQgPT0gbnVsbCA/IE5VTExfS0VZIDogcGQua2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgV2Vha1Byb3RlY3Rpb25Eb21haW5LZXkoS2V5IGtleSwgUmVmZXJlbmNlUXVldWU8S2V5PiBycSkgewotICAgICAgICAgICAgc3VwZXIoa2V5LCBycSk7Ci0gICAgICAgICAgICBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5KEtleSBrZXkpIHsKLSAgICAgICAgICAgIHN1cGVyKGtleSk7Ci0gICAgICAgICAgICBoYXNoID0ga2V5Lmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgaWRlbnRpdHkgaGFzaCBjb2RlIG9mIHRoZSBvcmlnaW5hbCByZWZlcmVudC4KLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gaWRlbnRpY2FsCi0gICAgICAgICAqIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5IGluc3RhbmNlLCBvciwgaWYgdGhpcyBvYmplY3QncyByZWZlcmVudAotICAgICAgICAgKiBoYXMgbm90IGJlZW4gY2xlYXJlZCBhbmQgdGhlIGdpdmVuIG9iamVjdCBpcyBhbm90aGVyCi0gICAgICAgICAqIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5IGluc3RhbmNlIHdpdGggYW4gaWRlbnRpY2FsIG5vbi1udWxsCi0gICAgICAgICAqIHJlZmVyZW50IGFzIHRoaXMgb25lLgotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqID09IHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFdlYWtQcm90ZWN0aW9uRG9tYWluS2V5KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlZmVyZW50ID0gZ2V0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZWZlcmVudCAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAocmVmZXJlbnQgPT0gKChXZWFrUHJvdGVjdGlvbkRvbWFpbktleSlvYmopLmdldCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb20uamF2YQppbmRleCA2ODQ4YmU1Li4zNDgxZTIxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb20uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9TZWN1cmVSYW5kb20uamF2YQpAQCAtNDY0LDcgKzQ2NCw3IEBACiAgICAgICogQHBhcmFtIGJ5dGVzIHRoZSBhcnJheSB0byBiZSBmaWxsZWQgaW4gd2l0aCByYW5kb20gYnl0ZXMuCiAgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbmV4dEJ5dGVzKGJ5dGVbXSBieXRlcykgeworICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBuZXh0Qnl0ZXMoYnl0ZVtdIGJ5dGVzKSB7CiAgICAgICAgIHNlY3VyZVJhbmRvbVNwaS5lbmdpbmVOZXh0Qnl0ZXMoYnl0ZXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdGltZS9ab25lT2Zmc2V0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90aW1lL1pvbmVPZmZzZXQuamF2YQppbmRleCA5N2I3ZjEzLi5kYzI1NjJhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90aW1lL1pvbmVPZmZzZXQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90aW1lL1pvbmVPZmZzZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3NSwxNSArMzc1LDE1IEBACiAgICAgICAgIH0gZWxzZSBpZiAoKG1pbnV0ZXMgPiAwICYmIHNlY29uZHMgPCAwKSB8fCAobWludXRlcyA8IDAgJiYgc2Vjb25kcyA+IDApKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0ZVRpbWVFeGNlcHRpb24oIlpvbmUgb2Zmc2V0IG1pbnV0ZXMgYW5kIHNlY29uZHMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpZ24iKTsKICAgICAgICAgfQotICAgICAgICBpZiAobWludXRlcyA8IC01OSB8fCBtaW51dGVzID4gNTkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEYXRlVGltZUV4Y2VwdGlvbigiWm9uZSBvZmZzZXQgbWludXRlcyBub3QgaW4gdmFsaWQgcmFuZ2U6IHZhbHVlICIgKwotICAgICAgICAgICAgICAgICAgICBtaW51dGVzICsgIiBpcyBub3QgaW4gdGhlIHJhbmdlIC01OSB0byA1OSIpOworICAgICAgICBpZiAoTWF0aC5hYnMobWludXRlcykgPiA1OSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IERhdGVUaW1lRXhjZXB0aW9uKCJab25lIG9mZnNldCBtaW51dGVzIG5vdCBpbiB2YWxpZCByYW5nZTogYWJzKHZhbHVlKSAiICsKKyAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMobWludXRlcykgKyAiIGlzIG5vdCBpbiB0aGUgcmFuZ2UgMCB0byA1OSIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzZWNvbmRzIDwgLTU5IHx8IHNlY29uZHMgPiA1OSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERhdGVUaW1lRXhjZXB0aW9uKCJab25lIG9mZnNldCBzZWNvbmRzIG5vdCBpbiB2YWxpZCByYW5nZTogdmFsdWUgIiArCi0gICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKyAiIGlzIG5vdCBpbiB0aGUgcmFuZ2UgLTU5IHRvIDU5Iik7CisgICAgICAgIGlmIChNYXRoLmFicyhzZWNvbmRzKSA+IDU5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGF0ZVRpbWVFeGNlcHRpb24oIlpvbmUgb2Zmc2V0IHNlY29uZHMgbm90IGluIHZhbGlkIHJhbmdlOiBhYnModmFsdWUpICIgKworICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhzZWNvbmRzKSArICIgaXMgbm90IGluIHRoZSByYW5nZSAwIHRvIDU5Iik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKE1hdGguYWJzKGhvdXJzKSA9PSAxOCAmJiAobWludXRlcyB8IHNlY29uZHMpICE9IDApIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKGhvdXJzKSA9PSAxOCAmJiAoTWF0aC5hYnMobWludXRlcykgPiAwIHx8IE1hdGguYWJzKHNlY29uZHMpID4gMCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBEYXRlVGltZUV4Y2VwdGlvbigiWm9uZSBvZmZzZXQgbm90IGluIHZhbGlkIHJhbmdlOiAtMTg6MDAgdG8gKzE4OjAwIik7CiAgICAgICAgIH0KICAgICB9CkBAIC00MTEsNyArNDExLDcgQEAKICAgICAgKiBAdGhyb3dzIERhdGVUaW1lRXhjZXB0aW9uIGlmIHRoZSBvZmZzZXQgaXMgbm90IGluIHRoZSByZXF1aXJlZCByYW5nZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgWm9uZU9mZnNldCBvZlRvdGFsU2Vjb25kcyhpbnQgdG90YWxTZWNvbmRzKSB7Ci0gICAgICAgIGlmICh0b3RhbFNlY29uZHMgPCAtTUFYX1NFQ09ORFMgfHwgdG90YWxTZWNvbmRzID4gTUFYX1NFQ09ORFMpIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKHRvdGFsU2Vjb25kcykgPiBNQVhfU0VDT05EUykgewogICAgICAgICAgICAgdGhyb3cgbmV3IERhdGVUaW1lRXhjZXB0aW9uKCJab25lIG9mZnNldCBub3QgaW4gdmFsaWQgcmFuZ2U6IC0xODowMCB0byArMTg6MDAiKTsKICAgICAgICAgfQogICAgICAgICBpZiAodG90YWxTZWNvbmRzICUgKDE1ICogU0VDT05EU19QRVJfTUlOVVRFKSA9PSAwKSB7CkBAIC02OTYsMTIgKzY5NiwxMSBAQAogICAgICAqIFRoZSBjb21wYXJpc29uIGlzICJjb25zaXN0ZW50IHdpdGggZXF1YWxzIiwgYXMgZGVmaW5lZCBieSB7QGxpbmsgQ29tcGFyYWJsZX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3RoZXIgIHRoZSBvdGhlciBkYXRlIHRvIGNvbXBhcmUgdG8sIG5vdCBudWxsCi0gICAgICogQHJldHVybiB0aGUgY29tcGFyYXRvciB2YWx1ZSwgbmVnYXRpdmUgaWYgbGVzcywgcG9zaXRpdmUgaWYgZ3JlYXRlcgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBhcmF0b3IgdmFsdWUsIG5lZ2F0aXZlIGlmIGxlc3MsIHBvc3RpdmUgaWYgZ3JlYXRlcgogICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIG90aGVyfSBpcyBudWxsCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oWm9uZU9mZnNldCBvdGhlcikgewotICAgICAgICAvLyBhYnModG90YWxTZWNvbmRzKSA8PSBNQVhfU0VDT05EUywgc28gbm8gb3ZlcmZsb3cgY2FuIGhhcHBlbiBoZXJlCiAgICAgICAgIHJldHVybiBvdGhlci50b3RhbFNlY29uZHMgLSB0b3RhbFNlY29uZHM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90aW1lL2Zvcm1hdC9ab25lTmFtZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdGltZS9mb3JtYXQvWm9uZU5hbWUuamF2YQppbmRleCA2NDUyNDEzLi5mMWY2MTcwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90aW1lL2Zvcm1hdC9ab25lTmFtZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3RpbWUvZm9ybWF0L1pvbmVOYW1lLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw4ICsyNSwxMSBAQAogcGFja2FnZSBqYXZhLnRpbWUuZm9ybWF0OwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCiAgKiBBIGhlbHBlciBjbGFzcyB0byBtYXAgYSB6b25lIG5hbWUgdG8gbWV0YXpvbmUgYW5kIGJhY2sgdG8gdGhlCkBAIC0zMzIsNyArMzM1LDYgQEAKICAgICAgICAgIkFtZXJpY2EvRWlydW5lcGUiLCAiQW1hem9uIiwgIkFtZXJpY2EvTWFuYXVzIiwKICAgICAgICAgIkFmcmljYS9OYWlyb2JpIiwgIkFmcmljYV9FYXN0ZXJuIiwgIkFmcmljYS9OYWlyb2JpIiwKICAgICAgICAgIkFzaWEvWWFrdXRzayIsICJZYWt1dHNrIiwgIkFzaWEvWWFrdXRzayIsCi0gICAgICAgICJBc2lhL1lhbmdvbiIsICJNeWFubWFyIiwgIkFzaWEvUmFuZ29vbiIsCiAgICAgICAgICJBbWVyaWNhL0dvb3NlX0JheSIsICJBdGxhbnRpYyIsICJBbWVyaWNhL0hhbGlmYXgiLAogICAgICAgICAiQWZyaWNhL01hc2VydSIsICJBZnJpY2FfU291dGhlcm4iLCAiQWZyaWNhL0pvaGFubmVzYnVyZyIsCiAgICAgICAgICJBbWVyaWNhL1N3aWZ0X0N1cnJlbnQiLCAiQW1lcmljYV9DZW50cmFsIiwgIkFtZXJpY2EvQ2hpY2FnbyIsCkBAIC03NjgsNyArNzcwLDYgQEAKICAgICAgICAgIkFtZXJpY2EvSW5kaWFuYXBvbGlzIiwgIkFtZXJpY2EvSW5kaWFuYS9JbmRpYW5hcG9saXMiLAogICAgICAgICAiRXVyb3BlL0JlbGZhc3QiLCAiRXVyb3BlL0xvbmRvbiIsCiAgICAgICAgICJBbWVyaWNhL0tyYWxlbmRpamsiLCAiQW1lcmljYS9DdXJhY2FvIiwKLSAgICAgICAgIkFzaWEvUmFuZ29vbiIsICJBc2lhL1lhbmdvbiIsCiAgICAgfTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gemlkVG9Nem9uZSA9IG5ldyBIYXNoTWFwPD4oKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQXJyYXlMaXN0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0FycmF5TGlzdC5qYXZhCmluZGV4IDBhZjMzODguLjkyNWNjMTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQXJyYXlMaXN0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9BcnJheUxpc3QuamF2YQpAQCAtODQyLDggKzg0Miw2IEBACiAgICAgICAgIGludCBsYXN0UmV0ID0gLTE7IC8vIGluZGV4IG9mIGxhc3QgZWxlbWVudCByZXR1cm5lZDsgLTEgaWYgbm8gc3VjaAogICAgICAgICBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IG1vZENvdW50OwogCi0gICAgICAgIEl0cigpIHt9Ci0KICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgIHJldHVybiBjdXJzb3IgIT0gc2l6ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9CYXNlNjQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQmFzZTY0LmphdmEKaW5kZXggNjFmNjhkMy4uMTcyYWNiZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9CYXNlNjQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0Jhc2U2NC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzg4LDcgKzc4OCw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaWYgKGNsb3NlZCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBpcyBjbG9zZWQiKTsKLSAgICAgICAgICAgIGlmIChvZmYgPCAwIHx8IGxlbiA8IDAgfHwgbGVuID4gYi5sZW5ndGggLSBvZmYpCisgICAgICAgICAgICBpZiAob2ZmIDwgMCB8fCBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IGIubGVuZ3RoKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0N1cnJlbmN5RGF0YS5wcm9wZXJ0aWVzIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9DdXJyZW5jeURhdGEucHJvcGVydGllcwppbmRleCBiM2ZmNTE3Li41ZjI2NTZlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0N1cnJlbmN5RGF0YS5wcm9wZXJ0aWVzCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvQ3VycmVuY3lEYXRhLnByb3BlcnRpZXMKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw3ICszMSw3IEBACiAjIFZlcnNpb24gb2YgdGhlIGN1cnJlbmN5IGNvZGUgaW5mb3JtYXRpb24gaW4gdGhpcyBjbGFzcy4KICMgSXQgaXMgYSBzZXJpYWwgbnVtYmVyIHRoYXQgYWNjb21wYW5pZXMgd2l0aCBlYWNoIGFtZW5kbWVudC4KIAotZGF0YVZlcnNpb249MTYwCitkYXRhVmVyc2lvbj0xNTkKIAogIyBMaXN0IG9mIGFsbCB2YWxpZCBJU08gNDIxNyBjdXJyZW5jeSBjb2Rlcy4KICMgVG8gZW5zdXJlIGNvbXBhdGliaWxpdHksIGRvIG5vdCByZW1vdmUgY29kZXMuCkBAIC0xMDksNyArMTA5LDcgQEAKIEFUPUVVUgogIyBBWkVSQkFJSkFOCiBBWj1BWk4KLSMgQkFIQU1BUyAoVEhFKQorIyBCQUhBTUFTCiBCUz1CU0QKICMgQkFIUkFJTgogQkg9QkhECkBAIC0xMzEsNyArMTMxLDcgQEAKIEJRPVVTRAogIyBCSFVUQU4KIEJUPUJUTgotIyBCT0xJVklBIChQTFVSSU5BVElPTkFMIFNUQVRFIE9GKQorIyBCT0xJVklBCiBCTz1CT0IKICMgQk9TTklBIEFORCBIRVJaRUdPVklOQQogQkE9QkFNCkBAIC0xNDEsNyArMTQxLDcgQEAKIEJWPU5PSwogIyBCUkFaSUwKIEJSPUJSTAotIyBCUklUSVNIIElORElBTiBPQ0VBTiBURVJSSVRPUlkgKFRIRSkKKyMgQlJJVElTSCBJTkRJQU4gT0NFQU4gVEVSUklUT1JZCiBJTz1VU0QKICMgQlJVTkVJIERBUlVTU0FMQU0KIEJOPUJORApAQCAtMTU5LDkgKzE1OSw5IEBACiBDQT1DQUQKICMgQ0FQRSBWRVJERQogQ1Y9Q1ZFCi0jIENBWU1BTiBJU0xBTkRTIChUSEUpCisjIENBWU1BTiBJU0xBTkRTCiBLWT1LWUQKLSMgQ0VOVFJBTCBBRlJJQ0FOIFJFUFVCTElDIChUSEUpCisjIENFTlRSQUwgQUZSSUNBTiBSRVBVQkxJQwogQ0Y9WEFGCiAjIENIQUQKIFREPVhBRgpAQCAtMTcxLDE3ICsxNzEsMTcgQEAKIENOPUNOWQogIyBDSFJJU1RNQVMgSVNMQU5ECiBDWD1BVUQKLSMgQ09DT1MgKEtFRUxJTkcpIElTTEFORFMgKFRIRSkKKyMgQ09DT1MgKEtFRUxJTkcpIElTTEFORFMKIENDPUFVRAogIyBDT0xPTUJJQQogQ089Q09QCi0jIENPTU9ST1MgKFRIRSkKKyMgQ09NT1JPUwogS009S01GCi0jIENPTkdPIChUSEUpCisjIENPTkdPCiBDRz1YQUYKLSMgQ09OR08gKFRIRSBERU1PQ1JBVElDIFJFUFVCTElDIE9GIFRIRSkKKyMgQ09OR08sIFRIRSBERU1PQ1JBVElDIFJFUFVCTElDIE9GIFRIRQogQ0Q9Q0RGCi0jIENPT0sgSVNMQU5EUyAoVEhFKQorIyBDT09LIElTTEFORFMKIENLPU5aRAogIyBDT1NUQSBSSUNBCiBDUj1DUkMKQEAgLTE5NSw3ICsxOTUsNyBAQAogQ1c9QU5HCiAjIENZUFJVUwogQ1k9RVVSCi0jIENaRUNIIFJFUFVCTElDIChUSEUpCisjIENaRUNIIFJFUFVCTElDCiBDWj1DWksKICMgREVOTUFSSwogREs9REtLCkBAIC0yMDMsNyArMjAzLDcgQEAKIERKPURKRgogIyBET01JTklDQQogRE09WENECi0jIERPTUlOSUNBTiBSRVBVQkxJQyAoVEhFKQorIyBET01JTklDQU4gUkVQVUJMSUMKIERPPURPUAogIyBFQ1VBRE9SCiBFQz1VU0QKQEAgLTIyMCw5ICsyMjAsOSBAQAogRUU9RVVSCiAjIEVUSElPUElBCiBFVD1FVEIKLSMgRkFMS0xBTkQgSVNMQU5EUyAoVEhFKSBbTUFMVklOQVNdCisjIEZBTEtMQU5EIElTTEFORFMgKE1BTFZJTkFTKQogRks9RktQCi0jIEZBUk9FIElTTEFORFMgKFRIRSkKKyMgRkFST0UgSVNMQU5EUwogRk89REtLCiAjIEZJSkkKIEZKPUZKRApAQCAtMjM0LDExICsyMzQsMTEgQEAKIEdGPUVVUgogIyBGUkVOQ0ggUE9MWU5FU0lBCiBQRj1YUEYKLSMgRlJFTkNIIFNPVVRIRVJOIFRFUlJJVE9SSUVTIChUSEUpCisjIEZSRU5DSCBTT1VUSEVSTiBURVJSSVRPUklFUwogVEY9RVVSCiAjIEdBQk9OCiBHQT1YQUYKLSMgR0FNQklBIChUSEUpCisjIEdBTUJJQQogR009R01ECiAjIEdFT1JHSUEKIEdFPUdFTApAQCAtMjcyLDcgKzI3Miw3IEBACiBIVD1IVEcKICMgSEVBUkQgSVNMQU5EIEFORCBNQ0RPTkFMRCBJU0xBTkRTCiBITT1BVUQKLSMgSE9MWSBTRUUgKFRIRSkKKyMgSE9MWSBTRUUgKFZBVElDQU4gQ0lUWSBTVEFURSkKIFZBPUVVUgogIyBIT05EVVJBUwogSE49SE5MCkBAIC0yODYsNyArMjg2LDcgQEAKIElOPUlOUgogIyBJTkRPTkVTSUEKIElEPUlEUgotIyBJUkFOIChJU0xBTUlDIFJFUFVCTElDIE9GKQorIyBJUkFOLCBJU0xBTUlDIFJFUFVCTElDIE9GCiBJUj1JUlIKICMgSVJBUQogSVE9SVFECkBAIC0zMTIsMTUgKzMxMiwxNSBAQAogS0U9S0VTCiAjIEtJUklCQVRJCiBLST1BVUQKLSMgS09SRUEgKFRIRSBERU1PQ1JBVElDIFBFT1BMRSdTIFJFUFVCTElDIE9GKQorIyBLT1JFQSwgREVNT0NSQVRJQyBQRU9QTEUnUyBSRVBVQkxJQyBPRgogS1A9S1BXCi0jIEtPUkVBIChUSEUgUkVQVUJMSUMgT0YpCisjIEtPUkVBLCBSRVBVQkxJQyBPRgogS1I9S1JXCiAjIEtVV0FJVAogS1c9S1dECiAjIEtZUkdZWlNUQU4KIEtHPUtHUwotIyBMQU8gUEVPUExFJ1MgREVNT0NSQVRJQyBSRVBVQkxJQyAoVEhFKQorIyBMQU8gUEVPUExFJ1MgREVNT0NSQVRJQyBSRVBVQkxJQwogTEE9TEFLCiAjIExBVFZJQQogTFY9TFZMOzIwMTMtMTItMzEtMjItMDAtMDA7RVVSCkBAIC0zNDAsNyArMzQwLDcgQEAKIExVPUVVUgogIyBNQUNBVQogTU89TU9QCi0jIE1BQ0VET05JQSAoVEhFIEZPUk1FUiBZVUdPU0xBViBSRVBVQkxJQyBPRikKKyMgTUFDRURPTklBLCBUSEUgRk9STUVSIFlVR09TTEFWIFJFUFVCTElDIE9GCiBNSz1NS0QKICMgTUFEQUdBU0NBUgogTUc9TUdBCkBAIC0zNTQsNyArMzU0LDcgQEAKIE1MPVhPRgogIyBNQUxUQQogTVQ9RVVSCi0jIE1BUlNIQUxMIElTTEFORFMgKFRIRSkKKyMgTUFSU0hBTEwgSVNMQU5EUwogTUg9VVNECiAjIE1BUlRJTklRVUUKIE1RPUVVUgpAQCAtMzY2LDkgKzM2Niw5IEBACiBZVD1FVVIKICMgTUVYSUNPCiBNWD1NWE4KLSMgTUlDUk9ORVNJQSAoRkVERVJBVEVEIFNUQVRFUyBPRikKKyMgTUlDUk9ORVNJQSwgRkVERVJBVEVEIFNUQVRFUyBPRgogRk09VVNECi0jIE1PTERPVkEgKFRIRSBSRVBVQkxJQyBPRikKKyMgTU9MRE9WQSwgUkVQVUJMSUMgT0YKIE1EPU1ETAogIyBNT05BQ08KIE1DPUVVUgpAQCAtMzkwLDcgKzM5MCw3IEBACiBOUj1BVUQKICMgTkVQQUwKIE5QPU5QUgotIyBORVRIRVJMQU5EUyAoVEhFKQorIyBORVRIRVJMQU5EUwogTkw9RVVSCiAjIE5FVEhFUkxBTkRTIEFOVElMTEVTCiBBTj1BTkcKQEAgLTQwMCw3ICs0MDAsNyBAQAogTlo9TlpECiAjIE5JQ0FSQUdVQQogTkk9TklPCi0jIE5JR0VSIChUSEUpCisjIE5JR0VSCiBORT1YT0YKICMgTklHRVJJQQogTkc9TkdOCkBAIC00MDgsNyArNDA4LDcgQEAKIE5VPU5aRAogIyBOT1JGT0xLIElTTEFORAogTkY9QVVECi0jIE5PUlRIRVJOIE1BUklBTkEgSVNMQU5EUyAoVEhFKQorIyBOT1JUSEVSTiBNQVJJQU5BIElTTEFORFMKIE1QPVVTRAogIyBOT1JXQVkKIE5PPU5PSwpAQCAtNDI4LDcgKzQyOCw3IEBACiBQWT1QWUcKICMgUEVSVQogUEU9UEVOCi0jIFBISUxJUFBJTkVTIChUSEUpCisjIFBISUxJUFBJTkVTCiBQSD1QSFAKICMgUElUQ0FJUk4KIFBOPU5aRApAQCAtNDQ0LDcgKzQ0NCw3IEBACiBSRT1FVVIKICMgUk9NQU5JQQogUk89Uk9OCi0jIFJVU1NJQU4gRkVERVJBVElPTiAoVEhFKQorIyBSVVNTSUFOIEZFREVSQVRJT04KIFJVPVJVQgogIyBSV0FOREEKIFJXPVJXRgpAQCAtNTAwLDcgKzUwMCw3IEBACiBFUz1FVVIKICMgU1JJIExBTktBCiBMSz1MS1IKLSMgU1VEQU4gKFRIRSkKKyMgU1VEQU4KIFNEPVNERwogIyBTVVJJTkFNRQogU1I9U1JECkBAIC01MTYsNyArNTE2LDcgQEAKIENIPUNIRgogIyBTWVJJQU4gQVJBQiBSRVBVQkxJQwogU1k9U1lQCi0jIFRBSVdBTiAoUFJPVklOQ0UgT0YgQ0hJTkEpCisjIFRBSVdBTgogVFc9VFdECiAjIFRBSklLSVNUQU4KIFRKPVRKUwpAQCAtNTQwLDcgKzU0MCw3IEBACiBUUj1UUlkKICMgVFVSS01FTklTVEFOCiBUTT1UTVQKLSMgVFVSS1MgQU5EIENBSUNPUyBJU0xBTkRTIChUSEUpCisjIFRVUktTIEFORCBDQUlDT1MgSVNMQU5EUwogVEM9VVNECiAjIFRVVkFMVQogVFY9QVVECkBAIC01NDgsMTMgKzU0OCwxMyBAQAogVUc9VUdYCiAjIFVLUkFJTkUKIFVBPVVBSAotIyBVTklURUQgQVJBQiBFTUlSQVRFUyAoVEhFKQorIyBVTklURUQgQVJBQiBFTUlSQVRFUwogQUU9QUVECi0jIFVOSVRFRCBLSU5HRE9NIE9GIEdSRUFUIEJSSVRBSU4gQU5EIE5PUlRIRVJOIElSRUxBTkQgKFRIRSkKKyMgVU5JVEVEIEtJTkdET00KIEdCPUdCUAotIyBVTklURUQgU1RBVEVTIE9GIEFNRVJJQ0EgKFRIRSkKKyMgVU5JVEVEIFNUQVRFUwogVVM9VVNECi0jIFVOSVRFRCBTVEFURVMgTUlOT1IgT1VUTFlJTkcgSVNMQU5EUyAoVEhFKQorIyBVTklURUQgU1RBVEVTIE1JTk9SIE9VVExZSU5HIElTTEFORFMKIFVNPVVTRAogIyBVUlVHVUFZCiBVWT1VWVUKQEAgLTU2Miw3ICs1NjIsNyBAQAogVVo9VVpTCiAjIFZBTlVBVFUKIFZVPVZVVgotIyBWRU5FWlVFTEEgKEJPTElWQVJJQU4gUkVQVUJMSUMgT0YpCisjIFZFTkVaVUVMQQogVkU9VkVGCiAjIFZJRVQgTkFNCiBWTj1WTkQKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9jcnlwdG8vSmNlU2VjdXJpdHkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9jcnlwdG8vSmNlU2VjdXJpdHkuamF2YQppbmRleCA1ZGVmMjc3Li4yOTgyM2U3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvY3J5cHRvL0pjZVNlY3VyaXR5LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2NyeXB0by9KY2VTZWN1cml0eS5qYXZhCkBAIC0yOSwxNCArMjksMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuamFyLio7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5maWxlLio7CiBpbXBvcnQgamF2YS5zZWN1cml0eS4qOwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlci5TZXJ2aWNlOwogCiBpbXBvcnQgc3VuLnNlY3VyaXR5LmpjYS4qOwogaW1wb3J0IHN1bi5zZWN1cml0eS5qY2EuR2V0SW5zdGFuY2UuSW5zdGFuY2U7Ci1pbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuRGVidWc7CiAKIC8qKgogICogVGhpcyBjbGFzcyBpbnN0YW50aWF0ZXMgaW1wbGVtZW50YXRpb25zIG9mIEpDRSBlbmdpbmUgY2xhc3NlcyBmcm9tCkBAIC02OCw5ICs2Niw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzUmVzdHJpY3RlZDsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlYnVnIGRlYnVnID0KLSAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnLmdldEluc3RhbmNlKCJqY2EiLCAiQ2lwaGVyIik7Ci0KICAgICAvKgogICAgICAqIERvbid0IGxldCBhbnlvbmUgaW5zdGFudGlhdGUgdGhpcy4KICAgICAgKi8KQEAgLTIwOSw3ICsyMDQsNyBAQAogCiAgICAgc3RhdGljIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE5VTExfVVJMID0gbmV3IFVSTCgiaHR0cDovL251bGwub3JhY2xlLmNvbS8iKTsKKyAgICAgICAgICAgIE5VTExfVVJMID0gbmV3IFVSTCgiaHR0cDovL251bGwuc3VuLmNvbS8iKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CkBAIC0yNDQsNzAgKzIzOSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHdpdGhpbiBhbiBkb1ByaXZpbGVnZWQgYmxvY2suCi0gICAgICoKLSAgICAgKiBGb2xsb3dpbmcgbG9naWMgaXMgdXNlZCB0byBkZWNpZGUgd2hhdCBwb2xpY3kgZmlsZXMgYXJlIHNlbGVjdGVkLgotICAgICAqCi0gICAgICogSWYgdGhlIG5ldyBTZWN1cml0eSBwcm9wZXJ0eSAoY3J5cHRvLnBvbGljeSkgaXMgc2V0IGluIHRoZQotICAgICAqIGphdmEuc2VjdXJpdHkgZmlsZSwgb3IgaGFzIGJlZW4gc2V0IGR5bmFtaWNhbGx5IHVzaW5nIHRoZQotICAgICAqIFNlY3VyaXR5LnNldFByb3BlcnR5KCkgY2FsbCBiZWZvcmUgdGhlIEpDRSBmcmFtZXdvcmsgaGFzCi0gICAgICogYmVlbiBpbml0aWFsaXplZCwgdGhhdCBzZXR0aW5nIHdpbGwgYmUgdXNlZC4KLSAgICAgKiBSZW1lbWJlciAtIHRoaXMgcHJvcGVydHkgaXMgbm90IGRlZmluZWQgYnkgZGVmYXVsdC4gQSBjb25zY2lvdXMKLSAgICAgKiB1c2VyIGVkaXQgb3IgYW4gYXBwbGljYXRpb24gY2FsbCBpcyByZXF1aXJlZC4KLSAgICAgKgotICAgICAqIE90aGVyd2lzZSwgaWYgdXNlciBoYXMgcG9saWN5IGphciBmaWxlcyBpbnN0YWxsZWQgaW4gdGhlIGxlZ2FjeQotICAgICAqIGpyZS9saWIvc2VjdXJpdHkvIGRpcmVjdG9yeSwgdGhlIEpESyB3aWxsIGhvbm9yIHdoYXRldmVyCi0gICAgICogc2V0dGluZyBpcyBzZXQgYnkgdGhvc2UgcG9saWN5IGZpbGVzLiAobGVnYWN5L2N1cnJlbnQgYmVoYXZpb3IpCi0gICAgICoKLSAgICAgKiBJZiBub25lIG9mIHRoZSBhYm92ZSAyIGNvbmRpdGlvbnMgYXJlIG1ldCwgdGhlIEpESyB3aWxsIGRlZmF1bHQKLSAgICAgKiB0byB1c2luZyB0aGUgbGltaXRlZCBjcnlwdG8gcG9saWN5IGZpbGVzIGZvdW5kIGluIHRoZQotICAgICAqIGpyZS9saWIvc2VjdXJpdHkvcG9saWN5L2xpbWl0ZWQvIGRpcmVjdG9yeQotICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBKdXJpc2RpY3Rpb25Qb2xpY2llcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIGNyeXB0by5wb2xpY3kgU2VjdXJpdHkgcHJvcGVydHkuICBTaW5nbGUKLSAgICAgICAgLy8gZGlyZWN0b3J5IGVudHJ5LCBubyBwc2V1ZG8tZGlyZWN0b3JpZXMgKCIuIiwgIi4uIiwgbGVhZGluZy90cmFpbGluZwotICAgICAgICAvLyBwYXRoIHNlcGFyYXRvcnMpLiBub3JtYWxpemUoKS9nZXRQYXJlbnQoKSB3aWxsIGhlbHAgbGF0ZXIuCi0gICAgICAgIFN0cmluZyBqYXZhSG9tZVByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsKLSAgICAgICAgU3RyaW5nIGNyeXB0b1BvbGljeVByb3BlcnR5ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoImNyeXB0by5wb2xpY3kiKTsKLSAgICAgICAgUGF0aCBjcFBhdGggPSAoY3J5cHRvUG9saWN5UHJvcGVydHkgPT0gbnVsbCkgPyBudWxsIDoKLSAgICAgICAgICAgICAgICBQYXRocy5nZXQoY3J5cHRvUG9saWN5UHJvcGVydHkpOworICAgICAgICBTdHJpbmcgamF2YUhvbWVEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOworICAgICAgICBTdHJpbmcgc2VwID0gRmlsZS5zZXBhcmF0b3I7CisgICAgICAgIFN0cmluZyBwYXRoVG9Qb2xpY3lKYXIgPSBqYXZhSG9tZURpciArIHNlcCArICJsaWIiICsgc2VwICsKKyAgICAgICAgICAgICJzZWN1cml0eSIgKyBzZXA7CiAKLSAgICAgICAgaWYgKChjcFBhdGggIT0gbnVsbCkgJiYgKChjcFBhdGguZ2V0TmFtZUNvdW50KCkgIT0gMSkgfHwKLSAgICAgICAgICAgICAgICAoY3BQYXRoLmNvbXBhcmVUbyhjcFBhdGguZ2V0RmlsZU5hbWUoKSkpICE9IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHBvbGljeSBkaXJlY3RvcnkgbmFtZSBmb3JtYXQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b1BvbGljeVByb3BlcnR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjcFBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gU2VjdXJpdHkgcHJvcGVydHkgaXMgbm90IHNldCwgdXNlIGRlZmF1bHQgcGF0aAotICAgICAgICAgICAgY3BQYXRoID0gUGF0aHMuZ2V0KGphdmFIb21lUHJvcGVydHksICJsaWIiLCAic2VjdXJpdHkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHBvcHVsYXRlIHdpdGggamF2YS5ob21lCi0gICAgICAgICAgICBjcFBhdGggPSBQYXRocy5nZXQoamF2YUhvbWVQcm9wZXJ0eSwgImxpYiIsICJzZWN1cml0eSIsCi0gICAgICAgICAgICAgICAgICAgICJwb2xpY3kiLCBjcnlwdG9Qb2xpY3lQcm9wZXJ0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCkgewotICAgICAgICAgICAgZGVidWcucHJpbnRsbigiY3J5cHRvIHBvbGljeSBkaXJlY3Rvcnk6ICIgKyBjcFBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBleHBvcnRKYXIgPSBuZXcgRmlsZShjcFBhdGgudG9GaWxlKCksIlVTX2V4cG9ydF9wb2xpY3kuamFyIik7Ci0gICAgICAgIEZpbGUgaW1wb3J0SmFyID0gbmV3IEZpbGUoY3BQYXRoLnRvRmlsZSgpLCJsb2NhbF9wb2xpY3kuamFyIik7Ci0KLSAgICAgICAgaWYgKGNyeXB0b1BvbGljeVByb3BlcnR5ID09IG51bGwgJiYgKCFleHBvcnRKYXIuZXhpc3RzKCkgfHwKLSAgICAgICAgICAgICAgICAhaW1wb3J0SmFyLmV4aXN0cygpKSkgewotICAgICAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSBzZXQgdXAuIElmIGNyeXB0by5wb2xpY3kgaXMgbm90IGRlZmluZWQuCi0gICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgbGVnYWN5IGphcnMgZXhpc3QgaW4gbGliIGRpcmVjdG9yeS4gSWYKLSAgICAgICAgICAgIC8vIHRoZXkgZG9uJ3QgZXhpc3QsIHdlIGRlZmF1bHQgdG8gbGltaXRlZCBwb2xpY3kgbW9kZS4KLSAgICAgICAgICAgIGNwUGF0aCA9IFBhdGhzLmdldCgKLSAgICAgICAgICAgICAgICAgICAgamF2YUhvbWVQcm9wZXJ0eSwgImxpYiIsICJzZWN1cml0eSIsICJwb2xpY3kiLCAibGltaXRlZCIpOwotICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIG5ldyBqYXIgZmlsZXMgaW4gbGltaXRlZCBkaXJlY3RvcnkKLSAgICAgICAgICAgIGV4cG9ydEphciA9IG5ldyBGaWxlKGNwUGF0aC50b0ZpbGUoKSwiVVNfZXhwb3J0X3BvbGljeS5qYXIiKTsKLSAgICAgICAgICAgIGltcG9ydEphciA9IG5ldyBGaWxlKGNwUGF0aC50b0ZpbGUoKSwibG9jYWxfcG9saWN5LmphciIpOwotICAgICAgICB9Ci0KKyAgICAgICAgRmlsZSBleHBvcnRKYXIgPSBuZXcgRmlsZShwYXRoVG9Qb2xpY3lKYXIsICJVU19leHBvcnRfcG9saWN5LmphciIpOworICAgICAgICBGaWxlIGltcG9ydEphciA9IG5ldyBGaWxlKHBhdGhUb1BvbGljeUphciwgImxvY2FsX3BvbGljeS5qYXIiKTsKICAgICAgICAgVVJMIGpjZUNpcGhlclVSTCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlCiAgICAgICAgICAgICAgICAgKCJqYXZheC9jcnlwdG8vQ2lwaGVyLmNsYXNzIik7CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL0tlcmJlcm9zVGlja2V0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc2VjdXJpdHkvYXV0aC9rZXJiZXJvcy9LZXJiZXJvc1RpY2tldC5qYXZhCmluZGV4IDlhMjA4YTUuLmM5ZTJiMjggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL0tlcmJlcm9zVGlja2V0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvS2VyYmVyb3NUaWNrZXQuamF2YQpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGlja2V0IGlzIGZvcndhcmRhYmxlLCBmYWxzZSBpZiBub3QuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGb3J3YXJkYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZsYWdzID09IG51bGw/IGZhbHNlOiBmbGFnc1tGT1JXQVJEQUJMRV9USUNLRVRfRkxBR107CisgICAgICAgIHJldHVybiBmbGFnc1tGT1JXQVJEQUJMRV9USUNLRVRfRkxBR107CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODksNyArMzg5LDcgQEAKICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNGb3J3YXJkZWQoKSB7Ci0gICAgICAgIHJldHVybiBmbGFncyA9PSBudWxsPyBmYWxzZTogZmxhZ3NbRk9SV0FSREVEX1RJQ0tFVF9GTEFHXTsKKyAgICAgICAgcmV0dXJuIGZsYWdzW0ZPUldBUkRFRF9USUNLRVRfRkxBR107CiAgICAgfQogCiAgICAgLyoqCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0aWNrZXQgaXMgcHJveGlhYmxlLCBmYWxzZSBpZiBub3QuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcm94aWFibGUoKSB7Ci0gICAgICAgIHJldHVybiBmbGFncyA9PSBudWxsPyBmYWxzZTogZmxhZ3NbUFJPWElBQkxFX1RJQ0tFVF9GTEFHXTsKKyAgICAgICAgcmV0dXJuIGZsYWdzW1BST1hJQUJMRV9USUNLRVRfRkxBR107CiAgICAgfQogCiAgICAgLyoqCkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB0aWNrZXQgaXMgYSBwcm94eS10aWNrZXQsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Byb3h5KCkgewotICAgICAgICByZXR1cm4gZmxhZ3MgPT0gbnVsbD8gZmFsc2U6IGZsYWdzW1BST1hZX1RJQ0tFVF9GTEFHXTsKKyAgICAgICAgcmV0dXJuIGZsYWdzW1BST1hZX1RJQ0tFVF9GTEFHXTsKICAgICB9CiAKIApAQCAtNDE3LDcgKzQxNyw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdGlja2V0IGlzIHBvc3QtZGF0ZWQsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1Bvc3RkYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZsYWdzID09IG51bGw/IGZhbHNlOiBmbGFnc1tQT1NUREFURURfVElDS0VUX0ZMQUddOworICAgICAgICByZXR1cm4gZmxhZ3NbUE9TVERBVEVEX1RJQ0tFVF9GTEFHXTsKICAgICB9CiAKICAgICAvKioKQEAgLTQyOCw3ICs0MjgsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRpY2tldCBpcyByZW5ld2FibGUsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlbmV3YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZsYWdzID09IG51bGw/IGZhbHNlOiBmbGFnc1tSRU5FV0FCTEVfVElDS0VUX0ZMQUddOworICAgICAgICByZXR1cm4gZmxhZ3NbUkVORVdBQkxFX1RJQ0tFVF9GTEFHXTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzOSw3ICs0MzksNyBAQAogICAgICAqIHByb3RvY29sLCBmYWxzZSBpZiBub3QuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsKCkgewotICAgICAgICByZXR1cm4gZmxhZ3MgPT0gbnVsbD8gZmFsc2U6IGZsYWdzW0lOSVRJQUxfVElDS0VUX0ZMQUddOworICAgICAgICByZXR1cm4gZmxhZ3NbSU5JVElBTF9USUNLRVRfRkxBR107CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzksNyArNDc5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBleHBpcmF0aW9uIHRpbWUgZm9yIHRoaXMgdGlja2V0J3MgdmFsaWRpdHkgcGVyaW9kLgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBqYXZhLnV0aWwuRGF0ZSBnZXRFbmRUaW1lKCkgewotICAgICAgICByZXR1cm4gKGVuZFRpbWUgPT0gbnVsbCkgPyBudWxsIDogKERhdGUpIGVuZFRpbWUuY2xvbmUoKTsKKyAgICAgICAgcmV0dXJuIChEYXRlKSBlbmRUaW1lLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTUsNyArNTE1LDcgQEAKIAogICAgIC8qKiBEZXRlcm1pbmVzIGlmIHRoaXMgdGlja2V0IGlzIHN0aWxsIGN1cnJlbnQuICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzQ3VycmVudCgpIHsKLSAgICAgICAgcmV0dXJuIGVuZFRpbWUgPT0gbnVsbD8gZmFsc2U6IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8PSBlbmRUaW1lLmdldFRpbWUoKSk7CisgICAgICAgIHJldHVybiAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPD0gZ2V0RW5kVGltZSgpLmdldFRpbWUoKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvQm94VUkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljQ29tYm9Cb3hVSS5qYXZhCmluZGV4IGJjOGEyYmEuLjk1ZWE3ZjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljQ29tYm9Cb3hVSS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljQ29tYm9Cb3hVSS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTI1LDYgKzEyNSw4IEBACiAgICAgcHJvdGVjdGVkIE1vdXNlTW90aW9uTGlzdGVuZXIgcG9wdXBNb3VzZU1vdGlvbkxpc3RlbmVyOwogICAgIHByb3RlY3RlZCBLZXlMaXN0ZW5lciBwb3B1cEtleUxpc3RlbmVyOwogCisgICAgcHJpdmF0ZSBNb3VzZVdoZWVsTGlzdGVuZXIgbW91c2VXaGVlbExpc3RlbmVyOworCiAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBrbm93aW5nIHdoZW4gdG8gY2FjaGUgdGhlIG1pbmltdW0gcHJlZmVycmVkIHNpemUuCiAgICAgLy8gSWYgdGhlIGRhdGEgaW4gdGhlIGxpc3QgY2hhbmdlcywgdGhlIGNhY2hlZCB2YWx1ZSBnZXQgbWFya2VkIGZvciByZWNhbGMuCiAgICAgLy8gQWRkZWQgdG8gdGhlIGN1cnJlbnQgSkNvbWJvQm94IG1vZGVsCkBAIC0zNzUsNiArMzc3LDEwIEBACiAgICAgICAgICAgICAgICAgY29tYm9Cb3guZ2V0TW9kZWwoKS5hZGRMaXN0RGF0YUxpc3RlbmVyKCBsaXN0RGF0YUxpc3RlbmVyICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAoKG1vdXNlV2hlZWxMaXN0ZW5lciA9IGNyZWF0ZU1vdXNlV2hlZWxMaXN0ZW5lcigpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21ib0JveC5hZGRNb3VzZVdoZWVsTGlzdGVuZXIobW91c2VXaGVlbExpc3RlbmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNDIxLDYgKzQyNyw5IEBACiAgICAgICAgICAgICAgICAgY29tYm9Cb3guZ2V0TW9kZWwoKS5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKCBsaXN0RGF0YUxpc3RlbmVyICk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1vdXNlV2hlZWxMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21ib0JveC5yZW1vdmVNb3VzZVdoZWVsTGlzdGVuZXIobW91c2VXaGVlbExpc3RlbmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtNTM0LDYgKzU0MywxMCBAQAogICAgICAgICByZXR1cm4gaGFuZGxlcjsKICAgICB9CiAKKyAgICBwcml2YXRlIE1vdXNlV2hlZWxMaXN0ZW5lciBjcmVhdGVNb3VzZVdoZWVsTGlzdGVuZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRIYW5kbGVyKCk7CisgICAgfQorCiAgICAgLy8KICAgICAvLyBlbmQgVUkgSW5pdGlhbGl6YXRpb24KICAgICAvLz09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE2NjksNyArMTY4Miw4IEBACiAgICAgLy8KICAgICBwcml2YXRlIGNsYXNzIEhhbmRsZXIgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciwgRm9jdXNMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlMaXN0ZW5lciwgTGF5b3V0TWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0RGF0YUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0RGF0YUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdXNlV2hlZWxMaXN0ZW5lciB7CiAgICAgICAgIC8vCiAgICAgICAgIC8vIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKICAgICAgICAgLy8KQEAgLTE5NTMsNiArMTk2NywxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlV2hlZWxNb3ZlZChNb3VzZVdoZWVsRXZlbnQgZSkgeworICAgICAgICAgICAgZS5jb25zdW1lKCk7CisgICAgICAgIH0KICAgIH0KIAogICAgIGNsYXNzIERlZmF1bHRLZXlTZWxlY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSkNvbWJvQm94LktleVNlbGVjdGlvbk1hbmFnZXIsIFVJUmVzb3VyY2UgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNDb21ib1BvcHVwLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvUG9wdXAuamF2YQppbmRleCBhZTM5ODY3Li42ODJlNmM2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvUG9wdXAuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY0NvbWJvUG9wdXAuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0NSwyNiArMzQ1LDE3IEBACiAgICAgLy8gUG9wdXBNZW51TGlzdGVuZXJzLgogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKCkgewotICAgICAgICBpZiAoc2Nyb2xsZXJNb3VzZVdoZWVsTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tYm9Cb3guYWRkTW91c2VXaGVlbExpc3RlbmVyKHNjcm9sbGVyTW91c2VXaGVlbExpc3RlbmVyKTsKLSAgICAgICAgfQogICAgICAgICBzdXBlci5maXJlUG9wdXBNZW51V2lsbEJlY29tZVZpc2libGUoKTsKICAgICAgICAgLy8gY29tYm9Cb3guZmlyZVBvcHVwTWVudVdpbGxCZWNvbWVWaXNpYmxlKCkgaXMgY2FsbGVkIGZyb20gQmFzaWNDb21ib1BvcHVwLnNob3coKSBtZXRob2QKICAgICAgICAgLy8gdG8gbGV0IHRoZSB1c2VyIGNoYW5nZSB0aGUgcG9wdXAgbWVudSBmcm9tIHRoZSBQb3B1cE1lbnVMaXN0ZW5lci5wb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZSgpCiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVBvcHVwTWVudVdpbGxCZWNvbWVJbnZpc2libGUoKSB7Ci0gICAgICAgIGlmIChzY3JvbGxlck1vdXNlV2hlZWxMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjb21ib0JveC5yZW1vdmVNb3VzZVdoZWVsTGlzdGVuZXIoc2Nyb2xsZXJNb3VzZVdoZWVsTGlzdGVuZXIpOwotICAgICAgICB9CiAgICAgICAgIHN1cGVyLmZpcmVQb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKCk7CiAgICAgICAgIGNvbWJvQm94LmZpcmVQb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVBvcHVwTWVudUNhbmNlbGVkKCkgewotICAgICAgICBpZiAoc2Nyb2xsZXJNb3VzZVdoZWVsTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tYm9Cb3gucmVtb3ZlTW91c2VXaGVlbExpc3RlbmVyKHNjcm9sbGVyTW91c2VXaGVlbExpc3RlbmVyKTsKLSAgICAgICAgfQogICAgICAgICBzdXBlci5maXJlUG9wdXBNZW51Q2FuY2VsZWQoKTsKICAgICAgICAgY29tYm9Cb3guZmlyZVBvcHVwTWVudUNhbmNlbGVkKCk7CiAgICAgfQpAQCAtMTAwNiw4ICs5OTcsNiBAQAogICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdGVDaGFuZ2UoKSA9PSBJdGVtRXZlbnQuU0VMRUNURUQpIHsKICAgICAgICAgICAgICAgICBKQ29tYm9Cb3ggY29tYm9Cb3ggPSAoSkNvbWJvQm94KWUuZ2V0U291cmNlKCk7CiAgICAgICAgICAgICAgICAgc2V0TGlzdFNlbGVjdGlvbihjb21ib0JveC5nZXRTZWxlY3RlZEluZGV4KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRMaXN0U2VsZWN0aW9uKC0xKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvc2tpbi5sYWYgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvc2tpbi5sYWYKaW5kZXggZGE0MWE4Yi4uMjA4YTNiMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3NraW4ubGFmCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy9za2luLmxhZgpAQCAtMTM0MDcsNyArMTM0MDcsNyBAQAogICAgICAgICAgICAgPGNhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+ZmFsc2U8L2NhY2hlU2V0dGluZ3NJbmhlcml0ZWQ+CiAgICAgICAgICAgICA8Y2FjaGVNb2RlPk5PX0NBQ0hJTkc8L2NhY2hlTW9kZT4KICAgICAgICAgICAgIDx1aXByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICA8dWlQcm9wZXJ0eSBuYW1lPSJyZW5kZXJlclVzZUxpc3RDb2xvcnMiIHR5cGU9IkJPT0xFQU4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJVc2VMaXN0Q29sb3JzIiB0eXBlPSJCT09MRUFOIiB2YWx1ZT0idHJ1ZSIvPgogICAgICAgICAgICAgICAgPHVpUHJvcGVydHkgbmFtZT0icmVuZGVyZXJVc2VVSUJvcmRlciIgdHlwZT0iQk9PTEVBTiIgdmFsdWU9InRydWUiLz4KICAgICAgICAgICAgICAgIDx1aVByb3BlcnR5IG5hbWU9ImNlbGxOb0ZvY3VzQm9yZGVyIiB0eXBlPSJCT1JERVIiPgogICAgICAgICAgICAgICAgICAgIDxib3JkZXIgdHlwZT0iZW1wdHkiIHRvcD0iMiIgbGVmdD0iNSIgYm90dG9tPSIyIiByaWdodD0iNSIvPgpAQCAtMTM1MTMsNjcgKzEzNTEzLDE3IEBACiAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KICAgICAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgICAgICA8YmFja2dyb3VuZFN0YXRlcz4KLSAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IlNlbGVjdGVkIj4KLSAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXR0ZSByZWQ9IjI1NSIgZ3JlZW49IjI1NSIgYmx1ZT0iMjU1IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNMaWdodEJhY2tncm91bmQiIGh1ZU9mZnNldD0iMC4wIiBzYXR1cmF0aW9uT2Zmc2V0PSIwLjAiIGJyaWdodG5lc3NPZmZzZXQ9IjAuMCIgYWxwaGFPZmZzZXQ9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dEZvcmVncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb25CYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2JhY2tncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD5mYWxzZTwvaW5oZXJpdC10ZXh0Rm9yZWdyb3VuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpbmhlcml0LWJhY2tncm91bmQ+ZmFsc2U8L2luaGVyaXQtYmFja2dyb3VuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx1aXByb3BlcnRpZXMvPgotICAgICAgICAgICAgICAgICAgICAgPC9zdHlsZT4KLSAgICAgICAgICAgICAgICAgICAgIDxjYW52YXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c2l6ZSB3aWR0aD0iMTAwIiBoZWlnaHQ9IjMwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bmV4dExheWVyTmFtZUluZGV4PjI8L25leHRMYXllck5hbWVJbmRleD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJldGNoaW5nSW5zZXRzIHRvcD0iMCIgYm90dG9tPSIwIiBsZWZ0PSIwIiByaWdodD0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxheWVyIG5hbWU9IkxheWVyIDEiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wYWNpdHk+MS4wPC9vcGFjaXR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGxPcGFjaXR5PjEuMDwvZmlsbE9wYWNpdHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8YmxlbmRpbmdNb2RlPk5PUk1BTDwvYmxlbmRpbmdNb2RlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxvY2tlZD5mYWxzZTwvbG9ja2VkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZpc2libGU+dHJ1ZTwvdmlzaWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFwZXMvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVmZmVjdHMvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9sYXllcj4KLSAgICAgICAgICAgICAgICAgICAgIDwvY2FudmFzPgotICAgICAgICAgICAgICAgICAgPC9zdGF0ZT4KLSAgICAgICAgICAgICAgICAgIDxzdGF0ZSBzdGF0ZUtleXM9IkRpc2FibGVkK1NlbGVjdGVkIj4KLSAgICAgICAgICAgICAgICAgICAgIDxzdHlsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0Rm9yZWdyb3VuZC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEJhY2tncm91bmQvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGJhY2tncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSI1NyIgZ3JlZW49IjEwNSIgYmx1ZT0iMTM4IiBhbHBoYT0iMjU1IiB1aURlZmF1bHRQYXJlbnROYW1lPSJuaW1idXNTZWxlY3Rpb25CYWNrZ3JvdW5kIiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2JhY2tncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC1iYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LWJhY2tncm91bmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KLSAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+Ci0gICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHNpemUgd2lkdGg9IjEwMCIgaGVpZ2h0PSIzMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPG5leHRMYXllck5hbWVJbmRleD4yPC9uZXh0TGF5ZXJOYW1lSW5kZXg+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8c3RyZXRjaGluZ0luc2V0cyB0b3A9IjAiIGJvdHRvbT0iMCIgbGVmdD0iMCIgcmlnaHQ9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsYXllciBuYW1lPSJMYXllciAxIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcGFjaXR5PjEuMDwvb3BhY2l0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxsT3BhY2l0eT4xLjA8L2ZpbGxPcGFjaXR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJsZW5kaW5nTW9kZT5OT1JNQUw8L2JsZW5kaW5nTW9kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsb2NrZWQ+ZmFsc2U8L2xvY2tlZD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2aXNpYmxlPnRydWU8L3Zpc2libGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhcGVzLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlZmZlY3RzLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbGF5ZXI+Ci0gICAgICAgICAgICAgICAgICAgICA8L2NhbnZhcz4KLSAgICAgICAgICAgICAgICAgIDwvc3RhdGU+CiAgICAgICAgICAgICAgICAgICA8c3RhdGUgc3RhdGVLZXlzPSJEaXNhYmxlZCI+CiAgICAgICAgICAgICAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dEZvcmVncm91bmQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0dGUgcmVkPSIxNDIiIGdyZWVuPSIxNDMiIGJsdWU9IjE0NSIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzRGlzYWJsZWRUZXh0IiBodWVPZmZzZXQ9IjAuMCIgc2F0dXJhdGlvbk9mZnNldD0iMC4wIiBicmlnaHRuZXNzT2Zmc2V0PSIwLjAiIGFscGhhT2Zmc2V0PSIwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRGb3JlZ3JvdW5kPgogICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRCYWNrZ3JvdW5kLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxiYWNrZ3JvdW5kPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdHRlIHJlZD0iNTciIGdyZWVuPSIxMDUiIGJsdWU9IjEzOCIgYWxwaGE9IjI1NSIgdWlEZWZhdWx0UGFyZW50TmFtZT0ibmltYnVzU2VsZWN0aW9uQmFja2dyb3VuZCIgaHVlT2Zmc2V0PSIwLjAiIHNhdHVyYXRpb25PZmZzZXQ9IjAuMCIgYnJpZ2h0bmVzc09mZnNldD0iMC4wIiBhbHBoYU9mZnNldD0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9iYWNrZ3JvdW5kPgogICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXQtdGV4dEZvcmVncm91bmQ+ZmFsc2U8L2luaGVyaXQtdGV4dEZvcmVncm91bmQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdC1iYWNrZ3JvdW5kPmZhbHNlPC9pbmhlcml0LWJhY2tncm91bmQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8dWlwcm9wZXJ0aWVzLz4KICAgICAgICAgICAgICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzPgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3RleHQvaHRtbC9wYXJzZXIvUGFyc2VyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGV4dC9odG1sL3BhcnNlci9QYXJzZXIuamF2YQppbmRleCAyMWY1NzAzLi43OTEyNDQ2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGV4dC9odG1sL3BhcnNlci9QYXJzZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGV4dC9odG1sL3BhcnNlci9QYXJzZXIuamF2YQpAQCAtMTk4Niw2OSArMTk4Niw1NyBAQAogICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICAgd2hpbGUgKCFpbnNpZGVDb21tZW50ICYmIGkgPCBTQ1JJUFRfRU5EX1RBRy5sZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgJiYgKFNDUklQVF9FTkRfVEFHW2ldID09IGNoCi0gICAgICAgICAgICAgICAgICAgIHx8IFNDUklQVF9FTkRfVEFHX1VQUEVSX0NBU0VbaV0gPT0gY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICYmIChTQ1JJUFRfRU5EX1RBR1tpXSA9PSBjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgU0NSSVBUX0VORF9UQUdfVVBQRVJfQ0FTRVtpXSA9PSBjaCkpIHsKICAgICAgICAgICAgICAgICBjaGFyc1RvQWRkW2ldID0gKGNoYXIpIGNoOwogICAgICAgICAgICAgICAgIGNoID0gcmVhZENoKCk7CiAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGkgPT0gU0NSSVBUX0VORF9UQUcubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIWluc2lkZUNvbW1lbnQgJiYgaSA9PSAxICYmIGNoYXJzVG9BZGRbMF0gPT0gU1RBUlRfQ09NTUVOVC5jaGFyQXQoMCkpIHsKLSAgICAgICAgICAgICAgICAvLyBpdCBpc24ndCBlbmQgc2NyaXB0IHRhZywgYnV0IG1heSBiZSBpdCdzIHN0YXJ0IGNvbW1lbnQgdGFnPwotICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgU1RBUlRfQ09NTUVOVC5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgU1RBUlRfQ09NTUVOVC5jaGFyQXQoaSkgPT0gY2gpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNUb0FkZFtpXSA9IChjaGFyKSBjaDsKLSAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkQ2goKTsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBTVEFSVF9DT01NRU5ULmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc2lkZUNvbW1lbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbnNpZGVDb21tZW50KSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBFTkRfQ09NTUVOVC5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgRU5EX0NPTU1FTlQuY2hhckF0KGkpID09IGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXJzVG9BZGRbaV0gPSAoY2hhcikgY2g7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZENoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gRU5EX0NPTU1FTlQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogVG8gYWNjb3VudCBmb3IgZXh0cmEgcmVhZCgpJ3MgdGhhdCBoYXBwZW5lZCAqLwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBhZGRTdHJpbmcoY2hhcnNUb0FkZFtqXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICBjYXNlIC0xOgotICAgICAgICAgICAgICAgIGVycm9yKCJlb2Yuc2NyaXB0Iik7CisgICAgICAgICAgICAgICAgLyogICc8L3NjcmlwdD4nIHRhZyBkZXRlY3RlZCAqLworICAgICAgICAgICAgICAgIC8qIEhlcmUsIGNoID09IHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgPC9zY3JpcHQ+ICovCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICAgIGxuKys7Ci0gICAgICAgICAgICAgICAgY2ggPSByZWFkQ2goKTsKLSAgICAgICAgICAgICAgICBsZkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgYWRkU3RyaW5nKCdcbicpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICAgIGxuKys7Ci0gICAgICAgICAgICAgICAgaWYgKChjaCA9IHJlYWRDaCgpKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZENoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNybGZDb3VudCsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyQ291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICAvKiBUbyBhY2NvdW50IGZvciBleHRyYSByZWFkKCkncyB0aGF0IGhhcHBlbmVkICovCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3RyaW5nKGNoYXJzVG9BZGRbal0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRTdHJpbmcoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFkZFN0cmluZyhjaCk7Ci0gICAgICAgICAgICAgICAgY2ggPSByZWFkQ2goKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gLy8gc3dpdGNoCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoImVvZi5zY3JpcHQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgbG4rKzsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSByZWFkQ2goKTsKKyAgICAgICAgICAgICAgICAgICAgbGZDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBhZGRTdHJpbmcoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgbG4rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChjaCA9IHJlYWRDaCgpKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IHJlYWRDaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JsZkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjckNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkU3RyaW5nKCdcbicpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhZGRTdHJpbmcoY2gpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyID0gbmV3IFN0cmluZyhnZXRDaGFycygwLCBzdHJwb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnNpZGVDb21tZW50ICYmIHN0ci5lbmRzV2l0aChTVEFSVF9DT01NRU5UKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlQ29tbWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZUNvbW1lbnQgJiYgc3RyLmVuZHNXaXRoKEVORF9DT01NRU5UKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlQ29tbWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZENoKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gLy8gc3dpdGNoCisgICAgICAgICAgICB9CiAgICAgICAgIH0gLy8gd2hpbGUKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9Db21wb3NpdGVGb250LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvQ29tcG9zaXRlRm9udC5qYXZhCmluZGV4IGE3ZGYwNDYuLjQ1NDgwY2EgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9Db21wb3NpdGVGb250LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0NvbXBvc2l0ZUZvbnQuamF2YQpAQCAtMjcwLDIxICsyNzAsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZXNbc2xvdF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lc1tzbG90XSA9IG5hbWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghY29tcG9uZW50TmFtZXNbc2xvdF0uZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBJZiBhIGNvbXBvbmVudCBzcGVjaWZpZXMgdGhlIGZpbGUgd2l0aCBhIGJhZCBmb250LAotICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBzbG90IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYnkKLSAgICAgICAgICAgICAgICAgICAgICogZGVmYXVsdCBwaHlzaWNhbCBmb250LiBJbiBzdWNoIGNhc2UgZmluZEZvbnQyRCBtYXkKLSAgICAgICAgICAgICAgICAgICAgICogcmV0dXJuIGNvbXBvc2l0ZSBmb250IHdoaWNoIGNhbm5vdCBiZSBjYXN0ZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICogcGh5c2ljYWwgZm9udC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW3Nsb3RdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUGh5c2ljYWxGb250KSBmbS5maW5kRm9udDJEKGNvbXBvbmVudE5hbWVzW3Nsb3RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbc2xvdF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKFBoeXNpY2FsRm9udCkgZm0uZmluZEZvbnQyRChjb21wb25lbnROYW1lc1tzbG90XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250TWFuYWdlci5QSFlTSUNBTF9GQUxMQkFDSyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc2lnbiBkZWZhdWx0IHBoeXNpY2FsIGZvbnQgdG8gdGhlIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbc2xvdF0gPSBmbS5nZXREZWZhdWx0UGh5c2ljYWxGb250KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZlcnJlZEluaXRpYWxpc2F0aW9uW3Nsb3RdID0gZmFsc2U7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvRm9udEZhbWlseS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L0ZvbnRGYW1pbHkuamF2YQppbmRleCBlMzE5ODg2Li4zMWYxNDI1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvRm9udEZhbWlseS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9Gb250RmFtaWx5LmphdmEKQEAgLTMzNSwxMCArMzM1LDEwIEBACiAgICAgICAgIGNhc2UgRm9udC5CT0xEfEZvbnQuSVRBTElDOgogICAgICAgICAgICAgaWYgKGJvbGRpdGFsaWMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBib2xkaXRhbGljOwotICAgICAgICAgICAgfSBlbHNlIGlmIChib2xkICE9IG51bGwgJiYgYm9sZC5jYW5Eb1N0eWxlKHN0eWxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBib2xkOwogICAgICAgICAgICAgfSBlbHNlIGlmIChpdGFsaWMgIT0gbnVsbCAmJiBpdGFsaWMuY2FuRG9TdHlsZShzdHlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0YWxpYzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYm9sZCAhPSBudWxsICYmIGJvbGQuY2FuRG9TdHlsZShzdHlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0YWxpYzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhaW4gIT0gbnVsbCAmJiBwbGFpbi5jYW5Eb1N0eWxlKHN0eWxlKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxhaW47CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L1NjcmlwdFJ1bkRhdGEuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vZm9udC9TY3JpcHRSdW5EYXRhLmphdmEKaW5kZXggZTcyYzg1Ni4uZDg5NDAxNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9mb250L1NjcmlwdFJ1bkRhdGEuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ZvbnQvU2NyaXB0UnVuRGF0YS5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgIGlmIChjcCA+PSBkYXRhW2NhY2hlXSAmJiBjcCA8IGRhdGFbY2FjaGUrMl0pIHsKICAgICAgICAgICAgIHJldHVybiBkYXRhW2NhY2hlKzFdOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoY3AgPj0gQ0hBUl9TVEFSVCkgJiYgKGNwIDwgQ0hBUl9MSU1JVCkpIHsKKyAgICAgICAgaWYgKGNwID49IENIQVJfU1RBUlQgJiBjcCA8IENIQVJfTElNSVQpIHsKICAgICAgICAgICAgIGludCBwcm9iZSA9IGRhdGFQb3dlcjsKICAgICAgICAgICAgIGludCBpbmRleCA9IDA7CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vamF2YTJkL29wZW5nbC9PR0xNYXNrRmlsbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qYXZhMmQvb3BlbmdsL09HTE1hc2tGaWxsLmphdmEKaW5kZXggYWIwNTNmMS4uYjc1ZDVhNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qYXZhMmQvb3BlbmdsL09HTE1hc2tGaWxsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qYXZhMmQvb3BlbmdsL09HTE1hc2tGaWxsLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2Ugc3VuLmphdmEyZC5vcGVuZ2w7CiAKIGltcG9ydCBqYXZhLmF3dC5Db21wb3NpdGU7Ci1pbXBvcnQgc3VuLmphdmEyZC5JbnZhbGlkUGlwZUV4Y2VwdGlvbjsKIGltcG9ydCBzdW4uamF2YTJkLlN1bkdyYXBoaWNzMkQ7CiBpbXBvcnQgc3VuLmphdmEyZC5sb29wcy5HcmFwaGljc1ByaW1pdGl2ZTsKIGltcG9ydCBzdW4uamF2YTJkLmxvb3BzLkdyYXBoaWNzUHJpbWl0aXZlTWdyOwpAQCAtNjgsMTQgKzY3LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnRleHQoU3VuR3JhcGhpY3MyRCBzZzJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29tcCwgaW50IGN0eGZsYWdzKQogICAgIHsKLSAgICAgICAgT0dMU3VyZmFjZURhdGEgZHN0RGF0YTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRzdERhdGEgPSAoT0dMU3VyZmFjZURhdGEpIHNnMmQuc3VyZmFjZURhdGE7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVFeGNlcHRpb24oIndyb25nIHN1cmZhY2UgZGF0YSB0eXBlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZzJkLnN1cmZhY2VEYXRhKTsKLSAgICAgICAgfQotCisgICAgICAgIE9HTFN1cmZhY2VEYXRhIGRzdERhdGEgPSAoT0dMU3VyZmFjZURhdGEpc2cyZC5zdXJmYWNlRGF0YTsKICAgICAgICAgT0dMQ29udGV4dC52YWxpZGF0ZUNvbnRleHQoZHN0RGF0YSwgZHN0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2cyZC5nZXRDb21wQ2xpcCgpLCBjb21wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBzZzJkLnBhaW50LCBzZzJkLCBjdHhmbGFncyk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2phdmEyZC9waXBlL0J1ZmZlcmVkQ29udGV4dC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qYXZhMmQvcGlwZS9CdWZmZXJlZENvbnRleHQuamF2YQppbmRleCAzNDc1YzQzLi40NTEzYzY3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2phdmEyZC9waXBlL0J1ZmZlcmVkQ29udGV4dC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vamF2YTJkL3BpcGUvQnVmZmVyZWRDb250ZXh0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOCw4ICszOCw2IEBACiBpbXBvcnQgc3RhdGljIHN1bi5qYXZhMmQucGlwZS5CdWZmZXJlZFJlbmRlclBpcGUuQllURVNfUEVSX1NQQU47CiAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5OYXRpdmU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogCiAvKioKICAqIEJhc2UgY29udGV4dCBjbGFzcyBmb3IgbWFuYWdpbmcgc3RhdGUgaW4gYSBzaW5nbGUtdGhyZWFkZWQgcmVuZGVyaW5nCkBAIC04OSwxMSArODcsMTEgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIEJ1ZmZlcmVkQ29udGV4dCBjdXJyZW50Q29udGV4dDsKIAotICAgIHByaXZhdGUgUmVmZXJlbmNlPEFjY2VsU3VyZmFjZT4gdmFsaWRTcmNEYXRhUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8PihudWxsKTsKLSAgICBwcml2YXRlIFJlZmVyZW5jZTxBY2NlbFN1cmZhY2U+IHZhbGlkRHN0RGF0YVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4obnVsbCk7Ci0gICAgcHJpdmF0ZSBSZWZlcmVuY2U8UmVnaW9uPiB2YWxpZENsaXBSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KG51bGwpOwotICAgIHByaXZhdGUgUmVmZXJlbmNlPENvbXBvc2l0ZT4gdmFsaWRDb21wUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8PihudWxsKTsKLSAgICBwcml2YXRlIFJlZmVyZW5jZTxQYWludD4gdmFsaWRQYWludFJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4obnVsbCk7CisgICAgcHJpdmF0ZSBBY2NlbFN1cmZhY2UgICAgdmFsaWRhdGVkU3JjRGF0YTsKKyAgICBwcml2YXRlIEFjY2VsU3VyZmFjZSAgICB2YWxpZGF0ZWREc3REYXRhOworICAgIHByaXZhdGUgUmVnaW9uICAgICAgICAgIHZhbGlkYXRlZENsaXA7CisgICAgcHJpdmF0ZSBDb21wb3NpdGUgICAgICAgdmFsaWRhdGVkQ29tcDsKKyAgICBwcml2YXRlIFBhaW50ICAgICAgICAgICB2YWxpZGF0ZWRQYWludDsKICAgICAvLyByZW5hbWVkIGZyb20gaXNWYWxpZGF0ZWRQYWludEFDb2xvciBhcyBwYXJ0IG9mIGEgd29yayBhcm91bmQgZm9yIDY3NjQyNTcKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICBpc1ZhbGlkYXRlZFBhaW50SnVzdEFDb2xvcjsKICAgICBwcml2YXRlIGludCAgICAgICAgICAgICB2YWxpZGF0ZWRSR0I7CkBAIC0xMjksOSArMTI3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKICAgICB7CiAgICAgICAgIC8vIGFzc2VydCBycS5sb2NrLmlzSGVsZEJ5Q3VycmVudFRocmVhZCgpOwotICAgICAgICBCdWZmZXJlZENvbnRleHQgY29udGV4dCA9IGRzdERhdGEuZ2V0Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnZhbGlkYXRlKHNyY0RhdGEsIGRzdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xpcCwgY29tcCwgeGZvcm0sIHBhaW50LCBzZzJkLCBmbGFncyk7CisgICAgICAgIEJ1ZmZlcmVkQ29udGV4dCBkM2RjID0gZHN0RGF0YS5nZXRDb250ZXh0KCk7CisgICAgICAgIGQzZGMudmFsaWRhdGUoc3JjRGF0YSwgZHN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjbGlwLCBjb21wLCB4Zm9ybSwgcGFpbnQsIHNnMmQsIGZsYWdzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMiwxNSArMjAwLDEzIEBACiAgICAgICAgICAgICAgICAgdXBkYXRlUGFpbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGlzVmFsaWRhdGVkUGFpbnRKdXN0QUNvbG9yID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh2YWxpZFBhaW50UmVmLmdldCgpICE9IHBhaW50KSB7CisgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGVkUGFpbnQgIT0gcGFpbnQpIHsKICAgICAgICAgICAgIHVwZGF0ZVBhaW50ID0gdHJ1ZTsKICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIGJlIHNldCB3aGVuIHdlIGFyZSBzd2l0Y2hpbmcgZnJvbSBwYWludCB0byBjb2xvcgogICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB0aGlzIGNvbmRpdGlvbiB3aWxsIGJlIHRydWUKICAgICAgICAgICAgIGlzVmFsaWRhdGVkUGFpbnRKdXN0QUNvbG9yID0gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBBY2NlbFN1cmZhY2UgdmFsaWRhdGVkU3JjRGF0YSA9IHZhbGlkU3JjRGF0YVJlZi5nZXQoKTsKLSAgICAgICAgZmluYWwgQWNjZWxTdXJmYWNlIHZhbGlkYXRlZERzdERhdGEgPSB2YWxpZERzdERhdGFSZWYuZ2V0KCk7CiAgICAgICAgIGlmICgoY3VycmVudENvbnRleHQgIT0gdGhpcykgfHwKICAgICAgICAgICAgIChzcmNEYXRhICE9IHZhbGlkYXRlZFNyY0RhdGEpIHx8CiAgICAgICAgICAgICAoZHN0RGF0YSAhPSB2YWxpZGF0ZWREc3REYXRhKSkKQEAgLTIzMiwxMiArMjI4LDExIEBACiAgICAgICAgICAgICBzZXRTdXJmYWNlcyhzcmNEYXRhLCBkc3REYXRhKTsKIAogICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSB0aGlzOwotICAgICAgICAgICAgdmFsaWRTcmNEYXRhUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzcmNEYXRhKTsKLSAgICAgICAgICAgIHZhbGlkRHN0RGF0YVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oZHN0RGF0YSk7CisgICAgICAgICAgICB2YWxpZGF0ZWRTcmNEYXRhID0gc3JjRGF0YTsKKyAgICAgICAgICAgIHZhbGlkYXRlZERzdERhdGEgPSBkc3REYXRhOwogICAgICAgICB9CiAKICAgICAgICAgLy8gdmFsaWRhdGUgY2xpcAotICAgICAgICBmaW5hbCBSZWdpb24gdmFsaWRhdGVkQ2xpcCA9IHZhbGlkQ2xpcFJlZi5nZXQoKTsKICAgICAgICAgaWYgKChjbGlwICE9IHZhbGlkYXRlZENsaXApIHx8IHVwZGF0ZUNsaXApIHsKICAgICAgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAodXBkYXRlQ2xpcCB8fApAQCAtMjUzLDEzICsyNDgsMTMgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVzZXRDbGlwKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxpZENsaXBSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNsaXApOworICAgICAgICAgICAgdmFsaWRhdGVkQ2xpcCA9IGNsaXA7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB2YWxpZGF0ZSBjb21wb3NpdGUgKG5vdGUgdGhhdCBhIGNoYW5nZSBpbiB0aGUgY29udGV4dCBmbGFncwogICAgICAgICAvLyBtYXkgcmVxdWlyZSB1cyB0byB1cGRhdGUgdGhlIGNvbXBvc2l0ZSBzdGF0ZSwgZXZlbiBpZiB0aGUKICAgICAgICAgLy8gY29tcG9zaXRlIGhhcyBub3QgY2hhbmdlZCkKLSAgICAgICAgaWYgKChjb21wICE9IHZhbGlkQ29tcFJlZi5nZXQoKSkgfHwgKGZsYWdzICE9IHZhbGlkYXRlZEZsYWdzKSkgeworICAgICAgICBpZiAoKGNvbXAgIT0gdmFsaWRhdGVkQ29tcCkgfHwgKGZsYWdzICE9IHZhbGlkYXRlZEZsYWdzKSkgewogICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNldENvbXBvc2l0ZShjb21wLCBmbGFncyk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjY4LDcgKzI2Myw3IEBACiAgICAgICAgICAgICAvLyB0aGUgcGFpbnQgc3RhdGUgaXMgZGVwZW5kZW50IG9uIHRoZSBjb21wb3NpdGUgc3RhdGUsIHNvIG1ha2UKICAgICAgICAgICAgIC8vIHN1cmUgd2UgdXBkYXRlIHRoZSBjb2xvciBiZWxvdwogICAgICAgICAgICAgdXBkYXRlUGFpbnQgPSB0cnVlOwotICAgICAgICAgICAgdmFsaWRDb21wUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb21wKTsKKyAgICAgICAgICAgIHZhbGlkYXRlZENvbXAgPSBjb21wOwogICAgICAgICAgICAgdmFsaWRhdGVkRmxhZ3MgPSBmbGFnczsKICAgICAgICAgfQogCkBAIC0zMDIsNyArMjk3LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQnVmZmVyZWRQYWludHMucmVzZXRQYWludChycSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWxpZFBhaW50UmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8PihwYWludCk7CisgICAgICAgICAgICB2YWxpZGF0ZWRQYWludCA9IHBhaW50OwogICAgICAgICB9CiAKICAgICAgICAgLy8gbWFyayBkc3REYXRhIGRpcnR5CkBAIC0zMjAsOSArMzE1LDkgQEAKICAgICAgKiBAc2VlIFJlbmRlclF1ZXVlI2xvY2sKICAgICAgKiBAc2VlIFJlbmRlclF1ZXVlI3VubG9jawogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlU3VyZmFjZXMoKSB7Ci0gICAgICAgIHZhbGlkU3JjRGF0YVJlZi5jbGVhcigpOwotICAgICAgICB2YWxpZERzdERhdGFSZWYuY2xlYXIoKTsKKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlU3VyZmFjZXMoKSB7CisgICAgICAgIHZhbGlkYXRlZFNyY0RhdGEgPSBudWxsOworICAgICAgICB2YWxpZGF0ZWREc3REYXRhID0gbnVsbDsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0U3VyZmFjZXMoQWNjZWxTdXJmYWNlIHNyY0RhdGEsCkBAIC00MzksOSArNDM0LDkgQEAKICAgICAgICAgcmVzZXRDbGlwKCk7CiAgICAgICAgIEJ1ZmZlcmVkUGFpbnRzLnJlc2V0UGFpbnQocnEpOwogICAgICAgICBpbnZhbGlkYXRlU3VyZmFjZXMoKTsKLSAgICAgICAgdmFsaWRDb21wUmVmLmNsZWFyKCk7Ci0gICAgICAgIHZhbGlkQ2xpcFJlZi5jbGVhcigpOwotICAgICAgICB2YWxpZFBhaW50UmVmLmNsZWFyKCk7CisgICAgICAgIHZhbGlkYXRlZENvbXAgPSBudWxsOworICAgICAgICB2YWxpZGF0ZWRDbGlwID0gbnVsbDsKKyAgICAgICAgdmFsaWRhdGVkUGFpbnQgPSBudWxsOwogICAgICAgICBpc1ZhbGlkYXRlZFBhaW50SnVzdEFDb2xvciA9IGZhbHNlOwogICAgICAgICB4Zm9ybUluVXNlID0gZmFsc2U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9sYXVuY2hlci9yZXNvdXJjZXMvbGF1bmNoZXJfemhfVFcucHJvcGVydGllcyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbGF1bmNoZXIvcmVzb3VyY2VzL2xhdW5jaGVyX3poX1RXLnByb3BlcnRpZXMKaW5kZXggZWNkOTUyZC4uOTQ5YzEzOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9sYXVuY2hlci9yZXNvdXJjZXMvbGF1bmNoZXJfemhfVFcucHJvcGVydGllcworKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2xhdW5jaGVyL3Jlc291cmNlcy9sYXVuY2hlcl96aF9UVy5wcm9wZXJ0aWVzCkBAIC0zNCw3ICszNCw3IEBACiBqYXZhLmxhdW5jaGVyLmVyZ28ubWVzc2FnZTIgID1cICAgICAgICAgICAgICAgICAgXHU1NkUwXHU3MEJBXHU2MEE4XHU2QjYzXHU1NzI4XHU0RjNBXHU2NzBEXHU1NjY4XHU5ODVFXHU1MjI1XHU2QTVGXHU1NjY4XHU0RTBBXHU1N0Y3XHU4ODRDXHUzMDAyXG4KIAogIyBUcmFuc2xhdG9ycyBwbGVhc2Ugbm90ZSBkbyBub3QgdHJhbnNsYXRlIHRoZSBvcHRpb25zIHRoZW1zZWx2ZXMKLWphdmEubGF1bmNoZXIub3B0LmZvb3RlciAgICAgPVwgICAgLWNwIDxcdTc2RUVcdTkzMDRcdTUzQ0EgemlwL2phciBcdTZBOTRcdTY4NDhcdTc2ODRcdTk4NUVcdTUyMjVcdTY0MUNcdTVDMEJcdThERUZcdTVGOTE+XG4gICAgLWNsYXNzcGF0aCA8XHU3NkVFXHU5MzA0XHU1M0NBIHppcC9qYXIgXHU2QTk0XHU2ODQ4XHU3Njg0XHU5ODVFXHU1MjI1XHU2NDFDXHU1QzBCXHU4REVGXHU1RjkxPlxuICAgICAgICAgICAgICAgICAgXHU0RjdGXHU3NTI4IHswfSBcdTUzNDBcdTk2OTRcdTc2ODRcdTc2RUVcdTkzMDRcdTMwMDFKQVIgXHU1QjU4XHU2QTk0XHU0RUU1XHU1M0NBIFpJUCBcdTVCNThcdTZBOTRcdTZFMDVcdTU1QUVcdTRGODZcdTY0MUNcdTVDMEJcdTk4NUVcdTUyMjVcdTZBOTRcdTY4NDhcdTMwMDJcbiAgICAtRDxuYW1lPj08dmFsdWU+XG4gICAgICAgICAgICAgICAgICBcdThBMkRcdTVCOUFcdTdDRkJcdTdENzFcdTVDNkNcdTYwMjdcbiAgICAtdmVyYm9zZTpbY2xhc3N8Z2N8am5pXVxuICAgICAgICAgICAgICAgICAgXHU1NTVGXHU3NTI4XHU4QTczXHU3RDMwXHU4Q0M3XHU4QTBBXHU4RjM4XHU1MUZBXG4gICAgLXZlcnNpb24gICAgICBcdTUyMTdcdTUzNzBcdTc1MjJcdTU0QzFcdTcyNDhcdTY3MkNcdTRFMjZcdTdENTBcdTY3NUZcbiAgICAtdmVyc2lvbjo8dmFsdWU+XG4gICAgICAgICAgICAgICAgICBcdThCNjZcdTU0NEE6IFx1NkI2NFx1NTI5Rlx1ODBGRFx1NURGMlx1NEUwRFx1NTE4RFx1NEY3Rlx1NzUyOFx1RkYwQ1x1NUMwN1x1NjcwM1x1NUY5RVx1NjcyQVx1NEY4Nlx1NzI0OFx1NjcyQ1x1NEUyRFx1NzlGQlx1OTY2NFx1MzAwMlxuICAgICAgICAgICAgICAgICAgXHU5NzAwXHU4OTgxXHU2MzA3XHU1QjlBXHU3Njg0XHU3MjQ4XHU2NzJDXHU2MjREXHU4MEZEXHU1N0Y3XHU4ODRDXG4gICAgLXNob3d2ZXJzaW9uICBcdTUyMTdcdTUzNzBcdTc1MjJcdTU0QzFcdTcyNDhcdTY3MkNcdTRFMjZcdTdFN0NcdTdFOENcbiAgICAtanJlLXJlc3RyaWN0LXNlYXJjaCB8IC1uby1qcmUtcmVzdHJpY3Qtc2VhcmNoXG4gICAgICAgICAgICAgICAgICBcdThCNjZcdTU0NEE6IFx1NkI2NFx1NTI5Rlx1ODBGRFx1NURGMlx1NEUwRFx1NTE4RFx1NEY3Rlx1NzUyOFx1RkYwQ1x1NUMwN1x1NjcwM1x1NUY5RVx1NjcyQVx1NEY4Nlx1NzI0OFx1NjcyQ1x1NEUyRFx1NzlGQlx1OTY2NFx1MzAwMlxuICAgICAgICAgICAgICAgICAgXHU1NzI4XHU3MjQ4XHU2NzJDXHU2NDFDXHU1QzBCXHU0RTJEXHU1MzA1XHU2MkVDL1x1NjM5Mlx1OTY2NFx1NEY3Rlx1NzUyOFx1ODAwNVx1NUMwOFx1NzUyOCBKUkVcbiAgICAtPyAtaGVscCAgICAgIFx1NTIxN1x1NTM3MFx1NkI2NFx1OEFBQVx1NjYwRVx1OEEwQVx1NjA2RlxuICAgIC1YICAgICAgICAgICAgXHU1MjE3XHU1MzcwXHU5NzVFXHU2QTE5XHU2RTk2XHU5MDc4XHU5ODA1XHU3Njg0XHU4QUFBXHU2NjBFXG4gICAgLWVhWzo8cGFja2FnZW5hbWU+Li4ufDo8Y2xhc3NuYW1lPl1cbiAgICAtZW5hYmxlYXNzZXJ0aW9uc1s6PHBhY2thZ2VuYW1lPi4uLnw6PGNsYXNzbmFtZT5dXG4gICAgICAgICAgICAgICAgICBcdTU1NUZcdTc1MjhcdTU0MkJcdTYzMDdcdTVCOUFcdThBNzNcdTdEMzBcdTdBMEJcdTVFQTZcdTc2ODRcdTVCQTNcdTU0NEFcbiAgICAtZGFbOjxwYWNrYWdlbmFtZT4uLi58OjxjbGFzc25hbWU+XVxuICAgIC1kaXNhYmxlYXNzZXJ0aW9uc1s6PHBhY2thZ2VuYW1lPi4uLnw6PGNsYXNzbmFtZT5dXG4gICAgICAgICAgICAgICAgICBcdTUwNUNcdTc1MjhcdTU0MkJcdTYzMDdcdTVCOUFcdThBNzNcdTdEMzBcdTdBMEJcdTVFQTZcdTc2ODRcdTVCQTNcdTU0NEFcbiAgICAtZXNhIHwgLWVuYWJsZXN5c3RlbWFzc2VydGlvbnNcbiAgICAgICAgICAgICAgICAgIFx1NTU1Rlx1NzUyOFx1N0NGQlx1N0Q3MVx1NUJBM1x1NTQ0QVxuICAgIC1kc2EgfCAtZGlzYWJsZXN5c3RlbWFzc2VydGlvbnNcbiAgICAgICAgICAgICAgICAgIFx1NTA1Q1x1NzUyOFx1N0NGQlx1N0Q3MVx1NUJBM1x1NTQ0QVxuICAgIC1hZ2VudGxpYjo8bGlibmFtZT5bPTxvcHRpb25zPl1cbiAgICAgICAgICAgICAgICAgIFx1OEYwOVx1NTE2NVx1NTM5Rlx1NzUxRlx1NEVFM1x1NzQwNlx1N0EwQlx1NUYwRlx1N0EwQlx1NUYwRlx1NUVBQiA8bGlibmFtZT5cdUZGMENcdTRGOEJcdTU5ODIgLWFnZW50bGliOmhwcm9mXG4gICAgICAgICAgICAgICAgICBcdTUzRTZcdThBQ0JcdTUzQzNcdTk1QjEgLWFnZW50bGliOmpkd3A9aGVscCBcdTgyMDcgLWFnZW50bGliOmhwcm9mPWhlbHBcbiAgICAtYWdlbnRwYXRoOjxwYXRobmFtZT5bPTxvcHRpb25zPl1cbiAgICAgICAgICAgICAgICAgIFx1NEY3Rlx1NzUyOFx1NUI4Q1x1NjU3NFx1OERFRlx1NUY5MVx1NTQwRFx1N0EzMVx1OEYwOVx1NTE2NVx1NTM5Rlx1NzUxRlx1NEVFM1x1NzQwNlx1N0EwQlx1NUYwRlx1N0EwQlx1NUYwRlx1NUVBQlxuICAgIC1qYXZhYWdlbnQ6PGphcnBhdGg+Wz08b3B0aW9ucz5dXG4gICAgICAgICAgICAgICAgICBcdThGMDlcdTUxNjUgSmF2YSBcdTdBMEJcdTVGMEZcdThBOUVcdThBMDBcdTRFRTNcdTc0MDZcdTdBMEJcdTVGMEZcdUZGMENcdThBQ0JcdTUzQzNcdTk1QjEgamF2YS5sYW5nLmluc3RydW1lbnRcbiAgICAtc3BsYXNoOjxpbWFnZXBhdGg+XG4gICAgICAgICAgICAgICAgICBcdTk4NkZcdTc5M0FcdTYzMDdcdTVCOUFcdTVGNzFcdTUwQ0ZcdTc2ODRcdThFREZcdTlBRDRcdThDQzdcdThBMEFcdTc1NkJcdTk3NjJcblx1OEFDQlx1NTNDM1x1OTVCMSBodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvZG9jdW1lbnRhdGlvbi9pbmRleC5odG1sIFx1NjZCOFx1ODlFM1x1OEE3M1x1N0QzMFx1OENDN1x1OEEwQVx1MzAwMgoramF2YS5sYXVuY2hlci5vcHQuZm9vdGVyICAgICA9XCAgICAtY3AgPGNsYXNzIHNlYXJjaCBwYXRoIG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzPlxuICAgIC1jbGFzc3BhdGggPGNsYXNzIHNlYXJjaCBwYXRoIG9mIGRpcmVjdG9yaWVzIGFuZCB6aXAvamFyIGZpbGVzPlxuICAgICAgICAgICAgICAgICAgXHU0RjdGXHU3NTI4IHswfSBcdTUzNDBcdTk2OTRcdTc2ODRcdTc2RUVcdTkzMDRcdTMwMDFKQVIgXHU1QjU4XHU2QTk0XHU0RUU1XHU1M0NBXG4gICAgICAgICAgICAgICAgICBaSVAgXHU1QjU4XHU2QTk0XHU2RTA1XHU1NUFFXHU0Rjg2XHU2NDFDXHU1QzBCXHU5ODVFXHU1MjI1XHU2QTk0XHU2ODQ4XHUzMDAyXG4gICAgLUQ8bmFtZT49PHZhbHVlPlxuICAgICAgICAgICAgICAgICAgXHU4QTJEXHU1QjlBXHU3Q0ZCXHU3RDcxXHU1QzZDXHU2MDI3XG4gICAgLXZlcmJvc2U6W2NsYXNzfGdjfGpuaV1cbiAgICAgICAgICAgICAgICAgIFx1NTU1Rlx1NzUyOFx1OEE3M1x1N0QzMFx1OENDN1x1OEEwQVx1OEYzOFx1NTFGQVxuICAgIC12ZXJzaW9uICAgICAgXHU1MjE3XHU1MzcwXHU3NTIyXHU1NEMxXHU3MjQ4XHU2NzJDXHU0RTI2XHU3RDUwXHU2NzVGXG4gICAgLXZlcnNpb246PHZhbHVlPlxuICAgICAgICAgICAgICAgICAgXHU4QjY2XHU1NDRBOiBcdTZCNjRcdTUyOUZcdTgwRkRcdTVERjJcdTRFMERcdTUxOERcdTRGN0ZcdTc1MjhcdUZGMENcdTVDMDdcdTY3MDNcdTVGOUVcbiAgICAgICAgICAgICAgICAgIFx1NjcyQVx1NEY4Nlx1NzI0OFx1NjcyQ1x1NEUyRFx1NzlGQlx1OTY2NFx1MzAwMlxuICAgICAgICAgICAgICAgICAgXHU5NzAwXHU4OTgxXHU2MzA3XHU1QjlBXHU3Njg0XHU3MjQ4XHU2NzJDXHU2MjREXHU4MEZEXHU1N0Y3XHU4ODRDXG4gICAgLXNob3d2ZXJzaW9uICBcdTUyMTdcdTUzNzBcdTc1MjJcdTU0QzFcdTcyNDhcdTY3MkNcdTRFMjZcdTdFN0NcdTdFOENcbiAgICAtanJlLXJlc3RyaWN0LXNlYXJjaCB8IC1uby1qcmUtcmVzdHJpY3Qtc2VhcmNoXG4gICAgICAgICAgICAgICAgICBcdThCNjZcdTU0NEE6IFx1NkI2NFx1NTI5Rlx1ODBGRFx1NURGMlx1NEUwRFx1NTE4RFx1NEY3Rlx1NzUyOFx1RkYwQ1x1NUMwN1x1NjcwM1x1NUY5RVxuICAgICAgICAgICAgICAgICAgXHU2NzJBXHU0Rjg2XHU3MjQ4XHU2NzJDXHU0RTJEXHU3OUZCXHU5NjY0XHUzMDAyXG4gICAgICAgICAgICAgICAgICBcdTU3MjhcdTcyNDhcdTY3MkNcdTY0MUNcdTVDMEJcdTRFMkRcdTUzMDVcdTYyRUMvXHU2MzkyXHU5NjY0XHU0RjdGXHU3NTI4XHU4MDA1XHU1QzA4XHU3NTI4IEpSRVxuICAgIC0/IC1oZWxwICAgICAgXHU1MjE3XHU1MzcwXHU2QjY0XHU4QUFBXHU2NjBFXHU4QTBBXHU2MDZGXG4gICAgLVggICAgICAgICAgICBcdTUyMTdcdTUzNzBcdTk3NUVcdTZBMTlcdTZFOTZcdTkwNzhcdTk4MDVcdTc2ODRcdThBQUFcdTY2MEVcbiAgICAtZWFbOjxwYWNrYWdlbmFtZT4uLi58OjxjbGFzc25hbWU+XVxuICAgIC1lbmFibGVhc3NlcnRpb25zWzo8cGFja2FnZW5hbWU+Li4ufDo8Y2xhc3NuYW1lPl1cbiAgICAgICAgICAgICAgICAgIFx1NTU1Rlx1NzUyOFx1NTQyQlx1NjMwN1x1NUI5QVx1OEE3M1x1N0QzMFx1N0EwQlx1NUVBNlx1NzY4NFx1NUJBM1x1NTQ0QVxuICAgIC1kYVs6PHBhY2thZ2VuYW1lPi4uLnw6PGNsYXNzbmFtZT5dXG4gICAgLWRpc2FibGVhc3NlcnRpb25zWzo8cGFja2FnZW5hbWU+Li4ufDo8Y2xhc3NuYW1lPl1cbiAgICAgICAgICAgICAgICAgIFx1NTA1Q1x1NzUyOFx1NTQyQlx1NjMwN1x1NUI5QVx1OEE3M1x1N0QzMFx1N0EwQlx1NUVBNlx1NzY4NFx1NUJBM1x1NTQ0QVxuICAgIC1lc2EgfCAtZW5hYmxlc3lzdGVtYXNzZXJ0aW9uc1xuICAgICAgICAgICAgICAgICAgXHU1NTVGXHU3NTI4XHU3Q0ZCXHU3RDcxXHU1QkEzXHU1NDRBXG4gICAgLWRzYSB8IC1kaXNhYmxlc3lzdGVtYXNzZXJ0aW9uc1xuICAgICAgICAgICAgICAgICAgXHU1MDVDXHU3NTI4XHU3Q0ZCXHU3RDcxXHU1QkEzXHU1NDRBXG4gICAgLWFnZW50bGliOjxsaWJuYW1lPls9PG9wdGlvbnM+XVxuICAgICAgICAgICAgICAgICAgXHU4RjA5XHU1MTY1XHU1MzlGXHU3NTFGXHU0RUUzXHU3NDA2XHU3QTBCXHU1RjBGXHU3QTBCXHU1RjBGXHU1RUFCIDxsaWJuYW1lPlx1RkYwQ1x1NEY4Qlx1NTk4MiAtYWdlbnRsaWI6aHByb2ZcbiAgICAgICAgICAgICAgICAgIFx1NTNFNlx1OEFDQlx1NTNDM1x1OTVCMSAtYWdlbnRsaWI6amR3cD1oZWxwIFx1ODIwNyAtYWdlbnRsaWI6aHByb2Y9aGVscFxuICAgIC1hZ2VudHBhdGg6PHBhdGhuYW1lPls9PG9wdGlvbnM+XVxuICAgICAgICAgICAgICAgICAgXHU0RjdGXHU3NTI4XHU1QjhDXHU2NTc0XHU4REVGXHU1RjkxXHU1NDBEXHU3QTMxXHU4RjA5XHU1MTY1XHU1MzlGXHU3NTFGXHU0RUUzXHU3NDA2XHU3QTBCXHU1RjBGXHU3QTBCXHU1RjBGXHU1RUFCXG4gICAgLWphdmFhZ2VudDo8amFycGF0aD5bPTxvcHRpb25zPl1cbiAgICAgICAgICAgICAgICAgIFx1OEYwOVx1NTE2NSBKYXZhIFx1N0EwQlx1NUYwRlx1OEE5RVx1OEEwMFx1NEVFM1x1NzQwNlx1N0EwQlx1NUYwRlx1RkYwQ1x1OEFDQlx1NTNDM1x1OTVCMSBqYXZhLmxhbmcuaW5zdHJ1bWVudFxuICAgIC1zcGxhc2g6PGltYWdlcGF0aD5cbiAgICAgICAgICAgICAgICAgIFx1OTg2Rlx1NzkzQVx1NjMwN1x1NUI5QVx1NUY3MVx1NTBDRlx1NzY4NFx1OEVERlx1OUFENFx1OENDN1x1OEEwQVx1NzU2Qlx1OTc2MlxuXHU4QUNCXHU1M0MzXHU5NUIxIGh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2phdmFzZS9kb2N1bWVudGF0aW9uL2luZGV4Lmh0bWwgXHU2NkI4XHU4OUUzXHU4QTczXHU3RDMwXHU4Q0M3XHU4QTBBXHUzMDAyCiAKICMgVHJhbnNsYXRvcnMgcGxlYXNlIG5vdGUgZG8gbm90IHRyYW5zbGF0ZSB0aGUgb3B0aW9ucyB0aGVtc2VsdmVzCiBqYXZhLmxhdW5jaGVyLlgudXNhZ2U9XCAgICAtWG1peGVkICAgICAgICAgICBcdTZERjdcdTU0MDhcdTZBMjFcdTVGMEZcdTU3RjdcdTg4NEMgKFx1OTgxMFx1OEEyRClcbiAgICAtWGludCAgICAgICAgICAgICBcdTUwQzVcdTk2NTBcdTg5RTNcdThCNkZcdTZBMjFcdTVGMEZcdTU3RjdcdTg4NENcbiAgICAtWGJvb3RjbGFzc3BhdGg6PFx1NEVFNSB7MH0gXHU1MjA2XHU5Njk0XHU3Njg0XHU3NkVFXHU5MzA0XHU1NDhDIHppcC9qYXIgXHU2QTk0XHU2ODQ4PlxuICAgICAgICAgICAgICAgICAgICAgIFx1OEEyRFx1NUI5QVx1NTU1Rlx1NTJENVx1NUI4OVx1ODhERFx1OTg1RVx1NTIyNVx1NTQ4Q1x1OENDN1x1NkU5MFx1NzY4NFx1NjQxQ1x1NUMwQlx1OERFRlx1NUY5MVxuICAgIC1YYm9vdGNsYXNzcGF0aC9hOjxcdTRFRTUgezB9IFx1NTIwNlx1OTY5NFx1NzY4NFx1NzZFRVx1OTMwNFx1NTQ4QyB6aXAvamFyIFx1NkE5NFx1Njg0OD5cbiAgICAgICAgICAgICAgICAgICAgICBcdTk2NDRcdTUyQTBcdTU3MjhcdTU1NUZcdTUyRDVcdTVCODlcdTg4RERcdTk4NUVcdTUyMjVcdThERUZcdTVGOTFcdTc2ODRcdTdENTBcdTVDM0VcbiAgICAtWGJvb3RjbGFzc3BhdGgvcDo8XHU0RUU1IHswfSBcdTUyMDZcdTk2OTRcdTc2ODRcdTc2RUVcdTkzMDRcdTU0OEMgemlwL2phciBcdTZBOTRcdTY4NDg+XG4gICAgICAgICAgICAgICAgICAgICAgXHU5NjQ0XHU1MkEwXHU1NzI4XHU1NTVGXHU1MkQ1XHU1Qjg5XHU4OEREXHU5ODVFXHU1MjI1XHU4REVGXHU1RjkxXHU3Njg0XHU1MjREXHU5NzYyXG4gICAgLVhkaWFnICAgICAgICAgICAgXHU5ODZGXHU3OTNBXHU1MTc2XHU0RUQ2XHU3Njg0XHU4QTNBXHU2NUI3XHU4QTBBXHU2MDZGXG4gICAgLVhub2NsYXNzZ2MgICAgICAgXHU1MDVDXHU3NTI4XHU5ODVFXHU1MjI1XHU4Q0M3XHU2RTkwXHU1NkRFXHU2NTM2XG4gICAgLVhpbmNnYyAgICAgICAgICAgXHU1NTVGXHU3NTI4XHU2RjM4XHU5MDMyXHU4Q0M3XHU2RTkwXHU1NkRFXHU2NTM2XG4gICAgLVhsb2dnYzo8ZmlsZT4gICAgXHU1MjI5XHU3NTI4XHU2NjQyXHU2MjMzXHU1QzA3IEdDIFx1NzJDMFx1NjE0Qlx1OEExOFx1OTMwNFx1ODFGM1x1NkE5NFx1Njg0OFx1NEUyRFxuICAgIC1YYmF0Y2ggICAgICAgICAgIFx1NTA1Q1x1NzUyOFx1ODBDQ1x1NjY2Rlx1N0RFOFx1OEI2RlxuICAgIC1YbXM8c2l6ZT4gICAgICAgIFx1OEEyRFx1NUI5QVx1OEQ3N1x1NTlDQiBKYXZhIFx1NTgwNlx1OTZDNlx1NTkyN1x1NUMwRlxuICAgIC1YbXg8c2l6ZT4gICAgICAgIFx1OEEyRFx1NUI5QSBKYXZhIFx1NTgwNlx1OTZDNlx1NTkyN1x1NUMwRlx1NEUwQVx1OTY1MFxuICAgIC1Yc3M8c2l6ZT4gICAgICAgIFx1OEEyRFx1NUI5QSBKYXZhIFx1NTdGN1x1ODg0Q1x1N0REMlx1NTgwNlx1NzU4QVx1NTkyN1x1NUMwRlxuICAgIC1YcHJvZiAgICAgICAgICAgIFx1OEYzOFx1NTFGQSBDUFUgXHU1MjA2XHU2NzkwXHU4Q0M3XHU2NTk5XG4gICAgLVhmdXR1cmUgICAgICAgICAgXHU1NTVGXHU3NTI4XHU2NzAwXHU1NkI0XHU2ODNDXHU3Njg0XHU2QUEyXHU2N0U1XHVGRjBDXHU5ODEwXHU1MTQ4XHU0RjVDXHU3MEJBXHU1QzA3XHU0Rjg2XHU3Njg0XHU5ODEwXHU4QTJEXG4gICAgLVhycyAgICAgICAgICAgICAgXHU2RTFCXHU1QzExIEphdmEvVk0gXHU0RjdGXHU3NTI4XHU0RjVDXHU2OTZEXHU3Q0ZCXHU3RDcxXHU0RkUxXHU4NjVGIChcdThBQ0JcdTUzQzNcdTk1QjFcdTY1ODdcdTRFRjYpXG4gICAgLVhjaGVjazpqbmkgICAgICAgXHU1N0Y3XHU4ODRDXHU1MTc2XHU0RUQ2XHU3Njg0IEpOSSBcdTUxRkRcdTY1NzhcdTZBQTJcdTY3RTVcbiAgICAtWHNoYXJlOm9mZiAgICAgICBcdTRFMERcdTU2MTdcdThBNjZcdTRGN0ZcdTc1MjhcdTUxNzFcdTc1MjhcdTk4NUVcdTUyMjVcdThDQzdcdTY1OTlcbiAgICAtWHNoYXJlOmF1dG8gICAgICBcdTUxMThcdTUzRUZcdTgwRkRcdTRGN0ZcdTc1MjhcdTUxNzFcdTc1MjhcdTk4NUVcdTUyMjVcdThDQzdcdTY1OTkgKFx1OTgxMFx1OEEyRClcbiAgICAtWHNoYXJlOm9uICAgICAgICBcdTk3MDBcdTg5ODFcdTRGN0ZcdTc1MjhcdTUxNzFcdTc1MjhcdTk4NUVcdTUyMjVcdThDQzdcdTY1OTlcdUZGMENcdTU0MjZcdTUyNDdcdTU5MzFcdTY1NTdcdTMwMDJcbiAgICAtWHNob3dTZXR0aW5ncyAgICBcdTk4NkZcdTc5M0FcdTYyNDBcdTY3MDlcdThBMkRcdTVCOUFcdTUwM0NcdTRFMjZcdTdFN0NcdTdFOENcbiAgICAtWHNob3dTZXR0aW5nczphbGxcbiAgICAgICAgICAgICAgICAgICAgICBcdTk4NkZcdTc5M0FcdTYyNDBcdTY3MDlcdThBMkRcdTVCOUFcdTUwM0NcdTRFMjZcdTdFN0NcdTdFOENcbiAgICAtWHNob3dTZXR0aW5nczp2bSBcdTk4NkZcdTc5M0FcdTYyNDBcdTY3MDkgVk0gXHU3NkY4XHU5NURDXHU4QTJEXHU1QjlBXHU1MDNDXHU0RTI2XHU3RTdDXHU3RThDXG4gICAgLVhzaG93U2V0dGluZ3M6cHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgIFx1OTg2Rlx1NzkzQVx1NjI0MFx1NjcwOVx1NUM2Q1x1NjAyN1x1OEEyRFx1NUI5QVx1NTAzQ1x1NEUyNlx1N0U3Q1x1N0U4Q1xuICAgIC1Yc2hvd1NldHRpbmdzOmxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAgIFx1OTg2Rlx1NzkzQVx1NjI0MFx1NjcwOVx1NTczMFx1NTM0MFx1OEEyRFx1NUI5QVx1NzZGOFx1OTVEQ1x1OEEyRFx1NUI5QVx1NTAzQ1x1NEUyNlx1N0U3Q1x1N0U4Q1xuXG4gLVggXHU5MDc4XHU5ODA1XHU0RTBEXHU2NjJGXHU2QTE5XHU2RTk2XHU5MDc4XHU5ODA1XHVGRjBDXHU4MkU1XHU2NzA5XHU4QjhBXHU2NkY0XHU0RTBEXHU1M0U2XHU4ODRDXHU5MDFBXHU3N0U1XHUzMDAyXG4KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbWFuYWdlbWVudC9MYXp5Q29tcG9zaXRlRGF0YS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9tYW5hZ2VtZW50L0xhenlDb21wb3NpdGVEYXRhLmphdmEKaW5kZXggMTIwNGRhMy4uOTM1ZjA5YSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9tYW5hZ2VtZW50L0xhenlDb21wb3NpdGVEYXRhLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9tYW5hZ2VtZW50L0xhenlDb21wb3NpdGVEYXRhLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkFycmF5VHlwZTsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZVR5cGU7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlblR5cGU7CkBAIC00OSw0OCArNDgsMzkgQEAKICAgICBwcml2YXRlIENvbXBvc2l0ZURhdGEgY29tcG9zaXRlRGF0YTsKIAogICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21wb3NpdGVEYXRhIGludGVyZmFjZQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KFN0cmluZyBrZXkpIHsKICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZURhdGEoKS5jb250YWluc0tleShrZXkpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBjb21wb3NpdGVEYXRhKCkuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZURhdGEoKS5lcXVhbHMob2JqKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGdldChTdHJpbmcga2V5KSB7CiAgICAgICAgIHJldHVybiBjb21wb3NpdGVEYXRhKCkuZ2V0KGtleSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdIGdldEFsbChTdHJpbmdbXSBrZXlzKSB7CiAgICAgICAgIHJldHVybiBjb21wb3NpdGVEYXRhKCkuZ2V0QWxsKGtleXMpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb21wb3NpdGVUeXBlIGdldENvbXBvc2l0ZVR5cGUoKSB7CiAgICAgICAgIHJldHVybiBjb21wb3NpdGVEYXRhKCkuZ2V0Q29tcG9zaXRlVHlwZSgpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiBjb21wb3NpdGVEYXRhKCkuaGFzaENvZGUoKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAvKiogRklYTUU6IFdoYXQgc2hvdWxkIHRoaXMgYmU/PyAqLwogICAgICAgICByZXR1cm4gY29tcG9zaXRlRGF0YSgpLnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENvbGxlY3Rpb248Pz4gdmFsdWVzKCkgewogICAgICAgICByZXR1cm4gY29tcG9zaXRlRGF0YSgpLnZhbHVlcygpOwogICAgIH0KQEAgLTEzNiwzMSArMTI2LDI3IEBACiAgICAgICAgIGlmIChjZCA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBDb21wb3NpdGVEYXRhIik7CiAKLSAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgY2QuZ2V0KGl0ZW1OYW1lKSk7CisgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGNkLmdldChpdGVtTmFtZSkpLmJvb2xlYW5WYWx1ZSgpOwogICAgIH0KIAogICAgIHN0YXRpYyBsb25nIGdldExvbmcoQ29tcG9zaXRlRGF0YSBjZCwgU3RyaW5nIGl0ZW1OYW1lKSB7CiAgICAgICAgIGlmIChjZCA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCBDb21wb3NpdGVEYXRhIik7CiAKLSAgICAgICAgcmV0dXJuICgoTG9uZykgY2QuZ2V0KGl0ZW1OYW1lKSk7CisgICAgICAgIHJldHVybiAoKExvbmcpIGNkLmdldChpdGVtTmFtZSkpLmxvbmdWYWx1ZSgpOwogICAgIH0KIAogICAgIHN0YXRpYyBpbnQgZ2V0SW50KENvbXBvc2l0ZURhdGEgY2QsIFN0cmluZyBpdGVtTmFtZSkgewogICAgICAgICBpZiAoY2QgPT0gbnVsbCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgQ29tcG9zaXRlRGF0YSIpOwogCi0gICAgICAgIHJldHVybiAoKEludGVnZXIpIGNkLmdldChpdGVtTmFtZSkpOworICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBjZC5nZXQoaXRlbU5hbWUpKS5pbnRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENvbXBhcmVzIHR3byBDb21wb3NpdGVUeXBlcyBhbmQgcmV0dXJucyB0cnVlIGlmCiAgICAgICogYWxsIGl0ZW1zIGluIHR5cGUxIGV4aXN0IGluIHR5cGUyIGFuZCB0aGVpciBpdGVtIHR5cGVzCiAgICAgICogYXJlIHRoZSBzYW1lLgotICAgICAqIEBwYXJhbSB0eXBlMSB0aGUgYmFzZSBjb21wb3NpdGUgdHlwZQotICAgICAqIEBwYXJhbSB0eXBlMiB0aGUgY2hlY2tlZCBjb21wb3NpdGUgdHlwZQotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbCBpdGVtcyBpbiB0eXBlMSBleGlzdCBpbiB0eXBlMiBhbmQgdGhlaXIgaXRlbQotICAgICAqICAgICAgICAgdHlwZXMgYXJlIHRoZSBzYW1lLgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVNYXRjaGVkKENvbXBvc2l0ZVR5cGUgdHlwZTEsIENvbXBvc2l0ZVR5cGUgdHlwZTIpIHsKICAgICAgICAgaWYgKHR5cGUxID09IHR5cGUyKSByZXR1cm4gdHJ1ZTsKQEAgLTE3Myw5ICsxNTksMjQgQEAKICAgICAgICAgaWYgKCF0eXBlMi5rZXlTZXQoKS5jb250YWluc0FsbChhbGxJdGVtcykpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgcmV0dXJuIGFsbEl0ZW1zLnN0cmVhbSgpLmFsbE1hdGNoKAotICAgICAgICAgICAgaXRlbSAtPiBpc1R5cGVNYXRjaGVkKHR5cGUxLmdldFR5cGUoaXRlbSksIHR5cGUyLmdldFR5cGUoaXRlbSkpCi0gICAgICAgICk7CisgICAgICAgIGZvciAoU3RyaW5nIGl0ZW06IGFsbEl0ZW1zKSB7CisgICAgICAgICAgICBPcGVuVHlwZTw/PiBvdDEgPSB0eXBlMS5nZXRUeXBlKGl0ZW0pOworICAgICAgICAgICAgT3BlblR5cGU8Pz4gb3QyID0gdHlwZTIuZ2V0VHlwZShpdGVtKTsKKyAgICAgICAgICAgIGlmIChvdDEgaW5zdGFuY2VvZiBDb21wb3NpdGVUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgKG90MiBpbnN0YW5jZW9mIENvbXBvc2l0ZVR5cGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFpc1R5cGVNYXRjaGVkKChDb21wb3NpdGVUeXBlKSBvdDEsIChDb21wb3NpdGVUeXBlKSBvdDIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG90MSBpbnN0YW5jZW9mIFRhYnVsYXJUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgKG90MiBpbnN0YW5jZW9mIFRhYnVsYXJUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGlmICghaXNUeXBlTWF0Y2hlZCgoVGFidWxhclR5cGUpIG90MSwgKFRhYnVsYXJUeXBlKSBvdDIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFvdDEuZXF1YWxzKG90MikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzVHlwZU1hdGNoZWQoVGFidWxhclR5cGUgdHlwZTEsIFRhYnVsYXJUeXBlIHR5cGUyKSB7CkBAIC0xOTEsNDEgKzE5Miw1IEBACiAgICAgICAgIHJldHVybiBpc1R5cGVNYXRjaGVkKHR5cGUxLmdldFJvd1R5cGUoKSwgdHlwZTIuZ2V0Um93VHlwZSgpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUeXBlTWF0Y2hlZChBcnJheVR5cGU8Pz4gdHlwZTEsIEFycmF5VHlwZTw/PiB0eXBlMikgewotICAgICAgICBpZiAodHlwZTEgPT0gdHlwZTIpIHJldHVybiB0cnVlOwotCi0gICAgICAgIGludCBkaW0xID0gdHlwZTEuZ2V0RGltZW5zaW9uKCk7Ci0gICAgICAgIGludCBkaW0yID0gdHlwZTIuZ2V0RGltZW5zaW9uKCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGFycmF5IGRpbWVuc2lvbnMgYXJlIHRoZSBzYW1lCi0gICAgICAgIGlmIChkaW0xICE9IGRpbTIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgcmV0dXJuIGlzVHlwZU1hdGNoZWQodHlwZTEuZ2V0RWxlbWVudE9wZW5UeXBlKCksIHR5cGUyLmdldEVsZW1lbnRPcGVuVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHlwZU1hdGNoZWQoT3BlblR5cGU8Pz4gb3QxLCBPcGVuVHlwZTw/PiBvdDIpIHsKLSAgICAgICAgaWYgKG90MSBpbnN0YW5jZW9mIENvbXBvc2l0ZVR5cGUpIHsKLSAgICAgICAgICAgIGlmICghIChvdDIgaW5zdGFuY2VvZiBDb21wb3NpdGVUeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIWlzVHlwZU1hdGNoZWQoKENvbXBvc2l0ZVR5cGUpIG90MSwgKENvbXBvc2l0ZVR5cGUpIG90MikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKG90MSBpbnN0YW5jZW9mIFRhYnVsYXJUeXBlKSB7Ci0gICAgICAgICAgICBpZiAoISAob3QyIGluc3RhbmNlb2YgVGFidWxhclR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICghaXNUeXBlTWF0Y2hlZCgoVGFidWxhclR5cGUpIG90MSwgKFRhYnVsYXJUeXBlKSBvdDIpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChvdDEgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIGlmICghIChvdDIgaW5zdGFuY2VvZiBBcnJheVR5cGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmICghaXNUeXBlTWF0Y2hlZCgoQXJyYXlUeXBlPD8+KSBvdDEsIChBcnJheVR5cGU8Pz4pIG90MikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIW90MS5lcXVhbHMob3QyKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yMTkwNDExOTM0NDcyNjY2NzE0TDsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L2Z0cC9pbXBsL0Z0cENsaWVudC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvZnRwL2ltcGwvRnRwQ2xpZW50LmphdmEKaW5kZXggNDgyMmMxMC4uMGY0YmYzZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvZnRwL2ltcGwvRnRwQ2xpZW50LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvZnRwL2ltcGwvRnRwQ2xpZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xNzA4LDcgKzE3MDgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuYW1lTGlzdChTdHJpbmcgcGF0aCkgdGhyb3dzIHN1bi5uZXQuZnRwLkZ0cFByb3RvY29sRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNvY2tldCBzOwotICAgICAgICBzID0gb3BlbkRhdGFDb25uZWN0aW9uKHBhdGggPT0gbnVsbCA/ICJOTFNUIiA6ICJOTFNUICIgKyBwYXRoKTsKKyAgICAgICAgcyA9IG9wZW5EYXRhQ29ubmVjdGlvbigiTkxTVCAiICsgcGF0aCk7CiAgICAgICAgIGlmIChzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnB1dFN0cmVhbShzLmdldElucHV0U3RyZWFtKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC9zcGkvRGVmYXVsdFByb3h5U2VsZWN0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L3NwaS9EZWZhdWx0UHJveHlTZWxlY3Rvci5qYXZhCmluZGV4IDM2ZGI3NTMuLmY3MDE4ZWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L3NwaS9EZWZhdWx0UHJveHlTZWxlY3Rvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L3NwaS9EZWZhdWx0UHJveHlTZWxlY3Rvci5qYXZhCkBAIC0zMiwxNCArMzIsMTMgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgc3VuLm1pc2MuUmVnZXhwUG9vbDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdKb2luZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgc3VuLm5ldC5OZXRQcm9wZXJ0aWVzOwogaW1wb3J0IHN1bi5uZXQuU29ja3NQcm94eTsKLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm4ucXVvdGU7CiAKIC8qKgogICogU3VwcG9ydHMgcHJveHkgc2V0dGluZ3MgdXNpbmcgc3lzdGVtIHByb3BlcnRpZXMgVGhpcyBwcm94eSBzZWxlY3RvcgpAQCAtMTA4LDcgKzEwNyw3IEBACiAKICAgICAvKioKICAgICAgKiBIb3cgdG8gZGVhbCB3aXRoICJub24gcHJveHkgaG9zdHMiOgotICAgICAqIHNpbmNlIHdlIGRvIGhhdmUgdG8gZ2VuZXJhdGUgYSBwYXR0ZXJuIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdCBpZgorICAgICAqIHNpbmNlIHdlIGRvIGhhdmUgdG8gZ2VuZXJhdGUgYSBSZWdleHBQb29sIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhhdCBpZgogICAgICAqIGl0J3Mgbm90IG5lY2Vzc2FyeS4gVGhlcmVmb3JlIHdlIGRvIGNhY2hlIHRoZSByZXN1bHQsIG9uIGEgcGVyLXByb3RvY29sCiAgICAgICogYmFzaXMsIGFuZCBjaGFuZ2UgaXQgb25seSB3aGVuIHRoZSAic291cmNlIiwgaS5lLiB0aGUgc3lzdGVtIHByb3BlcnR5LAogICAgICAqIGRpZCBjaGFuZ2UuCkBAIC0xMjAsMTcgKzExOSwxNyBAQAogICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZlN0cmluZ1ZhbCA9ICJsb2NhbGhvc3R8MTI3Lip8Wzo6MV18MC4wLjAuMHxbOjowXSI7CiAKICAgICAgICAgU3RyaW5nIGhvc3RzU291cmNlOwotICAgICAgICBQYXR0ZXJuIHBhdHRlcm47CisgICAgICAgIFJlZ2V4cFBvb2wgaG9zdHNQb29sOwogICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsOwogICAgICAgICBzdGF0aWMgTm9uUHJveHlJbmZvIGZ0cE5vblByb3h5SW5mbyA9IG5ldyBOb25Qcm94eUluZm8oImZ0cC5ub25Qcm94eUhvc3RzIiwgbnVsbCwgbnVsbCwgZGVmU3RyaW5nVmFsKTsKICAgICAgICAgc3RhdGljIE5vblByb3h5SW5mbyBodHRwTm9uUHJveHlJbmZvID0gbmV3IE5vblByb3h5SW5mbygiaHR0cC5ub25Qcm94eUhvc3RzIiwgbnVsbCwgbnVsbCwgZGVmU3RyaW5nVmFsKTsKICAgICAgICAgc3RhdGljIE5vblByb3h5SW5mbyBzb2Nrc05vblByb3h5SW5mbyA9IG5ldyBOb25Qcm94eUluZm8oInNvY2tzTm9uUHJveHlIb3N0cyIsIG51bGwsIG51bGwsIGRlZlN0cmluZ1ZhbCk7CiAKLSAgICAgICAgTm9uUHJveHlJbmZvKFN0cmluZyBwLCBTdHJpbmcgcywgUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgZCkgeworICAgICAgICBOb25Qcm94eUluZm8oU3RyaW5nIHAsIFN0cmluZyBzLCBSZWdleHBQb29sIHBvb2wsIFN0cmluZyBkKSB7CiAgICAgICAgICAgICBwcm9wZXJ0eSA9IHA7CiAgICAgICAgICAgICBob3N0c1NvdXJjZSA9IHM7Ci0gICAgICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOworICAgICAgICAgICAgaG9zdHNQb29sID0gcG9vbDsKICAgICAgICAgICAgIGRlZmF1bHRWYWwgPSBkOwogICAgICAgICB9CiAgICAgfQpAQCAtMjU2LDcgKzI1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5waG9zdHMgPSBucHJvcC5kZWZhdWx0VmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9wLmhvc3RzU291cmNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnByb3AucGF0dGVybiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9wLmhvc3RzUG9vbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucGhvc3RzLmxlbmd0aCgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgdGhlIHJlcXVpcmVkIGRlZmF1bHQgcGF0dGVybnMKQEAgLTI2NywxMSArMjY2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnBob3N0cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFucGhvc3RzLmVxdWFscyhucHJvcC5ob3N0c1NvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnByb3AucGF0dGVybiA9IHRvUGF0dGVybihucGhvc3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnZXhwUG9vbCBwb29sID0gbmV3IFJlZ2V4cFBvb2woKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihucGhvc3RzLCAifCIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLmFkZChzdC5uZXh0VG9rZW4oKS50b0xvd2VyQ2FzZSgpLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdW4ubWlzYy5SRUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9wLmhvc3RzUG9vbCA9IHBvb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9wLmhvc3RzU291cmNlID0gbnBob3N0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTm90VXNlUHJveHlGb3IobnByb3AucGF0dGVybiwgdXJsaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucHJvcC5ob3N0c1Bvb2wgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wcm9wLmhvc3RzUG9vbC5tYXRjaCh1cmxob3N0KSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb3h5Lk5PX1BST1hZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNDcsNDkgKzM1NSw0IEBACiAKICAgICBwcml2YXRlIG5hdGl2ZSBzdGF0aWMgYm9vbGVhbiBpbml0KCk7CiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbmF0aXZlIFByb3h5IGdldFN5c3RlbVByb3h5KFN0cmluZyBwcm90b2NvbCwgU3RyaW5nIGhvc3QpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gdGhpcyBwYXR0ZXJuIGZvciBub24tcHJveHkgaG9zdHMgYW5kIHRoaXMKLSAgICAgKiAgICAgICAgIHVybGhvc3QgdGhlIHByb3h5IHNob3VsZCBOT1QgYmUgdXNlZCB0byBhY2Nlc3MgdGhpcyB1cmxob3N0Ci0gICAgICovCi0gICAgc3RhdGljIGJvb2xlYW4gc2hvdWxkTm90VXNlUHJveHlGb3IoUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgdXJsaG9zdCkgewotICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsIHx8IHVybGhvc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBib29sZWFuIG1hdGNoZXMgPSBwYXR0ZXJuLm1hdGNoZXIodXJsaG9zdCkubWF0Y2hlcygpOwotICAgICAgICByZXR1cm4gbWF0Y2hlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWFzayBub24tbnVsbCBtYXNrCi0gICAgICogQHJldHVybiB7QGxpbmsgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm59IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtYXNrCi0gICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0gaW4gY2FzZSBtYXNrIHNob3VsZCBub3QgbWF0Y2ggYW55dGhpbmcKLSAgICAgKi8KLSAgICBzdGF0aWMgUGF0dGVybiB0b1BhdHRlcm4oU3RyaW5nIG1hc2spIHsKLSAgICAgICAgYm9vbGVhbiBkaXNqdW5jdGlvbkVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nSm9pbmVyIGpvaW5lciA9IG5ldyBTdHJpbmdKb2luZXIoInwiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgZGlzanVuY3QgOiBtYXNrLnNwbGl0KCJcXHwiKSkgewotICAgICAgICAgICAgaWYgKGRpc2p1bmN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGRpc2p1bmN0aW9uRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgICAgIFN0cmluZyByZWdleCA9IGRpc2p1bmN0VG9SZWdleChkaXNqdW5jdC50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIGpvaW5lci5hZGQocmVnZXgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNqdW5jdGlvbkVtcHR5ID8gbnVsbCA6IFBhdHRlcm4uY29tcGlsZShqb2luZXIudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRpc2p1bmN0IG5vbi1udWxsIG1hc2sgZGlzanVuY3QKLSAgICAgKiBAcmV0dXJuIGphdmEgcmVnZXggc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtYXNrCi0gICAgICovCi0gICAgc3RhdGljIFN0cmluZyBkaXNqdW5jdFRvUmVnZXgoU3RyaW5nIGRpc2p1bmN0KSB7Ci0gICAgICAgIFN0cmluZyByZWdleDsKLSAgICAgICAgaWYgKGRpc2p1bmN0LnN0YXJ0c1dpdGgoIioiKSkgewotICAgICAgICAgICAgcmVnZXggPSAiLioiICsgcXVvdGUoZGlzanVuY3Quc3Vic3RyaW5nKDEpKTsKLSAgICAgICAgfSBlbHNlIGlmIChkaXNqdW5jdC5lbmRzV2l0aCgiKiIpKSB7Ci0gICAgICAgICAgICByZWdleCA9IHF1b3RlKGRpc2p1bmN0LnN1YnN0cmluZygwLCBkaXNqdW5jdC5sZW5ndGgoKSAtIDEpKSArICIuKiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWdleCA9IHF1b3RlKGRpc2p1bmN0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVnZXg7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24uamF2YQppbmRleCBkN2M0NDI0Li41MDliNzEyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC93d3cvcHJvdG9jb2wvamFyL0phclVSTENvbm5lY3Rpb24uamF2YQpAQCAtMTI1LDkgKzEyNSw3IEBACiAgICAgICAgICAgICAgKiB0byBnZXQgdGhlIGphckZpbGUsIGFuZCBzZXQgaXQgYXMgb3VyIHBlcm1pc3Npb24uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChnZXRVc2VDYWNoZXMoKSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkVXNlQ2FjaGVzID0gamFyRmlsZVVSTENvbm5lY3Rpb24uZ2V0VXNlQ2FjaGVzKCk7CiAgICAgICAgICAgICAgICAgamFyRmlsZVVSTENvbm5lY3Rpb24gPSBmYWN0b3J5LmdldENvbm5lY3Rpb24oamFyRmlsZSk7Ci0gICAgICAgICAgICAgICAgamFyRmlsZVVSTENvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKG9sZFVzZUNhY2hlcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZW50cnlOYW1lICE9IG51bGwpKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3JlZmxlY3QvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVHlwZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9yZWZsZWN0L2Fubm90YXRpb24vQW5ub3RhdGlvblR5cGUuamF2YQppbmRleCA5MmY2MDBkLi5hYTBjYmU5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3JlZmxlY3QvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVHlwZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vcmVmbGVjdC9hbm5vdGF0aW9uL0Fubm90YXRpb25UeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMTgsMjIgKzExOCwxNiBAQAogICAgICAgICBtZW1iZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KG1ldGhvZHMubGVuZ3RoKzEsIDEuMGYpOwogCiAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6ICBtZXRob2RzKSB7Ci0gICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMobWV0aG9kLmdldE1vZGlmaWVycygpKSAmJgotICAgICAgICAgICAgICAgIE1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kLmdldE1vZGlmaWVycygpKSAmJgotICAgICAgICAgICAgICAgICFtZXRob2QuaXNTeW50aGV0aWMoKSkgewotICAgICAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1ldGhvZCArICIgaGFzIHBhcmFtcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgbWVtYmVyVHlwZXMucHV0KG5hbWUsIGludm9jYXRpb25IYW5kbGVyUmV0dXJuVHlwZSh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgbWVtYmVycy5wdXQobmFtZSwgbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggIT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1ldGhvZCArICIgaGFzIHBhcmFtcyIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOworICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgICAgICBtZW1iZXJUeXBlcy5wdXQobmFtZSwgaW52b2NhdGlvbkhhbmRsZXJSZXR1cm5UeXBlKHR5cGUpKTsKKyAgICAgICAgICAgIG1lbWJlcnMucHV0KG5hbWUsIG1ldGhvZCk7CiAKLSAgICAgICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJEZWZhdWx0cy5wdXQobmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIG1lbWJlckRlZmF1bHRzLnB1dChuYW1lLCBkZWZhdWx0VmFsdWUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXRlbnRpb24sICYgaW5oZXJpdGVkIGZpZWxkcy4gIFNwZWNpYWwgdHJlYXRtZW50CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2pjYS9Qcm92aWRlckNvbmZpZy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9qY2EvUHJvdmlkZXJDb25maWcuamF2YQppbmRleCA3Mjk0MjY5Li42MmY4YmRkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2pjYS9Qcm92aWRlckNvbmZpZy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvamNhL1Byb3ZpZGVyQ29uZmlnLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNTUsMTUgKzI1NSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlTG9hZCgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvciBlcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdW5leHBlY3RlZCBleGNlcHRpb24gdGhyb3duIGZyb20gc3RhdGljIGluaXRpYWxpemF0aW9uIGJsb2NrIGluIHByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIChleDogaW5zdWZmaWNpZW50IHBlcm1pc3Npb24gdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBjbGFzcykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLnByaW50bG4oIkVycm9yIGxvYWRpbmcgcHJvdmlkZXIgIiArIFByb3ZpZGVyQ29uZmlnLnRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVMb2FkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2pnc3Mva3JiNS9LcmI1SW5pdENyZWRlbnRpYWwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvamdzcy9rcmI1L0tyYjVJbml0Q3JlZGVudGlhbC5qYXZhCmluZGV4IDAyY2U1ZTAuLjUzNmY5MjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvamdzcy9rcmI1L0tyYjVJbml0Q3JlZGVudGlhbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvamdzcy9rcmI1L0tyYjVJbml0Q3JlZGVudGlhbC5qYXZhCkBAIC0yMzUsMTEgKzIzNSw4IEBACiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbml0TGlmZXRpbWUoKSB0aHJvd3MgR1NTRXhjZXB0aW9uIHsKICAgICAgICAgaW50IHJldFZhbCA9IDA7Ci0gICAgICAgIERhdGUgZCA9IGdldEVuZFRpbWUoKTsKLSAgICAgICAgaWYgKGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0VmFsID0gKGludCkoZC5nZXRUaW1lKCkgLSAobmV3IERhdGUoKS5nZXRUaW1lKCkpKTsKKyAgICAgICAgcmV0VmFsID0gKGludCkoZ2V0RW5kVGltZSgpLmdldFRpbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAtIChuZXcgRGF0ZSgpLmdldFRpbWUoKSkpOwogCiAgICAgICAgIHJldHVybiByZXRWYWwvMTAwMDsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvQ29uZmlnLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvQ29uZmlnLmphdmEKaW5kZXggN2VlOTIzMS4uMTI5Zjc3NCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0NvbmZpZy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9Db25maWcuamF2YQpAQCAtNTI1LDkgKzUyNSw5IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIHByZXZpb3VzID0gbnVsbDsKICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSgpIHx8IGxpbmUuc3RhcnRzV2l0aCgiIyIpIHx8IGxpbmUuc3RhcnRzV2l0aCgiOyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSB8fCBsaW5lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21tZW50cyBzdGFydCB3aXRoICcjJyBvciAnOycKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbW1lbnRzIHN0YXJ0IHdpdGggIy4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIEluIHByYWN0aWNlLCBhIHN1YnNlY3Rpb24gbWlnaHQgbG9vayBsaWtlOgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0tyYktkY1JlcC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0tyYktkY1JlcC5qYXZhCmluZGV4IDY2Y2U3M2EuLmRkMGU5NTEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9LcmJLZGNSZXAuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvS3JiS2RjUmVwLmphdmEKQEAgLTYyLDggKzYyLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBLcmJBcEVyckV4Y2VwdGlvbihLcmI1LktSQl9BUF9FUlJfTU9ESUZJRUQpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gV2UgYWxsb3cgS0RDIHRvIHJldHVybiBhIG5vbi1mb3J3YXJkYWJsZSB0aWNrZXQgaWYgcmVxdWVzdCBoYXMgLWYKLSAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspIHsKICAgICAgICAgICAgIGlmIChyZXEucmVxQm9keS5rZGNPcHRpb25zLmdldChpKSAhPQogICAgICAgICAgICAgICAgICAgIHJlcC5lbmNLRENSZXBQYXJ0LmZsYWdzLmdldChpKSkgewogICAgICAgICAgICAgICAgIGlmIChLcmI1LkRFQlVHKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvS3JiVGdzUmVxLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvS3JiVGdzUmVxLmphdmEKaW5kZXggODViN2NiMi4uNzk4Yjc4ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L0tyYlRnc1JlcS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9LcmJUZ3NSZXEuamF2YQpAQCAtMTUwLDExICsxNTAsMTkgQEAKICAgICAgICAgY3RpbWUgPSBLZXJiZXJvc1RpbWUubm93KCk7CiAKICAgICAgICAgLy8gY2hlY2sgaWYgdGhleSBhcmUgdmFsaWQgYXJndW1lbnRzLiBUaGUgb3B0aW9uYWwgZmllbGRzCi0gICAgICAgIC8vIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggc2V0dGluZ3MgaW4gS0RDT3B0aW9ucy4KKyAgICAgICAgLy8gc2hvdWxkIGJlICBjb25zaXN0ZW50IHdpdGggc2V0dGluZ3MgaW4gS0RDT3B0aW9ucy4KKworICAgICAgICAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeT8gSWYgdGhlIFRHVCBpcyBub3QgRk9SV0FSREFCTEUsCisgICAgICAgIC8vIHlvdSBjYW4gc3RpbGwgcmVxdWVzdCBmb3IgYSBGT1JXQVJEQUJMRSB0aWNrZXQsIGp1c3QgdGhlCisgICAgICAgIC8vIEtEQyB3aWxsIGdpdmUgeW91IGEgbm9uLUZPUldBUkRBQkxFIG9uZS4gRXZlbiBpZiB5b3UKKyAgICAgICAgLy8gY2Fubm90IHVzZSB0aGUgdGlja2V0IGV4cGVjdGVkLCBpdCBzdGlsbCBjb250YWlucyBpbmZvLgorICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZXJlIHdpbGwgYmUgcHJvYmxlbSBsYXRlci4gV2UgYWxyZWFkeSBoYXZlCisgICAgICAgIC8vIGZsYWdzIGNoZWNrIGluIEtyYlRnc1JlcC4gT2YgY291cnNlLCBzb21ldGltZXMgdGhlIEtEQworICAgICAgICAvLyB3aWxsIG5vdCBpc3N1ZSB0aGUgdGlja2V0IGF0IGFsbC4KIAogICAgICAgICBpZiAob3B0aW9ucy5nZXQoS0RDT3B0aW9ucy5GT1JXQVJEQUJMRSkgJiYKICAgICAgICAgICAgICAgICAoIShhc0NyZWRzLmZsYWdzLmdldChLcmI1LlRLVF9PUFRTX0ZPUldBUkRBQkxFKSkpKSB7Ci0gICAgICAgICAgICBvcHRpb25zLnNldChLRENPcHRpb25zLkZPUldBUkRBQkxFLCBmYWxzZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgS3JiRXhjZXB0aW9uKEtyYjUuS1JCX0FQX0VSUl9SRVFfT1BUSU9OUyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG9wdGlvbnMuZ2V0KEtEQ09wdGlvbnMuRk9SV0FSREVEKSkgewogICAgICAgICAgICAgaWYgKCEoYXNDcmVkcy5mbGFncy5nZXQoS0RDT3B0aW9ucy5GT1JXQVJEQUJMRSkpKQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L1ByaW5jaXBhbE5hbWUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9QcmluY2lwYWxOYW1lLmphdmEKaW5kZXggNmQ1ZWQzZC4uODg1ZTEzYyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L1ByaW5jaXBhbE5hbWUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvUHJpbmNpcGFsTmFtZS5qYXZhCkBAIC00MjQsOSArNDI0LDYgQEAKICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGNhbm9uaWNhbGl6ZWQgb3Igbm8gcGVybWlzc2lvbiB0byBkbyBzbywgdXNlIG9sZAogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaG9zdE5hbWUuZW5kc1dpdGgoIi4iKSkgewotICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSA9IGhvc3ROYW1lLnN1YnN0cmluZygwLCBob3N0TmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYW1lUGFydHNbMV0gPSBob3N0TmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuYW1lU3RyaW5ncyA9IG5hbWVQYXJ0czsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9DcmVkZW50aWFsc1V0aWwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9DcmVkZW50aWFsc1V0aWwuamF2YQppbmRleCAxNDYyMGU5Li5iNmEzNjc3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvQ3JlZGVudGlhbHNVdGlsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL0NyZWRlbnRpYWxzVXRpbC5qYXZhCkBAIC01OCw5ICs1OCw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiB3ZSBkbyBub3Qgc3VwcG9ydCBrZXJiZXJvcyByZWZlcnJhbCBub3cKICAgICAgICAgICAgIHRocm93IG5ldyBLcmJFeGNlcHRpb24oIkNyb3NzIHJlYWxtIGltcGVyc29uYXRpb24gbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghY2NyZWRzLmlzRm9yd2FyZGFibGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEtyYkV4Y2VwdGlvbigiUzRVMnNlbGYgbmVlZHMgYSBGT1JXQVJEQUJMRSB0aWNrZXQiKTsKLSAgICAgICAgfQogICAgICAgICBLcmJUZ3NSZXEgcmVxID0gbmV3IEtyYlRnc1JlcSgKICAgICAgICAgICAgICAgICBjY3JlZHMsCiAgICAgICAgICAgICAgICAgY2NyZWRzLmdldENsaWVudCgpLApAQCAtNzEsOSArNjgsNiBAQAogICAgICAgICBpZiAoIWNyZWRzLmdldENsaWVudCgpLmVxdWFscyhjbGllbnQpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgS3JiRXhjZXB0aW9uKCJTNFUyc2VsZiByZXF1ZXN0IG5vdCBob25vcmVkIGJ5IEtEQyIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghY3JlZHMuaXNGb3J3YXJkYWJsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgS3JiRXhjZXB0aW9uKCJTNFUyc2VsZiB0aWNrZXQgbXVzdCBiZSBGT1JXQVJEQUJMRSIpOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBjcmVkczsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjcy9TaWduZXJJbmZvLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MvU2lnbmVySW5mby5qYXZhCmluZGV4IDc4ZDNmNjMuLjVmMTMxZmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjcy9TaWduZXJJbmZvLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzL1NpZ25lckluZm8uamF2YQpAQCAtNTUsNyArNTUsNiBAQAogaW1wb3J0IHN1bi5zZWN1cml0eS51dGlsLkRlck91dHB1dFN0cmVhbTsKIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC5EZXJWYWx1ZTsKIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC5EaXNhYmxlZEFsZ29yaXRobUNvbnN0cmFpbnRzOwotaW1wb3J0IHN1bi5zZWN1cml0eS51dGlsLktleVV0aWw7CiBpbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuT2JqZWN0SWRlbnRpZmllcjsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZDsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS5YNTAwTmFtZTsKQEAgLTQwMCw5ICszOTksNyBAQAogICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHB1YmxpYyBrZXkgaXMgcmVzdHJpY3RlZAogICAgICAgICAgICAgaWYgKCFKQVJfRElTQUJMRURfQ0hFQ0sucGVybWl0cyhTSUdfUFJJTUlUSVZFX1NFVCwga2V5KSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaWduYXR1cmVFeGNlcHRpb24oIlB1YmxpYyBrZXkgY2hlY2sgZmFpbGVkLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNhYmxlZCBrZXkgdXNlZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBLZXlVdGlsLmdldEtleVNpemUoa2V5KSArICIgYml0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAga2V5LmdldEFsZ29yaXRobSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICJEaXNhYmxlZCBhbGdvcml0aG0gdXNlZDogIiArIGtleS5nZXRBbGdvcml0aG0oKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjZXJ0Lmhhc1Vuc3VwcG9ydGVkQ3JpdGljYWxFeHRlbnNpb24oKSkgewpAQCAtNDk4LDIzICs0OTUsNiBAQAogICAgICAgICByZXR1cm4gdW5hdXRoZW50aWNhdGVkQXR0cmlidXRlczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgUEtDUzcgZGF0YSB1bnZlcmlmaWVkLgotICAgICAqIEByZXR1cm4gYSBQS0NTNyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUEtDUzcgZ2V0VHNUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIFBLQ1M5QXR0cmlidXRlIHRzVG9rZW5BdHRyID0KLSAgICAgICAgICAgICAgICB1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M5QXR0cmlidXRlLlNJR05BVFVSRV9USU1FU1RBTVBfVE9LRU5fT0lEKTsKLSAgICAgICAgaWYgKHRzVG9rZW5BdHRyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUEtDUzcoKGJ5dGVbXSl0c1Rva2VuQXR0ci5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KICAgICAvKgogICAgICAqIEV4dHJhY3RzIGEgdGltZXN0YW1wIGZyb20gYSBQS0NTNyBTaWduZXJJbmZvLgogICAgICAqCkBAIC01NDIsMTIgKzUyMiwxOSBAQAogICAgICAgICBpZiAodGltZXN0YW1wICE9IG51bGwgfHwgIWhhc1RpbWVzdGFtcCkKICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXA7CiAKLSAgICAgICAgUEtDUzcgdHNUb2tlbiA9IGdldFRzVG9rZW4oKTsKLSAgICAgICAgaWYgKHRzVG9rZW4gPT0gbnVsbCkgeworICAgICAgICBpZiAodW5hdXRoZW50aWNhdGVkQXR0cmlidXRlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBoYXNUaW1lc3RhbXAgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFBLQ1M5QXR0cmlidXRlIHRzVG9rZW5BdHRyID0KKyAgICAgICAgICAgIHVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMuZ2V0QXR0cmlidXRlKAorICAgICAgICAgICAgICAgIFBLQ1M5QXR0cmlidXRlLlNJR05BVFVSRV9USU1FU1RBTVBfVE9LRU5fT0lEKTsKKyAgICAgICAgaWYgKHRzVG9rZW5BdHRyID09IG51bGwpIHsKICAgICAgICAgICAgIGhhc1RpbWVzdGFtcCA9IGZhbHNlOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBQS0NTNyB0c1Rva2VuID0gbmV3IFBLQ1M3KChieXRlW10pdHNUb2tlbkF0dHIuZ2V0VmFsdWUoKSk7CiAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGNvbnRlbnQgKGFuIGVuY29kZWQgdGltZXN0YW1wIHRva2VuIGluZm8pCiAgICAgICAgIGJ5dGVbXSBlbmNUc1Rva2VuSW5mbyA9IHRzVG9rZW4uZ2V0Q29udGVudEluZm8oKS5nZXREYXRhKCk7CiAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNpZ25lciAodGhlIFRpbWVzdGFtcGluZyBBdXRob3JpdHkpCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFLZXlQYWlyR2VuZXJhdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFLZXlQYWlyR2VuZXJhdG9yLmphdmEKaW5kZXggMDY4ZjAwYS4uNGFkYWM4YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5UGFpckdlbmVyYXRvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMUtleVBhaXJHZW5lcmF0b3IuamF2YQpAQCAtMjI4LDM0ICsyMjgsMjkgQEAKICAgICAgICAgLy8gY2hlY2sgbmF0aXZlIHJhbmdlIGZpcnN0CiAgICAgICAgIGlmICgobWluS2V5U2l6ZSAhPSAtMSkgJiYgKGtleVNpemUgPCBtaW5LZXlTaXplKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oYWxnb3JpdGhtICsKLSAgICAgICAgICAgICAgICAiIGtleSBtdXN0IGJlIGF0IGxlYXN0ICIgKyBtaW5LZXlTaXplICsgIiBiaXRzLiAiICsKLSAgICAgICAgICAgICAgICAiVGhlIHNwZWNpZmljIGtleSBzaXplICIgKyBrZXlTaXplICsgIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgIiBrZXkgbXVzdCBiZSBhdCBsZWFzdCAiICsgbWluS2V5U2l6ZSArICIgYml0cyIpOwogICAgICAgICB9CiAgICAgICAgIGlmICgobWF4S2V5U2l6ZSAhPSAtMSkgJiYgKGtleVNpemUgPiBtYXhLZXlTaXplKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oYWxnb3JpdGhtICsKLSAgICAgICAgICAgICAgICAiIGtleSBtdXN0IGJlIGF0IG1vc3QgIiArIG1heEtleVNpemUgKyAiIGJpdHMuICIgKwotICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWMga2V5IHNpemUgIiArIGtleVNpemUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAiIGtleSBtdXN0IGJlIGF0IG1vc3QgIiArIG1heEtleVNpemUgKyAiIGJpdHMiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIG91ciBvd24gYWxnb3JpdGhtLXNwZWNpZmljIGxpbWl0cyBhbHNvCiAgICAgICAgIGlmIChhbGdvcml0aG0uZXF1YWxzKCJFQyIpKSB7CiAgICAgICAgICAgICBpZiAoa2V5U2l6ZSA8IDExMikgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVDIGtleSBzaXplIG11c3QgYmUgYXQgbGVhc3QgMTEyIGJpdC4gIiArCi0gICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWMga2V5IHNpemUgIiArIGtleVNpemUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAoIktleSBzaXplIG11c3QgYmUgYXQgbGVhc3QgMTEyIGJpdCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGtleVNpemUgPiAyMDQ4KSB7CiAgICAgICAgICAgICAgICAgLy8gc2FuaXR5IGNoZWNrLCBub2JvZHkgcmVhbGx5IHdhbnRzIGtleXMgdGhpcyBsYXJnZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRUMga2V5IHNpemUgbXVzdCBiZSBhdCBtb3N0IDIwNDggYml0LiAiICsKLSAgICAgICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpYyBrZXkgc2l6ZSAiICsga2V5U2l6ZSArICIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICgiS2V5IHNpemUgbXVzdCBiZSBhdCBtb3N0IDIwNDggYml0Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBSU0EsIERILCBEU0EKICAgICAgICAgICAgIGlmIChrZXlTaXplIDwgNTEyKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24oYWxnb3JpdGhtICsKLSAgICAgICAgICAgICAgICAgICAgIiBrZXkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDUxMiBiaXQuICIgKwotICAgICAgICAgICAgICAgICAgICAiVGhlIHNwZWNpZmljIGtleSBzaXplICIgKyBrZXlTaXplICsgIiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDUxMiBiaXQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhbGdvcml0aG0uZXF1YWxzKCJSU0EiKSkgewogICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIgdG1wRXhwb25lbnQgPSByc2FQdWJsaWNFeHBvbmVudDsKQEAgLTI3NiwxMCArMjcxLDggQEAKICAgICAgICAgICAgICAgICBpZiAoYWxnb3JpdGhtLmVxdWFscygiREgiKSAmJiAocGFyYW1zICE9IG51bGwpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNhbml0eSBjaGVjaywgbm9ib2R5IHJlYWxseSB3YW50cyBrZXlzIHRoaXMgbGFyZ2UKICAgICAgICAgICAgICAgICAgICAgaWYgKGtleVNpemUgPiA2NCAqIDEwMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJESCBrZXkgc2l6ZSBtdXN0IGJlIGF0IG1vc3QgNjU1MzYgYml0LiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNwZWNpZmljIGtleSBzaXplICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVNpemUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJLZXkgc2l6ZSBtdXN0IGJlIGF0IG1vc3QgNjU1MzYgYml0Iik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHJlc3RyaWN0aW9uIGlzIGluIHRoZSBzcGVjIGZvciBEU0EKQEAgLTI4OSw5ICsyODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKChrZXlTaXplID4gMTAyNCkgfHwgKChrZXlTaXplICYgMHgzZikgIT0gMCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbihhbGdvcml0aG0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIga2V5IG11c3QgYmUgbXVsdGlwbGVzIG9mIDY0IGlmIGxlc3MgdGhhbiAxMDI0IGJpdHMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBvciAyMDQ4IGJpdHMuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWMga2V5IHNpemUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U2l6ZSArICIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG9yIDIwNDggYml0cyIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5U3RvcmUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczExL1AxMUtleVN0b3JlLmphdmEKaW5kZXggZTViOGZhOC4uMzIwMDJjMiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTEvUDExS2V5U3RvcmUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMS9QMTFLZXlTdG9yZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzUyLDIxICs3NTIsNiBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsb2dpbihuZXcgUGFzc3dvcmRDYWxsYmFja0hhbmRsZXIocGFzc3dvcmQpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaChMb2dpbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBQS0NTMTFFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBQS0NTMTFFeGNlcHRpb24gcGUgPSAoUEtDUzExRXhjZXB0aW9uKSBjYXVzZTsKLSAgICAgICAgICAgICAgICBpZiAocGUuZ2V0RXJyb3JDb2RlKCkgPT0gQ0tSX1BJTl9JTkNPUlJFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFzc3dvcmQgaXMgd3JvbmcsIHRoZSBjYXVzZSBvZiB0aGUgSU9FeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFuIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJsb2FkIGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24oKS5pbml0Q2F1c2UoZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibG9hZCBmYWlsZWQiLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAobWFwTGFiZWxzKCkgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgIC8vIENLQV9MQUJFTHMgYXJlIHNoYXJlZCBieSBtdWx0aXBsZSBjZXJ0cwogICAgICAgICAgICAgICAgIHdyaXRlRGlzYWJsZWQgPSB0cnVlOwpAQCAtNzc0LDcgKzc1OSw3IEBACiAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGR1bXBUb2tlbk1hcCgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiB8IFBLQ1MxMUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIHwgS2V5U3RvcmVFeGNlcHRpb24gfCBQS0NTMTFFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJsb2FkIGZhaWxlZCIsIGUpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTIvUEtDUzEyS2V5U3RvcmUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcGtjczEyL1BLQ1MxMktleVN0b3JlLmphdmEKaW5kZXggZGQzZTA2MC4uMjVmYzc4YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wa2NzMTIvUEtDUzEyS2V5U3RvcmUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3BrY3MxMi9QS0NTMTJLZXlTdG9yZS5qYXZhCkBAIC0yMDUxLDcgKzIwNTEsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICghTWVzc2FnZURpZ2VzdC5pc0VxdWFsKG1hY0RhdGEuZ2V0RGlnZXN0KCksIG1hY1Jlc3VsdCkpIHsKLSAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbigiRmFpbGVkIFBLQ1MxMiIgKworICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiRmFpbGVkIFBLQ1MxMiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW50ZWdyaXR5IGNoZWNraW5nIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wcm92aWRlci9CeXRlQXJyYXlBY2Nlc3MuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcHJvdmlkZXIvQnl0ZUFycmF5QWNjZXNzLmphdmEKaW5kZXggZTU3YmExNC4uZTA2ODMyYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wcm92aWRlci9CeXRlQXJyYXlBY2Nlc3MuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL0J5dGVBcnJheUFjY2Vzcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtOTQsNyArOTQsNyBAQAogICAgICAgICBTdHJpbmcgYXJjaCA9IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQKICAgICAgICAgICAgIChuZXcgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRQcm9wZXJ0eUFjdGlvbigib3MuYXJjaCIsICIiKSk7CiAgICAgICAgIHJldHVybiBhcmNoLmVxdWFscygiaTM4NiIpIHx8IGFyY2guZXF1YWxzKCJ4ODYiKSB8fCBhcmNoLmVxdWFscygiYW1kNjQiKQotICAgICAgICAgICAgfHwgYXJjaC5lcXVhbHMoIng4Nl82NCIpIHx8IGFyY2guZXF1YWxzKCJwcGM2NCIpIHx8IGFyY2guZXF1YWxzKCJwcGM2NGxlIik7CisgICAgICAgICAgICB8fCBhcmNoLmVxdWFscygieDg2XzY0Iik7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NtYXJ0Y2FyZGlvL1Rlcm1pbmFsSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zbWFydGNhcmRpby9UZXJtaW5hbEltcGwuamF2YQppbmRleCA2MDRmYWMzLi5kZTE0MTBmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NtYXJ0Y2FyZGlvL1Rlcm1pbmFsSW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc21hcnRjYXJkaW8vVGVybWluYWxJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03NSwxMCArNzUsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgY2FyZCA9IG5ldyBDYXJkSW1wbCh0aGlzLCBwcm90b2NvbCk7CisgICAgICAgICAgICBjYXJkID0gIG5ldyBDYXJkSW1wbCh0aGlzLCBwcm90b2NvbCk7CiAgICAgICAgICAgICByZXR1cm4gY2FyZDsKICAgICAgICAgfSBjYXRjaCAoUENTQ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5jb2RlID09IFNDQVJEX1dfUkVNT1ZFRF9DQVJEIHx8IGUuY29kZSA9PSBTQ0FSRF9FX05PX1NNQVJUQ0FSRCkgeworICAgICAgICAgICAgaWYgKGUuY29kZSA9PSBTQ0FSRF9XX1JFTU9WRURfQ0FSRCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYXJkTm90UHJlc2VudEV4Y2VwdGlvbigiTm8gY2FyZCBwcmVzZW50IiwgZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBDYXJkRXhjZXB0aW9uKCJjb25uZWN0KCkgZmFpbGVkIiwgZSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9DaXBoZXJCb3guamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlckJveC5qYXZhCmluZGV4IGVjNTg4MGIuLmZhMTFiY2UgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlckJveC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlckJveC5qYXZhCkBAIC0xMDQ0LDYgKzEwNDQsNDAgQEAKICAgICAgICAgcmV0dXJuIG5vbmNlOwogICAgIH0KIAorICAgIC8qCisgICAgICogSXMgdGhpcyBjaXBoZXIgYXZhaWxhYmxlPworICAgICAqCisgICAgICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IENpcGhlclN1aXRlLkJ1bGtDaXBoZXIuaXNBdmFpbGFibGUoKQorICAgICAqIHRvIHRlc3QgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIGNpcGhlciBzdWl0ZXMuICBQbGVhc2UgRE9OJ1QgdXNlIGl0IGluCisgICAgICogb3RoZXIgcGxhY2VzLCBvdGhlcndpc2UsIHRoZSBiZWhhdmlvciBtYXkgYmUgdW5leHBlY3RlZCBiZWNhdXNlIHdlIG1heQorICAgICAqIGluaXRpYWxpemUgQUVBRCBjaXBoZXIgaW1wcm9wZXJseSBpbiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIEJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CisgICAgICAgIC8vIFdlIHdvbid0IGtub3cgd2hldGhlciBhIGNpcGhlciBmb3IgYSBwYXJ0aWN1bGFyIGtleSBzaXplIGlzCisgICAgICAgIC8vIGF2YWlsYWJsZSB1bnRpbCB0aGUgY2lwaGVyIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgZG8gbm90IGluaXRpYWxpemUgQUVBRCBjaXBoZXIgaW4gdGhlIGNvbnN0cnVjdG9yLiAgTmVlZCB0bworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjaXBoZXIgdG8gZW5zdXJlIHRoYXQgdGhlIEFFQUQgbW9kZSBmb3IgYQorICAgICAgICAvLyBwYXJ0aWN1bGFyIGtleSBzaXplIGlzIHN1cHBvcnRlZC4KKyAgICAgICAgaWYgKGNpcGhlclR5cGUgPT0gQUVBRF9DSVBIRVIpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEF1dGhlbnRpY2F0b3IocHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBieXRlW10gbm9uY2UgPSBhdXRoZW50aWNhdG9yLnNlcXVlbmNlTnVtYmVyKCk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGl2ID0gQXJyYXlzLmNvcHlPZihmaXhlZEl2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZEl2Lmxlbmd0aCArIG5vbmNlLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShub25jZSwgMCwgaXYsIGZpeGVkSXYubGVuZ3RoLCBub25jZS5sZW5ndGgpOworICAgICAgICAgICAgICAgIEdDTVBhcmFtZXRlclNwZWMgc3BlYyA9IG5ldyBHQ01QYXJhbWV0ZXJTcGVjKHRhZ1NpemUgKiA4LCBpdik7CisKKyAgICAgICAgICAgICAgICBjaXBoZXIuaW5pdChtb2RlLCBrZXksIHNwZWMsIHJhbmRvbSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgLy8gT3RoZXJ3aXNlLCB3ZSBoYXZlIGluaXRpYWxpemVkIHRoZSBjaXBoZXIgaW4gdGhlIGNvbnN0cnVjdG9yLgorCisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2FuaXR5IGNoZWNrIHRoZSBsZW5ndGggb2YgYSBmcmFnbWVudCBiZWZvcmUgZGVjcnlwdGlvbi4KICAgICAgKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvQ2lwaGVyU3VpdGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlclN1aXRlLmphdmEKaW5kZXggNjc3YTdlMS4uNzQwY2RkNiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvQ2lwaGVyU3VpdGUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9DaXBoZXJTdWl0ZS5qYXZhCkBAIC03NSw2ICs3NSwxMiBAQAogICAgIC8vIG1pbmltdW0gcHJpb3JpdHkgZm9yIGRlZmF1bHQgZW5hYmxlZCBDaXBoZXJTdWl0ZXMKICAgICBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfU1VJVEVTX1BSSU9SSVRZID0gMzAwOwogCisgICAgLy8gRmxhZyBpbmRpY2F0aW5nIGlmIENpcGhlclN1aXRlIGF2YWlsYWJpbGl0eSBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5LgorICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiB3ZSByZWx5IG9uIGEgSkNFIGNpcGhlciBpbXBsZW1lbnRhdGlvbiB0aGF0CisgICAgLy8gbWF5IG5vdCBiZSBhdmFpbGFibGUgaW4gdGhlIGluc3RhbGxlZCBKQ0UgcHJvdmlkZXJzLgorICAgIC8vIEl0IGlzIHRydWUgYmVjYXVzZSB3ZSBtaWdodCBub3QgaGF2ZSBhbiBFQ0MgaW1wbGVtZW50YXRpb24uCisgICAgZmluYWwgc3RhdGljIGJvb2xlYW4gRFlOQU1JQ19BVkFJTEFCSUxJVFkgPSB0cnVlOworCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBBTExPV19FQ0MgPSBEZWJ1Zy5nZXRCb29sZWFuUHJvcGVydHkKICAgICAgICAgKCJjb20uc3VuLm5ldC5zc2wuZW5hYmxlRUNDIiwgdHJ1ZSk7CiAKQEAgLTE4MCw2ICsxODYsOSBAQAogICAgICAqIFJldHVybiB3aGV0aGVyIHRoaXMgQ2lwaGVyU3VpdGUgaXMgYXZhaWxhYmxlIGZvciB1c2UuIEEKICAgICAgKiBDaXBoZXJTdWl0ZSBtYXkgYmUgdW5hdmFpbGFibGUgZXZlbiBpZiBpdCBpcyBzdXBwb3J0ZWQKICAgICAgKiAoaS5lLiBhbGxvd2VkID09IHRydWUpIGlmIHRoZSByZXF1aXJlZCBKQ0UgY2lwaGVyIGlzIG5vdCBpbnN0YWxsZWQuCisgICAgICogSW4gc29tZSBjb25maWd1cmF0aW9uLCB0aGlzIHNpdHVhdGlvbiBtYXkgY2hhbmdlIG92ZXIgdGltZSwgY2FsbAorICAgICAqIENpcGhlclN1aXRlTGlzdC5jbGVhckF2YWlsYWJsZUNhY2hlKCkgYmVmb3JlIHRoaXMgbWV0aG9kIHRvIG9idGFpbgorICAgICAqIHRoZSBtb3N0IGN1cnJlbnQgc3RhdHVzLgogICAgICAqLwogICAgIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7CiAgICAgICAgIHJldHVybiBhbGxvd2VkICYmIGtleUV4Y2hhbmdlLmlzQXZhaWxhYmxlKCkgJiYgY2lwaGVyLmlzQXZhaWxhYmxlKCk7CkBAIC0zOTUsNiArNDA0LDEwIEBACiAgICAgICovCiAgICAgZmluYWwgc3RhdGljIGNsYXNzIEJ1bGtDaXBoZXIgewogCisgICAgICAgIC8vIE1hcCBCdWxrQ2lwaGVyIC0+IEJvb2xlYW4oYXZhaWxhYmxlKQorICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBNYXA8QnVsa0NpcGhlcixCb29sZWFuPiBhdmFpbGFibGVDYWNoZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oOCk7CisKICAgICAgICAgLy8gZGVzY3JpcHRpdmUgbmFtZSBpbmNsdWRpbmcga2V5IHNpemUsIGUuZy4gQUVTLzEyOAogICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CiAKQEAgLTQzOCw5ICs0NTEsNiBAQAogICAgICAgICAvLyBUaGUgc2VjdXJlIHJhbmRvbSB1c2VkIHRvIGRldGVjdCB0aGUgY2lwaGVyIGF2YWlsYWJpbGl0eS4KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2VjdXJlUmFuZG9tIHNlY3VyZVJhbmRvbTsKIAotICAgICAgICAvLyBydW50aW1lIGF2YWlsYWJpbGl0eQotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNBdmFpbGFibGU7Ci0KICAgICAgICAgc3RhdGljIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgc2VjdXJlUmFuZG9tID0gSnNzZUpjZS5nZXRTZWN1cmVSYW5kb20oKTsKQEAgLTQ2NSwxNyArNDc1LDYgQEAKIAogICAgICAgICAgICAgdGhpcy5leHBhbmRlZEtleVNpemUgPSBleHBhbmRlZEtleVNpemU7CiAgICAgICAgICAgICB0aGlzLmV4cG9ydGFibGUgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBhdmFpbGFiaWxpdHkgb2YgdGhpcyBidWxrIGNpcGhlcgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBhbGwgc3VwcG9ydGVkIGNpcGhlcnMgZXhjZXB0IEFFUyBhcmUgYWx3YXlzIGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gdmlhIHRoZSBKU1NFIGludGVybmFsIGltcGxlbWVudGF0aW9ucy4gV2UgYWxzbyBhc3N1bWUgQUVTLzEyOCBvZgotICAgICAgICAgICAgLy8gQ0JDIG1vZGUgaXMgYWx3YXlzIGF2YWlsYWJsZSBzaW5jZSBpdCBpcyBzaGlwcGVkIHdpdGggdGhlIFN1bkpDRQotICAgICAgICAgICAgLy8gcHJvdmlkZXIuICBIb3dldmVyLCBBRVMvMjU2IGlzIHVuYXZhaWxhYmxlIHdoZW4gdGhlIGRlZmF1bHQgSkNFCi0gICAgICAgICAgICAvLyBwb2xpY3kganVyaXNkaWN0aW9uIGZpbGVzIGFyZSBpbnN0YWxsZWQgYmVjYXVzZSBvZiBrZXkgbGVuZ3RoCi0gICAgICAgICAgICAvLyByZXN0cmljdGlvbnMuCi0gICAgICAgICAgICB0aGlzLmlzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA/IGlzVW5saW1pdGVkKGtleVNpemUsIHRyYW5zZm9ybWF0aW9uKSA6IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgQnVsa0NpcGhlcihTdHJpbmcgdHJhbnNmb3JtYXRpb24sIENpcGhlclR5cGUgY2lwaGVyVHlwZSwgaW50IGtleVNpemUsCkBAIC00OTIsMTcgKzQ5MSw2IEBACiAKICAgICAgICAgICAgIHRoaXMuZXhwYW5kZWRLZXlTaXplID0ga2V5U2l6ZTsKICAgICAgICAgICAgIHRoaXMuZXhwb3J0YWJsZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAvLyBhdmFpbGFiaWxpdHkgb2YgdGhpcyBidWxrIGNpcGhlcgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBhbGwgc3VwcG9ydGVkIGNpcGhlcnMgZXhjZXB0IEFFUyBhcmUgYWx3YXlzIGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gdmlhIHRoZSBKU1NFIGludGVybmFsIGltcGxlbWVudGF0aW9ucy4gV2UgYWxzbyBhc3N1bWUgQUVTLzEyOCBvZgotICAgICAgICAgICAgLy8gQ0JDIG1vZGUgaXMgYWx3YXlzIGF2YWlsYWJsZSBzaW5jZSBpdCBpcyBzaGlwcGVkIHdpdGggdGhlIFN1bkpDRQotICAgICAgICAgICAgLy8gcHJvdmlkZXIuICBIb3dldmVyLCBBRVMvMjU2IGlzIHVuYXZhaWxhYmxlIHdoZW4gdGhlIGRlZmF1bHQgSkNFCi0gICAgICAgICAgICAvLyBwb2xpY3kganVyaXNkaWN0aW9uIGZpbGVzIGFyZSBpbnN0YWxsZWQgYmVjYXVzZSBvZiBrZXkgbGVuZ3RoCi0gICAgICAgICAgICAvLyByZXN0cmljdGlvbnMuCi0gICAgICAgICAgICB0aGlzLmlzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCA/IGlzVW5saW1pdGVkKGtleVNpemUsIHRyYW5zZm9ybWF0aW9uKSA6IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01MjAsMjkgKzUwOCw4NiBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUZXN0IGlmIHRoaXMgYnVsayBjaXBoZXIgaXMgYXZhaWxhYmxlLiBGb3IgdXNlIGJ5IENpcGhlclN1aXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBDdXJyZW50bHkgYWxsIHN1cHBvcnRlZCBjaXBoZXJzIGV4Y2VwdCBBRVMgYXJlIGFsd2F5cyBhdmFpbGFibGUKKyAgICAgICAgICogdmlhIHRoZSBKU1NFIGludGVybmFsIGltcGxlbWVudGF0aW9ucy4gV2UgYWxzbyBhc3N1bWUgQUVTLzEyOCBvZgorICAgICAgICAgKiBDQkMgbW9kZSBpcyBhbHdheXMgYXZhaWxhYmxlIHNpbmNlIGl0IGlzIHNoaXBwZWQgd2l0aCB0aGUgU3VuSkNFCisgICAgICAgICAqIHByb3ZpZGVyLiAgSG93ZXZlciwgQUVTLzI1NiBpcyB1bmF2YWlsYWJsZSB3aGVuIHRoZSBkZWZhdWx0IEpDRQorICAgICAgICAgKiBwb2xpY3kganVyaXNkaWN0aW9uIGZpbGVzIGFyZSBpbnN0YWxsZWQgYmVjYXVzZSBvZiBrZXkgbGVuZ3RoCisgICAgICAgICAqIHJlc3RyaWN0aW9ucywgYW5kIEFFQUQgaXMgdW5hdmFpbGFibGUgd2hlbiB0aGUgdW5kZXJseWluZyBwcm92aWRlcnMKKyAgICAgICAgICogZG8gbm90IHN1cHBvcnQgQUVBRC9HQ00gbW9kZS4KICAgICAgICAgICovCiAgICAgICAgIGJvb2xlYW4gaXNBdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0F2YWlsYWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNVbmxpbWl0ZWQoaW50IGtleVNpemUsIFN0cmluZyB0cmFuc2Zvcm1hdGlvbikgewotICAgICAgICAgICAgaW50IGtleVNpemVJbkJpdHMgPSBrZXlTaXplICogODsKLSAgICAgICAgICAgIGlmIChrZXlTaXplSW5CaXRzID4gMTI4KSB7ICAgIC8vIG5lZWQgdGhlIEpDRSB1bmxpbWl0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmVuZ3RoIGp1cmlzZGljdGlvbiBwb2xpY3kKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24pIDwga2V5U2l6ZUluQml0cykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsbG93ZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmICgodGhpcyA9PSBCX0FFU18yNTYpIHx8CisgICAgICAgICAgICAgICAgICAgICh0aGlzLmNpcGhlclR5cGUgPT0gQ2lwaGVyVHlwZS5BRUFEX0NJUEhFUikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNBdmFpbGFibGUodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFsd2F5cyBhdmFpbGFibGUKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gZm9yIHVzZSBieSBDaXBoZXJTdWl0ZUxpc3QuY2xlYXJBdmFpbGFibGVDYWNoZSgpOworICAgICAgICBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBdmFpbGFibGVDYWNoZSgpIHsKKyAgICAgICAgICAgIGlmIChEWU5BTUlDX0FWQUlMQUJJTElUWSkgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZUNhY2hlLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0F2YWlsYWJsZShCdWxrQ2lwaGVyIGNpcGhlcikgeworICAgICAgICAgICAgQm9vbGVhbiBiID0gYXZhaWxhYmxlQ2FjaGUuZ2V0KGNpcGhlcik7CisgICAgICAgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW50IGtleVNpemVJbkJpdHMgPSBjaXBoZXIua2V5U2l6ZSAqIDg7CisgICAgICAgICAgICAgICAgaWYgKGtleVNpemVJbkJpdHMgPiAxMjgpIHsgICAgLy8gbmVlZCB0aGUgSkNFIHVubGltaXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJlbmd0aCBqdXJpc2RpY3Rpb24gcG9saWN5CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlci50cmFuc2Zvcm1hdGlvbikgPCBrZXlTaXplSW5CaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IEJvb2xlYW4uRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChiID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYiA9IEJvb2xlYW4uRkFMU0U7ICAgICAgICAgIC8vIG1heSBiZSByZXNldCB0byBUUlVFIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2lwaGVyIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICBDaXBoZXJCb3ggdGVtcG9yYXJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlY3JldEtleSBrZXkgPSBuZXcgU2VjcmV0S2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbY2lwaGVyLmV4cGFuZGVkS2V5U2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlci5hbGdvcml0aG0pOworICAgICAgICAgICAgICAgICAgICAgICAgSXZQYXJhbWV0ZXJTcGVjIGl2OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNpcGhlci5jaXBoZXJUeXBlID09IENpcGhlclR5cGUuQUVBRF9DSVBIRVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiA9IG5ldyBJdlBhcmFtZXRlclNwZWMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBieXRlW2NpcGhlci5maXhlZEl2U2l6ZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiA9IG5ldyBJdlBhcmFtZXRlclNwZWMobmV3IGJ5dGVbY2lwaGVyLml2U2l6ZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5ID0gY2lwaGVyLm5ld0NpcGhlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLkRFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgaXYsIHNlY3VyZVJhbmRvbSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gdGVtcG9yYXJ5LmlzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcG9yYXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhcnkuZGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2FjaGUucHV0KGNpcGhlciwgYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9DaXBoZXJTdWl0ZUxpc3QuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlclN1aXRlTGlzdC5qYXZhCmluZGV4IDQ5MWJmZmEuLjE5ZGM5MGYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlclN1aXRlTGlzdC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NpcGhlclN1aXRlTGlzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzQsMTIgKzc0LDI0IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDaXBoZXJTdWl0ZXMgbWF5IG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KICAgICAgICAgY2lwaGVyU3VpdGVzID0gbmV3IEFycmF5TGlzdDxDaXBoZXJTdWl0ZT4obmFtZXMubGVuZ3RoKTsKKyAgICAgICAgLy8gcmVmcmVzaCBhdmFpbGFibGUgY2FjaGUgb25jZSBpZiBhIENpcGhlclN1aXRlIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgLy8gKG1heWJlIG5ldyBKQ0UgcHJvdmlkZXJzIGhhdmUgYmVlbiBpbnN0YWxsZWQpCisgICAgICAgIGJvb2xlYW4gcmVmcmVzaGVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZyBzdWl0ZU5hbWUgPSBuYW1lc1tpXTsKICAgICAgICAgICAgIENpcGhlclN1aXRlIHN1aXRlID0gQ2lwaGVyU3VpdGUudmFsdWVPZihzdWl0ZU5hbWUpOwogICAgICAgICAgICAgaWYgKHN1aXRlLmlzQXZhaWxhYmxlKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcG9ydCAiCi0gICAgICAgICAgICAgICAgICAgICsgc3VpdGVOYW1lICsgIiB3aXRoIGN1cnJlbnRseSBpbnN0YWxsZWQgcHJvdmlkZXJzIik7CisgICAgICAgICAgICAgICAgaWYgKHJlZnJlc2hlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgY2FjaGUgc28gdGhhdCB0aGUgaXNBdmFpbGFibGUoKSBjYWxsIGJlbG93CisgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgYSBmdWxsIGNoZWNrCisgICAgICAgICAgICAgICAgICAgIGNsZWFyQXZhaWxhYmxlQ2FjaGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmcmVzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gc3RpbGwgbWlzc2luZz8KKyAgICAgICAgICAgICAgICBpZiAoc3VpdGUuaXNBdmFpbGFibGUoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHN1aXRlTmFtZSArICIgd2l0aCBjdXJyZW50bHkgaW5zdGFsbGVkIHByb3ZpZGVycyIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNpcGhlclN1aXRlcy5hZGQoc3VpdGUpOwogICAgICAgICB9CkBAIC0xODMsNCArMTk1LDE2IEBACiAgICAgICAgIH0KICAgICAgICAgcy5wdXRCeXRlczE2KHN1aXRlQnl0ZXMpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGNhY2hlIG9mIGF2YWlsYWJsZSBjaXBoZXJzdWl0ZXMuIElmIHdlIHN1cHBvcnQgYWxsIGNpcGhlcnMKKyAgICAgKiBpbnRlcm5hbGx5LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBhbmQgY2FsbGluZyB0aGlzCisgICAgICogbWV0aG9kIGhhcyBubyBlZmZlY3QuCisgICAgICovCisgICAgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQXZhaWxhYmxlQ2FjaGUoKSB7CisgICAgICAgIGlmIChDaXBoZXJTdWl0ZS5EWU5BTUlDX0FWQUlMQUJJTElUWSkgeworICAgICAgICAgICAgQ2lwaGVyU3VpdGUuQnVsa0NpcGhlci5jbGVhckF2YWlsYWJsZUNhY2hlKCk7CisgICAgICAgICAgICBKc3NlSmNlLmNsZWFyRWNBdmFpbGFibGUoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0pzc2VKY2UuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0pzc2VKY2UuamF2YQppbmRleCA5MjNhZThlLi40Yzk4NzcyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9Kc3NlSmNlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSnNzZUpjZS5qYXZhCkBAIC01NSw2ICs1NSwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUHJvdmlkZXJMaXN0IGZpcHNQcm92aWRlckxpc3Q7CiAKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBFQyBjcnlwdG8gaXMgYXZhaWxhYmxlLgorICAgIC8vIElmIG51bGwsIHRoZW4gd2UgaGF2ZSBub3QgY2hlY2tlZCB5ZXQuCisgICAgLy8gSWYgeWVzLCB0aGVuIGFsbCB0aGUgRUMgYmFzZWQgY3J5cHRvIHdlIG5lZWQgaXMgYXZhaWxhYmxlLgorICAgIHByaXZhdGUgc3RhdGljIEJvb2xlYW4gZWNBdmFpbGFibGU7CisKICAgICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBLZXJiZXJvcyBjcnlwdG8gaXMgYXZhaWxhYmxlLgogICAgIC8vIElmIHRydWUsIHRoZW4gYWxsIHRoZSBLZXJiZXJvcy1iYXNlZCBjcnlwdG8gd2UgbmVlZCBpcyBhdmFpbGFibGUuCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBrZXJiZXJvc0F2YWlsYWJsZTsKQEAgLTE5MCw4ICsxOTUsMjQgQEAKICAgICAgICAgLy8gbm8gaW5zdGFudGlhdGlvbiBvZiB0aGlzIGNsYXNzCiAgICAgfQogCi0gICAgc3RhdGljIGJvb2xlYW4gaXNFY0F2YWlsYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIEVjQXZhaWxhYmlsaXR5LmlzQXZhaWxhYmxlOworICAgIHN5bmNocm9uaXplZCBzdGF0aWMgYm9vbGVhbiBpc0VjQXZhaWxhYmxlKCkgeworICAgICAgICBpZiAoZWNBdmFpbGFibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBKc3NlSmNlLmdldFNpZ25hdHVyZShTSUdOQVRVUkVfRUNEU0EpOworICAgICAgICAgICAgICAgIEpzc2VKY2UuZ2V0U2lnbmF0dXJlKFNJR05BVFVSRV9SQVdFQ0RTQSk7CisgICAgICAgICAgICAgICAgSnNzZUpjZS5nZXRLZXlBZ3JlZW1lbnQoIkVDREgiKTsKKyAgICAgICAgICAgICAgICBKc3NlSmNlLmdldEtleUZhY3RvcnkoIkVDIik7CisgICAgICAgICAgICAgICAgSnNzZUpjZS5nZXRLZXlQYWlyR2VuZXJhdG9yKCJFQyIpOworICAgICAgICAgICAgICAgIGVjQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZWNBdmFpbGFibGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZWNBdmFpbGFibGU7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIGNsZWFyRWNBdmFpbGFibGUoKSB7CisgICAgICAgIGVjQXZhaWxhYmxlID0gbnVsbDsKICAgICB9CiAKICAgICBzdGF0aWMgYm9vbGVhbiBpc0tlcmJlcm9zQXZhaWxhYmxlKCkgewpAQCAtMzkzLDI3ICs0MTQsNCBAQAogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvLyBsYXp5IGluaXRpYWxpemF0aW9uIGhvbGRlciBjbGFzcyBpZGlvbSBmb3Igc3RhdGljIGRlZmF1bHQgcGFyYW1ldGVycwotICAgIC8vCi0gICAgLy8gU2VlIEVmZmVjdGl2ZSBKYXZhIFNlY29uZCBFZGl0aW9uOiBJdGVtIDcxLgotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVjQXZhaWxhYmlsaXR5IHsKLSAgICAgICAgLy8gSXMgRUMgY3J5cHRvIGF2YWlsYWJsZT8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZTsKLQotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgYm9vbGVhbiBtZWRpYXRvciA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEpzc2VKY2UuZ2V0U2lnbmF0dXJlKFNJR05BVFVSRV9FQ0RTQSk7Ci0gICAgICAgICAgICAgICAgSnNzZUpjZS5nZXRTaWduYXR1cmUoU0lHTkFUVVJFX1JBV0VDRFNBKTsKLSAgICAgICAgICAgICAgICBKc3NlSmNlLmdldEtleUFncmVlbWVudCgiRUNESCIpOwotICAgICAgICAgICAgICAgIEpzc2VKY2UuZ2V0S2V5RmFjdG9yeSgiRUMiKTsKLSAgICAgICAgICAgICAgICBKc3NlSmNlLmdldEtleVBhaXJHZW5lcmF0b3IoIkVDIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIG1lZGlhdG9yID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlzQXZhaWxhYmxlID0gbWVkaWF0b3I7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9SU0FDbGllbnRLZXlFeGNoYW5nZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvUlNBQ2xpZW50S2V5RXhjaGFuZ2UuamF2YQppbmRleCAwOWRkNGNiLi43ODMxNDZjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9SU0FDbGllbnRLZXlFeGNoYW5nZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1JTQUNsaWVudEtleUV4Y2hhbmdlLmphdmEKQEAgLTkwLDMwICs5MCw2IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBSZXRyaWV2aW5nIHRoZSBjaXBoZXIncyBwcm92aWRlciBuYW1lIGZvciB0aGUgZGVidWcgcHVycG9zZXMKLSAgICAgKiBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGJ5IGl0c2VsZi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2FmZVByb3ZpZGVyTmFtZShDaXBoZXIgY2lwaGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gY2lwaGVyLmdldFByb3ZpZGVyKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXRyaWV2aW5nIFRoZSBDaXBoZXIgcHJvdmlkZXIgbmFtZSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBjYXVzZWQgZXhjZXB0aW9uICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBjaXBoZXIudG9TdHJpbmcoKSArICIgKHByb3ZpZGVyIG5hbWUgbm90IGF2YWlsYWJsZSkiOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJldHJpZXZpbmcgVGhlIENpcGhlciBuYW1lIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGNhdXNlZCBleGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIihjaXBoZXIvcHJvdmlkZXIgbmFtZXMgbm90IGF2YWlsYWJsZSkiOwotICAgIH0KLQotICAgIC8qCiAgICAgICogU2VydmVyIGdldHMgdGhlIFBLQ1MgIzEgKGJsb2NrIGZvcm1hdCAwMikgZGF0YSwgZGVjcnlwdHMKICAgICAgKiBpdCB3aXRoIGl0cyBwcml2YXRlIGtleS4KICAgICAgKi8KQEAgLTE1NCwxOSArMTMwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiB8IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGl1ZSkgewogICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIENpcGhlciBwcm92aWRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzYWZlUHJvdmlkZXJOYW1lKGNpcGhlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2F1c2VkIGV4Y2VwdGlvbjogIiArIGl1ZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBDaXBoZXIgcHJvdmlkZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXIuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBjYXVzZWQgZXhjZXB0aW9uOiAiICsgaXVlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbmVlZEZhaWxvdmVyID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG5lZWRGYWlsb3ZlcikgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjaXBoZXIgbWlnaHQgYmUgc3BvaWxlZCBieSB1bnN1Y2Nlc3NmdWwgY2FsbCB0byBpbml0KCksCi0gICAgICAgICAgICAgICAgLy8gc28gcmVxdWVzdCBhIGZyZXNoIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgY2lwaGVyID0gSnNzZUpjZS5nZXRDaXBoZXIoSnNzZUpjZS5DSVBIRVJfUlNBX1BLQ1MxKTsKLQogICAgICAgICAgICAgICAgIC8vIFVzZSBERUNSWVBUX01PREUgYW5kIGRpc3Bvc2UgdGhlIHByZXZpb3VzIGluaXRpYWxpemF0aW9uLgogICAgICAgICAgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHByaXZhdGVLZXkpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CkBAIC0yNTUsMTMgKzIyNyw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHByaW50KFByaW50U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gInZlcnNpb24gbm90IGF2YWlsYWJsZS9leHRyYWN0YWJsZSI7Ci0KLSAgICAgICAgYnl0ZVtdIGJhID0gcHJlTWFzdGVyLmdldEVuY29kZWQoKTsKLSAgICAgICAgaWYgKGJhICE9IG51bGwgJiYgYmEubGVuZ3RoID49IDIpIHsKLSAgICAgICAgICAgIHZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24udmFsdWVPZihiYVswXSwgYmFbMV0pLm5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzLnByaW50bG4oIioqKiBDbGllbnRLZXlFeGNoYW5nZSwgUlNBIFByZU1hc3RlclNlY3JldCwgIiArIHZlcnNpb24pOworICAgICAgICBzLnByaW50bG4oIioqKiBDbGllbnRLZXlFeGNoYW5nZSwgUlNBIFByZU1hc3RlclNlY3JldCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVmVyc2lvbik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMQ29udGV4dEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTENvbnRleHRJbXBsLmphdmEKaW5kZXggZjhhMWNmMC4uYjAwYTI2ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMQ29udGV4dEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xDb250ZXh0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTIsNiArNTIsMTYgQEAKICAgICBwcml2YXRlIFg1MDlUcnVzdE1hbmFnZXIgdHJ1c3RNYW5hZ2VyOwogICAgIHByaXZhdGUgU2VjdXJlUmFuZG9tIHNlY3VyZVJhbmRvbTsKIAorICAgIC8vIHN1cHBvcnRlZCBhbmQgZGVmYXVsdCBwcm90b2NvbHMKKyAgICBwcml2YXRlIFByb3RvY29sTGlzdCBkZWZhdWx0U2VydmVyUHJvdG9jb2xMaXN0OworICAgIHByaXZhdGUgUHJvdG9jb2xMaXN0IGRlZmF1bHRDbGllbnRQcm90b2NvbExpc3Q7CisgICAgcHJpdmF0ZSBQcm90b2NvbExpc3Qgc3VwcG9ydGVkUHJvdG9jb2xMaXN0OworCisgICAgLy8gc3VwcG9ydGVkIGFuZCBkZWZhdWx0IGNpcGhlciBzdWl0ZXMKKyAgICBwcml2YXRlIENpcGhlclN1aXRlTGlzdCBkZWZhdWx0U2VydmVyQ2lwaGVyU3VpdGVMaXN0OworICAgIHByaXZhdGUgQ2lwaGVyU3VpdGVMaXN0IGRlZmF1bHRDbGllbnRDaXBoZXJTdWl0ZUxpc3Q7CisgICAgcHJpdmF0ZSBDaXBoZXJTdWl0ZUxpc3Qgc3VwcG9ydGVkQ2lwaGVyU3VpdGVMaXN0OworCiAgICAgU1NMQ29udGV4dEltcGwoKSB7CiAgICAgICAgIGVwaGVtZXJhbEtleU1hbmFnZXIgPSBuZXcgRXBoZW1lcmFsS2V5TWFuYWdlcigpOwogICAgICAgICBjbGllbnRDYWNoZSA9IG5ldyBTU0xTZXNzaW9uQ29udGV4dEltcGwoKTsKQEAgLTE4MSw4ICsxOTEsNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBuZXcgU1NMU2VydmVyU29ja2V0RmFjdG9yeUltcGwodGhpcyk7CiAgICAgfQotICAgIGFic3RyYWN0IFNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmVJbXBsKCk7Ci0gICAgYWJzdHJhY3QgU1NMRW5naW5lIGNyZWF0ZVNTTEVuZ2luZUltcGwoU3RyaW5nIGhvc3QsIGludCBwb3J0KTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTU0xFbmdpbmUgZW5naW5lQ3JlYXRlU1NMRW5naW5lKCkgewpAQCAtMTkwLDcgKzE5OCw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJTU0xDb250ZXh0SW1wbCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlU1NMRW5naW5lSW1wbCgpOworICAgICAgICByZXR1cm4gbmV3IFNTTEVuZ2luZUltcGwodGhpcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xOTksNyArMjA3LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlNTTENvbnRleHRJbXBsIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjcmVhdGVTU0xFbmdpbmVJbXBsKGhvc3QsIHBvcnQpOworICAgICAgICByZXR1cm4gbmV3IFNTTEVuZ2luZUltcGwodGhpcywgaG9zdCwgcG9ydCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMjgsMzUgKzIzNiw3OCBAQAogICAgICAgICByZXR1cm4gZXBoZW1lcmFsS2V5TWFuYWdlcjsKICAgICB9CiAKKyAgICBhYnN0cmFjdCBTU0xQYXJhbWV0ZXJzIGdldERlZmF1bHRTZXJ2ZXJTU0xQYXJhbXMoKTsKKyAgICBhYnN0cmFjdCBTU0xQYXJhbWV0ZXJzIGdldERlZmF1bHRDbGllbnRTU0xQYXJhbXMoKTsKKyAgICBhYnN0cmFjdCBTU0xQYXJhbWV0ZXJzIGdldFN1cHBvcnRlZFNTTFBhcmFtcygpOwogCiAgICAgLy8gR2V0IHN1cHBvcnRlZCBQcm90b2NvbExpc3QuCi0gICAgYWJzdHJhY3QgUHJvdG9jb2xMaXN0IGdldFN1cG9ydGVkUHJvdG9jb2xMaXN0KCk7CisgICAgUHJvdG9jb2xMaXN0IGdldFN1cG9ydGVkUHJvdG9jb2xMaXN0KCkgeworICAgICAgICBpZiAoc3VwcG9ydGVkUHJvdG9jb2xMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29sTGlzdCA9CisgICAgICAgICAgICAgICAgbmV3IFByb3RvY29sTGlzdChnZXRTdXBwb3J0ZWRTU0xQYXJhbXMoKS5nZXRQcm90b2NvbHMoKSk7CisgICAgICAgIH0KIAotICAgIC8vIEdldCBkZWZhdWx0IFByb3RvY29sTGlzdCBmb3Igc2VydmVyIG1vZGUuCi0gICAgYWJzdHJhY3QgUHJvdG9jb2xMaXN0IGdldFNlcnZlckRlZmF1bHRQcm90b2NvbExpc3QoKTsKLQotICAgIC8vIEdldCBkZWZhdWx0IFByb3RvY29sTGlzdCBmb3IgY2xpZW50IG1vZGUuCi0gICAgYWJzdHJhY3QgUHJvdG9jb2xMaXN0IGdldENsaWVudERlZmF1bHRQcm90b2NvbExpc3QoKTsKLQotICAgIC8vIEdldCBzdXBwb3J0ZWQgQ2lwaGVyU3VpdGVMaXN0LgotICAgIGFic3RyYWN0IENpcGhlclN1aXRlTGlzdCBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3QoKTsKLQotICAgIC8vIEdldCBkZWZhdWx0IENpcGhlclN1aXRlTGlzdCBmb3Igc2VydmVyIG1vZGUuCi0gICAgYWJzdHJhY3QgQ2lwaGVyU3VpdGVMaXN0IGdldFNlcnZlckRlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKTsKLQotICAgIC8vIEdldCBkZWZhdWx0IENpcGhlclN1aXRlTGlzdCBmb3IgY2xpZW50IG1vZGUuCi0gICAgYWJzdHJhY3QgQ2lwaGVyU3VpdGVMaXN0IGdldENsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKTsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFByb3RvY29sTGlzdDsKKyAgICB9CiAKICAgICAvLyBHZXQgZGVmYXVsdCBQcm90b2NvbExpc3QuCiAgICAgUHJvdG9jb2xMaXN0IGdldERlZmF1bHRQcm90b2NvbExpc3QoYm9vbGVhbiByb2xlSXNTZXJ2ZXIpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVJc1NlcnZlciA/IGdldFNlcnZlckRlZmF1bHRQcm90b2NvbExpc3QoKQotICAgICAgICAgICAgICAgIDogZ2V0Q2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCgpOworICAgICAgICBpZiAocm9sZUlzU2VydmVyKSB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFNlcnZlclByb3RvY29sTGlzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZlclByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2VydmVyU1NMUGFyYW1zKCkuZ2V0UHJvdG9jb2xzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNlcnZlclByb3RvY29sTGlzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0Q2xpZW50UHJvdG9jb2xMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q2xpZW50UHJvdG9jb2xMaXN0ID0gbmV3IFByb3RvY29sTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRDbGllbnRTU0xQYXJhbXMoKS5nZXRQcm90b2NvbHMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2xpZW50UHJvdG9jb2xMaXN0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2V0IHN1cHBvcnRlZCBDaXBoZXJTdWl0ZUxpc3QuCisgICAgQ2lwaGVyU3VpdGVMaXN0IGdldFN1cHBvcnRlZENpcGhlclN1aXRlTGlzdCgpIHsKKyAgICAgICAgLy8gVGhlIG1haW50ZW5hbmNlIG9mIGNpcGhlciBzdWl0ZXMgbmVlZHMgdG8gYmUgc3luY2hyb25pemVkLgorICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNhY2hlIG9mIGF2YWlsYWJsZSBjaXBoZXJzdWl0ZXMuCisgICAgICAgICAgICBjbGVhckF2YWlsYWJsZUNhY2hlKCk7CisKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRlZENpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdXBvcnRlZFByb3RvY29sTGlzdCgpLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3Q7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBHZXQgZGVmYXVsdCBDaXBoZXJTdWl0ZUxpc3QuCiAgICAgQ2lwaGVyU3VpdGVMaXN0IGdldERlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoYm9vbGVhbiByb2xlSXNTZXJ2ZXIpIHsKLSAgICAgICAgcmV0dXJuIHJvbGVJc1NlcnZlciA/IGdldFNlcnZlckRlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKQotICAgICAgICAgICAgICAgIDogZ2V0Q2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdCgpOworICAgICAgICAvLyBUaGUgbWFpbnRlbmFuY2Ugb2YgY2lwaGVyIHN1aXRlcyBuZWVkcyB0byBiZSBzeW5jaHJvbml6ZWQuCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgLy8gQ2xlYXIgY2FjaGUgb2YgYXZhaWxhYmxlIGNpcGhlcnN1aXRlcy4KKyAgICAgICAgICAgIGNsZWFyQXZhaWxhYmxlQ2FjaGUoKTsKKworICAgICAgICAgICAgaWYgKHJvbGVJc1NlcnZlcikgeworICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U2VydmVyQ2lwaGVyU3VpdGVMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZlckNpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0UHJvdG9jb2xMaXN0KHRydWUpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNlcnZlckNpcGhlclN1aXRlTGlzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDbGllbnRDaXBoZXJTdWl0ZUxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2xpZW50Q2lwaGVyU3VpdGVMaXN0ID0gZ2V0QXBwbGljYWJsZUNpcGhlclN1aXRlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRQcm90b2NvbExpc3QoZmFsc2UpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENsaWVudENpcGhlclN1aXRlTGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjY0LDI0ICszMTUsMTYgQEAKICAgICAgKiBwcm90b2NvbHMuICBTZWU6IFNTTFNvY2tldC9TU0xFbmdpbmUuc2V0RW5hYmxlZFByb3RvY29scygpCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0RlZmF1bHRQcm90b2NvbExpc3QoUHJvdG9jb2xMaXN0IHByb3RvY29scykgewotICAgICAgICByZXR1cm4gKHByb3RvY29scyA9PSBnZXRTZXJ2ZXJEZWZhdWx0UHJvdG9jb2xMaXN0KCkpIHx8Ci0gICAgICAgICAgICAgICAgKHByb3RvY29scyA9PSBnZXRDbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0KCkpOworICAgICAgICByZXR1cm4gKHByb3RvY29scyA9PSBkZWZhdWx0U2VydmVyUHJvdG9jb2xMaXN0KSB8fAorICAgICAgICAgICAgICAgKHByb3RvY29scyA9PSBkZWZhdWx0Q2xpZW50UHJvdG9jb2xMaXN0KTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gd2hldGhlciBhIHByb3RvY29sIGxpc3QgaXMgdGhlIG9yaWdpbmFsIGRlZmF1bHQgZW5hYmxlZAotICAgICAqIHByb3RvY29scy4gIFNlZTogU1NMU29ja2V0L1NTTEVuZ2luZS5zZXRFbmFibGVkUHJvdG9jb2xzKCkKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRGVmYXVsdENpcGhlclN1aXRlTGlzdChDaXBoZXJTdWl0ZUxpc3QgY2lwaGVyU3VpdGVzKSB7Ci0gICAgICAgIHJldHVybiAoY2lwaGVyU3VpdGVzID09IGdldFNlcnZlckRlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKSkgfHwKLSAgICAgICAgICAgICAgICAoY2lwaGVyU3VpdGVzID09IGdldENsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKSk7Ci0gICAgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBDaXBoZXJTdWl0ZXMgd2l0aCBhIHByaW9yaXR5IG9mCiAgICAgICogbWluUHJpb3JpdHkgb3IgYWJvdmUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2lwaGVyU3VpdGVMaXN0IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCisgICAgcHJpdmF0ZSBDaXBoZXJTdWl0ZUxpc3QgZ2V0QXBwbGljYWJsZUNpcGhlclN1aXRlTGlzdCgKICAgICAgICAgICAgIFByb3RvY29sTGlzdCBwcm90b2NvbHMsIGJvb2xlYW4gb25seUVuYWJsZWQpIHsKIAogICAgICAgICBpbnQgbWluUHJpb3JpdHkgPSBDaXBoZXJTdWl0ZS5TVVBQT1JURURfU1VJVEVTX1BSSU9SSVRZOwpAQCAtMzI3LDIwICszNzAsMjIgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJTdWl0ZUxpc3Qoc3VpdGVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRBdmFpbGFibGVQcm90b2NvbHMoCi0gICAgICAgICAgICBQcm90b2NvbFZlcnNpb25bXSBwcm90b2NvbENhbmRpZGF0ZXMpIHsKLQotICAgICAgICBMaXN0PFN0cmluZz4gYXZhaWxhYmxlUHJvdG9jb2xzID0gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKTsKLSAgICAgICAgaWYgKHByb3RvY29sQ2FuZGlkYXRlcyAhPSAgbnVsbCAmJiBwcm90b2NvbENhbmRpZGF0ZXMubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZVByb3RvY29scyA9IG5ldyBBcnJheUxpc3Q8Pihwcm90b2NvbENhbmRpZGF0ZXMubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoUHJvdG9jb2xWZXJzaW9uIHAgOiBwcm90b2NvbENhbmRpZGF0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoUHJvdG9jb2xWZXJzaW9uLmF2YWlsYWJsZVByb3RvY29scy5jb250YWlucyhwKSkgewotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQcm90b2NvbHMuYWRkKHAubmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIC8qKgorICAgICAqIENsZWFyIGNhY2hlIG9mIGF2YWlsYWJsZSBjaXBoZXJzdWl0ZXMuIElmIHdlIHN1cHBvcnQgYWxsIGNpcGhlcnMKKyAgICAgKiBpbnRlcm5hbGx5LCB0aGVyZSBpcyBubyBuZWVkIHRvIGNsZWFyIHRoZSBjYWNoZSBhbmQgY2FsbGluZyB0aGlzCisgICAgICogbWV0aG9kIGhhcyBubyBlZmZlY3QuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgZXZlcnkgY2FsbCB0byBjbGVhckF2YWlsYWJsZUNhY2hlKCkgYW5kIHRoZSBtYWludGVuYW5jZSBvZgorICAgICAqIGNpcGhlciBzdWl0ZXMgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGlzIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhckF2YWlsYWJsZUNhY2hlKCkgeworICAgICAgICBpZiAoQ2lwaGVyU3VpdGUuRFlOQU1JQ19BVkFJTEFCSUxJVFkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZENpcGhlclN1aXRlTGlzdCA9IG51bGw7CisgICAgICAgICAgICBkZWZhdWx0U2VydmVyQ2lwaGVyU3VpdGVMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIGRlZmF1bHRDbGllbnRDaXBoZXJTdWl0ZUxpc3QgPSBudWxsOworICAgICAgICAgICAgQ2lwaGVyU3VpdGUuQnVsa0NpcGhlci5jbGVhckF2YWlsYWJsZUNhY2hlKCk7CisgICAgICAgICAgICBKc3NlSmNlLmNsZWFyRWNBdmFpbGFibGUoKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhdmFpbGFibGVQcm90b2NvbHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKICAgICB9CiAKICAgICAvKgpAQCAtMzczLDM3ICs0MTgsMzkgQEAKICAgICAgKi8KIAogICAgIC8qCi0gICAgICogVGhlIGJhc2UgYWJzdHJhY3QgU1NMQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIFRyYW5zcG9ydCBMYXllcgotICAgICAqIFNlY3VyaXR5IChUTFMpIHByb3RvY29scy4KKyAgICAgKiBUaGUgYmFzZSBhYnN0cmFjdCBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uLgogICAgICAqCiAgICAgICogVGhpcyBhYnN0cmFjdCBjbGFzcyBlbmNhcHN1bGF0ZXMgc3VwcG9ydGVkIGFuZCB0aGUgZGVmYXVsdCBzZXJ2ZXIKLSAgICAgKiBTU0wvVExTIHBhcmFtZXRlcnMuCisgICAgICogU1NMIHBhcmFtZXRlcnMuCiAgICAgICoKICAgICAgKiBAc2VlIFNTTENvbnRleHQKICAgICAgKi8KLSAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFRMU0NvbnRleHQgZXh0ZW5kcyBTU0xDb250ZXh0SW1wbCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sTGlzdCBzdXBwb3J0ZWRQcm90b2NvbExpc3Q7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sTGlzdCBzZXJ2ZXJEZWZhdWx0UHJvdG9jb2xMaXN0OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENpcGhlclN1aXRlTGlzdCBzdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3Q7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENpcGhlclN1aXRlTGlzdCBzZXJ2ZXJEZWZhdWx0Q2lwaGVyU3VpdGVMaXN0OworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0U1NMQ29udGV4dCBleHRlbmRzIFNTTENvbnRleHRJbXBsIHsKKyAgICAgICAgLy8gcGFyYW1ldGVycworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU0xQYXJhbWV0ZXJzIGRlZmF1bHRTZXJ2ZXJTU0xQYXJhbXM7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTTFBhcmFtZXRlcnMgc3VwcG9ydGVkU1NMUGFyYW1zOwogCiAgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICAvLyBzdXBwb3J0ZWQgU1NMIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHN1cHBvcnRlZFNTTFBhcmFtcyA9IG5ldyBTU0xQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIC8vIGNhbmRpZGF0ZXMgZm9yIGF2YWlsYWJsZSBwcm90b2NvbHMKKyAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbltdIGNhbmRpZGF0ZXM7CisKICAgICAgICAgICAgIGlmIChTdW5KU1NFLmlzRklQUygpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xMaXN0ID0gbmV3IFByb3RvY29sTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIHN1cHBvcnRlZFNTTFBhcmFtcy5zZXRQcm90b2NvbHMobmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMS5uYW1lLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTIubmFtZQogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgICAgICAgICAgc2VydmVyRGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTEsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMgotICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbExpc3QgPSBuZXcgUHJvdG9jb2xMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkU1NMUGFyYW1zLnNldFByb3RvY29scyhuZXcgU3RyaW5nW10gewogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uU1NMMjBIZWxsby5uYW1lLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uU1NMMzAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLm5hbWUsCkBAIC00MTEsNTAgKzQ1OCw0NCBAQAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTIubmFtZQogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgICAgICAgICAgc2VydmVyRGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlNTTDIwSGVsbG8sCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5TU0wzMCwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTEsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMgotICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3QgPSBnZXRBcHBsaWNhYmxlQ2lwaGVyU3VpdGVMaXN0KAotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbExpc3QsIGZhbHNlKTsgICAgICAgICAgLy8gYWxsIHN1cHBvcnRlZAotICAgICAgICAgICAgc2VydmVyRGVmYXVsdENpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckRlZmF1bHRQcm90b2NvbExpc3QsIHRydWUpOyAgICAgICAvLyBlbmFibGVkIG9ubHkKKyAgICAgICAgICAgIGRlZmF1bHRTZXJ2ZXJTU0xQYXJhbXMgPSBuZXcgU1NMUGFyYW1ldGVycygpOworICAgICAgICAgICAgZGVmYXVsdFNlcnZlclNTTFBhcmFtcy5zZXRQcm90b2NvbHMoCisgICAgICAgICAgICAgICAgZ2V0QXZhaWxhYmxlUHJvdG9jb2xzKGNhbmRpZGF0ZXMpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFByb3RvY29sTGlzdCBnZXRTdXBvcnRlZFByb3RvY29sTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRQcm90b2NvbExpc3Q7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgZ2V0RGVmYXVsdFNlcnZlclNTTFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U2VydmVyU1NMUGFyYW1zOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIENpcGhlclN1aXRlTGlzdCBnZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkQ2lwaGVyU3VpdGVMaXN0OworICAgICAgICBTU0xQYXJhbWV0ZXJzIGdldFN1cHBvcnRlZFNTTFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRTU0xQYXJhbXM7CiAgICAgICAgIH0KIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgUHJvdG9jb2xMaXN0IGdldFNlcnZlckRlZmF1bHRQcm90b2NvbExpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmVyRGVmYXVsdFByb3RvY29sTGlzdDsKLSAgICAgICAgfQorICAgICAgICBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEF2YWlsYWJsZVByb3RvY29scygKKyAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb25bXSBwcm90b2NvbENhbmRpZGF0ZXMpIHsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQ2lwaGVyU3VpdGVMaXN0IGdldFNlcnZlckRlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmVyRGVmYXVsdENpcGhlclN1aXRlTGlzdDsKLSAgICAgICAgfQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGF2YWlsYWJsZVByb3RvY29scyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7CisgICAgICAgICAgICBpZiAocHJvdG9jb2xDYW5kaWRhdGVzICE9ICBudWxsICYmIHByb3RvY29sQ2FuZGlkYXRlcy5sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZVByb3RvY29scyA9IG5ldyBBcnJheUxpc3Q8Pihwcm90b2NvbENhbmRpZGF0ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiBwIDogcHJvdG9jb2xDYW5kaWRhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQcm90b2NvbFZlcnNpb24uYXZhaWxhYmxlUHJvdG9jb2xzLmNvbnRhaW5zKHApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVQcm90b2NvbHMuYWRkKHAubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmVJbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTU0xFbmdpbmVJbXBsKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmVJbXBsKFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTU0xFbmdpbmVJbXBsKHRoaXMsIGhvc3QsIHBvcnQpOworICAgICAgICAgICAgcmV0dXJuIGF2YWlsYWJsZVByb3RvY29sczsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDYzLDM2ICs1MDQsMzEgQEAKICAgICAgKgogICAgICAqIEBzZWUgU1NMQ29udGV4dAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVExTMTBDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RUTFNDb250ZXh0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvdG9jb2xMaXN0IGNsaWVudERlZmF1bHRQcm90b2NvbExpc3Q7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENpcGhlclN1aXRlTGlzdCBjbGllbnREZWZhdWx0Q2lwaGVyU3VpdGVMaXN0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVExTMTBDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RTU0xDb250ZXh0IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU1NMUGFyYW1ldGVycyBkZWZhdWx0Q2xpZW50U1NMUGFyYW1zOwogCiAgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICAvLyBjYW5kaWRhdGVzIGZvciBhdmFpbGFibGUgcHJvdG9jb2xzCisgICAgICAgICAgICBQcm90b2NvbFZlcnNpb25bXSBjYW5kaWRhdGVzOwogICAgICAgICAgICAgaWYgKFN1bkpTU0UuaXNGSVBTKCkpIHsKLSAgICAgICAgICAgICAgICBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0ID0gbmV3IFByb3RvY29sTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVByb3RvY29scyhuZXcgUHJvdG9jb2xWZXJzaW9uW10geworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBuZXcgUHJvdG9jb2xWZXJzaW9uW10gewogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTAKLSAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlNTTDMwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTAKLSAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudERlZmF1bHRQcm90b2NvbExpc3QsIHRydWUpOyAgICAgICAvLyBlbmFibGVkIG9ubHkKKyAgICAgICAgICAgIGRlZmF1bHRDbGllbnRTU0xQYXJhbXMgPSBuZXcgU1NMUGFyYW1ldGVycygpOworICAgICAgICAgICAgZGVmYXVsdENsaWVudFNTTFBhcmFtcy5zZXRQcm90b2NvbHMoCisgICAgICAgICAgICAgICAgZ2V0QXZhaWxhYmxlUHJvdG9jb2xzKGNhbmRpZGF0ZXMpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFByb3RvY29sTGlzdCBnZXRDbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIGNsaWVudERlZmF1bHRQcm90b2NvbExpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQ2lwaGVyU3VpdGVMaXN0IGdldENsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdDsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBnZXREZWZhdWx0Q2xpZW50U1NMUGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGllbnRTU0xQYXJhbXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwMSwzOCArNTM3LDMzIEBACiAgICAgICoKICAgICAgKiBAc2VlIFNTTENvbnRleHQKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRMUzExQ29udGV4dCBleHRlbmRzIEFic3RyYWN0VExTQ29udGV4dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sTGlzdCBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaXBoZXJTdWl0ZUxpc3QgY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRMUzExQ29udGV4dCBleHRlbmRzIEFic3RyYWN0U1NMQ29udGV4dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTTFBhcmFtZXRlcnMgZGVmYXVsdENsaWVudFNTTFBhcmFtczsKIAogICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgLy8gY2FuZGlkYXRlcyBmb3IgYXZhaWxhYmxlIHByb3RvY29scworICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uW10gY2FuZGlkYXRlczsKICAgICAgICAgICAgIGlmIChTdW5KU1NFLmlzRklQUygpKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTEKLSAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlNTTDMwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTAsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMQotICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjbGllbnREZWZhdWx0Q2lwaGVyU3VpdGVMaXN0ID0gZ2V0QXBwbGljYWJsZUNpcGhlclN1aXRlTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCwgdHJ1ZSk7ICAgICAgIC8vIGVuYWJsZWQgb25seQorICAgICAgICAgICAgZGVmYXVsdENsaWVudFNTTFBhcmFtcyA9IG5ldyBTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBkZWZhdWx0Q2xpZW50U1NMUGFyYW1zLnNldFByb3RvY29scygKKyAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMoY2FuZGlkYXRlcykudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgUHJvdG9jb2xMaXN0IGdldENsaWVudERlZmF1bHRQcm90b2NvbExpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBDaXBoZXJTdWl0ZUxpc3QgZ2V0Q2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGllbnREZWZhdWx0Q2lwaGVyU3VpdGVMaXN0OworICAgICAgICBTU0xQYXJhbWV0ZXJzIGdldERlZmF1bHRDbGllbnRTU0xQYXJhbXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdENsaWVudFNTTFBhcmFtczsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTQxLDEwMSArNTcyLDM1IEBACiAgICAgICoKICAgICAgKiBAc2VlIFNTTENvbnRleHQKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRMUzEyQ29udGV4dCBleHRlbmRzIEFic3RyYWN0VExTQ29udGV4dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sTGlzdCBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaXBoZXJTdWl0ZUxpc3QgY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRMUzEyQ29udGV4dCBleHRlbmRzIEFic3RyYWN0U1NMQ29udGV4dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTTFBhcmFtZXRlcnMgZGVmYXVsdENsaWVudFNTTFBhcmFtczsKIAogICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgLy8gY2FuZGlkYXRlcyBmb3IgYXZhaWxhYmxlIHByb3RvY29scworICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uW10gY2FuZGlkYXRlczsKICAgICAgICAgICAgIGlmIChTdW5KU1NFLmlzRklQUygpKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCA9IG5ldyBQcm90b2NvbExpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVQcm90b2NvbHMobmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTEsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMgotICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0ID0gbmV3IFByb3RvY29sTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVByb3RvY29scyhuZXcgUHJvdG9jb2xWZXJzaW9uW10geworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBuZXcgUHJvdG9jb2xWZXJzaW9uW10gewogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uU1NMMzAsCiAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMCwKICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzExLAogICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTIKLSAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudERlZmF1bHRQcm90b2NvbExpc3QsIHRydWUpOyAgICAgICAvLyBlbmFibGVkIG9ubHkKKyAgICAgICAgICAgIGRlZmF1bHRDbGllbnRTU0xQYXJhbXMgPSBuZXcgU1NMUGFyYW1ldGVycygpOworICAgICAgICAgICAgZGVmYXVsdENsaWVudFNTTFBhcmFtcy5zZXRQcm90b2NvbHMoCisgICAgICAgICAgICAgICAgZ2V0QXZhaWxhYmxlUHJvdG9jb2xzKGNhbmRpZGF0ZXMpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFByb3RvY29sTGlzdCBnZXRDbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIGNsaWVudERlZmF1bHRQcm90b2NvbExpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQ2lwaGVyU3VpdGVMaXN0IGdldENsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIGludGVyZmFjZSBmb3IgdGhlIGN1c3RvbWl6ZWQgU1NMLyhEKVRMUyBTU0xDb250ZXh0LgotICAgICAqCi0gICAgICogQHNlZSBTU0xDb250ZXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9taXplZFNTTFByb3RvY29scyB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImpkay50bHMuY2xpZW50LnByb3RvY29scyI7Ci0gICAgICAgIHN0YXRpYyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gcmVzZXJ2ZWRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBzdGF0aWMgQXJyYXlMaXN0PFByb3RvY29sVmVyc2lvbj4KLSAgICAgICAgICAgICAgICBjdXN0b21pemVkUHJvdG9jb2xzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgLy8gRG9uJ3Qgd2FudCBhIGphdmEubGFuZy5MaW5rYWdlRXJyb3IgZm9yIGlsbGVnYWwgc3lzdGVtIHByb3BlcnR5LgotICAgICAgICAvLwotICAgICAgICAvLyBQbGVhc2UgZG9uJ3QgdGhyb3cgZXhjZXB0aW9uIGluIHRoaXMgc3RhdGljIGJsb2NrLiAgT3RoZXJ3aXNlLAotICAgICAgICAvLyBqYXZhLmxhbmcuTGlua2FnZUVycm9yIG1heSBiZSB0aHJvd24gZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mCi0gICAgICAgIC8vIHRoZSBwcm92aWRlciBzZXJ2aWNlLiBJbnN0ZWFkLCBwbGVhc2UgaGFuZGxlIHRoZSBpbml0aWFsaXphdGlvbgotICAgICAgICAvLyBleGNlcHRpb24gaW4gdGhlIGNhbGxlcidzIGNvbnN0cnVjdG9yLgotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBHZXRQcm9wZXJ0eUFjdGlvbihQUk9QRVJUWV9OQU1FKSk7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRvdWJsZSBxdW90ZSBtYXJrcyBmcm9tIGJlZ2lubmluZy9lbmQgb2YgdGhlIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJiBwcm9wZXJ0eS5jaGFyQXQoMCkgPT0gJyInICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5jaGFyQXQocHJvcGVydHkubGVuZ3RoKCkgLSAxKSA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5Lmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBwcm90b2NvbHMgPSBwcm9wZXJ0eS5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG9jb2xzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3RvY29sc1tpXSA9IHByb3RvY29sc1tpXS50cmltKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IGEgc3VwcG9ydGVkIHByb3RvY29sIG5hbWU/Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24gcHJvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLnZhbHVlT2YocHJvdG9jb2xzW2ldKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFN1bkpTU0UuaXNGSVBTKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcm8udiA9PSBQcm90b2NvbFZlcnNpb24uU1NMMzAudikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvLnYgPT0gUHJvdG9jb2xWZXJzaW9uLlNTTDIwSGVsbG8udikpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRFeGNlcHRpb24gPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUEVSVFlfTkFNRSArICI6ICIgKyBwcm8gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBGSVBTIGNvbXBsaWFudCIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkdXBsaWNhdGVkIHByb3RvY29scwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXN0b21pemVkUHJvdG9jb2xzLmNvbnRhaW5zKHBybykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21pemVkUHJvdG9jb2xzLmFkZChwcm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BFUlRZX05BTUUgKyAiOiAiICsgcHJvdG9jb2xzW2ldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBhIHN0YW5kYXJkIFNTTCBwcm90b2NvbCBuYW1lIiwgaWFlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgU1NMUGFyYW1ldGVycyBnZXREZWZhdWx0Q2xpZW50U1NMUGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRDbGllbnRTU0xQYXJhbXM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY0NCwxMSArNjA5LDkgQEAKICAgICAgKgogICAgICAqIEBzZWUgU1NMQ29udGV4dAogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbWl6ZWRUTFNDb250ZXh0IGV4dGVuZHMgQWJzdHJhY3RUTFNDb250ZXh0IHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm90b2NvbExpc3QgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2lwaGVyU3VpdGVMaXN0IGNsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3Q7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21pemVkU1NMQ29udGV4dCBleHRlbmRzIEFic3RyYWN0U1NMQ29udGV4dCB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gImpkay50bHMuY2xpZW50LnByb3RvY29scyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTTFBhcmFtZXRlcnMgZGVmYXVsdENsaWVudFNTTFBhcmFtczsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHJlc2VydmVkRXhjZXB0aW9uID0gbnVsbDsKIAogICAgICAgICAvLyBEb24ndCB3YW50IGEgamF2YS5sYW5nLkxpbmthZ2VFcnJvciBmb3IgaWxsZWdhbCBzeXN0ZW0gcHJvcGVydHkuCkBAIC02NTgsNjUgKzYyMSw4NiBAQAogICAgICAgICAvLyB0aGUgcHJvdmlkZXIgc2VydmljZS4gSW5zdGVhZCwgbGV0J3MgaGFuZGxlIHRoZSBpbml0aWFsaXphdGlvbgogICAgICAgICAvLyBleGNlcHRpb24gaW4gY29uc3RydWN0b3IuCiAgICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IEN1c3RvbWl6ZWRTU0xQcm90b2NvbHMucmVzZXJ2ZWRFeGNlcHRpb247Ci0gICAgICAgICAgICBpZiAocmVzZXJ2ZWRFeGNlcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxQcm90b2NvbFZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21pemVkVExTUHJvdG9jb2xzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2wgOgotICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9taXplZFNTTFByb3RvY29scy5jdXN0b21pemVkUHJvdG9jb2xzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21pemVkVExTUHJvdG9jb2xzLmFkZChwcm90b2NvbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2FuZGlkYXRlcyBmb3IgYXZhaWxhYmxlIHByb3RvY29scworICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uW10gY2FuZGlkYXRlczsKIAotICAgICAgICAgICAgICAgIC8vIGNhbmRpZGF0ZXMgZm9yIGF2YWlsYWJsZSBwcm90b2NvbHMKLSAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb25bXSBjYW5kaWRhdGVzOwotICAgICAgICAgICAgICAgIGlmIChjdXN0b21pemVkVExTUHJvdG9jb2xzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgZW5hYmxlZCBjbGllbnQgcHJvdG9jb2xzIGlmIG5vCi0gICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbWl6ZWQgVExTIHByb3RvY29scy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKFN1bkpTU0UuaXNGSVBTKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBuZXcgUHJvdG9jb2xWZXJzaW9uW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEyCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IG5ldyBQcm90b2NvbFZlcnNpb25bXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5TU0wzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24uVExTMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMgotICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBHZXRQcm9wZXJ0eUFjdGlvbihQUk9QRVJUWV9OQU1FKSk7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgZW5hYmxlZCBjbGllbnQgVExTIHByb3RvY29scworICAgICAgICAgICAgICAgIGlmIChTdW5KU1NFLmlzRklQUygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBuZXcgUHJvdG9jb2xWZXJzaW9uW10geworICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzExLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlRMUzEyCisgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBjdXN0b21pemVkIFRMUyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm90b2NvbFZlcnNpb25bY3VzdG9taXplZFRMU1Byb3RvY29scy5zaXplKCldOwotICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gY3VzdG9taXplZFRMU1Byb3RvY29scy50b0FycmF5KGNhbmRpZGF0ZXMpOworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5TU0wzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi5UTFMxMgorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRvdWJsZSBxdW90ZSBtYXJrcyBmcm9tIGJlZ2lubmluZy9lbmQgb2YgdGhlIHByb3BlcnR5CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lmxlbmd0aCgpID4gMSAmJiBwcm9wZXJ0eS5jaGFyQXQoMCkgPT0gJyInICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5jaGFyQXQocHJvcGVydHkubGVuZ3RoKCkgLSAxKSA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zdWJzdHJpbmcoMSwgcHJvcGVydHkubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0ID0gbmV3IFByb3RvY29sTGlzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVByb3RvY29scyhjYW5kaWRhdGVzKSk7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdENpcGhlclN1aXRlTGlzdCA9IGdldEFwcGxpY2FibGVDaXBoZXJTdWl0ZUxpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0LCB0cnVlKTsgICAvLyBlbmFibGVkIG9ubHkKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCA9IG51bGw7ICAgICAgIC8vIHVubGlrZWx5IHRvIGJlIHVzZWQKLSAgICAgICAgICAgICAgICBjbGllbnREZWZhdWx0Q2lwaGVyU3VpdGVMaXN0ID0gbnVsbDsgICAgLy8gdW5saWtlbHkgdG8gYmUgdXNlZAorICAgICAgICAgICAgICAgIFN0cmluZ1tdIHByb3RvY29scyA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHMgPSBwcm9wZXJ0eS5zcGxpdCgiLCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkRXhjZXB0aW9uID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBwcm90b2NvbCBzcGVjaWZpZWQgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9OQU1FICsgIiBzeXN0ZW0gcHJvcGVydHkiKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzID0gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gbmV3IFByb3RvY29sVmVyc2lvbltwcm90b2NvbHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvY29scy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwcm90b2NvbHNbaV0udHJpbSgpOworICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCBhIHN1cHBvcnRlZCBwcm90b2NvbCBuYW1lPworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlc1tpXSA9IFByb3RvY29sVmVyc2lvbi52YWx1ZU9mKHByb3RvY29sc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkRXhjZXB0aW9uID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9OQU1FICsgIjogIiArIHByb3RvY29sc1tpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgYSBzdGFuZGFyZCBTU0wvVExTIHByb3RvY29sIG5hbWUiLCBpYWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHJlc2VydmVkRXhjZXB0aW9uID09IG51bGwpICYmIFN1bkpTU0UuaXNGSVBTKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uIDogY2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByb3RvY29sVmVyc2lvbi5TU0wyMEhlbGxvLnYgPT0gcHJvdG9jb2xWZXJzaW9uLnYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xWZXJzaW9uLlNTTDMwLnYgPT0gcHJvdG9jb2xWZXJzaW9uLnYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9OQU1FICsgIjogIiArIHByb3RvY29sVmVyc2lvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIG5vdCBGSVBTIGNvbXBsaWFudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0Q2xpZW50U1NMUGFyYW1zID0gbmV3IFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGlmIChyZXNlcnZlZEV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdENsaWVudFNTTFBhcmFtcy5zZXRQcm90b2NvbHMoCisgICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVByb3RvY29scyhjYW5kaWRhdGVzKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHByb3RlY3RlZCBDdXN0b21pemVkVExTQ29udGV4dCgpIHsKKyAgICAgICAgcHJvdGVjdGVkIEN1c3RvbWl6ZWRTU0xDb250ZXh0KCkgewogICAgICAgICAgICAgaWYgKHJlc2VydmVkRXhjZXB0aW9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyByZXNlcnZlZEV4Y2VwdGlvbjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBQcm90b2NvbExpc3QgZ2V0Q2xpZW50RGVmYXVsdFByb3RvY29sTGlzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBjbGllbnREZWZhdWx0UHJvdG9jb2xMaXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIENpcGhlclN1aXRlTGlzdCBnZXRDbGllbnREZWZhdWx0Q2lwaGVyU3VpdGVMaXN0KCkgewotICAgICAgICAgICAgcmV0dXJuIGNsaWVudERlZmF1bHRDaXBoZXJTdWl0ZUxpc3Q7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgZ2V0RGVmYXVsdENsaWVudFNTTFBhcmFtcygpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2xpZW50U1NMUGFyYW1zOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MjUsNTcgKzcwOSw3NSBAQAogICAgICAqCiAgICAgICogQHNlZSBTU0xDb250ZXh0CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUTFNDb250ZXh0IGV4dGVuZHMgQ3VzdG9taXplZFRMU0NvbnRleHQgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVExTQ29udGV4dCBleHRlbmRzIEN1c3RvbWl6ZWRTU0xDb250ZXh0IHsKICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBtZXRob2RzCiAgICAgfQogCi0gICAgLy8gbGF6eSBpbml0aWFsaXphdGlvbiBob2xkZXIgY2xhc3MgaWRpb20gZm9yIHN0YXRpYyBkZWZhdWx0IHBhcmFtZXRlcnMKLSAgICAvLwotICAgIC8vIFNlZSBFZmZlY3RpdmUgSmF2YSBTZWNvbmQgRWRpdGlvbjogSXRlbSA3MS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0TWFuYWdlcnNIb2xkZXIgeworICAgIC8qCisgICAgICogVGhlIFNTTENvbnRleHQgaW1wbGVtZW50YXRpb24gZm9yIGRlZmF1bHQgIkRlZmF1bHQiIGFsZ29yaXRobQorICAgICAqCisgICAgICogQHNlZSBTU0xDb250ZXh0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0U1NMQ29udGV4dCBleHRlbmRzIEN1c3RvbWl6ZWRTU0xDb250ZXh0IHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTk9ORSI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQMTFLRVlTVE9SRSA9ICJQS0NTMTEiOwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRydXN0TWFuYWdlcltdIHRydXN0TWFuYWdlcnM7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEtleU1hbmFnZXJbXSBrZXlNYW5hZ2VyczsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU1NMQ29udGV4dEltcGwgZGVmYXVsdEltcGw7CiAKLSAgICAgICAgc3RhdGljIEV4Y2VwdGlvbiByZXNlcnZlZEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHByaXZhdGUgc3RhdGljIFRydXN0TWFuYWdlcltdIGRlZmF1bHRUcnVzdE1hbmFnZXJzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBLZXlNYW5hZ2VyW10gZGVmYXVsdEtleU1hbmFnZXJzOwogCi0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBUcnVzdE1hbmFnZXJbXSB0bU1lZGlhdG9yOworICAgICAgICBwdWJsaWMgRGVmYXVsdFNTTENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdG1NZWRpYXRvciA9IGdldFRydXN0TWFuYWdlcnMoKTsKKyAgICAgICAgICAgICAgICBzdXBlci5lbmdpbmVJbml0KGdldERlZmF1bHRLZXlNYW5hZ2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0VHJ1c3RNYW5hZ2VyKCksIG51bGwpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgdG1NZWRpYXRvciA9IG5ldyBUcnVzdE1hbmFnZXJbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnVzdE1hbmFnZXJzID0gdG1NZWRpYXRvcjsKLQotICAgICAgICAgICAgaWYgKHJlc2VydmVkRXhjZXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBLZXlNYW5hZ2VyW10ga21NZWRpYXRvcjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBrbU1lZGlhdG9yID0gZ2V0S2V5TWFuYWdlcnMoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIGttTWVkaWF0b3IgPSBuZXcgS2V5TWFuYWdlclswXTsKKyAgICAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJkZWZhdWx0Y3R4IikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkZWZhdWx0IGNvbnRleHQgaW5pdCBmYWlsZWQ6ICIgKyBlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2V5TWFuYWdlcnMgPSBrbU1lZGlhdG9yOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBrZXlNYW5hZ2VycyA9IG5ldyBLZXlNYW5hZ2VyWzBdOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdEltcGwgPSB0aGlzOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHJ1c3RNYW5hZ2VyW10gZ2V0VHJ1c3RNYW5hZ2VycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZW5naW5lSW5pdChLZXlNYW5hZ2VyW10ga20sIFRydXN0TWFuYWdlcltdIHRtLAorICAgICAgICAgICAgU2VjdXJlUmFuZG9tIHNyKSB0aHJvd3MgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICgiRGVmYXVsdCBTU0xDb250ZXh0IGlzIGluaXRpYWxpemVkIGF1dG9tYXRpY2FsbHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgU1NMQ29udGV4dEltcGwgZ2V0RGVmYXVsdEltcGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRTU0xDb250ZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEltcGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVHJ1c3RNYW5hZ2VyW10gZ2V0RGVmYXVsdFRydXN0TWFuYWdlcigpCisgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFRydXN0TWFuYWdlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VHJ1c3RNYW5hZ2VyczsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgS2V5U3RvcmUga3MgPQogICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnlJbXBsLmdldENhY2VydHNLZXlTdG9yZSgiZGVmYXVsdGN0eCIpOwogCiAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOwogICAgICAgICAgICAgdG1mLmluaXQoa3MpOwotICAgICAgICAgICAgcmV0dXJuIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCk7CisgICAgICAgICAgICBkZWZhdWx0VHJ1c3RNYW5hZ2VycyA9IHRtZi5nZXRUcnVzdE1hbmFnZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFRydXN0TWFuYWdlcnM7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBLZXlNYW5hZ2VyW10gZ2V0S2V5TWFuYWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEtleU1hbmFnZXJbXSBnZXREZWZhdWx0S2V5TWFuYWdlcigpCisgICAgICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEtleU1hbmFnZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdEtleU1hbmFnZXJzOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKQEAgLTg3Miw3NSArODc0LDExIEBACiAgICAgICAgICAgICAgICAga21mLmluaXQoa3MsIHBhc3N3ZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiBrbWYuZ2V0S2V5TWFuYWdlcnMoKTsKKyAgICAgICAgICAgIGRlZmF1bHRLZXlNYW5hZ2VycyA9IGttZi5nZXRLZXlNYW5hZ2VycygpOworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRLZXlNYW5hZ2VyczsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGxhenkgaW5pdGlhbGl6YXRpb24gaG9sZGVyIGNsYXNzIGlkaW9tIGZvciBzdGF0aWMgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgLy8KLSAgICAvLyBTZWUgRWZmZWN0aXZlIEphdmEgU2Vjb25kIEVkaXRpb246IEl0ZW0gNzEuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVmYXVsdFNTTENvbnRleHRIb2xkZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTTENvbnRleHRJbXBsIHNzbENvbnRleHQ7Ci0gICAgICAgIHN0YXRpYyBFeGNlcHRpb24gcmVzZXJ2ZWRFeGNlcHRpb24gPSBudWxsOwotCi0gICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBTU0xDb250ZXh0SW1wbCBtZWRpYXRvciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoRGVmYXVsdE1hbmFnZXJzSG9sZGVyLnJlc2VydmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IERlZmF1bHRNYW5hZ2Vyc0hvbGRlci5yZXNlcnZlZEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3IgPSBuZXcgRGVmYXVsdFNTTENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICByZXNlcnZlZEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzc2xDb250ZXh0ID0gbWVkaWF0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uIGZvciBkZWZhdWx0ICJEZWZhdWx0IiBhbGdvcml0aG0KLSAgICAgKgotICAgICAqIEBzZWUgU1NMQ29udGV4dAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGVmYXVsdFNTTENvbnRleHQgZXh0ZW5kcyBDdXN0b21pemVkVExTQ29udGV4dCB7Ci0KLSAgICAgICAgLy8gcHVibGljIGNvbnN0cnVjdG9yIGZvciBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJEZWZhdWx0IikKLSAgICAgICAgcHVibGljIERlZmF1bHRTU0xDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoRGVmYXVsdE1hbmFnZXJzSG9sZGVyLnJlc2VydmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBEZWZhdWx0TWFuYWdlcnNIb2xkZXIucmVzZXJ2ZWRFeGNlcHRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIuZW5naW5lSW5pdChEZWZhdWx0TWFuYWdlcnNIb2xkZXIua2V5TWFuYWdlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0TWFuYWdlcnNIb2xkZXIudHJ1c3RNYW5hZ2VycywgbnVsbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImRlZmF1bHRjdHgiKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRlZmF1bHQgY29udGV4dCBpbml0IGZhaWxlZDogIiArIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGVuZ2luZUluaXQoS2V5TWFuYWdlcltdIGttLCBUcnVzdE1hbmFnZXJbXSB0bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN1cmVSYW5kb20gc3IpIHRocm93cyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICgiRGVmYXVsdCBTU0xDb250ZXh0IGlzIGluaXRpYWxpemVkIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBTU0xDb250ZXh0SW1wbCBnZXREZWZhdWx0SW1wbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKERlZmF1bHRTU0xDb250ZXh0SG9sZGVyLnJlc2VydmVkRXhjZXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBEZWZhdWx0U1NMQ29udGV4dEhvbGRlci5yZXNlcnZlZEV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRTU0xDb250ZXh0SG9sZGVyLnNzbENvbnRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogfQogCiAKQEAgLTExMTUsNyArMTA1Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKENlcnRQYXRoVmFsaWRhdG9yRXhjZXB0aW9uIGNwdmUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGVzIGRvIG5vdCBjb25mb3JtIHRvIGFsZ29yaXRobSBjb25zdHJhaW50cyIsIGNwdmUpOworICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZXMgZG9lcyBub3QgY29uZm9ybSB0byBhbGdvcml0aG0gY29uc3RyYWludHMiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNvY2tldEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNvY2tldEltcGwuamF2YQppbmRleCAxZmIzNWQ2Li42Yjk4ZTkzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTb2NrZXRJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMU29ja2V0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIwLDExICsyMjAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+ZW1wdHlMaXN0KCk7CiAgICAgQ29sbGVjdGlvbjxTTklNYXRjaGVyPiAgICAgIHNuaU1hdGNoZXJzID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTTklNYXRjaGVyPmVtcHR5TGlzdCgpOwotICAgIC8vIElzIHRoZSBzZXJ2ZXJOYW1lcyBzZXQgdG8gZW1wdHkgd2l0aCBTU0xQYXJhbWV0ZXJzLnNldFNlcnZlck5hbWVzKCk/Ci0gICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgIG5vU25pRXh0ZW5zaW9uID0gZmFsc2U7Ci0KLSAgICAvLyBJcyB0aGUgc25pTWF0Y2hlcnMgc2V0IHRvIGVtcHR5IHdpdGggU1NMUGFyYW1ldGVycy5zZXRTTklNYXRjaGVycygpPwotICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICBub1NuaU1hdGNoZXIgPSBmYWxzZTsKIAogICAgIC8qCiAgICAgICogUkVBRCBNRSAqIFJFQUQgTUUgKiBSRUFEIE1FICogUkVBRCBNRSAqIFJFQUQgTUUgKiBSRUFEIE1FICoKQEAgLTY3MSwxMSArNjY2LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN1cGVyLmNvbm5lY3QoZW5kcG9pbnQsIHRpbWVvdXQpOwotCi0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgaG9zdC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICB1c2VJbXBsaWNpdEhvc3QoZmFsc2UpOwotICAgICAgICB9Ci0KICAgICAgICAgZG9uZUNvbm5lY3QoKTsKICAgICB9CiAKQEAgLTIxNjgsNjEgKzIxNTgsNDEgQEAKICAgICAgICAgb3V0cHV0LnIuc2V0VmVyc2lvbihwcm90b2NvbFZlcnNpb24pOwogICAgIH0KIAotICAgIC8vCi0gICAgLy8gT05MWSB1c2VkIGJ5IENsaWVudEhhbmRzaGFrZXIgZm9yIHRoZSBzZXJ2ZXIgaG9zdG5hbWUgZHVyaW5nIGhhbmRzaGFraW5nCi0gICAgLy8KICAgICBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEhvc3QoKSB7CiAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgaG9zdCBtYXkgYmUgbnVsbCBvciBlbXB0eSBmb3IgbG9jYWxob3N0LgogICAgICAgICBpZiAoaG9zdCA9PSBudWxsIHx8IGhvc3QubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdXNlSW1wbGljaXRIb3N0KHRydWUpOworICAgICAgICAgICAgaWYgKCF0cnVzdE5hbWVTZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxvY2FsIG5hbWUgc2VydmljZSBpcyBub3QgdHJ1c3R3b3J0aHksIHJldmVyc2UgaG9zdAorICAgICAgICAgICAgICAgIC8vIG5hbWUgcmVzb2x1dGlvbiBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgZW5kcG9pbnQKKyAgICAgICAgICAgICAgICAvLyBpZGVudGlmaWNhdGlvbi4gIFVzZSB0aGUgYXBwbGljYXRpb24gb3JpZ2luYWwgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgLy8gaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIGhvc3QgPSBnZXRPcmlnaW5hbEhvc3RuYW1lKGdldEluZXRBZGRyZXNzKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBob3N0ID0gZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGhvc3Q7CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBUcnkgdG8gc2V0IGFuZCB1c2UgdGhlIGltcGxpY2l0IHNwZWNpZmllZCBob3N0bmFtZQorICAgICAqIEdldCB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24gc3BlY2lmaWVkIGhvc3RuYW1lLgogICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdXNlSW1wbGljaXRIb3N0KGJvb2xlYW4gbm9TbmlVcGRhdGUpIHsKLQotICAgICAgICAvLyBOb3RlOiBJZiB0aGUgbG9jYWwgbmFtZSBzZXJ2aWNlIGlzIG5vdCB0cnVzdHdvcnRoeSwgcmV2ZXJzZQotICAgICAgICAvLyBob3N0IG5hbWUgcmVzb2x1dGlvbiBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgZW5kcG9pbnQKLSAgICAgICAgLy8gaWRlbnRpZmljYXRpb24uICBVc2UgdGhlIGFwcGxpY2F0aW9uIG9yaWdpbmFsIHNwZWNpZmllZAotICAgICAgICAvLyBob3N0bmFtZSBvciBJUCBhZGRyZXNzIGluc3RlYWQuCi0KLSAgICAgICAgLy8gR2V0IHRoZSBvcmlnaW5hbCBob3N0bmFtZSB2aWEgamRrLmludGVybmFsLm1pc2MuU2hhcmVkU2VjcmV0cwotICAgICAgICBJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IGdldEluZXRBZGRyZXNzKCk7Ci0gICAgICAgIGlmIChpbmV0QWRkcmVzcyA9PSBudWxsKSB7ICAgICAgLy8gbm90IGNvbm5lY3RlZAotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYWxIb3N0bmFtZShJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcykgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIGhvc3RuYW1lIHZpYSBzdW4ubWlzYy5TaGFyZWRTZWNyZXRzLgorICAgICAgICAgKi8KICAgICAgICAgSmF2YU5ldEFjY2VzcyBqbmEgPSBTaGFyZWRTZWNyZXRzLmdldEphdmFOZXRBY2Nlc3MoKTsKICAgICAgICAgU3RyaW5nIG9yaWdpbmFsSG9zdG5hbWUgPSBqbmEuZ2V0T3JpZ2luYWxIb3N0TmFtZShpbmV0QWRkcmVzcyk7Ci0gICAgICAgIGlmICgob3JpZ2luYWxIb3N0bmFtZSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgIChvcmlnaW5hbEhvc3RuYW1lLmxlbmd0aCgpICE9IDApKSB7CiAKLSAgICAgICAgICAgIGhvc3QgPSBvcmlnaW5hbEhvc3RuYW1lOwotICAgICAgICAgICAgaWYgKCFub1NuaVVwZGF0ZSAmJiBzZXJ2ZXJOYW1lcy5pc0VtcHR5KCkgJiYgIW5vU25pRXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyTmFtZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGl0aWVzLmFkZFRvU05JU2VydmVyTmFtZUxpc3Qoc2VydmVyTmFtZXMsIGhvc3QpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFyb2xlSXNTZXJ2ZXIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChoYW5kc2hha2VyICE9IG51bGwpICYmICFoYW5kc2hha2VyLnN0YXJ0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VyLnNldFNOSVNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgbm8gYXBwbGljYXRpb24gc3BlY2lmaWVkIGhvc3RuYW1lLCB1c2UgdGhlIElQIGFkZHJlc3MuCisgICAgICAgICAqLworICAgICAgICBpZiAob3JpZ2luYWxIb3N0bmFtZSA9PSBudWxsIHx8IG9yaWdpbmFsSG9zdG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgb3JpZ2luYWxIb3N0bmFtZSA9IGluZXRBZGRyZXNzLmdldEhvc3RBZGRyZXNzKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBObyBleHBsaWNpdGx5IHNwZWNpZmllZCBob3N0bmFtZSwgbm8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KLSAgICAgICAgaWYgKCF0cnVzdE5hbWVTZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBUaGUgbG9jYWwgbmFtZSBzZXJ2aWNlIGlzIG5vdCB0cnVzdHdvcnRoeSwgdXNlIElQIGFkZHJlc3MuCi0gICAgICAgICAgICBob3N0ID0gaW5ldEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyByZXZlcnNlIGhvc3QgbmFtZSByZXNvbHV0aW9uIHNlcnZpY2UuCi0gICAgICAgICAgICBob3N0ID0gZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBvcmlnaW5hbEhvc3RuYW1lOwogICAgIH0KIAogCkBAIC0yMjM1LDEwICsyMjA1LDYgQEAKICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICAgICAgdGhpcy5zZXJ2ZXJOYW1lcyA9CiAgICAgICAgICAgICBVdGlsaXRpZXMuYWRkVG9TTklTZXJ2ZXJOYW1lTGlzdCh0aGlzLnNlcnZlck5hbWVzLCB0aGlzLmhvc3QpOwotCi0gICAgICAgIGlmICghcm9sZUlzU2VydmVyICYmIChoYW5kc2hha2VyICE9IG51bGwpICYmICFoYW5kc2hha2VyLnN0YXJ0ZWQoKSkgewotICAgICAgICAgICAgaGFuZHNoYWtlci5zZXRTTklTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI2MDUsMjEgKzI1NzEsOCBAQAogICAgICAgICAvLyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycwogICAgICAgICBwYXJhbXMuc2V0RW5kcG9pbnRJZGVudGlmaWNhdGlvbkFsZ29yaXRobShpZGVudGlmaWNhdGlvblByb3RvY29sKTsKICAgICAgICAgcGFyYW1zLnNldEFsZ29yaXRobUNvbnN0cmFpbnRzKGFsZ29yaXRobUNvbnN0cmFpbnRzKTsKLQotICAgICAgICBpZiAoc25pTWF0Y2hlcnMuaXNFbXB0eSgpICYmICFub1NuaU1hdGNoZXIpIHsKLSAgICAgICAgICAgIC8vICdudWxsJyBpbmRpY2F0ZXMgbm9uZSBoYXMgYmVlbiBzZXQKLSAgICAgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhzbmlNYXRjaGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmVyTmFtZXMuaXNFbXB0eSgpICYmICFub1NuaUV4dGVuc2lvbikgewotICAgICAgICAgICAgLy8gJ251bGwnIGluZGljYXRlcyBub25lIGhhcyBiZWVuIHNldAotICAgICAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKG51bGwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKLSAgICAgICAgfQotCisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhzbmlNYXRjaGVycyk7CisgICAgICAgIHBhcmFtcy5zZXRTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CiAgICAgICAgIHBhcmFtcy5zZXRVc2VDaXBoZXJTdWl0ZXNPcmRlcihwcmVmZXJMb2NhbENpcGhlclN1aXRlcyk7CiAKICAgICAgICAgcmV0dXJuIHBhcmFtczsKQEAgLTI2MzksMTMgKzI1OTIsMTEgQEAKIAogICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNuaU5hbWVzID0gcGFyYW1zLmdldFNlcnZlck5hbWVzKCk7CiAgICAgICAgIGlmIChzbmlOYW1lcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub1NuaUV4dGVuc2lvbiA9IHNuaU5hbWVzLmlzRW1wdHkoKTsKICAgICAgICAgICAgIHNlcnZlck5hbWVzID0gc25pTmFtZXM7CiAgICAgICAgIH0KIAogICAgICAgICBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IG1hdGNoZXJzID0gcGFyYW1zLmdldFNOSU1hdGNoZXJzKCk7CiAgICAgICAgIGlmIChtYXRjaGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBub1NuaU1hdGNoZXIgPSBtYXRjaGVycy5pc0VtcHR5KCk7CiAgICAgICAgICAgICBzbmlNYXRjaGVycyA9IG1hdGNoZXJzOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NlcnZlckhhbmRzaGFrZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NlcnZlckhhbmRzaGFrZXIuamF2YQppbmRleCA0MTMyNTZhLi45Y2FhNjRhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TZXJ2ZXJIYW5kc2hha2VyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU2VydmVySGFuZHNoYWtlci5qYXZhCkBAIC0xMzcsMTAgKzEzNyw4IEBACiAgICAgICAgICAgICAgICAgY3VzdG9taXplZERIS2V5U2l6ZSA9IEludGVnZXIucGFyc2VVbnNpZ25lZEludChwcm9wZXJ0eSk7CiAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbWl6ZWRESEtleVNpemUgPCAxMDI0IHx8IGN1c3RvbWl6ZWRESEtleVNpemUgPiAyMDQ4KSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgY3VzdG9taXplZCBESCBrZXkgc2l6ZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21pemVkREhLZXlTaXplICsgIi4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGtleSBzaXplIGNhbiBvbmx5IHJhbmdlIGZyb20gMTAyNCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiB0byAyMDQ4IChpbmNsdXNpdmUpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAiQ3VzdG9taXplZCBESCBrZXkgc2l6ZSBzaG91bGQgYmUgcG9zaXRpdmUgaW50ZWdlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJiZXR3ZWVuIDEwMjQgYW5kIDIwNDggYml0cywgaW5jbHVzaXZlIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC0xMDI1LDE4ICsxMDIzLDExIEBACiAgICAgICAgICAgICBpZiAodHJ5U2V0Q2lwaGVyU3VpdGUoc3VpdGUpID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFuZGFyZCBjaXBoZXJzdWl0ZSBjaG9zZW46ICIgKyBzdWl0ZSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKENpcGhlclN1aXRlIHN1aXRlIDogbGVnYWN5U3VpdGVzKSB7CiAgICAgICAgICAgICBpZiAodHJ5U2V0Q2lwaGVyU3VpdGUoc3VpdGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMZWdhY3kgY2lwaGVyc3VpdGUgY2hvc2VuOiAiICsgc3VpdGUpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL01haW4uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL01haW4uamF2YQppbmRleCAwNzk2MmRjLi4zN2IwNGM5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9NYWluLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTWFpbi5qYXZhCkBAIC01Myw5ICs1Myw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LlBLSVhQYXJhbWV0ZXJzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5UcnVzdEFuY2hvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLlBLQ1M3OwotaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLlNpZ25lckluZm87Ci1pbXBvcnQgc3VuLnNlY3VyaXR5LnRpbWVzdGFtcC5UaW1lc3RhbXBUb2tlbjsKIGltcG9ydCBzdW4uc2VjdXJpdHkudG9vbHMuS2V5U3RvcmVVdGlsOwogaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5QYXRoTGlzdDsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS4qOwpAQCAtMTAwLDE1ICs5Nyw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNJWF9NT05USFMgPSAxODAqMjQqNjAqNjAqMTAwMEw7IC8vbWlsbGlzZWNvbmRzCiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaXNhYmxlZEFsZ29yaXRobUNvbnN0cmFpbnRzIERJU0FCTEVEX0NIRUNLID0KLSAgICAgICAgICAgIG5ldyBEaXNhYmxlZEFsZ29yaXRobUNvbnN0cmFpbnRzKAotICAgICAgICAgICAgICAgICAgICBEaXNhYmxlZEFsZ29yaXRobUNvbnN0cmFpbnRzLlBST1BFUlRZX0pBUl9ESVNBQkxFRF9BTEdTKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDcnlwdG9QcmltaXRpdmU+IERJR0VTVF9QUklNSVRJVkVfU0VUID0gQ29sbGVjdGlvbnMKLSAgICAgICAgICAgIC51bm1vZGlmaWFibGVTZXQoRW51bVNldC5vZihDcnlwdG9QcmltaXRpdmUuTUVTU0FHRV9ESUdFU1QpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q3J5cHRvUHJpbWl0aXZlPiBTSUdfUFJJTUlUSVZFX1NFVCA9IENvbGxlY3Rpb25zCi0gICAgICAgICAgICAudW5tb2RpZmlhYmxlU2V0KEVudW1TZXQub2YoQ3J5cHRvUHJpbWl0aXZlLlNJR05BVFVSRSkpOwotCiAgICAgLy8gQXR0ZW50aW9uOgogICAgIC8vIFRoaXMgaXMgdGhlIGVudHJ5IHRoYXQgZ2V0IGxhdW5jaGVkIGJ5IHRoZSBzZWN1cml0eSB0b29sIGphcnNpZ25lci4KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE4NCw4ICsxNzIsNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBiYWRFeHRlbmRlZEtleVVzYWdlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIGJhZE5ldHNjYXBlQ2VydFR5cGUgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgYm9vbGVhbiBzZWVXZWFrID0gZmFsc2U7Ci0KICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydGlmaWNhdGVGYWN0b3J5OwogICAgIENlcnRQYXRoVmFsaWRhdG9yIHZhbGlkYXRvcjsKICAgICBQS0lYUGFyYW1ldGVycyBwa2l4UGFyYW1ldGVyczsKQEAgLTU5MSwxMCArNTc3LDYgQEAKICAgICB7CiAgICAgICAgIGJvb2xlYW4gYW55U2lnbmVkID0gZmFsc2U7ICAvLyBpZiB0aGVyZSBleGlzdHMgZW50cnkgaW5zaWRlIGphciBzaWduZWQKICAgICAgICAgSmFyRmlsZSBqZiA9IG51bGw7Ci0gICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBkaWdlc3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsUEtDUzc+IHNpZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IHNpZ05hbWVNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiB1bnBhcnNhYmxlU2lnbmF0dXJlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgamYgPSBuZXcgSmFyRmlsZShqYXJOYW1lLCB0cnVlKTsKQEAgLTYwNSw1MCArNTg3LDIyIEBACiAgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgIGVudHJpZXNWZWMuYWRkRWxlbWVudChqZSk7Ci0gICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IGpmLmdldElucHV0U3RyZWFtKGplKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGplLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZVJlbGF0ZWQobmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBTaWduYXR1cmVGaWxlVmVyaWZpZXIuaXNCbG9ja09yU0YobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbGlhcyA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5TRiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0IHNmID0gbmV3IE1hbmlmZXN0KGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmogOiBzZi5nZXRNYWluQXR0cmlidXRlcygpLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gb2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKCItRGlnZXN0LU1hbmlmZXN0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3RNYXAucHV0KGFsaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LnN1YnN0cmluZygwLCBrZXkubGVuZ3RoKCkgLSAxNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhcnNhYmxlU2lnbmF0dXJlcy5wdXRJZkFic2VudChhbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYi5nZXRTdHJpbmcoImhpc3RvcnkudW5wYXJzYWJsZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdOYW1lTWFwLnB1dChhbGlhcywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ01hcC5wdXQoYWxpYXMsIG5ldyBQS0NTNyhpcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFyc2FibGVTaWduYXR1cmVzLnB1dElmQWJzZW50KGFsaWFzLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmIuZ2V0U3RyaW5nKCJoaXN0b3J5LnVucGFyc2FibGUiKSwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpcyA9IGpmLmdldElucHV0U3RyZWFtKGplKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IGlzLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgcmVhZC4gdGhpcyB3aWxsIHRocm93IGEgU2VjdXJpdHlFeGNlcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICBhIHNpZ25hdHVyZS9kaWdlc3QgY2hlY2sgZmFpbHMuCiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTWFuaWZlc3QgbWFuID0gamYuZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU2lnbmF0dXJlID0gZmFsc2U7CiAKICAgICAgICAgICAgIC8vIFRoZSBtYXAgdG8gcmVjb3JkIGRpc3BsYXkgaW5mbywgb25seSB1c2VkIHdoZW4gLXZlcmJvc2UgcHJvdmlkZWQKICAgICAgICAgICAgIC8vICAgICAga2V5OiBzaWduZXIgaW5mbyBzdHJpbmcKQEAgLTY2NCwxMCArNjE4LDYgQEAKICAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBqZSA9IGUubmV4dEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBqZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaGFzU2lnbmF0dXJlID0gaGFzU2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgU2lnbmF0dXJlRmlsZVZlcmlmaWVyLmlzQmxvY2tPclNGKG5hbWUpOwotCiAgICAgICAgICAgICAgICAgICAgIENvZGVTaWduZXJbXSBzaWduZXJzID0gamUuZ2V0Q29kZVNpZ25lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NpZ25lZCA9IChzaWduZXJzICE9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICBhbnlTaWduZWQgfD0gaXNTaWduZWQ7CkBAIC04MDEsMTEwICs3NTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJiLmdldFN0cmluZygKICAgICAgICAgICAgICAgICAgICAgICAgICIuWC5ub3Quc2lnbmVkLmJ5LnNwZWNpZmllZC5hbGlhcy5lcy4iKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1hbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFuID09IG51bGwpCiAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJiLmdldFN0cmluZygibm8ubWFuaWZlc3QuIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFdmVuIGlmIHRoZSB2ZXJib3NlIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbGwgb3V0IHN0cmluZ3MKLSAgICAgICAgICAgIC8vIG11c3QgYmUgZ2VuZXJhdGVkIHNvIHNlZVdlYWsgY2FuIGJlIHVwZGF0ZWQuCi0gICAgICAgICAgICBpZiAoIWRpZ2VzdE1hcC5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIXNpZ01hcC5pc0VtcHR5KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIXVucGFyc2FibGVTaWduYXR1cmVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc2lnTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGlnZXN0TWFwLmNvbnRhaW5zS2V5KHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnBhcnNhYmxlU2lnbmF0dXJlcy5wdXRJZkFic2VudChzLCBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYi5nZXRTdHJpbmcoImhpc3Rvcnkubm9zZiIpLCBzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGRpZ2VzdE1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICBQS0NTNyBwNyA9IHNpZ01hcC5nZXQocyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwNyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGlzdG9yeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmVySW5mbyBzaSA9IHA3LmdldFNpZ25lckluZm9zKClbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHNpZ25lciA9IHNpLmdldENlcnRpZmljYXRlKHA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlnZXN0QWxnID0gZGlnZXN0TWFwLmdldChzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2lnQWxnID0gQWxnb3JpdGhtSWQubWFrZVNpZ0FsZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpLmdldERpZ2VzdEFsZ29yaXRobUlkKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2kuZ2V0RGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobUlkKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWNLZXkga2V5ID0gc2lnbmVyLmdldFB1YmxpY0tleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLQ1M3IHRzVG9rZW4gPSBzaS5nZXRUc1Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzVG9rZW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduZXJJbmZvIHRzU2kgPSB0c1Rva2VuLmdldFNpZ25lckluZm9zKClbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSB0c1NpZ25lciA9IHRzU2kuZ2V0Q2VydGlmaWNhdGUodHNUb2tlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBlbmNUc1Rva2VuSW5mbyA9IHRzVG9rZW4uZ2V0Q29udGVudEluZm8oKS5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcFRva2VuIHRzVG9rZW5JbmZvID0gbmV3IFRpbWVzdGFtcFRva2VuKGVuY1RzVG9rZW5JbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljS2V5IHRzS2V5ID0gdHNTaWduZXIuZ2V0UHVibGljS2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0c0RpZ2VzdEFsZyA9IHRzVG9rZW5JbmZvLmdldEhhc2hBbGdvcml0aG0oKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0c1NpZ0FsZyA9IEFsZ29yaXRobUlkLm1ha2VTaWdBbGcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTaS5nZXREaWdlc3RBbGdvcml0aG1JZCgpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c1NpLmdldERpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG1JZCgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlLmdldERlZmF1bHQoTG9jYWxlLkNhdGVnb3J5LkZPUk1BVCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnNldFRpbWUodHNUb2tlbkluZm8uZ2V0RGF0ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmIuZ2V0U3RyaW5nKCJoaXN0b3J5LndpdGgudHMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZXIuZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoV2VhayhkaWdlc3RBbGcsIERJR0VTVF9QUklNSVRJVkVfU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoV2VhayhzaWdBbGcsIFNJR19QUklNSVRJVkVfU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoV2VhayhrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNTaWduZXIuZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoV2Vhayh0c0RpZ2VzdEFsZywgRElHRVNUX1BSSU1JVElWRV9TRVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhXZWFrKHRzU2lnQWxnLCBTSUdfUFJJTUlUSVZFX1NFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFdlYWsodHNLZXkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5ID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYi5nZXRTdHJpbmcoImhpc3Rvcnkud2l0aG91dC50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25lci5nZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhXZWFrKGRpZ2VzdEFsZywgRElHRVNUX1BSSU1JVElWRV9TRVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhXZWFrKHNpZ0FsZywgU0lHX1BSSU1JVElWRV9TRVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhXZWFrKGtleSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG9ubHkgdXNhZ2Ugb2Ygc2lnTmFtZU1hcCwgcmVtZW1iZXIgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgYmxvY2sgZmlsZSBpZiBpdCdzIGludmFsaWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSA9IFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYi5nZXRTdHJpbmcoImhpc3RvcnkudW5wYXJzYWJsZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnTmFtZU1hcC5nZXQocykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihoaXN0b3J5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVucGFyc2FibGVTaWduYXR1cmVzLnB1dElmQWJzZW50KHMsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiLmdldFN0cmluZygiaGlzdG9yeS5ub2JrIiksIHMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiB1bnBhcnNhYmxlU2lnbmF0dXJlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVucGFyc2FibGVTaWduYXR1cmVzLmdldChzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKIAogICAgICAgICAgICAgaWYgKCFhbnlTaWduZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VlV2VhaykgewotICAgICAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJqYXIudHJlYXRlZC51bnNpZ25lZC5zZWUud2Vhay52ZXJib3NlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkQWxnb3JpdGhtQ29uc3RyYWludHMuUFJPUEVSVFlfSkFSX0RJU0FCTEVEX0FMR1MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSIgKyBTZWN1cml0eS5nZXRQcm9wZXJ0eShEaXNhYmxlZEFsZ29yaXRobUNvbnN0cmFpbnRzLlBST1BFUlRZX0pBUl9ESVNBQkxFRF9BTEdTKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmIuZ2V0U3RyaW5nKCJqYXIudHJlYXRlZC51bnNpZ25lZC5zZWUud2VhayIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzU2lnbmF0dXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImphci50cmVhdGVkLnVuc2lnbmVkIikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyYi5nZXRTdHJpbmcoImphci5pcy51bnNpZ25lZCIpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJiLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAiamFyLmlzLnVuc2lnbmVkLnNpZ25hdHVyZXMubWlzc2luZy5vci5ub3QucGFyc2FibGUuIikpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHdhcm5pbmdBcHBlYXJlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gZXJyb3JBcHBlYXJlZCA9IGZhbHNlOwpAQCAtMTAwNywyNiArODYxLDYgQEAKICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgd2l0aFdlYWsoU3RyaW5nIGFsZywgU2V0PENyeXB0b1ByaW1pdGl2ZT4gcHJpbWl0aXZlU2V0KSB7Ci0gICAgICAgIGlmIChESVNBQkxFRF9DSEVDSy5wZXJtaXRzKHByaW1pdGl2ZVNldCwgYWxnLCBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGFsZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlZVdlYWsgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQocmIuZ2V0U3RyaW5nKCJ3aXRoLndlYWsiKSwgYWxnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHdpdGhXZWFrKFB1YmxpY0tleSBrZXkpIHsKLSAgICAgICAgaWYgKERJU0FCTEVEX0NIRUNLLnBlcm1pdHMoU0lHX1BSSU1JVElWRV9TRVQsIGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICByYi5nZXRTdHJpbmcoImtleS5iaXQiKSwgS2V5VXRpbC5nZXRLZXlTaXplKGtleSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VlV2VhayA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgcmIuZ2V0U3RyaW5nKCJrZXkuYml0LndlYWsiKSwgS2V5VXRpbC5nZXRLZXlTaXplKGtleSkpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUZvcm1hdCB2YWxpZGl0eVRpbWVGb3JtID0gbnVsbDsKICAgICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlRm9ybWF0IG5vdFlldFRpbWVGb3JtID0gbnVsbDsKICAgICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlRm9ybWF0IGV4cGlyZWRUaW1lRm9ybSA9IG51bGw7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9SZXNvdXJjZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5qYXZhCmluZGV4IGJmZjlkZDcuLmRiMzViMWUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5qYXZhCkBAIC0xMzUsMjkgKzEzNSwxMiBAQAogICAgICAgICB7Im5vLm1hbmlmZXN0LiIsICJubyBtYW5pZmVzdC4ifSwKICAgICAgICAgeyIuU2lnbmF0dXJlLnJlbGF0ZWQuZW50cmllcy4iLCIoU2lnbmF0dXJlIHJlbGF0ZWQgZW50cmllcykifSwKICAgICAgICAgeyIuVW5zaWduZWQuZW50cmllcy4iLCAiKFVuc2lnbmVkIGVudHJpZXMpIn0sCi0gICAgICAgIHsiamFyLmlzLnVuc2lnbmVkIiwKLSAgICAgICAgICAgICAgICAiamFyIGlzIHVuc2lnbmVkLiJ9LAotICAgICAgICB7Imphci50cmVhdGVkLnVuc2lnbmVkIiwKLSAgICAgICAgICAgICAgICAiV0FSTklORzogU2lnbmF0dXJlIGlzIGVpdGhlciBub3QgcGFyc2FibGUgb3Igbm90IHZlcmlmaWFibGUsIGFuZCB0aGUgamFyIHdpbGwgYmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlLXJ1biBqYXJzaWduZXIgd2l0aCBkZWJ1ZyBlbmFibGVkICgtSi1EamF2YS5zZWN1cml0eS5kZWJ1Zz1qYXIpLiJ9LAotICAgICAgICB7Imphci50cmVhdGVkLnVuc2lnbmVkLnNlZS53ZWFrIiwKLSAgICAgICAgICAgICAgICAiVGhlIGphciB3aWxsIGJlIHRyZWF0ZWQgYXMgdW5zaWduZWQsIGJlY2F1c2UgaXQgaXMgc2lnbmVkIHdpdGggYSB3ZWFrIGFsZ29yaXRobSB0aGF0IGlzIG5vdyBkaXNhYmxlZC5cblxuUmUtcnVuIGphcnNpZ25lciB3aXRoIHRoZSAtdmVyYm9zZSBvcHRpb24gZm9yIG1vcmUgZGV0YWlscy4ifSwKLSAgICAgICAgeyJqYXIudHJlYXRlZC51bnNpZ25lZC5zZWUud2Vhay52ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiV0FSTklORzogVGhlIGphciB3aWxsIGJlIHRyZWF0ZWQgYXMgdW5zaWduZWQsIGJlY2F1c2UgaXQgaXMgc2lnbmVkIHdpdGggYSB3ZWFrIGFsZ29yaXRobSB0aGF0IGlzIG5vdyBkaXNhYmxlZCBieSB0aGUgc2VjdXJpdHkgcHJvcGVydHk6In0sCisgICAgICAgIHsiamFyLmlzLnVuc2lnbmVkLnNpZ25hdHVyZXMubWlzc2luZy5vci5ub3QucGFyc2FibGUuIiwKKyAgICAgICAgICAgICAgICAiamFyIGlzIHVuc2lnbmVkLiAoc2lnbmF0dXJlcyBtaXNzaW5nIG9yIG5vdCBwYXJzYWJsZSkifSwKICAgICAgICAgeyJqYXIuc2lnbmVkLiIsICJqYXIgc2lnbmVkLiJ9LAogICAgICAgICB7Imphci5zaWduZWQud2l0aC5zaWduZXIuZXJyb3JzLiIsICJqYXIgc2lnbmVkLCB3aXRoIHNpZ25lciBlcnJvcnMuIn0sCiAgICAgICAgIHsiamFyLnZlcmlmaWVkLiIsICJqYXIgdmVyaWZpZWQuIn0sCiAgICAgICAgIHsiamFyLnZlcmlmaWVkLndpdGguc2lnbmVyLmVycm9ycy4iLCAiamFyIHZlcmlmaWVkLCB3aXRoIHNpZ25lciBlcnJvcnMuIn0sCi0KLSAgICAgICAgeyJoaXN0b3J5LndpdGgudHMiLCAiLSBTaWduZWQgYnkgXCIlMSRzXCJcbiAgICBEaWdlc3QgYWxnb3JpdGhtOiAlMiRzXG4gICAgU2lnbmF0dXJlIGFsZ29yaXRobTogJTMkcywgJTQkc1xuICBUaW1lc3RhbXBlZCBieSBcIiU2JHNcIiBvbiAlNSR0Y1xuICAgIFRpbWVzdGFtcCBkaWdlc3QgYWxnb3JpdGhtOiAlNyRzXG4gICAgVGltZXN0YW1wIHNpZ25hdHVyZSBhbGdvcml0aG06ICU4JHMsICU5JHMifSwKLSAgICAgICAgeyJoaXN0b3J5LndpdGhvdXQudHMiLCAiLSBTaWduZWQgYnkgXCIlMSRzXCJcbiAgICBEaWdlc3QgYWxnb3JpdGhtOiAlMiRzXG4gICAgU2lnbmF0dXJlIGFsZ29yaXRobTogJTMkcywgJTQkcyJ9LAotICAgICAgICB7Imhpc3RvcnkudW5wYXJzYWJsZSIsICItIFVucGFyc2FibGUgc2lnbmF0dXJlLXJlbGF0ZWQgZmlsZSAlcyJ9LAotICAgICAgICB7Imhpc3Rvcnkubm9zZiIsICItIE1pc3Npbmcgc2lnbmF0dXJlLXJlbGF0ZWQgZmlsZSBNRVRBLUlORi8lcy5TRiJ9LAotICAgICAgICB7Imhpc3Rvcnkubm9iayIsICItIE1pc3NpbmcgYmxvY2sgZmlsZSBmb3Igc2lnbmF0dXJlLXJlbGF0ZWQgZmlsZSBNRVRBLUlORi8lcy5TRiJ9LAotCi0gICAgICAgIHsid2l0aC53ZWFrIiwgIiVzICh3ZWFrKSJ9LAotICAgICAgICB7ImtleS5iaXQiLCAiJWQtYml0IGtleSJ9LAotICAgICAgICB7ImtleS5iaXQud2VhayIsICIlZC1iaXQga2V5ICh3ZWFrKSJ9LAotCiAgICAgICAgIHsiamFyc2lnbmVyLiIsICJqYXJzaWduZXI6ICJ9LAogICAgICAgICB7InNpZ25hdHVyZS5maWxlbmFtZS5tdXN0LmNvbnNpc3Qub2YudGhlLmZvbGxvd2luZy5jaGFyYWN0ZXJzLkEuWi4wLjkub3IuIiwKICAgICAgICAgICAgICAgICAic2lnbmF0dXJlIGZpbGVuYW1lIG11c3QgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6IEEtWiwgMC05LCBfIG9yIC0ifSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdG9vbHMvbmF0aXZlMmFzY2lpL01haW4uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdG9vbHMvbmF0aXZlMmFzY2lpL01haW4uamF2YQppbmRleCAwMGU4MzMyLi4xZjAyMzUzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3Rvb2xzL25hdGl2ZTJhc2NpaS9NYWluLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi90b29scy9uYXRpdmUyYXNjaWkvTWFpbi5qYXZhCkBAIC03MSw4ICs3MSwxMSBAQAogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOworaW1wb3J0IHN1bi50b29scy5uYXRpdmUyYXNjaWkuQTJORmlsdGVyOworaW1wb3J0IHN1bi50b29scy5uYXRpdmUyYXNjaWkuTjJBRmlsdGVyOwogCiAvKioKICAqIE1haW4gcHJvZ3JhbSBvZiB0aGUgbmF0aXZlMmFzY2lpCkBAIC05MSw3ICs5NCw3IEBACiAgICAgLyoqCiAgICAgICogUnVuIHRoZSBjb252ZXJ0ZXIKICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udmVydChTdHJpbmcgYXJndltdKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnZlcnQoU3RyaW5nIGFyZ3ZbXSl7CiAgICAgICAgIExpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDw+KDIpOwogICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBudWxsOwogICAgICAgICBib29sZWFuIGNyZWF0ZU91dHB1dEZpbGUgPSBmYWxzZTsKQEAgLTk5LDE0ICsxMDIsMTQgQEAKICAgICAgICAgLy8gUGFyc2UgYXJndW1lbnRzCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgaWYgKGFyZ3ZbaV0uZXF1YWxzKCItZW5jb2RpbmciKSkgewotICAgICAgICAgICAgICAgIGlmICgoaSArIDEpIDwgYXJndi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGkgKyAxKSA8IGFyZ3YubGVuZ3RoKXsKICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdTdHJpbmcgPSBhcmd2WysraV07CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3IoZ2V0TXNnKCJlcnIuYmFkLmFyZyIpKTsKICAgICAgICAgICAgICAgICAgICAgdXNhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1yZXZlcnNlIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndltpXS5lcXVhbHMoIi1yZXZlcnNlIikpewogICAgICAgICAgICAgICAgIHJldmVyc2UgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAodi5zaXplKCkgPiAxKSB7CkBAIC0xMTYsMTggKzExOSwxNSBAQAogICAgICAgICAgICAgICAgIHYuYWRkKGFyZ3ZbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChlbmNvZGluZ1N0cmluZyA9PSBudWxsKQorICAgICAgICAgICBkZWZhdWx0RW5jb2RpbmcgPSBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkubmFtZSgpOwogCi0gICAgICAgIGlmIChlbmNvZGluZ1N0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWZhdWx0RW5jb2RpbmcgPSBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkubmFtZSgpOwotICAgICAgICB9CiAgICAgICAgIGNoYXJbXSBsaW5lQnJlYWsgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikudG9DaGFyQXJyYXkoKTsKLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbnZlcnRlcigpOwogCi0gICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID09IDEpCiAgICAgICAgICAgICAgICAgaW5wdXRGaWxlTmFtZSA9IHYuZ2V0KDApOwotICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAodi5zaXplKCkgPT0gMikgewogICAgICAgICAgICAgICAgIGlucHV0RmlsZU5hbWUgPSB2LmdldCgwKTsKQEAgLTEzNywzOCArMTM3LDQwIEBACiAKICAgICAgICAgICAgIGlmIChjcmVhdGVPdXRwdXRGaWxlKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RmlsZS5leGlzdHMoKSAmJiAhb3V0cHV0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZm9ybWF0TXNnKCJlcnIuY2Fubm90LndyaXRlIiwgb3V0cHV0RmlsZU5hbWUpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlLmV4aXN0cygpICYmICFvdXRwdXRGaWxlLmNhbldyaXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oZm9ybWF0TXNnKCJlcnIuY2Fubm90LndyaXRlIiwgb3V0cHV0RmlsZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocmV2ZXJzZSkgewotICAgICAgICAgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gZ2V0QTJOSW5wdXQoaW5wdXRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZXIgb3N3ID0gZ2V0QTJOT3V0cHV0KG91dHB1dEZpbGVOYW1lKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvc3cud3JpdGUobGluZS50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zdy53cml0ZShsaW5lQnJlYWspOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEZpbGVOYW1lID09IG51bGwpIHsgLy8gZmx1c2ggc3Rkb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N3LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV2ZXJzZSl7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gZ2V0QTJOSW5wdXQoaW5wdXRGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgV3JpdGVyIG9zdyA9IGdldEEyTk91dHB1dChvdXRwdXRGaWxlTmFtZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvc3cud3JpdGUobGluZS50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3N3LndyaXRlKGxpbmVCcmVhayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsKSB7IC8vIGZsdXNoIHN0ZG91dAorICAgICAgICAgICAgICAgICAgICAgICAgb3N3LmZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7ICAvLyBDbG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAgICAgICAgIG9zdy5jbG9zZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBOMkEKLSAgICAgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGluID0gZ2V0TjJBSW5wdXQoaW5wdXRGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBnZXROMkFPdXRwdXQob3V0cHV0RmlsZU5hbWUpOykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5MaW5lOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGluTGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShpbkxpbmUudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobGluZUJyZWFrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsKSB7IC8vIGZsdXNoIHN0ZG91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIC8vTjJBCisgICAgICAgICAgICAgICAgU3RyaW5nIGluTGluZTsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IGdldE4yQUlucHV0KGlucHV0RmlsZU5hbWUpOworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IGdldE4yQU91dHB1dChvdXRwdXRGaWxlTmFtZSk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGluTGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGluTGluZS50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGxpbmVCcmVhayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsKSB7IC8vIGZsdXNoIHN0ZG91dAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBkb25lIHJlbmFtZSB0ZW1wb3JhcnkgZmlsZSB0byBkZXNpcmVkIG91dHB1dCBmaWxlCiAgICAgICAgICAgICBpZiAoY3JlYXRlT3V0cHV0RmlsZSkgewogICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlLmV4aXN0cygpKSB7CkBAIC0xODAsNyArMTgyLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGVtcEZpbGUucmVuYW1lVG8ob3V0cHV0RmlsZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CiAgICAgICAgICAgICBlcnJvcihlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL0N1cnJlbmN5TmFtZXMucHJvcGVydGllcyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvQ3VycmVuY3lOYW1lcy5wcm9wZXJ0aWVzCmluZGV4IGIwMDIyMDIuLjU1ZWNmNDIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvQ3VycmVuY3lOYW1lcy5wcm9wZXJ0aWVzCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvQ3VycmVuY3lOYW1lcy5wcm9wZXJ0aWVzCkBAIC02MCw2ICs2MCw5IEBACiAjIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoZXNlIERhdGEgRmlsZXMgb3IgU29mdHdhcmUgd2l0aG91dCBwcmlvcgogIyB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCiAKKyMKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgQ29tbW9uIExvY2FsZSBEYXRhIFJlcG9zaXRvcnkuIERPIE5PVCBFRElUIQorIwogQURQPUFEUAogQUVEPUFFRAogQUZBPUFGQQpAQCAtMzU1LDcgKzM1OCw3IEBACiBneWQ9R3V5YW5hZXNlIERvbGxhcgogaGtkPUhvbmcgS29uZyBEb2xsYXIKIGhubD1Ib25kdXJhbiBMZW1waXJhCi1ocms9S3VuYQoraHJrPUNyb2F0aWFuIEt1bmEKIGh0Zz1IYWl0aWFuIEdvdXJkZQogaHVmPUh1bmdhcmlhbiBGb3JpbnQKIGlkcj1JbmRvbmVzaWFuIFJ1cGlhaApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9UaW1lWm9uZU5hbWVzLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lTmFtZXMuamF2YQppbmRleCBlOTQ1OWQ5Li41NzIyZGE5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lTmFtZXMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL1RpbWVab25lTmFtZXMuamF2YQpAQCAtMTg4LDkgKzE4OCw2IEBACiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7Ik1hcnNoYWxsIElzbGFuZHMgVGltZSIsICJNSFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJzaGFsbCBJc2xhbmRzIFN1bW1lciBUaW1lIiwgIk1IU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJzaGFsbCBJc2xhbmRzIFRpbWUiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ik15YW5tYXIgVGltZSIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFN1bW1lciBUaW1lIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFRpbWUiLCAiTU1UIn07CiAgICAgICAgIFN0cmluZyBNU0tbXSA9IG5ldyBTdHJpbmdbXSB7Ik1vc2NvdyBTdGFuZGFyZCBUaW1lIiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc2NvdyBEYXlsaWdodCBUaW1lIiwgIk1TRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc2NvdyBUaW1lIiwgIk1UIn07CkBAIC02ODYsNyArNjgzLDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9ReXp5bG9yZGEiLCBuZXcgU3RyaW5nW10geyJReXp5bG9yZGEgVGltZSIsICJRWVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJReXp5bG9yZGEgU3VtbWVyIFRpbWUiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF5enlsb3JkYSBUaW1lIiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7Ik15YW5tYXIgVGltZSIsICJNTVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFN1bW1lciBUaW1lIiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFRpbWUiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiU2FraGFsaW4gVGltZSIsICJTQUtUIiwKQEAgLTcxOSw3ICs3MTgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmxhZGl2b3N0b2sgU3VtbWVyIFRpbWUiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmxhZGl2b3N0b2sgVGltZSIsICJWTEFUIn19LAogICAgICAgICAgICAgeyJBc2lhL1lha3V0c2siLCBZQUtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9ZYW5nb24iLCBNTVR9LAogICAgICAgICAgICAgeyJBc2lhL1lla2F0ZXJpbmJ1cmciLCBuZXcgU3RyaW5nW10geyJZZWthdGVyaW5idXJnIFRpbWUiLCAiWUVLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllla2F0ZXJpbmJ1cmcgU3VtbWVyIFRpbWUiLCAiWUVLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWthdGVyaW5idXJnIFRpbWUiLCAiWUVLVCJ9fSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZGUvVGltZVpvbmVOYW1lc19kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9kZS9UaW1lWm9uZU5hbWVzX2RlLmphdmEKaW5kZXggOWNkY2E3Zi4uOGZhMjJmOSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9kZS9UaW1lWm9uZU5hbWVzX2RlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9kZS9UaW1lWm9uZU5hbWVzX2RlLmphdmEKQEAgLTE4OSw5ICsxODksNiBAQAogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJNYXJzaGFsbGluc2VsbiBaZWl0IiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxsaW5zZWxuIFNvbW1lcnplaXQiLCAiTUhTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxsaW5zZWxuIFplaXQiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ik15YW5tYXIgWmVpdCIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFNvbW1lcnplaXQiLCAiTU1TVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15YW5tYXIgWmVpdCIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TS1tdID0gbmV3IFN0cmluZ1tdIHsiTW9za2F1ZXIgTm9ybWFsemVpdCIsICJNU0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3NrYXVlciBTb21tZXJ6ZWl0IiwgIk1TRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplaXR6b25lIGZcdTAwRkNyIE1vc2thdSIsICJNVCJ9OwpAQCAtNjg3LDcgKzY4NCw5IEBACiAgICAgICAgICAgICB7IkFzaWEvUXl6eWxvcmRhIiwgbmV3IFN0cmluZ1tdIHsiUXl6eWxvcmRhIFplaXQiLCAiUVlaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXl6eWxvcmRhIFNvbW1lcnplaXQiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF5enlsb3JkYSBaZWl0IiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7Ik15YW5tYXIgWmVpdCIsICJNTVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyIFNvbW1lcnplaXQiLCAiTU1TVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15YW5tYXIgWmVpdCIsICJNTVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvUml5YWRoIiwgQVJBU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NhaWdvbiIsIElDVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2FraGFsaW4iLCBuZXcgU3RyaW5nW10geyJTYWtoYWxpbiBaZWl0IiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXbGFkaXdvc3RvayBTb21tZXJ6ZWl0IiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldsYWRpd29zdG9rIFplaXQiLCAiVkxBVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9ZYWt1dHNrIiwgWUFLVH0sCi0gICAgICAgICAgICB7IkFzaWEvWWFuZ29uIiwgTU1UfSwKICAgICAgICAgICAgIHsiQXNpYS9ZZWthdGVyaW5idXJnIiwgbmV3IFN0cmluZ1tdIHsiSmVrYXRlcmluYnVyZ2VyIFplaXQiLCAiWUVLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpla2F0ZXJpbmJ1cmdlciBTb21tZXJ6ZWl0IiwgIllFS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVrYXRlcmluYnVyZ2VyIFplaXQiLCAiWUVLVCJ9fSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvZXMvVGltZVpvbmVOYW1lc19lcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9lcy9UaW1lWm9uZU5hbWVzX2VzLmphdmEKaW5kZXggMWQ0MWQyMi4uYzIwYzAyZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9lcy9UaW1lWm9uZU5hbWVzX2VzLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9lcy9UaW1lWm9uZU5hbWVzX2VzLmphdmEKQEAgLTE4OSw5ICsxODksNiBAQAogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJIb3JhIGRlIGxhcyBJc2xhcyBNYXJzaGFsbCIsICJNSFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBsYXMgSXNsYXMgTWFyc2hhbGwiLCAiTUhTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgSXNsYXMgTWFyc2hhbGwiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgTXlhbm1hciIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBNeWFubWFyIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIE15YW5tYXIiLCAiTU1UIn07CiAgICAgICAgIFN0cmluZyBNU0tbXSA9IG5ldyBTdHJpbmdbXSB7IkhvcmEgZXN0XHUwMGUxbmRhciBkZSBNb3NjXHUwMGZhIiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgdmVyYW5vIGRlIE1vc2NcdTAwZmEiLCAiTVNEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSBNb3NjXHUwMEZBIiwgIk1UIn07CkBAIC02ODcsNyArNjg0LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9ReXp5bG9yZGEiLCBuZXcgU3RyaW5nW10geyJIb3JhIGRlIFF5enlsb3JkYSIsICJRWVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBReXp5bG9yZGEiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgUXl6eWxvcmRhIiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgTXlhbm1hciIsICJNTVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBNeWFubWFyIiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIE15YW5tYXIiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiSG9yYSBkZSBTYWphbGluIiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIHZlcmFubyBkZSBWbGFkaXZvc3RvayIsICJWTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JhIGRlIFZsYWRpdm9zdG9rIiwgIlZMQVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvWWFrdXRzayIsIFlBS1R9LAotICAgICAgICAgICAgeyJBc2lhL1lhbmdvbiIsIE1NVH0sCiAgICAgICAgICAgICB7IkFzaWEvWWVrYXRlcmluYnVyZyIsIG5ldyBTdHJpbmdbXSB7IkhvcmEgZGUgRWthdGVyaW5idXJnbyIsICJZRUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yYSBkZSB2ZXJhbm8gZGUgRWthdGVyaW5idXJnbyIsICJZRUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvcmEgZGUgRWthdGVyaW5idXJnbyIsICJZRUtUIn19LApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9mci9UaW1lWm9uZU5hbWVzX2ZyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2ZyL1RpbWVab25lTmFtZXNfZnIuamF2YQppbmRleCA1ZTNkMmJjLi4zZDgxMjAwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2ZyL1RpbWVab25lTmFtZXNfZnIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2ZyL1RpbWVab25lTmFtZXNfZnIuamF2YQpAQCAtMTg5LDkgKzE4OSw2IEBACiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlcyBJbGVzIE1hcnNoYWxsIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZXMgSWxlcyBNYXJzaGFsbCIsICJNSFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZGVzIElsZXMgTWFyc2hhbGwiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlIE15YW5tYXIiLCAiTU1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIE15YW5tYXIiLCAiTU1TVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIE15YW5tYXIiLCAiTU1UIn07CiAgICAgICAgIFN0cmluZyBNU0tbXSA9IG5ldyBTdHJpbmdbXSB7IkhldXJlIHN0YW5kYXJkIGRlIE1vc2NvdSIsICJNU0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBhdmFuY1x1MDBlOWUgZGUgTW9zY291IiwgIk1TRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc2NvdSIsICJNVCJ9OwpAQCAtNjg3LDcgKzY4NCw5IEBACiAgICAgICAgICAgICB7IkFzaWEvUXl6eWxvcmRhIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgS3l6eWxvcmRhIiwgIlFZWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBLeXp5bG9yZGEiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGRlIEt5enlsb3JkYSIsICJRWVpUIn19LAotICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBNTVR9LAorICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBuZXcgU3RyaW5nW10geyJIZXVyZSBkZSBNeWFubWFyIiwgIk1NVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldXJlIGQnXHUwMGU5dFx1MDBlOSBkZSBNeWFubWFyIiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBNeWFubWFyIiwgIk1NVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9SaXlhZGgiLCBBUkFTVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2FpZ29uIiwgSUNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWtoYWxpbiIsIG5ldyBTdHJpbmdbXSB7IkhldXJlIGRlIFNha2hhbGluIiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkJ1x1MDBlOXRcdTAwZTkgZGUgVmxhZGl2b3N0b2siLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZGUgVmxhZGl2b3N0b2siLCAiVkxBVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9ZYWt1dHNrIiwgWUFLVH0sCi0gICAgICAgICAgICB7IkFzaWEvWWFuZ29uIiwgTU1UfSwKICAgICAgICAgICAgIHsiQXNpYS9ZZWthdGVyaW5idXJnIiwgbmV3IFN0cmluZ1tdIHsiSGV1cmUgZGUgWWVrYXRlcmluYnVyZyIsICJZRUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV1cmUgZCdcdTAwZTl0XHUwMGU5IGRlIFlla2F0ZXJpbmJ1cmciLCAiWUVLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZXVyZSBkZSBZZWthdGVyaW5idXJnIiwgIllFS1QifX0sCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2l0L1RpbWVab25lTmFtZXNfaXQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvaXQvVGltZVpvbmVOYW1lc19pdC5qYXZhCmluZGV4IDQ5OTMwZmQuLjMzMzUwYzQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvaXQvVGltZVpvbmVOYW1lc19pdC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvaXQvVGltZVpvbmVOYW1lc19pdC5qYXZhCkBAIC0xODksOSArMTg5LDYgQEAKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIGRlbGxlIElzb2xlIE1hcnNoYWxsIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGVsbGUgSXNvbGUgTWFyc2hhbGwiLCAiTUhTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkZWxsZSBJc29sZSBNYXJzaGFsbCIsICJNSFQifTsKLSAgICAgICAgU3RyaW5nIE1NVFtdID0gbmV3IFN0cmluZ1tdIHsiT3JhIGRlbGxhIEJpcm1hbmlhL015YW5tYXIiLCAiTU1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGVzdGl2YSBkZWxsYSBCaXJtYW5pYS9NeWFubWFyIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGVsbGEgQmlybWFuaWEvTXlhbm1hciIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TS1tdID0gbmV3IFN0cmluZ1tdIHsiT3JhIHN0YW5kYXJkIGRpIE1vc2NhIiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBsZWdhbGUgZGkgTW9zY2EiLCAiTVNEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIE1vc2NhIiwgIk1UIn07CkBAIC02ODcsNyArNjg0LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9ReXp5bG9yZGEiLCBuZXcgU3RyaW5nW10geyJPcmEgZGkgUXl6eWxvcmRhIiwgIlFZWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGkgUXl6eWxvcmRhIiwgIlFZWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZGkgUXl6eWxvcmRhIiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7Ik9yYSBkZWxsYSBCaXJtYW5pYS9NeWFubWFyIiwgIk1NVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBlc3RpdmEgZGVsbGEgQmlybWFuaWEvTXlhbm1hciIsICJNTVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3JhIGRlbGxhIEJpcm1hbmlhL015YW5tYXIiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiT3JhIGRpIFNha2hhbGluIiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIFZsYWRpdm9zdG9rIiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBWbGFkaXZvc3RvayIsICJWTEFUIn19LAogICAgICAgICAgICAgeyJBc2lhL1lha3V0c2siLCBZQUtUfSwKLSAgICAgICAgICAgIHsiQXNpYS9ZYW5nb24iLCBNTVR9LAogICAgICAgICAgICAgeyJBc2lhL1lla2F0ZXJpbmJ1cmciLCBuZXcgU3RyaW5nW10geyJPcmEgZGkgRWthdGVyaW5idXJnIiwgIllFS1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcmEgZXN0aXZhIGRpIEVrYXRlcmluYnVyZyIsICJZRUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yYSBkaSBFa2F0ZXJpbmJ1cmciLCAiWUVLVCJ9fSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvamEvVGltZVpvbmVOYW1lc19qYS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9qYS9UaW1lWm9uZU5hbWVzX2phLmphdmEKaW5kZXggOTBjMjZjMC4uNTdhM2ZiNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9qYS9UaW1lWm9uZU5hbWVzX2phLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9qYS9UaW1lWm9uZU5hbWVzX2phLmphdmEKQEAgLTE4OSw5ICsxODksNiBAQAogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJcdTMwZGVcdTMwZmNcdTMwYjdcdTMwZTNcdTMwZWJcdTVjZjZcdTY2NDJcdTk1OTMiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGRlXHUzMGZjXHUzMGI3XHUzMGUzXHUzMGViXHU1Y2Y2XHU1OTBmXHU2NjQyXHU5NTkzIiwgIk1IU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREVcdTMwRkNcdTMwQjdcdTMwRTNcdTMwRUJcdThBRjhcdTVDRjZcdTY2NDJcdTk1OTMiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1MzBkZlx1MzBlM1x1MzBmM1x1MzBkZVx1MzBmY1x1NjY0Mlx1OTU5MyIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwZGZcdTMwZTNcdTMwZjNcdTMwZGVcdTMwZmNcdTU5MGZcdTY2NDJcdTk1OTMiLCAiTU1TVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBERlx1MzBFM1x1MzBGM1x1MzBERVx1MzBGQ1x1NjY0Mlx1OTU5MyIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TS1tdID0gbmV3IFN0cmluZ1tdIHsiXHUzMGUyXHUzMGI5XHUzMGFmXHUzMGVmXHU2YTE5XHU2ZTk2XHU2NjQyIiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBlMlx1MzBiOVx1MzBhZlx1MzBlZlx1NTkwZlx1NjY0Mlx1OTU5MyIsICJNU0QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwRTJcdTMwQjlcdTMwQUZcdTMwRUZcdTY2NDJcdTk1OTMiLCAiTVQifTsKQEAgLTY4Nyw3ICs2ODQsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1F5enlsb3JkYSIsIG5ldyBTdHJpbmdbXSB7Ilx1MzBhZFx1MzBiOFx1MzBlYlx1MzBhYVx1MzBlYlx1MzBjMFx1NjY0Mlx1OTU5MyIsICJRWVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYWRcdTMwYjhcdTMwZWJcdTMwYWFcdTMwZWJcdTMwYzBcdTU5MGZcdTY2NDJcdTk1OTMiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MzBBRlx1MzBCQVx1MzBFRFx1MzBFQlx1MzBDMFx1NjY0Mlx1OTU5MyIsICJRWVpUIn19LAotICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBNTVR9LAorICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBuZXcgU3RyaW5nW10geyJcdTMwZGZcdTMwZTNcdTMwZjNcdTMwZGVcdTMwZmNcdTY2NDJcdTk1OTMiLCAiTU1UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGRmXHUzMGUzXHUzMGYzXHUzMGRlXHUzMGZjXHU1OTBmXHU2NjQyXHU5NTkzIiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwREZcdTMwRTNcdTMwRjNcdTMwREVcdTMwRkNcdTY2NDJcdTk1OTMiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiXHU2YTNhXHU1OTJhXHU2NjQyXHU5NTkzIiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwYTZcdTMwZTlcdTMwYjhcdTMwYWFcdTMwYjlcdTMwYzhcdTMwYWZcdTU5MGZcdTY2NDJcdTk1OTMiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEE2XHUzMEU5XHUzMEI4XHUzMEFBXHUzMEI5XHUzMEM4XHUzMEFGXHU2NjQyXHU5NTkzIiwgIlZMQVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvWWFrdXRzayIsIFlBS1R9LAotICAgICAgICAgICAgeyJBc2lhL1lhbmdvbiIsIE1NVH0sCiAgICAgICAgICAgICB7IkFzaWEvWWVrYXRlcmluYnVyZyIsIG5ldyBTdHJpbmdbXSB7Ilx1MzBhOFx1MzBhYlx1MzBjNlx1MzBlYVx1MzBmM1x1MzBkNlx1MzBlYlx1MzBiMFx1NjY0Mlx1OTU5MyIsICJZRUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMGE4XHUzMGFiXHUzMGM2XHUzMGVhXHUzMGYzXHUzMGQ2XHUzMGViXHUzMGIwXHU1OTBmXHU2NjQyXHU5NTkzIiwgIllFS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUzMEE4XHUzMEFCXHUzMEM2XHUzMEVBXHUzMEYzXHUzMEQ2XHUzMEVCXHUzMEFGXHU2NjQyXHU5NTkzIiwgIllFS1QifX0sCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL2tvL1RpbWVab25lTmFtZXNfa28uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMva28vVGltZVpvbmVOYW1lc19rby5qYXZhCmluZGV4IDlhZWU1OWIuLmQxNzE1NGIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMva28vVGltZVpvbmVOYW1lc19rby5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMva28vVGltZVpvbmVOYW1lc19rby5qYXZhCkBAIC0xODksOSArMTg5LDYgQEAKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiXHViOWM4XHVjMTVjXHVjODFjXHViM2M0IFx1YzJkY1x1YWMwNCIsICJNSFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWI5YzhcdWMxNWNcdWM4MWNcdWIzYzQgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIk1IU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUI5QzhcdUMxNUMgXHVDODFDXHVCM0M0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJNSFQifTsKLSAgICAgICAgU3RyaW5nIE1NVFtdID0gbmV3IFN0cmluZ1tdIHsiXHViYmY4XHVjNTgwXHViOWM4IFx1YzJkY1x1YWMwNCIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWJiZjhcdWM1ODBcdWI5YzggXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUJCRjhcdUM1ODBcdUI5QzggXHVENDVDXHVDOTAwXHVDMkRDIiwgIk1NVCJ9OwogICAgICAgICBTdHJpbmcgTVNLW10gPSBuZXcgU3RyaW5nW10geyJcdWJhYThcdWMyYTRcdWQwNmNcdWJjMTQgXHVkNDVjXHVjOTAwXHVjMmRjIiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1YmFhOFx1YzJhNFx1ZDA2Y1x1YmMxNCBcdWM3N2NcdWFkMTFcdWM4MDhcdWM1N2RcdWMyZGNcdWFjMDQiLCAiTVNEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCQUE4XHVDMkE0XHVEMDZDXHVCQzE0IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJNVCJ9OwpAQCAtNjg3LDcgKzY4NCw5IEBACiAgICAgICAgICAgICB7IkFzaWEvUXl6eWxvcmRhIiwgbmV3IFN0cmluZ1tdIHsiUXl6eWxvcmRhIFx1ZDQ1Y1x1YzkwMFx1YzJkYyIsICJRWVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJReXp5bG9yZGEgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlFZWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdUQwQTRcdUM5QzhcdUI4NUNcdUI5NzRcdUIyRTQgXHVENDVDXHVDOTAwXHVDMkRDIiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7Ilx1YmJmOFx1YzU4MFx1YjljOCBcdWMyZGNcdWFjMDQiLCAiTU1UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHViYmY4XHVjNTgwXHViOWM4IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJNTVNUIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVCQkY4XHVDNTgwXHVCOUM4IFx1RDQ1Q1x1QzkwMFx1QzJEQyIsICJNTVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvUml5YWRoIiwgQVJBU1R9LAogICAgICAgICAgICAgeyJBc2lhL1NhaWdvbiIsIElDVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2FraGFsaW4iLCBuZXcgU3RyaW5nW10geyJcdWMwYWNcdWQ1NjBcdWI5YjAgXHVjMmRjXHVhYzA0IiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdWJlMTRcdWI3N2NcdWI1MTRcdWJjZjRcdWMyYTRcdWQxYTEgXHVjNzdjXHVhZDExXHVjODA4XHVjNTdkXHVjMmRjXHVhYzA0IiwgIlZMQVNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QkUxNFx1Qjc3Q1x1QjUxNFx1QkNGNFx1QzJBNFx1RDFBMSBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiVkxBVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9ZYWt1dHNrIiwgWUFLVH0sCi0gICAgICAgICAgICB7IkFzaWEvWWFuZ29uIiwgTU1UfSwKICAgICAgICAgICAgIHsiQXNpYS9ZZWthdGVyaW5idXJnIiwgbmV3IFN0cmluZ1tdIHsiXHVjNjA4XHVjZTc0XHVkMTRjXHViOWIwXHViYzg0XHVhZGY4IFx1YzJkY1x1YWMwNCIsICJZRUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHVjNjA4XHVjZTc0XHVkMTRjXHViOWIwXHViYzg0XHVhZGY4IFx1Yzc3Y1x1YWQxMVx1YzgwOFx1YzU3ZFx1YzJkY1x1YWMwNCIsICJZRUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1QzYwOFx1Q0U3NFx1RDE0Q1x1QjlCMFx1QkQ4MFx1Qjk3NFx1RDA2QyBcdUQ0NUNcdUM5MDBcdUMyREMiLCAiWUVLVCJ9fSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvcHQvVGltZVpvbmVOYW1lc19wdF9CUi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9wdC9UaW1lWm9uZU5hbWVzX3B0X0JSLmphdmEKaW5kZXggZWMzYWZiNS4uMzI3NDdmZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9wdC9UaW1lWm9uZU5hbWVzX3B0X0JSLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9wdC9UaW1lWm9uZU5hbWVzX3B0X0JSLmphdmEKQEAgLTE4OSw5ICsxODksNiBAQAogICAgICAgICBTdHJpbmcgTVNLW10gPSBuZXcgU3RyaW5nW10geyJGdXNvIGhvclx1MDBlMXJpbyBwYWRyXHUwMGUzbyBkZSBNb3Njb3UiLCAiTVNLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9yXHUwMGUxcmlvIGRlIGx1eiBuYXR1cmFsIGRlIE1vc2NvdSIsICJNU0QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgTW9zY291IiwgIk1UIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIE1pYW5tYXIiLCAiTU1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBNaWFubWFyIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgTWlhbm1hciIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TVFtdID0gbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gcGFkclx1MDBlM28gZGFzIG1vbnRhbmhhcyIsICJNU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwZTFyaW8gZGUgbHV6IG5hdHVyYWwgZGFzIG1vbnRhbmhhcyIsICJNRFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGFzIE1vbnRhbmhhcyBSb2Nob3NhcyIsICJNVCJ9OwpAQCAtNjg3LDcgKzY4NCw5IEBACiAgICAgICAgICAgICB7IkFzaWEvUXl6eWxvcmRhIiwgbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgS2l6aWwtT3JkYSIsICJRWVpUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRlIEtpemlsLU9yZGEiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBReXp5bG9yZGEiLCAiUVlaVCJ9fSwKLSAgICAgICAgICAgIHsiQXNpYS9SYW5nb29uIiwgTU1UfSwKKyAgICAgICAgICAgIHsiQXNpYS9SYW5nb29uIiwgbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgTWlhbm1hciIsICJNTVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXNvIGhvclx1MDBlMXJpbyBkZSB2ZXJcdTAwZTNvIGRlIE1pYW5tYXIiLCAiTU1TVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvclx1MDBFMXJpbyBkZSBNaWFubWFyIiwgIk1NVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9SaXlhZGgiLCBBUkFTVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2FpZ29uIiwgSUNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWtoYWxpbiIsIG5ldyBTdHJpbmdbXSB7IkZ1c28gaG9yXHUwMGUxcmlvIGRlIFNha2hhbGluYSIsICJTQUtUIiwKQEAgLTcyMCw3ICs3MTksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVzbyBob3JcdTAwZTFyaW8gZGUgdmVyXHUwMGUzbyBkZSBWbGFkaXZvc3RvayIsICJWTEFTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgVmxhZGl2b3N0b2siLCAiVkxBVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9ZYWt1dHNrIiwgWUFLVH0sCi0gICAgICAgICAgICB7IkFzaWEvWWFuZ29uIiwgTU1UfSwKICAgICAgICAgICAgIHsiQXNpYS9ZZWthdGVyaW5idXJnIiwgbmV3IFN0cmluZ1tdIHsiRnVzbyBob3JcdTAwZTFyaW8gZGUgWWVrYXRlcmluYnVyZ28iLCAiWUVLVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1c28gaG9yXHUwMGUxcmlvIGRlIHZlclx1MDBlM28gZGUgWWVrYXRlcmluYnVyZ28iLCAiWUVLU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3JcdTAwRTFyaW8gZGUgWWVrYXRlcmluYnVyZyIsICJZRUtUIn19LApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy9zdi9UaW1lWm9uZU5hbWVzX3N2LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3N2L1RpbWVab25lTmFtZXNfc3YuamF2YQppbmRleCA5MDM5MDJkLi44NzA1YmZlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3N2L1RpbWVab25lTmFtZXNfc3YuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3N2L1RpbWVab25lTmFtZXNfc3YuamF2YQpAQCAtMTg5LDkgKzE4OSw2IEBACiAgICAgICAgIFN0cmluZyBNSFRbXSA9IG5ldyBTdHJpbmdbXSB7Ik1hcnNoYWxsXHUwMGY2YXJuYSwgbm9ybWFsdGlkIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnNoYWxsXHUwMGY2YXJuYSwgc29tbWFydGlkIiwgIk1IU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJzaGFsbFx1MDBGNmFybmEtdGlkIiwgIk1IVCJ9OwotICAgICAgICBTdHJpbmcgTU1UW10gPSBuZXcgU3RyaW5nW10geyJNeWFubWFyLCBub3JtYWx0aWQiLCAiTU1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXlhbm1hciwgc29tbWFydGlkIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyLXRpZCIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TS1tdID0gbmV3IFN0cmluZ1tdIHsiTW9za3ZhLCBub3JtYWx0aWQiLCAiTVNLIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9za3ZhLCBzb21tYXJ0aWQiLCAiTVNEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9za3ZhcyB0aWQiLCAiTVQifTsKQEAgLTY4Nyw3ICs2ODQsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1F5enlsb3JkYSIsIG5ldyBTdHJpbmdbXSB7IlF5enlsb3JkYSwgbm9ybWFsdGlkIiwgIlFZWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF5enlsb3JkYSwgc29tbWFydGlkIiwgIlFZWlNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJReXp5bG9yZGEtdGlkIiwgIlFZWlQifX0sCi0gICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIE1NVH0sCisgICAgICAgICAgICB7IkFzaWEvUmFuZ29vbiIsIG5ldyBTdHJpbmdbXSB7Ik15YW5tYXIsIG5vcm1hbHRpZCIsICJNTVQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeWFubWFyLCBzb21tYXJ0aWQiLCAiTU1TVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk15YW5tYXItdGlkIiwgIk1NVCJ9fSwKICAgICAgICAgICAgIHsiQXNpYS9SaXlhZGgiLCBBUkFTVH0sCiAgICAgICAgICAgICB7IkFzaWEvU2FpZ29uIiwgSUNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWtoYWxpbiIsIG5ldyBTdHJpbmdbXSB7IlNha2hhbGluLCBub3JtYWx0aWQiLCAiU0FLVCIsCkBAIC03MjAsNyArNzE5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZsYWRpdm9zdG9rLCBzb21tYXJ0aWQiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmxhZGl2b3N0b2stdGlkIiwgIlZMQVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvWWFrdXRzayIsIFlBS1R9LAotICAgICAgICAgICAgeyJBc2lhL1lhbmdvbiIsIE1NVH0sCiAgICAgICAgICAgICB7IkFzaWEvWWVrYXRlcmluYnVyZyIsIG5ldyBTdHJpbmdbXSB7Ikpla2F0ZXJpbmJ1cmcsIG5vcm1hbHRpZCIsICJZRUtUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVrYXRlcmluYnVyZywgc29tbWFydGlkIiwgIllFS1NUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmVrYXRlcmluYnVyZy10aWQiLCAiWUVLVCJ9fSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9DTi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX0NOLmphdmEKaW5kZXggZDJlZjU1Yi4uZDVlNTIxNSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX0NOLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3Jlc291cmNlcy96aC9UaW1lWm9uZU5hbWVzX3poX0NOLmphdmEKQEAgLTE4OSw5ICsxODksNiBAQAogICAgICAgICBTdHJpbmcgTUhUW10gPSBuZXcgU3RyaW5nW10geyJcdTlhNmNcdTdlY2RcdTVjMTRcdTdmYTRcdTVjOWJcdTY1ZjZcdTk1ZjQiLCAiTUhUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU5YTZjXHU3ZWNkXHU1YzE0XHU3ZmE0XHU1YzliXHU1OTBmXHU0ZWU0XHU2NWY2IiwgIk1IU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTlBNkNcdTdFQ0RcdTVDMTRcdTdGQTRcdTVDOUJcdTY1RjZcdTk1RjQiLCAiTUhUIn07Ci0gICAgICAgIFN0cmluZyBNTVRbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1N2YwNVx1NzUzOFx1NjVmNlx1OTVmNCIsICJNTVQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTdmMDVcdTc1MzhcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiTU1TVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1N0YwNVx1NzUzOFx1NjVGNlx1OTVGNCIsICJNTVQifTsKICAgICAgICAgU3RyaW5nIE1TS1tdID0gbmV3IFN0cmluZ1tdIHsiXHU4M2FiXHU2NWFmXHU3OWQxXHU2ODA3XHU1MWM2XHU2NWY2XHU5NWY0IiwgIk1TSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODNhYlx1NjVhZlx1NzlkMVx1NTkwZlx1NGVlNFx1NjVmNiIsICJNU0QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTgzQUJcdTY1QUZcdTc5RDFcdTY1RjZcdTk1RjQiLCAiTVQifTsKQEAgLTY4Nyw3ICs2ODQsOSBAQAogICAgICAgICAgICAgeyJBc2lhL1F5enlsb3JkYSIsIG5ldyBTdHJpbmdbXSB7IlF5enlsb3JkYSBcdTY1ZjZcdTk1ZjQiLCAiUVlaVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXl6eWxvcmRhIFx1NTkwZlx1NGVlNFx1NjVmNiIsICJRWVpTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXl6eWxvcmRhIFx1NjVGNlx1OTVGNCIsICJRWVpUIn19LAotICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBNTVR9LAorICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBuZXcgU3RyaW5nW10geyJcdTdmMDVcdTc1MzhcdTY1ZjZcdTk1ZjQiLCAiTU1UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3ZjA1XHU3NTM4XHU1OTBmXHU0ZWU0XHU2NWY2IiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTdGMDVcdTc1MzhcdTY1RjZcdTk1RjQiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiXHU1ZTkzXHU5ODc1XHU1YzliXHU2NWY2XHU5NWY0IiwgIlNBS1QiLApAQCAtNzIwLDcgKzcxOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTZkNzdcdTUzYzJcdTVkMzRcdTU5MGZcdTRlZTRcdTY1ZjYiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2RDc3XHU1M0MyXHU1RDM0XHU2NUY2XHU5NUY0IiwgIlZMQVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvWWFrdXRzayIsIFlBS1R9LAotICAgICAgICAgICAgeyJBc2lhL1lhbmdvbiIsIE1NVH0sCiAgICAgICAgICAgICB7IkFzaWEvWWVrYXRlcmluYnVyZyIsIG5ldyBTdHJpbmdbXSB7Illla2F0ZXJpbmJ1cmcgXHU2NWY2XHU5NWY0IiwgIllFS1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWthdGVyaW5idXJnIFx1NTkwZlx1NGVlNFx1NjVmNiIsICJZRUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllla2F0ZXJpbmJ1cmcgXHU2NUY2XHU5NUY0IiwgIllFS1QifX0sCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvcmVzb3VyY2VzL3poL1RpbWVab25lTmFtZXNfemhfVFcuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9UVy5qYXZhCmluZGV4IGI5OWY5ZDUuLjRkYzIxMmIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9UVy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9yZXNvdXJjZXMvemgvVGltZVpvbmVOYW1lc196aF9UVy5qYXZhCkBAIC0xODksOSArMTg5LDYgQEAKICAgICAgICAgU3RyaW5nIE1IVFtdID0gbmV3IFN0cmluZ1tdIHsiXHU5OWFjXHU3ZDM5XHU3MjNlXHU3ZmE0XHU1Y2Y2XHU2NjQyXHU5NTkzIiwgIk1IVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1OTlhY1x1N2QzOVx1NzIzZVx1N2ZhNFx1NWNmNlx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJNSFNUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU5OUFDXHU3RDM5XHU3MjNFXHU3RkE0XHU1Q0Y2XHU2NjQyXHU5NTkzIiwgIk1IVCJ9OwotICAgICAgICBTdHJpbmcgTU1UW10gPSBuZXcgU3RyaW5nW10geyJcdTdkZWNcdTc1MzhcdTY2NDJcdTk1OTMiLCAiTU1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3ZGVjXHU3NTM4XHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIk1NU1QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTdERUNcdTc1MzhcdTY2NDJcdTk1OTMiLCAiTU1UIn07CiAgICAgICAgIFN0cmluZyBNU0tbXSA9IG5ldyBTdHJpbmdbXSB7Ilx1ODNhYlx1NjVhZlx1NzlkMVx1NmExOVx1NmU5Nlx1NjY0Mlx1OTU5MyIsICJNU0siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTgzYWJcdTY1YWZcdTc5ZDFcdTY1ZTVcdTUxNDlcdTdiYzBcdTdkMDRcdTY2NDJcdTk1OTMiLCAiTVNEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU4M0FCXHU2NUFGXHU3OUQxXHU2NjQyXHU5NTkzIiwgIk1UIn07CkBAIC02ODcsNyArNjg0LDkgQEAKICAgICAgICAgICAgIHsiQXNpYS9ReXp5bG9yZGEiLCBuZXcgU3RyaW5nW10geyJReXp5bG9yZGEgXHU2NjQyXHU5NTkzIiwgIlFZWlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF5enlsb3JkYSBcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiUVlaU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1NTE0Qlx1NUI1Q1x1NkQxQlx1NzIzRVx1OTA1NFx1NjY0Mlx1OTU5MyIsICJRWVpUIn19LAotICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBNTVR9LAorICAgICAgICAgICAgeyJBc2lhL1Jhbmdvb24iLCBuZXcgU3RyaW5nW10geyJcdTdkZWNcdTc1MzhcdTY2NDJcdTk1OTMiLCAiTU1UIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU3ZGVjXHU3NTM4XHU1OTBmXHU0ZWU0XHU2NjQyXHU5NTkzIiwgIk1NU1QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTdERUNcdTc1MzhcdTY2NDJcdTk1OTMiLCAiTU1UIn19LAogICAgICAgICAgICAgeyJBc2lhL1JpeWFkaCIsIEFSQVNUfSwKICAgICAgICAgICAgIHsiQXNpYS9TYWlnb24iLCBJQ1R9LAogICAgICAgICAgICAgeyJBc2lhL1Nha2hhbGluIiwgbmV3IFN0cmluZ1tdIHsiXHU1ZWFiXHU5ODAxXHU1Y2Y2XHU2NjQyXHU5NTkzIiwgIlNBS1QiLApAQCAtNzIyLDcgKzcyMSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTZkNzdcdTUzYzNcdTVkMzRcdTU5MGZcdTRlZTRcdTY2NDJcdTk1OTMiLCAiVkxBU1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHU2RDc3XHU1M0MzXHU1RDM0XHU2NjQyXHU5NTkzIiwgIlZMQVQifX0sCiAgICAgICAgICAgICB7IkFzaWEvWWFrdXRzayIsIFlBS1R9LAotICAgICAgICAgICAgeyJBc2lhL1lhbmdvbiIsIE1NVH0sCiAgICAgICAgICAgICB7IkFzaWEvWWVrYXRlcmluYnVyZyIsIG5ldyBTdHJpbmdbXSB7Illla2F0ZXJpbmJ1cmcgXHU2NjQyXHU5NTkzIiwgIllFS1QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWthdGVyaW5idXJnIFx1NTkwZlx1NGVlNFx1NjY0Mlx1OTU5MyIsICJZRUtTVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1ODQ0OVx1NTM2MVx1NjM3N1x1NzQzM1x1NTgyMVx1NjY0Mlx1OTU5MyIsICJZRUtUIn19LApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1haXggYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LWFpeAppbmRleCBjMjljMjViLi41MWU3NzM4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LWFpeAorKysgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LWFpeApAQCAtNDgzLDQzICs0ODMsNiBAQAogIwogamRrLmNlcnRwYXRoLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0CiAKLSMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3Igc2lnbmVkIEpBUiBmaWxlcwotIwotIyBJbiBzb21lIGVudmlyb25tZW50cywgY2VydGFpbiBhbGdvcml0aG1zIG9yIGtleSBsZW5ndGhzIG1heSBiZSB1bmRlc2lyYWJsZQotIyBmb3Igc2lnbmVkIEpBUiB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsICJNRDIiIGlzIGdlbmVyYWxseSBubyBsb25nZXIKLSMgY29uc2lkZXJlZCB0byBiZSBhIHNlY3VyZSBoYXNoIGFsZ29yaXRobS4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlCi0jIG1lY2hhbmlzbSBmb3IgZGlzYWJsaW5nIGFsZ29yaXRobXMgYmFzZWQgb24gYWxnb3JpdGhtIG5hbWUgYW5kL29yIGtleSBsZW5ndGguCi0jIEpBUnMgc2lnbmVkIHdpdGggYW55IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG1zIG9yIGtleSBzaXplcyB3aWxsIGJlIHRyZWF0ZWQKLSMgYXMgdW5zaWduZWQuCi0jCi0jIFRoZSBzeW50YXggb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobSBzdHJpbmcgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3M6Ci0jICAgRGlzYWJsZWRBbGdvcml0aG1zOgotIyAgICAgICAiIERpc2FibGVkQWxnb3JpdGhtIHsgLCBEaXNhYmxlZEFsZ29yaXRobSB9ICIKLSMKLSMgICBEaXNhYmxlZEFsZ29yaXRobToKLSMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KLSMKLSMgICBBbGdvcml0aG1OYW1lOgotIyAgICAgICAoc2VlIGJlbG93KQotIwotIyAgIENvbnN0cmFpbnQ6Ci0jICAgICAgIEtleVNpemVDb25zdHJhaW50Ci0jCi0jICAgS2V5U2l6ZUNvbnN0cmFpbnQ6Ci0jICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCi0jCi0jICAgT3BlcmF0b3I6Ci0jICAgICAgIDw9IHwgPCB8ID09IHwgIT0gfCA+PSB8ID4KLSMKLSMgICBLZXlMZW5ndGg6Ci0jICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwotIwotIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCi0jIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgotIyBpbXBsZW1lbnRhdGlvbnMuCi0jCi1qZGsuamFyLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0Ci0KICMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3IgU2VjdXJlIFNvY2tldCBMYXllci9UcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkKICMgKFNTTC9UTFMpIHByb2Nlc3NpbmcKICMKQEAgLTY2Miw2NyArNjI1LDQwIEBACiAjICAgICAgIEVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKICMgICAgICAgRkZGRkZGRkYgRkZGRkZGRkYsIDJ9CiAKLSMgQ3J5cHRvZ3JhcGhpYyBKdXJpc2RpY3Rpb24gUG9saWN5IGRlZmF1bHRzCisjIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIHNpZ25lZCBKQVIgZmlsZXMKICMKLSMgRHVlIHRvIHRoZSBpbXBvcnQgY29udHJvbCByZXN0cmljdGlvbnMgb2Ygc29tZSBjb3VudHJpZXMsIHRoZSBkZWZhdWx0Ci0jIEpDRSBwb2xpY3kgZmlsZXMgYWxsb3cgZm9yIHN0cm9uZyBidXQgImxpbWl0ZWQiIGNyeXB0b2dyYXBoaWMga2V5Ci0jIGxlbmd0aHMgdG8gYmUgdXNlZC4gIElmIHlvdXIgY291bnRyeSdzIGNyeXB0b2dyYXBoaWMgcmVndWxhdGlvbnMgYWxsb3csCi0jIHRoZSAidW5saW1pdGVkIiBzdHJlbmd0aCBwb2xpY3kgZmlsZXMgY2FuIGJlIHVzZWQgaW5zdGVhZCwgd2hpY2ggY29udGFpbgotIyBubyByZXN0cmljdGlvbnMgb24gY3J5cHRvZ3JhcGhpYyBzdHJlbmd0aHMuCisjIEluIHNvbWUgZW52aXJvbm1lbnRzLCBjZXJ0YWluIGFsZ29yaXRobXMgb3Iga2V5IGxlbmd0aHMgbWF5IGJlIHVuZGVzaXJhYmxlCisjIGZvciBzaWduZWQgSkFSIHZhbGlkYXRpb24uICBGb3IgZXhhbXBsZSwgIk1EMiIgaXMgZ2VuZXJhbGx5IG5vIGxvbmdlcgorIyBjb25zaWRlcmVkIHRvIGJlIGEgc2VjdXJlIGhhc2ggYWxnb3JpdGhtLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUKKyMgbWVjaGFuaXNtIGZvciBkaXNhYmxpbmcgYWxnb3JpdGhtcyBiYXNlZCBvbiBhbGdvcml0aG0gbmFtZSBhbmQvb3Iga2V5IGxlbmd0aC4KKyMgSkFScyBzaWduZWQgd2l0aCBhbnkgb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobXMgb3Iga2V5IHNpemVzIHdpbGwgYmUgdHJlYXRlZAorIyBhcyB1bnNpZ25lZC4KICMKLSMgWU9VIEFSRSBBRFZJU0VEIFRPIENPTlNVTFQgWU9VUiBFWFBPUlQvSU1QT1JUIENPTlRST0wgQ09VTlNFTCBPUiBBVFRPUk5FWQotIyBUTyBERVRFUk1JTkUgVEhFIEVYQUNUIFJFUVVJUkVNRU5UUy4KKyMgVGhlIHN5bnRheCBvZiB0aGUgZGlzYWJsZWQgYWxnb3JpdGhtIHN0cmluZyBpcyBkZXNjcmliZWQgYXMgZm9sbG93czoKKyMgICBEaXNhYmxlZEFsZ29yaXRobXM6CisjICAgICAgICIgRGlzYWJsZWRBbGdvcml0aG0geyAsIERpc2FibGVkQWxnb3JpdGhtIH0gIgogIwotIyA8amF2YS1ob21lPiAoYmVsb3cpIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKUkUgd2FzCi0jIGluc3RhbGxlZC4gSXQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZyBKQ0UKLSMgb24gYSBKUkUgb3IgYSBKUkUgY29udGFpbmVkIHdpdGhpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQsIG9yCi0jIEpESyhUTSkuIFRoZSBKREsgY29udGFpbnMgdGhlIEpSRSwgYnV0IGF0IGEgZGlmZmVyZW50IGxldmVsIGluIHRoZQotIyBmaWxlIGhpZXJhcmNoeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBKREsgaXMgaW5zdGFsbGVkIGluCi0jIC9ob21lL3VzZXIxL2pkazEuOC4wIG9uIFVuaXggb3IgaW4gQzpcamRrMS44LjAgb24gV2luZG93cywgdGhlbgotIyA8amF2YS1ob21lPiBpczoKKyMgICBEaXNhYmxlZEFsZ29yaXRobToKKyMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KICMKLSMgIC9ob21lL3VzZXIxL2pkazEuOC4wL2pyZSAgICAgICAgICAgW1VuaXhdCi0jICBDOlxqZGsxLjguMFxqcmUgICAgICAgICAgICAgICAgICAgIFtXaW5kb3dzXQorIyAgIEFsZ29yaXRobU5hbWU6CisjICAgICAgIChzZWUgYmVsb3cpCiAjCi0jIElmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSBKUkUgaXMgaW5zdGFsbGVkIGluIC9ob21lL3VzZXIxL2pyZTEuOC4wCi0jIG9uIFVuaXggb3IgaW4gQzpcanJlMS44LjAgb24gV2luZG93cywgYW5kIHRoZSBKREsgaXMgbm90Ci0jIGluc3RhbGxlZCwgdGhlbiA8amF2YS1ob21lPiBpczoKKyMgICBDb25zdHJhaW50OgorIyAgICAgICBLZXlTaXplQ29uc3RyYWludAogIwotIyAgL2hvbWUvdXNlcjEvanJlMS44LjAgICAgICAgICAgICAgICBbVW5peF0KLSMgIEM6XGpyZTEuOC4wICAgICAgICAgICAgICAgICAgICAgICAgW1dpbmRvd3NdCisjICAgS2V5U2l6ZUNvbnN0cmFpbnQ6CisjICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCiAjCi0jIE9uIFdpbmRvd3MsIGZvciBlYWNoIEpESyBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsCi0jIEpSRXMgaW5zdGFsbGVkIHVuZGVyIHRoZSAiUHJvZ3JhbSBGaWxlcyIgZGlyZWN0b3J5LiBQbGVhc2UgbWFrZQotIyBzdXJlIHRoYXQgeW91IGluc3RhbGwgdGhlIHVubGltaXRlZCBzdHJlbmd0aCBwb2xpY3kgSkFSIGZpbGVzCi0jIGZvciBhbGwgSlJFcyB0aGF0IHlvdSBwbGFuIHRvIHVzZS4KKyMgICBPcGVyYXRvcjoKKyMgICAgICAgPD0gfCA8IHwgPT0gfCAhPSB8ID49IHwgPgogIwotIyBUaGUgcG9saWN5IGZpbGVzIGFyZSBqYXIgZmlsZXMgb3JnYW5pemVkIGludG8gc3ViZGlyZWN0b3JpZXMgb2YKLSMgPGphdmEtaG9tZT4vbGliL3NlY3VyaXR5L3BvbGljeS4gIEVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgY29tcGxldGUKLSMgc2V0IG9mIHBvbGljeSBmaWxlcy4KKyMgICBLZXlMZW5ndGg6CisjICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwogIwotIyBUaGUgImNyeXB0by5wb2xpY3kiIFNlY3VyaXR5IHByb3BlcnR5IGNvbnRyb2xzIHRoZSBkaXJlY3Rvcnkgc2VsZWN0aW9uLAotIyBhbmQgdGh1cyB0aGUgZWZmZWN0aXZlIGNyeXB0b2dyYXBoaWMgcG9saWN5LgorIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCisjIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgorIyBpbXBsZW1lbnRhdGlvbnMuCiAjCi0jIFRoZSBkZWZhdWx0IHNldCBvZiBkaXJlY3RvcmllcyBpczoKLSMKLSMgICAgIGxpbWl0ZWQgfCB1bmxpbWl0ZWQKLSMKLSMgaG93ZXZlciBvdGhlciBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KLSMKLSMgVG8gc3VwcG9ydCBvbGRlciBKREsgVXBkYXRlIHJlbGVhc2VzLCB0aGUgY3J5cHRvLnBvbGljeSBwcm9wZXJ0eQotIyBpcyBub3QgZGVmaW5lZCBieSBkZWZhdWx0LiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgYW4KLSMgdXBkYXRlIHJlbGVhc2UgYmluYXJ5IGF3YXJlIG9mIHRoZSBuZXcgcHJvcGVydHkgd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotIyBsb2dpYyB0byBkZWNpZGUgd2hhdCBjcnlwdG8gcG9saWN5IGZpbGVzIGdldCB1c2VkIDoKLSMKLSMgKiBJZiB0aGUgVVNfZXhwb3J0X3BvbGljeS5qYXIgYW5kIGxvY2FsX3BvbGljeS5qYXIgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgaW4gdGhlIChsZWdhY3kpIDxqYXZhLWhvbWU+L2xpYi9zZWN1cml0eSBkaXJlY3RvcnksIHRoZW4gdGhlIHJ1bGVzCi0jIGVtYmVkZGVkIGluIHRob3NlIGphciBmaWxlcyB3aWxsIGJlIHVzZWQuIFRoaXMgaGVscHMgcHJlc2VydmUgY29tcGF0aWJpbGl0eQotIyBmb3IgdXNlcnMgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIgaW5zdGFsbGF0aW9uLgotIwotIyAqIElmIGNyeXB0by5wb2xpY3kgaXMgbm90IGRlZmluZWQgYW5kIG5vIHN1Y2ggamFyIGZpbGVzIGFyZSBwcmVzZW50IGluCi0jIHRoZSBsZWdhY3kgbG9jYXRpb25zLCB0aGVuIHRoZSBKREsgd2lsbCB1c2UgdGhlIGxpbWl0ZWQgc2V0dGluZ3MKLSMgKGVxdWl2YWxlbnQgdG8gY3J5cHRvLnBvbGljeT1saW1pdGVkKQotIwotIyBQbGVhc2Ugc2VlIHRoZSBKQ0EgZG9jdW1lbnRhdGlvbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZQotIyBmaWxlcyBhbmQgZm9ybWF0cy4KLSNjcnlwdG8ucG9saWN5PXVubGltaXRlZAoramRrLmphci5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNCwgXAorICAgICAgRFNBIGtleVNpemUgPCAxMDI0CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LWxpbnV4IGIvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1saW51eAppbmRleCBjMjljMjViLi41MWU3NzM4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LWxpbnV4CisrKyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktbGludXgKQEAgLTQ4Myw0MyArNDgzLDYgQEAKICMKIGpkay5jZXJ0cGF0aC5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNAogCi0jIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIHNpZ25lZCBKQVIgZmlsZXMKLSMKLSMgSW4gc29tZSBlbnZpcm9ubWVudHMsIGNlcnRhaW4gYWxnb3JpdGhtcyBvciBrZXkgbGVuZ3RocyBtYXkgYmUgdW5kZXNpcmFibGUKLSMgZm9yIHNpZ25lZCBKQVIgdmFsaWRhdGlvbi4gIEZvciBleGFtcGxlLCAiTUQyIiBpcyBnZW5lcmFsbHkgbm8gbG9uZ2VyCi0jIGNvbnNpZGVyZWQgdG8gYmUgYSBzZWN1cmUgaGFzaCBhbGdvcml0aG0uICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZQotIyBtZWNoYW5pc20gZm9yIGRpc2FibGluZyBhbGdvcml0aG1zIGJhc2VkIG9uIGFsZ29yaXRobSBuYW1lIGFuZC9vciBrZXkgbGVuZ3RoLgotIyBKQVJzIHNpZ25lZCB3aXRoIGFueSBvZiB0aGUgZGlzYWJsZWQgYWxnb3JpdGhtcyBvciBrZXkgc2l6ZXMgd2lsbCBiZSB0cmVhdGVkCi0jIGFzIHVuc2lnbmVkLgotIwotIyBUaGUgc3ludGF4IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG0gc3RyaW5nIGlzIGRlc2NyaWJlZCBhcyBmb2xsb3dzOgotIyAgIERpc2FibGVkQWxnb3JpdGhtczoKLSMgICAgICAgIiBEaXNhYmxlZEFsZ29yaXRobSB7ICwgRGlzYWJsZWRBbGdvcml0aG0gfSAiCi0jCi0jICAgRGlzYWJsZWRBbGdvcml0aG06Ci0jICAgICAgIEFsZ29yaXRobU5hbWUgW0NvbnN0cmFpbnRdCi0jCi0jICAgQWxnb3JpdGhtTmFtZToKLSMgICAgICAgKHNlZSBiZWxvdykKLSMKLSMgICBDb25zdHJhaW50OgotIyAgICAgICBLZXlTaXplQ29uc3RyYWludAotIwotIyAgIEtleVNpemVDb25zdHJhaW50OgotIyAgICAgICBrZXlTaXplIE9wZXJhdG9yIEtleUxlbmd0aAotIwotIyAgIE9wZXJhdG9yOgotIyAgICAgICA8PSB8IDwgfCA9PSB8ICE9IHwgPj0gfCA+Ci0jCi0jICAgS2V5TGVuZ3RoOgotIyAgICAgICBJbnRlZ2VyIHZhbHVlIG9mIHRoZSBhbGdvcml0aG0ncyBrZXkgbGVuZ3RoIGluIGJpdHMKLSMKLSMgTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgSkRLIFJlZmVyZW5jZQotIyBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZXhhbWluZWQgYW5kIHVzZWQgYnkgb3RoZXIKLSMgaW1wbGVtZW50YXRpb25zLgotIwotamRrLmphci5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNAotCiAjIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIFNlY3VyZSBTb2NrZXQgTGF5ZXIvVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5CiAjIChTU0wvVExTKSBwcm9jZXNzaW5nCiAjCkBAIC02NjIsNjcgKzYyNSw0MCBAQAogIyAgICAgICBFRTM4NkJGQiA1QTg5OUZBNSBBRTlGMjQxMSA3QzRCMUZFNiA0OTI4NjY1MSBFQ0U2NTM4MSBcCiAjICAgICAgIEZGRkZGRkZGIEZGRkZGRkZGLCAyfQogCi0jIENyeXB0b2dyYXBoaWMgSnVyaXNkaWN0aW9uIFBvbGljeSBkZWZhdWx0cworIyBBbGdvcml0aG0gcmVzdHJpY3Rpb25zIGZvciBzaWduZWQgSkFSIGZpbGVzCiAjCi0jIER1ZSB0byB0aGUgaW1wb3J0IGNvbnRyb2wgcmVzdHJpY3Rpb25zIG9mIHNvbWUgY291bnRyaWVzLCB0aGUgZGVmYXVsdAotIyBKQ0UgcG9saWN5IGZpbGVzIGFsbG93IGZvciBzdHJvbmcgYnV0ICJsaW1pdGVkIiBjcnlwdG9ncmFwaGljIGtleQotIyBsZW5ndGhzIHRvIGJlIHVzZWQuICBJZiB5b3VyIGNvdW50cnkncyBjcnlwdG9ncmFwaGljIHJlZ3VsYXRpb25zIGFsbG93LAotIyB0aGUgInVubGltaXRlZCIgc3RyZW5ndGggcG9saWN5IGZpbGVzIGNhbiBiZSB1c2VkIGluc3RlYWQsIHdoaWNoIGNvbnRhaW4KLSMgbm8gcmVzdHJpY3Rpb25zIG9uIGNyeXB0b2dyYXBoaWMgc3RyZW5ndGhzLgorIyBJbiBzb21lIGVudmlyb25tZW50cywgY2VydGFpbiBhbGdvcml0aG1zIG9yIGtleSBsZW5ndGhzIG1heSBiZSB1bmRlc2lyYWJsZQorIyBmb3Igc2lnbmVkIEpBUiB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsICJNRDIiIGlzIGdlbmVyYWxseSBubyBsb25nZXIKKyMgY29uc2lkZXJlZCB0byBiZSBhIHNlY3VyZSBoYXNoIGFsZ29yaXRobS4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlCisjIG1lY2hhbmlzbSBmb3IgZGlzYWJsaW5nIGFsZ29yaXRobXMgYmFzZWQgb24gYWxnb3JpdGhtIG5hbWUgYW5kL29yIGtleSBsZW5ndGguCisjIEpBUnMgc2lnbmVkIHdpdGggYW55IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG1zIG9yIGtleSBzaXplcyB3aWxsIGJlIHRyZWF0ZWQKKyMgYXMgdW5zaWduZWQuCiAjCi0jIFlPVSBBUkUgQURWSVNFRCBUTyBDT05TVUxUIFlPVVIgRVhQT1JUL0lNUE9SVCBDT05UUk9MIENPVU5TRUwgT1IgQVRUT1JORVkKLSMgVE8gREVURVJNSU5FIFRIRSBFWEFDVCBSRVFVSVJFTUVOVFMuCisjIFRoZSBzeW50YXggb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobSBzdHJpbmcgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3M6CisjICAgRGlzYWJsZWRBbGdvcml0aG1zOgorIyAgICAgICAiIERpc2FibGVkQWxnb3JpdGhtIHsgLCBEaXNhYmxlZEFsZ29yaXRobSB9ICIKICMKLSMgPGphdmEtaG9tZT4gKGJlbG93KSByZWZlcnMgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgSlJFIHdhcwotIyBpbnN0YWxsZWQuIEl0IGlzIGRldGVybWluZWQgYmFzZWQgb24gd2hldGhlciB5b3UgYXJlIHJ1bm5pbmcgSkNFCi0jIG9uIGEgSlJFIG9yIGEgSlJFIGNvbnRhaW5lZCB3aXRoaW4gdGhlIEphdmEgRGV2ZWxvcG1lbnQgS2l0LCBvcgotIyBKREsoVE0pLiBUaGUgSkRLIGNvbnRhaW5zIHRoZSBKUkUsIGJ1dCBhdCBhIGRpZmZlcmVudCBsZXZlbCBpbiB0aGUKLSMgZmlsZSBoaWVyYXJjaHkuIEZvciBleGFtcGxlLCBpZiB0aGUgSkRLIGlzIGluc3RhbGxlZCBpbgotIyAvaG9tZS91c2VyMS9qZGsxLjguMCBvbiBVbml4IG9yIGluIEM6XGpkazEuOC4wIG9uIFdpbmRvd3MsIHRoZW4KLSMgPGphdmEtaG9tZT4gaXM6CisjICAgRGlzYWJsZWRBbGdvcml0aG06CisjICAgICAgIEFsZ29yaXRobU5hbWUgW0NvbnN0cmFpbnRdCiAjCi0jICAvaG9tZS91c2VyMS9qZGsxLjguMC9qcmUgICAgICAgICAgIFtVbml4XQotIyAgQzpcamRrMS44LjBcanJlICAgICAgICAgICAgICAgICAgICBbV2luZG93c10KKyMgICBBbGdvcml0aG1OYW1lOgorIyAgICAgICAoc2VlIGJlbG93KQogIwotIyBJZiBvbiB0aGUgb3RoZXIgaGFuZCB0aGUgSlJFIGlzIGluc3RhbGxlZCBpbiAvaG9tZS91c2VyMS9qcmUxLjguMAotIyBvbiBVbml4IG9yIGluIEM6XGpyZTEuOC4wIG9uIFdpbmRvd3MsIGFuZCB0aGUgSkRLIGlzIG5vdAotIyBpbnN0YWxsZWQsIHRoZW4gPGphdmEtaG9tZT4gaXM6CisjICAgQ29uc3RyYWludDoKKyMgICAgICAgS2V5U2l6ZUNvbnN0cmFpbnQKICMKLSMgIC9ob21lL3VzZXIxL2pyZTEuOC4wICAgICAgICAgICAgICAgW1VuaXhdCi0jICBDOlxqcmUxLjguMCAgICAgICAgICAgICAgICAgICAgICAgIFtXaW5kb3dzXQorIyAgIEtleVNpemVDb25zdHJhaW50OgorIyAgICAgICBrZXlTaXplIE9wZXJhdG9yIEtleUxlbmd0aAogIwotIyBPbiBXaW5kb3dzLCBmb3IgZWFjaCBKREsgaW5zdGFsbGF0aW9uLCB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbAotIyBKUkVzIGluc3RhbGxlZCB1bmRlciB0aGUgIlByb2dyYW0gRmlsZXMiIGRpcmVjdG9yeS4gUGxlYXNlIG1ha2UKLSMgc3VyZSB0aGF0IHlvdSBpbnN0YWxsIHRoZSB1bmxpbWl0ZWQgc3RyZW5ndGggcG9saWN5IEpBUiBmaWxlcwotIyBmb3IgYWxsIEpSRXMgdGhhdCB5b3UgcGxhbiB0byB1c2UuCisjICAgT3BlcmF0b3I6CisjICAgICAgIDw9IHwgPCB8ID09IHwgIT0gfCA+PSB8ID4KICMKLSMgVGhlIHBvbGljeSBmaWxlcyBhcmUgamFyIGZpbGVzIG9yZ2FuaXplZCBpbnRvIHN1YmRpcmVjdG9yaWVzIG9mCi0jIDxqYXZhLWhvbWU+L2xpYi9zZWN1cml0eS9wb2xpY3kuICBFYWNoIGRpcmVjdG9yeSBjb250YWlucyBhIGNvbXBsZXRlCi0jIHNldCBvZiBwb2xpY3kgZmlsZXMuCisjICAgS2V5TGVuZ3RoOgorIyAgICAgICBJbnRlZ2VyIHZhbHVlIG9mIHRoZSBhbGdvcml0aG0ncyBrZXkgbGVuZ3RoIGluIGJpdHMKICMKLSMgVGhlICJjcnlwdG8ucG9saWN5IiBTZWN1cml0eSBwcm9wZXJ0eSBjb250cm9scyB0aGUgZGlyZWN0b3J5IHNlbGVjdGlvbiwKLSMgYW5kIHRodXMgdGhlIGVmZmVjdGl2ZSBjcnlwdG9ncmFwaGljIHBvbGljeS4KKyMgTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgSkRLIFJlZmVyZW5jZQorIyBpbXBsZW1lbnRhdGlvbi4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZXhhbWluZWQgYW5kIHVzZWQgYnkgb3RoZXIKKyMgaW1wbGVtZW50YXRpb25zLgogIwotIyBUaGUgZGVmYXVsdCBzZXQgb2YgZGlyZWN0b3JpZXMgaXM6Ci0jCi0jICAgICBsaW1pdGVkIHwgdW5saW1pdGVkCi0jCi0jIGhvd2V2ZXIgb3RoZXIgZGlyZWN0b3JpZXMgY2FuIGJlIGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQuCi0jCi0jIFRvIHN1cHBvcnQgb2xkZXIgSkRLIFVwZGF0ZSByZWxlYXNlcywgdGhlIGNyeXB0by5wb2xpY3kgcHJvcGVydHkKLSMgaXMgbm90IGRlZmluZWQgYnkgZGVmYXVsdC4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGRlZmluZWQsIGFuCi0jIHVwZGF0ZSByZWxlYXNlIGJpbmFyeSBhd2FyZSBvZiB0aGUgbmV3IHByb3BlcnR5IHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcKLSMgbG9naWMgdG8gZGVjaWRlIHdoYXQgY3J5cHRvIHBvbGljeSBmaWxlcyBnZXQgdXNlZCA6Ci0jCi0jICogSWYgdGhlIFVTX2V4cG9ydF9wb2xpY3kuamFyIGFuZCBsb2NhbF9wb2xpY3kuamFyIGZpbGVzIGFyZSBsb2NhdGVkCi0jIGluIHRoZSAobGVnYWN5KSA8amF2YS1ob21lPi9saWIvc2VjdXJpdHkgZGlyZWN0b3J5LCB0aGVuIHRoZSBydWxlcwotIyBlbWJlZGRlZCBpbiB0aG9zZSBqYXIgZmlsZXMgd2lsbCBiZSB1c2VkLiBUaGlzIGhlbHBzIHByZXNlcnZlIGNvbXBhdGliaWxpdHkKLSMgZm9yIHVzZXJzIHVwZ3JhZGluZyBmcm9tIGFuIG9sZGVyIGluc3RhbGxhdGlvbi4KLSMKLSMgKiBJZiBjcnlwdG8ucG9saWN5IGlzIG5vdCBkZWZpbmVkIGFuZCBubyBzdWNoIGphciBmaWxlcyBhcmUgcHJlc2VudCBpbgotIyB0aGUgbGVnYWN5IGxvY2F0aW9ucywgdGhlbiB0aGUgSkRLIHdpbGwgdXNlIHRoZSBsaW1pdGVkIHNldHRpbmdzCi0jIChlcXVpdmFsZW50IHRvIGNyeXB0by5wb2xpY3k9bGltaXRlZCkKLSMKLSMgUGxlYXNlIHNlZSB0aGUgSkNBIGRvY3VtZW50YXRpb24gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2UKLSMgZmlsZXMgYW5kIGZvcm1hdHMuCi0jY3J5cHRvLnBvbGljeT11bmxpbWl0ZWQKK2pkay5qYXIuZGlzYWJsZWRBbGdvcml0aG1zPU1EMiwgTUQ1LCBSU0Ega2V5U2l6ZSA8IDEwMjQsIFwKKyAgICAgIERTQSBrZXlTaXplIDwgMTAyNApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1tYWNvc3ggYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeAppbmRleCAxZTEzNWI0Li4xMDI1MjA5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeAorKysgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeApAQCAtNDg2LDQzICs0ODYsNiBAQAogIwogamRrLmNlcnRwYXRoLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0CiAKLSMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3Igc2lnbmVkIEpBUiBmaWxlcwotIwotIyBJbiBzb21lIGVudmlyb25tZW50cywgY2VydGFpbiBhbGdvcml0aG1zIG9yIGtleSBsZW5ndGhzIG1heSBiZSB1bmRlc2lyYWJsZQotIyBmb3Igc2lnbmVkIEpBUiB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsICJNRDIiIGlzIGdlbmVyYWxseSBubyBsb25nZXIKLSMgY29uc2lkZXJlZCB0byBiZSBhIHNlY3VyZSBoYXNoIGFsZ29yaXRobS4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlCi0jIG1lY2hhbmlzbSBmb3IgZGlzYWJsaW5nIGFsZ29yaXRobXMgYmFzZWQgb24gYWxnb3JpdGhtIG5hbWUgYW5kL29yIGtleSBsZW5ndGguCi0jIEpBUnMgc2lnbmVkIHdpdGggYW55IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG1zIG9yIGtleSBzaXplcyB3aWxsIGJlIHRyZWF0ZWQKLSMgYXMgdW5zaWduZWQuCi0jCi0jIFRoZSBzeW50YXggb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobSBzdHJpbmcgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3M6Ci0jICAgRGlzYWJsZWRBbGdvcml0aG1zOgotIyAgICAgICAiIERpc2FibGVkQWxnb3JpdGhtIHsgLCBEaXNhYmxlZEFsZ29yaXRobSB9ICIKLSMKLSMgICBEaXNhYmxlZEFsZ29yaXRobToKLSMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KLSMKLSMgICBBbGdvcml0aG1OYW1lOgotIyAgICAgICAoc2VlIGJlbG93KQotIwotIyAgIENvbnN0cmFpbnQ6Ci0jICAgICAgIEtleVNpemVDb25zdHJhaW50Ci0jCi0jICAgS2V5U2l6ZUNvbnN0cmFpbnQ6Ci0jICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCi0jCi0jICAgT3BlcmF0b3I6Ci0jICAgICAgIDw9IHwgPCB8ID09IHwgIT0gfCA+PSB8ID4KLSMKLSMgICBLZXlMZW5ndGg6Ci0jICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwotIwotIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCi0jIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgotIyBpbXBsZW1lbnRhdGlvbnMuCi0jCi1qZGsuamFyLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0Ci0KICMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3IgU2VjdXJlIFNvY2tldCBMYXllci9UcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkKICMgKFNTTC9UTFMpIHByb2Nlc3NpbmcKICMKQEAgLTY2NSw2NyArNjI4LDQwIEBACiAjICAgICAgIEVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKICMgICAgICAgRkZGRkZGRkYgRkZGRkZGRkYsIDJ9CiAKLSMgQ3J5cHRvZ3JhcGhpYyBKdXJpc2RpY3Rpb24gUG9saWN5IGRlZmF1bHRzCisjIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIHNpZ25lZCBKQVIgZmlsZXMKICMKLSMgRHVlIHRvIHRoZSBpbXBvcnQgY29udHJvbCByZXN0cmljdGlvbnMgb2Ygc29tZSBjb3VudHJpZXMsIHRoZSBkZWZhdWx0Ci0jIEpDRSBwb2xpY3kgZmlsZXMgYWxsb3cgZm9yIHN0cm9uZyBidXQgImxpbWl0ZWQiIGNyeXB0b2dyYXBoaWMga2V5Ci0jIGxlbmd0aHMgdG8gYmUgdXNlZC4gIElmIHlvdXIgY291bnRyeSdzIGNyeXB0b2dyYXBoaWMgcmVndWxhdGlvbnMgYWxsb3csCi0jIHRoZSAidW5saW1pdGVkIiBzdHJlbmd0aCBwb2xpY3kgZmlsZXMgY2FuIGJlIHVzZWQgaW5zdGVhZCwgd2hpY2ggY29udGFpbgotIyBubyByZXN0cmljdGlvbnMgb24gY3J5cHRvZ3JhcGhpYyBzdHJlbmd0aHMuCisjIEluIHNvbWUgZW52aXJvbm1lbnRzLCBjZXJ0YWluIGFsZ29yaXRobXMgb3Iga2V5IGxlbmd0aHMgbWF5IGJlIHVuZGVzaXJhYmxlCisjIGZvciBzaWduZWQgSkFSIHZhbGlkYXRpb24uICBGb3IgZXhhbXBsZSwgIk1EMiIgaXMgZ2VuZXJhbGx5IG5vIGxvbmdlcgorIyBjb25zaWRlcmVkIHRvIGJlIGEgc2VjdXJlIGhhc2ggYWxnb3JpdGhtLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUKKyMgbWVjaGFuaXNtIGZvciBkaXNhYmxpbmcgYWxnb3JpdGhtcyBiYXNlZCBvbiBhbGdvcml0aG0gbmFtZSBhbmQvb3Iga2V5IGxlbmd0aC4KKyMgSkFScyBzaWduZWQgd2l0aCBhbnkgb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobXMgb3Iga2V5IHNpemVzIHdpbGwgYmUgdHJlYXRlZAorIyBhcyB1bnNpZ25lZC4KICMKLSMgWU9VIEFSRSBBRFZJU0VEIFRPIENPTlNVTFQgWU9VUiBFWFBPUlQvSU1QT1JUIENPTlRST0wgQ09VTlNFTCBPUiBBVFRPUk5FWQotIyBUTyBERVRFUk1JTkUgVEhFIEVYQUNUIFJFUVVJUkVNRU5UUy4KKyMgVGhlIHN5bnRheCBvZiB0aGUgZGlzYWJsZWQgYWxnb3JpdGhtIHN0cmluZyBpcyBkZXNjcmliZWQgYXMgZm9sbG93czoKKyMgICBEaXNhYmxlZEFsZ29yaXRobXM6CisjICAgICAgICIgRGlzYWJsZWRBbGdvcml0aG0geyAsIERpc2FibGVkQWxnb3JpdGhtIH0gIgogIwotIyA8amF2YS1ob21lPiAoYmVsb3cpIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKUkUgd2FzCi0jIGluc3RhbGxlZC4gSXQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZyBKQ0UKLSMgb24gYSBKUkUgb3IgYSBKUkUgY29udGFpbmVkIHdpdGhpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQsIG9yCi0jIEpESyhUTSkuIFRoZSBKREsgY29udGFpbnMgdGhlIEpSRSwgYnV0IGF0IGEgZGlmZmVyZW50IGxldmVsIGluIHRoZQotIyBmaWxlIGhpZXJhcmNoeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBKREsgaXMgaW5zdGFsbGVkIGluCi0jIC9ob21lL3VzZXIxL2pkazEuOC4wIG9uIFVuaXggb3IgaW4gQzpcamRrMS44LjAgb24gV2luZG93cywgdGhlbgotIyA8amF2YS1ob21lPiBpczoKKyMgICBEaXNhYmxlZEFsZ29yaXRobToKKyMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KICMKLSMgIC9ob21lL3VzZXIxL2pkazEuOC4wL2pyZSAgICAgICAgICAgW1VuaXhdCi0jICBDOlxqZGsxLjguMFxqcmUgICAgICAgICAgICAgICAgICAgIFtXaW5kb3dzXQorIyAgIEFsZ29yaXRobU5hbWU6CisjICAgICAgIChzZWUgYmVsb3cpCiAjCi0jIElmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSBKUkUgaXMgaW5zdGFsbGVkIGluIC9ob21lL3VzZXIxL2pyZTEuOC4wCi0jIG9uIFVuaXggb3IgaW4gQzpcanJlMS44LjAgb24gV2luZG93cywgYW5kIHRoZSBKREsgaXMgbm90Ci0jIGluc3RhbGxlZCwgdGhlbiA8amF2YS1ob21lPiBpczoKKyMgICBDb25zdHJhaW50OgorIyAgICAgICBLZXlTaXplQ29uc3RyYWludAogIwotIyAgL2hvbWUvdXNlcjEvanJlMS44LjAgICAgICAgICAgICAgICBbVW5peF0KLSMgIEM6XGpyZTEuOC4wICAgICAgICAgICAgICAgICAgICAgICAgW1dpbmRvd3NdCisjICAgS2V5U2l6ZUNvbnN0cmFpbnQ6CisjICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCiAjCi0jIE9uIFdpbmRvd3MsIGZvciBlYWNoIEpESyBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsCi0jIEpSRXMgaW5zdGFsbGVkIHVuZGVyIHRoZSAiUHJvZ3JhbSBGaWxlcyIgZGlyZWN0b3J5LiBQbGVhc2UgbWFrZQotIyBzdXJlIHRoYXQgeW91IGluc3RhbGwgdGhlIHVubGltaXRlZCBzdHJlbmd0aCBwb2xpY3kgSkFSIGZpbGVzCi0jIGZvciBhbGwgSlJFcyB0aGF0IHlvdSBwbGFuIHRvIHVzZS4KKyMgICBPcGVyYXRvcjoKKyMgICAgICAgPD0gfCA8IHwgPT0gfCAhPSB8ID49IHwgPgogIwotIyBUaGUgcG9saWN5IGZpbGVzIGFyZSBqYXIgZmlsZXMgb3JnYW5pemVkIGludG8gc3ViZGlyZWN0b3JpZXMgb2YKLSMgPGphdmEtaG9tZT4vbGliL3NlY3VyaXR5L3BvbGljeS4gIEVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgY29tcGxldGUKLSMgc2V0IG9mIHBvbGljeSBmaWxlcy4KKyMgICBLZXlMZW5ndGg6CisjICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwogIwotIyBUaGUgImNyeXB0by5wb2xpY3kiIFNlY3VyaXR5IHByb3BlcnR5IGNvbnRyb2xzIHRoZSBkaXJlY3Rvcnkgc2VsZWN0aW9uLAotIyBhbmQgdGh1cyB0aGUgZWZmZWN0aXZlIGNyeXB0b2dyYXBoaWMgcG9saWN5LgorIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCisjIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgorIyBpbXBsZW1lbnRhdGlvbnMuCiAjCi0jIFRoZSBkZWZhdWx0IHNldCBvZiBkaXJlY3RvcmllcyBpczoKLSMKLSMgICAgIGxpbWl0ZWQgfCB1bmxpbWl0ZWQKLSMKLSMgaG93ZXZlciBvdGhlciBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KLSMKLSMgVG8gc3VwcG9ydCBvbGRlciBKREsgVXBkYXRlIHJlbGVhc2VzLCB0aGUgY3J5cHRvLnBvbGljeSBwcm9wZXJ0eQotIyBpcyBub3QgZGVmaW5lZCBieSBkZWZhdWx0LiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgYW4KLSMgdXBkYXRlIHJlbGVhc2UgYmluYXJ5IGF3YXJlIG9mIHRoZSBuZXcgcHJvcGVydHkgd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotIyBsb2dpYyB0byBkZWNpZGUgd2hhdCBjcnlwdG8gcG9saWN5IGZpbGVzIGdldCB1c2VkIDoKLSMKLSMgKiBJZiB0aGUgVVNfZXhwb3J0X3BvbGljeS5qYXIgYW5kIGxvY2FsX3BvbGljeS5qYXIgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgaW4gdGhlIChsZWdhY3kpIDxqYXZhLWhvbWU+L2xpYi9zZWN1cml0eSBkaXJlY3RvcnksIHRoZW4gdGhlIHJ1bGVzCi0jIGVtYmVkZGVkIGluIHRob3NlIGphciBmaWxlcyB3aWxsIGJlIHVzZWQuIFRoaXMgaGVscHMgcHJlc2VydmUgY29tcGF0aWJpbGl0eQotIyBmb3IgdXNlcnMgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIgaW5zdGFsbGF0aW9uLgotIwotIyAqIElmIGNyeXB0by5wb2xpY3kgaXMgbm90IGRlZmluZWQgYW5kIG5vIHN1Y2ggamFyIGZpbGVzIGFyZSBwcmVzZW50IGluCi0jIHRoZSBsZWdhY3kgbG9jYXRpb25zLCB0aGVuIHRoZSBKREsgd2lsbCB1c2UgdGhlIGxpbWl0ZWQgc2V0dGluZ3MKLSMgKGVxdWl2YWxlbnQgdG8gY3J5cHRvLnBvbGljeT1saW1pdGVkKQotIwotIyBQbGVhc2Ugc2VlIHRoZSBKQ0EgZG9jdW1lbnRhdGlvbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZQotIyBmaWxlcyBhbmQgZm9ybWF0cy4KLSNjcnlwdG8ucG9saWN5PXVubGltaXRlZAoramRrLmphci5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNCwgXAorICAgICAgRFNBIGtleVNpemUgPCAxMDI0CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXNvbGFyaXMgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXNvbGFyaXMKaW5kZXggZjQyMDljYS4uNDY0YzM4ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1zb2xhcmlzCisrKyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktc29sYXJpcwpAQCAtNDg1LDQzICs0ODUsNiBAQAogIwogamRrLmNlcnRwYXRoLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0CiAKLSMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3Igc2lnbmVkIEpBUiBmaWxlcwotIwotIyBJbiBzb21lIGVudmlyb25tZW50cywgY2VydGFpbiBhbGdvcml0aG1zIG9yIGtleSBsZW5ndGhzIG1heSBiZSB1bmRlc2lyYWJsZQotIyBmb3Igc2lnbmVkIEpBUiB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsICJNRDIiIGlzIGdlbmVyYWxseSBubyBsb25nZXIKLSMgY29uc2lkZXJlZCB0byBiZSBhIHNlY3VyZSBoYXNoIGFsZ29yaXRobS4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlCi0jIG1lY2hhbmlzbSBmb3IgZGlzYWJsaW5nIGFsZ29yaXRobXMgYmFzZWQgb24gYWxnb3JpdGhtIG5hbWUgYW5kL29yIGtleSBsZW5ndGguCi0jIEpBUnMgc2lnbmVkIHdpdGggYW55IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG1zIG9yIGtleSBzaXplcyB3aWxsIGJlIHRyZWF0ZWQKLSMgYXMgdW5zaWduZWQuCi0jCi0jIFRoZSBzeW50YXggb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobSBzdHJpbmcgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3M6Ci0jICAgRGlzYWJsZWRBbGdvcml0aG1zOgotIyAgICAgICAiIERpc2FibGVkQWxnb3JpdGhtIHsgLCBEaXNhYmxlZEFsZ29yaXRobSB9ICIKLSMKLSMgICBEaXNhYmxlZEFsZ29yaXRobToKLSMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KLSMKLSMgICBBbGdvcml0aG1OYW1lOgotIyAgICAgICAoc2VlIGJlbG93KQotIwotIyAgIENvbnN0cmFpbnQ6Ci0jICAgICAgIEtleVNpemVDb25zdHJhaW50Ci0jCi0jICAgS2V5U2l6ZUNvbnN0cmFpbnQ6Ci0jICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCi0jCi0jICAgT3BlcmF0b3I6Ci0jICAgICAgIDw9IHwgPCB8ID09IHwgIT0gfCA+PSB8ID4KLSMKLSMgICBLZXlMZW5ndGg6Ci0jICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwotIwotIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCi0jIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgotIyBpbXBsZW1lbnRhdGlvbnMuCi0jCi1qZGsuamFyLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0Ci0KICMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3IgU2VjdXJlIFNvY2tldCBMYXllci9UcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkKICMgKFNTTC9UTFMpIHByb2Nlc3NpbmcKICMKQEAgLTY2NCw2NyArNjI3LDQwIEBACiAjICAgICAgIEVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKICMgICAgICAgRkZGRkZGRkYgRkZGRkZGRkYsIDJ9CiAKLSMgQ3J5cHRvZ3JhcGhpYyBKdXJpc2RpY3Rpb24gUG9saWN5IGRlZmF1bHRzCisjIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIHNpZ25lZCBKQVIgZmlsZXMKICMKLSMgRHVlIHRvIHRoZSBpbXBvcnQgY29udHJvbCByZXN0cmljdGlvbnMgb2Ygc29tZSBjb3VudHJpZXMsIHRoZSBkZWZhdWx0Ci0jIEpDRSBwb2xpY3kgZmlsZXMgYWxsb3cgZm9yIHN0cm9uZyBidXQgImxpbWl0ZWQiIGNyeXB0b2dyYXBoaWMga2V5Ci0jIGxlbmd0aHMgdG8gYmUgdXNlZC4gIElmIHlvdXIgY291bnRyeSdzIGNyeXB0b2dyYXBoaWMgcmVndWxhdGlvbnMgYWxsb3csCi0jIHRoZSAidW5saW1pdGVkIiBzdHJlbmd0aCBwb2xpY3kgZmlsZXMgY2FuIGJlIHVzZWQgaW5zdGVhZCwgd2hpY2ggY29udGFpbgotIyBubyByZXN0cmljdGlvbnMgb24gY3J5cHRvZ3JhcGhpYyBzdHJlbmd0aHMuCisjIEluIHNvbWUgZW52aXJvbm1lbnRzLCBjZXJ0YWluIGFsZ29yaXRobXMgb3Iga2V5IGxlbmd0aHMgbWF5IGJlIHVuZGVzaXJhYmxlCisjIGZvciBzaWduZWQgSkFSIHZhbGlkYXRpb24uICBGb3IgZXhhbXBsZSwgIk1EMiIgaXMgZ2VuZXJhbGx5IG5vIGxvbmdlcgorIyBjb25zaWRlcmVkIHRvIGJlIGEgc2VjdXJlIGhhc2ggYWxnb3JpdGhtLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUKKyMgbWVjaGFuaXNtIGZvciBkaXNhYmxpbmcgYWxnb3JpdGhtcyBiYXNlZCBvbiBhbGdvcml0aG0gbmFtZSBhbmQvb3Iga2V5IGxlbmd0aC4KKyMgSkFScyBzaWduZWQgd2l0aCBhbnkgb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobXMgb3Iga2V5IHNpemVzIHdpbGwgYmUgdHJlYXRlZAorIyBhcyB1bnNpZ25lZC4KICMKLSMgWU9VIEFSRSBBRFZJU0VEIFRPIENPTlNVTFQgWU9VUiBFWFBPUlQvSU1QT1JUIENPTlRST0wgQ09VTlNFTCBPUiBBVFRPUk5FWQotIyBUTyBERVRFUk1JTkUgVEhFIEVYQUNUIFJFUVVJUkVNRU5UUy4KKyMgVGhlIHN5bnRheCBvZiB0aGUgZGlzYWJsZWQgYWxnb3JpdGhtIHN0cmluZyBpcyBkZXNjcmliZWQgYXMgZm9sbG93czoKKyMgICBEaXNhYmxlZEFsZ29yaXRobXM6CisjICAgICAgICIgRGlzYWJsZWRBbGdvcml0aG0geyAsIERpc2FibGVkQWxnb3JpdGhtIH0gIgogIwotIyA8amF2YS1ob21lPiAoYmVsb3cpIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKUkUgd2FzCi0jIGluc3RhbGxlZC4gSXQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZyBKQ0UKLSMgb24gYSBKUkUgb3IgYSBKUkUgY29udGFpbmVkIHdpdGhpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQsIG9yCi0jIEpESyhUTSkuIFRoZSBKREsgY29udGFpbnMgdGhlIEpSRSwgYnV0IGF0IGEgZGlmZmVyZW50IGxldmVsIGluIHRoZQotIyBmaWxlIGhpZXJhcmNoeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBKREsgaXMgaW5zdGFsbGVkIGluCi0jIC9ob21lL3VzZXIxL2pkazEuOC4wIG9uIFVuaXggb3IgaW4gQzpcamRrMS44LjAgb24gV2luZG93cywgdGhlbgotIyA8amF2YS1ob21lPiBpczoKKyMgICBEaXNhYmxlZEFsZ29yaXRobToKKyMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KICMKLSMgIC9ob21lL3VzZXIxL2pkazEuOC4wL2pyZSAgICAgICAgICAgW1VuaXhdCi0jICBDOlxqZGsxLjguMFxqcmUgICAgICAgICAgICAgICAgICAgIFtXaW5kb3dzXQorIyAgIEFsZ29yaXRobU5hbWU6CisjICAgICAgIChzZWUgYmVsb3cpCiAjCi0jIElmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSBKUkUgaXMgaW5zdGFsbGVkIGluIC9ob21lL3VzZXIxL2pyZTEuOC4wCi0jIG9uIFVuaXggb3IgaW4gQzpcanJlMS44LjAgb24gV2luZG93cywgYW5kIHRoZSBKREsgaXMgbm90Ci0jIGluc3RhbGxlZCwgdGhlbiA8amF2YS1ob21lPiBpczoKKyMgICBDb25zdHJhaW50OgorIyAgICAgICBLZXlTaXplQ29uc3RyYWludAogIwotIyAgL2hvbWUvdXNlcjEvanJlMS44LjAgICAgICAgICAgICAgICBbVW5peF0KLSMgIEM6XGpyZTEuOC4wICAgICAgICAgICAgICAgICAgICAgICAgW1dpbmRvd3NdCisjICAgS2V5U2l6ZUNvbnN0cmFpbnQ6CisjICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCiAjCi0jIE9uIFdpbmRvd3MsIGZvciBlYWNoIEpESyBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsCi0jIEpSRXMgaW5zdGFsbGVkIHVuZGVyIHRoZSAiUHJvZ3JhbSBGaWxlcyIgZGlyZWN0b3J5LiBQbGVhc2UgbWFrZQotIyBzdXJlIHRoYXQgeW91IGluc3RhbGwgdGhlIHVubGltaXRlZCBzdHJlbmd0aCBwb2xpY3kgSkFSIGZpbGVzCi0jIGZvciBhbGwgSlJFcyB0aGF0IHlvdSBwbGFuIHRvIHVzZS4KKyMgICBPcGVyYXRvcjoKKyMgICAgICAgPD0gfCA8IHwgPT0gfCAhPSB8ID49IHwgPgogIwotIyBUaGUgcG9saWN5IGZpbGVzIGFyZSBqYXIgZmlsZXMgb3JnYW5pemVkIGludG8gc3ViZGlyZWN0b3JpZXMgb2YKLSMgPGphdmEtaG9tZT4vbGliL3NlY3VyaXR5L3BvbGljeS4gIEVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgY29tcGxldGUKLSMgc2V0IG9mIHBvbGljeSBmaWxlcy4KKyMgICBLZXlMZW5ndGg6CisjICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwogIwotIyBUaGUgImNyeXB0by5wb2xpY3kiIFNlY3VyaXR5IHByb3BlcnR5IGNvbnRyb2xzIHRoZSBkaXJlY3Rvcnkgc2VsZWN0aW9uLAotIyBhbmQgdGh1cyB0aGUgZWZmZWN0aXZlIGNyeXB0b2dyYXBoaWMgcG9saWN5LgorIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCisjIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgorIyBpbXBsZW1lbnRhdGlvbnMuCiAjCi0jIFRoZSBkZWZhdWx0IHNldCBvZiBkaXJlY3RvcmllcyBpczoKLSMKLSMgICAgIGxpbWl0ZWQgfCB1bmxpbWl0ZWQKLSMKLSMgaG93ZXZlciBvdGhlciBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KLSMKLSMgVG8gc3VwcG9ydCBvbGRlciBKREsgVXBkYXRlIHJlbGVhc2VzLCB0aGUgY3J5cHRvLnBvbGljeSBwcm9wZXJ0eQotIyBpcyBub3QgZGVmaW5lZCBieSBkZWZhdWx0LiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgYW4KLSMgdXBkYXRlIHJlbGVhc2UgYmluYXJ5IGF3YXJlIG9mIHRoZSBuZXcgcHJvcGVydHkgd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotIyBsb2dpYyB0byBkZWNpZGUgd2hhdCBjcnlwdG8gcG9saWN5IGZpbGVzIGdldCB1c2VkIDoKLSMKLSMgKiBJZiB0aGUgVVNfZXhwb3J0X3BvbGljeS5qYXIgYW5kIGxvY2FsX3BvbGljeS5qYXIgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgaW4gdGhlIChsZWdhY3kpIDxqYXZhLWhvbWU+L2xpYi9zZWN1cml0eSBkaXJlY3RvcnksIHRoZW4gdGhlIHJ1bGVzCi0jIGVtYmVkZGVkIGluIHRob3NlIGphciBmaWxlcyB3aWxsIGJlIHVzZWQuIFRoaXMgaGVscHMgcHJlc2VydmUgY29tcGF0aWJpbGl0eQotIyBmb3IgdXNlcnMgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIgaW5zdGFsbGF0aW9uLgotIwotIyAqIElmIGNyeXB0by5wb2xpY3kgaXMgbm90IGRlZmluZWQgYW5kIG5vIHN1Y2ggamFyIGZpbGVzIGFyZSBwcmVzZW50IGluCi0jIHRoZSBsZWdhY3kgbG9jYXRpb25zLCB0aGVuIHRoZSBKREsgd2lsbCB1c2UgdGhlIGxpbWl0ZWQgc2V0dGluZ3MKLSMgKGVxdWl2YWxlbnQgdG8gY3J5cHRvLnBvbGljeT1saW1pdGVkKQotIwotIyBQbGVhc2Ugc2VlIHRoZSBKQ0EgZG9jdW1lbnRhdGlvbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZQotIyBmaWxlcyBhbmQgZm9ybWF0cy4KLSNjcnlwdG8ucG9saWN5PXVubGltaXRlZAoramRrLmphci5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNCwgXAorICAgICAgRFNBIGtleVNpemUgPCAxMDI0CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXdpbmRvd3MgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXdpbmRvd3MKaW5kZXggOTliMTQ2Ni4uZTY3NGQxMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS13aW5kb3dzCisrKyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktd2luZG93cwpAQCAtNDg2LDQzICs0ODYsNiBAQAogIwogamRrLmNlcnRwYXRoLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0CiAKLSMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3Igc2lnbmVkIEpBUiBmaWxlcwotIwotIyBJbiBzb21lIGVudmlyb25tZW50cywgY2VydGFpbiBhbGdvcml0aG1zIG9yIGtleSBsZW5ndGhzIG1heSBiZSB1bmRlc2lyYWJsZQotIyBmb3Igc2lnbmVkIEpBUiB2YWxpZGF0aW9uLiAgRm9yIGV4YW1wbGUsICJNRDIiIGlzIGdlbmVyYWxseSBubyBsb25nZXIKLSMgY29uc2lkZXJlZCB0byBiZSBhIHNlY3VyZSBoYXNoIGFsZ29yaXRobS4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlCi0jIG1lY2hhbmlzbSBmb3IgZGlzYWJsaW5nIGFsZ29yaXRobXMgYmFzZWQgb24gYWxnb3JpdGhtIG5hbWUgYW5kL29yIGtleSBsZW5ndGguCi0jIEpBUnMgc2lnbmVkIHdpdGggYW55IG9mIHRoZSBkaXNhYmxlZCBhbGdvcml0aG1zIG9yIGtleSBzaXplcyB3aWxsIGJlIHRyZWF0ZWQKLSMgYXMgdW5zaWduZWQuCi0jCi0jIFRoZSBzeW50YXggb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobSBzdHJpbmcgaXMgZGVzY3JpYmVkIGFzIGZvbGxvd3M6Ci0jICAgRGlzYWJsZWRBbGdvcml0aG1zOgotIyAgICAgICAiIERpc2FibGVkQWxnb3JpdGhtIHsgLCBEaXNhYmxlZEFsZ29yaXRobSB9ICIKLSMKLSMgICBEaXNhYmxlZEFsZ29yaXRobToKLSMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KLSMKLSMgICBBbGdvcml0aG1OYW1lOgotIyAgICAgICAoc2VlIGJlbG93KQotIwotIyAgIENvbnN0cmFpbnQ6Ci0jICAgICAgIEtleVNpemVDb25zdHJhaW50Ci0jCi0jICAgS2V5U2l6ZUNvbnN0cmFpbnQ6Ci0jICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCi0jCi0jICAgT3BlcmF0b3I6Ci0jICAgICAgIDw9IHwgPCB8ID09IHwgIT0gfCA+PSB8ID4KLSMKLSMgICBLZXlMZW5ndGg6Ci0jICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwotIwotIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCi0jIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgotIyBpbXBsZW1lbnRhdGlvbnMuCi0jCi1qZGsuamFyLmRpc2FibGVkQWxnb3JpdGhtcz1NRDIsIE1ENSwgUlNBIGtleVNpemUgPCAxMDI0Ci0KICMgQWxnb3JpdGhtIHJlc3RyaWN0aW9ucyBmb3IgU2VjdXJlIFNvY2tldCBMYXllci9UcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkKICMgKFNTTC9UTFMpIHByb2Nlc3NpbmcKICMKQEAgLTY2NSw2NyArNjI4LDQwIEBACiAjICAgICAgIEVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKICMgICAgICAgRkZGRkZGRkYgRkZGRkZGRkYsIDJ9CiAKLSMgQ3J5cHRvZ3JhcGhpYyBKdXJpc2RpY3Rpb24gUG9saWN5IGRlZmF1bHRzCisjIEFsZ29yaXRobSByZXN0cmljdGlvbnMgZm9yIHNpZ25lZCBKQVIgZmlsZXMKICMKLSMgRHVlIHRvIHRoZSBpbXBvcnQgY29udHJvbCByZXN0cmljdGlvbnMgb2Ygc29tZSBjb3VudHJpZXMsIHRoZSBkZWZhdWx0Ci0jIEpDRSBwb2xpY3kgZmlsZXMgYWxsb3cgZm9yIHN0cm9uZyBidXQgImxpbWl0ZWQiIGNyeXB0b2dyYXBoaWMga2V5Ci0jIGxlbmd0aHMgdG8gYmUgdXNlZC4gIElmIHlvdXIgY291bnRyeSdzIGNyeXB0b2dyYXBoaWMgcmVndWxhdGlvbnMgYWxsb3csCi0jIHRoZSAidW5saW1pdGVkIiBzdHJlbmd0aCBwb2xpY3kgZmlsZXMgY2FuIGJlIHVzZWQgaW5zdGVhZCwgd2hpY2ggY29udGFpbgotIyBubyByZXN0cmljdGlvbnMgb24gY3J5cHRvZ3JhcGhpYyBzdHJlbmd0aHMuCisjIEluIHNvbWUgZW52aXJvbm1lbnRzLCBjZXJ0YWluIGFsZ29yaXRobXMgb3Iga2V5IGxlbmd0aHMgbWF5IGJlIHVuZGVzaXJhYmxlCisjIGZvciBzaWduZWQgSkFSIHZhbGlkYXRpb24uICBGb3IgZXhhbXBsZSwgIk1EMiIgaXMgZ2VuZXJhbGx5IG5vIGxvbmdlcgorIyBjb25zaWRlcmVkIHRvIGJlIGEgc2VjdXJlIGhhc2ggYWxnb3JpdGhtLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUKKyMgbWVjaGFuaXNtIGZvciBkaXNhYmxpbmcgYWxnb3JpdGhtcyBiYXNlZCBvbiBhbGdvcml0aG0gbmFtZSBhbmQvb3Iga2V5IGxlbmd0aC4KKyMgSkFScyBzaWduZWQgd2l0aCBhbnkgb2YgdGhlIGRpc2FibGVkIGFsZ29yaXRobXMgb3Iga2V5IHNpemVzIHdpbGwgYmUgdHJlYXRlZAorIyBhcyB1bnNpZ25lZC4KICMKLSMgWU9VIEFSRSBBRFZJU0VEIFRPIENPTlNVTFQgWU9VUiBFWFBPUlQvSU1QT1JUIENPTlRST0wgQ09VTlNFTCBPUiBBVFRPUk5FWQotIyBUTyBERVRFUk1JTkUgVEhFIEVYQUNUIFJFUVVJUkVNRU5UUy4KKyMgVGhlIHN5bnRheCBvZiB0aGUgZGlzYWJsZWQgYWxnb3JpdGhtIHN0cmluZyBpcyBkZXNjcmliZWQgYXMgZm9sbG93czoKKyMgICBEaXNhYmxlZEFsZ29yaXRobXM6CisjICAgICAgICIgRGlzYWJsZWRBbGdvcml0aG0geyAsIERpc2FibGVkQWxnb3JpdGhtIH0gIgogIwotIyA8amF2YS1ob21lPiAoYmVsb3cpIHJlZmVycyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKUkUgd2FzCi0jIGluc3RhbGxlZC4gSXQgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB3aGV0aGVyIHlvdSBhcmUgcnVubmluZyBKQ0UKLSMgb24gYSBKUkUgb3IgYSBKUkUgY29udGFpbmVkIHdpdGhpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQsIG9yCi0jIEpESyhUTSkuIFRoZSBKREsgY29udGFpbnMgdGhlIEpSRSwgYnV0IGF0IGEgZGlmZmVyZW50IGxldmVsIGluIHRoZQotIyBmaWxlIGhpZXJhcmNoeS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBKREsgaXMgaW5zdGFsbGVkIGluCi0jIC9ob21lL3VzZXIxL2pkazEuOC4wIG9uIFVuaXggb3IgaW4gQzpcamRrMS44LjAgb24gV2luZG93cywgdGhlbgotIyA8amF2YS1ob21lPiBpczoKKyMgICBEaXNhYmxlZEFsZ29yaXRobToKKyMgICAgICAgQWxnb3JpdGhtTmFtZSBbQ29uc3RyYWludF0KICMKLSMgIC9ob21lL3VzZXIxL2pkazEuOC4wL2pyZSAgICAgICAgICAgW1VuaXhdCi0jICBDOlxqZGsxLjguMFxqcmUgICAgICAgICAgICAgICAgICAgIFtXaW5kb3dzXQorIyAgIEFsZ29yaXRobU5hbWU6CisjICAgICAgIChzZWUgYmVsb3cpCiAjCi0jIElmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSBKUkUgaXMgaW5zdGFsbGVkIGluIC9ob21lL3VzZXIxL2pyZTEuOC4wCi0jIG9uIFVuaXggb3IgaW4gQzpcanJlMS44LjAgb24gV2luZG93cywgYW5kIHRoZSBKREsgaXMgbm90Ci0jIGluc3RhbGxlZCwgdGhlbiA8amF2YS1ob21lPiBpczoKKyMgICBDb25zdHJhaW50OgorIyAgICAgICBLZXlTaXplQ29uc3RyYWludAogIwotIyAgL2hvbWUvdXNlcjEvanJlMS44LjAgICAgICAgICAgICAgICBbVW5peF0KLSMgIEM6XGpyZTEuOC4wICAgICAgICAgICAgICAgICAgICAgICAgW1dpbmRvd3NdCisjICAgS2V5U2l6ZUNvbnN0cmFpbnQ6CisjICAgICAgIGtleVNpemUgT3BlcmF0b3IgS2V5TGVuZ3RoCiAjCi0jIE9uIFdpbmRvd3MsIGZvciBlYWNoIEpESyBpbnN0YWxsYXRpb24sIHRoZXJlIG1heSBiZSBhZGRpdGlvbmFsCi0jIEpSRXMgaW5zdGFsbGVkIHVuZGVyIHRoZSAiUHJvZ3JhbSBGaWxlcyIgZGlyZWN0b3J5LiBQbGVhc2UgbWFrZQotIyBzdXJlIHRoYXQgeW91IGluc3RhbGwgdGhlIHVubGltaXRlZCBzdHJlbmd0aCBwb2xpY3kgSkFSIGZpbGVzCi0jIGZvciBhbGwgSlJFcyB0aGF0IHlvdSBwbGFuIHRvIHVzZS4KKyMgICBPcGVyYXRvcjoKKyMgICAgICAgPD0gfCA8IHwgPT0gfCAhPSB8ID49IHwgPgogIwotIyBUaGUgcG9saWN5IGZpbGVzIGFyZSBqYXIgZmlsZXMgb3JnYW5pemVkIGludG8gc3ViZGlyZWN0b3JpZXMgb2YKLSMgPGphdmEtaG9tZT4vbGliL3NlY3VyaXR5L3BvbGljeS4gIEVhY2ggZGlyZWN0b3J5IGNvbnRhaW5zIGEgY29tcGxldGUKLSMgc2V0IG9mIHBvbGljeSBmaWxlcy4KKyMgICBLZXlMZW5ndGg6CisjICAgICAgIEludGVnZXIgdmFsdWUgb2YgdGhlIGFsZ29yaXRobSdzIGtleSBsZW5ndGggaW4gYml0cwogIwotIyBUaGUgImNyeXB0by5wb2xpY3kiIFNlY3VyaXR5IHByb3BlcnR5IGNvbnRyb2xzIHRoZSBkaXJlY3Rvcnkgc2VsZWN0aW9uLAotIyBhbmQgdGh1cyB0aGUgZWZmZWN0aXZlIGNyeXB0b2dyYXBoaWMgcG9saWN5LgorIyBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBKREsgUmVmZXJlbmNlCisjIGltcGxlbWVudGF0aW9uLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBleGFtaW5lZCBhbmQgdXNlZCBieSBvdGhlcgorIyBpbXBsZW1lbnRhdGlvbnMuCiAjCi0jIFRoZSBkZWZhdWx0IHNldCBvZiBkaXJlY3RvcmllcyBpczoKLSMKLSMgICAgIGxpbWl0ZWQgfCB1bmxpbWl0ZWQKLSMKLSMgaG93ZXZlciBvdGhlciBkaXJlY3RvcmllcyBjYW4gYmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZC4KLSMKLSMgVG8gc3VwcG9ydCBvbGRlciBKREsgVXBkYXRlIHJlbGVhc2VzLCB0aGUgY3J5cHRvLnBvbGljeSBwcm9wZXJ0eQotIyBpcyBub3QgZGVmaW5lZCBieSBkZWZhdWx0LiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgYW4KLSMgdXBkYXRlIHJlbGVhc2UgYmluYXJ5IGF3YXJlIG9mIHRoZSBuZXcgcHJvcGVydHkgd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotIyBsb2dpYyB0byBkZWNpZGUgd2hhdCBjcnlwdG8gcG9saWN5IGZpbGVzIGdldCB1c2VkIDoKLSMKLSMgKiBJZiB0aGUgVVNfZXhwb3J0X3BvbGljeS5qYXIgYW5kIGxvY2FsX3BvbGljeS5qYXIgZmlsZXMgYXJlIGxvY2F0ZWQKLSMgaW4gdGhlIChsZWdhY3kpIDxqYXZhLWhvbWU+L2xpYi9zZWN1cml0eSBkaXJlY3RvcnksIHRoZW4gdGhlIHJ1bGVzCi0jIGVtYmVkZGVkIGluIHRob3NlIGphciBmaWxlcyB3aWxsIGJlIHVzZWQuIFRoaXMgaGVscHMgcHJlc2VydmUgY29tcGF0aWJpbGl0eQotIyBmb3IgdXNlcnMgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIgaW5zdGFsbGF0aW9uLgotIwotIyAqIElmIGNyeXB0by5wb2xpY3kgaXMgbm90IGRlZmluZWQgYW5kIG5vIHN1Y2ggamFyIGZpbGVzIGFyZSBwcmVzZW50IGluCi0jIHRoZSBsZWdhY3kgbG9jYXRpb25zLCB0aGVuIHRoZSBKREsgd2lsbCB1c2UgdGhlIGxpbWl0ZWQgc2V0dGluZ3MKLSMgKGVxdWl2YWxlbnQgdG8gY3J5cHRvLnBvbGljeT1saW1pdGVkKQotIwotIyBQbGVhc2Ugc2VlIHRoZSBKQ0EgZG9jdW1lbnRhdGlvbiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZQotIyBmaWxlcyBhbmQgZm9ybWF0cy4KLSNjcnlwdG8ucG9saWN5PXVubGltaXRlZAoramRrLmphci5kaXNhYmxlZEFsZ29yaXRobXM9TUQyLCBNRDUsIFJTQSBrZXlTaXplIDwgMTAyNCwgXAorICAgICAgRFNBIGtleVNpemUgPCAxMDI0CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9zdW5wa2NzMTEtc29sYXJpcy5jZmcgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9zdW5wa2NzMTEtc29sYXJpcy5jZmcKaW5kZXggMjlhYWU0Ni4uNGNhZGU4ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvc3VucGtjczExLXNvbGFyaXMuY2ZnCisrKyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L3N1bnBrY3MxMS1zb2xhcmlzLmNmZwpAQCAtMTgsNyArMTgsNiBAQAogCiBkaXNhYmxlZE1lY2hhbmlzbXMgPSB7CiAgIENLTV9EU0FfS0VZX1BBSVJfR0VOCi0gIFNlY3VyZVJhbmRvbQogIyB0aGUgZm9sbG93aW5nIG1lY2hhbmlzbXMgYXJlIGRpc2FibGVkIGR1ZSB0byBwZXJmb3JtYW5jZSBpc3N1ZXMKICMgKFNvbGFyaXMgYnVnIDYzMzcxNTcpCiAgIENLTV9EU0FfU0hBMQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi90b29scy9qZGkvU2hhcmVkTWVtb3J5Q29ubmVjdGlvbi5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvY29tL3N1bi90b29scy9qZGkvU2hhcmVkTWVtb3J5Q29ubmVjdGlvbi5jCmluZGV4IGUyOGVmZTYuLjU5MzZiNWEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2NvbS9zdW4vdG9vbHMvamRpL1NoYXJlZE1lbW9yeUNvbm5lY3Rpb24uYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL3Rvb2xzL2pkaS9TaGFyZWRNZW1vcnlDb25uZWN0aW9uLmMKQEAgLTE3NCwyMCArMTc0LDkgQEAKICAgICAgKiBHZXQgdGhlIHBhY2tldCBoZWFkZXIKICAgICAgKi8KICAgICAoKmVudiktPkdldEJ5dGVBcnJheVJlZ2lvbihlbnYsIGIsIDAsIHNpemVvZihwa3RIZWFkZXIpLCBwa3RIZWFkZXIpOwotICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLSAgICAgICAgLyogYiBzaG9ydGVyIHRoYW4gc2l6ZW9mKHBrdEhlYWRlcikgKi8KLSAgICAgICAgcmV0dXJuOwotICAgIH0KIAogICAgIHRvdGFsX2xlbmd0aCA9IChpbnQpcGt0SGVhZGVyWzNdIHwgKChpbnQpcGt0SGVhZGVyWzJdIDw8IDgpIHwKICAgICAgICAgICAgICAgICAgICAoKGludClwa3RIZWFkZXJbMV0gPDwgMTYpIHwgKChpbnQpcGt0SGVhZGVyWzBdIDw8IDI0KTsKLQotICAgIGlmICh0b3RhbF9sZW5ndGggPCBzaXplb2YocGt0SGVhZGVyKSkgewotICAgICAgICB0aHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSkRXUCBoZWFkZXIgaXMgaW5jb3JyZWN0Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICAvKgogICAgICAqIFRoZSBpZCBmaWVsZCBpcyBpbiBiaWcgZW5kaWFuIChhbHNvIGVycm9yQ29kZSBmaWVsZCBpbiB0aGUgY2FzZQogICAgICAqIG9mIHJlcGx5IHBhY2tldHMpLgpAQCAtMjA2LDkgKzE5NSw5IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBKRFdQIHBhY2tldCBpcyBzaXplb2YocGt0SGVhZGVyKSArIGRhdGEKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBKRFdQIHBhY2tldCBpcyAxMSArIGRhdGEKICAgICAgKi8KLSAgICBkYXRhX2xlbmd0aCA9IHRvdGFsX2xlbmd0aCAtIHNpemVvZihwa3RIZWFkZXIpOworICAgIGRhdGFfbGVuZ3RoID0gdG90YWxfbGVuZ3RoIC0gMTE7CiAKICAgICBpZiAoZGF0YV9sZW5ndGggPT0gMCkgewogICAgICAgICBkYXRhID0gTlVMTDsKQEAgLTIyMCw3ICsyMDksNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgKCplbnYpLT5HZXRCeXRlQXJyYXlSZWdpb24oZW52LCBiLCBzaXplb2YocGt0SGVhZGVyKSwgLypzaXplb2YoQ21kUGFja2V0KSs0Ki8gZGF0YV9sZW5ndGgsIGRhdGEpOworICAgICAgICAoKmVudiktPkdldEJ5dGVBcnJheVJlZ2lvbihlbnYsIGIsIDExLCAvKnNpemVvZihDbWRQYWNrZXQpKzQqLyBkYXRhX2xlbmd0aCwgZGF0YSk7CiAgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKICAgICAgICAgICAgIGZyZWUoZGF0YSk7CiAgICAgICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL2lvL2lvX3V0aWwuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvaW8vaW9fdXRpbC5jCmluZGV4IGYyNTZhZjQuLjVkZDgyMjMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvaW8vaW9fdXRpbC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvaW8vaW9fdXRpbC5jCkBAIC0yMTYsNyArMjE2LDYgQEAKICNlbHNlCiAgICAgICAgIHdoeSA9IEpOVV9OZXdTdHJpbmdQbGF0Zm9ybShlbnYsIGJ1Zik7CiAjZW5kaWYKLSAgICAgICAgQ0hFQ0tfTlVMTCh3aHkpOwogICAgIH0KICAgICB4ID0gSk5VX05ld09iamVjdEJ5TmFtZShlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvaW8vRmlsZU5vdEZvdW5kRXhjZXB0aW9uIiwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbGFuZy9DbGFzc0xvYWRlci5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmMKaW5kZXggNDBiMGI4NS4uMWQ5ZGE2NyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9sYW5nL0NsYXNzTG9hZGVyLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogICAgIGlmIChuYW1lICE9IE5VTEwpIHsKICAgICAgICAgdXRmTmFtZSA9IGdldFVURihlbnYsIG5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICBpZiAodXRmTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7CiAgICAgICAgICAgICBnb3RvIGZyZWVfYm9keTsKICAgICAgICAgfQogICAgICAgICBWZXJpZnlGaXhDbGFzc25hbWUodXRmTmFtZSk7CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKICAgICAgICAgdXRmU291cmNlID0gZ2V0VVRGKGVudiwgc291cmNlLCBzb3VyY2VCdWYsIHNpemVvZihzb3VyY2VCdWYpKTsKICAgICAgICAgaWYgKHV0ZlNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7CiAgICAgICAgICAgICBnb3RvIGZyZWVfdXRmTmFtZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC01MTUsNiArNTE3LDcgQEAKICAgICBwcm9jSGFuZGxlID0gZ2V0UHJvY2Vzc0hhbmRsZSgpOwogICAgIGNuYW1lID0gSk5VX0dldFN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBuYW1lLCAwKTsKICAgICBpZiAoY25hbWUgPT0gTlVMTCkgeworICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAvLyBDb3B5IG5hbWUgU2tpcHBpbmcgUFJFRklYCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL2xhbmcvU3lzdGVtLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL2xhbmcvU3lzdGVtLmMKaW5kZXggNWMzNjQ2MC4uY2IwMDQ0ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9sYW5nL1N5c3RlbS5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbGFuZy9TeXN0ZW0uYwpAQCAtNTYsNTYgKzU2LDQ0IEBACiAgICAgcmV0dXJuIEpWTV9JSGFzaENvZGUoZW52LCB4KTsKIH0KIAotI2RlZmluZSBQVVRQUk9QKHByb3BzLCBrZXksIHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICgxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBqc3RyaW5nIGprZXksIGp2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBqb2JqZWN0IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBqa2V5ID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBrZXkpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoamtleSA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBqdmFsID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoanZhbCA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgcHJvcHMsIHB1dElELCBqa2V5LCBqdmFsKTsgXAotICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgXAotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamtleSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwganZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBQVVRQUk9QKHByb3BzLCBrZXksIHZhbCkgXAorICAgIGlmICgxKSB7IFwKKyAgICAgICAganN0cmluZyBqa2V5ID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBrZXkpOyBcCisgICAgICAgIGpzdHJpbmcganZhbCA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgdmFsKTsgXAorICAgICAgICBqb2JqZWN0IHIgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBwcm9wcywgcHV0SUQsIGprZXksIGp2YWwpOyBcCisgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHJldHVybiBOVUxMOyBcCisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqa2V5KTsgXAorICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwganZhbCk7IFwKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHIpOyBcCiAgICAgfSBlbHNlICgodm9pZCkgMCkKIAogLyogICJrZXkiIGlzIGEgY2hhciB0eXBlIHN0cmluZyB3aXRoIG9ubHkgQVNDSUkgY2hhcmFjdGVyIGluIGl0LgogICAgICJ2YWwiIGlzIGEgbmNoYXIgKHR5cGVkZWZlZCBpbiBqYXZhX3Byb3BzLmgpIHR5cGUgc3RyaW5nICAqLwogCi0jZGVmaW5lIFBVVFBST1BfRm9yUGxhdGZvcm1OU3RyaW5nKHByb3BzLCBrZXksIHZhbCkgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGpzdHJpbmcgamtleSwganZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGpvYmplY3QgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGprZXkgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGtleSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChqa2V5ID09IE5VTEwpIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGp2YWwgPSBHZXRTdHJpbmdQbGF0Zm9ybShlbnYsIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChqdmFsID09IE5VTEwpIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHIgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBwcm9wcywgcHV0SUQsIGprZXksIGp2YWwpOyBcCi0gICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHJldHVybiBOVUxMOyAgICAgICAgICAgICBcCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCByKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFBVVFBST1BfRm9yUGxhdGZvcm1OU3RyaW5nKHByb3BzLCBrZXksIHZhbCkgXAorICAgIGlmICgxKSB7IFwKKyAgICAgICAganN0cmluZyBqa2V5ID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBrZXkpOyAgXAorICAgICAgICBqc3RyaW5nIGp2YWwgPSBHZXRTdHJpbmdQbGF0Zm9ybShlbnYsIHZhbCk7IFwKKyAgICAgICAgam9iamVjdCByID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgcHJvcHMsIHB1dElELCBqa2V5LCBqdmFsKTsgXAorICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSByZXR1cm4gTlVMTDsgXAorICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamtleSk7IFwKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGp2YWwpOyBcCisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCByKTsgXAogICAgIH0gZWxzZSAoKHZvaWQpIDApCi0jZGVmaW5lIFJFTU9WRVBST1AocHJvcHMsIGtleSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGpzdHJpbmcgamtleTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGpvYmplY3QgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGprZXkgPSBKTlVfTmV3U3RyaW5nUGxhdGZvcm0oZW52LCBrZXkpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChqa2V5ID09IE5VTEwpIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHIgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBwcm9wcywgcmVtb3ZlSUQsIGprZXkpOyBcCi0gICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHJldHVybiBOVUxMOyAgICAgICAgICBcCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqa2V5KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCByKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFJFTU9WRVBST1AocHJvcHMsIGtleSkgXAorICAgIGlmICgxKSB7IFwKKyAgICAgICAganN0cmluZyBqa2V5ID0gSk5VX05ld1N0cmluZ1BsYXRmb3JtKGVudiwga2V5KTsgXAorICAgICAgICBqb2JqZWN0IHIgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBwcm9wcywgcmVtb3ZlSUQsIGprZXkpOyBcCisgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHJldHVybiBOVUxMOyBcCisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqa2V5KTsgXAorICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgcik7IFwKICAgICB9IGVsc2UgKCh2b2lkKSAwKQotI2RlZmluZSBHRVRQUk9QKHByb3BzLCBrZXksIGpyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGpzdHJpbmcgamtleSA9IEpOVV9OZXdTdHJpbmdQbGF0Zm9ybShlbnYsIGtleSk7ICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoamtleSA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgR0VUUFJPUChwcm9wcywga2V5LCBqcmV0KSBcCisgICAgaWYgKDEpIHsgXAorICAgICAgICBqc3RyaW5nIGprZXkgPSBKTlVfTmV3U3RyaW5nUGxhdGZvcm0oZW52LCBrZXkpOyBcCiAgICAgICAgIGpyZXQgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBwcm9wcywgZ2V0UHJvcElELCBqa2V5KTsgXAotICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgIFwKLSAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGprZXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHJldHVybiBOVUxMOyBcCisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBqa2V5KTsgXAogICAgIH0gZWxzZSAoKHZvaWQpIDApCiAKICNpZm5kZWYgVkVORE9SIC8qIFRoaXJkIHBhcnR5IG1heSBvdmVyd3JpdGUgdGhpcy4gKi8KQEAgLTE4MSwzMSArMTY5LDIzIEBACiBKYXZhX2phdmFfbGFuZ19TeXN0ZW1faW5pdFByb3BlcnRpZXMoSk5JRW52ICplbnYsIGpjbGFzcyBjbGEsIGpvYmplY3QgcHJvcHMpCiB7CiAgICAgY2hhciBidWZbMTI4XTsKLSAgICBqYXZhX3Byb3BzX3QgKnNwcm9wczsKLSAgICBqbWV0aG9kSUQgcHV0SUQsIHJlbW92ZUlELCBnZXRQcm9wSUQ7CisgICAgamF2YV9wcm9wc190ICpzcHJvcHMgPSBHZXRKYXZhUHJvcGVydGllcyhlbnYpOworICAgIGptZXRob2RJRCBwdXRJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCplbnYpLT5HZXRPYmplY3RDbGFzcyhlbnYsIHByb3BzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdXQiLAorICAgICAgICAgICAgIihMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgam1ldGhvZElEIHJlbW92ZUlEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgcHJvcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZSIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICBqbWV0aG9kSUQgZ2V0UHJvcElEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgcHJvcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb3BlcnR5IiwKKyAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpOwogICAgIGpvYmplY3QgcmV0ID0gTlVMTDsKICAgICBqc3RyaW5nIGpWTVZhbCA9IE5VTEw7CiAKLSAgICBzcHJvcHMgPSBHZXRKYXZhUHJvcGVydGllcyhlbnYpOwotICAgIENIRUNLX05VTExfUkVUVVJOKHNwcm9wcywgTlVMTCk7Ci0KLSAgICBwdXRJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgcHJvcHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHV0IiwKLSAgICAgICAgICAgICIoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIENIRUNLX05VTExfUkVUVVJOKHB1dElELCBOVUxMKTsKLQotICAgIHJlbW92ZUlEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBwcm9wcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmUiLAotICAgICAgICAgICAgIihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgQ0hFQ0tfTlVMTF9SRVRVUk4ocmVtb3ZlSUQsIE5VTEwpOwotCi0gICAgZ2V0UHJvcElEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgcHJvcHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFByb3BlcnR5IiwKLSAgICAgICAgICAgICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgIENIRUNLX05VTExfUkVUVVJOKGdldFByb3BJRCwgTlVMTCk7CisgICAgaWYgKHNwcm9wcyA9PSBOVUxMIHx8IHB1dElEID09IE5VTEwgKSByZXR1cm4gTlVMTDsKIAogICAgIFBVVFBST1AocHJvcHMsICJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIsCiAgICAgICAgICAgICBKREtfTUFKT1JfVkVSU0lPTiAiLiIgSkRLX01JTk9SX1ZFUlNJT04pOwpAQCAtNDAyLDcgKzM4Miw2IEBACiAgICAgR0VUUFJPUChwcm9wcywgInN1bi5sb2NhbGUuZm9ybWF0YXNkZWZhdWx0IiwgalZNVmFsKTsKICAgICBpZiAoalZNVmFsKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWwgPSAoKmVudiktPkdldFN0cmluZ1VURkNoYXJzKGVudiwgalZNVmFsLCAwKTsKLSAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4odmFsLCBOVUxMKTsKICAgICAgICAgZm10ZGVmYXVsdCA9ICFzdHJjbXAodmFsLCAidHJ1ZSIpOwogICAgICAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIGpWTVZhbCwgdmFsKTsKICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGpWTVZhbCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25ldC9JbmV0NEFkZHJlc3MuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzcy5jCmluZGV4IGNjNDMyNDEuLjYyYWQzZDYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzcy5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzcy5jCkBAIC0zNCw4ICszNCw2IEBACiBqY2xhc3MgaWE0X2NsYXNzOwogam1ldGhvZElEIGlhNF9jdHJJRDsKIAotc3RhdGljIGludCBpYTRfaW5pdGlhbGl6ZWQgPSAwOwotCiAvKgogICogQ2xhc3M6ICAgICBqYXZhX25ldF9JbmV0NEFkZHJlc3MKICAqIE1ldGhvZDogICAgaW5pdApAQCAtNDMsMTMgKzQxLDkgQEAKICAqLwogSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAogSmF2YV9qYXZhX25ldF9JbmV0NEFkZHJlc3NfaW5pdChKTklFbnYgKmVudiwgamNsYXNzIGNscykgewotICAgIGlmICghaWE0X2luaXRpYWxpemVkKSB7Ci0gICAgICAgIGpjbGFzcyBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDRBZGRyZXNzIik7Ci0gICAgICAgIENIRUNLX05VTEwoYyk7Ci0gICAgICAgIGlhNF9jbGFzcyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgYyk7Ci0gICAgICAgIENIRUNLX05VTEwoaWE0X2NsYXNzKTsKLSAgICAgICAgaWE0X2N0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGlhNF9jbGFzcywgIjxpbml0PiIsICIoKVYiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYTRfY3RySUQpOwotICAgICAgICBpYTRfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KKyAgICBqY2xhc3MgYyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXQ0QWRkcmVzcyIpOworICAgIENIRUNLX05VTEwoYyk7CisgICAgaWE0X2NsYXNzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBjKTsKKyAgICBDSEVDS19OVUxMKGlhNF9jbGFzcyk7CisgICAgaWE0X2N0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGlhNF9jbGFzcywgIjxpbml0PiIsICIoKVYiKTsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXQ2QWRkcmVzcy5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzLmMKaW5kZXggM2QwMTUxYS4uOWI4MjhhZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzLmMKQEAgLTQyLDggKzQyLDYgQEAKIGpmaWVsZElEIGlhNl9zY29wZWlmbmFtZUlEOwogam1ldGhvZElEIGlhNl9jdHJJRDsKIAotc3RhdGljIGludCBpYTZfaW5pdGlhbGl6ZWQgPSAwOwotCiAvKgogICogQ2xhc3M6ICAgICBqYXZhX25ldF9JbmV0NkFkZHJlc3MKICAqIE1ldGhvZDogICAgaW5pdApAQCAtNTEsMjggKzQ5LDI0IEBACiAgKi8KIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKIEphdmFfamF2YV9uZXRfSW5ldDZBZGRyZXNzX2luaXQoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMpIHsKLSAgICBpZiAoIWlhNl9pbml0aWFsaXplZCkgewotICAgICAgICBqY2xhc3MgaWE2aF9jbGFzczsKLSAgICAgICAgamNsYXNzIGMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NkFkZHJlc3MiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChjKTsKLSAgICAgICAgaWE2X2NsYXNzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBjKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYTZfY2xhc3MpOwotICAgICAgICBpYTZoX2NsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDZBZGRyZXNzJEluZXQ2QWRkcmVzc0hvbGRlciIpOwotICAgICAgICBDSEVDS19OVUxMKGlhNmhfY2xhc3MpOwotICAgICAgICBpYTZfaG9sZGVyNklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWE2X2NsYXNzLCAiaG9sZGVyNiIsICJMamF2YS9uZXQvSW5ldDZBZGRyZXNzJEluZXQ2QWRkcmVzc0hvbGRlcjsiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYTZfaG9sZGVyNklEKTsKLSAgICAgICAgaWE2X2lwYWRkcmVzc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWE2aF9jbGFzcywgImlwYWRkcmVzcyIsICJbQiIpOwotICAgICAgICBDSEVDS19OVUxMKGlhNl9pcGFkZHJlc3NJRCk7Ci0gICAgICAgIGlhNl9zY29wZWlkSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBpYTZoX2NsYXNzLCAic2NvcGVfaWQiLCAiSSIpOwotICAgICAgICBDSEVDS19OVUxMKGlhNl9zY29wZWlkSUQpOwotICAgICAgICBpYTZfY2FjaGVkc2NvcGVpZElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWE2X2NsYXNzLCAiY2FjaGVkX3Njb3BlX2lkIiwgIkkiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYTZfY2FjaGVkc2NvcGVpZElEKTsKLSAgICAgICAgaWE2X3Njb3BlaWRzZXRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhNmhfY2xhc3MsICJzY29wZV9pZF9zZXQiLCAiWiIpOwotICAgICAgICBDSEVDS19OVUxMKGlhNl9zY29wZWlkc2V0SUQpOwotICAgICAgICBpYTZfc2NvcGVpZm5hbWVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhNmhfY2xhc3MsICJzY29wZV9pZm5hbWUiLCAiTGphdmEvbmV0L05ldHdvcmtJbnRlcmZhY2U7Iik7Ci0gICAgICAgIENIRUNLX05VTEwoaWE2X3Njb3BlaWZuYW1lSUQpOwotICAgICAgICBpYTZfY3RySUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgaWE2X2NsYXNzLCAiPGluaXQ+IiwgIigpViIpOwotICAgICAgICBDSEVDS19OVUxMKGlhNl9jdHJJRCk7Ci0gICAgICAgIGlhNl9pbml0aWFsaXplZCA9IDE7Ci0gICAgfQorICAgIGpjbGFzcyBpYTZoX2NsYXNzOworICAgIGpjbGFzcyBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDZBZGRyZXNzIik7CisgICAgQ0hFQ0tfTlVMTChjKTsKKyAgICBpYTZfY2xhc3MgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGMpOworICAgIENIRUNLX05VTEwoaWE2X2NsYXNzKTsKKyAgICBpYTZoX2NsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDZBZGRyZXNzJEluZXQ2QWRkcmVzc0hvbGRlciIpOworICAgIENIRUNLX05VTEwoaWE2aF9jbGFzcyk7CisgICAgaWE2X2hvbGRlcjZJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhNl9jbGFzcywgImhvbGRlcjYiLCAiTGphdmEvbmV0L0luZXQ2QWRkcmVzcyRJbmV0NkFkZHJlc3NIb2xkZXI7Iik7CisgICAgQ0hFQ0tfTlVMTChpYTZfaG9sZGVyNklEKTsKKyAgICBpYTZfaXBhZGRyZXNzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBpYTZoX2NsYXNzLCAiaXBhZGRyZXNzIiwgIltCIik7CisgICAgQ0hFQ0tfTlVMTChpYTZfaXBhZGRyZXNzSUQpOworICAgIGlhNl9zY29wZWlkSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBpYTZoX2NsYXNzLCAic2NvcGVfaWQiLCAiSSIpOworICAgIENIRUNLX05VTEwoaWE2X3Njb3BlaWRJRCk7CisgICAgaWE2X2NhY2hlZHNjb3BlaWRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhNl9jbGFzcywgImNhY2hlZF9zY29wZV9pZCIsICJJIik7CisgICAgQ0hFQ0tfTlVMTChpYTZfY2FjaGVkc2NvcGVpZElEKTsKKyAgICBpYTZfc2NvcGVpZHNldElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWE2aF9jbGFzcywgInNjb3BlX2lkX3NldCIsICJaIik7CisgICAgQ0hFQ0tfTlVMTChpYTZfc2NvcGVpZHNldElEKTsKKyAgICBpYTZfc2NvcGVpZm5hbWVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhNmhfY2xhc3MsICJzY29wZV9pZm5hbWUiLCAiTGphdmEvbmV0L05ldHdvcmtJbnRlcmZhY2U7Iik7CisgICAgQ0hFQ0tfTlVMTChpYTZfc2NvcGVpZm5hbWVJRCk7CisgICAgaWE2X2N0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGlhNl9jbGFzcywgIjxpbml0PiIsICIoKVYiKTsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXRBZGRyZXNzLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25ldC9JbmV0QWRkcmVzcy5jCmluZGV4IGEwZDU1YzIuLjYwN2VkMzUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L0luZXRBZGRyZXNzLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvSW5ldEFkZHJlc3MuYwpAQCAtNDEsOCArNDEsNiBAQAogamZpZWxkSUQgaWFjX29yaWdIb3N0TmFtZUlEOwogamZpZWxkSUQgaWFfcHJlZmVySVB2NkFkZHJlc3NJRDsKIAotc3RhdGljIGludCBpYV9pbml0aWFsaXplZCA9IDA7Ci0KIC8qCiAgKiBDbGFzczogICAgIGphdmFfbmV0X0luZXRBZGRyZXNzCiAgKiBNZXRob2Q6ICAgIGluaXQKQEAgLTUwLDI4ICs0OCwyMyBAQAogICovCiBKTklFWFBPUlQgdm9pZCBKTklDQUxMCiBKYXZhX2phdmFfbmV0X0luZXRBZGRyZXNzX2luaXQoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMpIHsKLSAgICBpZiAoIWlhX2luaXRpYWxpemVkKSB7Ci0gICAgICAgIGpjbGFzcyBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJqYXZhL25ldC9JbmV0QWRkcmVzcyIpOwotICAgICAgICBDSEVDS19OVUxMKGMpOwotICAgICAgICBpYV9jbGFzcyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgYyk7Ci0gICAgICAgIENIRUNLX05VTEwoaWFfY2xhc3MpOwotICAgICAgICBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJqYXZhL25ldC9JbmV0QWRkcmVzcyRJbmV0QWRkcmVzc0hvbGRlciIpOwotICAgICAgICBDSEVDS19OVUxMKGMpOwotICAgICAgICBpYWNfY2xhc3MgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGMpOwotICAgICAgICBDSEVDS19OVUxMKGlhY19jbGFzcyk7Ci0gICAgICAgIGlhX2hvbGRlcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFfY2xhc3MsICJob2xkZXIiLCAiTGphdmEvbmV0L0luZXRBZGRyZXNzJEluZXRBZGRyZXNzSG9sZGVyOyIpOwotICAgICAgICBDSEVDS19OVUxMKGlhX2hvbGRlcklEKTsKLSAgICAgICAgaWFfcHJlZmVySVB2NkFkZHJlc3NJRCA9ICgqZW52KS0+R2V0U3RhdGljRmllbGRJRChlbnYsIGlhX2NsYXNzLCAicHJlZmVySVB2NkFkZHJlc3MiLCAiWiIpOwotICAgICAgICBDSEVDS19OVUxMKGlhX3ByZWZlcklQdjZBZGRyZXNzSUQpOworICAgIGpjbGFzcyBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJqYXZhL25ldC9JbmV0QWRkcmVzcyIpOworICAgIENIRUNLX05VTEwoYyk7CisgICAgaWFfY2xhc3MgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGMpOworICAgIENIRUNLX05VTEwoaWFfY2xhc3MpOworICAgIGMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsImphdmEvbmV0L0luZXRBZGRyZXNzJEluZXRBZGRyZXNzSG9sZGVyIik7CisgICAgQ0hFQ0tfTlVMTChjKTsKKyAgICBpYWNfY2xhc3MgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGMpOworICAgIGlhX2hvbGRlcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFfY2xhc3MsICJob2xkZXIiLCAiTGphdmEvbmV0L0luZXRBZGRyZXNzJEluZXRBZGRyZXNzSG9sZGVyOyIpOworICAgIENIRUNLX05VTEwoaWFfaG9sZGVySUQpOworICAgIGlhX3ByZWZlcklQdjZBZGRyZXNzSUQgPSAoKmVudiktPkdldFN0YXRpY0ZpZWxkSUQoZW52LCBpYV9jbGFzcywgInByZWZlcklQdjZBZGRyZXNzIiwgIloiKTsKKyAgICBDSEVDS19OVUxMKGlhX3ByZWZlcklQdjZBZGRyZXNzSUQpOwogCi0gICAgICAgIGlhY19hZGRyZXNzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBpYWNfY2xhc3MsICJhZGRyZXNzIiwgIkkiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYWNfYWRkcmVzc0lEKTsKLSAgICAgICAgaWFjX2ZhbWlseUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFjX2NsYXNzLCAiZmFtaWx5IiwgIkkiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYWNfZmFtaWx5SUQpOwotICAgICAgICBpYWNfaG9zdE5hbWVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhY19jbGFzcywgImhvc3ROYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwotICAgICAgICBDSEVDS19OVUxMKGlhY19ob3N0TmFtZUlEKTsKLSAgICAgICAgaWFjX29yaWdIb3N0TmFtZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFjX2NsYXNzLCAib3JpZ2luYWxIb3N0TmFtZSIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKLSAgICAgICAgQ0hFQ0tfTlVMTChpYWNfb3JpZ0hvc3ROYW1lSUQpOwotICAgICAgICBpYV9pbml0aWFsaXplZCA9IDE7Ci0gICAgfQorICAgIGlhY19hZGRyZXNzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBpYWNfY2xhc3MsICJhZGRyZXNzIiwgIkkiKTsKKyAgICBDSEVDS19OVUxMKGlhY19hZGRyZXNzSUQpOworICAgIGlhY19mYW1pbHlJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGlhY19jbGFzcywgImZhbWlseSIsICJJIik7CisgICAgQ0hFQ0tfTlVMTChpYWNfZmFtaWx5SUQpOworICAgIGlhY19ob3N0TmFtZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFjX2NsYXNzLCAiaG9zdE5hbWUiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0tfTlVMTChpYWNfaG9zdE5hbWVJRCk7CisgICAgaWFjX29yaWdIb3N0TmFtZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgaWFjX2NsYXNzLCAib3JpZ2luYWxIb3N0TmFtZSIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25ldC9uZXRfdXRpbC5jCmluZGV4IDIxOTRlMmUuLjU2ZWRiNjMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvbmV0X3V0aWwuYwpAQCAtNzUsMTQgKzc1LDExIEBACiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIGluaXRJbmV0QWRkcmVzc0lEcyhKTklFbnYgKmVudikgeworc3RhdGljIHZvaWQgaW5pdEluZXRBZGRycyhKTklFbnYgKmVudikgewogICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgSmF2YV9qYXZhX25ldF9JbmV0QWRkcmVzc19pbml0KGVudiwgMCk7Ci0gICAgICAgIEpOVV9DSEVDS19FWENFUFRJT04oZW52KTsKICAgICAgICAgSmF2YV9qYXZhX25ldF9JbmV0NEFkZHJlc3NfaW5pdChlbnYsIDApOwotICAgICAgICBKTlVfQ0hFQ0tfRVhDRVBUSU9OKGVudik7CiAgICAgICAgIEphdmFfamF2YV9uZXRfSW5ldDZBZGRyZXNzX2luaXQoZW52LCAwKTsKLSAgICAgICAgSk5VX0NIRUNLX0VYQ0VQVElPTihlbnYpOwogICAgICAgICBpbml0aWFsaXplZCA9IDE7CiAgICAgfQogfQpAQCAtMTAzLDMyICsxMDAsNDcgQEAKICAqIGdldF8gbWV0aG9kcyB0aGF0IHJldHVybiBvYmplY3RzIHJldHVybiBOVUxMIG9uIGVycm9yLgogICovCiBqb2JqZWN0IGdldEluZXQ2QWRkcmVzc19zY29wZWlmbmFtZShKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaikgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgTlVMTCk7CiAgICAgcmV0dXJuICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBob2xkZXIsIGlhNl9zY29wZWlmbmFtZUlEKTsKIH0KIAogaW50IHNldEluZXQ2QWRkcmVzc19zY29wZWlmbmFtZShKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaiwgam9iamVjdCBzY29wZWlmbmFtZSkgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgSk5JX0ZBTFNFKTsKICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgaG9sZGVyLCBpYTZfc2NvcGVpZm5hbWVJRCwgc2NvcGVpZm5hbWUpOwogICAgIHJldHVybiBKTklfVFJVRTsKIH0KIAogaW50IGdldEluZXQ2QWRkcmVzc19zY29wZWlkX3NldChKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaikgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgLTEpOwogICAgIHJldHVybiAoKmVudiktPkdldEJvb2xlYW5GaWVsZChlbnYsIGhvbGRlciwgaWE2X3Njb3BlaWRzZXRJRCk7CiB9CiAKIGludCBnZXRJbmV0NkFkZHJlc3Nfc2NvcGVpZChKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaikgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgLTEpOwogICAgIHJldHVybiAoKmVudiktPkdldEludEZpZWxkKGVudiwgaG9sZGVyLCBpYTZfc2NvcGVpZElEKTsKIH0KIAogaW50IHNldEluZXQ2QWRkcmVzc19zY29wZWlkKEpOSUVudiAqZW52LCBqb2JqZWN0IGlhT2JqLCBpbnQgc2NvcGVpZCkgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgSk5JX0ZBTFNFKTsKICAgICAoKmVudiktPlNldEludEZpZWxkKGVudiwgaG9sZGVyLCBpYTZfc2NvcGVpZElELCBzY29wZWlkKTsKICAgICBpZiAoc2NvcGVpZCA+IDApIHsKQEAgLTE0Miw2ICsxNTQsNyBAQAogICAgIGpvYmplY3QgaG9sZGVyLCBhZGRyOwogICAgIGpieXRlQXJyYXkgYmFycjsKIAorICAgIGluaXRJbmV0QWRkcnMoZW52KTsKICAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhNl9ob2xkZXI2SUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvbGRlciwgSk5JX0ZBTFNFKTsKICAgICBhZGRyID0gICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBob2xkZXIsIGlhNl9pcGFkZHJlc3NJRCk7CkBAIC0xNTQsNiArMTY3LDcgQEAKICAgICBqb2JqZWN0IGhvbGRlcjsKICAgICBqYnl0ZUFycmF5IGFkZHI7CiAKKyAgICBpbml0SW5ldEFkZHJzKGVudik7CiAgICAgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYTZfaG9sZGVyNklEKTsKICAgICBDSEVDS19OVUxMX1JFVFVSTihob2xkZXIsIEpOSV9GQUxTRSk7CiAgICAgYWRkciA9ICAoamJ5dGVBcnJheSkoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaG9sZGVyLCBpYTZfaXBhZGRyZXNzSUQpOwpAQCAtMTY3LDM5ICsxODEsNTMgQEAKIH0KIAogdm9pZCBzZXRJbmV0QWRkcmVzc19hZGRyKEpOSUVudiAqZW52LCBqb2JqZWN0IGlhT2JqLCBpbnQgYWRkcmVzcykgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYV9ob2xkZXJJRCk7CisgICAgam9iamVjdCBob2xkZXI7CisgICAgaW5pdEluZXRBZGRycyhlbnYpOworICAgIGhvbGRlciA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBpYU9iaiwgaWFfaG9sZGVySUQpOwogICAgICgqZW52KS0+U2V0SW50RmllbGQoZW52LCBob2xkZXIsIGlhY19hZGRyZXNzSUQsIGFkZHJlc3MpOwogfQogCiB2b2lkIHNldEluZXRBZGRyZXNzX2ZhbWlseShKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaiwgaW50IGZhbWlseSkgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYV9ob2xkZXJJRCk7CisgICAgam9iamVjdCBob2xkZXI7CisgICAgaW5pdEluZXRBZGRycyhlbnYpOworICAgIGhvbGRlciA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBpYU9iaiwgaWFfaG9sZGVySUQpOwogICAgICgqZW52KS0+U2V0SW50RmllbGQoZW52LCBob2xkZXIsIGlhY19mYW1pbHlJRCwgZmFtaWx5KTsKIH0KIAogdm9pZCBzZXRJbmV0QWRkcmVzc19ob3N0TmFtZShKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaiwgam9iamVjdCBob3N0KSB7Ci0gICAgam9iamVjdCBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhX2hvbGRlcklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKyAgICBpbml0SW5ldEFkZHJzKGVudik7CisgICAgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYV9ob2xkZXJJRCk7CiAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIGhvbGRlciwgaWFjX2hvc3ROYW1lSUQsIGhvc3QpOwogICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBob2xkZXIsIGlhY19vcmlnSG9zdE5hbWVJRCwgaG9zdCk7CiB9CiAKIGludCBnZXRJbmV0QWRkcmVzc19hZGRyKEpOSUVudiAqZW52LCBqb2JqZWN0IGlhT2JqKSB7Ci0gICAgam9iamVjdCBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhX2hvbGRlcklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKyAgICBpbml0SW5ldEFkZHJzKGVudik7CisgICAgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYV9ob2xkZXJJRCk7CiAgICAgcmV0dXJuICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBob2xkZXIsIGlhY19hZGRyZXNzSUQpOwogfQogCiBpbnQgZ2V0SW5ldEFkZHJlc3NfZmFtaWx5KEpOSUVudiAqZW52LCBqb2JqZWN0IGlhT2JqKSB7Ci0gICAgam9iamVjdCBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhX2hvbGRlcklEKTsKKyAgICBqb2JqZWN0IGhvbGRlcjsKKworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKKyAgICBob2xkZXIgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaWFPYmosIGlhX2hvbGRlcklEKTsKICAgICByZXR1cm4gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGhvbGRlciwgaWFjX2ZhbWlseUlEKTsKIH0KIAogam9iamVjdCBnZXRJbmV0QWRkcmVzc19ob3N0TmFtZShKTklFbnYgKmVudiwgam9iamVjdCBpYU9iaikgewotICAgIGpvYmplY3QgaG9sZGVyID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIGlhT2JqLCBpYV9ob2xkZXJJRCk7CisgICAgam9iamVjdCBob2xkZXI7CisgICAgaW5pdEluZXRBZGRycyhlbnYpOworICAgIGhvbGRlciA9ICgqZW52KS0+R2V0T2JqZWN0RmllbGQoZW52LCBpYU9iaiwgaWFfaG9sZGVySUQpOwogICAgIHJldHVybiAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgaG9sZGVyLCBpYWNfaG9zdE5hbWVJRCk7CiB9CiAKIEpOSUVYUE9SVCBqb2JqZWN0IEpOSUNBTEwKIE5FVF9Tb2NrYWRkclRvSW5ldEFkZHJlc3MoSk5JRW52ICplbnYsIHN0cnVjdCBzb2NrYWRkciAqaGltLCBpbnQgKnBvcnQpIHsKICAgICBqb2JqZWN0IGlhT2JqOworICAgIGluaXRJbmV0QWRkcnMoZW52KTsKICNpZmRlZiBBRl9JTkVUNgogICAgIGlmIChoaW0tPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewogICAgICAgICBqYnl0ZUFycmF5IGlwYWRkcmVzczsKQEAgLTIxMSwxNSArMjM5LDMxIEBACiAgICAgICAgIGpieXRlICpjYWRkciA9IChqYnl0ZSAqKSYoaGltNi0+c2luNl9hZGRyKTsKICAgICAgICAgaWYgKE5FVF9Jc0lQdjRNYXBwZWQoY2FkZHIpKSB7CiAgICAgICAgICAgICBpbnQgYWRkcmVzczsKLSAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICBzdGF0aWMgamNsYXNzIGluZXQ0Q2xzID0gMDsKKyAgICAgICAgICAgIGlmIChpbmV0NENscyA9PSAwKSB7CisgICAgICAgICAgICAgICAgamNsYXNzIGMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NEFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihjLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBpbmV0NENscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgYyk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4oaW5ldDRDbHMsIE5VTEwpOworICAgICAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpbmV0NENscywgaWE0X2N0cklEKTsKICAgICAgICAgICAgIENIRUNLX05VTExfUkVUVVJOKGlhT2JqLCBOVUxMKTsKICAgICAgICAgICAgIGFkZHJlc3MgPSBORVRfSVB2NE1hcHBlZFRvSVB2NChjYWRkcik7CiAgICAgICAgICAgICBzZXRJbmV0QWRkcmVzc19hZGRyKGVudiwgaWFPYmosIGFkZHJlc3MpOwogICAgICAgICAgICAgc2V0SW5ldEFkZHJlc3NfZmFtaWx5KGVudiwgaWFPYmosIElQdjQpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGljIGpjbGFzcyBpbmV0NkNscyA9IDA7CiAgICAgICAgICAgICBqaW50IHNjb3BlOwogICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTZfY2xhc3MsIGlhNl9jdHJJRCk7CisgICAgICAgICAgICBpZiAoaW5ldDZDbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGpjbGFzcyBjID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDZBZGRyZXNzIik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4oYywgTlVMTCk7CisgICAgICAgICAgICAgICAgaW5ldDZDbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGMpOworICAgICAgICAgICAgICAgIENIRUNLX05VTExfUkVUVVJOKGluZXQ2Q2xzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaW5ldDZDbHMsIGlhNl9jdHJJRCk7CiAgICAgICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihpYU9iaiwgTlVMTCk7CiAgICAgICAgICAgICByZXQgPSBzZXRJbmV0NkFkZHJlc3NfaXBhZGRyZXNzKGVudiwgaWFPYmosIChjaGFyICopJihoaW02LT5zaW42X2FkZHIpKTsKICAgICAgICAgICAgIENIRUNLX05VTExfUkVUVVJOKHJldCwgTlVMTCk7CkBAIC0yMzIsNyArMjc2LDE2IEBACiAjZW5kaWYgLyogQUZfSU5FVDYgKi8KICAgICAgICAgewogICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpoaW00ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWhpbTsKLSAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICBzdGF0aWMgamNsYXNzIGluZXQ0Q2xzID0gMDsKKworICAgICAgICAgICAgaWYgKGluZXQ0Q2xzID09IDApIHsKKyAgICAgICAgICAgICAgICBqY2xhc3MgYyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXQ0QWRkcmVzcyIpOworICAgICAgICAgICAgICAgIENIRUNLX05VTExfUkVUVVJOKGMsIE5VTEwpOworICAgICAgICAgICAgICAgIGluZXQ0Q2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBjKTsKKyAgICAgICAgICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihpbmV0NENscywgTlVMTCk7CisgICAgICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGluZXQ0Q2xzLCBpYTRfY3RySUQpOwogICAgICAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4oaWFPYmosIE5VTEwpOwogICAgICAgICAgICAgc2V0SW5ldEFkZHJlc3NfZmFtaWx5KGVudiwgaWFPYmosIElQdjQpOwogICAgICAgICAgICAgc2V0SW5ldEFkZHJlc3NfYWRkcihlbnYsIGlhT2JqLCBudG9obChoaW00LT5zaW5fYWRkci5zX2FkZHIpKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25ldC9uZXRfdXRpbC5oCmluZGV4IGM4YTVlNjguLjkwNjNjM2UgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmV0L25ldF91dGlsLmgKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQvbmV0X3V0aWwuaApAQCAtNTYsOCArNTYsNiBAQAogZXh0ZXJuIGpmaWVsZElEIGlhY19vcmlnSG9zdE5hbWVJRDsKIGV4dGVybiBqZmllbGRJRCBpYV9wcmVmZXJJUHY2QWRkcmVzc0lEOwogCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIGluaXRJbmV0QWRkcmVzc0lEcyhKTklFbnYgKmVudik7Ci0KIC8qKiAoSW5ldDZBZGRyZXNzIGFjY2Vzc29ycykKICAqIHNldF8gbWV0aG9kcyByZXR1cm4gSk5JX1RSVUUgb24gc3VjY2VzcyBKTklfRkFMU0Ugb24gZXJyb3IKICAqIGdldF8gbWV0aG9kcyB0aGF0IHJldHVybiBpbnQvYm9vbGVhbiwgcmV0dXJuIC0xIG9uIGVycm9yCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25pby9CaXRzLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL25pby9CaXRzLmMKaW5kZXggOGJjM2ZmNy4uMjBhYTBkMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uaW8vQml0cy5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL2phdmEvbmlvL0JpdHMuYwpAQCAtNTEsMTMgKzUxLDEwIEBACiAKICNkZWZpbmUgTUJZVEUgMTA0ODU3NgogCi0jZGVmaW5lIEdFVENSSVRJQ0FMX09SX1JFVFVSTihieXRlcywgZW52LCBvYmopIHsgXAorI2RlZmluZSBHRVRDUklUSUNBTChieXRlcywgZW52LCBvYmopIHsgXAogICAgIGJ5dGVzID0gKCplbnYpLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgb2JqLCBOVUxMKTsgXAotICAgIGlmIChieXRlcyA9PSBOVUxMKSAgeyBcCi0gICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikgPT0gTlVMTCkgXAotICAgICAgICAgICAgSk5VX1Rocm93SW50ZXJuYWxFcnJvcihlbnYsICJVbmFibGUgdG8gZ2V0IGFycmF5Iik7IFwKLSAgICAgICAgcmV0dXJuOyBcCi0gICAgfSBcCisgICAgaWYgKGJ5dGVzID09IE5VTEwpIFwKKyAgICAgICAgSk5VX1Rocm93SW50ZXJuYWxFcnJvcihlbnYsICJVbmFibGUgdG8gZ2V0IGFycmF5Iik7IFwKIH0KIAogI2RlZmluZSBSRUxFQVNFQ1JJVElDQUwoYnl0ZXMsIGVudiwgb2JqLCBtb2RlKSB7IFwKQEAgLTg4LDcgKzg1LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc2l6ZSA9IChzaXplX3QpbGVuZ3RoOwogCi0gICAgICAgIEdFVENSSVRJQ0FMX09SX1JFVFVSTihieXRlcywgZW52LCBzcmMpOworICAgICAgICBHRVRDUklUSUNBTChieXRlcywgZW52LCBzcmMpOwogCiAgICAgICAgIHNyY1Nob3J0ID0gKGpzaG9ydCAqKShieXRlcyArIHNyY1Bvcyk7CiAgICAgICAgIGVuZFNob3J0ID0gc3JjU2hvcnQgKyAoc2l6ZSAvIHNpemVvZihqc2hvcnQpKTsKQEAgLTEyMyw3ICsxMjAsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzaXplID0gKHNpemVfdClsZW5ndGg7CiAKLSAgICAgICAgR0VUQ1JJVElDQUxfT1JfUkVUVVJOKGJ5dGVzLCBlbnYsIGRzdCk7CisgICAgICAgIEdFVENSSVRJQ0FMKGJ5dGVzLCBlbnYsIGRzdCk7CiAKICAgICAgICAgZHN0U2hvcnQgPSAoanNob3J0ICopKGJ5dGVzICsgZHN0UG9zKTsKICAgICAgICAgZW5kU2hvcnQgPSBzcmNTaG9ydCArIChzaXplIC8gc2l6ZW9mKGpzaG9ydCkpOwpAQCAtMTU4LDcgKzE1NSw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHNpemUgPSAoc2l6ZV90KWxlbmd0aDsKIAotICAgICAgICBHRVRDUklUSUNBTF9PUl9SRVRVUk4oYnl0ZXMsIGVudiwgc3JjKTsKKyAgICAgICAgR0VUQ1JJVElDQUwoYnl0ZXMsIGVudiwgc3JjKTsKIAogICAgICAgICBzcmNJbnQgPSAoamludCAqKShieXRlcyArIHNyY1Bvcyk7CiAgICAgICAgIGVuZEludCA9IHNyY0ludCArIChzaXplIC8gc2l6ZW9mKGppbnQpKTsKQEAgLTE5Myw3ICsxOTAsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzaXplID0gKHNpemVfdClsZW5ndGg7CiAKLSAgICAgICAgR0VUQ1JJVElDQUxfT1JfUkVUVVJOKGJ5dGVzLCBlbnYsIGRzdCk7CisgICAgICAgIEdFVENSSVRJQ0FMKGJ5dGVzLCBlbnYsIGRzdCk7CiAKICAgICAgICAgZHN0SW50ID0gKGppbnQgKikoYnl0ZXMgKyBkc3RQb3MpOwogICAgICAgICBlbmRJbnQgPSBzcmNJbnQgKyAoc2l6ZSAvIHNpemVvZihqaW50KSk7CkBAIC0yMjgsNyArMjI1LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc2l6ZSA9IChzaXplX3QpbGVuZ3RoOwogCi0gICAgICAgIEdFVENSSVRJQ0FMX09SX1JFVFVSTihieXRlcywgZW52LCBzcmMpOworICAgICAgICBHRVRDUklUSUNBTChieXRlcywgZW52LCBzcmMpOwogCiAgICAgICAgIHNyY0xvbmcgPSAoamxvbmcgKikoYnl0ZXMgKyBzcmNQb3MpOwogICAgICAgICBlbmRMb25nID0gc3JjTG9uZyArIChzaXplIC8gc2l6ZW9mKGpsb25nKSk7CkBAIC0yNjMsNyArMjYwLDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgc2l6ZSA9IChzaXplX3QpbGVuZ3RoOwogCi0gICAgICAgIEdFVENSSVRJQ0FMX09SX1JFVFVSTihieXRlcywgZW52LCBkc3QpOworICAgICAgICBHRVRDUklUSUNBTChieXRlcywgZW52LCBkc3QpOwogCiAgICAgICAgIGRzdExvbmcgPSAoamxvbmcgKikoYnl0ZXMgKyBkc3RQb3MpOwogICAgICAgICBlbmRMb25nID0gc3JjTG9uZyArIChzaXplIC8gc2l6ZW9mKGpsb25nKSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9kZ2lmX2xpYi5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZGdpZl9saWIuYwppbmRleCAxYzFiMjE3Li4yZDNkODgyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9kZ2lmX2xpYi5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvZ2lmbGliL2RnaWZfbGliLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIEdpZkZpbGUtPlNhdmVkSW1hZ2VzID0gTlVMTDsKICAgICBHaWZGaWxlLT5TQ29sb3JNYXAgPSBOVUxMOwogCi0gICAgUHJpdmF0ZSA9IChHaWZGaWxlUHJpdmF0ZVR5cGUgKiljYWxsb2MoMSwgc2l6ZW9mKEdpZkZpbGVQcml2YXRlVHlwZSkpOworICAgIFByaXZhdGUgPSAoR2lmRmlsZVByaXZhdGVUeXBlICopbWFsbG9jKHNpemVvZihHaWZGaWxlUHJpdmF0ZVR5cGUpKTsKICAgICBpZiAoUHJpdmF0ZSA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChFcnJvciAhPSBOVUxMKQogICAgICAgICAgICAgKkVycm9yID0gRF9HSUZfRVJSX05PVF9FTk9VR0hfTUVNOwpAQCAtMTIyLDkgKzEyMiw2IEBACiAgICAgICAgIGZyZWUoKGNoYXIgKilHaWZGaWxlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotCi0gICAgLypAaTFAKi9tZW1zZXQoUHJpdmF0ZSwgJ1wwJywgc2l6ZW9mKEdpZkZpbGVQcml2YXRlVHlwZSkpOwotCiAjaWZkZWYgX1dJTjMyCiAgICAgX3NldG1vZGUoRmlsZUhhbmRsZSwgT19CSU5BUlkpOyAgICAvKiBNYWtlIHN1cmUgaXQgaXMgaW4gYmluYXJ5IG1vZGUuICovCiAjZW5kaWYgLyogX1dJTjMyICovCkBAIC0yMDAsMTQgKzE5NywxMyBAQAogICAgIEdpZkZpbGUtPlNhdmVkSW1hZ2VzID0gTlVMTDsKICAgICBHaWZGaWxlLT5TQ29sb3JNYXAgPSBOVUxMOwogCi0gICAgUHJpdmF0ZSA9IChHaWZGaWxlUHJpdmF0ZVR5cGUgKiljYWxsb2MoMSwgc2l6ZW9mKEdpZkZpbGVQcml2YXRlVHlwZSkpOworICAgIFByaXZhdGUgPSAoR2lmRmlsZVByaXZhdGVUeXBlICopbWFsbG9jKHNpemVvZihHaWZGaWxlUHJpdmF0ZVR5cGUpKTsKICAgICBpZiAoIVByaXZhdGUpIHsKICAgICAgICAgaWYgKEVycm9yICE9IE5VTEwpCiAgICAgICAgICAgICAqRXJyb3IgPSBEX0dJRl9FUlJfTk9UX0VOT1VHSF9NRU07CiAgICAgICAgIGZyZWUoKGNoYXIgKilHaWZGaWxlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIC8qQGkxQCovbWVtc2V0KFByaXZhdGUsICdcMCcsIHNpemVvZihHaWZGaWxlUHJpdmF0ZVR5cGUpKTsKIAogICAgIEdpZkZpbGUtPlByaXZhdGUgPSAodm9pZCAqKVByaXZhdGU7CiAgICAgUHJpdmF0ZS0+RmlsZUhhbmRsZSA9IDA7CkBAIC00MjEsOCArNDE3LDggQEAKIAogICAgIGlmIChHaWZGaWxlLT5TYXZlZEltYWdlcykgewogICAgICAgICBTYXZlZEltYWdlKiBuZXdfc2F2ZWRfaW1hZ2VzID0KLSAgICAgICAgICAgIChTYXZlZEltYWdlICopcmVhbGxvY2FycmF5KEdpZkZpbGUtPlNhdmVkSW1hZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHaWZGaWxlLT5JbWFnZUNvdW50ICsgMSksIHNpemVvZihTYXZlZEltYWdlKSk7CisgICAgICAgICAgICAoU2F2ZWRJbWFnZSAqKXJlYWxsb2MoR2lmRmlsZS0+U2F2ZWRJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNhdmVkSW1hZ2UpICogKEdpZkZpbGUtPkltYWdlQ291bnQgKyAxKSk7CiAgICAgICAgIGlmIChuZXdfc2F2ZWRfaW1hZ2VzID09IE5VTEwpIHsKICAgICAgICAgICAgIEdpZkZpbGUtPkVycm9yID0gRF9HSUZfRVJSX05PVF9FTk9VR0hfTUVNOwogICAgICAgICAgICAgcmV0dXJuIEdJRl9FUlJPUjsKQEAgLTc5MiwxMiArNzg4LDYgQEAKICAgICB9CiAgICAgQml0c1BlclBpeGVsID0gQ29kZVNpemU7CiAKLSAgICAvKiB0aGlzIGNhbiBvbmx5IGhhcHBlbiBvbiBhIHNldmVyZWx5IG1hbGZvcm1lZCBHSUYgKi8KLSAgICBpZiAoQml0c1BlclBpeGVsID4gOCkgewotICAgICAgICBHaWZGaWxlLT5FcnJvciA9IERfR0lGX0VSUl9SRUFEX0ZBSUxFRDsgICAgLyogc29tZXdoYXQgYm9ndXMgZXJyb3IgY29kZSAqLwotICAgICAgICByZXR1cm4gR0lGX0VSUk9SOyAgICAvKiBGYWlsZWQgdG8gcmVhZCBDb2RlIHNpemUuICovCi0gICAgfQotCiAgICAgUHJpdmF0ZS0+QnVmWzBdID0gMDsgICAgLyogSW5wdXQgQnVmZmVyIGVtcHR5LiAqLwogICAgIFByaXZhdGUtPkJpdHNQZXJQaXhlbCA9IEJpdHNQZXJQaXhlbDsKICAgICBQcml2YXRlLT5DbGVhckNvZGUgPSAoMSA8PCBCaXRzUGVyUGl4ZWwpOwpAQCAtMTEzMyw3ICsxMTIzLDcgQEAKICAgICAgICAgICAgICAgaWYgKEltYWdlU2l6ZSA+IChTSVpFX01BWCAvIHNpemVvZihHaWZQaXhlbFR5cGUpKSkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIEdJRl9FUlJPUjsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBzcC0+UmFzdGVyQml0cyA9ICh1bnNpZ25lZCBjaGFyICopcmVhbGxvY2FycmF5KE5VTEwsIEltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgc3AtPlJhc3RlckJpdHMgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhJbWFnZVNpemUgKgogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHaWZQaXhlbFR5cGUpKTsKIAogICAgICAgICAgICAgICBpZiAoc3AtPlJhc3RlckJpdHMgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZ2lmX2xpYi5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZ2lmX2xpYi5oCmluZGV4IGU4ZDcwOTAuLmFhMzU2MzYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvZ2lmbGliL2dpZl9saWIuaAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9naWZfbGliLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2RlZmluZSBHSUZMSUJfTUFKT1IgNQogI2RlZmluZSBHSUZMSUJfTUlOT1IgMQotI2RlZmluZSBHSUZMSUJfUkVMRUFTRSA0CisjZGVmaW5lIEdJRkxJQl9SRUxFQVNFIDEKIAogI2RlZmluZSBHSUZfRVJST1IgICAwCiAjZGVmaW5lIEdJRl9PSyAgICAgIDEKQEAgLTI3NCw5ICsyNzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdpZlBpeGVsVHlwZSBDb2xvclRyYW5zSW4yW10pOwogZXh0ZXJuIGludCBHaWZCaXRTaXplKGludCBuKTsKIAotZXh0ZXJuIHZvaWQgKiByZWFsbG9jYXJyYXkodm9pZCAqb3B0ciwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIFN1cHBvcnQgZm9yIHRoZSBpbi1jb3JlIHN0cnVjdHVyZXMgYWxsb2NhdGlvbiAoc2x1cnAgbW9kZSkuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9naWZhbGxvYy5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvZ2lmYWxsb2MuYwppbmRleCBjYzc4NGQxLi5mN2E2YTNkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9naWZhbGxvYy5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvZ2lmbGliL2dpZmFsbG9jLmMKQEAgLTIxMiw4ICsyMTIsOCBAQAogCiAgICAgICAgIC8qIHBlcmhhcHMgd2UgY2FuIHNocmluayB0aGUgbWFwPyAqLwogICAgICAgICBpZiAoUm91bmRVcFRvIDwgQ29sb3JVbmlvbi0+Q29sb3JDb3VudCkgewotICAgICAgICAgICAgR2lmQ29sb3JUeXBlICpuZXdfbWFwID0gKEdpZkNvbG9yVHlwZSAqKXJlYWxsb2NhcnJheShNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3VuZFVwVG8sIHNpemVvZihHaWZDb2xvclR5cGUpKTsKKyAgICAgICAgICAgIEdpZkNvbG9yVHlwZSAqbmV3X21hcCA9IChHaWZDb2xvclR5cGUgKilyZWFsbG9jKE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHaWZDb2xvclR5cGUpICogUm91bmRVcFRvKTsKICAgICAgICAgICAgIGlmKCBuZXdfbWFwID09IE5VTEwgKSB7CiAgICAgICAgICAgICAgICAgR2lmRnJlZU1hcE9iamVjdChDb2xvclVuaW9uKTsKICAgICAgICAgICAgICAgICByZXR1cm4gKChDb2xvck1hcE9iamVjdCAqKSBOVUxMKTsKQEAgLTI1Niw5ICsyNTYsOSBAQAogICAgIGlmICgqRXh0ZW5zaW9uQmxvY2tzID09IE5VTEwpCiAgICAgICAgICpFeHRlbnNpb25CbG9ja3M9KEV4dGVuc2lvbkJsb2NrICopbWFsbG9jKHNpemVvZihFeHRlbnNpb25CbG9jaykpOwogICAgIGVsc2UgewotICAgICAgICBFeHRlbnNpb25CbG9jayogZXBfbmV3ID0gKEV4dGVuc2lvbkJsb2NrICopcmVhbGxvY2FycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqRXh0ZW5zaW9uQmxvY2tzLCAoKkV4dGVuc2lvbkJsb2NrQ291bnQgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEV4dGVuc2lvbkJsb2NrKSk7CisgICAgICAgIEV4dGVuc2lvbkJsb2NrKiBlcF9uZXcgPSAoRXh0ZW5zaW9uQmxvY2sgKilyZWFsbG9jKCpFeHRlbnNpb25CbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihFeHRlbnNpb25CbG9jaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKkV4dGVuc2lvbkJsb2NrQ291bnQgKyAxKSk7CiAgICAgICAgIGlmKCBlcF9uZXcgPT0gTlVMTCApCiAgICAgICAgICAgICByZXR1cm4gKEdJRl9FUlJPUik7CiAgICAgICAgICpFeHRlbnNpb25CbG9ja3MgPSBlcF9uZXc7CkBAIC0zNDksOCArMzQ5LDggQEAKICAgICBpZiAoR2lmRmlsZS0+U2F2ZWRJbWFnZXMgPT0gTlVMTCkKICAgICAgICAgR2lmRmlsZS0+U2F2ZWRJbWFnZXMgPSAoU2F2ZWRJbWFnZSAqKW1hbGxvYyhzaXplb2YoU2F2ZWRJbWFnZSkpOwogICAgIGVsc2UKLSAgICAgICAgR2lmRmlsZS0+U2F2ZWRJbWFnZXMgPSAoU2F2ZWRJbWFnZSAqKXJlYWxsb2NhcnJheShHaWZGaWxlLT5TYXZlZEltYWdlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR2lmRmlsZS0+SW1hZ2VDb3VudCArIDEpLCBzaXplb2YoU2F2ZWRJbWFnZSkpOworICAgICAgICBHaWZGaWxlLT5TYXZlZEltYWdlcyA9IChTYXZlZEltYWdlICopcmVhbGxvYyhHaWZGaWxlLT5TYXZlZEltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU2F2ZWRJbWFnZSkgKiAoR2lmRmlsZS0+SW1hZ2VDb3VudCArIDEpKTsKIAogICAgIGlmIChHaWZGaWxlLT5TYXZlZEltYWdlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gKChTYXZlZEltYWdlICopTlVMTCk7CkBAIC0zNzksMTAgKzM3OSw5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIG5leHQsIHRoZSByYXN0ZXIgKi8KLSAgICAgICAgICAgIHNwLT5SYXN0ZXJCaXRzID0gKHVuc2lnbmVkIGNoYXIgKilyZWFsbG9jYXJyYXkoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvcHlGcm9tLT5JbWFnZURlc2MuSGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weUZyb20tPkltYWdlRGVzYy5XaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHaWZQaXhlbFR5cGUpKTsKKyAgICAgICAgICAgIHNwLT5SYXN0ZXJCaXRzID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc2l6ZW9mKEdpZlBpeGVsVHlwZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weUZyb20tPkltYWdlRGVzYy5IZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weUZyb20tPkltYWdlRGVzYy5XaWR0aCk7CiAgICAgICAgICAgICBpZiAoc3AtPlJhc3RlckJpdHMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEZyZWVMYXN0U2F2ZWRJbWFnZShHaWZGaWxlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gKFNhdmVkSW1hZ2UgKikoTlVMTCk7CkBAIC0zOTMsOSArMzkyLDkgQEAKIAogICAgICAgICAgICAgLyogZmluYWxseSwgdGhlIGV4dGVuc2lvbiBibG9ja3MgKi8KICAgICAgICAgICAgIGlmIChzcC0+RXh0ZW5zaW9uQmxvY2tzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcC0+RXh0ZW5zaW9uQmxvY2tzID0gKEV4dGVuc2lvbkJsb2NrICopcmVhbGxvY2FycmF5KE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlGcm9tLT5FeHRlbnNpb25CbG9ja0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXh0ZW5zaW9uQmxvY2spKTsKKyAgICAgICAgICAgICAgICBzcC0+RXh0ZW5zaW9uQmxvY2tzID0gKEV4dGVuc2lvbkJsb2NrICopbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRXh0ZW5zaW9uQmxvY2spICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weUZyb20tPkV4dGVuc2lvbkJsb2NrQ291bnQpOwogICAgICAgICAgICAgICAgIGlmIChzcC0+RXh0ZW5zaW9uQmxvY2tzID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgRnJlZUxhc3RTYXZlZEltYWdlKEdpZkZpbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFNhdmVkSW1hZ2UgKikoTlVMTCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9vcGVuYnNkLXJlYWxsb2NhcnJheS5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9naWZsaWIvb3BlbmJzZC1yZWFsbG9jYXJyYXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4NzY3MS4uMDAwMDAwMAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2dpZmxpYi9vcGVuYnNkLXJlYWxsb2NhcnJheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qICAgICRPcGVuQlNEOiByZWFsbG9jYXJyYXkuYyx2IDEuMSAyMDE0LzA1LzA4IDIxOjQzOjQ5IGRlcmFhZHQgRXhwICQgICAgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3R0byBNb2VyYmVlayA8b3R0b0BkcmlqZi5uZXQ+Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKLSAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgotICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKLSAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8qCi0gKiBUaGlzIGlzIHNxcnQoU0laRV9NQVgrMSksIGFzIHMxKnMyIDw9IFNJWkVfTUFYCi0gKiBpZiBib3RoIHMxIDwgTVVMX05PX09WRVJGTE9XIGFuZCBzMiA8IE1VTF9OT19PVkVSRkxPVwotICovCi0jZGVmaW5lIE1VTF9OT19PVkVSRkxPVyAgICAoKHNpemVfdCkxIDw8IChzaXplb2Yoc2l6ZV90KSAqIDQpKQotCi12b2lkICoKLXJlYWxsb2NhcnJheSh2b2lkICpvcHRyLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQotewotICAgIGlmICgobm1lbWIgPj0gTVVMX05PX09WRVJGTE9XIHx8IHNpemUgPj0gTVVMX05PX09WRVJGTE9XKSAmJgotICAgICAgICBubWVtYiA+IDAgJiYgU0laRV9NQVggLyBubWVtYiA8IHNpemUpIHsKLSAgICAgICAgZXJybm8gPSBFTk9NRU07Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvKgotICAgICAqIEhlYWQgb2ZmIHZhcmlhdGlvbnMgaW4gcmVhbGxvYyBiZWhhdmlvciBvbiBkaWZmZXJlbnQKLSAgICAgKiBwbGF0Zm9ybXMgKHJlcG9ydGVkIGJ5IE1hcmtSIDxtcm9nZXJzNkB1c2Vycy5zZi5uZXQ+KQotICAgICAqCi0gICAgICogVGhlIGJlaGF2aW91ciBvZiByZWFsbG9jYXJyYXkgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBpZgotICAgICAqIG5tZW1iIG9yIHNpemUgaXMgemVyby4gSXQgY2FuIHJldHVybiBOVUxMIG9yIG5vbi1OVUxMCi0gICAgICogZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KLSAgICAgKiBodHRwczovL3d3dy5zZWN1cmVjb2RpbmcuY2VydC5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L2MvTUVNMDQtQy5CZXdhcmUrb2YremVyby1sZW5ndGhhbGxvY2F0aW9ucwotICAgICAqCi0gICAgICogSGVyZSBhcmUgc29tZSBleHRyYWN0cyBmcm9tIHJlYWxsb2MgbWFuIHBhZ2VzIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuCi0gICAgICoKLSAgICAgKiB2b2lkIHJlYWxsb2MoIHZvaWQgbWVtYmxvY2ssIHNpemVfdCBzaXplICk7Ci0gICAgICoKLSAgICAgKiBXaW5kb3dzOgotICAgICAqCi0gICAgICogSWYgdGhlcmUgaXMgbm90IGVub3VnaCBhdmFpbGFibGUgbWVtb3J5IHRvIGV4cGFuZCB0aGUgYmxvY2sKLSAgICAgKiB0byB0aGUgZ2l2ZW4gc2l6ZSwgdGhlIG9yaWdpbmFsIGJsb2NrIGlzIGxlZnQgdW5jaGFuZ2VkLAotICAgICAqIGFuZCBOVUxMIGlzIHJldHVybmVkLiAgSWYgc2l6ZSBpcyB6ZXJvLCB0aGVuIHRoZSBibG9jawotICAgICAqIHBvaW50ZWQgdG8gYnkgbWVtYmxvY2sgaXMgZnJlZWQ7IHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTCwKLSAgICAgKiBhbmQgbWVtYmxvY2sgaXMgbGVmdCBwb2ludGluZyBhdCBhIGZyZWVkIGJsb2NrLgotICAgICAqCi0gICAgICogT3BlbkJTRDoKLSAgICAgKgotICAgICAqIElmIHNpemUgb3Igbm1lbWIgaXMgZXF1YWwgdG8gMCwgYSB1bmlxdWUgcG9pbnRlciB0byBhbgotICAgICAqIGFjY2VzcyBwcm90ZWN0ZWQsIHplcm8gc2l6ZWQgb2JqZWN0IGlzIHJldHVybmVkLiBBY2Nlc3MgdmlhCi0gICAgICogdGhpcyBwb2ludGVyIHdpbGwgZ2VuZXJhdGUgYSBTSUdTRUdWIGV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIExpbnV4OgotICAgICAqCi0gICAgICogSWYgc2l6ZSB3YXMgZXF1YWwgdG8gMCwgZWl0aGVyIE5VTEwgb3IgYSBwb2ludGVyIHN1aXRhYmxlCi0gICAgICogdG8gYmUgcGFzc2VkIHRvIGZyZWUoKSBpcyByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIE9TIFg6Ci0gICAgICoKLSAgICAgKiBJZiBzaXplIGlzIHplcm8gYW5kIHB0ciBpcyBub3QgTlVMTCwgYSBuZXcsIG1pbmltdW0gc2l6ZWQKLSAgICAgKiBvYmplY3QgaXMgYWxsb2NhdGVkIGFuZCB0aGUgb3JpZ2luYWwgb2JqZWN0IGlzIGZyZWVkLgotICAgICAqCi0gICAgICogSXQgbG9va3MgbGlrZSBpbWFnZXMgd2l0aCB6ZXJvIHdpZHRoIG9yIGhlaWdodCBjYW4gdHJpZ2dlcgotICAgICAqIHRoaXMsIGFuZCBmdXp6aW5nIGJlaGF2aW91ciB3aWxsIGRpZmZlciBieSBwbGF0Zm9ybSwgc28KLSAgICAgKiBmdXp6aW5nIG9uIG9uZSBwbGF0Zm9ybSBtYXkgbm90IGRldGVjdCB6ZXJvLXNpemUgYWxsb2NhdGlvbgotICAgICAqIHByb2JsZW1zIG9uIG90aGVyIHBsYXRmb3Jtcy4KLSAgICAgKi8KLSAgICBpZiAoc2l6ZSA9PSAwIHx8IG5tZW1iID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZWFsbG9jKG9wdHIsIHNpemUgKiBubWVtYik7Ci19CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2ltYWdlL2pwZWcvaW1hZ2Vpb0pQRUcuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvaW1hZ2UvanBlZy9pbWFnZWlvSlBFRy5jCmluZGV4IDY2ZWI4MGEuLjM0MmZlMjYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvaW1hZ2UvanBlZy9pbWFnZWlvSlBFRy5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvaW1hZ2UvanBlZy9pbWFnZWlvSlBFRy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTUzLDQzICs1NTMsMzAgQEAKIE1FVEhPRERFRih2b2lkKQogc3VuX2pwZWdfb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKIHsKLSAgICBjaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOwotICAgIGpzdHJpbmcgc3RyaW5nOwotICAgIGltYWdlSU9EYXRhUHRyIGRhdGEgPSAoaW1hZ2VJT0RhdGFQdHIpIGNpbmZvLT5jbGllbnRfZGF0YTsKLSAgICBKTklFbnYgKmVudiA9IChKTklFbnYgKilKTlVfR2V0RW52KGp2bSwgSk5JX1ZFUlNJT05fMV8yKTsKLSAgICBqb2JqZWN0IHRoZU9iamVjdDsKKyAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKyAganN0cmluZyBzdHJpbmc7CisgIGltYWdlSU9EYXRhUHRyIGRhdGEgPSAoaW1hZ2VJT0RhdGFQdHIpIGNpbmZvLT5jbGllbnRfZGF0YTsKKyAgSk5JRW52ICplbnYgPSAoSk5JRW52ICopSk5VX0dldEVudihqdm0sIEpOSV9WRVJTSU9OXzFfMik7CisgIGpvYmplY3QgdGhlT2JqZWN0OwogCi0gICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCi0gICAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOworICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOwogCi0gICAgLy8gQ3JlYXRlIGEgbmV3IGphdmEgc3RyaW5nIGZyb20gdGhlIG1lc3NhZ2UKLSAgICBzdHJpbmcgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGJ1ZmZlcik7Ci0gICAgQ0hFQ0tfTlVMTChzdHJpbmcpOworICAvLyBDcmVhdGUgYSBuZXcgamF2YSBzdHJpbmcgZnJvbSB0aGUgbWVzc2FnZQorICBzdHJpbmcgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGJ1ZmZlcik7CisgIENIRUNLX05VTEwoc3RyaW5nKTsKIAotICAgIHRoZU9iamVjdCA9IGRhdGEtPmltYWdlSU9vYmo7CisgIHRoZU9iamVjdCA9IGRhdGEtPmltYWdlSU9vYmo7CiAKLSAgICBpZiAoY2luZm8tPmlzX2RlY29tcHJlc3NvcikgewotICAgICAgICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICpzcmMgPSAoKGpfZGVjb21wcmVzc19wdHIpY2luZm8pLT5zcmM7Ci0gICAgICAgIFJFTEVBU0VfQVJSQVlTKGVudiwgZGF0YSwgc3JjLT5uZXh0X2lucHV0X2J5dGUpOwotICAgICAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgdGhlT2JqZWN0LAotICAgICAgICAgICAgSlBFR0ltYWdlUmVhZGVyX3dhcm5pbmdXaXRoTWVzc2FnZUlELAotICAgICAgICAgICAgc3RyaW5nKTsKLSAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KQotICAgICAgICAgICAgfHwgIUdFVF9BUlJBWVMoZW52LCBkYXRhLCAmKHNyYy0+bmV4dF9pbnB1dF9ieXRlKSkpIHsKLSAgICAgICAgICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQoY2luZm8pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICpkZXN0ID0gKChqX2NvbXByZXNzX3B0ciljaW5mbyktPmRlc3Q7Ci0gICAgICAgIFJFTEVBU0VfQVJSQVlTKGVudiwgZGF0YSwgKGNvbnN0IEpPQ1RFVCAqKShkZXN0LT5uZXh0X291dHB1dF9ieXRlKSk7Ci0gICAgICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCB0aGVPYmplY3QsCi0gICAgICAgICAgICBKUEVHSW1hZ2VXcml0ZXJfd2FybmluZ1dpdGhNZXNzYWdlSUQsCi0gICAgICAgICAgICBzdHJpbmcpOwotICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpCi0gICAgICAgICAgICB8fCAhR0VUX0FSUkFZUyhlbnYsIGRhdGEsCi0gICAgICAgICAgICAoY29uc3QgSk9DVEVUICoqKSgmZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkpKSB7Ci0gICAgICAgICAgICBjaW5mby0+ZXJyLT5lcnJvcl9leGl0KGNpbmZvKTsKLSAgICAgICAgfQotICAgIH0KKyAgaWYgKGNpbmZvLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCB0aGVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdJbWFnZVJlYWRlcl93YXJuaW5nV2l0aE1lc3NhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKTsKKyAgfSBlbHNlIHsKKyAgICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCB0aGVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdJbWFnZVdyaXRlcl93YXJuaW5nV2l0aE1lc3NhZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKTsKKyAgfQogfQogCiAvKiBFbmQgb2YgdmVyYmF0aW0gY29weSBmcm9tIGpwZWdkZWNvZGVyLmMgKi8KQEAgLTEwNTYsNyArMTA0Myw2IEBACiAgICAgICAgIGlmICghR0VUX0FSUkFZUyhlbnYsIGRhdGEsICYoc3JjLT5uZXh0X2lucHV0X2J5dGUpKSkgewogICAgICAgICAgICAgY2luZm8tPmVyci0+ZXJyb3JfZXhpdCgoal9jb21tb25fcHRyKSBjaW5mbyk7CiAgICAgICAgIH0KLSAgICAgICAgUkVMRUFTRV9BUlJBWVMoZW52LCBkYXRhLCBzcmMtPm5leHRfaW5wdXRfYnl0ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE4MTIsMTQgKzE3OTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luZm8tPm51bV9jb21wb25lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVEYXRhKTsKLSAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KQotICAgICAgICAgICAgfHwgIUdFVF9BUlJBWVMoZW52LCBkYXRhLCAmKHNyYy0+bmV4dF9pbnB1dF9ieXRlKSkpIHsKLSAgICAgICAgICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgICB9CiAgICAgICAgIGlmIChyZXNldCkgewogICAgICAgICAgICAganBlZ19hYm9ydF9kZWNvbXByZXNzKGNpbmZvKTsKICAgICAgICAgfQotICAgICAgICBSRUxFQVNFX0FSUkFZUyhlbnYsIGRhdGEsIHNyYy0+bmV4dF9pbnB1dF9ieXRlKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMjAzMCw3ICsyMDExLDYgQEAKICAgICBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoY2luZm8pOwogCiAgICAgaWYgKG51bUJhbmRzICE9ICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMpIHsKLSAgICAgICAgUkVMRUFTRV9BUlJBWVMoZW52LCBkYXRhLCBzcmMtPm5leHRfaW5wdXRfYnl0ZSk7CiAgICAgICAgIEpOVV9UaHJvd0J5TmFtZShlbnYsICJqYXZheC9pbWFnZWlvL0lJT0V4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCB0byBuYXRpdmUgcmVhZEltYWdlIik7CiAgICAgICAgIHJldHVybiBkYXRhLT5hYm9ydEZsYWc7CkBAIC0yMDM5LDcgKzIwMTksNiBAQAogICAgIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPD0gMCB8fAogICAgICAgICBjaW5mby0+aW1hZ2Vfd2lkdGggPiAoMHhmZmZmZmZmZnUgLyAodW5zaWduZWQgaW50KWNpbmZvLT5vdXRwdXRfY29tcG9uZW50cykpCiAgICAgewotICAgICAgICBSRUxFQVNFX0FSUkFZUyhlbnYsIGRhdGEsIHNyYy0+bmV4dF9pbnB1dF9ieXRlKTsKICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgImphdmF4L2ltYWdlaW8vSUlPRXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyIpOwogICAgICAgICByZXR1cm4gZGF0YS0+YWJvcnRGbGFnOwpAQCAtMjA2MywyNCArMjA0MiwxNSBAQAogICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGludGVyZXN0aW5nIHBhc3MuCiAgICAgICAgICAgICBqcGVnX3N0YXJ0X291dHB1dChjaW5mbywgY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKTsKICAgICAgICAgICAgIGlmICh3YW50VXBkYXRlcykgewotICAgICAgICAgICAgICAgIFJFTEVBU0VfQVJSQVlTKGVudiwgZGF0YSwgc3JjLT5uZXh0X2lucHV0X2J5dGUpOwogICAgICAgICAgICAgICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR0ltYWdlUmVhZGVyX3Bhc3NTdGFydGVkSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXItMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KQotICAgICAgICAgICAgICAgICAgICB8fCAhR0VUX0FSUkFZUyhlbnYsIGRhdGEsICYoc3JjLT5uZXh0X2lucHV0X2J5dGUpKSkgewotICAgICAgICAgICAgICAgICAgICBjaW5mby0+ZXJyLT5lcnJvcl9leGl0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAod2FudFVwZGF0ZXMpIHsKLSAgICAgICAgICAgIFJFTEVBU0VfQVJSQVlTKGVudiwgZGF0YSwgc3JjLT5uZXh0X2lucHV0X2J5dGUpOwogICAgICAgICAgICAgKCplbnYpLT5DYWxsVm9pZE1ldGhvZChlbnYsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdJbWFnZVJlYWRlcl9wYXNzU3RhcnRlZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikKLSAgICAgICAgICAgICAgICB8fCAhR0VUX0FSUkFZUyhlbnYsIGRhdGEsICYoc3JjLT5uZXh0X2lucHV0X2J5dGUpKSkgewotICAgICAgICAgICAgICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgICAgICAgfQorCiAgICAgICAgIH0KIAogICAgICAgICAvLyBTa2lwIHVudGlsIHRoZSBmaXJzdCBpbnRlcmVzdGluZyBsaW5lCkBAIC0yMTY4LDEzICsyMTM4LDggQEAKICAgICAgICAgICAgIGRvbmUgPSBUUlVFOwogICAgICAgICB9CiAgICAgICAgIGlmICh3YW50VXBkYXRlcykgewotICAgICAgICAgICAgUkVMRUFTRV9BUlJBWVMoZW52LCBkYXRhLCBzcmMtPm5leHRfaW5wdXRfYnl0ZSk7CiAgICAgICAgICAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR0ltYWdlUmVhZGVyX3Bhc3NDb21wbGV0ZUlEKTsKLSAgICAgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikKLSAgICAgICAgICAgICAgICB8fCAhR0VUX0FSUkFZUyhlbnYsIGRhdGEsICYoc3JjLT5uZXh0X2lucHV0X2J5dGUpKSkgewotICAgICAgICAgICAgICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICB9CkBAIC0yNjY5LDE4ICsyNjM0LDYgQEAKICAgICBSRUxFQVNFX0FSUkFZUyhlbnYsIGRhdGEsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlQXJyYXkodm9pZCoqIGFyciwgamludCBzaXplKSB7Ci0gICAgaW50IGk7Ci0gICAgaWYgKGFyciAhPSBOVUxMKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcnJbaV0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWUoYXJyW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmcmVlKGFycik7Ci0gICAgfQotfQotCiBKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTAogSmF2YV9jb21fc3VuX2ltYWdlaW9fcGx1Z2luc19qcGVnX0pQRUdJbWFnZVdyaXRlcl93cml0ZUltYWdlCiAgICAgKEpOSUVudiAqZW52LApAQCAtMjc4OSw4ICsyNzQyLDYgQEAKICAgICAgICAgICAgICAgICBzY2FsZSA9IChVSU5UOCoqKSBjYWxsb2MobnVtQmFuZHMsIHNpemVvZihVSU5UOCopKTsKIAogICAgICAgICAgICAgICAgIGlmIChzY2FsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBiYW5kU2l6ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZFNpemUsIEpOSV9BQk9SVCk7CiAgICAgICAgICAgICAgICAgICAgIEpOVV9UaHJvd0J5TmFtZSggZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXcml0aW5nIEpQRUcgU3RyZWFtIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7CkBAIC0yODA3LDggKzI3NTgsNiBAQAogICAgICAgICAgICAgICAgICAgICBmcmVlKHNjYWxlW2pdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZnJlZShzY2FsZSk7Ci0gICAgICAgICAgICAgICAgKCplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhlbnYsIGJhbmRTaXplcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRTaXplLCBKTklfQUJPUlQpOwogICAgICAgICAgICAgICAgIEpOVV9UaHJvd0J5TmFtZSggZW52LCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldyaXRpbmcgSlBFRyBTdHJlYW0iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwpAQCAtMjgzMywxNCArMjc4MiwyMSBAQAogICAgIHBiID0gJmRhdGEtPnBpeGVsQnVmOwogCiAgICAgaWYgKHNldFBpeGVsQnVmZmVyKGVudiwgcGIsIGJ1ZmZlcikgPT0gTk9UX09LKSB7Ci0gICAgICAgIGZyZWVBcnJheShzY2FsZSwgbnVtQmFuZHMpOworICAgICAgICBpZiAoc2NhbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NhbGVbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKHNjYWxlW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHNjYWxlKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZGF0YS0+YWJvcnRGbGFnOyAgLy8gV2UgYWxyZWFkeSB0aHJldyBhbiBvdXQgb2YgbWVtb3J5IGV4Y2VwdGlvbgogICAgIH0KIAogICAgIC8vIEFsbG9jYXRlIGEgMS1zY2FubGluZSBidWZmZXIKICAgICBzY2FuTGluZVB0ciA9IChKU0FNUFJPVyltYWxsb2Moc2NhbkxpbmVTaXplKTsKICAgICBpZiAoc2NhbkxpbmVQdHIgPT0gTlVMTCkgewotICAgICAgICBmcmVlQXJyYXkoc2NhbGUsIG51bUJhbmRzKTsKKyAgICAgICAgUkVMRUFTRV9BUlJBWVMoZW52LCBkYXRhLCAoY29uc3QgSk9DVEVUICopKGRlc3QtPm5leHRfb3V0cHV0X2J5dGUpKTsKICAgICAgICAgSk5VX1Rocm93QnlOYW1lKCBlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiV3JpdGluZyBKUEVHIFN0cmVhbSIpOwpAQCAtMjg2Miw3ICsyODE4LDE1IEBACiAgICAgICAgICAgICBKTlVfVGhyb3dCeU5hbWUoZW52LCAiamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24iLCBidWZmZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgZnJlZUFycmF5KHNjYWxlLCBudW1CYW5kcyk7CisgICAgICAgIGlmIChzY2FsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzY2FsZVtpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoc2NhbGVbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUoc2NhbGUpOworICAgICAgICB9CisKICAgICAgICAgZnJlZShzY2FuTGluZVB0cik7CiAgICAgICAgIHJldHVybiBkYXRhLT5hYm9ydEZsYWc7CiAgICAgfQpAQCAtMjkxMCwxMSArMjg3NCw3IEBACiAgICAgaWYgKHFzZWxzKSB7CiAgICAgICAgICgqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoZW52LCBRdGFibGVTZWxlY3RvcnMsIHFzZWxzLCBKTklfQUJPUlQpOwogICAgIH0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgZnJlZUFycmF5KHNjYWxlLCBudW1CYW5kcyk7Ci0gICAgICAgIGZyZWUoc2NhbkxpbmVQdHIpOwotICAgICAgICByZXR1cm4gZGF0YS0+YWJvcnRGbGFnOwotICAgIH0KKyAgICBpZiAoIXN1Y2Nlc3MpIHJldHVybiBkYXRhLT5hYm9ydEZsYWc7CiAKICAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgVFJVRSk7ICAvLyBEaXNhYmxlIHdyaXRpbmcgYW55IGN1cnJlbnQKIApAQCAtMjkzMiw4ICsyODkyLDYgQEAKICAgICBpZiAoR0VUX0FSUkFZUyhlbnYsIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEpPQ1RFVCAqKikoJmRlc3QtPm5leHRfb3V0cHV0X2J5dGUpKSA9PSBOT1RfT0spIHsKICAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICBmcmVlQXJyYXkoc2NhbGUsIG51bUJhbmRzKTsKLSAgICAgICAgZnJlZShzY2FuTGluZVB0cik7CiAgICAgICAgIEpOVV9UaHJvd0J5TmFtZShlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXgvaW1hZ2Vpby9JSU9FeGNlcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IHBpbiBmYWlsZWQiKTsKQEAgLTI5NjgsMTIgKzI5MjYsNyBAQAogICAgICAgICAgICAgY2luZm8tPnNjYW5faW5mbyA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CiAgICAgICAgICAgICBzY2FucHRyID0gKGludCAqKSBjaW5mby0+c2NyaXB0X3NwYWNlOwogICAgICAgICAgICAgc2NhbkRhdGEgPSAoKmVudiktPkdldEludEFycmF5RWxlbWVudHMoZW52LCBzY2FuSW5mbywgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoc2NhbkRhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFJFTEVBU0VfQVJSQVlTKGVudiwgZGF0YSwgKGNvbnN0IEpPQ1RFVCAqKShkZXN0LT5uZXh0X291dHB1dF9ieXRlKSk7Ci0gICAgICAgICAgICAgICAgZnJlZUFycmF5KHNjYWxlLCBudW1CYW5kcyk7Ci0gICAgICAgICAgICAgICAgZnJlZShzY2FuTGluZVB0cik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEtPmFib3J0RmxhZzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX05VTExfUkVUVVJOKHNjYW5EYXRhLCBkYXRhLT5hYm9ydEZsYWcpOwogICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGppbnRzIHBlciBzY2FuIGlzIDkKICAgICAgICAgICAgIC8vIFdlIGF2b2lkIGEgbWVtY3B5IHRvIGhhbmRsZSBkaWZmZXJlbnQgc2l6ZSBpbnRzCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU2NhbnMqOTsgaSsrKSB7CkBAIC0zMDY5LDcgKzMwMjIsMTUgQEAKICAgICAgICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKWNpbmZvKTsKICAgICB9CiAKLSAgICBmcmVlQXJyYXkoc2NhbGUsIG51bUJhbmRzKTsKKyAgICBpZiAoc2NhbGUgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNjYWxlW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHNjYWxlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmVlKHNjYWxlKTsKKyAgICB9CisKICAgICBmcmVlKHNjYW5MaW5lUHRyKTsKICAgICBSRUxFQVNFX0FSUkFZUyhlbnYsIGRhdGEsIE5VTEwpOwogICAgIHJldHVybiBkYXRhLT5hYm9ydEZsYWc7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9DSEFOR0VTIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvQ0hBTkdFUwppbmRleCBmNzk3M2M0Li44ZDlkNTNlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9DSEFOR0VTCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL0NIQU5HRVMKQEAgLTUwODgsOCArNTA4OCw3IEBACiBWZXJzaW9uIDEuNi4xNWJldGEwNSBbTm92ZW1iZXIgNSwgMjAxNF0KICAgVXNlIHBuZ19nZXRfbGlicG5nX3ZlcihOVUxMKSBpbnN0ZWFkIG9mIFBOR19MSUJQTkdfVkVSX1NUUklORyBpbgogICAgIGV4YW1wbGUuYywgcG5ndGVzdC5jLCBhbmQgYXBwbGljYXRpb25zIGluIHRoZSBjb250cmliIGRpcmVjdG9yeS4KLSAgRml4ZWQgYW4gb3V0LW9mLXJhbmdlIHJlYWQgaW4gcG5nX3VzZXJfdmVyc2lvbl9jaGVjaygpIChCdWcgcmVwb3J0IGZyb20KLSAgICBRaXh1ZSBYaWFvLCBDVkUtMjAxNS04NTQwKS4KKyAgQXZvaWQgb3V0LW9mLWJvdW5kcyBtZW1vcnkgYWNjZXNzIGluIHBuZ191c2VyX3ZlcnNpb25fY2hlY2soKS4KICAgU2ltcGxpZmllZCBhbmQgZnV0dXJlLXByb29mZWQgcG5nX3VzZXJfdmVyc2lvbl9jaGVjaygpLgogICBGaXhlZCBHQ0MgdW5zaWduZWQgaW50LT5mbG9hdCB3YXJuaW5ncy4gVmFyaW91cyB2ZXJzaW9ucyBvZiBHQ0MKICAgICBzZWVtIHRvIGdlbmVyYXRlIHdhcm5pbmdzIHdoZW4gYW4gdW5zaWduZWQgdmFsdWUgaXMgaW1wbGljaXRseQpAQCAtNTQ0Nyw3ICs1NDQ2LDcgQEAKIFZlcnNpb24gMS42LjIwYmV0YTAyIFtOb3ZlbWJlciAyMywgMjAxNV0KICAgRml4ZWQgaW5jb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHBuZ19zZXRfUExURSgpIHRoYXQgdXNlcyBwbmdfcHRyCiAgICAgbm90IGluZm9fcHRyLCB0aGF0IGxlZnQgcG5nX3NldF9QTFRFKCkgb3BlbiB0byB0aGUgQ1ZFLTIwMTUtODEyNgotICAgIHZ1bG5lcmFiaWxpdHkuICBGaXhlcyBDVkUtMjAxNS04NDcyLgorICAgIHZ1bG5lcmFiaWxpdHkuCiAKIFZlcnNpb24gMS42LjIwYmV0YTAzIFtOb3ZlbWJlciAyNCwgMjAxNV0KICAgQmFja3BvcnRlZCB0ZXN0cyBmcm9tIGxpYnBuZy0xLjcuMGJldGE2OS4KQEAgLTU0NzIsMTU1ICs1NDcxLDYgQEAKIFZlcnNpb24gMS42LjIwIFtEZWNlbWJlciAzLCAyMDE1XQogICBObyBjaGFuZ2VzLgogCi1WZXJzaW9uIDEuNi4yMWJldGEwMSBbRGVjZW1iZXIgMTEsIDIwMTVdCi0gIEZpeGVkIHN5bnRheCAiJChjb21tYW5kKSIgaW4gdGVzdHMvcG5nc3Rlc3QgdGhhdCBzb21lIHNoZWxscyBvdGhlciB0aGFuCi0gICAgYmFzaCBjb3VsZCBub3QgcGFyc2UgKEJ1ZyByZXBvcnQgYnkgTmVsc29uIEJlZWJlKS4gVXNlIGBjb21tYW5kYCBpbnN0ZWFkLgotCi1WZXJzaW9uIDEuNi4yMWJldGEwMiBbRGVjZW1iZXIgMTQsIDIwMTVdCi0gIE1vdmVkIHBuZ19jaGVja19rZXl3b3JkKCkgZnJvbSBwbmd3dXRpbC5jIHRvIHBuZ3NldC5jCi0gIFJlbW92ZWQgTEUvQkUgZGVwZW5kZW5jaWVzIGluIHBuZ3ZhbGlkLCB0byAnZml4JyB0aGUgY3VycmVudCBwcm9ibGVtCi0gICAgaW4gdGhlIEJpZ0VuZGlhbiB0ZXN0cyBieSBub3QgdGVzdGluZyBpdCwgbWFraW5nIHRoZSBCRSBjb2RlIHRoZSBzYW1lIAotICAgIGFzIHRoZSBMRSB2ZXJzaW9uLgotICBGaXhlcyB0byBwbmd2YWxpZCBmb3IgdmFyaW91cyByZWR1Y2VkIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIChlbGltaW5hdGUgdW51c2VkCi0gICAgc3RhdGljcykgYW5kIGEgZml4IGZvciB0aGUgY2FzZSBpbiByZ2JfdG9fZ3JheSB3aGVuIHRoZSBkaWdpdGl6ZSBvcHRpb24KLSAgICByZWR1Y2VzIGdyYXlsbyB0byAwLCBwcm9kdWNpbmcgYSBsYXJnZSBlcnJvci4KLQotVmVyc2lvbiAxLjYuMjFiZXRhMDMgW0RlY2VtYmVyIDE4LCAyMDE1XQotICBXaWRlbmVkIHRoZSAnbGltaXQnIGNoZWNrIG9uIHRoZSBpbnRlcm5hbGx5IGNhbGN1bGF0ZWQgZXJyb3IgbGltaXRzIGluCi0gICAgdGhlICdESUdJVElaRScgY2FzZSAodGhlIGNvZGUgdXNlZCBwcmlvciB0byAxLjcgZm9yIHJnYl90b19ncmF5IGVycm9yCi0gICAgY2hlY2tzKSBhbmQgY2hhbmdlZCB0aGUgY2hlY2sgdG8gb25seSBvcGVyYXRlIGluIG5vbi1yZWxlYXNlIGJ1aWxkcwotICAgIChiYXNlIGJ1aWxkIHR5cGUgbm90IFJDIG9yIFJFTEVBU0UuKQotICBGaXhlZCB1bmRlZmluZWQgYmVoYXZpb3IgaW4gcG5ndmFsaWQuYywgdW5kZWZpbmVkIGJlY2F1c2UKLSAgICAocG5nX2J5dGUpIDw8IHNoaWZ0IGlzIHVuZGVmaW5lZCBpZiBpdCBjaGFuZ2VzIHRoZSBzaWduZWQgYml0Ci0gICAgKGJlY2F1c2UgcG5nX2J5dGUgaXMgcHJvbW90ZWQgdG8gaW50KS4gVGhlIGxpYnBuZyBleHBvcnRlZCBmdW5jdGlvbnMKLSAgICBwbmdfZ2V0X3VpbnRfMzIgYW5kIHBuZ19nZXRfdWludF8xNiBoYW5kbGUgdGhpcy4gKEJ1ZyByZXBvcnRlZCBieQotICAgIERhdmlkIERyeXNkYWxlIGFzIGEgcmVzdWx0IG9mIHJlcG9ydHMgZnJvbSBVQlNBTiBpbiBjbGFuZyAzLjgpLgotICBUaGlzIGNoYW5nZXMgcG5ndmFsaWQgdG8gdXNlIEJFIHJhbmRvbSBudW1iZXJzOyB0aGlzIHVzZWQgdG8gcHJvZHVjZQotICAgIGVycm9ycyBidXQgdGhlc2Ugc2hvdWxkIG5vdCBiZSBmaXhlZCBhcyBhIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMjFyYzAxIFtKYW51YXJ5IDQsIDIwMTZdCi0gIEluIHByb2plY3RzL3ZzdHVkaW8sIGNvbWJpbmVkIHJlYWRtZS50eHQgYW5kIFdBUk5JTkcgaW50byBSRUFETUUudHh0Ci0KLVZlcnNpb24gMS42LjIxcmMwMiBbSmFudWFyeSA3LCAyMDE2XQotICBSZWxvY2F0ZWQgYXNzZXJ0KCkgaW4gY29udHJpYi90b29scy9wbmdmaXguYywgYnVnIGZvdW5kIGJ5IEFtZXJpY2FuCi0gICAgRnV6enkgTG9wLCByZXBvcnRlZCBieSBCcmlhbiBDYXJwZW50ZXIuCi0gIE1hcmtlZCAnbGltaXQnIFVOVVNFRCBpbiB0cmFuc2Zvcm1fcmFuZ2VfY2hlY2soKS4gIFRoaXMgb25seSBhZmZlY3RzCi0gICAgcmVsZWFzZSBidWlsZHMuCi0KLVZlcnNpb24gMS42LjIxIFtKYW51YXJ5IDE1LCAyMDE2XQotICBXb3JrZWQgYXJvdW5kIGEgZmFsc2UtcG9zaXRpdmUgQ292ZXJpdHkgaXNzdWUgaW4gcG5ndmFsaWQuYy4KLQotVmVyc2lvbiAxLjYuMjJiZXRhMDEgW0phbnVhcnkgMjMsIDIwMTZdCi0gIENoYW5nZWQgUE5HX1VTRV9NS1NURU1QIHRvIF9fQ09WRVJJVFlfXyB0byBzZWxlY3QgYWx0ZXJuYXRlCi0gICAgInRtcGZpbGUoKSIgaW1wbGVtZW50YXRpb24gaW4gY29udHJpYi9saWJ0ZXN0cy9wbmdzdGVzdC5jCi0gIEZpeGVkIE5PX1NURElPIGJ1aWxkIG9mIHBuZ3Vua25vd24uYyB0byBza2lwIGNhbGxpbmcgcG5nX2luaXRfaW8oKQotICAgIGlmIHRoZXJlIGlzIG5vIHN0ZGlvLmggc3VwcG9ydC4KLSAgQWRkZWQgYSBwbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5KCkgQVBJIGFuZCBhIG51bWJlciBvZiBhc3Npc3QgbWFjcm9zCi0gICAgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdGhhdCB1c2VzIHRoZSBzaW1wbGlmaWVkIEFQSSB3cml0ZSB0byBieXBhc3MKLSAgICBzdGRpbyBhbmQgd3JpdGUgZGlyZWN0bHkgdG8gbWVtb3J5LgotICBBZGRlZCBzb21lIHdhcm5pbmdzIChwbmcuaCkgYW5kIHNvbWUgY2hlY2sgY29kZSB0byBkZXRlY3QgKnBvc3NpYmxlKgotICAgIG92ZXJmbG93IGluIHRoZSBST1dfU1RSSURFIGFuZCBzaW1wbGlmaWVkIGltYWdlIFNJWkUgbWFjcm9zLiAgVGhpcwotICAgIGRpc2FsbG93cyBpbWFnZSB3aWR0aC9oZWlnaHQvZm9ybWF0IHRoYXQgKm1pZ2h0KiBvdmVyZmxvdy4gIFRoaXMgaXMKLSAgICBhIHF1aWV0IEFQSSBjaGFuZ2UgdGhhdCBsaW1pdHMgaW4tbWVtb3J5IGltYWdlIHNpemUgKHVuY29tcHJlc3NlZCkgdG8KLSAgICBsZXNzIHRoYW4gNEdCeXRlIGFuZCBpbWFnZSByb3cgc2l6ZSAoc3RyaWRlKSB0byBsZXNzIHRoYW4gMkdCeXRlLgotICBSZXZpc2VkIHdvcmthcm91bmQgZm9yIGZhbHNlLXBvc2l0aXZlIENvdmVyaXR5IGlzc3VlIGluIHBuZ3ZhbGlkLmMuCi0KLVZlcnNpb24gMS42LjIyYmV0YTAyIFtGZWJydWFyeSA4LCAyMDE2XQotICBPbmx5IHVzZSBleGl0KDc3KSBpbiBjb25maWd1cmUgYnVpbGRzLgotICBDb3JyZWN0ZWQgZXJyb3IgaW4gUE5HX0lNQUdFX1BOR19TSVpFX01BWC4gVGhpcyBuZXcgbWFjcm8gdW5kZXJyZXBvcnRlZAotICAgIHRoZSBwYWxldHRlIHNpemUgYmVjYXVzZSBpdCBmYWlsZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbWVtb3J5Ci0gICAgcGFsZXR0ZSBoYXMgdG8gYmUgZXhwYW5kZWQgdG8gZnVsbCBSR0Igd2hlbiBpdCBpcyB3cml0dGVuIHRvIFBORy4KLSAgVXBkYXRlZCBDTWFrZUxpc3RzLnR4dCwgYWRkZWQgc3VwcG9ydGluZyBzY3JpcHRzL2dlbiouY21ha2UuaW4KLSAgICBhbmQgdGVzdC5jbWFrZS5pbiAoUm9nZXIgTGVpZ2gpLgotICBSZWxheGVkIGxpbWl0IGNoZWNrcyBvbiBnYW1tYSB2YWx1ZXMgaW4gcG5ncnRyYW4uYy4gQXMgc3VnZ2VzdGVkIGluCi0gICAgdGhlIGNvbW1lbnRzIGdhbW1hIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZSBjdXJyZW50bHkgcGVybWl0dGVkCi0gICAgYnkgcG5nX3NldF9hbHBoYV9tb2RlIGFyZSB1c2VmdWwgZm9yIEhEUiBkYXRhIGVuY29kaW5nLiAgVGhlc2UgdmFsdWVzCi0gICAgYXJlIGFscmVhZHkgcGVybWl0dGVkIGJ5IHBuZ19zZXRfZ2FtbWEgc28gaXQgaXMgcmVhc29uYWJsZSBjYXV0aW9uIHRvCi0gICAgZXh0ZW5kIHRoZSBwbmdfc2V0X2FscGhhX21vZGUgcmFuZ2UgYXMgSERSIGltYWdpbmcgc3lzdGVtcyBhcmUgc3RhcnRpbmcKLSAgICB0byBlbWVyZ2UuCi0KLVZlcnNpb24gMS42LjIyYmV0YTAzIFtNYXJjaCA5LCAyMDE2XQotICBBZGRlZCBhIGNvbW1vbi1sYXcgdHJhZGVtYXJrIG5vdGljZSBhbmQgZXhwb3J0IGNvbnRyb2wgaW5mb3JtYXRpb24KLSAgICB0byB0aGUgTElDRU5TRSBmaWxlLCBwbmcuaCwgYW5kIHRoZSBtYW4gcGFnZS4KLSAgUmVzdG9yZWQgIiYgMHhmZiIgaW4gcG5nX3NhdmVfdWludF8xNigpIGFuZCBwbmdfc2F2ZV91aW50XzMyKCkgdGhhdAotICAgIHdlcmUgYWNjaWRlbnRhbGx5IHJlbW92ZWQgZnJvbSBsaWJwbmctMS42LjE3LiAKLSAgQ2hhbmdlZCBQTkdfSU5GT19jSE5LIGFuZCBQTkdfRlJFRV9jSE5LIGZyb20gMHhubm5uIHRvIDB4bm5ublUgaW4gcG5nLmgKLSAgICAoUm9iZXJ0IEMuIFNlYWNvcmQpLgotICBSZW1vdmVkIGR1YmlvdXMgIiNpZiBJTlRfTUFYIiB0ZXN0IGZyb20gcG5nLmggdGhhdCB3YXMgYWRkZWQgdG8KLSAgICBsaWJwbmctMS42LjE5YmV0YTAyIChKb2huIEJvd2xlcikuCi0gIEFkZCAke0lOQ0xVREVTfSBpbiBzY3JpcHRzL2dlbm91dC5jbWFrZS5pbiAoQnVnIHJlcG9ydCBieSBOaXhvbiBLd29rKS4KLSAgVXBkYXRlZCBMSUNFTlNFIHRvIHNheSBmaWxlcyBpbiB0aGUgY29udHJpYiBkaXJlY3RvcnkgYXJlIG5vdAotICAgIG5lY2Vzc2FyaWx5IHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZSwgYW5kIHRoYXQgc29tZSBtYWtlZmlsZXMgaGF2ZQotICAgIG90aGVyIGNvcHlyaWdodCBvd25lcnMuCi0gIEFkZGVkIElOVEVMLVNTRTIgc3VwcG9ydCAoTWlrZSBLbGVpbiBhbmQgTWF0dCBTYXJldHQsIEdvb2dsZSwgSW5jLikuCi0gIE1hZGUgY29udHJpYi9saWJ0ZXN0cy90aW1lcG5nIG1vcmUgcm9idXN0LiAgVGhlIGNvZGUgbm8gbG9uZ2VyIGdpdmVzCi0gICAgdXAvZmFpbHMgb24gaW52YWxpZCBQTkcgZGF0YSwgaXQganVzdCBza2lwcyBpdCAod2l0aCBlcnJvciBtZXNzYWdlcykuCi0gICAgVGhlIGNvZGUgbm8gbG9uZ2VyIGZhaWxzIG9uIFBORyBmaWxlcyB3aXRoIGRhdGEgYmV5b25kIElFTkQuICBPcHRpb25zCi0gICAgZXhpc3QgdG8gdXNlIHBuZ19yZWFkX3BuZyAocmVhZGluZyB0aGUgd2hvbGUgaW1hZ2UsIG5vdCBieSByb3cpIGFuZCwgaW4KLSAgICB0aGF0IGNhc2UsIHRvIGFwcGx5IGFueSBvZiB0aGUgc3VwcG9ydGVkIHRyYW5zZm9ybXMuICBUaGlzIG1ha2VzIGZvcgotICAgIG1vcmUgcmVhbGlzdGljIHRlc3Rpbmc7IHRoZSBkZWNvZGVkIGRhdGEgYWN0dWFsbHkgZ2V0cyB1c2VkIGluIGEKLSAgICBtZWFuaW5nZnVsIGZhc2hpb24gKEpvaG4gQm93bGVyKS4KLSAgRml4ZWQgc29tZSBtaXNsZWFkaW5nIGluZGVudGF0aW9uIChLcmlzaG5hcmFqIEJoYXQpLgotCi1WZXJzaW9uIDEuNi4yMmJldGEwNCBbQXByaWwgNSwgMjAxNl0KLSAgRm9yY2UgR0NDIGNvbXBpbGF0aW9uIHRvIEM4OSBpZiBuZWVkZWQgKERhZ29iZXJ0IE1pY2hlbHNlbikuCi0gIFNTRSBmaWx0ZXIgc3BlZWQgaW1wcm92ZW1lbnRzIGZvciBicHA9MzoKLSAgICBtZW1jcHktZnJlZSBpbXBsZW1lbnRhdGlvbnMgb2YgbG9hZDMoKSAvIHN0b3JlMygpLgotICAgIGNhbGwgbG9hZDMoKSBvbmx5IHdoZW4gbmVlZGVkIGF0IHRoZSBlbmQgb2YgYSBzY2FubGluZS4KLQotVmVyc2lvbiAxLjYuMjJiZXRhMDUgW0FwcmlsIDI3LCAyMDE2XQotICBBZGRlZCBQTkdfRkFTVF9GSUxURVJTIG1hY3JvIChkZWZpbmVkIGFzCi0gICAgUE5HX0ZJTFRFUl9OT05FfFBOR19GSUxURVJfU1VCfFBOR19GSUxURVJfVVApLgotICBWYXJpb3VzIGZpeGVzIGZvciBjb250cmliL2xpYnRlc3RzL3RpbWVwbmcuYwotICBNb3ZlZCBJTlRFTC1TU0UgY29kZSBmcm9tIHBuZ3ByaXYuaCBpbnRvIGNvbnRyaWIvaW50ZWwvaW50ZWxfc3NlLnBhdGNoLgotICBGaXhlZCB0eXBvIChtaXNzaW5nIHVuZGVyc2NvcmUpIGluICNkZWZpbmUgUE5HX1JFQURfMTZfVE9fOF9TVVBQT1JURUQKLSAgICAoQnVnIHJlcG9ydCBieSBZLk9oYXNoaWspLgotCi1WZXJzaW9uIDEuNi4yMmJldGEwNiBbTWF5IDUsIDIwMTZdCi0gIFJlYmFzZWQgY29udHJpYi9pbnRlbF9zc2UucGF0Y2guCi0gIFF1aWV0ZWQgdHdvIENvdmVyaXR5IGlzc3VlcyBpbiBjb250cmliL2xpYnRlc3RzL3RpbWVwbmcuYy4KLSAgRml4ZWQgaXNzdWVzIHdpdGggc2NyaXB0cy9nZW5vdXQuY21ha2UuaW4gKERhdmlkIENhcGVsbG8sIE5peG9uIEt3b2spOgotICAgIEFkZGVkIHN1cHBvcnQgdG8gdXNlIG11bHRpcGxlIGRpcmVjdG9yaWVzIGluIFpMSUJJTkNESVIgdmFyaWFibGUsCi0gICAgRml4ZWQgQ01BS0VfQ19GTEFHUyB3aXRoIG11bHRpcGxlIHZhbHVlcyB3aGVuIGdlbm91dCBpcyBjb21waWxlZCBvbiBNU1ZDLAotICAgIEZpeGVkIHBuZ2xpYmNvbmYuYyBjb21waWxhdGlvbiBvbiBPUyBYIGluY2x1ZGluZyB0aGUgc3lzcm9vdCBwYXRoLgotCi1WZXJzaW9uIDEuNi4yMnJjMDEgW01heSAxNCwgMjAxNl0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMjJyYzAyIFtNYXkgMTYsIDIwMTZdCi0gIFJlbW92ZWQgY29udHJpYi90aW1lcG5nIGZyb20gZGVmYXVsdCBidWlsZDsgaXQgZG9lcyBub3QgYnVpbGQgb24gcGxhdGZvcm1zCi0gICAgdGhhdCBkb24ndCBzdXBwbHkgY2xvY2tfZ2V0dGltZSgpLgotCi1WZXJzaW9uIDEuNi4yMnJjMDMgW01heSAxNywgMjAxNl0KLSAgUmVzdG9yZWQgY29udHJpYi90aW1lcG5nIHRvIGRlZmF1bHQgYnVpbGQgYnV0IGNoZWNrIGZvciB0aGUgcHJlc2VuY2UKLSAgICBvZiBjbG9ja19nZXR0aW1lKCkgaW4gY29uZmlndXJlLmFjIGFuZCBNYWtlZmlsZS5hbS4KLQotVmVyc2lvbiAxLjYuMjIgW01heSAyNiwgMjAxNl0KLSAgTm8gY2hhbmdlcy4KLQotVmVyc2lvbiAxLjYuMjNiZXRhMDEgW01heSAyOSwgMjAxNl0KLSAgU3RvcCBhIHBvdGVudGlhbCBtZW1vcnkgbGVhayBpbiBwbmdfc2V0X3RSTlMoKSAoQnVnIHJlcG9ydCBieSBUZWQgWWluZykuCi0gIEZpeGVkIHRoZSBwcm9ncmVzc2l2ZSByZWFkZXIgdG8gaGFuZGxlIGVtcHR5IGZpcnN0IElEQVQgY2h1bmsgcHJvcGVybHkKLSAgICAocGF0Y2ggYnkgVGltb3RoeSBOaWtrZWwpLiAgVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gbGlicG5nLTEuNi4wIGFuZAotICAgIG9ubHkgYWZmZWN0ZWQgdGhlIGxpYnBuZzE2IGJyYW5jaC4KLSAgQWRkZWQgdGVzdHMgaW4gcG5ndmFsaWQuYyB0byBjaGVjayB6ZXJvLWxlbmd0aCBJREFUIGNodW5rcyBpbiB2YXJpb3VzCi0gICAgcG9zaXRpb25zLiAgRml4ZWQgdGhlIHNlcXVlbnRpYWwgcmVhZGVyIHRvIGhhbmRsZSB0aGVzZSBtb3JlIHJvYnVzdGx5Ci0gICAgKEpvaG4gQm93bGVyKS4KLQotVmVyc2lvbiAxLjYuMjNyYzAxIFtKdW5lIDIsIDIwMTZdCi0gIENvcnJlY3RlZCBwcm9ncmVzc2l2ZSByZWFkIGlucHV0IGJ1ZmZlciBpbiBwbmd2YWxpZC5jLiBUaGUgcHJldmlvdXMgdmVyc2lvbgotICAgIHRoZSBjb2RlIGludmFyaWFibHkgcGFzc2VkIGp1c3Qgb25lIGJ5dGUgYXQgYSB0aW1lIHRvIGxpYnBuZy4gIFRoZSBpbnRlbnQKLSAgICB3YXMgdG8gcGFzcyBhIHJhbmRvbSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJhbmdlIDAuLjUxMS4KLSAgTW92ZWQgc3NlMiBwcm90b3R5cGUgZnJvbSBwbmdwcml2LmggdG8gY29udHJpYi9pbnRlbC9pbnRlbF9zc2UucGF0Y2guCi0gIEFkZGVkIG1pc3NpbmcgIikiIGluIHBuZ2Vycm9yLmMgKE1hdHQgU2FycmV0dCkuCi0KLVZlcnNpb24gMS42LjIzcmMwMiBbSnVuZSA0LCAyMDE2XQotICBGaXhlZCB1bmRlZmluZWQgYmVoYXZpb3IgaW4gcG5nX3B1c2hfc2F2ZV9idWZmZXIoKS4gRG8gbm90IGNhbGwKLSAgICBtZW1jcHkoKSB3aXRoIGEgbnVsbCBzb3VyY2UsIGV2ZW4gaWYgY291bnQgaXMgemVybyAoTGVvbiBTY3JvZ2dpbnMgSUlJKS4KLQotVmVyc2lvbiAxLjYuMjMgW0p1bmUgOSwgMjAxNl0KLSAgRml4ZWQgYmFkIGxpbmsgdG8gUkZDMjA4MyBpbiBwbmcuNSAoTmlrb2xhIEZvcnJvKS4KLQogU2VuZCBjb21tZW50cy9jb3JyZWN0aW9ucy9jb21tZW5kYXRpb25zIHRvIHBuZy1tbmctaW1wbGVtZW50IGF0IGxpc3RzLnNmLm5ldAogKHN1YnNjcmlwdGlvbiByZXF1aXJlZDsgdmlzaXQKIGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3BuZy1tbmctaW1wbGVtZW50CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9MSUNFTlNFIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvTElDRU5TRQppbmRleCBiN2FkNGI5Li44MmRiZTExIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9MSUNFTlNFCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL0xJQ0VOU0UKQEAgLTEwLDggKzEwLDggQEAKIAogVGhpcyBjb2RlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBsaWJwbmcgbGljZW5zZS4KIAotbGlicG5nIHZlcnNpb25zIDEuMC43LCBKdWx5IDEsIDIwMDAgdGhyb3VnaCAxLjYuMjMsIEp1bmUgOSwgMjAxNiBhcmUKLUNvcHlyaWdodCAoYykgMjAwMC0yMDAyLCAyMDA0LCAyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhcmUKK2xpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwLCB0aHJvdWdoIDEuNi4yMCwgRGVjZW1iZXIgMywgMjAxNSwgYXJlCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwgMjAwNCwgMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYXJlCiBkZXJpdmVkIGZyb20gbGlicG5nLTEuMC42LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZQogZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcyBsaWJwbmctMS4wLjYgd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzCiBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9yczoKQEAgLTMyLDEwICszMiw2IEBACiAgICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZCBlZmZvcnQgaXMgd2l0aAogICAgdGhlIHVzZXIuCiAKLVNvbWUgZmlsZXMgaW4gdGhlICJjb250cmliIiBkaXJlY3RvcnkgYW5kIHNvbWUgY29uZmlndXJlLWdlbmVyYXRlZAotZmlsZXMgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgd2l0aCBsaWJwbmcgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFuZAotYXJlIHJlbGVhc2VkIHVuZGVyIG90aGVyIG9wZW4gc291cmNlIGxpY2Vuc2VzLgotCiBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMC42LCBNYXJjaCAyMCwgMjAwMCwgYXJlCiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFyZSBkZXJpdmVkIGZyb20KIGxpYnBuZy0wLjk2LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZApAQCAtNTksOSArNTUsNiBAQAogICAgR3JlZyBSb2Vsb2ZzCiAgICBUb20gVGFubmVyCiAKLVNvbWUgZmlsZXMgaW4gdGhlICJzY3JpcHRzIiBkaXJlY3RvcnkgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzCi1idXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoaXMgbGljZW5zZS4KLQogbGlicG5nIHZlcnNpb25zIDAuNSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2LCBhcmUKIENvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLgogCkBAIC0xMDIsMjkgKzk1LDE4IEBACiAKIEVORCBPRiBDT1BZUklHSFQgTk9USUNFLCBESVNDTEFJTUVSLCBhbmQgTElDRU5TRS4KIAotVFJBREVNQVJLOgorQSAicG5nX2dldF9jb3B5cmlnaHQiIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgZm9yIGNvbnZlbmllbnQgdXNlIGluICJhYm91dCIKK2JveGVzIGFuZCB0aGUgbGlrZToKIAotVGhlIG5hbWUgImxpYnBuZyIgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlIENvcHlyaWdodCBvd25lcgotYXMgYSB0cmFkZW1hcmsgaW4gYW55IGp1cmlzZGljdGlvbi4gIEhvd2V2ZXIsIGJlY2F1c2UgbGlicG5nIGhhcwotYmVlbiBkaXN0cmlidXRlZCBhbmQgbWFpbnRhaW5lZCB3b3JsZC13aWRlLCBjb250aW51YWxseSBzaW5jZSAxOTk1LAotdGhlIENvcHlyaWdodCBvd25lciBjbGFpbXMgImNvbW1vbi1sYXcgdHJhZGVtYXJrIHByb3RlY3Rpb24iIGluIGFueQotanVyaXNkaWN0aW9uIHdoZXJlIGNvbW1vbi1sYXcgdHJhZGVtYXJrIGlzIHJlY29nbml6ZWQuCisgICBwcmludGYoIiVzIiwgcG5nX2dldF9jb3B5cmlnaHQoTlVMTCkpOwogCi1PU0kgQ0VSVElGSUNBVElPTjoKK0Fsc28sIHRoZSBQTkcgbG9nbyAoaW4gUE5HIGZvcm1hdCwgb2YgY291cnNlKSBpcyBzdXBwbGllZCBpbiB0aGUKK2ZpbGVzICJwbmdiYXIucG5nIiBhbmQgInBuZ2Jhci5qcGcgKDg4eDMxKSBhbmQgInBuZ25vdy5wbmciICg5OHgzMSkuCiAKIExpYnBuZyBpcyBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIFNvZnR3YXJlLiAgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBpcwogYSBjZXJ0aWZpY2F0aW9uIG1hcmsgb2YgdGhlIE9wZW4gU291cmNlIEluaXRpYXRpdmUuIE9TSSBoYXMgbm90IGFkZHJlc3NlZAogdGhlIGFkZGl0aW9uYWwgZGlzY2xhaW1lcnMgaW5zZXJ0ZWQgYXQgdmVyc2lvbiAxLjAuNy4KIAotRVhQT1JUIENPTlRST0w6Ci0KLVRoZSBDb3B5cmlnaHQgb3duZXIgYmVsaWV2ZXMgdGhhdCB0aGUgRXhwb3J0IENvbnRyb2wgQ2xhc3NpZmljYXRpb24KLU51bWJlciAoRUNDTikgZm9yIGxpYnBuZyBpcyBFQVI5OSwgd2hpY2ggbWVhbnMgbm90IHN1YmplY3QgdG8gZXhwb3J0Ci1jb250cm9scyBvciBJbnRlcm5hdGlvbmFsIFRyYWZmaWMgaW4gQXJtcyBSZWd1bGF0aW9ucyAoSVRBUikgYmVjYXVzZQotaXQgaXMgb3BlbiBzb3VyY2UsIHB1YmxpY2x5IGF2YWlsYWJsZSBzb2Z0d2FyZSwgdGhhdCBkb2VzIG5vdCBjb250YWluCi1hbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gIFNlZSB0aGUgRUFSLCBwYXJhZ3JhcGhzIDczNC4zKGIpKDMpIGFuZAotNzM0LjcoYikuCi0KIEdsZW5uIFJhbmRlcnMtUGVocnNvbgogZ2xlbm5ycCBhdCB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKLUp1bmUgOSwgMjAxNgorRGVjZW1iZXIgMywgMjAxNQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvUkVBRE1FIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvUkVBRE1FCmluZGV4IDM4ZTlhMTQuLjU5ZjFmOTEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL1JFQURNRQorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9SRUFETUUKQEAgLTEsNCArMSw0IEBACi1SRUFETUUgZm9yIGxpYnBuZyB2ZXJzaW9uIDEuNi4yMyAtIEp1bmUgOSwgMjAxNiAoc2hhcmVkIGxpYnJhcnkgMTYuMCkKK1JFQURNRSBmb3IgbGlicG5nIHZlcnNpb24gMS42LjIwIC0gRGVjZW1iZXIgMywgMjAxNSAoc2hhcmVkIGxpYnJhcnkgMTYuMCkKIFNlZSB0aGUgbm90ZSBhYm91dCB2ZXJzaW9uIG51bWJlcnMgbmVhciB0aGUgdG9wIG9mIHBuZy5oCiAKIFNlZSBJTlNUQUxMIGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGluc3RhbGwgbGlicG5nLgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuYwppbmRleCBmMDM5ZmY3Li4zOGFhMDU5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuYwpAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOSBbTm92ZW1iZXIgMTIsIDIwMTVdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiwyMDA0LDIwMDYtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgogICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCiAgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCiAgKgpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgInBuZ3ByaXYuaCIKIAogLyogR2VuZXJhdGUgYSBjb21waWxlciBlcnJvciBpZiB0aGVyZSBpcyBhbiBvbGQgcG5nLmggaW4gdGhlIHNlYXJjaCBwYXRoLiAqLwotdHlwZWRlZiBwbmdfbGlicG5nX3ZlcnNpb25fMV82XzIzIFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV82XzIzOwordHlwZWRlZiBwbmdfbGlicG5nX3ZlcnNpb25fMV82XzIwIFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV82XzIwOwogCiAvKiBUZWxscyBsaWJwbmcgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgZmlyc3QgIm51bV9ieXRlcyIgYnl0ZXMKICAqIG9mIHRoZSBQTkcgZmlsZSBzaWduYXR1cmUuICBJZiB0aGUgUE5HIGRhdGEgaXMgZW1iZWRkZWQgaW50byBhbm90aGVyCkBAIC04MDMsMTUgKzgwMywxNCBAQAogI2Vsc2UKICMgIGlmZGVmIF9fU1REQ19fCiAgICByZXR1cm4gUE5HX1NUUklOR19ORVdMSU5FIFwKLSAgICAgICJsaWJwbmcgdmVyc2lvbiAxLjYuMjMgLSBKdW5lIDksIDIwMTYiIFBOR19TVFJJTkdfTkVXTElORSBcCi0gICAgICAiQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uIiBcCi0gICAgICBQTkdfU1RSSU5HX05FV0xJTkUgXAorICAgICAgImxpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTUiIFBOR19TVFJJTkdfTkVXTElORSBcCisgICAgICAiQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uIiBQTkdfU1RSSU5HX05FV0xJTkUgXAogICAgICAgIkNvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyIiBQTkdfU1RSSU5HX05FV0xJTkUgXAogICAgICAgIkNvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLiIgXAogICAgICAgUE5HX1NUUklOR19ORVdMSU5FOwogIyAgZWxzZQotICAgcmV0dXJuICJsaWJwbmcgdmVyc2lvbiAxLjYuMjMgLSBKdW5lIDksIDIwMTZcCi0gICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiwyMDA0LDIwMDYtMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb25cCisgICByZXR1cm4gImxpYnBuZyB2ZXJzaW9uIDEuNi4yMCAtIERlY2VtYmVyIDMsIDIwMTVcCisgICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb25cCiAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5NyBBbmRyZWFzIERpbGdlclwKICAgICAgIENvcHlyaWdodCAoYykgMTk5NS0xOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLiI7CiAjICBlbmRpZgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuaAppbmRleCA5ZjFhYjQyLi5jOTBhOTBmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuaAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmcuaApAQCAtMjksOSArMjksOSBAQAogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCi0gKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjMsIEp1bmUgOSwgMjAxNgorICogbGlicG5nIHZlcnNpb24gMS42LjIwLCBEZWNlbWJlciAzLCAyMDE1CiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKQEAgLTQwLDcgKzQwLDcgQEAKICAqIEF1dGhvcnMgYW5kIG1haW50YWluZXJzOgogICogICBsaWJwbmcgdmVyc2lvbnMgMC43MSwgTWF5IDE5OTUsIHRocm91Z2ggMC44OCwgSmFudWFyeSAxOTk2OiBHdXkgU2NoYWxuYXQKICAqICAgbGlicG5nIHZlcnNpb25zIDAuODksIEp1bmUgMTk5NiwgdGhyb3VnaCAwLjk2LCBNYXkgMTk5NzogQW5kcmVhcyBEaWxnZXIKLSAqICAgbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjYuMjMsIEp1bmUgOSwgMjAxNjoKKyAqICAgbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjYuMjAsIERlY2VtYmVyIDMsIDIwMTU6CiAgKiAgICAgR2xlbm4gUmFuZGVycy1QZWhyc29uLgogICogICBTZWUgYWxzbyAiQ29udHJpYnV0aW5nIEF1dGhvcnMiLCBiZWxvdy4KICAqLwpAQCAtNTMsMTIgKzUzLDggQEAKICAqCiAgKiBUaGlzIGNvZGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIGxpYnBuZyBsaWNlbnNlLgogICoKLSAqIFNvbWUgZmlsZXMgaW4gdGhlICJjb250cmliIiBkaXJlY3RvcnkgYW5kIHNvbWUgY29uZmlndXJlLWdlbmVyYXRlZAotICogZmlsZXMgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgd2l0aCBsaWJwbmcgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFuZAotICogYXJlIHJlbGVhc2VkIHVuZGVyIG90aGVyIG9wZW4gc291cmNlIGxpY2Vuc2VzLgotICoKLSAqIGxpYnBuZyB2ZXJzaW9ucyAxLjAuNywgSnVseSAxLCAyMDAwIHRocm91Z2ggMS42LjIzLCBKdW5lIDksIDIwMTYgYXJlCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiwgMjAwNCwgMjAwNi0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbiwgYXJlCisgKiBsaWJwbmcgdmVyc2lvbnMgMS4wLjcsIEp1bHkgMSwgMjAwMCwgdGhyb3VnaCAxLjYuMjAsIERlY2VtYmVyIDMsIDIwMTUsIGFyZQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIsIDIwMDQsIDIwMDYtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFyZQogICogZGVyaXZlZCBmcm9tIGxpYnBuZy0xLjAuNiwgYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUKICAqIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMC42IHdpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscwogICogYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnM6CkBAIC03OSwxMCArNzUsNiBAQAogICogICAgcmlzayBvZiBzYXRpc2ZhY3RvcnkgcXVhbGl0eSwgcGVyZm9ybWFuY2UsIGFjY3VyYWN5LCBhbmQgZWZmb3J0IGlzIHdpdGgKICAqICAgIHRoZSB1c2VyLgogICoKLSAqIFNvbWUgZmlsZXMgaW4gdGhlICJjb250cmliIiBkaXJlY3RvcnkgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFuZAotICogYXJlIHJlbGVhc2VkIHVuZGVyIG90aGVyIG9wZW4gc291cmNlIGxpY2Vuc2VzLgotICoKLSAqCiAgKiBsaWJwbmcgdmVyc2lvbnMgMC45NywgSmFudWFyeSAxOTk4LCB0aHJvdWdoIDEuMC42LCBNYXJjaCAyMCwgMjAwMCwgYXJlCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFyZSBkZXJpdmVkIGZyb20KICAqIGxpYnBuZy0wLjk2LCBhbmQgYXJlIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZApAQCAtOTMsOSArODUsNiBAQAogICogICAgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAgICBXaWxsZW0gdmFuIFNjaGFpawogICoKLSAqIFNvbWUgZmlsZXMgaW4gdGhlICJzY3JpcHRzIiBkaXJlY3RvcnkgaGF2ZSBkaWZmZXJlbnQgY29weXJpZ2h0IG93bmVycwotICogYnV0IGFyZSBhbHNvIHJlbGVhc2VkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCiAgKiBsaWJwbmcgdmVyc2lvbnMgMC44OSwgSnVuZSAxOTk2LCB0aHJvdWdoIDAuOTYsIE1heSAxOTk3LCBhcmUKICAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IEFuZHJlYXMgRGlsZ2VyLCBhcmUgZGVyaXZlZCBmcm9tIGxpYnBuZy0wLjg4LAogICogYW5kIGFyZSBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNhbWUgZGlzY2xhaW1lciBhbmQgbGljZW5zZSBhcwpAQCAtMTA5LDkgKzk4LDYgQEAKICAqICAgIEdyZWcgUm9lbG9mcwogICogICAgVG9tIFRhbm5lcgogICoKLSAqIFNvbWUgZmlsZXMgaW4gdGhlICJzY3JpcHRzIiBkaXJlY3RvcnkgaGF2ZSBvdGhlciBjb3B5cmlnaHQgb3duZXJzCi0gKiBidXQgYXJlIHJlbGVhc2VkIHVuZGVyIHRoaXMgbGljZW5zZS4KLSAqCiAgKiBsaWJwbmcgdmVyc2lvbnMgMC41LCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTYsIGFyZQogICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCiAgKgpAQCAtMTUxLDI5ICsxMzcsNiBAQAogICogYXBwcmVjaWF0ZWQuCiAgKgogICogRU5EIE9GIENPUFlSSUdIVCBOT1RJQ0UsIERJU0NMQUlNRVIsIGFuZCBMSUNFTlNFLgotICoKLSAqIFRSQURFTUFSSzoKLSAqCi0gKiBUaGUgbmFtZSAibGlicG5nIiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGUgQ29weXJpZ2h0IG93bmVyCi0gKiBhcyBhIHRyYWRlbWFyayBpbiBhbnkganVyaXNkaWN0aW9uLiAgSG93ZXZlciwgYmVjYXVzZSBsaWJwbmcgaGFzCi0gKiBiZWVuIGRpc3RyaWJ1dGVkIGFuZCBtYWludGFpbmVkIHdvcmxkLXdpZGUsIGNvbnRpbnVhbGx5IHNpbmNlIDE5OTUsCi0gKiB0aGUgQ29weXJpZ2h0IG93bmVyIGNsYWltcyAiY29tbW9uLWxhdyB0cmFkZW1hcmsgcHJvdGVjdGlvbiIgaW4gYW55Ci0gKiBqdXJpc2RpY3Rpb24gd2hlcmUgY29tbW9uLWxhdyB0cmFkZW1hcmsgaXMgcmVjb2duaXplZC4KLSAqCi0gKiBPU0kgQ0VSVElGSUNBVElPTjoKLSAqCi0gKiBMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMKLSAqIGEgY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLiBPU0kgaGFzIG5vdCBhZGRyZXNzZWQKLSAqIHRoZSBhZGRpdGlvbmFsIGRpc2NsYWltZXJzIGluc2VydGVkIGF0IHZlcnNpb24gMS4wLjcuCi0gKgotICogRVhQT1JUIENPTlRST0w6Ci0gKgotICogVGhlIENvcHlyaWdodCBvd25lciBiZWxpZXZlcyB0aGF0IHRoZSBFeHBvcnQgQ29udHJvbCBDbGFzc2lmaWNhdGlvbgotICogTnVtYmVyIChFQ0NOKSBmb3IgbGlicG5nIGlzIEVBUjk5LCB3aGljaCBtZWFucyBub3Qgc3ViamVjdCB0byBleHBvcnQKLSAqIGNvbnRyb2xzIG9yIEludGVybmF0aW9uYWwgVHJhZmZpYyBpbiBBcm1zIFJlZ3VsYXRpb25zIChJVEFSKSBiZWNhdXNlCi0gKiBpdCBpcyBvcGVuIHNvdXJjZSwgcHVibGljbHkgYXZhaWxhYmxlIHNvZnR3YXJlLCB0aGF0IGRvZXMgbm90IGNvbnRhaW4KLSAqIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLiAgU2VlIHRoZSBFQVIsIHBhcmFncmFwaHMgNzM0LjMoYikoMykgYW5kCi0gKiA3MzQuNyhiKS4KICAqLwogCiAvKgpAQCAtMTg3LDYgKzE1MCwxMiBAQAogICovCiAKIC8qCisgKiBMaWJwbmcgaXMgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBTb2Z0d2FyZS4gIE9TSSBDZXJ0aWZpZWQgT3BlbiBTb3VyY2UgaXMKKyAqIGEgY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLiBPU0kgaGFzIG5vdCBhZGRyZXNzZWQKKyAqIHRoZSBhZGRpdGlvbmFsIGRpc2NsYWltZXJzIGluc2VydGVkIGF0IHZlcnNpb24gMS4wLjcuCisgKi8KKworLyoKICAqIFRoZSBjb250cmlidXRpbmcgYXV0aG9ycyB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aG9zZSB3aG8gaGVscGVkCiAgKiB3aXRoIHRlc3RpbmcsIGJ1ZyBmaXhlcywgYW5kIHBhdGllbmNlLiAgVGhpcyB3b3VsZG4ndCBoYXZlIGJlZW4KICAqIHBvc3NpYmxlIHdpdGhvdXQgYWxsIG9mIHlvdS4KQEAgLTI0MSwxMSArMjEwLDExIEBACiAgKiAgICAuLi4KICAqICAgIDEuMC4xOSAgICAgICAgICAgICAgICAgIDEwICAgIDEwMDE5ICAxMC5zby4wLjE5Wy4wXQogICogICAgLi4uCi0gKiAgICAxLjIuNTYgICAgICAgICAgICAgICAgICAxMyAgICAxMDI1NiAgMTIuc28uMC41NlsuMF0KKyAqICAgIDEuMi41MyAgICAgICAgICAgICAgICAgIDEzICAgIDEwMjUzICAxMi5zby4wLjUzWy4wXQogICogICAgLi4uCi0gKiAgICAxLjUuMjcgICAgICAgICAgICAgICAgICAxNSAgICAxMDUyNyAgMTUuc28uMTUuMjdbLjBdCisgKiAgICAxLjUuMjMgICAgICAgICAgICAgICAgICAxNSAgICAxMDUyMyAgMTUuc28uMTUuMjNbLjBdCiAgKiAgICAuLi4KLSAqICAgIDEuNi4yMyAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjIzICAxNi5zby4xNi4yM1suMF0KKyAqICAgIDEuNi4yMCAgICAgICAgICAgICAgICAgIDE2ICAgIDEwNjIwICAxNi5zby4xNi4yMFsuMF0KICAqCiAgKiAgICBIZW5jZWZvcnRoIHRoZSBzb3VyY2UgdmVyc2lvbiB3aWxsIG1hdGNoIHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvcgogICogICAgYW5kIG1pbm9yIG51bWJlcnM7IHRoZSBzaGFyZWQtbGlicmFyeSBtYWpvciB2ZXJzaW9uIG51bWJlciB3aWxsIGJlCkBAIC0yNzMsMTMgKzI0MiwxMyBAQAogICogWTJLIGNvbXBsaWFuY2UgaW4gbGlicG5nOgogICogPT09PT09PT09PT09PT09PT09PT09PT09PQogICoKLSAqICAgIEp1bmUgOSwgMjAxNgorICogICAgRGVjZW1iZXIgMywgMjAxNQogICoKICAqICAgIFNpbmNlIHRoZSBQTkcgRGV2ZWxvcG1lbnQgZ3JvdXAgaXMgYW4gYWQtaG9jIGJvZHksIHdlIGNhbid0IG1ha2UKICAqICAgIGFuIG9mZmljaWFsIGRlY2xhcmF0aW9uLgogICoKICAqICAgIFRoaXMgaXMgeW91ciB1bm9mZmljaWFsIGFzc3VyYW5jZSB0aGF0IGxpYnBuZyBmcm9tIHZlcnNpb24gMC43MSBhbmQKLSAqICAgIHVwd2FyZCB0aHJvdWdoIDEuNi4yMyBhcmUgWTJLIGNvbXBsaWFudC4gIEl0IGlzIG15IGJlbGllZiB0aGF0CisgKiAgICB1cHdhcmQgdGhyb3VnaCAxLjYuMjAgYXJlIFkySyBjb21wbGlhbnQuICBJdCBpcyBteSBiZWxpZWYgdGhhdAogICogICAgZWFybGllciB2ZXJzaW9ucyB3ZXJlIGFsc28gWTJLIGNvbXBsaWFudC4KICAqCiAgKiAgICBMaWJwbmcgb25seSBoYXMgdHdvIHllYXIgZmllbGRzLiAgT25lIGlzIGEgMi1ieXRlIHVuc2lnbmVkIGludGVnZXIKQEAgLTM0MSw5ICszMTAsOSBAQAogICovCiAKIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHBuZy5oIC0gdGhpcyBzaG91bGQgbWF0Y2ggdGhlIHZlcnNpb24gaW4gcG5nLmMgKi8KLSNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU1RSSU5HICIxLjYuMjMiCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1NUUklORyAiMS42LjIwIgogI2RlZmluZSBQTkdfSEVBREVSX1ZFUlNJT05fU1RSSU5HIFwKLSAgICAgIiBsaWJwbmcgdmVyc2lvbiAxLjYuMjMgLSBKdW5lIDksIDIwMTZcbiIKKyAgICAgIiBsaWJwbmcgdmVyc2lvbiAxLjYuMjAgLSBEZWNlbWJlciAzLCAyMDE1XG4iCiAKICNkZWZpbmUgUE5HX0xJQlBOR19WRVJfU09OVU0gICAxNgogI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9ETExOVU0gIDE2CkBAIC0zNTEsNyArMzIwLDcgQEAKIC8qIFRoZXNlIHNob3VsZCBtYXRjaCB0aGUgZmlyc3QgMyBjb21wb25lbnRzIG9mIFBOR19MSUJQTkdfVkVSX1NUUklORzogKi8KICNkZWZpbmUgUE5HX0xJQlBOR19WRVJfTUFKT1IgICAxCiAjZGVmaW5lIFBOR19MSUJQTkdfVkVSX01JTk9SICAgNgotI2RlZmluZSBQTkdfTElCUE5HX1ZFUl9SRUxFQVNFIDIzCisjZGVmaW5lIFBOR19MSUJQTkdfVkVSX1JFTEVBU0UgMjAKIAogLyogVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG51bWVyaWMgcGFydCBvZiB0aGUgZmluYWwgY29tcG9uZW50IG9mCiAgKiBQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIG9taXR0aW5nIGFueSBsZWFkaW5nIHplcm86CkBAIC0zODIsNyArMzUxLDcgQEAKICAqIHZlcnNpb24gMS4wLjAgd2FzIG1pcy1udW1iZXJlZCAxMDAgaW5zdGVhZCBvZiAxMDAwMCkuICBGcm9tCiAgKiB2ZXJzaW9uIDEuMC4xIGl0J3MgICAgeHh5eXp6LCB3aGVyZSB4PW1ham9yLCB5PW1pbm9yLCB6PXJlbGVhc2UKICAqLwotI2RlZmluZSBQTkdfTElCUE5HX1ZFUiAxMDYyMyAvKiAxLjYuMjMgKi8KKyNkZWZpbmUgUE5HX0xJQlBOR19WRVIgMTA2MjAgLyogMS42LjIwICovCiAKIC8qIExpYnJhcnkgY29uZmlndXJhdGlvbjogdGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlcgogICogdGhlIGxpYnJhcnkgaGFzIGJlZW4gYnVpbHQuCkBAIC00OTIsNyArNDYxLDcgQEAKIC8qIFRoaXMgdHJpZ2dlcnMgYSBjb21waWxlciBlcnJvciBpbiBwbmcuYywgaWYgcG5nLmMgYW5kIHBuZy5oCiAgKiBkbyBub3QgYWdyZWUgdXBvbiB0aGUgdmVyc2lvbiBudW1iZXIuCiAgKi8KLXR5cGVkZWYgY2hhciogcG5nX2xpYnBuZ192ZXJzaW9uXzFfNl8yMzsKK3R5cGVkZWYgY2hhciogcG5nX2xpYnBuZ192ZXJzaW9uXzFfNl8yMDsKIAogLyogQmFzaWMgY29udHJvbCBzdHJ1Y3Rpb25zLiAgUmVhZCBsaWJwbmctbWFudWFsLnR4dCBvciBsaWJwbmcuMyBmb3IgbW9yZSBpbmZvLgogICoKQEAgLTc5MywyMiArNzYyLDI0IEBACiAgKiBkYXRhIGluIHRoZSBpbmZvX3N0cnVjdCB0byBiZSB3cml0dGVuIGludG8gdGhlIG91dHB1dCBmaWxlLiAgVGhlIHZhbHVlcwogICogb2YgdGhlIFBOR19JTkZPXzxjaHVuaz4gZGVmaW5lcyBzaG91bGQgTk9UIGJlIGNoYW5nZWQuCiAgKi8KLSNkZWZpbmUgUE5HX0lORk9fZ0FNQSAweDAwMDFVCi0jZGVmaW5lIFBOR19JTkZPX3NCSVQgMHgwMDAyVQotI2RlZmluZSBQTkdfSU5GT19jSFJNIDB4MDAwNFUKLSNkZWZpbmUgUE5HX0lORk9fUExURSAweDAwMDhVCi0jZGVmaW5lIFBOR19JTkZPX3RSTlMgMHgwMDEwVQotI2RlZmluZSBQTkdfSU5GT19iS0dEIDB4MDAyMFUKLSNkZWZpbmUgUE5HX0lORk9faElTVCAweDAwNDBVCi0jZGVmaW5lIFBOR19JTkZPX3BIWXMgMHgwMDgwVQotI2RlZmluZSBQTkdfSU5GT19vRkZzIDB4MDEwMFUKLSNkZWZpbmUgUE5HX0lORk9fdElNRSAweDAyMDBVCi0jZGVmaW5lIFBOR19JTkZPX3BDQUwgMHgwNDAwVQotI2RlZmluZSBQTkdfSU5GT19zUkdCIDB4MDgwMFUgIC8qIEdSLVAsIDAuOTZhICovCi0jZGVmaW5lIFBOR19JTkZPX2lDQ1AgMHgxMDAwVSAgLyogRVNSLCAxLjAuNiAqLwotI2RlZmluZSBQTkdfSU5GT19zUExUIDB4MjAwMFUgIC8qIEVTUiwgMS4wLjYgKi8KLSNkZWZpbmUgUE5HX0lORk9fc0NBTCAweDQwMDBVICAvKiBFU1IsIDEuMC42ICovCi0jZGVmaW5lIFBOR19JTkZPX0lEQVQgMHg4MDAwVSAgLyogRVNSLCAxLjAuNiAqLworI2RlZmluZSBQTkdfSU5GT19nQU1BIDB4MDAwMQorI2RlZmluZSBQTkdfSU5GT19zQklUIDB4MDAwMgorI2RlZmluZSBQTkdfSU5GT19jSFJNIDB4MDAwNAorI2RlZmluZSBQTkdfSU5GT19QTFRFIDB4MDAwOAorI2RlZmluZSBQTkdfSU5GT190Uk5TIDB4MDAxMAorI2RlZmluZSBQTkdfSU5GT19iS0dEIDB4MDAyMAorI2RlZmluZSBQTkdfSU5GT19oSVNUIDB4MDA0MAorI2RlZmluZSBQTkdfSU5GT19wSFlzIDB4MDA4MAorI2RlZmluZSBQTkdfSU5GT19vRkZzIDB4MDEwMAorI2RlZmluZSBQTkdfSU5GT190SU1FIDB4MDIwMAorI2RlZmluZSBQTkdfSU5GT19wQ0FMIDB4MDQwMAorI2RlZmluZSBQTkdfSU5GT19zUkdCIDB4MDgwMCAgIC8qIEdSLVAsIDAuOTZhICovCisjZGVmaW5lIFBOR19JTkZPX2lDQ1AgMHgxMDAwICAgLyogRVNSLCAxLjAuNiAqLworI2RlZmluZSBQTkdfSU5GT19zUExUIDB4MjAwMCAgIC8qIEVTUiwgMS4wLjYgKi8KKyNkZWZpbmUgUE5HX0lORk9fc0NBTCAweDQwMDAgICAvKiBFU1IsIDEuMC42ICovCisjaWYgSU5UX01BWCA+PSAweDgwMDAgLyogZWxzZSB0aGlzIG1pZ2h0IGJyZWFrICovCisjZGVmaW5lIFBOR19JTkZPX0lEQVQgMHg4MDAwICAgLyogRVNSLCAxLjAuNiAqLworI2VuZGlmCiAKIC8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzLCBhcyBzb21lIG9mIHRoZW0KICAqIGNoYW5nZSB0aGVzZSB2YWx1ZXMgZm9yIHRoZSByb3cuICBJdCBhbHNvIHNob3VsZCBlbmFibGUgdXNpbmcKQEAgLTEzNzksNyArMTM1MCw3IEBACiAjZW5kaWYKIAogI2lmZGVmIFBOR19SRUFEX1NUUklQXzE2X1RPXzhfU1VQUE9SVEVECi0jZGVmaW5lIFBOR19SRUFEXzE2X1RPXzhfU1VQUE9SVEVEIC8qIE5hbWUgcHJpb3IgdG8gMS41LjQgKi8KKyNkZWZpbmUgUE5HX1JFQURfMTZfVE9fOCBTVVBQT1JURUQgLyogTmFtZSBwcmlvciB0byAxLjUuNCAqLwogLyogU3RyaXAgdGhlIHNlY29uZCBieXRlIG9mIGluZm9ybWF0aW9uIGZyb20gYSAxNi1iaXQgZGVwdGggZmlsZS4gKi8KIFBOR19FWFBPUlQoNDgsIHZvaWQsIHBuZ19zZXRfc3RyaXBfMTYsIChwbmdfc3RydWN0cnAgcG5nX3B0cikpOwogI2VuZGlmCkBAIC0xNTMwLDggKzE1MDEsOCBAQAogI2RlZmluZSBQTkdfRklMVEVSX1VQICAgICAgMHgyMAogI2RlZmluZSBQTkdfRklMVEVSX0FWRyAgICAgMHg0MAogI2RlZmluZSBQTkdfRklMVEVSX1BBRVRIICAgMHg4MAotI2RlZmluZSBQTkdfRkFTVF9GSUxURVJTIChQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8IFBOR19GSUxURVJfVVApCi0jZGVmaW5lIFBOR19BTExfRklMVEVSUyAoUE5HX0ZBU1RfRklMVEVSUyB8IFBOR19GSUxURVJfQVZHIHwgUE5HX0ZJTFRFUl9QQUVUSCkKKyNkZWZpbmUgUE5HX0FMTF9GSUxURVJTIChQTkdfRklMVEVSX05PTkUgfCBQTkdfRklMVEVSX1NVQiB8IFBOR19GSUxURVJfVVAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9BVkcgfCBQTkdfRklMVEVSX1BBRVRIKQogCiAvKiBGaWx0ZXIgdmFsdWVzIChub3QgZmxhZ3MpIC0gdXNlZCBpbiBwbmd3cml0ZS5jLCBwbmd3dXRpbC5jIGZvciBub3cuCiAgKiBUaGVzZSBkZWZpbmVzIHNob3VsZCBOT1QgYmUgY2hhbmdlZC4KQEAgLTE4MDgsMjEgKzE3NzksMjEgQEAKICNkZWZpbmUgUE5HX1NFVF9XSUxMX0ZSRUVfREFUQSAxCiAjZGVmaW5lIFBOR19VU0VSX1dJTExfRlJFRV9EQVRBIDIKIC8qIEZsYWdzIGZvciBwbmdfcHRyLT5mcmVlX21lIGFuZCBpbmZvX3B0ci0+ZnJlZV9tZSAqLwotI2RlZmluZSBQTkdfRlJFRV9ISVNUIDB4MDAwOFUKLSNkZWZpbmUgUE5HX0ZSRUVfSUNDUCAweDAwMTBVCi0jZGVmaW5lIFBOR19GUkVFX1NQTFQgMHgwMDIwVQotI2RlZmluZSBQTkdfRlJFRV9ST1dTIDB4MDA0MFUKLSNkZWZpbmUgUE5HX0ZSRUVfUENBTCAweDAwODBVCi0jZGVmaW5lIFBOR19GUkVFX1NDQUwgMHgwMTAwVQorI2RlZmluZSBQTkdfRlJFRV9ISVNUIDB4MDAwOAorI2RlZmluZSBQTkdfRlJFRV9JQ0NQIDB4MDAxMAorI2RlZmluZSBQTkdfRlJFRV9TUExUIDB4MDAyMAorI2RlZmluZSBQTkdfRlJFRV9ST1dTIDB4MDA0MAorI2RlZmluZSBQTkdfRlJFRV9QQ0FMIDB4MDA4MAorI2RlZmluZSBQTkdfRlJFRV9TQ0FMIDB4MDEwMAogI2lmZGVmIFBOR19TVE9SRV9VTktOT1dOX0NIVU5LU19TVVBQT1JURUQKLSMgIGRlZmluZSBQTkdfRlJFRV9VTktOIDB4MDIwMFUKKyMgIGRlZmluZSBQTkdfRlJFRV9VTktOIDB4MDIwMAogI2VuZGlmCi0vKiAgICAgIFBOR19GUkVFX0xJU1QgMHgwNDAwVSAgIHJlbW92ZWQgaW4gMS42LjAgYmVjYXVzZSBpdCBpcyBpZ25vcmVkICovCi0jZGVmaW5lIFBOR19GUkVFX1BMVEUgMHgxMDAwVQotI2RlZmluZSBQTkdfRlJFRV9UUk5TIDB4MjAwMFUKLSNkZWZpbmUgUE5HX0ZSRUVfVEVYVCAweDQwMDBVCi0jZGVmaW5lIFBOR19GUkVFX0FMTCAgMHg3ZmZmVQotI2RlZmluZSBQTkdfRlJFRV9NVUwgIDB4NDIyMFUgLyogUE5HX0ZSRUVfU1BMVHxQTkdfRlJFRV9URVhUfFBOR19GUkVFX1VOS04gKi8KKy8qICAgICAgUE5HX0ZSRUVfTElTVCAweDA0MDAgICAgcmVtb3ZlZCBpbiAxLjYuMCBiZWNhdXNlIGl0IGlzIGlnbm9yZWQgKi8KKyNkZWZpbmUgUE5HX0ZSRUVfUExURSAweDEwMDAKKyNkZWZpbmUgUE5HX0ZSRUVfVFJOUyAweDIwMDAKKyNkZWZpbmUgUE5HX0ZSRUVfVEVYVCAweDQwMDAKKyNkZWZpbmUgUE5HX0ZSRUVfQUxMICAweDdmZmYKKyNkZWZpbmUgUE5HX0ZSRUVfTVVMICAweDQyMjAgLyogUE5HX0ZSRUVfU1BMVHxQTkdfRlJFRV9URVhUfFBOR19GUkVFX1VOS04gKi8KIAogI2lmZGVmIFBOR19VU0VSX01FTV9TVVBQT1JURUQKIFBOR19FWFBPUlRBKDEwMCwgcG5nX3ZvaWRwLCBwbmdfbWFsbG9jX2RlZmF1bHQsIChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKQEAgLTI5NDYsMTkgKzI5MTcsMTIgQEAKICAgICAqIGlzIHRoZSBtaW5pbXVtICdyb3cgc3RyaWRlJywgdGhlIG1pbmltdW0gY291bnQgb2YgY29tcG9uZW50cyBiZXR3ZWVuIGVhY2gKICAgICAqIHJvdy4gIEZvciBhIGNvbG9yLW1hcHBlZCBpbWFnZSB0aGlzIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBieXRlcyBpbiBhCiAgICAgKiByb3cuCi0gICAgKgotICAgICogV0FSTklORzogdGhpcyBtYWNybyBvdmVyZmxvd3MgZm9yIHNvbWUgaW1hZ2VzIHdpdGggbW9yZSB0aGFuIG9uZSBjb21wb25lbnQKLSAgICAqIGFuZCB2ZXJ5IGxhcmdlIGltYWdlIHdpZHRocy4gIGxpYnBuZyB3aWxsIHJlZnVzZSB0byBwcm9jZXNzIGFuIGltYWdlIHdoZXJlCi0gICAgKiB0aGlzIG1hY3JvIHdvdWxkIG92ZXJmbG93LgogICAgICovCiAKICNkZWZpbmUgUE5HX0lNQUdFX0JVRkZFUl9TSVpFKGltYWdlLCByb3dfc3RyaWRlKVwKICAgIChQTkdfSU1BR0VfUElYRUxfQ09NUE9ORU5UX1NJWkUoKGltYWdlKS5mb3JtYXQpKihpbWFnZSkuaGVpZ2h0Kihyb3dfc3RyaWRlKSkKICAgIC8qIFJldHVybiB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIGFuIGltYWdlIGJ1ZmZlciBnaXZlbiBhIHBuZ19pbWFnZSBhbmQgYSByb3cKICAgICAqIHN0cmlkZSAtIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0byBsZWF2ZSBzcGFjZSBmb3IgaW4gZWFjaCByb3cuCi0gICAgKgotICAgICogV0FSTklORzogdGhpcyBtYWNybyBvdmVyZmxvd3MgYSAzMi1iaXQgaW50ZWdlciBmb3Igc29tZSBsYXJnZSBQTkcgaW1hZ2VzLAotICAgICogbGlicG5nIHdpbGwgcmVmdXNlIHRvIHByb2Nlc3MgYW4gaW1hZ2Ugd2hlcmUgc3VjaCBhbiBvdmVyZmxvdyB3b3VsZCBvY2N1ci4KICAgICAqLwogCiAjZGVmaW5lIFBOR19JTUFHRV9TSVpFKGltYWdlKVwKQEAgLTMwNzksNiArMzA0Myw3IEBACiAjZW5kaWYgLyogU0lNUExJRklFRF9SRUFEICovCiAKICNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQKKyNpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVECiAvKiBXUklURSBBUElTCiAgKiAtLS0tLS0tLS0tCiAgKiBGb3Igd3JpdGUgeW91IG11c3QgaW5pdGlhbGl6ZSBhIHBuZ19pbWFnZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgdGhlIGltYWdlIHRvCkBAIC0zMDk1LDcgKzMwNjAsNiBAQAogICogICAgdmFsdWVzIGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBjb2xvcnMgaW4gc1JHQi4KICAqIGNvbG9ybWFwX2VudHJpZXM6IHNldCB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGNvbG9yLW1hcCAoMCB0byAyNTYpCiAgKi8KLSNpZmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVERJT19TVVBQT1JURUQKIFBOR19FWFBPUlQoMjM5LCBpbnQsIHBuZ19pbWFnZV93cml0ZV90b19maWxlLCAocG5nX2ltYWdlcCBpbWFnZSwKICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBjb252ZXJ0X3RvXzhiaXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKICAgIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApKTsKQEAgLTMxMDUsOSArMzA2OSw4IEBACiAgICBpbnQgY29udmVydF90b184X2JpdCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsCiAgICBjb25zdCB2b2lkICpjb2xvcm1hcCkpOwogICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiAoRklMRSopLiAqLwotI2VuZGlmIC8qIFNJTVBMSUZJRURfV1JJVEVfU1RESU8gKi8KIAotLyogV2l0aCBhbGwgd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGggMTYtYml0CisvKiBXaXRoIGJvdGggd3JpdGUgQVBJcyBpZiBpbWFnZSBpcyBpbiBvbmUgb2YgdGhlIGxpbmVhciBmb3JtYXRzIHdpdGggMTYtYml0CiAgKiBkYXRhIHRoZW4gc2V0dGluZyBjb252ZXJ0X3RvXzhfYml0IHdpbGwgY2F1c2UgdGhlIG91dHB1dCB0byBiZSBhbiA4LWJpdCBQTkcKICAqIGdhbW1hIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzUkdCIHNwZWNpZmljYXRpb24sIG90aGVyd2lzZSBhIDE2LWJpdCBsaW5lYXIKICAqIGVuY29kZWQgUE5HIGZpbGUgaXMgd3JpdHRlbi4KQEAgLTMxMTksMTAzICszMDgyLDEzIEBACiAgKgogICogV2l0aCBhbGwgQVBJcyByb3dfc3RyaWRlIGlzIGhhbmRsZWQgYXMgaW4gdGhlIHJlYWQgQVBJcyAtIGl0IGlzIHRoZSBzcGFjaW5nCiAgKiBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQgaW4gY29tcG9uZW50IHNpemVkIHVuaXRzICgxIG9yIDIgYnl0ZXMpIGFuZCBpZgotICogbmVnYXRpdmUgaW5kaWNhdGVzIGEgYm90dG9tLXVwIHJvdyBsYXlvdXQgaW4gdGhlIGJ1ZmZlci4gIElmIHJvd19zdHJpZGUgaXMKLSAqIHplcm8sIGxpYnBuZyB3aWxsIGNhbGN1bGF0ZSBpdCBmb3IgeW91IGZyb20gdGhlIGltYWdlIHdpZHRoIGFuZCBudW1iZXIgb2YKLSAqIGNoYW5uZWxzLgorICogbmVnYXRpdmUgaW5kaWNhdGVzIGEgYm90dG9tLXVwIHJvdyBsYXlvdXQgaW4gdGhlIGJ1ZmZlci4gIElmIHJvd19zdHJpZGUgaXMgemVybywKKyAqIGxpYnBuZyB3aWxsIGNhbGN1bGF0ZSBpdCBmb3IgeW91IGZyb20gdGhlIGltYWdlIHdpZHRoIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMuCiAgKgotICogTm90ZSB0aGF0IHRoZSB3cml0ZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmxhY2luZywgc3ViLTgtYml0IHBpeGVscyBvcgotICogbW9zdCBhbmNpbGxhcnkgY2h1bmtzLiAgSWYgeW91IG5lZWQgdG8gd3JpdGUgdGV4dCBjaHVua3MgKGUuZy4gZm9yIGNvcHlyaWdodAotICogbm90aWNlcykgeW91IG5lZWQgdG8gdXNlIG9uZSBvZiB0aGUgb3RoZXIgQVBJcy4KKyAqIE5vdGUgdGhhdCB0aGUgd3JpdGUgQVBJIGRvZXMgbm90IHN1cHBvcnQgaW50ZXJsYWNpbmcsIHN1Yi04LWJpdCBwaXhlbHMsIGluZGV4ZWQKKyAqIFBORyAoY29sb3JfdHlwZSAzKSBvciBtb3N0IGFuY2lsbGFyeSBjaHVua3MuCiAgKi8KLQotUE5HX0VYUE9SVCgyNDUsIGludCwgcG5nX2ltYWdlX3dyaXRlX3RvX21lbW9yeSwgKHBuZ19pbWFnZXAgaW1hZ2UsIHZvaWQgKm1lbW9yeSwKLSAgIHBuZ19hbGxvY19zaXplX3QgKiBQTkdfUkVTVFJJQ1QgbWVtb3J5X2J5dGVzLCBpbnQgY29udmVydF90b184X2JpdCwKLSAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgcG5nX2ludF8zMiByb3dfc3RyaWRlLCBjb25zdCB2b2lkICpjb2xvcm1hcCkpOwotICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyLiAgVGhlIGZ1bmN0aW9uIGJvdGggd3JpdGVzIHRoZQotICAgICogd2hvbGUgUE5HIGRhdGEgc3RyZWFtIHRvICptZW1vcnkgYW5kIHVwZGF0ZXMgKm1lbW9yeV9ieXRlcyB3aXRoIHRoZSBjb3VudAotICAgICogb2YgYnl0ZXMgd3JpdHRlbi4KLSAgICAqCi0gICAgKiAnbWVtb3J5JyBtYXkgYmUgTlVMTC4gIEluIHRoaXMgY2FzZSAqbWVtb3J5X2J5dGVzIGlzIG5vdCByZWFkIGhvd2V2ZXIgb24KLSAgICAqIHN1Y2Nlc3MgdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiB3aWxsIHN0aWxsIGJlCi0gICAgKiBzdG9yZWQgaW4gKm1lbW9yeV9ieXRlcy4gIE9uIGZhaWx1cmUgKm1lbW9yeV9ieXRlcyB3aWxsIGNvbnRhaW4gMC4KLSAgICAqCi0gICAgKiBJZiAnbWVtb3J5JyBpcyBub3QgTlVMTCBpdCBtdXN0IHBvaW50IHRvIG1lbW9yeVsqbWVtb3J5X2J5dGVzXSBvZgotICAgICogd3JpdGVhYmxlIG1lbW9yeS4KLSAgICAqCi0gICAgKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzIG1lbW9yeVsqbWVtb3J5X2J5dGVzXSAoaWYgJ21lbW9yeScgaXMgbm90Ci0gICAgKiBOVUxMKSBjb250YWlucyB0aGUgd3JpdHRlbiBQTkcgZGF0YS4gICptZW1vcnlfYnl0ZXMgd2lsbCBhbHdheXMgYmUgbGVzcwotICAgICogdGhhbiBvciBlcXVhbCB0byB0aGUgb3JpZ2luYWwgdmFsdWUuCi0gICAgKgotICAgICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UgYW5kICptZW1vcnlfYnl0ZXMgd2FzIG5vdCBjaGFuZ2VkIGFuIGVycm9yCi0gICAgKiBvY2N1cmVkIGR1cmluZyB3cml0ZS4gIElmICptZW1vcnlfYnl0ZXMgd2FzIGNoYW5nZWQsIG9yIGlzIG5vdCAwIGlmCi0gICAgKiAnbWVtb3J5JyB3YXMgTlVMTCwgdGhlIHdyaXRlIHdvdWxkIGhhdmUgc3VjY2VlZGVkIGJ1dCBmb3IgdGhlIG1lbW9yeQotICAgICogYnVmZmVyIGJlaW5nIHRvbyBzbWFsbC4gICptZW1vcnlfYnl0ZXMgY29udGFpbnMgdGhlIHJlcXVpcmVkIG51bWJlciBvZgotICAgICogYnl0ZXMgYW5kIHdpbGwgYmUgYmlnZ2VyIHRoYXQgdGhlIG9yaWdpbmFsIHZhbHVlLgotICAgICovCi0KLSNkZWZpbmUgcG5nX2ltYWdlX3dyaXRlX2dldF9tZW1vcnlfc2l6ZShpbWFnZSwgc2l6ZSwgY29udmVydF90b184X2JpdCwgYnVmZmVyLFwKLSAgIHJvd19zdHJpZGUsIGNvbG9ybWFwKVwKLSAgIHBuZ19pbWFnZV93cml0ZV90b19tZW1vcnkoJihpbWFnZSksIDAsICYoc2l6ZSksIGNvbnZlcnRfdG9fOF9iaXQsIGJ1ZmZlcixcCi0gICAgICAgICByb3dfc3RyaWRlLCBjb2xvcm1hcCkKLSAgIC8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiAnc2l6ZScgcmVxdWlyZWQgdG8gY29tcHJlc3MgdGhpcyBpbWFnZS4KLSAgICAqIFRoZSBwbmdfaW1hZ2Ugc3RydWN0dXJlICdpbWFnZScgbXVzdCBiZSBmaWxsZWQgaW4gYXMgaW4gdGhlIGFib3ZlCi0gICAgKiBmdW5jdGlvbiBhbmQgbXVzdCBub3QgYmUgY2hhbmdlZCBiZWZvcmUgdGhlIGFjdHVhbCB3cml0ZSBjYWxsLCB0aGUgYnVmZmVyCi0gICAgKiBhbmQgYWxsIG90aGVyIHBhcmFtZXRlcnMgbXVzdCBhbHNvIGJlIGlkZW50aWNhbCB0byB0aGF0IGluIHRoZSBmaW5hbAotICAgICogd3JpdGUgY2FsbC4gIFRoZSAnc2l6ZScgdmFyaWFibGUgbmVlZCBub3QgYmUgaW5pdGlhbGl6ZWQuCi0gICAgKgotICAgICogTk9URTogdGhlIG1hY3JvIHJldHVybnMgdHJ1ZS9mYWxzZSwgaWYgZmFsc2UgaXMgcmV0dXJuZWQgJ3NpemUnIHdpbGwgYmUKLSAgICAqIHNldCB0byB6ZXJvIGFuZCB0aGUgd3JpdGUgZmFpbGVkIGFuZCBwcm9iYWJseSB3aWxsIGZhaWwgaWYgdHJpZWQgYWdhaW4uCi0gICAgKi8KLQotLyogWW91IGNhbiBwcmUtYWxsb2NhdGUgdGhlIGJ1ZmZlciBieSBtYWtpbmcgc3VyZSBpdCBpcyBvZiBzdWZmaWNpZW50IHNpemUKLSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBhY2hpZXZlZC4gIFRoZSBidWZmZXIgc2l6ZSB3aWxsCi0gKiBhbHdheXMgYmUgYmlnZ2VyIHRoYW4gdGhlIG9yaWdpbmFsIGltYWdlIGFuZCBpdCB3aWxsIG5ldmVyIGJlIGZpbGxlZC4gIFRoZQotICogZm9sbG93aW5nIG1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gYXNzaXN0IGluIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBQTkdfSU1BR0VfREFUQV9TSVpFKGltYWdlKSAoUE5HX0lNQUdFX1NJWkUoaW1hZ2UpKyhpbWFnZSkuaGVpZ2h0KQotICAgLyogVGhlIG51bWJlciBvZiB1bmNvbXByZXNzZWQgYnl0ZXMgaW4gdGhlIFBORyBieXRlIGVuY29kaW5nIG9mIHRoZSBpbWFnZTsKLSAgICAqIHVuY29tcHJlc3NpbmcgdGhlIFBORyBJREFUIGRhdGEgd2lsbCBnaXZlIHRoaXMgbnVtYmVyIG9mIGJ5dGVzLgotICAgICoKLSAgICAqIE5PVEU6IHdoaWxlIFBOR19JTUFHRV9TSVpFIGNhbm5vdCBvdmVyZmxvdyBmb3IgYW4gaW1hZ2UgaW4gbWVtb3J5IHRoaXMKLSAgICAqIG1hY3JvIGNhbiBiZWNhdXNlIG9mIHRoZSBleHRyYSBieXRlcyB1c2VkIGluIHRoZSBQTkcgYnl0ZSBlbmNvZGluZy4gIFlvdQotICAgICogbmVlZCB0byBhdm9pZCB0aGlzIG1hY3JvIGlmIHlvdXIgaW1hZ2Ugc2l6ZSBhcHByb2FjaGVzIDJeMzAgaW4gd2lkdGggb3IKLSAgICAqIGhlaWdodC4gIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlc2UgbWFjcm9zOyB0aGV5IGFsbCBwcm9kdWNlCi0gICAgKiBiaWdnZXIgbnVtYmVycyB0aGFuIHRoZSBhY3R1YWwgaW4tbWVtb3J5IGltYWdlIHNpemUuCi0gICAgKi8KLSNpZm5kZWYgUE5HX1pMSUJfTUFYX1NJWkUKLSMgIGRlZmluZSBQTkdfWkxJQl9NQVhfU0laRShiKSAoKGIpKygoKGIpKzdVKT4+MykrKCgoYikrNjNVKT4+NikrMTFVKQotICAgLyogQW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBjb21wcmVzc2VkIGJ5dGVzIGdpdmVuICdiJyB1bmNvbXByZXNzZWQKLSAgICAqIGJ5dGVzLiAgVGhpcyBpcyBiYXNlZCBvbiBkZWZsYXRlQm91bmRzKCkgaW4gemxpYjsgZGlmZmVyZW50Ci0gICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgemxpYiBjb21wcmVzc2lvbiBtYXkgY29uY2VpdmFibHkgcHJvZHVjZSBtb3JlIGRhdGEgc28KLSAgICAqIGlmIHlvdXIgemxpYiBpbXBsZW1lbnRhdGlvbiBpcyBub3QgemxpYiBpdHNlbGYgcmVkZWZpbmUgdGhpcyBtYWNybwotICAgICogYXBwcm9wcmlhdGVseS4KLSAgICAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUE5HX0lNQUdFX0NPTVBSRVNTRURfU0laRV9NQVgoaW1hZ2UpXAotICAgUE5HX1pMSUJfTUFYX1NJWkUoKHBuZ19hbGxvY19zaXplX3QpUE5HX0lNQUdFX0RBVEFfU0laRShpbWFnZSkpCi0gICAvKiBBbiB1cHBlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBpbiB0aGUgUE5HIElEQVQgY2h1bmtzLiAqLwotCi0jZGVmaW5lIFBOR19JTUFHRV9QTkdfU0laRV9NQVhfKGltYWdlLCBpbWFnZV9zaXplKVwKLSAgICgoOFUvKnNpZyovKzI1VS8qSUhEUiovKzE2VS8qZ0FNQSovKzQ0VS8qY0hSTSovKzEyVS8qSUVORCovK1wKLSAgICAoKChpbWFnZSkuZm9ybWF0JlBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCk/Lypjb2xvcm1hcDogUExURSwgdFJOUyovXAotICAgICAxMlUrM1UqKGltYWdlKS5jb2xvcm1hcF9lbnRyaWVzLypQTFRFIGRhdGEqLytcCi0gICAgICgoKGltYWdlKS5mb3JtYXQmUE5HX0ZPUk1BVF9GTEFHX0FMUEhBKT9cCi0gICAgICAxMlUvKnRSTlMqLysoaW1hZ2UpLmNvbG9ybWFwX2VudHJpZXM6MFUpOjBVKStcCi0gICAgMTJVKSsoMTJVKigoaW1hZ2Vfc2l6ZSkvUE5HX1pCVUZfU0laRSkpLypJREFUKi8rKGltYWdlX3NpemUpKQotICAgLyogQSBoZWxwZXIgZm9yIHRoZSBmb2xsb3dpbmcgbWFjcm87IGlmIHlvdXIgY29tcGlsZXIgY2Fubm90IGhhbmRsZSB0aGUKLSAgICAqIGZvbGxvd2luZyBtYWNybyB1c2UgdGhpcyBvbmUgd2l0aCB0aGUgcmVzdWx0IG9mCi0gICAgKiBQTkdfSU1BR0VfQ09NUFJFU1NFRF9TSVpFX01BWChpbWFnZSkgYXMgdGhlIHNlY29uZCBhcmd1bWVudCAobW9zdAotICAgICogY29tcGlsZXJzIHNob3VsZCBoYW5kbGUgdGhpcyBqdXN0IGZpbmUuKQotICAgICovCi0KLSNkZWZpbmUgUE5HX0lNQUdFX1BOR19TSVpFX01BWChpbWFnZSlcCi0gICBQTkdfSU1BR0VfUE5HX1NJWkVfTUFYXyhpbWFnZSwgUE5HX0lNQUdFX0NPTVBSRVNTRURfU0laRV9NQVgoaW1hZ2UpKQotICAgLyogQW4gdXBwZXIgYm91bmQgb24gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgUE5HIGRhdGEgc3RyZWFtIGZvciAnaW1hZ2UnLgotICAgICogVGhlIHJlc3VsdCBpcyBvZiB0eXBlIHBuZ19hbGxvY19zaXplX3QsIG9uIDMyLWJpdCBzeXN0ZW1zIHRoaXMgbWF5Ci0gICAgKiBvdmVyZmxvdyBldmVuIHRob3VnaCBQTkdfSU1BR0VfREFUQV9TSVpFIGRvZXMgbm90IG92ZXJmbG93OyB0aGUgd3JpdGUgd2lsbAotICAgICogcnVuIG91dCBvZiBidWZmZXIgc3BhY2UgYnV0IHJldHVybiBhIGNvcnJlY3RlZCBzaXplIHdoaWNoIHNob3VsZCB3b3JrLgotICAgICovCisjZW5kaWYgLyogU1RESU8gKi8KICNlbmRpZiAvKiBTSU1QTElGSUVEX1dSSVRFICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIEVORCBPRiBTSU1QTElGSUVEIEFQSQpAQCAtMzI3Myw3ICszMTQ2LDcgQEAKICAqIG9uZSB0byB1c2UgaXMgb25lIG1vcmUgdGhhbiB0aGlzLikKICAqLwogI2lmZGVmIFBOR19FWFBPUlRfTEFTVF9PUkRJTkFMCi0gIFBOR19FWFBPUlRfTEFTVF9PUkRJTkFMKDI0NSk7CisgIFBOR19FWFBPUlRfTEFTVF9PUkRJTkFMKDI0NCk7CiAjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdjb25mLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdjb25mLmgKaW5kZXggZmQzNWIyYS4uNDgyZGNmNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nY29uZi5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2NvbmYuaApAQCAtMjksOSArMjksOSBAQAogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCi0gKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjMsIEp1bmUgOSwgMjAxNgorICogbGlicG5nIHZlcnNpb24gMS42LjIwLCBEZWNlbWJlciAzLCAyMDE1CiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2RlYnVnLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdkZWJ1Zy5oCmluZGV4IGY2NWJiOGEuLmQzMDgxNTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2RlYnVnLmgKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nZGVidWcuaApAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi44IFtEZWNlbWJlciAxOSwgMjAxM10KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdlcnJvci5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nZXJyb3IuYwppbmRleCA5MjA5MzVhLi43YWIxY2ZlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdlcnJvci5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2Vycm9yLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgogICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTUgW05vdmVtYmVyIDIwLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKQEAgLTcyLDcgKzcyLDcgQEAKICAgIGlmIChwbmdfcHRyICE9IE5VTEwpCiAgICB7CiAgICAgICBpZiAoKHBuZ19wdHItPmZsYWdzICYKLSAgICAgICAgIChQTkdfRkxBR19TVFJJUF9FUlJPUl9OVU1CRVJTfFBOR19GTEFHX1NUUklQX0VSUk9SX1RFWFQpKSAhPSAwKQorICAgICAgICAgKFBOR19GTEFHX1NUUklQX0VSUk9SX05VTUJFUlN8UE5HX0ZMQUdfU1RSSVBfRVJST1JfVEVYVCkpICE9IDAKICAgICAgIHsKICAgICAgICAgIGlmICgqZXJyb3JfbWVzc2FnZSA9PSBQTkdfTElURVJBTF9TSEFSUCkKICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2dldC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nZ2V0LmMKaW5kZXggM2IzZmUxOS4uYTJjOWQzYSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nZ2V0LmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nZ2V0LmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgogICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTcgW01hcmNoIDI2LCAyMDE1XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKQEAgLTQ4NCwxMSArNDg0LDExIEBACiAgICByZXR1cm4gKHJldHZhbCk7CiB9CiAjZW5kaWYgLyogcEhZcyAqLwotI2VuZGlmIC8qIElOQ0hfQ09OVkVSU0lPTlMgKi8KKyNlbmRpZiAgLyogSU5DSF9DT05WRVJTSU9OUyAqLwogCiAvKiBwbmdfZ2V0X2NoYW5uZWxzIHJlYWxseSBiZWxvbmdzIGluIGhlcmUsIHRvbywgYnV0IGl0J3MgYmVlbiBhcm91bmQgbG9uZ2VyICovCiAKLSNlbmRpZiAvKiBFQVNZX0FDQ0VTUyAqLworI2VuZGlmICAvKiBFQVNZX0FDQ0VTUyAqLwogCiAKIHBuZ19ieXRlIFBOR0FQSQpAQCAtMTE3MCwxOSArMTE3MCwxOSBAQAogICAgICAgcmV0dXJuIDA7CiAKICNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDApCisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSVNfUkVBRF9TVFJVQ1QpICE9IDApCiAjZW5kaWYKICAgIHsKICNpZmRlZiBQTkdfU0VRVUVOVElBTF9SRUFEX1NVUFBPUlRFRAotICAgICAgcmV0dXJuIHBuZ19wdHItPklEQVRfcmVhZF9zaXplOworICAgICAgICAgcmV0dXJuIHBuZ19wdHItPklEQVRfcmVhZF9zaXplOwogI2Vsc2UKLSAgICAgIHJldHVybiBQTkdfSURBVF9SRUFEX1NJWkU7CisgICAgICAgICByZXR1cm4gUE5HX0lEQVRfUkVBRF9TSVpFOwogI2VuZGlmCiAgICB9CiAKICNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECi0gICBlbHNlCi0gICAgICByZXR1cm4gcG5nX3B0ci0+emJ1ZmZlcl9zaXplOworICAgICAgZWxzZQorICAgICAgICAgcmV0dXJuIHBuZ19wdHItPnpidWZmZXJfc2l6ZTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdpbmZvLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdpbmZvLmgKaW5kZXggMWRiZjc4NS4uZmYzNTA4MiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5naW5mby5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2luZm8uaApAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xIFtNYXJjaCAyOCwgMjAxM10KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDEzIEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdsaWJjb25mLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdsaWJjb25mLmgKaW5kZXggYmQxNGQ2ZS4uYmNiMTY3ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nbGliY29uZi5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ2xpYmNvbmYuaApAQCAtMjcsMTUgKzI3LDE2IEBACiAvKiBsaWJwbmcgU1RBTkRBUkQgQVBJIERFRklOSVRJT04gKi8KIAogLyogcG5nbGliY29uZi5oIC0gbGlicmFyeSBidWlsZCBjb25maWd1cmF0aW9uICovCisKIC8qIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqLwogCi0vKiBsaWJwbmcgdmVyc2lvbiAxLjYuMjMsIEp1bmUgOSwgMjAxNiAqLworLyogbGlicG5nIHZlcnNpb24gMS42LjIwLCBEZWNlbWJlciAzLCAyMDE1ICovCiAKLS8qIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbiAqLworLyogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uICovCiAKIC8qIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgbGlicG5nIGxpY2Vuc2UuICovCiAvKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBkaXNjbGFpbWVyICovCkBAIC0xNDAsNyArMTQxLDYgQEAKICNkZWZpbmUgUE5HX1NJTVBMSUZJRURfUkVBRF9TVVBQT1JURUQKIC8qI3VuZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX0FGSVJTVF9TVVBQT1JURUQqLwogLyojdW5kZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfQkdSX1NVUFBPUlRFRCovCi0vKiN1bmRlZiBQTkdfU0lNUExJRklFRF9XUklURV9TVERJT19TVVBQT1JURUQqLwogLyojdW5kZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1VQUE9SVEVEKi8KICNkZWZpbmUgUE5HX1NURElPX1NVUFBPUlRFRAogI2RlZmluZSBQTkdfU1RPUkVfVU5LTk9XTl9DSFVOS1NfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdtZW0uYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ21lbS5jCmluZGV4IDk2NzYxMWYuLjcxYzY5NTYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ21lbS5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ21lbS5jCkBAIC0zMCw3ICszMCw3IEBACiAgKiBmaWxlIGFuZCwgcGVyIGl0cyB0ZXJtcywgc2hvdWxkIG5vdCBiZSByZW1vdmVkOgogICoKICAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE1IFtOb3ZlbWJlciAyMCwgMjAxNF0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE0IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdwcmVhZC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncHJlYWQuYwppbmRleCAyODllOTRjLi5lMTdjOTkzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdwcmVhZC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3ByZWFkLmMKQEAgLTI5LDggKzI5LDggQEAKICAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjMgW0p1bmUgOSwgMjAxNl0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTggW0p1bHkgMjMsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKQEAgLTIzOCwxNCArMjM4LDEyIEBACiAgICAgICAgICAgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9QTFRFKSA9PSAwKQogICAgICAgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJNaXNzaW5nIFBMVEUgYmVmb3JlIElEQVQiKTsKIAorICAgICAgcG5nX3B0ci0+bW9kZSB8PSBQTkdfSEFWRV9JREFUOwogICAgICAgcG5nX3B0ci0+cHJvY2Vzc19tb2RlID0gUE5HX1JFQURfSURBVF9NT0RFOwogCi0gICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9JREFUKSAhPSAwKQotICAgICAgICAgaWYgKChwbmdfcHRyLT5tb2RlICYgUE5HX0hBVkVfQ0hVTktfQUZURVJfSURBVCkgPT0gMCkKLSAgICAgICAgICAgIGlmIChwbmdfcHRyLT5wdXNoX2xlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0lEQVQ7CisgICAgICBpZiAoKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSA9PSAwKQorICAgICAgICAgaWYgKHBuZ19wdHItPnB1c2hfbGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19BRlRFUl9JREFUKSAhPSAwKQogICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiVG9vIG1hbnkgSURBVHMgZm91bmQiKTsKQEAgLTUyOSwxMCArNTI3LDcgQEAKICAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiSW5zdWZmaWNpZW50IG1lbW9yeSBmb3Igc2F2ZV9idWZmZXIiKTsKICAgICAgIH0KIAotICAgICAgaWYgKG9sZF9idWZmZXIpCi0gICAgICAgICBtZW1jcHkocG5nX3B0ci0+c2F2ZV9idWZmZXIsIG9sZF9idWZmZXIsIHBuZ19wdHItPnNhdmVfYnVmZmVyX3NpemUpOwotICAgICAgZWxzZSBpZiAocG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSkKLSAgICAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAic2F2ZV9idWZmZXIgZXJyb3IiKTsKKyAgICAgIG1lbWNweShwbmdfcHRyLT5zYXZlX2J1ZmZlciwgb2xkX2J1ZmZlciwgcG5nX3B0ci0+c2F2ZV9idWZmZXJfc2l6ZSk7CiAgICAgICBwbmdfZnJlZShwbmdfcHRyLCBvbGRfYnVmZmVyKTsKICAgICAgIHBuZ19wdHItPnNhdmVfYnVmZmVyX21heCA9IG5ld19tYXg7CiAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdwcml2LmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdwcml2LmgKaW5kZXggMDVlZDFlYi4uZjVjMTUzMiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncHJpdi5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3ByaXYuaApAQCAtMjksOCArMjksOCBAQAogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMiBbTWF5IDI2LCAyMDE2XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgogICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCiAgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCiAgKgpAQCAtMTk0NSw5ICsxOTQ1LDYgQEAKICAgIChwbmdfc3RydWN0cCBwbmdfcHRyLCB1bnNpZ25lZCBpbnQgYnBwKSwgUE5HX0VNUFRZKTsKICNlbmRpZgogCi1QTkdfSU5URVJOQUxfRlVOQ1RJT04ocG5nX3VpbnRfMzIsIHBuZ19jaGVja19rZXl3b3JkLCAocG5nX3N0cnVjdHJwIHBuZ19wdHIsCi0gICBwbmdfY29uc3RfY2hhcnAga2V5LCBwbmdfYnl0ZXAgbmV3X2tleSksIFBOR19FTVBUWSk7Ci0KIC8qIE1haW50YWluZXI6IFB1dCBuZXcgcHJpdmF0ZSBwcm90b3R5cGVzIGhlcmUgXiAqLwogCiAjaW5jbHVkZSAicG5nZGVidWcuaCIKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3JlYWQuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3JlYWQuYwppbmRleCA4NjUwNTU2Li42OWQ1YmUyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdyZWFkLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncmVhZC5jCkBAIC0yOSw4ICsyOSw4IEBACiAgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCiAgKiBmaWxlIGFuZCwgcGVyIGl0cyB0ZXJtcywgc2hvdWxkIG5vdCBiZSByZW1vdmVkOgogICoKLSAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjIzIFtKdW5lIDksIDIwMTZdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiwyMDA0LDIwMDYtMjAxNiBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE3IFtNYXJjaCAyNiwgMjAxNV0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgogICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCiAgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCiAgKgpAQCAtMTU1LDEwICsxNTUsNyBAQAogICAgICAgfQogCiAgICAgICBlbHNlIGlmICgocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0lEQVQpICE9IDApCi0gICAgICB7Ci0gICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQ7CiAgICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19BRlRFUl9JREFUOwotICAgICAgfQogCiAgICAgICAvKiBUaGlzIHNob3VsZCBiZSBhIGJpbmFyeSBzdWJkaXZpc2lvbiBzZWFyY2ggb3IgYSBoYXNoIGZvcgogICAgICAgICogbWF0Y2hpbmcgdGhlIGNodW5rIG5hbWUgcmF0aGVyIHRoYW4gYSBsaW5lYXIgc2VhcmNoLgpAQCAtODE2LDkgKzgxMyw2IEBACiAgICAgICBwbmdfdWludF8zMiBsZW5ndGggPSBwbmdfcmVhZF9jaHVua19oZWFkZXIocG5nX3B0cik7CiAgICAgICBwbmdfdWludF8zMiBjaHVua19uYW1lID0gcG5nX3B0ci0+Y2h1bmtfbmFtZTsKIAotICAgICAgaWYgKGNodW5rX25hbWUgIT0gcG5nX0lEQVQpCi0gICAgICAgICBwbmdfcHRyLT5tb2RlIHw9IFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQ7Ci0KICAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19JRU5EKQogICAgICAgICAgcG5nX2hhbmRsZV9JRU5EKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgpOwogCkBAIC04MzMsOSArODI3LDkgQEAKICAgICAgIHsKICAgICAgICAgIGlmIChjaHVua19uYW1lID09IHBuZ19JREFUKQogICAgICAgICAgewotICAgICAgICAgICAgaWYgKChsZW5ndGggPiAwICYmICEocG5nX3B0ci0+ZmxhZ3MgJiBQTkdfRkxBR19aU1RSRUFNX0VOREVEKSkKLSAgICAgICAgICAgICAgICB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpICE9IDApCi0gICAgICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICIuVG9vIG1hbnkgSURBVHMgZm91bmQiKTsKKyAgICAgICAgICAgIGlmICgobGVuZ3RoID4gMCkgfHwKKyAgICAgICAgICAgICAgICAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpICE9IDApCisgICAgICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBJREFUcyBmb3VuZCIpOwogICAgICAgICAgfQogICAgICAgICAgcG5nX2hhbmRsZV91bmtub3duKHBuZ19wdHIsIGluZm9fcHRyLCBsZW5ndGgsIGtlZXApOwogICAgICAgICAgaWYgKGNodW5rX25hbWUgPT0gcG5nX1BMVEUpCkBAIC04NDYsMTQgKzg0MCwxMCBAQAogICAgICAgZWxzZSBpZiAoY2h1bmtfbmFtZSA9PSBwbmdfSURBVCkKICAgICAgIHsKICAgICAgICAgIC8qIFplcm8gbGVuZ3RoIElEQVRzIGFyZSBsZWdhbCBhZnRlciB0aGUgbGFzdCBJREFUIGhhcyBiZWVuCi0gICAgICAgICAgKiByZWFkLCBidXQgbm90IGFmdGVyIG90aGVyIGNodW5rcyBoYXZlIGJlZW4gcmVhZC4gIDEuNiBkb2VzIG5vdAotICAgICAgICAgICogYWx3YXlzIHJlYWQgYWxsIHRoZSBkZWZsYXRlIGRhdGE7IHNwZWNpZmljYWxseSBpdCBjYW5ub3QgYmUgcmVsaWVkCi0gICAgICAgICAgKiB1cG9uIHRvIHJlYWQgdGhlIEFkbGVyMzIgYXQgdGhlIGVuZC4gIElmIGl0IGRvZXNuJ3QgaWdub3JlIElEQVQKLSAgICAgICAgICAqIGNodW5rcyB3aGljaCBhcmUgbG9uZ2VyIHRoYW4gemVybyBhcyB3ZWxsOgorICAgICAgICAgICogcmVhZCwgYnV0IG5vdCBhZnRlciBvdGhlciBjaHVua3MgaGF2ZSBiZWVuIHJlYWQuCiAgICAgICAgICAgKi8KLSAgICAgICAgIGlmICgobGVuZ3RoID4gMCAmJiAhKHBuZ19wdHItPmZsYWdzICYgUE5HX0ZMQUdfWlNUUkVBTV9FTkRFRCkpCi0gICAgICAgICAgICAgfHwgKHBuZ19wdHItPm1vZGUgJiBQTkdfSEFWRV9DSFVOS19BRlRFUl9JREFUKSAhPSAwKQotICAgICAgICAgICAgcG5nX2Jlbmlnbl9lcnJvcihwbmdfcHRyLCAiLi5Ub28gbWFueSBJREFUcyBmb3VuZCIpOworICAgICAgICAgaWYgKChsZW5ndGggPiAwKSB8fCAocG5nX3B0ci0+bW9kZSAmIFBOR19IQVZFX0NIVU5LX0FGVEVSX0lEQVQpICE9IDApCisgICAgICAgICAgICBwbmdfYmVuaWduX2Vycm9yKHBuZ19wdHIsICJUb28gbWFueSBJREFUcyBmb3VuZCIpOwogCiAgICAgICAgICBwbmdfY3JjX2ZpbmlzaChwbmdfcHRyLCBsZW5ndGgpOwogICAgICAgfQpAQCAtMzg4NiwxNiArMzg3NiwxNiBAQAogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZmlsbGVyID0gMjU1OwogCi0jaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECi0gICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICB3aGVyZSA9IFBOR19GSUxMRVJfQkVGT1JFOwotICAgICAgICAgICAgICAgY2hhbmdlICY9IH5QTkdfRk9STUFUX0ZMQUdfQUZJUlNUOwotICAgICAgICAgICAgfQorIyAgICAgICAgICAgaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisgICAgICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDApCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICB3aGVyZSA9IFBOR19GSUxMRVJfQkVGT1JFOworICAgICAgICAgICAgICAgICAgY2hhbmdlICY9IH5QTkdfRk9STUFUX0ZMQUdfQUZJUlNUOworICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgICAgIHdoZXJlID0gUE5HX0ZJTExFUl9BRlRFUjsKKyAgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICB3aGVyZSA9IFBOR19GSUxMRVJfQUZURVI7CiAKICAgICAgICAgICAgIHBuZ19zZXRfYWRkX2FscGhhKHBuZ19wdHIsIGZpbGxlciwgd2hlcmUpOwogICAgICAgICAgfQpAQCAtNDAwMywxMiArMzk5MywxMiBAQAogICAgICAgaWYgKGluZm9fcHRyLT5iaXRfZGVwdGggPT0gMTYpCiAgICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfTElORUFSOwogCi0jaWZkZWYgUE5HX0ZPUk1BVF9CR1JfU1VQUE9SVEVECi0gICAgICBpZiAoKHBuZ19wdHItPnRyYW5zZm9ybWF0aW9ucyAmIFBOR19CR1IpICE9IDApCi0gICAgICAgICBpbmZvX2Zvcm1hdCB8PSBQTkdfRk9STUFUX0ZMQUdfQkdSOwotI2VuZGlmCisjICAgICBpZmRlZiBQTkdfRk9STUFUX0JHUl9TVVBQT1JURUQKKyAgICAgICAgIGlmICgocG5nX3B0ci0+dHJhbnNmb3JtYXRpb25zICYgUE5HX0JHUikgIT0gMCkKKyAgICAgICAgICAgIGluZm9fZm9ybWF0IHw9IFBOR19GT1JNQVRfRkxBR19CR1I7CisjICAgICBlbmRpZgogCi0jaWZkZWYgUE5HX0ZPUk1BVF9BRklSU1RfU1VQUE9SVEVECisjICAgICBpZmRlZiBQTkdfRk9STUFUX0FGSVJTVF9TVVBQT1JURUQKICAgICAgICAgIGlmIChkb19sb2NhbF9iYWNrZ3JvdW5kID09IDIpCiAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKGZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19BRklSU1QpICE9IDApCkBAIC00MTA5LDg0ICs0MDk5LDU4IEBACiB7CiAgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKICAgIHsKLSAgICAgIC8qIENoZWNrIGZvciByb3dfc3RyaWRlIG92ZXJmbG93LiAgVGhpcyBjaGVjayBpcyBub3QgcGVyZm9ybWVkIG9uIHRoZQotICAgICAgICogb3JpZ2luYWwgUE5HIGZvcm1hdCBiZWNhdXNlIGl0IG1heSBub3Qgb2NjdXIgaW4gdGhlIG91dHB1dCBQTkcgZm9ybWF0Ci0gICAgICAgKiBhbmQgbGlicG5nIGRlYWxzIHdpdGggdGhlIGlzc3VlcyBvZiByZWFkaW5nIHRoZSBvcmlnaW5hbC4KLSAgICAgICAqLwotICAgICAgY29uc3QgdW5zaWduZWQgaW50IGNoYW5uZWxzID0gUE5HX0lNQUdFX1BJWEVMX0NIQU5ORUxTKGltYWdlLT5mb3JtYXQpOworICAgICAgcG5nX3VpbnRfMzIgY2hlY2s7CiAKLSAgICAgIGlmIChpbWFnZS0+d2lkdGggPD0gMHg3RkZGRkZGRlUvY2hhbm5lbHMpIC8qIG5vIG92ZXJmbG93ICovCisgICAgICBpZiAocm93X3N0cmlkZSA9PSAwKQorICAgICAgICAgcm93X3N0cmlkZSA9IFBOR19JTUFHRV9ST1dfU1RSSURFKCppbWFnZSk7CisKKyAgICAgIGlmIChyb3dfc3RyaWRlIDwgMCkKKyAgICAgICAgIGNoZWNrID0gLXJvd19zdHJpZGU7CisKKyAgICAgIGVsc2UKKyAgICAgICAgIGNoZWNrID0gcm93X3N0cmlkZTsKKworICAgICAgaWYgKGltYWdlLT5vcGFxdWUgIT0gTlVMTCAmJiBidWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgY2hlY2sgPj0gUE5HX0lNQUdFX1JPV19TVFJJREUoKmltYWdlKSkKICAgICAgIHsKLSAgICAgICAgIHBuZ191aW50XzMyIGNoZWNrOwotICAgICAgICAgY29uc3QgcG5nX3VpbnRfMzIgcG5nX3Jvd19zdHJpZGUgPSBpbWFnZS0+d2lkdGggKiBjaGFubmVsczsKLQotICAgICAgICAgaWYgKHJvd19zdHJpZGUgPT0gMCkKLSAgICAgICAgICAgIHJvd19zdHJpZGUgPSAocG5nX2ludF8zMikvKlNBRkUqL3BuZ19yb3dfc3RyaWRlOwotCi0gICAgICAgICBpZiAocm93X3N0cmlkZSA8IDApCi0gICAgICAgICAgICBjaGVjayA9IC1yb3dfc3RyaWRlOwotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBjaGVjayA9IHJvd19zdHJpZGU7Ci0KLSAgICAgICAgIGlmIChpbWFnZS0+b3BhcXVlICE9IE5VTEwgJiYgYnVmZmVyICE9IE5VTEwgJiYgY2hlY2sgPj0gcG5nX3Jvd19zdHJpZGUpCisgICAgICAgICBpZiAoKGltYWdlLT5mb3JtYXQgJiBQTkdfRk9STUFUX0ZMQUdfQ09MT1JNQVApID09IDAgfHwKKyAgICAgICAgICAgIChpbWFnZS0+Y29sb3JtYXBfZW50cmllcyA+IDAgJiYgY29sb3JtYXAgIT0gTlVMTCkpCiAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOb3cgY2hlY2sgZm9yIG92ZXJmbG93IG9mIHRoZSBpbWFnZSBidWZmZXIgY2FsY3VsYXRpb247IHRoaXMKLSAgICAgICAgICAgICAqIGxpbWl0cyB0aGUgd2hvbGUgaW1hZ2Ugc2l6ZSB0byAzMiBiaXRzIGZvciBBUEkgY29tcGF0aWJpbGl0eSB3aXRoCi0gICAgICAgICAgICAgKiB0aGUgY3VycmVudCwgMzItYml0LCBQTkdfSU1BR0VfQlVGRkVSX1NJWkUgbWFjcm8uCisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgcG5nX2ltYWdlX3JlYWRfY29udHJvbCBkaXNwbGF5OworCisgICAgICAgICAgICBtZW1zZXQoJmRpc3BsYXksIDAsIChzaXplb2YgZGlzcGxheSkpOworICAgICAgICAgICAgZGlzcGxheS5pbWFnZSA9IGltYWdlOworICAgICAgICAgICAgZGlzcGxheS5idWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBkaXNwbGF5LnJvd19zdHJpZGUgPSByb3dfc3RyaWRlOworICAgICAgICAgICAgZGlzcGxheS5jb2xvcm1hcCA9IGNvbG9ybWFwOworICAgICAgICAgICAgZGlzcGxheS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKKyAgICAgICAgICAgIGRpc3BsYXkubG9jYWxfcm93ID0gTlVMTDsKKworICAgICAgICAgICAgLyogQ2hvb3NlIHRoZSBjb3JyZWN0ICdlbmQnIHJvdXRpbmU7IGZvciB0aGUgY29sb3ItbWFwIGNhc2UgYWxsIHRoZQorICAgICAgICAgICAgICogc2V0dXAgaGFzIGFscmVhZHkgYmVlbiBkb25lLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaW1hZ2UtPmhlaWdodCA8PSAweEZGRkZGRkZGL3BuZ19yb3dfc3RyaWRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYgKChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbG9ybWFwX2VudHJpZXMgPiAwICYmIGNvbG9ybWFwICE9IE5VTEwpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV9yZWFkX2NvbnRyb2wgZGlzcGxheTsKLQotICAgICAgICAgICAgICAgICAgbWVtc2V0KCZkaXNwbGF5LCAwLCAoc2l6ZW9mIGRpc3BsYXkpKTsKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXkuaW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXkuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICAgICAgICAgICAgZGlzcGxheS5yb3dfc3RyaWRlID0gcm93X3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXkuY29sb3JtYXAgPSBjb2xvcm1hcDsKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXkuYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0gICAgICAgICAgICAgICAgICBkaXNwbGF5LmxvY2FsX3JvdyA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgIC8qIENob29zZSB0aGUgY29ycmVjdCAnZW5kJyByb3V0aW5lOyBmb3IgdGhlIGNvbG9yLW1hcCBjYXNlCi0gICAgICAgICAgICAgICAgICAgKiBhbGwgdGhlIHNldHVwIGhhcyBhbHJlYWR5IGJlZW4gZG9uZS4KLSAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgaWYgKChpbWFnZS0+Zm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV9yZWFkX2NvbG9ybWFwLCAmZGlzcGxheSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcHBlZCwgJmRpc3BsYXkpOwotCi0gICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19pbWFnZV9yZWFkX2RpcmVjdCwgJmRpc3BsYXkpOwotCi0gICAgICAgICAgICAgICAgICBwbmdfaW1hZ2VfZnJlZShpbWFnZSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAotICAgICAgICAgICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZFtjb2xvci1tYXBdOiBubyBjb2xvci1tYXAiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaW1hZ2UtPmZvcm1hdCAmIFBOR19GT1JNQVRfRkxBR19DT0xPUk1BUCkgIT0gMCkKKyAgICAgICAgICAgICAgIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcCwgJmRpc3BsYXkpICYmCisgICAgICAgICAgICAgICAgICBwbmdfc2FmZV9leGVjdXRlKGltYWdlLCBwbmdfaW1hZ2VfcmVhZF9jb2xvcm1hcHBlZCwgJmRpc3BsYXkpOwogCiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAotICAgICAgICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZDogaW1hZ2UgdG9vIGxhcmdlIik7CisgICAgICAgICAgICAgICByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgcG5nX3NhZmVfZXhlY3V0ZShpbWFnZSwgcG5nX2ltYWdlX3JlYWRfZGlyZWN0LCAmZGlzcGxheSk7CisKKyAgICAgICAgICAgIHBuZ19pbWFnZV9mcmVlKGltYWdlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJldHVybiBwbmdfaW1hZ2VfZXJyb3IoaW1hZ2UsCi0gICAgICAgICAgICAgICAicG5nX2ltYWdlX2ZpbmlzaF9yZWFkOiBpbnZhbGlkIGFyZ3VtZW50Iik7CisgICAgICAgICAgICAgICAicG5nX2ltYWdlX2ZpbmlzaF9yZWFkW2NvbG9yLW1hcF06IG5vIGNvbG9yLW1hcCIpOwogICAgICAgfQogCiAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAotICAgICAgICAgICAgInBuZ19pbWFnZV9maW5pc2hfcmVhZDogcm93X3N0cmlkZSB0b28gbGFyZ2UiKTsKKyAgICAgICAgICAgICJwbmdfaW1hZ2VfZmluaXNoX3JlYWQ6IGludmFsaWQgYXJndW1lbnQiKTsKICAgIH0KIAogICAgZWxzZSBpZiAoaW1hZ2UgIT0gTlVMTCkKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3Jpby5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncmlvLmMKaW5kZXggMGFjNWM0Yi4uYjcyY2FmZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncmlvLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncmlvLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgogICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTcgW01hcmNoIDI2LCAyMDE1XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3J0cmFuLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdydHJhbi5jCmluZGV4IDUxNTg1YjAuLmI2YjczMWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3J0cmFuLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncnRyYW4uYwpAQCAtMjksOCArMjksOCBAQAogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMiBbTWF5IDI2LCAyMDE2XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTYgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOSBbTm92ZW1iZXIgMTIsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgcG5nX3NldF9iYWNrZ3JvdW5kX2ZpeGVkKHBuZ19wdHIsIGJhY2tncm91bmRfY29sb3IsIGJhY2tncm91bmRfZ2FtbWFfY29kZSwKICAgICAgIG5lZWRfZXhwYW5kLCBwbmdfZml4ZWQocG5nX3B0ciwgYmFja2dyb3VuZF9nYW1tYSwgInBuZ19zZXRfYmFja2dyb3VuZCIpKTsKIH0KLSMgIGVuZGlmIC8qIEZMT0FUSU5HX1BPSU5UICovCisjICBlbmRpZiAgLyogRkxPQVRJTkdfUE9JTlQgKi8KICNlbmRpZiAvKiBSRUFEX0JBQ0tHUk9VTkQgKi8KIAogLyogU2NhbGUgMTYtYml0IGRlcHRoIGZpbGVzIHRvIDgtYml0IGRlcHRoLiAgSWYgYm90aCBvZiB0aGVzZSBhcmUgc2V0IHRoZW4gdGhlCkBAIC0zMTcsMTIgKzMxNyw5IEBACiAgICAgKiBpcyBleHBlY3RlZCB0byBiZSAxIG9yIGdyZWF0ZXIsIGJ1dCB0aGlzIHJhbmdlIHRlc3QgYWxsb3dzIGZvciBzb21lCiAgICAgKiB2aWV3aW5nIGNvcnJlY3Rpb24gdmFsdWVzLiAgVGhlIGludGVudCBpcyB0byB3ZWVkIG91dCB1c2VycyBvZiB0aGlzIEFQSQogICAgICogd2hvIHVzZSB0aGUgaW52ZXJzZSBvZiB0aGUgZ2FtbWEgdmFsdWUgYWNjaWRlbnRhbGx5ISAgU2luY2Ugc29tZSBvZiB0aGVzZQotICAgICogdmFsdWVzIGFyZSByZWFzb25hYmxlIHRoaXMgbWF5IGhhdmUgdG8gYmUgY2hhbmdlZDoKLSAgICAqCi0gICAgKiAxLjYueDogY2hhbmdlZCBmcm9tIDAuMDcuLjMgdG8gMC4wMS4uMTAwICh0byBhY2NvbW9kYXRlIHRoZSBvcHRpbWFsIDE2LWJpdAotICAgICogZ2FtbWEgb2YgMzYsIGFuZCBpdHMgcmVjaXByb2NhbC4pCisgICAgKiB2YWx1ZXMgYXJlIHJlYXNvbmFibGUgdGhpcyBtYXkgaGF2ZSB0byBiZSBjaGFuZ2VkLgogICAgICovCi0gICBpZiAob3V0cHV0X2dhbW1hIDwgMTAwMCB8fCBvdXRwdXRfZ2FtbWEgPiAxMDAwMDAwMCkKKyAgIGlmIChvdXRwdXRfZ2FtbWEgPCA3MDAwMCB8fCBvdXRwdXRfZ2FtbWEgPiAzMDAwMDApCiAgICAgICBwbmdfZXJyb3IocG5nX3B0ciwgIm91dHB1dCBnYW1tYSBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2UiKTsKIAogICAgLyogVGhlIGRlZmF1bHQgZmlsZSBnYW1tYSBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3V0cHV0IGdhbW1hOyB0aGUgb3V0cHV0CkBAIC0xOTQzLDcgKzE5NDAsNyBAQAogICAgICAgICAgICAgcG5nX3B0ci0+cGFsZXR0ZVtpXS5ibHVlID0gKHBuZ19ieXRlKWNvbXBvbmVudDsKICAgICAgICAgIH0KICAgIH0KLSNlbmRpZiAvKiBSRUFEX1NISUZUICovCisjZW5kaWYgIC8qIFJFQURfU0hJRlQgKi8KIH0KIAogLyogTW9kaWZ5IHRoZSBpbmZvIHN0cnVjdHVyZSB0byByZWZsZWN0IHRoZSB0cmFuc2Zvcm1hdGlvbnMuICBUaGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3J1dGlsLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdydXRpbC5jCmluZGV4IDY3MjJmM2IuLmEyZTU4NDYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3J1dGlsLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ncnV0aWwuYwpAQCAtMjksOCArMjksOCBAQAogICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcwogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCi0gKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4yMCBbRGVjZW1iZXIgMywgMjAxNF0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjAgW0RlY2VtYmVyIDMsIDIwMTVdCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3NldC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nc2V0LmMKaW5kZXggYTYxMGRiNi4uNzQ4MDA4ZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nc2V0LmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nc2V0LmMKQEAgLTI5LDggKzI5LDggQEAKICAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjMgW0p1bmUgOSwgMjAxNl0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTkgW05vdmVtYmVyIDEyLCAyMDE1XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCkBAIC05ODAsMTQgKzk4MCwxMiBAQAogCiAgICAgICAgcG5nX2ZyZWVfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgUE5HX0ZSRUVfVFJOUywgMCk7CiAKKyAgICAgICAvKiBDaGFuZ2VkIGZyb20gbnVtX3RyYW5zIHRvIFBOR19NQVhfUEFMRVRURV9MRU5HVEggaW4gdmVyc2lvbiAxLjIuMSAqLworICAgICAgIHBuZ19wdHItPnRyYW5zX2FscGhhID0gaW5mb19wdHItPnRyYW5zX2FscGhhID0gcG5nX3ZvaWRjYXN0KHBuZ19ieXRlcCwKKyAgICAgICAgIHBuZ19tYWxsb2MocG5nX3B0ciwgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkpOworCiAgICAgICAgaWYgKG51bV90cmFucyA+IDAgJiYgbnVtX3RyYW5zIDw9IFBOR19NQVhfUEFMRVRURV9MRU5HVEgpCi0gICAgICAgewotICAgICAgICAgLyogQ2hhbmdlZCBmcm9tIG51bV90cmFucyB0byBQTkdfTUFYX1BBTEVUVEVfTEVOR1RIIGluIHZlcnNpb24gMS4yLjEgKi8KLSAgICAgICAgICBpbmZvX3B0ci0+dHJhbnNfYWxwaGEgPSBwbmdfdm9pZGNhc3QocG5nX2J5dGVwLAotICAgICAgICAgICAgIHBuZ19tYWxsb2MocG5nX3B0ciwgUE5HX01BWF9QQUxFVFRFX0xFTkdUSCkpOwogICAgICAgICAgIG1lbWNweShpbmZvX3B0ci0+dHJhbnNfYWxwaGEsIHRyYW5zX2FscGhhLCAocG5nX3NpemVfdCludW1fdHJhbnMpOwotICAgICAgIH0KLSAgICAgICBwbmdfcHRyLT50cmFuc19hbHBoYSA9IGluZm9fcHRyLT50cmFuc19hbHBoYTsKICAgIH0KIAogICAgaWYgKHRyYW5zX2NvbG9yICE9IE5VTEwpCkBAIC0xNjc0LDg4ICsxNjcyLDQgQEAKICAgICAgIHBuZ19wdHItPm51bV9wYWxldHRlX21heCA9IC0xOwogfQogI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfcENBTF9TVVBQT1JURUQpIHx8IFwKLSAgICBkZWZpbmVkKFBOR19pQ0NQX1NVUFBPUlRFRCkgfHwgZGVmaW5lZChQTkdfc1BMVF9TVVBQT1JURUQpCi0vKiBDaGVjayB0aGF0IHRoZSB0RVh0IG9yIHpUWHQga2V5d29yZCBpcyB2YWxpZCBwZXIgUE5HIDEuMCBzcGVjaWZpY2F0aW9uLAotICogYW5kIGlmIGludmFsaWQsIGNvcnJlY3QgdGhlIGtleXdvcmQgcmF0aGVyIHRoYW4gZGlzY2FyZGluZyB0aGUgZW50aXJlCi0gKiBjaHVuay4gIFRoZSBQTkcgMS4wIHNwZWNpZmljYXRpb24gcmVxdWlyZXMga2V5d29yZHMgMS03OSBjaGFyYWN0ZXJzIGluCi0gKiBsZW5ndGgsIGZvcmJpZHMgbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlLCBtdWx0aXBsZSBpbnRlcm5hbCBzcGFjZXMsCi0gKiBhbmQgdGhlIG5vbi1icmVhayBzcGFjZSAoMHg4MCkgZnJvbSBJU08gODg1OS0xLiAgUmV0dXJucyBrZXl3b3JkIGxlbmd0aC4KLSAqCi0gKiBUaGUgJ25ld19rZXknIGJ1ZmZlciBtdXN0IGJlIDgwIGNoYXJhY3RlcnMgaW4gc2l6ZSAoZm9yIHRoZSBrZXl3b3JkIHBsdXMgYQotICogdHJhaWxpbmcgJ1wwJykuICBJZiB0aGlzIHJvdXRpbmUgcmV0dXJucyAwIHRoZW4gdGhlcmUgd2FzIG5vIGtleXdvcmQsIG9yIGEKLSAqIHZhbGlkIG9uZSBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLCBhbmQgdGhlIGNhbGxlciBtdXN0IHBuZ19lcnJvci4KLSAqLwotcG5nX3VpbnRfMzIgLyogUFJJVkFURSAqLwotcG5nX2NoZWNrX2tleXdvcmQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBrZXksIHBuZ19ieXRlcCBuZXdfa2V5KQotewotICAgcG5nX2NvbnN0X2NoYXJwIG9yaWdfa2V5ID0ga2V5OwotICAgcG5nX3VpbnRfMzIga2V5X2xlbiA9IDA7Ci0gICBpbnQgYmFkX2NoYXJhY3RlciA9IDA7Ci0gICBpbnQgc3BhY2UgPSAxOwotCi0gICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19rZXl3b3JkIik7Ci0KLSAgIGlmIChrZXkgPT0gTlVMTCkKLSAgIHsKLSAgICAgICpuZXdfa2V5ID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICB3aGlsZSAoKmtleSAmJiBrZXlfbGVuIDwgNzkpCi0gICB7Ci0gICAgICBwbmdfYnl0ZSBjaCA9IChwbmdfYnl0ZSkqa2V5Kys7Ci0KLSAgICAgIGlmICgoY2ggPiAzMiAmJiBjaCA8PSAxMjYpIHx8IChjaCA+PSAxNjEgLyomJiBjaCA8PSAyNTUqLykpCi0gICAgICAgICAqbmV3X2tleSsrID0gY2gsICsra2V5X2xlbiwgc3BhY2UgPSAwOwotCi0gICAgICBlbHNlIGlmIChzcGFjZSA9PSAwKQotICAgICAgewotICAgICAgICAgLyogQSBzcGFjZSBvciBhbiBpbnZhbGlkIGNoYXJhY3RlciB3aGVuIG9uZSB3YXNuJ3Qgc2VlbiBpbW1lZGlhdGVseQotICAgICAgICAgICogYmVmb3JlOyBvdXRwdXQganVzdCBhIHNwYWNlLgotICAgICAgICAgICovCi0gICAgICAgICAqbmV3X2tleSsrID0gMzIsICsra2V5X2xlbiwgc3BhY2UgPSAxOwotCi0gICAgICAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIHdhcyBub3QgYSBzcGFjZSB0aGVuIGl0IGlzIGludmFsaWQuICovCi0gICAgICAgICBpZiAoY2ggIT0gMzIpCi0gICAgICAgICAgICBiYWRfY2hhcmFjdGVyID0gY2g7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKGJhZF9jaGFyYWN0ZXIgPT0gMCkKLSAgICAgICAgIGJhZF9jaGFyYWN0ZXIgPSBjaDsgLyoganVzdCBza2lwIGl0LCByZWNvcmQgdGhlIGZpcnN0IGVycm9yICovCi0gICB9Ci0KLSAgIGlmIChrZXlfbGVuID4gMCAmJiBzcGFjZSAhPSAwKSAvKiB0cmFpbGluZyBzcGFjZSAqLwotICAgewotICAgICAgLS1rZXlfbGVuLCAtLW5ld19rZXk7Ci0gICAgICBpZiAoYmFkX2NoYXJhY3RlciA9PSAwKQotICAgICAgICAgYmFkX2NoYXJhY3RlciA9IDMyOwotICAgfQotCi0gICAvKiBUZXJtaW5hdGUgdGhlIGtleXdvcmQgKi8KLSAgICpuZXdfa2V5ID0gMDsKLQotICAgaWYgKGtleV9sZW4gPT0gMCkKLSAgICAgIHJldHVybiAwOwotCi0jaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAotICAgLyogVHJ5IHRvIG9ubHkgb3V0cHV0IG9uZSB3YXJuaW5nIHBlciBrZXl3b3JkOiAqLwotICAgaWYgKCprZXkgIT0gMCkgLyoga2V5d29yZCB0b28gbG9uZyAqLwotICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImtleXdvcmQgdHJ1bmNhdGVkIik7Ci0KLSAgIGVsc2UgaWYgKGJhZF9jaGFyYWN0ZXIgIT0gMCkKLSAgIHsKLSAgICAgIFBOR19XQVJOSU5HX1BBUkFNRVRFUlMocCkKLQotICAgICAgcG5nX3dhcm5pbmdfcGFyYW1ldGVyKHAsIDEsIG9yaWdfa2V5KTsKLSAgICAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQocCwgMiwgUE5HX05VTUJFUl9GT1JNQVRfMDJ4LCBiYWRfY2hhcmFjdGVyKTsKLQotICAgICAgcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBuZ19wdHIsIHAsICJrZXl3b3JkIFwiQDFcIjogYmFkIGNoYXJhY3RlciAnMHhAMiciKTsKLSAgIH0KLSNlbmRpZiAvKiBXQVJOSU5HUyAqLwotCi0gICByZXR1cm4ga2V5X2xlbjsKLX0KLSNlbmRpZiAvKiBURVhUIHx8IHBDQUwgfHwgaUNDUCB8fCBzUExUICovCiAjZW5kaWYgLyogUkVBRCB8fCBXUklURSAqLwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nc3RydWN0LmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdzdHJ1Y3QuaAppbmRleCBhZTcyZjMyLi5lNDdjMDJkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdzdHJ1Y3QuaAorKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmdzdHJ1Y3QuaApAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd0ZXN0LmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd0ZXN0LmMKaW5kZXggMzk5ZTY3Zi4uZWYzYTRhYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ndGVzdC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3Rlc3QuYwpAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNS4yNSBbRGVjZW1iZXIgMywgMjAxNV0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCkBAIC03MSwxNSArNzEsNiBAQAogCiAjaW5jbHVkZSAicG5nLmgiCiAKLS8qIDEuNi4xIGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBjb25maWd1cmUgdGVzdCBoYXJuZXNzLCB3aGljaCB1c2VzIDc3IHRvIGluZGljYXRlCi0gKiBhIHNraXBwZWQgdGVzdCwgaW4gZWFybGllciB2ZXJzaW9ucyB3ZSBuZWVkIHRvIHN1Y2NlZWQgb24gYSBza2lwcGVkIHRlc3QsIHNvOgotICovCi0jaWYgUE5HX0xJQlBOR19WRVIgPj0gMTA2MDEgJiYgZGVmaW5lZChIQVZFX0NPTkZJR19IKQotIyAgZGVmaW5lIFNLSVAgNzcKLSNlbHNlCi0jICBkZWZpbmUgU0tJUCAwCi0jZW5kaWYKLQogLyogS25vd24gY2h1bmtzIHRoYXQgZXhpc3QgaW4gcG5ndGVzdC5wbmcgbXVzdCBiZSBzdXBwb3J0ZWQgb3IgcG5ndGVzdCB3aWxsIGZhaWwKICAqIHNpbXBseSBhcyBhIHJlc3VsdCBvZiByZS1vcmRlcmluZyB0aGVtLiAgVGhpcyBtYXkgYmUgZml4ZWQgaW4gMS43CiAgKgpAQCAtMjEwMiw5ICsyMDkzLDkgQEAKICAgIGZwcmludGYoU1RERVJSLAogICAgICAgIiB0ZXN0IGlnbm9yZWQgYmVjYXVzZSBsaWJwbmcgd2FzIG5vdCBidWlsdCB3aXRoIHJlYWQgc3VwcG9ydFxuIik7CiAgICAvKiBBbmQgc2tpcCB0aGlzIHRlc3QgKi8KLSAgIHJldHVybiBTS0lQOworICAgcmV0dXJuIFBOR19MSUJQTkdfVkVSIDwgMTA2MDAgPyAwIDogNzc7CiB9CiAjZW5kaWYKIAogLyogR2VuZXJhdGUgYSBjb21waWxlciBlcnJvciBpZiB0aGVyZSBpcyBhbiBvbGQgcG5nLmggaW4gdGhlIHNlYXJjaCBwYXRoLiAqLwotdHlwZWRlZiBwbmdfbGlicG5nX3ZlcnNpb25fMV82XzIzIFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV82XzIzOwordHlwZWRlZiBwbmdfbGlicG5nX3ZlcnNpb25fMV82XzIwIFlvdXJfcG5nX2hfaXNfbm90X3ZlcnNpb25fMV82XzIwOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ndHJhbnMuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3RyYW5zLmMKaW5kZXggZTJkMTFiMC4uZDYwMTZkZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5ndHJhbnMuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd0cmFucy5jCkBAIC0zMCw3ICszMCw3IEBACiAgKiBmaWxlIGFuZCwgcGVyIGl0cyB0ZXJtcywgc2hvdWxkIG5vdCBiZSByZW1vdmVkOgogICoKICAqIExhc3QgY2hhbmdlZCBpbiBsaWJwbmcgMS42LjE4IFtKdWx5IDIzLCAyMDE1XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3dpby5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd2lvLmMKaW5kZXggZWE1ZjU5NS4uNzI2ODUyMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd2lvLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd2lvLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgogICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTUgW05vdmVtYmVyIDIwLCAyMDE0XQotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIsMjAwNCwyMDA2LTIwMTQgR2xlbm4gUmFuZGVycy1QZWhyc29uCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAqIChWZXJzaW9uIDAuOTYgQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk3IEFuZHJlYXMgRGlsZ2VyKQogICogKFZlcnNpb24gMC44OCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuKQogICoKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3dyaXRlLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd3cml0ZS5jCmluZGV4IDZkZmIzYzIuLmQ3ZDc1MWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3dyaXRlLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd3JpdGUuYwpAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOSBbTm92ZW1iZXIgMTIsIDIwMTVdCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiwyMDA0LDIwMDYtMjAxNSBHbGVubiBSYW5kZXJzLVBlaHJzb24KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgogICogKFZlcnNpb24gMC45NiBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIpCiAgKiAoVmVyc2lvbiAwLjg4IENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiBHdXkgRXJpYyBTY2hhbG5hdCwgR3JvdXAgNDIsIEluYy4pCiAgKgpAQCAtNDAsOSArNDAsOSBAQAogICovCiAKICNpbmNsdWRlICJwbmdwcml2LmgiCi0jaWZkZWYgUE5HX1NJTVBMSUZJRURfV1JJVEVfU1RESU9fU1VQUE9SVEVECisjaWYgZGVmaW5lZChQTkdfU0lNUExJRklFRF9XUklURV9TVVBQT1JURUQpICYmIGRlZmluZWQoUE5HX1NURElPX1NVUFBPUlRFRCkKICMgIGluY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYgLyogU0lNUExJRklFRF9XUklURV9TVERJTyAqLworI2VuZGlmCiAKICNpZmRlZiBQTkdfV1JJVEVfU1VQUE9SVEVECiAKQEAgLTE0ODAsNiArMTQ4MCw3IEBACiAKIAogI2lmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NVUFBPUlRFRAorIyBpZmRlZiBQTkdfU1RESU9fU1VQUE9SVEVEIC8qIGN1cnJlbnRseSByZXF1aXJlZCBmb3IgcG5nX2ltYWdlX3dyaXRlXyogKi8KIC8qIEluaXRpYWxpemUgdGhlIHdyaXRlIHN0cnVjdHVyZSAtIGdlbmVyYWwgcHVycG9zZSB1dGlsaXR5LiAqLwogc3RhdGljIGludAogcG5nX2ltYWdlX3dyaXRlX2luaXQocG5nX2ltYWdlcCBpbWFnZSkKQEAgLTE1MzEsMTAgKzE1MzIsNiBAQAogICAgcG5nX2NvbnN0X3ZvaWRwIGZpcnN0X3JvdzsKICAgIHB0cmRpZmZfdCAgICAgICByb3dfYnl0ZXM7CiAgICBwbmdfdm9pZHAgICAgICAgbG9jYWxfcm93OwotICAgLyogQnl0ZSBjb3VudCBmb3IgbWVtb3J5IHdyaXRpbmcgKi8KLSAgIHBuZ19ieXRlcCAgICAgICAgbWVtb3J5OwotICAgcG5nX2FsbG9jX3NpemVfdCBtZW1vcnlfYnl0ZXM7IC8qIG5vdCB1c2VkIGZvciBTVERJTyAqLwotICAgcG5nX2FsbG9jX3NpemVfdCBvdXRwdXRfYnl0ZXM7IC8qIHJ1bm5pbmcgdG90YWwgKi8KIH0gcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2w7CiAKIC8qIFdyaXRlIHBuZ191aW50XzE2IGlucHV0IHRvIGEgMTYtYml0IFBORzsgdGhlIHBuZ19wdHIgaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8KQEAgLTE5NjIsNDMgKzE5NTksOSBAQAogICAgICAgcG5nX3NldF9iZW5pZ25fZXJyb3JzKHBuZ19wdHIsIDAvKmVycm9yKi8pOwogIyAgIGVuZGlmCiAKLSAgIC8qIERlZmF1bHQgdGhlICdyb3dfc3RyaWRlJyBwYXJhbWV0ZXIgaWYgcmVxdWlyZWQsIGFsc28gY2hlY2sgdGhlIHJvdyBzdHJpZGUKLSAgICAqIGFuZCB0b3RhbCBpbWFnZSBzaXplIHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHdpdGhpbiB0aGUgc3lzdGVtIGxpbWl0cy4KLSAgICAqLwotICAgewotICAgICAgY29uc3QgdW5zaWduZWQgaW50IGNoYW5uZWxzID0gUE5HX0lNQUdFX1BJWEVMX0NIQU5ORUxTKGltYWdlLT5mb3JtYXQpOwotCi0gICAgICBpZiAoaW1hZ2UtPndpZHRoIDw9IDB4N0ZGRkZGRkZVL2NoYW5uZWxzKSAvKiBubyBvdmVyZmxvdyAqLwotICAgICAgewotICAgICAgICAgcG5nX3VpbnRfMzIgY2hlY2s7Ci0gICAgICAgICBjb25zdCBwbmdfdWludF8zMiBwbmdfcm93X3N0cmlkZSA9IGltYWdlLT53aWR0aCAqIGNoYW5uZWxzOwotCi0gICAgICAgICBpZiAoZGlzcGxheS0+cm93X3N0cmlkZSA9PSAwKQotICAgICAgICAgICAgZGlzcGxheS0+cm93X3N0cmlkZSA9IChwbmdfaW50XzMyKS8qU0FGRSovcG5nX3Jvd19zdHJpZGU7Ci0KLSAgICAgICAgIGlmIChkaXNwbGF5LT5yb3dfc3RyaWRlIDwgMCkKLSAgICAgICAgICAgIGNoZWNrID0gLWRpc3BsYXktPnJvd19zdHJpZGU7Ci0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrID0gZGlzcGxheS0+cm93X3N0cmlkZTsKLQotICAgICAgICAgaWYgKGNoZWNrID49IHBuZ19yb3dfc3RyaWRlKQotICAgICAgICAgewotICAgICAgICAgICAgLyogTm93IGNoZWNrIGZvciBvdmVyZmxvdyBvZiB0aGUgaW1hZ2UgYnVmZmVyIGNhbGN1bGF0aW9uOyB0aGlzCi0gICAgICAgICAgICAgKiBsaW1pdHMgdGhlIHdob2xlIGltYWdlIHNpemUgdG8gMzIgYml0cyBmb3IgQVBJIGNvbXBhdGliaWxpdHkgd2l0aAotICAgICAgICAgICAgICogdGhlIGN1cnJlbnQsIDMyLWJpdCwgUE5HX0lNQUdFX0JVRkZFUl9TSVpFIG1hY3JvLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaW1hZ2UtPmhlaWdodCA+IDB4RkZGRkZGRkYvcG5nX3Jvd19zdHJpZGUpCi0gICAgICAgICAgICAgICBwbmdfZXJyb3IoaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0ciwgIm1lbW9yeSBpbWFnZSB0b28gbGFyZ2UiKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgcG5nX2Vycm9yKGltYWdlLT5vcGFxdWUtPnBuZ19wdHIsICJzdXBwbGllZCByb3cgc3RyaWRlIHRvbyBzbWFsbCIpOwotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICAgICBwbmdfZXJyb3IoaW1hZ2UtPm9wYXF1ZS0+cG5nX3B0ciwgImltYWdlIHJvdyBzdHJpZGUgdG9vIGxhcmdlIik7Ci0gICB9CisgICAvKiBEZWZhdWx0IHRoZSAncm93X3N0cmlkZScgcGFyYW1ldGVyIGlmIHJlcXVpcmVkLiAqLworICAgaWYgKGRpc3BsYXktPnJvd19zdHJpZGUgPT0gMCkKKyAgICAgIGRpc3BsYXktPnJvd19zdHJpZGUgPSBQTkdfSU1BR0VfUk9XX1NUUklERSgqaW1hZ2UpOwogCiAgICAvKiBTZXQgdGhlIHJlcXVpcmVkIHRyYW5zZm9ybXMgdGhlbiB3cml0ZSB0aGUgcm93cyBpbiB0aGUgY29ycmVjdCBvcmRlci4gKi8KICAgIGlmICgoZm9ybWF0ICYgUE5HX0ZPUk1BVF9GTEFHX0NPTE9STUFQKSAhPSAwKQpAQCAtMjE3NSwxMjIgKzIxMzgsNiBAQAogICAgcmV0dXJuIDE7CiB9CiAKLQotc3RhdGljIHZvaWQgKFBOR0NCQVBJCi1pbWFnZV9tZW1vcnlfd3JpdGUpKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19ieXRlcC8qY29uc3QqLyBkYXRhLAotICAgcG5nX3NpemVfdCBzaXplKQotewotICAgcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wqLAotICAgICAgcG5nX3B0ci0+aW9fcHRyLypiYWNrZG9vcjogcG5nX2dldF9pb19wdHIocG5nX3B0cikqLyk7Ci0gICBjb25zdCBwbmdfYWxsb2Nfc2l6ZV90IG9iID0gZGlzcGxheS0+b3V0cHV0X2J5dGVzOwotCi0gICAvKiBDaGVjayBmb3Igb3ZlcmZsb3c7IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjogKi8KLSAgIGlmIChzaXplIDw9ICgocG5nX2FsbG9jX3NpemVfdCktMSkgLSBvYikKLSAgIHsKLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgbGlicG5nIGV2ZXIgZG9lcyB0aGlzLCBidXQganVzdCBpbiBjYXNlOiAqLwotICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgewotICAgICAgICAgaWYgKGRpc3BsYXktPm1lbW9yeV9ieXRlcyA+PSBvYitzaXplKSAvKiB3cml0aW5nICovCi0gICAgICAgICAgICBtZW1jcHkoZGlzcGxheS0+bWVtb3J5K29iLCBkYXRhLCBzaXplKTsKLQotICAgICAgICAgLyogQWx3YXlzIHVwZGF0ZSB0aGUgc2l6ZTogKi8KLSAgICAgICAgIGRpc3BsYXktPm91dHB1dF9ieXRlcyA9IG9iK3NpemU7Ci0gICAgICB9Ci0gICB9Ci0KLSAgIGVsc2UKLSAgICAgIHBuZ19lcnJvcihwbmdfcHRyLCAicG5nX2ltYWdlX3dyaXRlX3RvX21lbW9yeTogUE5HIHRvbyBiaWciKTsKLX0KLQotc3RhdGljIHZvaWQgKFBOR0NCQVBJCi1pbWFnZV9tZW1vcnlfZmx1c2gpKHBuZ19zdHJ1Y3RwIHBuZ19wdHIpCi17Ci0gICBQTkdfVU5VU0VEKHBuZ19wdHIpCi19Ci0KLXN0YXRpYyBpbnQKLXBuZ19pbWFnZV93cml0ZV9tZW1vcnkocG5nX3ZvaWRwIGFyZ3VtZW50KQotewotICAgcG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wgKmRpc3BsYXkgPSBwbmdfdm9pZGNhc3QocG5nX2ltYWdlX3dyaXRlX2NvbnRyb2wqLAotICAgICAgYXJndW1lbnQpOwotCi0gICAvKiBUaGUgcmVzdCBvZiB0aGUgbWVtb3J5LXNwZWNpZmljIGluaXQgYW5kIHdyaXRlX21haW4gaW4gYW4gZXJyb3IgcHJvdGVjdGVkCi0gICAgKiBlbnZpcm9ubWVudC4gIFRoaXMgY2FzZSBuZWVkcyB0byB1c2UgY2FsbGJhY2tzIGZvciB0aGUgd3JpdGUgb3BlcmF0aW9ucwotICAgICogc2luY2UgbGlicG5nIGhhcyBubyBidWlsdCBpbiBzdXBwb3J0IGZvciB3cml0aW5nIHRvIG1lbW9yeS4KLSAgICAqLwotICAgcG5nX3NldF93cml0ZV9mbihkaXNwbGF5LT5pbWFnZS0+b3BhcXVlLT5wbmdfcHRyLCBkaXNwbGF5Lyppb19wdHIqLywKLSAgICAgICAgIGltYWdlX21lbW9yeV93cml0ZSwgaW1hZ2VfbWVtb3J5X2ZsdXNoKTsKLQotICAgcmV0dXJuIHBuZ19pbWFnZV93cml0ZV9tYWluKGRpc3BsYXkpOwotfQotCi1pbnQgUE5HQVBJCi1wbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5KHBuZ19pbWFnZXAgaW1hZ2UsIHZvaWQgKm1lbW9yeSwKLSAgIHBuZ19hbGxvY19zaXplX3QgKiBQTkdfUkVTVFJJQ1QgbWVtb3J5X2J5dGVzLCBpbnQgY29udmVydF90b184Yml0LAotICAgY29uc3Qgdm9pZCAqYnVmZmVyLCBwbmdfaW50XzMyIHJvd19zdHJpZGUsIGNvbnN0IHZvaWQgKmNvbG9ybWFwKQotewotICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiBidWZmZXIsIG9yIGNvdW50IHRoZSBieXRlcyBpZiBpdCBpcyBOVUxMICovCi0gICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKLSAgIHsKLSAgICAgIGlmIChtZW1vcnlfYnl0ZXMgIT0gTlVMTCAmJiBidWZmZXIgIT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIC8qIFRoaXMgaXMgdG8gZ2l2ZSB0aGUgY2FsbGVyIGFuIGVhc2llciBlcnJvciBkZXRlY3Rpb24gaW4gdGhlIE5VTEwKLSAgICAgICAgICAqIGNhc2UgYW5kIGd1YXJkIGFnYWluc3QgdW5pbml0aWFsaXplZCB2YXJpYWJsZSBwcm9ibGVtczoKLSAgICAgICAgICAqLwotICAgICAgICAgaWYgKG1lbW9yeSA9PSBOVUxMKQotICAgICAgICAgICAgKm1lbW9yeV9ieXRlcyA9IDA7Ci0KLSAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfaW5pdChpbWFnZSkgIT0gMCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHBuZ19pbWFnZV93cml0ZV9jb250cm9sIGRpc3BsYXk7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotCi0gICAgICAgICAgICBtZW1zZXQoJmRpc3BsYXksIDAsIChzaXplb2YgZGlzcGxheSkpOwotICAgICAgICAgICAgZGlzcGxheS5pbWFnZSA9IGltYWdlOwotICAgICAgICAgICAgZGlzcGxheS5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgICAgICBkaXNwbGF5LnJvd19zdHJpZGUgPSByb3dfc3RyaWRlOwotICAgICAgICAgICAgZGlzcGxheS5jb2xvcm1hcCA9IGNvbG9ybWFwOwotICAgICAgICAgICAgZGlzcGxheS5jb252ZXJ0X3RvXzhiaXQgPSBjb252ZXJ0X3RvXzhiaXQ7Ci0gICAgICAgICAgICBkaXNwbGF5Lm1lbW9yeSA9IHBuZ192b2lkY2FzdChwbmdfYnl0ZXAsIG1lbW9yeSk7Ci0gICAgICAgICAgICBkaXNwbGF5Lm1lbW9yeV9ieXRlcyA9ICptZW1vcnlfYnl0ZXM7Ci0gICAgICAgICAgICBkaXNwbGF5Lm91dHB1dF9ieXRlcyA9IDA7Ci0KLSAgICAgICAgICAgIHJlc3VsdCA9IHBuZ19zYWZlX2V4ZWN1dGUoaW1hZ2UsIHBuZ19pbWFnZV93cml0ZV9tZW1vcnksICZkaXNwbGF5KTsKLSAgICAgICAgICAgIHBuZ19pbWFnZV9mcmVlKGltYWdlKTsKLQotICAgICAgICAgICAgLyogd3JpdGVfbWVtb3J5IHJldHVybnMgdHJ1ZSBldmVuIGlmIHdlIHJhbiBvdXQgb2YgYnVmZmVyLiAqLwotICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIE9uIG91dC1vZi1idWZmZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zICcwJyBidXQgc3RpbGwgdXBkYXRlcwotICAgICAgICAgICAgICAgICogbWVtb3J5X2J5dGVzOgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICBpZiAobWVtb3J5ICE9IE5VTEwgJiYgZGlzcGxheS5vdXRwdXRfYnl0ZXMgPiAqbWVtb3J5X2J5dGVzKQotICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLQotICAgICAgICAgICAgICAgKm1lbW9yeV9ieXRlcyA9IGRpc3BsYXkub3V0cHV0X2J5dGVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgfQotCi0gICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgZWxzZQotICAgICAgICAgcmV0dXJuIHBuZ19pbWFnZV9lcnJvcihpbWFnZSwKLSAgICAgICAgICAgICJwbmdfaW1hZ2Vfd3JpdGVfdG9fbWVtb3J5OiBpbnZhbGlkIGFyZ3VtZW50Iik7Ci0gICB9Ci0KLSAgIGVsc2UgaWYgKGltYWdlICE9IE5VTEwpCi0gICAgICByZXR1cm4gcG5nX2ltYWdlX2Vycm9yKGltYWdlLAotICAgICAgICAgInBuZ19pbWFnZV93cml0ZV90b19tZW1vcnk6IGluY29ycmVjdCBQTkdfSU1BR0VfVkVSU0lPTiIpOwotCi0gICBlbHNlCi0gICAgICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIFBOR19TSU1QTElGSUVEX1dSSVRFX1NURElPX1NVUFBPUlRFRAogaW50IFBOR0FQSQogcG5nX2ltYWdlX3dyaXRlX3RvX3N0ZGlvKHBuZ19pbWFnZXAgaW1hZ2UsIEZJTEUgKmZpbGUsIGludCBjb252ZXJ0X3RvXzhiaXQsCiAgICBjb25zdCB2b2lkICpidWZmZXIsIHBuZ19pbnRfMzIgcm93X3N0cmlkZSwgY29uc3Qgdm9pZCAqY29sb3JtYXApCkBAIC0yMjk4LDcgKzIxNDUsNyBAQAogICAgLyogV3JpdGUgdGhlIGltYWdlIHRvIHRoZSBnaXZlbiAoRklMRSopLiAqLwogICAgaWYgKGltYWdlICE9IE5VTEwgJiYgaW1hZ2UtPnZlcnNpb24gPT0gUE5HX0lNQUdFX1ZFUlNJT04pCiAgICB7Ci0gICAgICBpZiAoZmlsZSAhPSBOVUxMICYmIGJ1ZmZlciAhPSBOVUxMKQorICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKICAgICAgIHsKICAgICAgICAgIGlmIChwbmdfaW1hZ2Vfd3JpdGVfaW5pdChpbWFnZSkgIT0gMCkKICAgICAgICAgIHsKQEAgLTIzNDgsNyArMjE5NSw3IEBACiAgICAvKiBXcml0ZSB0aGUgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUuICovCiAgICBpZiAoaW1hZ2UgIT0gTlVMTCAmJiBpbWFnZS0+dmVyc2lvbiA9PSBQTkdfSU1BR0VfVkVSU0lPTikKICAgIHsKLSAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCAmJiBidWZmZXIgIT0gTlVMTCkKKyAgICAgIGlmIChmaWxlX25hbWUgIT0gTlVMTCkKICAgICAgIHsKICAgICAgICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKIApAQCAtMjQwNiw2ICsyMjUzLDYgQEAKICAgIGVsc2UKICAgICAgIHJldHVybiAwOwogfQotI2VuZGlmIC8qIFNJTVBMSUZJRURfV1JJVEVfU1RESU8gKi8KKyMgZW5kaWYgLyogU1RESU8gKi8KICNlbmRpZiAvKiBTSU1QTElGSUVEX1dSSVRFICovCiAjZW5kaWYgLyogV1JJVEUgKi8KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3d0cmFuLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd3dHJhbi5jCmluZGV4IGU5NjJjNGYuLjQ0ZTdkYWYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3d0cmFuLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd3RyYW4uYwpAQCAtMzAsNyArMzAsNyBAQAogICogZmlsZSBhbmQsIHBlciBpdHMgdGVybXMsIHNob3VsZCBub3QgYmUgcmVtb3ZlZDoKICAqCiAgKiBMYXN0IGNoYW5nZWQgaW4gbGlicG5nIDEuNi4xOCBbSnVseSAyMywgMjAxNV0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE1IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd3dXRpbC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9saWJwbmcvcG5nd3V0aWwuYwppbmRleCBkYWViMWU3Li5hNTFmMjRiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2xpYnBuZy9wbmd3dXRpbC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbGlicG5nL3BuZ3d1dGlsLmMKQEAgLTI5LDggKzI5LDggQEAKICAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKICAqIGZpbGUgYW5kLCBwZXIgaXRzIHRlcm1zLCBzaG91bGQgbm90IGJlIHJlbW92ZWQ6CiAgKgotICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMjIgW01heSAyNiwgMjAxNl0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyLDIwMDQsMjAwNi0yMDE2IEdsZW5uIFJhbmRlcnMtUGVocnNvbgorICogTGFzdCBjaGFuZ2VkIGluIGxpYnBuZyAxLjYuMTkgW05vdmVtYmVyIDEyLCAyMDE1XQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMTUgR2xlbm4gUmFuZGVycy1QZWhyc29uCiAgKiAoVmVyc2lvbiAwLjk2IENvcHlyaWdodCAoYykgMTk5NiwgMTk5NyBBbmRyZWFzIERpbGdlcikKICAqIChWZXJzaW9uIDAuODggQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2IEd1eSBFcmljIFNjaGFsbmF0LCBHcm91cCA0MiwgSW5jLikKICAqCkBAIC01MSwxMCArNTEsMTAgQEAKIHZvaWQgUE5HQVBJCiBwbmdfc2F2ZV91aW50XzMyKHBuZ19ieXRlcCBidWYsIHBuZ191aW50XzMyIGkpCiB7Ci0gICBidWZbMF0gPSAocG5nX2J5dGUpKChpID4+IDI0KSAmIDB4ZmZVKTsKLSAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoKGkgPj4gMTYpICYgMHhmZlUpOwotICAgYnVmWzJdID0gKHBuZ19ieXRlKSgoaSA+PiAgOCkgJiAweGZmVSk7Ci0gICBidWZbM10gPSAocG5nX2J5dGUpKCBpICAgICAgICAmIDB4ZmZVKTsKKyAgIGJ1ZlswXSA9IChwbmdfYnl0ZSkoaSA+PiAyNCk7CisgICBidWZbMV0gPSAocG5nX2J5dGUpKGkgPj4gMTYpOworICAgYnVmWzJdID0gKHBuZ19ieXRlKShpID4+IDgpOworICAgYnVmWzNdID0gKHBuZ19ieXRlKShpICAgICApOwogfQogCiAvKiBQbGFjZSBhIDE2LWJpdCBudW1iZXIgaW50byBhIGJ1ZmZlciBpbiBQTkcgYnl0ZSBvcmRlci4KQEAgLTY0LDggKzY0LDggQEAKIHZvaWQgUE5HQVBJCiBwbmdfc2F2ZV91aW50XzE2KHBuZ19ieXRlcCBidWYsIHVuc2lnbmVkIGludCBpKQogewotICAgYnVmWzBdID0gKHBuZ19ieXRlKSgoaSA+PiA4KSAmIDB4ZmZVKTsKLSAgIGJ1ZlsxXSA9IChwbmdfYnl0ZSkoIGkgICAgICAgJiAweGZmVSk7CisgICBidWZbMF0gPSAocG5nX2J5dGUpKGkgPj4gOCk7CisgICBidWZbMV0gPSAocG5nX2J5dGUpKGkgICAgICk7CiB9CiAjZW5kaWYKIApAQCAtNjkzLDYgKzY5Myw5MCBAQAogfQogI2VuZGlmIC8qIFdSSVRFX0NPTVBSRVNTRURfVEVYVCAqLwogCisjaWYgZGVmaW5lZChQTkdfV1JJVEVfVEVYVF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3BDQUxfU1VQUE9SVEVEKSB8fCBcCisgICAgZGVmaW5lZChQTkdfV1JJVEVfaUNDUF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX3NQTFRfU1VQUE9SVEVEKQorLyogQ2hlY2sgdGhhdCB0aGUgdEVYdCBvciB6VFh0IGtleXdvcmQgaXMgdmFsaWQgcGVyIFBORyAxLjAgc3BlY2lmaWNhdGlvbiwKKyAqIGFuZCBpZiBpbnZhbGlkLCBjb3JyZWN0IHRoZSBrZXl3b3JkIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgdGhlIGVudGlyZQorICogY2h1bmsuICBUaGUgUE5HIDEuMCBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGtleXdvcmRzIDEtNzkgY2hhcmFjdGVycyBpbgorICogbGVuZ3RoLCBmb3JiaWRzIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSwgbXVsdGlwbGUgaW50ZXJuYWwgc3BhY2VzLAorICogYW5kIHRoZSBub24tYnJlYWsgc3BhY2UgKDB4ODApIGZyb20gSVNPIDg4NTktMS4gIFJldHVybnMga2V5d29yZCBsZW5ndGguCisgKgorICogVGhlICduZXdfa2V5JyBidWZmZXIgbXVzdCBiZSA4MCBjaGFyYWN0ZXJzIGluIHNpemUgKGZvciB0aGUga2V5d29yZCBwbHVzIGEKKyAqIHRyYWlsaW5nICdcMCcpLiAgSWYgdGhpcyByb3V0aW5lIHJldHVybnMgMCB0aGVuIHRoZXJlIHdhcyBubyBrZXl3b3JkLCBvciBhCisgKiB2YWxpZCBvbmUgY291bGQgbm90IGJlIGdlbmVyYXRlZCwgYW5kIHRoZSBjYWxsZXIgbXVzdCBwbmdfZXJyb3IuCisgKi8KK3N0YXRpYyBwbmdfdWludF8zMgorcG5nX2NoZWNrX2tleXdvcmQocG5nX3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb25zdF9jaGFycCBrZXksIHBuZ19ieXRlcCBuZXdfa2V5KQoreworICAgcG5nX2NvbnN0X2NoYXJwIG9yaWdfa2V5ID0ga2V5OworICAgcG5nX3VpbnRfMzIga2V5X2xlbiA9IDA7CisgICBpbnQgYmFkX2NoYXJhY3RlciA9IDA7CisgICBpbnQgc3BhY2UgPSAxOworCisgICBwbmdfZGVidWcoMSwgImluIHBuZ19jaGVja19rZXl3b3JkIik7CisKKyAgIGlmIChrZXkgPT0gTlVMTCkKKyAgIHsKKyAgICAgICpuZXdfa2V5ID0gMDsKKyAgICAgIHJldHVybiAwOworICAgfQorCisgICB3aGlsZSAoKmtleSAmJiBrZXlfbGVuIDwgNzkpCisgICB7CisgICAgICBwbmdfYnl0ZSBjaCA9IChwbmdfYnl0ZSkqa2V5Kys7CisKKyAgICAgIGlmICgoY2ggPiAzMiAmJiBjaCA8PSAxMjYpIHx8IChjaCA+PSAxNjEgLyomJiBjaCA8PSAyNTUqLykpCisgICAgICAgICAqbmV3X2tleSsrID0gY2gsICsra2V5X2xlbiwgc3BhY2UgPSAwOworCisgICAgICBlbHNlIGlmIChzcGFjZSA9PSAwKQorICAgICAgeworICAgICAgICAgLyogQSBzcGFjZSBvciBhbiBpbnZhbGlkIGNoYXJhY3RlciB3aGVuIG9uZSB3YXNuJ3Qgc2VlbiBpbW1lZGlhdGVseQorICAgICAgICAgICogYmVmb3JlOyBvdXRwdXQganVzdCBhIHNwYWNlLgorICAgICAgICAgICovCisgICAgICAgICAqbmV3X2tleSsrID0gMzIsICsra2V5X2xlbiwgc3BhY2UgPSAxOworCisgICAgICAgICAvKiBJZiB0aGUgY2hhcmFjdGVyIHdhcyBub3QgYSBzcGFjZSB0aGVuIGl0IGlzIGludmFsaWQuICovCisgICAgICAgICBpZiAoY2ggIT0gMzIpCisgICAgICAgICAgICBiYWRfY2hhcmFjdGVyID0gY2g7CisgICAgICB9CisKKyAgICAgIGVsc2UgaWYgKGJhZF9jaGFyYWN0ZXIgPT0gMCkKKyAgICAgICAgIGJhZF9jaGFyYWN0ZXIgPSBjaDsgLyoganVzdCBza2lwIGl0LCByZWNvcmQgdGhlIGZpcnN0IGVycm9yICovCisgICB9CisKKyAgIGlmIChrZXlfbGVuID4gMCAmJiBzcGFjZSAhPSAwKSAvKiB0cmFpbGluZyBzcGFjZSAqLworICAgeworICAgICAgLS1rZXlfbGVuLCAtLW5ld19rZXk7CisgICAgICBpZiAoYmFkX2NoYXJhY3RlciA9PSAwKQorICAgICAgICAgYmFkX2NoYXJhY3RlciA9IDMyOworICAgfQorCisgICAvKiBUZXJtaW5hdGUgdGhlIGtleXdvcmQgKi8KKyAgICpuZXdfa2V5ID0gMDsKKworICAgaWYgKGtleV9sZW4gPT0gMCkKKyAgICAgIHJldHVybiAwOworCisjaWZkZWYgUE5HX1dBUk5JTkdTX1NVUFBPUlRFRAorICAgLyogVHJ5IHRvIG9ubHkgb3V0cHV0IG9uZSB3YXJuaW5nIHBlciBrZXl3b3JkOiAqLworICAgaWYgKCprZXkgIT0gMCkgLyoga2V5d29yZCB0b28gbG9uZyAqLworICAgICAgcG5nX3dhcm5pbmcocG5nX3B0ciwgImtleXdvcmQgdHJ1bmNhdGVkIik7CisKKyAgIGVsc2UgaWYgKGJhZF9jaGFyYWN0ZXIgIT0gMCkKKyAgIHsKKyAgICAgIFBOR19XQVJOSU5HX1BBUkFNRVRFUlMocCkKKworICAgICAgcG5nX3dhcm5pbmdfcGFyYW1ldGVyKHAsIDEsIG9yaWdfa2V5KTsKKyAgICAgIHBuZ193YXJuaW5nX3BhcmFtZXRlcl9zaWduZWQocCwgMiwgUE5HX05VTUJFUl9GT1JNQVRfMDJ4LCBiYWRfY2hhcmFjdGVyKTsKKworICAgICAgcG5nX2Zvcm1hdHRlZF93YXJuaW5nKHBuZ19wdHIsIHAsICJrZXl3b3JkIFwiQDFcIjogYmFkIGNoYXJhY3RlciAnMHhAMiciKTsKKyAgIH0KKyNlbmRpZiAvKiBXQVJOSU5HUyAqLworCisgICByZXR1cm4ga2V5X2xlbjsKK30KKyNlbmRpZiAvKiBXUklURV9URVhUIHx8IFdSSVRFX3BDQUwgfHwgV1JJVEVfaUNDUCB8fCBXUklURV9zUExUICovCisKIC8qIFdyaXRlIHRoZSBJSERSIGNodW5rLCBhbmQgdXBkYXRlIHRoZSBwbmdfc3RydWN0IHdpdGggdGhlIG5lY2Vzc2FyeQogICogaW5mb3JtYXRpb24uICBOb3RlIHRoYXQgdGhlIHJlc3Qgb2YgdGhpcyBjb2RlIGRlcGVuZHMgdXBvbiB0aGlzCiAgKiBpbmZvcm1hdGlvbiBiZWluZyBjb3JyZWN0LgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9hd3RfSW1hZ2luZ0xpYi5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9hd3RfSW1hZ2luZ0xpYi5jCmluZGV4IDI4NDU4OTkuLjQ3MmI1ZWUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbWVkaWFsaWIvYXd0X0ltYWdpbmdMaWIuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL2F3dF9JbWFnaW5nTGliLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03NzIsNyArNzcyLDYgQEAKICAgICBtbGliX2ltYWdlICpzcmM7CiAgICAgbWxpYl9pbWFnZSAqZHN0OwogICAgIGludCBpOwotICAgIGludCBqID0gMDsKICAgICBpbnQgcmV0U3RhdHVzID0gMTsKICAgICBtbGliX3N0YXR1cyBzdGF0dXM7CiAgICAgZG91YmxlICptYXRyaXg7CkBAIC04MjUsMTUgKzgyNCw2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIGRvdWJsZSB2YWx1ZSBpbiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKi8KLSAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0KLSAgICAgICAgaWYgKCEoSVNfRklOSVRFKG1hdHJpeFtqXSkpKSB7Ci0gICAgICAgICAgICAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgam1hdHJpeCwgbWF0cml4LCBKTklfQUJPUlQpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBpZiAoc19wcmludEl0KSB7CiAgICAgICAgIHByaW50ZigibWF0cml4IGlzICVnICVnICVnICVnICVnICVnXG4iLCBtYXRyaXhbMF0sIG1hdHJpeFsxXSwKICAgICAgICAgICAgICAgIG1hdHJpeFsyXSwgbWF0cml4WzNdLCBtYXRyaXhbNF0sIG1hdHJpeFs1XSk7CkBAIC05OTAsNyArOTgwLDYgQEAKICAgICBtbGliX2ltYWdlICpzcmM7CiAgICAgbWxpYl9pbWFnZSAqZHN0OwogICAgIGludCBpOwotICAgIGludCBqID0gMDsKICAgICBpbnQgcmV0U3RhdHVzID0gMTsKICAgICBtbGliX3N0YXR1cyBzdGF0dXM7CiAgICAgZG91YmxlICptYXRyaXg7CkBAIC0xMDU1LDE3ICsxMDQ0LDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgLyogQ2hlY2sgZm9yIGludmFsaWQgZG91YmxlIHZhbHVlIGluIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAqLwotICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKLQotICAgICAgICBpZiAoIShJU19GSU5JVEUobWF0cml4W2pdKSkpIHsKLSAgICAgICAgICAgICgqZW52KS0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoZW52LCBqbWF0cml4LCBtYXRyaXgsIEpOSV9BQk9SVCk7Ci0gICAgICAgICAgICBmcmVlKHNyY1Jhc3RlclApOwotICAgICAgICAgICAgZnJlZShkc3RSYXN0ZXJQKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKHNfcHJpbnRJdCkgewogICAgICAgICBwcmludGYoIm1hdHJpeCBpcyAlZyAlZyAlZyAlZyAlZyAlZ1xuIiwgbWF0cml4WzBdLCBtYXRyaXhbMV0sCiAgICAgICAgICAgICAgICBtYXRyaXhbMl0sIG1hdHJpeFszXSwgbWF0cml4WzRdLCBtYXRyaXhbNV0pOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9tbGliX0ltYWdlU2NhblBvbHkuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbWVkaWFsaWIvbWxpYl9JbWFnZVNjYW5Qb2x5LmMKaW5kZXggY2NjMTU3Mi4uMzRjMjE3MSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9tbGliX0ltYWdlU2NhblBvbHkuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL21saWJfSW1hZ2VTY2FuUG9seS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsOCArMzMsNiBAQAogI2luY2x1ZGUgIm1saWJfaW1hZ2UuaCIKICNpbmNsdWRlICJtbGliX1N5c01hdGguaCIKICNpbmNsdWRlICJtbGliX0ltYWdlQWZmaW5lLmgiCi0jaW5jbHVkZSAic2FmZV9tYXRoLmgiCi0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIG1saWJfc3RhdHVzIG1saWJfQWZmaW5lRWRnZXMobWxpYl9hZmZpbmVfcGFyYW0gKnBhcmFtLApAQCAtODUsMTIgKzgzLDYgQEAKICAgZHN0WVN0cmlkZSA9IG1saWJfSW1hZ2VHZXRTdHJpZGUoZHN0KTsKICAgcGFkZGluZ3MgPSBtbGliX0ltYWdlR2V0UGFkZGluZ3Moc3JjKTsKIAotICAvKiBBbGwgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBmaW5pdGUuIGlmIG5vdCwgcmV0dXJuIGZhaWx1cmUgKi8KLSAgaWYgKCEoSVNfRklOSVRFKGEpICYmIElTX0ZJTklURShiKSAmJiBJU19GSU5JVEUoYykgJiYgSVNfRklOSVRFKGQpICYmCi0gICAgICAgIElTX0ZJTklURSh0eCkgJiYgSVNfRklOSVRFKHR5KSkpIHsKLSAgICByZXR1cm4gTUxJQl9GQUlMVVJFOwotICB9Ci0KICAgaWYgKHNyY1dpZHRoID49ICgxIDw8IDE1KSB8fCBzcmNIZWlnaHQgPj0gKDEgPDwgMTUpKSB7CiAgICAgcmV0dXJuIE1MSUJfRkFJTFVSRTsKICAgfQpAQCAtMjk2LDEwICsyODgsNiBAQAogICAgIGlmIChkWTEgPT0gZFkyKQogICAgICAgY29udGludWU7CiAKLSAgICBpZiAoIShJU19GSU5JVEUoc2xvcGUpKSkgewotICAgICAgIGNvbnRpbnVlOwotICAgIH0KLQogICAgIGlmIChkWTEgPCAwLjApCiAgICAgICB5MSA9IDA7CiAgICAgZWxzZSB7CkBAIC0zNDAsMTAgKzMyOCw2IEBACiAgICAgaWYgKGRZMSA9PSBkWTIpCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmICghKElTX0ZJTklURShzbG9wZSkpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLQogICAgIGlmIChkWTEgPCAwLjApCiAgICAgICB5MSA9IDA7CiAgICAgZWxzZSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL3NhZmVfbWF0aC5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYi9zYWZlX21hdGguaAppbmRleCBhODdlYmExLi4zNGMxZmM1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L21lZGlhbGliL3NhZmVfbWF0aC5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvbWVkaWFsaWIvc2FmZV9tYXRoLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNSArMjYsMTAgQEAKICNpZm5kZWYgX19TQUZFX01BVEhfSF9fCiAjZGVmaW5lIF9fU0FGRV9NQVRIX0hfXwogCi0jaW5jbHVkZSAibWxpYl90eXBlcy5oIgotCiAjZGVmaW5lIFNBRkVfVE9fTVVMVChhLCBiKSBcCiAgICAgKCgoYSkgPiAwKSAmJiAoKGIpID49IDApICYmICgoMHg3ZmZmZmZmZiAvIChhKSkgPiAoYikpKQogCiAjZGVmaW5lIFNBRkVfVE9fQUREKGEsIGIpIFwKICAgICAoKChhKSA+PSAwKSAmJiAoKGIpID49IDApICYmICgoMHg3ZmZmZmZmZiAtIChhKSkgPiAoYikpKQogCi0jZGVmaW5lIElTX0ZJTklURShhKSBcCi0gICAgKCgoYSkgPj0gTUxJQl9ENjRfTUlOKSAmJiAoKGEpIDw9IE1MSUJfRDY0X01BWCkpCi0KICNlbmRpZiAvLyBfX1NBRkVfTUFUSF9IX18KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zYWxwaGEuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3ZWQ1NS4uMDAwMDAwMAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLyoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotLy8gTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0vLyBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCi0vLyBmaWxlOgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLQotLy8gQWxwaGEgY29weSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRmxvb3IgdG8gYnl0ZSwgdGFraW5nIGNhcmUgb2Ygc2F0dXJhdGlvbgotY21zSU5MSU5FIGNtc1VJbnQ4TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlQnl0ZShjbXNGbG9hdDY0TnVtYmVyIGQpCi17Ci0gICAgICAgZCArPSAwLjU7Ci0gICAgICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7Ci0gICAgICAgaWYgKGQgPj0gMjU1LjApIHJldHVybiAyNTU7Ci0KLSAgICAgICByZXR1cm4gKGNtc1VJbnQ4TnVtYmVyKSBfY21zUXVpY2tGbG9vcldvcmQoZCk7Ci19Ci0KLQotLy8gUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgZ2l2ZW4gZm9ybWF0dGVyCi1zdGF0aWMKLWludCB0cnVlQnl0ZXNTaXplKGNtc1VJbnQzMk51bWJlciBGb3JtYXQpCi17Ci0gICAgICAgaW50IGZtdF9ieXRlcyA9IFRfQllURVMoRm9ybWF0KTsKLQotICAgICAgIC8vIEZvciBkb3VibGUsIHRoZSBUX0JZVEVTIGZpZWxkIHJldHVybnMgemVybwotICAgICAgIGlmIChmbXRfYnl0ZXMgPT0gMCkKLSAgICAgICAgICAgICAgcmV0dXJuIHNpemVvZihkb3VibGUpOwotCi0gICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhbHJlYWR5IGNvcnJlY3QgZm9yIGFsbCBmb3JtYXRzCi0gICAgICAgcmV0dXJuIGZtdF9ieXRlczsKLX0KLQotCi0vLyBTZXZlcmFsIGZvcm1hdCBjb252ZXJ0ZXJzCi0KLXR5cGVkZWYgdm9pZCgqY21zRm9ybWF0dGVyQWxwaGFGbikodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpOwotCi0KLS8vIEZyb20gOAotCi1zdGF0aWMKLXZvaWQgY29weTgodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgbWVtbW92ZShkc3QsIHNyYywgMSk7Ci19Ci0KLXN0YXRpYwotdm9pZCBmcm9tOHRvMTYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zVUludDhOdW1iZXIgbiA9ICooY21zVUludDhOdW1iZXIqKXNyYzsKLSAgICAgICAqKGNtc1VJbnQxNk51bWJlciopIGRzdCA9IEZST01fOF9UT18xNihuKTsKLX0KLQotc3RhdGljCi12b2lkIGZyb204dG9GTFQodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgKihjbXNGbG9hdDMyTnVtYmVyKilkc3QgPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wZjsKLX0KLQotc3RhdGljCi12b2lkIGZyb204dG9EQkwodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgKihjbXNGbG9hdDY0TnVtYmVyKilkc3QgPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbTh0b0hMRih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIG4gPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wZjsKLSAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Ci19Ci0KLS8vIEZyb20gMTYKLQotc3RhdGljCi12b2lkIGZyb20xNnRvOCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICBjbXNVSW50MTZOdW1iZXIgbiA9ICooY21zVUludDE2TnVtYmVyKilzcmM7Ci0gICAgICAgKihjbXNVSW50OE51bWJlciopIGRzdCA9IEZST01fMTZfVE9fOChuKTsKLX0KLQotc3RhdGljCi12b2lkIGNvcHkxNih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICBtZW1tb3ZlKGRzdCwgc3JjLCAyKTsKLX0KLQotdm9pZCBmcm9tMTZ0b0ZMVCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICAqKGNtc0Zsb2F0MzJOdW1iZXIqKWRzdCA9ICgqKGNtc1VJbnQxNk51bWJlciopc3JjKSAvIDY1NTM1LjBmOwotfQotCi12b2lkIGZyb20xNnRvREJMKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgICooY21zRmxvYXQ2NE51bWJlciopZHN0ID0gKCooY21zVUludDE2TnVtYmVyKilzcmMpIC8gNjU1MzUuMGY7Ci19Ci0KLXN0YXRpYwotdm9pZCBmcm9tMTZ0b0hMRih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIG4gPSAoKihjbXNVSW50MTZOdW1iZXIqKXNyYykgLyA2NTUzNS4wZjsKLSAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Ci19Ci0KLS8vIEZyb20gRmxvYXQKLQotc3RhdGljCi12b2lkIGZyb21GTFR0bzgodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gKihjbXNGbG9hdDMyTnVtYmVyKilzcmM7Ci0gICAgICAgKihjbXNVSW50OE51bWJlciopZHN0ID0gX2Ntc1F1aWNrU2F0dXJhdGVCeXRlKG4gKiAyNTUuMGYpOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbUZMVHRvMTYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gKihjbXNGbG9hdDMyTnVtYmVyKilzcmM7Ci0gICAgICAgKihjbXNVSW50MTZOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChuICogNjU1MzUuMGYpOwotfQotCi1zdGF0aWMKLXZvaWQgY29weTMyKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgIG1lbW1vdmUoZHN0LCBzcmMsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci19Ci0KLXN0YXRpYwotdm9pZCBmcm9tRkxUdG9EQkwodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gKihjbXNGbG9hdDMyTnVtYmVyKilzcmM7Ci0gICAgICAgKihjbXNGbG9hdDY0TnVtYmVyKilkc3QgPSAoY21zRmxvYXQ2NE51bWJlciluOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbUZMVHRvSExGKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9ICooY21zRmxvYXQzMk51bWJlciopc3JjOwotICAgICAgICooY21zVUludDE2TnVtYmVyKilkc3QgPSBfY21zRmxvYXQySGFsZihuKTsKLX0KLQotCi0vLyBGcm9tIEhBTEYKLQotc3RhdGljCi12b2lkIGZyb21ITEZ0bzgodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gX2Ntc0hhbGYyRmxvYXQoKihjbXNVSW50MTZOdW1iZXIqKXNyYyk7Ci0gICAgICAgKihjbXNVSW50OE51bWJlciopZHN0ID0gX2Ntc1F1aWNrU2F0dXJhdGVCeXRlKG4gKiAyNTUuMGYpOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbUhMRnRvMTYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gX2Ntc0hhbGYyRmxvYXQoKihjbXNVSW50MTZOdW1iZXIqKXNyYyk7Ci0gICAgICAgKihjbXNVSW50MTZOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChuICogNjU1MzUuMGYpOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbUhMRnRvRkxUKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgICooY21zRmxvYXQzMk51bWJlciopZHN0ID0gX2Ntc0hhbGYyRmxvYXQoKihjbXNVSW50MTZOdW1iZXIqKXNyYyk7Ci19Ci0KLXN0YXRpYwotdm9pZCBmcm9tSExGdG9EQkwodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgKihjbXNGbG9hdDY0TnVtYmVyKilkc3QgPSAoY21zRmxvYXQ2NE51bWJlcilfY21zSGFsZjJGbG9hdCgqKGNtc1VJbnQxNk51bWJlciopc3JjKTsKLX0KLQotLy8gRnJvbSBkb3VibGUKLXN0YXRpYwotdm9pZCBmcm9tREJMdG84KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgbiA9ICooY21zRmxvYXQ2NE51bWJlciopc3JjOwotICAgICAgICooY21zVUludDhOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlQnl0ZShuICogMjU1LjApOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbURCTHRvMTYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQ2NE51bWJlciBuID0gKihjbXNGbG9hdDY0TnVtYmVyKilzcmM7Ci0gICAgICAgKihjbXNVSW50MTZOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChuICogNjU1MzUuMGYpOwotfQotCi1zdGF0aWMKLXZvaWQgZnJvbURCTHRvRkxUKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQotewotICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgbiA9ICooY21zRmxvYXQ2NE51bWJlciopc3JjOwotICAgICAgICooY21zRmxvYXQzMk51bWJlciopZHN0ID0gKGNtc0Zsb2F0MzJOdW1iZXIpIG47Ci19Ci0KLXN0YXRpYwotdm9pZCBmcm9tREJMdG9ITEYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCi17Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBuID0gKGNtc0Zsb2F0MzJOdW1iZXIpICooY21zRmxvYXQ2NE51bWJlciopc3JjOwotICAgICAgICooY21zVUludDE2TnVtYmVyKilkc3QgPSBfY21zRmxvYXQySGFsZihuKTsKLX0KLQotc3RhdGljCi12b2lkIGNvcHk2NCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKLXsKLSAgICAgICBtZW1tb3ZlKGRzdCwgc3JjLCBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotfQotCi0KLS8vIFJldHVybnMgdGhlIHBvc2l0aW9uICh4IG9yIHkpIG9mIHRoZSBmb3JtYXR0ZXIgaW4gdGhlIHRhYmxlIG9mIGZ1bmN0aW9ucwotc3RhdGljCi1pbnQgRm9ybWF0dGVyUG9zKGNtc1VJbnQzMk51bWJlciBmcm0pCi17Ci0gICAgICAgaW50ICBiID0gVF9CWVRFUyhmcm0pOwotCi0gICAgICAgaWYgKGIgPT0gMCAmJiBUX0ZMT0FUKGZybSkpCi0gICAgICAgICAgICAgIHJldHVybiA0OyAvLyBEQkwKLSAgICAgICBpZiAoYiA9PSAyICYmIFRfRkxPQVQoZnJtKSkKLSAgICAgICAgICAgICAgcmV0dXJuIDI7IC8vIEhMRgotICAgICAgIGlmIChiID09IDQgJiYgVF9GTE9BVChmcm0pKQotICAgICAgICAgICAgICByZXR1cm4gMzsgLy8gRkxUCi0gICAgICAgaWYgKGIgPT0gMiAmJiAhVF9GTE9BVChmcm0pKQotICAgICAgICAgICAgICByZXR1cm4gMTsgLy8gMTYKLSAgICAgICBpZiAoYiA9PSAxICYmICFUX0ZMT0FUKGZybSkpCi0gICAgICAgICAgICAgIHJldHVybiAwOyAvLyA4Ci0KLSAgICAgICByZXR1cm4gLTE7IC8vIG5vdCByZWNvZ25pemVkCi0KLX0KLQotLy8gT2J0YWlucyBhIGFscGhhLXRvLWFscGhhIGZ1bm1jdGlvbiBmb3JtYXR0ZXIKLXN0YXRpYwotY21zRm9ybWF0dGVyQWxwaGFGbiBfY21zR2V0Rm9ybWF0dGVyQWxwaGEoY21zQ29udGV4dCBpZCwgY21zVUludDMyTnVtYmVyIGluLCBjbXNVSW50MzJOdW1iZXIgb3V0KQotewotc3RhdGljIGNtc0Zvcm1hdHRlckFscGhhRm4gRm9ybWF0dGVyc0FscGhhWzVdWzVdID0gewotCi0gICAgICAgLyogZnJvbSA4ICovICB7IGNvcHk4LCAgICAgIGZyb204dG8xNiwgICBmcm9tOHRvSExGLCAgIGZyb204dG9GTFQsICAgZnJvbTh0b0RCTCAgIH0sCi0gICAgICAgLyogZnJvbSAxNiovICB7IGZyb20xNnRvOCwgIGNvcHkxNiwgICAgICBmcm9tMTZ0b0hMRiwgIGZyb20xNnRvRkxULCAgZnJvbTE2dG9EQkwgIH0sCi0gICAgICAgLyogZnJvbSBITEYqLyB7IGZyb21ITEZ0bzgsIGZyb21ITEZ0bzE2LCBjb3B5MTYsICAgICAgIGZyb21ITEZ0b0ZMVCwgZnJvbUhMRnRvREJMIH0sCi0gICAgICAgLyogZnJvbSBGTFQqLyB7IGZyb21GTFR0bzgsIGZyb21GTFR0bzE2LCBmcm9tRkxUdG9ITEYsIGNvcHkzMiwgICAgICAgZnJvbUZMVHRvREJMIH0sCi0gICAgICAgLyogZnJvbSBEQkwqLyB7IGZyb21EQkx0bzgsIGZyb21EQkx0bzE2LCBmcm9tREJMdG9ITEYsIGZyb21EQkx0b0ZMVCwgY29weTY0IH19OwotCi0gICAgICAgIGludCBpbl9uICA9IEZvcm1hdHRlclBvcyhpbik7Ci0gICAgICAgIGludCBvdXRfbiA9IEZvcm1hdHRlclBvcyhvdXQpOwotCi0gICAgICAgIGlmIChpbl9uIDwgMCB8fCBvdXRfbiA8IDAgfHwgaW5fbiA+IDQgfHwgb3V0X24gPiA0KSB7Ci0KLSAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKGlkLCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVucmVjb2duaXplZCBhbHBoYSBjaGFubmVsIHdpZHRoIik7Ci0gICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBGb3JtYXR0ZXJzQWxwaGFbaW5fbl1bb3V0X25dOwotfQotCi0KLQotLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgZGlzdGFuY2UgZnJvbSBlYWNoIGNvbXBvbmVudCB0byB0aGUgbmV4dCBvbmUgaW4gYnl0ZXMuCi1zdGF0aWMKLXZvaWQgQ29tcHV0ZUluY3JlbWVudHNGb3JDaHVua3koY21zVUludDMyTnVtYmVyIEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFN0YXJ0aW5nT3JkZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzW10pCi17Ci0gICAgICAgY21zVUludDMyTnVtYmVyIGNoYW5uZWxzW2Ntc01BWENIQU5ORUxTXTsKLSAgICAgICBpbnQgZXh0cmEgPSBUX0VYVFJBKEZvcm1hdCk7Ci0gICAgICAgaW50IG5jaGFubmVscyA9IFRfQ0hBTk5FTFMoRm9ybWF0KTsKLSAgICAgICBpbnQgdG90YWxfY2hhbnMgPSBuY2hhbm5lbHMgKyBleHRyYTsKLSAgICAgICBpbnQgaTsKLSAgICAgICBpbnQgY2hhbm5lbFNpemUgPSB0cnVlQnl0ZXNTaXplKEZvcm1hdCk7Ci0gICAgICAgaW50IHBpeGVsU2l6ZSA9IGNoYW5uZWxTaXplICogdG90YWxfY2hhbnM7Ci0KLSAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgICAgICAgIGlmICh0b3RhbF9jaGFucyA8PSAwIHx8IHRvdGFsX2NoYW5zID49IGNtc01BWENIQU5ORUxTKQotICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBtZW1zZXQoY2hhbm5lbHMsIDAsIHNpemVvZihjaGFubmVscykpOwotCi0gICAgICAgLy8gU2VwYXJhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBzdGFydGluZyBwb2ludCBhbmQgb25seSBkZXBlbmRzIG9uIGNoYW5uZWwgc2l6ZQotICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKQotICAgICAgICAgICAgICBDb21wb25lbnRQb2ludGVySW5jcmVtZW50c1tpXSA9IHBpeGVsU2l6ZTsKLQotICAgICAgIC8vIEhhbmRsZSBkbyBzd2FwCi0gICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsX2NoYW5zOyBpKyspCi0gICAgICAgewotICAgICAgICAgICAgICBpZiAoVF9ET1NXQVAoRm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbaV0gPSB0b3RhbF9jaGFucyAtIGkgLSAxOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbaV0gPSBpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgfQotCi0gICAgICAgLy8gSGFuZGxlIHN3YXAgZmlyc3QgKFJPTCBvZiBwb3NpdGlvbnMpLCBleGFtcGxlIENNWUsgLT4gS0NNWSB8IDAxMjMgLT4gMzAxMgotICAgICAgIGlmIChUX1NXQVBGSVJTVChGb3JtYXQpICYmIHRvdGFsX2NoYW5zID4gMSkgewotCi0gICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciB0bXAgPSBjaGFubmVsc1swXTsKLSAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsX2NoYW5zLTE7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gY2hhbm5lbHNbaSArIDFdOwotCi0gICAgICAgICAgICAgIGNoYW5uZWxzW3RvdGFsX2NoYW5zIC0gMV0gPSB0bXA7Ci0gICAgICAgfQotCi0gICAgICAgLy8gSGFuZGxlIHNpemUKLSAgICAgICBpZiAoY2hhbm5lbFNpemUgPiAxKQotICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfY2hhbnM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbaV0gKj0gY2hhbm5lbFNpemU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKQotICAgICAgICAgICAgICBDb21wb25lbnRTdGFydGluZ09yZGVyW2ldID0gY2hhbm5lbHNbaSArIG5jaGFubmVsc107Ci19Ci0KLQotCi0vLyAgT24gcGxhbmFyIGNvbmZpZ3VyYXRpb25zLCB0aGUgZGlzdGFuY2UgaXMgdGhlIHN0cmlkZSBhZGRlZCB0byBhbnkgbm9uLW5lZ2F0aXZlCi1zdGF0aWMKLXZvaWQgQ29tcHV0ZUluY3JlbWVudHNGb3JQbGFuYXIoY21zVUludDMyTnVtYmVyIEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyUGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb21wb25lbnRTdGFydGluZ09yZGVyW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb21wb25lbnRQb2ludGVySW5jcmVtZW50c1tdKQotewotICAgICAgIGNtc1VJbnQzMk51bWJlciBjaGFubmVsc1tjbXNNQVhDSEFOTkVMU107Ci0gICAgICAgaW50IGV4dHJhID0gVF9FWFRSQShGb3JtYXQpOwotICAgICAgIGludCBuY2hhbm5lbHMgPSBUX0NIQU5ORUxTKEZvcm1hdCk7Ci0gICAgICAgaW50IHRvdGFsX2NoYW5zID0gbmNoYW5uZWxzICsgZXh0cmE7Ci0gICAgICAgaW50IGk7Ci0gICAgICAgaW50IGNoYW5uZWxTaXplID0gdHJ1ZUJ5dGVzU2l6ZShGb3JtYXQpOwotCi0gICAgICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgICAgaWYgKHRvdGFsX2NoYW5zIDw9IDAgfHwgdG90YWxfY2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpCi0gICAgICAgICAgIHJldHVybjsKLQotICAgICAgIG1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW5uZWxzKSk7Ci0KLSAgICAgICAvLyBTZXBhcmF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHN0YXJ0aW5nIHBvaW50IGFuZCBvbmx5IGRlcGVuZHMgb24gY2hhbm5lbCBzaXplCi0gICAgICAgZm9yIChpID0gMDsgaSA8IGV4dHJhOyBpKyspCi0gICAgICAgICAgICAgIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzW2ldID0gY2hhbm5lbFNpemU7Ci0KLSAgICAgICAvLyBIYW5kbGUgZG8gc3dhcAotICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9jaGFuczsgaSsrKQotICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKFRfRE9TV0FQKEZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gdG90YWxfY2hhbnMgLSBpIC0gMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gaTsKLSAgICAgICAgICAgICAgfQotICAgICAgIH0KLQotICAgICAgIC8vIEhhbmRsZSBzd2FwIGZpcnN0IChST0wgb2YgcG9zaXRpb25zKSwgZXhhbXBsZSBDTVlLIC0+IEtDTVkgfCAwMTIzIC0+IDMwMTIKLSAgICAgICBpZiAoVF9TV0FQRklSU1QoRm9ybWF0KSAmJiB0b3RhbF9jaGFucyA+IDApIHsKLQotICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgdG1wID0gY2hhbm5lbHNbMF07Ci0gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9jaGFucyAtIDE7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gY2hhbm5lbHNbaSArIDFdOwotCi0gICAgICAgICAgICAgIGNoYW5uZWxzW3RvdGFsX2NoYW5zIC0gMV0gPSB0bXA7Ci0gICAgICAgfQotCi0gICAgICAgLy8gSGFuZGxlIHNpemUKLSAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfY2hhbnM7IGkrKykgewotICAgICAgICAgICAgICBjaGFubmVsc1tpXSAqPSBCeXRlc1BlclBsYW5lOwotICAgICAgIH0KLQotICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKQotICAgICAgICAgICAgICBDb21wb25lbnRTdGFydGluZ09yZGVyW2ldID0gY2hhbm5lbHNbaSArIG5jaGFubmVsc107Ci19Ci0KLQotCi0vLyBEaXNwYXRjaGVyIHBvciBjaHVua3kgYW5kIHBsYW5hciBSR0IKLXN0YXRpYwotdm9pZCAgQ29tcHV0ZUNvbXBvbmVudEluY3JlbWVudHMoY21zVUludDMyTnVtYmVyIEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFN0YXJ0aW5nT3JkZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb21wb25lbnRQb2ludGVySW5jcmVtZW50c1tdKQotewotICAgICAgIGlmIChUX1BMQU5BUihGb3JtYXQpKSB7Ci0KLSAgICAgICAgICAgICAgQ29tcHV0ZUluY3JlbWVudHNGb3JQbGFuYXIoRm9ybWF0LCAgQnl0ZXNQZXJQbGFuZSwgQ29tcG9uZW50U3RhcnRpbmdPcmRlciwgQ29tcG9uZW50UG9pbnRlckluY3JlbWVudHMpOwotICAgICAgIH0KLSAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgQ29tcHV0ZUluY3JlbWVudHNGb3JDaHVua3koRm9ybWF0LCAgQ29tcG9uZW50U3RhcnRpbmdPcmRlciwgQ29tcG9uZW50UG9pbnRlckluY3JlbWVudHMpOwotICAgICAgIH0KLQotfQotCi0KLQotLy8gSGFuZGxlcyBleHRyYSBjaGFubmVscyBjb3B5aW5nIGFscGhhIGlmIHJlcXVlc3RlZCBieSB0aGUgZmxhZ3MKLXZvaWQgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMoX2Ntc1RSQU5TRk9STSogcCwgY29uc3Qgdm9pZCogaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBrOwotICAgIGNtc1VJbnQzMk51bWJlciBuRXh0cmE7Ci0gICAgY21zVUludDMyTnVtYmVyIFNvdXJjZVN0YXJ0aW5nT3JkZXJbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBTb3VyY2VJbmNyZW1lbnRzW2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGVzdFN0YXJ0aW5nT3JkZXJbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBEZXN0SW5jcmVtZW50c1tjbXNNQVhDSEFOTkVMU107Ci0KLSAgICBjbXNGb3JtYXR0ZXJBbHBoYUZuIGNvcHlWYWx1ZUZuOwotCi0gICAgLy8gTWFrZSBzdXJlIHdlIG5lZWQgc29tZSBjb3B5Ci0gICAgaWYgKCEocC0+ZHdPcmlnaW5hbEZsYWdzICYgY21zRkxBR1NfQ09QWV9BTFBIQSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEV4aXQgZWFybHkgaWYgaW4tcGxhY2UgY29sb3ItbWFuYWdlbWVudCBpcyBvY2N1cnJpbmcgLSBubyBuZWVkIHRvIGNvcHkgZXh0cmEgY2hhbm5lbHMgdG8gdGhlbXNlbHZlcy4KLSAgICBpZiAocC0+SW5wdXRGb3JtYXQgPT0gcC0+T3V0cHV0Rm9ybWF0ICYmIGluID09IG91dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgc2FtZSBudW1iZXIgb2YgYWxwaGEgY2hhbm5lbHMuIElmIG5vdCwganVzdCByZXR1cm4gYXMgdGhpcyBzaG91bGQgYmUgY2hlY2tlZCBhdCB0cmFuc2Zvcm0gY3JlYXRpb24gdGltZS4KLSAgICBuRXh0cmEgPSBUX0VYVFJBKHAtPklucHV0Rm9ybWF0KTsKLSAgICBpZiAobkV4dHJhICE9IFRfRVhUUkEocC0+T3V0cHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQW55dGhpbmcgdG8gZG8/Ci0gICAgaWYgKG5FeHRyYSA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBDb21wdXRlIHRoZSBpbmNyZW1lbnRzCi0gICAgQ29tcHV0ZUNvbXBvbmVudEluY3JlbWVudHMocC0+SW5wdXRGb3JtYXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZUluLCBTb3VyY2VTdGFydGluZ09yZGVyLCBTb3VyY2VJbmNyZW1lbnRzKTsKLSAgICBDb21wdXRlQ29tcG9uZW50SW5jcmVtZW50cyhwLT5PdXRwdXRGb3JtYXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCwgRGVzdFN0YXJ0aW5nT3JkZXIsIERlc3RJbmNyZW1lbnRzKTsKLQotICAgIC8vIENoZWNrIGZvciBjb252ZXJzaW9ucyA4LCAxNiwgaGFsZiwgZmxvYXQsIGRibAotICAgIGNvcHlWYWx1ZUZuID0gX2Ntc0dldEZvcm1hdHRlckFscGhhKHAtPkNvbnRleHRJRCwgcC0+SW5wdXRGb3JtYXQsIHAtPk91dHB1dEZvcm1hdCk7Ci0KLSAgICBpZiAobkV4dHJhID09IDEpIHsgLy8gT3B0aW1pemVkIHJvdXRpbmUgZm9yIGNvcHlpbmcgYSBzaW5nbGUgZXh0cmEgY2hhbm5lbCBxdWlja2x5Ci0KLSAgICAgICAgY21zVUludDhOdW1iZXIqIFNvdXJjZVB0cjsKLSAgICAgICAgY21zVUludDhOdW1iZXIqIERlc3RQdHI7Ci0KLSAgICAgICAgY21zVUludDMyTnVtYmVyIFNvdXJjZVN0cmlkZUluY3JlbWVudCA9IDA7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciBEZXN0U3RyaWRlSW5jcmVtZW50ID0gMDsKLQotICAgICAgICAvLyBUaGUgbG9vcCBpdHNlbGYKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIC8vIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBsb29wCi0gICAgICAgICAgICBTb3VyY2VQdHIgPSAoY21zVUludDhOdW1iZXIqKWluICsgU291cmNlU3RhcnRpbmdPcmRlclswXSArIFNvdXJjZVN0cmlkZUluY3JlbWVudDsKLSAgICAgICAgICAgIERlc3RQdHIgPSAoY21zVUludDhOdW1iZXIqKW91dCArIERlc3RTdGFydGluZ09yZGVyWzBdICsgRGVzdFN0cmlkZUluY3JlbWVudDsKLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFBpeGVsc1BlckxpbmU7IGorKykgewotCi0gICAgICAgICAgICAgICAgY29weVZhbHVlRm4oRGVzdFB0ciwgU291cmNlUHRyKTsKLQotICAgICAgICAgICAgICAgIFNvdXJjZVB0ciArPSBTb3VyY2VJbmNyZW1lbnRzWzBdOwotICAgICAgICAgICAgICAgIERlc3RQdHIgKz0gRGVzdEluY3JlbWVudHNbMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFNvdXJjZVN0cmlkZUluY3JlbWVudCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOwotICAgICAgICAgICAgRGVzdFN0cmlkZUluY3JlbWVudCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgeyAvLyBHZW5lcmFsIGNhc2Ugd2l0aCBtb3JlIHRoYW4gb25lIGV4dHJhIGNoYW5uZWwKLQotICAgICAgICBjbXNVSW50OE51bWJlciogU291cmNlUHRyW2Ntc01BWENIQU5ORUxTXTsKLSAgICAgICAgY21zVUludDhOdW1iZXIqIERlc3RQdHJbY21zTUFYQ0hBTk5FTFNdOwotCi0gICAgICAgIGNtc1VJbnQzMk51bWJlciBTb3VyY2VTdHJpZGVJbmNyZW1lbnRzW2Ntc01BWENIQU5ORUxTXTsKLSAgICAgICAgY21zVUludDMyTnVtYmVyIERlc3RTdHJpZGVJbmNyZW1lbnRzW2Ntc01BWENIQU5ORUxTXTsKLQotICAgICAgICBtZW1zZXQoU291cmNlU3RyaWRlSW5jcmVtZW50cywgMCwgc2l6ZW9mKFNvdXJjZVN0cmlkZUluY3JlbWVudHMpKTsKLSAgICAgICAgbWVtc2V0KERlc3RTdHJpZGVJbmNyZW1lbnRzLCAwLCBzaXplb2YoRGVzdFN0cmlkZUluY3JlbWVudHMpKTsKLQotICAgICAgICAvLyBUaGUgbG9vcCBpdHNlbGYKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgICAgIC8vIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBsb29wCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkV4dHJhOyBqKyspIHsKLQotICAgICAgICAgICAgICAgIFNvdXJjZVB0cltqXSA9IChjbXNVSW50OE51bWJlciopaW4gKyBTb3VyY2VTdGFydGluZ09yZGVyW2pdICsgU291cmNlU3RyaWRlSW5jcmVtZW50c1tqXTsKLSAgICAgICAgICAgICAgICBEZXN0UHRyW2pdID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBEZXN0U3RhcnRpbmdPcmRlcltqXSArIERlc3RTdHJpZGVJbmNyZW1lbnRzW2pdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkV4dHJhOyBrKyspIHsKLQotICAgICAgICAgICAgICAgICAgICBjb3B5VmFsdWVGbihEZXN0UHRyW2tdLCBTb3VyY2VQdHJba10pOwotCi0gICAgICAgICAgICAgICAgICAgIFNvdXJjZVB0cltrXSArPSBTb3VyY2VJbmNyZW1lbnRzW2tdOwotICAgICAgICAgICAgICAgICAgICBEZXN0UHRyW2tdICs9IERlc3RJbmNyZW1lbnRzW2tdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5FeHRyYTsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICBTb3VyY2VTdHJpZGVJbmNyZW1lbnRzW2pdICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47Ci0gICAgICAgICAgICAgICAgRGVzdFN0cmlkZUluY3JlbWVudHNbal0gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjYW0wMi5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjYW0wMi5jCmluZGV4IGFlNzAzOGMuLjg2ZWMxNjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY2FtMDIuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2NhbTAyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjZ2F0cy5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjZ2F0cy5jCmluZGV4IDllMDMzMTYuLjY2NGEzYzkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY2dhdHMuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2NnYXRzLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtNjI1LDcgKzYyNSw3IEBACiB9CiAKIC8vIFBhcnNlcyBhIGZsb2F0IG51bWJlcgotLy8gVGhpcyBjYW4gbm90IGNhbGwgZGlyZWN0bHkgYXRvZiBiZWNhdXNlIGl0IHVzZXMgbG9jYWxlIGRlcGVuZGVudAorLy8gVGhpcyBjYW4gbm90IGNhbGwgZGlyZWN0bHkgYXRvZiBiZWNhdXNlIGl0IHVzZXMgbG9jYWxlIGRlcGVuZGFudAogLy8gcGFyc2luZywgd2hpbGUgQ0NNWCBmaWxlcyBhbHdheXMgdXNlIC4gYXMgZGVjaW1hbCBzZXBhcmF0b3IKIHN0YXRpYwogY21zRmxvYXQ2NE51bWJlciBQYXJzZUZsb2F0TnVtYmVyKGNvbnN0IGNoYXIgKkJ1ZmZlcikKQEAgLTgzMCwxMSArODMwLDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGl0OCAtPnN5ID09IFNJTlVNKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGl0OC0+aWQsIDEyNywgIiVkIiwgaXQ4LT5pbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaXQ4LT5pZCwgIiVkIiwgaXQ4LT5pbnVtKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoaXQ4LT5pZCwgMTI3LCBpdDggLT5Eb3VibGVGb3JtYXR0ZXIsIGl0OC0+ZG51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGl0OC0+aWQsIGl0OCAtPkRvdWJsZUZvcm1hdHRlciwgaXQ4LT5kbnVtKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGsgPSAoaW50KSBzdHJsZW4oaXQ4IC0+aWQpOwpAQCAtMTM5Miw3ICsxMzkyLDcgQEAKICAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwogICAgIGNoYXIgQnVmZmVyWzEwMjRdOwogCi0gICAgc25wcmludGYoQnVmZmVyLCAxMDIzLCBpdDgtPkRvdWJsZUZvcm1hdHRlciwgVmFsKTsKKyAgICBzcHJpbnRmKEJ1ZmZlciwgaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIFZhbCk7CiAKICAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsIGNQcm9wLCBOVUxMLCBCdWZmZXIsIFdSSVRFX1VOQ09PS0VEKSAhPSBOVUxMOwogfQpAQCAtMTQwMiw3ICsxNDAyLDcgQEAKICAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwogICAgIGNoYXIgQnVmZmVyWzEwMjRdOwogCi0gICAgc25wcmludGYoQnVmZmVyLCAxMDIzLCAiJXUiLCBWYWwpOworICAgIHNwcmludGYoQnVmZmVyLCAiJXUiLCBWYWwpOwogCiAgICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBjUHJvcCwgTlVMTCwgQnVmZmVyLCBXUklURV9IRVhBREVDSU1BTCkgIT0gTlVMTDsKIH0KQEAgLTE4NDYsNyArMTg0Niw3IEBACiB9CiAKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGlnaGVyIGxldmVsIHBhcnNpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhpZ2VyIGxldmVsIHBhcnNpbmcKIAogc3RhdGljCiBjbXNCb29sIERhdGFGb3JtYXRTZWN0aW9uKGNtc0lUOCogaXQ4KQpAQCAtMjE0OSw3ICsyMTQ5LDcgQEAKIAogCiAKLS8vIEluaXQgdXNlZnVsIHBvaW50ZXJzCisvLyBJbml0IHVzZWZ1bGwgcG9pbnRlcnMKIAogc3RhdGljCiB2b2lkIENvb2tQb2ludGVycyhjbXNJVDgqIGl0OCkKQEAgLTI1NDYsOSArMjU0Niw5IEBACiAKICAgICAgICAgZmxkID0gR2V0RGF0YUZvcm1hdChpdDgsIGkpOwogICAgICAgICBpZiAoZmxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChjbXNzdHJjYXNlY21wKGZsZCwgY1NhbXBsZSkgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfQorICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChmbGQsIGNTYW1wbGUpID09IDApCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIC0xOwpAQCAtMjYwNiw3ICsyNjA2LDcgQEAKIAogICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKIAotICAgIHNucHJpbnRmKEJ1ZmYsIDI1NSwgaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIFZhbCk7CisgICAgc3ByaW50ZihCdWZmLCBpdDgtPkRvdWJsZUZvcm1hdHRlciwgVmFsKTsKIAogICAgIHJldHVybiBTZXREYXRhKGl0OCwgcm93LCBjb2wsIEJ1ZmYpOwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjbnZydC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNjbnZydC5jCmluZGV4IDJhYzk5YmUuLmY2ZWYwNmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zY252cnQuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2NudnJ0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTM2LDcgKzEzNiw3IEBACiB9OwogCiAKLS8vIEEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisvLyBBIHBvaW50ZXIgdG8gdGhlIGJlZ2luaW5nIG9mIHRoZSBsaXN0CiBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSBfY21zSW50ZW50c1BsdWdpbkNodW5rID0geyBOVUxMIH07CiAKIC8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CkBAIC0yOTksNyArMjk5LDYgQEAKICAgICBjbXNNQVQzIFNjYWxlLCBtMSwgbTIsIG0zLCBtNDsKIAogICAgIC8vIFRPRE86IEZvbGxvdyBNYXJjIE1haHkncyByZWNvbW1lbmRhdGlvbiB0byBjaGVjayBpZiBDSEFEIGlzIHNhbWUgYnkgdXNpbmcgTTEqTTIgPT0gTTIqTTEuIElmIHNvLCBkbyBub3RoaW5nLgotICAgIC8vIFRPRE86IEFkZCBzdXBwb3J0IGZvciBBcmd5bGxBcnRzIHRhZwogCiAgICAgLy8gQWRhcHRhdGlvbiBzdGF0ZQogICAgIGlmIChBZGFwdGF0aW9uU3RhdGUgPT0gMS4wKSB7CkBAIC05MTgsNyArOTE3LDcgQEAKICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCi0gICAgLy8gTWFrZSBzdXJlIHRvIHBhc3MgdGhyb3VnaCBLICh3aGljaCBub3cgaXMgZml4ZWQpCisgICAgLy8gTWFrZSBzdXJlIHRvIHBhc3MgdGhydSBLICh3aGljaCBub3cgaXMgZml4ZWQpCiAgICAgT3V0ZlszXSA9IExhYktbM107CiAKICAgICAvLyBBcHBseSBUQUMgaWYgbmVlZGVkCkBAIC05ODYsNyArOTg1LDcgQEAKICAgICBtZW1zZXQoJmJwLCAwLCBzaXplb2YoYnApKTsKIAogICAgIC8vIFdlIG5lZWQgdGhlIGlucHV0IExVVCBvZiB0aGUgbGFzdCBwcm9maWxlLCBhc3N1bWluZyB0aGlzIG9uZSBpcyByZXNwb25zaWJsZSBvZgotICAgIC8vIGJsYWNrIGdlbmVyYXRpb24uIFRoaXMgTFVUIHdpbGwgYmUgc2VhcmNoZWQgaW4gaW52ZXJzZSBvcmRlci4KKyAgICAvLyBibGFjayBnZW5lcmF0aW9uLiBUaGlzIExVVCB3aWxsIGJlIHNlYWNoZWQgaW4gaW52ZXJzZSBvcmRlci4KICAgICBicC5MYWJLMmNteWsgPSBfY21zUmVhZElucHV0TFVUKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMpOwogICAgIGlmIChicC5MYWJLMmNteWsgPT0gTlVMTCkgZ290byBDbGVhbnVwOwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2Vyci5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNlcnIuYwppbmRleCBmYzc0YWE3Li5hNzA4OTk3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2Vyci5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZXJyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE1IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgfQogfQogCi0vLyBBdXhpbGlhcnkgdG8gZmlsbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgZnJvbSBwbHVnaW4gKG9yIGNvbnRleHQgMCBkZWZhdWx0cykKKy8vIEF1eGlsaWFyIHRvIGZpbGwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZyb20gcGx1Z2luIChvciBjb250ZXh0IDAgZGVmYXVsdHMpCiB2b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpCiB7CiAgICAgaWYgKFBsdWdpbiA9PSBOVUxMKSB7CkBAIC00NTksMTQgKzQ1OSwxNCBAQAogCiAvLyBFcnJvciBsb2dnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0vLyBUaGVyZSBpcyBubyBlcnJvciBoYW5kbGluZyBhdCBhbGwuIFdoZW4gYSBmdW5jdGlvbiBmYWlscywgaXQgcmV0dXJucyBwcm9wZXIgdmFsdWUuCisvLyBUaGVyZSBpcyBubyBlcnJvciBoYW5kbGluZyBhdCBhbGwuIFdoZW4gYSBmdW50aW9uIGZhaWxzLCBpdCByZXR1cm5zIHByb3BlciB2YWx1ZS4KIC8vIEZvciBleGFtcGxlLCBhbGwgY3JlYXRlIGZ1bmN0aW9ucyBkb2VzIHJldHVybiBOVUxMIG9uIGZhaWx1cmUuIE90aGVyIHJldHVybiBGQUxTRQogLy8gSXQgbWF5IGJlIGludGVyZXN0aW5nLCBmb3IgdGhlIGRldmVsb3BlciwgdG8ga25vdyB3aHkgdGhlIGZ1bmN0aW9uIGlzIGZhaWxpbmcuCiAvLyBmb3IgdGhhdCByZWFzb24sIGxjbXMyIGRvZXMgb2ZmZXIgYSBsb2dnaW5nIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGRvZXMgcmVjaXZlCiAvLyBhIEVOR0xJU0ggc3RyaW5nIHdpdGggc29tZSBjbHVlcyBvbiB3aGF0IGlzIGdvaW5nIHdyb25nLiBZb3UgY2FuIHNob3cgdGhpcwogLy8gaW5mbyB0byB0aGUgZW5kIHVzZXIsIG9yIGp1c3QgY3JlYXRlIHNvbWUgc29ydCBvZiBsb2cuCiAvLyBUaGUgbG9nZ2luZyBmdW5jdGlvbiBzaG91bGQgTk9UIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSwgYXMgdGhpcyBvYnZpb3VzbHkgY2FuIGxlYXZlCi0vLyByZXNvdXJjZXMuIEl0IGlzIHRoZSBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgZWFjaCBmdW5jdGlvbiByZXR1cm4gY29kZQorLy8gcmVzb3VyY2VzLiBJdCBpcyB0aGUgcHJvZ3JhbW1lcidzIHJlc3BvbnNhYmlsaXR5IHRvIGNoZWNrIGVhY2ggZnVuY3Rpb24gcmV0dXJuIGNvZGUKIC8vIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgZmFpbC4KIAogLy8gRXJyb3IgbWVzc2FnZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0VSUk9SX01FU1NBR0VfTEVOCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2dhbW1hLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2dhbW1hLmMKaW5kZXggZTk0MGZlMi4uZTY4ZjI1OCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnYW1tYS5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZ2FtbWEuYwpAQCAtNTk2LDcgKzU5Niw3IEBACiAgICAgcmV0dXJuIFZhbDsKIH0KIAotLy8gRXZhbHVhdGUgYSBzZWdtZW50ZWQgZnVuY3Rpb24gZm9yIGEgc2luZ2xlIHZhbHVlLiBSZXR1cm4gLTEgaWYgbm8gdmFsaWQgc2VnbWVudCBmb3VuZCAuCisvLyBFdmFsdWF0ZSBhIHNlZ21lbnRlZCBmdW50aW9uIGZvciBhIHNpbmdsZSB2YWx1ZS4gUmV0dXJuIC0xIGlmIG5vIHZhbGlkIHNlZ21lbnQgZm91bmQgLgogLy8gSWYgZm4gdHlwZSBpcyAwLCBwZXJmb3JtIGFuIGludGVycG9sYXRpb24gb24gdGhlIHRhYmxlCiBzdGF0aWMKIGNtc0Zsb2F0NjROdW1iZXIgRXZhbFNlZ21lbnRlZEZuKGNvbnN0IGNtc1RvbmVDdXJ2ZSAqZywgY21zRmxvYXQ2NE51bWJlciBSKQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnbXQuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zZ210LmMKaW5kZXggODEyNTRjMi4uMGJlOTE3MyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNnbXQuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2dtdC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTU2LDcgKzU2LDcgQEAKICNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgogCiAKLS8vIEF1eGlsaWFyeTogYXBwZW5kIGEgTGFiIGlkZW50aXR5IGFmdGVyIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBwcm9maWxlcworLy8gQXV4aWxpYXI6IGFwcGVuZCBhIExhYiBpZGVudGl0eSBhZnRlciB0aGUgZ2l2ZW4gc2VxdWVuY2Ugb2YgcHJvZmlsZXMKIC8vIGFuZCByZXR1cm4gdGhlIHRyYW5zZm9ybS4gTGFiIHByb2ZpbGUgaXMgY2xvc2VkLCByZXN0IG9mIHByb2ZpbGVzIGFyZSBrZXB0IG9wZW4uCiBjbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgIENvbnRleHRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIG5Qcm9maWxlcywKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIH0KIAogICAgIC8vIEJ1aWxkIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgZWZmZWN0aXZlbHkgbGltaXRzIHRoZSBtYXhpbXVtIGFjY3VyYWN5IHRvIDE2IGJpdHMsIGJ1dAotICAgIC8vIHNpbmNlIHRoaXMgaXMgdXNlZCBvbiBibGFjay1wcmVzZXJ2aW5nIExVVHMsIHdlIGFyZSBub3QgbG9zaW5nICBhY2N1cmFjeSBpbiBhbnkgY2FzZQorICAgIC8vIHNpbmNlIHRoaXMgaXMgdXNlZCBvbiBibGFjay1wcmVzZXJ2aW5nIExVVHMsIHdlIGFyZSBub3QgbG9vc2luZyAgYWNjdXJhY3kgaW4gYW55IGNhc2UKICAgICBLVG9uZSA9IGNtc0pvaW5Ub25lQ3VydmUoQ29udGV4dElELCBpbiwgb3V0LCBuUG9pbnRzKTsKIAogICAgIC8vIEdldCByaWQgb2YgY29tcG9uZW50cwpAQCAtMzA3LDcgKzMwNyw3IEBACiB9CiAKIC8vIERvZXMgY29tcHV0ZSBhIGdhbXV0IExVVCBnb2luZyBiYWNrIGFuZCBmb3J0aCBhY3Jvc3MgcGNzIC0+IHJlbGF0aXYuIGNvbG9yaW1ldHJpYyBpbnRlbnQgLT4gcGNzCi0vLyB0aGUgZEUgb2J0YWluZWQgaXMgdGhlbiBhbm5vdGF0ZWQgb24gdGhlIExVVC4gVmFsdWVzIHRydWx5IG91dCBvZiBnYW11dCBhcmUgY2xpcHBlZCB0byBkRSA9IDB4RkZGRQorLy8gdGhlIGRFIG9idGFpbmVkIGlzIHRoZW4gYW5ub3RhdGVkIG9uIHRoZSBMVVQuIFZhbHVlcyB0cnVlbHkgb3V0IG9mIGdhbXV0IGFyZSBjbGlwcGVkIHRvIGRFID0gMHhGRkZFCiAvLyBhbmQgdmFsdWVzIGNoYW5nZWQgYXJlIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgYnkgYW55IGdhbXV0IHJlbWFwcGluZywgc28sIGFyZSBvdXQgb2YgZ2FtdXQgYXMgd2VsbC4KIC8vCiAvLyAqKldBUk5JTkc6IFRoaXMgYWxnb3JpdGhtIGRvZXMgYXNzdW1lIHRoYXQgZ2FtdXQgcmVtYXBwaW5nIGFsZ29yaXRobXMgZG9lcyBOT1QgbW92ZSBpbi1nYW11dCBjb2xvcnMsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2hhbGYuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaGFsZi5jCmluZGV4IGRkY2FmNDguLjExZWZlM2EgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaGFsZi5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaGFsZi5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW50cnAuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW50cnAuYwppbmRleCBhYTk2Y2JiLi4yMDE3NWVmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2ludHJwLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbnRycC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTE4NSw3ICsxODUsNyBAQAogICAgIGludCBpOwogICAgIGNtc1VJbnQzMk51bWJlciBTYW1wbGVzW01BWF9JTlBVVF9ESU1FTlNJT05TXTsKIAotICAgIC8vIEZpbGwgdGhlIGF1eGlsaWFyeSBhcnJheQorICAgIC8vIEZpbGwgdGhlIGF1eGlsaWFyIGFycmF5CiAgICAgZm9yIChpPTA7IGkgPCBNQVhfSU5QVVRfRElNRU5TSU9OUzsgaSsrKQogICAgICAgICBTYW1wbGVzW2ldID0gblNhbXBsZXM7CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW8wLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMC5jCmluZGV4IGY4NmYyZTcuLjM4MTFlZjkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW8wLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbzAuYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICByZXR1cm4gblJlYWRlZDsKIH0KIAotLy8gUG9zaXRpb24gZmlsZSBwb2ludGVyIGluIHRoZSBmaWxlCisvLyBQb3N0aW9uIGZpbGUgcG9pbnRlciBpbiB0aGUgZmlsZQogc3RhdGljCiBjbXNCb29sICBGaWxlU2VlayhjbXNJT0hBTkRMRVIqIGlvaGFuZGxlciwgY21zVUludDMyTnVtYmVyIG9mZnNldCkKIHsKQEAgLTM5Nyw3ICszOTcsNiBAQAogewogICAgIGNtc0lPSEFORExFUiogaW9oYW5kbGVyID0gTlVMTDsKICAgICBGSUxFKiBmbSA9IE5VTEw7Ci0gICAgY21zSW50MzJOdW1iZXIgZmlsZUxlbjsKIAogICAgIF9jbXNBc3NlcnQoRmlsZU5hbWUgIT0gTlVMTCk7CiAgICAgX2Ntc0Fzc2VydChBY2Nlc3NNb2RlICE9IE5VTEwpOwpAQCAtNDE0LDE2ICs0MTMsNyBAQAogICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIkZpbGUgJyVzJyBub3QgZm91bmQiLCBGaWxlTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBmaWxlTGVuID0gY21zZmlsZWxlbmd0aChmbSk7Ci0gICAgICAgIGlmIChmaWxlTGVuIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgZmNsb3NlKGZtKTsKLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKLSAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIkNhbm5vdCBnZXQgc2l6ZSBvZiBmaWxlICclcyciLCBGaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSAoY21zVUludDMyTnVtYmVyKSBmaWxlTGVuOworICAgICAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gKGNtc1VJbnQzMk51bWJlcikgY21zZmlsZWxlbmd0aChmbSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAndyc6CkBAIC00NjMsMTQgKzQ1Myw2IEBACiBjbXNJT0hBTkRMRVIqIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbVN0cmVhbShjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogU3RyZWFtKQogewogICAgIGNtc0lPSEFORExFUiogaW9oYW5kbGVyID0gTlVMTDsKLSAgICBjbXNJbnQzMk51bWJlciBmaWxlU2l6ZTsKLQotICAgIGZpbGVTaXplID0gY21zZmlsZWxlbmd0aChTdHJlYW0pOwotICAgIGlmIChmaWxlU2l6ZSA8IDApCi0gICAgewotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJDYW5ub3QgZ2V0IHNpemUgb2Ygc3RyZWFtIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIGlvaGFuZGxlciA9IChjbXNJT0hBTkRMRVIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNJT0hBTkRMRVIpKTsKICAgICBpZiAoaW9oYW5kbGVyID09IE5VTEwpIHJldHVybiBOVUxMOwpAQCAtNDc4LDcgKzQ2MCw3IEBACiAgICAgaW9oYW5kbGVyIC0+IENvbnRleHRJRCA9IENvbnRleHRJRDsKICAgICBpb2hhbmRsZXIgLT4gc3RyZWFtID0gKHZvaWQqKSBTdHJlYW07CiAgICAgaW9oYW5kbGVyIC0+IFVzZWRTcGFjZSA9IDA7Ci0gICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGZpbGVTaXplOworICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSAoY21zVUludDMyTnVtYmVyKSBjbXNmaWxlbGVuZ3RoKFN0cmVhbSk7CiAgICAgaW9oYW5kbGVyIC0+IFBoeXNpY2FsRmlsZVswXSA9IDA7CiAKICAgICBpb2hhbmRsZXIgLT5SZWFkICAgID0gRmlsZVJlYWQ7CkBAIC02NzAsNyArNjUyLDcgQEAKIH0KIAogCi0vLyBDaGVjayBleGlzdGVuY2UKKy8vIENoZWNrIGV4aXN0YW5jZQogY21zQm9vbCBDTVNFWFBPUlQgY21zSXNUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCiB7CiAgICAgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSAodm9pZCopIGhQcm9maWxlOwpAQCAtNzI2LDcgKzcwOCw3IEBACiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICAvLyBBZGp1c3QgZW5kaWFubmVzcyBvZiB0aGUgdXNlZCBwYXJhbWV0ZXJzCisgICAgLy8gQWRqdXN0IGVuZGlhbmVzcyBvZiB0aGUgdXNlZCBwYXJhbWV0ZXJzCiAgICAgSWNjIC0+IERldmljZUNsYXNzICAgICA9IChjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIuZGV2aWNlQ2xhc3MpOwogICAgIEljYyAtPiBDb2xvclNwYWNlICAgICAgPSAoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSkgICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLmNvbG9yU3BhY2UpOwogICAgIEljYyAtPiBQQ1MgICAgICAgICAgICAgPSAoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSkgICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLnBjcyk7CkBAIC04NDQsNyArODI2LDcgQEAKIAogICAgIG1lbXNldCgmSGVhZGVyLnJlc2VydmVkLCAwLCBzaXplb2YoSGVhZGVyLnJlc2VydmVkKSk7CiAKLSAgICAvLyBTZXQgcHJvZmlsZSBJRC4gRW5kaWFubmVzcyBpcyBhbHdheXMgYmlnIGVuZGlhbgorICAgIC8vIFNldCBwcm9maWxlIElELiBFbmRpYW5lc3MgaXMgYWx3YXlzIGJpZyBlbmRpYW4KICAgICBtZW1tb3ZlKCZIZWFkZXIucHJvZmlsZUlELCAmSWNjIC0+UHJvZmlsZUlELCAxNik7CiAKICAgICAvLyBEdW1wIHRoZSBoZWFkZXIKQEAgLTg1NCw3ICs4MzYsNyBAQAogCiAgICAgLy8gR2V0IHRydWUgY291bnQKICAgICBmb3IgKGk9MDsgIGkgPCBJY2MgLT4gVGFnQ291bnQ7IGkrKykgewotICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gIT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkKKyAgICAgICAgaWYgKEljYyAtPlRhZ05hbWVzW2ldICE9IDApCiAgICAgICAgICAgICBDb3VudCsrOwogICAgIH0KIApAQCAtODYzLDcgKzg0NSw3IEBACiAKICAgICBmb3IgKGk9MDsgaSA8IEljYyAtPiBUYWdDb3VudDsgaSsrKSB7CiAKLSAgICAgICAgaWYgKEljYyAtPlRhZ05hbWVzW2ldID09IChjbXNUYWdTaWduYXR1cmUpIDApIGNvbnRpbnVlOyAgIC8vIEl0IGlzIGp1c3QgYSBwbGFjZWhvbGRlcgorICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gPT0gMCkgY29udGludWU7ICAgLy8gSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyCiAKICAgICAgICAgVGFnLnNpZyAgICA9IChjbXNUYWdTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMigoY21zSW50MzJOdW1iZXIpIEljYyAtPiBUYWdOYW1lc1tpXSk7CiAgICAgICAgIFRhZy5vZmZzZXQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc0ludDMyTnVtYmVyKSBJY2MgLT4gVGFnT2Zmc2V0c1tpXSk7CkBAIC0xMjEzLDcgKzExOTUsNyBAQAogCiAgICAgZm9yIChpPTA7IGkgPCBJY2MgLT4gVGFnQ291bnQ7IGkrKykgewogCi0gICAgICAgIGlmIChJY2MgLT5UYWdOYW1lc1tpXSA9PSAoY21zVGFnU2lnbmF0dXJlKSAwKSBjb250aW51ZTsKKyAgICAgICAgaWYgKEljYyAtPlRhZ05hbWVzW2ldID09IDApIGNvbnRpbnVlOwogCiAgICAgICAgIC8vIExpbmtlZCB0YWdzIGFyZSBub3Qgd3JpdHRlbgogICAgICAgICBpZiAoSWNjIC0+VGFnTGlua2VkW2ldICE9IChjbXNUYWdTaWduYXR1cmUpIDApIGNvbnRpbnVlOwpAQCAtMTM0NywxNSArMTMyOSwxMSBAQAogCiAgICAgX2Ntc0Fzc2VydChoUHJvZmlsZSAhPSBOVUxMKTsKIAotICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjLT5Vc3JNdXRleCkpIHJldHVybiAwOwogICAgIG1lbW1vdmUoJktlZXAsIEljYywgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CiAKICAgICBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKICAgICBQcmV2SU8gPSBJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoQ29udGV4dElEKTsKLSAgICBpZiAoUHJldklPID09IE5VTEwpIHsKLSAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MtPlVzck11dGV4KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIGlmIChQcmV2SU8gPT0gTlVMTCkgcmV0dXJuIDA7CiAKICAgICAvLyBQYXNzICMxIGRvZXMgY29tcHV0ZSBvZmZzZXRzCiAKQEAgLTEzNzUsMTAgKzEzNTMsNyBAQAogICAgIH0KIAogICAgIG1lbW1vdmUoSWNjLCAmS2VlcCwgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7Ci0gICAgaWYgKCFjbXNDbG9zZUlPaGFuZGxlcihQcmV2SU8pKQotICAgICAgICBVc2VkU3BhY2UgPSAwOyAvLyBBcyBhIGVycm9yIG1hcmtlcgotCi0gICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MtPlVzck11dGV4KTsKKyAgICBpZiAoIWNtc0Nsb3NlSU9oYW5kbGVyKFByZXZJTykpIHJldHVybiAwOwogCiAgICAgcmV0dXJuIFVzZWRTcGFjZTsKIApAQCAtMTM4Niw4ICsxMzYxLDYgQEAKIEVycm9yOgogICAgIGNtc0Nsb3NlSU9oYW5kbGVyKFByZXZJTyk7CiAgICAgbWVtbW92ZShJY2MsICZLZWVwLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKLSAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYy0+VXNyTXV0ZXgpOwotCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE1OTgsNyArMTU3MSw3IEBACiAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKICAgICBJY2MgLT4gVGFnUHRyc1tuXSA9IExvY2FsVHlwZUhhbmRsZXIuUmVhZFB0cigmTG9jYWxUeXBlSGFuZGxlciwgaW8sICZFbGVtQ291bnQsIFRhZ1NpemUpOwogCi0gICAgLy8gVGhlIHRhZyB0eXBlIGlzIHN1cHBvcnRlZCwgYnV0IHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCBhbmQgd2UgY2Fubm90IHJlYWQgdGhlIHRhZy4KKyAgICAvLyBUaGUgdGFnIHR5cGUgaXMgc3VwcG9ydGVkLCBidXQgc29tZXRoaW5nIHdyb25nIGhhcHBlbmQgYW5kIHdlIGNhbm5vdCByZWFkIHRoZSB0YWcuCiAgICAgLy8gbGV0IGtub3cgdGhlIHVzZXIgYWJvdXQgdGhpcyAoYWx0aG91Z2ggaXQgaXMganVzdCBhIHdhcm5pbmcpCiAgICAgaWYgKEljYyAtPiBUYWdQdHJzW25dID09IE5VTEwpIHsKIApAQCAtMTkxNyw3ICsxODkwLDcgQEAKICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKIAogICAgIGlmIChJY2MtPlRhZ1B0cnNbaV0gPT0gTlVMTCkgewotICAgICAgICAgICBJY2MtPlRhZ05hbWVzW2ldID0gKGNtc1RhZ1NpZ25hdHVyZSkgMDsKKyAgICAgICAgICAgSWNjLT5UYWdOYW1lc1tpXSA9IDA7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMS5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNpbzEuYwppbmRleCBjNDc4YjJlLi40YzI1OWY4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2lvMS5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zaW8xLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTU3LDcgKzE1Nyw3IEBACiB9CiAKIAotLy8gQXV4aWxpYXJ5LCByZWFkIGNvbG9yYW50cyBhcyBhIE1BVDMgc3RydWN0dXJlLiBVc2VkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIGEgbWF0cml4LXNoYXBlcgorLy8gQXV4aWxpYXIsIHJlYWQgY29sb3JhbnRzIGFzIGEgTUFUMyBzdHJ1Y3R1cmUuIFVzZWQgYnkgYW55IGZ1bmN0aW9uIHRoYXQgbmVlZHMgYSBtYXRyaXgtc2hhcGVyCiBzdGF0aWMKIGNtc0Jvb2wgUmVhZElDQ01hdHJpeFJHQjJYWVooY21zTUFUMyogciwgY21zSFBST0ZJTEUgaFByb2ZpbGUpCiB7CkBAIC0zNDMsNyArMzQzLDcgQEAKICAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQ7CiAgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKIAotICAgIC8vIE9uIG5hbWVkIGNvbG9yLCB0YWtlIHRoZSBhcHByb3ByaWF0ZSB0YWcKKyAgICAvLyBPbiBuYW1lZCBjb2xvciwgdGFrZSB0aGUgYXBwcm9waWF0ZSB0YWcKICAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgewogCiAgICAgICAgIGNtc1BpcGVsaW5lKiBMdXQ7CkBAIC0zNjUsOSArMzY1LDkgQEAKICAgICAgICAgcmV0dXJuIEx1dDsKICAgICB9CiAKLSAgICAvLyBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gcmV1c2UgdGhpcyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgbWF0cml4LXNoYXBlciBhcyBwaXBlbGluZSBubworICAgIC8vIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byByZXVzZSB0aGlzIGZ1bnRpb24gdG8gcmV0cmlldmUgdGhlIG1hdHJpeC1zaGFwZXIgYXMgcGlwZWxpbmUgbm8KICAgICAvLyBtYXR0ZXIgb3RoZXIgTFVUIGFyZSBwcmVzZW50IGFuZCBoYXZlIHByZWNlZGVuY2UuIEludGVudCA9IC0xIG1lYW5zIGp1c3QgdGhpcy4KLSAgICBpZiAoSW50ZW50ID49IElOVEVOVF9QRVJDRVBUVUFMICYmIEludGVudCA8PSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDKSB7CisgICAgaWYgKEludGVudCAhPSAtMSkgewogCiAgICAgICAgIHRhZzE2ID0gRGV2aWNlMlBDUzE2W0ludGVudF07CiAgICAgICAgIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0W0ludGVudF07CkBAIC00MjMsNyArNDIzLDcgQEAKICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZ3JheXNjYWxlIHByb2ZpbGUuCiAgICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpID09IGNtc1NpZ0dyYXlEYXRhKSB7CiAKLSAgICAgICAgLy8gaWYgc28sIGJ1aWxkIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gdGFibGVzLgorICAgICAgICAvLyBpZiBzbywgYnVpbGQgYXBwcm9waWF0ZSBjb252ZXJzaW9uIHRhYmxlcy4KICAgICAgICAgLy8gVGhlIHRhYmxlcyBhcmUgdGhlIFBDUyBpbHVtaW5hbnQsIHNjYWxlZCBhY3Jvc3MgR3JheVRSQwogICAgICAgICByZXR1cm4gQnVpbGRHcmF5SW5wdXRNYXRyaXhQaXBlbGluZShoUHJvZmlsZSk7CiAgICAgfQpAQCAtNTc4LDcgKzU3OCw3IEBACiAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKIAogICAgIC8vIElmIFBDUyBpcyBMYWIgb3IgWFlaLCB0aGUgZmxvYXRpbmcgcG9pbnQgdGFnIGlzIGFjY2VwdGluZyBkYXRhIGluIHRoZSBzcGFjZSBlbmNvZGluZywKLSAgICAvLyBhbmQgc2luY2UgdGhlIGZvcm1hdHRlciBoYXMgYWxyZWFkeSBhY2NvbW1vZGF0ZWQgdG8gMC4uMS4wLCB3ZSBzaG91bGQgdW5kbyB0aGlzIGNoYW5nZQorICAgIC8vIGFuZCBzaW5jZSB0aGUgZm9ybWF0dGVyIGhhcyBhbHJlYWR5IGFjY29tb2RhdGVkIHRvIDAuLjEuMCwgd2Ugc2hvdWxkIHVuZG8gdGhpcyBjaGFuZ2UKICAgICBpZiAoIFBDUyA9PSBjbXNTaWdMYWJEYXRhKQogICAgIHsKICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZU5vcm1hbGl6ZVRvTGFiRmxvYXQoQ29udGV4dElEKSkpCkBAIC02MTksNyArNjE5LDcgQEAKICAgICBjbXNDb250ZXh0IENvbnRleHRJRCAgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKIAogCi0gICAgaWYgKEludGVudCA+PSBJTlRFTlRfUEVSQ0VQVFVBTCAmJiBJbnRlbnQgPD0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykgeworICAgIGlmIChJbnRlbnQgIT0gLTEpIHsKIAogICAgICAgICB0YWcxNiA9IFBDUzJEZXZpY2UxNltJbnRlbnRdOwogICAgICAgICB0YWdGbG9hdCA9IFBDUzJEZXZpY2VGbG9hdFtJbnRlbnRdOwpAQCAtNjgwLDcgKzY4MCw3IEBACiAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdyYXlzY2FsZSBwcm9maWxlLgogICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdHcmF5RGF0YSkgewogCi0gICAgICAgIC8vIGlmIHNvLCBidWlsZCBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlcy4KKyAgICAgICAgLy8gaWYgc28sIGJ1aWxkIGFwcHJvcGlhdGUgY29udmVyc2lvbiB0YWJsZXMuCiAgICAgICAgIC8vIFRoZSB0YWJsZXMgYXJlIHRoZSBQQ1MgaWx1bWluYW50LCBzY2FsZWQgYWNyb3NzIEdyYXlUUkMKICAgICAgICAgcmV0dXJuIEJ1aWxkR3JheU91dHB1dFBpcGVsaW5lKGhQcm9maWxlKTsKICAgICB9CkBAIC03MzgsMjEgKzczOCwxNSBAQAogewogICAgIGNtc1BpcGVsaW5lKiBMdXQ7CiAgICAgY21zVGFnVHlwZVNpZ25hdHVyZSBPcmlnaW5hbFR5cGU7Ci0gICAgY21zVGFnU2lnbmF0dXJlIHRhZzE2OwotICAgIGNtc1RhZ1NpZ25hdHVyZSB0YWdGbG9hdDsKKyAgICBjbXNUYWdTaWduYXR1cmUgdGFnMTYgICAgPSBEZXZpY2UyUENTMTZbSW50ZW50XTsKKyAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQgPSBEZXZpY2UyUENTRmxvYXRbSW50ZW50XTsKICAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwogCiAKLSAgICBpZiAoSW50ZW50IDwgSU5URU5UX1BFUkNFUFRVQUwgfHwgSW50ZW50ID4gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB0YWcxNiA9IERldmljZTJQQ1MxNltJbnRlbnRdOwotICAgIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0W0ludGVudF07Ci0KLSAgICAvLyBPbiBuYW1lZCBjb2xvciwgdGFrZSB0aGUgYXBwcm9wcmlhdGUgdGFnCisgICAgLy8gT24gbmFtZWQgY29sb3IsIHRha2UgdGhlIGFwcHJvcGlhdGUgdGFnCiAgICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpIHsKIAotICAgICAgICBjbXNOQU1FRENPTE9STElTVCogbmMgPSAoY21zTkFNRURDT0xPUkxJU1QqKWNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ05hbWVkQ29sb3IyVGFnKTsKKyAgICAgICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnTmFtZWRDb2xvcjJUYWcpOwogCiAgICAgICAgIGlmIChuYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKIApAQCAtNzY4LDEzICs3NjIsMTIgQEAKICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogCiAgICAgICAgIHJldHVybiBMdXQ7Ci0gICAgRXJyb3I6CitFcnJvcjoKICAgICAgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CiAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChuYyk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotCiAgICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWdGbG9hdCkpIHsgIC8vIEZsb2F0IHRhZyB0YWtlcyBwcmVjZWRlbmNlCiAKICAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgTFVUIGFyZSBhbHdheXMgVgpAQCAtNzg0LDE5ICs3NzcsMTkgQEAKICAgICB0YWdGbG9hdCA9IERldmljZTJQQ1NGbG9hdFswXTsKICAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSkgewogCi0gICAgICAgIHJldHVybiBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKWNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSk7CisgICAgICAgIHJldHVybiBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWdGbG9hdCkpOwogICAgIH0KIAogICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgeyAgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KIAotICAgICAgICB0YWcxNiA9IERldmljZTJQQ1MxNlswXTsKKyAgICAgICAgdGFnMTYgICAgPSBEZXZpY2UyUENTMTZbMF07CiAgICAgICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKIAogICAgIC8vIFJlYWQgdGhlIHRhZwotICAgIEx1dCA9IChjbXNQaXBlbGluZSopY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnMTYpOworICAgIEx1dCA9IChjbXNQaXBlbGluZSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZzE2KTsKICAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOwogCiAgICAgLy8gVGhlIHByb2ZpbGUgb3ducyB0aGUgTHV0LCBzbyB3ZSBuZWVkIHRvIGNvcHkgaXQKQEAgLTgwOSw3ICs4MDIsNyBAQAogICAgICAgICBDaGFuZ2VJbnRlcnBvbGF0aW9uVG9UcmlsaW5lYXIoTHV0KTsKIAogICAgIC8vIEFmdGVyIHJlYWRpbmcgaXQsIHdlIGhhdmUgaW5mbyBhYm91dCB0aGUgb3JpZ2luYWwgdHlwZQotICAgIE9yaWdpbmFsVHlwZSA9IF9jbXNHZXRUYWdUcnVlVHlwZShoUHJvZmlsZSwgdGFnMTYpOworICAgIE9yaWdpbmFsVHlwZSA9ICBfY21zR2V0VGFnVHJ1ZVR5cGUoaFByb2ZpbGUsIHRhZzE2KTsKIAogICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IGRhdGEgZm9yIExhYjE2IG9uIG91dHB1dAogICAgIGlmIChPcmlnaW5hbFR5cGUgIT0gY21zU2lnTHV0MTZUeXBlKSByZXR1cm4gTHV0OwpAQCAtODE3LDEyICs4MTAsMTIgQEAKICAgICAvLyBIZXJlIGl0IGlzIHBvc3NpYmxlIHRvIGdldCBMYWIgb24gYm90aCBzaWRlcwogCiAgICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTGFiVjRUb1YyKENvbnRleHRJRCkpKQorICAgICAgICBpZighY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihDb250ZXh0SUQpKSkKICAgICAgICAgICAgIGdvdG8gRXJyb3IyOwogICAgIH0KIAogICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNChDb250ZXh0SUQpKSkKKyAgICAgICAgaWYoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KENvbnRleHRJRCkpKQogICAgICAgICAgICAgZ290byBFcnJvcjI7CiAgICAgfQogCkBAIC05NTcsNyArOTUwLDcgQEAKIH0KIAogCi0vLyBBdXhpbGlhcnksIHJlYWQgYW5kIGR1cGxpY2F0ZSBhIE1MVSBpZiBmb3VuZC4KKy8vIEF1eGlsaWFyLCByZWFkIGFuZCBkdXBsaWNhdGUgYSBNTFUgaWYgZm91bmQuCiBzdGF0aWMKIGNtc01MVSogR2V0TUxVRnJvbVByb2ZpbGUoY21zSFBST0ZJTEUgaCwgY21zVGFnU2lnbmF0dXJlIHNpZykKIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbHV0LmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc2x1dC5jCmluZGV4IDZjNGI4Y2UuLjRjMDRlZTkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbHV0LmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNsdXQuYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC01MzQsNyArNTM0LDcgQEAKICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTmV3RWxlbSAtPlRhYi5UID0gKGNtc1VJbnQxNk51bWJlciopIF9jbXNEdXBNZW0obXBlIC0+Q29udGV4dElELCBEYXRhIC0+VGFiLlQsIERhdGEgLT5uRW50cmllcyAqIHNpemVvZiAoY21zVUludDE2TnVtYmVyKSk7Ci0gICAgICAgICAgICBpZiAoTmV3RWxlbSAtPlRhYi5UID09IE5VTEwpCisgICAgICAgICAgICBpZiAoTmV3RWxlbSAtPlRhYi5URmxvYXQgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogICAgICAgICB9CiAgICAgfQpAQCAtMTQ4Miw4ICsxNDgyLDcgQEAKICAgICAgICAgICAgICAgICAgRmlyc3QgPSBGQUxTRTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFudGVyaW9yICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+TmV4dCA9IE5ld01QRTsKKyAgICAgICAgICAgICAgICBBbnRlcmlvciAtPk5leHQgPSBOZXdNUEU7CiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBbnRlcmlvciA9IE5ld01QRTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbWQ1LmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc21kNS5jCmluZGV4IDYxOWM5NGUuLmMyMzhlNDEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbWQ1LmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNtZDUuYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc210cnguYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbXRyeC5jCmluZGV4IDJiYzZhNDkuLmVkOTM2NmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbXRyeC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbXRyeC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTY3LDcgKzY3LDcgQEAKICAgICByIC0+IG5bVlpdID0gejsKIH0KIAotLy8gVmVjdG9yIHN1YnRyYWN0aW9uCisvLyBWZWN0b3Igc3Vic3RyYWN0aW9uCiB2b2lkIENNU0VYUE9SVCBfY21zVkVDM21pbnVzKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc1ZFQzMqIGEsIGNvbnN0IGNtc1ZFQzMqIGIpCiB7CiAgIHIgLT4gbltWWF0gPSBhIC0+IG5bVlhdIC0gYiAtPiBuW1ZYXTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbmFtZWQuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zbmFtZWQuYwppbmRleCA4NzA5MzZmLi5mZDRlNTY1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc25hbWVkLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNuYW1lZC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTEyMSw3ICsxMjEsNyBAQAogc3RhdGljCiBjbXNCb29sIEdyb3dNTFV0YWJsZShjbXNNTFUqIG1sdSkKIHsKLSAgICBjbXNVSW50MzJOdW1iZXIgQWxsb2NhdGVkRW50cmllczsKKyAgICBpbnQgQWxsb2NhdGVkRW50cmllczsKICAgICBfY21zTUxVZW50cnkgKk5ld1B0cjsKIAogICAgIC8vIFNhbml0eSBjaGVjawpAQCAtMTQ3LDcgKzE0Nyw3IEBACiBzdGF0aWMKIGludCBTZWFyY2hNTFVFbnRyeShjbXNNTFUqIG1sdSwgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlKQogewotICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGludCBpOwogCiAgICAgLy8gU2FuaXR5IGNoZWNrCiAgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gLTE7CkBAIC0yMDcsNDIgKzIwNywxNSBAQAogICAgIHJldHVybiBUUlVFOwogfQogCi0vLyBDb252ZXJ0IGZyb20gYSAzLWNoYXIgY29kZSB0byBhIGNtc1VJbnQxNk51bWJlci4gSXQgaXMgZG9uZSBpbnRoaXMgd2F5IGJlY2F1c2Ugc29tZQotLy8gY29tcGlsZXJzIGRvbid0IHByb3Blcmx5IGFsaWduIGJlZ2lubmluZyBvZiBzdHJpbmdzCiAKLXN0YXRpYwotY21zVUludDE2TnVtYmVyIHN0clRvMTYoY29uc3QgY2hhciBzdHJbM10pCi17Ci0gICAgY21zVUludDE2TnVtYmVyIG4gPSAoKGNtc1VJbnQxNk51bWJlcikgc3RyWzBdIDw8IDgpIHwgc3RyWzFdOwotCi0gICAgcmV0dXJuIG47ICAvLyBBbHdheXMgYmlnIGVuZGlhbiBpbiB0aGlzIGNhc2UKLX0KLQotc3RhdGljCi12b2lkIHN0ckZyb20xNihjaGFyIHN0clszXSwgY21zVUludDE2TnVtYmVyIG4pCi17Ci0gICAgLy8gQXNzaW1pbmcgdGhpcyB3b3VsZCBiZSBhbGlnbmVkCi0gICAgdW5pb24gewotCi0gICAgICAgY21zVUludDE2TnVtYmVyIG47Ci0gICAgICAgY2hhciBzdHJbMl07Ci0KLSAgICB9IGM7Ci0KLSAgICBjLm4gPSBuOyAgLy8gQWx3YXlzIGJpZyBlbmRpYW4gaW4gdGhpcyBjYXNlCi0KLSAgICBzdHJbMF0gPSBjLnN0clswXTsgc3RyWzFdID0gYy5zdHJbMV07IHN0clsyXSA9IDA7Ci0KLX0KLQotLy8gQWRkIGFuIEFTQ0lJIGVudHJ5LiBEbyBub3QgYWRkIGFueSBcMCB0ZXJtaW5hdGlvbiAoSUNDMXY0M18yMDEwLTEyLnBkZiBwYWdlIDYxKQorLy8gQWRkIGFuIEFTQ0lJIGVudHJ5LgogY21zQm9vbCBDTVNFWFBPUlQgY21zTUxVc2V0QVNDSUkoY21zTUxVKiBtbHUsIGNvbnN0IGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLCBjb25zdCBjaGFyIENvdW50cnlDb2RlWzNdLCBjb25zdCBjaGFyKiBBU0NJSVN0cmluZykKIHsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgbGVuID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKEFTQ0lJU3RyaW5nKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbGVuID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKEFTQ0lJU3RyaW5nKSsxOwogICAgIHdjaGFyX3QqIFdTdHI7CiAgICAgY21zQm9vbCAgcmM7Ci0gICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gc3RyVG8xNihMYW5ndWFnZUNvZGUpOwotICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IHN0clRvMTYoQ291bnRyeUNvZGUpOworICAgIGNtc1VJbnQxNk51bWJlciBMYW5nICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIExhbmd1YWdlQ29kZSk7CisgICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgQ291bnRyeUNvZGUpOwogCiAgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKQEAgLTI3MiwxNyArMjQ1LDE4IEBACiAgICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpKHAgLSBzKTsKIH0KIAotLy8gQWRkIGEgd2lkZSBlbnRyeS4gRG8gbm90IGFkZCBhbnkgXDAgdGVybWluYXRvciAoSUNDMXY0M18yMDEwLTEyLnBkZiBwYWdlIDYxKQorCisvLyBBZGQgYSB3aWRlIGVudHJ5CiBjbXNCb29sICBDTVNFWFBPUlQgY21zTUxVc2V0V2lkZShjbXNNTFUqIG1sdSwgY29uc3QgY2hhciBMYW5ndWFnZVszXSwgY29uc3QgY2hhciBDb3VudHJ5WzNdLCBjb25zdCB3Y2hhcl90KiBXaWRlU3RyaW5nKQogewotICAgIGNtc1VJbnQxNk51bWJlciBMYW5nICA9IHN0clRvMTYoTGFuZ3VhZ2UpOwotICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IHN0clRvMTYoQ291bnRyeSk7CisgICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgTGFuZ3VhZ2UpOworICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIENvdW50cnkpOwogICAgIGNtc1VJbnQzMk51bWJlciBsZW47CiAKICAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBGQUxTRTsKICAgICBpZiAoV2lkZVN0cmluZyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKLSAgICBsZW4gPSAoY21zVUludDMyTnVtYmVyKSAobXl3Y3NsZW4oV2lkZVN0cmluZykpICogc2l6ZW9mKHdjaGFyX3QpOworICAgIGxlbiA9IChjbXNVSW50MzJOdW1iZXIpIChteXdjc2xlbihXaWRlU3RyaW5nKSArIDEpICogc2l6ZW9mKHdjaGFyX3QpOwogICAgIHJldHVybiBBZGRNTFVCbG9jayhtbHUsIGxlbiwgV2lkZVN0cmluZywgTGFuZywgQ250cnkpOwogfQogCkBAIC0zNTMsOCArMzI3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciBMYW5ndWFnZUNvZGUsIGNtc1VJbnQxNk51bWJlciBDb3VudHJ5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogVXNlZExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyKiBVc2VkQ291bnRyeUNvZGUpCiB7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zSW50MzJOdW1iZXIgQmVzdCA9IC0xOworICAgIGludCBpOworICAgIGludCBCZXN0ID0gLTE7CiAgICAgX2Ntc01MVWVudHJ5KiB2OwogCiAgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKQEAgLTQwNSw4ICszNzksOCBAQAogICAgIGNtc1VJbnQzMk51bWJlciAgU3RyTGVuID0gMDsKICAgICBjbXNVSW50MzJOdW1iZXIgQVNDSUlsZW4sIGk7CiAKLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBzdHJUbzE2KExhbmd1YWdlQ29kZSk7Ci0gICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gc3RyVG8xNihDb3VudHJ5Q29kZSk7CisgICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgTGFuZ3VhZ2VDb2RlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBDb3VudHJ5Q29kZSk7CiAKICAgICAvLyBTYW5pdGl6ZQogICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIDA7CkBAIC00NDksOCArNDIzLDggQEAKICAgICBjb25zdCB3Y2hhcl90ICpXaWRlOwogICAgIGNtc1VJbnQzMk51bWJlciAgU3RyTGVuID0gMDsKIAotICAgIGNtc1VJbnQxNk51bWJlciBMYW5nICA9IHN0clRvMTYoTGFuZ3VhZ2VDb2RlKTsKLSAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBzdHJUbzE2KENvdW50cnlDb2RlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBMYW5ndWFnZUNvZGUpOworICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIENvdW50cnlDb2RlKTsKIAogICAgIC8vIFNhbml0aXplCiAgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gMDsKQEAgLTQ4Miw4ICs0NTYsOCBAQAogewogICAgIGNvbnN0IHdjaGFyX3QgKldpZGU7CiAKLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBzdHJUbzE2KExhbmd1YWdlQ29kZSk7Ci0gICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gc3RyVG8xNihDb3VudHJ5Q29kZSk7CisgICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgTGFuZ3VhZ2VDb2RlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBDb3VudHJ5Q29kZSk7CiAgICAgY21zVUludDE2TnVtYmVyIE9idExhbmcsIE9idENvZGU7CiAKICAgICAvLyBTYW5pdGl6ZQpAQCAtNDkzLDkgKzQ2NywxMCBAQAogICAgIGlmIChXaWRlID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAogICAgIC8vIEdldCB1c2VkIGxhbmd1YWdlIGFuZCBjb2RlCi0gICAgc3RyRnJvbTE2KE9idGFpbmVkTGFuZ3VhZ2UsIE9idExhbmcpOwotICAgIHN0ckZyb20xNihPYnRhaW5lZENvdW50cnksIE9idENvZGUpOworICAgICooY21zVUludDE2TnVtYmVyICopT2J0YWluZWRMYW5ndWFnZSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihPYnRMYW5nKTsKKyAgICAqKGNtc1VJbnQxNk51bWJlciAqKU9idGFpbmVkQ291bnRyeSAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoT2J0Q29kZSk7CiAKKyAgICBPYnRhaW5lZExhbmd1YWdlWzJdID0gT2J0YWluZWRDb3VudHJ5WzJdID0gMDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNTE4LDEyICs0OTMsMTIgQEAKIAogICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKGlkeCA+PSBtbHUtPlVzZWRFbnRyaWVzKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGlkeCA+PSAoY21zVUludDMyTnVtYmVyKSBtbHUtPlVzZWRFbnRyaWVzKSByZXR1cm4gRkFMU0U7CiAKICAgICBlbnRyeSA9ICZtbHUtPkVudHJpZXNbaWR4XTsKIAotICAgIHN0ckZyb20xNihMYW5ndWFnZUNvZGUsIGVudHJ5LT5MYW5ndWFnZSk7Ci0gICAgc3RyRnJvbTE2KENvdW50cnlDb2RlLCBlbnRyeS0+Q291bnRyeSk7CisgICAgKihjbXNVSW50MTZOdW1iZXIgKilMYW5ndWFnZUNvZGUgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoZW50cnktPkxhbmd1YWdlKTsKKyAgICAqKGNtc1VJbnQxNk51bWJlciAqKUNvdW50cnlDb2RlICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihlbnRyeS0+Q291bnRyeSk7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zb3B0LmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc29wdC5jCmluZGV4IGQ0MDk5M2IuLjAzODNiNjYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zb3B0LmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNvcHQuYwpAQCAtMjcsMTAgKzI3LDExIEBACiAvLyBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCiAvLyBmaWxlOgogLy8KKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0yNTcsMTAgKzI1OCwxMSBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIG5vdCBnZXQgcmlkIG9mIGZ1bGwgbWF0cml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU3RhZ2UqIE11bHRtYXQgPSBjbXNTdGFnZUFsbG9jTWF0cml4KEx1dC0+Q29udGV4dElELCAzLCAzLCAoY29uc3QgY21zRmxvYXQ2NE51bWJlciopICZyZXMsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNdWx0bWF0ID09IE5VTEwpIHJldHVybiBGQUxTRTsgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY292ZXIgdGhlIGNoYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE11bHRtYXQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRtYXQtPk5leHQgPSBjaGFpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0MSA9IE11bHRtYXQ7CiAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTU1OCw3ICs1NjAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vIEF1eGlsaWFyeSwgdG8gc2VlIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsIG9yIHZlcnkgZGlmZmVyZW50CisvLyBBdXhpbGlhciwgdG8gc2VlIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsIG9yIHZlcnkgZGlmZmVyZW50CiBzdGF0aWMKIGNtc0Jvb2wgV2hpdGVzQXJlRXF1YWwoaW50IG4sIGNtc1VJbnQxNk51bWJlciBXaGl0ZTFbXSwgY21zVUludDE2TnVtYmVyIFdoaXRlMltdICkKIHsKQEAgLTU2Niw3ICs1NjgsNyBAQAogCiAgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKIAotICAgICAgICBpZiAoYWJzKFdoaXRlMVtpXSAtIFdoaXRlMltpXSkgPiAweGYwMDApIHJldHVybiBUUlVFOyAgLy8gVmFsdWVzIGFyZSBzbyBleHRyZW1lbHkgZGlmZmVyZW50IHRoYXQgdGhlIGZpeHVwIHNob3VsZCBiZSBhdm9pZGVkCisgICAgICAgIGlmIChhYnMoV2hpdGUxW2ldIC0gV2hpdGUyW2ldKSA+IDB4ZjAwMCkgcmV0dXJuIFRSVUU7ICAvLyBWYWx1ZXMgYXJlIHNvIGV4dHJlbWx5IGRpZmZlcmVudCB0aGF0IHRoZSBmaXh1cCBzaG91bGQgYmUgYXZvaWRlZAogICAgICAgICBpZiAoV2hpdGUxW2ldICE9IFdoaXRlMltpXSkgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTcwNCw3ICs3MDYsNyBAQAogICAgICAgICBjbXNTdGFnZSogUHJlTGluID0gY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoU3JjKTsKIAogICAgICAgICAvLyBDaGVjayBpZiBzdWl0YWJsZQotICAgICAgICBpZiAoUHJlTGluICYmIFByZUxpbiAtPlR5cGUgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgeworICAgICAgICBpZiAoUHJlTGluIC0+VHlwZSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CiAKICAgICAgICAgICAgIC8vIE1heWJlIHRoaXMgaXMgYSBsaW5lYXIgdHJhbSwgc28gd2UgY2FuIGF2b2lkIHRoZSB3aG9sZSBzdHVmZgogICAgICAgICAgICAgaWYgKCFBbGxDdXJ2ZXNBcmVMaW5lYXIoUHJlTGluKSkgewpAQCAtNzM3LDcgKzczOSw3IEBACiAgICAgICAgIGNtc1N0YWdlKiBQb3N0TGluID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShTcmMpOwogCiAgICAgICAgIC8vIENoZWNrIGlmIHN1aXRhYmxlCi0gICAgICAgIGlmIChQb3N0TGluICYmIGNtc1N0YWdlVHlwZShQb3N0TGluKSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CisgICAgICAgIGlmIChjbXNTdGFnZVR5cGUoUG9zdExpbikgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgewogCiAgICAgICAgICAgICAvLyBNYXliZSB0aGlzIGlzIGEgbGluZWFyIHRyYW0sIHNvIHdlIGNhbiBhdm9pZCB0aGUgd2hvbGUgc3R1ZmYKICAgICAgICAgICAgIGlmICghQWxsQ3VydmVzQXJlTGluZWFyKFBvc3RMaW4pKSB7CkBAIC0xMDM5LDggKzEwNDEsOCBAQAogICAgIH0KIAogICAgIGlmIChaZXJvcyA9PSAxICYmIFBvbGVzID09IDEpIHJldHVybiBGQUxTRTsgIC8vIEZvciBsaW5lYXIgdGFibGVzCi0gICAgaWYgKFplcm9zID4gKG5FbnRyaWVzIC8gMjApKSByZXR1cm4gVFJVRTsgIC8vIERlZ2VuZXJhdGVkLCBtYW55IHplcm9zCi0gICAgaWYgKFBvbGVzID4gKG5FbnRyaWVzIC8gMjApKSByZXR1cm4gVFJVRTsgIC8vIERlZ2VuZXJhdGVkLCBtYW55IHBvbGVzCisgICAgaWYgKFplcm9zID4gKG5FbnRyaWVzIC8gNCkpIHJldHVybiBUUlVFOyAgLy8gRGVnZW5lcmF0ZWQsIG1vc3RseSB6ZXJvcworICAgIGlmIChQb2xlcyA+IChuRW50cmllcyAvIDQpKSByZXR1cm4gVFJVRTsgIC8vIERlZ2VuZXJhdGVkLCBtb3N0bHkgcG9sZXMKIAogICAgIHJldHVybiBGQUxTRTsKIH0KQEAgLTEwNjIsMTkgKzEwNjQsMTcgQEAKICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2U7CiAgICAgY21zU3RhZ2UqIE9wdGltaXplZFByZWxpbk1wZTsKICAgICBjbXNTdGFnZSogbXBlOwotICAgIGNtc1RvbmVDdXJ2ZSoqIE9wdGltaXplZFByZWxpbkN1cnZlczsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogT3B0aW1pemVkUHJlbGluQ0xVVDsKKyAgICBjbXNUb25lQ3VydmUqKiAgIE9wdGltaXplZFByZWxpbkN1cnZlczsKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogICAgIE9wdGltaXplZFByZWxpbkNMVVQ7CiAKIAogICAgIC8vIFRoaXMgaXMgYSBsb29zeSBvcHRpbWl6YXRpb24hIGRvZXMgbm90IGFwcGx5IGluIGZsb2F0aW5nLXBvaW50IGNhc2VzCiAgICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpJbnB1dEZvcm1hdCkgfHwgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKk91dHB1dEZvcm1hdCkpIHJldHVybiBGQUxTRTsKIAotICAgIC8vIE9ubHkgb24gY2h1bmt5IFJHQgorICAgIC8vIE9ubHkgb24gUkdCCiAgICAgaWYgKFRfQ09MT1JTUEFDRSgqSW5wdXRGb3JtYXQpICAhPSBQVF9SR0IpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoVF9QTEFOQVIoKklucHV0Rm9ybWF0KSkgcmV0dXJuIEZBTFNFOwotCiAgICAgaWYgKFRfQ09MT1JTUEFDRSgqT3V0cHV0Rm9ybWF0KSAhPSBQVF9SR0IpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoVF9QTEFOQVIoKk91dHB1dEZvcm1hdCkpIHJldHVybiBGQUxTRTsKKwogCiAgICAgLy8gT24gMTYgYml0cywgdXNlciBoYXMgdG8gc3BlY2lmeSB0aGUgZmVhdHVyZQogICAgIGlmICghX2Ntc0Zvcm1hdHRlcklzOGJpdCgqSW5wdXRGb3JtYXQpKSB7CkBAIC0xMDk4LDIyICsxMDk4LDYgQEAKICAgICBtZW1zZXQoVHJhbnMsIDAsIHNpemVvZihUcmFucykpOwogICAgIG1lbXNldChUcmFuc1JldmVyc2UsIDAsIHNpemVvZihUcmFuc1JldmVyc2UpKTsKIAotICAgIC8vIElmIHRoZSBsYXN0IHN0YWdlIG9mIHRoZSBvcmlnaW5hbCBsdXQgYXJlIGN1cnZlcywgYW5kIHRob3NlIGN1cnZlcyBhcmUKLSAgICAvLyBkZWdlbmVyYXRlZCwgaXQgaXMgbGlrZWx5IHRoZSB0cmFuc2Zvcm0gaXMgc3F1ZWV6aW5nIGFuZCBjbGlwcGluZwotICAgIC8vIHRoZSBvdXRwdXQgZnJvbSBwcmV2aW91cyBDTFVULiBXZSBjYW5ub3Qgb3B0aW1pemUgdGhpcyBjYXNlCi0gICAgewotICAgICAgICBjbXNTdGFnZSogbGFzdCA9IGNtc1BpcGVsaW5lR2V0UHRyVG9MYXN0U3RhZ2UoT3JpZ2luYWxMdXQpOwotCi0gICAgICAgIGlmIChjbXNTdGFnZVR5cGUobGFzdCkgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgewotCi0gICAgICAgICAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogRGF0YSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopY21zU3RhZ2VEYXRhKGxhc3QpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IERhdGEtPm5DdXJ2ZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChJc0RlZ2VuZXJhdGVkKERhdGEtPlRoZUN1cnZlc1tpXSkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBmb3IgKHQgPSAwOyB0IDwgT3JpZ2luYWxMdXQgLT5JbnB1dENoYW5uZWxzOyB0KyspIHsKICAgICAgICAgVHJhbnNbdF0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KE9yaWdpbmFsTHV0IC0+Q29udGV4dElELCBQUkVMSU5FQVJJWkFUSU9OX1BPSU5UUywgTlVMTCk7CiAgICAgICAgIGlmIChUcmFuc1t0XSA9PSBOVUxMKSBnb3RvIEVycm9yOwpAQCAtMTQ0NywxMCArMTQzMSw3IEBACiAgICAgICAgIEdhbW1hVGFibGVzW2ldID0gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoR2FtbWFUYWJsZXMgIT0gTlVMTCkgewotICAgICAgICBfY21zRnJlZShTcmMtPkNvbnRleHRJRCwgR2FtbWFUYWJsZXMpOwotICAgICAgICBHYW1tYVRhYmxlcyA9IE5VTEw7Ci0gICAgfQorICAgIGlmIChHYW1tYVRhYmxlcyAhPSBOVUxMKSBfY21zRnJlZShTcmMgLT5Db250ZXh0SUQsIEdhbW1hVGFibGVzKTsKIAogICAgIC8vIE1heWJlIHRoZSBjdXJ2ZXMgYXJlIGxpbmVhciBhdCB0aGUgZW5kCiAgICAgaWYgKCFBbGxDdXJ2ZXNBcmVMaW5lYXIoT2J0YWluZWRDdXJ2ZXMpKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BhY2suYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGFjay5jCmluZGV4IGE5MDg3ZjYuLmUzODljNGUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGFjay5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGFjay5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTExMCw3ICsxMTAsNyBAQAogI2RlZmluZSBBTllGTEFWT1IgICAgICAgRkxBVk9SX1NIKDEpCiAKIAotLy8gU3VwcHJlc3Mgd2FuaW5nIGFib3V0IGluZm8gbmV2ZXIgYmVpbmcgdXNlZAorLy8gU3VwcmVzcyB3YW5pbmcgYWJvdXQgaW5mbyBuZXZlciBiZWluZyB1c2VkCiAKICNpZmRlZiBfTVNDX1ZFUgogI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAwKQpAQCAtMzE4OCw4ICszMTg4LDYgQEAKICAgICBjbXNVSW50MzJOdW1iZXIgaTsKICAgICBjbXNGb3JtYXR0ZXIgZnI7CiAKLSAgICAvLyBPcHRpbWl6YXRpb24gaXMgb25seSBhIGhpbnQKLSAgICBkd0lucHV0ICY9IH5PUFRJTUlaRURfU0goMSk7CiAKICAgICBzd2l0Y2ggKGR3RmxhZ3MpCiAgICAgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwY3MuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGNzLmMKaW5kZXggZjJlYmY1My4uZDRlZjY5NCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwY3MuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3Bjcy5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTMzNyw3ICszMzcsNyBAQAogICAgIHdMYWJbMl0gPSBhYjJGaXg0KExhYi5iKTsKIH0KIAotLy8gQXV4aWxpYXJ5OiBjb252ZXJ0IHRvIFJhZGlhbnMKKy8vIEF1eGlsaWFyOiBjb252ZXJ0IHRvIFJhZGlhbnMKIHN0YXRpYwogY21zRmxvYXQ2NE51bWJlciBSQURJQU5TKGNtc0Zsb2F0NjROdW1iZXIgZGVnKQogewpAQCAtMzQ1LDcgKzM0NSw3IEBACiB9CiAKIAotLy8gQXV4aWxpYXJ5OiBhdGFuMiBidXQgb3BlcmF0aW5nIGluIGRlZ3JlZXMgYW5kIHJldHVybmluZyAwIGlmIGE9PWI9PTAKKy8vIEF1eGlsaWFyOiBhdGFuMiBidXQgb3BlcmF0aW5nIGluIGRlZ3JlZXMgYW5kIHJldHVybmluZyAwIGlmIGE9PWI9PTAKIHN0YXRpYwogY21zRmxvYXQ2NE51bWJlciBhdGFuMmRlZyhjbXNGbG9hdDY0TnVtYmVyIGEsIGNtc0Zsb2F0NjROdW1iZXIgYikKIHsKQEAgLTM2OCw3ICszNjgsNyBAQAogfQogCiAKLS8vIEF1eGlsaWFyeTogU3F1YXJlCisvLyBBdXhpbGlhcjogU3F1YXJlCiBzdGF0aWMKIGNtc0Zsb2F0NjROdW1iZXIgU3FyKGNtc0Zsb2F0NjROdW1iZXIgdikKIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGx1Z2luLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BsdWdpbi5jCmluZGV4IDY4M2M4MzAuLjQ0NDM4MjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcGx1Z2luLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwbHVnaW4uYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC0xMzYsNyArMTM2LDcgQEAKICNlbmRpZgogfQogCi0vLyBBdXhpbGlhcnkgLS0gcmVhZCA4LCAxNiBhbmQgMzItYml0IG51bWJlcnMKKy8vIEF1eGlsaWFyIC0tIHJlYWQgOCwgMTYgYW5kIDMyLWJpdCBudW1iZXJzCiBjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50OE51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50OE51bWJlciogbikKIHsKICAgICBjbXNVSW50OE51bWJlciB0bXA7CkBAIC0yMDEsMTMgKzIwMSwxMyBAQAogCiAgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKIAotICAgIGlmIChpbyAtPiBSZWFkKGlvLCAmdG1wLCBzaXplb2YoY21zVUludDMyTnVtYmVyKSwgMSkgIT0gMSkKKyAgICBpZiAoaW8gLT4gUmVhZChpbywgJnRtcCwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpLCAxKSAhPSAxKQogICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgaWYgKG4gIT0gTlVMTCkgewogCiAgICAgICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMih0bXApOwotICAgICAgICAqbiA9ICooY21zRmxvYXQzMk51bWJlciopICh2b2lkKikgJnRtcDsKKyAgICAgICAgKm4gPSAqKGNtc0Zsb2F0MzJOdW1iZXIqKSAmdG1wOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTI0NCw2ICsyNDQsMjIgQEAKIH0KIAogCisvLyBKdW4tMjEtMjAwMDogU29tZSBwcm9maWxlcyAodGhvc2UgdGhhdCBjb21lcyB3aXRoIFcySykgY29tZXMKKy8vIHdpdGggdGhlIG1lZGlhIHdoaXRlIChtZWRpYSBibGFjaz8pIHggMTAwLiBBZGQgYSBzYW5pdHkgY2hlY2sKKworc3RhdGljCit2b2lkIE5vcm1hbGl6ZVhZWihjbXNDSUVYWVoqIERlc3QpCit7CisgICAgd2hpbGUgKERlc3QgLT4gWCA+IDIuICYmCisgICAgICAgICAgIERlc3QgLT4gWSA+IDIuICYmCisgICAgICAgICAgIERlc3QgLT4gWiA+IDIuKSB7CisKKyAgICAgICAgICAgICAgIERlc3QgLT4gWCAvPSAxMC47CisgICAgICAgICAgICAgICBEZXN0IC0+IFkgLz0gMTAuOworICAgICAgICAgICAgICAgRGVzdCAtPiBaIC89IDEwLjsKKyAgICAgICB9Cit9CisKIGNtc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZFhZWk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNDSUVYWVoqIFhZWikKIHsKICAgICBjbXNFbmNvZGVkWFlaTnVtYmVyIHh5ejsKQEAgLTI1Nyw2ICsyNzMsOCBAQAogICAgICAgICBYWVotPlggPSBfY21zMTVGaXhlZDE2dG9Eb3VibGUoX2Ntc0FkanVzdEVuZGlhbmVzczMyKHh5ei5YKSk7CiAgICAgICAgIFhZWi0+WSA9IF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShfY21zQWRqdXN0RW5kaWFuZXNzMzIoeHl6LlkpKTsKICAgICAgICAgWFlaLT5aID0gX2NtczE1Rml4ZWQxNnRvRG91YmxlKF9jbXNBZGp1c3RFbmRpYW5lc3MzMih4eXouWikpOworCisgICAgICAgIE5vcm1hbGl6ZVhZWihYWVopOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTMxOCw3ICszMzYsNyBAQAogCiAgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKIAotICAgIHRtcCA9ICooY21zVUludDMyTnVtYmVyKikgKHZvaWQqKSAmbjsKKyAgICB0bXAgPSAqKGNtc1VJbnQzMk51bWJlciopICZuOwogICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMih0bXApOwogICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQzMk51bWJlciksICZ0bXApICE9IDEpCiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC01MTQsMTAgKzUzMiw3IEBACiAgICAgdmFfc3RhcnQoYXJncywgZnJtKTsKIAogICAgIGxlbiA9IHZzbnByaW50ZigoY2hhciopIEJ1ZmZlciwgMjA0NywgZnJtLCBhcmdzKTsKLSAgICBpZiAobGVuIDwgMCkgewotICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsgICAvLyBUcnVuY2F0ZWQsIHdoaWNoIGlzIGEgZmF0YWwgZXJyb3IgZm9yIHVzCi0gICAgfQorICAgIGlmIChsZW4gPCAwKSByZXR1cm4gRkFMU0U7ICAgLy8gVHJ1bmNhdGVkLCB3aGljaCBpcyBhIGZhdGFsIGVycm9yIGZvciB1cwogCiAgICAgcmMgPSBpbyAtPldyaXRlKGlvLCBsZW4sIEJ1ZmZlcik7CiAKQEAgLTUzOSw3ICs1NTQsNiBAQAogICAgICAgICBpZiAoQ29udGV4dElEID09IE5VTEwpIHsKIAogICAgICAgICAgICAgY3R4LT5NZW1Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKDAsIDIqMTAyNCk7Ci0gICAgICAgICAgICBpZiAoY3R4LT5NZW1Qb29sID09IE5VTEwpIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVELCAiTlVMTCBtZW1vcnkgcG9vbCBvbiBjb250ZXh0Iik7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BzMi5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNwczIuYwppbmRleCAwM2Q0NzZiLi4yMjA4OWQwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3BzMi5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zcHMyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtNjA4LDcgKzYwOCw3IEBACiAvLwogLy8gIEVhY2ggcm93IGNvbnRhaW5zIFBpcGVsaW5lIHZhbHVlcyBmb3IgYWxsIGJ1dCBmaXJzdCBjb21wb25lbnQuIFNvLCBJCiAvLyAgZGV0ZWN0IHJvdyBjaGFuZ2luZyBieSBrZWVwaW5nIGEgY29weSBvZiBsYXN0IHZhbHVlIG9mIGZpcnN0Ci0vLyAgY29tcG9uZW50LiAtMSBpcyB1c2VkIHRvIG1hcmsgYmVnaW5uaW5nIG9mIHdob2xlIGJsb2NrLgorLy8gIGNvbXBvbmVudC4gLTEgaXMgdXNlZCB0byBtYXJrIGJlZ2luaW5nIG9mIHdob2xlIGJsb2NrLgogCiBzdGF0aWMKIGludCBPdXRwdXRWYWx1ZVNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCogQ2FyZ28pCkBAIC0xNDIyLDE1ICsxNDIyLDE0IEBACiAgICAgaWYgKG5Db2xvcmFudCA+IGNtc01BWENIQU5ORUxTKQogICAgICAgICBuQ29sb3JhbnQgPSBjbXNNQVhDSEFOTkVMUzsKIAotICAgIGZvciAoaiA9IDA7IGogPCBuQ29sb3JhbnQ7IGorKykgeworICAgIGZvciAoaj0wOyBqIDwgbkNvbG9yYW50OyBqKyspIHsKIAotICAgICAgICBzbnByaW50ZihCdWZmLCAzMSwgIiUuM2YiLCBPdXRbal0gLyA2NTUzNS4wKTsKLSAgICAgICAgQnVmZlszMV0gPSAwOwotICAgICAgICBzdHJjYXQoQ29sb3JhbnQsIEJ1ZmYpOwotICAgICAgICBpZiAoaiA8IG5Db2xvcmFudCAtIDEpCi0gICAgICAgICAgICBzdHJjYXQoQ29sb3JhbnQsICIgIik7CisgICAgICAgICAgICAgICAgc3ByaW50ZihCdWZmLCAiJS4zZiIsIE91dFtqXSAvIDY1NTM1LjApOworICAgICAgICAgICAgICAgIHN0cmNhdChDb2xvcmFudCwgQnVmZik7CisgICAgICAgICAgICAgICAgaWYgKGogPCBuQ29sb3JhbnQgLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoQ29sb3JhbnQsICIgIik7CiAKLSAgICB9CisgICAgICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3NhbXAuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zc2FtcC5jCmluZGV4IGIyMmM0MjcuLmJjZDlkNTAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zc2FtcC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zc2FtcC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zc20uYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zc20uYwppbmRleCAxOTIzYTAyLi43ODNmM2MzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3NtLmMKKysrIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXNzbS5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMSBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTI0Nyw4ICsyNDcsNyBAQAogewogICAgIGNtc0Zsb2F0NjROdW1iZXIgYSwgYiwgYywgZCwgZSwgRDsKICAgICBjbXNGbG9hdDY0TnVtYmVyIHNjLCBzTiwgc0Q7Ci0gICAgLy9jbXNGbG9hdDY0TnVtYmVyIHRjOyAvLyBsZWZ0IGZvciBmdXR1cmUgdXNlCi0gICAgY21zRmxvYXQ2NE51bWJlciB0TiwgdEQ7CisgICAgY21zRmxvYXQ2NE51bWJlciB0YywgdE4sIHREOwogICAgIGNtc1ZFQzMgdzA7CiAKICAgICBfY21zVkVDM21pbnVzKCZ3MCwgJmxpbmUxIC0+YSwgJmxpbmUyIC0+YSk7CkBAIC0zMTYsNyArMzE1LDcgQEAKICAgICB9CiAgICAgLy8gZmluYWxseSBkbyB0aGUgZGl2aXNpb24gdG8gZ2V0IHNjIGFuZCB0YwogICAgIHNjID0gKGZhYnMoc04pIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UgPyAwLjAgOiBzTiAvIHNEKTsKLSAgICAvL3RjID0gKGZhYnModE4pIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UgPyAwLjAgOiB0TiAvIHREKTsgLy8gbGVmdCBmb3IgZnV0dXJlIHVzZS4KKyAgICB0YyA9IChmYWJzKHROKSA8IE1BVFJJWF9ERVRfVE9MRVJBTkNFID8gMC4wIDogdE4gLyB0RCk7CiAKICAgICBHZXRQb2ludE9mTGluZShyLCBsaW5lMSwgc2MpOwogICAgIHJldHVybiBUUlVFOwpAQCAtMzQ3LDcgKzM0Niw3IEBACiB9CiAKIAotLy8gQXV4aWxpYXJ5IHRvIHJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgc2VnbWVudHIgY29udGFpbmluZyB0aGUgTGFiIHZhbHVlCisvLyBBdXhpbGlhciB0byByZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIHNlZ21lbnRyIGNvbnRhaW5pbmcgdGhlIExhYiB2YWx1ZQogc3RhdGljCiBjbXNHREJQb2ludCogR2V0UG9pbnQoY21zR0RCKiBnYmQsIGNvbnN0IGNtc0NJRUxhYiogTGFiLCBjbXNTcGhlcmljYWwqIHNwKQogewpAQCAtMzU5LDcgKzM1OCw3IEBACiAgICAgX2Ntc0Fzc2VydChMYWIgIT0gTlVMTCk7CiAgICAgX2Ntc0Fzc2VydChzcCAhPSBOVUxMKTsKIAotICAgIC8vIENlbnRlciBMKiBieSBzdWJ0cmFjdGluZyBoYWxmIG9mIGl0cyBkb21haW4sIHRoYXQncyA1MAorICAgIC8vIENlbnRlciBMKiBieSBzdWJzdHJhY3RpbmcgaGFsZiBvZiBpdHMgZG9tYWluLCB0aGF0J3MgNTAKICAgICBfY21zVkVDM2luaXQoJnYsIExhYiAtPkwgLSA1MC4wLCBMYWIgLT5hLCBMYWIgLT5iKTsKIAogICAgIC8vIENvbnZlcnQgdG8gc3BoZXJpY2FsIGNvb3JkaW5hdGVzCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3R5cGVzLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3R5cGVzLmMKaW5kZXggM2Y4OTk5Zi4uMWUxMTliNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN0eXBlcy5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdHlwZXMuYwpAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC01OSw3ICs1OSw3IEBACiAvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBldmVyeSBzaW5nbGUgdGFnIGFuZCB0YWcgdHlwZSBhcyBkZXNjcmliZWQgaW4gdGhlIElDQyBzcGVjLiBTb21lIHR5cGVzCiAvLyBoYXZlIGJlZW4gZGVwcmVjYXRlZCwgbGlrZSBuY2wgYW5kIERhdGEuIFRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIGZvciB0aG9zZSB0eXBlcyBhcyB0aGVyZQogLy8gYXJlIG5vIHByb2ZpbGVzIGhvbGRpbmcgdGhlbS4gVGhlIHByb2dyYW1tZXIgY2FuIGFsc28gZXh0ZW5kIHRoaXMgbGlzdCBieSBkZWZpbmluZyBoaXMgb3duIHR5cGVzCi0vLyBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcGx1Zy1pbi4gVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIHBsdWcgaW5zIHJlZ2FyZGluZyB0aGF0LiBGaXJzdCB0eXBlCisvLyBieSB1c2luZyB0aGUgYXBwcm9waWF0ZSBwbHVnLWluLiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgcGx1ZyBpbnMgcmVnYXJkaW5nIHRoYXQuIEZpcnN0IHR5cGUKIC8vIGFsbG93cyB0byBkZWZpbmUgbmV3IHRhZ3MgdXNpbmcgYW55IGV4aXN0aW5nIHR5cGUuIE5leHQgcGx1Zy1pbiB0eXBlIGFsbG93cyB0byBkZWZpbmUgbmV3IHR5cGVzCiAvLyBhbmQgdGhlIHRoaXJkIG9uZSBpcyB2ZXJ5IHNwZWNpZmljOiBhbGxvd3MgdG8gZXh0ZW5kIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG11bHRpcHJvY2Vzc2luZwogLy8gZWxlbWVudHMgc3BlY2lhbCB0eXBlLgpAQCAtMTQyLDcgKzE0Miw3IEBACiB9CiAKIAotLy8gQXV4aWxpYXJ5IHRvIGNvbnZlcnQgVVRGLTMyIHRvIFVURi0xNiBpbiBzb21lIGNhc2VzCisvLyBBdXhpbGlhciB0byBjb252ZXJ0IFVURi0zMiB0byBVVEYtMTYgaW4gc29tZSBjYXNlcwogc3RhdGljCiBjbXNCb29sIF9jbXNXcml0ZVdDaGFyQXJyYXkoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIG4sIGNvbnN0IHdjaGFyX3QqIEFycmF5KQogewpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8vIEF1eGlsaWFyeSB0byByZWFkIGFuIGFycmF5IG9mIHdjaGFyX3QKKy8vIEF1eGlsaWFyIHRvIHJlYWQgYW4gYXJyYXkgb2Ygd2NoYXJfdAogc3RhdGljCiBjbXNCb29sIF9jbXNSZWFkV0NoYXJBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgd2NoYXJfdCogQXJyYXkpCiB7CkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZyk7CiAKLS8vIEhlbHBlciBmdW5jdGlvbiB0byBkZWFsIHdpdGggcG9zaXRpb24gdGFibGVzIGFzIGRlc2NyaWJlZCBpbiBJQ0Mgc3BlYyA0LjMKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBkZWFsIHdpdGggcG9zaXRpb24gdGFibGVzIGFzIGRlY3JpYmVkIGluIElDQyBzcGVjIDQuMwogLy8gQSB0YWJsZSBvZiBuIGVsZW1lbnRzIGlzIHJlYWRlZCwgd2hlcmUgZmlyc3QgY29tZXMgbiByZWNvcmRzIGNvbnRhaW5pbmcgb2Zmc2V0cyBhbmQgc2l6ZXMgYW5kCiAvLyB0aGVuIGEgYmxvY2sgY29udGFpbmluZyB0aGUgZGF0YSBpdHNlbGYuIFRoaXMgYWxsb3dzIHRvIHJldXNlIHNhbWUgZGF0YSBpbiBtb3JlIHRoYW4gb25lIGVudHJ5CiBzdGF0aWMKQEAgLTk4MCw3ICs5ODAsNyBAQAogICAgIGNtc01MVSogbWx1ID0gKGNtc01MVSopIFB0cjsKICAgICBjaGFyICpUZXh0ID0gTlVMTDsKICAgICB3Y2hhcl90ICpXaWRlID0gTlVMTDsKLSAgICBjbXNVSW50MzJOdW1iZXIgbGVuLCBsZW5fdGV4dCwgbGVuX3RhZ19yZXF1aXJlbWVudCwgbGVuX2FsaWduZWQ7CisgICAgY21zVUludDMyTnVtYmVyIGxlbiwgbGVuX2FsaWduZWQsIGxlbl9maWxsZXJfYWxpZ25tZW50OwogICAgIGNtc0Jvb2wgIHJjID0gRkFMU0U7CiAgICAgY2hhciBGaWxsZXJbNjhdOwogCkBAIC05OTAsMTggKzk5MCwxNyBAQAogICAgIC8vIEdldCB0aGUgbGVuIG9mIHN0cmluZwogICAgIGxlbiA9IGNtc01MVWdldEFTQ0lJKG1sdSwgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBOVUxMLCAwKTsKIAotICAgIC8vIFNwZWNpZmljYXRpb24gSUNDLjE6MjAwMS0wNCAodjIuNC4wKTogSXQgaGFzIGJlZW4gZm91bmQgdGhhdCB0ZXh0RGVzY3JpcHRpb25UeXBlIGNhbiBjb250YWluIG1pc2FsaWduZWQgZGF0YQorICAgIC8vIEZyb20gSUNDMy40OiBJdCBoYXMgYmVlbiBmb3VuZCB0aGF0IHRleHREZXNjcmlwdGlvblR5cGUgY2FuIGNvbnRhaW4gbWlzYWxpZ25lZCBkYXRhCiAgICAgLy8oc2VlIGNsYXVzZSA0LjEgZm9yIHRoZSBkZWZpbml0aW9uIG9mIJNhbGlnbmVklCkuIEJlY2F1c2UgdGhlIFVuaWNvZGUgbGFuZ3VhZ2UKICAgICAvLyBjb2RlIGFuZCBVbmljb2RlIGNvdW50IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgQVNDSUkgZGVzY3JpcHRpb24sIHRoZWlyCiAgICAgLy8gYWxpZ25tZW50IGlzIG5vdCBjb3JyZWN0IGlmIHRoZSBBU0NJSSBjb3VudCBpcyBub3QgYSBtdWx0aXBsZSBvZiBmb3VyLiBUaGUKICAgICAvLyBTY3JpcHRDb2RlIGNvZGUgaXMgbWlzYWxpZ25lZCB3aGVuIHRoZSBBU0NJSSBjb3VudCBpcyBvZGQuIFByb2ZpbGUgcmVhZGluZyBhbmQKICAgICAvLyB3cml0aW5nIHNvZnR3YXJlIG11c3QgYmUgd3JpdHRlbiBjYXJlZnVsbHkgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZXNlIGFsaWdubWVudAogICAgIC8vIHByb2JsZW1zLgotICAgIC8vCi0gICAgLy8gVGhlIGFib3ZlIGxhc3Qgc2VudGVuY2Ugc3VnZ2VzdCB0byBoYW5kbGUgYWxpZ25tZW50IGlzc3VlcyBpbiB0aGUKLSAgICAvLyBwYXJzZXIuIFRoZSBwcm92aWRlZCBleGFtcGxlIChUYWJsZSA2OSBvbiBQYWdlIDYwKSBtYWtlcyB0aGlzIGNsZWFyLgotICAgIC8vIFRoZSBwYWRkaW5nIG9ubHkgaW4gdGhlIEFTQ0lJIGNvdW50IGlzIG5vdCBzdWZmaWNpZW50IGZvciBhIGFsaWduZWQgdGFnCi0gICAgLy8gc2l6ZSwgd2l0aCB0aGUgc2FtZSB0ZXh0IHNpemUgaW4gQVNDSUkgYW5kIFVuaWNvZGUuCisKKyAgICAvLyBDb21wdXRlIGFuIGFsaWduZWQgc2l6ZQorICAgIGxlbl9hbGlnbmVkID0gX2Ntc0FMSUdOTE9ORyhsZW4pOworICAgIGxlbl9maWxsZXJfYWxpZ25tZW50ID0gbGVuX2FsaWduZWQgLSBsZW47CiAKICAgICAvLyBOdWxsIHN0cmluZ3MKICAgICBpZiAobGVuIDw9IDApIHsKQEAgLTEwMjIsMTIgKzEwMjEsNiBAQAogICAgICAgICBjbXNNTFVnZXRXaWRlKG1sdSwgIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgIFdpZGUsIGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgfQogCi0gICAgLy8gVGVsbCB0aGUgcmVhbCB0ZXh0IGxlbiBpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvciBhbmQgcGFkZGluZwotICAgIGxlbl90ZXh0ID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKFRleHQpICsgMTsKLSAgICAvLyBDb21wdXRlIGFuIHRvdGFsIHRhZyBzaXplIHJlcXVpcmVtZW50Ci0gICAgbGVuX3RhZ19yZXF1aXJlbWVudCA9ICg4KzQrbGVuX3RleHQrNCs0KzIqbGVuX3RleHQrMisxKzY3KTsKLSAgICBsZW5fYWxpZ25lZCA9IF9jbXNBTElHTkxPTkcobGVuX3RhZ19yZXF1aXJlbWVudCk7Ci0KICAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgY291bnQ7ICAgICAgICAgICogRGVzY3JpcHRpb24gbGVuZ3RoCiAgIC8vICogY21zSW50OE51bWJlciAgICAgICAgIGRlc2NbY291bnRdICAgICAqIE5VTEwgdGVybWluYXRlZCBhc2NpaSBzdHJpbmcKICAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgdWNMYW5nQ29kZTsgICAgICogVW5pQ29kZSBsYW5ndWFnZSBjb2RlCkBAIC0xMDM3LDE0ICsxMDMwLDIwIEBACiAgIC8vICogY21zVUludDhOdW1iZXIgICAgICAgIHNjQ291bnQ7ICAgICAgICAqIFNjcmlwdENvZGUgY291bnQKICAgLy8gKiBjbXNJbnQ4TnVtYmVyICAgICAgICAgc2NEZXNjWzY3XTsgICAgICogU2NyaXB0Q29kZSBEZXNjcmlwdGlvbgogCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIGxlbl90ZXh0KSkgZ290byBFcnJvcjsKLSAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIGxlbl90ZXh0LCBUZXh0KSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgbGVuX2FsaWduZWQpKSBnb3RvIEVycm9yOworICAgIGlmICghaW8gLT5Xcml0ZShpbywgbGVuLCBUZXh0KSkgZ290byBFcnJvcjsKKyAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIGxlbl9maWxsZXJfYWxpZ25tZW50LCBGaWxsZXIpKSBnb3RvIEVycm9yOwogCiAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOyAgLy8gdWNMYW5ndWFnZUNvZGUKIAotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBsZW5fdGV4dCkpIGdvdG8gRXJyb3I7CisgICAgLy8gVGhpcyBwYXJ0IGlzIHRyaWNreTogd2UgbmVlZCBhbiBhbGlnbmVkIHRhZyBzaXplLCBhbmQgdGhlIFNjcmlwdENvZGUgcGFydAorICAgIC8vIHRha2VzIDcwIGJ5dGVzLCBzbyB3ZSBuZWVkIDIgZXh0cmEgYnl0ZXMgdG8gZG8gdGhlIGFsaWdubWVudAorCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIGxlbl9hbGlnbmVkKzEpKSBnb3RvIEVycm9yOworCiAgICAgLy8gTm90ZSB0aGF0IGluIHNvbWUgY29tcGlsZXJzIHNpemVvZihjbXNVSW50MTZOdW1iZXIpICE9IHNpemVvZih3Y2hhcl90KQotICAgIGlmICghX2Ntc1dyaXRlV0NoYXJBcnJheShpbywgbGVuX3RleHQsIFdpZGUpKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1dyaXRlV0NoYXJBcnJheShpbywgbGVuLCBXaWRlKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBsZW5fZmlsbGVyX2FsaWdubWVudCsxLCAoY21zVUludDE2TnVtYmVyKikgRmlsbGVyKSkgZ290byBFcnJvcjsKIAogICAgIC8vIFNjcmlwdENvZGUgQ29kZSAmIGNvdW50ICh1bnVzZWQpCiAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOwpAQCAtMTA1MiwxMCArMTA1MSw2IEBACiAKICAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDY3LCBGaWxsZXIpKSBnb3RvIEVycm9yOwogCi0gICAgLy8gcG9zc2libHkgYWRkIHBhZCBhdCB0aGUgZW5kIG9mIHRhZwotICAgIGlmKGxlbl9hbGlnbmVkIC0gbGVuX3RhZ19yZXF1aXJlbWVudCA+IDApCi0gICAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIGxlbl9hbGlnbmVkIC0gbGVuX3RhZ19yZXF1aXJlbWVudCwgRmlsbGVyKSkgZ290byBFcnJvcjsKLQogICAgIHJjID0gVFJVRTsKIAogRXJyb3I6CkBAIC0xNTAzLDcgKzE0OTgsNyBAQAogICAgICAgICAgICAgTGFyZ2VzdFBvc2l0aW9uID0gRW5kT2ZUaGlzU3RyaW5nOwogICAgIH0KIAotICAgIC8vIE5vdyByZWFkIHRoZSByZW1haW5pbmcgb2YgdGFnIGFuZCBmaWxsIGFsbCBzdHJpbmdzLiBTdWJ0cmFjdCB0aGUgZGlyZWN0b3J5CisgICAgLy8gTm93IHJlYWQgdGhlIHJlbWFpbmluZyBvZiB0YWcgYW5kIGZpbGwgYWxsIHN0cmluZ3MuIFN1YnN0cmFjdCB0aGUgZGlyZWN0b3J5CiAgICAgU2l6ZU9mVGFnICAgPSAoTGFyZ2VzdFBvc2l0aW9uICogc2l6ZW9mKHdjaGFyX3QpKSAvIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwogICAgIGlmIChTaXplT2ZUYWcgPT0gMCkKICAgICB7CkBAIC0xNTM3LDcgKzE1MzIsNyBAQAogICAgIGNtc01MVSogbWx1ID0oY21zTUxVKikgUHRyOwogICAgIGNtc1VJbnQzMk51bWJlciBIZWFkZXJTaXplOwogICAgIGNtc1VJbnQzMk51bWJlciAgTGVuLCBPZmZzZXQ7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgaW50IGk7CiAKICAgICBpZiAoUHRyID09IE5VTEwpIHsKIApAQCAtMzEzOCw4ICszMTMzLDYgQEAKIAogICAgICAgICBtZW1zZXQoQ29sb3JhbnQsIDAsIHNpemVvZihDb2xvcmFudCkpOwogICAgICAgICBpZiAoaW8gLT4gUmVhZChpbywgUm9vdCwgMzIsIDEpICE9IDEpIHJldHVybiBOVUxMOwotICAgICAgICBSb290WzMyXSA9IDA7ICAvLyBUbyBwcmV2ZW50IGV4cGxvaXRzCi0KICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCAzLCBQQ1MpKSBnb3RvIEVycm9yOwogICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIG5EZXZpY2VDb29yZHMsIENvbG9yYW50KSkgZ290byBFcnJvcjsKIApAQCAtMzE2Miw4ICszMTU1LDggQEAKIGNtc0Jvb2wgVHlwZV9OYW1lZENvbG9yX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQogewogICAgIGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCA9IChjbXNOQU1FRENPTE9STElTVCopIFB0cjsKLSAgICBjaGFyICAgICAgICAgICAgICAgIHByZWZpeFszM107ICAgICAvLyBQcmVmaXggZm9yIGVhY2ggY29sb3IgbmFtZQotICAgIGNoYXIgICAgICAgICAgICAgICAgc3VmZml4WzMzXTsgICAgIC8vIFN1ZmZpeCBmb3IgZWFjaCBjb2xvciBuYW1lCisgICAgY2hhciAgICAgICAgICAgICAgICBwcmVmaXhbMzJdOyAgICAgLy8gUHJlZml4IGZvciBlYWNoIGNvbG9yIG5hbWUKKyAgICBjaGFyICAgICAgICAgICAgICAgIHN1ZmZpeFszMl07ICAgICAvLyBTdWZmaXggZm9yIGVhY2ggY29sb3IgbmFtZQogICAgIGludCBpLCBuQ29sb3JzOwogCiAgICAgbkNvbG9ycyA9IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCk7CkBAIC0zMTc1LDcgKzMxNjgsNyBAQAogICAgIHN0cm5jcHkocHJlZml4LCAoY29uc3QgY2hhciopIE5hbWVkQ29sb3JMaXN0LT5QcmVmaXgsIDMyKTsKICAgICBzdHJuY3B5KHN1ZmZpeCwgKGNvbnN0IGNoYXIqKSBOYW1lZENvbG9yTGlzdC0+U3VmZml4LCAzMik7CiAKLSAgICBzdWZmaXhbMzJdID0gcHJlZml4WzMyXSA9IDA7CisgICAgc3VmZml4WzMxXSA9IHByZWZpeFszMV0gPSAwOwogCiAgICAgaWYgKCFpbyAtPldyaXRlKGlvLCAzMiwgcHJlZml4KSkgcmV0dXJuIEZBTFNFOwogICAgIGlmICghaW8gLT5Xcml0ZShpbywgMzIsIHN1ZmZpeCkpIHJldHVybiBGQUxTRTsKQEAgLTMxODcsNyArMzE4MCw2IEBACiAgICAgICAgY2hhciBSb290WzMzXTsKIAogICAgICAgICBpZiAoIWNtc05hbWVkQ29sb3JJbmZvKE5hbWVkQ29sb3JMaXN0LCBpLCBSb290LCBOVUxMLCBOVUxMLCBQQ1MsIENvbG9yYW50KSkgcmV0dXJuIDA7Ci0gICAgICAgIFJvb3RbMzJdID0gMDsKICAgICAgICAgaWYgKCFpbyAtPldyaXRlKGlvLCAzMiAsIFJvb3QpKSByZXR1cm4gRkFMU0U7CiAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2QXJyYXkoaW8sIDMsIFBDUykpIHJldHVybiBGQUxTRTsKICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgTmFtZWRDb2xvckxpc3QgLT5Db2xvcmFudENvdW50LCBDb2xvcmFudCkpIHJldHVybiBGQUxTRTsKQEAgLTM2MzgsNyArMzYzMCw3IEBACiAKIAogCi0vLyBBdXhpbGlhcnksIHJlYWQgYW4gc3RyaW5nIHNwZWNpZmllZCBhcyBjb3VudCArIHN0cmluZworLy8gQXV4aWxpYXIsIHJlYWQgYW4gc3RyaW5nIHNwZWNpZmllZCBhcyBjb3VudCArIHN0cmluZwogc3RhdGljCiBjbXNCb29sICBSZWFkQ291bnRBbmRTdGluZyhzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc01MVSogbWx1LCBjbXNVSW50MzJOdW1iZXIqIFNpemVPZlRhZywgY29uc3QgY2hhciogU2VjdGlvbikKIHsKQEAgLTM4ODcsNyArMzg3OSw3IEBACiBzdGF0aWMKIHZvaWQqIFR5cGVfVmlld2luZ0NvbmRpdGlvbnNfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKIHsKLSAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zSUNDVmlld2luZ0NvbmRpdGlvbnMpKTsKKyAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKGNtc1NjcmVlbmluZykpOwogCiAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwogfQpAQCAtNDM0NCwxMyArNDMzNiwxMyBAQAogc3RhdGljCiBjbXNCb29sICBUeXBlX01QRWNsdXRfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCiB7Ci0gICAgY21zVUludDhOdW1iZXIgRGltZW5zaW9uczhbMTZdOyAgLy8gMTYgYmVjYXVzZSB0aGUgc3BlYyBzYXlzIDE2IGFuZCBub3QgbWF4IG51bWJlciBvZiBjaGFubmVscworICAgIGNtc1VJbnQ4TnVtYmVyIERpbWVuc2lvbnM4WzE2XTsKICAgICBjbXNVSW50MzJOdW1iZXIgaTsKICAgICBjbXNTdGFnZSogbXBlID0gKGNtc1N0YWdlKikgUHRyOwogICAgIF9jbXNTdGFnZUNMdXREYXRhKiBjbHV0ID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+RGF0YTsKIAotICAgIC8vIENoZWNrIGZvciBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgbGNtcwotICAgIGlmIChtcGUgLT4gSW5wdXRDaGFubmVscyA+IE1BWF9JTlBVVF9ESU1FTlNJT05TKSByZXR1cm4gRkFMU0U7CisgICAgLy8gQ2hlY2sgZm9yIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgaWYgKG1wZSAtPiBJbnB1dENoYW5uZWxzID4gMTUpIHJldHVybiBGQUxTRTsKIAogICAgIC8vIE9ubHkgZmxvYXRzIGFyZSBzdXBwb3J0ZWQgaW4gTVBFCiAgICAgaWYgKGNsdXQgLT5IYXNGbG9hdFZhbHVlcyA9PSBGQUxTRSkgcmV0dXJuIEZBTFNFOwpAQCAtNTQ4OCw5ICs1NDgwLDggQEAKICAgICB7IGNtc1NpZ1NjcmVlbmluZ1RhZywgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdTY3JlZW5pbmdUeXBlfSwgICAgICAgICAgTlVMTCB9LCAmU3VwcG9ydGVkVGFnc1s1OV19LAogICAgIHsgY21zU2lnVmNndFRhZywgICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ1ZjZ3RUeXBlfSwgICAgICAgICAgICAgICBOVUxMIH0sICZTdXBwb3J0ZWRUYWdzWzYwXX0sCiAgICAgeyBjbXNTaWdNZXRhVGFnLCAgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnRGljdFR5cGV9LCAgICAgICAgICAgICAgIE5VTEwgfSwgJlN1cHBvcnRlZFRhZ3NbNjFdfSwKLSAgICB7IGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZUlkVGFnLCAgIHsgMSwgMSwgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGV9LCAgTlVMTCB9LCAmU3VwcG9ydGVkVGFnc1s2Ml19LAotICAgIHsgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uTUxUYWcseyAxLCAxLCB7IGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNjNdfSwKLSAgICB7IGNtc1NpZ0FyZ3lsbEFydHNUYWcsICAgICAgICAgIHsgOSwgMSwgeyBjbXNTaWdTMTVGaXhlZDE2QXJyYXlUeXBlfSwgICAgTlVMTH0sIE5VTEx9CisgICAgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFRhZywgICB7IDEsIDEsIHsgY21zU2lnUHJvZmlsZVNlcXVlbmNlSWRUeXBlfSwgIE5VTEwgfSwgICZTdXBwb3J0ZWRUYWdzWzYyXX0sCisgICAgeyBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25NTFRhZyx7IDEsIDEsIHsgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZX0sIE5VTEx9LCBOVUxMfQogCiAKIH07CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3ZpcnQuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdmlydC5jCmluZGV4IDhkMzUzYjMuLjZjODRmMTMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdmlydC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zdmlydC5jCkBAIC0zMCw3ICszMCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8KIC8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBNYXJ0aSBNYXJpYSBTYWd1ZXIKIC8vCiAvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIC8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKQEAgLTExNjcsMjAgKzExNjcsMTUgQEAKICAgICAvLyBJZiBubyB3YXksIHRoZW4gZm9yY2UgQ0xVVCB0aGF0IGZvciBzdXJlIGNhbiBiZSB3cml0dGVuCiAgICAgaWYgKEFsbG93ZWRMVVQgPT0gTlVMTCkgewogCi0gICAgICAgIGNtc1N0YWdlKiBGaXJzdFN0YWdlOwotICAgICAgICBjbXNTdGFnZSogTGFzdFN0YWdlOwotCiAgICAgICAgIGR3RmxhZ3MgfD0gY21zRkxBR1NfRk9SQ0VfQ0xVVDsKICAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoQ29udGV4dElELCAmTFVULCB4Zm9ybSAtPlJlbmRlcmluZ0ludGVudCwgJkZybUluLCAmRnJtT3V0LCAmZHdGbGFncyk7CiAKICAgICAgICAgLy8gUHV0IGlkZW50aXR5IGN1cnZlcyBpZiBuZWVkZWQKLSAgICAgICAgRmlyc3RTdGFnZSA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKExVVCk7Ci0gICAgICAgIGlmIChGaXJzdFN0YWdlICE9IE5VTEwgJiYgRmlyc3RTdGFnZSAtPlR5cGUgIT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkKKyAgICAgICAgaWYgKGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKExVVCkgLT5UeXBlICE9IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpCiAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCBDaGFuc0luKSkpCiAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CiAKLSAgICAgICAgTGFzdFN0YWdlID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShMVVQpOwotICAgICAgICBpZiAoTGFzdFN0YWdlICE9IE5VTEwgJiYgTGFzdFN0YWdlIC0+VHlwZSAhPSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKQorICAgICAgICBpZiAoY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShMVVQpIC0+VHlwZSAhPSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKQogICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0VORCwgICBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgQ2hhbnNPdXQpKSkKICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN3dHBudC5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN3dHBudC5jCmluZGV4IGQyM2IyOWYuLjFlYjlhODcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zd3RwbnQuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3d0cG50LmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN4Zm9ybS5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9jbXN4Zm9ybS5jCmluZGV4IGRmZWRkN2YuLmMwYTA2OTMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvY21zeGZvcm0uYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2Ntc3hmb3JtLmMKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMjA4LDE4ICsyMDgsMTIgQEAKIAogewogICAgIF9jbXNUUkFOU0ZPUk0qIHAgPSAoX2Ntc1RSQU5TRk9STSopIFRyYW5zZm9ybTsKLSAgICBjbXNTdHJpZGUgc3RyaWRlOwogCi0gICAgc3RyaWRlLkJ5dGVzUGVyTGluZUluID0gMDsgIC8vIE5vdCB1c2VkCi0gICAgc3RyaWRlLkJ5dGVzUGVyTGluZU91dCA9IDA7Ci0gICAgc3RyaWRlLkJ5dGVzUGVyUGxhbmVJbiA9IFNpemU7Ci0gICAgc3RyaWRlLkJ5dGVzUGVyUGxhbmVPdXQgPSBTaXplOwotCi0gICAgcCAtPiB4Zm9ybShwLCBJbnB1dEJ1ZmZlciwgT3V0cHV0QnVmZmVyLCBTaXplLCAxLCAmc3RyaWRlKTsKKyAgICBwIC0+IHhmb3JtKHAsIElucHV0QnVmZmVyLCBPdXRwdXRCdWZmZXIsIFNpemUsIFNpemUpOwogfQogCiAKLS8vIFRoaXMgaXMgYSBsZWdhY3kgc3RyaWRlIGZvciBwbGFuYXIKKy8vIEFwcGx5IHRyYW5zZm9ybS4KIHZvaWQgQ01TRVhQT1JUIGNtc0RvVHJhbnNmb3JtU3RyaWRlKGNtc0hUUkFOU0ZPUk0gIFRyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIElucHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLApAQCAtMjI3LDQwICsyMjEsMTAgQEAKIAogewogICAgIF9jbXNUUkFOU0ZPUk0qIHAgPSAoX2Ntc1RSQU5TRk9STSopIFRyYW5zZm9ybTsKLSAgICBjbXNTdHJpZGUgc3RyaWRlOwogCi0gICAgc3RyaWRlLkJ5dGVzUGVyTGluZUluID0gMDsKLSAgICBzdHJpZGUuQnl0ZXNQZXJMaW5lT3V0ID0gMDsKLSAgICBzdHJpZGUuQnl0ZXNQZXJQbGFuZUluID0gU3RyaWRlOwotICAgIHN0cmlkZS5CeXRlc1BlclBsYW5lT3V0ID0gU3RyaWRlOwotCi0gICAgcCAtPiB4Zm9ybShwLCBJbnB1dEJ1ZmZlciwgT3V0cHV0QnVmZmVyLCBTaXplLCAxLCAmc3RyaWRlKTsKKyAgICBwIC0+IHhmb3JtKHAsIElucHV0QnVmZmVyLCBPdXRwdXRCdWZmZXIsIFNpemUsIFN0cmlkZSk7CiB9CiAKLS8vIFRoaXMgaXMgdGhlICJmYXN0IiBmdW5jdGlvbiBmb3IgcGx1Z2lucwotdm9pZCBDTVNFWFBPUlQgY21zRG9UcmFuc2Zvcm1MaW5lU3RyaWRlKGNtc0hUUkFOU0ZPUk0gIFRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyTGluZUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyTGluZU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJQbGFuZU91dCkKLQotewotICAgIF9jbXNUUkFOU0ZPUk0qIHAgPSAoX2Ntc1RSQU5TRk9STSopIFRyYW5zZm9ybTsKLSAgICBjbXNTdHJpZGUgc3RyaWRlOwotCi0gICAgc3RyaWRlLkJ5dGVzUGVyTGluZUluID0gQnl0ZXNQZXJMaW5lSW47Ci0gICAgc3RyaWRlLkJ5dGVzUGVyTGluZU91dCA9IEJ5dGVzUGVyTGluZU91dDsKLSAgICBzdHJpZGUuQnl0ZXNQZXJQbGFuZUluID0gQnl0ZXNQZXJQbGFuZUluOwotICAgIHN0cmlkZS5CeXRlc1BlclBsYW5lT3V0ID0gQnl0ZXNQZXJQbGFuZU91dDsKLQotICAgIHAtPnhmb3JtKHAsIElucHV0QnVmZmVyLCBPdXRwdXRCdWZmZXIsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgJnN0cmlkZSk7Ci19Ci0KLQogCiAvLyBUcmFuc2Zvcm0gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNjksNjQgKzIzMyw0OSBAQAogc3RhdGljCiB2b2lkIEZsb2F0WEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKLSAgICAgICAgICAgICAgICB2b2lkKiBvdXQsCi0gICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKLSAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKKyAgICAgICAgICAgICAgICB2b2lkKiBvdXQsIGNtc1VJbnQzMk51bWJlciBTaXplLCBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQogewogICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bTsKICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0OwogICAgIGNtc0Zsb2F0MzJOdW1iZXIgZkluW2Ntc01BWENIQU5ORUxTXSwgZk91dFtjbXNNQVhDSEFOTkVMU107CiAgICAgY21zRmxvYXQzMk51bWJlciBPdXRPZkdhbXV0OwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBjLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOwogCi0gICAgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMocCwgaW4sIG91dCwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCBTdHJpZGUpOworICAgIGFjY3VtICA9IChjbXNVSW50OE51bWJlciopICBpbjsKKyAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKSAgb3V0OwogCi0gICAgc3RyaWRlSW4gPSAwOwotICAgIHN0cmlkZU91dCA9IDA7CisgICAgZm9yIChpPTA7IGkgPCBTaXplOyBpKyspIHsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBMaW5lQ291bnQ7IGkrKykgeworICAgICAgICBhY2N1bSA9IHAgLT4gRnJvbUlucHV0RmxvYXQocCwgZkluLCBhY2N1bSwgU3RyaWRlKTsKIAotICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopaW4gKyBzdHJpZGVJbjsKLSAgICAgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBzdHJpZGVPdXQ7CisgICAgICAgIC8vIEFueSBnYW11dCBjaGFjayB0byBkbz8KKyAgICAgICAgaWYgKHAgLT5HYW11dENoZWNrICE9IE5VTEwpIHsKIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisgICAgICAgICAgICAvLyBFdmFsdWF0ZSBnYW11dCBtYXJrZXIuCisgICAgICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdCggZkluLCAmT3V0T2ZHYW11dCwgcCAtPkdhbXV0Q2hlY2spOwogCi0gICAgICAgICAgICBhY2N1bSA9IHAtPkZyb21JbnB1dEZsb2F0KHAsIGZJbiwgYWNjdW0sIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZUluKTsKKyAgICAgICAgICAgIC8vIElzIGN1cnJlbnQgY29sb3Igb3V0IG9mIGdhbXV0PworICAgICAgICAgICAgaWYgKE91dE9mR2FtdXQgPiAwLjApIHsKIAotICAgICAgICAgICAgLy8gQW55IGdhbXV0IGNoYWNrIHRvIGRvPwotICAgICAgICAgICAgaWYgKHAtPkdhbXV0Q2hlY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIENlcnRhaW5seSwgb3V0IG9mIGdhbXV0CisgICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCBjbXNNQVhDSEFOTkVMUzsgaisrKQorICAgICAgICAgICAgICAgICAgICBmT3V0W2pdID0gLTEuMDsKIAotICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIGdhbXV0IG1hcmtlci4KLSAgICAgICAgICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdChmSW4sICZPdXRPZkdhbXV0LCBwLT5HYW11dENoZWNrKTsKLQotICAgICAgICAgICAgICAgIC8vIElzIGN1cnJlbnQgY29sb3Igb3V0IG9mIGdhbXV0PwotICAgICAgICAgICAgICAgIGlmIChPdXRPZkdhbXV0ID4gMC4wKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2VydGFpbmx5LCBvdXQgb2YgZ2FtdXQKLSAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGNtc01BWENIQU5ORUxTOyBjKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBmT3V0W2NdID0gLTEuMDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8sIHByb2NlZWQgbm9ybWFsbHkKLSAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwLT5MdXQpOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gTm8gZ2FtdXQgY2hlY2sgYXQgYWxsCi0gICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwLT5MdXQpOworICAgICAgICAgICAgICAgIC8vIE5vLCBwcm9jZWVkIG5vcm1hbGx5CisgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwIC0+IEx1dCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAKLQotICAgICAgICAgICAgb3V0cHV0ID0gcC0+VG9PdXRwdXRGbG9hdChwLCBmT3V0LCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7CisgICAgICAgICAgICAvLyBObyBnYW11dCBjaGVjayBhdCBhbGwKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KGZJbiwgZk91dCwgcCAtPiBMdXQpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RyaWRlSW4gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVJbjsKLSAgICAgICAgc3RyaWRlT3V0ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OworICAgICAgICAvLyBCYWNrIHRvIGFza2VkIHJlcHJlc2VudGF0aW9uCisgICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXRGbG9hdChwLCBmT3V0LCBvdXRwdXQsIFN0cmlkZSk7CiAgICAgfQotCiB9CiAKIApAQCAtMzM0LDM0ICsyODMsMjIgQEAKIHZvaWQgTnVsbEZsb2F0WEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCiAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQotCisgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplLAorICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQogewogICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bTsKICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0OwogICAgIGNtc0Zsb2F0MzJOdW1iZXIgZkluW2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgc3RyaWRlSW4sIHN0cmlkZU91dDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKIAotICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKyAgICBhY2N1bSAgPSAoY21zVUludDhOdW1iZXIqKSAgaW47CisgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKikgIG91dDsKKyAgICBuID0gU2l6ZTsKIAotICAgIHN0cmlkZUluID0gMDsKLSAgICBzdHJpZGVPdXQgPSAwOworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKLQotICAgICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopIGluICsgc3RyaWRlSW47Ci0gICAgICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopIG91dCArIHN0cmlkZU91dDsKLQotICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICAgIGFjY3VtID0gcC0+RnJvbUlucHV0RmxvYXQocCwgZkluLCBhY2N1bSwgU3RyaWRlIC0+Qnl0ZXNQZXJQbGFuZUluKTsKLSAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0RmxvYXQocCwgZkluLCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7Ci0gICAgICAgICAgIH0KLQotICAgICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOwotICAgICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgICAgIGFjY3VtICA9IHAgLT4gRnJvbUlucHV0RmxvYXQocCwgZkluLCBhY2N1bSwgU3RyaWRlKTsKKyAgICAgICAgb3V0cHV0ID0gcCAtPiBUb091dHB1dEZsb2F0KHAsIGZJbiwgb3V0cHV0LCBTdHJpZGUpOwogICAgIH0KIH0KIApAQCAtMzcxLDM2ICszMDgsMjMgQEAKIHN0YXRpYwogdm9pZCBOdWxsWEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgdm9pZCogb3V0LAotICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAotICAgICAgICAgICAgICAgY29uc3QgY21zU3RyaWRlKiBTdHJpZGUpCisgICAgICAgICAgICAgICB2b2lkKiBvdXQsIGNtc1VJbnQzMk51bWJlciBTaXplLAorICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKIHsKICAgICBjbXNVSW50OE51bWJlciogYWNjdW07CiAgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKICAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgc3RyaWRlSW4sIHN0cmlkZU91dDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKIAotICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKyAgICBhY2N1bSAgPSAoY21zVUludDhOdW1iZXIqKSAgaW47CisgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKikgIG91dDsKKyAgICBuID0gU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBsZW4KIAotICAgIHN0cmlkZUluID0gMDsKLSAgICBzdHJpZGVPdXQgPSAwOworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKLQotICAgICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopaW4gKyBzdHJpZGVJbjsKLSAgICAgICAgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBzdHJpZGVPdXQ7Ci0KLSAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFBpeGVsc1BlckxpbmU7IGorKykgewotCi0gICAgICAgICAgICAgICAgICBhY2N1bSA9IHAtPkZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVJbik7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXQgPSBwLT5Ub091dHB1dChwLCB3SW4sIG91dHB1dCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0KTsKKyAgICAgICAgYWNjdW0gID0gcCAtPiBGcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlKTsKKyAgICAgICAgb3V0cHV0ID0gcCAtPiBUb091dHB1dChwLCB3SW4sIG91dHB1dCwgU3RyaWRlKTsKICAgICB9Ci0KLSAgICAgICAgICAgc3RyaWRlSW4gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVJbjsKLSAgICAgICAgICAgc3RyaWRlT3V0ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OwotICAgIH0KLQogfQogCiAKQEAgLTQwOCw0MSArMzMyLDI3IEBACiBzdGF0aWMKIHZvaWQgUHJlY2FsY3VsYXRlZFhGT1JNKF9jbXNUUkFOU0ZPUk0qIHAsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCBjbXNVSW50MzJOdW1iZXIgU2l6ZSwgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKIHsKICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW07CiAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dDsKICAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDMyTnVtYmVyIGksIGosIHN0cmlkZUluLCBzdHJpZGVPdXQ7CisgICAgY21zVUludDMyTnVtYmVyIGksIG47CiAKLSAgICBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhwLCBpbiwgb3V0LCBQaXhlbHNQZXJMaW5lLCBMaW5lQ291bnQsIFN0cmlkZSk7CisgICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOworICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7CisgICAgbiA9IFNpemU7CiAKLSAgICBzdHJpZGVJbiA9IDA7Ci0gICAgc3RyaWRlT3V0ID0gMDsKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgewogCi0gICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKWluICsgc3RyaWRlSW47Ci0gICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopb3V0ICsgc3RyaWRlT3V0OwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBQaXhlbHNQZXJMaW5lOyBqKyspIHsKLQotICAgICAgICAgICAgYWNjdW0gPSBwLT5Gcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4pOwotICAgICAgICAgICAgcC0+THV0LT5FdmFsMTZGbih3SW4sIHdPdXQsIHAtPkx1dC0+RGF0YSk7Ci0gICAgICAgICAgICBvdXRwdXQgPSBwLT5Ub091dHB1dChwLCB3T3V0LCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOwotICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgICAgIGFjY3VtID0gcCAtPiBGcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlKTsKKyAgICAgICAgcCAtPkx1dCAtPkV2YWwxNkZuKHdJbiwgd091dCwgcCAtPiBMdXQtPkRhdGEpOworICAgICAgICBvdXRwdXQgPSBwIC0+IFRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlKTsKICAgICB9Ci0KIH0KIAogCi0vLyBBdXhpbGlhcnk6IEhhbmRsZSBwcmVjYWxjdWxhdGVkIGdhbXV0IGNoZWNrLiBUaGUgcmV0cmlldmFsIG9mIGNvbnRleHQgbWF5IGJlIGFsaXR0bGUgYml0IHNsb3csIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjcml0aWNhbC4KKy8vIEF1eGlsaWFyOiBIYW5kbGUgcHJlY2FsY3VsYXRlZCBnYW11dCBjaGVjay4gVGhlIHJldHJpZXZhbCBvZiBjb250ZXh0IG1heSBiZSBhbGl0dGxlIGJpdCBzbG93LCBidXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgY3JpdGljYWwuCiBzdGF0aWMKIHZvaWQgVHJhbnNmb3JtT25lUGl4ZWxXaXRoR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciB3SW5bXSwKQEAgLTQ2OSwzNSArMzc5LDIyIEBACiBzdGF0aWMKIHZvaWQgUHJlY2FsY3VsYXRlZFhGT1JNR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGl4ZWxzUGVyTGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgY21zVUludDMyTnVtYmVyIFNpemUsIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCiB7CiAgICAgY21zVUludDhOdW1iZXIqIGFjY3VtOwogICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7CiAgICAgY21zVUludDE2TnVtYmVyIHdJbltjbXNNQVhDSEFOTkVMU10sIHdPdXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwogCi0gICAgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMocCwgaW4sIG91dCwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCBTdHJpZGUpOworICAgIGFjY3VtICA9IChjbXNVSW50OE51bWJlciopICBpbjsKKyAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKSAgb3V0OworICAgIG4gPSBTaXplOyAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGxlbgogCi0gICAgc3RyaWRlSW4gPSAwOwotICAgIHN0cmlkZU91dCA9IDA7CisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBMaW5lQ291bnQ7IGkrKykgewotCi0gICAgICAgICAgIGFjY3VtID0gKGNtc1VJbnQ4TnVtYmVyKilpbiArIHN0cmlkZUluOwotICAgICAgICAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKW91dCArIHN0cmlkZU91dDsKLQotICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICAgIGFjY3VtID0gcC0+RnJvbUlucHV0KHAsIHdJbiwgYWNjdW0sIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZUluKTsKLSAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybU9uZVBpeGVsV2l0aEdhbXV0Q2hlY2socCwgd0luLCB3T3V0KTsKLSAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0KTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIHN0cmlkZUluICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47Ci0gICAgICAgICAgIHN0cmlkZU91dCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKKyAgICAgICAgYWNjdW0gPSBwIC0+IEZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUpOworICAgICAgICBUcmFuc2Zvcm1PbmVQaXhlbFdpdGhHYW11dENoZWNrKHAsIHdJbiwgd091dCk7CisgICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXQocCwgd091dCwgb3V0cHV0LCBTdHJpZGUpOwogICAgIH0KIH0KIApAQCAtNTA2LDEyMCArNDAzLDk0IEBACiBzdGF0aWMKIHZvaWQgQ2FjaGVkWEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCi0gICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQorICAgICAgICAgICAgICAgICB2b2lkKiBvdXQsIGNtc1VJbnQzMk51bWJlciBTaXplLCBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQogewogICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bTsKICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0OwogICAgIGNtc1VJbnQxNk51bWJlciB3SW5bY21zTUFYQ0hBTk5FTFNdLCB3T3V0W2Ntc01BWENIQU5ORUxTXTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKICAgICBfY21zQ0FDSEUgQ2FjaGU7Ci0gICAgY21zVUludDMyTnVtYmVyIGksIGosIHN0cmlkZUluLCBzdHJpZGVPdXQ7CiAKLSAgICBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhwLCBpbiwgb3V0LCBQaXhlbHNQZXJMaW5lLCBMaW5lQ291bnQsIFN0cmlkZSk7CisgICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOworICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7CisgICAgbiA9IFNpemU7ICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgbGVuCiAKICAgICAvLyBFbXB0eSBidWZmZXJzIGZvciBxdWljayBtZW1jbXAKLSAgICBtZW1zZXQod0luLCAwLCBzaXplb2Yod0luKSk7CisgICAgbWVtc2V0KHdJbiwgIDAsIHNpemVvZih3SW4pKTsKICAgICBtZW1zZXQod091dCwgMCwgc2l6ZW9mKHdPdXQpKTsKIAogICAgIC8vIEdldCBjb3B5IG9mIHplcm8gY2FjaGUKLSAgICBtZW1jcHkoJkNhY2hlLCAmcC0+Q2FjaGUsIHNpemVvZihDYWNoZSkpOworICAgIG1lbWNweSgmQ2FjaGUsICZwIC0+Q2FjaGUsIHNpemVvZihDYWNoZSkpOwogCi0gICAgc3RyaWRlSW4gPSAwOwotICAgIHN0cmlkZU91dCA9IDA7CisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBMaW5lQ291bnQ7IGkrKykgeworICAgICAgICBhY2N1bSA9IHAgLT4gRnJvbUlucHV0KHAsIHdJbiwgYWNjdW0sIFN0cmlkZSk7CiAKLSAgICAgICAgYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKWluICsgc3RyaWRlSW47Ci0gICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopb3V0ICsgc3RyaWRlT3V0OworICAgICAgICBpZiAobWVtY21wKHdJbiwgQ2FjaGUuQ2FjaGVJbiwgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKSA9PSAwKSB7CiAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFBpeGVsc1BlckxpbmU7IGorKykgeworICAgICAgICAgICAgbWVtY3B5KHdPdXQsIENhY2hlLkNhY2hlT3V0LCBzaXplb2YoQ2FjaGUuQ2FjaGVPdXQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKIAotICAgICAgICAgICAgYWNjdW0gPSBwLT5Gcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4pOworICAgICAgICAgICAgcCAtPkx1dCAtPkV2YWwxNkZuKHdJbiwgd091dCwgcCAtPiBMdXQtPkRhdGEpOwogCi0gICAgICAgICAgICBpZiAobWVtY21wKHdJbiwgQ2FjaGUuQ2FjaGVJbiwgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkod091dCwgQ2FjaGUuQ2FjaGVPdXQsIHNpemVvZihDYWNoZS5DYWNoZU91dCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcC0+THV0LT5FdmFsMTZGbih3SW4sIHdPdXQsIHAtPkx1dC0+RGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVJbiwgd0luLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpOwotICAgICAgICAgICAgICAgIG1lbWNweShDYWNoZS5DYWNoZU91dCwgd091dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0KTsKKyAgICAgICAgICAgIG1lbWNweShDYWNoZS5DYWNoZUluLCAgd0luLCAgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKTsKKyAgICAgICAgICAgIG1lbWNweShDYWNoZS5DYWNoZU91dCwgd091dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CiAgICAgICAgIH0KIAotICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOwotICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXQocCwgd091dCwgb3V0cHV0LCBTdHJpZGUpOwogICAgIH0KKwogfQogCisKIC8vIEFsbCB0aG9zZSBuaWNlIGZlYXR1cmVzIHRvZ2V0aGVyCiBzdGF0aWMKIHZvaWQgQ2FjaGVkWEZPUk1HYW11dENoZWNrKF9jbXNUUkFOU0ZPUk0qIHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCBjbXNVSW50MzJOdW1iZXIgU2l6ZSwgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKIHsKLSAgICBjbXNVSW50OE51bWJlciogYWNjdW07Ci0gICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKLSAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107Ci0gICAgX2Ntc0NBQ0hFIENhY2hlOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bTsKKyAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0OworICAgICAgIGNtc1VJbnQxNk51bWJlciB3SW5bY21zTUFYQ0hBTk5FTFNdLCB3T3V0W2Ntc01BWENIQU5ORUxTXTsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKKyAgICAgICBfY21zQ0FDSEUgQ2FjaGU7CiAKLSAgICBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhwLCBpbiwgb3V0LCBQaXhlbHNQZXJMaW5lLCBMaW5lQ291bnQsIFN0cmlkZSk7CisgICAgICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOworICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7CisgICAgICAgbiA9IFNpemU7ICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgbGVuCiAKLSAgICAvLyBFbXB0eSBidWZmZXJzIGZvciBxdWljayBtZW1jbXAKLSAgICBtZW1zZXQod0luLCAwLCBzaXplb2Yod0luKSk7Ci0gICAgbWVtc2V0KHdPdXQsIDAsIHNpemVvZih3T3V0KSk7CisgICAgICAgLy8gRW1wdHkgYnVmZmVycyBmb3IgcXVpY2sgbWVtY21wCisgICAgICAgbWVtc2V0KHdJbiwgIDAsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpICogY21zTUFYQ0hBTk5FTFMpOworICAgICAgIG1lbXNldCh3T3V0LCAwLCBzaXplb2YoY21zVUludDE2TnVtYmVyKSAqIGNtc01BWENIQU5ORUxTKTsKIAotICAgIC8vIEdldCBjb3B5IG9mIHplcm8gY2FjaGUKLSAgICBtZW1jcHkoJkNhY2hlLCAmcC0+Q2FjaGUsIHNpemVvZihDYWNoZSkpOworICAgICAgIC8vIEdldCBjb3B5IG9mIHplcm8gY2FjaGUKKyAgICAgICBtZW1jcHkoJkNhY2hlLCAmcCAtPkNhY2hlLCBzaXplb2YoQ2FjaGUpKTsKIAotICAgIHN0cmlkZUluID0gMDsKLSAgICBzdHJpZGVPdXQgPSAwOworICAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKLQotICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopaW4gKyBzdHJpZGVJbjsKLSAgICAgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBzdHJpZGVPdXQ7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFBpeGVsc1BlckxpbmU7IGorKykgewotCi0gICAgICAgICAgICBhY2N1bSA9IHAtPkZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVJbik7CisgICAgICAgICAgICBhY2N1bSA9IHAgLT4gRnJvbUlucHV0KHAsIHdJbiwgYWNjdW0sIFN0cmlkZSk7CiAKICAgICAgICAgICAgIGlmIChtZW1jbXAod0luLCBDYWNoZS5DYWNoZUluLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpID09IDApIHsKLQotICAgICAgICAgICAgICAgIG1lbWNweSh3T3V0LCBDYWNoZS5DYWNoZU91dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh3T3V0LCBDYWNoZS5DYWNoZU91dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm1PbmVQaXhlbFdpdGhHYW11dENoZWNrKHAsIHdJbiwgd091dCk7Ci0KLSAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVJbiwgd0luLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpOwotICAgICAgICAgICAgICAgIG1lbWNweShDYWNoZS5DYWNoZU91dCwgd091dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CisgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybU9uZVBpeGVsV2l0aEdhbXV0Q2hlY2socCwgd0luLCB3T3V0KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KENhY2hlLkNhY2hlSW4sIHdJbiwgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KENhY2hlLkNhY2hlT3V0LCB3T3V0LCBzaXplb2YoQ2FjaGUuQ2FjaGVPdXQpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb3V0cHV0ID0gcC0+VG9PdXRwdXQocCwgd091dCwgb3V0cHV0LCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVPdXQpOwotICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXQgPSBwIC0+IFRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlKTsKKyAgICAgICB9CiAKLSAgICAgICAgc3RyaWRlSW4gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVJbjsKLSAgICAgICAgc3RyaWRlT3V0ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OwotICAgIH0KIH0KIAotLy8gVHJhbnNmb3JtIHBsdWctaW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gTGlzdCBvZiB1c2VkLWRlZmluZWQgdHJhbnNmb3JtIGZhY3RvcmllcwogdHlwZWRlZiBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QgewogCi0gICAgX2Ntc1RyYW5zZm9ybTJGYWN0b3J5ICBGYWN0b3J5OwotICAgIGNtc0Jvb2wgICAgICAgICAgICAgICAgT2xkWGZvcm07ICAgLy8gRmFjdG9yeSByZXR1cm5zIHhmb3JtIGZ1bmN0aW9uIGluIHRoZSBvbGQgc3R5bGUKLQorICAgIF9jbXNUcmFuc2Zvcm1GYWN0b3J5ICBGYWN0b3J5OwogICAgIHN0cnVjdCBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbl9zdCAqTmV4dDsKIAogfSBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbjsKQEAgLTY2Miw3ICs1MzMsNiBAQAogICBjdHggLT5jaHVua3NbVHJhbnNmb3JtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSkpOwogfQogCi0vLyBBbGxvY2F0ZXMgbWVtb3J5IGZvciB0cmFuc2Zvcm0gcGx1Z2luIGZhY3RvcnkKIHZvaWQgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKIHsKQEAgLTY3NywzNSArNTQ3LDYgQEAKICAgICB9CiB9CiAKLS8vIEFkYXB0b3IgZm9yIG9sZCB2ZXJzaW9ucyBvZiBwbHVnLWluCi1zdGF0aWMKLXZvaWQgX2Ntc1RyYW5zZm9ybTJ0b1RyYW5zZm9ybUFkYXB0b3Ioc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQotewotCi0gICAgICAgY21zVUludDMyTnVtYmVyIGksIHN0cmlkZUluLCBzdHJpZGVPdXQ7Ci0KLSAgICAgICBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhDTU1jYXJnbywgSW5wdXRCdWZmZXIsIE91dHB1dEJ1ZmZlciwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCBTdHJpZGUpOwotCi0gICAgICAgc3RyaWRlSW4gPSAwOwotICAgICAgIHN0cmlkZU91dCA9IDA7Ci0KLSAgICAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKLQotICAgICAgICAgICAgICB2b2lkICphY2N1bSA9IChjbXNVSW50OE51bWJlciopSW5wdXRCdWZmZXIgKyBzdHJpZGVJbjsKLSAgICAgICAgICAgICAgdm9pZCAqb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKilPdXRwdXRCdWZmZXIgKyBzdHJpZGVPdXQ7Ci0KLSAgICAgICAgICAgICAgQ01NY2FyZ28tPk9sZFhmb3JtKENNTWNhcmdvLCBhY2N1bSwgb3V0cHV0LCBQaXhlbHNQZXJMaW5lLCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVJbik7Ci0KLSAgICAgICAgICAgICAgc3RyaWRlSW4gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVJbjsKLSAgICAgICAgICAgICAgc3RyaWRlT3V0ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OwotICAgICAgIH0KLX0KLQogCiAKIC8vIFJlZ2lzdGVyIG5ldyB3YXlzIHRvIHRyYW5zZm9ybQpAQCAtNzIzLDIyICs1NjQsMTQgQEAKICAgICB9CiAKICAgICAvLyBGYWN0b3J5IGNhbGxiYWNrIGlzIHJlcXVpcmVkCi0gICAgaWYgKFBsdWdpbi0+ZmFjdG9yaWVzLnhmb3JtID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoUGx1Z2luIC0+RmFjdG9yeSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKIAogICAgIGZsID0gKF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKikgX2Ntc1BsdWdpbk1hbGxvYyhDb250ZXh0SUQsIHNpemVvZihfY21zVHJhbnNmb3JtQ29sbGVjdGlvbikpOwogICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKLSAgICAvLyBDaGVjayBmb3IgZnVsbCB4Zm9ybSBwbHVnLWlucyBwcmV2aW91cyB0byAyLjgsIHdlIHdvdWxkIG5lZWQgYW4gYWRhcHRlciBpbiB0aGF0IGNhc2UKLSAgICBpZiAoUGx1Z2luLT5iYXNlLkV4cGVjdGVkVmVyc2lvbiA8IDIwODApIHsKLQotICAgICAgICAgICBmbC0+T2xkWGZvcm0gPSBUUlVFOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgICAgIGZsLT5PbGRYZm9ybSA9IEZBTFNFOwotCiAgICAgLy8gQ29weSB0aGUgcGFyYW1ldGVycwotICAgIGZsLT5GYWN0b3J5ID0gUGx1Z2luLT5mYWN0b3JpZXMueGZvcm07CisgICAgZmwgLT5GYWN0b3J5ID0gUGx1Z2luIC0+RmFjdG9yeTsKIAogICAgIC8vIEtlZXAgbGlua2VkIGxpc3QKICAgICBmbCAtPk5leHQgPSBjdHgtPlRyYW5zZm9ybUNvbGxlY3Rpb247CkBAIC04MjMsMTIgKzY1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+RnJvbUlucHV0RmxvYXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKklucHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPlRvT3V0cHV0RmxvYXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU19GTE9BVCkuRm10RmxvYXQ7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBkYXk/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBsdWdpbi0+T2xkWGZvcm0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+T2xkWGZvcm0gPSAoX2Ntc1RyYW5zZm9ybUZuKSBwLT54Zm9ybTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+eGZvcm0gPSBfY21zVHJhbnNmb3JtMnRvVHJhbnNmb3JtQWRhcHRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQpAQCAtOTg5LDIyICs4MTYsNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIEp1bi0yMS0yMDAwOiBTb21lIHByb2ZpbGVzICh0aG9zZSB0aGF0IGNvbWVzIHdpdGggVzJLKSBjb21lcwotLy8gd2l0aCB0aGUgbWVkaWEgd2hpdGUgKG1lZGlhIGJsYWNrPykgeCAxMDAuIEFkZCBhIHNhbml0eSBjaGVjawotCi1zdGF0aWMKLXZvaWQgTm9ybWFsaXplWFlaKGNtc0NJRVhZWiogRGVzdCkKLXsKLSAgICB3aGlsZSAoRGVzdCAtPiBYID4gMi4gJiYKLSAgICAgICAgICAgRGVzdCAtPiBZID4gMi4gJiYKLSAgICAgICAgICAgRGVzdCAtPiBaID4gMi4pIHsKLQotICAgICAgICAgICAgICAgRGVzdCAtPiBYIC89IDEwLjsKLSAgICAgICAgICAgICAgIERlc3QgLT4gWSAvPSAxMC47Ci0gICAgICAgICAgICAgICBEZXN0IC0+IFogLz0gMTAuOwotICAgICAgIH0KLX0KLQogc3RhdGljCiB2b2lkIFNldFdoaXRlUG9pbnQoY21zQ0lFWFlaKiB3dFB0LCBjb25zdCBjbXNDSUVYWVoqIHNyYykKIHsKQEAgLTEwMTcsOCArODI4LDYgQEAKICAgICAgICAgd3RQdCAtPlggPSBzcmMtPlg7CiAgICAgICAgIHd0UHQgLT5ZID0gc3JjLT5ZOwogICAgICAgICB3dFB0IC0+WiA9IHNyYy0+WjsKLQotICAgICAgICBOb3JtYWxpemVYWVood3RQdCk7CiAgICAgfQogCiB9CkBAIC0xMzI5LDYgKzExMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQpCiB7CisKICAgICBfY21zVFJBTlNGT1JNKiB4Zm9ybSA9IChfY21zVFJBTlNGT1JNKikgaFRyYW5zZm9ybTsKICAgICBjbXNGb3JtYXR0ZXIxNiBGcm9tSW5wdXQsIFRvT3V0cHV0OwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyLmgKaW5kZXggOWYxNDhlNS4uMGQ2NmIyNiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9sY21zMi5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczIuaApAQCAtMzAsNyArMzAsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCiAvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCiAvLwogLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCkBAIC01Miw3ICs1Miw3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCi0vLyBWZXJzaW9uIDIuOAorLy8gVmVyc2lvbiAyLjcKIC8vCiAKICNpZm5kZWYgX2xjbXMyX0gKQEAgLTEwNCw3ICsxMDQsNyBAQAogI2VuZGlmCiAKIC8vIFZlcnNpb24vcmVsZWFzZQotI2RlZmluZSBMQ01TX1ZFUlNJT04gICAgICAgIDIwODAKKyNkZWZpbmUgTENNU19WRVJTSU9OICAgICAgICAyMDcwCiAKIC8vIEkgd2lsbCBnaXZlIHRoZSBjaGFuY2Ugb2YgcmVkZWZpbmluZyBiYXNpYyB0eXBlcyBmb3IgY29tcGlsZXJzIHRoYXQgYXJlIG5vdCBmdWxseSBDOTkgY29tcGxpYW50CiAjaWZuZGVmIENNU19CQVNJQ19UWVBFU19BTFJFQURZX0RFRklORUQKQEAgLTIwMiw0NCArMjAyLDQzIEBACiAjICBkZWZpbmUgQ01TX0lTX1dJTkRPV1NfIDEKICNlbmRpZgogCi0vLyBUcnkgdG8gZGV0ZWN0IGJpZyBlbmRpYW4gcGxhdGZvcm1zLiBUaGlzIGxpc3QgY2FuIGJlIGVuZGxlc3MsIHNvIHByaW1hcmlseSByZWx5IG9uIHRoZSBjb25maWd1cmUgc2NyaXB0Ci0vLyBvbiBVbml4LWxpa2Ugc3lzdGVtcywgYW5kIGFsbG93IGl0IHRvIGJlIHNldCBvbiB0aGUgY29tcGlsZXIgY29tbWFuZCBsaW5lIHVzaW5nCi0vLyAtRENNU19VU0VfQklHX0VORElBTiBvciBzb21ldGhpbmcgc2ltaWxhcgotI2lmZGVmIENNU19VU0VfQklHX0VORElBTiAvLyBzZXQgYXQgY29tcGlsZXIgY29tbWFuZCBsaW5lIHRha2VzIG92ZXJhbGwgcHJlY2VkZW5jZQorLy8gVHJ5IHRvIGRldGVjdCBiaWcgZW5kaWFuIHBsYXRmb3Jtcy4gVGhpcyBsaXN0IGNhbiBiZSBlbmRsZXNzLCBzbyBvbmx5IHNvbWUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb3ZlciBoZXJlLgorLy8geW91IGNhbiBwYXNzIHRoaXMgdG9nZ2xlIHRvIHRoZSBjb21waWxlciBieSB1c2luZyAtRENNU19VU0VfQklHX0VORElBTiBvciBzb21ldGhpbmcgc2ltaWxhcgogCi0jICBpZiBDTVNfVVNFX0JJR19FTkRJQU4gPT0gMAotIyAgICB1bmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KLSMgIGVuZGlmCisjaWYgZGVmaW5lZChfX3NnaV9fKSB8fCBkZWZpbmVkKF9fc2dpKSB8fCBkZWZpbmVkKHNwYXJjKQorIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCisjZW5kaWYKIAotI2Vsc2UgLy8gQ01TX1VTRV9CSUdfRU5ESUFOCisjaWYgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3MzOTB4X18pCisjICAgZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAgIDEKKyNlbmRpZgogCi0jICBpZmRlZiBXT1JEU19CSUdFTkRJQU4gLy8gc2V0IGJ5IGNvbmZpZ3VyZSAob3IgZXhwbGljaXRseSBvbiBjb21waWxlciBjb21tYW5kIGxpbmUpCi0jICAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gMQotIyAgZWxzZSAvLyBXT1JEU19CSUdFTkRJQU4KLS8vIEZhbGwgYmFjayB0byBwbGF0Zm9ybS9jb21waWxlciBzcGVjaWZpYyB0ZXN0cwotIyAgICBpZiBkZWZpbmVkKF9fc2dpX18pIHx8IGRlZmluZWQoX19zZ2kpIHx8IGRlZmluZWQoc3BhcmMpCi0jICAgICAgZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAgICAgIDEKLSMgICAgZW5kaWYKIAotIyAgICBpZiBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykKLSMgICAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQotIyAgICBlbmRpZgorI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChUQVJHRVRfQ1BVX1BQQykKKyMgIGlmIF9fcG93ZXJwY19fIHx8IF9fcHBjX18gfHwgVEFSR0VUX0NQVV9QUEMKKyMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQorIyAgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQllURV9PUkRFUl9fKSAmJiBkZWZpbmVkKF9fT1JERVJfTElUVExFX0VORElBTl9fKQorIyAgICAgICBpZiBfX0JZVEVfT1JERVJfXyAgPT0gX19PUkRFUl9MSVRUTEVfRU5ESUFOX18KKyAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgYmlnIGVuZGlhbiBmb3IgUG93ZXJQQyBsaXR0bGUgZW5kaWFuIG1vZGUKKyMgICAgICAgICAgICAgICAgdW5kZWYgQ01TX1VTRV9CSUdfRU5ESUFOCisjICAgICAgIGVuZGlmCisjICAgICBlbmRpZgorIyAgIGVuZGlmCisjZW5kaWYKIAotIyAgICBpZmRlZiBtYWNpbnRvc2gKLSMgICAgICBpZmRlZiBfX0JJR19FTkRJQU5fXwotIyAgICAgICAgZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAgICAgIDEKLSMgICAgICBlbmRpZgotIyAgICAgIGlmZGVmIF9fTElUVExFX0VORElBTl9fCi0jICAgICAgICB1bmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYgIC8vIFdPUkRTX0JJR0VORElBTgorI2lmZGVmIG1hY2ludG9zaAorIyBpZmRlZiBfX0JJR19FTkRJQU5fXworIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCisjIGVuZGlmCisjIGlmZGVmIF9fTElUVExFX0VORElBTl9fCisjICAgdW5kZWYgQ01TX1VTRV9CSUdfRU5ESUFOCisjIGVuZGlmCisjZW5kaWYKIAotIyAgaWYgZGVmaW5lZChfSE9TVF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKQotIyAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQotIyAgZW5kaWYKLQotI2VuZGlmICAvLyBDTVNfVVNFX0JJR19FTkRJQU4KKy8vIFdPUkRTX0JJR0VORElBTiB0YWtlcyBwcmVjZWRlbmNlCisjaWYgZGVmaW5lZChfSE9TVF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQorI2VuZGlmCiAKIAogLy8gQ2FsbGluZyBjb252ZW50aW9uIC0tIHRoaXMgaXMgaGFyZGx5IHBsYXRmb3JtIGFuZCBjb21waWxlciBkZXBlbmRlbnQKQEAgLTI0OSw3ICsyNDgsNyBAQAogIyAgICAgICAgZGVmaW5lIENNU0VYUE9SVCAgICAgICBfX3N0ZGNhbGwgX2V4cG9ydAogIyAgICAgICAgZGVmaW5lIENNU0FQSQogIyAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIENNU0VYUE9SVCAgICAgIF9fc3RkY2FsbAorIyAgICAgICAgZGVmaW5lIENNU0VYUE9SVCAgICAgIF9zdGRjYWxsCiAjICAgICAgICBpZmRlZiBDTVNfRExMX0JVSUxECiAjICAgICAgICAgICAgZGVmaW5lIENNU0FQSSAgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKICMgICAgICAgIGVsc2UKQEAgLTQxMSw4ICs0MTAsNyBAQAogICAgIGNtc1NpZ1ZpZXdpbmdDb25kRGVzY1RhZyAgICAgICAgICAgICAgICA9IDB4NzY3NTY1NjQsICAvLyAndnVlZCcKICAgICBjbXNTaWdWaWV3aW5nQ29uZGl0aW9uc1RhZyAgICAgICAgICAgICAgPSAweDc2Njk2NTc3LCAgLy8gJ3ZpZXcnCiAgICAgY21zU2lnVmNndFRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3NjYzNjc3NCwgIC8vICd2Y2d0JwotICAgIGNtc1NpZ01ldGFUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NkQ2NTc0NjEsICAvLyAnbWV0YScKLSAgICBjbXNTaWdBcmd5bGxBcnRzVGFnICAgICAgICAgICAgICAgICAgICAgPSAweDYxNzI3NDczICAgLy8gJ2FydHMnCisgICAgY21zU2lnTWV0YVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2RDY1NzQ2MSAgIC8vICdtZXRhJwogCiB9IGNtc1RhZ1NpZ25hdHVyZTsKIApAQCAtNjg1LDcgKzY4Myw3IEBACiAvLyAgICAgICAgICAgIFQ6IFBpeGVsdHlwZQogLy8gICAgICAgICAgICBGOiBGbGF2b3IgIDA9TWluSXNCbGFjayhDaG9jb2xhdGUpIDE9TWluSXNXaGl0ZShWYW5pbGxhKQogLy8gICAgICAgICAgICBQOiBQbGFuYXI/IDA9Q2h1bmt5LCAxPVBsYW5hcgotLy8gICAgICAgICAgICBYOiBzd2FwIDE2IGJwcyBlbmRpYW5uZXNzPworLy8gICAgICAgICAgICBYOiBzd2FwIDE2IGJwcyBlbmRpYW5lc3M/CiAvLyAgICAgICAgICAgIFM6IERvIHN3YXA/IGllLCBCR1IsIEtZTUMKIC8vICAgICAgICAgICAgRTogRXh0cmEgc2FtcGxlcwogLy8gICAgICAgICAgICBDOiBDaGFubmVscyAoU2FtcGxlcyBwZXIgcGl4ZWwpCkBAIC05MjgsNyArOTI2LDcgQEAKICNkZWZpbmUgVFlQRV9BUkdCX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCl8U1dBUEZJUlNUX1NIKDEpKQogI2RlZmluZSBUWVBFX0JHUl9GTFQgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KXxET1NXQVBfU0goMSkpCiAjZGVmaW5lIFRZUEVfQkdSQV9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSkpCi0jZGVmaW5lIFRZUEVfQUJHUl9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9BQkdSX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCl8RE9TV0FQX1NIKDEpKQogCiAjZGVmaW5lIFRZUEVfQ01ZS19GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCg0KSkKIApAQCAtMTA0NSw3ICsxMDQzLDcgQEAKIC8vIENvbnRleHQgaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gRWFjaCBjb250ZXh0IGhvbGRzIGl0cyBvd25zIGdsb2JhbHMgYW5kIGl0cyBvd24gcGx1Zy1pbnMuIFRoZXJlIGlzIGEgZ2xvYmFsIGNvbnRleHQgd2l0aCB0aGUgaWQgPSAwIGZvciBsZWNhY3kgY29tcGF0aWJpbGl0eQotLy8gdGhvdWdoIHVzaW5nIHRoZSBnbG9iYWwgY29udGV4dCBpcyBub3QgcmVjb21tZW5kZWQuIFByb3BlciBjb250ZXh0IGhhbmRsaW5nIG1ha2VzIGxjbXMgbW9yZSB0aHJlYWQtc2FmZS4KKy8vIHRob3VnaCB1c2luZyB0aGUgZ2xvYmFsIGNvbnRleHQgaXMgbm90IHJlY29tZW5kZWQuIFByb3BlciBjb250ZXh0IGhhbmRsaW5nIG1ha2VzIGxjbXMgbW9yZSB0aHJlYWQtc2FmZS4KIAogdHlwZWRlZiBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjbXNDb250ZXh0OwogCkBAIC0xNDE0LDcgKzE0MTIsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogCiAgICAgY21zVUludDMyTnVtYmVyIG47Ci0gICAgY21zQ29udGV4dCAgICAgIENvbnRleHRJRDsKKyAgICBjbXNDb250ZXh0ICAgICBDb250ZXh0SUQ7CiAgICAgY21zUFNFUURFU0MqICAgIHNlcTsKIAogfSBjbXNTRVE7CkBAIC0xNjgxLDggKzE2NzksNiBAQAogLy8gU3BlY2lmaWMgdG8gdW5ib3VuZGVkIG1vZGUKICNkZWZpbmUgY21zRkxBR1NfTk9ORUdBVElWRVMgICAgICAgICAgICAgIDB4ODAwMCAgICAvLyBQcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgaW4gZmxvYXRpbmcgcG9pbnQgdHJhbnNmb3JtcwogCi0vLyBDb3B5IGFscGhhIGNoYW5uZWxzIHdoZW4gdHJhbnNmb3JtaW5nCi0jZGVmaW5lIGNtc0ZMQUdTX0NPUFlfQUxQSEEgICAgICAgICAgICAgICAweDA0MDAwMDAwIC8vIEFscGhhIGNoYW5uZWxzIGFyZSBjb3BpZWQgb24gY21zRG9UcmFuc2Zvcm0oKQogCiAvLyBGaW5lLXR1bmUgY29udHJvbCBvdmVyIG51bWJlciBvZiBncmlkcG9pbnRzCiAjZGVmaW5lIGNtc0ZMQUdTX0dSSURQT0lOVFMobikgICAgICAgICAgICgoKG4pICYgMHhGRikgPDwgMTYpCkBAIC0xNzYxLDIyICsxNzU3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIE91dHB1dEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZSk7CiAKLUNNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNEb1RyYW5zZm9ybVN0cmlkZShjbXNIVFJBTlNGT1JNIFRyYW5zZm9ybSwgICAvLyBEZXByZWNhdGVkCitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRG9UcmFuc2Zvcm1TdHJpZGUoY21zSFRSQU5TRk9STSBUcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIElucHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBPdXRwdXRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7CiAKLUNNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNEb1RyYW5zZm9ybUxpbmVTdHJpZGUoY21zSFRSQU5TRk9STSAgVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGl4ZWxzUGVyTGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlckxpbmVJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJMaW5lT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyUGxhbmVPdXQpOwotCiAKIENNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRBbGFybUNvZGVzKGNvbnN0IGNtc1VJbnQxNk51bWJlciBOZXdBbGFybVtjbXNNQVhDSEFOTkVMU10pOwogQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldEFsYXJtQ29kZXMoY21zVUludDE2TnVtYmVyIE5ld0FsYXJtW2Ntc01BWENIQU5ORUxTXSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX2ludGVybmFsLmggYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX2ludGVybmFsLmgKaW5kZXggOTAwOTQ3Mi4uYzZjZmJkNiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9sY21zMl9pbnRlcm5hbC5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfaW50ZXJuYWwuaApAQCAtMzAsNyArMzAsNyBAQAogCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtODYsMTUgKzg2LDcgQEAKICNkZWZpbmUgX2Ntc0FMSUdOTE9ORyh4KSAoKCh4KSsoc2l6ZW9mKGNtc1VJbnQzMk51bWJlciktMSkpICYgfihzaXplb2YoY21zVUludDMyTnVtYmVyKS0xKSkKIAogLy8gQWxpZ25tZW50IHRvIG1lbW9yeSBwb2ludGVyCi0KLS8vIChVbHRyYSlTUEFSQyB3aXRoIGdjYyByZXF1aXJlcyBwdHIgYWxpZ25tZW50IG9mIDggYnl0ZXMKLS8vIGV2ZW4gdGhvdWdoIHNpemVvZih2b2lkICopIGlzIG9ubHkgZm91cjogZm9yIGdyZWF0ZXN0IGZsZXhpYmlsaXR5Ci0vLyBhbGxvdyB0aGUgYnVpbGQgdG8gc3BlY2lmeSBwdHIgYWxpZ25tZW50LgotI2lmbmRlZiBDTVNfUFRSX0FMSUdOTUVOVAotIyBkZWZpbmUgQ01TX1BUUl9BTElHTk1FTlQgc2l6ZW9mKHZvaWQgKikKLSNlbmRpZgotCi0jZGVmaW5lIF9jbXNBTElHTk1FTSh4KSAgKCgoeCkrKENNU19QVFJfQUxJR05NRU5UIC0gMSkpICYgfihDTVNfUFRSX0FMSUdOTUVOVCAtIDEpKQorI2RlZmluZSBfY21zQUxJR05NRU0oeCkgICgoKHgpKyhzaXplb2Yodm9pZCAqKSAtIDEpKSAmIH4oc2l6ZW9mKHZvaWQgKikgLSAxKSkKIAogLy8gTWF4aW11bSBlbmNvZGVhYmxlIHZhbHVlcyBpbiBmbG9hdGluZyBwb2ludAogI2RlZmluZSBNQVhfRU5DT0RFQUJMRV9YWVogICgxLjAgKyAzMjc2Ny4wLzMyNzY4LjApCkBAIC0xMzAsNyArMTIyLDcgQEAKIAogLy8gQSBmYXN0IHdheSB0byBjb252ZXJ0IGZyb20vdG8gMTYgPC0+IDggYml0cwogI2RlZmluZSBGUk9NXzhfVE9fMTYocmdiKSAoY21zVUludDE2TnVtYmVyKSAoKCgoY21zVUludDE2TnVtYmVyKSAocmdiKSkgPDwgOCl8KHJnYikpCi0jZGVmaW5lIEZST01fMTZfVE9fOChyZ2IpIChjbXNVSW50OE51bWJlcikgKCgoKGNtc1VJbnQzMk51bWJlcikocmdiKSAqIDY1MjgxVSArIDgzODg2MDhVKSA+PiAyNCkgJiAweEZGVSkKKyNkZWZpbmUgRlJPTV8xNl9UT184KHJnYikgKGNtc1VJbnQ4TnVtYmVyKSAoKCgocmdiKSAqIDY1MjgxICsgODM4ODYwOCkgPj4gMjQpICYgMHhGRikKIAogLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cwogI2lmZGVmIF9NU0NfVkVSCkBAIC02OTksOCArNjkxLDggQEAKICAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKIAogICAgIC8vIFRoZSBkaXJlY3RvcnkKLSAgICBjbXNVSW50MzJOdW1iZXIgIEFsbG9jYXRlZEVudHJpZXM7Ci0gICAgY21zVUludDMyTnVtYmVyICBVc2VkRW50cmllczsKKyAgICBpbnQgQWxsb2NhdGVkRW50cmllczsKKyAgICBpbnQgVXNlZEVudHJpZXM7CiAgICAgX2Ntc01MVWVudHJ5KiBFbnRyaWVzOyAgICAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gc3RyaW5ncyBhbGxvY2F0ZWQgaW4gTWVtUG9vbAogCiAgICAgLy8gVGhlIFBvb2wKQEAgLTc2OCw3ICs3NjAsNyBAQAogICAgIC8vIERpY3Rpb25hcnkKICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgVGFnQ291bnQ7CiAgICAgY21zVGFnU2lnbmF0dXJlICAgICAgICAgIFRhZ05hbWVzW01BWF9UQUJMRV9UQUddOwotICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdMaW5rZWRbTUFYX1RBQkxFX1RBR107ICAgICAgICAgICAvLyBUaGUgdGFnIHRvIHdoaWNoIGlzIGxpbmtlZCAoMD1ub25lKQorICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdMaW5rZWRbTUFYX1RBQkxFX1RBR107ICAgICAgICAgICAvLyBUaGUgdGFnIHRvIHdpY2ggaXMgbGlua2VkICgwPW5vbmUpCiAgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ1NpemVzW01BWF9UQUJMRV9UQUddOyAgICAgICAgICAgIC8vIFNpemUgb24gZGlzawogICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBUYWdPZmZzZXRzW01BWF9UQUJMRV9UQUddOwogICAgIGNtc0Jvb2wgICAgICAgICAgICAgICAgICBUYWdTYXZlQXNSYXdbTUFYX1RBQkxFX1RBR107ICAgICAgICAvLyBUcnVlIHRvIHdyaXRlIHVuY29va2VkCkBAIC05OTYsNyArOTg4LDcgQEAKICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdDsgLy8gS2VlcCBmb3JtYXRzIGZvciBmdXJ0aGVyIHJlZmVyZW5jZQogCiAgICAgLy8gUG9pbnRzIHRvIHRyYW5zZm9ybSBjb2RlCi0gICAgX2Ntc1RyYW5zZm9ybTJGbiB4Zm9ybTsKKyAgICBfY21zVHJhbnNmb3JtRm4geGZvcm07CiAKICAgICAvLyBGb3JtYXR0ZXJzLCBjYW5ub3QgYmUgZW1iZWRkZWQgaW50byBMVVQgYmVjYXVzZSBjYWNoZQogICAgIGNtc0Zvcm1hdHRlcjE2IEZyb21JbnB1dDsKQEAgLTEwNDIsMjAgKzEwMzQsOSBAQAogICAgIHZvaWQqIFVzZXJEYXRhOwogICAgIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlVXNlckRhdGE7CiAKLSAgICAvLyBBIHdheSB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggZnVsbCB4Zm9ybSBwbHVnaW5zCi0gICAgX2Ntc1RyYW5zZm9ybUZuIE9sZFhmb3JtOwotCiB9IF9jbXNUUkFOU0ZPUk07CiAKLS8vIENvcGllcyBleHRyYSBjaGFubmVscyBmcm9tIGlucHV0IHRvIG91dHB1dCBpZiB0aGUgb3JpZ2luYWwgZmxhZ3MgaW4gdGhlIHRyYW5zZm9ybSBzdHJ1Y3R1cmUKLS8vIGluc3RydWN0cyB0byBkbyBzby4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gYWxsIHN0YW5kYXJkIHRyYW5zZm9ybSBmdW5jdGlvbnMuCi12b2lkIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKF9jbXNUUkFOU0ZPUk0qIHAsIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgICBDb250ZXh0SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUHJvZmlsZXMsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX3BsdWdpbi5oIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9sY21zMl9wbHVnaW4uaAppbmRleCBhZmYzYjQ4Li43N2ZmMjI4IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL2xjbXMyX3BsdWdpbi5oCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvY21tL2xjbXMvbGNtczJfcGx1Z2luLmgKQEAgLTMwLDcgKzMwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwogLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgogLy8KIC8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogQnVmZmVyKTsKIH07CiAKLS8vIEVuZGlhbm5lc3MgYWRqdXN0IGZ1bmN0aW9ucworLy8gRW5kaWFuZXNzIGFkanVzdCBmdW5jdGlvbnMKIENNU0FQSSBjbXNVSW50MTZOdW1iZXIgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3MxNihjbXNVSW50MTZOdW1iZXIgV29yZCk7CiBDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zVUludDMyTnVtYmVyIFZhbHVlKTsKIENNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NChjbXNVSW50NjROdW1iZXIqIFJlc3VsdCwgY21zVUludDY0TnVtYmVyKiBRV29yZCk7CkBAIC0zNzEsOCArMzcxLDggQEAKIAogdHlwZWRlZiBjbXNVSW50OE51bWJlciogKCogY21zRm9ybWF0dGVyMTYpKHJlZ2lzdGVyIHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCogQ01NY2FyZ28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIFZhbHVlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqICBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyICBTdHJpZGUpOwogCiB0eXBlZGVmIGNtc1VJbnQ4TnVtYmVyKiAoKiBjbXNGb3JtYXR0ZXJGbG9hdCkoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0KiBDTU1jYXJnbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFZhbHVlc1tdLApAQCAtNjAwLDI4ICs2MDAsMTEgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBGdWxsIHhmb3JtCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJMaW5lSW47Ci0gICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyTGluZU91dDsKLSAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJQbGFuZUluOwotICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lT3V0OwotCi19IGNtc1N0cmlkZTsKLQotdHlwZWRlZiB2b2lkICAgICAoKiBfY21zVHJhbnNmb3JtRm4pKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sICAgLy8gTGVnYWN5IGZ1bmN0aW9uLCBoYW5kbGVzIGp1c3QgT05FIHNjYW5saW5lLgordHlwZWRlZiB2b2lkICAgICAoKiBfY21zVHJhbnNmb3JtRm4pKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpOyAgICAgICAgICAgICAgICAgLy8gU3RyaWRlIGluIGJ5dGVzIHRvIHRoZSBuZXh0IHBsYW5hIGluIHBsYW5hciBmb3JtYXRzCi0KLQotdHlwZWRlZiB2b2lkICAgICAoKl9jbXNUcmFuc2Zvcm0yRm4pKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RyaWRlKiBTdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpOwogCiB0eXBlZGVmIGNtc0Jvb2wgICgqIF9jbXNUcmFuc2Zvcm1GYWN0b3J5KShfY21zVHJhbnNmb3JtRm4qIHhmb3JtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogVXNlckRhdGEsCkBAIC02MzEsMTQgKzYxNCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpOwogCi10eXBlZGVmIGNtc0Jvb2wgICgqIF9jbXNUcmFuc2Zvcm0yRmFjdG9yeSkoX2Ntc1RyYW5zZm9ybTJGbiogeGZvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVVc2VyRGF0YUZuKiBGcmVlUHJpdmF0ZURhdGFGbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmUqKiBMdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpOwotCiAKIC8vIFJldHJpZXZlIHVzZXIgZGF0YSBhcyBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkKIENNU0FQSSB2b2lkICAgQ01TRVhQT1JUIF9jbXNTZXRUcmFuc2Zvcm1Vc2VyRGF0YShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCB2b2lkKiBwdHIsIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlUHJpdmF0ZURhdGFGbik7CkBAIC02NTMsMTAgKzYyOCw3IEBACiAgICAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOwogCiAgICAgICAvLyBUcmFuc2Zvcm0gZW50cnkgcG9pbnQKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICBfY21zVHJhbnNmb3JtRmFjdG9yeSAgICAgICAgbGVnYWN5X3hmb3JtOwotICAgICAgICAgICAgIF9jbXNUcmFuc2Zvcm0yRmFjdG9yeSAgICAgICB4Zm9ybTsKLSAgICAgIH0gZmFjdG9yaWVzOworICAgICAgX2Ntc1RyYW5zZm9ybUZhY3RvcnkgIEZhY3Rvcnk7CiAKIH0gIGNtc1BsdWdpblRyYW5zZm9ybTsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9sb29wcy9HcmFwaGljc1ByaW1pdGl2ZU1nci5jIGIvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9sb29wcy9HcmFwaGljc1ByaW1pdGl2ZU1nci5jCmluZGV4IDZhNzBkNDAuLjc0MmRmZWIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvbG9vcHMvR3JhcGhpY3NQcmltaXRpdmVNZ3IuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2xvb3BzL0dyYXBoaWNzUHJpbWl0aXZlTWdyLmMKQEAgLTEwNCw0NyArMTA0LDQwIEBACiAgICAgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIENIRUNLX05VTEwoUmVnaXN0ZXJJRCA9Ci0gICAgICAgICgqZW52KS0+R2V0U3RhdGljTWV0aG9kSUQoZW52LCBHUE1nciwgUmVnaXN0ZXJOYW1lLCBSZWdpc3RlclNpZykpOwotICAgIENIRUNLX05VTEwocE5hdGl2ZVByaW1JRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEdQLCAicE5hdGl2ZVByaW0iLCAiSiIpKTsKLSAgICBDSEVDS19OVUxMKHBpeGVsSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBTRzJELCAicGl4ZWwiLCAiSSIpKTsKLSAgICBDSEVDS19OVUxMKGVhcmdiSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBTRzJELCAiZWFyZ2IiLCAiSSIpKTsKLSAgICBDSEVDS19OVUxMKGNsaXBSZWdpb25JRCA9Ci0gICAgICAgICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFNHMkQsICJjbGlwUmVnaW9uIiwgIkxzdW4vamF2YTJkL3BpcGUvUmVnaW9uOyIpKTsKLSAgICBDSEVDS19OVUxMKGNvbXBvc2l0ZUlEID0KLSAgICAgICAgKCplbnYpLT5HZXRGaWVsZElEKGVudiwgU0cyRCwgImNvbXBvc2l0ZSIsICJMamF2YS9hd3QvQ29tcG9zaXRlOyIpKTsKLSAgICBDSEVDS19OVUxMKGxjZFRleHRDb250cmFzdElEID0KLSAgICAgICAgKCplbnYpLT5HZXRGaWVsZElEKGVudiwgU0cyRCwgImxjZFRleHRDb250cmFzdCIsICJJIikpOwotICAgIENIRUNLX05VTEwoZ2V0UmdiSUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgQ29sb3IsICJnZXRSR0IiLCAiKClJIikpOwotICAgIENIRUNLX05VTEwoeG9yUGl4ZWxJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhPUkNvbXAsICJ4b3JQaXhlbCIsICJJIikpOwotICAgIENIRUNLX05VTEwoeG9yQ29sb3JJRCA9Ci0gICAgICAgICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhPUkNvbXAsICJ4b3JDb2xvciIsICJMamF2YS9hd3QvQ29sb3I7IikpOwotICAgIENIRUNLX05VTEwoYWxwaGFNYXNrSUQgPQotICAgICAgICAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYT1JDb21wLCAiYWxwaGFNYXNrIiwgIkkiKSk7Ci0gICAgQ0hFQ0tfTlVMTChydWxlSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBBbHBoYUNvbXAsICJydWxlIiwgIkkiKSk7Ci0gICAgQ0hFQ0tfTlVMTChleHRyYUFscGhhSUQgPQotICAgICAgICAoKmVudiktPkdldEZpZWxkSUQoZW52LCBBbHBoYUNvbXAsICJleHRyYUFscGhhIiwgIkYiKSk7CisgICAgUmVnaXN0ZXJJRCA9ICgqZW52KS0+R2V0U3RhdGljTWV0aG9kSUQoZW52LCBHUE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3Rlck5hbWUsIFJlZ2lzdGVyU2lnKTsKKyAgICBwTmF0aXZlUHJpbUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgR1AsICJwTmF0aXZlUHJpbSIsICJKIik7CisgICAgcGl4ZWxJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFNHMkQsICJwaXhlbCIsICJJIik7CisgICAgZWFyZ2JJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFNHMkQsICJlYXJnYiIsICJJIik7CisgICAgY2xpcFJlZ2lvbklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgU0cyRCwgImNsaXBSZWdpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTHN1bi9qYXZhMmQvcGlwZS9SZWdpb247Iik7CisgICAgY29tcG9zaXRlSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBTRzJELCAiY29tcG9zaXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGphdmEvYXd0L0NvbXBvc2l0ZTsiKTsKKyAgICBsY2RUZXh0Q29udHJhc3RJRCA9CisgICAgICAgICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFNHMkQsICJsY2RUZXh0Q29udHJhc3QiLCAiSSIpOworICAgIGdldFJnYklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIENvbG9yLCAiZ2V0UkdCIiwgIigpSSIpOworICAgIHhvclBpeGVsSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYT1JDb21wLCAieG9yUGl4ZWwiLCAiSSIpOworICAgIHhvckNvbG9ySUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBYT1JDb21wLCAieG9yQ29sb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxqYXZhL2F3dC9Db2xvcjsiKTsKKyAgICBhbHBoYU1hc2tJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFhPUkNvbXAsICJhbHBoYU1hc2siLCAiSSIpOworICAgIHJ1bGVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFscGhhQ29tcCwgInJ1bGUiLCAiSSIpOworICAgIGV4dHJhQWxwaGFJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFscGhhQ29tcCwgImV4dHJhQWxwaGEiLCAiRiIpOwogCiAKLSAgICBDSEVDS19OVUxMKG0wMElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMDAiLCAiRCIpKTsKLSAgICBDSEVDS19OVUxMKG0wMUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMDEiLCAiRCIpKTsKLSAgICBDSEVDS19OVUxMKG0wMklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMDIiLCAiRCIpKTsKLSAgICBDSEVDS19OVUxMKG0xMElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMTAiLCAiRCIpKTsKLSAgICBDSEVDS19OVUxMKG0xMUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMTEiLCAiRCIpKTsKLSAgICBDSEVDS19OVUxMKG0xMklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgQVQsICJtMTIiLCAiRCIpKTsKKyAgICBtMDBJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTAwIiwgIkQiKTsKKyAgICBtMDFJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTAxIiwgIkQiKTsKKyAgICBtMDJJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTAyIiwgIkQiKTsKKyAgICBtMTBJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTEwIiwgIkQiKTsKKyAgICBtMTFJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTExIiwgIkQiKTsKKyAgICBtMTJJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIEFULCAibTEyIiwgIkQiKTsKIAotICAgIENIRUNLX05VTEwocGF0aDJEVHlwZXNJRCA9Ci0gICAgICAgICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFBhdGgyRCwgInBvaW50VHlwZXMiLCAiW0IiKSk7Ci0gICAgQ0hFQ0tfTlVMTChwYXRoMkROdW1UeXBlc0lEID0KLSAgICAgICAgKCplbnYpLT5HZXRGaWVsZElEKGVudiwgUGF0aDJELCAibnVtVHlwZXMiLCAiSSIpKTsKLSAgICBDSEVDS19OVUxMKHBhdGgyRFdpbmRpbmdSdWxlSUQgPQotICAgICAgICAoKmVudiktPkdldEZpZWxkSUQoZW52LCBQYXRoMkQsICJ3aW5kaW5nUnVsZSIsICJJIikpOwotICAgIENIRUNLX05VTEwocGF0aDJERmxvYXRDb29yZHNJRCA9Ci0gICAgICAgICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFBhdGgyREZsb2F0LCAiZmxvYXRDb29yZHMiLCAiW0YiKSk7Ci0gICAgQ0hFQ0tfTlVMTChzZzJkU3Ryb2tlSGludElEID0KLSAgICAgICAgKCplbnYpLT5HZXRGaWVsZElEKGVudiwgU0cyRCwgInN0cm9rZUhpbnQiLCAiSSIpKTsKLSAgICBDSEVDS19OVUxMKGZpZCA9Ci0gICAgICAgICgqZW52KS0+R2V0U3RhdGljRmllbGRJRChlbnYsIFNIaW50cywgIklOVFZBTF9TVFJPS0VfUFVSRSIsICJJIikpOworICAgIHBhdGgyRFR5cGVzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBQYXRoMkQsICJwb2ludFR5cGVzIiwgIltCIik7CisgICAgcGF0aDJETnVtVHlwZXNJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIFBhdGgyRCwgIm51bVR5cGVzIiwgIkkiKTsKKyAgICBwYXRoMkRXaW5kaW5nUnVsZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgUGF0aDJELCAid2luZGluZ1J1bGUiLCAiSSIpOworICAgIHBhdGgyREZsb2F0Q29vcmRzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBQYXRoMkRGbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdENvb3JkcyIsICJbRiIpOworICAgIHNnMmRTdHJva2VIaW50SUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBTRzJELCAic3Ryb2tlSGludCIsICJJIik7CisgICAgZmlkID0gKCplbnYpLT5HZXRTdGF0aWNGaWVsZElEKGVudiwgU0hpbnRzLCAiSU5UVkFMX1NUUk9LRV9QVVJFIiwgIkkiKTsKICAgICBzdW5IaW50c19JTlRWQUxfU1RST0tFX1BVUkUgPSAoKmVudiktPkdldFN0YXRpY0ludEZpZWxkKGVudiwgU0hpbnRzLCBmaWQpOwogfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vbWlzYy9WTVN1cHBvcnQuYyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9taXNjL1ZNU3VwcG9ydC5jCmluZGV4IGViNGFiNGIuLjM1Yzk5MzMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9taXNjL1ZNU3VwcG9ydC5jCisrKyBiL2pkay9zcmMvc2hhcmUvbmF0aXZlL3N1bi9taXNjL1ZNU3VwcG9ydC5jCkBAIC00Miw3ICs0Miw2IEBACiAgICAgICAgIGlmICghSkRLX0luaXRKdm1IYW5kbGUoKSkgewogICAgICAgICAgICAgSk5VX1Rocm93SW50ZXJuYWxFcnJvcihlbnYsCiAgICAgICAgICAgICAgICAgICJIYW5kbGUgZm9yIEpWTSBub3QgZm91bmQgZm9yIHN5bWJvbCBsb29rdXAiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIEluaXRBZ2VudFByb3BlcnRpZXNfZnAgPSAoSU5JVF9BR0VOVF9QUk9QRVJUSUVTX0ZOKQogICAgICAgICAgICAgSkRLX0ZpbmRKdm1FbnRyeSgiSlZNX0luaXRBZ2VudFByb3BlcnRpZXMiKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9iaW4vamV4ZWMuYyBiL2pkay9zcmMvc29sYXJpcy9iaW4vamV4ZWMuYwppbmRleCAxMzIyMGNiLi5hMzA2MTdkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvYmluL2pleGVjLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL2Jpbi9qZXhlYy5jCkBAIC0zMzEsNyArMzMxLDYgQEAKICAgICAgICAgICAgICAgICBvZmZfdCBlbmQgICA9IHN0YXJ0ICArIHhsZW47CiAKICAgICAgICAgICAgICAgICBpZiAoZW5kIDw9IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCAtPSA0OyAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIDQgYnl0ZXMgdG8gcmVhZCBhdCBzdGFydAogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IHhoaWQgID0gU0goYnVmLCBzdGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCB4ZGxlbiA9IFNIKGJ1Ziwgc3RhcnQgKyAyKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9qYXZhMmQveHIvWFJSZW5kZXJlci5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2phdmEyZC94ci9YUlJlbmRlcmVyLmphdmEKaW5kZXggOTA0MDAxOC4uNWViODRlZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2phdmEyZC94ci9YUlJlbmRlcmVyLmphdmEKKysrIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2phdmEyZC94ci9YUlJlbmRlcmVyLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBqYXZhLmF3dC4qOwogaW1wb3J0IGphdmEuYXd0Lmdlb20uKjsKIGltcG9ydCBzdW4uYXd0LlN1blRvb2xraXQ7Ci1pbXBvcnQgc3VuLmphdmEyZC5JbnZhbGlkUGlwZUV4Y2VwdGlvbjsKIGltcG9ydCBzdW4uamF2YTJkLlN1bkdyYXBoaWNzMkQ7CiBpbXBvcnQgc3VuLmphdmEyZC5sb29wcy4qOwogaW1wb3J0IHN1bi5qYXZhMmQucGlwZS5SZWdpb247CkBAIC03MCwxMiArNjksNyBAQAogICAgICAqIGRlc3RpbmF0aW9uIGNvbnRleHQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHZhbGlkYXRlU3VyZmFjZShTdW5HcmFwaGljczJEIHNnMmQpIHsKLSAgICAgICAgWFJTdXJmYWNlRGF0YSB4cnNkOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgeHJzZCA9IChYUlN1cmZhY2VEYXRhKSBzZzJkLnN1cmZhY2VEYXRhOwotICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlRXhjZXB0aW9uKCJ3cm9uZyBzdXJmYWNlIGRhdGEgdHlwZTogIiArIHNnMmQuc3VyZmFjZURhdGEpOwotICAgICAgICB9CisgICAgICAgIFhSU3VyZmFjZURhdGEgeHJzZCA9IChYUlN1cmZhY2VEYXRhKSBzZzJkLnN1cmZhY2VEYXRhOwogICAgICAgICB4cnNkLnZhbGlkYXRlQXNEZXN0aW5hdGlvbihzZzJkLCBzZzJkLmdldENvbXBDbGlwKCkpOwogICAgICAgICB4cnNkLm1hc2tCdWZmZXIudmFsaWRhdGVDb21wb3NpdGVTdGF0ZShzZzJkLmNvbXBvc2l0ZSwgc2cyZC50cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnMmQucGFpbnQsIHNnMmQpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL25pby9mcy9MaW51eFdhdGNoU2VydmljZS5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL25pby9mcy9MaW51eFdhdGNoU2VydmljZS5qYXZhCmluZGV4IGI0MGVlOWMuLjEyM2ZhYjUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9uaW8vZnMvTGludXhXYXRjaFNlcnZpY2UuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vbmlvL2ZzL0xpbnV4V2F0Y2hTZXJ2aWNlLmphdmEKQEAgLTMyMiw2ICszMjIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUmVhZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFueSBwZW5kaW5nIHJlcXVlc3RzCisgICAgICAgICAgICAgICAgICAgIGlmICgoblJlYWR5ID4gMSkgfHwgKG5SZWFkeSA9PSAxICYmIGJ5dGVzUmVhZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkKHNvY2tldHBhaXJbMF0sIGFkZHJlc3MsIEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNodXRkb3duID0gcHJvY2Vzc1JlcXVlc3RzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNodXRkb3duKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuaXhFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4LmVycm5vKCkgIT0gVW5peENvbnN0YW50cy5FQUdBSU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYnVmZmVyIHRvIGRlY29kZSBldmVudHMKICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBieXRlc1JlYWQpIHsKQEAgLTM1NiwxOSArMzY5LDYgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IChTSVpFT0ZfSU5PVElGWV9FVkVOVCArIGxlbik7CiAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGFueSBwZW5kaW5nIHJlcXVlc3RzCi0gICAgICAgICAgICAgICAgICAgIGlmICgoblJlYWR5ID4gMSkgfHwgKG5SZWFkeSA9PSAxICYmIGJ5dGVzUmVhZCA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkKHNvY2tldHBhaXJbMF0sIGFkZHJlc3MsIEJVRkZFUl9TSVpFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNodXRkb3duID0gcHJvY2Vzc1JlcXVlc3RzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNodXRkb3duKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuaXhFeGNlcHRpb24geCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4LmVycm5vKCkgIT0gVW5peENvbnN0YW50cy5FQUdBSU4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChVbml4RXhjZXB0aW9uIHgpIHsKICAgICAgICAgICAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL05hdGl2ZVBSTkcuamF2YSBiL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9zZWN1cml0eS9wcm92aWRlci9OYXRpdmVQUk5HLmphdmEKaW5kZXggYmJiNDhjNC4uMWQyNzVmMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL05hdGl2ZVBSTkcuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcHJvdmlkZXIvTmF0aXZlUFJORy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsOCArMjgsNiBAQAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLm5ldC4qOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCiBpbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuRGVidWc7CiAKIC8qKgpAQCAtMzM2LDkgKzMzNCw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTUFYX0JVRkZFUl9USU1FID0gMTAwOwogCiAgICAgICAgIC8vIHNpemUgb2YgdGhlICJuZXh0IiBidWZmZXIKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZGRVJfU0laRSA9IDY1NTM2OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0JVRkZFUl9TSVpFID0gMzI7Ci0gICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemUgPSAyNTY7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDMyOwogCiAgICAgICAgIC8vIEhvbGRlciBmb3IgdGhlIHNlZWRGaWxlLiAgVXNlZCBpZiB3ZSBldmVyIGFkZCBzZWVkIG1hdGVyaWFsLgogICAgICAgICBGaWxlIHNlZWRGaWxlOwpAQCAtMzU1LDcgKzM1MSw3IEBACiAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgc3VuLnNlY3VyaXR5LnByb3ZpZGVyLlNlY3VyZVJhbmRvbSBtaXhSYW5kb207CiAKICAgICAgICAgLy8gYnVmZmVyIGZvciBuZXh0IGJpdHMKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbmV4dEJ1ZmZlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gbmV4dEJ1ZmZlcjsKIAogICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiBuZXh0QnVmZmVyCiAgICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlcmVkOwpAQCAtMzYzLDE2ICszNTksNiBAQAogICAgICAgICAvLyB0aW1lIHdlIHJlYWQgdGhlIGRhdGEgaW50byB0aGUgbmV4dEJ1ZmZlcgogICAgICAgICBwcml2YXRlIGxvbmcgbGFzdFJlYWQ7CiAKLSAgICAgICAgLy8gQ291bnQgZm9yIHRoZSBudW1iZXIgb2YgYnVmZmVyIHNpemUgY2hhbmdlcyByZXF1ZXN0cwotICAgICAgICAvLyBQb3NpdGl2ZSB2YWx1ZSBpbiBpbmNyZWFzZSBzaXplLCBuZWdhdGl2ZSB0byBsb3dlciBpdC4KLSAgICAgICAgcHJpdmF0ZSBpbnQgY2hhbmdlX2J1ZmZlciA9IDA7Ci0KLSAgICAgICAgLy8gUmVxdWVzdCBsaW1pdCB0byB0cmlnZ2VyIGFuIGluY3JlYXNlIGluIG5leHRCdWZmZXIgc2l6ZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRX0xJTUlUX0lOQyA9IDEwMDA7Ci0KLSAgICAgICAgLy8gUmVxdWVzdCBsaW1pdCB0byB0cmlnZ2VyIGEgZGVjcmVhc2UgaW4gbmV4dEJ1ZmZlciBzaXplCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFfTElNSVRfREVDID0gLTEwMDsKLQogICAgICAgICAvLyBtdXRleCBsb2NrIGZvciBuZXh0Qnl0ZXMoKQogICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBMT0NLX0dFVF9CWVRFUyA9IG5ldyBPYmplY3QoKTsKIApAQCAtMzg3LDcgKzM3Myw3IEBACiAgICAgICAgICAgICB0aGlzLnNlZWRGaWxlID0gc2VlZEZpbGU7CiAgICAgICAgICAgICBzZWVkSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNlZWRGaWxlKTsKICAgICAgICAgICAgIG5leHRJbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV4dEZpbGUpOwotICAgICAgICAgICAgbmV4dEJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOworICAgICAgICAgICAgbmV4dEJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGdldCB0aGUgU0hBMVBSTkcgZm9yIG1peGluZwpAQCAtNDgwLDQ3ICs0NjYsOSBAQAogICAgICAgICAvLyBpZiBub3QsIHJlYWQgbmV3IGJ5dGVzCiAgICAgICAgIHByaXZhdGUgdm9pZCBlbnN1cmVCdWZmZXJWYWxpZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGludCBuZXdfYnVmZmVyX3NpemUgPSAwOwotCi0gICAgICAgICAgICAvLyBDaGVjayBpZiBidWZmZXIgaGFzIGJ5dGVzIGF2YWlsYWJsZSB0aGF0IGFyZSBub3QgdG9vIG9sZAotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkID4gMCkgewotICAgICAgICAgICAgICAgIGlmICh0aW1lIC0gbGFzdFJlYWQgPCBNQVhfQlVGRkVSX1RJTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgaXMgb2xkLCBzbyBzdWJ0cmFjdCBmcm9tIGNvdW50ZXIgdG8gc2hyaW5rIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfYnVmZmVyLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBObyBieXRlcyBhdmFpbGFibGUsIHNvIGFkZCB0byBjb3VudCB0byBpbmNyZWFzZSBidWZmZXIKLSAgICAgICAgICAgICAgICBjaGFuZ2VfYnVmZmVyKys7CisgICAgICAgICAgICBpZiAoKGJ1ZmZlcmVkID4gMCkgJiYgKHRpbWUgLSBsYXN0UmVhZCA8IE1BWF9CVUZGRVJfVElNRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIGNvdW50ZXIgaGFzIGl0IGEgbGltaXQsIGluY3JlYXNlIG9yIGRlY3JlYXNlIHNpemUKLSAgICAgICAgICAgIGlmIChjaGFuZ2VfYnVmZmVyID4gUkVRX0xJTUlUX0lOQykgewotICAgICAgICAgICAgICAgIG5ld19idWZmZXJfc2l6ZSA9IG5leHRCdWZmZXIubGVuZ3RoICogMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlX2J1ZmZlciA8IFJFUV9MSU1JVF9ERUMpIHsKLSAgICAgICAgICAgICAgICBuZXdfYnVmZmVyX3NpemUgPSBuZXh0QnVmZmVyLmxlbmd0aCAvIDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIGJ1ZmZlciBzaXplIGlzIHRvIGJlIGNoYW5nZWQsIHJlcGxhY2UgbmV4dEJ1ZmZlci4KLSAgICAgICAgICAgIGlmIChuZXdfYnVmZmVyX3NpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld19idWZmZXJfc2l6ZSA8PSBNQVhfQlVGRkVSX1NJWkUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19idWZmZXJfc2l6ZSA+PSBNSU5fQlVGRkVSX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEJ1ZmZlciA9IG5ldyBieXRlW25ld19idWZmZXJfc2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5wcmludGxuKCJCdWZmZXIgc2l6ZSBjaGFuZ2VkIHRvICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLnByaW50bG4oIkJ1ZmZlciByZWFjaGVkIGxpbWl0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJ1ZmZlci5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoYW5nZV9idWZmZXIgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBMb2FkIGZyZXNoIHJhbmRvbSBieXRlcyBpbnRvIG5leHRCdWZmZXIKICAgICAgICAgICAgIGxhc3RSZWFkID0gdGltZTsKICAgICAgICAgICAgIHJlYWRGdWxseShuZXh0SW4sIG5leHRCdWZmZXIpOwogICAgICAgICAgICAgYnVmZmVyZWQgPSBuZXh0QnVmZmVyLmxlbmd0aDsKQEAgLTUzMCw0MCArNDc4LDI0IEBACiAgICAgICAgIC8vIHJlYWQgZnJvbSAibmV4dCIgYW5kIFhPUiB3aXRoIGJ5dGVzIGdlbmVyYXRlZCBieSB0aGUKICAgICAgICAgLy8gbWl4aW5nIFNIQTFQUk5HCiAgICAgICAgIHByaXZhdGUgdm9pZCBpbXBsTmV4dEJ5dGVzKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKExPQ0tfR0VUX0JZVEVTKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZ2V0TWl4UmFuZG9tKCkuZW5naW5lTmV4dEJ5dGVzKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICBpbnQgb2ZzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9wb3M7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsb2NhbG9mczsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGxvY2FsQnVmZmVyOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChkYXRhX2xlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTE9DS19HRVRfQllURVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVCdWZmZXJWYWxpZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wb3MgPSBuZXh0QnVmZmVyLmxlbmd0aCAtIGJ1ZmZlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhX2xlbiA+IGJ1ZmZlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGJ1ZmZlcmVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gZGF0YV9sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkIC09IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxCdWZmZXIgPSBBcnJheXMuY29weU9mUmFuZ2UobmV4dEJ1ZmZlciwgYnVmX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wb3MgKyBsZW4pOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlQnVmZmVyVmFsaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZmZXJPZnMgPSBuZXh0QnVmZmVyLmxlbmd0aCAtIGJ1ZmZlcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPiAwKSAmJiAoYnVmZmVyZWQgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2ZzKytdIF49IG5leHRCdWZmZXJbYnVmZmVyT2ZzKytdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLS07CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbG9mcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuID4gbG9jYWxvZnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW29mc10gXj0gbG9jYWxCdWZmZXJbbG9jYWxvZnNdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fsb2ZzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuIC09IGxlbjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uKCJuZXh0Qnl0ZXMoKSBmYWlsZWQiLCBlKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9Tb2xhcmlzLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvU29sYXJpcy5jCmluZGV4IGQ5NGVkYzYuLjEyYTcwNzQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9Tb2xhcmlzLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9jb20vc3VuL3NlY3VyaXR5L2F1dGgvbW9kdWxlL1NvbGFyaXMuYwpAQCAtMzIsMTIgKzMyLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxwd2QuaD4KIAotc3RhdGljIHZvaWQgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm1zZykgewotICAgIGpjbGFzcyBjbGF6eiA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgICBpZiAoY2xhenogIT0gTlVMTCkKLSAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCBtc2cpOwotfQotCiBKTklFWFBPUlQgdm9pZCBKTklDQUxMCiBKYXZhX2NvbV9zdW5fc2VjdXJpdHlfYXV0aF9tb2R1bGVfU29sYXJpc1N5c3RlbV9nZXRTb2xhcmlzSW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaikgewpAQCAtNTcsNyArNTEsNyBAQAogCiAgICAgaWYgKGdyb3VwcyA9PSBOVUxMKSB7CiAgICAgICAgIGpjbGFzcyBjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsImphdmEvbGFuZy9PdXRPZk1lbW9yeUVycm9yIik7Ci0gICAgICAgIGlmIChjbHMgIT0gTlVMTCkKKyAgICAgICAgaWYoY2xzICE9IDApCiAgICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgY2xzLCBOVUxMKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTczLDEzICs2NywxNSBAQAogICAgICAgICAgKi8KICAgICAgICAgZmlkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAidXNlcm5hbWUiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CiAgICAgICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGpjbGFzcyBuZXdFeGNDbHMgPQorICAgICAgICAgICAgICAgICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKKyAgICAgICAgICAgIGlmIChuZXdFeGNDbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFVuYWJsZSB0byBmaW5kIHRoZSBuZXcgZXhjZXB0aW9uIGNsYXNzLCBnaXZlIHVwLiAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqZW52KS0+VGhyb3dOZXcoZW52LCBuZXdFeGNDbHMsICJpbnZhbGlkIGZpZWxkOiB1c2VybmFtZSIpOwogICAgICAgICB9CiAgICAgICAgIGpzdHIgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIHB3ZC5wd19uYW1lKTsKLSAgICAgICAgaWYgKGpzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgZmlkLCBqc3RyKTsKIAogICAgICAgICAvKgpAQCAtODcsOSArODMsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgInVpZCIsICJKIik7CiAgICAgICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiaW52YWxpZCBmaWVsZDogdWlkIik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KKyAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBVbmFibGUgdG8gZmluZCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcywgZ2l2ZSB1cC4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKICAgICAgICAgfQogICAgICAgICAoKmVudiktPlNldExvbmdGaWVsZChlbnYsIG9iaiwgZmlkLCBwd2QucHdfdWlkKTsKIApAQCAtOTgsOSArOTgsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgImdpZCIsICJKIik7CiAgICAgICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiaW52YWxpZCBmaWVsZDogZ2lkIik7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KKyAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBVbmFibGUgdG8gZmluZCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcywgZ2l2ZSB1cC4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKICAgICAgICAgfQogICAgICAgICAoKmVudiktPlNldExvbmdGaWVsZChlbnYsIG9iaiwgZmlkLCBwd2QucHdfZ2lkKTsKIApAQCAtMTA5LDE3ICsxMTMsMTcgQEAKICAgICAgICAgICovCiAgICAgICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgImdyb3VwcyIsICJbSiIpOwogICAgICAgICBpZiAoZmlkID09IDApIHsKLSAgICAgICAgICAgICgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLSAgICAgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVudiwgImludmFsaWQgZmllbGQ6IGdyb3VwcyIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9CisgICAgICAgICAgICAgICAgKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgaWYgKG5ld0V4Y0NscyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogVW5hYmxlIHRvIGZpbmQgdGhlIG5ldyBleGNlcHRpb24gY2xhc3MsIGdpdmUgdXAuICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIG5ld0V4Y0NscywgImludmFsaWQgZmllbGQ6IHVzZXJuYW1lIik7CiAgICAgICAgIH0KIAogICAgICAgICBqZ3JvdXBzID0gKCplbnYpLT5OZXdMb25nQXJyYXkoZW52LCBudW1TdXBwR3JvdXBzKTsKLSAgICAgICAgaWYgKGpncm91cHMgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgamdyb3Vwc0FzQXJyYXkgPSAoKmVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGVudiwgamdyb3VwcywgMCk7Ci0gICAgICAgIGlmIChqZ3JvdXBzQXNBcnJheSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3VwcEdyb3VwczsgaSsrKQogICAgICAgICAgICAgamdyb3Vwc0FzQXJyYXlbaV0gPSBncm91cHNbaV07CiAgICAgICAgICgqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGVudiwgamdyb3Vwcywgamdyb3Vwc0FzQXJyYXksIDApOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9jb20vc3VuL3NlY3VyaXR5L2F1dGgvbW9kdWxlL1VuaXguYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9Vbml4LmMKaW5kZXggZTRkYjU1Ny4uMzk0ZWY3YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9jb20vc3VuL3NlY3VyaXR5L2F1dGgvbW9kdWxlL1VuaXguYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvVW5peC5jCkBAIC02MCw3ICs2MCw3IEBACiAgICAgZ3JvdXBzID0gKGdpZF90ICopY2FsbG9jKG51bVN1cHBHcm91cHMsIHNpemVvZihnaWRfdCkpOwogICAgIGlmIChncm91cHMgPT0gTlVMTCkgewogICAgICAgICBqY2xhc3MgY2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCJqYXZhL2xhbmcvT3V0T2ZNZW1vcnlFcnJvciIpOwotICAgICAgICBpZiAoY2xzICE9IE5VTEwpCisgICAgICAgIGlmKGNscyAhPSAwKQogICAgICAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIGNscywgTlVMTCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05MCw4ICs5MCw2IEBACiAgICAgICAgICAgICBnb3RvIGNsZWFuVXBBbmRSZXR1cm47CiAKICAgICAgICAganN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgcHdkLT5wd19uYW1lKTsKLSAgICAgICAgaWYgKGpzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcEFuZFJldHVybjsKICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgdXNlck5hbWVJRCwganN0cik7CiAKICAgICAgICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIHVzZXJJRCwgcHdkLT5wd191aWQpOwpAQCAtOTksMTEgKzk3LDcgQEAKICAgICAgICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIGdyb3VwSUQsIHB3ZC0+cHdfZ2lkKTsKIAogICAgICAgICBqZ3JvdXBzID0gKCplbnYpLT5OZXdMb25nQXJyYXkoZW52LCBudW1TdXBwR3JvdXBzKTsKLSAgICAgICAgaWYgKGpncm91cHMgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW5VcEFuZFJldHVybjsKICAgICAgICAgamdyb3Vwc0FzQXJyYXkgPSAoKmVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGVudiwgamdyb3VwcywgMCk7Ci0gICAgICAgIGlmIChqZ3JvdXBzQXNBcnJheSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBjbGVhblVwQW5kUmV0dXJuOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtU3VwcEdyb3VwczsgaSsrKQogICAgICAgICAgICAgamdyb3Vwc0FzQXJyYXlbaV0gPSBncm91cHNbaV07CiAgICAgICAgICgqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGVudiwgamdyb3Vwcywgamdyb3Vwc0FzQXJyYXksIDApOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2lvL0ZpbGVEZXNjcmlwdG9yX21kLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvaW8vRmlsZURlc2NyaXB0b3JfbWQuYwppbmRleCBiYTM1M2NiLi43MTQ3YTE0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvaW8vRmlsZURlc2NyaXB0b3JfbWQuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvaW8vRmlsZURlc2NyaXB0b3JfbWQuYwpAQCAtMjMsMTEgKzIzLDkgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiam5pX3V0aWwuaCIKICNpbmNsdWRlICJqdm0uaCIKLQogI2luY2x1ZGUgImlvX3V0aWxfbWQuaCIKKwogI2luY2x1ZGUgImphdmFfaW9fRmlsZURlc2NyaXB0b3IuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00Myw3ICs0MSw3IEBACiAKIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwKIEphdmFfamF2YV9pb19GaWxlRGVzY3JpcHRvcl9pbml0SURzKEpOSUVudiAqZW52LCBqY2xhc3MgZmRDbGFzcykgewotICAgIENIRUNLX05VTEwoSU9fZmRfZmRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGZkQ2xhc3MsICJmZCIsICJJIikpOworICAgIElPX2ZkX2ZkSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBmZENsYXNzLCAiZmQiLCAiSSIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9sYW5nL1Byb2Nlc3NFbnZpcm9ubWVudF9tZC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2xhbmcvUHJvY2Vzc0Vudmlyb25tZW50X21kLmMKaW5kZXggNDZjY2M1ZC4uZDY5MmQzOCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2xhbmcvUHJvY2Vzc0Vudmlyb25tZW50X21kLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2xhbmcvUHJvY2Vzc0Vudmlyb25tZW50X21kLmMKQEAgLTUzLDcgKzUzLDYgQEAKICAgICBqc2l6ZSBpLCBqOwogICAgIGpvYmplY3RBcnJheSByZXN1bHQ7CiAgICAgamNsYXNzIGJ5dGVBcnJDbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJbQiIpOwotICAgIENIRUNLX05VTExfUkVUVVJOKGJ5dGVBcnJDbHMsIE5VTEwpOwogCiAgICAgZm9yIChpID0gMDsgZW52aXJvbltpXTsgaSsrKSB7CiAgICAgICAgIC8qIElnbm9yZSBjb3JydXB0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzICovCkBAIC02Miw3ICs2MSw3IEBACiAgICAgfQogCiAgICAgcmVzdWx0ID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIDIqY291bnQsIGJ5dGVBcnJDbHMsIDApOwotICAgIENIRUNLX05VTExfUkVUVVJOKHJlc3VsdCwgTlVMTCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaSA9IDAsIGogPSAwOyBlbnZpcm9uW2ldOyBpKyspIHsKICAgICAgICAgY29uc3QgY2hhciAqIHZhckVuZCA9IHN0cmNocihlbnZpcm9uW2ldLCAnPScpOwpAQCAtNzMsOSArNzIsOSBAQAogICAgICAgICAgICAganNpemUgdmFyTGVuZ3RoID0gdmFyRW5kIC0gZW52aXJvbltpXTsKICAgICAgICAgICAgIGpzaXplIHZhbExlbmd0aCA9IHN0cmxlbih2YWxCZWcpOwogICAgICAgICAgICAgdmFyID0gKCplbnYpLT5OZXdCeXRlQXJyYXkoZW52LCB2YXJMZW5ndGgpOwotICAgICAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4odmFyLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2YXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB2YWwgPSAoKmVudiktPk5ld0J5dGVBcnJheShlbnYsIHZhbExlbmd0aCk7Ci0gICAgICAgICAgICBDSEVDS19OVUxMX1JFVFVSTih2YWwsIE5VTEwpOworICAgICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgdmFyLCAwLCB2YXJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamJ5dGUqKSBlbnZpcm9uW2ldKTsKICAgICAgICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgdmFsLCAwLCB2YWxMZW5ndGgsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbGFuZy9VTklYUHJvY2Vzc19tZC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2xhbmcvVU5JWFByb2Nlc3NfbWQuYwppbmRleCA5YjUxMGFkLi43ZGY1ZDU5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbGFuZy9VTklYUHJvY2Vzc19tZC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9sYW5nL1VOSVhQcm9jZXNzX21kLmMKQEAgLTIwNiw3ICsyMDYsNiBAQAogSmF2YV9qYXZhX2xhbmdfVU5JWFByb2Nlc3NfaW5pdChKTklFbnYgKmVudiwgamNsYXNzIGNsYXp6KQogewogICAgIHBhcmVudFBhdGh2ID0gZWZmZWN0aXZlUGF0aHYoZW52KTsKLSAgICBDSEVDS19OVUxMKHBhcmVudFBhdGh2KTsKICAgICBzZXRTSUdDSExESGFuZGxlcihlbnYpOwogfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbGFuZy9qYXZhX3Byb3BzX21kLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbGFuZy9qYXZhX3Byb3BzX21kLmMKaW5kZXggZGY1NWZkMy4uMTgzMGIyMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL2xhbmcvamF2YV9wcm9wc19tZC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9sYW5nL2phdmFfcHJvcHNfbWQuYwpAQCAtNTQ2LDkgKzU0Niw2IEBACiAgICAgc3Byb3BzLmRpc3BsYXlfY291bnRyeSA9IHNwcm9wcy5jb3VudHJ5OwogICAgIHNwcm9wcy5kaXNwbGF5X3ZhcmlhbnQgPSBzcHJvcHMudmFyaWFudDsKIAotICAgIC8qIFBhcnNlTG9jYWxlIGZhaWxlZCB3aXRoIE9PTUUgKi8KLSAgICBKTlVfQ0hFQ0tfRVhDRVBUSU9OX1JFVFVSTihlbnYsIE5VTEwpOwotCiAjaWZkZWYgTUFDT1NYCiAgICAgc3Byb3BzLnN1bl9qbnVfZW5jb2RpbmcgPSAiVVRGLTgiOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvRXh0ZW5kZWRPcHRpb25zSW1wbC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9FeHRlbmRlZE9wdGlvbnNJbXBsLmMKaW5kZXggMGUwZTNhMC4uOGI0M2UzZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9FeHRlbmRlZE9wdGlvbnNJbXBsLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9FeHRlbmRlZE9wdGlvbnNJbXBsLmMKQEAgLTg4LDcgKzg4LDYgQEAKICAgICAvKiBTb2NrZXRGbG93IGZpZWxkcyAqLwogCiAgICAgYyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImpkay9uZXQvU29ja2V0RmxvdyIpOwotICAgIENIRUNLX05VTEwoYyk7CiAKICAgICAvKiBzdGF0dXMgKi8KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9JbmV0NEFkZHJlc3NJbXBsLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYwppbmRleCBlYzRmOTdkLi5jOGZiOTg3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYwpAQCAtNTEsNiArNTEsMjkgQEAKICNkZWZpbmUgSEFTX0dMSUJDX0dFVEhPU1RCWV9SICAgMQogI2VuZGlmCiAKK3N0YXRpYyBqY2xhc3MgbmlfaWFjbHM7CitzdGF0aWMgamNsYXNzIG5pX2lhNGNsczsKK3N0YXRpYyBqbWV0aG9kSUQgbmlfaWE0Y3RySUQ7CisKK3N0YXRpYyBqYm9vbGVhbiBpbml0aWFsaXplSW5ldENsYXNzZXMoSk5JRW52ICplbnYpCit7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICBuaV9pYWNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgICAgIENIRUNLX05VTExfUkVUVVJOKG5pX2lhY2xzLCBKTklfRkFMU0UpOworICAgICAgICBuaV9pYWNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWFjbHMpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYWNscywgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDRBZGRyZXNzIik7CisgICAgICAgIENIRUNLX05VTExfUkVUVVJOKG5pX2lhNGNscywgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTRjbHMpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjbHMsIEpOSV9GQUxTRSk7CisgICAgICAgIG5pX2lhNGN0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIG5pX2lhNGNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE0Y3RySUQsIEpOSV9GQUxTRSk7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIEpOSV9UUlVFOworfQorCiAKICNpZiBkZWZpbmVkKF9BTExCU0RfU09VUkNFKSAmJiAhZGVmaW5lZChIQVNfR0xJQkNfR0VUSE9TVEJZX1IpCiBleHRlcm4gam9iamVjdEFycmF5IGxvb2t1cElmTG9jYWxob3N0KEpOSUVudiAqZW52LCBjb25zdCBjaGFyICpob3N0bmFtZSwgamJvb2xlYW4gaW5jbHVkZVY2KTsKQEAgLTEyNCw4ICsxNDcsOCBAQAogICAgIGludCBnZXRhZGRyaW5mb19lcnJvcj0wOwogICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc05ldyA9IE5VTEw7CiAKLSAgICBpbml0SW5ldEFkZHJlc3NJRHMoZW52KTsKLSAgICBKTlVfQ0hFQ0tfRVhDRVBUSU9OX1JFVFVSTihlbnYsIE5VTEwpOworICAgIGlmICghaW5pdGlhbGl6ZUluZXRDbGFzc2VzKGVudikpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKElTX05VTEwoaG9zdCkpIHsKICAgICAgICAgSk5VX1Rocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiaG9zdCBpcyBudWxsIik7CkBAIC0yMTksNyArMjQyLDcgQEAKICAgICAgICAgICBnb3RvIGNsZWFudXBBbmRSZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICByZXQgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgcmV0TGVuLCBpYV9jbGFzcywgTlVMTCk7CisgICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCByZXRMZW4sIG5pX2lhY2xzLCBOVUxMKTsKICAgICAgICAgaWYgKElTX05VTEwocmV0KSkgewogICAgICAgICAgICAgLyogd2UgbWF5IGhhdmUgbWVtb3J5IHRvIGZyZWUgYXQgdGhlIGVuZCBvZiB0aGlzICovCiAgICAgICAgICAgICBnb3RvIGNsZWFudXBBbmRSZXR1cm47CkBAIC0yMjksNyArMjUyLDcgQEAKICAgICAgICAgICAgIC8qIFdlIG5lZWQgNCBieXRlcyB0byBzdG9yZSBpcHY0IGFkZHJlc3M7ICovCiAgICAgICAgICAgICBpbnQgbGVuID0gNDsKIAotICAgICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE0X2NsYXNzLCBpYTRfY3RySUQpOworICAgICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRjdHJJRCk7CiAgICAgICAgICAgICBpZiAoSVNfTlVMTChpYU9iaikpIHsKICAgICAgICAgICAgICAgICAvKiB3ZSBtYXkgaGF2ZSBtZW1vcnkgdG8gZnJlZSBhdCB0aGUgZW5kIG9mIHRoaXMgKi8KICAgICAgICAgICAgICAgICByZXQgPSBOVUxMOwpAQCAtMzg1LDggKzQwOCw4IEBACiAgICAgaW50IGVycm9yID0gMDsKICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXNOZXcgPSBOVUxMOwogCi0gICAgaW5pdEluZXRBZGRyZXNzSURzKGVudik7Ci0gICAgSk5VX0NIRUNLX0VYQ0VQVElPTl9SRVRVUk4oZW52LCBOVUxMKTsKKyAgICBpZiAoIWluaXRpYWxpemVJbmV0Q2xhc3NlcyhlbnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChJU19OVUxMKGhvc3QpKSB7CiAgICAgICAgIEpOVV9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImhvc3QgaXMgbnVsbCIpOwpAQCAtNDY0LDcgKzQ4Nyw3IEBACiAgICAgICAgIHJldExlbiA9IGk7CiAgICAgICAgIGl0ZXJhdG9yID0gcmVzTmV3OwogCi0gICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCByZXRMZW4sIGlhX2NsYXNzLCBOVUxMKTsKKyAgICAgICAgcmV0ID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIHJldExlbiwgbmlfaWFjbHMsIE5VTEwpOwogCiAgICAgICAgIGlmIChJU19OVUxMKHJldCkpIHsKICAgICAgICAgICAgIC8qIHdlIG1heSBoYXZlIG1lbW9yeSB0byBmcmVlIGF0IHRoZSBlbmQgb2YgdGhpcyAqLwpAQCAtNDczLDcgKzQ5Niw3IEBACiAKICAgICAgICAgaSA9IDA7CiAgICAgICAgIHdoaWxlIChpdGVyYXRvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBqb2JqZWN0IGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICBqb2JqZWN0IGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9pYTRjbHMsIG5pX2lhNGN0cklEKTsKICAgICAgICAgICAgIGlmIChJU19OVUxMKGlhT2JqKSkgewogICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwQW5kUmV0dXJuOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9JbmV0NkFkZHJlc3NJbXBsLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ2QWRkcmVzc0ltcGwuYwppbmRleCBlNjdlMjVhLi45ODUwYmIzIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ2QWRkcmVzc0ltcGwuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L0luZXQ2QWRkcmVzc0ltcGwuYwpAQCAtMTE3LDYgKzExNyw0NCBAQAogICAgIHJldHVybiAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGhvc3RuYW1lKTsKIH0KIAorc3RhdGljIGpjbGFzcyBuaV9pYWNsczsKK3N0YXRpYyBqY2xhc3MgbmlfaWE0Y2xzOworc3RhdGljIGpjbGFzcyBuaV9pYTZjbHM7CitzdGF0aWMgam1ldGhvZElEIG5pX2lhNGN0cklEOworc3RhdGljIGptZXRob2RJRCBuaV9pYTZjdHJJRDsKK3N0YXRpYyBqYm9vbGVhbiBwcmVmZXJJUHY2QWRkcmVzczsKKworc3RhdGljIGpib29sZWFuIGluaXRpYWxpemVJbmV0Q2xhc3NlcyhKTklFbnYgKmVudikKK3sKKyAgICBqZmllbGRJRCBuaV9wcmVmZXJJUHY2QWRkcmVzc0lEOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbmlfaWFjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0QWRkcmVzcyIpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYWNscywgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfaWFjbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIG5pX2lhY2xzKTsKKyAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWFjbHMsIEpOSV9GQUxTRSk7CisgICAgICAgIG5pX2lhNGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXQ0QWRkcmVzcyIpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjbHMsIEpOSV9GQUxTRSk7CisgICAgICAgIG5pX2lhNGNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWE0Y2xzKTsKKyAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE0Y2xzLCBKTklfRkFMU0UpOworICAgICAgICBuaV9pYTZjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NkFkZHJlc3MiKTsKKyAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE2Y2xzLCBKTklfRkFMU0UpOworICAgICAgICBuaV9pYTZjbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIG5pX2lhNmNscyk7CisgICAgICAgIENIRUNLX05VTExfUkVUVVJOKG5pX2lhNmNscywgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfaWE0Y3RySUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgbmlfaWE0Y2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjdHJJRCwgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfaWE2Y3RySUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgbmlfaWE2Y2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTZjdHJJRCwgSk5JX0ZBTFNFKTsKKyAgICAgICAgbmlfcHJlZmVySVB2NkFkZHJlc3NJRCA9CisgICAgICAgICAgICAoKmVudiktPkdldFN0YXRpY0ZpZWxkSUQoZW52LCBuaV9pYWNscywgInByZWZlcklQdjZBZGRyZXNzIiwgIloiKTsKKyAgICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfcHJlZmVySVB2NkFkZHJlc3NJRCwgSk5JX0ZBTFNFKTsKKyAgICAgICAgcHJlZmVySVB2NkFkZHJlc3MgPQorICAgICAgICAgICAgKCplbnYpLT5HZXRTdGF0aWNCb29sZWFuRmllbGQoZW52LCBpYV9jbGFzcywgaWFfcHJlZmVySVB2NkFkZHJlc3NJRCk7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIEpOSV9UUlVFOworfQorCiAjaWZkZWYgTUFDT1NYCiAvKiBhbHNvIGNhbGxlZCBmcm9tIEluZXQ0QWRkcmVzc0ltcGwuYyAqLwogX19wcml2YXRlX2V4dGVybl9fIGpvYmplY3RBcnJheQpAQCAtMTMxLDggKzE2OSw5IEBACiAgICAgamJvb2xlYW4gaW5jbHVkZUxvb3BiYWNrID0gSk5JX0ZBTFNFOwogICAgIGpvYmplY3QgbmFtZTsKIAotICAgIGluaXRJbmV0QWRkcmVzc0lEcyhlbnYpOwotICAgIEpOVV9DSEVDS19FWENFUFRJT05fUkVUVVJOKGVudiwgTlVMTCk7CisgICAgLy8gTWFrZSBzdXJlIHN0YXRpYyB2YXJpYWJsZXMgd2UgbmVlZCBhcmUgc2V0LgorICAgIGlmICghaW5pdGlhbGl6ZUluZXRDbGFzc2VzKGVudikpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogSWYgdGhlIHJlcXVlc3RlZCBuYW1lIG1hdGNoZXMgdGhpcyBob3N0J3MgaG9zdG5hbWUsIHJldHVybiBJUCBhZGRyZXNzZXMKICAgICAgKiBmcm9tIGFsbCBhdHRhY2hlZCBpbnRlcmZhY2VzLiAoIzI4NDQ2ODMgZXQgYWwpIFRoaXMgcHJldmVudHMgdW5kZXNpcmVkCkBAIC0xOTUsMTAgKzIzNCwxMCBAQAogICAgIC8qIENyZWF0ZSBhbmQgZmlsbCB0aGUgSmF2YSBhcnJheS4gKi8KICAgICBpbnQgYXJyYXlTaXplID0gYWRkcnM0ICsgYWRkcnM2IC0KICAgICAgICAgKGluY2x1ZGVMb29wYmFjayA/IDAgOiAobnVtVjRMb29wYmFja3MgKyBudW1WNkxvb3BiYWNrcykpOwotICAgIHJlc3VsdCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBhcnJheVNpemUsIGlhX2NsYXNzLCBOVUxMKTsKKyAgICByZXN1bHQgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgYXJyYXlTaXplLCBuaV9pYWNscywgTlVMTCk7CiAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZG9uZTsKIAotICAgIGlmICgoKmVudiktPkdldFN0YXRpY0Jvb2xlYW5GaWVsZChlbnYsIGlhX2NsYXNzLCBpYV9wcmVmZXJJUHY2QWRkcmVzc0lEKSkgeworICAgIGlmIChwcmVmZXJJUHY2QWRkcmVzcykgewogICAgICAgICBpID0gaW5jbHVkZUxvb3BiYWNrID8gYWRkcnM2IDogKGFkZHJzNiAtIG51bVY2TG9vcGJhY2tzKTsKICAgICAgICAgaiA9IDA7CiAgICAgfSBlbHNlIHsKQEAgLTI2Miw4ICszMDEsOCBAQAogICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlc05ldyA9IE5VTEw7CiAjZW5kaWYgLyogQUZfSU5FVDYgKi8KIAotICAgIGluaXRJbmV0QWRkcmVzc0lEcyhlbnYpOwotICAgIEpOVV9DSEVDS19FWENFUFRJT05fUkVUVVJOKGVudiwgTlVMTCk7CisgICAgaWYgKCFpbml0aWFsaXplSW5ldENsYXNzZXMoZW52KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoSVNfTlVMTChob3N0KSkgewogICAgICAgICBKTlVfVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJob3N0IGlzIG51bGwiKTsKQEAgLTM5MCwxNCArNDI5LDE0IEBACiAgICAgICAgIHJldExlbiA9IGk7CiAgICAgICAgIGl0ZXJhdG9yID0gcmVzTmV3OwogCi0gICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCByZXRMZW4sIGlhX2NsYXNzLCBOVUxMKTsKKyAgICAgICAgcmV0ID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIHJldExlbiwgbmlfaWFjbHMsIE5VTEwpOwogCiAgICAgICAgIGlmIChJU19OVUxMKHJldCkpIHsKICAgICAgICAgICAgIC8qIHdlIG1heSBoYXZlIG1lbW9yeSB0byBmcmVlIGF0IHRoZSBlbmQgb2YgdGhpcyAqLwogICAgICAgICAgICAgZ290byBjbGVhbnVwQW5kUmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCgqZW52KS0+R2V0U3RhdGljQm9vbGVhbkZpZWxkKGVudiwgaWFfY2xhc3MsIGlhX3ByZWZlcklQdjZBZGRyZXNzSUQpKSB7CisgICAgICAgIGlmIChwcmVmZXJJUHY2QWRkcmVzcykgewogICAgICAgICAgICAgLyogQUZfSU5FVCBhZGRyZXNzZXMgd2lsbCBiZSBvZmZzZXQgYnkgaW5ldDZDb3VudCAqLwogICAgICAgICAgICAgaW5ldEluZGV4ID0gaW5ldDZDb3VudDsKICAgICAgICAgICAgIGluZXQ2SW5kZXggPSAwOwpAQCAtNDEwLDcgKzQ0OSw3IEBACiAgICAgICAgIHdoaWxlIChpdGVyYXRvciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpbnQgcmV0MTsKICAgICAgICAgICAgIGlmIChpdGVyYXRvci0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAgICAgICAgICAgICBqb2JqZWN0IGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRjdHJJRCk7CiAgICAgICAgICAgICAgICAgaWYgKElTX05VTEwoaWFPYmopKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cEFuZFJldHVybjsKQEAgLTQyMiw3ICs0NjEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRvci0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAgICAgICAgICAgICAgICAgamludCBzY29wZSA9IDA7CiAKLSAgICAgICAgICAgICAgICBqb2JqZWN0IGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTZfY2xhc3MsIGlhNl9jdHJJRCk7CisgICAgICAgICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE2Y2xzLCBuaV9pYTZjdHJJRCk7CiAgICAgICAgICAgICAgICAgaWYgKElTX05VTEwoaWFPYmopKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cEFuZFJldHVybjsKQEAgLTUxNiw3ICs1NTUsNiBAQAogCiAgICAgaWYgKCFlcnJvcikgewogICAgICAgICByZXQgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGhvc3QpOwotICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihyZXQsIE5VTEwpOwogICAgIH0KICNlbmRpZiAvKiBBRl9JTkVUNiAqLwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2UuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCmluZGV4IDg5YTRlNGYuLjE3ODg5NDQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsOCArMjMsMTIgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCisKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpZiBkZWZpbmVkKF9BTExCU0RfU09VUkNFKSAmJiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMzQsMTUgKzM4LDE2IEBACiAjaW5jbHVkZSA8bmV0L2lmLmg+CiAjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgogCi0jaWYgZGVmaW5lZChfX3NvbGFyaXNfXykKKyNpZmRlZiBfX3NvbGFyaXNfXwogI2luY2x1ZGUgPHN5cy9kbHBpLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJvcHRzLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpZmRlZiBfX2xpbnV4X18KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxiaXRzL2lvY3Rscy5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNlbmRpZgpAQCAtNTQsNiArNTksMTAgQEAKICNpbmNsdWRlIDxzeXMva2luZm8uaD4KICNlbmRpZgogCisjaWZkZWYgX19saW51eF9fCisjZGVmaW5lIF9QQVRIX1BST0NORVRfSUZJTkVUNiAgICAgICAgICAgIi9wcm9jL25ldC9pZl9pbmV0NiIKKyNlbmRpZgorCiAjaWYgZGVmaW5lZChfQUxMQlNEX1NPVVJDRSkKICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KQEAgLTcxLDMwICs4MCw2IEBACiAjaW5jbHVkZSAiam5pX3V0aWwuaCIKICNpbmNsdWRlICJuZXRfdXRpbC5oIgogCi0jaWYgZGVmaW5lZChfX2xpbnV4X18pCi0gICAgI2RlZmluZSBfUEFUSF9QUk9DTkVUX0lGSU5FVDYgIi9wcm9jL25ldC9pZl9pbmV0NiIKLSNlbGlmIGRlZmluZWQoX19zb2xhcmlzX18pCi0gICAgI2lmbmRlZiBTSU9DR0xJRkhXQUREUgotICAgICAgICAjZGVmaW5lIFNJT0NHTElGSFdBRERSIF9JT1dSKCdpJywgMTkyLCBzdHJ1Y3QgbGlmcmVxKQotICAgICNlbmRpZgotICAgICNkZWZpbmUgREVWX1BSRUZJWCAiL2Rldi8iCi0jZW5kaWYKLQotI2lmZGVmIExJRk5BTVNJWgotICAgICNkZWZpbmUgSUZOQU1FU0laRSBMSUZOQU1TSVoKLSNlbHNlCi0gICAgI2RlZmluZSBJRk5BTUVTSVpFIElGTkFNU0laCi0jZW5kaWYKLQotI2RlZmluZSBDSEVDS0VEX01BTExPQzMoX3BvaW50ZXIsIF90eXBlLCBfc2l6ZSkgXAotICAgIGRvIHsgXAotICAgICAgICBfcG9pbnRlciA9IChfdHlwZSltYWxsb2MoX3NpemUpOyBcCi0gICAgICAgIGlmIChfcG9pbnRlciA9PSBOVUxMKSB7IFwKLSAgICAgICAgICAgIEpOVV9UaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCAiTmF0aXZlIGhlYXAgYWxsb2NhdGlvbiBmYWlsZWQiKTsgXAotICAgICAgICAgICAgcmV0dXJuIGlmczsgLyogcmV0dXJuIHVudG91Y2hlZCBsaXN0ICovIFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSgwKQotCiB0eXBlZGVmIHN0cnVjdCBfbmV0YWRkciAgewogICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmJyZGNhc3Q7CkBAIC0xMzMsNyArMTE4LDEyIEBACiBqZmllbGRJRCBuaV9kZWZhdWx0SW5kZXhJRDsKIGptZXRob2RJRCBuaV9jdHJJRDsKIAorc3RhdGljIGpjbGFzcyBuaV9pYWNsczsKK3N0YXRpYyBqY2xhc3MgbmlfaWE0Y2xzOworc3RhdGljIGpjbGFzcyBuaV9pYTZjbHM7CiBzdGF0aWMgamNsYXNzIG5pX2liY2xzOworc3RhdGljIGptZXRob2RJRCBuaV9pYTRjdHJJRDsKK3N0YXRpYyBqbWV0aG9kSUQgbmlfaWE2Y3RySUQ7CiBzdGF0aWMgam1ldGhvZElEIG5pX2liY3RySUQ7CiBzdGF0aWMgamZpZWxkSUQgbmlfaWJhZGRyZXNzSUQ7CiBzdGF0aWMgamZpZWxkSUQgbmlfaWI0YnJvYWRjYXN0SUQ7CkBAIC0xNDYsMzEgKzEzNiwzNSBAQAogc3RhdGljIG5ldGlmICAqZW51bUludGVyZmFjZXMoSk5JRW52ICplbnYpOwogc3RhdGljIG5ldGlmICAqZW51bUlQdjRJbnRlcmZhY2VzKEpOSUVudiAqZW52LCBpbnQgc29jaywgbmV0aWYgKmlmcyk7CiAKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQorI2lmZGVmIEFGX0lORVQ2CiBzdGF0aWMgbmV0aWYgICplbnVtSVB2NkludGVyZmFjZXMoSk5JRW52ICplbnYsIGludCBzb2NrLCBuZXRpZiAqaWZzKTsKICNlbmRpZgogCi1zdGF0aWMgbmV0aWYgICphZGRpZihKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmX25hbWUsIG5ldGlmICppZnMsCi0gICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmlmcl9hZGRyUCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqaWZyX2Jyb2FkYWRkclAsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZmFtaWx5LCBzaG9ydCBwcmVmaXgpOworc3RhdGljIG5ldGlmICAqYWRkaWYoSk5JRW52ICplbnYsIGludCBzb2NrLCBjb25zdCBjaGFyICogaWZfbmFtZSwgbmV0aWYgKmlmcywgc3RydWN0IHNvY2thZGRyKiBpZnJfYWRkclAsIGludCBmYW1pbHksIHNob3J0IHByZWZpeCk7CiBzdGF0aWMgdm9pZCAgICBmcmVlaWYobmV0aWYgKmlmcyk7CiAKIHN0YXRpYyBpbnQgICAgIG9wZW5Tb2NrZXQoSk5JRW52ICplbnYsIGludCBwcm90byk7CiBzdGF0aWMgaW50ICAgICBvcGVuU29ja2V0V2l0aEZhbGxiYWNrKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUpOwogCi1zdGF0aWMgc2hvcnQgICB0cmFuc2xhdGVJUHY0QWRkcmVzc1RvUHJlZml4KHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcik7Ci1zdGF0aWMgc2hvcnQgICB0cmFuc2xhdGVJUHY2QWRkcmVzc1RvUHJlZml4KHN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHIpOwogCitzdGF0aWMgc3RydWN0ICBzb2NrYWRkciAqZ2V0QnJvYWRjYXN0KEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICpicmRjYXN0X3N0b3JlKTsKK3N0YXRpYyBzaG9ydCAgIGdldFN1Ym5ldChKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSk7CiBzdGF0aWMgaW50ICAgICBnZXRJbmRleChpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lKTsKKwogc3RhdGljIGludCAgICAgZ2V0RmxhZ3MoaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50ICpmbGFncyk7Ci1zdGF0aWMgaW50ICAgICBnZXRNYWNBZGRyZXNzKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLCB1bnNpZ25lZCBjaGFyICpidWYpOworc3RhdGljIGludCAgICAgZ2V0TWFjQWRkcmVzcyhKTklFbnYgKmVudiwgaW50IHNvY2ssICBjb25zdCBjaGFyKiBpZm5hbWUsIGNvbnN0IHN0cnVjdCBpbl9hZGRyKiBhZGRyLCB1bnNpZ25lZCBjaGFyICpidWYpOwogc3RhdGljIGludCAgICAgZ2V0TVRVKEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lKTsKIAotI2lmIGRlZmluZWQoX19zb2xhcmlzX18pCi1zdGF0aWMgaW50ICAgICBnZXRNYWNGcm9tRGV2aWNlKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnJldGJ1Zik7CisKKworI2lmZGVmIF9fc29sYXJpc19fCitzdGF0aWMgbmV0aWYgKmVudW1JUHZYSW50ZXJmYWNlcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIG5ldGlmICppZnMsIGludCBmYW1pbHkpOworc3RhdGljIGludCAgICBnZXRNYWNGcm9tRGV2aWNlKEpOSUVudiAqZW52LCBjb25zdCBjaGFyKiBpZm5hbWUsIHVuc2lnbmVkIGNoYXIqIHJldGJ1Zik7CisKKyNpZm5kZWYgU0lPQ0dMSUZIV0FERFIKKyNkZWZpbmUgU0lPQ0dMSUZIV0FERFIgIF9JT1dSKCdpJywgMTkyLCBzdHJ1Y3QgbGlmcmVxKQorI2VuZGlmCisKICNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKiBKYXZhIGVudHJ5IHBvaW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE4MCw4OSArMTc0LDkxIEBACiAgKiBNZXRob2Q6ICAgIGluaXQKICAqIFNpZ25hdHVyZTogKClWCiAgKi8KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9qYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlX2luaXQKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzKQotewotICAgIG5pX2NsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZSIpOworSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAorSmF2YV9qYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlX2luaXQoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMpIHsKKyAgICBuaV9jbGFzcyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwiamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZSIpOwogICAgIENIRUNLX05VTEwobmlfY2xhc3MpOwogICAgIG5pX2NsYXNzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9jbGFzcyk7CiAgICAgQ0hFQ0tfTlVMTChuaV9jbGFzcyk7Ci0gICAgbmlfbmFtZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJuYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIG5pX25hbWVJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2NsYXNzLCJuYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwogICAgIENIRUNLX05VTEwobmlfbmFtZUlEKTsKICAgICBuaV9pbmRleElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJpbmRleCIsICJJIik7CiAgICAgQ0hFQ0tfTlVMTChuaV9pbmRleElEKTsKLSAgICBuaV9hZGRyc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJhZGRycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW0xqYXZhL25ldC9JbmV0QWRkcmVzczsiKTsKKyAgICBuaV9hZGRyc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJhZGRycyIsICJbTGphdmEvbmV0L0luZXRBZGRyZXNzOyIpOwogICAgIENIRUNLX05VTEwobmlfYWRkcnNJRCk7Ci0gICAgbmlfYmluZHNJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2NsYXNzLCAiYmluZGluZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltMamF2YS9uZXQvSW50ZXJmYWNlQWRkcmVzczsiKTsKKyAgICBuaV9iaW5kc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJiaW5kaW5ncyIsICJbTGphdmEvbmV0L0ludGVyZmFjZUFkZHJlc3M7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9iaW5kc0lEKTsKLSAgICBuaV9kZXNjSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBuaV9jbGFzcywgImRpc3BsYXlOYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOworICAgIG5pX2Rlc2NJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2NsYXNzLCAiZGlzcGxheU5hbWUiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9kZXNjSUQpOwogICAgIG5pX3ZpcnV0YWxJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2NsYXNzLCAidmlydHVhbCIsICJaIik7CiAgICAgQ0hFQ0tfTlVMTChuaV92aXJ1dGFsSUQpOwotICAgIG5pX2NoaWxkc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJjaGlsZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbTGphdmEvbmV0L05ldHdvcmtJbnRlcmZhY2U7Iik7CisgICAgbmlfY2hpbGRzSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBuaV9jbGFzcywgImNoaWxkcyIsICJbTGphdmEvbmV0L05ldHdvcmtJbnRlcmZhY2U7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9jaGlsZHNJRCk7Ci0gICAgbmlfcGFyZW50SUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBuaV9jbGFzcywgInBhcmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlOyIpOworICAgIG5pX3BhcmVudElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfY2xhc3MsICJwYXJlbnQiLCAiTGphdmEvbmV0L05ldHdvcmtJbnRlcmZhY2U7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9wYXJlbnRJRCk7CiAgICAgbmlfY3RySUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgbmlfY2xhc3MsICI8aW5pdD4iLCAiKClWIik7CiAgICAgQ0hFQ0tfTlVMTChuaV9jdHJJRCk7CisKKyAgICBuaV9pYWNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgQ0hFQ0tfTlVMTChuaV9pYWNscyk7CisgICAgbmlfaWFjbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIG5pX2lhY2xzKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhY2xzKTsKKyAgICBuaV9pYTRjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NEFkZHJlc3MiKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhNGNscyk7CisgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTRjbHMpOworICAgIENIRUNLX05VTEwobmlfaWE0Y2xzKTsKKyAgICBuaV9pYTZjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NkFkZHJlc3MiKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhNmNscyk7CisgICAgbmlfaWE2Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTZjbHMpOworICAgIENIRUNLX05VTEwobmlfaWE2Y2xzKTsKICAgICBuaV9pYmNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0ludGVyZmFjZUFkZHJlc3MiKTsKICAgICBDSEVDS19OVUxMKG5pX2liY2xzKTsKICAgICBuaV9pYmNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWJjbHMpOwogICAgIENIRUNLX05VTEwobmlfaWJjbHMpOworICAgIG5pX2lhNGN0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIG5pX2lhNGNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhNGN0cklEKTsKKyAgICBuaV9pYTZjdHJJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBuaV9pYTZjbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgQ0hFQ0tfTlVMTChuaV9pYTZjdHJJRCk7CiAgICAgbmlfaWJjdHJJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBuaV9pYmNscywgIjxpbml0PiIsICIoKVYiKTsKICAgICBDSEVDS19OVUxMKG5pX2liY3RySUQpOwotICAgIG5pX2liYWRkcmVzc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfaWJjbHMsICJhZGRyZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGphdmEvbmV0L0luZXRBZGRyZXNzOyIpOworICAgIG5pX2liYWRkcmVzc0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfaWJjbHMsICJhZGRyZXNzIiwgIkxqYXZhL25ldC9JbmV0QWRkcmVzczsiKTsKICAgICBDSEVDS19OVUxMKG5pX2liYWRkcmVzc0lEKTsKLSAgICBuaV9pYjRicm9hZGNhc3RJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2liY2xzLCAiYnJvYWRjYXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGphdmEvbmV0L0luZXQ0QWRkcmVzczsiKTsKKyAgICBuaV9pYjRicm9hZGNhc3RJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2liY2xzLCAiYnJvYWRjYXN0IiwgIkxqYXZhL25ldC9JbmV0NEFkZHJlc3M7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9pYjRicm9hZGNhc3RJRCk7CiAgICAgbmlfaWI0bWFza0lEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgbmlfaWJjbHMsICJtYXNrTGVuZ3RoIiwgIlMiKTsKICAgICBDSEVDS19OVUxMKG5pX2liNG1hc2tJRCk7Ci0gICAgbmlfZGVmYXVsdEluZGV4SUQgPSAoKmVudiktPkdldFN0YXRpY0ZpZWxkSUQoZW52LCBuaV9jbGFzcywgImRlZmF1bHRJbmRleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkiKTsKLSAgICBDSEVDS19OVUxMKG5pX2RlZmF1bHRJbmRleElEKTsKLQotICAgIGluaXRJbmV0QWRkcmVzc0lEcyhlbnYpOworICAgIG5pX2RlZmF1bHRJbmRleElEID0gKCplbnYpLT5HZXRTdGF0aWNGaWVsZElEKGVudiwgbmlfY2xhc3MsICJkZWZhdWx0SW5kZXgiLCAiSSIpOwogfQogCisKIC8qCiAgKiBDbGFzczogICAgIGphdmFfbmV0X05ldHdvcmtJbnRlcmZhY2UKICAqIE1ldGhvZDogICAgZ2V0QnlOYW1lMAogICogU2lnbmF0dXJlOiAoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlOwogICovCiBKTklFWFBPUlQgam9iamVjdCBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9nZXRCeU5hbWUwCi0gIChKTklFbnYgKmVudiwgamNsYXNzIGNscywganN0cmluZyBuYW1lKQoteworICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywganN0cmluZyBuYW1lKSB7CisKICAgICBuZXRpZiAqaWZzLCAqY3VycjsKICAgICBqYm9vbGVhbiBpc0NvcHk7CiAgICAgY29uc3QgY2hhciogbmFtZV91dGY7CiAgICAgam9iamVjdCBvYmogPSBOVUxMOwogCi0gICAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgICAgICBuYW1lX3V0ZiA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCAmaXNDb3B5KTsKLSAgICB9IGVsc2UgewotICAgICAgICBKTlVfVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJuZXR3b3JrIGludGVyZmFjZSBuYW1lIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG5hbWVfdXRmID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCEoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikpCi0gICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQogICAgIGlmcyA9IGVudW1JbnRlcmZhY2VzKGVudik7CiAgICAgaWYgKGlmcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIHNlYXJjaCB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGJhc2VkIG9uIG5hbWUKKyAgICBuYW1lX3V0ZiA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCAmaXNDb3B5KTsKKyAgICBpZiAobmFtZV91dGYgPT0gTlVMTCkgeworICAgICAgIGlmICghKCplbnYpLT5FeGNlcHRpb25DaGVjayhlbnYpKQorICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7CisgICAgICAgZnJlZWlmKGlmcyk7CisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qCisgICAgICogU2VhcmNoIHRoZSBsaXN0IG9mIGludGVyZmFjZSBiYXNlZCBvbiBuYW1lCisgICAgICovCiAgICAgY3VyciA9IGlmczsKICAgICB3aGlsZSAoY3VyciAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJjbXAobmFtZV91dGYsIGN1cnItPm5hbWUpID09IDApIHsKQEAgLTI3MSwyNiArMjY3LDI3IEBACiAgICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogICAgIH0KIAotICAgIC8vIGlmIGZvdW5kIGNyZWF0ZSBhIE5ldHdvcmtJbnRlcmZhY2UKLSAgICBpZiAoY3VyciAhPSBOVUxMKSB7CisgICAgLyogaWYgZm91bmQgY3JlYXRlIGEgTmV0d29ya0ludGVyZmFjZSAqLworICAgIGlmIChjdXJyICE9IE5VTEwpIHs7CiAgICAgICAgIG9iaiA9IGNyZWF0ZU5ldHdvcmtJbnRlcmZhY2UoZW52LCBjdXJyKTsKICAgICB9CiAKLSAgICAvLyByZWxlYXNlIHRoZSBVVEYgc3RyaW5nIGFuZCBpbnRlcmZhY2UgbGlzdAorICAgIC8qIHJlbGVhc2UgdGhlIFVURiBzdHJpbmcgYW5kIGludGVyZmFjZSBsaXN0ICovCiAgICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCBuYW1lX3V0Zik7CiAgICAgZnJlZWlmKGlmcyk7CiAKICAgICByZXR1cm4gb2JqOwogfQogCisKIC8qCiAgKiBDbGFzczogICAgIGphdmFfbmV0X05ldHdvcmtJbnRlcmZhY2UKICAqIE1ldGhvZDogICAgZ2V0QnlJbmRleDAKICAqIFNpZ25hdHVyZTogKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZTsKICAqLwogSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTCBKYXZhX2phdmFfbmV0X05ldHdvcmtJbnRlcmZhY2VfZ2V0QnlJbmRleDAKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqaW50IGluZGV4KQoteworICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscywgamludCBpbmRleCkgeworCiAgICAgbmV0aWYgKmlmcywgKmN1cnI7CiAgICAgam9iamVjdCBvYmogPSBOVUxMOwogCkBAIC0zMDMsNyArMzAwLDkgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2VhcmNoIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgYmFzZWQgb24gaW5kZXgKKyAgICAvKgorICAgICAqIFNlYXJjaCB0aGUgbGlzdCBvZiBpbnRlcmZhY2UgYmFzZWQgb24gaW5kZXgKKyAgICAgKi8KICAgICBjdXJyID0gaWZzOwogICAgIHdoaWxlIChjdXJyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGluZGV4ID09IGN1cnItPmluZGV4KSB7CkBAIC0zMTIsMTQgKzMxMSwxMiBAQAogICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKICAgICB9CiAKLSAgICAvLyBpZiBmb3VuZCBjcmVhdGUgYSBOZXR3b3JrSW50ZXJmYWNlCi0gICAgaWYgKGN1cnIgIT0gTlVMTCkgeworICAgIC8qIGlmIGZvdW5kIGNyZWF0ZSBhIE5ldHdvcmtJbnRlcmZhY2UgKi8KKyAgICBpZiAoY3VyciAhPSBOVUxMKSB7OwogICAgICAgICBvYmogPSBjcmVhdGVOZXR3b3JrSW50ZXJmYWNlKGVudiwgY3Vycik7CiAgICAgfQogCi0gICAgLy8gcmVsZWFzZSB0aGUgaW50ZXJmYWNlIGxpc3QKICAgICBmcmVlaWYoaWZzKTsKLQogICAgIHJldHVybiBvYmo7CiB9CiAKQEAgLTMyOSwxNCArMzI2LDE2IEBACiAgKiBTaWduYXR1cmU6IChMamF2YS9uZXQvSW5ldEFkZHJlc3M7KUxqYXZhL25ldC9OZXR3b3JrSW50ZXJmYWNlOwogICovCiBKTklFWFBPUlQgam9iamVjdCBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9nZXRCeUluZXRBZGRyZXNzMAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpvYmplY3QgaWFPYmopCi17CisgICAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqb2JqZWN0IGlhT2JqKSB7CisKICAgICBuZXRpZiAqaWZzLCAqY3VycjsKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQorCisjaWZkZWYgQUZfSU5FVDYKICAgICBpbnQgZmFtaWx5ID0gKGdldEluZXRBZGRyZXNzX2ZhbWlseShlbnYsIGlhT2JqKSA9PSBJUHY0KSA/IEFGX0lORVQgOiBBRl9JTkVUNjsKICNlbHNlCiAgICAgaW50IGZhbWlseSA9ICBBRl9JTkVUOwogI2VuZGlmCisKICAgICBqb2JqZWN0IG9iaiA9IE5VTEw7CiAgICAgamJvb2xlYW4gbWF0Y2ggPSBKTklfRkFMU0U7CiAKQEAgLTM0OSwxMyArMzQ4LDE0IEBACiAgICAgd2hpbGUgKGN1cnIgIT0gTlVMTCkgewogICAgICAgICBuZXRhZGRyICphZGRyUCA9IGN1cnItPmFkZHI7CiAKLSAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggYWRkcmVzcyBvbiB0aGUgaW50ZXJmYWNlCisgICAgICAgIC8qCisgICAgICAgICAqIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGFkZHJlc3Mgb24gdGhlIGludGVyZmFjZQorICAgICAgICAgKi8KICAgICAgICAgd2hpbGUgKGFkZHJQICE9IE5VTEwpIHsKIAogICAgICAgICAgICAgaWYgKGZhbWlseSA9PSBhZGRyUC0+ZmFtaWx5KSB7CiAgICAgICAgICAgICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhZGRyZXNzMSA9IGh0b25sKAotICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyUC0+YWRkciktPnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGludCBhZGRyZXNzMSA9IGh0b25sKCgoc3RydWN0IHNvY2thZGRyX2luKilhZGRyUC0+YWRkciktPnNpbl9hZGRyLnNfYWRkcik7CiAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyZXNzMiA9IGdldEluZXRBZGRyZXNzX2FkZHIoZW52LCBpYU9iaik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MxID09IGFkZHJlc3MyKSB7CkBAIC0zNjMsMTAgKzM2MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0jaWYgZGVmaW5lZChBRl9JTkVUNikKKworI2lmZGVmIEFGX0lORVQ2CiAgICAgICAgICAgICAgICAgaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgewotICAgICAgICAgICAgICAgICAgICBqYnl0ZSAqYnl0ZXMgPSAoamJ5dGUgKikmKAotICAgICAgICAgICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyUC0+YWRkciktPnNpbjZfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGpieXRlICpieXRlcyA9IChqYnl0ZSAqKSYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyUC0+YWRkciktPnNpbjZfYWRkcik7CiAgICAgICAgICAgICAgICAgICAgIGpieXRlIGNhZGRyWzE2XTsKICAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgICAgIGdldEluZXQ2QWRkcmVzc19pcGFkZHJlc3MoZW52LCBpYU9iaiwgKGNoYXIgKiljYWRkcik7CkBAIC0zODMsNiArMzgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICNlbmRpZgorCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtYXRjaCkgewpAQCAtMzk3LDI1ICszOTgsMjQgQEAKICAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICAgfQogCi0gICAgLy8gaWYgZm91bmQgY3JlYXRlIGEgTmV0d29ya0ludGVyZmFjZQotICAgIGlmIChtYXRjaCkgeworICAgIC8qIGlmIGZvdW5kIGNyZWF0ZSBhIE5ldHdvcmtJbnRlcmZhY2UgKi8KKyAgICBpZiAobWF0Y2gpIHs7CiAgICAgICAgIG9iaiA9IGNyZWF0ZU5ldHdvcmtJbnRlcmZhY2UoZW52LCBjdXJyKTsKICAgICB9CiAKLSAgICAvLyByZWxlYXNlIHRoZSBpbnRlcmZhY2UgbGlzdAogICAgIGZyZWVpZihpZnMpOwotCiAgICAgcmV0dXJuIG9iajsKIH0KIAorCiAvKgogICogQ2xhc3M6ICAgICBqYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlCiAgKiBNZXRob2Q6ICAgIGdldEFsbAogICogU2lnbmF0dXJlOiAoKVtMamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZTsKICAqLwogSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9nZXRBbGwKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzKQoteworICAgIChKTklFbnYgKmVudiwgamNsYXNzIGNscykgeworCiAgICAgbmV0aWYgKmlmcywgKmN1cnI7CiAgICAgam9iamVjdEFycmF5IG5ldElGQXJyOwogICAgIGppbnQgYXJyX2luZGV4LCBpZkNvdW50OwpAQCAtNDI1LDcgKzQyNSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIGNvdW50IHRoZSBpbnRlcmZhY2VzCisgICAgLyogY291bnQgdGhlIGludGVyZmFjZSAqLwogICAgIGlmQ291bnQgPSAwOwogICAgIGN1cnIgPSBpZnM7CiAgICAgd2hpbGUgKGN1cnIgIT0gTlVMTCkgewpAQCAtNDMzLDE1ICs0MzMsMTcgQEAKICAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICAgfQogCi0gICAgLy8gYWxsb2NhdGUgYSBOZXR3b3JrSW50ZXJmYWNlIGFycmF5CisgICAgLyogYWxsb2NhdGUgYSBOZXR3b3JrSW50ZXJmYWNlIGFycmF5ICovCiAgICAgbmV0SUZBcnIgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgaWZDb3VudCwgY2xzLCBOVUxMKTsKICAgICBpZiAobmV0SUZBcnIgPT0gTlVMTCkgewogICAgICAgICBmcmVlaWYoaWZzKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBpbnRlcmZhY2VzLCBjcmVhdGUgYSBOZXR3b3JrSW50ZXJmYWNlIGluc3RhbmNlCi0gICAgLy8gZm9yIGVhY2ggYXJyYXkgZWxlbWVudCBhbmQgcG9wdWxhdGUgdGhlIG9iamVjdAorICAgIC8qCisgICAgICogSXRlcmF0ZSB0aHJvdWdoIHRoZSBpbnRlcmZhY2VzLCBjcmVhdGUgYSBOZXR3b3JrSW50ZXJmYWNlIGluc3RhbmNlCisgICAgICogZm9yIGVhY2ggYXJyYXkgZWxlbWVudCBhbmQgcG9wdWxhdGUgdGhlIG9iamVjdC4KKyAgICAgKi8KICAgICBjdXJyID0gaWZzOwogICAgIGFycl9pbmRleCA9IDA7CiAgICAgd2hpbGUgKGN1cnIgIT0gTlVMTCkgewpAQCAtNDUzLDI2ICs0NTUsMjMgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gcHV0IHRoZSBOZXR3b3JrSW50ZXJmYWNlIGludG8gdGhlIGFycmF5CisgICAgICAgIC8qIHB1dCB0aGUgTmV0d29ya0ludGVyZmFjZSBpbnRvIHRoZSBhcnJheSAqLwogICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIG5ldElGQXJyLCBhcnJfaW5kZXgrKywgbmV0aWZPYmopOwogCiAgICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogICAgIH0KIAotICAgIC8vIHJlbGVhc2UgdGhlIGludGVyZmFjZSBsaXN0CiAgICAgZnJlZWlmKGlmcyk7Ci0KICAgICByZXR1cm4gbmV0SUZBcnI7CiB9CiAKKwogLyoKICAqIENsYXNzOiAgICAgamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZQogICogTWV0aG9kOiAgICBpc1VwMAogICogU2lnbmF0dXJlOiAoTGphdmEvbGFuZy9TdHJpbmc7SSlaCiAgKi8KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9pc1VwMAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkKLXsKK0pOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9pc1VwMChKTklFbnYgKmVudiwgamNsYXNzIGNscywganN0cmluZyBuYW1lLCBqaW50IGluZGV4KSB7CiAgICAgaW50IHJldCA9IGdldEZsYWdzMChlbnYsIG5hbWUpOwogICAgIHJldHVybiAoKHJldCAmIElGRl9VUCkgJiYgKHJldCAmIElGRl9SVU5OSU5HKSkgPyBKTklfVFJVRSA6ICBKTklfRkFMU0U7CiB9CkBAIC00ODIsOSArNDgxLDcgQEAKICAqIE1ldGhvZDogICAgaXNQMlAwCiAgKiBTaWduYXR1cmU6IChMamF2YS9sYW5nL1N0cmluZztJKVoKICAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlX2lzUDJQMAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkKLXsKK0pOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9pc1AyUDAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkgewogICAgIGludCByZXQgPSBnZXRGbGFnczAoZW52LCBuYW1lKTsKICAgICByZXR1cm4gKHJldCAmIElGRl9QT0lOVE9QT0lOVCkgPyBKTklfVFJVRSA6ICBKTklfRkFMU0U7CiB9CkBAIC00OTQsOSArNDkxLDcgQEAKICAqIE1ldGhvZDogICAgaXNMb29wYmFjazAKICAqIFNpZ25hdHVyZTogKExqYXZhL2xhbmcvU3RyaW5nO0kpWgogICovCi1KTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2phdmFfbmV0X05ldHdvcmtJbnRlcmZhY2VfaXNMb29wYmFjazAKLSAgKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLCBqc3RyaW5nIG5hbWUsIGppbnQgaW5kZXgpCi17CitKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX2phdmFfbmV0X05ldHdvcmtJbnRlcmZhY2VfaXNMb29wYmFjazAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkgewogICAgIGludCByZXQgPSBnZXRGbGFnczAoZW52LCBuYW1lKTsKICAgICByZXR1cm4gKHJldCAmIElGRl9MT09QQkFDSykgPyBKTklfVFJVRSA6ICBKTklfRkFMU0U7CiB9CkBAIC01MDYsOSArNTAxLDcgQEAKICAqIE1ldGhvZDogICAgc3VwcG9ydHNNdWx0aWNhc3QwCiAgKiBTaWduYXR1cmU6IChMamF2YS9sYW5nL1N0cmluZztJKVoKICAqLwotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwgSmF2YV9qYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlX3N1cHBvcnRzTXVsdGljYXN0MAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkKLXsKK0pOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9zdXBwb3J0c011bHRpY2FzdDAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkgewogICAgIGludCByZXQgPSBnZXRGbGFnczAoZW52LCBuYW1lKTsKICAgICByZXR1cm4gKHJldCAmIElGRl9NVUxUSUNBU1QpID8gSk5JX1RSVUUgOiAgSk5JX0ZBTFNFOwogfQpAQCAtNTE4LDU0ICs1MTEsNTQgQEAKICAqIE1ldGhvZDogICAgZ2V0TWFjQWRkcjAKICAqIFNpZ25hdHVyZTogKFtiTGphdmEvbGFuZy9TdHJpbmc7SSlbYgogICovCi1KTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9nZXRNYWNBZGRyMAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpieXRlQXJyYXkgYWRkckFycmF5LCBqc3RyaW5nIG5hbWUsIGppbnQgaW5kZXgpCi17CitKTklFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfamF2YV9uZXRfTmV0d29ya0ludGVyZmFjZV9nZXRNYWNBZGRyMChKTklFbnYgKmVudiwgamNsYXNzIGNsYXNzLCBqYnl0ZUFycmF5IGFkZHJBcnJheSwganN0cmluZyBuYW1lLCBqaW50IGluZGV4KSB7CiAgICAgamludCBhZGRyOwogICAgIGpieXRlIGNhZGRyWzRdOwogICAgIHN0cnVjdCBpbl9hZGRyIGlhZGRyOwogICAgIGpieXRlQXJyYXkgcmV0ID0gTlVMTDsKICAgICB1bnNpZ25lZCBjaGFyIG1hY1sxNl07CiAgICAgaW50IGxlbjsKKyAgICBpbnQgc29jazsKICAgICBqYm9vbGVhbiBpc0NvcHk7Ci0gICAgY29uc3QgY2hhciAqbmFtZV91dGY7CisgICAgY29uc3QgY2hhciogbmFtZV91dGY7CiAKLSAgICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5hbWVfdXRmID0gKCplbnYpLT5HZXRTdHJpbmdVVEZDaGFycyhlbnYsIG5hbWUsICZpc0NvcHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEpOVV9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm5ldHdvcmsgaW50ZXJmYWNlIG5hbWUgaXMgTlVMTCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KKyAgICBuYW1lX3V0ZiA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCAmaXNDb3B5KTsKICAgICBpZiAobmFtZV91dGYgPT0gTlVMTCkgewotICAgICAgICBpZiAoISgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkKLSAgICAgICAgICAgIEpOVV9UaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgaWYgKCEoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikpCisgICAgICAgICAgIEpOVV9UaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCBOVUxMKTsKKyAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgaWYgKChzb2NrID0gb3BlblNvY2tldFdpdGhGYWxsYmFjayhlbnYsIG5hbWVfdXRmKSkgPCAwKSB7CisgICAgICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCBuYW1lX3V0Zik7CisgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAKICAgICBpZiAoIUlTX05VTEwoYWRkckFycmF5KSkgewotICAgICAgICAoKmVudiktPkdldEJ5dGVBcnJheVJlZ2lvbihlbnYsIGFkZHJBcnJheSwgMCwgNCwgY2FkZHIpOwotICAgICAgICBhZGRyID0gKChjYWRkclswXTw8MjQpICYgMHhmZjAwMDAwMCk7Ci0gICAgICAgIGFkZHIgfD0gKChjYWRkclsxXSA8PDE2KSAmIDB4ZmYwMDAwKTsKLSAgICAgICAgYWRkciB8PSAoKGNhZGRyWzJdIDw8OCkgJiAweGZmMDApOwotICAgICAgICBhZGRyIHw9IChjYWRkclszXSAmIDB4ZmYpOwotICAgICAgICBpYWRkci5zX2FkZHIgPSBodG9ubChhZGRyKTsKLSAgICAgICAgbGVuID0gZ2V0TWFjQWRkcmVzcyhlbnYsIG5hbWVfdXRmLCAmaWFkZHIsIG1hYyk7CisgICAgICAgKCplbnYpLT5HZXRCeXRlQXJyYXlSZWdpb24oZW52LCBhZGRyQXJyYXksIDAsIDQsIGNhZGRyKTsKKyAgICAgICBhZGRyID0gKChjYWRkclswXTw8MjQpICYgMHhmZjAwMDAwMCk7CisgICAgICAgYWRkciB8PSAoKGNhZGRyWzFdIDw8MTYpICYgMHhmZjAwMDApOworICAgICAgIGFkZHIgfD0gKChjYWRkclsyXSA8PDgpICYgMHhmZjAwKTsKKyAgICAgICBhZGRyIHw9IChjYWRkclszXSAmIDB4ZmYpOworICAgICAgIGlhZGRyLnNfYWRkciA9IGh0b25sKGFkZHIpOworICAgICAgIGxlbiA9IGdldE1hY0FkZHJlc3MoZW52LCBzb2NrLCBuYW1lX3V0ZiwgJmlhZGRyLCBtYWMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGxlbiA9IGdldE1hY0FkZHJlc3MoZW52LCBuYW1lX3V0ZiwgTlVMTCwgbWFjKTsKKyAgICAgICBsZW4gPSBnZXRNYWNBZGRyZXNzKGVudiwgc29jaywgbmFtZV91dGYsTlVMTCwgbWFjKTsKICAgICB9Ci0KICAgICBpZiAobGVuID4gMCkgewotICAgICAgICByZXQgPSAoKmVudiktPk5ld0J5dGVBcnJheShlbnYsIGxlbik7Ci0gICAgICAgIGlmICghSVNfTlVMTChyZXQpKSB7Ci0gICAgICAgICAgICAoKmVudiktPlNldEJ5dGVBcnJheVJlZ2lvbihlbnYsIHJldCwgMCwgbGVuLCAoamJ5dGUgKikobWFjKSk7Ci0gICAgICAgIH0KKyAgICAgICByZXQgPSAoKmVudiktPk5ld0J5dGVBcnJheShlbnYsIGxlbik7CisgICAgICAgaWYgKElTX05VTEwocmV0KSkgeworICAgICAgICAgIC8qIHdlIG1heSBoYXZlIG1lbW9yeSB0byBmcmVlIGF0IHRoZSBlbmQgb2YgdGhpcyAqLworICAgICAgICAgIGdvdG8gZmV4aXQ7CisgICAgICAgfQorICAgICAgICgqZW52KS0+U2V0Qnl0ZUFycmF5UmVnaW9uKGVudiwgcmV0LCAwLCBsZW4sIChqYnl0ZSAqKSAobWFjKSk7CiAgICAgfQorIGZleGl0OgorICAgLyogcmVsZWFzZSB0aGUgVVRGIHN0cmluZyBhbmQgaW50ZXJmYWNlIGxpc3QgKi8KKyAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudiwgbmFtZSwgbmFtZV91dGYpOwogCi0gICAgLy8gcmVsZWFzZSB0aGUgVVRGIHN0cmluZyBhbmQgaW50ZXJmYWNlIGxpc3QKLSAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIG5hbWUsIG5hbWVfdXRmKTsKLQotICAgIHJldHVybiByZXQ7CisgICBjbG9zZShzb2NrKTsKKyAgIHJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC01NzMsMTEgKzU2NiwxMSBAQAogICogTWV0aG9kOiAgICAgIGdldE1UVTAKICAqIFNpZ25hdHVyZTogICAoW2JMamF2YS9sYW5nL1N0cmluZztJKUkKICAqLwotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2phdmFfbmV0X05ldHdvcmtJbnRlcmZhY2VfZ2V0TVRVMAotICAoSk5JRW52ICplbnYsIGpjbGFzcyBjbHMsIGpzdHJpbmcgbmFtZSwgamludCBpbmRleCkKLXsKKworSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2phdmFfbmV0X05ldHdvcmtJbnRlcmZhY2VfZ2V0TVRVMChKTklFbnYgKmVudiwgamNsYXNzIGNsYXNzLCBqc3RyaW5nIG5hbWUsIGppbnQgaW5kZXgpIHsKICAgICBqYm9vbGVhbiBpc0NvcHk7Ci0gICAgaW50IHNvY2ssIHJldCA9IC0xOworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgc29jazsKICAgICBjb25zdCBjaGFyKiBuYW1lX3V0ZiA9IE5VTEw7CiAKICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CkBAIC01ODYsMTYgKzU3OSwxNSBAQAogICAgICAgICBKTlVfVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJuZXR3b3JrIGludGVyZmFjZSBuYW1lIGlzIE5VTEwiKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0KICAgICBpZiAobmFtZV91dGYgPT0gTlVMTCkgewotICAgICAgICBpZiAoISgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkKLSAgICAgICAgICAgIEpOVV9UaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICBpZiAoISgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkKKyAgICAgICAgICAgSk5VX1Rocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsIE5VTEwpOworICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgaWYgKChzb2NrID0gb3BlblNvY2tldFdpdGhGYWxsYmFjayhlbnYsIG5hbWVfdXRmKSkgPCAwKSB7Ci0gICAgICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudiwgbmFtZSwgbmFtZV91dGYpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIGlmICgoc29jayA9b3BlblNvY2tldFdpdGhGYWxsYmFjayhlbnYsIG5hbWVfdXRmKSkgPCAwKSB7CisgICAgICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCBuYW1lX3V0Zik7CisgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKICAgICB9CiAKICAgICByZXQgPSBnZXRNVFUoZW52LCBzb2NrLCBuYW1lX3V0Zik7CkBAIC02MTAsOCArNjAyLDkgQEAKIAogc3RhdGljIGludCBnZXRGbGFnczAoSk5JRW52ICplbnYsIGpzdHJpbmcgbmFtZSkgewogICAgIGpib29sZWFuIGlzQ29weTsKLSAgICBpbnQgcmV0LCBzb2NrLCBmbGFncyA9IDA7Ci0gICAgY29uc3QgY2hhciAqbmFtZV91dGY7CisgICAgaW50IHJldCwgc29jazsKKyAgICBjb25zdCBjaGFyKiBuYW1lX3V0ZjsKKyAgICBpbnQgZmxhZ3MgPSAwOwogCiAgICAgaWYgKG5hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lX3V0ZiA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBuYW1lLCAmaXNDb3B5KTsKQEAgLTYxOSwxMSArNjEyLDEwIEBACiAgICAgICAgIEpOVV9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm5ldHdvcmsgaW50ZXJmYWNlIG5hbWUgaXMgTlVMTCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotCiAgICAgaWYgKG5hbWVfdXRmID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCEoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikpCi0gICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICBpZiAoISgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkKKyAgICAgICAgICAgSk5VX1Rocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsIE5VTEwpOworICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKChzb2NrID0gb3BlblNvY2tldFdpdGhGYWxsYmFjayhlbnYsIG5hbWVfdXRmKSkgPCAwKSB7CiAgICAgICAgICgqZW52KS0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGVudiwgbmFtZSwgbmFtZV91dGYpOwpAQCAtNjM2LDIwICs2MjgsMjIgQEAKICAgICAoKmVudiktPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhlbnYsIG5hbWUsIG5hbWVfdXRmKTsKIAogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IKLSAgICAgICAgICAgIChlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiZ2V0RmxhZ3MoKSBmYWlsZWQiKTsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgIFNJT0NHTElGRkxBR1MgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICByZXR1cm4gZmxhZ3M7CiB9CiAKKworCisKIC8qCi0gKiBDcmVhdGVzIGEgTmV0d29ya0ludGVyZmFjZSBvYmplY3QsIHBvcHVsYXRlcyB0aGUgbmFtZSwgdGhlIGluZGV4LCBhbmQKLSAqIHBvcHVsYXRlcyB0aGUgSW5ldEFkZHJlc3MgYXJyYXkgYmFzZWQgb24gdGhlIElQIGFkZHJlc3NlcyBmb3IgdGhpcworICogQ3JlYXRlIGEgTmV0d29ya0ludGVyZmFjZSBvYmplY3QsIHBvcHVsYXRlIHRoZSBuYW1lIGFuZCBpbmRleCwgYW5kCisgKiBwb3B1bGF0ZSB0aGUgSW5ldEFkZHJlc3MgYXJyYXkgYmFzZWQgb24gdGhlIElQIGFkZHJlc3NlcyBmb3IgdGhpcwogICogaW50ZXJmYWNlLgogICovCi1zdGF0aWMgam9iamVjdCBjcmVhdGVOZXR3b3JrSW50ZXJmYWNlKEpOSUVudiAqZW52LCBuZXRpZiAqaWZzKSB7Citqb2JqZWN0IGNyZWF0ZU5ldHdvcmtJbnRlcmZhY2UoSk5JRW52ICplbnYsIG5ldGlmICppZnMpIHsKICAgICBqb2JqZWN0IG5ldGlmT2JqOwogICAgIGpvYmplY3QgbmFtZTsKICAgICBqb2JqZWN0QXJyYXkgYWRkckFycjsKQEAgLTY2Miw3ICs2NTYsOSBAQAogICAgIG5ldGlmICpjaGlsZFA7CiAgICAgam9iamVjdCB0bXA7CiAKLSAgICAvLyBjcmVhdGUgYSBOZXR3b3JrSW50ZXJmYWNlIG9iamVjdCBhbmQgcG9wdWxhdGUgaXQKKyAgICAvKgorICAgICAqIENyZWF0ZSBhIE5ldHdvcmtJbnRlcmZhY2Ugb2JqZWN0IGFuZCBwb3B1bGF0ZSBpdAorICAgICAqLwogICAgIG5ldGlmT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9jbGFzcywgbmlfY3RySUQpOwogICAgIENIRUNLX05VTExfUkVUVVJOKG5ldGlmT2JqLCBOVUxMKTsKICAgICBuYW1lID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBpZnMtPm5hbWUpOwpAQCAtNjcwLDEwICs2NjYsMTEgQEAKICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgbmV0aWZPYmosIG5pX25hbWVJRCwgbmFtZSk7CiAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG5ldGlmT2JqLCBuaV9kZXNjSUQsIG5hbWUpOwogICAgICgqZW52KS0+U2V0SW50RmllbGQoZW52LCBuZXRpZk9iaiwgbmlfaW5kZXhJRCwgaWZzLT5pbmRleCk7Ci0gICAgKCplbnYpLT5TZXRCb29sZWFuRmllbGQoZW52LCBuZXRpZk9iaiwgbmlfdmlydXRhbElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcy0+dmlydHVhbCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFKTsKKyAgICAoKmVudiktPlNldEJvb2xlYW5GaWVsZChlbnYsIG5ldGlmT2JqLCBuaV92aXJ1dGFsSUQsIGlmcy0+dmlydHVhbCA/IEpOSV9UUlVFIDogSk5JX0ZBTFNFKTsKIAotICAgIC8vIGNvdW50IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzIG9uIHRoaXMgaW50ZXJmYWNlCisgICAgLyoKKyAgICAgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGFkZHJlc3Mgb24gdGhpcyBpbnRlcmZhY2UKKyAgICAgKi8KICAgICBhZGRyX2NvdW50ID0gMDsKICAgICBhZGRyUCA9IGlmcy0+YWRkcjsKICAgICB3aGlsZSAoYWRkclAgIT0gTlVMTCkgewpAQCAtNjgxLDggKzY3OCwxMCBAQAogICAgICAgICBhZGRyUCA9IGFkZHJQLT5uZXh0OwogICAgIH0KIAotICAgIC8vIGNyZWF0ZSB0aGUgYXJyYXkgb2YgSW5ldEFkZHJlc3NlcwotICAgIGFkZHJBcnIgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgYWRkcl9jb3VudCwgIGlhX2NsYXNzLCBOVUxMKTsKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgYXJyYXkgb2YgSW5ldEFkZHJlc3NlcworICAgICAqLworICAgIGFkZHJBcnIgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgYWRkcl9jb3VudCwgIG5pX2lhY2xzLCBOVUxMKTsKICAgICBpZiAoYWRkckFyciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTY5OSw0MCArNjk4LDM4IEBACiAgICAgICAgIGpvYmplY3QgaWJPYmogPSBOVUxMOwogCiAgICAgICAgIGlmIChhZGRyUC0+ZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRjdHJJRCk7CiAgICAgICAgICAgICBpZiAoaWFPYmopIHsKLSAgICAgICAgICAgICAgICBzZXRJbmV0QWRkcmVzc19hZGRyKGVudiwgaWFPYmosIGh0b25sKAotICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkclAtPmFkZHIpLT5zaW5fYWRkci5zX2FkZHIpKTsKKyAgICAgICAgICAgICAgICAgc2V0SW5ldEFkZHJlc3NfYWRkcihlbnYsIGlhT2JqLCBodG9ubCgoKHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkclAtPmFkZHIpLT5zaW5fYWRkci5zX2FkZHIpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpYk9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWJjbHMsIG5pX2liY3RySUQpOwogICAgICAgICAgICAgaWYgKGliT2JqKSB7Ci0gICAgICAgICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIGliT2JqLCBuaV9pYmFkZHJlc3NJRCwgaWFPYmopOwotICAgICAgICAgICAgICAgIGlmIChhZGRyUC0+YnJkY2FzdCkgeworICAgICAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgaWJPYmosIG5pX2liYWRkcmVzc0lELCBpYU9iaik7CisgICAgICAgICAgICAgICAgIGlmIChhZGRyUC0+YnJkY2FzdCkgewogICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGlhMk9iaiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGlhMk9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE0X2NsYXNzLCBpYTRfY3RySUQpOworICAgICAgICAgICAgICAgICAgICBpYTJPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNGNscywgbmlfaWE0Y3RySUQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaWEyT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRJbmV0QWRkcmVzc19hZGRyKGVudiwgaWEyT2JqLCBodG9ubCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkclAtPmJyZGNhc3QpLT5zaW5fYWRkci5zX2FkZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBpYk9iaiwgbmlfaWI0YnJvYWRjYXN0SUQsIGlhMk9iaik7CisgICAgICAgICAgICAgICAgICAgICAgIHNldEluZXRBZGRyZXNzX2FkZHIoZW52LCBpYTJPYmosIGh0b25sKCgoc3RydWN0IHNvY2thZGRyX2luKilhZGRyUC0+YnJkY2FzdCktPnNpbl9hZGRyLnNfYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgaWJPYmosIG5pX2liNGJyb2FkY2FzdElELCBpYTJPYmopOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgaWJPYmosIG5pX2liNG1hc2tJRCwgYWRkclAtPm1hc2spOwotICAgICAgICAgICAgICAgICgqZW52KS0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGVudiwgYmluZEFyciwgYmluZF9pbmRleCsrLCBpYk9iaik7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgaWJPYmosIG5pX2liNG1hc2tJRCwgYWRkclAtPm1hc2spOworICAgICAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGJpbmRBcnIsIGJpbmRfaW5kZXgrKywgaWJPYmopOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2lmIGRlZmluZWQoQUZfSU5FVDYpCisKKyNpZmRlZiBBRl9JTkVUNgogICAgICAgICBpZiAoYWRkclAtPmZhbWlseSA9PSBBRl9JTkVUNikgewogICAgICAgICAgICAgaW50IHNjb3BlPTA7Ci0gICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE2X2NsYXNzLCBpYTZfY3RySUQpOworICAgICAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNmNscywgbmlfaWE2Y3RySUQpOwogICAgICAgICAgICAgaWYgKGlhT2JqKSB7Ci0gICAgICAgICAgICAgICAgamJvb2xlYW4gcmV0ID0gc2V0SW5ldDZBZGRyZXNzX2lwYWRkcmVzcyhlbnYsIGlhT2JqLAotICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyUC0+YWRkciktPnNpbjZfYWRkcikpOworICAgICAgICAgICAgICAgIGludCByZXQgPSBzZXRJbmV0NkFkZHJlc3NfaXBhZGRyZXNzKGVudiwgaWFPYmosIChjaGFyICopJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKWFkZHJQLT5hZGRyKS0+c2luNl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBKTklfRkFMU0UpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzYxLDcgKzc1OCw5IEBACiAgICAgICAgIGFkZHJQID0gYWRkclAtPm5leHQ7CiAgICAgfQogCi0gICAgLy8gc2VlIGlmIHRoZXJlIGlzIGFueSB2aXJ0dWFsIGludGVyZmFjZSBhdHRhY2hlZCB0byB0aGlzIG9uZS4KKyAgICAvKgorICAgICAqIFNlZSBpZiB0aGVyZSBpcyBhbnkgdmlydHVhbCBpbnRlcmZhY2UgYXR0YWNoZWQgdG8gdGhpcyBvbmUuCisgICAgICovCiAgICAgY2hpbGRfY291bnQgPSAwOwogICAgIGNoaWxkUCA9IGlmcy0+Y2hpbGRzOwogICAgIHdoaWxlIChjaGlsZFApIHsKQEAgLTc3NCwyMyArNzczLDI2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIGNyZWF0ZSB0aGUgTmV0d29ya0ludGVyZmFjZSBpbnN0YW5jZXMgZm9yIHRoZSBzdWItaW50ZXJmYWNlcyBhcyB3ZWxsCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIE5ldHdvcmtJbnRlcmZhY2UgaW5zdGFuY2VzIGZvciB0aGUgc3ViLWludGVyZmFjZXMgYXMKKyAgICAgKiB3ZWxsLgorICAgICAqLwogICAgIGNoaWxkX2luZGV4ID0gMDsKICAgICBjaGlsZFAgPSBpZnMtPmNoaWxkczsKICAgICB3aGlsZShjaGlsZFApIHsKLSAgICAgICAgdG1wID0gY3JlYXRlTmV0d29ya0ludGVyZmFjZShlbnYsIGNoaWxkUCk7Ci0gICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIHRtcCwgbmlfcGFyZW50SUQsIG5ldGlmT2JqKTsKLSAgICAgICAgKCplbnYpLT5TZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBjaGlsZEFyciwgY2hpbGRfaW5kZXgrKywgdG1wKTsKLSAgICAgICAgY2hpbGRQID0gY2hpbGRQLT5uZXh0OworICAgICAgdG1wID0gY3JlYXRlTmV0d29ya0ludGVyZmFjZShlbnYsIGNoaWxkUCk7CisgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIHRtcCwgbmlfcGFyZW50SUQsIG5ldGlmT2JqKTsKKyAgICAgICgqZW52KS0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGVudiwgY2hpbGRBcnIsIGNoaWxkX2luZGV4KyssIHRtcCk7CisgICAgICBjaGlsZFAgPSBjaGlsZFAtPm5leHQ7CiAgICAgfQogICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBuZXRpZk9iaiwgbmlfYWRkcnNJRCwgYWRkckFycik7CiAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG5ldGlmT2JqLCBuaV9iaW5kc0lELCBiaW5kQXJyKTsKICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgbmV0aWZPYmosIG5pX2NoaWxkc0lELCBjaGlsZEFycik7CiAKLSAgICAvLyByZXR1cm4gdGhlIE5ldHdvcmtJbnRlcmZhY2UKKyAgICAvKiByZXR1cm4gdGhlIE5ldHdvcmtJbnRlcmZhY2UgKi8KICAgICByZXR1cm4gbmV0aWZPYmo7CiB9CiAKQEAgLTc5OCw1MSArODAwLDcxIEBACiAgKiBFbnVtZXJhdGVzIGFsbCBpbnRlcmZhY2VzCiAgKi8KIHN0YXRpYyBuZXRpZiAqZW51bUludGVyZmFjZXMoSk5JRW52ICplbnYpIHsKLSAgICBuZXRpZiAqaWZzID0gTlVMTDsKKyAgICBuZXRpZiAqaWZzOwogICAgIGludCBzb2NrOwogCisgICAgLyoKKyAgICAgKiBFbnVtZXJhdGUgSVB2NCBhZGRyZXNzZXMKKyAgICAgKi8KKwogICAgIHNvY2sgPSBvcGVuU29ja2V0KGVudiwgQUZfSU5FVCk7CiAgICAgaWYgKHNvY2sgPCAwICYmICgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBlbnVtZXJhdGUgSVB2NCBhZGRyZXNzZXMKICAgICBpZnMgPSBlbnVtSVB2NEludGVyZmFjZXMoZW52LCBzb2NrLCBOVUxMKTsKICAgICBjbG9zZShzb2NrKTsKIAotICAgIC8vIHJldHVybiBwYXJ0aWFsIGxpc3QgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc3MgPz8/CiAgICAgaWYgKGlmcyA9PSBOVUxMICYmICgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBJZiBJUHY2IGlzIGF2YWlsYWJsZSB0aGVuIGVudW1lcmF0ZSBJUHY2IGFkZHJlc3Nlcy4KLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQotICAgICAgICAvLyBVc2VyIGNhbiBkaXNhYmxlIGlwdjYgZXhwbGljaXRseSBieSAtRGphdmEubmV0LnByZWZlcklQdjRTdGFjaz10cnVlLAotICAgICAgICAvLyBzbyB3ZSBoYXZlIHRvIGNhbGwgaXB2Nl9hdmFpbGFibGUoKQorICAgIC8qIHJldHVybiBwYXJ0aWFsIGxpc3QgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc3MgPz8/Ki8KKworICAgIC8qCisgICAgICogSWYgSVB2NiBpcyBhdmFpbGFibGUgdGhlbiBlbnVtZXJhdGUgSVB2NiBhZGRyZXNzZXMuCisgICAgICovCisjaWZkZWYgQUZfSU5FVDYKKworICAgICAgICAvKiBVc2VyIGNhbiBkaXNhYmxlIGlwdjYgZXhwbGljaXRseSBieSAtRGphdmEubmV0LnByZWZlcklQdjRTdGFjaz10cnVlLAorICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIGNhbGwgaXB2Nl9hdmFpbGFibGUoKQorICAgICAgICAgKi8KICAgICAgICAgaWYgKGlwdjZfYXZhaWxhYmxlKCkpIHsKLSAgICAgICAgICAgIHNvY2sgPSBvcGVuU29ja2V0KGVudiwgQUZfSU5FVDYpOwotICAgICAgICAgICAgaWYgKHNvY2sgPCAwICYmICgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotICAgICAgICAgICAgICAgIGZyZWVpZihpZnMpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZnMgPSBlbnVtSVB2NkludGVyZmFjZXMoZW52LCBzb2NrLCBpZnMpOwotICAgICAgICAgICAgY2xvc2Uoc29jayk7CisgICAgICAgICAgIHNvY2sgPSAgb3BlblNvY2tldChlbnYsIEFGX0lORVQ2KTsKKyAgICAgICAgICAgaWYgKHNvY2sgPCAwICYmICgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgeworICAgICAgICAgICAgICAgZnJlZWlmKGlmcyk7CisgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7Ci0gICAgICAgICAgICAgICAgZnJlZWlmKGlmcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgICAgaWZzID0gZW51bUlQdjZJbnRlcmZhY2VzKGVudiwgc29jaywgaWZzKTsKKyAgICAgICAgICAgY2xvc2Uoc29jayk7CisKKyAgICAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgeworICAgICAgICAgICAgICBmcmVlaWYoaWZzKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgIH0KKworICAgICAgIH0KICNlbmRpZgogCiAgICAgcmV0dXJuIGlmczsKIH0KIAorI2RlZmluZSBDSEVDS0VEX01BTExPQzMoX3BvaW50ZXIsX3R5cGUsX3NpemUpIFwKKyAgICAgICBkb3sgXAorICAgICAgICBfcG9pbnRlciA9IChfdHlwZSltYWxsb2MoIF9zaXplICk7IFwKKyAgICAgICAgaWYgKF9wb2ludGVyID09IE5VTEwpIHsgXAorICAgICAgICAgICAgSk5VX1Rocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJOYXRpdmUgaGVhcCBhbGxvY2F0aW9uIGZhaWxlZCIpOyBcCisgICAgICAgICAgICByZXR1cm4gaWZzOyAvKiByZXR1cm4gdW50b3VjaGVkIGxpc3QgKi8gXAorICAgICAgICB9IFwKKyAgICAgICB9IHdoaWxlKDApCisKKwogLyoKLSAqIEZyZWVzIGFuIGludGVyZmFjZSBsaXN0IChpbmNsdWRpbmcgYW55IGF0dGFjaGVkIGFkZHJlc3NlcykuCisgKiBGcmVlIGFuIGludGVyZmFjZSBsaXN0IChpbmNsdWRpbmcgYW55IGF0dGFjaGVkIGFkZHJlc3NlcykKICAqLwotc3RhdGljIHZvaWQgZnJlZWlmKG5ldGlmICppZnMpIHsKK3ZvaWQgZnJlZWlmKG5ldGlmICppZnMpIHsKICAgICBuZXRpZiAqY3VycmlmID0gaWZzOwogICAgIG5ldGlmICpjaGlsZCA9IE5VTEw7CiAKQEAgLTg1Miw5MSArODc0LDExNyBAQAogICAgICAgICAgICAgbmV0YWRkciAqbmV4dCA9IGFkZHJQLT5uZXh0OwogICAgICAgICAgICAgZnJlZShhZGRyUCk7CiAgICAgICAgICAgICBhZGRyUCA9IG5leHQ7Ci0gICAgICAgIH0KKyAgICAgICAgIH0KIAotICAgICAgICAvLyBkb24ndCBmb3JnZXQgdG8gZnJlZSB0aGUgc3ViLWludGVyZmFjZXMKLSAgICAgICAgaWYgKGN1cnJpZi0+Y2hpbGRzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWVpZihjdXJyaWYtPmNoaWxkcyk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIERvbid0IGZvcmdldCB0byBmcmVlIHRoZSBzdWItaW50ZXJmYWNlcy4KKyAgICAgICAgICAgICovCisgICAgICAgICAgaWYgKGN1cnJpZi0+Y2hpbGRzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlaWYoY3VycmlmLT5jaGlsZHMpOworICAgICAgICAgIH0KIAotICAgICAgICBpZnMgPSBjdXJyaWYtPm5leHQ7Ci0gICAgICAgIGZyZWUoY3VycmlmKTsKLSAgICAgICAgY3VycmlmID0gaWZzOworICAgICAgICAgIGlmcyA9IGN1cnJpZi0+bmV4dDsKKyAgICAgICAgICBmcmVlKGN1cnJpZik7CisgICAgICAgICAgY3VycmlmID0gaWZzOwogICAgIH0KIH0KIAotc3RhdGljIG5ldGlmICphZGRpZihKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmX25hbWUsIG5ldGlmICppZnMsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqaWZyX2FkZHJQLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmlmcl9icm9hZGFkZHJQLAotICAgICAgICAgICAgICAgICAgICBpbnQgZmFtaWx5LCBzaG9ydCBwcmVmaXgpCituZXRpZiAqYWRkaWYoSk5JRW52ICplbnYsIGludCBzb2NrLCBjb25zdCBjaGFyICogaWZfbmFtZSwKKyAgICAgICAgICAgICBuZXRpZiAqaWZzLCBzdHJ1Y3Qgc29ja2FkZHIqIGlmcl9hZGRyUCwgaW50IGZhbWlseSwKKyAgICAgICAgICAgICBzaG9ydCBwcmVmaXgpCiB7CiAgICAgbmV0aWYgKmN1cnJpZiA9IGlmcywgKnBhcmVudDsKICAgICBuZXRhZGRyICphZGRyUDsKLSAgICBjaGFyIG5hbWVbSUZOQU1FU0laRV0sIHZuYW1lW0lGTkFNRVNJWkVdOwotICAgIGNoYXIgKm5hbWVfY29sb25QOworCisjaWZkZWYgTElGTkFNU0laCisgICAgaW50IGlmbmFtX3NpemUgPSBMSUZOQU1TSVo7CisgICAgY2hhciBuYW1lW0xJRk5BTVNJWl0sIHZuYW1lW0xJRk5BTVNJWl07CisjZWxzZQorICAgIGludCBpZm5hbV9zaXplID0gSUZOQU1TSVo7CisgICAgY2hhciBuYW1lW0lGTkFNU0laXSwgdm5hbWVbSUZOQU1TSVpdOworI2VuZGlmCisKKyAgICBjaGFyICAqbmFtZV9jb2xvblA7CisgICAgaW50IG1hc2s7CiAgICAgaW50IGlzVmlydHVhbCA9IDA7CiAgICAgaW50IGFkZHJfc2l6ZTsKKyAgICBpbnQgZmxhZ3MgPSAwOwogCi0gICAgLy8gSWYgdGhlIGludGVyZmFjZSBuYW1lIGlzIGEgbG9naWNhbCBpbnRlcmZhY2UgdGhlbiB3ZSByZW1vdmUgdGhlIHVuaXQKLSAgICAvLyBudW1iZXIgc28gdGhhdCB3ZSBoYXZlIHRoZSBwaHlzaWNhbCBpbnRlcmZhY2UgKGVnOiBobWUwOjEgLT4gaG1lMCkuCi0gICAgLy8gTmV0d29ya0ludGVyZmFjZSBjdXJyZW50bHkgZG9lc24ndCBoYXZlIGFueSBjb25jZXB0IG9mIHBoeXNpY2FsIHZzLgotICAgIC8vIGxvZ2ljYWwgaW50ZXJmYWNlcy4KLSAgICBzdHJuY3B5KG5hbWUsIGlmX25hbWUsIElGTkFNRVNJWkUpOwotICAgIG5hbWVbSUZOQU1FU0laRSAtIDFdID0gJ1wwJzsKKyAgICAvKgorICAgICAqIElmIHRoZSBpbnRlcmZhY2UgbmFtZSBpcyBhIGxvZ2ljYWwgaW50ZXJmYWNlIHRoZW4gd2UKKyAgICAgKiByZW1vdmUgdGhlIHVuaXQgbnVtYmVyIHNvIHRoYXQgd2UgaGF2ZSB0aGUgcGh5c2ljYWwKKyAgICAgKiBpbnRlcmZhY2UgKGVnOiBobWUwOjEgLT4gaG1lMCkuIE5ldHdvcmtJbnRlcmZhY2UKKyAgICAgKiBjdXJyZW50bHkgZG9lc24ndCBoYXZlIGFueSBjb25jZXB0IG9mIHBoeXNpY2FsIHZzLgorICAgICAqIGxvZ2ljYWwgaW50ZXJmYWNlcy4KKyAgICAgKi8KKyAgICBzdHJuY3B5KG5hbWUsIGlmX25hbWUsIGlmbmFtX3NpemUpOworICAgIG5hbWVbaWZuYW1fc2l6ZSAtIDFdID0gJ1wwJzsKICAgICAqdm5hbWUgPSAwOwogCi0gICAgLy8gQ3JlYXRlIGFuZCBwb3B1bGF0ZSB0aGUgbmV0YWRkciBub2RlLiBJZiBhbGxvY2F0aW9uIGZhaWxzCi0gICAgLy8gcmV0dXJuIGFuIHVuLXVwZGF0ZWQgbGlzdC4KKyAgICAvKgorICAgICAqIENyZWF0ZSBhbmQgcG9wdWxhdGUgdGhlIG5ldGFkZHIgbm9kZS4gSWYgYWxsb2NhdGlvbiBmYWlscworICAgICAqIHJldHVybiBhbiB1bi11cGRhdGVkIGxpc3QuCisgICAgICovCisgICAgLypBbGxvY2F0ZSBmb3IgYWRkciBhbmQgYnJkY2FzdCBhdCBvbmNlKi8KIAotICAgIC8vIEFsbG9jYXRlIGZvciBhZGRyIGFuZCBicmRjYXN0IGF0IG9uY2UKLQotI2lmIGRlZmluZWQoQUZfSU5FVDYpCi0gICAgYWRkcl9zaXplID0gKGZhbWlseSA9PSBBRl9JTkVUKSA/IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNpZmRlZiBBRl9JTkVUNgorICAgIGFkZHJfc2l6ZSA9IChmYW1pbHkgPT0gQUZfSU5FVCkgPyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSA6IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKICNlbHNlCiAgICAgYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CiAjZW5kaWYKIAotICAgIENIRUNLRURfTUFMTE9DMyhhZGRyUCwgbmV0YWRkciAqLCBzaXplb2YobmV0YWRkcikgKyAyICogYWRkcl9zaXplKTsKLSAgICBhZGRyUC0+YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoKGNoYXIgKilhZGRyUCArIHNpemVvZihuZXRhZGRyKSk7CisgICAgQ0hFQ0tFRF9NQUxMT0MzKGFkZHJQLCBuZXRhZGRyICosIHNpemVvZihuZXRhZGRyKSsyKmFkZHJfc2l6ZSk7CisgICAgYWRkclAtPmFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKCAoY2hhciAqKSBhZGRyUCtzaXplb2YobmV0YWRkcikgKTsKICAgICBtZW1jcHkoYWRkclAtPmFkZHIsIGlmcl9hZGRyUCwgYWRkcl9zaXplKTsKIAogICAgIGFkZHJQLT5mYW1pbHkgPSBmYW1pbHk7CisgICAgYWRkclAtPmJyZGNhc3QgPSBOVUxMOwogICAgIGFkZHJQLT5tYXNrID0gcHJlZml4OwogICAgIGFkZHJQLT5uZXh0ID0gMDsKKyAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQpIHsKKyAgICAgICAvLyBEZWFsIHdpdGggYnJvYWRjYXN0IGFkZHIgJiBzdWJuZXQgbWFzaworICAgICAgIHN0cnVjdCBzb2NrYWRkciAqIGJyZGNhc3RfdG8gPSAoc3RydWN0IHNvY2thZGRyICopICgoY2hhciAqKSBhZGRyUCArIHNpemVvZihuZXRhZGRyKSArIGFkZHJfc2l6ZSk7CisgICAgICAgYWRkclAtPmJyZGNhc3QgPSBnZXRCcm9hZGNhc3QoZW52LCBzb2NrLCBuYW1lLCAgYnJkY2FzdF90byApOworICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikgPT0gSk5JX1RSVUUpIHsKKyAgICAgICAgICAgcmV0dXJuIGlmczsKKyAgICAgICB9CisgICAgICAgaWYgKChtYXNrID0gZ2V0U3VibmV0KGVudiwgc29jaywgbmFtZSkpICE9IC0xKSB7CisgICAgICAgICAgIGFkZHJQLT5tYXNrID0gbWFzazsKKyAgICAgICB9IGVsc2UgaWYoKCplbnYpLT5FeGNlcHRpb25DaGVjayhlbnYpKSB7CisgICAgICAgICAgIHJldHVybiBpZnM7CisgICAgICAgfQorICAgICB9CiAKLSAgICAvLyBmb3IgSVB2NCBhZGQgYnJvYWRjYXN0IGFkZHJlc3MKLSAgICBpZiAoZmFtaWx5ID09IEFGX0lORVQgJiYgaWZyX2Jyb2FkYWRkclAgIT0gTlVMTCkgewotICAgICAgICBhZGRyUC0+YnJkY2FzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopYWRkclAgKyBzaXplb2YobmV0YWRkcikgKyBhZGRyX3NpemUpOwotICAgICAgICBtZW1jcHkoYWRkclAtPmJyZGNhc3QsIGlmcl9icm9hZGFkZHJQLCBhZGRyX3NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZHJQLT5icmRjYXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBEZWFsIHdpdGggdmlydHVhbCBpbnRlcmZhY2Ugd2l0aCBjb2xvbiBub3RhdGlvbiBlLmcuIGV0aDA6MQorICAgIC8qKgorICAgICAqIERlYWwgd2l0aCB2aXJ0dWFsIGludGVyZmFjZSB3aXRoIGNvbG9uIG5vdGF0aW9uIGUuZy4gZXRoMDoxCisgICAgICovCiAgICAgbmFtZV9jb2xvblAgPSBzdHJjaHIobmFtZSwgJzonKTsKICAgICBpZiAobmFtZV9jb2xvblAgIT0gTlVMTCkgewotICAgICAgICBpbnQgZmxhZ3MgPSAwOwotICAgICAgICAvLyBUaGlzIGlzIGEgdmlydHVhbCBpbnRlcmZhY2UuIElmIHdlIGFyZSBhYmxlIHRvIGFjY2VzcyB0aGUgcGFyZW50Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0ICphbmQqIHVwZGF0ZQotICAgICAgICAvLyB0aGUgJ3BhcmVudCcgaW50ZXJmYWNlIHdpdGggdGhlIG5ldyByZWNvcmRzLgorICAgICAgLyoqCisgICAgICAgKiBUaGlzIGlzIGEgdmlydHVhbCBpbnRlcmZhY2UuIElmIHdlIGFyZSBhYmxlIHRvIGFjY2VzcyB0aGUgcGFyZW50CisgICAgICAgKiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAqYW5kKiB1cGRhdGUKKyAgICAgICAqIHRoZSAncGFyZW50JyBpbnRlcmZhY2Ugd2l0aCB0aGUgbmV3IHJlY29yZHMuCisgICAgICAgKi8KICAgICAgICAgKm5hbWVfY29sb25QID0gMDsKICAgICAgICAgaWYgKGdldEZsYWdzKHNvY2ssIG5hbWUsICZmbGFncykgPCAwIHx8IGZsYWdzIDwgMCkgewogICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGFjY2VzcyBwYXJlbnQgaW50ZXJmYWNlIGRvIG5vdCBjcmVhdGUgcGFyZW50LgogICAgICAgICAgICAgLy8gV2UgYXJlIGEgdmlydHVhbCBpbnRlcmZhY2Ugd2l0aCBubyBwYXJlbnQuCiAgICAgICAgICAgICBpc1ZpcnR1YWwgPSAxOwogICAgICAgICAgICAgKm5hbWVfY29sb25QID0gJzonOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gR290IGFjY2VzcyB0byBwYXJlbnQsIHNvIGNyZWF0ZSBpdCBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIG5hbWUgdG8gdm5hbWUgYW5kIHRydW5jYXRlIG5hbWUgYnkgJzonCi0gICAgICAgICAgICBtZW1jcHkodm5hbWUsIG5hbWUsIHNpemVvZih2bmFtZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgIC8vIEdvdCBhY2Nlc3MgdG8gcGFyZW50LCBzbyBjcmVhdGUgaXQgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAvLyBTYXZlIG9yaWdpbmFsIG5hbWUgdG8gdm5hbWUgYW5kIHRydW5jYXRlIG5hbWUgYnkgJzonCisgICAgICAgICAgICBtZW1jcHkodm5hbWUsIG5hbWUsIHNpemVvZih2bmFtZSkgKTsKICAgICAgICAgICAgIHZuYW1lW25hbWVfY29sb25QIC0gbmFtZV0gPSAnOic7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgIm5ldyIgaW50ZXJmYWNlLiBVc2UgdGhlIGludGVyZmFjZSBuYW1lIGZvcgotICAgIC8vIG1hdGNoaW5nIGJlY2F1c2UgaW5kZXggaXNuJ3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMgMi42ICYgNy4KKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgYSAibmV3IiBpbnRlcmZhY2UuIFVzZSB0aGUgaW50ZXJmYWNlCisgICAgICogbmFtZSBmb3IgbWF0Y2hpbmcgYmVjYXVzZSBpbmRleCBpc24ndCBzdXBwb3J0ZWQgb24KKyAgICAgKiBTb2xhcmlzIDIuNiAmIDcuCisgICAgICovCiAgICAgd2hpbGUgKGN1cnJpZiAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgY3VycmlmLT5uYW1lKSA9PSAwKSB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTk0NCwxMiArOTkyLDE1IEBACiAgICAgICAgIGN1cnJpZiA9IGN1cnJpZi0+bmV4dDsKICAgICB9CiAKLSAgICAvLyBJZiAibmV3IiB0aGVuIGNyZWF0ZSBhIG5ldGlmIHN0cnVjdHVyZSBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGxpc3QuCisgICAgLyoKKyAgICAgKiBJZiAibmV3IiB0aGVuIGNyZWF0ZSBhbiBuZXRpZiBzdHJ1Y3R1cmUgYW5kCisgICAgICogaW5zZXJ0IGl0IG9udG8gdGhlIGxpc3QuCisgICAgICovCiAgICAgaWYgKGN1cnJpZiA9PSBOVUxMKSB7Ci0gICAgICAgICBDSEVDS0VEX01BTExPQzMoY3VycmlmLCBuZXRpZiAqLCBzaXplb2YobmV0aWYpICsgSUZOQU1FU0laRSk7Ci0gICAgICAgICBjdXJyaWYtPm5hbWUgPSAoY2hhciAqKWN1cnJpZiArIHNpemVvZihuZXRpZik7Ci0gICAgICAgICBzdHJuY3B5KGN1cnJpZi0+bmFtZSwgbmFtZSwgSUZOQU1FU0laRSk7Ci0gICAgICAgICBjdXJyaWYtPm5hbWVbSUZOQU1FU0laRSAtIDFdID0gJ1wwJzsKKyAgICAgICAgIENIRUNLRURfTUFMTE9DMyhjdXJyaWYsIG5ldGlmICosIHNpemVvZihuZXRpZikgKyBpZm5hbV9zaXplKTsKKyAgICAgICAgIGN1cnJpZi0+bmFtZSA9IChjaGFyICopIGN1cnJpZitzaXplb2YobmV0aWYpOworICAgICAgICAgc3RybmNweShjdXJyaWYtPm5hbWUsIG5hbWUsIGlmbmFtX3NpemUpOworICAgICAgICAgY3VycmlmLT5uYW1lW2lmbmFtX3NpemUgLSAxXSA9ICdcMCc7CiAgICAgICAgICBjdXJyaWYtPmluZGV4ID0gZ2V0SW5kZXgoc29jaywgbmFtZSk7CiAgICAgICAgICBjdXJyaWYtPmFkZHIgPSBOVUxMOwogICAgICAgICAgY3VycmlmLT5jaGlsZHMgPSBOVUxMOwpAQCAtOTU4LDEzICsxMDA5LDE3IEBACiAgICAgICAgICBpZnMgPSBjdXJyaWY7CiAgICAgfQogCi0gICAgLy8gRmluYWxseSBpbnNlcnQgdGhlIGFkZHJlc3Mgb24gdGhlIGludGVyZmFjZQorICAgIC8qCisgICAgICogRmluYWxseSBpbnNlcnQgdGhlIGFkZHJlc3Mgb24gdGhlIGludGVyZmFjZQorICAgICAqLwogICAgIGFkZHJQLT5uZXh0ID0gY3VycmlmLT5hZGRyOwogICAgIGN1cnJpZi0+YWRkciA9IGFkZHJQOwogCiAgICAgcGFyZW50ID0gY3VycmlmOwogCi0gICAgLy8gRGVhbCB3aXRoIHRoZSB2aXJ0dWFsIGludGVyZmFjZSBub3cuCisgICAgLyoqCisgICAgICogTGV0J3MgZGVhbCB3aXRoIHRoZSB2aXJ0dWFsIGludGVyZmFjZSBub3cuCisgICAgICovCiAgICAgaWYgKHZuYW1lWzBdKSB7CiAgICAgICAgIG5ldGFkZHIgKnRtcGFkZHI7CiAKQEAgLTk3OCwyOSArMTAzMywyOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGN1cnJpZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDS0VEX01BTExPQzMoY3VycmlmLCBuZXRpZiAqLCBzaXplb2YobmV0aWYpICsgSUZOQU1FU0laRSk7Ci0gICAgICAgICAgICBjdXJyaWYtPm5hbWUgPSAoY2hhciAqKWN1cnJpZiArIHNpemVvZihuZXRpZik7Ci0gICAgICAgICAgICBzdHJuY3B5KGN1cnJpZi0+bmFtZSwgdm5hbWUsIElGTkFNRVNJWkUpOwotICAgICAgICAgICAgY3VycmlmLT5uYW1lW0lGTkFNRVNJWkUgLSAxXSA9ICdcMCc7CisgICAgICAgICAgICBDSEVDS0VEX01BTExPQzMoY3VycmlmLCBuZXRpZiAqLCBzaXplb2YobmV0aWYpICsgaWZuYW1fc2l6ZSk7CisgICAgICAgICAgICBjdXJyaWYtPm5hbWUgPSAoY2hhciAqKSBjdXJyaWYgKyBzaXplb2YobmV0aWYpOworICAgICAgICAgICAgc3RybmNweShjdXJyaWYtPm5hbWUsIHZuYW1lLCBpZm5hbV9zaXplKTsKKyAgICAgICAgICAgIGN1cnJpZi0+bmFtZVtpZm5hbV9zaXplIC0gMV0gPSAnXDAnOwogICAgICAgICAgICAgY3VycmlmLT5pbmRleCA9IGdldEluZGV4KHNvY2ssIHZuYW1lKTsKLSAgICAgICAgICAgIGN1cnJpZi0+YWRkciA9IE5VTEw7IC8vIE5lZWQgdG8gZHVwbGljYXRlIHRoZSBhZGRyIGVudHJ5PworICAgICAgICAgICAgY3VycmlmLT5hZGRyID0gTlVMTDsKKyAgICAgICAgICAgLyogTmVlZCB0byBkdXBsaWNhdGUgdGhlIGFkZHIgZW50cnk/ICovCiAgICAgICAgICAgICBjdXJyaWYtPnZpcnR1YWwgPSAxOwogICAgICAgICAgICAgY3VycmlmLT5jaGlsZHMgPSBOVUxMOwogICAgICAgICAgICAgY3VycmlmLT5uZXh0ID0gcGFyZW50LT5jaGlsZHM7CiAgICAgICAgICAgICBwYXJlbnQtPmNoaWxkcyA9IGN1cnJpZjsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLRURfTUFMTE9DMyh0bXBhZGRyLCBuZXRhZGRyICosIHNpemVvZihuZXRhZGRyKSArIDIgKiBhZGRyX3NpemUpOworICAgICAgICBDSEVDS0VEX01BTExPQzModG1wYWRkciwgbmV0YWRkciAqLCBzaXplb2YobmV0YWRkcikrMiphZGRyX3NpemUpOwogICAgICAgICBtZW1jcHkodG1wYWRkciwgYWRkclAsIHNpemVvZihuZXRhZGRyKSk7CiAgICAgICAgIGlmIChhZGRyUC0+YWRkciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB0bXBhZGRyLT5hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKQotICAgICAgICAgICAgICAgICgoY2hhciopdG1wYWRkciArIHNpemVvZihuZXRhZGRyKSk7CisgICAgICAgICAgICB0bXBhZGRyLT5hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSAoIChjaGFyKil0bXBhZGRyICsgc2l6ZW9mKG5ldGFkZHIpICkgOwogICAgICAgICAgICAgbWVtY3B5KHRtcGFkZHItPmFkZHIsIGFkZHJQLT5hZGRyLCBhZGRyX3NpemUpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFkZHJQLT5icmRjYXN0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRtcGFkZHItPmJyZGNhc3QgPSAoc3RydWN0IHNvY2thZGRyICopCi0gICAgICAgICAgICAgICAgKChjaGFyICopdG1wYWRkciArIHNpemVvZihuZXRhZGRyKSArIGFkZHJfc2l6ZSk7CisgICAgICAgICAgICB0bXBhZGRyLT5icmRjYXN0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSAoKGNoYXIgKikgdG1wYWRkciArIHNpemVvZihuZXRhZGRyKSthZGRyX3NpemUpOwogICAgICAgICAgICAgbWVtY3B5KHRtcGFkZHItPmJyZGNhc3QsIGFkZHJQLT5icmRjYXN0LCBhZGRyX3NpemUpOwogICAgICAgICB9CiAKQEAgLTEwMTEsNjkgKzEwNjUsMTkgQEAKICAgICByZXR1cm4gaWZzOwogfQogCi0vKgotICogRGV0ZXJtaW5lcyB0aGUgcHJlZml4IHZhbHVlIGZvciBhbiBBRl9JTkVUIHN1Ym5ldCBhZGRyZXNzLgorLyogT3BlbiBzb2NrZXQgZm9yIGZ1cnRoZXIgaW9jdCBjYWxscworICogcHJvdG8gaXMgQUZfSU5FVC9BRl9JTkVUNgogICovCi1zdGF0aWMgc2hvcnQgdHJhbnNsYXRlSVB2NEFkZHJlc3NUb1ByZWZpeChzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIpIHsKLSAgICBzaG9ydCBwcmVmaXggPSAwOwotICAgIHVuc2lnbmVkIGludCBtYXNrID0gbnRvaGwoYWRkci0+c2luX2FkZHIuc19hZGRyKTsKLSAgICB3aGlsZSAobWFzaykgewotICAgICAgICBtYXNrIDw8PSAxOwotICAgICAgICBwcmVmaXgrKzsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeDsKLX0KLQotLyoKLSAqIERldGVybWluZXMgdGhlIHByZWZpeCB2YWx1ZSBmb3IgYW4gQUZfSU5FVDYgc3VibmV0IGFkZHJlc3MuCi0gKi8KLXN0YXRpYyBzaG9ydCB0cmFuc2xhdGVJUHY2QWRkcmVzc1RvUHJlZml4KHN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHIpIHsKLSAgICBzaG9ydCBwcmVmaXggPSAwOwotICAgIHVfY2hhciAqYWRkckJ5dGVzID0gKHVfY2hhciAqKSYoYWRkci0+c2luNl9hZGRyKTsKLSAgICB1bnNpZ25lZCBpbnQgYnl0ZSwgYml0OwotCi0gICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOyBieXRlKyssIHByZWZpeCArPSA4KSB7Ci0gICAgICAgIGlmIChhZGRyQnl0ZXNbYnl0ZV0gIT0gMHhmZikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJ5dGUgIT0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKLSAgICAgICAgZm9yIChiaXQgPSA3OyBiaXQgIT0gMDsgYml0LS0sIHByZWZpeCsrKSB7Ci0gICAgICAgICAgICBpZiAoIShhZGRyQnl0ZXNbYnl0ZV0gJiAoMSA8PCBiaXQpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoOyBiaXQgIT0gMDsgYml0LS0pIHsKLSAgICAgICAgICAgIGlmIChhZGRyQnl0ZXNbYnl0ZV0gJiAoMSA8PCBiaXQpKSB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocHJlZml4ID4gMCkgewotICAgICAgICAgICAgYnl0ZSsrOwotICAgICAgICAgICAgZm9yICg7IGJ5dGUgPCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsgYnl0ZSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJCeXRlc1tieXRlXSkgewotICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBwcmVmaXg7Ci19Ci0KLS8qCi0gKiBPcGVucyBhIHNvY2tldCBmb3IgZnVydGhlciBpb2N0IGNhbGxzLiBwcm90byBpcyBvbmUgb2YgQUZfSU5FVCBvciBBRl9JTkVUNi4KLSAqLwotc3RhdGljIGludCBvcGVuU29ja2V0KEpOSUVudiAqZW52LCBpbnQgcHJvdG8pIHsKK3N0YXRpYyBpbnQgIG9wZW5Tb2NrZXQoSk5JRW52ICplbnYsIGludCBwcm90byl7CiAgICAgaW50IHNvY2s7CiAKICAgICBpZiAoKHNvY2sgPSBKVk1fU29ja2V0KHByb3RvLCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7Ci0gICAgICAgIC8vIElmIEVQUk9UT05PU1VQUE9SVCBpcyByZXR1cm5lZCBpdCBtZWFucyB3ZSBkb24ndCBoYXZlCi0gICAgICAgIC8vIHN1cHBvcnQgZm9yIHRoaXMgcHJvdG8gc28gZG9uJ3QgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAvKgorICAgICAgICAgKiBJZiBFUFJPVE9OT1NVUFBPUlQgaXMgcmV0dXJuZWQgaXQgbWVhbnMgd2UgZG9uJ3QgaGF2ZQorICAgICAgICAgKiBzdXBwb3J0ICBmb3IgdGhpcyBwcm90byBzbyBkb24ndCB0aHJvdyBhbiBleGNlcHRpb24uCisgICAgICAgICAqLwogICAgICAgICBpZiAoZXJybm8gIT0gRVBST1RPTk9TVVBQT1JUKSB7Ci0gICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xMDgxLDExMSArMTA4NSw5NyBAQAogICAgIHJldHVybiBzb2NrOwogfQogCi0vKiogTGludXggKiovCi0jaWYgZGVmaW5lZChfX2xpbnV4X18pCiAKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQotLyoKLSAqIE9wZW5zIGEgc29ja2V0IGZvciBmdXJ0aGVyIGlvY3RsIGNhbGxzLiBUcmllcyBBRl9JTkVUIHNvY2tldCBmaXJzdCBhbmQKLSAqIGlmIGl0IGZhaWxzIHJldHVybiBBRl9JTkVUNiBzb2NrZXQuCisvKiogTGludXgsIEFJWCAqKi8KKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfQUlYKQorLyogT3BlbiBzb2NrZXQgZm9yIGZ1cnRoZXIgaW9jdCBjYWxscywgdHJ5IHY0IHNvY2tldCBmaXJzdCBhbmQKKyAqIGlmIGl0IGZhbGxzIHJldHVybiB2NiBzb2NrZXQKICAqLwotc3RhdGljIGludCBvcGVuU29ja2V0V2l0aEZhbGxiYWNrKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUpIHsKKworI2lmZGVmIEFGX0lORVQ2CitzdGF0aWMgaW50IG9wZW5Tb2NrZXRXaXRoRmFsbGJhY2soSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmlmbmFtZSl7CiAgICAgaW50IHNvY2s7CisgICAgc3RydWN0IGlmcmVxIGlmMjsKIAotICAgIGlmICgoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRVBST1RPTk9TVVBQT1JUKSB7Ci0gICAgICAgICAgICBpZiAoKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjYgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gZXJybm8gaXMgbm90IE5PU1VQUE9SVAotICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgICAgIChlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSVBWNCBTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9CisgICAgIGlmICgoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgeworICAgICAgICAgaWYgKGVycm5vID09IEVQUk9UT05PU1VQUE9SVCl7CisgICAgICAgICAgICAgIGlmICggKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwICl7CisgICAgICAgICAgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52ICwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJUFY2IFNvY2tldCBjcmVhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBlbHNleyAvLyBlcnJubyBpcyBub3QgTk9TVVBQT1JUCisgICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjQgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgIH0KIAotICAgIC8vIExpbnV4IHN0YXJ0aW5nIGZyb20gMi42Lj8ga2VybmVsIGFsbG93cyBpb2N0bCBjYWxsIHdpdGggZWl0aGVyIElQdjQgb3IKLSAgICAvLyBJUHY2IHNvY2tldCByZWdhcmRsZXNzIG9mIHR5cGUgb2YgYWRkcmVzcyBvZiBhbiBpbnRlcmZhY2UuCi0gICAgcmV0dXJuIHNvY2s7CisgICAgIC8qIExpbnV4IHN0YXJ0aW5nIGZyb20gMi42Lj8ga2VybmVsIGFsbG93cyBpb2N0bCBjYWxsIHdpdGggZWl0aGVyIElQdjQgb3IgSVB2NiBzb2NrZXQgcmVnYXJkbGVzcyBvZiB0eXBlCisgICAgICAgIG9mIGFkZHJlc3Mgb2YgYW4gaW50ZXJmYWNlICovCisKKyAgICAgICByZXR1cm4gc29jazsKIH0KKwogI2Vsc2UKLXN0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKSB7Ci0gICAgcmV0dXJuIG9wZW5Tb2NrZXQoZW52LCBBRl9JTkVUKTsKK3N0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKXsKKyAgICByZXR1cm4gb3BlblNvY2tldChlbnYsQUZfSU5FVCk7CiB9CiAjZW5kaWYKIAotLyoKLSAqIEVudW1lcmF0ZXMgYW5kIHJldHVybnMgYWxsIElQdjQgaW50ZXJmYWNlcyBvbiBMaW51eC4KLSAqLwogc3RhdGljIG5ldGlmICplbnVtSVB2NEludGVyZmFjZXMoSk5JRW52ICplbnYsIGludCBzb2NrLCBuZXRpZiAqaWZzKSB7CiAgICAgc3RydWN0IGlmY29uZiBpZmM7CiAgICAgc3RydWN0IGlmcmVxICppZnJlcVA7CiAgICAgY2hhciAqYnVmID0gTlVMTDsKKyAgICBpbnQgbnVtaWZzOwogICAgIHVuc2lnbmVkIGk7CisgICAgaW50IHNpb2NnaWZjb25mUmVxdWVzdCA9IFNJT0NHSUZDT05GOwogCi0gICAgLy8gZG8gYSBkdW1teSBTSU9DR0lGQ09ORiB0byBkZXRlcm1pbmUgdGhlIGJ1ZmZlciBzaXplCi0gICAgLy8gU0lPQ0dJRkNPVU5UIGRvZXNuJ3Qgd29yaworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgLyogbmVlZCB0byBkbyBhIGR1bW15IFNJT0NHSUZDT05GIHRvIGRldGVybWluZSB0aGUgYnVmZmVyIHNpemUuCisgICAgICogU0lPQ0dJRkNPVU5UIGRvZXNuJ3Qgd29yaworICAgICAqLwogICAgIGlmYy5pZmNfYnVmID0gTlVMTDsKICAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkNPTkYsIChjaGFyICopJmlmYykgPCAwKSB7Ci0gICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IKLSAgICAgICAgICAgIChlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiaW9jdGwoU0lPQ0dJRkNPTkYpIGZhaWxlZCIpOworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiaW9jdGwgU0lPQ0dJRkNPTkYgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiBpZnM7CiAgICAgfQorI2VsaWYgZGVmaW5lZChfQUlYKQorICAgIGlmYy5pZmNfYnVmID0gTlVMTDsKKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dTSVpJRkNPTkYsICYoaWZjLmlmY19sZW4pKSA8IDApIHsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsIFNJT0NHU0laSUZDT05GIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gaWZzOworICAgIH0KKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KIAotICAgIC8vIGNhbGwgU0lPQ0dJRkNPTkYgdG8gZW51bWVyYXRlIHRoZSBpbnRlcmZhY2VzCi0gICAgQ0hFQ0tFRF9NQUxMT0MzKGJ1ZiwgY2hhciAqLCBpZmMuaWZjX2xlbik7CisgICAgQ0hFQ0tFRF9NQUxMT0MzKGJ1ZixjaGFyICosIGlmYy5pZmNfbGVuKTsKKwogICAgIGlmYy5pZmNfYnVmID0gYnVmOwotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0lGQ09ORikgZmFpbGVkIik7Ci0gICAgICAgIGZyZWUoYnVmKTsKKyNpZiBkZWZpbmVkKF9BSVgpCisgICAgc2lvY2dpZmNvbmZSZXF1ZXN0ID0gQ1NJT0NHSUZDT05GOworI2VuZGlmCisgICAgaWYgKGlvY3RsKHNvY2ssIHNpb2NnaWZjb25mUmVxdWVzdCwgKGNoYXIgKikmaWZjKSA8IDApIHsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsIFNJT0NHSUZDT05GIGZhaWxlZCIpOworICAgICAgICAodm9pZCkgZnJlZShidWYpOwogICAgICAgICByZXR1cm4gaWZzOwogICAgIH0KIAotICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIGludGVyZmFjZQorICAgIC8qCisgICAgICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCisgICAgICovCiAgICAgaWZyZXFQID0gaWZjLmlmY19yZXE7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlmYy5pZmNfbGVuIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7IGkrKywgaWZyZXFQKyspIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyIGFkZHIsIGJyb2FkYWRkciwgKmJyb2FkYWRkclAgPSBOVUxMOwotICAgICAgICBzaG9ydCBwcmVmaXggPSAwOworICAgIGZvciAoaT0wOyBpPGlmYy5pZmNfbGVuL3NpemVvZiAoc3RydWN0IGlmcmVxKTsgaSsrLCBpZnJlcVArKykgeworI2lmIGRlZmluZWQoX0FJWCkKKyAgICAgICAgaWYgKGlmcmVxUC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIGNvbnRpbnVlOworI2VuZGlmCisgICAgICAgIC8qCisgICAgICAgICAqIEFkZCB0byB0aGUgbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLCBpZnJlcVAtPmlmcl9uYW1lLCBpZnMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJiAoaWZyZXFQLT5pZnJfYWRkciksIEFGX0lORVQsIDApOwogCi0gICAgICAgIC8vIGlnbm9yZSBub24gSVB2NCBhZGRyZXNzZXMKLSAgICAgICAgaWYgKGlmcmVxUC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2F2ZSBzb2NrZXQgYWRkcmVzcwotICAgICAgICBtZW1jcHkoJmFkZHIsICYoaWZyZXFQLT5pZnJfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKLQotICAgICAgICAvLyBkZXRlcm1pbmUgYnJvYWRjYXN0IGFkZHJlc3MsIGlmIGFwcGxpY2FibGUKLSAgICAgICAgaWYgKChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIGlmcmVxUCkgPT0gMCkgJiYKLSAgICAgICAgICAgIGlmcmVxUC0+aWZyX2ZsYWdzICYgSUZGX0JST0FEQ0FTVCkgewotCi0gICAgICAgICAgICAvLyByZXN0b3JlIHNvY2tldCBhZGRyZXNzIHRvIGlmcmVxUAotICAgICAgICAgICAgbWVtY3B5KCYoaWZyZXFQLT5pZnJfYWRkciksICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICAgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGQlJEQUREUiwgaWZyZXFQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZicm9hZGFkZHIsICYoaWZyZXFQLT5pZnJfYnJvYWRhZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOwotICAgICAgICAgICAgICAgIGJyb2FkYWRkclAgPSAmYnJvYWRhZGRyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVzdG9yZSBzb2NrZXQgYWRkcmVzcyB0byBpZnJlcVAKLSAgICAgICAgbWVtY3B5KCYoaWZyZXFQLT5pZnJfYWRkciksICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICAgICAgLy8gZGV0ZXJtaW5lIG5ldG1hc2sKLSAgICAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLLCBpZnJlcVApID09IDApIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHRyYW5zbGF0ZUlQdjRBZGRyZXNzVG9QcmVmaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSYoaWZyZXFQLT5pZnJfbmV0bWFzaykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGludGVyZmFjZSB0byB0aGUgbGlzdAotICAgICAgICBpZnMgPSBhZGRpZihlbnYsIHNvY2ssIGlmcmVxUC0+aWZyX25hbWUsIGlmcywKLSAgICAgICAgICAgICAgICAgICAgJmFkZHIsIGJyb2FkYWRkclAsIEFGX0lORVQsIHByZWZpeCk7Ci0KLSAgICAgICAgLy8gaW4gY2FzZSBvZiBleGNlcHRpb24sIGZyZWUgaW50ZXJmYWNlIGxpc3QgYW5kIGJ1ZmZlciBhbmQgcmV0dXJuIE5VTEwKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHRoZW4gZnJlZSB0aGUgbGlzdAorICAgICAgICAgKi8KICAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewogICAgICAgICAgICAgZnJlZShidWYpOwogICAgICAgICAgICAgZnJlZWlmKGlmcyk7CkBAIC0xMTkzLDM1MSArMTE4MywyNDAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGZyZWUgYnVmZmVyCisgICAgLyoKKyAgICAgKiBGcmVlIHNvY2tldCBhbmQgYnVmZmVyCisgICAgICovCiAgICAgZnJlZShidWYpOwogICAgIHJldHVybiBpZnM7CiB9CiAKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQogCiAvKgotICogRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgSVB2NiBpbnRlcmZhY2VzIG9uIExpbnV4LgorICogRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgSVB2NiBpbnRlcmZhY2VzIG9uIExpbnV4CiAgKi8KKworI2lmIGRlZmluZWQoQUZfSU5FVDYpICYmIGRlZmluZWQoX19saW51eF9fKQogc3RhdGljIG5ldGlmICplbnVtSVB2NkludGVyZmFjZXMoSk5JRW52ICplbnYsIGludCBzb2NrLCBuZXRpZiAqaWZzKSB7CiAgICAgRklMRSAqZjsKLSAgICBjaGFyIGRldm5hbWVbMjFdLCBhZGRyNnBbOF1bNV07Ci0gICAgaW50IHByZWZpeCwgc2NvcGUsIGRhZF9zdGF0dXMsIGlmX2lkeDsKKyAgICBjaGFyIGFkZHI2WzQwXSwgZGV2bmFtZVsyMV07CisgICAgY2hhciBhZGRyNnBbOF1bNV07CisgICAgaW50IHBsZW4sIHNjb3BlLCBkYWRfc3RhdHVzLCBpZl9pZHg7CisgICAgdWludDhfdCBpcHY2YWRkclsxNl07CiAKICAgICBpZiAoKGYgPSBmb3BlbihfUEFUSF9QUk9DTkVUX0lGSU5FVDYsICJyIikpICE9IE5VTEwpIHsKICAgICAgICAgd2hpbGUgKGZzY2FuZihmLCAiJTRzJTRzJTRzJTRzJTRzJTRzJTRzJTRzICUwOHggJTAyeCAlMDJ4ICUwMnggJTIwc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICBhZGRyNnBbMF0sIGFkZHI2cFsxXSwgYWRkcjZwWzJdLCBhZGRyNnBbM10sCi0gICAgICAgICAgICAgICAgICAgICAgYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddLAotICAgICAgICAgICAgICAgICAgICAgICZpZl9pZHgsICZwcmVmaXgsICZzY29wZSwgJmRhZF9zdGF0dXMsIGRldm5hbWUpICE9IEVPRikgeworICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwgYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICZpZl9pZHgsICZwbGVuLCAmc2NvcGUsICZkYWRfc3RhdHVzLCBkZXZuYW1lKSAhPSBFT0YpIHsKIAotICAgICAgICAgICAgY2hhciBhZGRyNls0MF07CisgICAgICAgICAgICBzdHJ1Y3QgbmV0aWYgKmlmc19wdHIgPSBOVUxMOworICAgICAgICAgICAgc3RydWN0IG5ldGlmICpsYXN0X3B0ciA9IE5VTEw7CiAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI7CiAKICAgICAgICAgICAgIHNwcmludGYoYWRkcjYsICIlczolczolczolczolczolczolczolcyIsCi0gICAgICAgICAgICAgICAgICAgIGFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwKLSAgICAgICAgICAgICAgICAgICAgYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwgYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddKTsKKyAgICAgICAgICAgIGluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjYsIGlwdjZhZGRyKTsKIAogICAgICAgICAgICAgbWVtc2V0KCZhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwotICAgICAgICAgICAgaW5ldF9wdG9uKEFGX0lORVQ2LCBhZGRyNiwgKHZvaWQqKWFkZHIuc2luNl9hZGRyLnM2X2FkZHIpOworICAgICAgICAgICAgbWVtY3B5KCh2b2lkKilhZGRyLnNpbjZfYWRkci5zNl9hZGRyLCAoY29uc3Qgdm9pZCopaXB2NmFkZHIsIDE2KTsKIAotICAgICAgICAgICAgLy8gc2V0IHNjb3BlIElEIHRvIGludGVyZmFjZSBpbmRleAogICAgICAgICAgICAgYWRkci5zaW42X3Njb3BlX2lkID0gaWZfaWR4OwogCi0gICAgICAgICAgICAvLyBhZGQgaW50ZXJmYWNlIHRvIHRoZSBsaXN0Ci0gICAgICAgICAgICBpZnMgPSBhZGRpZihlbnYsIHNvY2ssIGRldm5hbWUsIGlmcywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQUZfSU5FVDYsIChzaG9ydClwcmVmaXgpOworICAgICAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLCBkZXZuYW1lLCBpZnMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgQUZfSU5FVDYsIHBsZW4pOwogCi0gICAgICAgICAgICAvLyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgdGhlbiByZXR1cm4gdGhlIGxpc3QgYXMgaXMKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB0aGVuIHJldHVybiB0aGUgbGlzdCBhcyBpcy4KKyAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWZzOwogICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmY2xvc2UoZik7CiAgICAgfQogICAgIHJldHVybiBpZnM7CiB9CisjZW5kaWYKIAotI2VuZGlmIC8qIEFGX0lORVQ2ICovCiAKIC8qCi0gKiBUcnkgdG8gZ2V0IHRoZSBpbnRlcmZhY2UgaW5kZXguCisgKiBFbnVtZXJhdGVzIGFuZCByZXR1cm5zIGFsbCBJUHY2IGludGVyZmFjZXMgb24gQUlYCiAgKi8KLXN0YXRpYyBpbnQgZ2V0SW5kZXgoaW50IHNvY2ssIGNvbnN0IGNoYXIgKm5hbWUpIHsKKworI2lmIGRlZmluZWQoQUZfSU5FVDYpICYmIGRlZmluZWQoX0FJWCkKK3N0YXRpYyBuZXRpZiAqZW51bUlQdjZJbnRlcmZhY2VzKEpOSUVudiAqZW52LCBpbnQgc29jaywgbmV0aWYgKmlmcykgeworICAgIHN0cnVjdCBpZmNvbmYgaWZjOworICAgIHN0cnVjdCBpZnJlcSAqaWZyZXFQOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbnVtaWZzOworICAgIHVuc2lnbmVkIGk7CisgICAgdW5zaWduZWQgYnVmc2l6ZTsKKyAgICBjaGFyICpjcCwgKmNwbGltaXQ7CisKKyAgICAvKiB1c2UgU0lPQ0dTSVpJRkNPTkYgdG8gZ2V0IHNpemUgZm9yICBTSU9DR0lGQ09ORiAqLworCisgICAgaWZjLmlmY19idWYgPSBOVUxMOworICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR1NJWklGQ09ORiwgJihpZmMuaWZjX2xlbikpIDwgMCkgeworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgImlvY3RsIFNJT0NHU0laSUZDT05GIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gaWZzOworICAgIH0KKyAgICBidWZzaXplID0gaWZjLmlmY19sZW47CisKKyAgICBidWYgPSAoY2hhciAqKW1hbGxvYyhidWZzaXplKTsKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIk5ldHdvcmsgaW50ZXJmYWNlIG5hdGl2ZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGlmczsKKyAgICB9CisgICAgaWZjLmlmY19sZW4gPSBidWZzaXplOworICAgIGlmYy5pZmNfYnVmID0gYnVmOworICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImlvY3RsIENTSU9DR0lGQ09ORiBmYWlsZWQiKTsKKyAgICAgICAgZnJlZShidWYpOworICAgICAgICByZXR1cm4gaWZzOworICAgIH0KKworICAgIC8qCisgICAgICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCisgICAgICovCisgICAgaWZyZXFQID0gaWZjLmlmY19yZXE7CisgICAgY3AgPSAoY2hhciAqKWlmYy5pZmNfcmVxOworICAgIGNwbGltaXQgPSBjcCArIGlmYy5pZmNfbGVuOworCisgICAgZm9yICggOyBjcCA8IGNwbGltaXQ7IGNwICs9IChzaXplb2YoaWZyZXFQLT5pZnJfbmFtZSkgKyBNQVgoKGlmcmVxUC0+aWZyX2FkZHIpLnNhX2xlbiwgc2l6ZW9mKGlmcmVxUC0+aWZyX2FkZHIpKSkpIHsKKyAgICAgICAgaWZyZXFQID0gKHN0cnVjdCBpZnJlcSAqKWNwOworICAgICAgICBzdHJ1Y3QgaWZyZXEgaWYyOworCisgICAgICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKKyAgICAgICAgc3RyY3B5KGlmMi5pZnJfbmFtZSwgaWZyZXFQLT5pZnJfbmFtZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2tpcCBpbnRlcmZhY2UgdGhhdCBhcmVuJ3QgVVAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmMikgPj0gMCkgeworICAgICAgICAgICAgaWYgKCEoaWYyLmlmcl9mbGFncyAmIElGRl9VUCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpZnJlcVAtPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUNikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGU0lURTYsIChjaGFyICopJmlmMikgPj0gMCkgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqczY9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJihpZnJlcVAtPmlmcl9hZGRyKTsKKyAgICAgICAgICAgIHM2LT5zaW42X3Njb3BlX2lkID0gaWYyLmlmcl9zaXRlNjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFkZCB0byB0aGUgbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLCBpZnJlcVAtPmlmcl9uYW1lLCBpZnMsCisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmKGlmcmVxUC0+aWZyX2FkZHIpLAorICAgICAgICAgICAgICAgICAgICBBRl9JTkVUNiwgMCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHRoZW4gZnJlZSB0aGUgbGlzdAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgeworICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICAgICAgZnJlZWlmKGlmcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRnJlZSBzb2NrZXQgYW5kIGJ1ZmZlcgorICAgICAqLworICAgIGZyZWUoYnVmKTsKKyAgICByZXR1cm4gaWZzOworfQorI2VuZGlmCisKKworc3RhdGljIGludCBnZXRJbmRleChpbnQgc29jaywgY29uc3QgY2hhciAqbmFtZSl7CisgICAgIC8qCisgICAgICAqIFRyeSB0byBnZXQgdGhlIGludGVyZmFjZSBpbmRleAorICAgICAgKi8KKyNpZiBkZWZpbmVkKF9BSVgpCisgICAgcmV0dXJuIGlmX25hbWV0b2luZGV4KG5hbWUpOworI2Vsc2UKICAgICBzdHJ1Y3QgaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmMi5pZnJfbmFtZSkgLSAxKTsKKyAgICBzdHJjcHkoaWYyLmlmcl9uYW1lLCBuYW1lKTsKIAogICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGSU5ERVgsIChjaGFyICopJmlmMikgPCAwKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICByZXR1cm4gaWYyLmlmcl9pZmluZGV4OwotfQotCi0vKgotICogR2V0cyB0aGUgSGFyZHdhcmUgYWRkcmVzcyAodXN1YWxseSBNQUMgYWRkcmVzcykgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCi0gKiBPbiByZXR1cm4gcHV0cyB0aGUgZGF0YSBpbiBidWYsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGgsIGluIGJ5dGUsIG9mIHRoZQotICogTUFDIGFkZHJlc3MuIFJldHVybnMgLTEgaWYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgYWRkcmVzcyBvbiB0aGF0IGludGVyZmFjZS4KLSAqLwotc3RhdGljIGludCBnZXRNYWNBZGRyZXNzCi0gIChKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLSAgICBzdGF0aWMgc3RydWN0IGlmcmVxIGlmcjsKLSAgICBpbnQgaSwgc29jazsKLQotICAgIGlmICgoc29jayA9IG9wZW5Tb2NrZXRXaXRoRmFsbGJhY2soZW52LCBpZm5hbWUpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1lbXNldCgoY2hhciAqKSZpZnIsIDAsIHNpemVvZihpZnIpKTsKLSAgICBzdHJuY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSAtIDEpOwotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0lGSFdBRERSKSBmYWlsZWQiKTsKLSAgICAgICAgY2xvc2Uoc29jayk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBjbG9zZShzb2NrKTsKLSAgICBtZW1jcHkoYnVmLCAmaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgSUZIV0FERFJMRU4pOwotCi0gICAgLy8gYWxsIGJ5dGVzIHRvIDAgbWVhbnMgbm8gaGFyZHdhcmUgYWRkcmVzcwotICAgIGZvciAoaSA9IDA7IGkgPCBJRkhXQUREUkxFTjsgaSsrKSB7Ci0gICAgICAgIGlmIChidWZbaV0gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBJRkhXQUREUkxFTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0TVRVKEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lKSB7Ci0gICAgc3RydWN0IGlmcmVxIGlmMjsKLSAgICBtZW1zZXQoKGNoYXIgKikmaWYyLCAwLCBzaXplb2YoaWYyKSk7Ci0gICAgc3RybmNweShpZjIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5pZnJfbmFtZSkgLSAxKTsKLQotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGTVRVLCAoY2hhciAqKSZpZjIpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHSUZNVFUpIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGlmMi5pZnJfbXR1OwotfQotCi1zdGF0aWMgaW50IGdldEZsYWdzKGludCBzb2NrLCBjb25zdCBjaGFyICppZm5hbWUsIGludCAqZmxhZ3MpIHsKLSAgICBzdHJ1Y3QgaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWYyLmlmcl9uYW1lKSAtIDEpOwotCi0gICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWYyKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmIChzaXplb2YoaWYyLmlmcl9mbGFncykgPT0gc2l6ZW9mKHNob3J0KSkgewotICAgICAgICAqZmxhZ3MgPSAoaWYyLmlmcl9mbGFncyAmIDB4ZmZmZik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmZsYWdzID0gaWYyLmlmcl9mbGFnczsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBfX2xpbnV4X18gKi8KLQotLyoqIEFJWCAqKi8KLSNpZiBkZWZpbmVkKF9BSVgpCi0KLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQotLyoKLSAqIE9wZW5zIGEgc29ja2V0IGZvciBmdXJ0aGVyIGlvY3RsIGNhbGxzLiBUcmllcyBBRl9JTkVUIHNvY2tldCBmaXJzdCBhbmQKLSAqIGlmIGl0IGZhaWxzIHJldHVybiBBRl9JTkVUNiBzb2NrZXQuCi0gKi8KLXN0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKSB7Ci0gICAgaW50IHNvY2s7Ci0KLSAgICBpZiAoKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVQUk9UT05PU1VQUE9SVCkgewotICAgICAgICAgICAgaWYgKChzb2NrID0gSlZNX1NvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCkpIDwgMCkgewotICAgICAgICAgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJUFY2IFNvY2tldCBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7IC8vIGVycm5vIGlzIG5vdCBOT1NVUFBPUlQKLSAgICAgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IKLSAgICAgICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjQgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvY2s7Ci19Ci0jZWxzZQotc3RhdGljIGludCBvcGVuU29ja2V0V2l0aEZhbGxiYWNrKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUpIHsKLSAgICByZXR1cm4gb3BlblNvY2tldChlbnYsIEFGX0lORVQpOwotfQogI2VuZGlmCi0KLS8qCi0gKiBFbnVtZXJhdGVzIGFuZCByZXR1cm5zIGFsbCBJUHY0IGludGVyZmFjZXMgb24gQUlYLgotICovCi1zdGF0aWMgbmV0aWYgKmVudW1JUHY0SW50ZXJmYWNlcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIG5ldGlmICppZnMpIHsKLSAgICBzdHJ1Y3QgaWZjb25mIGlmYzsKLSAgICBzdHJ1Y3QgaWZyZXEgKmlmcmVxUDsKLSAgICBjaGFyICpidWYgPSBOVUxMOwotICAgIHVuc2lnbmVkIGk7Ci0KLSAgICAvLyBjYWxsIFNJT0NHU0laSUZDT05GIHRvIGdldCB0aGUgc2l6ZSBvZiBTSU9DR0lGQ09ORiBidWZmZXIKLSAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dTSVpJRkNPTkYsICYoaWZjLmlmY19sZW4pKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR1NJWklGQ09ORikgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBpZnM7Ci0gICAgfQotCi0gICAgLy8gY2FsbCBDU0lPQ0dJRkNPTkYgaW5zdGVhZCBvZiBTSU9DR0lGQ09ORiB3aGVyZSBpbnRlcmZhY2UKLSAgICAvLyByZWNvcmRzIHdpbGwgYWx3YXlzIGhhdmUgc2l6ZW9mKHN0cnVjdCBpZnJlcSkgbGVuZ3RoLgotICAgIC8vIEJlIGF3YXJlIHRoYXQgb25seSBJUHY0IGRhdGEgaXMgY29tcGxldGUgdGhpcyB3YXkuCi0gICAgQ0hFQ0tFRF9NQUxMT0MzKGJ1ZiwgY2hhciAqLCBpZmMuaWZjX2xlbik7Ci0gICAgaWZjLmlmY19idWYgPSBidWY7Ci0gICAgaWYgKGlvY3RsKHNvY2ssIENTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChDU0lPQ0dJRkNPTkYpIGZhaWxlZCIpOwotICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgIHJldHVybiBpZnM7Ci0gICAgfQotCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCi0gICAgaWZyZXFQID0gaWZjLmlmY19yZXE7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlmYy5pZmNfbGVuIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSk7IGkrKywgaWZyZXFQKyspIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyIGFkZHIsIGJyb2FkYWRkciwgKmJyb2FkYWRkclAgPSBOVUxMOwotICAgICAgICBzaG9ydCBwcmVmaXggPSAwOwotCi0gICAgICAgIC8vIGlnbm9yZSBub24gSVB2NCBhZGRyZXNzZXMKLSAgICAgICAgaWYgKGlmcmVxUC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2F2ZSBzb2NrZXQgYWRkcmVzcwotICAgICAgICBtZW1jcHkoJmFkZHIsICYoaWZyZXFQLT5pZnJfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKLQotICAgICAgICAvLyBkZXRlcm1pbmUgYnJvYWRjYXN0IGFkZHJlc3MsIGlmIGFwcGxpY2FibGUKLSAgICAgICAgaWYgKChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIGlmcmVxUCkgPT0gMCkgJiYKLSAgICAgICAgICAgIGlmcmVxUC0+aWZyX2ZsYWdzICYgSUZGX0JST0FEQ0FTVCkgewotCi0gICAgICAgICAgICAvLyByZXN0b3JlIHNvY2tldCBhZGRyZXNzIHRvIGlmcmVxUAotICAgICAgICAgICAgbWVtY3B5KCYoaWZyZXFQLT5pZnJfYWRkciksICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICAgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGQlJEQUREUiwgaWZyZXFQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZicm9hZGFkZHIsICYoaWZyZXFQLT5pZnJfYnJvYWRhZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOwotICAgICAgICAgICAgICAgIGJyb2FkYWRkclAgPSAmYnJvYWRhZGRyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVzdG9yZSBzb2NrZXQgYWRkcmVzcyB0byBpZnJlcVAKLSAgICAgICAgbWVtY3B5KCYoaWZyZXFQLT5pZnJfYWRkciksICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICAgICAgLy8gZGV0ZXJtaW5lIG5ldG1hc2sKLSAgICAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLLCBpZnJlcVApID09IDApIHsKLSAgICAgICAgICAgIHByZWZpeCA9IHRyYW5zbGF0ZUlQdjRBZGRyZXNzVG9QcmVmaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSYoaWZyZXFQLT5pZnJfYWRkcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIGludGVyZmFjZSB0byB0aGUgbGlzdAotICAgICAgICBpZnMgPSBhZGRpZihlbnYsIHNvY2ssIGlmcmVxUC0+aWZyX25hbWUsIGlmcywKLSAgICAgICAgICAgICAgICAgICAgJmFkZHIsIGJyb2FkYWRkclAsIEFGX0lORVQsIHByZWZpeCk7Ci0KLSAgICAgICAgLy8gaW4gY2FzZSBvZiBleGNlcHRpb24sIGZyZWUgaW50ZXJmYWNlIGxpc3QgYW5kIGJ1ZmZlciBhbmQgcmV0dXJuIE5VTEwKLSAgICAgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uT2NjdXJyZWQoZW52KSkgewotICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgZnJlZWlmKGlmcyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGZyZWUgYnVmZmVyCi0gICAgZnJlZShidWYpOwotICAgIHJldHVybiBpZnM7CiB9CiAKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQotCi0vKgotICogRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgSVB2NiBpbnRlcmZhY2VzIG9uIEFJWC4KKy8qKgorICogUmV0dXJucyB0aGUgSVB2NCBicm9hZGNhc3QgYWRkcmVzcyBvZiBhIG5hbWVkIGludGVyZmFjZSwgaWYgaXQgZXhpc3RzLgorICogUmV0dXJucyAwIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUuCiAgKi8KLXN0YXRpYyBuZXRpZiAqZW51bUlQdjZJbnRlcmZhY2VzKEpOSUVudiAqZW52LCBpbnQgc29jaywgbmV0aWYgKmlmcykgewotICAgIHN0cnVjdCBpZmNvbmYgaWZjOwotICAgIHN0cnVjdCBpZnJlcSAqaWZyZXFQOwotICAgIGNoYXIgKmJ1ZiwgKmNwLCAqY3BsaW1pdDsKK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHIgKmdldEJyb2FkY2FzdChKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgc3RydWN0IHNvY2thZGRyICpicmRjYXN0X3N0b3JlKSB7CisgIHN0cnVjdCBzb2NrYWRkciAqcmV0ID0gTlVMTDsKKyAgc3RydWN0IGlmcmVxIGlmMjsKIAotICAgIC8vIGNhbGwgU0lPQ0dTSVpJRkNPTkYgdG8gZ2V0IHNpemUgZm9yIFNJT0NHSUZDT05GIGJ1ZmZlcgotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR1NJWklGQ09ORiwgJihpZmMuaWZjX2xlbikpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHU0laSUZDT05GKSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGlmczsKLSAgICB9CisgIG1lbXNldCgoY2hhciAqKSAmaWYyLCAwLCBzaXplb2YoaWYyKSk7CisgIHN0cmNweShpZjIuaWZyX25hbWUsIGlmbmFtZSk7CiAKLSAgICAvLyBjYWxsIFNJT0NHSUZDT05GIHRvIGVudW1lcmF0ZSB0aGUgaW50ZXJmYWNlcwotICAgIENIRUNLRURfTUFMTE9DMyhidWYsIGNoYXIgKiwgaWZjLmlmY19sZW4pOwotICAgIGlmYy5pZmNfYnVmID0gYnVmOwotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0lGQ09ORikgZmFpbGVkIik7Ci0gICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgcmV0dXJuIGlmczsKLSAgICB9CisgIC8qIExldCdzIG1ha2Ugc3VyZSB0aGUgaW50ZXJmYWNlIGRvZXMgaGF2ZSBhIGJyb2FkY2FzdCBhZGRyZXNzICovCisgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmMikgIDwgMCkgeworICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgIFNJT0NHSUZGTEFHUyBmYWlsZWQiKTsKKyAgICAgIHJldHVybiByZXQ7CisgIH0KIAotICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIGludGVyZmFjZQotICAgIGlmcmVxUCA9IGlmYy5pZmNfcmVxOwotICAgIGNwID0gKGNoYXIgKilpZmMuaWZjX3JlcTsKLSAgICBjcGxpbWl0ID0gY3AgKyBpZmMuaWZjX2xlbjsKKyAgaWYgKGlmMi5pZnJfZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSB7CisgICAgICAvKiBJdCBkb2VzLCBsZXQncyByZXRyaWV2ZSBpdCovCisgICAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkJSREFERFIsIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgU0lPQ0dJRkJSREFERFIgZmFpbGVkIik7CisgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KIAotICAgIGZvciAoOyBjcCA8IGNwbGltaXQ7Ci0gICAgICAgICBjcCArPSAoc2l6ZW9mKGlmcmVxUC0+aWZyX25hbWUpICsKLSAgICAgICAgICAgICAgICBNQVgoKGlmcmVxUC0+aWZyX2FkZHIpLnNhX2xlbiwgc2l6ZW9mKGlmcmVxUC0+aWZyX2FkZHIpKSkpCi0gICAgewotICAgICAgICBpZnJlcVAgPSAoc3RydWN0IGlmcmVxICopY3A7Ci0gICAgICAgIHNob3J0IHByZWZpeCA9IDA7CisgICAgICByZXQgPSBicmRjYXN0X3N0b3JlOworICAgICAgbWVtY3B5KHJldCwgJmlmMi5pZnJfYnJvYWRhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisgIH0KIAotICAgICAgICAvLyBpZ25vcmUgbm9uIElQdjYgYWRkcmVzc2VzCi0gICAgICAgIGlmIChpZnJlcVAtPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUNikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkZXRlcm1pbmUgbmV0bWFzawotICAgICAgICBzdHJ1Y3QgaW42X2lmcmVxIGlmNjsKLSAgICAgICAgbWVtc2V0KChjaGFyICopJmlmNiwgMCwgc2l6ZW9mKGlmNikpOwotICAgICAgICBzdHJuY3B5KGlmNi5pZnJfbmFtZSwgaWZyZXFQLT5pZnJfbmFtZSwgc2l6ZW9mKGlmNi5pZnJfbmFtZSkgLSAxKTsKLSAgICAgICAgbWVtY3B5KCYoaWY2Lmlmcl9BZGRyKSwgJihpZnJlcVAtPmlmcl9hZGRyKSwKLSAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7Ci0gICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGTkVUTUFTSzYsIChjaGFyICopJmlmNikgPj0gMCkgewotICAgICAgICAgICAgcHJlZml4ID0gdHJhbnNsYXRlSVB2NkFkZHJlc3NUb1ByZWZpeCgmKGlmNi5pZnJfQWRkcikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2V0IHNjb3BlIElEIHRvIGludGVyZmFjZSBpbmRleAotICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmKGlmcmVxUC0+aWZyX2FkZHIpKS0+c2luNl9zY29wZV9pZCA9Ci0gICAgICAgICAgICBnZXRJbmRleChzb2NrLCBpZnJlcVAtPmlmcl9uYW1lKTsKLQotICAgICAgICAvLyBhZGQgaW50ZXJmYWNlIHRvIHRoZSBsaXN0Ci0gICAgICAgIGlmcyA9IGFkZGlmKGVudiwgc29jaywgaWZyZXFQLT5pZnJfbmFtZSwgaWZzLAotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJihpZnJlcVAtPmlmcl9hZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgQUZfSU5FVDYsIHByZWZpeCk7Ci0KLSAgICAgICAgLy8gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHRoZW4gZnJlZSB0aGUgbGlzdAotICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7Ci0gICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICBmcmVlaWYoaWZzKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZnJlZSBidWZmZXIKLSAgICBmcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIGlmczsKKyAgcmV0dXJuIHJldDsKIH0KIAotI2VuZGlmIC8qIEFGX0lORVQ2ICovCi0KLS8qCi0gKiBUcnkgdG8gZ2V0IHRoZSBpbnRlcmZhY2UgaW5kZXguCisvKioKKyAqIFJldHVybnMgdGhlIElQdjQgc3VibmV0IHByZWZpeCBsZW5ndGggKGFrYSBzdWJuZXQgbWFzaykgZm9yIHRoZSBuYW1lZAorICogaW50ZXJmYWNlLCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UgcmV0dXJuIC0xLgogICovCi1zdGF0aWMgaW50IGdldEluZGV4KGludCBzb2NrLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgaW50IGluZGV4ID0gaWZfbmFtZXRvaW5kZXgobmFtZSk7Ci0gICAgcmV0dXJuIChpbmRleCA9PSAwKSA/IC0xIDogaW5kZXg7CitzdGF0aWMgc2hvcnQgZ2V0U3VibmV0KEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lKSB7CisgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgc2hvcnQgcmV0OworICAgIHN0cnVjdCBpZnJlcSBpZjI7CisKKyAgICBtZW1zZXQoKGNoYXIgKikgJmlmMiwgMCwgc2l6ZW9mKGlmMikpOworICAgIHN0cmNweShpZjIuaWZyX25hbWUsIGlmbmFtZSk7CisKKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRk5FVE1BU0ssIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklPQ1RMIFNJT0NHSUZORVRNQVNLIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWFzayA9IG50b2hsKCgoc3RydWN0IHNvY2thZGRyX2luKikmKGlmMi5pZnJfYWRkcikpLT5zaW5fYWRkci5zX2FkZHIpOworICAgIHJldCA9IDA7CisgICAgd2hpbGUgKG1hc2spIHsKKyAgICAgICBtYXNrIDw8PSAxOworICAgICAgIHJldCsrOworICAgIH0KKworICAgIHJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBHZXRzIHRoZSBIYXJkd2FyZSBhZGRyZXNzICh1c3VhbGx5IE1BQyBhZGRyZXNzKSBmb3IgdGhlIG5hbWVkIGludGVyZmFjZS4KLSAqIE9uIHJldHVybiBwdXRzIHRoZSBkYXRhIGluIGJ1ZiwgYW5kIHJldHVybnMgdGhlIGxlbmd0aCwgaW4gYnl0ZSwgb2YgdGhlCisvKioKKyAqIEdldCB0aGUgSGFyZHdhcmUgYWRkcmVzcyAodXN1YWxseSBNQUMgYWRkcmVzcykgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCisgKiByZXR1cm4gcHV0cyB0aGUgZGF0YSBpbiBidWYsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGgsIGluIGJ5dGUsIG9mIHRoZQogICogTUFDIGFkZHJlc3MuIFJldHVybnMgLTEgaWYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgYWRkcmVzcyBvbiB0aGF0IGludGVyZmFjZS4KICAqLwotc3RhdGljIGludCBnZXRNYWNBZGRyZXNzCi0gIChKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKK3N0YXRpYyBpbnQgZ2V0TWFjQWRkcmVzcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIqIGlmbmFtZSwgY29uc3Qgc3RydWN0IGluX2FkZHIqIGFkZHIsIHVuc2lnbmVkIGNoYXIgKmJ1ZikgeworI2lmIGRlZmluZWQgKF9BSVgpCiAgICAgaW50IHNpemU7CiAgICAgc3RydWN0IGtpbmZvX25kZCAqbmRkcDsKICAgICB2b2lkICplbmQ7CkBAIC0xNTU1LDggKzE0MzQsNyBAQAogICAgIG5kZHAgPSAoc3RydWN0IGtpbmZvX25kZCAqKW1hbGxvYyhzaXplKTsKIAogICAgIGlmICghbmRkcCkgewotICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwKLSAgICAgICAgICAgICJOZXR3b3JrIGludGVyZmFjZSBnZXRNYWNBZGRyZXNzIG5hdGl2ZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgSk5VX1Rocm93T3V0T2ZNZW1vcnlFcnJvcihlbnYsICJOZXR3b3JrIGludGVyZmFjZSBnZXRNYWNBZGRyZXNzIG5hdGl2ZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApAQCAtMTU3NywyNDMgKzE0NTUsMjI3IEBACiAgICAgfQogCiAgICAgcmV0dXJuIC0xOwotfQogCi1zdGF0aWMgaW50IGdldE1UVShKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSkgewotICAgIHN0cnVjdCBpZnJlcSBpZjI7Ci0gICAgbWVtc2V0KChjaGFyICopJmlmMiwgMCwgc2l6ZW9mKGlmMikpOwotICAgIHN0cm5jcHkoaWYyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZjIuaWZyX25hbWUpIC0gMSk7CisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBzdGF0aWMgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpbnQgaTsKIAotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGTVRVLCAoY2hhciAqKSZpZjIpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHSUZNVFUpIGZhaWxlZCIpOworICAgIHN0cmNweShpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZIV0FERFIsICZpZnIpIDwgMCkgeworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJT0NUTCBTSU9DR0lGSFdBRERSIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIGlmMi5pZnJfbXR1OworICAgIG1lbWNweShidWYsICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBJRkhXQUREUkxFTik7CisKKyAgIC8qCisgICAgKiBBbGwgYnl0ZXMgdG8gMCBtZWFucyBubyBoYXJkd2FyZSBhZGRyZXNzLgorICAgICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSUZIV0FERFJMRU47IGkrKykgeworICAgICAgICBpZiAoYnVmW2ldICE9IDApCisgICAgICAgICAgICByZXR1cm4gSUZIV0FERFJMRU47CisgICAgfQorCisgICAgcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgZ2V0TVRVKEpOSUVudiAqZW52LCBpbnQgc29jaywgIGNvbnN0IGNoYXIgKmlmbmFtZSkgeworICAgIHN0cnVjdCBpZnJlcSBpZjI7CisKKyAgICBtZW1zZXQoKGNoYXIgKikgJmlmMiwgMCwgc2l6ZW9mKGlmMikpOworICAgIGlmIChpZm5hbWUgIT0gTlVMTCkgeworICAgICAgICBzdHJjcHkoaWYyLmlmcl9uYW1lLCBpZm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEpOVV9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm5ldHdvcmsgaW50ZXJmYWNlIG5hbWUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZNVFUsIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklPQ1RMIFNJT0NHSUZNVFUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gIGlmMi5pZnJfbXR1OwogfQogCiBzdGF0aWMgaW50IGdldEZsYWdzKGludCBzb2NrLCBjb25zdCBjaGFyICppZm5hbWUsIGludCAqZmxhZ3MpIHsKLSAgICBzdHJ1Y3QgaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWYyLmlmcl9uYW1lKSAtIDEpOworICBzdHJ1Y3QgaWZyZXEgaWYyOwogCi0gICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWYyKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgbWVtc2V0KChjaGFyICopICZpZjIsIDAsIHNpemVvZihpZjIpKTsKKyAgc3RyY3B5KGlmMi5pZnJfbmFtZSwgaWZuYW1lKTsKIAotICAgIGlmIChzaXplb2YoaWYyLmlmcl9mbGFncykgPT0gc2l6ZW9mKHNob3J0KSkgewotICAgICAgICAqZmxhZ3MgPSAoaWYyLmlmcl9mbGFncyAmIDB4ZmZmZik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmZsYWdzID0gaWYyLmlmcl9mbGFnczsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmMikgPCAwKXsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChzaXplb2YoaWYyLmlmcl9mbGFncykgPT0gc2l6ZW9mKHNob3J0KSkgeworICAgICAgKmZsYWdzID0gKGlmMi5pZnJfZmxhZ3MgJiAweGZmZmYpOworICB9IGVsc2UgeworICAgICAgKmZsYWdzID0gaWYyLmlmcl9mbGFnczsKKyAgfQorICByZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIF9BSVggKi8KKyNlbmRpZgogCiAvKiogU29sYXJpcyAqKi8KLSNpZiBkZWZpbmVkKF9fc29sYXJpc19fKQotCi0jaWYgZGVmaW5lZChBRl9JTkVUNikKLS8qCi0gKiBPcGVucyBhIHNvY2tldCBmb3IgZnVydGhlciBpb2N0bCBjYWxscy4gVHJpZXMgQUZfSU5FVCBzb2NrZXQgZmlyc3QgYW5kCi0gKiBpZiBpdCBmYWlscyByZXR1cm4gQUZfSU5FVDYgc29ja2V0LgorI2lmZGVmIF9fc29sYXJpc19fCisvKiBPcGVuIHNvY2tldCBmb3IgZnVydGhlciBpb2N0IGNhbGxzLCB0cnkgdjQgc29ja2V0IGZpcnN0IGFuZAorICogaWYgaXQgZmFsbHMgcmV0dXJuIHY2IHNvY2tldAogICovCi1zdGF0aWMgaW50IG9wZW5Tb2NrZXRXaXRoRmFsbGJhY2soSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmlmbmFtZSkgeworCisjaWZkZWYgQUZfSU5FVDYKK3N0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKXsKICAgICBpbnQgc29jaywgYWxyZWFkeVY2ID0gMDsKICAgICBzdHJ1Y3QgbGlmcmVxIGlmMjsKIAotICAgIGlmICgoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRVBST1RPTk9TVVBQT1JUKSB7Ci0gICAgICAgICAgICBpZiAoKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjYgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFscmVhZHlWNiA9IDE7Ci0gICAgICAgIH0gZWxzZSB7IC8vIGVycm5vIGlzIG5vdCBOT1NVUFBPUlQKLSAgICAgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IKLSAgICAgICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjQgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQorICAgICBpZiAoKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKKyAgICAgICAgIGlmIChlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQpeworICAgICAgICAgICAgICBpZiAoIChzb2NrID0gSlZNX1NvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCkpIDwgMCApeworICAgICAgICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSVBWNiBTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgfQogCi0gICAgLy8gU29sYXJpcyByZXF1aXJlcyB0aGF0IHdlIGhhdmUgYW4gSVB2NiBzb2NrZXQgdG8gcXVlcnkgYW4gIGludGVyZmFjZQotICAgIC8vIHdpdGhvdXQgYW4gSVB2NCBhZGRyZXNzIC0gY2hlY2sgaXQgaGVyZS4gUE9TSVggMSByZXF1aXJlIHRoZSBrZXJuZWwgdG8KLSAgICAvLyByZXR1cm4gRU5PVFRZIGlmIHRoZSBjYWxsIGlzIGluYXBwcm9wcmlhdGUgZm9yIGEgZGV2aWNlIGUuZy4gdGhlIE5FVE1BU0sKLSAgICAvLyBmb3IgYSBkZXZpY2UgaGF2aW5nIElQdjYgb25seSBhZGRyZXNzIGJ1dCBub3QgYWxsIGRldmljZXMgZm9sbG93IHRoZQotICAgIC8vIHN0YW5kYXJkIHNvIGZhbGwgYmFjayBvbiBhbnkgZXJyb3IuIEl0J3Mgbm90IGFuIGVjb2xvZ2ljYWxseSBmcmllbmRseQotICAgIC8vIGdlc3R1cmUgYnV0IG1vcmUgcmVsaWFibGUuCi0gICAgaWYgKCFhbHJlYWR5VjYpIHsKLSAgICAgICAgbWVtc2V0KChjaGFyICopJmlmMiwgMCwgc2l6ZW9mKGlmMikpOwotICAgICAgICBzdHJuY3B5KGlmMi5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5saWZyX25hbWUpIC0gMSk7CisgICAgICAgICAgICAgIGFscmVhZHlWNj0xOworICAgICAgICAgfQorICAgICAgICAgZWxzZXsgLy8gZXJybm8gaXMgbm90IE5PU1VQUE9SVAorICAgICAgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52ICwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJUFY0IFNvY2tldCBjcmVhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICB9CisgICB9CisKKyAgICAgLyoqCisgICAgICAqIFNvbGFyaXMgcmVxdWlyZXMgdGhhdCB3ZSBoYXZlIGFuIElQdjYgc29ja2V0IHRvIHF1ZXJ5IGFuCisgICAgICAqIGludGVyZmFjZSB3aXRob3V0IGFuIElQdjQgYWRkcmVzcyAtIGNoZWNrIGl0IGhlcmUuCisgICAgICAqIFBPU0lYIDEgcmVxdWlyZSB0aGUga2VybmVsIHRvIHJldHVybiBFTk9UVFkgaWYgdGhlIGNhbGwgaXMKKyAgICAgICogaW5hcHByb3ByaWF0ZSBmb3IgYSBkZXZpY2UgZS5nLiB0aGUgTkVUTUFTSyBmb3IgYSBkZXZpY2UgaGF2aW5nIElQdjYKKyAgICAgICogb25seSBhZGRyZXNzIGJ1dCBub3QgYWxsIGRldmljZXMgZm9sbG93IHRoZSBzdGFuZGFyZCBzbworICAgICAgKiBmYWxsIGJhY2sgb24gYW55IGVycm9yLiBJdCdzIG5vdCBhbiBlY29sb2dpY2FsbHkgZnJpZW5kbHkgZ2VzdHVyZQorICAgICAgKiBidXQgbW9yZSByZWxpYWJsZS4KKyAgICAgICovCisKKyAgICBpZiAoISBhbHJlYWR5VjYgKXsKKyAgICAgICAgbWVtc2V0KChjaGFyICopICZpZjIsIDAsIHNpemVvZihpZjIpKTsKKyAgICAgICAgc3RyY3B5KGlmMi5saWZyX25hbWUsIGlmbmFtZSk7CiAgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0xJRk5FVE1BU0ssIChjaGFyICopJmlmMikgPCAwKSB7Ci0gICAgICAgICAgICBjbG9zZShzb2NrKTsKLSAgICAgICAgICAgIGlmICgoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKLSAgICAgICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAgICAgICAgIChlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSVBWNiBTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlKHNvY2spOworICAgICAgICAgICAgICAgIGlmICggKHNvY2sgPSBKVk1fU29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwICl7CisgICAgICAgICAgICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjYgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gc29jazsKIH0KKwogI2Vsc2UKLXN0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKSB7Ci0gICAgcmV0dXJuIG9wZW5Tb2NrZXQoZW52LCBBRl9JTkVUKTsKK3N0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKXsKKyAgICByZXR1cm4gb3BlblNvY2tldChlbnYsQUZfSU5FVCk7CiB9CiAjZW5kaWYKIAogLyoKLSAqIEVudW1lcmF0ZXMgYW5kIHJldHVybnMgYWxsIElQdjQgaW50ZXJmYWNlcyBvbiBTb2xhcmlzLgorICogRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgSVB2NCBpbnRlcmZhY2VzCisgKiAobGludXggdmVyaXNpb24pCiAgKi8KLXN0YXRpYyBuZXRpZiAqZW51bUlQdjRJbnRlcmZhY2VzKEpOSUVudiAqZW52LCBpbnQgc29jaywgbmV0aWYgKmlmcykgewotICAgIHN0cnVjdCBsaWZjb25mIGlmYzsKLSAgICBzdHJ1Y3QgbGlmcmVxICppZnJlcVA7Ci0gICAgc3RydWN0IGxpZm51bSBudW1pZnM7Ci0gICAgY2hhciAqYnVmID0gTlVMTDsKLSAgICB1bnNpZ25lZCBpOwogCi0gICAgLy8gY2FsbCBTSU9DR0xJRk5VTSB0byBnZXQgdGhlIGludGVyZmFjZSBjb3VudAotICAgIG51bWlmcy5saWZuX2ZhbWlseSA9IEFGX0lORVQ7CitzdGF0aWMgbmV0aWYgKmVudW1JUHY0SW50ZXJmYWNlcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIG5ldGlmICppZnMpIHsKKyAgICAgcmV0dXJuIGVudW1JUHZYSW50ZXJmYWNlcyhlbnYsc29jaywgaWZzLCBBRl9JTkVUKTsKK30KKworI2lmZGVmIEFGX0lORVQ2CitzdGF0aWMgbmV0aWYgKmVudW1JUHY2SW50ZXJmYWNlcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIG5ldGlmICppZnMpIHsKKyAgICByZXR1cm4gZW51bUlQdlhJbnRlcmZhY2VzKGVudixzb2NrLCBpZnMsIEFGX0lORVQ2KTsKK30KKyNlbmRpZgorCisvKgorICAgRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgaW50ZXJmYWNlcyBvbiBTb2xhcmlzCisgICB1c2UgdGhlIHNhbWUgY29kZSBmb3IgSVB2NCBhbmQgSVB2NgorICovCitzdGF0aWMgbmV0aWYgKmVudW1JUHZYSW50ZXJmYWNlcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIG5ldGlmICppZnMsIGludCBmYW1pbHkpIHsKKyAgICBzdHJ1Y3QgbGlmY29uZiBpZmM7CisgICAgc3RydWN0IGxpZnJlcSAqaWZyOworICAgIGludCBuOworICAgIGNoYXIgKmJ1ZjsKKyAgICBzdHJ1Y3QgbGlmbnVtIG51bWlmczsKKyAgICB1bnNpZ25lZCBidWZzaXplOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGludGVyZmFjZSBjb3VudAorICAgICAqLworICAgIG51bWlmcy5saWZuX2ZhbWlseSA9IGZhbWlseTsKICAgICBudW1pZnMubGlmbl9mbGFncyA9IDA7CiAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGTlVNLCAoY2hhciAqKSZudW1pZnMpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHTElGTlVNKSBmYWlsZWQiKTsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsIFNJT0NHTElGTlVNIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gaWZzOwogICAgIH0KIAotICAgIC8vIGNhbGwgU0lPQ0dMSUZDT05GIHRvIGVudW1lcmF0ZSB0aGUgaW50ZXJmYWNlcwotICAgIGlmYy5saWZjX2xlbiA9IG51bWlmcy5saWZuX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBsaWZyZXEpOwotICAgIENIRUNLRURfTUFMTE9DMyhidWYsIGNoYXIgKiwgaWZjLmxpZmNfbGVuKTsKLSAgICBpZmMubGlmY19idWYgPSBidWY7Ci0gICAgaWZjLmxpZmNfZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAvKgorICAgICAqICBFbnVtZXJhdGUgdGhlIGludGVyZmFjZSBjb25maWd1cmF0aW9ucworICAgICAqLworICAgIGJ1ZnNpemUgPSBudW1pZnMubGlmbl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGxpZnJlcSk7CisgICAgQ0hFQ0tFRF9NQUxMT0MzKGJ1ZiwgY2hhciAqLCBidWZzaXplKTsKKworICAgIGlmYy5saWZjX2ZhbWlseSA9IGZhbWlseTsKICAgICBpZmMubGlmY19mbGFncyA9IDA7CisgICAgaWZjLmxpZmNfbGVuID0gYnVmc2l6ZTsKKyAgICBpZmMubGlmY19idWYgPSBidWY7CiAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0xJRkNPTkYpIGZhaWxlZCIpOworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiaW9jdGwgU0lPQ0dMSUZDT05GIGZhaWxlZCIpOwogICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgIHJldHVybiBpZnM7CiAgICAgfQogCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCi0gICAgaWZyZXFQID0gaWZjLmxpZmNfcmVxOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1pZnMubGlmbl9jb3VudDsgaSsrLCBpZnJlcVArKykgewotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgYWRkciwgKmJyb2FkYWRkclAgPSBOVUxMOworICAgIC8qCisgICAgICogSXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCisgICAgICovCisgICAgaWZyID0gaWZjLmxpZmNfcmVxOworICAgIGZvciAobj0wOyBuPG51bWlmcy5saWZuX2NvdW50OyBuKyssIGlmcisrKSB7CisgICAgICAgIGludCBpbmRleCA9IC0xOworICAgICAgICBzdHJ1Y3QgbGlmcmVxIGlmMjsKIAotICAgICAgICAvLyBpZ25vcmUgbm9uIElQdjQgYWRkcmVzc2VzCi0gICAgICAgIGlmIChpZnJlcVAtPmxpZnJfYWRkci5zc19mYW1pbHkgIT0gQUZfSU5FVCkgeworICAgICAgICAvKgorICAgICAgICAqIElnbm9yZSBlaXRoZXIgSVB2NCBvciBJUHY2IGFkZHJlc3NlcworICAgICAgICAqLworICAgICAgICBpZiAoaWZyLT5saWZyX2FkZHIuc3NfZmFtaWx5ICE9IGZhbWlseSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBzYXZlIHNvY2tldCBhZGRyZXNzCi0gICAgICAgIG1lbWNweSgmYWRkciwgJihpZnJlcVAtPmxpZnJfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKLQotICAgICAgICAvLyBkZXRlcm1pbmUgYnJvYWRjYXN0IGFkZHJlc3MsIGlmIGFwcGxpY2FibGUKLSAgICAgICAgaWYgKChpb2N0bChzb2NrLCBTSU9DR0xJRkZMQUdTLCBpZnJlcVApID09IDApICYmCi0gICAgICAgICAgICBpZnJlcVAtPmxpZnJfZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSB7Ci0KLSAgICAgICAgICAgIC8vIHJlc3RvcmUgc29ja2V0IGFkZHJlc3MgdG8gaWZyZXFQCi0gICAgICAgICAgICBtZW1jcHkoJihpZnJlcVAtPmxpZnJfYWRkciksICZhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7Ci0KLSAgICAgICAgICAgIC8vIHF1ZXJ5IGJyb2FkY2FzdCBhZGRyZXNzIGFuZCBzZXQgcG9pbnRlciB0byBpdAotICAgICAgICAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGQlJEQUREUiwgaWZyZXFQKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJvYWRhZGRyUCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmKGlmcmVxUC0+bGlmcl9icm9hZGFkZHIpOwotICAgICAgICAgICAgfQorI2lmZGVmIEFGX0lORVQ2CisgICAgICAgIGlmIChpZnItPmxpZnJfYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnM2PSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSYoaWZyLT5saWZyX2FkZHIpOworICAgICAgICAgICAgczYtPnNpbjZfc2NvcGVfaWQgPSBnZXRJbmRleChzb2NrLCBpZnItPmxpZnJfbmFtZSk7CiAgICAgICAgIH0KKyNlbmRpZgogCi0gICAgICAgIC8vIGFkZCB0byB0aGUgbGlzdAotICAgICAgICBpZnMgPSBhZGRpZihlbnYsIHNvY2ssIGlmcmVxUC0+bGlmcl9uYW1lLCBpZnMsCi0gICAgICAgICAgICAgICAgICAgICZhZGRyLCBicm9hZGFkZHJQLCBBRl9JTkVULCAoc2hvcnQpaWZyZXFQLT5saWZyX2FkZHJsZW4pOworICAgICAgICAvKiBhZGQgdG8gdGhlIGxpc3QgKi8KKyAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLGlmci0+bGlmcl9uYW1lLCBpZnMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmKGlmci0+bGlmcl9hZGRyKSxmYW1pbHksIChzaG9ydCkgaWZyLT5saWZyX2FkZHJsZW4pOwogCi0gICAgICAgIC8vIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3ZSByZXR1cm4gaW1tZWRpYXRlbHkKKyAgICAgICAgLyoKKyAgICAgICAgKiBJZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2UgcmV0dXJuIGltbWVkaWF0ZWx5CisgICAgICAgICovCiAgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgIHJldHVybiBpZnM7CiAgICAgICAgIH0KKwogICAgfQogCi0gICAgLy8gZnJlZSBidWZmZXIKICAgICBmcmVlKGJ1Zik7CiAgICAgcmV0dXJuIGlmczsKIH0KIAotI2lmIGRlZmluZWQoQUZfSU5FVDYpCi0KLS8qCi0gKiBFbnVtZXJhdGVzIGFuZCByZXR1cm5zIGFsbCBJUHY2IGludGVyZmFjZXMgb24gU29sYXJpcy4KLSAqLwotc3RhdGljIG5ldGlmICplbnVtSVB2NkludGVyZmFjZXMoSk5JRW52ICplbnYsIGludCBzb2NrLCBuZXRpZiAqaWZzKSB7Ci0gICAgc3RydWN0IGxpZmNvbmYgaWZjOwotICAgIHN0cnVjdCBsaWZyZXEgKmlmcmVxUDsKLSAgICBzdHJ1Y3QgbGlmbnVtIG51bWlmczsKLSAgICBjaGFyICpidWYgPSBOVUxMOwotICAgIHVuc2lnbmVkIGk7Ci0KLSAgICAvLyBjYWxsIFNJT0NHTElGTlVNIHRvIGdldCB0aGUgaW50ZXJmYWNlIGNvdW50Ci0gICAgbnVtaWZzLmxpZm5fZmFtaWx5ID0gQUZfSU5FVDY7Ci0gICAgbnVtaWZzLmxpZm5fZmxhZ3MgPSAwOwotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0xJRk5VTSwgKGNoYXIgKikmbnVtaWZzKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0xJRk5VTSkgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBpZnM7Ci0gICAgfQotCi0gICAgLy8gY2FsbCBTSU9DR0xJRkNPTkYgdG8gZW51bWVyYXRlIHRoZSBpbnRlcmZhY2VzCi0gICAgaWZjLmxpZmNfbGVuID0gbnVtaWZzLmxpZm5fY291bnQgKiBzaXplb2Yoc3RydWN0IGxpZnJlcSk7Ci0gICAgQ0hFQ0tFRF9NQUxMT0MzKGJ1ZiwgY2hhciAqLCBpZmMubGlmY19sZW4pOwotICAgIGlmYy5saWZjX2J1ZiA9IGJ1ZjsKLSAgICBpZmMubGlmY19mYW1pbHkgPSBBRl9JTkVUNjsKLSAgICBpZmMubGlmY19mbGFncyA9IDA7Ci0gICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJpb2N0bChTSU9DR0xJRkNPTkYpIGZhaWxlZCIpOwotICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgIHJldHVybiBpZnM7Ci0gICAgfQotCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggaW50ZXJmYWNlCi0gICAgaWZyZXFQID0gaWZjLmxpZmNfcmVxOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1pZnMubGlmbl9jb3VudDsgaSsrLCBpZnJlcVArKykgewotCi0gICAgICAgIC8vIGlnbm9yZSBub24gSVB2NiBhZGRyZXNzZXMKLSAgICAgICAgaWYgKGlmcmVxUC0+bGlmcl9hZGRyLnNzX2ZhbWlseSAhPSBBRl9JTkVUNikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgc2NvcGUgSUQgdG8gaW50ZXJmYWNlIGluZGV4Ci0gICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKSYoaWZyZXFQLT5saWZyX2FkZHIpKS0+c2luNl9zY29wZV9pZCA9Ci0gICAgICAgICAgICBnZXRJbmRleChzb2NrLCBpZnJlcVAtPmxpZnJfbmFtZSk7Ci0KLSAgICAgICAgLy8gYWRkIHRvIHRoZSBsaXN0Ci0gICAgICAgIGlmcyA9IGFkZGlmKGVudiwgc29jaywgaWZyZXFQLT5saWZyX25hbWUsIGlmcywKLSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSYoaWZyZXFQLT5saWZyX2FkZHIpLAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBBRl9JTkVUNiwgKHNob3J0KWlmcmVxUC0+bGlmcl9hZGRybGVuKTsKLQotICAgICAgICAvLyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgd2UgcmV0dXJuIGltbWVkaWF0ZWx5Ci0gICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKLSAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgIHJldHVybiBpZnM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBmcmVlIGJ1ZmZlcgotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gaWZzOwotfQotCi0jZW5kaWYgLyogQUZfSU5FVDYgKi8KLQotLyoKLSAqIFRyeSB0byBnZXQgdGhlIGludGVyZmFjZSBpbmRleC4KLSAqIChOb3Qgc3VwcG9ydGVkIG9uIFNvbGFyaXMgMi42IG9yIDcpCi0gKi8KLXN0YXRpYyBpbnQgZ2V0SW5kZXgoaW50IHNvY2ssIGNvbnN0IGNoYXIgKm5hbWUpIHsKK3N0YXRpYyBpbnQgZ2V0SW5kZXgoaW50IHNvY2ssIGNvbnN0IGNoYXIgKm5hbWUpeworICAgLyoKKyAgICAqIFRyeSB0byBnZXQgdGhlIGludGVyZmFjZSBpbmRleAorICAgICogKE5vdCBzdXBwb3J0ZWQgb24gU29sYXJpcyAyLjYgb3IgNykKKyAgICAqLwogICAgIHN0cnVjdCBsaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5saWZyX25hbWUsIG5hbWUsIHNpemVvZihpZjIubGlmcl9uYW1lKSAtIDEpOworICAgIHN0cmNweShpZjIubGlmcl9uYW1lLCBuYW1lKTsKIAogICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0xJRklOREVYLCAoY2hhciAqKSZpZjIpIDwgMCkgewogICAgICAgICByZXR1cm4gLTE7CkBAIC0xODIyLDE0ICsxNjg0LDc1IEBACiAgICAgcmV0dXJuIGlmMi5saWZyX2luZGV4OwogfQogCi0vKgorLyoqCisgKiBSZXR1cm5zIHRoZSBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzIG9mIGEgbmFtZWQgaW50ZXJmYWNlLCBpZiBpdCBleGlzdHMuCisgKiBSZXR1cm5zIDAgaWYgaXQgZG9lc24ndCBoYXZlIG9uZS4KKyAqLworc3RhdGljIHN0cnVjdCBzb2NrYWRkciAqZ2V0QnJvYWRjYXN0KEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmJyZGNhc3Rfc3RvcmUpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKnJldCA9IE5VTEw7CisgICAgc3RydWN0IGxpZnJlcSBpZjI7CisKKyAgICBtZW1zZXQoKGNoYXIgKikgJmlmMiwgMCwgc2l6ZW9mKGlmMikpOworICAgIHN0cmNweShpZjIubGlmcl9uYW1lLCBpZm5hbWUpOworCisgICAgLyogTGV0J3MgbWFrZSBzdXJlIHRoZSBpbnRlcmZhY2UgZG9lcyBoYXZlIGEgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dMSUZGTEFHUywgKGNoYXIgKikmaWYyKSAgPCAwKSB7CisgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklPQ1RMICBTSU9DR0xJRkZMQUdTIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChpZjIubGlmcl9mbGFncyAmIElGRl9CUk9BRENBU1QpIHsKKyAgICAgICAgLyogSXQgZG9lcywgbGV0J3MgcmV0cmlldmUgaXQqLworICAgICAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dMSUZCUkRBRERSLCAoY2hhciAqKSZpZjIpIDwgMCkgeworICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgU0lPQ0dMSUZCUkRBRERSIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGJyZGNhc3Rfc3RvcmU7CisgICAgICAgIG1lbWNweShyZXQsICZpZjIubGlmcl9icm9hZGFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFJldHVybnMgdGhlIElQdjQgc3VibmV0IHByZWZpeCBsZW5ndGggKGFrYSBzdWJuZXQgbWFzaykgZm9yIHRoZSBuYW1lZAorICogaW50ZXJmYWNlLCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UgcmV0dXJuIC0xLgorICovCitzdGF0aWMgc2hvcnQgZ2V0U3VibmV0KEpOSUVudiAqZW52LCBpbnQgc29jaywgY29uc3QgY2hhciAqaWZuYW1lKSB7CisgICAgdW5zaWduZWQgaW50IG1hc2s7CisgICAgc2hvcnQgcmV0OworICAgIHN0cnVjdCBsaWZyZXEgaWYyOworCisgICAgbWVtc2V0KChjaGFyICopICZpZjIsIDAsIHNpemVvZihpZjIpKTsKKyAgICBzdHJjcHkoaWYyLmxpZnJfbmFtZSwgaWZuYW1lKTsKKworICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0xJRk5FVE1BU0ssIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklPQ1RMIFNJT0NHTElGTkVUTUFTSyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1hc2sgPSBudG9obCgoKHN0cnVjdCBzb2NrYWRkcl9pbiopJihpZjIubGlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkcik7CisgICAgcmV0ID0gMDsKKworICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgbWFzayA8PD0gMTsKKyAgICAgICByZXQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKworI2RlZmluZSBERVZfUFJFRklYICAiL2Rldi8iCisKKy8qKgogICogU29sYXJpcyBzcGVjaWZpYyBETFBJIGNvZGUgdG8gZ2V0IGhhcmR3YXJlIGFkZHJlc3MgZnJvbSBhIGRldmljZS4KICAqIFVuZm9ydHVuYXRlbHksIGF0IGxlYXN0IHVwIHRvIFNvbGFyaXMgWCwgeW91IGhhdmUgdG8gaGF2ZSBzcGVjaWFsCiAgKiBwcml2aWxlZ2VzIChpLmUuIGJlIHJvb3QpLgogICovCi1zdGF0aWMgaW50IGdldE1hY0Zyb21EZXZpY2UKLSAgKEpOSUVudiAqZW52LCBjb25zdCBjaGFyICppZm5hbWUsIHVuc2lnbmVkIGNoYXIgKnJldGJ1ZikKLXsKK3N0YXRpYyBpbnQgZ2V0TWFjRnJvbURldmljZShKTklFbnYgKmVudiwgY29uc3QgY2hhciogaWZuYW1lLCB1bnNpZ25lZCBjaGFyKiByZXRidWYpIHsKICAgICBjaGFyIHN0eWxlMWRldltNQVhQQVRITEVOXTsKICAgICBpbnQgZmQ7CiAgICAgZGxfcGh5c19hZGRyX3JlcV90IGRscGFyZXE7CkBAIC0xODM4LDEzICsxNzYxLDE4IEBACiAgICAgY2hhciBidWZbMTI4XTsKICAgICBpbnQgZmxhZ3MgPSAwOwogCi0gICAgLy8gRGV2aWNlIGlzIGluIC9kZXYuICBlLmcuOiAvZGV2L2JnZTAKKyAgIC8qKgorICAgICogRGV2aWNlIGlzIGluIC9kZXYKKyAgICAqIGUuZy46IC9kZXYvYmdlMAorICAgICovCiAgICAgc3RyY3B5KHN0eWxlMWRldiwgREVWX1BSRUZJWCk7CiAgICAgc3RyY2F0KHN0eWxlMWRldiwgaWZuYW1lKTsKICAgICBpZiAoKGZkID0gb3BlbihzdHlsZTFkZXYsIE9fUkRXUikpIDwgMCkgewotICAgICAgICAvLyBDYW4ndCBvcGVuIGl0LiBXZSBwcm9iYWJseSBhcmUgbWlzc2luZyB0aGUgcHJpdmlsZWdlLgotICAgICAgICAvLyBXZSdsbCBoYXZlIHRvIHRyeSBzb21ldGhpbmcgZWxzZQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FuJ3Qgb3BlbiBpdC4gV2UgcHJvYmFibHkgYXJlIG1pc3NpbmcgdGhlIHByaXZpbGVnZS4KKyAgICAgICAgICogV2UnbGwgaGF2ZSB0byB0cnkgc29tZXRoaW5nIGVsc2UKKyAgICAgICAgICovCisgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBkbHBhcmVxLmRsX3ByaW1pdGl2ZSA9IERMX1BIWVNfQUREUl9SRVE7CkBAIC0xODU0LDggKzE3ODIsNyBAQAogICAgIG1zZy5sZW4gPSBETF9QSFlTX0FERFJfUkVRX1NJWkU7CiAKICAgICBpZiAocHV0bXNnKGZkLCAmbXNnLCBOVUxMLCAwKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJwdXRtc2coKSBmYWlsZWQiKTsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAicHV0bXNnIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xODY1LDE0ICsxNzkyLDEyIEBACiAgICAgbXNnLmxlbiA9IDA7CiAgICAgbXNnLm1heGxlbiA9IHNpemVvZiAoYnVmKTsKICAgICBpZiAoZ2V0bXNnKGZkLCAmbXNnLCBOVUxMLCAmZmxhZ3MpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImdldG1zZygpIGZhaWxlZCIpOworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJnZXRtc2cgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBpZiAobXNnLmxlbiA8IERMX1BIWVNfQUREUl9BQ0tfU0laRSB8fCBkbHBhYWNrLT5kbF9wcmltaXRpdmUgIT0gRExfUEhZU19BRERSX0FDSykgewotICAgICAgICBKTlVfVGhyb3dCeU5hbWUoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBvYnRhaW4gcGh5cyBhZGRyXG4iKTsKKyAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJDb3VsZG4ndCBvYnRhaW4gcGh5cyBhZGRyXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApAQCAtMTg4MCwxNjUgKzE4MDUsMTY4IEBACiAgICAgcmV0dXJuIGRscGFhY2stPmRsX2FkZHJfbGVuZ3RoOwogfQogCi0vKgotICogR2V0cyB0aGUgSGFyZHdhcmUgYWRkcmVzcyAodXN1YWxseSBNQUMgYWRkcmVzcykgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCi0gKiBPbiByZXR1cm4gcHV0cyB0aGUgZGF0YSBpbiBidWYsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGgsIGluIGJ5dGUsIG9mIHRoZQorLyoqCisgKiBHZXQgdGhlIEhhcmR3YXJlIGFkZHJlc3MgKHVzdWFsbHkgTUFDIGFkZHJlc3MpIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLgorICogcmV0dXJuIHB1dHMgdGhlIGRhdGEgaW4gYnVmLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoLCBpbiBieXRlLCBvZiB0aGUKICAqIE1BQyBhZGRyZXNzLiBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIGhhcmR3YXJlIGFkZHJlc3Mgb24gdGhhdCBpbnRlcmZhY2UuCiAgKi8KLXN0YXRpYyBpbnQgZ2V0TWFjQWRkcmVzcwotICAoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmlmbmFtZSwgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCi0gICB1bnNpZ25lZCBjaGFyICpidWYpCi17Ci0gICAgc3RydWN0IGxpZnJlcSBpZjI7Ci0gICAgaW50IGxlbiwgaSwgc29jazsKK3N0YXRpYyBpbnQgZ2V0TWFjQWRkcmVzcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgIGNvbnN0IHN0cnVjdCBpbl9hZGRyKiBhZGRyLCB1bnNpZ25lZCBjaGFyICpidWYpIHsKKyAgICBzdHJ1Y3QgYXJwcmVxIGFycHJlcTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHNpbjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXBBZGRyOworICAgIGludCBsZW4sIGk7CisgICAgc3RydWN0IGxpZnJlcSBsaWY7CiAKLSAgICBpZiAoKHNvY2sgPSBvcGVuU29ja2V0V2l0aEZhbGxiYWNrKGVudiwgaWZuYW1lKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgLyogRmlyc3QsIHRyeSB0aGUgbmV3IChTMTEpIFNJT0NHTElGSFdBRERSIGlvY3RsKCkuIElmIHRoYXQgZmFpbHMKKyAgICAgKiB0cnkgdGhlIG9sZCB3YXkuCisgICAgICovCisgICAgbWVtc2V0KCZsaWYsIDAsIHNpemVvZihsaWYpKTsKKyAgICBzdHJsY3B5KGxpZi5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGxpZi5saWZyX25hbWUpKTsKIAotICAgIC8vIEZpcnN0LCB0cnkgdGhlIG5ldyAoUzExKSBTSU9DR0xJRkhXQUREUiBpb2N0bCgpLiBJZiB0aGF0IGZhaWxzCi0gICAgLy8gdHJ5IHRoZSBvbGQgd2F5LgotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5saWZyX25hbWUpIC0gMSk7Ci0KLSAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dMSUZIV0FERFIsICZpZjIpICE9IC0xKSB7CisgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGSFdBRERSLCAmbGlmKSAhPSAtMSkgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfZGwgKnNwOwotICAgICAgICBzcCA9IChzdHJ1Y3Qgc29ja2FkZHJfZGwgKikmaWYyLmxpZnJfYWRkcjsKKyAgICAgICAgc3AgPSAoc3RydWN0IHNvY2thZGRyX2RsICopJmxpZi5saWZyX2FkZHI7CiAgICAgICAgIG1lbWNweShidWYsICZzcC0+c2RsX2RhdGFbMF0sIHNwLT5zZGxfYWxlbik7Ci0gICAgICAgIGNsb3NlKHNvY2spOwogICAgICAgICByZXR1cm4gc3AtPnNkbF9hbGVuOwogICAgIH0KIAotICAgIC8vIE9uIFNvbGFyaXMgd2UgaGF2ZSB0byB1c2UgRExQSSwgYnV0IGl0IHdpbGwgb25seSB3b3JrIGlmIHdlIGhhdmUKLSAgICAvLyBwcml2aWxlZ2VkIGFjY2VzcyAoaS5lLiByb290KS4gSWYgdGhhdCBmYWlscywgd2UgdHJ5IGEgbG9va3VwCi0gICAgLy8gaW4gdGhlIEFSUCB0YWJsZSwgd2hpY2ggcmVxdWlyZXMgYW4gSVB2NCBhZGRyZXNzLgotICAgIGlmICgoKGxlbiA9IGdldE1hY0Zyb21EZXZpY2UoZW52LCBpZm5hbWUsIGJ1ZikpID09IDApICYmIChhZGRyICE9IE5VTEwpKSB7Ci0gICAgICAgIHN0cnVjdCBhcnByZXEgYXJwcmVxOwotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGlwQWRkcjsKKyAgIC8qKgorICAgICogT24gU29sYXJpcyB3ZSBoYXZlIHRvIHVzZSBETFBJLCBidXQgaXQgd2lsbCBvbmx5IHdvcmsgaWYgd2UgaGF2ZQorICAgICogcHJpdmlsZWdlZCBhY2Nlc3MgKGkuZS4gcm9vdCkuIElmIHRoYXQgZmFpbHMsIHdlIHRyeSBhIGxvb2t1cAorICAgICogaW4gdGhlIEFSUCB0YWJsZSwgd2hpY2ggcmVxdWlyZXMgYW4gSVB2NCBhZGRyZXNzLgorICAgICovCisgICAgaWYgKChsZW4gPSBnZXRNYWNGcm9tRGV2aWNlKGVudiwgaWZuYW1lLCBidWYpKSAgPT0gMCkgeworICAgICAgICAvKkRMUEkgZmFpbGVkIC0gdHJ5aW5nIHRvIGRvIGFycCBsb29rdXAqLwogCi0gICAgICAgIGxlbiA9IDY7IC8vPz8/CisgICAgICAgIGlmIChhZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogTm8gSVB2NCBhZGRyZXNzIGZvciB0aGF0IGludGVyZmFjZSwgc28gY2FuJ3QgZG8gYW4gQVJQIGxvb2t1cC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KIAotICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmFycHJlcS5hcnBfcGE7Ci0gICAgICAgIG1lbXNldCgoY2hhciAqKSZhcnByZXEsIDAsIHNpemVvZihzdHJ1Y3QgYXJwcmVxKSk7Ci0gICAgICAgIGlwQWRkci5zaW5fcG9ydCA9IDA7Ci0gICAgICAgIGlwQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgbWVtY3B5KCZpcEFkZHIuc2luX2FkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotICAgICAgICBtZW1jcHkoJmFycHJlcS5hcnBfcGEsICZpcEFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKLSAgICAgICAgYXJwcmVxLmFycF9mbGFncz0gQVRGX1BVQkw7CisgICAgICAgICBsZW4gPSA2OyAvLz8/PwogCi0gICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0FSUCwgJmFycHJlcSkgPCAwKSB7Ci0gICAgICAgICAgICBjbG9zZShzb2NrKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmYXJwcmVxLmFycF9wYTsKKyAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmYXJwcmVxLCAwLCBzaXplb2Yoc3RydWN0IGFycHJlcSkpOworICAgICAgICAgaXBBZGRyLnNpbl9wb3J0ID0gMDsKKyAgICAgICAgIGlwQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgIG1lbWNweSgmaXBBZGRyLnNpbl9hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgIG1lbWNweSgmYXJwcmVxLmFycF9wYSwgJmlwQWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgICAgICAgYXJwcmVxLmFycF9mbGFncz0gQVRGX1BVQkw7CiAKLSAgICAgICAgbWVtY3B5KGJ1ZiwgJmFycHJlcS5hcnBfaGEuc2FfZGF0YVswXSwgbGVuKTsKKyAgICAgICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0FSUCwgJmFycHJlcSkgPCAwKSB7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorCisgICAgICAgICBtZW1jcHkoYnVmLCAmYXJwcmVxLmFycF9oYS5zYV9kYXRhWzBdLCBsZW4gKTsKICAgICB9Ci0gICAgY2xvc2Uoc29jayk7CiAKLSAgICAvLyBhbGwgYnl0ZXMgdG8gMCBtZWFucyBubyBoYXJkd2FyZSBhZGRyZXNzCisgICAgLyoKKyAgICAgKiBBbGwgYnl0ZXMgdG8gMCBtZWFucyBubyBoYXJkd2FyZSBhZGRyZXNzLgorICAgICAqLworCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGlmIChidWZbaV0gIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICBpZiAoYnVmW2ldICE9IDApCisgICAgICAgICByZXR1cm4gbGVuOwogICAgIH0KIAogICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBnZXRNVFUoSk5JRW52ICplbnYsIGludCBzb2NrLCBjb25zdCBjaGFyICppZm5hbWUpIHsKK3N0YXRpYyBpbnQgZ2V0TVRVKEpOSUVudiAqZW52LCBpbnQgc29jaywgIGNvbnN0IGNoYXIgKmlmbmFtZSkgewogICAgIHN0cnVjdCBsaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5saWZyX25hbWUpIC0gMSk7CisKKyAgICBtZW1zZXQoKGNoYXIgKikgJmlmMiwgMCwgc2l6ZW9mKGlmMikpOworICAgIHN0cmNweShpZjIubGlmcl9uYW1lLCBpZm5hbWUpOwogCiAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHTElGTVRVLCAoY2hhciAqKSZpZjIpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHTElGTVRVKSBmYWlsZWQiKTsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgU0lPQ0dMSUZNVFUgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gaWYyLmxpZnJfbXR1OworICAgIHJldHVybiAgaWYyLmxpZnJfbXR1OwogfQogCisKIHN0YXRpYyBpbnQgZ2V0RmxhZ3MoaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50ICpmbGFncykgewotICAgIHN0cnVjdCBsaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5saWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5saWZyX25hbWUpIC0gMSk7CisgICAgIHN0cnVjdCAgIGxpZnJlcSBsaWZyOworICAgICBtZW1zZXQoKGNhZGRyX3QpJmxpZnIsIDAsIHNpemVvZihsaWZyKSk7CisgICAgIHN0cmNweSgoY2FkZHJfdCkmKGxpZnIubGlmcl9uYW1lKSwgaWZuYW1lKTsKIAotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0xJRkZMQUdTLCAoY2hhciAqKSZpZjIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dMSUZGTEFHUywgKGNoYXIgKikmbGlmcikgPCAwKSB7CisgICAgICAgICByZXR1cm4gLTE7CisgICAgIH0KIAotICAgICpmbGFncyA9IGlmMi5saWZyX2ZsYWdzOwotICAgIHJldHVybiAwOworICAgICAqZmxhZ3MgPSBsaWZyLmxpZnJfZmxhZ3M7CisgICAgIHJldHVybiAwOwogfQogCi0jZW5kaWYgLyogX19zb2xhcmlzX18gKi8KKworI2VuZGlmCisKIAogLyoqIEJTRCAqKi8KLSNpZiBkZWZpbmVkKF9BTExCU0RfU09VUkNFKQotCi0jaWYgZGVmaW5lZChBRl9JTkVUNikKLS8qCi0gKiBPcGVucyBhIHNvY2tldCBmb3IgZnVydGhlciBpb2N0bCBjYWxscy4gVHJpZXMgQUZfSU5FVCBzb2NrZXQgZmlyc3QgYW5kCi0gKiBpZiBpdCBmYWlscyByZXR1cm4gQUZfSU5FVDYgc29ja2V0LgorI2lmZGVmIF9BTExCU0RfU09VUkNFCisvKiBPcGVuIHNvY2tldCBmb3IgZnVydGhlciBpb2N0IGNhbGxzLCB0cnkgdjQgc29ja2V0IGZpcnN0IGFuZAorICogaWYgaXQgZmFsbHMgcmV0dXJuIHY2IHNvY2tldAogICovCi1zdGF0aWMgaW50IG9wZW5Tb2NrZXRXaXRoRmFsbGJhY2soSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmlmbmFtZSkgeworCisjaWZkZWYgQUZfSU5FVDYKK3N0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKXsKICAgICBpbnQgc29jazsKKyAgICBzdHJ1Y3QgaWZyZXEgaWYyOwogCi0gICAgaWYgKChzb2NrID0gSlZNX1NvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQpIHsKLSAgICAgICAgICAgIGlmICgoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKLSAgICAgICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAgICAgICAgIChlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSVBWNiBTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBlcnJubyBpcyBub3QgTk9TVVBQT1JUCi0gICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJUFY0IFNvY2tldCBjcmVhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KKyAgICAgaWYgKChzb2NrID0gSlZNX1NvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CisgICAgICAgICBpZiAoZXJybm8gPT0gRVBST1RPTk9TVVBQT1JUKXsKKyAgICAgICAgICAgICAgaWYgKCAoc29jayA9IEpWTV9Tb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDAgKXsKKyAgICAgICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgIklQVjYgU29ja2V0IGNyZWF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2V7IC8vIGVycm5vIGlzIG5vdCBOT1NVUFBPUlQKKyAgICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiAsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSVBWNCBTb2NrZXQgY3JlYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgfQorICAgfQogCi0gICAgcmV0dXJuIHNvY2s7CisgICByZXR1cm4gc29jazsKIH0KKwogI2Vsc2UKLXN0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKSB7Ci0gICAgcmV0dXJuIG9wZW5Tb2NrZXQoZW52LCBBRl9JTkVUKTsKK3N0YXRpYyBpbnQgb3BlblNvY2tldFdpdGhGYWxsYmFjayhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lKXsKKyAgICByZXR1cm4gb3BlblNvY2tldChlbnYsQUZfSU5FVCk7CiB9CiAjZW5kaWYKIAogLyoKLSAqIEVudW1lcmF0ZXMgYW5kIHJldHVybnMgYWxsIElQdjQgaW50ZXJmYWNlcyBvbiBCU0QuCisgKiBFbnVtZXJhdGVzIGFuZCByZXR1cm5zIGFsbCBJUHY0IGludGVyZmFjZXMKICAqLwogc3RhdGljIG5ldGlmICplbnVtSVB2NEludGVyZmFjZXMoSk5JRW52ICplbnYsIGludCBzb2NrLCBuZXRpZiAqaWZzKSB7CiAgICAgc3RydWN0IGlmYWRkcnMgKmlmYSwgKm9yaWdpZmE7CiAKICAgICBpZiAoZ2V0aWZhZGRycygmb3JpZ2lmYSkgIT0gMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImdldGlmYWRkcnMoKSBmYWlsZWQiKTsKKyAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0aWZhZGRycygpIGZ1bmN0aW9uIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gaWZzOwogICAgIH0KIAogICAgIGZvciAoaWZhID0gb3JpZ2lmYTsgaWZhICE9IE5VTEw7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyICpicm9hZGFkZHJQID0gTlVMTDsKIAotICAgICAgICAvLyBpZ25vcmUgbm9uIElQdjQgYWRkcmVzc2VzCisgICAgICAgIC8qCisgICAgICAgICAqIFNraXAgbm9uLUFGX0lORVQgZW50cmllcy4KKyAgICAgICAgICovCiAgICAgICAgIGlmIChpZmEtPmlmYV9hZGRyID09IE5VTEwgfHwgaWZhLT5pZmFfYWRkci0+c2FfZmFtaWx5ICE9IEFGX0lORVQpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAvLyBzZXQgaWZhX2Jyb2FkYWRkciwgaWYgdGhlcmUgaXMgb25lCi0gICAgICAgIGlmICgoaWZhLT5pZmFfZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpID09IDAgJiYKLSAgICAgICAgICAgIGlmYS0+aWZhX2ZsYWdzICYgSUZGX0JST0FEQ0FTVCkgewotICAgICAgICAgICAgYnJvYWRhZGRyUCA9IGlmYS0+aWZhX2RzdGFkZHI7Ci0gICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkIHRvIHRoZSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLCBpZmEtPmlmYV9uYW1lLCBpZnMsIGlmYS0+aWZhX2FkZHIsIEFGX0lORVQsIDApOwogCi0gICAgICAgIC8vIGFkZCBpbnRlcmZhY2UgdG8gdGhlIGxpc3QKLSAgICAgICAgaWZzID0gYWRkaWYoZW52LCBzb2NrLCBpZmEtPmlmYV9uYW1lLCBpZnMsIGlmYS0+aWZhX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgIGJyb2FkYWRkclAsIEFGX0lORVQsCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUlQdjRBZGRyZXNzVG9QcmVmaXgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYS0+aWZhX25ldG1hc2spKTsKLQotICAgICAgICAvLyBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQgdGhlbiBmcmVlIHRoZSBsaXN0CisgICAgICAgIC8qCisgICAgICAgICAqIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB0aGVuIGZyZWUgdGhlIGxpc3QuCisgICAgICAgICAqLwogICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7CiAgICAgICAgICAgICBmcmVlaWZhZGRycyhvcmlnaWZhKTsKICAgICAgICAgICAgIGZyZWVpZihpZnMpOwpAQCAtMjA0Niw0MSArMTk3NCw4NSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gZnJlZSBpZmFkZHJzIGJ1ZmZlcgorICAgIC8qCisgICAgICogRnJlZSBzb2NrZXQgYW5kIGJ1ZmZlcgorICAgICAqLwogICAgIGZyZWVpZmFkZHJzKG9yaWdpZmEpOwogICAgIHJldHVybiBpZnM7CiB9CiAKLSNpZiBkZWZpbmVkKEFGX0lORVQ2KQogCiAvKgotICogRW51bWVyYXRlcyBhbmQgcmV0dXJucyBhbGwgSVB2NiBpbnRlcmZhY2VzIG9uIEJTRC4KKyAqIEVudW1lcmF0ZXMgYW5kIHJldHVybnMgYWxsIElQdjYgaW50ZXJmYWNlcyBvbiBMaW51eAorICovCisKKyNpZmRlZiBBRl9JTkVUNgorLyoKKyAqIERldGVybWluZXMgdGhlIHByZWZpeCBvbiBCU0QgZm9yIElQdjYgaW50ZXJmYWNlcy4KKyAqLworc3RhdGljCitpbnQgcHJlZml4KHZvaWQgKnZhbCwgaW50IHNpemUpIHsKKyAgICB1X2NoYXIgKm5hbWUgPSAodV9jaGFyICopdmFsOworICAgIGludCBieXRlLCBiaXQsIHBsZW4gPSAwOworCisgICAgZm9yIChieXRlID0gMDsgYnl0ZSA8IHNpemU7IGJ5dGUrKywgcGxlbiArPSA4KQorICAgICAgICBpZiAobmFtZVtieXRlXSAhPSAweGZmKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGJ5dGUgPT0gc2l6ZSkKKyAgICAgICAgcmV0dXJuIChwbGVuKTsKKyAgICBmb3IgKGJpdCA9IDc7IGJpdCAhPSAwOyBiaXQtLSwgcGxlbisrKQorICAgICAgICBpZiAoIShuYW1lW2J5dGVdICYgKDEgPDwgYml0KSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBmb3IgKDsgYml0ICE9IDA7IGJpdC0tKQorICAgICAgICBpZiAobmFtZVtieXRlXSAmICgxIDw8IGJpdCkpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgIGJ5dGUrKzsKKyAgICBmb3IgKDsgYnl0ZSA8IHNpemU7IGJ5dGUrKykKKyAgICAgICAgaWYgKG5hbWVbYnl0ZV0pCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgIHJldHVybiAocGxlbik7Cit9CisKKy8qCisgKiBFbnVtZXJhdGVzIGFuZCByZXR1cm5zIGFsbCBJUHY2IGludGVyZmFjZXMgb24gQlNECiAgKi8KIHN0YXRpYyBuZXRpZiAqZW51bUlQdjZJbnRlcmZhY2VzKEpOSUVudiAqZW52LCBpbnQgc29jaywgbmV0aWYgKmlmcykgewogICAgIHN0cnVjdCBpZmFkZHJzICppZmEsICpvcmlnaWZhOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisgICAgc3RydWN0IGluNl9pZnJlcSBpZnI2OwogCiAgICAgaWYgKGdldGlmYWRkcnMoJm9yaWdpZmEpICE9IDApIHsKLSAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcgotICAgICAgICAgICAgKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJnZXRpZmFkZHJzKCkgZmFpbGVkIik7CisgICAgICAgIE5FVF9UaHJvd0J5TmFtZVdpdGhMYXN0RXJyb3IoZW52ICwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdldGlmYWRkcnMoKSBmdW5jdGlvbiBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIGlmczsKICAgICB9CiAKICAgICBmb3IgKGlmYSA9IG9yaWdpZmE7IGlmYSAhPSBOVUxMOyBpZmEgPSBpZmEtPmlmYV9uZXh0KSB7Ci0gICAgICAgIC8vIGlnbm9yZSBub24gSVB2NiBhZGRyZXNzZXMKKworICAgICAgICAvKgorICAgICAgICAgKiBTa2lwIG5vbi1BRl9JTkVUNiBlbnRyaWVzLgorICAgICAgICAgKi8KICAgICAgICAgaWYgKGlmYS0+aWZhX2FkZHIgPT0gTlVMTCB8fCBpZmEtPmlmYV9hZGRyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVDYpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAvLyBzZXQgc2NvcGUgSUQgdG8gaW50ZXJmYWNlIGluZGV4Ci0gICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKWlmYS0+aWZhX2FkZHIpLT5zaW42X3Njb3BlX2lkID0KLSAgICAgICAgICAgIGdldEluZGV4KHNvY2ssIGlmYS0+aWZhX25hbWUpOworICAgICAgICBtZW1zZXQoJmlmcjYsIDAsIHNpemVvZihpZnI2KSk7CisgICAgICAgIHN0cmxjcHkoaWZyNi5pZnJfbmFtZSwgaWZhLT5pZmFfbmFtZSwgc2l6ZW9mKGlmcjYuaWZyX25hbWUpKTsKKyAgICAgICAgbWVtY3B5KCZpZnI2Lmlmcl9hZGRyLCBpZmEtPmlmYV9hZGRyLCBNSU4oc2l6ZW9mKGlmcjYuaWZyX2FkZHIpLCBpZmEtPmlmYV9hZGRyLT5zYV9sZW4pKTsKIAotICAgICAgICAvLyBhZGQgaW50ZXJmYWNlIHRvIHRoZSBsaXN0Ci0gICAgICAgIGlmcyA9IGFkZGlmKGVudiwgc29jaywgaWZhLT5pZmFfbmFtZSwgaWZzLCBpZmEtPmlmYV9hZGRyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICBBRl9JTkVUNiwKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlSVB2NkFkZHJlc3NUb1ByZWZpeCgoc3RydWN0IHNvY2thZGRyX2luNiAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYS0+aWZhX25ldG1hc2spKTsKKyAgICAgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLX0lONiwgKGNhZGRyX3QpJmlmcjYpIDwgMCkgeworICAgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYgLCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlvY3RsIFNJT0NHSUZORVRNQVNLX0lONiBmYWlsZWQiKTsKKyAgICAgICAgICAgIGZyZWVpZmFkZHJzKG9yaWdpZmEpOworICAgICAgICAgICAgZnJlZWlmKGlmcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB0aGVuIGZyZWUgdGhlIGxpc3QKKyAgICAgICAgLyogQWRkIHRvIHRoZSBsaXN0LiAgKi8KKyAgICAgICAgc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmlmcjYuaWZyX2FkZHI7CisgICAgICAgIGlmcyA9IGFkZGlmKGVudiwgc29jaywgaWZhLT5pZmFfbmFtZSwgaWZzLCBpZmEtPmlmYV9hZGRyLCBBRl9JTkVUNiwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4KCZzaW42LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSk7CisKKyAgICAgICAgLyogSWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHRoZW4gZnJlZSB0aGUgbGlzdC4gICovCiAgICAgICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudikpIHsKICAgICAgICAgICAgIGZyZWVpZmFkZHJzKG9yaWdpZmEpOwogICAgICAgICAgICAgZnJlZWlmKGlmcyk7CkBAIC0yMDg4LDU1ICsyMDYwLDExNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gZnJlZSBpZmFkZHJzIGJ1ZmZlcgorICAgIC8qCisgICAgICogRnJlZSBzb2NrZXQgYW5kIGlmYWRkcnMgYnVmZmVyCisgICAgICovCiAgICAgZnJlZWlmYWRkcnMob3JpZ2lmYSk7CiAgICAgcmV0dXJuIGlmczsKIH0KKyNlbmRpZgogCi0jZW5kaWYgLyogQUZfSU5FVDYgKi8KLQotLyoKLSAqIFRyeSB0byBnZXQgdGhlIGludGVyZmFjZSBpbmRleC4KLSAqLwotc3RhdGljIGludCBnZXRJbmRleChpbnQgc29jaywgY29uc3QgY2hhciAqbmFtZSkgewotI2lmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgIGludCBpbmRleCA9IGlmX25hbWV0b2luZGV4KG5hbWUpOwotICAgIHJldHVybiAoaW5kZXggPT0gMCkgPyAtMSA6IGluZGV4OwotI2Vsc2UKK3N0YXRpYyBpbnQgZ2V0SW5kZXgoaW50IHNvY2ssIGNvbnN0IGNoYXIgKm5hbWUpeworI2lmZGVmIF9fRnJlZUJTRF9fCisgICAgIC8qCisgICAgICAqIFRyeSB0byBnZXQgdGhlIGludGVyZmFjZSBpbmRleAorICAgICAgKiAoTm90IHN1cHBvcnRlZCBvbiBTb2xhcmlzIDIuNiBvciA3KQorICAgICAgKi8KICAgICBzdHJ1Y3QgaWZyZXEgaWYyOwotICAgIG1lbXNldCgoY2hhciAqKSZpZjIsIDAsIHNpemVvZihpZjIpKTsKLSAgICBzdHJuY3B5KGlmMi5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmMi5pZnJfbmFtZSkgLSAxKTsKKyAgICBzdHJjcHkoaWYyLmlmcl9uYW1lLCBuYW1lKTsKIAogICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGSU5ERVgsIChjaGFyICopJmlmMikgPCAwKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICByZXR1cm4gaWYyLmlmcl9pbmRleDsKKyNlbHNlCisgICAgLyoKKyAgICAgKiBUcnkgdG8gZ2V0IHRoZSBpbnRlcmZhY2UgaW5kZXggdXNpbmcgQlNEIHNwZWNpZmljIGlmX25hbWV0b2luZGV4CisgICAgICovCisgICAgaW50IGluZGV4ID0gaWZfbmFtZXRvaW5kZXgobmFtZSk7CisgICAgcmV0dXJuIChpbmRleCA9PSAwKSA/IC0xIDogaW5kZXg7CiAjZW5kaWYKIH0KIAotLyoKLSAqIEdldHMgdGhlIEhhcmR3YXJlIGFkZHJlc3MgKHVzdWFsbHkgTUFDIGFkZHJlc3MpIGZvciB0aGUgbmFtZWQgaW50ZXJmYWNlLgotICogT24gcmV0dXJuIHB1dHMgdGhlIGRhdGEgaW4gYnVmLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoLCBpbiBieXRlLCBvZiB0aGUKKy8qKgorICogUmV0dXJucyB0aGUgSVB2NCBicm9hZGNhc3QgYWRkcmVzcyBvZiBhIG5hbWVkIGludGVyZmFjZSwgaWYgaXQgZXhpc3RzLgorICogUmV0dXJucyAwIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc29ja2FkZHIgKmdldEJyb2FkY2FzdChKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgc3RydWN0IHNvY2thZGRyICpicmRjYXN0X3N0b3JlKSB7CisgIHN0cnVjdCBzb2NrYWRkciAqcmV0ID0gTlVMTDsKKyAgc3RydWN0IGlmcmVxIGlmMjsKKworICBtZW1zZXQoKGNoYXIgKikgJmlmMiwgMCwgc2l6ZW9mKGlmMikpOworICBzdHJjcHkoaWYyLmlmcl9uYW1lLCBpZm5hbWUpOworCisgIC8qIExldCdzIG1ha2Ugc3VyZSB0aGUgaW50ZXJmYWNlIGRvZXMgaGF2ZSBhIGJyb2FkY2FzdCBhZGRyZXNzICovCisgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJT0NUTCBTSU9DR0lGRkxBR1MgZmFpbGVkIik7CisgICAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKGlmMi5pZnJfZmxhZ3MgJiBJRkZfQlJPQURDQVNUKSB7CisgICAgICAvKiBJdCBkb2VzLCBsZXQncyByZXRyaWV2ZSBpdCovCisgICAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkJSREFERFIsIChjaGFyICopJmlmMikgPCAwKSB7CisgICAgICAgICAgTkVUX1Rocm93QnlOYW1lV2l0aExhc3RFcnJvcihlbnYsIEpOVV9KQVZBTkVUUEtHICJTb2NrZXRFeGNlcHRpb24iLCAiSU9DVEwgU0lPQ0dJRkJSREFERFIgZmFpbGVkIik7CisgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKworICAgICAgcmV0ID0gYnJkY2FzdF9zdG9yZTsKKyAgICAgIG1lbWNweShyZXQsICZpZjIuaWZyX2Jyb2FkYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBJUHY0IHN1Ym5ldCBwcmVmaXggbGVuZ3RoIChha2Egc3VibmV0IG1hc2spIGZvciB0aGUgbmFtZWQKKyAqIGludGVyZmFjZSwgaWYgaXQgaGFzIG9uZSwgb3RoZXJ3aXNlIHJldHVybiAtMS4KKyAqLworc3RhdGljIHNob3J0IGdldFN1Ym5ldChKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSkgeworICAgIHVuc2lnbmVkIGludCBtYXNrOworICAgIHNob3J0IHJldDsKKyAgICBzdHJ1Y3QgaWZyZXEgaWYyOworCisgICAgbWVtc2V0KChjaGFyICopICZpZjIsIDAsIHNpemVvZihpZjIpKTsKKyAgICBzdHJjcHkoaWYyLmlmcl9uYW1lLCBpZm5hbWUpOworCisgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZORVRNQVNLLCAoY2hhciAqKSZpZjIpIDwgMCkgeworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJT0NUTCBTSU9DR0lGTkVUTUFTSyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1hc2sgPSBudG9obCgoKHN0cnVjdCBzb2NrYWRkcl9pbiopJihpZjIuaWZyX2FkZHIpKS0+c2luX2FkZHIuc19hZGRyKTsKKyAgICByZXQgPSAwOworICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgbWFzayA8PD0gMTsKKyAgICAgICByZXQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIEdldCB0aGUgSGFyZHdhcmUgYWRkcmVzcyAodXN1YWxseSBNQUMgYWRkcmVzcykgZm9yIHRoZSBuYW1lZCBpbnRlcmZhY2UuCisgKiByZXR1cm4gcHV0cyB0aGUgZGF0YSBpbiBidWYsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGgsIGluIGJ5dGUsIG9mIHRoZQogICogTUFDIGFkZHJlc3MuIFJldHVybnMgLTEgaWYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgYWRkcmVzcyBvbiB0aGF0IGludGVyZmFjZS4KICAqLwotc3RhdGljIGludCBnZXRNYWNBZGRyZXNzCi0gIChKTklFbnYgKmVudiwgY29uc3QgY2hhciAqaWZuYW1lLCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKK3N0YXRpYyBpbnQgZ2V0TWFjQWRkcmVzcyhKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIqIGlmbmFtZSwgY29uc3Qgc3RydWN0IGluX2FkZHIqIGFkZHIsIHVuc2lnbmVkIGNoYXIgKmJ1ZikgewogICAgIHN0cnVjdCBpZmFkZHJzICppZmEwLCAqaWZhOwogICAgIHN0cnVjdCBzb2NrYWRkciAqc2FkZHI7CiAgICAgaW50IGk7CiAKLSAgICAvLyBncmFiIHRoZSBpbnRlcmZhY2UgbGlzdAorICAgIC8qIEdyYWIgdGhlIGludGVyZmFjZSBsaXN0ICovCiAgICAgaWYgKCFnZXRpZmFkZHJzKCZpZmEwKSkgewotICAgICAgICAvLyBjeWNsZSB0aHJvdWdoIHRoZSBpbnRlcmZhY2VzCisgICAgICAgIC8qIEN5Y2xlIHRocm91Z2ggdGhlIGludGVyZmFjZXMgKi8KICAgICAgICAgZm9yIChpID0gMCwgaWZhID0gaWZhMDsgaWZhICE9IE5VTEw7IGlmYSA9IGlmYS0+aWZhX25leHQsIGkrKykgewogICAgICAgICAgICAgc2FkZHIgPSBpZmEtPmlmYV9hZGRyOwotICAgICAgICAgICAgLy8gbGluayBsYXllciBjb250YWlucyB0aGUgTUFDIGFkZHJlc3MKKyAgICAgICAgICAgIC8qIExpbmsgbGF5ZXIgY29udGFpbnMgdGhlIE1BQyBhZGRyZXNzICovCiAgICAgICAgICAgICBpZiAoc2FkZHItPnNhX2ZhbWlseSA9PSBBRl9MSU5LICYmICFzdHJjbXAoaWZuYW1lLCBpZmEtPmlmYV9uYW1lKSkgewogICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9kbCAqc2FkbCA9IChzdHJ1Y3Qgc29ja2FkZHJfZGwgKikgc2FkZHI7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGFkZHJlc3MgaGFzIHRoZSBjb3JyZWN0IGxlbmd0aAorICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoZSBhZGRyZXNzIGlzIHRoZSBjb3JyZWN0IGxlbmd0aCAqLwogICAgICAgICAgICAgICAgIGlmIChzYWRsLT5zZGxfYWxlbiA9PSBFVEhFUl9BRERSX0xFTikgewogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCAoc2FkbC0+c2RsX2RhdGEgKyBzYWRsLT5zZGxfbmxlbiksIEVUSEVSX0FERFJfTEVOKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZWlmYWRkcnMoaWZhMCk7CkBAIC0yMTUwLDM0ICsyMTgxLDM3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGdldE1UVShKTklFbnYgKmVudiwgaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSkgeworc3RhdGljIGludCBnZXRNVFUoSk5JRW52ICplbnYsIGludCBzb2NrLCAgY29uc3QgY2hhciAqaWZuYW1lKSB7CiAgICAgc3RydWN0IGlmcmVxIGlmMjsKLSAgICBtZW1zZXQoKGNoYXIgKikmaWYyLCAwLCBzaXplb2YoaWYyKSk7Ci0gICAgc3RybmNweShpZjIuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmMi5pZnJfbmFtZSkgLSAxKTsKKworICAgIG1lbXNldCgoY2hhciAqKSAmaWYyLCAwLCBzaXplb2YoaWYyKSk7CisgICAgc3RyY3B5KGlmMi5pZnJfbmFtZSwgaWZuYW1lKTsKIAogICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGTVRVLCAoY2hhciAqKSZpZjIpIDwgMCkgewotICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yCi0gICAgICAgICAgICAoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwgImlvY3RsKFNJT0NHSUZNVFUpIGZhaWxlZCIpOworICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJJT0NUTCBTSU9DR0lGTVRVIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIGlmMi5pZnJfbXR1OworICAgIHJldHVybiAgaWYyLmlmcl9tdHU7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0RmxhZ3MoaW50IHNvY2ssIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50ICpmbGFncykgewotICAgIHN0cnVjdCBpZnJlcSBpZjI7Ci0gICAgbWVtc2V0KChjaGFyICopJmlmMiwgMCwgc2l6ZW9mKGlmMikpOwotICAgIHN0cm5jcHkoaWYyLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZjIuaWZyX25hbWUpIC0gMSk7CisgIHN0cnVjdCBpZnJlcSBpZjI7CisgIGludCByZXQgPSAtMTsKIAotICAgIGlmIChpb2N0bChzb2NrLCBTSU9DR0lGRkxBR1MsIChjaGFyICopJmlmMikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgIG1lbXNldCgoY2hhciAqKSAmaWYyLCAwLCBzaXplb2YoaWYyKSk7CisgIHN0cmNweShpZjIuaWZyX25hbWUsIGlmbmFtZSk7CiAKLSAgICBpZiAoc2l6ZW9mKGlmMi5pZnJfZmxhZ3MpID09IHNpemVvZihzaG9ydCkpIHsKLSAgICAgICAgKmZsYWdzID0gKGlmMi5pZnJfZmxhZ3MgJiAweGZmZmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpmbGFncyA9IGlmMi5pZnJfZmxhZ3M7Ci0gICAgfQotICAgIHJldHVybiAwOworICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZjIpIDwgMCl7CisgICAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoc2l6ZW9mKGlmMi5pZnJfZmxhZ3MpID09IHNpemVvZihzaG9ydCkpIHsKKyAgICAqZmxhZ3MgPSAoaWYyLmlmcl9mbGFncyAmIDB4ZmZmZik7CisgIH0gZWxzZSB7CisgICAgKmZsYWdzID0gaWYyLmlmcl9mbGFnczsKKyAgfQorICByZXR1cm4gMDsKIH0KLSNlbmRpZiAvKiBfQUxMQlNEX1NPVVJDRSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYwppbmRleCBjNDhkMTE1Li43Nzg5OWQ2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9QbGFpbkRhdGFncmFtU29ja2V0SW1wbC5jCkBAIC0xNzQsOCArMTc0LDkgQEAKICAgICBJT19mZF9mZElEID0gTkVUX0dldEZpbGVEZXNjcmlwdG9ySUQoZW52KTsKICAgICBDSEVDS19OVUxMKElPX2ZkX2ZkSUQpOwogCi0gICAgaW5pdEluZXRBZGRyZXNzSURzKGVudik7Ci0gICAgSk5VX0NIRUNLX0VYQ0VQVElPTihlbnYpOworICAgIEphdmFfamF2YV9uZXRfSW5ldEFkZHJlc3NfaW5pdChlbnYsIDApOworICAgIEphdmFfamF2YV9uZXRfSW5ldDRBZGRyZXNzX2luaXQoZW52LCAwKTsKKyAgICBKYXZhX2phdmFfbmV0X0luZXQ2QWRkcmVzc19pbml0KGVudiwgMCk7CiAgICAgSmF2YV9qYXZhX25ldF9OZXR3b3JrSW50ZXJmYWNlX2luaXQoZW52LCAwKTsKIAogfQpAQCAtOTkxLDI0ICs5OTIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJnLCBzaXplb2YoYXJnKSkgPCAwKSB7CiAgICAgICAgIGdldEVycm9yU3RyaW5nKGVycm5vLCB0bXBidWYsIHNpemVvZih0bXBidWYpKTsKICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsIHRtcGJ1Zik7Ci0gICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoSlZNX1NldFNvY2tPcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJnLCBzaXplb2YoYXJnKSkgPCAwKSB7CiAgICAgICAgIGdldEVycm9yU3RyaW5nKGVycm5vLCB0bXBidWYsIHNpemVvZih0bXBidWYpKTsKICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsIHRtcGJ1Zik7Ci0gICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIAotICAgIGlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CUk9BRENBU1QsIChjaGFyKikgJnQsIHNpemVvZiAoaW50KSkgPCAwKSB7Ci0gICAgICAgIGdldEVycm9yU3RyaW5nKGVycm5vLCB0bXBidWYsIHNpemVvZih0bXBidWYpKTsKLSAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsIHRtcGJ1Zik7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAoY2hhciopICZ0LCBzaXplb2YoaW50KSk7CiAKICNpZiBkZWZpbmVkKF9fbGludXhfXykKICAgICBhcmcgPSAwOwpAQCAtMTAzMCwxMyArMTAyNCw4IEBACiAgICAgICovCiAgICAgaWYgKGRvbWFpbiA9PSBBRl9JTkVUNikgewogICAgICAgICBpbnQgdHRsID0gMTsKLSAgICAgICAgaWYgKHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9NVUxUSUNBU1RfSE9QUywgKGNoYXIgKikgJnR0bCwKLSAgICAgICAgICAgICAgICBzaXplb2YgKHR0bCkpIDwgMCkgewotICAgICAgICAgICAgZ2V0RXJyb3JTdHJpbmcoZXJybm8sIHRtcGJ1Ziwgc2l6ZW9mKHRtcGJ1ZikpOwotICAgICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsIHRtcGJ1Zik7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19JUFY2LCBJUFY2X01VTFRJQ0FTVF9IT1BTLCAoY2hhciAqKSZ0dGwsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHR0bCkpOwogICAgIH0KICNlbmRpZiAvKiBfX2xpbnV4X18gKi8KIApAQCAtMjE5Myw3ICsyMTgyLDcgQEAKICAgICAgICAgICAgIGNhZGRyWzE0XSA9ICgoYWRkcmVzcyA+PiA4KSAmIDB4ZmYpOwogICAgICAgICAgICAgY2FkZHJbMTVdID0gKGFkZHJlc3MgJiAweGZmKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldEluZXQ2QWRkcmVzc19pcGFkZHJlc3MoZW52LCBpYU9iaiwgKGNoYXIgKikgY2FkZHIpOworICAgICAgICAgICAgZ2V0SW5ldDZBZGRyZXNzX2lwYWRkcmVzcyhlbnYsIGlhT2JqLCBjYWRkcik7CiAgICAgICAgIH0KIAogICAgICAgICBtZW1jcHkoKHZvaWQgKikmKG1uYW1lNi5pcHY2bXJfbXVsdGlhZGRyKSwgY2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5Tb2NrZXRJbXBsLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L1BsYWluU29ja2V0SW1wbC5jCmluZGV4IDcxY2JkZjguLjcyNGMxY2YgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5Tb2NrZXRJbXBsLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9QbGFpblNvY2tldEltcGwuYwpAQCAtMTYyLDkgKzE2Miw2IEBACiAgICAgSU9fZmRfZmRJRCA9IE5FVF9HZXRGaWxlRGVzY3JpcHRvcklEKGVudik7CiAgICAgQ0hFQ0tfTlVMTChJT19mZF9mZElEKTsKIAotICAgIGluaXRJbmV0QWRkcmVzc0lEcyhlbnYpOwotICAgIEpOVV9DSEVDS19FWENFUFRJT04oZW52KTsKLQogICAgIC8qIENyZWF0ZSB0aGUgbWFya2VyIGZkIHVzZWQgZm9yIGR1cDIgKi8KICAgICBtYXJrZXJfZmQgPSBnZXRNYXJrZXJGRCgpOwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L2F3dF9Sb2JvdC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L2F3dF9Sb2JvdC5jCmluZGV4IGI4ZjFiNzUuLjg5ZjI4MmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9hd3RfUm9ib3QuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvYXd0X1JvYm90LmMKQEAgLTYxLDkgKzYxLDkgQEAKIAogICAgIC8qIGNoZWNrIGlmIFhUZXN0IGlzIGF2YWlsYWJsZSAqLwogICAgIGlzWFRlc3RBdmFpbGFibGUgPSBYUXVlcnlFeHRlbnNpb24oYXd0X2Rpc3BsYXksIFhUZXN0RXh0ZW5zaW9uTmFtZSwgJm1ham9yX29wY29kZSwgJmZpcnN0X2V2ZW50LCAmZmlyc3RfZXJyb3IpOworICAgIERUUkFDRV9QUklOVExOMygiUm9ib3RQZWVyOiBYUXVlcnlFeHRlbnNpb24oWFRFU1QpIHJldHVybnMgbWFqb3Jfb3Bjb2RlID0gJWQsIGZpcnN0X2V2ZW50ID0gJWQsIGZpcnN0X2Vycm9yID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBtYWpvcl9vcGNvZGUsIGZpcnN0X2V2ZW50LCBmaXJzdF9lcnJvcik7CiAgICAgaWYgKGlzWFRlc3RBdmFpbGFibGUpIHsKLSAgICAgICAgRFRSQUNFX1BSSU5UTE4zKCJSb2JvdFBlZXI6IFhRdWVyeUV4dGVuc2lvbihYVEVTVCkgcmV0dXJucyBtYWpvcl9vcGNvZGUgPSAlZCwgZmlyc3RfZXZlbnQgPSAlZCwgZmlyc3RfZXJyb3IgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWpvcl9vcGNvZGUsIGZpcnN0X2V2ZW50LCBmaXJzdF9lcnJvcik7CiAgICAgICAgIC8qIGNoZWNrIGlmIFhUZXN0IHZlcnNpb24gaXMgT0sgKi8KICAgICAgICAgWFRlc3RRdWVyeUV4dGVuc2lvbihhd3RfZGlzcGxheSwgJmV2ZW50X2Jhc2VwLCAmZXJyb3JfYmFzZXAsICZtYWpvcnAsICZtaW5vcnApOwogICAgICAgICBEVFJBQ0VfUFJJTlRMTjQoIlJvYm90UGVlcjogWFRlc3RRdWVyeUV4dGVuc2lvbiByZXR1cm5zIGV2ZW50X2Jhc2VwID0gJWQsIGVycm9yX2Jhc2VwID0gJWQsIG1ham9ycCA9ICVkLCBtaW5vcnAgPSAlZCIsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvZm9udHBhdGguYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9mb250cGF0aC5jCmluZGV4IDRlYmYzODEuLjNkMWQwMjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9mb250cGF0aC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9mb250cGF0aC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtODA0LDM2ICs4MDQsMzAgQEAKICAgICBwYXR0ZXJuID0gKCpGY1BhdHRlcm5CdWlsZCkoTlVMTCwgRkNfT1VUTElORSwgRmNUeXBlQm9vbCwgRmNUcnVlLCBOVUxMKTsKICAgICBvYmpzZXQgPSAoKkZjT2JqZWN0U2V0QnVpbGQpKEZDX0ZJTEUsIE5VTEwpOwogICAgIGZvbnRTZXQgPSAoKkZjRm9udExpc3QpKE5VTEwsIHBhdHRlcm4sIG9ianNldCk7Ci0gICAgaWYgKGZvbnRTZXQgPT0gTlVMTCkgewotICAgICAgICAvKiBGY0ZvbnRMaXN0KCkgbWF5IHJldHVybiBOVUxMIGlmIGZvbnRzIGFyZSBub3QgaW5zdGFsbGVkLiAqLwotICAgICAgICBmb250ZGlycyA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9udGRpcnMgPSAoY2hhcioqKWNhbGxvYyhmb250U2V0LT5uZm9udCsxLCBzaXplb2YoY2hhciopKTsKLSAgICAgICAgZm9yIChmPTA7IGYgPCBmb250U2V0LT5uZm9udDsgZisrKSB7Ci0gICAgICAgICAgICBGY0NoYXI4ICpmaWxlOwotICAgICAgICAgICAgRmNDaGFyOCAqZGlyOwotICAgICAgICAgICAgaWYgKCgqRmNQYXR0ZXJuR2V0U3RyaW5nKShmb250U2V0LT5mb250c1tmXSwgRkNfRklMRSwgMCwgJmZpbGUpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZjUmVzdWx0TWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBkaXIgPSAoKkZjU3RyRGlybmFtZSkoZmlsZSk7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8bnVtZGlyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZm9udGRpcnNbaV0sIChjaGFyKilkaXIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9udGRpcnNbbnVtZGlycysrXSA9IChjaGFyKilkaXI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZSgoY2hhciopZGlyKTsKKyAgICBmb250ZGlycyA9IChjaGFyKiopY2FsbG9jKGZvbnRTZXQtPm5mb250KzEsIHNpemVvZihjaGFyKikpOworICAgIGZvciAoZj0wOyBmIDwgZm9udFNldC0+bmZvbnQ7IGYrKykgeworICAgICAgICBGY0NoYXI4ICpmaWxlOworICAgICAgICBGY0NoYXI4ICpkaXI7CisgICAgICAgIGlmICgoKkZjUGF0dGVybkdldFN0cmluZykoZm9udFNldC0+Zm9udHNbZl0sIEZDX0ZJTEUsIDAsICZmaWxlKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZjUmVzdWx0TWF0Y2gpIHsKKyAgICAgICAgICAgIGRpciA9ICgqRmNTdHJEaXJuYW1lKShmaWxlKTsKKyAgICAgICAgICAgIGZvdW5kID0gMDsKKyAgICAgICAgICAgIGZvciAoaT0wO2k8bnVtZGlyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChmb250ZGlyc1tpXSwgKGNoYXIqKWRpcikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBmb250ZGlyc1tudW1kaXJzKytdID0gKGNoYXIqKWRpcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnJlZSgoY2hhciopZGlyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvKiBGcmVlIGZvbnRzZXQgaWYgb25lIHdhcyByZXR1cm5lZCAqLwotICAgICAgICAoKkZjRm9udFNldERlc3Ryb3kpKGZvbnRTZXQpOwogICAgIH0KIAogICAgIC8qIEZyZWUgbWVtb3J5IGFuZCBjbG9zZSB0aGUgIi5zbyIgKi8KKyAgICAoKkZjRm9udFNldERlc3Ryb3kpKGZvbnRTZXQpOwogICAgICgqRmNQYXR0ZXJuRGVzdHJveSkocGF0dGVybik7CiAgICAgY2xvc2VGb250Q29uZmlnKGxpYmZvbnRjb25maWcsIEpOSV9UUlVFKTsKICAgICByZXR1cm4gZm9udGRpcnM7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvRGF0YWdyYW1DaGFubmVsSW1wbC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0RhdGFncmFtQ2hhbm5lbEltcGwuYwppbmRleCBiZjdkNTc4Li5mNWRkMzYxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvRGF0YWdyYW1DaGFubmVsSW1wbC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9EYXRhZ3JhbUNoYW5uZWxJbXBsLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIH0KICAgICBpZiAoc2VuZGVyQWRkciA9PSBOVUxMKSB7CiAgICAgICAgIGpvYmplY3QgaXNhID0gTlVMTDsKLSAgICAgICAgaW50IHBvcnQgPSAwOworICAgICAgICBpbnQgcG9ydDsKICAgICAgICAgam9iamVjdCBpYSA9IE5FVF9Tb2NrYWRkclRvSW5ldEFkZHJlc3MoZW52LCAoc3RydWN0IHNvY2thZGRyICopJnNhLCAmcG9ydCk7CiAgICAgICAgIGlmIChpYSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpc2EgPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlzYV9jbGFzcywgaXNhX2N0b3JJRCwgaWEsIHBvcnQpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0RldlBvbGxBcnJheVdyYXBwZXIuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9EZXZQb2xsQXJyYXlXcmFwcGVyLmMKaW5kZXggNjg2MGExNi4uOTYyZjVlNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0RldlBvbGxBcnJheVdyYXBwZXIuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvRGV2UG9sbEFycmF5V3JhcHBlci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtOTQsNyArOTQsNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RhcnQgPSBub3c7Ci0gICAgICAgICAgICAgICAgYS5kcF90aW1lb3V0ID0gcmVtYWluaW5nOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9FUG9sbEFycmF5V3JhcHBlci5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0VQb2xsQXJyYXlXcmFwcGVyLmMKaW5kZXggMTJiMWM4NS4uYzdiMzkxZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0VQb2xsQXJyYXlXcmFwcGVyLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0VQb2xsQXJyYXlXcmFwcGVyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01Myw3ICs1Myw3IEBACiAgICAgc3RhcnQgPSB0LnR2X3NlYyAqIDEwMDAgKyB0LnR2X3VzZWMgLyAxMDAwOwogCiAgICAgZm9yICg7OykgewotICAgICAgICBpbnQgcmVzID0gZXBvbGxfd2FpdChlcGZkLCBldmVudHMsIG51bWZkcywgcmVtYWluaW5nKTsKKyAgICAgICAgaW50IHJlcyA9IGVwb2xsX3dhaXQoZXBmZCwgZXZlbnRzLCBudW1mZHMsIHRpbWVvdXQpOwogICAgICAgICBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewogICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9JT1V0aWwuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9JT1V0aWwuYwppbmRleCBkOGJiZTg0Li40MzhiZjQxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvSU9VdGlsLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL0lPVXRpbC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSAiamF2YV9sYW5nX0ludGVnZXIuaCIKICNpbmNsdWRlICJuaW8uaCIKICNpbmNsdWRlICJuaW9fdXRpbC5oIgotI2luY2x1ZGUgIm5ldF91dGlsLmgiCiAKIHN0YXRpYyBqZmllbGRJRCBmZF9mZElEOyAgICAgICAgLyogZm9yIGppbnQgJ2ZkJyBpbiBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yICovCiAKQEAgLTQ1LDcgKzQ0LDYgQEAKIHsKICAgICBDSEVDS19OVUxMKGNsYXp6ID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9pby9GaWxlRGVzY3JpcHRvciIpKTsKICAgICBDSEVDS19OVUxMKGZkX2ZkSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbGF6eiwgImZkIiwgIkkiKSk7Ci0gICAgaW5pdEluZXRBZGRyZXNzSURzKGVudik7CiB9CiAKIEpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvU2VydmVyU29ja2V0Q2hhbm5lbEltcGwuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbC5jCmluZGV4IDA0YTQwMGEuLmU5NmM5YjAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbC5jCkBAIC04NCw3ICs4NCw3IEBACiAgICAgaW50IGFsbG9jX2xlbjsKICAgICBqb2JqZWN0IHJlbW90ZV9pYSA9IDA7CiAgICAgam9iamVjdCBpc2E7Ci0gICAgamludCByZW1vdGVfcG9ydCA9IDA7CisgICAgamludCByZW1vdGVfcG9ydDsKIAogICAgIE5FVF9BbGxvY1NvY2thZGRyKCZzYSwgJmFsbG9jX2xlbik7CiAgICAgaWYgKHNhID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9zY3RwL1NjdHBOZXQuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9jaC9zY3RwL1NjdHBOZXQuYwppbmRleCA5YzNlZmMwLi4xYjcwMGJiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vY2gvc2N0cC9TY3RwTmV0LmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2NoL3NjdHAvU2N0cE5ldC5jCkBAIC0xNTcsNyArMTU3LDYgQEAKICAgICB9CiAgICAgcHJlQ2xvc2VGRCA9IHNwWzBdOwogICAgIGNsb3NlKHNwWzFdKTsKLSAgICBpbml0SW5ldEFkZHJlc3NJRHMoZW52KTsKIH0KIAogLyoKQEAgLTQzMSw3ICs0MzAsNyBAQAogICAgIHBhZGRyID0gYWRkcl9idWY7CiAgICAgZm9yIChpPTA7IGk8YWRkckNvdW50OyBpKyspIHsKICAgICAgICAgam9iamVjdCBpYSwgaXNhID0gTlVMTDsKLSAgICAgICAgaW50IHBvcnQgPSAwOworICAgICAgICBpbnQgcG9ydDsKICAgICAgICAgc2FwID0gKHN0cnVjdCBzb2NrYWRkciopYWRkcl9idWY7CiAgICAgICAgIGlhID0gTkVUX1NvY2thZGRyVG9JbmV0QWRkcmVzcyhlbnYsIHNhcCwgJnBvcnQpOwogICAgICAgICBpZiAoaWEgIT0gTlVMTCkKQEAgLTU0Myw3ICs1NDIsNiBAQAogICAgIHZvaWQgKmFyZzsKICAgICBpbnQgYXJnbGVuOwogCi0gICAgbWVtc2V0KChjaGFyICopICZsaW5nZXIsIDAsIHNpemVvZihsaW5nZXIpKTsKICAgICBpZiAobWFwU29ja2V0T3B0aW9uKG9wdCwgJmtsZXZlbCwgJmtvcHQpIDwgMCkgewogICAgICAgICBKTlVfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHNvY2tldCBvcHRpb24iKTsKQEAgLTYwMSw3ICs1OTksNyBAQAogICAoSk5JRW52ICplbnYsIGpjbGFzcyBrbGFzcywgamludCBmZCwgamludCBhc3NvY0lkLCBqb2JqZWN0IGlhT2JqLCBqaW50IHBvcnQpIHsKICAgICBzdHJ1Y3Qgc2N0cF9zZXRwcmltIHByaW07CiAgICAgc3RydWN0IHNvY2thZGRyKiBzYXAgPSAoc3RydWN0IHNvY2thZGRyKikmcHJpbS5zc3BfYWRkcjsKLSAgICBpbnQgc2FwX2xlbiA9IHNpemVvZihzYXApOworICAgIGludCBzYXBfbGVuOwogCiAgICAgaWYgKE5FVF9JbmV0QWRkcmVzc1RvU29ja2FkZHIoZW52LCBpYU9iaiwgcG9ydCwgc2FwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYXBfbGVuLCBKTklfVFJVRSkgIT0gMCkgewpAQCAtNjI2LDcgKzYyNCw3IEBACiAgICBqb2JqZWN0IGlhT2JqLCBqaW50IHBvcnQsIGpib29sZWFuIHByZWZlcklQdjYpIHsKICAgICBzdHJ1Y3Qgc2N0cF9zZXRwZWVycHJpbSBwcmltOwogICAgIHN0cnVjdCBzb2NrYWRkciogc2FwID0gKHN0cnVjdCBzb2NrYWRkciopJnByaW0uc3NwcF9hZGRyOwotICAgIGludCBzYXBfbGVuID0gc2l6ZW9mKHNhcCk7CisgICAgaW50IHNhcF9sZW47CiAKICAgICBpZiAoTkVUX0luZXRBZGRyZXNzVG9Tb2NrYWRkcihlbnYsIGlhT2JqLCBwb3J0LCBzYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhcF9sZW4sIHByZWZlcklQdjYpICE9IDApIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9mcy9NYWNPU1hOYXRpdmVEaXNwYXRjaGVyLmMgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9uaW8vZnMvTWFjT1NYTmF0aXZlRGlzcGF0Y2hlci5jCmluZGV4IDVjNzUyOTMuLmYzNjAyYjggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL25pby9mcy9NYWNPU1hOYXRpdmVEaXNwYXRjaGVyLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vbmlvL2ZzL01hY09TWE5hdGl2ZURpc3BhdGNoZXIuYwpAQCAtMzksMTUgKzM5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgZm9ybSkKIHsKICAgICBqY2hhckFycmF5IHJlc3VsdCA9IE5VTEw7Ci0gICAgY2hhciAqY2hhcnM7CisgICAgY2hhciBjaGFyc19idWZbKFBBVEhfTUFYICsgMSkgKiAyXTsgICAgIC8vIHV0ZjE2ICsgemVybyBwYWRkaW5nCiAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmIGNzcmVmID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKE5VTEwsIDApOwogICAgIGlmIChjc3JlZiA9PSBOVUxMKSB7CiAgICAgICAgIEpOVV9UaHJvd091dE9mTWVtb3J5RXJyb3IoZW52LCAibmF0aXZlIGhlYXAiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNoYXJzID0gKGNoYXIqKSgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIHBhdGgsIDApOwotICAgIGlmIChjaGFycyAhPSBOVUxMKSB7Ci0gICAgICAgIGNoYXIgY2hhcnNfYnVmWyhQQVRIX01BWCArIDEpICogMl07ICAgICAvLyB1dGYxNiArIHplcm8gcGFkZGluZworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKmNoYXJzID0gKGNoYXIqKSgqZW52KS0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbChlbnYsIHBhdGgsIDApOwogICAgICAgICBqc2l6ZSBsZW4gPSAoKmVudiktPkdldEFycmF5TGVuZ3RoKGVudiwgcGF0aCk7CiAgICAgICAgIENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyhjc3JlZiwgKGNvbnN0IFVuaUNoYXIqKWNoYXJzLCBsZW4pOwogICAgICAgICAoKmVudiktPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGVudiwgcGF0aCwgY2hhcnMsIDApOwpAQCAtNTYsMjYgKzUzLDI0IEBACiAgICAgICAgIGlmIChsZW4gPCBQQVRIX01BWCkgewogICAgICAgICAgICAgaWYgKENGU3RyaW5nR2V0Q1N0cmluZyhjc3JlZiwgY2hhcnNfYnVmLCBzaXplb2YoY2hhcnNfYnVmKSwga0NGU3RyaW5nRW5jb2RpbmdVVEYxNikpIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSAoKmVudiktPk5ld0NoYXJBcnJheShlbnYsIGxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICgqZW52KS0+U2V0Q2hhckFycmF5UmVnaW9uKGVudiwgcmVzdWx0LCAwLCBsZW4sIChqY2hhciopJmNoYXJzX2J1Zik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICgqZW52KS0+U2V0Q2hhckFycmF5UmVnaW9uKGVudiwgcmVzdWx0LCAwLCBsZW4sIChqY2hhciopJmNoYXJzX2J1Zik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgdWxlbiA9IChsZW4gKyAxKSAqIDI7CiAgICAgICAgICAgICBjaGFycyA9IG1hbGxvYyh1bGVuKTsKICAgICAgICAgICAgIGlmIChjaGFycyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKGNzcmVmKTsKICAgICAgICAgICAgICAgICBKTlVfVGhyb3dPdXRPZk1lbW9yeUVycm9yKGVudiwgIm5hdGl2ZSBoZWFwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKENGU3RyaW5nR2V0Q1N0cmluZyhjc3JlZiwgY2hhcnMsIHVsZW4sIGtDRlN0cmluZ0VuY29kaW5nVVRGMTYpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgqZW52KS0+TmV3Q2hhckFycmF5KGVudiwgbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPlNldENoYXJBcnJheVJlZ2lvbihlbnYsIHJlc3VsdCwgMCwgbGVuLCAoamNoYXIqKWNoYXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKmVudiktPlNldENoYXJBcnJheVJlZ2lvbihlbnYsIHJlc3VsdCwgMCwgbGVuLCAoamNoYXIqKWNoYXJzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZnJlZShjaGFycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgQ0ZSZWxlYXNlKGNzcmVmKTsKICAgICB9Ci0gICAgQ0ZSZWxlYXNlKGNzcmVmKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4veGF3dC9YVG9vbGtpdC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4veGF3dC9YVG9vbGtpdC5jCmluZGV4IDcxZDQxZjMuLjA5OWMxNjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL3hhd3QvWFRvb2xraXQuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi94YXd0L1hUb29sa2l0LmMKQEAgLTEwMjAsOSArMTAyMCw5IEBACiAgICAgICogYmVmb3JlIGNhbGxpbmcgWFRlc3RGYWtlQnV0dG9uRXZlbnQoKS4KICAgICAgKi8KICAgICB4aW5wdXRBdmFpbGFibGUgPSBYUXVlcnlFeHRlbnNpb24oYXd0X2Rpc3BsYXksIElOQU1FLCAmbWFqb3Jfb3Bjb2RlLCAmZmlyc3RfZXZlbnQsICZmaXJzdF9lcnJvcik7CisgICAgRFRSQUNFX1BSSU5UTE4zKCJSb2JvdFBlZXI6IFhRdWVyeUV4dGVuc2lvbihYSU5QVVQpIHJldHVybnMgbWFqb3Jfb3Bjb2RlID0gJWQsIGZpcnN0X2V2ZW50ID0gJWQsIGZpcnN0X2Vycm9yID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBtYWpvcl9vcGNvZGUsIGZpcnN0X2V2ZW50LCBmaXJzdF9lcnJvcik7CiAgICAgaWYgKHhpbnB1dEF2YWlsYWJsZSkgewotICAgICAgICBEVFJBQ0VfUFJJTlRMTjMoIlJvYm90UGVlcjogWFF1ZXJ5RXh0ZW5zaW9uKFhJTlBVVCkgcmV0dXJucyBtYWpvcl9vcGNvZGUgPSAlZCwgZmlyc3RfZXZlbnQgPSAlZCwgZmlyc3RfZXJyb3IgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWpvcl9vcGNvZGUsIGZpcnN0X2V2ZW50LCBmaXJzdF9lcnJvcik7CiAgICAgICAgIGRldmljZXMgPSBYTGlzdElucHV0RGV2aWNlcyhhd3RfZGlzcGxheSwgJm51bURldmljZXMpOwogICAgICAgICBmb3IgKGRldklkeCA9IDA7IGRldklkeCA8IG51bURldmljZXM7IGRldklkeCsrKSB7CiAgICAgICAgICAgICBhRGV2aWNlID0gJihkZXZpY2VzW2RldklkeF0pOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2Jpbi9jbWR0b2FyZ3MuYyBiL2pkay9zcmMvd2luZG93cy9iaW4vY21kdG9hcmdzLmMKaW5kZXggMjllNWU3Ny4uMzUyYjE1NSAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL2Jpbi9jbWR0b2FyZ3MuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvYmluL2NtZHRvYXJncy5jCkBAIC0xNTUsNyArMTU1LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZXN0ICs9IGNvcHlDaChjaCwgZGVzdCk7Ci0gICAgICAgICAgICBzbGFzaGVzID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvZm9udGNvbmZpZy5wcm9wZXJ0aWVzIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC93aW5kb3dzL2ZvbnRjb25maWcucHJvcGVydGllcwppbmRleCAzYTJlMmIzLi42ZTQ4OGVlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3dpbmRvd3MvZm9udGNvbmZpZy5wcm9wZXJ0aWVzCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvd2luZG93cy9mb250Y29uZmlnLnByb3BlcnRpZXMKQEAgLTQwLDcgKzQwLDYgQEAKIGFsbGZvbnRzLmRpbmdiYXRzPVdpbmdkaW5ncwogYWxsZm9udHMubHVjaWRhPUx1Y2lkYSBTYW5zIFJlZ3VsYXIKIGFsbGZvbnRzLnN5bWJvbD1TeW1ib2wKLWFsbGZvbnRzLnN5bWJvbHM9U2Vnb2UgVUkgU3ltYm9sCiBhbGxmb250cy50aGFpPUx1Y2lkYSBTYW5zIFJlZ3VsYXIKIGFsbGZvbnRzLmdlb3JnaWFuPVN5bGZhZW4KIApAQCAtMjM3LDcgKzIzNiw3IEBACiAKIHNlcXVlbmNlLmFsbGZvbnRzLngtd2luZG93cy04NzQ9YWxwaGFiZXRpYyx0aGFpLGRpbmdiYXRzLHN5bWJvbAogCi1zZXF1ZW5jZS5mYWxsYmFjaz1sdWNpZGEsc3ltYm9scyxcCitzZXF1ZW5jZS5mYWxsYmFjaz1sdWNpZGEsXAogICAgICAgICAgICAgICAgICAgY2hpbmVzZS1tczk1MCxjaGluZXNlLWhrc2NzLGNoaW5lc2UtbXM5MzYsY2hpbmVzZS1nYjE4MDMwLFwKICAgICAgICAgICAgICAgICAgIGphcGFuZXNlLGtvcmVhbixjaGluZXNlLW1zOTUwLWV4dGIsY2hpbmVzZS1tczkzNi1leHRiLGdlb3JnaWFuCiAKQEAgLTI5OSw0ICsyOTgsMyBAQAogZmlsZW5hbWUuV2luZ2RpbmdzPVdJTkdESU5HLlRURgogCiBmaWxlbmFtZS5TeWxmYWVuPXN5bGZhZW4udHRmCi1maWxlbmFtZS5TZWdvZV9VSV9TeW1ib2w9U0VHVUlTWU0uVFRGCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vamF2YTJkL2QzZC9EM0RNYXNrRmlsbC5qYXZhIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2phdmEyZC9kM2QvRDNETWFza0ZpbGwuamF2YQppbmRleCBkYWUxZDA4Li5lNWUzZDI1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vamF2YTJkL2QzZC9EM0RNYXNrRmlsbC5qYXZhCisrKyBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9qYXZhMmQvZDNkL0QzRE1hc2tGaWxsLmphdmEKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2Ugc3VuLmphdmEyZC5kM2Q7CiAKIGltcG9ydCBqYXZhLmF3dC5Db21wb3NpdGU7Ci1pbXBvcnQgc3VuLmphdmEyZC5JbnZhbGlkUGlwZUV4Y2VwdGlvbjsKIGltcG9ydCBzdW4uamF2YTJkLlN1bkdyYXBoaWNzMkQ7CiBpbXBvcnQgc3VuLmphdmEyZC5sb29wcy5HcmFwaGljc1ByaW1pdGl2ZTsKIGltcG9ydCBzdW4uamF2YTJkLmxvb3BzLkdyYXBoaWNzUHJpbWl0aXZlTWdyOwpAQCAtNjgsMTMgKzY3LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnRleHQoU3VuR3JhcGhpY3MyRCBzZzJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29tcCwgaW50IGN0eGZsYWdzKQogICAgIHsKLSAgICAgICAgRDNEU3VyZmFjZURhdGEgZHN0RGF0YTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRzdERhdGEgPSAoRDNEU3VyZmFjZURhdGEpIHNnMmQuc3VyZmFjZURhdGE7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVFeGNlcHRpb24oIndyb25nIHN1cmZhY2UgZGF0YSB0eXBlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZzJkLnN1cmZhY2VEYXRhKTsKLSAgICAgICAgfQorICAgICAgICBEM0RTdXJmYWNlRGF0YSBkc3REYXRhID0gKEQzRFN1cmZhY2VEYXRhKXNnMmQuc3VyZmFjZURhdGE7CiAgICAgICAgIEQzRENvbnRleHQudmFsaWRhdGVDb250ZXh0KGRzdERhdGEsIGRzdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnMmQuZ2V0Q29tcENsaXAoKSwgY29tcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2cyZC5wYWludCwgc2cyZCwgY3R4ZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9LZXkuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvS2V5LmphdmEKaW5kZXggODE1NGM0OC4uMDEyNGZmYiAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9LZXkuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL0tleS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsNiArMzAsNyBAQAogLyoqCiAgKiBUaGUgaGFuZGxlIGZvciBhbiBSU0Egb3IgRFNBIGtleSB1c2luZyB0aGUgTWljcm9zb2Z0IENyeXB0byBBUEkuCiAgKgorICogQHNlZSBEU0FQcml2YXRlS2V5CiAgKiBAc2VlIFJTQVByaXZhdGVLZXkKICAqIEBzZWUgUlNBUHVibGljS2V5CiAgKgpAQCAtNDAsMzUgKzQxLDkgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTA4ODg1OTM5NDAyNTA0OTE5NEw7CiAKLSAgICBzdGF0aWMgY2xhc3MgTmF0aXZlSGFuZGxlcyB7Ci0gICAgICAgIGxvbmcgaENyeXB0UHJvdiA9IDA7Ci0gICAgICAgIGxvbmcgaENyeXB0S2V5ID0gMDsKLQotICAgICAgICBwdWJsaWMgTmF0aXZlSGFuZGxlcyhsb25nIGhDcnlwdFByb3YsIGxvbmcgaENyeXB0S2V5KSB7Ci0gICAgICAgICAgICB0aGlzLmhDcnlwdFByb3YgPSBoQ3J5cHRQcm92OwotICAgICAgICAgICAgdGhpcy5oQ3J5cHRLZXkgPSBoQ3J5cHRLZXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogRmluYWxpemF0aW9uIG1ldGhvZAotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbGVhblVwKGhDcnlwdFByb3YsIGhDcnlwdEtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGhDcnlwdFByb3YgPSAwOwotICAgICAgICAgICAgICAgICAgICBoQ3J5cHRLZXkgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE5hdGl2ZUhhbmRsZXMgaGFuZGxlczsKKyAgICAvLyBOYXRpdmUgaGFuZGxlCisgICAgcHJvdGVjdGVkIGxvbmcgaENyeXB0UHJvdiA9IDA7CisgICAgcHJvdGVjdGVkIGxvbmcgaENyeXB0S2V5ID0gMDsKIAogICAgIC8vIEtleSBsZW5ndGgKICAgICBwcm90ZWN0ZWQgaW50IGtleUxlbmd0aCA9IDA7CkBAIC03NiwxMyArNTEsMzIgQEAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBLZXkgb2JqZWN0LgogICAgICAqLwotICAgIHByb3RlY3RlZCBLZXkoTmF0aXZlSGFuZGxlcyBoYW5kbGVzLCBpbnQga2V5TGVuZ3RoKQorICAgIHByb3RlY3RlZCBLZXkobG9uZyBoQ3J5cHRQcm92LCBsb25nIGhDcnlwdEtleSwgaW50IGtleUxlbmd0aCkKICAgICB7Ci0gICAgICAgIHRoaXMuaGFuZGxlcyA9IGhhbmRsZXM7CisgICAgICAgIHRoaXMuaENyeXB0UHJvdiA9IGhDcnlwdFByb3Y7CisgICAgICAgIHRoaXMuaENyeXB0S2V5ID0gaENyeXB0S2V5OwogICAgICAgICB0aGlzLmtleUxlbmd0aCA9IGtleUxlbmd0aDsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBGaW5hbGl6YXRpb24gbWV0aG9kCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xlYW5VcChoQ3J5cHRQcm92LCBoQ3J5cHRLZXkpOworICAgICAgICAgICAgICAgIGhDcnlwdFByb3YgPSAwOworICAgICAgICAgICAgICAgIGhDcnlwdEtleSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOYXRpdmUgbWV0aG9kIHRvIGNsZWFudXAgdGhlIGtleSBoYW5kbGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBuYXRpdmUgc3RhdGljIHZvaWQgY2xlYW5VcChsb25nIGhDcnlwdFByb3YsIGxvbmcgaENyeXB0S2V5KTsKQEAgLTEwMiw3ICs5Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0SENyeXB0S2V5KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVzLmhDcnlwdEtleTsKKyAgICAgICAgcmV0dXJuIGhDcnlwdEtleTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMCwxMiArMTA0LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0SENyeXB0UHJvdmlkZXIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGhhbmRsZXMuaENyeXB0UHJvdjsKKyAgICAgICAgcmV0dXJuIGhDcnlwdFByb3Y7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgYWxnb3JpdGhtIG5hbWUgZm9yIHRoaXMga2V5LiBGb3IKLSAgICAgKiBleGFtcGxlLCAiUlNBIiB3b3VsZCBpbmRpY2F0ZSB0aGF0IHRoaXMga2V5IGlzIGEgUlNBIGtleS4KKyAgICAgKiBleGFtcGxlLCAiRFNBIiB3b3VsZCBpbmRpY2F0ZSB0aGF0IHRoaXMga2V5IGlzIGEgRFNBIGtleS4KICAgICAgKiBTZWUgQXBwZW5kaXggQSBpbiB0aGUgPGEgaHJlZj0KICAgICAgKiAiLi4vLi4vLi4vZ3VpZGUvc2VjdXJpdHkvQ3J5cHRvU3BlYy5odG1sI0FwcEEiPgogICAgICAqIEphdmEgQ3J5cHRvZ3JhcGh5IEFyY2hpdGVjdHVyZSBBUEkgU3BlY2lmaWNhdGlvbiAmYW1wOyBSZWZlcmVuY2UgPC9hPgpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9LZXlTdG9yZS5qYXZhIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9LZXlTdG9yZS5qYXZhCmluZGV4IDA3NWFjNzguLmNiZjQyNDAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvS2V5U3RvcmUuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL0tleVN0b3JlLmphdmEKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2VydENoYWluID0gY2hhaW47CiAgICAgICAgIH0KLSAgICB9CisgICAgfTsKIAogICAgIC8qCiAgICAgICogQW4gWC41MDkgY2VydGlmaWNhdGUgZmFjdG9yeS4KQEAgLTgwMCw4ICs4MDAsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdG9yZVdpdGhVbmlxdWVBbGlhcyhhbGlhcywgbmV3IEtleUVudHJ5KGFsaWFzLAotICAgICAgICAgICAgICAgICAgICBuZXcgUlNBUHJpdmF0ZUtleShuZXcgS2V5Lk5hdGl2ZUhhbmRsZXMoaENyeXB0UHJvdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQ3J5cHRLZXkpLCBrZXlMZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgUlNBUHJpdmF0ZUtleShoQ3J5cHRQcm92LCBoQ3J5cHRLZXksIGtleUxlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgIGNlcnRDaGFpbikpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKQEAgLTg1Nyw2ICs4NTYsNyBAQAogICAgICAqIExvYWQga2V5cyBhbmQvb3IgY2VydGlmaWNhdGVzIGZyb20ga2V5c3RvcmUgaW50byBDb2xsZWN0aW9uLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiBrZXlzdG9yZS4KKyAgICAgKiBAcGFyYW0gZW50cmllcyBDb2xsZWN0aW9uIG9mIGtleS9jZXJ0aWZpY2F0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGxvYWRLZXlzT3JDZXJ0aWZpY2F0ZUNoYWlucyhTdHJpbmcgbmFtZSkKICAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBS2V5UGFpci5qYXZhIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FLZXlQYWlyLmphdmEKaW5kZXggMDg4MGMyMC4uNmZiYTJhMiAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FLZXlQYWlyLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FLZXlQYWlyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MSw5ICs0MSw4IEBACiAgICAgICovCiAgICAgUlNBS2V5UGFpcihsb25nIGhDcnlwdFByb3YsIGxvbmcgaENyeXB0S2V5LCBpbnQga2V5TGVuZ3RoKQogICAgIHsKLSAgICAgICAgS2V5Lk5hdGl2ZUhhbmRsZXMgaGFuZGxlcyA9IG5ldyBLZXkuTmF0aXZlSGFuZGxlcyhoQ3J5cHRQcm92LCBoQ3J5cHRLZXkpOwotICAgICAgICBwcml2YXRlS2V5ID0gbmV3IFJTQVByaXZhdGVLZXkoaGFuZGxlcywga2V5TGVuZ3RoKTsKLSAgICAgICAgcHVibGljS2V5ID0gbmV3IFJTQVB1YmxpY0tleShoYW5kbGVzLCBrZXlMZW5ndGgpOworICAgICAgICBwcml2YXRlS2V5ID0gbmV3IFJTQVByaXZhdGVLZXkoaENyeXB0UHJvdiwgaENyeXB0S2V5LCBrZXlMZW5ndGgpOworICAgICAgICBwdWJsaWNLZXkgPSBuZXcgUlNBUHVibGljS2V5KGhDcnlwdFByb3YsIGhDcnlwdEtleSwga2V5TGVuZ3RoKTsKICAgICB9CiAKICAgICBwdWJsaWMgUlNBUHJpdmF0ZUtleSBnZXRQcml2YXRlKCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FQcml2YXRlS2V5LmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQVByaXZhdGVLZXkuamF2YQppbmRleCBjYTY5MmRmLi5iYzUzMGY1IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQVByaXZhdGVLZXkuamF2YQorKysgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQVByaXZhdGVLZXkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQyLDE1ICs0Miw3IEBACiAgICAgICovCiAgICAgUlNBUHJpdmF0ZUtleShsb25nIGhDcnlwdFByb3YsIGxvbmcgaENyeXB0S2V5LCBpbnQga2V5TGVuZ3RoKQogICAgIHsKLSAgICAgICAgc3VwZXIobmV3IE5hdGl2ZUhhbmRsZXMoaENyeXB0UHJvdiwgaENyeXB0S2V5KSwga2V5TGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYW4gUlNBUHJpdmF0ZUtleSBvYmplY3QuCi0gICAgICovCi0gICAgUlNBUHJpdmF0ZUtleShOYXRpdmVIYW5kbGVzIGhhbmRsZXMsIGludCBrZXlMZW5ndGgpCi0gICAgewotICAgICAgICBzdXBlcihoYW5kbGVzLCBrZXlMZW5ndGgpOworICAgICAgICBzdXBlcihoQ3J5cHRQcm92LCBoQ3J5cHRLZXksIGtleUxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MSw4ICs2Myw4IEBACiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gIlJTQVByaXZhdGVLZXkgW3NpemU9IiArIGtleUxlbmd0aCArICIgYml0cywgdHlwZT0iICsKLSAgICAgICAgICAgIGdldEtleVR5cGUoaGFuZGxlcy5oQ3J5cHRLZXkpICsgIiwgY29udGFpbmVyPSIgKwotICAgICAgICAgICAgZ2V0Q29udGFpbmVyTmFtZShoYW5kbGVzLmhDcnlwdFByb3YpICsgIl0iOworICAgICAgICAgICAgZ2V0S2V5VHlwZShoQ3J5cHRLZXkpICsgIiwgY29udGFpbmVyPSIgKworICAgICAgICAgICAgZ2V0Q29udGFpbmVyTmFtZShoQ3J5cHRQcm92KSArICJdIjsKICAgICB9CiAKICAgICAvLyBUaGlzIGNsYXNzIGlzIG5vdCBzZXJpYWxpemFibGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBUHVibGljS2V5LmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvbXNjYXBpL1JTQVB1YmxpY0tleS5qYXZhCmluZGV4IDUyMDgxYWIuLmE2MmQ3ODMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9zZWN1cml0eS9tc2NhcGkvUlNBUHVibGljS2V5LmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL3NlY3VyaXR5L21zY2FwaS9SU0FQdWJsaWNLZXkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUxLDE1ICs1MSw3IEBACiAgICAgICovCiAgICAgUlNBUHVibGljS2V5KGxvbmcgaENyeXB0UHJvdiwgbG9uZyBoQ3J5cHRLZXksIGludCBrZXlMZW5ndGgpCiAgICAgewotICAgICAgICBzdXBlcihuZXcgTmF0aXZlSGFuZGxlcyhoQ3J5cHRQcm92LCBoQ3J5cHRLZXkpLCBrZXlMZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBSU0FQdWJsaWNLZXkgb2JqZWN0LgotICAgICAqLwotICAgIFJTQVB1YmxpY0tleShOYXRpdmVIYW5kbGVzIGhhbmRsZXMsIGludCBrZXlMZW5ndGgpCi0gICAgewotICAgICAgICBzdXBlcihoYW5kbGVzLCBrZXlMZW5ndGgpOworICAgICAgICBzdXBlcihoQ3J5cHRQcm92LCBoQ3J5cHRLZXksIGtleUxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NSw4ICs3Nyw4IEBACiAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAogICAgICAgICBzYi5hcHBlbmQoIlJTQVB1YmxpY0tleSBbc2l6ZT0iKS5hcHBlbmQoa2V5TGVuZ3RoKQotICAgICAgICAgICAgLmFwcGVuZCgiIGJpdHMsIHR5cGU9IikuYXBwZW5kKGdldEtleVR5cGUoaGFuZGxlcy5oQ3J5cHRLZXkpKQotICAgICAgICAgICAgLmFwcGVuZCgiLCBjb250YWluZXI9IikuYXBwZW5kKGdldENvbnRhaW5lck5hbWUoaGFuZGxlcy5oQ3J5cHRQcm92KSkKKyAgICAgICAgICAgIC5hcHBlbmQoIiBiaXRzLCB0eXBlPSIpLmFwcGVuZChnZXRLZXlUeXBlKGhDcnlwdEtleSkpCisgICAgICAgICAgICAuYXBwZW5kKCIsIGNvbnRhaW5lcj0iKS5hcHBlbmQoZ2V0Q29udGFpbmVyTmFtZShoQ3J5cHRQcm92KSkKICAgICAgICAgICAgIC5hcHBlbmQoIl1cbiAgbW9kdWx1czogIikuYXBwZW5kKGdldE1vZHVsdXMoKSkKICAgICAgICAgICAgIC5hcHBlbmQoIlxuICBwdWJsaWMgZXhwb25lbnQ6ICIpLmFwcGVuZChnZXRQdWJsaWNFeHBvbmVudCgpKTsKIApAQCAtMTAxLDcgKzkzLDcgQEAKICAgICAgICAgaWYgKGV4cG9uZW50ID09IG51bGwpIHsKIAogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwdWJsaWNLZXlCbG9iID0gZ2V0UHVibGljS2V5QmxvYihoYW5kbGVzLmhDcnlwdEtleSk7CisgICAgICAgICAgICAgICAgcHVibGljS2V5QmxvYiA9IGdldFB1YmxpY0tleUJsb2IoaENyeXB0S2V5KTsKICAgICAgICAgICAgICAgICBleHBvbmVudCA9IG5ldyBCaWdJbnRlZ2VyKDEsIGdldEV4cG9uZW50KHB1YmxpY0tleUJsb2IpKTsKIAogICAgICAgICAgICAgfSBjYXRjaCAoS2V5RXhjZXB0aW9uIGUpIHsKQEAgLTEyMCw3ICsxMTIsNyBAQAogICAgICAgICBpZiAobW9kdWx1cyA9PSBudWxsKSB7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHVibGljS2V5QmxvYiA9IGdldFB1YmxpY0tleUJsb2IoaGFuZGxlcy5oQ3J5cHRLZXkpOworICAgICAgICAgICAgICAgIHB1YmxpY0tleUJsb2IgPSBnZXRQdWJsaWNLZXlCbG9iKGhDcnlwdEtleSk7CiAgICAgICAgICAgICAgICAgbW9kdWx1cyA9IG5ldyBCaWdJbnRlZ2VyKDEsIGdldE1vZHVsdXMocHVibGljS2V5QmxvYikpOwogCiAgICAgICAgICAgICB9IGNhdGNoIChLZXlFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9jb20vc3VuL3NlY3VyaXR5L2F1dGgvbW9kdWxlL250LmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvbnQuYwppbmRleCAwMzhjZWIxLi42NGVmMzU2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvbnQuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvbnQuYwpAQCAtNDMsMTIgKzQzLDYgQEAKIEJPT0wgZ2V0VGV4dHVhbFNpZChQU0lEIHBTaWQsIExQVFNUUiBUZXh0dWFsU2lkLCBMUERXT1JEIGxwZHdCdWZmZXJMZW4pOwogdm9pZCBEaXNwbGF5RXJyb3JUZXh0KERXT1JEIGR3TGFzdEVycm9yKTsKIAotc3RhdGljIHZvaWQgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKm1zZykgewotICAgIGpjbGFzcyBjbGF6eiA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKTsKLSAgICBpZiAoY2xhenogIT0gTlVMTCkKLSAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIGNsYXp6LCBtc2cpOwotfQotCiBKTklFWFBPUlQgamxvbmcgSk5JQ0FMTAogSmF2YV9jb21fc3VuX3NlY3VyaXR5X2F1dGhfbW9kdWxlX05UU3lzdGVtX2dldEltcGVyc29uYXRpb25Ub2tlbjAKICAgICAgICAgKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaikgewpAQCAtNjgsNiArNjIsNyBAQAogCiAgICAgbG9uZyBpLCBqID0gMDsKICAgICBIQU5ETEUgdG9rZW5IYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBCT09MIHN5c3RlbUVycm9yID0gRkFMU0U7CiAKICAgICBMUFRTVFIgdXNlck5hbWUgPSBOVUxMOyAgICAgICAgICAgICAvLyB1c2VyIG5hbWUKICAgICBMUFRTVFIgdXNlclNpZCA9IE5VTEw7ICAgICAgICAgICAgICAvLyB1c2VyIHNpZApAQCAtMTIxLDU5ICsxMTYsNzAgQEAKIAogICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgInVzZXJOYW1lIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwogICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0gICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVudiwgImludmFsaWQgZmllbGQ6IHVzZXJOYW1lIik7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9CisgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIGlmIChuZXdFeGNDbHMgPT0gMCkgeworICAgICAgICAgICAgLy8gVW5hYmxlIHRvIGZpbmQgZXhjZXB0aW9uIGNsYXNzCisgICAgICAgICAgICBzeXN0ZW1FcnJvciA9IFRSVUU7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlck5hbWUiKTsKICAgICB9CiAgICAganN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgdXNlck5hbWUpOwotICAgIGlmIChqc3RyID09IE5VTEwpCi0gICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgb2JqLCBmaWQsIGpzdHIpOwogCiAgICAgZmlkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAidXNlclNJRCIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKICAgICBpZiAoZmlkID09IDApIHsKLSAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlbnYsICJpbnZhbGlkIGZpZWxkOiB1c2VyU0lEIik7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9CisgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIGlmIChuZXdFeGNDbHMgPT0gMCkgeworICAgICAgICAgICAgc3lzdGVtRXJyb3IgPSBUUlVFOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIG5ld0V4Y0NscywgImludmFsaWQgZmllbGQ6IHVzZXJTSUQiKTsKICAgICB9CiAgICAganN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgdXNlclNpZCk7Ci0gICAgaWYgKGpzdHIgPT0gTlVMTCkKLSAgICAgICAgZ290byBjbGVhbnVwOwogICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIGZpZCwganN0cik7CiAKICAgICBmaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJkb21haW4iLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CiAgICAgaWYgKGZpZCA9PSAwKSB7Ci0gICAgICAgICgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKLSAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiaW52YWxpZCBmaWVsZDogZG9tYWluIik7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9CisgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgIGlmIChuZXdFeGNDbHMgPT0gMCkgeworICAgICAgICAgICAgc3lzdGVtRXJyb3IgPSBUUlVFOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIG5ld0V4Y0NscywgImludmFsaWQgZmllbGQ6IGRvbWFpbiIpOwogICAgIH0KICAgICBqc3RyID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBkb21haW5OYW1lKTsKLSAgICBpZiAoanN0ciA9PSBOVUxMKQotICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgZmlkLCBqc3RyKTsKIAogICAgIGlmIChkb21haW5TaWQgIT0gTlVMTCkgewogICAgICAgICBmaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJkb21haW5TSUQiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CiAgICAgICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiaW52YWxpZCBmaWVsZDogZG9tYWluU0lEIik7Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KKyAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKKyAgICAgICAgICAgICAgICBzeXN0ZW1FcnJvciA9IFRSVUU7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogZG9tYWluU0lEIik7CiAgICAgICAgIH0KICAgICAgICAganN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgZG9tYWluU2lkKTsKLSAgICAgICAgaWYgKGpzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgZmlkLCBqc3RyKTsKICAgICB9CiAKICAgICBmaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJwcmltYXJ5R3JvdXBJRCIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKICAgICBpZiAoZmlkID09IDApIHsKLSAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOwotICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlbnYsICJpbnZhbGlkIGZpZWxkOiBQcmltYXJ5R3JvdXBJRCIpOwotICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGpjbGFzcyBuZXdFeGNDbHMgPQorICAgICAgICAgICAgKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKKyAgICAgICAgICAgIHN5c3RlbUVycm9yID0gVFJVRTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgICgqZW52KS0+VGhyb3dOZXcoZW52LCBuZXdFeGNDbHMsICJpbnZhbGlkIGZpZWxkOiBQcmltYXJ5R3JvdXBJRCIpOwogICAgIH0KICAgICBqc3RyID0gKCplbnYpLT5OZXdTdHJpbmdVVEYoZW52LCBwcmltYXJ5R3JvdXApOwotICAgIGlmIChqc3RyID09IE5VTEwpCi0gICAgICAgIGdvdG8gY2xlYW51cDsKICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgb2JqLCBmaWQsIGpzdHIpOwogCiAgICAgLy8gcHJpbWFyeSBncm91cCBtYXkgb3IgbWF5IG5vdCBiZSBwYXJ0IG9mIHN1cHBsZW1lbnRhcnkgZ3JvdXBzCkBAIC0xOTgsMTQgKzIwNCwxOSBAQAogCiAgICAgICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgImdyb3VwSURzIiwgIltMamF2YS9sYW5nL1N0cmluZzsiKTsKICAgICAgICAgaWYgKGZpZCA9PSAwKSB7Ci0gICAgICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7Ci0gICAgICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlbnYsICJncm91cElEcyIpOwotICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9CisgICAgICAgICAgICAgICAgKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgaWYgKG5ld0V4Y0NscyA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3lzdGVtRXJyb3IgPSBUUlVFOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIG5ld0V4Y0NscywgImludmFsaWQgZmllbGQ6IGdyb3VwSURzIik7CiAgICAgICAgIH0KIAogICAgICAgICBzdHJpbmdDbGFzcyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbGFuZy9TdHJpbmciKTsKLSAgICAgICAgaWYgKHN0cmluZ0NsYXNzID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGlmIChzdHJpbmdDbGFzcyA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChwSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgIC8vIHByaW1hcnkgZ3JvdXAgbm90IGluIGdyb3VwcyBhcnJheQpAQCAtMjE1LDggKzIyNiw2IEBACiAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBvbmUgbGVzcyBhcnJheSBlbnRyeSBhbmQgZG8gbm90IGFkZCBpbnRvIG5ldyBhcnJheQogICAgICAgICAgICAgamdyb3VwcyA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBudW1Hcm91cHMtMSwgc3RyaW5nQ2xhc3MsIDApOwogICAgICAgICB9Ci0gICAgICAgIGlmIChqZ3JvdXBzID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAKICAgICAgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAobG9uZyludW1Hcm91cHM7IGkrKykgewogICAgICAgICAgICAgaWYgKHBJbmRleCA9PSBpKSB7CkBAIC0yMjQsMTQgKzIzMywxMiBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAganN0ciA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgZ3JvdXBzW2ldKTsKLSAgICAgICAgICAgIGlmIChqc3RyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBqZ3JvdXBzLCBqKyssIGpzdHIpOwogICAgICAgICB9CiAgICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIGZpZCwgamdyb3Vwcyk7CiAgICAgfQogCi1jbGVhbnVwOgorb3V0OgogICAgIGlmICh1c2VyTmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHVzZXJOYW1lKTsKICAgICB9CkBAIC0yNTcsNiArMjY0LDExIEBACiAgICAgfQogICAgIENsb3NlSGFuZGxlKHRva2VuSGFuZGxlKTsKIAorICAgIGlmIChzeXN0ZW1FcnJvciAmJiBkZWJ1ZykgeworICAgICAgICBwcmludGYoIiAgW2dldEN1cnJlbnRdIFN5c3RlbSBFcnJvcjogIik7CisgICAgICAgIHByaW50ZigidW5hYmxlIHRvIGZpbmQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNsYXNzXG4iKTsKKyAgICB9CisKICAgICByZXR1cm47CiB9CiAKQEAgLTMyNCw3ICszMzYsNyBAQAogICAgICAgICAgICAgRGlzcGxheUVycm9yVGV4dChHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgIH0KICAgICAgICAgZXJyb3IgPSBUUlVFOwotICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAogICAgIGlmIChkZWJ1ZykgewpAQCAtMzU3LDcgKzM2OSw3IEBACiAgICAgICAgICAgICBEaXNwbGF5RXJyb3JUZXh0KEdldExhc3RFcnJvcigpKTsKICAgICAgICAgfQogICAgICAgICBlcnJvciA9IFRSVUU7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCiAgICAgaWYgKGRlYnVnKSB7CkBAIC0zOTksNyArNDExLDcgQEAKICAgICAgICAgICAgIERpc3BsYXlFcnJvclRleHQoR2V0TGFzdEVycm9yKCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIG9rIG5vdCB0byBoYXZlIGEgZG9tYWluIFNJRCAobm8gZXJyb3IpCi0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCiAgICAgYnVmU2l6ZSA9IDA7CkBAIC00MTAsNyArNDIyLDcgQEAKICAgICAgICAgcHJpbnRmKCIgIFtnZXRVc2VyXSBkb21haW5TaWQ6ICVzXG4iLCAqZG9tYWluU2lkKTsKICAgICB9CiAKLWNsZWFudXA6CitvdXQ6CiAgICAgaWYgKHRva2VuVXNlckluZm8gIT0gTlVMTCkgewogICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB0b2tlblVzZXJJbmZvKTsKICAgICB9CkBAIC00NTQsNyArNDY2LDcgQEAKICAgICAgICAgICAgIERpc3BsYXlFcnJvclRleHQoR2V0TGFzdEVycm9yKCkpOwogICAgICAgICB9CiAgICAgICAgIGVycm9yID0gVFJVRTsKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKICAgICBpZiAoZGVidWcpIHsKQEAgLTQ2OSw3ICs0ODEsNyBAQAogICAgICAgICBwcmludGYoIiAgW2dldFByaW1hcnlHcm91cF0gcHJpbWFyeUdyb3VwOiAlc1xuIiwgKnByaW1hcnlHcm91cCk7CiAgICAgfQogCi1jbGVhbnVwOgorb3V0OgogICAgIGlmICh0b2tlbkdyb3VwSW5mbyAhPSBOVUxMKSB7CiAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHRva2VuR3JvdXBJbmZvKTsKICAgICB9CkBAIC01MDcsNyArNTE5LDcgQEAKICAgICAgICAgICAgIERpc3BsYXlFcnJvclRleHQoR2V0TGFzdEVycm9yKCkpOwogICAgICAgICB9CiAgICAgICAgIGVycm9yID0gVFJVRTsKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKICAgICBpZiAoZGVidWcpIHsKQEAgLTUxNiw3ICs1MjgsNyBAQAogCiAgICAgaWYgKHRva2VuR3JvdXBJbmZvLT5Hcm91cENvdW50ID09IDApIHsKICAgICAgICAgLy8gbm8gZ3JvdXBzCi0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCiAgICAgLy8gcmV0dXJuIGdyb3VwIGluZm8KQEAgLTUzMyw3ICs1NDUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi1jbGVhbnVwOgorb3V0OgogICAgIGlmICh0b2tlbkdyb3VwSW5mbyAhPSBOVUxMKSB7CiAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHRva2VuR3JvdXBJbmZvKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbGFuZy9Qcm9jZXNzRW52aXJvbm1lbnRfbWQuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9sYW5nL1Byb2Nlc3NFbnZpcm9ubWVudF9tZC5jCmluZGV4IGUxNDI5OWEuLjY5YmQ1MGIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9sYW5nL1Byb2Nlc3NFbnZpcm9ubWVudF9tZC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9sYW5nL1Byb2Nlc3NFbnZpcm9ubWVudF9tZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxNCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbGFuZy9qYXZhX3Byb3BzX21kLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbGFuZy9qYXZhX3Byb3BzX21kLmMKaW5kZXggZGMxZTAwZi4uOGJmMzcxOCAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2xhbmcvamF2YV9wcm9wc19tZC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9sYW5nL2phdmFfcHJvcHNfbWQuYwpAQCAtMTg4LDcgKzE4OCw2IEBACiAgICAgICAgIGZyZWUoZWxlbXNbaW5kZXhdKTsKICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlZShyZXQpOwogICAgICAgICByZXQgPSBOVUxMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9EdWFsU3RhY2tQbGFpblNvY2tldEltcGwuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvRHVhbFN0YWNrUGxhaW5Tb2NrZXRJbXBsLmMKaW5kZXggOGE2NjYwNy4uNjA0ZWE5ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9EdWFsU3RhY2tQbGFpblNvY2tldEltcGwuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L0R1YWxTdGFja1BsYWluU29ja2V0SW1wbC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAgICAgaXNhX2NsYXNzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBjbHMpOwogICAgIGlzYV9jdG9ySUQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgY2xzLCAiPGluaXQ+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKExqYXZhL25ldC9JbmV0QWRkcmVzcztJKVYiKTsKLSAgICBDSEVDS19OVUxMKGlzYV9jdG9ySUQpOwogCiAgICAgLy8gaW1wbGVtZW50IHJlYWQgdGltZW91dCB3aXRoIHNlbGVjdC4KICAgICBpc1JjdlRpbWVvdXRTdXBwb3J0ZWQgPSAwOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9JbmV0NEFkZHJlc3NJbXBsLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYwppbmRleCA5ZTcwOTdlLi5iYjdmMTEwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L0luZXQ0QWRkcmVzc0ltcGwuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPHByb2Nlc3MuaD4KICNpbmNsdWRlIDxpcGhscGFwaS5oPgogI2luY2x1ZGUgPGljbXBhcGkuaD4KLSNpbmNsdWRlIDxXaW5FcnJvci5oPgogCiAjaW5jbHVkZSAiamF2YV9uZXRfSW5ldEFkZHJlc3MuaCIKICNpbmNsdWRlICJqYXZhX25ldF9JbmV0NEFkZHJlc3NJbXBsLmgiCkBAIC0xMTQsNiArMTEzLDExIEBACiAgICAgcmV0dXJuIEpOVV9OZXdTdHJpbmdQbGF0Zm9ybShlbnYsIGhvc3RuYW1lKTsKIH0KIAorc3RhdGljIGpjbGFzcyBuaV9pYWNsczsKK3N0YXRpYyBqY2xhc3MgbmlfaWE0Y2xzOworc3RhdGljIGptZXRob2RJRCBuaV9pYTRjdHJJRDsKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCiAvKgogICogRmluZCBhbiBpbnRlcm5ldCBhZGRyZXNzIGZvciBhIGdpdmVuIGhvc3RuYW1lLiAgTm90IHRoaXMgdGhpcwogICogY29kZSBvbmx5IHdvcmtzIGZvciBhZGRyZXNzZXMgb2YgdHlwZSBJTkVULiBUaGUgdHJhbnNsYXRpb24KQEAgLTEzOCw4ICsxNDIsMTkgQEAKIAogICAgIGpvYmplY3RBcnJheSByZXQgPSBOVUxMOwogCi0gICAgaW5pdEluZXRBZGRyZXNzSURzKGVudik7Ci0gICAgSk5VX0NIRUNLX0VYQ0VQVElPTl9SRVRVUk4oZW52LCBOVUxMKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICBuaV9pYWNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYWNscywgTlVMTCk7CisgICAgICBuaV9pYWNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWFjbHMpOworICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWFjbHMsIE5VTEwpOworICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDRBZGRyZXNzIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjbHMsIE5VTEwpOworICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTRjbHMpOworICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE0Y2xzLCBOVUxMKTsKKyAgICAgIG5pX2lhNGN0cklEID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIG5pX2lhNGNscywgIjxpbml0PiIsICIoKVYiKTsKKyAgICAgIENIRUNLX05VTExfUkVUVVJOKG5pX2lhNGN0cklELCBOVUxMKTsKKyAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9CiAKICAgICBpZiAoSVNfTlVMTChob3N0KSkgewogICAgICAgICBKTlVfVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJob3N0IGFyZ3VtZW50Iik7CkBAIC0xODMsMTMgKzE5OCwxMyBAQAogICAgICAgICBhZGRyZXNzIHw9IChhZGRyWzFdPDw4KSAmIDB4ZmYwMDsKICAgICAgICAgYWRkcmVzcyB8PSBhZGRyWzBdOwogCi0gICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCAxLCBpYV9jbGFzcywgTlVMTCk7CisgICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCAxLCBuaV9pYWNscywgTlVMTCk7CiAKICAgICAgICAgaWYgKElTX05VTEwocmV0KSkgewogICAgICAgICAgICAgZ290byBjbGVhbnVwQW5kUmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlhNF9jbGFzcywgaWE0X2N0cklEKTsKKyAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNGNscywgbmlfaWE0Y3RySUQpOwogICAgICAgICBpZiAoSVNfTlVMTChpYU9iaikpIHsKICAgICAgICAgICByZXQgPSBOVUxMOwogICAgICAgICAgIGdvdG8gY2xlYW51cEFuZFJldHVybjsKQEAgLTIxMyw3ICsyMjgsNyBAQAogICAgICAgICAgICAgYWRkcnArKzsKICAgICAgICAgfQogCi0gICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBpLCBpYV9jbGFzcywgTlVMTCk7CisgICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBpLCBuaV9pYWNscywgTlVMTCk7CiAKICAgICAgICAgaWYgKElTX05VTEwocmV0KSkgewogICAgICAgICAgICAgZ290byBjbGVhbnVwQW5kUmV0dXJuOwpAQCAtMjIyLDcgKzIzNyw3IEBACiAgICAgICAgIGFkZHJwID0gKHN0cnVjdCBpbl9hZGRyICoqKSBocC0+aF9hZGRyX2xpc3Q7CiAgICAgICAgIGkgPSAwOwogICAgICAgICB3aGlsZSAoKmFkZHJwICE9IChzdHJ1Y3QgaW5fYWRkciAqKSAwKSB7Ci0gICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE0X2NsYXNzLCBpYTRfY3RySUQpOworICAgICAgICAgIGpvYmplY3QgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNGNscywgbmlfaWE0Y3RySUQpOwogICAgICAgICAgIGlmIChJU19OVUxMKGlhT2JqKSkgewogICAgICAgICAgICAgcmV0ID0gTlVMTDsKICAgICAgICAgICAgIGdvdG8gY2xlYW51cEFuZFJldHVybjsKQEAgLTI3Nyw2ICsyOTIsNyBAQAogfQogCiAKKwogc3RhdGljIEJPT0wKIFdpbmRvd3NWZXJzaW9uQ2hlY2soV09SRCB3TWFqb3JWZXJzaW9uLCBXT1JEIHdNaW5vclZlcnNpb24sIFdPUkQgd1NlcnZpY2VQYWNrTWFqb3IpIHsKICAgICBPU1ZFUlNJT05JTkZPRVhXIG9zdmkgPSB7IHNpemVvZihvc3ZpKSwgMCwgMCwgMCwgMCwgezB9LCAwLCAwIH07CkBAIC0zMDAsNyArMzE2LDcgQEAKIH0KIAogc3RhdGljIGpib29sZWFuCi10Y3BfcGluZzQoSk5JRW52ICplbnYsCit3eHBfcGluZzQoSk5JRW52ICplbnYsCiAgICAgICAgICAgamJ5dGVBcnJheSBhZGRyQXJyYXksCiAgICAgICAgICAgamludCB0aW1lb3V0LAogICAgICAgICAgIGpieXRlQXJyYXkgaWZBcnJheSwKQEAgLTQ1NSwyNiArNDcxLDI0IEBACiBwaW5nNChKTklFbnYgKmVudiwKICAgICAgIHVuc2lnbmVkIGxvbmcgc3JjX2FkZHIsCiAgICAgICB1bnNpZ25lZCBsb25nIGRlc3RfYWRkciwKLSAgICAgIGppbnQgdGltZW91dCwKLSAgICAgIEhBTkRMRSBoSWNtcEZpbGUpCisgICAgICBqaW50IHRpbWVvdXQpCiB7CiAgICAgLy8gU2VlIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYWEzNjYwNTAlMjhWUy44NSUyOS5hc3B4CiAKKyAgICBIQU5ETEUgaEljbXBGaWxlOwogICAgIERXT1JEIGR3UmV0VmFsID0gMDsKICAgICBjaGFyIFNlbmREYXRhWzMyXSA9IHswfTsKICAgICBMUFZPSUQgUmVwbHlCdWZmZXIgPSBOVUxMOwogICAgIERXT1JEIFJlcGx5U2l6ZSA9IDA7CiAgICAgamJvb2xlYW4gcmV0ID0gSk5JX0ZBTFNFOwogCi0gICAgLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzNjYwNTElMjh2PXZzLjg1JTI5LmFzcHgKLSAgICBSZXBseVNpemUgPSBzaXplb2YoSUNNUF9FQ0hPX1JFUExZKSAgIC8vIFRoZSBidWZmZXIgc2hvdWxkIGJlIGxhcmdlIGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gaG9sZCBhdCBsZWFzdCBvbmUgSUNNUF9FQ0hPX1JFUExZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJ1Y3R1cmUKLSAgICAgICAgICAgICAgICArIHNpemVvZihTZW5kRGF0YSkgICAgICAgIC8vIHBsdXMgUmVxdWVzdFNpemUgYnl0ZXMgb2YgZGF0YS4KLSAgICAgICAgICAgICAgICArIDg7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYnVmZmVyIHNob3VsZCBhbHNvIGJlIGxhcmdlIGVub3VnaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWxzbyBob2xkIDggbW9yZSBieXRlcyBvZiBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlIHNpemUgb2YgYW4gSUNNUCBlcnJvciBtZXNzYWdlKQorICAgIGhJY21wRmlsZSA9IEljbXBDcmVhdGVGaWxlKCk7CisgICAgaWYgKGhJY21wRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBORVRfVGhyb3dOZXcoZW52LCBXU0FHZXRMYXN0RXJyb3IoKSwgIlVuYWJsZSB0byBvcGVuIGhhbmRsZSIpOworICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOworICAgIH0KIAorICAgIFJlcGx5U2l6ZSA9IHNpemVvZihJQ01QX0VDSE9fUkVQTFkpICsgc2l6ZW9mKFNlbmREYXRhKTsKICAgICBSZXBseUJ1ZmZlciA9IChWT0lEKikgbWFsbG9jKFJlcGx5U2l6ZSk7CiAgICAgaWYgKFJlcGx5QnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgSWNtcENsb3NlSGFuZGxlKGhJY21wRmlsZSk7CkBAIC01MTAsNDcgKzUyNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZW91dCA8IDEwMDApID8gMTAwMCA6IHRpbWVvdXQpOyAgIC8vIERXT1JEIFRpbWVvdXQKICAgICB9CiAKLSAgICBpZiAoZHdSZXRWYWwgPT0gMCkgeyAvLyBpZiB0aGUgY2FsbCBmYWlsZWQKLSAgICAgICAgVENIQVIgKmJ1ZjsKLSAgICAgICAgRFdPUkQgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIHN3aXRjaCAoZXJyKSB7Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX05PX05FVFdPUks6Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX05FVFdPUktfVU5SRUFDSEFCTEU6Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX0hPU1RfVU5SRUFDSEFCTEU6Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX1BST1RPQ09MX1VOUkVBQ0hBQkxFOgotICAgICAgICAgICAgY2FzZSBFUlJPUl9QT1JUX1VOUkVBQ0hBQkxFOgotICAgICAgICAgICAgY2FzZSBFUlJPUl9SRVFVRVNUX0FCT1JURUQ6Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX0lOQ09SUkVDVF9BRERSRVNTOgotICAgICAgICAgICAgY2FzZSBFUlJPUl9IT1NUX0RPV046Ci0gICAgICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfQ09NUFVURVJOQU1FOgotICAgICAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX05FVE5BTUU6Ci0gICAgICAgICAgICBjYXNlIFdTQUVIT1NUVU5SRUFDSDogICAvKiBIb3N0IFVucmVhY2hhYmxlICovCi0gICAgICAgICAgICBjYXNlIFdTQUVORVRVTlJFQUNIOiAgICAvKiBOZXR3b3JrIFVucmVhY2hhYmxlICovCi0gICAgICAgICAgICBjYXNlIFdTQUVORVRET1dOOiAgICAgICAvKiBOZXR3b3JrIGlzIGRvd24gKi8KLSAgICAgICAgICAgIGNhc2UgV1NBRVBGTk9TVVBQT1JUOiAgIC8qIFByb3RvY29sIEZhbWlseSB1bnN1cHBvcnRlZCAqLwotICAgICAgICAgICAgY2FzZSBJUF9SRVFfVElNRURfT1VUOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZXJyLCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMUFRTVFIpJmJ1ZiwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgTkVUX1Rocm93TmV3KGVudiwgZXJyLCBidWYpOwotICAgICAgICAgICAgICAgIExvY2FsRnJlZShidWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoZHdSZXRWYWwgIT0gMCkgewogICAgICAgICBQSUNNUF9FQ0hPX1JFUExZIHBFY2hvUmVwbHkgPSAoUElDTVBfRUNIT19SRVBMWSlSZXBseUJ1ZmZlcjsKLQotICAgICAgICAvLyBUaGlzIGlzIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSB1bmRvY3VtZW50ZWQgbWluaW11bQotICAgICAgICAvLyB0aW1lb3V0IG1lbnRpb25lZCBpbiB0aGUgSWNtcFNlbmRFY2hvIGNhbGwgYWJvdmUuCi0gICAgICAgIC8vIFdlIHBlcmZvcm0gYW4gZXh0cmEgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgb3VyCi0gICAgICAgIC8vIHJvdW5kdHJpcCB0aW1lIHdhcyBsZXNzIHRoYW4gb3VyIGRlc2lyZWQgdGltZW91dAotICAgICAgICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhhdCB0aW1lb3V0IGlzIDwgMTAwMG1zLgotICAgICAgICBpZiAocEVjaG9SZXBseS0+U3RhdHVzID09IElQX1NVQ0NFU1MKLSAgICAgICAgICAgICAgICAmJiAoaW50KXBFY2hvUmVwbHktPlJvdW5kVHJpcFRpbWUgPD0gdGltZW91dCkKLSAgICAgICAgeworICAgICAgICBpZiAoKGludClwRWNob1JlcGx5LT5Sb3VuZFRyaXBUaW1lIDw9IHRpbWVvdXQpCiAgICAgICAgICAgICByZXQgPSBKTklfVFJVRTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIGZyZWUoUmVwbHlCdWZmZXIpOwpAQCAtNTc2LDcgKzU1Myw2IEBACiAgICAgICAgIGppbnQgZGVzdF9hZGRyID0gMDsKICAgICAgICAgamJ5dGUgY2FkZHJbNF07CiAgICAgICAgIGludCBzejsKLSAgICAgICAgSEFORExFIGhJY21wRmlsZTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29udmVydCBJUCBhZGRyZXNzIGZyb20gYnl0ZSBhcnJheSB0byBpbnRlZ2VyCkBAIC02MDcsMjAgKzU4Myw4IEBACiAgICAgICAgICAgICBzcmNfYWRkciA9IGh0b25sKHNyY19hZGRyKTsKICAgICAgICAgfQogCi0gICAgICAgIGhJY21wRmlsZSA9IEljbXBDcmVhdGVGaWxlKCk7Ci0gICAgICAgIGlmIChoSWNtcEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkgewotICAgICAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBUQ1AgZWNobyBpZiBhY2Nlc3MgaXMgZGVuaWVkIHRvIElDTVAKLSAgICAgICAgICAgICAgICByZXR1cm4gdGNwX3Bpbmc0KGVudiwgYWRkckFycmF5LCB0aW1lb3V0LCBpZkFycmF5LCB0dGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBORVRfVGhyb3dOZXcoZW52LCBlcnIsICJVbmFibGUgdG8gY3JlYXRlIElDTVAgZmlsZSBoYW5kbGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHBpbmc0KGVudiwgc3JjX2FkZHIsIGRlc3RfYWRkciwgdGltZW91dCwgaEljbXBGaWxlKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gcGluZzQoZW52LCBzcmNfYWRkciwgZGVzdF9hZGRyLCB0aW1lb3V0KTsKICAgICB9IGVsc2UgewotICAgICAgICB0Y3BfcGluZzQoZW52LCBhZGRyQXJyYXksIHRpbWVvdXQsIGlmQXJyYXksIHR0bCk7CisgICAgICAgIHd4cF9waW5nNChlbnYsIGFkZHJBcnJheSwgdGltZW91dCwgaWZBcnJheSwgdHRsKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L0luZXQ2QWRkcmVzc0ltcGwuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzSW1wbC5jCmluZGV4IDBlYmQwNjEuLmZmMjRkN2YgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzSW1wbC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvSW5ldDZBZGRyZXNzSW1wbC5jCkBAIC03NCw2ICs3NCwxMyBAQAogICAgIHJldHVybiBKTlVfTmV3U3RyaW5nUGxhdGZvcm0gKGVudiwgaG9zdG5hbWUpOwogfQogCitzdGF0aWMgamNsYXNzIG5pX2lhY2xzOworc3RhdGljIGpjbGFzcyBuaV9pYTRjbHM7CitzdGF0aWMgamNsYXNzIG5pX2lhNmNsczsKK3N0YXRpYyBqbWV0aG9kSUQgbmlfaWE0Y3RySUQ7CitzdGF0aWMgam1ldGhvZElEIG5pX2lhNmN0cklEOworc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKIEpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTAogSmF2YV9qYXZhX25ldF9JbmV0NkFkZHJlc3NJbXBsX2xvb2t1cEFsbEhvc3RBZGRyKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGhvc3QpIHsKQEAgLTgxLDEzICs4OCwzMCBAQAogICAgIGpvYmplY3RBcnJheSByZXQgPSAwOwogICAgIGludCByZXRMZW4gPSAwOwogICAgIGpib29sZWFuIHByZWZlcklQdjZBZGRyZXNzOworICAgIHN0YXRpYyBqZmllbGRJRCBpYV9wcmVmZXJJUHY2QWRkcmVzc0lEOwogCiAgICAgaW50IGVycm9yPTA7CiAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzTmV3ID0gTlVMTDsKIAotICAgIGluaXRJbmV0QWRkcmVzc0lEcyhlbnYpOwotICAgIEpOVV9DSEVDS19FWENFUFRJT05fUkVUVVJOKGVudiwgTlVMTCk7Ci0KKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICBuaV9pYWNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYWNscywgTlVMTCk7CisgICAgICBuaV9pYWNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWFjbHMpOworICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWFjbHMsIE5VTEwpOworICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9uZXQvSW5ldDRBZGRyZXNzIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjbHMsIE5VTEwpOworICAgICAgbmlfaWE0Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTRjbHMpOworICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE0Y2xzLCBOVUxMKTsKKyAgICAgIG5pX2lhNmNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXQ2QWRkcmVzcyIpOworICAgICAgQ0hFQ0tfTlVMTF9SRVRVUk4obmlfaWE2Y2xzLCBOVUxMKTsKKyAgICAgIG5pX2lhNmNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWE2Y2xzKTsKKyAgICAgIENIRUNLX05VTExfUkVUVVJOKG5pX2lhNmNscywgTlVMTCk7CisgICAgICBuaV9pYTRjdHJJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBuaV9pYTRjbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTRjdHJJRCwgTlVMTCk7CisgICAgICBuaV9pYTZjdHJJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBuaV9pYTZjbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgICBDSEVDS19OVUxMX1JFVFVSTihuaV9pYTZjdHJJRCwgTlVMTCk7CisgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgfQogICAgIGlmIChJU19OVUxMKGhvc3QpKSB7CiAgICAgICAgIEpOVV9UaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgImhvc3QgaXMgbnVsbCIpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTk1LDYgKzExOSwxNyBAQAogICAgIGhvc3RuYW1lID0gSk5VX0dldFN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBob3N0LCBKTklfRkFMU0UpOwogICAgIENIRUNLX05VTExfUkVUVVJOKGhvc3RuYW1lLCBOVUxMKTsKIAorICAgIGlmIChpYV9wcmVmZXJJUHY2QWRkcmVzc0lEID09IE5VTEwpIHsKKyAgICAgICAgamNsYXNzIGMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgICAgIGlmIChjKSAgeworICAgICAgICAgICAgaWFfcHJlZmVySVB2NkFkZHJlc3NJRCA9CisgICAgICAgICAgICAgICAgKCplbnYpLT5HZXRTdGF0aWNGaWVsZElEKGVudiwgYywgInByZWZlcklQdjZBZGRyZXNzIiwgIloiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaWFfcHJlZmVySVB2NkFkZHJlc3NJRCA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTlVfUmVsZWFzZVN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBob3N0LCBob3N0bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KICAgICAvKiBnZXQgdGhlIGFkZHJlc3MgcHJlZmVyZW5jZSAqLwogICAgIHByZWZlcklQdjZBZGRyZXNzCiAgICAgICAgID0gKCplbnYpLT5HZXRTdGF0aWNCb29sZWFuRmllbGQoZW52LCBpYV9jbGFzcywgaWFfcHJlZmVySVB2NkFkZHJlc3NJRCk7CkBAIC0xOTYsNyArMjMxLDcgQEAKICAgICAgICAgcmV0TGVuID0gaTsKICAgICAgICAgaXRlcmF0b3IgPSByZXNOZXc7CiAgICAgICAgIGkgPSAwOwotICAgICAgICByZXQgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgcmV0TGVuLCBpYV9jbGFzcywgTlVMTCk7CisgICAgICAgIHJldCA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCByZXRMZW4sIG5pX2lhY2xzLCBOVUxMKTsKIAogICAgICAgICBpZiAoSVNfTlVMTChyZXQpKSB7CiAgICAgICAgICAgICAvKiB3ZSBtYXkgaGF2ZSBtZW1vcnkgdG8gZnJlZSBhdCB0aGUgZW5kIG9mIHRoaXMgKi8KQEAgLTIxMyw3ICsyNDgsNyBAQAogCiAgICAgICAgIHdoaWxlIChpdGVyYXRvciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoaXRlcmF0b3ItPmFpX2ZhbWlseSA9PSBBRl9JTkVUKSB7Ci0gICAgICAgICAgICAgIGpvYmplY3QgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlhNF9jbGFzcywgaWE0X2N0cklEKTsKKyAgICAgICAgICAgICAgam9iamVjdCBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRjdHJJRCk7CiAgICAgICAgICAgICAgIGlmIChJU19OVUxMKGlhT2JqKSkgewogICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwQW5kUmV0dXJuOwpAQCAtMjI0LDcgKzI1OSw3IEBACiAgICAgICAgICAgICAgICAgaW5ldEluZGV4ICsrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVyYXRvci0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAgICAgICAgICAgICAgIGppbnQgc2NvcGUgPSAwLCByZXQxOwotICAgICAgICAgICAgICBqb2JqZWN0IGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTZfY2xhc3MsIGlhNl9jdHJJRCk7CisgICAgICAgICAgICAgIGpvYmplY3QgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNmNscywgbmlfaWE2Y3RySUQpOwogICAgICAgICAgICAgICBpZiAoSVNfTlVMTChpYU9iaikpIHsKICAgICAgICAgICAgICAgICByZXQgPSBOVUxMOwogICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cEFuZFJldHVybjsKQEAgLTMxNCw3ICszNDksNiBAQAogCiAgICAgaWYgKCFlcnJvcikgewogICAgICAgICByZXQgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGhvc3QpOwotICAgICAgICBDSEVDS19OVUxMX1JFVFVSTihyZXQsIE5VTEwpOwogICAgIH0KIAogICAgIGlmIChyZXQgPT0gTlVMTCkgewpAQCAtMzI2LDEwOSArMzYwLDYgQEAKIAogI2lmZGVmIEFGX0lORVQ2CiAKLS8qKgotICogcGluZyBpbXBsZW1lbnRhdGlvbiB1c2luZyB0Y3AgcG9ydCA3IChlY2hvKQotICovCi1zdGF0aWMgamJvb2xlYW4KLXRjcF9waW5nNihKTklFbnYgKmVudiwKLSAgICAgICAgICBqaW50IHRpbWVvdXQsCi0gICAgICAgICAgamludCB0dGwsCi0gICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBoaW02LAotICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIG5ldGlmLAotICAgICAgICAgIGludCBsZW4pCi17Ci0gICAgamludCBmZDsKLSAgICBXU0FFVkVOVCBoRXZlbnQ7Ci0gICAgaW50IGNvbm5lY3RfcnYgPSAtMTsKLQotICAgIGZkID0gTkVUX1NvY2tldChBRl9JTkVUNiwgU09DS19TVFJFQU0sIDApOwotICAgIGlmIChmZCA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICAgICAgLyogbm90ZTogaWYgeW91IHJ1biBvdXQgb2YgZmRzLCB5b3UgbWF5IG5vdCBiZSBhYmxlIHRvIGxvYWQKLSAgICAgICAgICogdGhlIGV4Y2VwdGlvbiBjbGFzcywgYW5kIGdldCBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yCi0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBORVRfVGhyb3dOZXcoZW52LCBlcnJubywgIkNhbid0IGNyZWF0ZSBzb2NrZXQiKTsKLSAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFRUTCB3YXMgc3BlY2lmaWVkLCBsZXQncyBzZXQgdGhlIHNvY2tldCBvcHRpb24uCi0gICAgICovCi0gICAgaWYgKHR0bCA+IDApIHsKLSAgICAgIHNldHNvY2tvcHQoZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9VTklDQVNUX0hPUFMsIChjb25zdCBjaGFyICopJnR0bCwgc2l6ZW9mKHR0bCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgbmV0d29yayBpbnRlcmZhY2Ugd2FzIHNwZWNpZmllZCwgbGV0J3MgYmluZCB0byBpdC4KLSAgICAgKi8KLSAgICBpZiAobmV0aWYgIT0gTlVMTCkgewotICAgICAgaWYgKE5FVF9CaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKiluZXRpZiwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKSA8IDApIHsKLSAgICAgICAgTkVUX1Rocm93TmV3KGVudiwgV1NBR2V0TGFzdEVycm9yKCksICJDYW4ndCBiaW5kIHNvY2tldCB0byBpbnRlcmZhY2UiKTsKLSAgICAgICAgY2xvc2Vzb2NrZXQoZmQpOwotICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2UgdGhlIHNvY2tldCBub24gYmxvY2tpbmcuCi0gICAgICovCi0gICAgaEV2ZW50ID0gV1NBQ3JlYXRlRXZlbnQoKTsKLSAgICBXU0FFdmVudFNlbGVjdChmZCwgaEV2ZW50LCBGRF9SRUFEfEZEX0NPTk5FQ1R8RkRfQ0xPU0UpOwotCi0gICAgLyogbm8gbmVlZCB0byB1c2UgTkVUX0Nvbm5lY3QgYXMgbm9uLWJsb2NraW5nICovCi0gICAgaGltNi5zaW42X3BvcnQgPSBodG9ucygoc2hvcnQpIDcpOyAvKiBFY2hvIHBvcnQgKi8KLSAgICBjb25uZWN0X3J2ID0gY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZoaW02LCBsZW4pOwotCi0gICAgLyoqCi0gICAgICogY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBvciByZWZ1c2VkIGltbWVkaWF0ZWx5LCBlaXRoZXIgd2F5IGl0IG1lYW5zCi0gICAgICogd2Ugd2VyZSBhYmxlIHRvIHJlYWNoIHRoZSBob3N0IQotICAgICAqLwotICAgIGlmIChjb25uZWN0X3J2ID09IDAgfHwgV1NBR2V0TGFzdEVycm9yKCkgPT0gV1NBRUNPTk5SRUZVU0VEKSB7Ci0gICAgICAgIFdTQUNsb3NlRXZlbnQoaEV2ZW50KTsKLSAgICAgICAgY2xvc2Vzb2NrZXQoZmQpOwotICAgICAgICByZXR1cm4gSk5JX1RSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG9wdGxlbjsKLQotICAgICAgICBzd2l0Y2ggKFdTQUdldExhc3RFcnJvcigpKSB7Ci0gICAgICAgIGNhc2UgV1NBRUhPU1RVTlJFQUNIOiAgIC8qIEhvc3QgVW5yZWFjaGFibGUgKi8KLSAgICAgICAgY2FzZSBXU0FFTkVUVU5SRUFDSDogICAgLyogTmV0d29yayBVbnJlYWNoYWJsZSAqLwotICAgICAgICBjYXNlIFdTQUVORVRET1dOOiAgICAgICAvKiBOZXR3b3JrIGlzIGRvd24gKi8KLSAgICAgICAgY2FzZSBXU0FFUEZOT1NVUFBPUlQ6ICAgLyogUHJvdG9jb2wgRmFtaWx5IHVuc3VwcG9ydGVkICovCi0gICAgICAgICAgV1NBQ2xvc2VFdmVudChoRXZlbnQpOwotICAgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKLSAgICAgICAgICByZXR1cm4gSk5JX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFdTQUdldExhc3RFcnJvcigpICE9IFdTQUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICBORVRfVGhyb3dCeU5hbWVXaXRoTGFzdEVycm9yKGVudiwgSk5VX0pBVkFORVRQS0cgIkNvbm5lY3RFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdCBmYWlsZWQiKTsKLSAgICAgICAgICAgIFdTQUNsb3NlRXZlbnQoaEV2ZW50KTsKLSAgICAgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKLSAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICB0aW1lb3V0ID0gTkVUX1dhaXQoZW52LCBmZCwgTkVUX1dBSVRfQ09OTkVDVCwgdGltZW91dCk7Ci0KLSAgICAgICAgaWYgKHRpbWVvdXQgPj0gMCkgewotICAgICAgICAgIC8qIGhhcyBjb25uZWN0aW9uIGJlZW4gZXN0YWJsaXNoZWQ/ICovCi0gICAgICAgICAgb3B0bGVuID0gc2l6ZW9mKGNvbm5lY3RfcnYpOwotICAgICAgICAgIGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgKHZvaWQqKSZjb25uZWN0X3J2LAotICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRsZW4pIDwwKSB7Ci0gICAgICAgICAgICBjb25uZWN0X3J2ID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGNvbm5lY3RfcnYgPT0gMCB8fCBjb25uZWN0X3J2ID09IFdTQUVDT05OUkVGVVNFRCkgewotICAgICAgICAgICAgV1NBQ2xvc2VFdmVudChoRXZlbnQpOwotICAgICAgICAgICAgY2xvc2Vzb2NrZXQoZmQpOwotICAgICAgICAgICAgcmV0dXJuIEpOSV9UUlVFOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBXU0FDbG9zZUV2ZW50KGhFdmVudCk7Ci0gICAgY2xvc2Vzb2NrZXQoZmQpOwotICAgIHJldHVybiBKTklfRkFMU0U7Ci19CiAKIC8qKgogICogcGluZyBpbXBsZW1lbnRhdGlvbi4KQEAgLTQ0MCw5ICszNzEsOSBAQAogcGluZzYoSk5JRW52ICplbnYsCiAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzcmMsCiAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBkZXN0LAotICAgICAgamludCB0aW1lb3V0LAotICAgICAgSEFORExFIGhJY21wRmlsZSkKKyAgICAgIGppbnQgdGltZW91dCkKIHsKKyAgICBIQU5ETEUgaEljbXBGaWxlOwogICAgIERXT1JEIGR3UmV0VmFsID0gMDsKICAgICBjaGFyIFNlbmREYXRhWzMyXSA9IHswfTsKICAgICBMUFZPSUQgUmVwbHlCdWZmZXIgPSBOVUxMOwpAQCAtNDUwLDYgKzM4MSwxMiBAQAogICAgIElQX09QVElPTl9JTkZPUk1BVElPTiBpcEluZm8gPSB7MjU1LCAwLCAwLCAwLCBOVUxMfTsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhNlNvdXJjZTsKIAorICAgIGhJY21wRmlsZSA9IEljbXA2Q3JlYXRlRmlsZSgpOworICAgIGlmIChoSWNtcEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgTkVUX1Rocm93TmV3KGVudiwgV1NBR2V0TGFzdEVycm9yKCksICJVbmFibGUgdG8gb3BlbiBoYW5kbGUiKTsKKyAgICAgICAgcmV0dXJuIEpOSV9GQUxTRTsKKyAgICB9CisKICAgICBSZXBseVNpemUgPSBzaXplb2YoSUNNUFY2X0VDSE9fUkVQTFkpICsgc2l6ZW9mKFNlbmREYXRhKTsKICAgICBSZXBseUJ1ZmZlciA9IChWT0lEKikgbWFsbG9jKFJlcGx5U2l6ZSk7CiAgICAgaWYgKFJlcGx5QnVmZmVyID09IE5VTEwpIHsKQEAgLTUwOCw3ICs0NDUsNyBAQAogICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYqIG5ldGlmID0gTlVMTDsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGluZjY7CiAgICAgaW50IGxlbiA9IDA7Ci0gICAgSEFORExFIGhJY21wRmlsZTsKKyAgICBpbnQgY29ubmVjdF9ydiA9IC0xOwogCiAgICAgLyoKICAgICAgKiBJZiBJUHY2IGlzIG5vdCBlbmFibGUsIHRoZW4gd2UgY2FuJ3QgcmVhY2ggYW4gSVB2NiBhZGRyZXNzLCBjYW4gd2U/CkBAIC01NTIsMjEgKzQ4OSw3IEBACiAgICAgICBpbmY2LnNpbjZfc2NvcGVfaWQgPSBpZl9zY29wZTsKICAgICAgIG5ldGlmID0gJmluZjY7CiAgICAgfQotCi0gICAgaEljbXBGaWxlID0gSWNtcDZDcmVhdGVGaWxlKCk7Ci0gICAgaWYgKGhJY21wRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgICBpbnQgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnIgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkgewotICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIFRDUCBlY2hvIGlmIGFjY2VzcyBpcyBkZW5pZWQgdG8gSUNNUAotICAgICAgICAgICAgcmV0dXJuIHRjcF9waW5nNihlbnYsIHRpbWVvdXQsIHR0bCwgaGltNiwgbmV0aWYsIGxlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBORVRfVGhyb3dOZXcoZW52LCBlcnIsICJVbmFibGUgdG8gY3JlYXRlIElDTVAgZmlsZSBoYW5kbGUiKTsKLSAgICAgICAgICAgIHJldHVybiBKTklfRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcGluZzYoZW52LCBuZXRpZiwgJmhpbTYsIHRpbWVvdXQsIGhJY21wRmlsZSk7Ci0gICAgfQotCisgICAgcmV0dXJuIHBpbmc2KGVudiwgbmV0aWYsICZoaW02LCB0aW1lb3V0KTsKICNlbmRpZiAvKiBBRl9JTkVUNiAqLwogICAgIHJldHVybiBKTklfRkFMU0U7CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2UuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCmluZGV4IDRkYzIyYTAuLjY0ODNmMTIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5jCkBAIC02NSw2ICs2NSwxMyBAQAogamZpZWxkSUQgbmlfbmFtZUlEOyAgICAgICAgIC8qIE5ldHdvcmtJbnRlcmZhY2UubmFtZSAqLwogamZpZWxkSUQgbmlfZGlzcGxheU5hbWVJRDsgIC8qIE5ldHdvcmtJbnRlcmZhY2UuZGlzcGxheU5hbWUgKi8KIGpmaWVsZElEIG5pX2NoaWxkc0lEOyAgICAgICAvKiBOZXR3b3JrSW50ZXJmYWNlLmNoaWxkcyAqLworamNsYXNzIG5pX2lhY2xzOyAgICAgICAgICAgIC8qIEluZXRBZGRyZXNzICovCisKK2pjbGFzcyBuaV9pYTRjbHM7ICAgICAgICAgICAvKiBJbmV0NEFkZHJlc3MgKi8KK2ptZXRob2RJRCBuaV9pYTRDdG9yOyAgICAgICAvKiBJbmV0NEFkZHJlc3MoKSAqLworCitqY2xhc3MgbmlfaWE2Y2xzOyAgICAgICAgICAgLyogSW5ldDZBZGRyZXNzICovCitqbWV0aG9kSUQgbmlfaWE2Y3RySUQ7ICAgICAgLyogSW5ldDZBZGRyZXNzKCkgKi8KIAogamNsYXNzIG5pX2liY2xzOyAgICAgICAgICAgIC8qIEludGVyZmFjZUFkZHJlc3MgKi8KIGptZXRob2RJRCBuaV9pYmN0cklEOyAgICAgICAvKiBJbnRlcmZhY2VBZGRyZXNzKCkgKi8KQEAgLTUwOCw2ICs1MTUsMjYgQEAKICAgICBDSEVDS19OVUxMKG5pX2NoaWxkc0lEKTsKICAgICBuaV9jdG9yID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIG5pX2NsYXNzLCAiPGluaXQ+IiwgIigpViIpOwogICAgIENIRUNLX05VTEwobmlfY3Rvcik7CisKKyAgICBuaV9pYWNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXRBZGRyZXNzIik7CisgICAgQ0hFQ0tfTlVMTChuaV9pYWNscyk7CisgICAgbmlfaWFjbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIG5pX2lhY2xzKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhY2xzKTsKKworICAgIG5pX2lhNGNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0luZXQ0QWRkcmVzcyIpOworICAgIENIRUNLX05VTEwobmlfaWE0Y2xzKTsKKyAgICBuaV9pYTRjbHMgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIG5pX2lhNGNscyk7CisgICAgQ0hFQ0tfTlVMTChuaV9pYTRjbHMpOworICAgIG5pX2lhNEN0b3IgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgbmlfaWE0Y2xzLCAiPGluaXQ+IiwgIigpViIpOworICAgIENIRUNLX05VTEwobmlfaWE0Q3Rvcik7CisKKyAgICBuaV9pYTZjbHMgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL25ldC9JbmV0NkFkZHJlc3MiKTsKKyAgICBDSEVDS19OVUxMKG5pX2lhNmNscyk7CisgICAgbmlfaWE2Y2xzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBuaV9pYTZjbHMpOworICAgIENIRUNLX05VTEwobmlfaWE2Y2xzKTsKKyAgICBuaV9pYTZjdHJJRCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBuaV9pYTZjbHMsICI8aW5pdD4iLCAiKClWIik7CisgICAgQ0hFQ0tfTlVMTChuaV9pYTZjdHJJRCk7CisKICAgICBuaV9pYmNscyA9ICgqZW52KS0+RmluZENsYXNzKGVudiwgImphdmEvbmV0L0ludGVyZmFjZUFkZHJlc3MiKTsKICAgICBDSEVDS19OVUxMKG5pX2liY2xzKTsKICAgICBuaV9pYmNscyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgbmlfaWJjbHMpOwpAQCAtNTE5LDkgKzU0Niw2IEBACiAgICAgbmlfaWJicm9hZGNhc3RJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2liY2xzLCAiYnJvYWRjYXN0IiwgIkxqYXZhL25ldC9JbmV0NEFkZHJlc3M7Iik7CiAgICAgQ0hFQ0tfTlVMTChuaV9pYmJyb2FkY2FzdElEKTsKICAgICBuaV9pYm1hc2tJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIG5pX2liY2xzLCAibWFza0xlbmd0aCIsICJTIik7Ci0gICAgQ0hFQ0tfTlVMTChuaV9pYm1hc2tJRCk7Ci0KLSAgICBpbml0SW5ldEFkZHJlc3NJRHMoZW52KTsKIH0KIAogLyoKQEAgLTU2Nyw3ICs1OTEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgYWRkckFyciA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBuZXRhZGRyQ291bnQsIGlhX2NsYXNzLCBOVUxMKTsKKyAgICBhZGRyQXJyID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIG5ldGFkZHJDb3VudCwgbmlfaWFjbHMsIE5VTEwpOwogICAgIGlmIChhZGRyQXJyID09IE5VTEwpIHsKICAgICAgICAgZnJlZV9uZXRhZGRyKG5ldGFkZHJQKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01ODUsNyArNjA5LDcgQEAKICAgICAgICAgam9iamVjdCBpYU9iaiwgaWEyT2JqOwogICAgICAgICBqb2JqZWN0IGliT2JqID0gTlVMTDsKICAgICAgICAgaWYgKGFkZHJzLT5hZGRyLmhpbS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewotICAgICAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlhNF9jbGFzcywgaWE0X2N0cklEKTsKKyAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9pYTRjbHMsIG5pX2lhNEN0b3IpOwogICAgICAgICAgICAgaWYgKGlhT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBmcmVlX25ldGFkZHIobmV0YWRkclApOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjAwLDcgKzYyNCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIGliT2JqLCBuaV9pYmFkZHJlc3NJRCwgaWFPYmopOwotICAgICAgICAgICAgICBpYTJPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlhNF9jbGFzcywgaWE0X2N0cklEKTsKKyAgICAgICAgICAgICAgaWEyT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9pYTRjbHMsIG5pX2lhNEN0b3IpOwogICAgICAgICAgICAgICBpZiAoaWEyT2JqID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBmcmVlX25ldGFkZHIobmV0YWRkclApOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjEyLDcgKzYzNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSAvKiBBRl9JTkVUNiAqLyB7CiAgICAgICAgICAgICBpbnQgc2NvcGU7Ci0gICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE2X2NsYXNzLCBpYTZfY3RySUQpOworICAgICAgICAgICAgaWFPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2lhNmNscywgbmlfaWE2Y3RySUQpOwogICAgICAgICAgICAgaWYgKGlhT2JqKSB7CiAgICAgICAgICAgICAgICAgaW50IHJldCA9IHNldEluZXQ2QWRkcmVzc19pcGFkZHJlc3MoZW52LCBpYU9iaiwgIChqYnl0ZSAqKSYoYWRkcnMtPmFkZHIuaGltNi5zaW42X2FkZHIuczZfYWRkcikpOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSk5JX0ZBTFNFKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2UuaCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5oCmluZGV4IDNiZjRlZDAuLmZjNDA5MDYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5oCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZS5oCkBAIC03MCw2ICs3MCwxNiBAQAogZXh0ZXJuIGpmaWVsZElEIG5pX2Rpc3BsYXlOYW1lSUQ7ICAgLyogTmV0d29ya0ludGVyZmFjZS5kaXNwbGF5TmFtZSAqLwogZXh0ZXJuIGpmaWVsZElEIG5pX2NoaWxkc0lEOyAgICAgICAgLyogTmV0d29ya0ludGVyZmFjZS5jaGlsZHMgKi8KIAorZXh0ZXJuIGpjbGFzcyBuaV9pYWNsczsgICAgICAgICAgICAgLyogSW5ldEFkZHJlc3MgKi8KKworZXh0ZXJuIGpjbGFzcyBuaV9pYTRjbHM7ICAgICAgICAgICAgLyogSW5ldDRBZGRyZXNzICovCitleHRlcm4gam1ldGhvZElEIG5pX2lhNEN0b3I7ICAgICAgICAvKiBJbmV0NEFkZHJlc3MoKSAqLworCitleHRlcm4gamNsYXNzIG5pX2lhNmNsczsgICAgICAgICAgICAvKiBJbmV0NkFkZHJlc3MgKi8KK2V4dGVybiBqbWV0aG9kSUQgbmlfaWE2Y3RySUQ7ICAgICAgIC8qIEluZXQ2QWRkcmVzcygpICovCitleHRlcm4gamZpZWxkSUQgbmlfaWE2aXBhZGRyZXNzSUQ7CitleHRlcm4gamZpZWxkSUQgbmlfaWE2aXBhZGRyZXNzSUQ7CisKIGV4dGVybiBqY2xhc3MgbmlfaWJjbHM7ICAgICAgICAgICAgIC8qIEludGVyZmFjZUFkZHJlc3MgKi8KIGV4dGVybiBqbWV0aG9kSUQgbmlfaWJjdHJJRDsgICAgICAgIC8qIEludGVyZmFjZUFkZHJlc3MoKSAqLwogZXh0ZXJuIGpmaWVsZElEIG5pX2liYWRkcmVzc0lEOyAgICAgLyogSW50ZXJmYWNlQWRkcmVzcy5hZGRyZXNzICovCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L05ldHdvcmtJbnRlcmZhY2Vfd2luWFAuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZV93aW5YUC5jCmluZGV4IDgwMDNhYmMuLjQwNDJkMTYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZV93aW5YUC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvTmV0d29ya0ludGVyZmFjZV93aW5YUC5jCkBAIC00ODksMjAgKzQ4OSwxNCBAQAogICAgICAqIENyZWF0ZSBhIE5ldHdvcmtJbnRlcmZhY2Ugb2JqZWN0IGFuZCBwb3B1bGF0ZSBpdAogICAgICAqLwogICAgIG5ldGlmT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9jbGFzcywgbmlfY3Rvcik7Ci0gICAgaWYgKG5ldGlmT2JqID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogICAgIG5hbWUgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIGlmcy0+bmFtZSk7Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKGlmcy0+ZE5hbWVJc1VuaWNvZGUpIHsKICAgICAgICAgZGlzcGxheU5hbWUgPSAoKmVudiktPk5ld1N0cmluZyhlbnYsIChQV0NIQVIpaWZzLT5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanNpemUpd2NzbGVuICgoUFdDSEFSKWlmcy0+ZGlzcGxheU5hbWUpKTsKICAgICB9IGVsc2UgewogICAgICAgICBkaXNwbGF5TmFtZSA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgaWZzLT5kaXNwbGF5TmFtZSk7CiAgICAgfQotICAgIGlmIChkaXNwbGF5TmFtZSA9PSBOVUxMKSB7CisgICAgaWYgKG5ldGlmT2JqID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMIHx8IGRpc3BsYXlOYW1lID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBuZXRpZk9iaiwgbmlfbmFtZUlELCBuYW1lKTsKQEAgLTUxOSw3ICs1MTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgYWRkckFyciA9ICgqZW52KS0+TmV3T2JqZWN0QXJyYXkoZW52LCBuZXRhZGRyQ291bnQsIGlhX2NsYXNzLCBOVUxMKTsKKyAgICBhZGRyQXJyID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIG5ldGFkZHJDb3VudCwgbmlfaWFjbHMsIE5VTEwpOwogICAgIGlmIChhZGRyQXJyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNTM3LDcgKzUzMSw3IEBACiAgICAgICAgIGpvYmplY3QgaWFPYmosIGlhMk9iajsKICAgICAgICAgam9iamVjdCBpYk9iaiA9IE5VTEw7CiAgICAgICAgIGlmIChhZGRycy0+YWRkci5oaW0uc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBpYTRfY2xhc3MsIGlhNF9jdHJJRCk7CisgICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRDdG9yKTsKICAgICAgICAgICAgIGlmIChpYU9iaiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC01NTEsNyArNTQ1LDcgQEAKICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgaWJPYmosIG5pX2liYWRkcmVzc0lELCBpYU9iaik7Ci0gICAgICAgICAgICBpYTJPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIGlhNF9jbGFzcywgaWE0X2N0cklEKTsKKyAgICAgICAgICAgIGlhMk9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgbmlfaWE0Y2xzLCBuaV9pYTRDdG9yKTsKICAgICAgICAgICAgIGlmIChpYTJPYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICBmcmVlX25ldGFkZHIobmV0YWRkclApOwogICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTU2MiwyOCArNTU2LDI2IEBACiAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGJpbmRzQXJyLCBiaW5kX2luZGV4KyssIGliT2JqKTsKICAgICAgICAgfSBlbHNlIC8qIEFGX0lORVQ2ICovIHsKICAgICAgICAgICAgIGludCBzY29wZTsKLSAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBpYU9iaiA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgaWE2X2NsYXNzLCBpYTZfY3RySUQpOwotICAgICAgICAgICAgaWYgKGlhT2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlhT2JqID0gKCplbnYpLT5OZXdPYmplY3QoZW52LCBuaV9pYTZjbHMsIG5pX2lhNmN0cklEKTsKKyAgICAgICAgICAgIGlmIChpYU9iaikgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBzZXRJbmV0NkFkZHJlc3NfaXBhZGRyZXNzKGVudiwgaWFPYmosIChqYnl0ZSAqKSYoYWRkcnMtPmFkZHIuaGltNi5zaW42X2FkZHIuczZfYWRkcikpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gSk5JX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29wZSA9IGFkZHJzLT5hZGRyLmhpbTYuc2luNl9zY29wZV9pZDsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGUgIT0gMCkgeyAvKiB6ZXJvIGlzIGRlZmF1bHQgdmFsdWUsIG5vIG5lZWQgdG8gc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHNldEluZXQ2QWRkcmVzc19zY29wZWlkKGVudiwgaWFPYmosIHNjb3BlKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5ldDZBZGRyZXNzX3Njb3BlaWZuYW1lKGVudiwgaWFPYmosIG5ldGlmT2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWJPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2liY2xzLCBuaV9pYmN0cklEKTsKKyAgICAgICAgICAgICAgICBpZiAoaWJPYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgZnJlZV9uZXRhZGRyKG5ldGFkZHJQKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEZpZWxkKGVudiwgaWJPYmosIG5pX2liYWRkcmVzc0lELCBpYU9iaik7CisgICAgICAgICAgICAgICAgKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgaWJPYmosIG5pX2libWFza0lELCBhZGRycy0+bWFzayk7CisgICAgICAgICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBiaW5kc0FyciwgYmluZF9pbmRleCsrLCBpYk9iaik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSBzZXRJbmV0NkFkZHJlc3NfaXBhZGRyZXNzKGVudiwgaWFPYmosIChqYnl0ZSAqKSYoYWRkcnMtPmFkZHIuaGltNi5zaW42X2FkZHIuczZfYWRkcikpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBKTklfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjb3BlID0gYWRkcnMtPmFkZHIuaGltNi5zaW42X3Njb3BlX2lkOwotICAgICAgICAgICAgaWYgKHNjb3BlICE9IDApIHsgLyogemVybyBpcyBkZWZhdWx0IHZhbHVlLCBubyBuZWVkIHRvIHNldCAqLwotICAgICAgICAgICAgICAgIHNldEluZXQ2QWRkcmVzc19zY29wZWlkKGVudiwgaWFPYmosIHNjb3BlKTsKLSAgICAgICAgICAgICAgICBzZXRJbmV0NkFkZHJlc3Nfc2NvcGVpZm5hbWUoZW52LCBpYU9iaiwgbmV0aWZPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWJPYmogPSAoKmVudiktPk5ld09iamVjdChlbnYsIG5pX2liY2xzLCBuaV9pYmN0cklEKTsKLSAgICAgICAgICAgIGlmIChpYk9iaiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgIGZyZWVfbmV0YWRkcihuZXRhZGRyUCk7Ci0gICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIGliT2JqLCBuaV9pYmFkZHJlc3NJRCwgaWFPYmopOwotICAgICAgICAgICAgKCplbnYpLT5TZXRTaG9ydEZpZWxkKGVudiwgaWJPYmosIG5pX2libWFza0lELCBhZGRycy0+bWFzayk7Ci0gICAgICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGJpbmRzQXJyLCBiaW5kX2luZGV4KyssIGliT2JqKTsKICAgICAgICAgfQogICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGFkZHJBcnIsIGFkZHJfaW5kZXgsIGlhT2JqKTsKICAgICAgICAgYWRkcnMgPSBhZGRycy0+bmV4dDsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvVHdvU3RhY2tzUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvVHdvU3RhY2tzUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYwppbmRleCAzNTZmNDg2Li4zYjE5OTRkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9Ud29TdGFja3NQbGFpbkRhdGFncmFtU29ja2V0SW1wbC5jCkBAIC04MzgsNyArODM4LDYgQEAKICAgICB9CiAgICAgaWYgKElTX05VTEwoYWRkcmVzc09iaikpIHsKICAgICAgICAgSk5VX1Rocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAiTnVsbCBhZGRyZXNzIGluIHBlZWsoKSIpOwotICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWRkcmVzcyA9IGdldEluZXRBZGRyZXNzX2FkZHIoZW52LCBhZGRyZXNzT2JqKTsKICAgICAgICAgLyogV2Ugb25seSBoYW5kbGUgSVB2NCBmb3Igbm93LiBXaWxsIHN1cHBvcnQgSVB2NiBvbmNlIGl0cyBpbiB0aGUgb3MgKi8KQEAgLTExNTEsMjMgKzExNTAsMTEgQEAKICAgICB9CiAgICAgaWYgKG4gPT0gLTEpIHsKICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsICJzb2NrZXQgY2xvc2VkIik7Ci0gICAgICAgIGlmIChwYWNrZXRCdWZmZXJMZW4gPiBNQVhfQlVGRkVSX0xFTikgewotICAgICAgICAgICAgZnJlZShmdWxsUGFja2V0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIGlmIChuID09IC0yKSB7CiAgICAgICAgIEpOVV9UaHJvd0J5TmFtZShlbnYsIEpOVV9KQVZBSU9QS0cgIkludGVycnVwdGVkSU9FeGNlcHRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiBpbnRlcnJ1cHRlZCIpOwotICAgICAgICBpZiAocGFja2V0QnVmZmVyTGVuID4gTUFYX0JVRkZFUl9MRU4pIHsKLSAgICAgICAgICAgIGZyZWUoZnVsbFBhY2tldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSBpZiAobiA8IDApIHsKICAgICAgICAgTkVUX1Rocm93Q3VycmVudChlbnYsICJEYXRhZ3JhbSByZWNlaXZlIGZhaWxlZCIpOwotICAgICAgICBpZiAocGFja2V0QnVmZmVyTGVuID4gTUFYX0JVRkZFUl9MRU4pIHsKLSAgICAgICAgICAgIGZyZWUoZnVsbFBhY2tldCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGpvYmplY3QgcGFja2V0QWRkcmVzczsKIApAQCAtMTkyNyw3ICsxOTE0LDcgQEAKICAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAgICBKTlVfVGhyb3dCeU5hbWUoZW52LCBKTlVfSkFWQU5FVFBLRyAiU29ja2V0RXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgICAiU29ja2V0IG9wdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IFBsYWluRGF0YWdyYW1Tb2NrZXRJbXAiKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgfQogCkBAIC0yMzcwLDcgKzIzNTcsNiBAQAogICAgICAgaWYgKE5FVF9TZXRTb2NrT3B0KGZkLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCAoY2hhciopJml0dGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChpdHRsKSkgPCAwKSB7CiAgICAgICAgIE5FVF9UaHJvd0N1cnJlbnQoZW52LCAic2V0IElQX01VTFRJQ0FTVF9UVEwgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CiAKQEAgLTI1NjQsOSArMjU1MCw2IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZmluZGV4ID0gZ2V0SW5kZXhGcm9tSWYgKGVudiwgbmlPYmopOwogICAgICAgICAgICAgaWYgKGlmaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25PY2N1cnJlZChlbnYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgTkVUX1Rocm93Q3VycmVudChlbnYsICJnZXQgaWZpbmRleCBmYWlsZWQiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluU29ja2V0SW1wbC5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25ldC9Ud29TdGFja3NQbGFpblNvY2tldEltcGwuYwppbmRleCA2ZTdlYTcxLi44OTlkNWRlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbmV0L1R3b1N0YWNrc1BsYWluU29ja2V0SW1wbC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uZXQvVHdvU3RhY2tzUGxhaW5Tb2NrZXRJbXBsLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgIHBzaV9wb3J0SUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJwb3J0IiwgIkkiKTsKICAgICBDSEVDS19OVUxMKHBzaV9wb3J0SUQpOwogICAgIHBzaV9sYXN0ZmRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgImxhc3RmZCIsICJJIik7Ci0gICAgQ0hFQ0tfTlVMTChwc2lfbGFzdGZkSUQpOworICAgIENIRUNLX05VTEwocHNpX3BvcnRJRCk7CiAgICAgcHNpX2xvY2FscG9ydElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAibG9jYWxwb3J0IiwgIkkiKTsKICAgICBDSEVDS19OVUxMKHBzaV9sb2NhbHBvcnRJRCk7CiAgICAgcHNpX3RpbWVvdXRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgInRpbWVvdXQiLCAiSSIpOwpAQCAtMTU0LDE3ICsxNTQsMTcgQEAKICAgICAgICAgZmQxT2JqID0gKCplbnYpLT5HZXRPYmplY3RGaWVsZChlbnYsIHRoaXMsIHBzaV9mZDFJRCk7CiAKICAgICAgICAgaWYgKElTX05VTEwoZmQxT2JqKSkgewotICAgICAgICAgICAgKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGZkT2JqLCBJT19mZF9mZElELCAtMSk7Ci0gICAgICAgICAgICBORVRfU29ja2V0Q2xvc2UoZmQpOwogICAgICAgICAgICAgSk5VX1Rocm93QnlOYW1lKGVudiwgSk5VX0pBVkFORVRQS0cgIlNvY2tldEV4Y2VwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgZmQxIG9iamVjdCIpOworICAgICAgICAgICAgKCplbnYpLT5TZXRJbnRGaWVsZChlbnYsIGZkT2JqLCBJT19mZF9mZElELCAtMSk7CisgICAgICAgICAgICBORVRfU29ja2V0Q2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZkMSA9IHNvY2tldChBRl9JTkVUNiwgKHN0cmVhbSA/IFNPQ0tfU1RSRUFNOiBTT0NLX0RHUkFNKSwgMCk7CiAgICAgICAgIGlmIChmZDEgPT0gLTEpIHsKKyAgICAgICAgICAgIE5FVF9UaHJvd0N1cnJlbnQoZW52LCAiY3JlYXRlIik7CiAgICAgICAgICAgICAoKmVudiktPlNldEludEZpZWxkKGVudiwgZmRPYmosIElPX2ZkX2ZkSUQsIC0xKTsKICAgICAgICAgICAgIE5FVF9Tb2NrZXRDbG9zZShmZCk7Ci0gICAgICAgICAgICBORVRfVGhyb3dDdXJyZW50KGVudiwgImNyZWF0ZSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU2V0IHNvY2tldCBhdHRyaWJ1dGUgc28gaXQgaXMgbm90IHBhc3NlZCB0byBhbnkgY2hpbGQgcHJvY2VzcyAqLwpAQCAtOTExLDcgKzkxMSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGlzUmN2VGltZW91dFN1cHBvcnRlZCA9IEpOSV9GQUxTRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBORVRfVGhyb3dDdXJyZW50KGVudiwgInNldHNvY2tvcHQgU09fUkNWVElNRU8iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmZDEgIT0gLTEpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9uaW8vTWFwcGVkQnl0ZUJ1ZmZlci5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyLmMKaW5kZXggMDVmNTY4MC4uNDg4MDEyMyAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL25pby9NYXBwZWRCeXRlQnVmZmVyLmMKQEAgLTgzLDkgKzgzLDkgQEAKICAgICAgICAgSEFORExFIGg7CiAgICAgICAgIGlmIChoYW5kbGVfZmRJRCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBqY2xhc3MgY2xhenogPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIik7Ci0gICAgICAgICAgICBDSEVDS19OVUxMKGNsYXp6KTsgLy9leGNlcHRpb24gdGhyb3duCisgICAgICAgICAgICBpZiAoY2xhenogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIGV4Y2VwdGlvbiB0aHJvd24KICAgICAgICAgICAgIGhhbmRsZV9mZElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xhenosICJoYW5kbGUiLCAiSiIpOwotICAgICAgICAgICAgQ0hFQ0tfTlVMTChoYW5kbGVfZmRJRCk7CiAgICAgICAgIH0KICAgICAgICAgaCA9IGpsb25nX3RvX3B0cigoKmVudiktPkdldExvbmdGaWVsZChlbnYsIGZkbywgaGFuZGxlX2ZkSUQpKTsKICAgICAgICAgcmVzdWx0ID0gRmx1c2hGaWxlQnVmZmVycyhoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL2JyaWRnZS9XaW5BY2Nlc3NCcmlkZ2UuY3BwIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vYnJpZGdlL1dpbkFjY2Vzc0JyaWRnZS5jcHAKaW5kZXggMjBiNWQ3Yy4uZWQ0MjYzMSAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vYnJpZGdlL1dpbkFjY2Vzc0JyaWRnZS5jcHAKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vYnJpZGdlL1dpbkFjY2Vzc0JyaWRnZS5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogCiAgICAgUHJpbnREZWJ1Z1N0cmluZygiV2luQWNjZXNzQnJpZGdlOjpnZXRBY2Nlc3NpYmxlQ29udGV4dFdpdGhGb2N1cyglcCwgJVgsICkiLCB3aW5kb3csIHZtSUQpOwogICAgIC8vIGZpbmQgdm1JRCwgZXRjLiBmcm9tIEhXTkQ7IGFzayB0aGF0IFZNIGZvciB0aGUgQUMgdy9Gb2N1cwotICAgIEhXTkQgcGtnVk1JRDsKKyAgICAgICAgSFdORCBwa2dWTUlEID0gKEhXTkQpQUJMb25nVG9IYW5kbGUoIHBrZy0+clZNSUQgKSA7CiAgICAgaWYgKGdldEFjY2Vzc2libGVDb250ZXh0RnJvbUhXTkQod2luZG93LCAobG9uZyAqKSYocGtnVk1JRCksICYocGtnLT5yQWNjZXNzaWJsZUNvbnRleHQpKSA9PSBUUlVFKSB7CiAgICAgICAgIEhXTkQgZGVzdEFCV2luZG93ID0gamF2YVZNcy0+ZmluZEFjY2Vzc0JyaWRnZVdpbmRvdygobG9uZylwa2dWTUlEKTsgICAgIC8vIGluZWZmZWNpZW50IFtbW0ZJWE1FXV1dCiAgICAgICAgIGlmIChzZW5kTWVtb3J5UGFja2FnZShidWZmZXIsIHNpemVvZihidWZmZXIpLCBkZXN0QUJXaW5kb3cpID09IFRSVUUpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL2phdmEyZC93aW5kb3dzL0dESVdpbmRvd1N1cmZhY2VEYXRhLmNwcCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL2phdmEyZC93aW5kb3dzL0dESVdpbmRvd1N1cmZhY2VEYXRhLmNwcAppbmRleCAzZTcwNmM0Li4xYjViNzFmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9qYXZhMmQvd2luZG93cy9HRElXaW5kb3dTdXJmYWNlRGF0YS5jcHAKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vamF2YTJkL3dpbmRvd3MvR0RJV2luZG93U3VyZmFjZURhdGEuY3BwCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBoREMgPSBjb21wLT5HZXREQ0Zyb21Db21wb25lbnQoKTsKLSAgICAgICAgICAgIGlmIChoREMgIT0gTlVMTCAmJiB3c2RvLT5kZXZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGhEQyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgOjpTZWxlY3RPYmplY3QoaERDLCBudWxsYnJ1c2gpOwogICAgICAgICAgICAgICAgIDo6U2VsZWN0T2JqZWN0KGhEQywgbnVsbHBlbik7CiAgICAgICAgICAgICAgICAgOjpTZWxlY3RDbGlwUmduKGhEQywgKEhSR04pIE5VTEwpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vbmlvL2NoL0lPVXRpbC5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vbmlvL2NoL0lPVXRpbC5jCmluZGV4IDQ5ZGUxZWIuLjM3MGRjZjUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL25pby9jaC9JT1V0aWwuYworKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9uaW8vY2gvSU9VdGlsLmMKQEAgLTMzLDcgKzMzLDYgQEAKIAogI2luY2x1ZGUgIm5pby5oIgogI2luY2x1ZGUgIm5pb191dGlsLmgiCi0jaW5jbHVkZSAibmV0X3V0aWwuaCIKICNpbmNsdWRlICJzdW5fbmlvX2NoX0lPVXRpbC5oIgogCiAvKiBmaWVsZCBpZCBmb3IgamxvbmcgJ2hhbmRsZScgaW4gamF2YS5pby5GaWxlRGVzY3JpcHRvciB1c2VkIGZvciBmaWxlIGZkcyAqLwpAQCAtNTYsNyArNTUsNiBAQAogICAgIENIRUNLX05VTEwoY2xhenogPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yIikpOwogICAgIENIRUNLX05VTEwoZmRfZmRJRCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNsYXp6LCAiZmQiLCAiSSIpKTsKICAgICBDSEVDS19OVUxMKGhhbmRsZV9mZElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xhenosICJoYW5kbGUiLCAiSiIpKTsKLSAgICBpbml0SW5ldEFkZHJlc3NJRHMoZW52KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9zZWN1cml0eS9tc2NhcGkvc2VjdXJpdHkuY3BwIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vc2VjdXJpdHkvbXNjYXBpL3NlY3VyaXR5LmNwcAppbmRleCA1Nzk2YzMwLi41NTNkZDQyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi9zZWN1cml0eS9tc2NhcGkvc2VjdXJpdHkuY3BwCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3NlY3VyaXR5L21zY2FwaS9zZWN1cml0eS5jcHAKQEAgLTM1Miw1MCArMzUyLDM4IEBACiAgICAgICAgICAgICBCT09MIGJIYXNOb1ByaXZhdGVLZXkgPSBGQUxTRTsKICAgICAgICAgICAgIERXT1JEIGR3UHVibGljS2V5TGVuZ3RoID0gMDsKIAotICAgICAgICAgICAgLy8gRmlyc3QsIHByb2JlIGl0IHNpbGVudGx5Ci0gICAgICAgICAgICBpZiAoOjpDcnlwdEFjcXVpcmVDZXJ0aWZpY2F0ZVByaXZhdGVLZXkocENlcnRDb250ZXh0LCBDUllQVF9BQ1FVSVJFX1NJTEVOVF9GTEFHLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAmaENyeXB0UHJvdiwgJmR3S2V5U3BlYywgJmJDYWxsZXJGcmVlUHJvdikgPT0gRkFMU0UKLSAgICAgICAgICAgICAgICAmJiBHZXRMYXN0RXJyb3IoKSAhPSBOVEVfU0lMRU5UX0NPTlRFWFQpCisgICAgICAgICAgICBpZiAoOjpDcnlwdEFjcXVpcmVDZXJ0aWZpY2F0ZVByaXZhdGVLZXkocENlcnRDb250ZXh0LCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQ3J5cHRQcm92LCAmZHdLZXlTcGVjLCAmYkNhbGxlckZyZWVQcm92KSA9PSBGQUxTRSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBiSGFzTm9Qcml2YXRlS2V5ID0gVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYkNhbGxlckZyZWVQcm92ID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgOjpDcnlwdFJlbGVhc2VDb250ZXh0KGhDcnlwdFByb3YsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBiQ2FsbGVyRnJlZVByb3YgPSBGQUxTRTsKLSAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBTZWNvbmQsIGFjcXVpcmUgdGhlIGtleSBub3JtYWxseSAobm90IHNpbGVudGx5KQotICAgICAgICAgICAgICAgIGlmICg6OkNyeXB0QWNxdWlyZUNlcnRpZmljYXRlUHJpdmF0ZUtleShwQ2VydENvbnRleHQsIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAmaENyeXB0UHJvdiwgJmR3S2V5U3BlYywgJmJDYWxsZXJGcmVlUHJvdikgPT0gRkFMU0UpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFByaXZhdGUga2V5IGlzIGF2YWlsYWJsZQorCisgICAgICAgICAgICAgICAgQk9PTCBiR2V0VXNlcktleSA9IDo6Q3J5cHRHZXRVc2VyS2V5KGhDcnlwdFByb3YsIGR3S2V5U3BlYywgJmhVc2VyS2V5KTsKKworICAgICAgICAgICAgICAgIC8vIFNraXAgY2VydGlmaWNhdGUgaWYgY2Fubm90IGZpbmQgcHJpdmF0ZSBrZXkKKyAgICAgICAgICAgICAgICBpZiAoYkdldFVzZXJLZXkgPT0gRkFMU0UpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiSGFzTm9Qcml2YXRlS2V5ID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJDYWxsZXJGcmVlUHJvdikKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUHJpdmF0ZSBrZXkgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIEJPT0wgYkdldFVzZXJLZXkgPSA6OkNyeXB0R2V0VXNlcktleShoQ3J5cHRQcm92LCBkd0tleVNwZWMsICZoVXNlcktleSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBjZXJ0aWZpY2F0ZSBpZiBjYW5ub3QgZmluZCBwcml2YXRlIGtleQotICAgICAgICAgICAgICAgICAgICBpZiAoYkdldFVzZXJLZXkgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiQ2FsbGVyRnJlZVByb3YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpDcnlwdFJlbGVhc2VDb250ZXh0KGhDcnlwdFByb3YsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTZXQgY2lwaGVyIG1vZGUgdG8gRUNCCisgICAgICAgICAgICAgICAgRFdPUkQgZHdDaXBoZXJNb2RlID0gQ1JZUFRfTU9ERV9FQ0I7CisgICAgICAgICAgICAgICAgOjpDcnlwdFNldEtleVBhcmFtKGhVc2VyS2V5LCBLUF9NT0RFLCAoQllURSopJmR3Q2lwaGVyTW9kZSwgTlVMTCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGNpcGhlciBtb2RlIHRvIEVDQgotICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0NpcGhlck1vZGUgPSBDUllQVF9NT0RFX0VDQjsKLSAgICAgICAgICAgICAgICAgICAgOjpDcnlwdFNldEtleVBhcmFtKGhVc2VyS2V5LCBLUF9NT0RFLCAoQllURSopJmR3Q2lwaGVyTW9kZSwgTlVMTCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByaXZhdGUga2V5IGlzIHByZXNlbnQgaW4gc21hcnQgY2FyZCwgd2UgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0aGUga2V5IGxlbmd0aCBieSB1c2luZyB0aGUgcHJpdmF0ZSBrZXkgaGFuZGxlLiBIb3dldmVyLAotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpcnMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgd2UgY291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBrZXkgbGVuZ3RoIG9mIHRoZSBwcml2YXRlIGtleSBieSB1c2luZyB0aGUgcHVibGljIGtleQotICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY2VydGlmaWNhdGUuCi0gICAgICAgICAgICAgICAgICAgIGR3UHVibGljS2V5TGVuZ3RoID0gOjpDZXJ0R2V0UHVibGljS2V5TGVuZ3RoKFg1MDlfQVNOX0VOQ09ESU5HIHwgUEtDU183X0FTTl9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBDZXJ0Q29udGV4dC0+cENlcnRJbmZvLT5TdWJqZWN0UHVibGljS2V5SW5mbykpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJpdmF0ZSBrZXkgaXMgcHJlc2VudCBpbiBzbWFydCBjYXJkLCB3ZSBtYXkgbm90IGJlIGFibGUgdG8KKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIGtleSBsZW5ndGggYnkgdXNpbmcgdGhlIHByaXZhdGUga2V5IGhhbmRsZS4gSG93ZXZlciwKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSBwdWJsaWMvcHJpdmF0ZSBrZXkgcGFpcnMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgd2UgY291bGQKKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIGtleSBsZW5ndGggb2YgdGhlIHByaXZhdGUga2V5IGJ5IHVzaW5nIHRoZSBwdWJsaWMga2V5CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNlcnRpZmljYXRlLgorICAgICAgICAgICAgICAgIGR3UHVibGljS2V5TGVuZ3RoID0gOjpDZXJ0R2V0UHVibGljS2V5TGVuZ3RoKFg1MDlfQVNOX0VOQ09ESU5HIHwgUEtDU183X0FTTl9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICYocENlcnRDb250ZXh0LT5wQ2VydEluZm8tPlN1YmplY3RQdWJsaWNLZXlJbmZvKSk7CisKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBDQ0VSVF9DSEFJTl9DT05URVhUIHBDZXJ0Q2hhaW5Db250ZXh0ID0gTlVMTDsKIApAQCAtNDA0LDcgKzM5Miw4IEBACiAgICAgICAgICAgICAvLwogICAgICAgICAgICAgaWYgKEdldENlcnRpZmljYXRlQ2hhaW4oT0lEX0VLVV9BTlksIHBDZXJ0Q29udGV4dCwgJnBDZXJ0Q2hhaW5Db250ZXh0KSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKERXT1JEIGkgPSAwOyBpIDwgcENlcnRDaGFpbkNvbnRleHQtPmNDaGFpbjsgaSsrKQorCisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaT0wOyBpIDwgcENlcnRDaGFpbkNvbnRleHQtPmNDaGFpbjsgaSsrKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgY2VydCBjaGFpbgogICAgICAgICAgICAgICAgICAgICBQQ0VSVF9TSU1QTEVfQ0hBSU4gcmdwQ2hhaW4gPQpAQCAtNDU0LDcgKzQ0Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZXJ0IGNvbGxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2Qob2JqLCBtR2VuQ2VydCwgYnl0ZUFycmF5LCBqQXJyYXlMaXN0KTsKICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgICAgIGlmIChiSGFzTm9Qcml2YXRlS2V5KQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBjZXJ0aWZpY2F0ZSBjaGFpbiBhbmQgc3RvcmUgaW50byBjZXJ0IGNoYWluCkBAIC0xMzczLDU3ICsxMzYxLDQzIEBACiAgICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gTlVMTDsKICAgICBIQ1JZUFRLRVkgaEtleSA9IE5VTEw7CiAgICAgRFdPUkQgZHdLZXlTcGVjOwotICAgIEJPT0wgYkNhbGxlckZyZWVQcm92ID0gRkFMU0U7Ci0gICAgQk9PTCBiUmVzOwogCiAgICAgX190cnkKICAgICB7CiAgICAgICAgIGlmICh1c2VQcml2YXRlS2V5ID09IEpOSV9UUlVFKSB7CiAgICAgICAgICAgICAvLyBMb2NhdGUgdGhlIGtleSBjb250YWluZXIgZm9yIHRoZSBjZXJ0aWZpY2F0ZSdzIHByaXZhdGUga2V5CisgICAgICAgICAgICBpZiAoISg6OkNyeXB0QWNxdWlyZUNlcnRpZmljYXRlUHJpdmF0ZUtleSgKKyAgICAgICAgICAgICAgICAoUENDRVJUX0NPTlRFWFQpIHBDZXJ0Q29udGV4dCwgMCwgTlVMTCwgJmhDcnlwdFByb3YsCisgICAgICAgICAgICAgICAgJmR3S2V5U3BlYywgTlVMTCkpKSB7CiAKLSAgICAgICAgICAgIC8vIEZpcnN0LCBwcm9iZSBpdCBzaWxlbnRseQotICAgICAgICAgICAgYlJlcyA9IDo6Q3J5cHRBY3F1aXJlQ2VydGlmaWNhdGVQcml2YXRlS2V5KAotICAgICAgICAgICAgICAgICAgICAoUENDRVJUX0NPTlRFWFQpIHBDZXJ0Q29udGV4dCwgQ1JZUFRfQUNRVUlSRV9TSUxFTlRfRkxBRywKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmhDcnlwdFByb3YsICZkd0tleVNwZWMsICZiQ2FsbGVyRnJlZVByb3YpOwotCi0gICAgICAgICAgICBpZiAoYlJlcyA9PSBGQUxTRSAmJiBHZXRMYXN0RXJyb3IoKSAhPSBOVEVfU0lMRU5UX0NPTlRFWFQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dFeGNlcHRpb24oZW52LCBLRVlTVE9SRV9FWENFUFRJT04sIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgICAgICAgICBfX2xlYXZlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYkNhbGxlckZyZWVQcm92ID09IFRSVUUpIHsKLSAgICAgICAgICAgICAgICA6OkNyeXB0UmVsZWFzZUNvbnRleHQoaENyeXB0UHJvdiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgYkNhbGxlckZyZWVQcm92ID0gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdywgZG8gaXQgbm9ybWFsbHkgKG5vdCBzaWxlbnRseSkKLSAgICAgICAgICAgIGlmICg6OkNyeXB0QWNxdWlyZUNlcnRpZmljYXRlUHJpdmF0ZUtleSgKLSAgICAgICAgICAgICAgICAgICAgKFBDQ0VSVF9DT05URVhUKSBwQ2VydENvbnRleHQsIDAsIE5VTEwsICZoQ3J5cHRQcm92LAotICAgICAgICAgICAgICAgICAgICAmZHdLZXlTcGVjLCAmYkNhbGxlckZyZWVQcm92KSA9PSBGQUxTRSkKLSAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VwdGlvbihlbnYsIEtFWVNUT1JFX0VYQ0VQVElPTiwgR2V0TGFzdEVycm9yKCkpOwogICAgICAgICAgICAgICAgIF9fbGVhdmU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEdldCBhIGhhbmRsZSB0byB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgICAgIGlmICg6OkNyeXB0R2V0VXNlcktleShoQ3J5cHRQcm92LCBkd0tleVNwZWMsICZoS2V5KSA9PSBGQUxTRSkgeworICAgICAgICAgICAgaWYgKCEoOjpDcnlwdEdldFVzZXJLZXkoaENyeXB0UHJvdiwgZHdLZXlTcGVjLCAmaEtleSkpKSB7CiAgICAgICAgICAgICAgICAgVGhyb3dFeGNlcHRpb24oZW52LCBLRVlfRVhDRVBUSU9OLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgX19sZWF2ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8vIHVzZSBwdWJsaWMga2V5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJDYWxsZXJGcmVlUHJvdiA9IFRSVUU7CisKKyAgICAgICAgfSBlbHNlIHsgLy8gdXNlIHB1YmxpYyBrZXkKIAogICAgICAgICAgICAgLy8gIEFjcXVpcmUgYSBDU1AgY29udGV4dC4KLSAgICAgICAgICAgIGlmICg6OkNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsICJKMlNFIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgUFJPVl9SU0FfRlVMTCwgMCkgPT0gRkFMU0UpCisgICAgICAgICAgICBpZig6OkNyeXB0QWNxdWlyZUNvbnRleHQoCisgICAgICAgICAgICAgICAmaENyeXB0UHJvdiwKKyAgICAgICAgICAgICAgICJKMlNFIiwKKyAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICBQUk9WX1JTQV9GVUxMLAorICAgICAgICAgICAgICAgMCkgPT0gRkFMU0UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gSWYgQ1NQIGNvbnRleHQgaGFzbid0IGJlZW4gY3JlYXRlZCwgY3JlYXRlIG9uZS4KICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIGlmICg6OkNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsICJKMlNFIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBST1ZfUlNBX0ZVTEwsIENSWVBUX05FV0tFWVNFVCkgPT0gRkFMU0UpCisgICAgICAgICAgICAgICAgaWYgKDo6Q3J5cHRBY3F1aXJlQ29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgJmhDcnlwdFByb3YsCisgICAgICAgICAgICAgICAgICAgICJKMlNFIiwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgUFJPVl9SU0FfRlVMTCwKKyAgICAgICAgICAgICAgICAgICAgQ1JZUFRfTkVXS0VZU0VUKSA9PSBGQUxTRSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFRocm93RXhjZXB0aW9uKGVudiwgS0VZU1RPUkVfRVhDRVBUSU9OLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgICAgIF9fbGVhdmU7CkBAIC0xNDMxLDEwICsxNDA1LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEltcG9ydCB0aGUgY2VydGlmaWNhdGUncyBwdWJsaWMga2V5IGludG8gdGhlIGtleSBjb250YWluZXIKLSAgICAgICAgICAgIGlmICg6OkNyeXB0SW1wb3J0UHVibGljS2V5SW5mbyhoQ3J5cHRQcm92LCBYNTA5X0FTTl9FTkNPRElORywKLSAgICAgICAgICAgICAgICAgICAgJigoKFBDQ0VSVF9DT05URVhUKSBwQ2VydENvbnRleHQpLT5wQ2VydEluZm8tPlN1YmplY3RQdWJsaWNLZXlJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgJmhLZXkpID09IEZBTFNFKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoOjpDcnlwdEltcG9ydFB1YmxpY0tleUluZm8oaENyeXB0UHJvdiwgWDUwOV9BU05fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgJigoKFBDQ0VSVF9DT05URVhUKSBwQ2VydENvbnRleHQpLT5wQ2VydEluZm8tPlN1YmplY3RQdWJsaWNLZXlJbmZvKSwKKyAgICAgICAgICAgICAgICAmaEtleSkpKSB7CisKICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VwdGlvbihlbnYsIEtFWV9FWENFUFRJT04sIEdldExhc3RFcnJvcigpKTsKICAgICAgICAgICAgICAgICBfX2xlYXZlOwogICAgICAgICAgICAgfQpAQCAtMTQ0NSw3ICsxNDE5LDcgQEAKICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAvLyBDbGVhbiB1cC4KIAotICAgICAgICBpZiAoYkNhbGxlckZyZWVQcm92ID09IFRSVUUgJiYgaENyeXB0UHJvdiAhPSBOVUxMKQorICAgICAgICBpZiAoaENyeXB0UHJvdikKICAgICAgICAgICAgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCAwKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0NvbXBvbmVudC5jcHAgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuY3BwCmluZGV4IDQwNTA5OGIuLjAxMjg5NzIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0NvbXBvbmVudC5jcHAKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfQ29tcG9uZW50LmNwcApAQCAtMjU2LDggKzI1Niw2IEBACiAgICAgICAgIEF3dENvbXBvbmVudDo6QnVpbGRQcmltYXJ5RHluYW1pY1RhYmxlKCk7CiAgICAgICAgIHNtX1ByaW1hcnlEeW5hbWljVGFibGVCdWlsdCA9IFRSVUU7CiAgICAgfQotCi0gICAgZGVhZEtleUFjdGl2ZSA9IEZBTFNFOwogfQogCiBBd3RDb21wb25lbnQ6On5Bd3RDb21wb25lbnQoKQpAQCAtMjkzOCw3ICsyOTM2LDYgQEAKICAgICB7MHgwMzdBLCBqYXZhX2F3dF9ldmVudF9LZXlFdmVudF9WS19ERUFEX0lPVEF9LCAgICAgICAgICAgICAvLyBBU0NJSSA/Pz8KICAgICB7MHgzMDlCLCBqYXZhX2F3dF9ldmVudF9LZXlFdmVudF9WS19ERUFEX1ZPSUNFRF9TT1VORH0sCiAgICAgezB4MzA5QywgamF2YV9hd3RfZXZlbnRfS2V5RXZlbnRfVktfREVBRF9TRU1JVk9JQ0VEX1NPVU5EfSwKLSAgICB7MHgwMDA0LCBqYXZhX2F3dF9ldmVudF9LZXlFdmVudF9WS19DT01QT1NFfSwKICAgICB7MCwwfQogfTsKIApAQCAtMzQzMSw5ICszNDI4LDggQEAKICAgICBBd3RUb29sa2l0OjpHZXRLZXlib2FyZFN0YXRlKGtleWJvYXJkU3RhdGUpOwogCiAgICAgLy8gYXBwbHkgbW9kaWZpZXJzIHRvIGtleWJvYXJkIHN0YXRlIGlmIG5lY2Vzc2FyeQotICAgIEJPT0wgc2hpZnRJc0Rvd24gPSBGQUxTRTsKICAgICBpZiAobW9kaWZpZXJzKSB7Ci0gICAgICAgIHNoaWZ0SXNEb3duID0gbW9kaWZpZXJzICYgamF2YV9hd3RfZXZlbnRfSW5wdXRFdmVudF9TSElGVF9ET1dOX01BU0s7CisgICAgICAgIEJPT0wgc2hpZnRJc0Rvd24gPSBtb2RpZmllcnMgJiBqYXZhX2F3dF9ldmVudF9JbnB1dEV2ZW50X1NISUZUX0RPV05fTUFTSzsKICAgICAgICAgQk9PTCBhbHRJc0Rvd24gPSBtb2RpZmllcnMgJiBqYXZhX2F3dF9ldmVudF9JbnB1dEV2ZW50X0FMVF9ET1dOX01BU0s7CiAgICAgICAgIEJPT0wgY3RybElzRG93biA9IG1vZGlmaWVycyAmIGphdmFfYXd0X2V2ZW50X0lucHV0RXZlbnRfQ1RSTF9ET1dOX01BU0s7CiAKQEAgLTM1MDUsMjcgKzM1MDEsMTggQEAKICAgICAgICAgfSAvLyBjdHJsSXNEb3duCiAgICAgfSAvLyBtb2RpZmllcnMKIAorICAgIC8vIGluc3RlYWQgb2YgY3JlYXRpbmcgb3VyIG93biBjb252ZXJzaW9uIHRhYmxlcywgSSdsbCBsZXQgV2luMzIKKyAgICAvLyBjb252ZXJ0IHRoZSBjaGFyYWN0ZXIgZm9yIG1lLgogICAgIFdPUkQgd0NoYXJbMl07Ci0gICAgaW50IGNvbnZlcnRlZCA9IDE7Ci0gICAgVUlOVCBjaCA9IDo6TWFwVmlydHVhbEtleSh3a2V5LCAyKTsKLSAgICBpZiAoY2ggJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgIC8vIERlYWQga2V5IHdoaWNoIGlzIGhhbmRsZWQgYXMgYSBub3JtYWwga2V5Ci0gICAgICAgIGlzRGVhZEtleSA9IGRlYWRLZXlBY3RpdmUgPSBUUlVFOwotICAgIH0gZWxzZSBpZiAoZGVhZEtleUFjdGl2ZSkgewotICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIDo6VG9Vbmljb2RlRXggaWYgZGVhZCBrZXkgaXMgYWN0aXZlIGJlY2F1c2UgdGhpcyB3aWxsCi0gICAgICAgIC8vIGJyZWFrIGRlYWQga2V5IGZ1bmN0aW9uCi0gICAgICAgIHdDaGFyWzBdID0gc2hpZnRJc0Rvd24gPyBjaCA6IHRvbG93ZXIoY2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFVJTlQgc2NhbmNvZGUgPSA6Ok1hcFZpcnR1YWxLZXkod2tleSwgMCk7Ci0gICAgICAgIGNvbnZlcnRlZCA9IDo6VG9Vbmljb2RlRXgod2tleSwgc2NhbmNvZGUsIGtleWJvYXJkU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0NoYXIsIDIsIDAsIEdldEtleWJvYXJkTGF5b3V0KCkpOwotICAgIH0KKyAgICBVSU5UIHNjYW5jb2RlID0gOjpNYXBWaXJ0dWFsS2V5KHdrZXksIDApOworICAgIGludCBjb252ZXJ0ZWQgPSA6OlRvVW5pY29kZUV4KHdrZXksIHNjYW5jb2RlLCBrZXlib2FyZFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDaGFyLCAyLCAwLCBHZXRLZXlib2FyZExheW91dCgpKTsKIAogICAgIFVJTlQgdHJhbnNsYXRpb247CiAgICAgQk9PTCBkZWFkS2V5RmxhZyA9IChjb252ZXJ0ZWQgPT0gMik7CiAKICAgICAvLyBEZWFkIEtleQotICAgIGlmIChjb252ZXJ0ZWQgPCAwIHx8IGlzRGVhZEtleSkgeworICAgIGlmIChjb252ZXJ0ZWQgPCAwKSB7CiAgICAgICAgIHRyYW5zbGF0aW9uID0gamF2YV9hd3RfZXZlbnRfS2V5RXZlbnRfQ0hBUl9VTkRFRklORUQ7CiAgICAgfSBlbHNlCiAgICAgLy8gTm8gdHJhbnNsYXRpb24gYXZhaWxhYmxlIC0tIHRyeSBrbm93biBjb252ZXJzaW9ucyBvciBlbHNlIHB1bnQuCkBAIC0zNjc5LDggKzM2NjYsNiBAQAogTXNnUm91dGluZyBBd3RDb21wb25lbnQ6OldtQ2hhcihVSU5UIGNoYXJhY3RlciwgVUlOVCByZXBDbnQsIFVJTlQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgc3lzdGVtKQogewotICAgIGRlYWRLZXlBY3RpdmUgPSBGQUxTRTsKLQogICAgIC8vIFdpbGwgb25seSBnZXQgV21DaGFyIG1lc3NhZ2VzIHdpdGggREJDUyBpZiB3ZSBjcmVhdGUgdGhlbSBmb3IKICAgICAvLyBhbiBFZGl0IGNsYXNzIGluIHRoZSBXbUZvcndhcmRDaGFyIG1ldGhvZC4gVGhlc2Ugc3ludGhlc2l6ZWQKICAgICAvLyBEQkNTIGNoYXJzIGFyZSBvayB0byBwYXNzIG9uIGRpcmVjdGx5IHRvIHRoZSBkZWZhdWx0IHdpbmRvdwpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfQ29tcG9uZW50LmggYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuaAppbmRleCA3ODBkODEwLi5iOTE0ZWYxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuaAorKysgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Db21wb25lbnQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTgyMCw4ICs4MjAsNiBAQAogICAgIC8vIDY1MjQzNTI6IHN1cHBvcnQgZmluZXItcmVzb2x1dGlvbgogICAgIGludCBtX3doZWVsUm90YXRpb25BbW91bnQ7CiAKLSAgICBCT09MIGRlYWRLZXlBY3RpdmU7Ci0KICAgICAvKgogICAgICAqIFRoZSBhc3NvY2lhdGlvbiBsaXN0IG9mIGNoaWxkcmVuJ3MgSURzIGFuZCBjb3JyZXNwb25kaW5nIGNvbXBvbmVudHMuCiAgICAgICogU29tZSBjb21wb25lbnRzIGxpa2UgQ2hvaWNlIG9yIExpc3QgYXJlIHJlcXVpcmVkIHRoZWlyIHNpemVzIHdoaWxlCmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9Gb250LmNwcCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0ZvbnQuY3BwCmluZGV4IGFiZGZmZGMuLjcyODJhOGYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0ZvbnQuY3BwCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X0ZvbnQuY3BwCkBAIC0xNjUxLDggKzE2NTEsNiBAQAogCiBDU2VnVGFibGVNYW5hZ2VyIGdfc2VnVGFibGVNYW5hZ2VyOwogCi0jZGVmaW5lIEtFWUxFTiAxNgotCiBjbGFzcyBDQ29tYmluZWRTZWdUYWJsZSA6IHB1YmxpYyBDU2VnVGFibGVDb21wb25lbnQKIHsKIHB1YmxpYzoKQEAgLTE2NjMsNyArMTY2MSw3IEBACiBwcml2YXRlOgogICAgIExQU1RSIEdldENvZGVQYWdlU3Via2V5KCk7CiAgICAgdm9pZCBHZXRFVURDRmlsZU5hbWUoTFBXU1RSIGxwc3pGaWxlTmFtZSwgaW50IGNjaEZpbGVOYW1lKTsKLSAgICBzdGF0aWMgY2hhciBtX3N6Q29kZVBhZ2VTdWJrZXlbS0VZTEVOXTsKKyAgICBzdGF0aWMgY2hhciBtX3N6Q29kZVBhZ2VTdWJrZXlbMTZdOwogICAgIHN0YXRpYyBXQ0hBUiBtX3N6RGVmYXVsdEVVRENGaWxlW19NQVhfUEFUSF07CiAgICAgc3RhdGljIEJPT0wgbV9mRVVEQ1N1YktleUV4aXN0OwogICAgIHN0YXRpYyBCT09MIG1fZlRURVVEQ0ZpbGVFeGlzdDsKQEAgLTE2NzEsNyArMTY2OSw3IEBACiAgICAgQ0VVRENTZWdUYWJsZSogbV9wRVVEQ1NlZ1RhYmxlOwogfTsKIAotY2hhciBDQ29tYmluZWRTZWdUYWJsZTo6bV9zekNvZGVQYWdlU3Via2V5W0tFWUxFTl0gPSAiIjsKK2NoYXIgQ0NvbWJpbmVkU2VnVGFibGU6Om1fc3pDb2RlUGFnZVN1YmtleVsxNl0gPSAiIjsKIAogV0NIQVIgQ0NvbWJpbmVkU2VnVGFibGU6Om1fc3pEZWZhdWx0RVVEQ0ZpbGVbX01BWF9QQVRIXSA9IEwiIjsKIApAQCAtMTcwMywxMSArMTcwMSw4IEBACiAgICAgfQogICAgIGxwc3pDUCsrOyAvLyBjZiBscHN6Q1AgPSAiOTMyIgogCi0gICAgY2hhciBzelN1YktleVtLRVlMRU5dOworICAgIGNoYXIgc3pTdWJLZXlbODBdOwogICAgIHN0cmNweShzelN1YktleSwgIkVVRENcXCIpOwotICAgIGlmICgoc3RybGVuKHN6U3ViS2V5KSArIHN0cmxlbihscHN6Q1ApKSA+PSBLRVlMRU4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogICAgIHN0cmNweSgmKHN6U3ViS2V5W3N0cmxlbihzelN1YktleSldKSwgbHBzekNQKTsKICAgICBzdHJjcHkobV9zekNvZGVQYWdlU3Via2V5LCBzelN1YktleSk7CiAgICAgcmV0dXJuIG1fc3pDb2RlUGFnZVN1YmtleTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1RyYXlJY29uLmNwcCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1RyYXlJY29uLmNwcAppbmRleCBmYmY0NmVjLi5lOWM3NGQ3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9UcmF5SWNvbi5jcHAKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfVHJheUljb24uY3BwCkBAIC05MywxMiArOTMsNiBAQAogCiB2b2lkIEF3dFRyYXlJY29uOjpEaXNwb3NlKCkgewogICAgIFNlbmRUcmF5TWVzc2FnZShOSU1fREVMRVRFKTsKLQotICAgIC8vIERlc3Ryb3kgdGhlIGljb24gdG8gYXZvaWQgbGVhayBvZiBHREkgb2JqZWN0cwotICAgIGlmIChtX25pZC5oSWNvbiAhPSBOVUxMKSB7Ci0gICAgICAgIDo6RGVzdHJveUljb24obV9uaWQuaEljb24pOwotICAgIH0KLQogICAgIFVubGlua09iamVjdHMoKTsKIAogICAgIGlmICgtLXNtX2luc3RDb3VudCA9PSAwKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9XaW4zMkdyYXBoaWNzRGV2aWNlLmNwcCBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbjMyR3JhcGhpY3NEZXZpY2UuY3BwCmluZGV4IGI3YWI3ZTAuLjgyNWE2OWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbjMyR3JhcGhpY3NEZXZpY2UuY3BwCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbjMyR3JhcGhpY3NEZXZpY2UuY3BwCkBAIC04NzUsOSArODc1LDYgQEAKICAgICAvLyBPbmx5IHdhbnQgdG8gY2FsbCB0aGlzIG9uY2UgcGVyIHNlc3Npb24KICAgICBtYWtlX3Vuc19vcmRlcmVkX2RpdGhlcl9hcnJheShpbWdfb2RhX2FscGhhLCAyNTYpOwogCi0gICAgLy8gd29ya2Fyb3VuZCBKREstNjQ3Nzc1NiwgaWdub3JlIHJldHVybiB2YWx1ZSB0byBrZWVwIGRsbCBpbiBtZW1vcnkKLSAgICBKREtfTG9hZFN5c3RlbUxpYnJhcnkoIm9wZW5nbDMyLmRsbCIpOwotCiAgICAgQ0FUQ0hfQkFEX0FMTE9DOwogfQogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9Qcm9ibGVtTGlzdC50eHQgYi9qZGsvdGVzdC9Qcm9ibGVtTGlzdC50eHQKaW5kZXggOWM1YzI5Yi4uYzcyNmIwNCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvUHJvYmxlbUxpc3QudHh0CisrKyBiL2pkay90ZXN0L1Byb2JsZW1MaXN0LnR4dApAQCAtMjM0LDEyICsyMzQsNiBAQAogamF2YS9zZWN1cml0eS9LZXlQYWlyR2VuZXJhdG9yL1NvbGFyaXNTaG9ydERTQS5qYXZhICAgICAgICAgICAgIHNvbGFyaXMtYWxsCiBzdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9zdGFuZGFyZC5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgc29sYXJpcy1hbGwKIAotIyA4MDI2MzkzCi1zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0JhZEtleVVzYWdlVGVzdC5qYXZhICAgICAgZ2VuZXJpYy1hbGwKLQotIyA4MTU4ODI3Ci1zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3Rvb2xzL0tpbml0Q29uZlBsdXNQcm9wcy5qYXZhICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzLWFsbAotCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgamRrX3NvdW5kCkBAIC0yODksMTAgKzI4MywzIEBACiBzdW4vdG9vbHMvanBzL1Rlc3RKcHNKYXJSZWxhdGl2ZS5qYXZhCQkJCWdlbmVyaWMtYWxsCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBqZGtfb3RoZXIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIDgxNDEzNzAKLWNvbS9zdW4vam5kaS9sZGFwL0RlYWRTU0xMZGFwVGltZW91dFRlc3QuamF2YQkJCWxpbnV4LWk1ODYsbWFjb3N4LWFsbApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvVEVTVC5ncm91cHMgYi9qZGsvdGVzdC9URVNULmdyb3VwcwppbmRleCAzMjc0ZDg1Li44ODY1NjZmIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9URVNULmdyb3VwcworKysgYi9qZGsvdGVzdC9URVNULmdyb3VwcwpAQCAtMzk0LDcgKzM5NCw2IEBACiAgIGphdmF4L21hbmFnZW1lbnQvbXhiZWFuL0xlYWtUZXN0LmphdmEgXAogICBqYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5UZXN0LmphdmEgXAogICBqYXZheC9tYW5hZ2VtZW50L214YmVhbi9Qcm9wZXJ0eU5hbWVzVGVzdC5qYXZhIFwKLSAgamF2YXgveG1sL2JpbmQvbWFyc2hhbC84MTM0MTExL1VubWFyc2hhbFRlc3QuamF2YSBcCiAgIGphdmF4L3htbC93cy84MDQzMTI5IFwKICAgamRrL2xhbWJkYS92bS9JbnRlcmZhY2VBY2Nlc3NGbGFnc1Rlc3QuamF2YSBcCiAgIHN1bi9taXNjL1VSTENsYXNzUGF0aC9DbGFzc25hbWVDaGFyVGVzdC5qYXZhIFwKQEAgLTU2Nyw3ICs1NjYsNiBAQAogICBqYXZhL25ldC9IdHRwQ29va2llL0lsbGVnYWxDb29raWVOYW1lVGVzdC5qYXZhIFwKICAgamF2YS9uZXQvSHR0cFVSTENvbm5lY3Rpb24vVW5tb2RpZmlhYmxlTWFwcy5qYXZhIFwKICAgamF2YS9uZXQvUmVzcG9uc2VDYWNoZS9UZXN0LmphdmEgXAotICBqYXZhL25ldC9TZXRGYWN0b3J5UGVybWlzc2lvbi9TZXRGYWN0b3J5UGVybWlzc2lvbi5qYXZhIFwKICAgamF2YS9uZXQvVVJMQ2xhc3NMb2FkZXIvQ2xhc3NMb2FkLmphdmEgXAogICBqYXZhL25ldC9VUkxDbGFzc0xvYWRlci9jbG9zZXRlc3QvQ2xvc2VUZXN0LmphdmEgXAogICBqYXZhL25ldC9VUkxQZXJtaXNzaW9uL1VSTFRlc3QuamF2YSBcCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vYXBwbGUvbGFmL1NjcmVlbk1lbnUvU2NyZWVuTWVudU1lbW9yeUxlYWtUZXN0LmphdmEgYi9qZGsvdGVzdC9jb20vYXBwbGUvbGFmL1NjcmVlbk1lbnUvU2NyZWVuTWVudU1lbW9yeUxlYWtUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWJjYWUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL2FwcGxlL2xhZi9TY3JlZW5NZW51L1NjcmVlbk1lbnVNZW1vcnlMZWFrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0vKgotICogQHRlc3QKLSAqIEBidWcgODE1ODMyNQotICogQHN1bW1hcnkgTWVtb3J5IGxlYWsgaW4gY29tLmFwcGxlLmxhZi5TY3JlZW5NZW51OiByZW1vdmVkIEpNZW51SXRlbXMgYXJlIHN0aWxsIHJlZmVyZW5jZWQKLSAqIEByZXF1aXJlcyAob3MuZmFtaWx5ID09ICJtYWMiKQotICogQHJ1biBtYWluL3RpbWVvdXQ9MzAwL290aGVydm0gLVhteDE2bSBTY3JlZW5NZW51TWVtb3J5TGVha1Rlc3QKLSAqLwotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51OwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51QmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpNZW51SXRlbTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTY3JlZW5NZW51TWVtb3J5TGVha1Rlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHNCeXRlczsKLQotICAgIHByaXZhdGUgc3RhdGljIFdlYWtSZWZlcmVuY2U8Sk1lbnVJdGVtPiBzTWVudUl0ZW07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSkZyYW1lIHNGcmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyBKTWVudSBzTWVudTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImFwcGxlLmxhZi51c2VTY3JlZW5NZW51QmFyIiwgInRydWUiKTsKLSAgICAgICAgICAgICAgICBzaG93VUkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHJlbW92ZU1lbnVJdGVtRnJvbU1lbnUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICBTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7Ci0gICAgICAgIEpNZW51SXRlbSBtZW51SXRlbSA9IHNNZW51SXRlbS5nZXQoKTsKLSAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIHNGcmFtZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAobWVudUl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBtZW51IGl0ZW0gc2hvdWxkIGhhdmUgYmVlbiBHQy1lZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93VUkoKSB7Ci0gICAgICAgIHNGcmFtZSA9IG5ldyBKRnJhbWUoKTsKLSAgICAgICAgc0ZyYW1lLmFkZChuZXcgSkxhYmVsKCJTb21lIGR1bW15IGNvbnRlbnQiKSk7Ci0KLSAgICAgICAgSk1lbnVCYXIgbWVudUJhciA9IG5ldyBKTWVudUJhcigpOwotCi0gICAgICAgIHNNZW51ID0gbmV3IEpNZW51KCJNZW51Iik7Ci0gICAgICAgIEpNZW51SXRlbSBpdGVtID0gbmV3IEpNZW51SXRlbSgiSXRlbSIpOwotICAgICAgICBzTWVudS5hZGQoaXRlbSk7Ci0KLSAgICAgICAgc01lbnVJdGVtID0gbmV3IFdlYWtSZWZlcmVuY2U8PihpdGVtKTsKLQotICAgICAgICBtZW51QmFyLmFkZChzTWVudSk7Ci0KLSAgICAgICAgc0ZyYW1lLnNldEpNZW51QmFyKG1lbnVCYXIpOwotCi0gICAgICAgIHNGcmFtZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotICAgICAgICBzRnJhbWUucGFjaygpOwotICAgICAgICBzRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZU1lbnVJdGVtRnJvbU1lbnUoKSB7Ci0gICAgICAgIEpNZW51SXRlbSBtZW51SXRlbSA9IHNNZW51SXRlbS5nZXQoKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChtZW51SXRlbSwgIlRoZSBtZW51IGl0ZW0gc2hvdWxkIHN0aWxsIGJlIGF2YWlsYWJsZSBhdCB0aGlzIHBvaW50Iik7Ci0gICAgICAgIHNNZW51LnJlbW92ZShtZW51SXRlbSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY29yYmEvY2FjaGVkU29ja2V0LzcwNTY3MzEuc2ggYi9qZGsvdGVzdC9jb20vc3VuL2NvcmJhL2NhY2hlZFNvY2tldC83MDU2NzMxLnNoCmluZGV4IDJlNWUzZmIuLjBkN2MwMzYgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2NvbS9zdW4vY29yYmEvY2FjaGVkU29ja2V0LzcwNTY3MzEuc2gKKysrIGIvamRrL3Rlc3QvY29tL3N1bi9jb3JiYS9jYWNoZWRTb2NrZXQvNzA1NjczMS5zaApAQCAtMTAyLDcgKzEwMiw3IEBACiBzbGVlcCA1ICMgZ2l2ZSB0aW1lIGZvciBDbGllbnQgdG8gdGhyb3cgZXhjZXB0aW9uCiAKICMgSlZNX1BST0Mgc2hvdWxkIGhhdmUgZXhpdGVkIGJ1dCBqdXN0IGluIGNhc2UsIGluY2x1ZGUgaXQuCi1raWxsIC05ICRPUkJfUFJPQyAkSlZNX1BST0MgJFNFUlZFUl9QUk9DCitraWxsIC05ICRPUkJfUFJPQyAkSlZNX1BST0MKIAogZ3JlcCAiT1JCVXRpbFN5c3RlbUV4Y2VwdGlvbi53cml0ZUVycm9yU2VuZCIgY2xpZW50LiQkCiByZXN1bHQ9JD8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9BRVMvVGVzdEFFU0NpcGhlcnMvRHluYW1pYy5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9EeW5hbWljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTZkMjkuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9EeW5hbWljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7Ci1pbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYzsKLQotcHVibGljIGNsYXNzIER5bmFtaWMgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBTEdPUklUSE0gPSAiQUVTIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gTU9ERSA9IHsKLSAgICAgICAgIkVDYiIsICJDYkMiLCAiQ1RSIiwgIlBDQkMiLCAiT0ZCIiwgIk9GQjE1MCIsICJjRkIiLCAiQ0ZCNyIsCi0gICAgICAgICJjRkI4IiwgImNGQjE2IiwgImNGQjI0IiwgImNGQjMyIiwgIkNmYjQwIiwgImNmQjQ4IiwgImNmQjU2IiwKLSAgICAgICAgImNmQjY0IiwgImNmQjcyIiwgImNmQjgwIiwgImNmQjg4IiwgImNmQjk2IiwgImNmYjEwNCIsICJjZkIxMTIiLAotICAgICAgICAiY2ZCMTIwIiwgImNmQjEyOCIsICJPRkI4IiwgIk9GQjE2IiwgIk9GQjI0IiwgIk9GQjMyIiwgIk9GQjQwIiwKLSAgICAgICAgIk9GQjQ4IiwgIk9GQjU2IiwgIk9GQjY0IiwgIk9GQjcyIiwgIk9GQjgwIiwgIk9GQjg4IiwgIk9GQjk2IiwKLSAgICAgICAgIk9GQjEwNCIsICJPRkIxMTIiLCAiT0ZCMTIwIiwgIk9GQjEyOCIsICJHQ00iCi0gICAgfTsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFERElORyA9IHsKLSAgICAgICAgIk5vUGFkZGluZyIsICJQS0NTNVBhZGRpbmciLCAiSVNPMTAxMjZQYWRkaW5nIgotICAgIH07Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTVU5KQ0UgPSAiU3VuSkNFIjsKLQotICAgIENpcGhlciBjaSA9IG51bGw7Ci0gICAgYnl0ZVtdIGl2ID0gbnVsbDsKLSAgICBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGFwcyA9IG51bGw7Ci0gICAgU2VjcmV0S2V5IGtleSA9IG51bGw7Ci0gICAgaW50IGtleVN0cmVuZ3RoOwotICAgIHN0YXRpYyBpbnQgRGVmYXVsdFNpemUgPSAxMjg7Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcnVuQWxsVGVzdChhcmd2LCBTeXN0ZW0ub3V0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGVzdCBGYWlsZWQiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHJ1bkFsbFRlc3QoU3RyaW5nIGFyZ3ZbXSwgUHJpbnRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBmYWlsZWRMaXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaW50IGZhaWxlZENudCA9IDA7Ci0gICAgICAgIGludCB0ZXN0Q291bnQgPSAwOwotICAgICAgICBpbnQgcGFkS2luZHM7IC8vIGhvdyBtYW55IGtpbmRzIG9mIHBhZGRpbmcgbW9kZSBzdWNoIGFzIFBLQ1M1cGFkZGluZyBhbmQKLSAgICAgICAgLy8gTm9QYWRkaW5nLgotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgICAgIGtleVN0cmVuZ3RoID0gRGVmYXVsdFNpemUgKyBpICogNjQ7IC8vIG9idGFpbiB0aGUga2V5IHNpemUgMTI4LAotICAgICAgICAgICAgICAgIC8vIDE5MiwgMjU2Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE1PREUubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE1PREVbal0uZXF1YWxzSWdub3JlQ2FzZSgiRUNCIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBNT0RFW2pdLmVxdWFsc0lnbm9yZUNhc2UoIlBDQkMiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE1PREVbal0uZXF1YWxzSWdub3JlQ2FzZSgiQ0JDIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZEtpbmRzID0gUEFERElORy5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWRLaW5kcyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHBhZEtpbmRzOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1blRlc3QoQUxHT1JJVEhNLCBNT0RFW2pdLCBQQURESU5HW2tdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkQ250Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZExpc3QuYXBwZW5kKEFMR09SSVRITSArICIvIiArIE1PREVbal0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvIiArIFBBRERJTkdba10gKyAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRDbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRMaXN0LmFwcGVuZChBTEdPUklUSE0gKyAiLyIgKyBNT0RFW2pdICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBBRERJTkdba10gKyAiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiU1RBVFVTOlBhc3NlZC4gVGVzdCAiICsgdGVzdENvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIgY2FzZXMsIEFsbCBQYXNzZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJTVEFUVVM6RmFpbGVkLiAiICsgZmFpbGVkQ250ICsgIiBGYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBmYWlsZWRMaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIlNUQVRVUzpGYWlsZWQuIFVuZXhwZWN0ZWQgRXhjZXB0aW9uOiAiICsgZXgpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcnVuVGVzdChTdHJpbmcgYWxnbywgU3RyaW5nIG1vLCBTdHJpbmcgcGFkKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ5dGVbXSBwbGFpblRleHQgPSBuZXcgYnl0ZVsxNjAwMDBdOwotICAgICAgICAgICAgbmV3IFJhbmRvbSgpLm5leHRCeXRlcyhwbGFpblRleHQpOwotCi0gICAgICAgICAgICBTdHJpbmcgdHJhbnNmb3JtYXRpb24gPSBhbGdvICsgIi8iICsgbW8gKyAiLyIgKyBwYWQ7Ci0gICAgICAgICAgICBjaSA9IENpcGhlci5nZXRJbnN0YW5jZSh0cmFuc2Zvcm1hdGlvbiwgU1VOSkNFKTsKLSAgICAgICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShhbGdvLCBTVU5KQ0UpOwotICAgICAgICAgICAgaWYgKGtleVN0cmVuZ3RoID4gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgodHJhbnNmb3JtYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgLy8gc2tpcCBpZiB0aGlzIGtleSBsZW5ndGggaXMgbGFyZ2VyIHRoYW4gd2hhdCdzCi0gICAgICAgICAgICAgICAgLy8gY29uZmlndXJlZCBpbiB0aGUgamNlIGp1cmlzZGljdGlvbiBwb2xpY3kgZmlsZXMKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oa2V5U3RyZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBsYXJnZXIgdGhhbiB3aGF0J3MgY29uZmlndXJlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpbiB0aGUgamNlIGp1cmlzZGljdGlvbiBwb2xpY3kgZmlsZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAga2cuaW5pdChrZXlTdHJlbmd0aCk7Ci0gICAgICAgICAgICBrZXkgPSBrZy5nZW5lcmF0ZUtleSgpOwotCi0gICAgICAgICAgICBpZiAoIW1vLmVxdWFsc0lnbm9yZUNhc2UoIkdDTSIpKSB7Ci0gICAgICAgICAgICAgICAgY2kuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXksIGFwcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNpLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXJUZXh0ID0gbmV3IGJ5dGVbY2kuZ2V0T3V0cHV0U2l6ZShwbGFpblRleHQubGVuZ3RoKV07Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gY2kudXBkYXRlKHBsYWluVGV4dCwgMCwgcGxhaW5UZXh0Lmxlbmd0aCwgY2lwaGVyVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBjaS5kb0ZpbmFsKGNpcGhlclRleHQsIG9mZnNldCk7Ci0KLSAgICAgICAgICAgIGlmICghbW8uZXF1YWxzSWdub3JlQ2FzZSgiRUNCIikpIHsKLSAgICAgICAgICAgICAgICBpdiA9IGNpLmdldElWKCk7Ci0gICAgICAgICAgICAgICAgYXBzID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhpdik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbW8uZXF1YWxzSWdub3JlQ2FzZSgiR0NNIikpIHsKLSAgICAgICAgICAgICAgICBjaS5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgYXBzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2kuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBrZXksIGNpLmdldFBhcmFtZXRlcnMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlW10gcmVjb3ZlcmVkVGV4dCA9IG5ldyBieXRlW2NpLmdldE91dHB1dFNpemUoY2lwaGVyVGV4dC5sZW5ndGgpXTsKLSAgICAgICAgICAgIGludCBsZW4gPSBjaS5kb0ZpbmFsKGNpcGhlclRleHQsIDAsIGNpcGhlclRleHQubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICByZWNvdmVyZWRUZXh0KTsKLQotICAgICAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2xlbl07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdG1wW2ldID0gcmVjb3ZlcmVkVGV4dFtpXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXlzLmVxdWFscyhwbGFpblRleHQsIHRtcCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBuc2FFeCkgewotICAgICAgICAgICAgbnNhRXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAvLyBDRkI3IGFuZCBPRkIxNTAgYXJlIG5lZ2F0aXZlIHRlc3QsU3VuSkNFIG5vdCBzdXBwb3J0IHRoaXMKLSAgICAgICAgICAgIC8vIGFsZ29yaXRobQotICAgICAgICAgICAgcmVzdWx0ID0gbW8uZXF1YWxzSWdub3JlQ2FzZSgiQ0ZCNyIpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vLmVxdWFsc0lnbm9yZUNhc2UoIk9GQjE1MCIpOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RBRVNDaXBoZXJzL1Rlc3RBRVNXaXRoRGVmYXVsdFByb3ZpZGVyLmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RBRVNDaXBoZXJzL1Rlc3RBRVNXaXRoRGVmYXVsdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmU3OWQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9UZXN0QUVTV2l0aERlZmF1bHRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ0MTkzCi0gKiBAc3VtbWFyeSBUZXN0IEFFUyBjaXBoZXJzIHdpdGggZGlmZmVyZW50IG1vZGVzIGFuZCBwYWRkaW5nIHNjaGVtZXMgd2l0aAotICogIGRlZmF1bHQgcHJvdmlkZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdEFFU1dpdGhEZWZhdWx0UHJvdmlkZXIgZXh0ZW5kcyBEeW5hbWljIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IFRlc3RBRVNXaXRoRGVmYXVsdFByb3ZpZGVyKCkucnVuKGFyZ3YpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9BRVMvVGVzdEFFU0NpcGhlcnMvVGVzdEFFU1dpdGhQcm92aWRlckNoYW5nZS5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9UZXN0QUVTV2l0aFByb3ZpZGVyQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZWM5ZjEuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9UZXN0QUVTV2l0aFByb3ZpZGVyQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwNDQxOTMKLSAqIEBzdW1tYXJ5IFRlc3QgQUVTIGNpcGhlcnMgd2l0aCBkaWZmZXJlbnQgbW9kZXMgYW5kIHBhZGRpbmcgc2NoZW1lcyBhZnRlcgotICogIHJlbW92ZSB0aGVuIGFkZCBwcm92aWRlci4KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3BvbGljeT10ZXN0QUVTLnBvbGljeSBUZXN0QUVTV2l0aFByb3ZpZGVyQ2hhbmdlCi0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RBRVNXaXRoUHJvdmlkZXJDaGFuZ2UgZXh0ZW5kcyBEeW5hbWljIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU2VjdXJpdHkucmVtb3ZlUHJvdmlkZXIoU1VOSkNFKTsKLSAgICAgICAgU2VjdXJpdHkuYWRkUHJvdmlkZXIobmV3IGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyLlN1bkpDRSgpKTsKLSAgICAgICAgbmV3IFRlc3RBRVNXaXRoUHJvdmlkZXJDaGFuZ2UoKS5ydW4oYXJndik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0QUVTQ2lwaGVycy9UZXN0QUVTV2l0aFJlbW92ZUFkZFByb3ZpZGVyLmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RBRVNDaXBoZXJzL1Rlc3RBRVNXaXRoUmVtb3ZlQWRkUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NjFhNy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RBRVNDaXBoZXJzL1Rlc3RBRVNXaXRoUmVtb3ZlQWRkUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXI7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ0MTkzCi0gKiBAc3VtbWFyeSBUZXN0IEFFUyBjaXBoZXJzIHdpdGggZGlmZmVyZW50IG1vZGVzIGFuZCBwYWRkaW5nIHNjaGVtZXMgYWZ0ZXIKLSAqICByZW1vdmUgZGVmYXVsdCBwcm92aWRlciB0aGVuIGFkZCBpdCBiYWNrLgotICogQHJ1biBtYWluL290aGVydm0vcG9saWN5PXRlc3RBRVMucG9saWN5IFRlc3RBRVNXaXRoUmVtb3ZlQWRkUHJvdmlkZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdEFFU1dpdGhSZW1vdmVBZGRQcm92aWRlciBleHRlbmRzIER5bmFtaWMgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm92aWRlciBwSkNFID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXIoU1VOSkNFKTsKLSAgICAgICAgU2VjdXJpdHkucmVtb3ZlUHJvdmlkZXIoU1VOSkNFKTsKLSAgICAgICAgU2VjdXJpdHkuYWRkUHJvdmlkZXIocEpDRSk7Ci0gICAgICAgIG5ldyBUZXN0QUVTV2l0aFJlbW92ZUFkZFByb3ZpZGVyKCkucnVuKGFyZ3YpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9BRVMvVGVzdEFFU0NpcGhlcnMvdGVzdEFFUy5wb2xpY3kgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RBRVNDaXBoZXJzL3Rlc3RBRVMucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM4YTU3Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9BRVMvVGVzdEFFU0NpcGhlcnMvdGVzdEFFUy5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWdyYW50IAotewotICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gInJlbW92ZVByb3ZpZGVyLlN1bkpDRSI7Ci0gICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiaW5zZXJ0UHJvdmlkZXIuU3VuSkNFIjsKLSAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJwdXRQcm92aWRlclByb3BlcnR5LlN1bkpDRSI7Ci19OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0Q29weVNhZmUuamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9BRVMvVGVzdENvcHlTYWZlLmphdmEKaW5kZXggNjk3ZGE2Ny4uMjBkZmY4MyAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0FFUy9UZXN0Q29weVNhZmUuamF2YQorKysgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQUVTL1Rlc3RDb3B5U2FmZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgODAyNjk0MyA4MDI3NTc1CisgKiBAYnVnIDgwMjY5NDMKICAqIEBzdW1tYXJ5IFZlcmlmeSB0aGF0IHNhbWUgYnVmZmVyIGNhbiBiZSB1c2VkIGFzIGlucHV0IGFuZCBvdXRwdXQgd2hlbgogICogdXNpbmcgQ2lwaGVyIG9iamVjdHMuCiAgKiBAYXV0aG9yIFZhbGVyaWUgUGVuZwpAQCAtNDQsNyArNDQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIFNlY3JldEtleSBLRVkgPSBuZXcgU2VjcmV0S2V5U3BlYyhuZXcgYnl0ZVsxNl0sICJBRVMiKTsKICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gSVYgPSBuZXcgYnl0ZVsxNl07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnRbXSBPRkZTRVRTID0geyAxLCA4LCA5LCAxNiwgMTcsIDMyLCAzMyB9OworICAgIHByaXZhdGUgc3RhdGljIGludFtdIE9GRlNFVFMgPSB7IDEsIDgsIDE3IH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBNT0RFUyA9IHsKICAgICAgICAgIkVDQiIsICJDQkMiLCAiUENCQyIsICJDVFIiLCAiQ1RTIiwKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9CbG93ZmlzaC9UZXN0Q2lwaGVyQmxvd2Zpc2guamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9CbG93ZmlzaC9UZXN0Q2lwaGVyQmxvd2Zpc2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAwNmFiYy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvQmxvd2Zpc2gvVGVzdENpcGhlckJsb3dmaXNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA0ODYwMQotICogQGxpYnJhcnkgLi4vCi0gKiBAc3VtbWFyeSBUZXN0IEJsb3dmaXNoIGNpcGhlciB3aXRoIGRpZmZlcmVudCBNT0RFUyBhbmQgcGFkZGluZwotICovCi0KLXB1YmxpYyBjbGFzcyBUZXN0Q2lwaGVyQmxvd2Zpc2ggZXh0ZW5kcyBUZXN0Q2lwaGVyIHsKLQotICAgIFRlc3RDaXBoZXJCbG93ZmlzaCgpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewotICAgICAgICBzdXBlcigiQmxvd2Zpc2giLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiQ0JDIiwgIkNUUiIsICJDVFMiLCAiRUNCIiwgIlBDQkMiLAotICAgICAgICAgICAgICAgICAgICAvL0NGQngKLSAgICAgICAgICAgICAgICAgICAgIkNGQiIsICJDRkI4IiwgIkNGQjE2IiwgIkNGQjI0IiwgIkNGQjMyIiwgIkNGQjQwIiwgIkNGQjQ4IiwgIkNGQjU2IiwKLSAgICAgICAgICAgICAgICAgICAgIkNGQjY0IiwKLSAgICAgICAgICAgICAgICAgICAgLy9PRkJ4Ci0gICAgICAgICAgICAgICAgICAgICJPRkIiLCAiT0ZCOCIsICJPRkIxNiIsICJPRkIyNCIsICJPRkIzMiIsICJPRkI0MCIsICJPRkI0OCIsICJPRkI1NiIsCi0gICAgICAgICAgICAgICAgICAgICJPRkI2NCJ9LAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiTm9QYUREaW5nIiwgIlBLQ1M1UGFkZGluZyJ9LAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgVGVzdENpcGhlckJsb3dmaXNoKCkucnVuQWxsKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL0RFUy9UZXN0Q2lwaGVyREVTLmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvREVTL1Rlc3RDaXBoZXJERVMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMTljMi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvREVTL1Rlc3RDaXBoZXJERVMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA0ODYwMQotICogQGxpYnJhcnkgLi4vCi0gKiBAc3VtbWFyeSBUZXN0IERFUy9ERVNlZGUgY2lwaGVyIHdpdGggZGlmZmVyZW50IE1PREVTIGFuZCBwYWRkaW5nCi0gKi8KLQotcHVibGljIGNsYXNzIFRlc3RDaXBoZXJERVMgZXh0ZW5kcyBUZXN0Q2lwaGVyIHsKLQotICAgIFRlc3RDaXBoZXJERVMoKSB7Ci0gICAgICAgIHN1cGVyKCJERVMiLAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiQ0JDIiwgIkNUUiIsICJDVFMiLCAiRUNCIiwgIlBDQkMiLAotICAgICAgICAgICAgICAgICAgICAvL0NGQngKLSAgICAgICAgICAgICAgICAgICAgIkNGQiIsICJDRkI4IiwgIkNGQjE2IiwgIkNGQjI0IiwgIkNGQjMyIiwgIkNGQjQwIiwgIkNGQjQ4IiwgIkNGQjU2IiwKLSAgICAgICAgICAgICAgICAgICAgIkNGQjY0IiwKLSAgICAgICAgICAgICAgICAgICAgLy9PRkJ4Ci0gICAgICAgICAgICAgICAgICAgICJPRkIiLCAiT0ZCOCIsICJPRkIxNiIsICJPRkIyNCIsICJPRkIzMiIsICJPRkI0MCIsICJPRkI0OCIsICJPRkI1NiIsCi0gICAgICAgICAgICAgICAgICAgICJPRkI2NCJ9LAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiTm9QYUREaW5nIiwgIlBLQ1M1UGFkZGluZyJ9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbmV3IFRlc3RDaXBoZXJERVMoKS5ydW5BbGwoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvREVTL1Rlc3RDaXBoZXJERVNlZGUuamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9ERVMvVGVzdENpcGhlckRFU2VkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzk1OTg1Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9ERVMvVGVzdENpcGhlckRFU2VkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ4NjAxCi0gKiBAbGlicmFyeSAuLi8KLSAqIEBzdW1tYXJ5IFRlc3QgREVTL0RFU2VkZSBjaXBoZXIgd2l0aCBkaWZmZXJlbnQgTU9ERVMgYW5kIHBhZGRpbmcKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdENpcGhlckRFU2VkZSBleHRlbmRzIFRlc3RDaXBoZXIgewotCi0gICAgVGVzdENpcGhlckRFU2VkZSgpIHsKLSAgICAgICAgc3VwZXIoIkRFU2VkZSIsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJDQkMiLCAiQ1RSIiwgIkNUUyIsICJFQ0IiLCAiUENCQyIsCi0gICAgICAgICAgICAgICAgICAgIC8vQ0ZCeAotICAgICAgICAgICAgICAgICAgICAiQ0ZCIiwgIkNGQjgiLCAiQ0ZCMTYiLCAiQ0ZCMjQiLCAiQ0ZCMzIiLCAiQ0ZCNDAiLCAiQ0ZCNDgiLCAiQ0ZCNTYiLAotICAgICAgICAgICAgICAgICAgICAiQ0ZCNjQiLAotICAgICAgICAgICAgICAgICAgICAvL09GQngKLSAgICAgICAgICAgICAgICAgICAgIk9GQiIsICJPRkI4IiwgIk9GQjE2IiwgIk9GQjI0IiwgIk9GQjMyIiwgIk9GQjQwIiwgIk9GQjQ4IiwgIk9GQjU2IiwKLSAgICAgICAgICAgICAgICAgICAgIk9GQjY0In0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJOb1BhRERpbmciLCAiUEtDUzVQYWRkaW5nIn0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBuZXcgVGVzdENpcGhlckRFU2VkZSgpLnJ1bkFsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9QQkUvVGVzdENpcGhlclBCRS5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1BCRS9UZXN0Q2lwaGVyUEJFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDQ5ODkuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1BCRS9UZXN0Q2lwaGVyUEJFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5vdXQ7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5QQkVLZXlTcGVjOwotaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlBCRVBhcmFtZXRlclNwZWM7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ4NjAxCi0gKiBAc3VtbWFyeSBUZXN0cyBmb3IgUEJFIGNpcGhlcnMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDaXBoZXJQQkUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUxHT1JJVEhNUyA9IHsiUEJFV2l0aE1ENUFuZERFUyIsCi0gICAgICAgICJQQkVXaXRoTUQ1QW5kREVTL0NCQy9QS0NTNVBhZGRpbmciLCAiUEJFV2l0aE1ENUFuZFRyaXBsZURFUyIsCi0gICAgICAgICJQQkVXaXRoTUQ1QW5kVHJpcGxlREVTL0NCQy9QS0NTNVBhZGRpbmcifTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxHTyA9ICJwYmVXaXRoTUQ1QU5EZGVzIjsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBTQUxUOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIFBMQUlOX1RFWFQ7Ci0KLSAgICBwdWJsaWMgVGVzdENpcGhlclBCRSgpIHsKLSAgICAgICAgU0FMVCA9IGdlbmVyYXRlQnl0ZXMoOCk7Ci0gICAgICAgIFBMQUlOX1RFWFQgPSBnZW5lcmF0ZUJ5dGVzKDIwMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgbmV3IFRlc3RDaXBoZXJQQkUoKS5ydW5BbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcnVuQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFsZ29yaXRobSA6IEFMR09SSVRITVMpIHsKLSAgICAgICAgICAgIHJ1blRlc3QoYWxnb3JpdGhtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0KFN0cmluZyBhbGdvcml0aG0pCi0gICAgICAgICAgICB0aHJvd3MgSW52YWxpZEtleVNwZWNFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIFNob3J0QnVmZmVyRXhjZXB0aW9uLAotICAgICAgICAgICAgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24sIEludmFsaWRLZXlFeGNlcHRpb24gewotCi0gICAgICAgIG91dC5wcmludGxuKCI9PiBUZXN0aW5nOiAiICsgYWxnb3JpdGhtKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24KLSAgICAgICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYWxnb1BhcmFtU3BlYwotICAgICAgICAgICAgICAgICAgICA9IG5ldyBQQkVQYXJhbWV0ZXJTcGVjKFNBTFQsIDYpOwotCi0gICAgICAgICAgICBTZWNyZXRLZXkgc2VjcmV0S2V5Ci0gICAgICAgICAgICAgICAgICAgID0gU2VjcmV0S2V5RmFjdG9yeS5nZXRJbnN0YW5jZShLRVlfQUxHTykuZ2VuZXJhdGVTZWNyZXQoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBQQkVLZXlTcGVjKCgiU2VjcmV0IEtleSBWYWx1ZSIpLnRvQ2hhckFycmF5KCkpKTsKLQotICAgICAgICAgICAgQ2lwaGVyIGNpID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ29yaXRobSk7Ci0gICAgICAgICAgICBjaS5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIHNlY3JldEtleSwgYWxnb1BhcmFtU3BlYyk7Ci0KLSAgICAgICAgICAgIC8vIEVuY3J5cHRpb24KLSAgICAgICAgICAgIGJ5dGVbXSBjaXBoZXJUZXh0ID0gY2kuZG9GaW5hbChQTEFJTl9URVhUKTsKLQotICAgICAgICAgICAgLy8gRGVjcnlwdGlvbgotICAgICAgICAgICAgY2kuaW5pdChDaXBoZXIuREVDUllQVF9NT0RFLCBzZWNyZXRLZXksIGFsZ29QYXJhbVNwZWMpOwotICAgICAgICAgICAgYnl0ZVtdIHJlY292ZXJlZFRleHQgPSBjaS5kb0ZpbmFsKGNpcGhlclRleHQpOwotCi0gICAgICAgICAgICBpZiAoYWxnb3JpdGhtLmNvbnRhaW5zKCJUcmlwbGVERVMiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIEludmFsaWRLZXlFeGNlcHRpb24gZXhjZXB0aW9uIHVuY2F1Z2giKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ29tcGFyaXNvbgotICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKFBMQUlOX1RFWFQsIHJlY292ZXJlZFRleHQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCBmYWlsZWQ6IHBsYWluVGV4dCBpcyBub3QgZXF1YWwgdG8gcmVjb3ZlcmVkVGV4dCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oIlRlc3QgUGFzc2VkLiIpOwotICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoYWxnb3JpdGhtLmNvbnRhaW5zKCJUcmlwbGVERVMiKSkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJFeHBlY3RlZCBJbnZhbGlkS2V5RXhjZXB0aW9uIHJhaXNlZCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZW5lcmF0ZUJ5dGVzKGludCBsZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgKGkgJiAweGZmKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1Rlc3RDaXBoZXIuamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9UZXN0Q2lwaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjI1YzcuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1Rlc3RDaXBoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuQWxnb3JpdGhtUGFyYW1ldGVyU3BlYzsKLQotaW1wb3J0IGphdmF4LmNyeXB0by5CYWRQYWRkaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7Ci1pbXBvcnQgamF2YXguY3J5cHRvLklsbGVnYWxCbG9ja1NpemVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5JdlBhcmFtZXRlclNwZWM7Ci1pbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKLQotLyoqCi0gKiBUaGlzIGlzIGEgYWJzdHJhY3QgY2xhc3MgdXNlZCB0byB0ZXN0IHZhcmlvdXMgY2lwaGVycwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdENpcGhlciB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBTVU5KQ0UgPSAiU3VuSkNFIjsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBBTEdPUklUSE07Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBNT0RFUzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIFBBRERJTkdTOwotCi0gICAgLyogVXNlZCB0byB0ZXN0IGNpcGhlciB3aXRoIGRpZmZlcmVudCBrZXkgc3RyZW5ndGhzCi0gICAgICAgS2V5IHNpemUgdGVzdGVkIGlzIGluY3JlbWVudCBvZiBLRVlDVVRURVIgZnJvbSBNSU5JTVVNX0tFWV9TSVpFIHRvCi0gICAgICAgbWF4aW11bSBhbGxvd2VkIGtleXNpemUuCi0gICAgICAgREVTL0RFU2VkZS9CbG93ZmlzaCB3b3JrIHdpdGggY3VycmVudGx5IHNlbGVjdGVkIGtleSBzaXplcy4KLSAgICAqLwotICAgIHByaXZhdGUgZmluYWwgaW50IHZhcmlvdXNLZXlTaXplOwotICAgIHByaXZhdGUgZmluYWwgaW50IEtFWUNVVFRFUiA9IDg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgTUlOSU1VTV9LRVlfU0laRSA9IDMyOwotCi0gICAgLy8gVXNlZCB0byBhc3NlcnQgdGhhdCBFbmNyeXB0aW9uL0RlY3J5cHRpb24gd29ya3Mgd2l0aCBzYW1lIGJ1ZmZlcgotICAgIC8vIFRFWFRfTEVOIGlzIG11bHRpcGxlIG9mIGJsb2NrcyBpbiBvcmRlciB0byB3b3JrIGFnYWluc3QgY2lwaGVycyB3LyBOb1BhZGRpbmcKLSAgICBwcml2YXRlIGZpbmFsIGludCBURVhUX0xFTiA9IDgwMDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBFTkNfT0ZGU0VUID0gNjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBTVE9SQUdFX09GRlNFVCA9IDM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgUEFEX0JZVEVTID0gMTY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBJVjsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBJTlBVVF9URVhUOwotCi0gICAgVGVzdENpcGhlcihTdHJpbmcgYWxnbywgU3RyaW5nW10gbW9kZXMsIFN0cmluZ1tdIHBhZGRpbmdzLAotICAgICAgICAgICAgYm9vbGVhbiBrZXlTdHJlbmd0aCkgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFMR09SSVRITSA9IGFsZ287Ci0gICAgICAgIE1PREVTID0gbW9kZXM7Ci0gICAgICAgIFBBRERJTkdTID0gcGFkZGluZ3M7Ci0gICAgICAgIHRoaXMudmFyaW91c0tleVNpemUKLSAgICAgICAgICAgICAgICA9IGtleVN0cmVuZ3RoID8gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoQUxHT1JJVEhNKSA6IDA7Ci0KLSAgICAgICAgSVYgPSBnZW5lcmF0ZUJ5dGVzKDgpOwotICAgICAgICBJTlBVVF9URVhUID0gZ2VuZXJhdGVCeXRlcyhURVhUX0xFTiArIFBBRF9CWVRFUyArIEVOQ19PRkZTRVQpOwotICAgIH0KLQotICAgIFRlc3RDaXBoZXIoU3RyaW5nIGFsZ28sIFN0cmluZ1tdIG1vZGVzLCBTdHJpbmdbXSBwYWRkaW5ncykgewotICAgICAgICBBTEdPUklUSE0gPSBhbGdvOwotICAgICAgICBNT0RFUyA9IG1vZGVzOwotICAgICAgICBQQURESU5HUyA9IHBhZGRpbmdzOwotICAgICAgICB2YXJpb3VzS2V5U2l6ZSA9IDA7Ci0KLSAgICAgICAgSVYgPSBnZW5lcmF0ZUJ5dGVzKDgpOwotICAgICAgICBJTlBVVF9URVhUID0gZ2VuZXJhdGVCeXRlcyhURVhUX0xFTiArIFBBRF9CWVRFUyArIEVOQ19PRkZTRVQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBnZW5lcmF0ZUJ5dGVzKGludCBsZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgKGkgJiAweGZmKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzS2V5U3RyZW50aFN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuICh2YXJpb3VzS2V5U2l6ZSAhPSAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5BbGwoKSB0aHJvd3MgSW52YWxpZEtleUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaFBhZGRpbmdFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCi0gICAgICAgICAgICBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEJhZFBhZGRpbmdFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIHsKLQotICAgICAgICBmb3IgKFN0cmluZyBtb2RlIDogTU9ERVMpIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhZGRpbmcgOiBQQURESU5HUykgewotICAgICAgICAgICAgICAgIGlmICghaXNLZXlTdHJlbnRoU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVuVGVzdChtb2RlLCBwYWRkaW5nLCAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQga2V5U2l6ZSA9IHZhcmlvdXNLZXlTaXplOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoa2V5U2l6ZSA+PSBNSU5JTVVNX0tFWV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiV2l0aCBLZXkgU3RyZW5ndGg6ICIgKyBrZXlTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRlc3QobW9kZSwgcGFkZGluZywga2V5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBrZXlTaXplIC09IEtFWUNVVFRFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBydW5UZXN0KFN0cmluZyBtbywgU3RyaW5nIHBhZCwgaW50IGtleVNpemUpCi0gICAgICAgICAgICB0aHJvd3MgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiwgQmFkUGFkZGluZ0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIFNob3J0QnVmZmVyRXhjZXB0aW9uLCBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLAotICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBUUkFOU0ZPUk1BVElPTiA9IEFMR09SSVRITSArICIvIiArIG1vICsgIi8iICsgcGFkOwotICAgICAgICBvdXQucHJpbnRsbigiVGVzdGluZzogIiArIFRSQU5TRk9STUFUSU9OKTsKLQotICAgICAgICAvLyBJbml0aWFsaXphdGlvbgotICAgICAgICBDaXBoZXIgY2kgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoVFJBTlNGT1JNQVRJT04sIFNVTkpDRSk7Ci0gICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShBTEdPUklUSE0sIFNVTkpDRSk7Ci0gICAgICAgIGlmIChrZXlTaXplICE9IDApIHsKLSAgICAgICAgICAgIGtnLmluaXQoa2V5U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU2VjcmV0S2V5IGtleSA9IGtnLmdlbmVyYXRlS2V5KCk7Ci0gICAgICAgIFNlY3JldEtleVNwZWMgc2tleVNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXkuZ2V0RW5jb2RlZCgpLCBBTEdPUklUSE0pOwotCi0gICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhJVik7Ci0gICAgICAgIGlmIChtby5lcXVhbHNJZ25vcmVDYXNlKCJFQ0IiKSkgewotICAgICAgICAgICAgY2kuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2kuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBrZXksIGFwcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbmNyeXB0aW9uCi0KLSAgICAgICAgYnl0ZVtdIHBsYWluVGV4dCA9IElOUFVUX1RFWFQuY2xvbmUoKTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBjaXBoZXIgYW5kIHNhdmUgdG8gc2VwYXJhdGUgYnVmZmVyCi0gICAgICAgIGJ5dGVbXSBjaXBoZXJUZXh0ID0gY2kuZG9GaW5hbChJTlBVVF9URVhULCBFTkNfT0ZGU0VULCBURVhUX0xFTik7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgY2lwaGVyIGFuZCBzYXZlIHRvIHNhbWUgYnVmZmVyCi0gICAgICAgIGludCBlbmNfYnl0ZXMgPSBjaS51cGRhdGUoCi0gICAgICAgICAgICAgICAgSU5QVVRfVEVYVCwgRU5DX09GRlNFVCwgVEVYVF9MRU4sIElOUFVUX1RFWFQsIFNUT1JBR0VfT0ZGU0VUKTsKLSAgICAgICAgZW5jX2J5dGVzICs9IGNpLmRvRmluYWwoSU5QVVRfVEVYVCwgZW5jX2J5dGVzICsgU1RPUkFHRV9PRkZTRVQpOwotCi0gICAgICAgIGlmICghZXF1YWxzQmxvY2soCi0gICAgICAgICAgICAgICAgSU5QVVRfVEVYVCwgU1RPUkFHRV9PRkZTRVQsIGVuY19ieXRlcywKLSAgICAgICAgICAgICAgICBjaXBoZXJUZXh0LCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRGlmZmVyZW50IGNpcGhlcnMgZ2VuZXJhdGVkIHdpdGggc2FtZSBidWZmZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlY3J5cHRpb24KLSAgICAgICAgaWYgKG1vLmVxdWFsc0lnbm9yZUNhc2UoIkVDQiIpKSB7Ci0gICAgICAgICAgICBjaS5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHNrZXlTcGVjKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNpLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgc2tleVNwZWMsIGFwcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWNvdmVyIHRleHQgZnJvbSBjaXBoZXIgYW5kIHNhdmUgdG8gc2VwYXJhdGUgYnVmZmVyCi0gICAgICAgIGJ5dGVbXSByZWNvdmVyZWRUZXh0ID0gY2kuZG9GaW5hbChjaXBoZXJUZXh0LCAwLCBjaXBoZXJUZXh0Lmxlbmd0aCk7Ci0KLSAgICAgICAgaWYgKCFlcXVhbHNCbG9jaygKLSAgICAgICAgICAgICAgICBwbGFpblRleHQsIEVOQ19PRkZTRVQsIFRFWFRfTEVOLAotICAgICAgICAgICAgICAgIHJlY292ZXJlZFRleHQsIDAsIHJlY292ZXJlZFRleHQubGVuZ3RoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJSZWNvdmVyZWQgdGV4dCBub3Qgc2FtZSBhcyBwbGFpbiB0ZXh0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiUmVjb3ZlcmVkIGFuZCBwbGFpbiB0ZXh0IGFyZSBzYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWNvdmVyIHRleHQgZnJvbSBjaXBoZXIgYW5kIHNhdmUgdG8gc2FtZSBidWZmZXIKLSAgICAgICAgaW50IGRlY19ieXRlcyA9IGNpLnVwZGF0ZSgKLSAgICAgICAgICAgICAgICBJTlBVVF9URVhULCBTVE9SQUdFX09GRlNFVCwgZW5jX2J5dGVzLCBJTlBVVF9URVhULCBFTkNfT0ZGU0VUKTsKLSAgICAgICAgZGVjX2J5dGVzICs9IGNpLmRvRmluYWwoSU5QVVRfVEVYVCwgZGVjX2J5dGVzICsgRU5DX09GRlNFVCk7Ci0KLSAgICAgICAgaWYgKCFlcXVhbHNCbG9jaygKLSAgICAgICAgICAgICAgICBwbGFpblRleHQsIEVOQ19PRkZTRVQsIFRFWFRfTEVOLAotICAgICAgICAgICAgICAgIElOUFVUX1RFWFQsIEVOQ19PRkZTRVQsIGRlY19ieXRlcykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiUmVjb3ZlcmVkIHRleHQgbm90IHNhbWUgYXMgcGxhaW4gdGV4dCB3aXRoIHNhbWUgYnVmZmVyIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiUmVjb3ZlcmVkIGFuZCBwbGFpbiB0ZXh0IGFyZSBzYW1lIHdpdGggc2FtZSBidWZmZXIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKCJUZXN0IFBhc3NlZC4iKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc0Jsb2NrKGJ5dGVbXSBiMSwgaW50IG9mZjEsIGludCBsZW4xLAotICAgICAgICAgICAgYnl0ZVtdIGIyLCBpbnQgb2ZmMiwgaW50IGxlbjIpIHsKLSAgICAgICAgaWYgKGxlbjEgIT0gbGVuMikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSBvZmYxLCBqID0gb2ZmMiwgayA9IDA7IGsgPCBsZW4xOyBpKyssIGorKywgaysrKSB7Ci0gICAgICAgICAgICBpZiAoYjFbaV0gIT0gYjJbal0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1RleHRMZW5ndGgvREVTQ2lwaGVyV3JhcHBlci5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1RleHRMZW5ndGgvREVTQ2lwaGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU1MWE0Ny4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvVGV4dExlbmd0aC9ERVNDaXBoZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5vdXQ7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOwotaW1wb3J0IGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3I7Ci1pbXBvcnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuSXZQYXJhbWV0ZXJTcGVjOwotCi0vKioKLSAqIFdyYXBwZXIgY2xhc3MgdG8gdGVzdCBhIGdpdmVuIERFUyBhbGdvcml0aG0uCi0gKi8KLXB1YmxpYyBjbGFzcyBERVNDaXBoZXJXcmFwcGVyIHsKLQotICAgIHByaXZhdGUgZmluYWwgQ2lwaGVyIGNpOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGl2OwotICAgIHByaXZhdGUgZmluYWwgU2VjcmV0S2V5IGtleTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGdvOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1vZGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFkOwotICAgIHByaXZhdGUgZmluYWwgaW50IGtleVN0cmVuZ3RoOwotICAgIHByaXZhdGUgYnl0ZVtdIHJlc3VsdFRleHQgPSBudWxsOwotCi0gICAgcHVibGljIERFU0NpcGhlcldyYXBwZXIoU3RyaW5nIGFsZ28sIFN0cmluZyBtb2RlLCBTdHJpbmcgcGFkKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNpID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ28gKyAiLyIgKyBtb2RlICsgIi8iICsgcGFkKTsKLQotICAgICAgICBpdiA9IG5ldyBieXRlWzhdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICAgICAgaXZbaV0gPSAoYnl0ZSkgKGkgJiAweGZmKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleUdlbmVyYXRvciBrZyA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShhbGdvKTsKLSAgICAgICAga2V5ID0ga2cuZ2VuZXJhdGVLZXkoKTsKLSAgICAgICAga2V5U3RyZW5ndGggPSBhbGdvLmVxdWFsc0lnbm9yZUNhc2UoIkRFU2VkZSIpID8gMTEyCi0gICAgICAgICAgICAgICAgOiBrZXkuZ2V0RW5jb2RlZCgpLmxlbmd0aCAqIDg7Ci0KLSAgICAgICAgdGhpcy5hbGdvID0gYWxnbzsKLSAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICAgICAgdGhpcy5wYWQgPSBwYWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHRUZXh0LmNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShpbnQgZWRNb2RlLCBieXRlW10gaW5wdXRUZXh0KQotICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sCi0gICAgICAgICAgICBJbGxlZ2FsQmxvY2tTaXplRXhjZXB0aW9uLCBCYWRQYWRkaW5nRXhjZXB0aW9uLAotICAgICAgICAgICAgU2hvcnRCdWZmZXJFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFsZ29yaXRobVBhcmFtZXRlclNwZWMgYXBzID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFtb2RlLmVxdWFsc0lnbm9yZUNhc2UoIkVDQiIpKSB7Ci0gICAgICAgICAgICAgICAgYXBzID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhpdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaS5pbml0KGVkTW9kZSwga2V5LCBhcHMpOwotCi0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIHJlc3VsdFRleHQgdXNpbmcgYSBzaW5nbGUtcGFydCBlbmMvZGVjCi0gICAgICAgICAgICByZXN1bHRUZXh0ID0gY2kuZG9GaW5hbChpbnB1dFRleHQpOwotCi0gICAgICAgICAgICAvLyBHZW5lcmF0ZSBvdXRwdXRUZXh0IGZvciBlYWNoIG11bHRpLXBhcnQgZW4vZGUtY3J5cHRpb24KLSAgICAgICAgICAgIC8qIENvbWJpbmF0aW9uICMxOgotICAgICAgICAgICAgdXBkYXRlKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAgICBkb0ZpbmFsKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0MTEgPSBjaS51cGRhdGUoaW5wdXRUZXh0LCAwLCBpbnB1dFRleHQubGVuZ3RoKTsKLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0MTIgPSBjaS5kb0ZpbmFsKCk7Ci0gICAgICAgICAgICBieXRlW10gb3V0cHV0VGV4dDEgPSBuZXcgYnl0ZVtwYXJ0MTEubGVuZ3RoICsgcGFydDEyLmxlbmd0aF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQxMSwgMCwgb3V0cHV0VGV4dDEsIDAsIHBhcnQxMS5sZW5ndGgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0MTIsIDAsIG91dHB1dFRleHQxLCBwYXJ0MTEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBwYXJ0MTIubGVuZ3RoKTsKLQotICAgICAgICAgICAgTGlzdDxieXRlW10+IG91dHB1dFRleHRzID0gbmV3IEFycmF5TGlzdDw+KDQpOwotICAgICAgICAgICAgb3V0cHV0VGV4dHMuYWRkKG91dHB1dFRleHQxKTsKLQotICAgICAgICAgICAgLyogQ29tYmluYXRpb24gIzI6Ci0gICAgICAgICAgICB1cGRhdGUoYnl0ZVtdLCBpbnQsIGludCkKLSAgICAgICAgICAgIGRvRmluYWwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0MjEgPSBjaS51cGRhdGUoaW5wdXRUZXh0LCAwLCBpbnB1dFRleHQubGVuZ3RoIC0gNSk7Ci0gICAgICAgICAgICBieXRlW10gcGFydDIyID0gbmV3IGJ5dGVbY2kuZ2V0T3V0cHV0U2l6ZShpbnB1dFRleHQubGVuZ3RoKV07Ci0gICAgICAgICAgICBpbnQgbGVuMiA9IGNpCi0gICAgICAgICAgICAgICAgICAgIC5kb0ZpbmFsKGlucHV0VGV4dCwgaW5wdXRUZXh0Lmxlbmd0aCAtIDUsIDUsIHBhcnQyMiwgMCk7Ci0gICAgICAgICAgICBieXRlW10gb3V0cHV0VGV4dDIgPSBuZXcgYnl0ZVtwYXJ0MjEubGVuZ3RoICsgbGVuMl07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQyMSwgMCwgb3V0cHV0VGV4dDIsIDAsIHBhcnQyMS5sZW5ndGgpOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0MjIsIDAsIG91dHB1dFRleHQyLCBwYXJ0MjEubGVuZ3RoLCBsZW4yKTsKLQotICAgICAgICAgICAgb3V0cHV0VGV4dHMuYWRkKG91dHB1dFRleHQyKTsKLQotICAgICAgICAgICAgLyogQ29tYmluYXRpb24gIzM6Ci0gICAgICAgICAgICB1cGRhdGUoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICAgICAgICBkb0ZpbmFsKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0MzEgPSBuZXcgYnl0ZVtjaS5nZXRPdXRwdXRTaXplKGlucHV0VGV4dC5sZW5ndGgpXTsKLSAgICAgICAgICAgIGludCBsZW4zID0gY2kudXBkYXRlKGlucHV0VGV4dCwgMCwgaW5wdXRUZXh0Lmxlbmd0aCAtIDgsIHBhcnQzMSwgMCk7Ci0gICAgICAgICAgICBieXRlW10gcGFydDMyID0gY2kuZG9GaW5hbChpbnB1dFRleHQsIGlucHV0VGV4dC5sZW5ndGggLSA4LCA4KTsKLSAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXRUZXh0MyA9IG5ldyBieXRlW2xlbjMgKyBwYXJ0MzIubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGFydDMxLCAwLCBvdXRwdXRUZXh0MywgMCwgbGVuMyk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQzMiwgMCwgb3V0cHV0VGV4dDMsIGxlbjMsIHBhcnQzMi5sZW5ndGgpOwotCi0gICAgICAgICAgICBvdXRwdXRUZXh0cy5hZGQob3V0cHV0VGV4dDMpOwotCi0gICAgICAgICAgICAvKiBDb21iaW5hdGlvbiAjNDoKLSAgICAgICAgICAgIHVwZGF0ZShieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKLSAgICAgICAgICAgIGRvRmluYWwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZVtdLCBpbnQpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJ5dGVbXSBwYXJ0NDEgPSBuZXcgYnl0ZVtjaS5nZXRPdXRwdXRTaXplKGlucHV0VGV4dC5sZW5ndGgpXTsKLSAgICAgICAgICAgIGludCBsZW40ID0gY2kudXBkYXRlKGlucHV0VGV4dCwgMCwgaW5wdXRUZXh0Lmxlbmd0aCAtIDgsIHBhcnQ0MSwgMCk7Ci0gICAgICAgICAgICBpbnQgcmVzdDQgPSBjaS5kb0ZpbmFsKGlucHV0VGV4dCwgaW5wdXRUZXh0Lmxlbmd0aCAtIDgsIDgsIHBhcnQ0MSwKLSAgICAgICAgICAgICAgICAgICAgbGVuNCk7Ci0gICAgICAgICAgICBieXRlW10gb3V0cHV0VGV4dDQgPSBuZXcgYnl0ZVtsZW40ICsgcmVzdDRdOwotICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0NDEsIDAsIG91dHB1dFRleHQ0LCAwLCBvdXRwdXRUZXh0NC5sZW5ndGgpOwotCi0gICAgICAgICAgICBvdXRwdXRUZXh0cy5hZGQob3V0cHV0VGV4dDQpOwotCi0gICAgICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgb3V0cHV0VGV4dHMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMocmVzdWx0VGV4dCwgb3V0cHV0VGV4dHMuZ2V0KGspKSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiIFRlc3Rpbmc6ICIgKyBhbGdvICsgIi8iICsgbW9kZSArICIvIiArIHBhZCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJlIHZhbHVlIG9mIHJlc3VsdFRleHQgYW5kIGNvbWJpbmF0aW9uICIgKyBrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFyZSBub3Qgc2FtZS4gVGVzdCBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGtleVN0cmVuZ3RoID4gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoYWxnbykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBleGNlcHRpb24gdW5jYXVnaHQsIGtleVN0cmVuZ3RoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsga2V5U3RyZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBpZiAoa2V5U3RyZW5ndGggPD0gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoYWxnbykpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVW5leHBlY3RlZCBleGNlcHRpb24gaW4gIiArIGFsZ28gKyAiLyIgKyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIvIiArIHBhZCArICIgLCAgS2V5U2l6ZSAiICsga2V5U3RyZW5ndGgpOwotICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oIkNhdWdodCBJbnZhbGlkS2V5RXhjZXB0aW9uIGFzIGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvVGV4dExlbmd0aC9QQkVDaXBoZXJXcmFwcGVyLmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2NyeXB0by9wcm92aWRlci9DaXBoZXIvVGV4dExlbmd0aC9QQkVDaXBoZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjUyMTUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1RleHRMZW5ndGgvUEJFQ2lwaGVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkFsZ29yaXRobVBhcmFtZXRlclNwZWM7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkludmFsaWRLZXlTcGVjRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YXguY3J5cHRvLkJhZFBhZGRpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uSWxsZWdhbEJsb2NrU2l6ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5OwotaW1wb3J0IGphdmF4LmNyeXB0by5TaG9ydEJ1ZmZlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5JdlBhcmFtZXRlclNwZWM7Ci1pbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUEJFS2V5U3BlYzsKLWltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5QQkVQYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7Ci0KLS8qKgotICogUEJFQ2lwaGVyV3JhcHBlciBpcyB0aGUgYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBjb25jcmV0ZSBQQkUgQ2lwaGVyIHdyYXBwZXJzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUEJFQ2lwaGVyV3JhcHBlciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVSQVRJT05fQ09VTlQgPSAxMDAwOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzYWx0OwotICAgIHByb3RlY3RlZCBTZWNyZXRLZXkga2V5OwotICAgIHByb3RlY3RlZCBDaXBoZXIgY2k7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlQWxnbzsKLSAgICBwcm90ZWN0ZWQgYnl0ZVtdIHJlc3VsdFRleHQgPSBudWxsOwotICAgIHByb3RlY3RlZCBBbGdvcml0aG1QYXJhbWV0ZXJTcGVjIGFwcyA9IG51bGw7Ci0KLSAgICBwdWJsaWMgUEJFQ2lwaGVyV3JhcHBlcihTdHJpbmcgYWxnb3JpdGhtLCBpbnQgc2FsdFNpemUpIHsKLSAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07Ci0gICAgICAgIGJhc2VBbGdvID0gYWxnb3JpdGhtLnNwbGl0KCIvIilbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgc2FsdCA9IGdlbmVyYXRlU2FsdChzYWx0U2l6ZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdENpcGhlcihpbnQgbW9kZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLCBJbnZhbGlkUGFyYW1ldGVyU3BlY0V4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoaW50IGVkTW9kZSwgYnl0ZVtdIGlucHV0VGV4dCkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkQWxnb3JpdGhtUGFyYW1ldGVyRXhjZXB0aW9uLAotICAgICAgICAgICAgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24sIElsbGVnYWxCbG9ja1NpemVFeGNlcHRpb24sCi0gICAgICAgICAgICBCYWRQYWRkaW5nRXhjZXB0aW9uLCBTaG9ydEJ1ZmZlckV4Y2VwdGlvbiwgSW52YWxpZEtleUV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEluaXRpYWxpemUKLSAgICAgICAgaW5pdENpcGhlcihlZE1vZGUpOwotCi0gICAgICAgIC8vIEdlbmVyYXRlIGEgcmVzdWx0VGV4dCB1c2luZyBhIHNpbmdsZS1wYXJ0IGVuYy9kZWMKLSAgICAgICAgcmVzdWx0VGV4dCA9IGNpLmRvRmluYWwoaW5wdXRUZXh0KTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBvdXRwdXRUZXh0IGZvciBlYWNoIG11bHRpLXBhcnQgZW4vZGUtY3J5cHRpb24KLSAgICAgICAgLyogQ29tYmluYXRpb24gIzE6Ci0gICAgICAgIHVwZGF0ZShieXRlW10sIGludCwgaW50KQotICAgICAgICBkb0ZpbmFsKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAqLwotICAgICAgICBieXRlW10gcGFydDExID0gY2kudXBkYXRlKGlucHV0VGV4dCwgMCwgaW5wdXRUZXh0Lmxlbmd0aCk7Ci0gICAgICAgIGJ5dGVbXSBwYXJ0MTIgPSBjaS5kb0ZpbmFsKCk7Ci0gICAgICAgIGJ5dGVbXSBvdXRwdXRUZXh0MSA9IG5ldyBieXRlW3BhcnQxMS5sZW5ndGggKyBwYXJ0MTIubGVuZ3RoXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0MTEsIDAsIG91dHB1dFRleHQxLCAwLCBwYXJ0MTEubGVuZ3RoKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0MTIsIDAsIG91dHB1dFRleHQxLCBwYXJ0MTEubGVuZ3RoLCBwYXJ0MTIubGVuZ3RoKTsKLQotICAgICAgICBMaXN0PGJ5dGVbXT4gb3V0cHV0VGV4dHMgPSBuZXcgQXJyYXlMaXN0PD4oNCk7Ci0gICAgICAgIG91dHB1dFRleHRzLmFkZChvdXRwdXRUZXh0MSk7Ci0KLSAgICAgICAgLyogQ29tYmluYXRpb24gIzI6Ci0gICAgICAgIHVwZGF0ZShieXRlW10sIGludCwgaW50KQotICAgICAgICBkb0ZpbmFsKGJ5dGVbXSwgaW50LCBpbnQsIGJ5dGVbXSwgaW50KQotICAgICAgICAgKi8KLSAgICAgICAgYnl0ZVtdIHBhcnQyMSA9IGNpLnVwZGF0ZShpbnB1dFRleHQsIDAsIGlucHV0VGV4dC5sZW5ndGggLSA1KTsKLSAgICAgICAgYnl0ZVtdIHBhcnQyMiA9IG5ldyBieXRlW2NpLmdldE91dHB1dFNpemUoaW5wdXRUZXh0Lmxlbmd0aCldOwotICAgICAgICBpbnQgbGVuMiA9IGNpLmRvRmluYWwoaW5wdXRUZXh0LCBpbnB1dFRleHQubGVuZ3RoIC0gNSwgNSwgcGFydDIyLCAwKTsKLSAgICAgICAgYnl0ZVtdIG91dHB1dFRleHQyID0gbmV3IGJ5dGVbcGFydDIxLmxlbmd0aCArIGxlbjJdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQyMSwgMCwgb3V0cHV0VGV4dDIsIDAsIHBhcnQyMS5sZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQyMiwgMCwgb3V0cHV0VGV4dDIsIHBhcnQyMS5sZW5ndGgsIGxlbjIpOwotCi0gICAgICAgIG91dHB1dFRleHRzLmFkZChvdXRwdXRUZXh0Mik7Ci0KLSAgICAgICAgLyogQ29tYmluYXRpb24gIzM6Ci0gICAgICAgIHVwZGF0ZShieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKLSAgICAgICAgZG9GaW5hbChieXRlW10sIGludCwgaW50KQotICAgICAgICAgKi8KLSAgICAgICAgYnl0ZVtdIHBhcnQzMSA9IG5ldyBieXRlW2NpLmdldE91dHB1dFNpemUoaW5wdXRUZXh0Lmxlbmd0aCldOwotICAgICAgICBpbnQgbGVuMyA9IGNpLnVwZGF0ZShpbnB1dFRleHQsIDAsIGlucHV0VGV4dC5sZW5ndGggLSA4LCBwYXJ0MzEsIDApOwotICAgICAgICBieXRlW10gcGFydDMyID0gY2kuZG9GaW5hbChpbnB1dFRleHQsIGlucHV0VGV4dC5sZW5ndGggLSA4LCA4KTsKLSAgICAgICAgYnl0ZVtdIG91dHB1dFRleHQzID0gbmV3IGJ5dGVbbGVuMyArIHBhcnQzMi5sZW5ndGhdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQzMSwgMCwgb3V0cHV0VGV4dDMsIDAsIGxlbjMpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQzMiwgMCwgb3V0cHV0VGV4dDMsIGxlbjMsIHBhcnQzMi5sZW5ndGgpOwotCi0gICAgICAgIG91dHB1dFRleHRzLmFkZChvdXRwdXRUZXh0Myk7Ci0KLSAgICAgICAgLyogQ29tYmluYXRpb24gIzQ6Ci0gICAgICAgIHVwZGF0ZShieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKLSAgICAgICAgZG9GaW5hbChieXRlW10sIGludCwgaW50LCBieXRlW10sIGludCkKLSAgICAgICAgICovCi0gICAgICAgIGJ5dGVbXSBwYXJ0NDEgPSBuZXcgYnl0ZVtjaS5nZXRPdXRwdXRTaXplKGlucHV0VGV4dC5sZW5ndGgpXTsKLSAgICAgICAgaW50IGxlbjQgPSBjaS51cGRhdGUoaW5wdXRUZXh0LCAwLCBpbnB1dFRleHQubGVuZ3RoIC0gOCwgcGFydDQxLCAwKTsKLSAgICAgICAgaW50IHJlc3Q0ID0gY2kKLSAgICAgICAgICAgICAgICAuZG9GaW5hbChpbnB1dFRleHQsIGlucHV0VGV4dC5sZW5ndGggLSA4LCA4LCBwYXJ0NDEsIGxlbjQpOwotICAgICAgICBieXRlW10gb3V0cHV0VGV4dDQgPSBuZXcgYnl0ZVtsZW40ICsgcmVzdDRdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnQ0MSwgMCwgb3V0cHV0VGV4dDQsIDAsIG91dHB1dFRleHQ0Lmxlbmd0aCk7Ci0KLSAgICAgICAgb3V0cHV0VGV4dHMuYWRkKG91dHB1dFRleHQ0KTsKLQotICAgICAgICAvLyBDb21wYXJlIHJlc3VsdHMKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBvdXRwdXRUZXh0cy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHJlc3VsdFRleHQsIG91dHB1dFRleHRzLmdldChrKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJlIHZhbHVlIG9mIHJlc3VsdFRleHQgYW5kIGNvbWJpbmF0aW9uICIgKyBrCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYXJlIG5vdCBzYW1lLiBUZXN0IGZhaWxlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGJ5dGVbXSBnZW5lcmF0ZVNhbHQoaW50IG51bWJlck9mQnl0ZXMpIHsKLSAgICAgICAgYnl0ZVtdIGFTYWx0ID0gbmV3IGJ5dGVbbnVtYmVyT2ZCeXRlc107Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZCeXRlczsgaSsrKSB7Ci0gICAgICAgICAgICBhU2FsdFtpXSA9IChieXRlKSAoaSAmIDB4ZmYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhU2FsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdFRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBbGdvcml0aG0oKSB7Ci0gICAgICAgIHJldHVybiBhbGdvcml0aG07Ci0gICAgfQotCi0gICAgcHVibGljIGJ5dGVbXSBnZXRTYWx0KCkgewotICAgICAgICByZXR1cm4gc2FsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcmFwcGVyIGNsYXNzIHRvIHRlc3QgYSBnaXZlbiBTZWNyZXRLZXlGYWN0b3J5LlBCS0RGMiBhbGdvcml0aG0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQQktERjIgZXh0ZW5kcyBQQkVDaXBoZXJXcmFwcGVyIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEJLREYyX1NBTFRfU0laRSA9IDY0OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0lQSEVSX0tFWV9TSVpFID0gMTI4OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0lQSEVSX1RSQU5TRk9STUFUSU9OID0gIkFFUy9DQkMvUEtDUzVQYWRkaW5nIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEdPUklUSE0gPSAiQUVTIjsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gaXYgPSBudWxsOwotCi0gICAgICAgIHB1YmxpYyBQQktERjIoU3RyaW5nIGFsZ28sIFN0cmluZyBwYXNzd2QpCi0gICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlcihhbGdvLCBQQktERjJfU0FMVF9TSVpFKTsKLQotICAgICAgICAgICAgY2kgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoQ0lQSEVSX1RSQU5TRk9STUFUSU9OKTsKLQotICAgICAgICAgICAgUEJFS2V5U3BlYyBwYmVLZXlTcGVjID0gbmV3IFBCRUtleVNwZWMocGFzc3dkLnRvQ2hhckFycmF5KCksIGdldFNhbHQoKSwKLSAgICAgICAgICAgICAgICAgICAgSVRFUkFUSU9OX0NPVU5ULCBDSVBIRVJfS0VZX1NJWkUpOwotICAgICAgICAgICAgU2VjcmV0S2V5RmFjdG9yeSBrZXlGYWN0b3J5ID0gU2VjcmV0S2V5RmFjdG9yeS5nZXRJbnN0YW5jZShhbGdvKTsKLSAgICAgICAgICAgIGtleSA9IGtleUZhY3RvcnkuZ2VuZXJhdGVTZWNyZXQocGJlS2V5U3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENpcGhlcihpbnQgbW9kZSkgdGhyb3dzIEludmFsaWRLZXlFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgSW52YWxpZEFsZ29yaXRobVBhcmFtZXRlckV4Y2VwdGlvbiwgSW52YWxpZFBhcmFtZXRlclNwZWNFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKENpcGhlci5FTkNSWVBUX01PREUgPT0gbW9kZSkgewotICAgICAgICAgICAgICAgIGNpLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgbmV3IFNlY3JldEtleVNwZWMoa2V5LmdldEVuY29kZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9BTEdPUklUSE0pKTsKLSAgICAgICAgICAgICAgICBpdiA9IGNpLmdldFBhcmFtZXRlcnMoKS5nZXRQYXJhbWV0ZXJTcGVjKEl2UGFyYW1ldGVyU3BlYy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJVigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaS5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIG5ldyBTZWNyZXRLZXlTcGVjKGtleS5nZXRFbmNvZGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxHT1JJVEhNKSwgbmV3IEl2UGFyYW1ldGVyU3BlYyhpdikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JhcHBlciBjbGFzcyB0byB0ZXN0IGEgZ2l2ZW4gQUVTLWJhc2VkIFBCRSBhbGdvcml0aG0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBBRVMgZXh0ZW5kcyBQQkVDaXBoZXJXcmFwcGVyIHsKLQotICAgICAgICBwcml2YXRlIEFsZ29yaXRobVBhcmFtZXRlcnMgcGJlUGFyYW1zOwotCi0gICAgICAgIHB1YmxpYyBBRVMoU3RyaW5nIGFsZ28sIFN0cmluZyBwYXNzd2QpCi0gICAgICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzdXBlcihhbGdvLCAwKTsKLQotICAgICAgICAgICAgY2kgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnbyk7Ci0KLSAgICAgICAgICAgIFNlY3JldEtleUZhY3Rvcnkgc2tmID0gU2VjcmV0S2V5RmFjdG9yeS5nZXRJbnN0YW5jZShhbGdvKTsKLSAgICAgICAgICAgIGtleSA9IHNrZi5nZW5lcmF0ZVNlY3JldChuZXcgUEJFS2V5U3BlYyhwYXNzd2QudG9DaGFyQXJyYXkoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRDaXBoZXIoaW50IG1vZGUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChDaXBoZXIuRU5DUllQVF9NT0RFID09IG1vZGUpIHsKLSAgICAgICAgICAgICAgICBjaS5pbml0KENpcGhlci5FTkNSWVBUX01PREUsIGtleSk7Ci0gICAgICAgICAgICAgICAgcGJlUGFyYW1zID0gY2kuZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaS5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIGtleSwgcGJlUGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyYXBwZXIgY2xhc3MgdG8gdGVzdCBhIGdpdmVuIFBCRSBhbGdvcml0aG0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMZWdhY3kgZXh0ZW5kcyBQQkVDaXBoZXJXcmFwcGVyIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEJFX1NBTFRfU0laRSA9IDg7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeShTdHJpbmcgYWxnbywgU3RyaW5nIHBhc3N3ZCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBOb1N1Y2hQYWRkaW5nRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHN1cGVyKGFsZ28sIFBCRV9TQUxUX1NJWkUpOwotCi0gICAgICAgICAgICBTZWNyZXRLZXlGYWN0b3J5IHNrZiA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnby5zcGxpdCgiLyIpWzBdKTsKLSAgICAgICAgICAgIGtleSA9IHNrZi5nZW5lcmF0ZVNlY3JldChuZXcgUEJFS2V5U3BlYyhwYXNzd2QudG9DaGFyQXJyYXkoKSkpOwotCi0gICAgICAgICAgICBhcHMgPSBuZXcgUEJFUGFyYW1ldGVyU3BlYyhnZXRTYWx0KCksIElURVJBVElPTl9DT1VOVCk7Ci0KLSAgICAgICAgICAgIGNpID0gQ2lwaGVyLmdldEluc3RhbmNlKGFsZ28pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRDaXBoZXIoaW50IG1vZGUpIHRocm93cyBJbnZhbGlkS2V5RXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludmFsaWRBbGdvcml0aG1QYXJhbWV0ZXJFeGNlcHRpb24sIEludmFsaWRQYXJhbWV0ZXJTcGVjRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGNpLmluaXQobW9kZSwga2V5LCBhcHMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1RleHRMZW5ndGgvVGVzdENpcGhlclRleHRMZW5ndGguamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0NpcGhlci9UZXh0TGVuZ3RoL1Rlc3RDaXBoZXJUZXh0TGVuZ3RoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMzhlNDQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyL1RleHRMZW5ndGgvVGVzdENpcGhlclRleHRMZW5ndGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLm91dDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7Ci1pbXBvcnQgamF2YXguY3J5cHRvLk5vU3VjaFBhZGRpbmdFeGNlcHRpb247Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ4NjAxCi0gKiBAc3VtbWFyeSBQZXJmb3JtcyBtdWx0aXBsZS1wYXJ0IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBkZXBlbmRpbmcgb24gdGhlCi0gKiAgc3BlY2lmaWVkIGVuY3J5cHRpb24gbW9kZSBhbmQgY2hlY2sgaWYgdGhlIHJlc3VsdHMgb2J0YWluZWQgYnkKLSAqICBkaWZmZXJlbnQgd2F5cyBhcmUgdGhlIHNhbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2lwaGVyVGV4dExlbmd0aCB7Ci0KLSAgICAvKiBBbGdvcml0aG1zIHRlc3RlZCBieSBERVNDaXBoZXJXcmFwcGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVTX0FMR09SSVRITVMgPSB7IkRFUyIsICJERVNlZGUiLAotICAgICAgICAiQmxvd2Zpc2gifTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERVNfTU9ERVMgPSB7IkVDQiIsICJDQkMiLCAiUENCQyJ9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFU19QQURESU5HID0geyJQS0NTNVBhZGRpbmcifTsKLQotICAgIC8qIEFsZ29yaXRobXMgdGVzdGVkIGJ5IFBCRUNpcGhlcldyYXBwZXIgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQkVfQUxHT1JJVEhNUyA9IHsiUEJFV2l0aE1ENUFuZERFUyIsCi0gICAgICAgICJQQkVXaXRoTUQ1QW5kREVTL0NCQy9QS0NTNVBhZGRpbmciLCAiUEJFV2l0aE1ENUFORFRyaXBsZURFUyIsCi0gICAgICAgICJQQkVXaXRoTUQ1QW5kVHJpcGxlREVTL0NCQy9QS0NTNVBhZGRpbmciLCAiUEJFd2l0aFNIQTFBbmRERVNlZGUiLAotICAgICAgICAiUEJFd2l0aFNIQTFBbmRERVNlZGUvQ0JDL1BLQ1M1UGFkZGluZyIsICJQQkV3aXRoU0hBMUFuZFJDMl80MCIsCi0gICAgICAgICJQQkV3aXRoU0hBMUFuZHJjMl80MC9DQkMvUEtDUzVQYWRkaW5nIiwgIlBCRVdpdGhTSEExQW5kUkMyXzEyOCIsCi0gICAgICAgICJQQkVXaXRoU0hBMWFuZFJDMl8xMjgvQ0JDL1BLQ1M1UGFkZGluZyIsICJQQkVXaXRoU0hBMUFuZFJDNF80MCIsCi0gICAgICAgICJQQkVXaXRoc2hhMUFuZFJDNF80MC9FQ0IvTm9QYWRkaW5nIiwgIlBCRVdpdGhTSEExQW5kUkM0XzEyOCIsCi0gICAgICAgICJQQkVXaXRoU0hBMUFuZFJDNF8xMjgvRUNCL05vUGFkZGluZyIsICJQQkVXaXRoSG1hY1NIQTFBbmRBRVNfMTI4IiwKLSAgICAgICAgIlBCRVdpdGhIbWFjU0hBMjI0QW5kQUVTXzEyOCIsICJQQkVXaXRoSG1hY1NIQTI1NkFuZEFFU18xMjgiLAotICAgICAgICAiUEJFV2l0aEhtYWNTSEEzODRBbmRBRVNfMTI4IiwgIlBCRVdpdGhIbWFjU0hBNTEyQW5kQUVTXzEyOCIsCi0gICAgICAgICJQQkVXaXRoSG1hY1NIQTFBbmRBRVNfMjU2IiwgIlBCRVdpdGhIbWFjU0hBMjI0QW5kQUVTXzI1NiIsCi0gICAgICAgICJQQkVXaXRoSG1hY1NIQTI1NkFuZEFFU18yNTYiLCAiUEJFV2l0aEhtYWNTSEEzODRBbmRBRVNfMjU2IiwKLSAgICAgICAgIlBCRVdpdGhIbWFjU0hBNTEyQW5kQUVTXzI1NiIsICJQQktERjJXaXRoSG1hY1NIQTEiLAotICAgICAgICAiUEJLREYyV2l0aEhtYWNTSEEyMjQiLCAiUEJLREYyV2l0aEhtYWNTSEEyNTYiLAotICAgICAgICAiUEJLREYyV2l0aEhtYWNTSEEzODQiLCAiUEJLREYyV2l0aEhtYWNTSEE1MTIifTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEJFX1BBU1NXT1JEID0gIkh1c2gsIGl0J3MgYSBzZWNyZXQhISI7Ci0KLSAgICAvLyBBbGdvcml0aG0gdGVzdGVkIGJ5IFBCS0RGMldyYXBwdGVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBCS0RGMiA9ICJQQktERjIiOwotCi0gICAgLy8gQWxnb3JpdGhtIHRlc3RlZCBieSBBRVNQQkVXcmFwcGVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFUyA9ICJBRVMiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ5dGVbXSBwbGFpblRleHQgPSBuZXcgYnl0ZVs2NF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICAgICAgcGxhaW5UZXh0W2ldID0gKGJ5dGUpIChpICYgMHhmZik7Ci0gICAgICAgIH0KLQotICAgICAgICBuZXcgVGVzdENpcGhlclRleHRMZW5ndGgoKS5ydW5BbGwocGxhaW5UZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5BbGwoYnl0ZVtdIHBsYWluVGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gVGVzdGluZyBERVMvQmxvd2Zpc2ggQ2lwaGVyCi0gICAgICAgIGZvciAoU3RyaW5nIGFsZ29yaXRobSA6IERFU19BTEdPUklUSE1TKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBkZXNNb2RlIDogREVTX01PREVTKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcGFkZGluZyA6IERFU19QQURESU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCI9PlRlc3Rpbmc6ICIgKyBhbGdvcml0aG0gKyAiLyIgKyBkZXNNb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLyIgKyBwYWRkaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgREVTQ2lwaGVyV3JhcHBlciBkZXNDaSA9IG5ldyBERVNDaXBoZXJXcmFwcGVyKGFsZ29yaXRobSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNNb2RlLCBwYWRkaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzQ2kuZXhlY3V0ZShDaXBoZXIuRU5DUllQVF9NT0RFLCBwbGFpblRleHQpOwotICAgICAgICAgICAgICAgICAgICBkZXNDaS5leGVjdXRlKENpcGhlci5ERUNSWVBUX01PREUsIGRlc0NpLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHBsYWluVGV4dCwgZGVzQ2kuZ2V0UmVzdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsYWluIGFuZCByZWNvdmVyZWQgdGV4dHMgYXJlIG5vdCBzYW1lIGZvcjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWxnb3JpdGhtICsgIi8iICsgZGVzTW9kZSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhZGRpbmcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdGluZyBQQkUgQ2lwaGVyCi0gICAgICAgIGZvciAoU3RyaW5nIGFsZ29yaXRobSA6IFBCRV9BTEdPUklUSE1TKSB7Ci0gICAgICAgICAgICBpbnQgbWF4S2V5TGVuID0gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoYWxnb3JpdGhtKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNVbmxpbWl0ZWQgPSBtYXhLZXlMZW4gPT0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgICAgICAgICBpZiAoIWlzVW5saW1pdGVkCi0gICAgICAgICAgICAgICAgICAgICYmIChhbGdvcml0aG0uY29udGFpbnMoIlRyaXBsZURFUyIpIHx8IGFsZ29yaXRobQotICAgICAgICAgICAgICAgICAgICAuY29udGFpbnMoIkFFU18yNTYiKSkpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGVzdCAiICsgYWxnb3JpdGhtICsgIiB3aWxsIGJlIGlnbm9yZWQiKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0LnByaW50bG4oIj0+VGVzdGluZzogIiArIGFsZ29yaXRobSk7Ci0gICAgICAgICAgICBQQkVDaXBoZXJXcmFwcGVyIHBiZUNpID0gY3JlYXRlV3JhcHBlcihhbGdvcml0aG0sIFBCRV9QQVNTV09SRCk7Ci0gICAgICAgICAgICBwYmVDaS5leGVjdXRlKENpcGhlci5FTkNSWVBUX01PREUsIHBsYWluVGV4dCk7Ci0gICAgICAgICAgICBwYmVDaS5leGVjdXRlKENpcGhlci5ERUNSWVBUX01PREUsIHBiZUNpLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhwbGFpblRleHQsIHBiZUNpLmdldFJlc3VsdCgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlBsYWluIGFuZCByZWNvdmVyZWQgdGV4dHMgYXJlIG5vdCBzYW1lIGZvcjoiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGFsZ29yaXRobSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBCRUNpcGhlcldyYXBwZXIgY3JlYXRlV3JhcHBlcihTdHJpbmcgYWxnbywgU3RyaW5nIHBhc3N3ZCkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLAotICAgICAgICAgICAgTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbGdvLmNvbnRhaW5zKFBCS0RGMikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUEJFQ2lwaGVyV3JhcHBlci5QQktERjIoYWxnbywgcGFzc3dkKTsKLSAgICAgICAgfSBlbHNlIGlmIChhbGdvLmNvbnRhaW5zKEFFUykpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUEJFQ2lwaGVyV3JhcHBlci5BRVMoYWxnbywgcGFzc3dkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUEJFQ2lwaGVyV3JhcHBlci5MZWdhY3koYWxnbywgcGFzc3dkKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vamRpL29vbS9AZGVidWdnZWVWTU9wdGlvbnMgYi9qZGsvdGVzdC9jb20vc3VuL2pkaS9vb20vQGRlYnVnZ2VlVk1PcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIxOWJjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vamRpL29vbS9AZGVidWdnZWVWTU9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0tWG14NDBtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9qZGkvb29tL09vbURlYnVnVGVzdC5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9qZGkvb29tL09vbURlYnVnVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQ1NDZiLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vamRpL29vbS9Pb21EZWJ1Z1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2IFJlZCBIYXQgSW5jLgotICoKLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogIEB0ZXN0Ci0gKiAgQGJ1ZyA4MTUzNzExCi0gKiAgQHN1bW1hcnkgSkRXUDogTWVtb3J5IExlYWsgKGdsb2JhbCByZWZlcmVuY2VzIG5vdCBkZWxldGVkIGFmdGVyIGludm9rZU1ldGhvZCkuCi0gKgotICogIEBhdXRob3IgU2V2ZXJpbiBHZWh3b2xmIDxzZ2Vod29sZkByZWRoYXQuY29tPgotICoKLSAqICBAbGlicmFyeSAuLgotICogIEBydW4gYnVpbGQgVGVzdFNjYWZmb2xkIFZNQ29ubmVjdGlvbiBUYXJnZXRMaXN0ZW5lciBUYXJnZXRBZGFwdGVyCi0gKiAgQHJ1biBjb21waWxlIC1nIE9vbURlYnVnVGVzdC5qYXZhCi0gKiAgQHJ1biBzaGVsbCBPb21EZWJ1Z1Rlc3RTZXR1cC5zaAotICogIEBydW4gbWFpbiBPb21EZWJ1Z1Rlc3QgT29tRGVidWdUZXN0VGFyZ2V0IHRlc3QxCi0gKiAgQHJ1biBtYWluIE9vbURlYnVnVGVzdCBPb21EZWJ1Z1Rlc3RUYXJnZXQgdGVzdDIKLSAqICBAcnVuIG1haW4gT29tRGVidWdUZXN0IE9vbURlYnVnVGVzdFRhcmdldCB0ZXN0MwotICogIEBydW4gbWFpbiBPb21EZWJ1Z1Rlc3QgT29tRGVidWdUZXN0VGFyZ2V0IHRlc3Q0Ci0gKiAgQHJ1biBtYWluIE9vbURlYnVnVGVzdCBPb21EZWJ1Z1Rlc3RUYXJnZXQgdGVzdDUKLSAqLwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBjb20uc3VuLmpkaS5BcnJheVJlZmVyZW5jZTsKLWltcG9ydCBjb20uc3VuLmpkaS5BcnJheVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5qZGkuQ2xhc3NUeXBlOwotaW1wb3J0IGNvbS5zdW4uamRpLkZpZWxkOwotaW1wb3J0IGNvbS5zdW4uamRpLkludm9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLnN1bi5qZGkuTWV0aG9kOwotaW1wb3J0IGNvbS5zdW4uamRpLk9iamVjdFJlZmVyZW5jZTsKLWltcG9ydCBjb20uc3VuLmpkaS5SZWZlcmVuY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4uamRpLlN0YWNrRnJhbWU7Ci1pbXBvcnQgY29tLnN1bi5qZGkuVk1PdXRPZk1lbW9yeUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLmpkaS5WYWx1ZTsKLWltcG9ydCBjb20uc3VuLmpkaS5ldmVudC5CcmVha3BvaW50RXZlbnQ7Ci1pbXBvcnQgY29tLnN1bi5qZGkuZXZlbnQuRXhjZXB0aW9uRXZlbnQ7Ci0KLS8qKioqKioqKioqKioqKioqKiBUYXJnZXQgcHJvZ3JhbSAqKioqKioqKioqKioqKioqKioqKioqLwotCi1jbGFzcyBPb21EZWJ1Z1Rlc3RUYXJnZXQgewotCi0gICAgT29tRGVidWdUZXN0VGFyZ2V0KCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBpbnZva2VkIGNvbnN0cnVjdG9yIik7Ci0gICAgfQotICAgIHN0YXRpYyBjbGFzcyBGb29DbHMgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVszMDAwMDAwXTsKLSAgICB9OwotCi0gICAgRm9vQ2xzIGZvb0NscyA9IG5ldyBGb29DbHMoKTsKLSAgICBieXRlW10gYnl0ZUFycmF5ID0gbmV3IGJ5dGVbMF07Ci0KLSAgICB2b2lkIHRlc3RNZXRob2QoRm9vQ2xzIGZvbykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBpbnZva2VkICd2b2lkIHRlc3RNZXRob2QoRm9vQ2xzKScsIGZvbyA9PSAiICsgZm9vKTsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RQcmltaXRpdmUoYnl0ZVtdIGZvbykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBpbnZva2VkICd2b2lkIHRlc3RQcmltaXRpdmUoYnl0ZVtdKScsIGZvbyA9PSAiICsgZm9vKTsKLSAgICB9Ci0KLSAgICBieXRlW10gdGVzdFByaW1pdGl2ZUFyclJldHZhbCgpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRzogaW52b2tlZCAnYnl0ZVtdIHRlc3RQcmltaXRpdmVBcnJSZXR2YWwoKSciKTsKLSAgICAgICAgcmV0dXJuIG5ldyBieXRlWzMwMDAwMDBdOwotICAgIH0KLQotICAgIEZvb0NscyB0ZXN0Rm9vQ2xzUmV0dmFsKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBpbnZva2VkICdGb29DbHMgdGVzdEZvb0Nsc1JldHZhbCgpJyIpOwotICAgICAgICByZXR1cm4gbmV3IEZvb0NscygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVudHJ5KCkge30KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBPb21EZWJ1Z1Rlc3RUYXJnZXQubWFpbiIpOwotICAgICAgICBuZXcgT29tRGVidWdUZXN0VGFyZ2V0KCkuZW50cnkoKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKiBUZXN0IHByb2dyYW0gKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wdWJsaWMgY2xhc3MgT29tRGVidWdUZXN0IGV4dGVuZHMgVGVzdFNjYWZmb2xkIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMTF9URVNUUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAidGVzdDEiLCAidGVzdDIiLCAidGVzdDMiLCAidGVzdDQiLCAidGVzdDUiCi0gICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExfVEVTVFNfU0VUID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIEFMTF9URVNUU19TRVQuYWRkQWxsKEFycmF5cy5hc0xpc3QoQUxMX1RFU1RTKSk7Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTRVMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuY2xhc3NlcyIsICIuIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBSRVNVTFRfRklMRSA9IG5ldyBGaWxlKFRFU1RfQ0xBU1NFUywgInJlc3VsdHMucHJvcGVydGllcyIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1RFU1QgPSBBTExfVEVTVFNbQUxMX1RFU1RTLmxlbmd0aCAtIDFdOwotICAgIHByaXZhdGUgUmVmZXJlbmNlVHlwZSB0YXJnZXRDbGFzczsKLSAgICBwcml2YXRlIE9iamVjdFJlZmVyZW5jZSB0aGlzT2JqZWN0OwotICAgIHByaXZhdGUgaW50IGZhaWxlZFRlc3RzOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRlc3RNZXRob2Q7Ci0KLSAgICBwdWJsaWMgT29tRGVidWdUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgc3VwZXIoYXJncyk7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBmYWlsZWQgdW5leHBlY3RlZGx5LiIpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMudGVzdE1ldGhvZCA9IGFyZ3NbMV07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZExpc3RlbmVyKG5ldyBUYXJnZXRBZGFwdGVyKCkgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhjZXB0aW9uVGhyb3duKEV4Y2VwdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZXhjZXB0aW9uKCkucmVmZXJlbmNlVHlwZSgpLm5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJERUJVRzogRXhjZXB0aW9uIHRocm93biBpbiBkZWJ1Z2dlZSB3YXM6ICIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBHZXQgdG8gdGhlIHRvcCBvZiBlbnRyeSgpCi0gICAgICAgICAgICAgKiB0byBkZXRlcm1pbmUgdGFyZ2V0Q2xhc3MgYW5kIG1haW5UaHJlYWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQnJlYWtwb2ludEV2ZW50IGJwZSA9IHN0YXJ0VG8oIk9vbURlYnVnVGVzdFRhcmdldCIsICJlbnRyeSIsICIoKVYiKTsKLSAgICAgICAgICAgIHRhcmdldENsYXNzID0gYnBlLmxvY2F0aW9uKCkuZGVjbGFyaW5nVHlwZSgpOwotCi0gICAgICAgICAgICBtYWluVGhyZWFkID0gYnBlLnRocmVhZCgpOwotCi0gICAgICAgICAgICBTdGFja0ZyYW1lIGZyYW1lID0gbWFpblRocmVhZC5mcmFtZSgwKTsKLSAgICAgICAgICAgIHRoaXNPYmplY3QgPSBmcmFtZS50aGlzT2JqZWN0KCk7Ci0gICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbSA9IGZpbmRUZXN0TWV0aG9kKCk7Ci0gICAgICAgICAgICBtLmludm9rZSh0aGlzKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsdXJlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBmYWlsdXJlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogcmVzdW1lIHRoZSB0YXJnZXQsIGxpc3RlbmluZyBmb3IgZXZlbnRzCi0gICAgICAgICAqLwotICAgICAgICBsaXN0ZW5VbnRpbFZNRGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIGZpbmRUZXN0TWV0aG9kKCkKLSAgICAgICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIE9vbURlYnVnVGVzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCh0ZXN0TWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFpbHVyZSgpIHsKLSAgICAgICAgZmFpbGVkVGVzdHMrKzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRlc3QgY2FzZTogT2JqZWN0IHJlZmVyZW5jZSBhcyBtZXRob2QgcGFyYW1ldGVyLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAvLyBjYWxsZWQgdmlhIHJlZmxlY3Rpb24KLSAgICBwcml2YXRlIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRzogLS0tLS0tLS0tLS0tPiBSdW5uaW5nIHRlc3QxIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHRhcmdldENsYXNzLmZpZWxkQnlOYW1lKCJmb29DbHMiKTsKLSAgICAgICAgICAgIENsYXNzVHlwZSBjbHNUeXBlID0gKENsYXNzVHlwZSlmaWVsZC50eXBlKCk7Ci0gICAgICAgICAgICBNZXRob2QgY29uc3RydWN0b3IgPSBnZXRDb25zdHJ1Y3RvckZvckNsYXNzKGNsc1R5cGUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgICAgICAgICAgICAgIE9iamVjdFJlZmVyZW5jZSBvYmpSZWYgPSBjbHNUeXBlLm5ld0luc3RhbmNlKG1haW5UaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RSZWZlcmVuY2UuSU5WT0tFX05PTlZJUlRVQUwpOwotICAgICAgICAgICAgICAgIGlmIChvYmpSZWYuaXNDb2xsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBPYmplY3QgZ290IEdDJ2VkIGJlZm9yZSB3ZSBjYW4gdXNlIGl0LiBOTy1PUC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludm9rZSgidGVzdE1ldGhvZCIsICIoTE9vbURlYnVnVGVzdFRhcmdldCRGb29DbHM7KVYiLCBvYmpSZWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGhhbmRsZUZhaWx1cmUoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRlc3QgY2FzZTogQXJyYXkgcmVmZXJlbmNlIGFzIG1ldGhvZCBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vIGNhbGxlZCB2aWEgcmVmbGVjdGlvbgotICAgIHByaXZhdGUgdm9pZCB0ZXN0MigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiAtLS0tLS0tLS0tLS0+IFJ1bm5pbmcgdGVzdDIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gdGFyZ2V0Q2xhc3MuZmllbGRCeU5hbWUoImJ5dGVBcnJheSIpOwotICAgICAgICAgICAgQXJyYXlUeXBlIGFyclR5cGUgPSAoQXJyYXlUeXBlKWZpZWxkLnR5cGUoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXJyYXlSZWZlcmVuY2UgYnl0ZUFycmF5VmFsID0gYXJyVHlwZS5uZXdJbnN0YW5jZSgzMDAwMDAwKTsKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZUFycmF5VmFsLmlzQ29sbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRzogT2JqZWN0IGdvdCBHQydlZCBiZWZvcmUgd2UgY2FuIHVzZSBpdC4gTk8tT1AuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnZva2UoInRlc3RQcmltaXRpdmUiLCAiKFtCKVYiLCBieXRlQXJyYXlWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChWTU91dE9mTWVtb3J5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRlZmF1bHRIYW5kbGVPT01GYWlsdXJlKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUZXN0IGNhc2U6IEFycmF5IHJlZmVyZW5jZSBhcyByZXR1cm4gdmFsdWUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIC8vIGNhbGxlZCB2aWEgcmVmbGVjdGlvbgotICAgIHByaXZhdGUgdm9pZCB0ZXN0MygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiAtLS0tLS0tLS0tLS0+IFJ1bm5pbmcgdGVzdDMiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgewotICAgICAgICAgICAgICAgIGludm9rZSgidGVzdFByaW1pdGl2ZUFyclJldHZhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICIoKVtCIiwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm0oKS5taXJyb3JPZlZvaWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaGFuZGxlRmFpbHVyZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGVzdCBjYXNlOiBPYmplY3QgcmVmZXJlbmNlIGFzIHJldHVybiB2YWx1ZS4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgLy8gY2FsbGVkIHZpYSByZWZsZWN0aW9uCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3Q0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiREVCVUc6IC0tLS0tLS0tLS0tLT4gUnVubmluZyB0ZXN0NCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW52b2tlKCJ0ZXN0Rm9vQ2xzUmV0dmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIigpTE9vbURlYnVnVGVzdFRhcmdldCRGb29DbHM7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm0oKS5taXJyb3JPZlZvaWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaGFuZGxlRmFpbHVyZShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGVzdCBjYXNlOiBDb25zdHJ1Y3RvcgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVudXNlZCIsICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pIC8vIGNhbGxlZCB2aWEgcmVmbGVjdGlvbgotICAgIHByaXZhdGUgdm9pZCB0ZXN0NSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiAtLS0tLS0tLS0tLS0+IFJ1bm5pbmcgdGVzdDUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzVHlwZSB0eXBlID0gKENsYXNzVHlwZSl0aGlzT2JqZWN0LnR5cGUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgewotICAgICAgICAgICAgICAgIHR5cGUubmV3SW5zdGFuY2UobWFpblRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRNZXRob2QodGFyZ2V0Q2xhc3MsICI8aW5pdD4iLCAiKClWIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0KDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UmVmZXJlbmNlLklOVk9LRV9OT05WSVJUVUFMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBoYW5kbGVGYWlsdXJlKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2QgZ2V0Q29uc3RydWN0b3JGb3JDbGFzcyhDbGFzc1R5cGUgY2xzVHlwZSkgewotICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IGNsc1R5cGUubWV0aG9kc0J5TmFtZSgiPGluaXQ+Iik7Ci0gICAgICAgIGlmIChtZXRob2RzLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRkFJTC4gRXhwZWN0ZWQgb25seSBvbmUsIHRoZSBkZWZhdWx0LCBjb25zdHJ1Y3RvciIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RzLmdldCgwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlRmFpbHVyZShJbnZvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gc2VlIHRoZSBPT01FIGRpYWdub3N0aWMgbWVzc2FnZSBpbiB0aGUgdGFyZ2V0IHNpbmNlIHRoZQotICAgICAgICAvLyBUZXN0U2NhZmZvbGQgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBwcmludCB0aGUgc3RhY2sgdHJhY2UuIEkuZQotICAgICAgICAvLyBpdCBtaWdodCBnZXQgYSBhIFZNRGlzY29ubmVjdGVkRXhjZXB0aW9uIGJlZm9yZSB0aGUgc3RhY2sgdHJhY2UgcHJpbnRpbmcgZmluaXNoZXMuCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRkFJTFVSRTogSW52b2NhdGlvbkV4Y2VwdGlvbiB0aHJvd24uIFRyeWluZyB0byBkZXRlcm1pbmUgY2F1c2UuLi4iKTsKLSAgICAgICAgZGVmYXVsdEhhbmRsZU9PTUZhaWx1cmUoZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlZmF1bHRIYW5kbGVPT01GYWlsdXJlKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIGZhaWx1cmUoKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgdm9pZCBpbnZva2UoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBtZXRob2RTaWcsIFZhbHVlIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3QgYXJncyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0gICAgICAgIGFyZ3MuYWRkKHZhbHVlKTsKLSAgICAgICAgaW52b2tlKG1ldGhvZE5hbWUsIG1ldGhvZFNpZywgYXJncywgdmFsdWUpOwotICAgIH0KLQotICAgIHZvaWQgaW52b2tlKFN0cmluZyBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2RTaWcsCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikgTGlzdCBhcmdzLAotICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGZpbmRNZXRob2QodGFyZ2V0Q2xhc3MsIG1ldGhvZE5hbWUsIG1ldGhvZFNpZyk7Ci0gICAgICAgIGlmICggbWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWx1cmUoIkZBSUxFRDogQ2FuJ3QgZmluZCBtZXRob2Q6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBtZXRob2ROYW1lICArICIgZm9yIGNsYXNzID0gIiArIHRhcmdldENsYXNzKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnZva2UobWV0aG9kLCBhcmdzLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIExpc3QgYXJncywgVmFsdWUgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0aGlzT2JqZWN0Lmludm9rZU1ldGhvZChtYWluVGhyZWFkLCBtZXRob2QsIGFyZ3MsIDApOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBEb25lIGludm9raW5nIG1ldGhvZCB2aWEgZGVidWdnZXIuIik7Ci0gICAgfQotCi0gICAgVmFsdWUgZmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB7Ci0gICAgICAgIEZpZWxkIGZpZWxkID0gdGFyZ2V0Q2xhc3MuZmllbGRCeU5hbWUoZmllbGROYW1lKTsKLSAgICAgICAgcmV0dXJuIHRoaXNPYmplY3QuZ2V0VmFsdWUoZmllbGQpOwotICAgIH0KLQotICAgIC8vIERldGVybWluZSB0aGUgcGFzcy9mYWlsIHN0YXR1cyBvbiBzb21lIGhldXJpc3RpYyBhbmQgZG9uJ3QgZmFpbCB0aGUKLSAgICAvLyB0ZXN0IGlmIDwgMyBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIChjdXJyZW50bHkgNSkgZmFpbC4gVGhpcyBhbHNvCi0gICAgLy8gaGFzIHRoZSBuaWNlIHNpZGUgZWZmZWN0IHRoYXQgYWxsIHRlc3RzIGFyZSBmaXJzdCBhdHRlbXB0ZWQgYW5kIG9ubHkKLSAgICAvLyBhbGwgdGVzdHMgcmFuIGFuIG92ZXJhbGwgcGFzcy9mYWlsIHN0YXR1cyBpcyBkZXRlcm1pbmVkLgotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGV0ZXJtaW5lT3ZlcmFsbFRlc3RTdGF0dXMoT29tRGVidWdUZXN0IG9vbVRlc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvcGVydGllcyByZXN1bHRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGlmICghUkVTVUxUX0ZJTEUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIFJFU1VMVF9GSUxFLmNyZWF0ZU5ld0ZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oUkVTVUxUX0ZJTEUpOwotICAgICAgICAgICAgcmVzdWx0UHJvcHMubG9hZChmaW4pOwotICAgICAgICAgICAgcmVzdWx0UHJvcHMucHV0KG9vbVRlc3QudGVzdE1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvU3RyaW5nKG9vbVRlc3QuZmFpbGVkVGVzdHMpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChmaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiREVCVUc6IEZpbmlzaGVkIHJ1bm5pbmcgdGVzdCAnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvb21UZXN0LnRlc3RNZXRob2QgKyAiJy4iKTsKLSAgICAgICAgaWYgKExBU1RfVEVTVC5lcXVhbHMob29tVGVzdC50ZXN0TWV0aG9kKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJERUJVRzogRGV0ZXJtaW5pbmcgb3ZlcmFsbCB0ZXN0IHN0YXR1cy4iKTsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IGFjdHVhbFRlc3RzUnVuID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICAgICAgaW50IHRvdGFsVGVzdHMgPSBBTExfVEVTVFMubGVuZ3RoOwotICAgICAgICAgICAgaW50IGZhaWxlZFRlc3RzID0gMDsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGtleTogcmVzdWx0UHJvcHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxUZXN0c1J1bi5hZGQoKFN0cmluZylrZXkpOwotICAgICAgICAgICAgICAgIE9iamVjdCBwcm9wVmFsID0gcmVzdWx0UHJvcHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludCgoU3RyaW5nKXByb3BWYWwpOwotICAgICAgICAgICAgICAgIGZhaWxlZFRlc3RzICs9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFBTExfVEVTVFNfU0VULmVxdWFscyhhY3R1YWxUZXN0c1J1bikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAiVGVzdCBmYWlsZWQhIEV4cGVjdGVkIHRvIHJ1biB0ZXN0cyAnIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBBTExfVEVTVFNfU0VUICsgIicsIGJ1dCBvbmx5IHRoZXNlIHdlcmUgcnVuICciCi0gICAgICAgICAgICAgICAgICAgICAgICArIGFjdHVhbFRlc3RzUnVuICsgIiciOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGVycm9yTXNnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmYWlsZWRUZXN0cyA+PSAzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTXNnID0gIlRlc3QgZmFpbGVkLiBFeHBlY3RlZCA8IDMgc3ViLXRlc3RzIHRvIGZhaWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciBhIHBhc3MuIEdvdCAiICsgZmFpbGVkVGVzdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZmFpbGVkIHRlc3RzIG91dCBvZiAiICsgdG90YWxUZXN0cyArICIuIjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlcnJvck1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSRVNVTFRfRklMRS5kZWxldGUoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsICIgKyB0b3RhbFRlc3RzICsgIiB0ZXN0cyBwYXNzZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBNb3JlIHRlc3RzIHRvIHJ1bi4gQ29uaW51aW5nLiIpOwotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKFJFU1VMVF9GSUxFKTsKLSAgICAgICAgICAgICAgICByZXN1bHRQcm9wcy5zdG9yZShmb3V0LCAiU3RvcmluZyByZXN1bHRzIGFmdGVyIHRlc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9vbVRlc3QudGVzdE1ldGhvZCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChmb3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInRlc3Qudm0ub3B0cyIsICItWG14NDBtIik7IC8vIFNldCBkZWJ1Z2dlZSBWTSBvcHRpb24KLSAgICAgICAgT29tRGVidWdUZXN0IG9vbVRlc3QgPSBuZXcgT29tRGVidWdUZXN0KGFyZ3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb29tVGVzdC5zdGFydFRlc3RzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRFQlVHOiBHb3QgZXhjZXB0aW9uIGZvciB0ZXN0IHJ1bi4gIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIG9vbVRlc3QuZmFpbHVyZSgpOwotICAgICAgICB9Ci0gICAgICAgIGRldGVybWluZU92ZXJhbGxUZXN0U3RhdHVzKG9vbVRlc3QpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9qZGkvb29tL09vbURlYnVnVGVzdFNldHVwLnNoIGIvamRrL3Rlc3QvY29tL3N1bi9qZGkvb29tL09vbURlYnVnVGVzdFNldHVwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmJiMzJlLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vamRpL29vbS9Pb21EZWJ1Z1Rlc3RTZXR1cC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMhL2Jpbi9zaAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTYgUmVkIEhhdCBJbmMuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0KLWlmIFsgIiR7VEVTVFNSQ30iID0gIiIgXQotdGhlbgotICBlY2hvICJURVNUU1JDIG5vdCBzZXQuICBUZXN0IGNhbm5vdCBleGVjdXRlLiAgRmFpbGVkLiIKLSAgZXhpdCAxCi1maQotZWNobyAiVEVTVFNSQz0ke1RFU1RTUkN9IgotCi1pZiBbICIke1RFU1RKQVZBfSIgPSAiIiBdCi10aGVuCi0gIGVjaG8gIlRFU1RKQVZBIG5vdCBzZXQuICBUZXN0IGNhbm5vdCBleGVjdXRlLiAgRmFpbGVkLiIKLSAgZXhpdCAxCi1maQotZWNobyAiVEVTVEpBVkE9JHtURVNUSkFWQX0iCi0KLWlmIFsgIiR7VEVTVENMQVNTRVN9IiA9ICIiIF0KLXRoZW4KLSAgZWNobyAiVEVTVENMQVNTRVMgbm90IHNldC4gIFRlc3QgY2Fubm90IGV4ZWN1dGUuICBGYWlsZWQuIgotICBleGl0IDEKLWZpCi0KLWNwICR7VEVTVFNSQ30vQGRlYnVnZ2VlVk1PcHRpb25zICR7VEVTVENMQVNTRVN9LwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvRGVhZFNTTExkYXBUaW1lb3V0VGVzdC5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvRGVhZFNTTExkYXBUaW1lb3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzAxYzRjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL0RlYWRTU0xMZGFwVGltZW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBAdGVzdAotICogQHJ1biBtYWluL290aGVydm0gRGVhZFNTTExkYXBUaW1lb3V0VGVzdAotICogQGJ1ZyA4MTQxMzcwCi0gKiBAa2V5IGludGVybWl0dGVudAotICovCi0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmF4Lm5hbWluZy4qOwotaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuKjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEhhbmRzaGFrZUV4Y2VwdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7Ci1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOwotCi0KLWNsYXNzIERlYWRTZXJ2ZXJUaW1lb3V0U1NMVGVzdCBpbXBsZW1lbnRzIENhbGxhYmxlIHsKLQotICAgIEhhc2h0YWJsZSBlbnY7Ci0gICAgRGVhZFNTTFNlcnZlciBzZXJ2ZXI7Ci0gICAgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGludCBIQU5HSU5HX1RFU1RfVElNRU9VVCA9IDIwXzAwMDsKLQotICAgIHB1YmxpYyBEZWFkU2VydmVyVGltZW91dFNTTFRlc3QoSGFzaHRhYmxlIGVudikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXIgPSBuZXcgRGVhZFNTTFNlcnZlcigpOwotICAgICAgICB0aGlzLmVudiA9IGVudjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtT3AoSW5pdGlhbENvbnRleHQgY3R4KSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVOYW1pbmdFeGNlcHRpb24oTmFtaW5nRXhjZXB0aW9uIGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7Ci0gICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAvLyBTU0wgY29ubmVjdCB3aWxsIHRpbWVvdXQgdmlhIHJlYWRSZXBseSB1c2luZwotICAgICAgICAgICAgLy8gU29ja2V0VGltZW91dEV4Y2VwdGlvbgotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHBhc3MoKTsKLSAgICAgICAgfSBlbHNlIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTU0xIYW5kc2hha2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAmJiBlLmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEVPRkV4Y2VwdGlvbikgewotICAgICAgICAgICAgLy8gdGVzdCBzZWVtcyB0byBiZSBmYWlsaW5nIGludGVybWl0dGVudGx5IG9uIHNvbWUKLSAgICAgICAgICAgIC8vIHBsYXRmb3Jtcy4KLSAgICAgICAgICAgIHBhc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXNzKCkgewotICAgICAgICB0aGlzLnBhc3NlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmFpbCgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmFpbChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBmYWlsZWQiLCBlKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHNodXRJdERvd24oSW5pdGlhbENvbnRleHQgY3R4KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY3R4ICE9IG51bGwpIGN0eC5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW4gY2FsbCgpIHsKLSAgICAgICAgSW5pdGlhbENvbnRleHQgY3R4ID0gbnVsbDsKLSAgICAgICAgU2NoZWR1bGVkRnV0dXJlIGtpbGxlciA9IG51bGw7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgd2hpbGUoIXNlcnZlci5hY2NlcHRpbmcoKSkKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsgLy8gYWxsb3cgdGhlIHNlcnZlciB0byBzdGFydCB1cAotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7IC8vIHRvIGJlIHN1cmUKLQotICAgICAgICAgICAgZW52LnB1dChDb250ZXh0LlBST1ZJREVSX1VSTCwgImxkYXA6Ly9sb2NhbGhvc3Q6IiArCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRMb2NhbFBvcnQoKSk7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY3R4ID0gbmV3IEluaXRpYWxEaXJDb250ZXh0KGVudik7Ci0gICAgICAgICAgICAgICAgcGVyZm9ybU9wKGN0eCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb25nIGVuZCA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkudG9TdHJpbmcoKSArICIgLSBlbGFwc2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGVuZCAtIHN0YXJ0KSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlTmFtaW5nRXhjZXB0aW9uKGUsIHN0YXJ0LCBlbmQpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoa2lsbGVyICE9IG51bGwgJiYgIWtpbGxlci5pc0RvbmUoKSkKLSAgICAgICAgICAgICAgICAgICAga2lsbGVyLmNhbmNlbCh0cnVlKTsKLSAgICAgICAgICAgICAgICBzaHV0SXREb3duKGN0eCk7Ci0gICAgICAgICAgICAgICAgc2VydmVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGFzc2VkOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbnxJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotY2xhc3MgRGVhZFNTTFNlcnZlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2s7Ci0gICAgYm9vbGVhbiBhY2NlcHRpbmcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBEZWFkU1NMU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5zZXJ2ZXJTb2NrID0gbmV3IFNlcnZlclNvY2tldCgwKTsKLSAgICAgICAgc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIHdoaWxlKHRydWUpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYWNjZXB0aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29jay5hY2NlcHQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlclNvY2suZ2V0TG9jYWxQb3J0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWNjZXB0aW5nKCkgewotICAgICAgICByZXR1cm4gYWNjZXB0aW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2VydmVyU29jay5jbG9zZSgpOwotICAgIH0KLX0KLQotcHVibGljIGNsYXNzIERlYWRTU0xMZGFwVGltZW91dFRlc3QgewotCi0gICAgc3RhdGljIEhhc2h0YWJsZSBjcmVhdGVFbnYoKSB7Ci0gICAgICAgIEhhc2h0YWJsZSBlbnYgPSBuZXcgSGFzaHRhYmxlKDExKTsKLSAgICAgICAgZW52LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAotICAgICAgICAgICAgImNvbS5zdW4uam5kaS5sZGFwLkxkYXBDdHhGYWN0b3J5Iik7Ci0gICAgICAgIHJldHVybiBlbnY7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5pdGlhbENvbnRleHQgY3R4ID0gbnVsbDsKLQotICAgICAgICAvLwotICAgICAgICAvLyBSdW5uaW5nIHRoaXMgdGVzdCBzZXJpYWxseSBhcyBpdCBzZWVtcyB0byB0aWNrbGUgYSBwcm9ibGVtCi0gICAgICAgIC8vIG9uIG9sZGVyIGtlcm5lbHMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gcnVuIHRoZSBEZWFkU2VydmVyVGVzdCB3aXRoIGNvbm5lY3QgLyByZWFkIHRpbWVvdXRzIHNldAotICAgICAgICAvLyBhbmQgc3NsIGVuYWJsZWQKLSAgICAgICAgLy8gdGhpcyBzaG91bGQgZXhpdCB3aXRoIGEgU29ja2V0VGltZW91dEV4Y2VwdGlvbiBhcyB0aGUgcm9vdCBjYXVzZQotICAgICAgICAvLyBpdCBzaG91bGQgYWxzbyB1c2UgdGhlIGNvbm5lY3QgdGltZW91dCBpbnN0ZWFkIG9mIHRoZSByZWFkIHRpbWVvdXQKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGNvbm5lY3QgdGltZW91dCB0ZXN0IHdpdGggMTBtcyBjb25uZWN0IHRpbWVvdXQsIDMwMDBtcyByZWFkIHRpbWVvdXQgJiBTU0wiKTsKLSAgICAgICAgSGFzaHRhYmxlIHNzbGVudiA9IGNyZWF0ZUVudigpOwotICAgICAgICBzc2xlbnYucHV0KCJjb20uc3VuLmpuZGkubGRhcC5jb25uZWN0LnRpbWVvdXQiLCAiMTAiKTsKLSAgICAgICAgc3NsZW52LnB1dCgiY29tLnN1bi5qbmRpLmxkYXAucmVhZC50aW1lb3V0IiwgIjMwMDAiKTsKLSAgICAgICAgc3NsZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX1BST1RPQ09MLCAic3NsIik7Ci0gICAgICAgIGJvb2xlYW4gdGVzdEZhaWxlZCA9Ci0gICAgICAgICAgICAobmV3IERlYWRTZXJ2ZXJUaW1lb3V0U1NMVGVzdChzc2xlbnYpLmNhbGwoKSkgPyBmYWxzZSA6IHRydWU7Ci0KLSAgICAgICAgaWYgKHRlc3RGYWlsZWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigic29tZSB0ZXN0cyBmYWlsZWQiKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL0xkYXBUaW1lb3V0VGVzdC5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvTGRhcFRpbWVvdXRUZXN0LmphdmEKaW5kZXggYWEwNzFlZi4uOWE1NTgwMCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvTGRhcFRpbWVvdXRUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvTGRhcFRpbWVvdXRUZXN0LmphdmEKQEAgLTQ2LDcgKzQ2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEhhbmRzaGFrZUV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOwpAQCAtODQsMTAgKzgzLDYgQEAKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkIik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZmFpbChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBmYWlsZWQiLCBlKTsKLSAgICB9Ci0KICAgICBib29sZWFuIHNodXRJdERvd24oSW5pdGlhbENvbnRleHQgY3R4KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoY3R4ICE9IG51bGwpIGN0eC5jbG9zZSgpOwpAQCAtMjI0LDYgKzIxOSwyMyBAQAogICAgIH0KIH0KIAorY2xhc3MgRGVhZFNlcnZlclRpbWVvdXRTU0xUZXN0IGV4dGVuZHMgRGVhZFNlcnZlclRlc3QgeworCisgICAgcHVibGljIERlYWRTZXJ2ZXJUaW1lb3V0U1NMVGVzdChIYXNodGFibGUgZW52KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlcihlbnYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGhhbmRsZU5hbWluZ0V4Y2VwdGlvbihOYW1pbmdFeGNlcHRpb24gZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vIFNTTCBjb25uZWN0IHdpbGwgdGltZW91dCB2aWEgcmVhZFJlcGx5IHVzaW5nCisgICAgICAgICAgICAvLyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uCisgICAgICAgICAgICBwYXNzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIAogY2xhc3MgUmVhZFNlcnZlck5vVGltZW91dFRlc3QgZXh0ZW5kcyBSZWFkU2VydmVyVGVzdCB7CiAKQEAgLTI1Niw4ICsyNjgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGhhbmRsZU5hbWluZ0V4Y2VwdGlvbihOYW1pbmdFeGNlcHRpb24gZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWFkU2VydmVyVGltZW91dFRlc3Q6IGVuZC1zdGFydD0iICsgTkFOT1NFQ09ORFMudG9NaWxsaXMoZW5kIC0gc3RhcnQpKTsKLSAgICAgICAgaWYgKE5BTk9TRUNPTkRTLnRvTWlsbGlzKGVuZCAtIHN0YXJ0KSA8IDJfNTAwKSB7CisgICAgICAgIGlmIChOQU5PU0VDT05EUy50b01pbGxpcyhlbmQgLSBzdGFydCkgPCAyXzkwMCkgewogICAgICAgICAgICAgZmFpbCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcGFzcygpOwpAQCAtMzk1LDE0ICs0MDYsMTEgQEAKIAogICAgICAgICAgICAgLy8gcnVuIHRoZSBSZWFkU2VydmVyVGVzdCB3aXRoIGNvbm5lY3QgLyByZWFkIHRpbWVvdXRzIHNldAogICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgZXhpdCBhZnRlciB0aGUgY29ubmVjdCB0aW1lb3V0IGV4cGlyZXMKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBOT1RFOiBjb21tZW50aW5nIHRoaXMgdGVzdCBvdXQgYXMgaXQgaXMgZmFpbGluZyBpbnRlcm1pdHRlbnRseS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgcmVhZCB0aW1lb3V0IHRlc3Qgd2l0aCAxMG1zIGNvbm5lY3QgdGltZW91dCwgMzAwMG1zIHJlYWQgdGltZW91dCIpOwotICAgICAgICAgICAgLy8gSGFzaHRhYmxlIGVudjQgPSBjcmVhdGVFbnYoKTsKLSAgICAgICAgICAgIC8vIGVudjQucHV0KCJjb20uc3VuLmpuZGkubGRhcC5jb25uZWN0LnRpbWVvdXQiLCAiMTAiKTsKLSAgICAgICAgICAgIC8vIGVudjQucHV0KCJjb20uc3VuLmpuZGkubGRhcC5yZWFkLnRpbWVvdXQiLCAiMzAwMCIpOwotICAgICAgICAgICAgLy8gcmVzdWx0cy5hZGQodGVzdFBvb2wuc3VibWl0KG5ldyBSZWFkU2VydmVyVGltZW91dFRlc3QoZW52NCkpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVubmluZyByZWFkIHRpbWVvdXQgdGVzdCB3aXRoIDEwbXMgY29ubmVjdCB0aW1lb3V0LCAzMDAwbXMgcmVhZCB0aW1lb3V0Iik7CisgICAgICAgICAgICBIYXNodGFibGUgZW52NCA9IGNyZWF0ZUVudigpOworICAgICAgICAgICAgZW52NC5wdXQoImNvbS5zdW4uam5kaS5sZGFwLmNvbm5lY3QudGltZW91dCIsICIxMCIpOworICAgICAgICAgICAgZW52NC5wdXQoImNvbS5zdW4uam5kaS5sZGFwLnJlYWQudGltZW91dCIsICIzMDAwIik7CisgICAgICAgICAgICByZXN1bHRzLmFkZCh0ZXN0UG9vbC5zdWJtaXQobmV3IFJlYWRTZXJ2ZXJUaW1lb3V0VGVzdChlbnY0KSkpOwogCiAgICAgICAgICAgICAvLyBydW4gdGhlIERlYWRTZXJ2ZXJUZXN0IHdpdGggY29ubmVjdCB0aW1lb3V0IHNldAogICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgZXhpdCBhZnRlciB0aGUgY29ubmVjdCB0aW1lb3V0IGV4cGlyZXMKQEAgLTQzMCw2ICs0MzgsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSdW5uaW5nIHRoaXMgdGVzdCBzZXJpYWxseSBhcyBpdCBzZWVtcyB0byB0aWNrbGUgYSBwcm9ibGVtCisgICAgICAgICAgICAvLyBvbiBvbGRlciBrZXJuZWxzCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcnVuIHRoZSBEZWFkU2VydmVyVGVzdCB3aXRoIGNvbm5lY3QgLyByZWFkIHRpbWVvdXRzIHNldAorICAgICAgICAgICAgLy8gYW5kIHNzbCBlbmFibGVkCisgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBleGl0IHdpdGggYSBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGFzIHRoZSByb290IGNhdXNlCisgICAgICAgICAgICAvLyBpdCBzaG91bGQgYWxzbyB1c2UgdGhlIGNvbm5lY3QgdGltZW91dCBpbnN0ZWFkIG9mIHRoZSByZWFkIHRpbWVvdXQKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUnVubmluZyBjb25uZWN0IHRpbWVvdXQgdGVzdCB3aXRoIDEwbXMgY29ubmVjdCB0aW1lb3V0LCAzMDAwbXMgcmVhZCB0aW1lb3V0ICYgU1NMIik7CisgICAgICAgICAgICBIYXNodGFibGUgc3NsZW52ID0gY3JlYXRlRW52KCk7CisgICAgICAgICAgICBzc2xlbnYucHV0KCJjb20uc3VuLmpuZGkubGRhcC5jb25uZWN0LnRpbWVvdXQiLCAiMTAiKTsKKyAgICAgICAgICAgIHNzbGVudi5wdXQoImNvbS5zdW4uam5kaS5sZGFwLnJlYWQudGltZW91dCIsICIzMDAwIik7CisgICAgICAgICAgICBzc2xlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJPVE9DT0wsICJzc2wiKTsKKyAgICAgICAgICAgIHRlc3RGYWlsZWQgPSAobmV3IERlYWRTZXJ2ZXJUaW1lb3V0U1NMVGVzdChzc2xlbnYpLmNhbGwoKSkgPyBmYWxzZSA6IHRydWU7CisKICAgICAgICAgICAgIGlmICh0ZXN0RmFpbGVkKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJzb21lIHRlc3RzIGZhaWxlZCIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvU2ltcGxlQ2xpZW50SWRIYXNoQ29kZS5qYXZhIGIvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvU2ltcGxlQ2xpZW50SWRIYXNoQ29kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTZlMmM0Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL1NpbXBsZUNsaWVudElkSGFzaENvZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNTg4MDIKLSAqIEBzdW1tYXJ5IGNvbS5zdW4uam5kaS5sZGFwLlNpbXBsZUNsaWVudElkIHByb2R1Y2VzIHdyb25nIGhhc2ggY29kZQotICogQG1vZHVsZXMgamF2YS5uYW1pbmcvY29tLnN1bi5qbmRpLmxkYXAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YXgubmFtaW5nLmxkYXAuQ29udHJvbDsKLQotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2xpZW50SWRIYXNoQ29kZSB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIENsYXNzPD8+IHNpbXBsZUNsaWVudElkQ2xhc3MKLSAgICAgICAgICAgICAgICA9IENsYXNzLmZvck5hbWUoImNvbS5zdW4uam5kaS5sZGFwLlNpbXBsZUNsaWVudElkIik7Ci0gICAgICAgIENvbnN0cnVjdG9yPD8+IGluaXQgPSBzaW1wbGVDbGllbnRJZENsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoCi0gICAgICAgICAgICAgICAgaW50LmNsYXNzLCBTdHJpbmcuY2xhc3MsIGludC5jbGFzcywgU3RyaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgIENvbnRyb2xbXS5jbGFzcywgT3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBPYmplY3QuY2xhc3MpOwotICAgICAgICBpbml0LnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgT2JqZWN0IHAxID0gbmV3IGJ5dGVbXXs2Niw3N307Ci0gICAgICAgIE9iamVjdCBwMiA9IG5ldyBjaGFyW117J3cnLCdkJ307Ci0gICAgICAgIE9iamVjdCBwMyA9ICJ3b3JkIjsKLQotICAgICAgICB0ZXN0KGluaXQsIG5ldyBieXRlW117NjV9LCBuZXcgYnl0ZVtdezY1fSk7Ci0gICAgICAgIHRlc3QoaW5pdCwgbmV3IGNoYXJbXXsncCd9LCBuZXcgY2hhcltdeydwJ30pOwotICAgICAgICB0ZXN0KGluaXQsICJwYXNzIiwgInBhc3MiKTsKLSAgICAgICAgdGVzdChpbml0LCBwMSwgcDEpOwotICAgICAgICB0ZXN0KGluaXQsIHAyLCBwMik7Ci0gICAgICAgIHRlc3QoaW5pdCwgcDMsIHAzKTsKLSAgICAgICAgdGVzdChpbml0LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QoQ29uc3RydWN0b3I8Pz4gaW5pdCwgT2JqZWN0IHBhc3MxLCBPYmplY3QgcGFzczIpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLQotICAgICAgICBPYmplY3QgbzEgPSBpbml0Lm5ld0luc3RhbmNlKDEsICJob3N0IiwgMywgIiIsIG51bGwsIFN5c3RlbS5vdXQsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcGFzczEpOwotICAgICAgICBPYmplY3QgbzIgPSBpbml0Lm5ld0luc3RhbmNlKDEsICJob3N0IiwgMywgIiIsIG51bGwsIFN5c3RlbS5vdXQsCi0gICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgcGFzczIpOwotCi0gICAgICAgIGlmICghbzEuZXF1YWxzKG8yKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJPYmplY3RzIG5vdCBlcXVhbCIpOwotCi0gICAgICAgIGlmIChvMS5oYXNoQ29kZSgpICE9IG8yLmhhc2hDb2RlKCkpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW5jb25zaXN0ZW50IGhhc2ggY29kZXMiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdU9sZFRlc3QuamF2YSBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1T2xkVGVzdC5qYXZhCmluZGV4IDAwMTdiMjEuLjgyMDcwNDQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1T2xkVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1T2xkVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICBEZW1vUnVuIGhwcm9mOwogCiAgICAgICAgIC8qIFJ1biBKVk1USSBocHJvZiBhZ2VudCB3aXRoIGNwdT1vbGQgKi8KLSAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiY3B1PW9sZCxmaWxlPWNwdW9sZC50eHQiKTsKKyAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiY3B1PW9sZCIpOwogICAgICAgICBocHJvZi5ydW5pdChhcmdzWzBdKTsKIAogICAgICAgICAvKiBNYWtlIHN1cmUgcGF0dGVybnMgaW4gb3V0cHV0IGxvb2sgb2sgKi8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1U2FtcGxlc1Rlc3QuamF2YSBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1U2FtcGxlc1Rlc3QuamF2YQppbmRleCA5ODZhZjQzLi5hZDQ2NjE4IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdVNhbXBsZXNUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9DcHVTYW1wbGVzVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICBEZW1vUnVuIGhwcm9mOwogCiAgICAgICAgIC8qIFJ1biBKVk1USSBocHJvZiBhZ2VudCB3aXRoIGNwdT1zYW1wbGVzICovCi0gICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgImNwdT1zYW1wbGVzLGZpbGU9Y3B1c2FtcGxlcy50eHQiKTsKKyAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiY3B1PXNhbXBsZXMiKTsKICAgICAgICAgaHByb2YucnVuaXQoYXJnc1swXSk7CiAKICAgICAgICAgLyogTWFrZSBzdXJlIHBhdHRlcm5zIGluIG91dHB1dCBsb29rIG9rICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdVRpbWVzRGVmaW5lQ2xhc3NUZXN0LmphdmEgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdVRpbWVzRGVmaW5lQ2xhc3NUZXN0LmphdmEKaW5kZXggM2NmOTZiYi4uOTdjNTBlYiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9DcHVUaW1lc0RlZmluZUNsYXNzVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1VGltZXNEZWZpbmVDbGFzc1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgRGVtb1J1biBocHJvZjsKIAogICAgICAgICAvKiBSdW4gSlZNVEkgaHByb2YgYWdlbnQgd2l0aCBjcHU9dGltZXMgKi8KLSAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiY3B1PXRpbWVzLGZpbGU9Y3B1dGltZWRlZmluZWNsYXNzLnR4dCIpOworICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJjcHU9dGltZXMiKTsKICAgICAgICAgaHByb2YucnVuaXQoYXJnc1swXSk7CiAKICAgICAgICAgLyogTWFrZSBzdXJlIHBhdHRlcm5zIGluIG91dHB1dCBsb29rIG9rICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdVRpbWVzVGVzdC5qYXZhIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9DcHVUaW1lc1Rlc3QuamF2YQppbmRleCA0ZDY3OTAwLi43NjkyZDJhIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0NwdVRpbWVzVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvQ3B1VGltZXNUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgIERlbW9SdW4gaHByb2Y7CiAKICAgICAgICAgLyogUnVuIEpWTVRJIGhwcm9mIGFnZW50IHdpdGggY3B1PXRpbWVzICovCi0gICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgImNwdT10aW1lcyxmaWxlPWNwdXRpbWVzLnR4dCIpOworICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJjcHU9dGltZXMiKTsKICAgICAgICAgaHByb2YucnVuaXQoYXJnc1swXSk7CiAKICAgICAgICAgLyogTWFrZSBzdXJlIHBhdHRlcm5zIGluIG91dHB1dCBsb29rIG9rICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0hlYXBBbGxUZXN0LmphdmEgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0hlYXBBbGxUZXN0LmphdmEKaW5kZXggZDU0M2Y3My4uMDgwMTU1OSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwQWxsVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvSGVhcEFsbFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3LDcgKzM3LDcgQEAKICAgICAgICAgRGVtb1J1biBocHJvZjsKIAogICAgICAgICAvKiBSdW4gSlZNVEkgaHByb2YgYWdlbnQgd2l0aCBoZWFwPWFsbCAqLwotICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJoZWFwPWFsbCxmaWxlPWhlYXBhbGwudHh0Iik7CisgICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgImhlYXA9YWxsIik7CiAgICAgICAgIGhwcm9mLnJ1bml0KGFyZ3NbMF0pOwogCiAgICAgICAgIC8qIE1ha2Ugc3VyZSBwYXR0ZXJucyBpbiBvdXRwdXQgbG9vayBvayAqLwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwQmluYXJ5Rm9ybWF0VGVzdC5qYXZhIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwQmluYXJ5Rm9ybWF0VGVzdC5qYXZhCmluZGV4IDBiYzAxMzUuLjk0NTY3Y2QgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvSGVhcEJpbmFyeUZvcm1hdFRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0hlYXBCaW5hcnlGb3JtYXRUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgIERlbW9SdW4gaHByb2Y7CiAKICAgICAgICAgLyogUnVuIEpWTVRJIGhwcm9mIGFnZW50IHRvIGdldCBiaW5hcnkgZm9ybWF0IGR1bXAgKi8KLSAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiaGVhcD1kdW1wLGZvcm1hdD1iLGxvZ2ZsYWdzPTQsZmlsZT1oZWFwYmluYXJ5Zm9ybWF0LnR4dCIpOworICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJoZWFwPWR1bXAsZm9ybWF0PWIsbG9nZmxhZ3M9NCIpOwogICAgICAgICBocHJvZi5ydW5pdChhcmdzWzBdKTsKIAogICAgICAgICAvKiBNYWtlIHN1cmUgcGF0dGVybnMgaW4gb3V0cHV0IGxvb2sgb2sgKi8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvSGVhcER1bXBUZXN0LmphdmEgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL0hlYXBEdW1wVGVzdC5qYXZhCmluZGV4IDExMjllOTMuLjMyY2MwMWMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvSGVhcER1bXBUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwRHVtcFRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3LDcgKzM3LDcgQEAKICAgICAgICAgRGVtb1J1biBocHJvZjsKIAogICAgICAgICAvKiBSdW4gSlZNVEkgaHByb2YgYWdlbnQgd2l0aCBoZWFwPWR1bXAgKi8KLSAgICAgICAgaHByb2YgPSBuZXcgRGVtb1J1bigiaHByb2YiLCAiaGVhcD1kdW1wLGZpbGU9aGVhcGR1bXAudHh0Iik7CisgICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgImhlYXA9ZHVtcCIpOwogICAgICAgICBocHJvZi5ydW5pdChhcmdzWzBdKTsKIAogICAgICAgICAvKiBNYWtlIHN1cmUgcGF0dGVybnMgaW4gb3V0cHV0IGxvb2sgb2sgKi8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvSGVhcFNpdGVzVGVzdC5qYXZhIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwU2l0ZXNUZXN0LmphdmEKaW5kZXggODU1YmZhZC4uM2JkYmU2YyAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwU2l0ZXNUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9IZWFwU2l0ZXNUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgIERlbW9SdW4gaHByb2Y7CiAKICAgICAgICAgLyogUnVuIEpWTVRJIGhwcm9mIGFnZW50IHdpdGggaGVhcD1zaXRlcyAqLwotICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJoZWFwPXNpdGVzLGZpbGU9aGVhcHNpdGVzLnR4dCIpOworICAgICAgICBocHJvZiA9IG5ldyBEZW1vUnVuKCJocHJvZiIsICJoZWFwPXNpdGVzIik7CiAgICAgICAgIGhwcm9mLnJ1bml0KGFyZ3NbMF0pOwogCiAgICAgICAgIC8qIE1ha2Ugc3VyZSBwYXR0ZXJucyBpbiBvdXRwdXQgbG9vayBvayAqLwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9Nb25pdG9yVGVzdC5qYXZhIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9Nb25pdG9yVGVzdC5qYXZhCmluZGV4IDJlODI2MWYuLjI1MTJlZmQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvTW9uaXRvclRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL01vbml0b3JUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00Miw3ICs0Miw3IEBACiAgICAgICAgIERlbW9SdW4gaHByb2Y7CiAKICAgICAgICAgLyogUnVuIEpWTVRJIGhwcm9mIGFnZW50IHdpdGggbW9uaXRvcj15ICovCi0gICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgIm1vbml0b3I9eSxmaWxlPW1vbml0b3IudHh0Iik7CisgICAgICAgIGhwcm9mID0gbmV3IERlbW9SdW4oImhwcm9mIiwgIm1vbml0b3I9eSIpOwogICAgICAgICBocHJvZi5ydW5pdChhcmdzWzBdKTsKIAogICAgICAgICAvKiBNYWtlIHN1cmUgcGF0dGVybnMgaW4gb3V0cHV0IGxvb2sgb2sgKi8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvT3B0aW9uc1Rlc3QuamF2YSBiL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvT3B0aW9uc1Rlc3QuamF2YQppbmRleCBlYmQwOTIyLi4zOTczNTdjIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL09wdGlvbnNUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9PcHRpb25zVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzksMTAgKzM5LDEwIEBACiAgICAgICAgIERlbW9SdW4gaHByb2Y7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBvcHRpb25zID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwogCi0gICAgICAgIG9wdGlvbnMuYWRkKCJjcHU9c2FtcGxlcyxkZXB0aD0wLGZpbGU9b3B0aW9uczAudHh0Iik7Ci0gICAgICAgIG9wdGlvbnMuYWRkKCJjcHU9dGltZXMsZGVwdGg9MCxmaWxlPW9wdGlvbnMxLnR4dCIpOwotICAgICAgICBvcHRpb25zLmFkZCgiY3B1PW9sZCxkZXB0aD0wLGZpbGU9b3B0aW9uczIudHh0Iik7Ci0gICAgICAgIG9wdGlvbnMuYWRkKCJkZXB0aD0wLGZpbGU9b3B0aW9uczMudHh0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkKCJjcHU9c2FtcGxlcyxkZXB0aD0wIik7CisgICAgICAgIG9wdGlvbnMuYWRkKCJjcHU9dGltZXMsZGVwdGg9MCIpOworICAgICAgICBvcHRpb25zLmFkZCgiY3B1PW9sZCxkZXB0aD0wIik7CisgICAgICAgIG9wdGlvbnMuYWRkKCJkZXB0aD0wIik7CiAKICAgICAgICAgZm9yKFN0cmluZyBvcHRpb246IG9wdGlvbnMpIHsKICAgICAgICAgICAgIC8qIFJ1biBKVk1USSBocHJvZiBhZ2VudCB3aXRoIHZhcmlvdXMgb3B0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9TdGFja01hcFRhYmxlVGVzdC5qYXZhIGIvamRrL3Rlc3QvZGVtby9qdm10aS9ocHJvZi9TdGFja01hcFRhYmxlVGVzdC5qYXZhCmluZGV4IDNlNDYyOWUuLmViM2ZhZTEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2RlbW8vanZtdGkvaHByb2YvU3RhY2tNYXBUYWJsZVRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9kZW1vL2p2bXRpL2hwcm9mL1N0YWNrTWFwVGFibGVUZXN0LmphdmEKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgICAgICBEZW1vUnVuIGhwcm9mOwogICAgICAgICBMaXN0PFN0cmluZz4gb3B0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKIAotICAgICAgICBvcHRpb25zLmFkZCgiY3B1PXNhbXBsZXMsZmlsZT1zdGFja21hcHRhYmxlMC50eHQiKTsKLSAgICAgICAgb3B0aW9ucy5hZGQoImNwdT10aW1lcyxmaWxlPXN0YWNrbWFwdGFibGUxLnR4dCIpOwotICAgICAgICBvcHRpb25zLmFkZCgiaGVhcD1zaXRlcyxmaWxlPXN0YWNrbWFwdGFibGUyLnR4dCIpOwotICAgICAgICBvcHRpb25zLmFkZCgiZmlsZT1zdGFja21hcHRhYmxlMy50eHQiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoImNwdT1zYW1wbGVzIik7CisgICAgICAgIG9wdGlvbnMuYWRkKCJjcHU9dGltZXMiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoImhlYXA9c2l0ZXMiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoIiIpOwogCiAgICAgICAgIGZvcihTdHJpbmcgb3B0aW9uOiBvcHRpb25zKSB7CiAgICAgICAgICAgICAvKiBSdW4gSlZNVEkgaHByb2YgYWdlbnQgd2l0aCB2YXJpb3VzIG9wdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L0NvbnRhaW5lci9Nb3ZlVG9PdGhlclNjcmVlblRlc3QvTW92ZVRvT3RoZXJTY3JlZW5UZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9Db250YWluZXIvTW92ZVRvT3RoZXJTY3JlZW5UZXN0L01vdmVUb090aGVyU2NyZWVuVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWNmYTRhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvYXd0L0NvbnRhaW5lci9Nb3ZlVG9PdGhlclNjcmVlblRlc3QvTW92ZVRvT3RoZXJTY3JlZW5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLWltcG9ydCBqYXZhLmF3dC5DYW52YXM7Ci1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0RldmljZTsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0Vudmlyb25tZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLQotCi0vKiBAdGVzdAotICAgQGJ1ZyA4MTYwNjk2Ci0gICBAc3VtbWFyeSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb246IGFkZGluZyBhIGNvbXBvbmVudCB0byBhIGNvbnRhaW5lciBvbiBhIGRpZmZlcmVudCBHcmFwaGljc0RldmljZQotICAgQGF1dGhvciBNaWtoYWlsIENoZXJrYXNvdgotICAgQHJ1biBtYWluIE1vdmVUb090aGVyU2NyZWVuVGVzdAotKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVG9PdGhlclNjcmVlblRlc3QgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiB0d29EaXNwbGF5cyA9IHRydWU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGcmFtZVtdIGZybXMgPSBuZXcgSkZyYW1lWzJdOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgR3JhcGhpY3NFbnZpcm9ubWVudCBnZSA9IEdyYXBoaWNzRW52aXJvbm1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKTsKLSAgICAgICAgICAgICAgICBHcmFwaGljc0RldmljZVtdIGdkcyA9IGdlLmdldFNjcmVlbkRldmljZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2RzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHJlcXVpcmVzIGF0IGxlYXN0IDIgZGlzcGxheXMiKTsKLSAgICAgICAgICAgICAgICAgICAgdHdvRGlzcGxheXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbmZpZ3VyYXRpb24gY29uZiA9IGdkc1tpXS5nZXRDb25maWd1cmF0aW9ucygpWzBdOwotICAgICAgICAgICAgICAgICAgICBKRnJhbWUgZnJtID0gbmV3IEpGcmFtZSgiRnJhbWUgIiArIGkpOwotICAgICAgICAgICAgICAgICAgICBmcm0uc2V0TG9jYXRpb24oY29uZi5nZXRCb3VuZHMoKS54LCAwKTsgLy8gT24gZmlyc3Qgc2NyZWVuCi0gICAgICAgICAgICAgICAgICAgIGZybS5zZXRTaXplKG5ldyBEaW1lbnNpb24oNDAwLCA0MDApKTsKLSAgICAgICAgICAgICAgICAgICAgZnJtLnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihKRnJhbWUuRVhJVF9PTl9DTE9TRSk7Ci0gICAgICAgICAgICAgICAgICAgIGZybS5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBmcm1zW2ldID0gZnJtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYW52YXMuc2V0QmFja2dyb3VuZChDb2xvci5yZWQpOwotICAgICAgICAgICAgICAgIGZybXNbMF0uYWRkKGNhbnZhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZighdHdvRGlzcGxheXMpewotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZnJtc1sxXS5hZGQoY2FudmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZvciAoRnJhbWUgZnJtIDogZnJtcykgewotICAgICAgICAgICAgZnJtLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L0ZvY3VzL01vZGFsRGlhbG9nQWN0aXZhdGlvblRlc3QvTW9kYWxEaWFsb2dBY3RpdmF0aW9uVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvRm9jdXMvTW9kYWxEaWFsb2dBY3RpdmF0aW9uVGVzdC9Nb2RhbERpYWxvZ0FjdGl2YXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZmY4ZWUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvRm9jdXMvTW9kYWxEaWFsb2dBY3RpdmF0aW9uVGVzdC9Nb2RhbERpYWxvZ0FjdGl2YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YXguc3dpbmcuKjsKLWltcG9ydCBqYXZhLmF3dC4qOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7Ci0KLS8qCi0gIEB0ZXN0Ci0gIEBidWcgICAgICAgODE2MDU3MAotICBAc3VtbWFyeSAgIFRlc3RzIHRoYXQgYSBtb2RhbCBkaWFsb2cgcmVjZWl2ZXMgV0lORE9XX0FDVElWQVRFRCAmIFdJTkRPV19HQUlORURfRk9DVVMgb24gZmlyc3Qgc2hvdy4KLSovCi1wdWJsaWMgY2xhc3MgTW9kYWxEaWFsb2dBY3RpdmF0aW9uVGVzdCB7Ci0gICAgc3RhdGljIGZpbmFsIE9iamVjdCBsb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFjdGl2YXRlZDsKLSAgICBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBmb2N1c2VkOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcigoKSAtPiBydW5HVUkoKSk7Ci0KLSAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgewotICAgICAgICAgICAgd2hpbGUgKCFhY3RpdmF0ZWQgfHwgIWZvY3VzZWQpIHsKLSAgICAgICAgICAgICAgICBsb2NrLndhaXQoNTAwMCk7Ci0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSA+PSA1MDAwKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWFjdGl2YXRlZCB8fCAhZm9jdXNlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgRkFJTEVEOiBhY3RpdmF0ZWQ6ICIgKyBhY3RpdmF0ZWQgKyAiLCBmb2N1c2VkOiAiICsgZm9jdXNlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IFBBU1NFRCIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHJ1bkdVSSgpIHsKLSAgICAgICAgSkZyYW1lIGYgPSBuZXcgSkZyYW1lKCJmcmFtZSIpOwotICAgICAgICBmaW5hbCBKRGlhbG9nIGQgPSBuZXcgTXlNb2RhbERpYWxvZyhmLCAiZGlhbG9nIik7Ci0gICAgICAgIGQuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2subm90aWZ5QWxsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZC5hZGRXaW5kb3dGb2N1c0xpc3RlbmVyKG5ldyBXaW5kb3dBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dHYWluZWRGb2N1cyhXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvY3VzZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsb2NrLm5vdGlmeUFsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGYuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgZC5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBNeU1vZGFsRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7Ci0gICAgICAgIHB1YmxpYyBNeU1vZGFsRGlhbG9nKEZyYW1lIG93bmVyLCBTdHJpbmcgdGl0bGUpwqogewotICAgICAgICAgICAgc3VwZXIob3duZXIsIHRpdGxlLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRGb2N1c2FibGVXaW5kb3dTdGF0ZSgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gbGV0IFRvb2xraXQgdGhyZWFkIGdvIGFoZWFkCi0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRGb2N1c2FibGVXaW5kb3dTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvSW5wdXRNZXRob2RzL0RpYWNyaXRpY3NUZXN0L0RpYWNyaXRpY3NUZXN0Lmh0bWwgYi9qZGsvdGVzdC9qYXZhL2F3dC9JbnB1dE1ldGhvZHMvRGlhY3JpdGljc1Rlc3QvRGlhY3JpdGljc1Rlc3QuaHRtbAppbmRleCA1Y2Y1YzkxLi44OWRhYjNkIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL2F3dC9JbnB1dE1ldGhvZHMvRGlhY3JpdGljc1Rlc3QvRGlhY3JpdGljc1Rlc3QuaHRtbAorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9JbnB1dE1ldGhvZHMvRGlhY3JpdGljc1Rlc3QvRGlhY3JpdGljc1Rlc3QuaHRtbApAQCAtMSw1ICsxLDUgQEAKIDwhLS0KLUNvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KIAogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDggKzMxLDYgQEAKIFRlc3QgcnVuIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcga2V5Ym9hcmQgbGF5b3V0cyB0byBiZSBpbnN0YWxsZWQ6CiBMaW51eCBPUzogRW5nbGlzaCAoVVMsIGFsdGVybmF0aXZlIGludGVybmF0aW9uYWwpCiBXaW5kb3dzIE9TOiBIdW5nYXJpYW4KLUEga2V5Ym9hcmQgbGF5b3V0IGhhdmluZyBjb21wb3NlIGZ1bmN0aW9uIG9yIGNvbXBvc2UtbGlrZSBrZXkuIFByb2dyYW1tZXIKLUR2b3JhayAoaHR0cDovL3d3dy5rYXVmbWFubi5uby9yb2xhbmQvZHZvcmFrLykgaXMgc3VnZ2VzdGVkIHRvIHVzZS4KIAogVG8gdGVzdCBKREstODAwMDQyMyBmaXggKExpbnV4IG9ubHkhKToKIHBsZWFzZSBzd2l0Y2ggdG8gVVMgYWx0ZXJuYXRpdmUgaW50ZXJuYXRpb25hbCBsYXlvdXQgYW5kIHRyeSB0byB0eXBlIGRpYWNyaXRpY3MKQEAgLTQyLDEyICs0MCw2IEBACiBwbGVhc2Ugc3dpdGNoIHRvIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgYW5kIHRyeSB0byB0eXBlIGRpYWNyaXRpY3MgCiAoQ3RybCtBbHQrMiBlOyBDdHJsK0FsdCsyIEUpCiAKLVRvIHRlc3QgSkRLLTgxMzkxODkgZml4OgotcGxlYXNlIHN3aXRjaCB0byBQcm9ncmFtbWVyIER2b3JhayBrZXlib2FyZCBsYXlvdXQgdHJ5IHRvIHR5cGUgZGlhY3JpdGljcwotdXNpbmcgY29tcG9zZSBjb21iaW5hdGlvbnMgKENvbXBvc2UreitkLCBDb21wb3NlK3orU2hpZnQrZCkuIFRoZSBDb21wb3NlIGtleQotaW4gUHJvZ3JhbW1lciBEdm9yYWsgbGF5b3V0IGlzIE9FTTEwMiB0aGUga2V5IHdoaWNoIGlzIGxvY2F0ZWQgYmV0d2VlbgotTGVmdCBTaGlmdCBhbmQgWiBrZXlzIG9uIHRoZSBzdGFuZGFyZCAxMDIta2V5IGtleWJvYXJkLgotCiBJZiB5b3UgY2FuIGRvIHRoYXQgdGhlbiB0aGUgdGVzdCBpcyBwYXNzZWQ7IG90aGVyd2lzZSBmYWlsZWQuCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9Nb3VzZS9FbnRlckV4aXRFdmVudHMvTW9kYWxEaWFsb2dFbnRlckV4aXRFdmVudHNUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9Nb3VzZS9FbnRlckV4aXRFdmVudHMvTW9kYWxEaWFsb2dFbnRlckV4aXRFdmVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzJkMmYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvTW91c2UvRW50ZXJFeGl0RXZlbnRzL01vZGFsRGlhbG9nRW50ZXJFeGl0RXZlbnRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA1MDQ3OAotICogQHN1bW1hcnkgQ3Vyc29yIG5vdCB1cGRhdGluZyBjb3JyZWN0bHkgYWZ0ZXIgY2xvc2luZyBhIG1vZGFsIGRpYWxvZy4KLSAqICAgIFRoZSByb290IGNhdXNlIG9mIHRoZSBpc3N1ZSB3YXMgdGhlIGxhY2sgb2YgYSBtb3VzZSBleGl0IGV2ZW50Ci0gKiAgICBkdXJpbmcgZGlzcGxheWluZyBvZiBhIG1vZGFsIGRpYWxvZy4KLSAqIEBhdXRob3IgRG1pdHJ5IE1hcmtvdgotICogQGxpYnJhcnkgLi4vLi4vcmVndGVzdGhlbHBlcnMKLSAqIEBidWlsZCBVdGlsCi0gKiBAcnVuIG1haW4gTW9kYWxEaWFsb2dFbnRlckV4aXRFdmVudHNUZXN0Ci0gKi8KLQotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkRpYWxvZzsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YS5hd3QuRmxvd0xheW91dDsKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKLQotaW1wb3J0IHRlc3QuamF2YS5hd3QucmVndGVzdGhlbHBlcnMuVXRpbDsKLQotcHVibGljIGNsYXNzIE1vZGFsRGlhbG9nRW50ZXJFeGl0RXZlbnRzVGVzdCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQXRvbWljSW50ZWdlciBtb3VzZUVudGVyQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEF0b21pY0ludGVnZXIgbW91c2VFeGl0Q291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkZyYW1lIGZyYW1lOwotICAgIHByaXZhdGUgc3RhdGljIEpCdXR0b24gb3BlbkJ1dHRvbjsKLSAgICBwcml2YXRlIHN0YXRpYyBKQnV0dG9uIGNsb3NlQnV0dG9uOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBSb2JvdCByb2JvdCA9IFV0aWwuY3JlYXRlUm9ib3QoKTsKLQotICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBjcmVhdGVBbmRTaG93R1VJKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBVdGlsLndhaXRGb3JJZGxlKHJvYm90KTsKLQotICAgICAgICBVdGlsLmNsaWNrT25Db21wKGZyYW1lLCByb2JvdCwgNTAwKTsKLSAgICAgICAgVXRpbC53YWl0Rm9ySWRsZShyb2JvdCk7Ci0KLSAgICAgICAgbW91c2VFbnRlckNvdW50LnNldCgwKTsKLSAgICAgICAgbW91c2VFeGl0Q291bnQuc2V0KDApOwotCi0gICAgICAgIFV0aWwuY2xpY2tPbkNvbXAob3BlbkJ1dHRvbiwgcm9ib3QsIDUwMCk7Ci0gICAgICAgIFV0aWwud2FpdEZvcklkbGUocm9ib3QpOwotICAgICAgICBpZiAobW91c2VFeGl0Q291bnQuZ2V0KCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgRkFJTEVELiBXcm9uZyBudW1iZXIgb2YgTW91c2VFeGl0ZWQgZXZlbnRzID0gIiArIG1vdXNlRXhpdENvdW50LmdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFV0aWwuY2xpY2tPbkNvbXAoY2xvc2VCdXR0b24sIHJvYm90LCA1MDApOwotICAgICAgICBVdGlsLndhaXRGb3JJZGxlKHJvYm90KTsKLSAgICAgICAgaWYgKG1vdXNlRW50ZXJDb3VudC5nZXQoKSAhPSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBGQUlMRUQuIFdyb25nIG51bWJlciBvZiBNb3VzZUVudGVyZWQgZXZlbnRzID0gIisgbW91c2VFbnRlckNvdW50LmdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQW5kU2hvd0dVSSgpIHsKLSAgICAgICAgZnJhbWUgPSBuZXcgSkZyYW1lKCJNb2RhbERpYWxvZ0VudGVyRXhpdEV2ZW50c1Rlc3QiKTsKLSAgICAgICAgZnJhbWUuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKLSAgICAgICAgZnJhbWUuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICBmcmFtZS5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRXhpdGVkKE1vdXNlRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vdXNlRXhpdENvdW50LmdldEFuZEluY3JlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRW50ZXJlZChNb3VzZUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBtb3VzZUVudGVyQ291bnQuZ2V0QW5kSW5jcmVtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBvcGVuQnV0dG9uID0gbmV3IEpCdXR0b24oIk9wZW4gRGlhbG9nIik7Ci0gICAgICAgIG9wZW5CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEpEaWFsb2cgZGlhbG9nID0gbmV3IEpEaWFsb2coZnJhbWUsICJNb2RhbCBEaWFsb2ciLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOwotICAgICAgICAgICAgICAgIGNsb3NlQnV0dG9uID0gbmV3IEpCdXR0b24oIkNsb3NlIik7Ci0gICAgICAgICAgICAgICAgY2xvc2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5kaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuYWRkKGNsb3NlQnV0dG9uKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0U2l6ZSgyMDAsIDIwMCk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLnNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGZyYW1lLmFkZChvcGVuQnV0dG9uKTsKLSAgICAgICAgZnJhbWUuc2V0RXh0ZW5kZWRTdGF0ZShGcmFtZS5NQVhJTUlaRURfQk9USCk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9TcGxhc2hTY3JlZW4vTXVsdGlSZXNvbHV0aW9uU3BsYXNoL011bHRpUmVzb2x1dGlvblNwbGFzaFRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L1NwbGFzaFNjcmVlbi9NdWx0aVJlc29sdXRpb25TcGxhc2gvTXVsdGlSZXNvbHV0aW9uU3BsYXNoVGVzdC5qYXZhCmluZGV4IGEyMmQ1MWYuLmVjNDJhYTkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvYXd0L1NwbGFzaFNjcmVlbi9NdWx0aVJlc29sdXRpb25TcGxhc2gvTXVsdGlSZXNvbHV0aW9uU3BsYXNoVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L1NwbGFzaFNjcmVlbi9NdWx0aVJlc29sdXRpb25TcGxhc2gvTXVsdGlSZXNvbHV0aW9uU3BsYXNoVGVzdC5qYXZhCkBAIC05MywxNSArOTMsNiBAQAogICAgICAgICBpbnQgc2NyZWVuWCA9IChpbnQpIHNwbGFzaEJvdW5kcy5nZXRDZW50ZXJYKCk7CiAgICAgICAgIGludCBzY3JlZW5ZID0gKGludCkgc3BsYXNoQm91bmRzLmdldENlbnRlclkoKTsKIAotICAgICAgICBpZihzcGxhc2hCb3VuZHMud2lkdGggIT0gSU1BR0VfV0lEVEgpewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJTcGxhc2hTY3JlZW4jZ2V0Qm91bmRzIGhhcyB3cm9uZyB3aWR0aCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmKHNwbGFzaEJvdW5kcy5oZWlnaHQgIT0gSU1BR0VfSEVJR0hUKXsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiU3BsYXNoU2NyZWVuI2dldEJvdW5kcyBoYXMgd3JvbmcgaGVpZ2h0Iik7Ci0gICAgICAgIH0KLQogICAgICAgICBSb2JvdCByb2JvdCA9IG5ldyBSb2JvdCgpOwogICAgICAgICBDb2xvciBzcGxhc2hTY3JlZW5Db2xvciA9IHJvYm90LmdldFBpeGVsQ29sb3Ioc2NyZWVuWCwgc2NyZWVuWSk7CiAKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L1RleHRBcmVhL1RleHRBcmVhRWRpdGluZy9UZXh0QXJlYUVkaXRpbmcuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L1RleHRBcmVhL1RleHRBcmVhRWRpdGluZy9UZXh0QXJlYUVkaXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzMDY3OC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL2F3dC9UZXh0QXJlYS9UZXh0QXJlYUVkaXRpbmcvVGV4dEFyZWFFZGl0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gQHRlc3QKLSBAYnVnIDgwNDAzMjIKLSBAc3VtbWFyeSBUZXN0IFRleHRBcmVhIEFQSXMgcmVwbGFjZVJhbmdlLCBpbnNlcnQsIGFwcGVuZCAmIHNldFRleHQKLSBAcnVuIG1haW4gVGV4dEFyZWFFZGl0aW5nCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkZyYW1lOwotaW1wb3J0IGphdmEuYXd0LlRleHRBcmVhOwotCi1wdWJsaWMgY2xhc3MgVGV4dEFyZWFFZGl0aW5nIHsKLQotICAgIHByaXZhdGUgaW50IHRlc3RGYWlsQ291bnQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdEZhaWw7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHRlc3RGYWlsTWVzc2FnZTsKLQotICAgIHByaXZhdGUgRnJhbWUgbWFpbkZyYW1lOwotICAgIHByaXZhdGUgVGV4dEFyZWEgdGV4dEFyZWE7Ci0KLSAgICBwcml2YXRlIFRleHRBcmVhRWRpdGluZygpIHsKLSAgICAgICAgdGVzdEZhaWxNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbWFpbkZyYW1lID0gbmV3IEZyYW1lKCk7Ci0gICAgICAgIG1haW5GcmFtZS5zZXRTaXplKDIwMCwgMjAwKTsKLQotICAgICAgICB0ZXh0QXJlYSA9IG5ldyBUZXh0QXJlYSgpOwotICAgICAgICBtYWluRnJhbWUuYWRkKHRleHRBcmVhKTsKLSAgICAgICAgbWFpbkZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgIGlmIChtYWluRnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFpbkZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIHMpIHsKLSAgICAgICAgVGV4dEFyZWFFZGl0aW5nIHRleHRBcmVhID0gbmV3IFRleHRBcmVhRWRpdGluZygpOwotICAgICAgICB0ZXh0QXJlYS50ZXN0UmVwbGFjZVJhbmdlKCk7Ci0gICAgICAgIHRleHRBcmVhLnRlc3RJbnNlcnQoKTsKLSAgICAgICAgdGV4dEFyZWEudGVzdEFwcGVuZCgpOwotICAgICAgICB0ZXh0QXJlYS5jaGVja0ZhaWx1cmVzKCk7Ci0gICAgICAgIHRleHRBcmVhLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFJlcGxhY2VSYW5nZSgpIHsKLSAgICAgICAgdGV4dEFyZWEuc2V0VGV4dChudWxsKTsKLSAgICAgICAgdGV4dEFyZWEucmVwbGFjZVJhbmdlKCJSZXBsYWNlIiwgMCwgMCk7Ci0gICAgICAgIHRleHRBcmVhLnNldFRleHQobnVsbCk7Ci0gICAgICAgIGNoZWNrVGVzdCgiIik7Ci0KLSAgICAgICAgdGV4dEFyZWEuc2V0VGV4dCgiU2V0VGV4dCIpOwotICAgICAgICB0ZXh0QXJlYS5yZXBsYWNlUmFuZ2UoIlJlcGxhY2UiLCAwLCAzKTsKLSAgICAgICAgY2hlY2tUZXN0KCJSZXBsYWNlVGV4dCIpOwotCi0gICAgICAgIHRleHRBcmVhLnJlcGxhY2VSYW5nZSgiU3RyaW5nIiwgdGV4dEFyZWEuZ2V0VGV4dCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgIHRleHRBcmVhLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0gICAgICAgIGNoZWNrVGVzdCgiUmVwbGFjZVRleHRTdHJpbmciKTsKLQotICAgICAgICB0ZXh0QXJlYS5yZXBsYWNlUmFuZ2UoIlN0cmluZyIsIDAsIDApOwotICAgICAgICBjaGVja1Rlc3QoIlN0cmluZ1JlcGxhY2VUZXh0U3RyaW5nIik7Ci0KLSAgICAgICAgdGV4dEFyZWEucmVwbGFjZVJhbmdlKCJyZXBsYWNlUmFuZ2UiLCAwLCB0ZXh0QXJlYS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotICAgICAgICBjaGVja1Rlc3QoInJlcGxhY2VSYW5nZSIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0SW5zZXJ0KCkgewotICAgICAgICB0ZXh0QXJlYS5zZXRUZXh0KG51bGwpOwotICAgICAgICB0ZXh0QXJlYS5pbnNlcnQoIkluc2VydCIsIDApOwotICAgICAgICB0ZXh0QXJlYS5zZXRUZXh0KCIiKTsKLSAgICAgICAgY2hlY2tUZXN0KCIiKTsKLQotICAgICAgICB0ZXh0QXJlYS5zZXRUZXh0KCJTZXRUZXh0Iik7Ci0gICAgICAgIHRleHRBcmVhLmluc2VydCgiSW5zZXJ0IiwgMyk7Ci0gICAgICAgIGNoZWNrVGVzdCgiU2V0SW5zZXJ0VGV4dCIpOwotCi0gICAgICAgIHRleHRBcmVhLmluc2VydCgiSW5zZXJ0IiwgMCk7Ci0gICAgICAgIGNoZWNrVGVzdCgiSW5zZXJ0U2V0SW5zZXJ0VGV4dCIpOwotCi0gICAgICAgIHRleHRBcmVhLmluc2VydCgiSW5zZXJ0IiwgdGV4dEFyZWEuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLSAgICAgICAgY2hlY2tUZXN0KCJJbnNlcnRTZXRJbnNlcnRUZXh0SW5zZXJ0Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RBcHBlbmQoKSB7Ci0gICAgICAgIHRleHRBcmVhLnNldFRleHQobnVsbCk7Ci0gICAgICAgIHRleHRBcmVhLmFwcGVuZCgiQXBwZW5kIik7Ci0gICAgICAgIHRleHRBcmVhLnNldFRleHQobnVsbCk7Ci0gICAgICAgIGNoZWNrVGVzdCgiIik7Ci0KLSAgICAgICAgdGV4dEFyZWEuc2V0VGV4dCgiU2V0VGV4dCIpOwotICAgICAgICB0ZXh0QXJlYS5hcHBlbmQoIkFwcGVuZCIpOwotICAgICAgICBjaGVja1Rlc3QoIlNldFRleHRBcHBlbmQiKTsKLQotICAgICAgICB0ZXh0QXJlYS5hcHBlbmQoIiIpOwotICAgICAgICBjaGVja1Rlc3QoIlNldFRleHRBcHBlbmQiKTsKLSAgICAgICAgdGV4dEFyZWEuc2V0VGV4dCgiIik7Ci0gICAgICAgIGNoZWNrVGVzdCgiIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGVzdChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGlmIChzdHIgIT0gbnVsbCAmJiAhc3RyLmVxdWFscyh0ZXh0QXJlYS5nZXRUZXh0KCkpKSB7Ci0gICAgICAgICAgICB0ZXN0RmFpbE1lc3NhZ2UuYXBwZW5kKCJUZXN0RmFpbCBsaW5lIDogIik7Ci0gICAgICAgICAgICB0ZXN0RmFpbE1lc3NhZ2UuYXBwZW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpWzJdLgotICAgICAgICAgICAgICAgICAgICBnZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgdGVzdEZhaWxNZXNzYWdlLmFwcGVuZCgiIFRleHRBcmVhIHN0cmluZyA6IFwiIik7Ci0gICAgICAgICAgICB0ZXN0RmFpbE1lc3NhZ2UuYXBwZW5kKHRleHRBcmVhLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB0ZXN0RmFpbE1lc3NhZ2UuYXBwZW5kKCJcIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzdHJpbmcgOiBcIiIpOwotICAgICAgICAgICAgdGVzdEZhaWxNZXNzYWdlLmFwcGVuZChzdHIpLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgICAgIHRlc3RGYWlsTWVzc2FnZS5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKLSAgICAgICAgICAgIHRlc3RGYWlsQ291bnQrKzsKLSAgICAgICAgICAgIGlzVGVzdEZhaWwgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRmFpbHVyZXMoKSB7Ci0gICAgICAgIGlmIChpc1Rlc3RGYWlsKSB7Ci0gICAgICAgICAgICB0ZXN0RmFpbE1lc3NhZ2UuaW5zZXJ0KDAsICJUZXN0IEZhaWwgY291bnQgOiAiICsgdGVzdEZhaWxDb3VudAotICAgICAgICAgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7Ci0gICAgICAgICAgICBkaXNwb3NlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0ZXN0RmFpbE1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvV2luZG93SnVtcGluZ1Rlc3QvV2luZG93SnVtcGluZ1Rlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L1dpbmRvdy9XaW5kb3dKdW1waW5nVGVzdC9XaW5kb3dKdW1waW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmUyMTAwLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvYXd0L1dpbmRvdy9XaW5kb3dKdW1waW5nVGVzdC9XaW5kb3dKdW1waW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qIEB0ZXN0Ci0gKiBAYnVnIDgwODA3MjkKLSAqIEBzdW1tYXJ5IERpYWxvZ3Mgb24gbXVsdGlzY3JlZW4ganVtcCB0byBwYXJlbnQgZnJhbWUgb24gZm9jdXMgZ2FpbgotICogQGF1dGhvciBEbWl0cnkgTWFya292Ci0gKiBAbGlicmFyeSAuLi8uLi9yZWd0ZXN0aGVscGVycwotICogQGJ1aWxkIFV0aWwKLSAqIEBydW4gbWFpbiBXaW5kb3dKdW1waW5nVGVzdAotICovCi1pbXBvcnQgamF2YS5hd3QuKjsKLQotaW1wb3J0IHRlc3QuamF2YS5hd3QucmVndGVzdGhlbHBlcnMuVXRpbDsKLQotcHVibGljIGNsYXNzIFdpbmRvd0p1bXBpbmdUZXN0IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKLSAgICAgICAgUm9ib3QgciA9IFV0aWwuY3JlYXRlUm9ib3QoKTsKLQotICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50IGdyYXBoaWNzRW52aXJvbm1lbnQgPSBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpOwotICAgICAgICBHcmFwaGljc0RldmljZVtdIGdyYXBoaWNzRGV2aWNlcyA9IGdyYXBoaWNzRW52aXJvbm1lbnQuZ2V0U2NyZWVuRGV2aWNlcygpOwotICAgICAgICBpZiAoZ3JhcGhpY3NEZXZpY2VzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhpcyBpcyBtdWx0aS1zY3JlZW4gdGVzdC4uLiBTa2lwcGluZyEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEZyYW1lIGZyYW1lID0gbmV3IEZyYW1lKCJGcmFtZSIsIGdyYXBoaWNzRGV2aWNlc1swXS5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpKTsKLSAgICAgICAgZnJhbWUuc2V0U2l6ZSg0MDAsIDMwMCk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIFV0aWwud2FpdEZvcklkbGUocik7Ci0KLSAgICAgICAgRGlhbG9nIGRpYWxvZyA9IG5ldyBEaWFsb2coZnJhbWUsICJEaWFsb2ciLCBmYWxzZSwgZ3JhcGhpY3NEZXZpY2VzWzFdLmdldERlZmF1bHRDb25maWd1cmF0aW9uKCkpOwotICAgICAgICBkaWFsb2cuc2V0U2l6ZSg0MDAsIDMwMCk7Ci0gICAgICAgIGRpYWxvZy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBVdGlsLndhaXRGb3JJZGxlKHIpOwotCi0gICAgICAgIGNoZWNrR3JhcGhpY3NEZXZpY2UoZnJhbWUsIGdyYXBoaWNzRGV2aWNlc1swXSk7Ci0gICAgICAgIGNoZWNrR3JhcGhpY3NEZXZpY2UoZGlhbG9nLCBncmFwaGljc0RldmljZXNbMV0pOwotCi0gICAgICAgIFV0aWwuY2xpY2tPbkNvbXAoZnJhbWUsIHIpOwotICAgICAgICBVdGlsLndhaXRGb3JJZGxlKHIpOwotCi0gICAgICAgIGNoZWNrR3JhcGhpY3NEZXZpY2UoZnJhbWUsIGdyYXBoaWNzRGV2aWNlc1swXSk7Ci0gICAgICAgIGNoZWNrR3JhcGhpY3NEZXZpY2UoZGlhbG9nLCBncmFwaGljc0RldmljZXNbMV0pOwotCi0gICAgICAgIFV0aWwuY2xpY2tPbkNvbXAoZGlhbG9nLCByKTsKLSAgICAgICAgVXRpbC53YWl0Rm9ySWRsZShyKTsKLQotICAgICAgICBjaGVja0dyYXBoaWNzRGV2aWNlKGZyYW1lLCBncmFwaGljc0RldmljZXNbMF0pOwotICAgICAgICBjaGVja0dyYXBoaWNzRGV2aWNlKGRpYWxvZywgZ3JhcGhpY3NEZXZpY2VzWzFdKTsKLQotICAgICAgICBkaWFsb2cuZGlzcG9zZSgpOwotICAgICAgICBmcmFtZS5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0dyYXBoaWNzRGV2aWNlKFdpbmRvdyB3aW5kb3csIEdyYXBoaWNzRGV2aWNlIGdyYXBoaWNzRGV2aWNlKSB7Ci0gICAgICAgIEdyYXBoaWNzRGV2aWNlIGFjdHVhbEdyYXBoaWNzRGV2aWNlID0gd2luZG93LmdldEdyYXBoaWNzQ29uZmlndXJhdGlvbigpLmdldERldmljZSgpOwotCi0gICAgICAgIGlmICghYWN0dWFsR3JhcGhpY3NEZXZpY2UuZXF1YWxzKGdyYXBoaWNzRGV2aWNlKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFeHBlY3RlZCBzY3JlZW46ICIgKyBncmFwaGljc0RldmljZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkFjdHVhbCBzY3JlZW46ICIrIGFjdHVhbEdyYXBoaWNzRGV2aWNlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZBSUxFRDogIiArIHdpbmRvdyArICIgaXMgZGlzcGxheWVkIG9uIHdyb25nIHNjcmVlbiIpOwotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9XaW5kb3cvV2luZG93c0xlYWsvV2luZG93c0xlYWsuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L1dpbmRvdy9XaW5kb3dzTGVhay9XaW5kb3dzTGVhay5qYXZhCmluZGV4IDNmNDQ2ODcuLmRkNzc2YTggMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvYXd0L1dpbmRvdy9XaW5kb3dzTGVhay9XaW5kb3dzTGVhay5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L1dpbmRvdy9XaW5kb3dzTGVhay9XaW5kb3dzTGVhay5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNDAgKzIzLDQxIEBACiAKIC8qCiAgKiBAdGVzdAotICogQGJ1ZyA4MDEzNTYzIDgwMjg0ODYKKyAqIEBidWcgODAxMzU2MwogICogQHN1bW1hcnkgVGVzdHMgdGhhdCB3aW5kb3dzIGFyZSByZW1vdmVkIGZyb20gd2luZG93cyBsaXN0Ci0gKiBAbGlicmFyeSAvamF2YXgvc3dpbmcvcmVndGVzdGhlbHBlcnMKLSAqIEBidWlsZCBVdGlsCiAgKiBAcnVuIG1haW4vb3RoZXJ2bSAtWG1zMzJNIC1YbXgzMk0gV2luZG93c0xlYWsKICovCiAKLWltcG9ydCBqYXZhLmF3dC5GcmFtZTsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZhLmF3dC5XaW5kb3c7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KK2ltcG9ydCBqYXZhLmF3dC4qOwogaW1wb3J0IHN1bi5hd3QuQXBwQ29udGV4dDsKLWltcG9ydCBzdW4uamF2YTJkLkRpc3Bvc2VyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworCitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogcHVibGljIGNsYXNzIFdpbmRvd3NMZWFrIHsKIAotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZGlzcG9zZXJQaGFudG9tQ29tcGxldGU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUm9ib3QgciA9IG5ldyBSb2JvdCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICB7CiAgICAgICAgICAgICBGcmFtZSBmID0gbmV3IEZyYW1lKCk7CiAgICAgICAgICAgICBmLnBhY2soKTsKICAgICAgICAgICAgIGYuZGlzcG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIHIud2FpdEZvcklkbGUoKTsKIAotICAgICAgICBEaXNwb3Nlci5hZGRSZWNvcmQobmV3IE9iamVjdCgpLCAoKSAtPiBkaXNwb3NlclBoYW50b21Db21wbGV0ZSA9IHRydWUpOwotCi0gICAgICAgIHdoaWxlICghZGlzcG9zZXJQaGFudG9tQ29tcGxldGUpIHsKLSAgICAgICAgICAgIFV0aWwuZ2VuZXJhdGVPT01FKCk7CisgICAgICAgIFZlY3RvciBnYXJiYWdlID0gbmV3IFZlY3RvcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2FyYmFnZS5hZGQobmV3IGJ5dGVbMTAwMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBnYXJiYWdlID0gbnVsbDsKIAogICAgICAgICBWZWN0b3I8V2Vha1JlZmVyZW5jZTxXaW5kb3c+PiB3aW5kb3dMaXN0ID0KICAgICAgICAgICAgICAgICAgICAgICAgIChWZWN0b3I8V2Vha1JlZmVyZW5jZTxXaW5kb3c+PikgQXBwQ29udGV4dC5nZXRBcHBDb250ZXh0KCkuZ2V0KFdpbmRvdy5jbGFzcyk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9kYXRhdHJhbnNmZXIvRGF0YUZsYXZvci9NYWNPc1hGaWxlQW5kTXVsdGlwbGVGaWxlQ29waW5nVGVzdC9NYWNPc1hGaWxlQW5kTXVsdGlwbGVGaWxlQ29waW5nVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvZGF0YXRyYW5zZmVyL0RhdGFGbGF2b3IvTWFjT3NYRmlsZUFuZE11bHRpcGxlRmlsZUNvcGluZ1Rlc3QvTWFjT3NYRmlsZUFuZE11bHRpcGxlRmlsZUNvcGluZ1Rlc3QuamF2YQppbmRleCBlYWExMzY0Li4xOGI3MDEyIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL2F3dC9kYXRhdHJhbnNmZXIvRGF0YUZsYXZvci9NYWNPc1hGaWxlQW5kTXVsdGlwbGVGaWxlQ29waW5nVGVzdC9NYWNPc1hGaWxlQW5kTXVsdGlwbGVGaWxlQ29waW5nVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L2RhdGF0cmFuc2Zlci9EYXRhRmxhdm9yL01hY09zWEZpbGVBbmRNdWx0aXBsZUZpbGVDb3BpbmdUZXN0L01hY09zWEZpbGVBbmRNdWx0aXBsZUZpbGVDb3BpbmdUZXN0LmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyoKICAgQHRlc3QKLSAgQGJ1ZyA4MDgxNzg3IDgxMzY3NjMgODE2MDk0MQorICBAYnVnIDgwODE3ODcgODEzNjc2MwogICBAYXV0aG9yIE1pa2hhaWwgQ2hlcmthc292CiAgIEBydW4gbWFpbi9tYW51YWwgTWFjT3NYRmlsZUFuZE11bHRpcGxlRmlsZUNvcGluZ1Rlc3QKICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9ldmVudC9LZXlFdmVudC9LZXlDaGFyL0tleUNoYXJUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9ldmVudC9LZXlFdmVudC9LZXlDaGFyL0tleUNoYXJUZXN0LmphdmEKaW5kZXggZGQ1MDQ4My4uYTQ4MmNlYSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvZXZlbnQvS2V5RXZlbnQvS2V5Q2hhci9LZXlDaGFyVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L2V2ZW50L0tleUV2ZW50L0tleUNoYXIvS2V5Q2hhclRlc3QuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgODAyMjQwMSA4MTYwNjIzCisgKiBAYnVnIDgwMjI0MDEKICAqIEBzdW1tYXJ5IFdyb25nIGtleSBjaGFyCiAgKiBAYXV0aG9yIEFsZXhhbmRyIFNjaGVyYmF0aXkKICAqIEBydW4gbWFpbiBLZXlDaGFyVGVzdApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvZ2VvbS9BZmZpbmVUcmFuc2Zvcm0vSW52YWxpZFRyYW5zZm9ybVBhcmFtZXRlclRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L2dlb20vQWZmaW5lVHJhbnNmb3JtL0ludmFsaWRUcmFuc2Zvcm1QYXJhbWV0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YzM2ZWMuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvZ2VvbS9BZmZpbmVUcmFuc2Zvcm0vSW52YWxpZFRyYW5zZm9ybVBhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyogQHRlc3QKLSAqIEBidWcgODE1ODM1NgotICogQHN1bW1hcnkgVGVzdCBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtYXRpb25zIGRvIG5vdCByZXN1bHQgaW4gU0lHU0VHVgotICogaWYgTmFOIG9yIGluZmluaXR5IHBhcmFtZXRlciBpcyBwYXNzZWQgYXMgYXJndW1lbnQuCi0gKiBAcnVuIG1haW4gSW52YWxpZFRyYW5zZm9ybVBhcmFtZXRlclRlc3QKLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuZ2VvbS5BZmZpbmVUcmFuc2Zvcm07Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQWZmaW5lVHJhbnNmb3JtT3A7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5JbWFnaW5nT3BFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuRGF0YUJ1ZmZlcjsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5EYXRhQnVmZmVyQnl0ZTsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5QaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWw7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuUmFzdGVyOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLldyaXRhYmxlUmFzdGVyOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLlJhc3Rlck9wOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLlNhbXBsZU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSW52YWxpZFRyYW5zZm9ybVBhcmFtZXRlclRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmaW5hbCBpbnQgdGVzdFNjZW5hcmlvcyA9IDEyOwotICAgICAgICBkb3VibGUgTmFOQXJnID0gMC4wIC8gMC4wOwotICAgICAgICBkb3VibGUgcG9zaXRpdmVJbmZBcmcgPSAxLjAgLyAwLjA7Ci0gICAgICAgIGRvdWJsZSBuZWdhdGl2ZUluZkFyZyA9IC0xLjAgLyAwLjA7Ci0KLSAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSBuZXcgQnVmZmVyZWRJbWFnZSg1LCA1LCBCdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0IpOwotCi0gICAgICAgIEFmZmluZVRyYW5zZm9ybVtdIGlucHV0VHJhbnNmb3JtcyA9IG5ldyBBZmZpbmVUcmFuc2Zvcm1bdGVzdFNjZW5hcmlvc107Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlucHV0VHJhbnNmb3Jtc1tpXSA9IG5ldyBBZmZpbmVUcmFuc2Zvcm0oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0VHJhbnNmb3Jtc1swXS5yb3RhdGUoTmFOQXJnLCBpbWcuZ2V0V2lkdGgoKS8yLCBpbWcuZ2V0SGVpZ2h0KCkvMik7Ci0gICAgICAgIGlucHV0VHJhbnNmb3Jtc1sxXS50cmFuc2xhdGUoTmFOQXJnLCBOYU5BcmcpOwotICAgICAgICBpbnB1dFRyYW5zZm9ybXNbMl0uc2NhbGUoTmFOQXJnLCBOYU5BcmcpOwotICAgICAgICBpbnB1dFRyYW5zZm9ybXNbM10uc2hlYXIoTmFOQXJnLCBOYU5BcmcpOwotCi0gICAgICAgIGlucHV0VHJhbnNmb3Jtc1s0XS5yb3RhdGUocG9zaXRpdmVJbmZBcmcsIGltZy5nZXRXaWR0aCgpLzIsIGltZy5nZXRIZWlnaHQoKS8yKTsKLSAgICAgICAgaW5wdXRUcmFuc2Zvcm1zWzVdLnRyYW5zbGF0ZShwb3NpdGl2ZUluZkFyZywgcG9zaXRpdmVJbmZBcmcpOwotICAgICAgICBpbnB1dFRyYW5zZm9ybXNbNl0uc2NhbGUocG9zaXRpdmVJbmZBcmcsIHBvc2l0aXZlSW5mQXJnKTsKLSAgICAgICAgaW5wdXRUcmFuc2Zvcm1zWzddLnNoZWFyKHBvc2l0aXZlSW5mQXJnLCBwb3NpdGl2ZUluZkFyZyk7Ci0KLSAgICAgICAgaW5wdXRUcmFuc2Zvcm1zWzhdLnJvdGF0ZShuZWdhdGl2ZUluZkFyZywgaW1nLmdldFdpZHRoKCkvMiwgaW1nLmdldEhlaWdodCgpLzIpOwotICAgICAgICBpbnB1dFRyYW5zZm9ybXNbOV0udHJhbnNsYXRlKG5lZ2F0aXZlSW5mQXJnLCBuZWdhdGl2ZUluZkFyZyk7Ci0gICAgICAgIGlucHV0VHJhbnNmb3Jtc1sxMF0uc2NhbGUobmVnYXRpdmVJbmZBcmcsIG5lZ2F0aXZlSW5mQXJnKTsKLSAgICAgICAgaW5wdXRUcmFuc2Zvcm1zWzExXS5zaGVhcihuZWdhdGl2ZUluZkFyZywgbmVnYXRpdmVJbmZBcmcpOwotCi0gICAgICAgIC8vIFRlc3QgQnVmZmVyZWRJbWFnZSBBZmZpbmVUcmFuc2Zvcm0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGVzdEltYWdlVHJhbnNmb3JtKGltZywgaW5wdXRUcmFuc2Zvcm1zW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEltYWdpbmdPcEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY291bnQgIT0gdGVzdFNjZW5hcmlvcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkLiBBbGwgdGVzdCBzY2VuYXJpb3MgZGlkIG5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXN1bHQgaW4gZXhjZXB0aW9uIGFzIGV4cGVjdGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBSYXN0ZXIgQWZmaW5lVHJhbnNmb3JtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgaW50W10gYmFuZE9mZnNldHMgPSB7MH07Ci0gICAgICAgIFBvaW50IGxvY2F0aW9uID0gbmV3IFBvaW50KDAsIDApOwotICAgICAgICBEYXRhQnVmZmVyIGRiID0gbmV3IERhdGFCdWZmZXJCeXRlKDEwICogMTApOwotICAgICAgICBTYW1wbGVNb2RlbCBzbSA9IG5ldyBQaXhlbEludGVybGVhdmVkU2FtcGxlTW9kZWwoRGF0YUJ1ZmZlci5UWVBFX0JZVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgMTAsIDEsIDEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZE9mZnNldHMpOwotCi0gICAgICAgIFJhc3RlciBzcmMgPSBSYXN0ZXIuY3JlYXRlUmFzdGVyKHNtLCBkYiwgbG9jYXRpb24pOwotICAgICAgICBXcml0YWJsZVJhc3RlciBkc3QgPSBSYXN0ZXIuY3JlYXRlV3JpdGFibGVSYXN0ZXIoc20sIGRiLCBsb2NhdGlvbik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dFRyYW5zZm9ybXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGVzdFJhc3RlclRyYW5zZm9ybShzcmMsIGRzdCwgaW5wdXRUcmFuc2Zvcm1zW2ldKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEltYWdpbmdPcEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY291bnQgIT0gdGVzdFNjZW5hcmlvcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkLiBBbGwgdGVzdCBzY2VuYXJpb3MgZGlkIG5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXN1bHQgaW4gZXhjZXB0aW9uIGFzIGV4cGVjdGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIHRlc3RJbWFnZVRyYW5zZm9ybShCdWZmZXJlZEltYWdlIGltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgewotICAgICAgICBBZmZpbmVUcmFuc2Zvcm1PcCBvcCA9Ci0gICAgICAgICAgICAgICAgbmV3IEFmZmluZVRyYW5zZm9ybU9wKHRyYW5zZm9ybSwgQWZmaW5lVHJhbnNmb3JtT3AuVFlQRV9CSUxJTkVBUik7Ci0KLSAgICAgICAgQnVmZmVyZWRJbWFnZSB0cmFuc2Zvcm1lZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoaW1hZ2UuZ2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLmdldFR5cGUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG9wLmZpbHRlcihpbWFnZSwgdHJhbnNmb3JtZWRJbWFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXN0ZXIgdGVzdFJhc3RlclRyYW5zZm9ybShSYXN0ZXIgc3JjLCBXcml0YWJsZVJhc3RlciBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKSB7Ci0gICAgICAgIEFmZmluZVRyYW5zZm9ybU9wIG9wID0KLSAgICAgICAgICAgICAgICBuZXcgQWZmaW5lVHJhbnNmb3JtT3AodHJhbnNmb3JtLCBBZmZpbmVUcmFuc2Zvcm1PcC5UWVBFX0JJTElORUFSKTsKLQotICAgICAgICByZXR1cm4gb3AuZmlsdGVyKHNyYywgZHN0KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L2ltLzgxNDg5ODQvYnVnODE0ODk4NC5odG1sIGIvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE0ODk4NC9idWc4MTQ4OTg0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZWI3YzIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE0ODk4NC9idWc4MTQ4OTg0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tCi0gQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLQotIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLQotIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotCi0gUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gcXVlc3Rpb25zLgotLS0+Ci0KLTxodG1sPgotPGJvZHk+Ci1WZXJpZnkgdGhhdCBDaGluZXNlIGNvbW1hIGNhbiBiZSBlbnRlcmVkIGluIEpUZXh0RmllbGQgd2l0aCBQaW55aW4gaW5wdXQgbWV0aG9kIChJTSkuCi0KLVRoaXMgdGVzdCBpcyBmb3IgT1MgWCBvbmx5LiBGb3Igb3RoZXIgcGxhdGZvcm1zIHBsZWFzZSBzaW1wbHkgcHJlc3MgIlBhc3MiLgotCi0xLiBHbyB0byAiU3lzdGVtIFByZWZlcmVuY2VzIC0+IEtleWJvYXJkIC0+IElucHV0IFNvdXJjZXMiIGFuZCBhZGQgIlBpbnlpbiDigJMgVHJhZGl0aW9uYWwiIG9yICJQaW55aW4g4oCTIFNpbXBsaWZpZWQiIElNIGZyb20gQ2hpbmVzZSBsYW5ndWFnZSBncm91cC4KLTIuIFNldCBjdXJyZW50IElNIHRvICJQaW55aW4iLgotMy4gU2V0IGZvY3VzIHRvIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSB0ZXN0IGFuZCBwcmVzcyAiY29tbWEiIGNoYXJhY3RlciBvbiB0aGUga2V5Ym9hcmQuCi00LiBTZXQgY3VycmVudCBJTSB0byB0aGUgSU0gdXNlZCBiZWZvcmUgIlBpbnlpbiIgd2FzIHNldC4KLTUuIElmICLvvIwiIGNoYXJhY3RlciBpcyBkaXNwbGF5ZWQgaW4gdGhlIHRleHQgYXJlYSwgcHJlc3MgIlBhc3MiLCBpZiAiLCIgY2hhcmFjdGVyIGlzIGRpc3BsYXllZCwgcHJlc3MgIkZhaWwiLgotCi08YXBwbGV0ICBjb2RlPSJidWc4MTQ4OTg0LmNsYXNzIiB3aWR0aD00MDAgaGVpZ2h0PTQwMD48L2FwcGxldD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L2ltLzgxNDg5ODQvYnVnODE0ODk4NC5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE0ODk4NC9idWc4MTQ4OTg0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjliM2MuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE0ODk4NC9idWc4MTQ4OTg0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyogQHRlc3QKLSAqIEBidWcgODE0ODk4NAotICogQHN1bW1hcnkgQ2hpbmVzZSBDb21tYSBjYW5ub3QgYmUgZW50ZXJlZCB1c2luZyBQaW55aW4gSW5wdXQgTWV0aG9kIG9uIE9TIFgKLSAqIEBhdXRob3IgRG1pdHJ5IE1hcmtvdgotICogQHJ1biBhcHBsZXQvbWFudWFsPXllc25vIGJ1ZzgxNDg5ODQuaHRtbAotICovCi0KLWltcG9ydCBqYXZheC5zd2luZy4qOwotCi1wdWJsaWMgY2xhc3MgYnVnODE0ODk4NCBleHRlbmRzIEpBcHBsZXQgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7Ci0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgICAgICAgICBwYW5lbC5hZGQobmV3IEpMYWJlbCgiVGV4dCBmaWVsZDoiKSk7Ci0gICAgICAgICAgICAgICAgcGFuZWwuYWRkKG5ldyBKVGV4dEZpZWxkKDIwKSk7Ci0gICAgICAgICAgICAgICAgYWRkKHBhbmVsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9pbS84MTU0ODE2L2J1ZzgxNTQ4MTYuaHRtbCBiL2pkay90ZXN0L2phdmEvYXd0L2ltLzgxNTQ4MTYvYnVnODE1NDgxNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmRiNWZkLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvYXd0L2ltLzgxNTQ4MTYvYnVnODE1NDgxNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQotIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0KLSBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0KLSBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLQotIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotIHF1ZXN0aW9ucy4KLS0tPgotCi08aHRtbD4KLTxib2R5PgotVmVyaWZ5IHRoYXQgQ2FwcyBMb2NrIGtleSB3b3JrcyBwcm9wZXJseSB3aXRoIFBpbnlpbiBpbnB1dCBtZXRob2QsIChpLmUuIGlmIAotQ2FwcyBMb2NrIGlzIHByZXNzZWQsIGlucHV0IHNob3VsZCBiZSBzd2l0aGNlZCB0byBsb3dlcmNhc2UgbGF0aW4gbGV0dGVycykuCi0KLVRoaXMgdGVzdCBpcyBmb3IgT1MgWCBvbmx5LiBGb3Igb3RoZXIgcGxhdGZvcm1zIHBsZWFzZSBzaW1wbHkgcHJlc3MgIlBhc3MiLgotCi0xLiBHbyB0byAiU3lzdGVtIFByZWZlcmVuY2VzIC0+IEtleWJvYXJkIC0+IElucHV0IFNvdXJjZXMiIGFuZCBhZGQgIlBpbnlpbiDigJMgVHJhZGl0aW9uYWwiIG9yICJQaW55aW4g4oCTIFNpbXBsaWZpZWQiIElNIGZyb20gQ2hpbmVzZSBsYW5ndWFnZSBncm91cC4KLTIuIFNldCBjdXJyZW50IElNIHRvICJQaW55aW4iLgotMy4gU2V0IGZvY3VzIHRvIHRoZSB0ZXh0IGZpZWxkIG9mIHRoZSB0ZXN0IGFuZCBwcmVzcyBDYXBzIExvY2sga2V5IG9uIHRoZSBrZXlib2FyZC4KLTQuIFByZXNzICJhIiBjaGFyYWN0ZXIgb24gdGhlIGtleWJvYXJkCi01LiBJZiAiYSIgY2hhcmFjdGVyIGlzIGRpc3BsYXllZCBpbiB0aGUgdGV4dCBmaWVsZCwgcHJlc3MgIlBhc3MiLCBpZiAiQSIgY2hhcmFjdGVyIGlzIGRpc3BsYXllZCwgcHJlc3MgIkZhaWwiLgotCi08YXBwbGV0ICBjb2RlPSJidWc4MTU0ODE2LmNsYXNzIiB3aWR0aD00MDAgaGVpZ2h0PTQwMD48L2FwcGxldD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYXd0L2ltLzgxNTQ4MTYvYnVnODE1NDgxNi5qYXZhIGIvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE1NDgxNi9idWc4MTU0ODE2LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYmRhNGYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9hd3QvaW0vODE1NDgxNi9idWc4MTU0ODE2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyogQHRlc3QKLSAqIEBidWcgODE1NDgxNgotICogQHN1bW1hcnkgQ2FwcyBMb2NrIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCB3aGVuIHVzaW5nIFBpbnlpbiBTaW1wbGlmaWVkIGlucHV0IG1ldGhvZAotICogQGF1dGhvciBEbWl0cnkgTWFya292Ci0gKiBAcnVuIGFwcGxldC9tYW51YWw9eWVzbm8gYnVnODE1NDgxNi5odG1sCi0gKi8KLQotaW1wb3J0IGphdmF4LnN3aW5nLio7Ci0KLXB1YmxpYyBjbGFzcyBidWc4MTU0ODE2IGV4dGVuZHMgSkFwcGxldCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlTGF0ZXIobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbCgpOwotICAgICAgICAgICAgICAgIHBhbmVsLmFkZChuZXcgSkxhYmVsKCJUZXh0IGZpZWxkOiIpKTsKLSAgICAgICAgICAgICAgICBwYW5lbC5hZGQobmV3IEpUZXh0RmllbGQoMjApKTsKLSAgICAgICAgICAgICAgICBhZGQocGFuZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvYmVhbnMvSW50cm9zcGVjdG9yLzgxNTk2OTYvVW5sb2FkQ2xhc3NCZWFuSW5mby5qYXZhIGIvamRrL3Rlc3QvamF2YS9iZWFucy9JbnRyb3NwZWN0b3IvODE1OTY5Ni9VbmxvYWRDbGFzc0JlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzdiMzUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9iZWFucy9JbnRyb3NwZWN0b3IvODE1OTY5Ni9VbmxvYWRDbGFzc0JlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuYmVhbnMuQmVhbkluZm87Ci1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS5iZWFucy5NZXRob2REZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkQ29weU9wdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNTk2OTYKLSAqIEBsaWJyYXJ5IC9qYXZheC9zd2luZy9yZWd0ZXN0aGVscGVycwotICogQGNvbXBpbGUgLi9zdHViL1N0dWIuamF2YQotICogQHJ1biBtYWluL290aGVydm0gLW14MzJNIFVubG9hZENsYXNzQmVhbkluZm8KLSAqLwotcHVibGljIGNsYXNzIFVubG9hZENsYXNzQmVhbkluZm8gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVVJMQ2xhc3NMb2FkZXIgbG9hZGVyOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIGNsID0gZ2V0U3R1YigpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNsLmdldENsYXNzTG9hZGVyKCkgPSAiICsgY2wuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIGZpbmFsIEJlYW5JbmZvIGJlYW5JbmZvID0gSW50cm9zcGVjdG9yLmdldEJlYW5JbmZvKGNsLCBPYmplY3QuY2xhc3MpOwotICAgICAgICBNZXRob2REZXNjcmlwdG9yW10gbWRzID0gYmVhbkluZm8uZ2V0TWV0aG9kRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtZHMgPSAiICsgQXJyYXlzLnRvU3RyaW5nKG1kcykpOwotICAgICAgICBsb2FkZXIuY2xvc2UoKTsKLSAgICAgICAgbG9hZGVyPW51bGw7Ci0gICAgICAgIGNsPW51bGw7Ci0gICAgICAgIFV0aWwuZ2VuZXJhdGVPT01FKCk7Ci0gICAgICAgIG1kcyA9IGJlYW5JbmZvLmdldE1ldGhvZERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibWRzID0gIiArIEFycmF5cy50b1N0cmluZyhtZHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgU3R1YiBjbGFzcyBpcyBjb21waWxlZCBieSBqdHJlZywgYnV0IHdlIHdhbnQgdG8gbW92ZSBpdCBzbyBpdCBpcyBub3QKLSAgICAgKiBvbiB0aGUgYXBwbGljYXRpb24gY2xhc3NwYXRoLiBXZSB3YW50IHRvIGxvYWQgaXQgdGhyb3VnaCBhIHNlcGFyYXRlCi0gICAgICogY2xhc3Nsb2FkZXIuCi0gICAgICovCi0gICAgc3RhdGljIENsYXNzPD8+IGdldFN0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RjbGFzc2VzID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmNsYXNzZXMiKTsKLSAgICAgICAgZmluYWwgRmlsZSBzdWJkaXIgPSBuZXcgRmlsZSh0ZXN0Y2xhc3NlcywgInN0dWIiKTsKLSAgICAgICAgc3ViZGlyLm1rZGlyKCk7Ci0KLSAgICAgICAgZmluYWwgUGF0aCBzcmMgPSBQYXRocy5nZXQodGVzdGNsYXNzZXMsICJTdHViLmNsYXNzIik7Ci0gICAgICAgIGZpbmFsIFBhdGggZGVzdCA9IHN1YmRpci50b1BhdGgoKS5yZXNvbHZlKCJTdHViLmNsYXNzIik7Ci0gICAgICAgIEZpbGVzLm1vdmUoc3JjLCBkZXN0LCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7Ci0KLSAgICAgICAgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXXtzdWJkaXIudG9VUkwoKX0pOwotICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZSgiU3R1YiIsIHRydWUsIGxvYWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9iZWFucy9JbnRyb3NwZWN0b3IvODE1OTY5Ni9zdHViL1N0dWIuamF2YSBiL2pkay90ZXN0L2phdmEvYmVhbnMvSW50cm9zcGVjdG9yLzgxNTk2OTYvc3R1Yi9TdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDkzZWMuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9iZWFucy9JbnRyb3NwZWN0b3IvODE1OTY5Ni9zdHViL1N0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU3R1YiB7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgewotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIvT3ZlcmZsb3dJblJlYWQuamF2YSBiL2pkay90ZXN0L2phdmEvaW8vQ2hhckFycmF5UmVhZGVyL092ZXJmbG93SW5SZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMzBlOGMuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIvT3ZlcmZsb3dJblJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKiBAdGVzdAotICogQGJ1ZyA4MTYzNTE4Ci0gKiBAc3VtbWFyeSBJbnRlZ2VyIG92ZXJmbG93IHdoZW4gcmVhZGluZyBpbiBsYXJnZSBidWZmZXIKLSAqIEBpZ25vcmUgVGhpcyB0ZXN0IGhhcyBodWdlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAqIEByZXF1aXJlcyAoc3VuLmFyY2guZGF0YS5tb2RlbCA9PSAiNjQiICYgb3MubWF4TWVtb3J5ID4gOGcpCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSAtWG14OGcgT3ZlcmZsb3dJblJlYWQKLSAqLwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPdmVyZmxvd0luUmVhZCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXJbXSBhID0gIl8xMjM0NTY3ODlfMTIzNDU2Nzg5XzEyMzQ1Njc4OV8xMjM0NTY3ODkiCi0gICAgICAgICAgICAgICAgLnRvQ2hhckFycmF5KCk7IC8vIGEubGVuZ3RoID4gMzMKLSAgICAgICAgdHJ5IChDaGFyQXJyYXlSZWFkZXIgY2FyID0gbmV3IENoYXJBcnJheVJlYWRlcihhKSkgewotICAgICAgICAgICAgaW50IGxlbjEgPSAzMzsKLSAgICAgICAgICAgIGNoYXJbXSBidWYxID0gbmV3IGNoYXJbbGVuMV07Ci0gICAgICAgICAgICBpZiAoY2FyLnJlYWQoYnVmMSwgMCwgbGVuMSkgIT0gbGVuMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeHBlY3RlZCB0byByZWFkICIgKyBsZW4xICsgIiBjaGFycyIpOwotCi0gICAgICAgICAgICBpbnQgbGVuMiA9IEludGVnZXIuTUFYX1ZBTFVFIC0gMzI7Ci0gICAgICAgICAgICBjaGFyW10gYnVmMiA9IG5ldyBjaGFyW2xlbjJdOwotICAgICAgICAgICAgaW50IGV4cExlbjIgPSBhLmxlbmd0aCAtIGxlbjE7Ci0gICAgICAgICAgICBpZiAoY2FyLnJlYWQoYnVmMiwgMCwgbGVuMikgIT0gZXhwTGVuMikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeHBlY3RlZCB0byByZWFkICIgKyBleHBMZW4yICsgIiBjaGFycyIpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIvT3ZlcmZsb3dJblNraXAuamF2YSBiL2pkay90ZXN0L2phdmEvaW8vQ2hhckFycmF5UmVhZGVyL092ZXJmbG93SW5Ta2lwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YzA0YTAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9pby9DaGFyQXJyYXlSZWFkZXIvT3ZlcmZsb3dJblNraXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKiBAdGVzdAotICogQGJ1ZyA4MTYzNTE4Ci0gKiBAc3VtbWFyeSBJbnRlZ2VyIG92ZXJmbG93IHdoZW4gc2tpcHBpbmcgYSBsb3QKLSAqLwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPdmVyZmxvd0luU2tpcCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoYXJbXSBhID0gIl8xMjM0NTY3ODlfMTIzNDU2Nzg5XzEyMzQ1Njc4OV8xMjM0NTY3ODkiCi0gICAgICAgICAgICAgICAgLnRvQ2hhckFycmF5KCk7IC8vIGEubGVuZ3RoID4gMzMKLSAgICAgICAgdHJ5IChDaGFyQXJyYXlSZWFkZXIgY2FyID0gbmV3IENoYXJBcnJheVJlYWRlcihhKSkgewotICAgICAgICAgICAgbG9uZyBzbWFsbCA9IDMzOwotICAgICAgICAgICAgbG9uZyBiaWcgPSBMb25nLk1BWF9WQUxVRTsKLQotICAgICAgICAgICAgbG9uZyBzbWFsbFNraXAgPSBjYXIuc2tpcChzbWFsbCk7Ci0gICAgICAgICAgICBpZiAoc21hbGxTa2lwICE9IHNtYWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkV4cGVjdGVkIHRvIHNraXAgIiArIHNtYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgY2hhcnMsIGJ1dCBza2lwcGVkICIgKyBzbWFsbFNraXApOwotCi0gICAgICAgICAgICBsb25nIGV4cFNraXAgPSBhLmxlbmd0aCAtIHNtYWxsOwotICAgICAgICAgICAgbG9uZyBiaWdTa2lwID0gY2FyLnNraXAoYmlnKTsKLSAgICAgICAgICAgIGlmIChiaWdTa2lwICE9IGV4cFNraXApCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhwZWN0ZWQgdG8gc2tpcCAiICsgZXhwU2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNoYXJzLCBidXQgc2tpcHBlZCAiICsgYmlnU2tpcCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtL092ZXJmbG93SW5SZWFkLmphdmEgYi9qZGsvdGVzdC9qYXZhL2lvL1N0cmluZ0J1ZmZlcklucHV0U3RyZWFtL092ZXJmbG93SW5SZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWMzNzAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9pby9TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbS9PdmVyZmxvd0luUmVhZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qIEB0ZXN0Ci0gKiBAYnVnIDgxNjM1MTgKLSAqIEBzdW1tYXJ5IEludGVnZXIgb3ZlcmZsb3cgd2hlbiByZWFkaW5nIGluIGxhcmdlIGJ1ZmZlcgotICogQGlnbm9yZSBUaGlzIHRlc3QgaGFzIGh1Z2UgbWVtb3J5IHJlcXVpcmVtZW50cwotICogQHJlcXVpcmVzIChzdW4uYXJjaC5kYXRhLm1vZGVsID09ICI2NCIgJiBvcy5tYXhNZW1vcnkgPiA0ZykKLSAqIEBydW4gbWFpbi9vdGhlcnZtIC1YbXg0ZyBPdmVyZmxvd0luUmVhZAotICovCi0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgT3ZlcmZsb3dJblJlYWQgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcyA9ICJfMTIzNDU2Nzg5XzEyMzQ1Njc4OV8xMjM0NTY3ODlfMTIzNDU2Nzg5IjsgLy8gcy5sZW5ndGgoKSA+IDMzCi0gICAgICAgIHRyeSAoU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShzKSkgewotICAgICAgICAgICAgaW50IGxlbjEgPSAzMzsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbbGVuMV07Ci0gICAgICAgICAgICBpZiAoc2Jpcy5yZWFkKGJ1ZjEsIDAsIGxlbjEpICE9IGxlbjEpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhwZWN0ZWQgdG8gcmVhZCAiICsgbGVuMSArICIgYnl0ZXMiKTsKLQotICAgICAgICAgICAgaW50IGxlbjIgPSBJbnRlZ2VyLk1BWF9WQUxVRSAtIDMyOwotICAgICAgICAgICAgYnl0ZVtdIGJ1ZjIgPSBuZXcgYnl0ZVtsZW4yXTsKLSAgICAgICAgICAgIGludCBleHBMZW4yID0gcy5sZW5ndGgoKSAtIGxlbjE7Ci0gICAgICAgICAgICBpZiAoc2Jpcy5yZWFkKGJ1ZjIsIDAsIGxlbjIpICE9IGV4cExlbjIpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXhwZWN0ZWQgdG8gcmVhZCAiICsgZXhwTGVuMiArICIgYnl0ZXMiKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25XaXRoTGFtYmRhLmphdmEgYi9qZGsvdGVzdC9qYXZhL2xhbmcvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uV2l0aExhbWJkYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzIxMzUyLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb25XaXRoTGFtYmRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODE0NzU4NQotICogQHN1bW1hcnkgQ2hlY2sgQW5ub3RhdGlvbiB3aXRoIExhbWJkYSwgd2l0aCBvciB3aXRob3V0IHBhcmFtZXRlcgotICogQHJ1biB0ZXN0bmcgQW5ub3RhdGlvbldpdGhMYW1iZGEKLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKLQotaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuKjsKLWltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25XaXRoTGFtYmRhIHsKLQotICAgIEBUZXN0Ci0gICAgdm9pZCB0ZXN0QW5ub3RhdGlvbldpdGhMYW1iZGEoKSB7Ci0gICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBBbm5vdGF0aW9uV2l0aExhbWJkYS5NZXRob2RzV2l0aEFubm90YXRpb25zLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKChtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChMYW1iZGFXaXRoUGFyYW1ldGVyLmNsYXNzKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KExhbWJkYVdpdGhvdXRQYXJhbWV0ZXIuY2xhc3MpKSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBNZXRob2RzV2l0aEFubm90YXRpb25zIHsKLQotICAgICAgICBATGFtYmRhV2l0aFBhcmFtZXRlcgotICAgICAgICBATGFtYmRhV2l0aG91dFBhcmFtZXRlcgotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbkxhbWJkYSgpIHsKLSAgICAgICAgfQotICAgIH0KLX0KLQotQFRhcmdldCh2YWx1ZSA9IEVsZW1lbnRUeXBlLk1FVEhPRCkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCi1AaW50ZXJmYWNlIExhbWJkYVdpdGhQYXJhbWV0ZXIgewotICAgIENvbnN1bWVyPEludGVnZXI+IGYxID0gYSAtPiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGFtYmRhIGhhcyBwYXJhbWV0ZXIiKTsKLSAgICB9OwotfQotCi1AVGFyZ2V0KHZhbHVlID0gRWxlbWVudFR5cGUuTUVUSE9EKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBpbnRlcmZhY2UgTGFtYmRhV2l0aG91dFBhcmFtZXRlciB7Ci0gICAgUnVubmFibGUgciA9ICgpIC0+IFN5c3RlbS5vdXQucHJpbnRsbigibGFtYmRhIHdpdGhvdXQgcGFyYW1ldGVyIik7Ci19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMGRiZC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlL0FycmF5Q29uc3RydWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKiBAdGVzdAotICogQGJ1ZyA4MTU1MTA2Ci0gKiBAcnVuIHRlc3RuZy9vdGhlcnZtIC1lYSAtZXNhIHRlc3QuamF2YS5sYW5nLmludm9rZS5BcnJheUNvbnN0cnVjdG9yVGVzdAotICovCi1wYWNrYWdlIHRlc3QuamF2YS5sYW5nLmludm9rZTsKLQotaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlOwotaW1wb3J0IGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlczsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZFR5cGUubWV0aG9kVHlwZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydEpVbml0Lio7Ci0KLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLio7Ci0KLQotcHVibGljIGNsYXNzIEFycmF5Q29uc3RydWN0b3JUZXN0IHsKLQotICAgIHN0YXRpYyBmaW5hbCBNZXRob2RIYW5kbGVzLkxvb2t1cCBMT09LVVAgPSBNZXRob2RIYW5kbGVzLmxvb2t1cCgpOwotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEZpbmRDb25zdHJ1Y3RvckFycmF5KCkgewotICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kSGFuZGxlIGggPSBMT09LVVAuZmluZENvbnN0cnVjdG9yKE9iamVjdFtdLmNsYXNzLCBtZXRob2RUeXBlKHZvaWQuY2xhc3MpKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gY29uc3RydWN0b3IgZm9yIGFycmF5IGNsYXNzOiBbTGphdmEubGFuZy5PYmplY3Q7IiwgbnNtZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigidW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGNhdWdodCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvQ3VzdG9taXplZExhbWJkYUZvcm1UZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlL0N1c3RvbWl6ZWRMYW1iZGFGb3JtVGVzdC5qYXZhCmluZGV4IGEwZWNkY2QuLjNlMjQ2NzMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvQ3VzdG9taXplZExhbWJkYUZvcm1UZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS9DdXN0b21pemVkTGFtYmRhRm9ybVRlc3QuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogLyogQHRlc3QKICAqIEBzdW1tYXJ5IEFzc2VydGlvbiBpbiBMYW1iZGFGb3JtRWRpdG9yLmJpbmRBcmd1bWVudFR5cGUgaXMgdG9vIHN0cm9uZwogICoKLSAqIEBydW4gbWFpbi9vdGhlcnZtL2Jvb3RjbGFzc3BhdGggLWVzYSBqYXZhLmxhbmcuaW52b2tlLkN1c3RvbWl6ZWRMYW1iZGFGb3JtVGVzdAorICogQHJ1biBtYWluL2Jvb3RjbGFzc3BhdGggLWVzYSBqYXZhLmxhbmcuaW52b2tlLkN1c3RvbWl6ZWRMYW1iZGFGb3JtVGVzdAogICovCiBwdWJsaWMgY2xhc3MgQ3VzdG9taXplZExhbWJkYUZvcm1UZXN0IHsKIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS9QZXJtdXRlQXJnc1Rlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvUGVybXV0ZUFyZ3NUZXN0LmphdmEKaW5kZXggYTQ3ZTRkNy4uZWRiOWJhMyAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS9QZXJtdXRlQXJnc1Rlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlL1Blcm11dGVBcmdzVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNiBAQAogCiAvKiBAdGVzdAogICogQHN1bW1hcnkgdW5pdCB0ZXN0cyBmb3IgbWV0aG9kIGhhbmRsZXMgd2hpY2ggcGVybXV0ZSB0aGVpciBhcmd1bWVudHMKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkvanNyMjkyIC9saWIvdGVzdGxpYnJhcnkKICAqIEBydW4gdGVzdG5nL290aGVydm0gLVhYOitJZ25vcmVVbnJlY29nbml6ZWRWTU9wdGlvbnMgLVhYOi1WZXJpZnlEZXBlbmRlbmNpZXMgLWVhIC1lc2EgLURQZXJtdXRlQXJnc1Rlc3QuTUFYX0FSSVRZPTggdGVzdC5qYXZhLmxhbmcuaW52b2tlLlBlcm11dGVBcmdzVGVzdAogICovCiAvKiBFeGFtcGxlcyBvZiBtYW51YWwgcnVuczoKQEAgLTM3LDggKzM2LDYgQEAKIGltcG9ydCBvcmcudGVzdG5nLio7CiBpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy4qOwogCi1pbXBvcnQgY29tLm9yYWNsZS50ZXN0bGlicmFyeS5qc3IyOTIuQ29kZUNhY2hlT3ZlcmZsb3dQcm9jZXNzb3I7Ci0KIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwogCkBAIC0xMjUsMTUgKzEyMiw5IEBACiAgICAgICAgIH0KICAgICAgICAgbmV3IFBlcm11dGVBcmdzVGVzdCgpLnRlc3QoKTsKICAgICB9Ci0KICAgICBzdGF0aWMgaW50IHRlc3RDYXNlczsKLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBDb2RlQ2FjaGVPdmVyZmxvd1Byb2Nlc3Nvci5ydW5NSFRlc3QodGhpczo6dGVzdDApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3QwKCkgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIHRlc3RDYXNlcyA9IDA7CiAgICAgICAgIExvb2t1cCBsb29rdXAgPSBsb29rdXAoKTsKICAgICAgICAgZm9yIChNZXRob2QgbSA6IGxvb2t1cC5sb29rdXBDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kcygpKSB7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlL1ZhcmFyZ3NBcnJheVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvVmFyYXJnc0FycmF5VGVzdC5qYXZhCmluZGV4IDQ2OGViNDIuLmEyNDdmYTUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvVmFyYXJnc0FycmF5VGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvVmFyYXJnc0FycmF5VGVzdC5qYXZhCkBAIC0zMiwxMiArMzIsMTMgQEAKICAqIEBzdW1tYXJ5IHVuaXQgdGVzdHMgZm9yIHZhcmFyZ3MgYXJyYXkgbWV0aG9kczogTWV0aG9kSGFuZGxlSW5mby52YXJhcmdzQXJyYXkoaW50KSwKICAqICAgICAgICAgIE1ldGhvZEhhbmRsZUluZm8udmFyYXJnc0FycmF5KENsYXNzLGludCkgJiBNZXRob2RIYW5kbGVJbmZvLnZhcmFyZ3NMaXN0KGludCkKICAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeS9qc3IyOTIKLSAqIEBydW4gbWFpbi9vdGhlcnZtL2Jvb3RjbGFzc3BhdGggamF2YS5sYW5nLmludm9rZS5WYXJhcmdzQXJyYXlUZXN0Ci0gKiBAcnVuIG1haW4vb3RoZXJ2bS9ib290Y2xhc3NwYXRoIC1EVmFyYXJnc0FycmF5VGVzdC5NQVhfQVJJVFk9MjU1IC1EVmFyYXJnc0FycmF5VGVzdC5TVEFSVF9BUklUWT0yNTAgamF2YS5sYW5nLmludm9rZS5WYXJhcmdzQXJyYXlUZXN0CisgKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aCBqYXZhLmxhbmcuaW52b2tlLlZhcmFyZ3NBcnJheVRlc3QKKyAqIEBydW4gbWFpbi9ib290Y2xhc3NwYXRoIC1EVmFyYXJnc0FycmF5VGVzdC5NQVhfQVJJVFk9MjU1IC1EVmFyYXJnc0FycmF5VGVzdC5TVEFSVF9BUklUWT0yNTAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEubGFuZy5pbnZva2UuVmFyYXJnc0FycmF5VGVzdAogICovCiAKIC8qIFRoaXMgbWlnaHQgdGFrZSBhIHdoaWxlIGFuZCBidXJuIGxvdHMgb2YgbWV0YWRhdGE6Ci0gKiBAcnVuIG1haW4vb3RoZXJ2bS9ib290Y2xhc3NwYXRoIC1EVmFyYXJnc0FycmF5VGVzdC5NQVhfQVJJVFk9MjU1IC1EVmFyYXJnc0FycmF5VGVzdC5FWEhBVVNUSVZFPXRydWUgamF2YS5sYW5nLmludm9rZS5WYXJhcmdzQXJyYXlUZXN0CisgKiBAcnVuIG1haW4vYm9vdGNsYXNzcGF0aCAtRFZhcmFyZ3NBcnJheVRlc3QuTUFYX0FSSVRZPTI1NSAtRFZhcmFyZ3NBcnJheVRlc3QuRVhIQVVTVElWRT10cnVlIGphdmEubGFuZy5pbnZva2UuVmFyYXJnc0FycmF5VGVzdAogICovCiBwdWJsaWMgY2xhc3MgVmFyYXJnc0FycmF5VGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQ0xBU1MgPSBWYXJhcmdzQXJyYXlUZXN0LmNsYXNzOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9uZXQvUHJveHlTZWxlY3Rvci9CODAzNTE1OC5qYXZhIGIvamRrL3Rlc3QvamF2YS9uZXQvUHJveHlTZWxlY3Rvci9CODAzNTE1OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIxZTk5Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvbmV0L1Byb3h5U2VsZWN0b3IvQjgwMzUxNTguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDM1MTU4IDgxNDU3MzIKLSAqIEBydW4gbWFpbi9vdGhlcnZtIEI4MDM1MTU4Ci0gKi8KLQotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LlByb3h5U2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotCi1wdWJsaWMgY2xhc3MgQjgwMzUxNTggewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICBmb3IgKFRlc3RDYXNlIHQgOiBlbXB0eU5vblByb3hpZXNIb3N0cygpKSB0LnJ1bigpOwotICAgICAgICBmb3IgKFRlc3RDYXNlIHQgOiBub25FbXB0eU5vblByb3hpZXNIb3N0cygpKSB0LnJ1bigpOwotICAgICAgICBmb3IgKFRlc3RDYXNlIHQgOiBtaXNjKCkpIHQucnVuKCk7Ci0gICAgfQotCi0gICAgLy8gU2V0dGluZyBodHRwLm5vblByb3h5SG9zdHMgdG8gYW4gZW1wdHkgc3RyaW5nIGhhcyBhbiBlZmZlY3Qgb2YKLSAgICAvLyBub3QgaW5jbHVkaW5nIGRlZmF1bHQgaG9zdHMgdG8gdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucwotICAgIC8vIChpLmUuIGlmIHlvdSB3YW50IGV2ZXJ5dGhpbmcgdG8gYmUgY29ubmVjdGVkIGRpcmVjdGx5IHJhdGhlciB0aGFuCi0gICAgLy8gdGhyb3VnaCBwcm94eSwgeW91IHNob3VsZCBzZXQgdGhpcyBwcm9wZXJ0eSB0byBhbiBlbXB0eSBzdHJpbmcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxUZXN0Q2FzZT4gZW1wdHlOb25Qcm94aWVzSG9zdHMoKSB7Ci0gICAgICAgIExpc3Q8VGVzdENhc2U+IHRlc3RzID0gbmV3IExpbmtlZExpc3Q8PigpOwotICAgICAgICBTdHJpbmdbXSBsb29wYmFja3MgPSB7ImxvY2FsaG9zdCIsICJbOjoxXSIsICJbOjowXSIsICIwLjAuMC4wIiwKLSAgICAgICAgICAgICAgICAiMTI3LjAuMC4wIiwgIjEyNy4wLjAuMSIsICIxMjcuMC4xLjAiLCAiMTI3LjAuMS4xIiwKLSAgICAgICAgICAgICAgICAiMTI3LjEuMC4wIiwgIjEyNy4xLjAuMSIsICIxMjcuMS4xLjAiLCAiMTI3LjEuMS4xIn07Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJvcGVydGllcy5wdXQoImh0dHAucHJveHlIb3N0IiwgImh0dHA6Ly9wcm94eS5leGFtcGxlLmNvbSIpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dCgiaHR0cC5ub25Qcm94eUhvc3RzIiwgIiIpOwotICAgICAgICBmb3IgKFN0cmluZyBzIDogbG9vcGJhY2tzKSB7Ci0gICAgICAgICAgICB0ZXN0cy5hZGQobmV3IFRlc3RDYXNlKHByb3BlcnRpZXMsICJodHRwOi8vIiArIHMsIHRydWUpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVzdHM7Ci0gICAgfQotCi0gICAgLy8gTm8gbWF0dGVyIHdoYXQgaXMgc2V0IGludG8gdGhlIGh0dHAubm9uUHJveHlIb3N0cyAoYXMgZmFyIGFzIGl0IGlzIG5vdAotICAgIC8vIGFuIGVtcHR5IHN0cmluZykgbG9vcGJhY2sgYWRkcmVzcyBhbGlhc2VzIG11c3QgYmUgYWx3YXlzIGNvbm5lY3RlZAotICAgIC8vIGRpcmVjdGx5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxUZXN0Q2FzZT4gbm9uRW1wdHlOb25Qcm94aWVzSG9zdHMoKSB7Ci0gICAgICAgIExpc3Q8VGVzdENhc2U+IHRlc3RzID0gbmV3IExpbmtlZExpc3Q8PigpOwotICAgICAgICBTdHJpbmdbXSBub25Qcm94eUhvc3RzID0gewotICAgICAgICAgICAgICAgICJnb29nbGUuY29tIiwKLSAgICAgICAgICAgICAgICAibG9jYWxob3N0IiwgIls6OjFdIiwgIls6OjBdIiwgIjAuMC4wLjAiLAotICAgICAgICAgICAgICAgICIxMjcuMC4wLjAiLCAiMTI3LjAuMC4xIiwgIjEyNy4wLjEuMCIsICIxMjcuMC4xLjEiLAotICAgICAgICAgICAgICAgICIxMjcuMS4wLjAiLCAiMTI3LjEuMC4xIiwgIjEyNy4xLjEuMCIsICIxMjcuMS4xLjEifTsKLSAgICAgICAgU3RyaW5nW10gbG9vcGJhY2tzID0geyJsb2NhbGhvc3QiLCAiWzo6MV0iLCAiWzo6MF0iLCAiMC4wLjAuMCIsCi0gICAgICAgICAgICAgICAgIjEyNy4wLjAuMCIsICIxMjcuMC4wLjEiLCAiMTI3LjAuMS4wIiwgIjEyNy4wLjEuMSIsCi0gICAgICAgICAgICAgICAgIjEyNy4xLjAuMCIsICIxMjcuMS4wLjEiLCAiMTI3LjEuMS4wIiwgIjEyNy4xLjEuMSJ9OwotICAgICAgICBmb3IgKFN0cmluZyBoIDogbm9uUHJveHlIb3N0cykgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGxvb3BiYWNrcykgewotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCgiaHR0cC5wcm94eUhvc3QiLCAiaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tIik7Ci0gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoImh0dHAubm9uUHJveHlIb3N0cyIsIGgpOwotICAgICAgICAgICAgICAgIHRlc3RzLmFkZChuZXcgVGVzdENhc2UocHJvcGVydGllcywgImh0dHA6Ly8iICsgcywgZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVzdHM7Ci0gICAgfQotCi0gICAgLy8gdW5zb3J0ZWQgdGVzdHMKLSAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFRlc3RDYXNlPiBtaXNjKCkgewotICAgICAgICBMaXN0PFRlc3RDYXNlPiB0ID0gbmV3IExpbmtlZExpc3Q8PigpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoIm9yYWNsZS5jb20iLCAiaHR0cDovLzEzNy4yNTQuMTYuMTAxIiwgdHJ1ZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb20iLCAiaHR0cDovLzc0LjEyNS4yMDAuMTAxIiwgdHJ1ZSkpOwotCi0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxnb29nbGUuaWUiLCAiaHR0cDovL2dvb2dsZS5jby51ayIsCi0gICAgICAgICAgICAgICAgdHJ1ZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218Z29vZ2xlLmllIiwgImh0dHA6Ly9nb29nbGUuY29tIiwKLSAgICAgICAgICAgICAgICBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218Z29vZ2xlLmllIiwgImh0dHA6Ly9nb29nbGUuaWUiLAotICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxnb29nbGUuY29tfGdvb2dsZS5pZSIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9nb29nbGUuaWUiLCBmYWxzZSkpOwotCi0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLAotICAgICAgICAgICAgICAgICJodHRwOi8vMTI3LjAuMC4xIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY29tfGJpbmcuY29tfHlhaG9vLmNvbSIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9nb29nbGUuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY29tfGJpbmcuY29tfHlhaG9vLmNvbSIsCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9iaW5nLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLAotICAgICAgICAgICAgICAgICJodHRwOi8veWFob28uY29tIiwgZmFsc2UpKTsKLQotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218YmluZy5jb20iLCAiaHR0cDovL2dvb2dsZS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218YmluZy5jb20iLCAiaHR0cDovL2JpbmcuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY29tfGJpbmcuY29tIiwgImh0dHA6Ly95YWhvby5jb20iLAotICAgICAgICAgICAgICAgIHRydWUpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY29tfGJpbmcuY28qIiwgImh0dHA6Ly9nb29nbGUuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY29tfGJpbmcuY28qIiwgImh0dHA6Ly9iaW5nLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvKiIsICJodHRwOi8veWFob28uY29tIiwKLSAgICAgICAgICAgICAgICB0cnVlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXwqaW5nLmNvbSIsICJodHRwOi8vZ29vZ2xlLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXwqaW5nLmNvbSIsICJodHRwOi8vYmluZy5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218KmluZy5jb20iLCAiaHR0cDovL3lhaG9vLmNvbSIsCi0gICAgICAgICAgICAgICAgdHJ1ZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jbyp8YmluZy5jb20iLCAiaHR0cDovL2dvb2dsZS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jbyp8YmluZy5jb20iLCAiaHR0cDovL2JpbmcuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY28qfGJpbmcuY29tIiwgImh0dHA6Ly95YWhvby5jb20iLAotICAgICAgICAgICAgICAgIHRydWUpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY28qfGJpbmcuY28qIiwgImh0dHA6Ly9nb29nbGUuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJnb29nbGUuY28qfGJpbmcuY28qIiwgImh0dHA6Ly9iaW5nLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvKnxiaW5nLmNvKiIsICJodHRwOi8veWFob28uY29tIiwKLSAgICAgICAgICAgICAgICB0cnVlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvKnwqaW5nLmNvbSIsICJodHRwOi8vZ29vZ2xlLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvKnwqaW5nLmNvbSIsICJodHRwOi8vYmluZy5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jbyp8KmluZy5jb20iLCAiaHR0cDovL3lhaG9vLmNvbSIsCi0gICAgICAgICAgICAgICAgdHJ1ZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoIipvb2dsZS5jb218YmluZy5jb20iLCAiaHR0cDovL2dvb2dsZS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoIipvb2dsZS5jb218YmluZy5jb20iLCAiaHR0cDovL2JpbmcuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCIqb29nbGUuY29tfGJpbmcuY29tIiwgImh0dHA6Ly95YWhvby5jb20iLAotICAgICAgICAgICAgICAgIHRydWUpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCIqb29nbGUuY29tfGJpbmcuY28qIiwgImh0dHA6Ly9nb29nbGUuY29tIiwgZmFsc2UpKTsKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCIqb29nbGUuY29tfGJpbmcuY28qIiwgImh0dHA6Ly9iaW5nLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiKm9vZ2xlLmNvbXxiaW5nLmNvKiIsICJodHRwOi8veWFob28uY29tIiwKLSAgICAgICAgICAgICAgICB0cnVlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiKm9vZ2xlLmNvbXwqaW5nLmNvbSIsICJodHRwOi8vZ29vZ2xlLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiKm9vZ2xlLmNvbXwqaW5nLmNvbSIsICJodHRwOi8vYmluZy5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoIipvb2dsZS5jb218KmluZy5jb20iLCAiaHR0cDovL3lhaG9vLmNvbSIsCi0gICAgICAgICAgICAgICAgdHJ1ZSkpOwotCi0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLCAiaHR0cDovL2dvb2dsZS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jb218YmluZy5jb218eWFob28uY29tIiwgImh0dHA6Ly9iaW5nLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLCAiaHR0cDovL3lhaG9vLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLAotICAgICAgICAgICAgICAgICJodHRwOi8vZHVja2R1Y2tnby5jb20iLCB0cnVlKSk7Ci0KLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJwLXByb3h5LmNvbSIsICJodHRwOi8vcC1wcm94eS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImdvb2dsZS5jbyp8Z29vZ2xlLmllIiwgImh0dHA6Ly9nb29nbGUuY28udWsiLAotICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0KLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCIqb3JhY2xlLmNvbSIsICJodHRwOi8vbXkub3JhY2xlLmNvbSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLCAiaHR0cDovLzEyNy4wLjAuMSIsIGZhbHNlKSk7Ci0gICAgICAgIHQuYWRkKG5ldyBUZXN0Q2FzZSgiZ29vZ2xlLmNvbXxiaW5nLmNvbXx5YWhvby5jb20iLCAiaHR0cDovL3lhaG9vLmNvbSIsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gZXhhbXBsZSBmcm9tCi0gICAgICAgIC8vIGh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL25ldC9wcm94aWVzLmh0bWwKLSAgICAgICAgdC5hZGQobmV3IFRlc3RDYXNlKCJsb2NhbGhvc3R8aG9zdC5leGFtcGxlLmNvbSIsICJodHRwOi8vbG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImxvY2FsaG9zdHxob3N0LmV4YW1wbGUuY29tIiwKLSAgICAgICAgICAgICAgICAiaHR0cDovL2hvc3QuZXhhbXBsZS5jb20iLCBmYWxzZSkpOwotICAgICAgICB0LmFkZChuZXcgVGVzdENhc2UoImxvY2FsaG9zdHxob3N0LmV4YW1wbGUuY29tIiwKLSAgICAgICAgICAgICAgICAiaHR0cDovL2dvb2dsZS5jb20iLCB0cnVlKSk7Ci0gICAgICAgIHJldHVybiB0OwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgd2l0aFN5c3RlbVByb3BlcnRpZXNTZXQoCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsUHJvcGVydGllcywKLSAgICAgICAgICAgIENhbGxhYmxlPD8gZXh0ZW5kcyBUPiBjb2RlKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmFja3VwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYmFja3VwQW5kU2V0UHJvcGVydGllcyhsb2NhbFByb3BlcnRpZXMsIGJhY2t1cCk7Ci0gICAgICAgICAgICByZXR1cm4gY29kZS5jYWxsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJlc3RvcmVQcm9wZXJ0aWVzKGJhY2t1cCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJhY2t1cEFuZFNldFByb3BlcnRpZXMoCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsUHJvcGVydGllcywKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkUHJvcGVydGllcykgewotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGxvY2FsUHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBTeXN0ZW0uc2V0UHJvcGVydHkoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIG9sZFByb3BlcnRpZXMucHV0KGUuZ2V0S2V5KCksIG9sZFZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZVByb3BlcnRpZXMoTWFwPFN0cmluZywgU3RyaW5nPiBvbGRQcm9wZXJ0aWVzKSB7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogb2xkUHJvcGVydGllcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBlLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKGtleSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KGtleSwgb2xkVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdENhc2UgewotCi0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxQcm9wZXJ0aWVzOwotICAgICAgICBmaW5hbCBTdHJpbmcgdXJsaG9zdDsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBleHBlY3RlZFByb3h5aW5nOwotCi0gICAgICAgIFRlc3RDYXNlKFN0cmluZyBub25Qcm94eUhvc3RzLCBTdHJpbmcgdXJsaG9zdCwKLSAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZFByb3h5aW5nKSB7Ci0gICAgICAgICAgICB0aGlzKG5vblByb3h5SG9zdHMsICJwcm94eS5leGFtcGxlLmNvbSIsIHVybGhvc3QsCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUHJveHlpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGVzdENhc2UoU3RyaW5nIG5vblByb3h5SG9zdHMsIFN0cmluZyBwcm94eUhvc3QsIFN0cmluZyB1cmxob3N0LAotICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdGVkUHJveHlpbmcpIHsKLSAgICAgICAgICAgIHRoaXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHV0KCJodHRwLm5vblByb3h5SG9zdHMiLCBub25Qcm94eUhvc3RzKTsKLSAgICAgICAgICAgICAgICAgICAgcHV0KCJodHRwLnByb3h5SG9zdCIsIHByb3h5SG9zdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgdXJsaG9zdCwgZXhwZWN0ZWRQcm94eWluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXN0Q2FzZShNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsUHJvcGVydGllcywgU3RyaW5nIHVybGhvc3QsCi0gICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWRQcm94eWluZykgewotICAgICAgICAgICAgdGhpcy5sb2NhbFByb3BlcnRpZXMgPSBsb2NhbFByb3BlcnRpZXM7Ci0gICAgICAgICAgICB0aGlzLnVybGhvc3QgPSB1cmxob3N0OwotICAgICAgICAgICAgdGhpcy5leHBlY3RlZFByb3h5aW5nID0gZXhwZWN0ZWRQcm94eWluZzsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInVybGhvc3Q9JXMgcHJvcGVydGllcz0lczogcHJveGllZD8gJXMlbiIsCi0gICAgICAgICAgICAgICAgICAgIHVybGhvc3QsIGxvY2FsUHJvcGVydGllcywgZXhwZWN0ZWRQcm94eWluZyk7Ci0KLSAgICAgICAgICAgIExpc3Q8UHJveHk+IHByb3hpZXMgPSB3aXRoU3lzdGVtUHJvcGVydGllc1NldChsb2NhbFByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICgpIC0+IFByb3h5U2VsZWN0b3IuZ2V0RGVmYXVsdCgpLnNlbGVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKHVybGhvc3QpKQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgdmVyaWZ5KHByb3hpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB2ZXJpZnkoTGlzdDw/IGV4dGVuZHMgUHJveHk+IHByb3hpZXMpIHsKLQotICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxQcm94eWluZyA9ICEocHJveGllcy5zaXplKCkgPT0gMSAmJgotICAgICAgICAgICAgICAgICAgICBwcm94aWVzLmdldCgwKS50eXBlKCkgPT0gUHJveHkuVHlwZS5ESVJFQ1QpOwotCi0gICAgICAgICAgICBpZiAoYWN0dWFsUHJveHlpbmcgIT0gZXhwZWN0ZWRQcm94eWluZykKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAlcyBjb25uZWN0aW9uIGZvciAlcyAoZ2l2ZW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzPSVzKS4gSGVyZSdzIHRoZSBsaXN0IG9mIHByb3hpZXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQcm94eWluZyA/ICJwcm94aWVkIiA6ICJkaXJlY3QiLCB1cmxob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQcm9wZXJ0aWVzLCBwcm94aWVzCi0gICAgICAgICAgICAgICAgKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL25pby9maWxlL1dhdGNoU2VydmljZS9VcGRhdGVJbnRlcmZlcmVuY2UuamF2YSBiL2pkay90ZXN0L2phdmEvbmlvL2ZpbGUvV2F0Y2hTZXJ2aWNlL1VwZGF0ZUludGVyZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ4ODEyLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvbmlvL2ZpbGUvV2F0Y2hTZXJ2aWNlL1VwZGF0ZUludGVyZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKiBAdGVzdAotICogQGJ1ZyA4MTQ1OTgxCi0gKiBAc3VtbWFyeSBMaW51eFdhdGNoU2VydmljZSBzb21ldGltZXMgcmVwb3J0cyBpbm90aWZ5IGV2ZW50cyBhZ2FpbnN0IHdyb25nIGRpcmVjdG9yeQotICogQHJ1biBtYWluIFVwZGF0ZUludGVyZmVyZW5jZQotICovCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLio7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuU3RhbmRhcmRXYXRjaEV2ZW50S2luZHMuKjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZUludGVyZmVyZW5jZSB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFBhdGggcm9vdCA9IEZpbGVzLmNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3QiKTsKLSAgICAgICAgZmluYWwgUGF0aCBmb28gPSByb290LnJlc29sdmUoImZvbyIpOwotICAgICAgICBmaW5hbCBQYXRoIGJhciA9IHJvb3QucmVzb2x2ZSgiYmFyIik7Ci0gICAgICAgIGZpbmFsIFBhdGggYmF6ID0gcm9vdC5yZXNvbHZlKCJiYXoiKTsKLQotICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcnkoZm9vKTsKLSAgICAgICAgRmlsZXMuY3JlYXRlRGlyZWN0b3J5KGJhcik7Ci0gICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yeShiYXopOwotCi0gICAgICAgIGZpbmFsIFdhdGNoU2VydmljZSB3YXRjaGVyID0gcm9vdC5nZXRGaWxlU3lzdGVtKCkubmV3V2F0Y2hTZXJ2aWNlKCk7Ci0gICAgICAgIGZpbmFsIFdhdGNoS2V5IGZvb0tleSA9IGZvby5yZWdpc3Rlcih3YXRjaGVyLCBFTlRSWV9DUkVBVEUpOwotICAgICAgICBmaW5hbCBXYXRjaEtleSBiYXJLZXkgPSBiYXIucmVnaXN0ZXIod2F0Y2hlciwgRU5UUllfQ1JFQVRFKTsKLQotICAgICAgICBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgeyBzZXREYWVtb24odHJ1ZSk7IH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggdGVtcCA9IEZpbGVzLmNyZWF0ZVRlbXBGaWxlKGZvbywgInRlbXAiLCAiLnRtcCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXMuZGVsZXRlKHRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOwotCi0gICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICB7IHNldERhZW1vbih0cnVlKTsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBXYXRjaEtleSBiYXpLZXlzW10gPSBuZXcgV2F0Y2hLZXlbMzJdOwotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGJhektleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXpLZXlzW2ldID0gYmF6LnJlZ2lzdGVyKHdhdGNoZXIsIEVOVFJZX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGJhektleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXpLZXlzW2ldLmNhbmNlbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LnN0YXJ0KCk7Ci0KLSAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSA8IDE1MDAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBXYXRjaEtleSBrZXkgPSB3YXRjaGVyLnBvbGwoNjAsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSBjb250aW51ZTsKLQotICAgICAgICAgICAgaWYgKGtleSAhPSBmb29LZXkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFdhdGNoRXZlbnQ8Pz4+IHBvbGxFdmVudHMgPSBrZXkucG9sbEV2ZW50cygpOwotICAgICAgICAgICAgICAgIGZvciAoV2F0Y2hFdmVudDw/PiB3YXRjaEV2ZW50IDogcG9sbEV2ZW50cykgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2F0Y2hFdmVudC5jb3VudCgpICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoRXZlbnQua2luZCgpICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoRXZlbnQuY29udGV4dCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV2ZW50IHJlY2VpdmVkIGZvciB1bmV4cGVjdGVkIGtleSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAga2V5LnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvci9GaW5hbGl6ZUhhbGYuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvS2V5UGFpckdlbmVyYXRvci9GaW5hbGl6ZUhhbGYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhMWViMy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L0tleVBhaXJHZW5lcmF0b3IvRmluYWxpemVIYWxmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MTYzODk2Ci0gKiBAc3VtbWFyeSBGaW5hbGl6aW5nIG9uZSBrZXkgb2YgYSBLZXlQYWlyIGludmFsaWRhdGVzIHRoZSBvdGhlciBrZXkKLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdmlkZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEZpbmFsaXplSGFsZiB7Ci0KLSAgICBzdGF0aWMgaW50IGZhaWx1cmVzID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBMaXN0PENvbnN1bWVyPEtleT4+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbWV0aG9kcy5hZGQoKEtleSBrKSAtPiBrLmdldEVuY29kZWQoKSk7Ci0gICAgICAgIG1ldGhvZHMuYWRkKChLZXkgaykgLT4gay50b1N0cmluZygpKTsKLQotICAgICAgICBmb3IgKFN0cmluZyBhbGdvIDogbmV3IFN0cmluZ1tdIHsiRGlmZmllSGVsbG1hbiIsICJEU0EiLCAiUlNBIn0pIHsKLSAgICAgICAgICAgIGZvciAoUHJvdmlkZXIgcHJvdmlkZXIgOiBTZWN1cml0eS5nZXRQcm92aWRlcnMoKSkgewotICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiBwcml2IDogbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgZmFsc2V9KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3VtZXI8S2V5PiBtZXRob2QgOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0KGFsZ28sIHByb3ZpZGVyLCBwcml2LCBtZXRob2QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZhaWx1cmVzID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZmFpbHVyZXMgKyAiIHRlc3QocykgZmFpbGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgdGVzdChTdHJpbmcgYWxnbywgUHJvdmlkZXIgcHJvdmlkZXIsIGJvb2xlYW4gcHJpdiwKLSAgICAgICAgICAgIENvbnN1bWVyPEtleT4gbWV0aG9kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgS2V5UGFpckdlbmVyYXRvciBnZW5lcmF0b3I7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IgPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKGFsZ28sIHByb3ZpZGVyKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5zYWUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2tpbmcgIiArIHByb3ZpZGVyLmdldE5hbWUoKSArICIsICIgKyBhbGdvKTsKLQotICAgICAgICBLZXlQYWlyIHBhaXIgPSBnZW5lcmF0b3IuZ2VuZXJhdGVLZXlQYWlyKCk7Ci0gICAgICAgIEtleSBrZXkgPSBwcml2ID8gcGFpci5nZXRQcml2YXRlKCkgOiBwYWlyLmdldFB1YmxpYygpOwotCi0gICAgICAgIHBhaXIgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKLSAgICAgICAgICAgIFN5c3RlbS5nYygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1ldGhvZC5hY2NlcHQoa2V5KTsKLSAgICAgICAgfSBjYXRjaCAoUHJvdmlkZXJFeGNlcHRpb24gcGUpIHsKLSAgICAgICAgICAgIGZhaWx1cmVzKys7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L0tleVN0b3JlL1Rlc3RLZXlTdG9yZUJhc2ljLmphdmEgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L0tleVN0b3JlL1Rlc3RLZXlTdG9yZUJhc2ljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2MxZjQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9LZXlTdG9yZS9UZXN0S2V5U3RvcmVCYXNpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hQcm92aWRlckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5QS0NTOEVuY29kZWRLZXlTcGVjOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ4NjIxIDgxMzMwOTAKLSAqIEBzdW1tYXJ5IFRlc3QgYmFzaWMgb3BlcmF0aW9ucyB3aXRoIGtleXN0b3JlcyAoamtzLCBqY2VrcywgcGtjczEyKQotICogQGF1dGhvciBZdS1DaGluZyBWYWxlcmllIFBFTkcKLSAqLwotcHVibGljIGNsYXNzIFRlc3RLZXlTdG9yZUJhc2ljIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFX0tFWV9QS0NTOF9CQVNFNjQgPSAiIgotICAgICAgICArICJNSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUUNweXo5N2xpdVdQRFljTEg5VFg4QmlUNzhvIgotICAgICAgICArICJsQ21BZm1ldnZjaDZuY1hVVnVDemJkYUt1S1h3bjRFVmJEc3pzVkpMb0s1emR0UCtYM2lEaHV0aitJZ0ttTGh1Y3pGM005VkljV3IrIgotICAgICAgICArICJKSlV5VEg0KzNoL1JUOGNqQ0RaT21rOWlYa2I1aWZydVZzTHF6YjlnK1ZwMTQwT3o3bGVpa25lN0ttY2xIdlRmdkZkMFdESTdHYjl2IgotICAgICAgICArICJvNGY1clQ3MTdCWEovbitNNnBOazhETHBMaUV1NmV6aVl2WFJ2NXgrdDVHbzN4MGVDWGRheEVRVWYyajg3NldmcjJxSFJKSzdsRGZGIgotICAgICAgICArICJlMUREc01nL0twS0dpSUxZWitnMnF0Vk1aU3h0cDVCWkV0ZkI1cVYvSUU1a1dPK21DSUFHcFhTWklkYkVSUjZwWlVxOEdMRWUxVDllIgotICAgICAgICArICIrc082SDI0dzJGMTlBZ01CQUFFQ2dnRUJBSWQvMTIxODdkTzZ3VVBDanVtdUpBMVFyckJuYktkS09OeWFpMzZ1b2MxT2Q0czVRRmo3IgotICAgICAgICArICIraEVJZVM3cmJHTllRdUJ2bmtndXNBYnprVzBGSXB4cEhjZTNFSmV6L2VtdXg2cEVPS29QNzdCd010OWd5K3R4eXUwK0JIaTkxRlFnIgotICAgICAgICArICJBR3ZyblFETzVFWVZZNEN6L1dqT3NKekt1OHpWTGcrRFMwVG9hMnFSRndtVWU5bVZBWFBOT0NaM09hZS9RNnRDRHNhSU5OdzBmbWpqIgotICAgICAgICArICJqbjZ1b2hQYlMrbjZ4RU5HM0ZrUVhCMzZnZXRYeTMxMHhUR0VEMkoyN2NtQVFINmdMUjZLbDJpUk96TlBiYnBCcWJ1ZW1JOWtiY2xkIgotICAgICAgICArICJFd0JTMWpSZlpXZWFQc3RZQTFuaVZyRTlVZ1VCemVtbm9oNFREa0cwNzZzWXRoSE1yNVFGR2pQc3dud3RKNEVDZ1lFQTBzVVJRNSt2IgotICAgICAgICArICJiYUg0dGRhZW1JM3FwbmtuWFRselNwdVpabUFveXZZMElkMG1sZHV3S3dtWjNZNTk4OXdIZm5uaEZmeU5PNElrVEtqSTJXcDk3cVA1IgotICAgICAgICArICI0ZXFVTnBBN0Z0TlU3S1V6TWNGRFR0d3ROWnVSWU1yS2xxbzJsTGJBK2dWckFZcFlaRkw0Yjd0Y3d0WDREbllvckRzbXVkZTZXOHNHIgotICAgICAgICArICI0TXgyVmRGSkM5VUNnWUVBempzZFhDWUg1ZG9XVUhiMGR2bjlJRDdJaWtmZkVNUk03MjBNUmpybm5uVmJweng2QUNudGtQRE5aZzdwIgotICAgICAgICArICJUUkUvbXg3aUJ6ODFaYVVXRStWMHdkMEp2Q0hFZHBBejNta3N5dkRGaFU0QmdzNnh6ZjJwU3VsNW11aHN4M2hIY3Z2UGV6ejVCbnhzIgotICAgICAgICArICJmYUpsemt4ZndvdHlHbXZXTjE1R0EvcHlmc1pqc2JiVHB3a0NnWUFPNk5uYnlzUUNJVjhTbmVnQ0txZmF0dDlOL081bTdMTGhSeFFiIgotICAgICAgICArICJwMmJ3cmxBNGNaMzRyV2t3L3c5eDNMSzdBNndrZmdVUG5Ka3N3eFBTTFhKVEcwNWw2TTRyUGZDd0lLcjFRb3BvanA5UVNNcjU2OU5RIgotICAgICAgICArICI0WWVMT09jN2hlSUl6YkZRSHBVNkk1Um5jdjJRMnNuOVcrWnNxSktJdXZYMzRGalFOaVo0MDZFek1RS0JnSFN4T0dTNjFEODREdVpLIgotICAgICAgICArICIyUHMxYXdoQzNrQjRlSHpKUm1zM3ZmbERQV29KSitwU0t3cEtyelVUUEhYaVBCcXlodFlrUEdzelZlaUU2Q0FyOXN2M1labkZWYUJzIgotICAgICAgICArICI2aHlRVUpzb2IrdUUvdy9nR3ZYZThWc0ZEeDBiSk9vZFlmaHJDYlRIQkhXcUU4MW5CY29jcHhheXhzYXlmQXpxV0IzS0tkMFlMck1SIgotICAgICAgICArICJLMlBaQW9HQWNaYTg5MTVSMm0wS1o2SFZKVXQvSkRSODVqQ2JONzFrY1ZERlkyWFNGa09Kdk9kRm9ITmZSY2tmTHpqcTlZMk1TU1RWIgotICAgICAgICArICIrUURXYkRvMmRvVVFDZWpKVVRhTjhuUDc5dGZ5aXIyNFg1dVZQdlFhZVZvR1RLWWIrTGZVcUswRjYwbFN0bWp1ZGRJR1NaSDU1eTN2IgotICAgICAgICArICIrOVhqbXhiVkVSdGQxbHFnUWczVmxtS2xFWFk9IjsKLQotICAgIC8qCi0gICAgICogQ2VydGlmaWNhdGU6Ci0gICAgICogRGF0YToKLSAgICAgKiAgICAgVmVyc2lvbjogMyAoMHgyKQotICAgICAqICAgICBTZXJpYWwgTnVtYmVyOiA3ICgweDcpCi0gICAgICogU2lnbmF0dXJlIEFsZ29yaXRobTogc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24KLSAgICAgKiAgICAgSXNzdWVyOiBDTj1Sb290Ci0gICAgICogICAgIFZhbGlkaXR5Ci0gICAgICogICAgICAgICBOb3QgQmVmb3JlOiBTZXAgIDEgMTg6MDM6NTkgMjAxNSBHTVQKLSAgICAgKiAgICAgICAgIE5vdCBBZnRlciA6IEphbiAxNyAxODowMzo1OSAyMDQzIEdNVAotICAgICAqICAgICBTdWJqZWN0OiBDTj1FRQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRVJUSUZJQ0FURSA9ICIiCi0gICAgICAgICsgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgotICAgICAgICArICJNSUlESFRDQ0FnV2dBd0lCQWdJQkJ6QU5CZ2txaGtpRzl3MEJBUTBGQURBUE1RMHdDd1lEVlFRRERBUlNiMjkwXG4iCi0gICAgICAgICsgIk1CNFhEVEUxTURrd01URTRNRE0xT1ZvWERUUXpNREV4TnpFNE1ETTFPVm93RFRFTE1Ba0dBMVVFQXd3Q1JVVXdcbiIKLSAgICAgICAgKyAiZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3B5ejk3bGl1V1BEWWNMSDlUWDhCaVxuIgotICAgICAgICArICJUNzhvbENtQWZtZXZ2Y2g2bmNYVVZ1Q3piZGFLdUtYd240RVZiRHN6c1ZKTG9LNXpkdFArWDNpRGh1dGorSWdLXG4iCi0gICAgICAgICsgIm1MaHVjekYzTTlWSWNXcitKSlV5VEg0KzNoL1JUOGNqQ0RaT21rOWlYa2I1aWZydVZzTHF6YjlnK1ZwMTQwT3pcbiIKLSAgICAgICAgKyAiN2xlaWtuZTdLbWNsSHZUZnZGZDBXREk3R2I5dm80ZjVyVDcxN0JYSi9uK002cE5rOERMcExpRXU2ZXppWXZYUlxuIgotICAgICAgICArICJ2NXgrdDVHbzN4MGVDWGRheEVRVWYyajg3NldmcjJxSFJKSzdsRGZGZTFERHNNZy9LcEtHaUlMWVorZzJxdFZNXG4iCi0gICAgICAgICsgIlpTeHRwNUJaRXRmQjVxVi9JRTVrV08rbUNJQUdwWFNaSWRiRVJSNnBaVXE4R0xFZTFUOWUrc082SDI0dzJGMTlcbiIKLSAgICAgICAgKyAiQWdNQkFBR2pnWVV3Z1lJd05BWURWUjBmQkMwd0t6QXBvQ2VnSllZamJHUmhjRG92TDJ4a1lYQXVhRzl6ZEM1bVxuIgotICAgICAgICArICJiM0l1WTNKc1pIQXZiV0ZwYmk1amNtd3dTZ1lJS3dZQkJRVUhBUUVFUGpBOE1Eb0dDQ3NHQVFVRkJ6QUNoaTVzXG4iCi0gICAgICAgICsgIlpHRndPaTh2YkdSaGNDNW9iM04wTG1admNpNWhhV0V2WkdNOVVtOXZkRDlqUVVObGNuUnBabWxqWVhSbE1BMEdcbiIKLSAgICAgICAgKyAiQ1NxR1NJYjNEUUVCRFFVQUE0SUJBUUJXRGZaSHB1VXgweW41ZDMrQnV6dEZxb2tzMU1rR2RrK1VTbEgwVEIxL1xuIgotICAgICAgICArICJnV1dCZCs0UzRQQ0tscFN1cjBnajJyTVc0ZlA1SFFmTmxIY2k4SlY4L2JHNEt1S1JBWFc1NmRnMTgxOEhsM3BjXG4iCi0gICAgICAgICsgImlJclVTUm44dVVqSDNwOXFiK1JiL3UzbW1WUVJ5SmpOMnQvemNlTnNPOC8rRGQ4MDhPQjlhRXdHczhsTVQwbm5cbiIKLSAgICAgICAgKyAiWllhYUFxWXoxR0lZL0VjeXgxdmZFWkVRMWxqbzZpL3I3MEMzaWdieXBCVVNoeFNpR3NsZWlWVExPR05BK01OMVxuIgotICAgICAgICArICIvYS9RaDBia2FReVRHcUszYnd2enpNZVFWcVd1MkVXVEJEL1BtTkQ1RXhrcFJJQ2R2OExCVlhmTG5wb0JyNGxMXG4iCi0gICAgICAgICsgImhueG45K2UwQWgrdDhkUzVFS2ZuNDR3NWJJNVBDdTJicXhzNlJDVHhOamNZXG4iCi0gICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFTU1dEMiA9IG5ldyBjaGFyW10gewotICAgICAgICAgICAgJ2InLCAnbycsICdyJywgJ2UnLCAnZCcKLSAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBQQVNTV0RLID0gImNhbm5vdCBiZSBudWxsIgotICAgICAgICAgICAgLnRvQ2hhckFycmF5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gS1NfVHlwZSA9IHsKLSAgICAgICAgICAgICJqa3MiLCAiamNla3MiLCAicGtjczEyIiwgIlBLQ1MxMUtleVN0b3JlIgotICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPVklERVJTID0gewotICAgICAgICAgICAgIlNVTiIsICJTdW5KQ0UiLCAiU3VuSlNTRSIsICJTdW5QS0NTMTEtU29sYXJpcyIKLSAgICB9OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19IRUFEID0gInRlc3QiOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RLZXlTdG9yZUJhc2ljIGpzdGVzdCA9IG5ldyBUZXN0S2V5U3RvcmVCYXNpYygpOwotICAgICAgICBqc3Rlc3QucnVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoU3RyaW5nIHByb3ZpZGVyIDogUFJPVklERVJTKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJ1blRlc3QocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCB3aXRoIHByb3ZpZGVyICIgKyBwcm92aWRlciArICJwYXNzZWQiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5lcXVhbHMoIlN1blBLQ1MxMS1Tb2xhcmlzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJLZXlTdG9yZUV4Y2VwdGlvbiBpcyBleHBlY3RlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlBLQ1MxMUtleVN0b3JlIGlzIGludmFsaWQga2V5c3RvcmUgdHlwZTogIiArIGUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBvc05hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZXF1YWxzKCJTdW5QS0NTMTEtU29sYXJpcyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhb3NOYW1lLmVxdWFscygiU3VuT1MiKSkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNraXAgU3VuUEtDUzExLVNvbGFyaXMgcHJvdmlkZXIgb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3NOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1blRlc3QoU3RyaW5nIHByb3ZpZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBsb2FkIHByaXZhdGUga2V5Ci0gICAgICAgIC8vIGFsbCBrZXlzdG9yZSB0eXBlcyBzaG91bGQgc3VwcG9ydCBwcml2YXRlIGtleXMKLSAgICAgICAgS2V5U3BlYyBzcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoCi0gICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKFBSSVZBVEVfS0VZX1BLQ1M4X0JBU0U2NCkpOwotICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJSU0EiKQotICAgICAgICAgICAgICAgIC5nZW5lcmF0ZVByaXZhdGUoc3BlYyk7Ci0KLSAgICAgICAgLy8gbG9hZCB4NTA5IGNlcnRpZmljYXRlCi0gICAgICAgIENlcnRpZmljYXRlIGNlcnQ7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oQ0VSVElGSUNBVEUuZ2V0Qnl0ZXMoKSkpKSB7Ci0gICAgICAgICAgICBjZXJ0ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpCi0gICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBudW1FbnRyaWVzID0gNTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBST1ZJREVSUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmNvbXBhcmVUbyhQUk9WSURFUlNbaV0pID09IDApIHsKLSAgICAgICAgICAgICAgICB0eXBlID0gS1NfVHlwZVtpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJUZXN0ICVzIHByb3ZpZGVyIGFuZCAlcyBrZXlzdG9yZSVuIiwgcHJvdmlkZXIsIHR5cGUpOwotICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHR5cGUsIHByb3ZpZGVyKTsKLSAgICAgICAgS2V5U3RvcmUga3MyID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UodHlwZSwga3MuZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBrZXkgc3RvcmUKLSAgICAgICAga3MubG9hZChudWxsLCBudWxsKTsKLQotICAgICAgICAvLyBzdG9yZSB0aGUgc2VjcmV0IGtleXMKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1FbnRyaWVzOyBqKyspIHsKLSAgICAgICAgICAgIGtzLnNldEtleUVudHJ5KEFMSUFTX0hFQUQgKyBqLCBwcml2YXRlS2V5LCBQQVNTV0RLLAotICAgICAgICAgICAgICAgICAgICBuZXcgQ2VydGlmaWNhdGVbXSB7IGNlcnQgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSAybmQga2V5IHN0b3JlIG9iamVjdCB3aXRoIHRoZSAxc3Qgb25lCi0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBrcy5zdG9yZShiYW9zLCBQQVNTV0RLKTsKLSAgICAgICAgYnl0ZVtdIGJBcnIgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYkFycik7Ci0gICAgICAgIGtzMi5sb2FkKGJhaXMsIG51bGwpOwotCi0gICAgICAgIC8vIGNoZWNrIDJuZCBrZXkgc3RvcmUgdHlwZQotICAgICAgICBjaGVja1R5cGUoa3MyLCB0eXBlKTsKLSAgICAgICAgLy8gY2hlY2sgdGhlIGV4aXN0aW5nIGFsaWFzZXMgZm9yIHRoZSAybmQga2V5IHN0b3JlCi0gICAgICAgIGNoZWNrQWxpYXMoa3MyLCBudW1FbnRyaWVzKTsKLQotICAgICAgICAvLyBjb21wYXJlIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSAyIGtleSBzdG9yZXMgZm9yIGFsbCBhbGlhc2VzCi0gICAgICAgIGNvbXBhcmVDcmVhdGlvbkRhdGUoa3MsIGtzMiwgbnVtRW50cmllcyk7Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgbGFzdCBlbnRyeSBmcm9tIHRoZSAybmQga2V5IHN0b3JlCi0gICAgICAgIG51bUVudHJpZXMtLTsKLSAgICAgICAga3MyLmRlbGV0ZUVudHJ5KEFMSUFTX0hFQUQgKyBudW1FbnRyaWVzKTsKLQotICAgICAgICAvLyByZS1pbml0aWFsaXplIHRoZSAxc3Qga2V5IHN0b3JlIHdpdGggdGhlIDJuZCBrZXkgc3RvcmUKLSAgICAgICAgYmFvcy5yZXNldCgpOwotICAgICAgICBrczIuc3RvcmUoYmFvcywgUEFTU1dEMik7Ci0gICAgICAgIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIGV4cGVjdCBhbiBleGNlcHRpb24gc2luY2UgdGhlIHBhc3N3b3JkIGlzIGluY29ycmVjdAotICAgICAgICAgICAga3MubG9hZChiYWlzLCBQQVNTV0RLKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRVJST1I6IHBhc3NlZCB0aGUgbG9hZGluZyB3aXRoIGluY29ycmVjdCBwYXNzd29yZCIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBleCk7Ci0gICAgICAgICAgICBpZiAoIWNhdXNlZEJ5KGV4LCBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYXVzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBjYXVzZTogIgotICAgICAgICAgICAgICAgICAgICArIFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgYmFpcy5yZXNldCgpOwotICAgICAgICAgICAga3MubG9hZChiYWlzLCBQQVNTV0QyKTsKLSAgICAgICAgICAgIGJhaXMucmVzZXQoKTsKLSAgICAgICAgICAgIGtzLmxvYWQoYmFpcywgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjaGVjayBrZXkgc3RvcmUgdHlwZQotICAgICAgICBjaGVja1R5cGUoa3MsIHR5cGUpOwotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBleGlzdGluZyBhbGlhc2VzCi0gICAgICAgIGNoZWNrQWxpYXMoa3MsIG51bUVudHJpZXMpOwotCi0gICAgICAgIC8vIGNvbXBhcmUgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhlIDIga2V5IHN0b3JlcyBmb3IgYWxsIGFsaWFzZXMKLSAgICAgICAgY29tcGFyZUNyZWF0aW9uRGF0ZShrcywga3MyLCBudW1FbnRyaWVzKTsKLQotICAgIH0KLQotICAgIC8vIGNoZWNrIGtleSBzdG9yZSB0eXBlCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrVHlwZShLZXlTdG9yZSBvYmosIFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIGlmICghb2JqLmdldFR5cGUoKS5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFUlJPUjogd3Jvbmcga2V5IHN0b3JlIHR5cGUiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNoZWNrIHRoZSBleGlzdGluZyBhbGlhc2VzCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWxpYXMoS2V5U3RvcmUgb2JqLCBpbnQgcmFuZ2UpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgcmFuZ2U7IGsrKykgewotICAgICAgICAgICAgaWYgKCFvYmouY29udGFpbnNBbGlhcyhBTElBU19IRUFEICsgaykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRVJST1I6IGFsaWFzICgiICsgawotICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBzaG91bGQgZXhpc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvbXBhcmUgdGhlIGNyZWF0aW9uIGRhdGVzIC0gdHJ1ZSBpZiBhbGwgdGhlIHNhbWUKLSAgICBwcml2YXRlIHZvaWQgY29tcGFyZUNyZWF0aW9uRGF0ZShLZXlTdG9yZSBvMSwgS2V5U3RvcmUgbzIsIGludCByYW5nZSkKLSAgICAgICAgICAgIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBhbGlhczsKLSAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCByYW5nZTsgaysrKSB7Ci0gICAgICAgICAgICBhbGlhcyA9IEFMSUFTX0hFQUQgKyBrOwotICAgICAgICAgICAgaWYgKCFvMS5nZXRDcmVhdGlvbkRhdGUoYWxpYXMpLmVxdWFscyhvMi5nZXRDcmVhdGlvbkRhdGUoYWxpYXMpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFUlJPUjogZW50cnkgY3JlYXRpb24gdGltZSAoIiArIGsKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIikgZGlmZmVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2hlY2tzIGlmIGFuIGV4Y2VwdGlvbiB3YXMgY2F1c2VkIGJ5IHNwZWNpZmllZCBleGNlcHRpb24gY2xhc3MKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhdXNlZEJ5KEV4Y2VwdGlvbiBlLCBDbGFzcyBrbGFzcykgewotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlOwotICAgICAgICB3aGlsZSAoKGNhdXNlID0gY2F1c2UuZ2V0Q2F1c2UoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNhdXNlLmdldENsYXNzKCkuZXF1YWxzKGtsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvS2V5U3RvcmUvVGVzdEtleVN0b3JlRW50cnkuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvS2V5U3RvcmUvVGVzdEtleVN0b3JlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4YzczYS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L0tleVN0b3JlL1Rlc3RLZXlTdG9yZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5vdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7Ci1pbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKLWltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA0ODYyMQotICogQHN1bW1hcnkgVGVzdCB0aGUgYmFzaWMgb3BlcmF0aW9ucyBvZiBLZXlTdG9yZSBlbnRyeSwgcHJvdmlkZWQgYnkgU3VuSkNFCi0gKiAgKGpjZWtzKSwgYW5kIFN1blBLQ1MxMS1Tb2xhcmlzKFBLQ1MxMUtleVN0b3JlKQotICogQGF1dGhvciBZdS1DaGluZyBWYWxlcmllIFBFTkcKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGVzdEtleVN0b3JlRW50cnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBQQVNTV0RLID0gbmV3IGNoYXJbXSB7Ci0gICAgICAgICAgICAndCcsICdlJywgJ3InLCAnYycsICdlJywgJ3MnCi0gICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gUEFTU1dERiA9IG5ldyBTdHJpbmcoImd1YXJkaWFuIEFuZ2VsIikKLSAgICAgICAgICAgIC50b0NoYXJBcnJheSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEtTX0FMR09TID0gewotICAgICAgICAgICAgIkRFUyIsICJERVNlZGUiLCAiQmxvd2Zpc2giCi0gICAgfTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX0FMR09TID0gS1NfQUxHT1MubGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gS1NfVFlQRSA9IHsKLSAgICAgICAgICAgICJqa3MiLCAiamNla3MiLCAicGtjczEyIiwgIlBLQ1MxMUtleVN0b3JlIgotICAgIH07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPX1RZUEUgPSB7Ci0gICAgICAgICAgICAiU1VOIiwgIlN1bkpDRSIsICJTdW5KU1NFIiwgIlN1blBLQ1MxMS1Tb2xhcmlzIgotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlY3JldEtleVtdIHNrcyA9IG5ldyBTZWNyZXRLZXlbTlVNX0FMR09TXTsKLQotICAgIFRlc3RLZXlTdG9yZUVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIGdlbmVyYXRlIHNlY3JldCBrZXlzIHdoaWNoIGFyZSB0byBiZSBzdG9yZWQgaW4gdGhlIGpjZQotICAgICAgICAvLyBrZXkgc3RvcmUgb2JqZWN0Ci0gICAgICAgIEtleUdlbmVyYXRvcltdIGtncyA9IG5ldyBLZXlHZW5lcmF0b3JbTlVNX0FMR09TXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQUxHT1M7IGkrKykgewotICAgICAgICAgICAga2dzW2ldID0gS2V5R2VuZXJhdG9yLmdldEluc3RhbmNlKEtTX0FMR09TW2ldLCAiU3VuSkNFIik7Ci0gICAgICAgICAgICBza3NbaV0gPSBrZ3NbaV0uZ2VuZXJhdGVLZXkoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RLZXlTdG9yZUVudHJ5IGpzdGVzdCA9IG5ldyBUZXN0S2V5U3RvcmVFbnRyeSgpOwotICAgICAgICBqc3Rlc3QucnVuKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoKTsKLSAgICAgICAgZm9yIChQcm92aWRlciBwOiBwcm92aWRlcnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcnZOYW1lID0gcC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAocHJ2TmFtZS5zdGFydHNXaXRoKCJTdW5KQ0UiKQotICAgICAgICAgICAgICAgICAgICB8fCBwcnZOYW1lLnN0YXJ0c1dpdGgoIlN1blBLQ1MxMS1Tb2xhcmlzIikpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBydW5UZXN0KHApOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiVGVzdCB3aXRoIHByb3ZpZGVyICIgKyBwLmdldE5hbWUoKSArICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhc3NlZCIpOwotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5zZWN1cml0eS5LZXlTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcnZOYW1lLnN0YXJ0c1dpdGgoIlN1blBLQ1MxMS1Tb2xhcmlzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJLZXlTdG9yZUV4Y2VwdGlvbiBpcyBleHBlY3RlZCBiZWNhdXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiUEtDUzExS2V5U3RvcmUgaXMgaW52YWxpZCBrZXlzdG9yZSB0eXBlLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW5UZXN0KFByb3ZpZGVyIHApIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oImpjZWtzIik7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oImpjZWtzIik7KSB7Ci0KLSAgICAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoImpjZWtzIiwgcCk7Ci0gICAgICAgICAgICAvLyBjcmVhdGUgYW4gZW1wdHkga2V5IHN0b3JlCi0gICAgICAgICAgICBrcy5sb2FkKG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICAvLyBzdG9yZSB0aGUgc2VjcmV0IGtleXMKLSAgICAgICAgICAgIFN0cmluZyBhbGlhc0hlYWQgPSBuZXcgU3RyaW5nKCJzZWNyZXRLZXkiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTlVNX0FMR09TOyBqKyspIHsKLSAgICAgICAgICAgICAgICBrcy5zZXRLZXlFbnRyeShhbGlhc0hlYWQgKyBqLCBza3Nbal0sIFBBU1NXREssIG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSB0aGUga2V5IHN0b3JlIG91dCB0byBhIGZpbGUKLSAgICAgICAgICAgIGtzLnN0b3JlKGZvcywgUEFTU1dERik7Ci0gICAgICAgICAgICAvLyB3aXBlIGNsZWFuIHRoZSBleGlzdGluZyBrZXkgc3RvcmUKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgTlVNX0FMR09TOyBrKyspIHsKLSAgICAgICAgICAgICAgICBrcy5kZWxldGVFbnRyeShhbGlhc0hlYWQgKyBrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChrcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFUlJPUjogcmUtaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlbG9hZCB0aGUga2V5IHN0b3JlIHdpdGggdGhlIGZpbGUKLSAgICAgICAgICAgIGtzLmxvYWQoZmlzLCBQQVNTV0RGKTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGludGVncml0eS92YWxpZGF0eSBvZiB0aGUga2V5IHN0b3JlCi0gICAgICAgICAgICBLZXkgdGVtcCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgYWxpYXMgPSBudWxsOwotICAgICAgICAgICAgaWYgKGtzLnNpemUoKSAhPSBOVU1fQUxHT1MpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRVJST1I6IHdyb25nIG51bWJlciBvZiBrZXkiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZW50cmllcyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IGtzLnNpemUoKTsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgYWxpYXMgPSBhbGlhc0hlYWQgKyBtOwotICAgICAgICAgICAgICAgIHRlbXAgPSBrcy5nZXRLZXkoYWxpYXMsIFBBU1NXREspOwotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIGtleXMKLSAgICAgICAgICAgICAgICBpZiAoIXRlbXAuZXF1YWxzKHNrc1ttXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVSUk9SOiBrZXkgY29tcGFyaXNvbiAoIiArIG0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIGZhaWxlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgdHlwZSBvZiBrZXkKLSAgICAgICAgICAgICAgICBpZiAoa3MuaXNDZXJ0aWZpY2F0ZUVudHJ5KGFsaWFzKSB8fCAha3MuaXNLZXlFbnRyeShhbGlhcykpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVSUk9SOiB0eXBlIGlkZW50aWZpY2F0aW9uICgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtICsgIikgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L0V4dGVuc2libGVQb2xpY3lUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L0V4dGVuc2libGVQb2xpY3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDA0NTEuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBUVkphci5UVlBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOwotCi0vKioKLSAqIEB0ZXN0IEBidWcgODA1MDQwMgotICogQHN1bW1hcnkgQ2hlY2sgcG9saWN5IGlzIGV4dGVuc2libGUgd2l0aCB1c2VyIGRlZmluZWQgcGVybWlzc2lvbnMKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3BvbGljeT1FeHRlbnNpYmxlUG9saWN5VGVzdDEucG9saWN5Ci0gKiAgICAgIEV4dGVuc2libGVQb2xpY3lUZXN0IGZhbHNlCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS9wb2xpY3k9RXh0ZW5zaWJsZVBvbGljeVRlc3QyLnBvbGljeQotICogICAgICBFeHRlbnNpYmxlUG9saWN5VGVzdCB0cnVlCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS9wb2xpY3k9RXh0ZW5zaWJsZVBvbGljeVRlc3QzLnBvbGljeQotICogICAgICBFeHRlbnNpYmxlUG9saWN5VGVzdCB0cnVlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlUG9saWN5VGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gRXh0ZW5zaWJsZVBvbGljeVRlc3QxLnBvbGljeTogcG9saWN5IGZpbGUgZ3JhbnRzIHBlcm1pc3Npb24gdG8KLSAgICAgICAgLy8gd2F0Y2ggVFZDaGFubmVsIDMtNgotICAgICAgICAvLyBFeHRlbnNpYmxlUG9saWN5VGVzdDIucG9saWN5OiBwb2xpY3kgZmlsZSBncmFudHMgcGVybWlzc2lvbiB0bwotICAgICAgICAvLyB3YXRjaCBUVkNoYW5lbCA0Ci0gICAgICAgIC8vIEV4dGVuc2libGVQb2xpY3lUZXN0My5wb2xpY3k6IHBvbGljeSBmaWxlIGdyYW50cyBwZXJtaXNzaW9uIHNpZ25lZAotICAgICAgICAvLyBieSBkdWtlMiB0byB3YXRjaCBUVkNoYW5lbCA1Ci0KLSAgICAgICAgVFZQZXJtaXNzaW9uIHBlcm0gPSBuZXcgVFZQZXJtaXNzaW9uKCJjaGFubmVsOjUiLCAid2F0Y2giKTsKLSAgICAgICAgYm9vbGVhbiBnZXRFeGNlcHRpb24gPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UgPSBudWxsOwotICAgICAgICBib29sZWFuIGV4cGVjdEV4Y2VwdGlvbiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGFyZ3NbMF0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24ocGVybSk7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICBnZXRFeGNlcHRpb24gPSB0cnVlOwotICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZSA9IHNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHBlY3RFeGNlcHRpb24gXiBnZXRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IEZhaWxlZDogZXhwZWN0RXhjZXB0aW9uID0gIgotICAgICAgICAgICAgICAgICAgICArIGV4cGVjdEV4Y2VwdGlvbiArICIgZ2V0RXhjZXB0aW9uID0gIiArIGdldEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICArICJcbiIgKyBleGNlcHRpb25NZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdDEucG9saWN5IGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdDEucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM1ZGYyLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvUG9saWN5L0V4dGVuc2libGVQb2xpY3kvRXh0ZW5zaWJsZVBvbGljeVRlc3QxLnBvbGljeQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZ3JhbnQgewotCXBlcm1pc3Npb24gVFZKYXIuVFZQZXJtaXNzaW9uICJjaGFubmVsOjMtNiIsICJ3YXRjaCI7Ci19OwotCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L0V4dGVuc2libGVQb2xpY3lUZXN0Mi5wb2xpY3kgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L0V4dGVuc2libGVQb2xpY3lUZXN0Mi5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDc3MDQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdDIucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1ncmFudCB7Ci0JcGVybWlzc2lvbiBUVkphci5UVlBlcm1pc3Npb24gImNoYW5uZWw6NCIsICJ3YXRjaCI7Ci19OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdDMucG9saWN5IGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5VGVzdDMucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUzMDAwLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvUG9saWN5L0V4dGVuc2libGVQb2xpY3kvRXh0ZW5zaWJsZVBvbGljeVRlc3QzLnBvbGljeQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAota2V5c3RvcmUgImZpbGU6JHt1c2VyLmRpcn0vZXBrZXlzdG9yZSI7Ci0KLWdyYW50IHsKLQlwZXJtaXNzaW9uIFRWSmFyLlRWUGVybWlzc2lvbiAiY2hhbm5lbDo1IiwgIndhdGNoIiwgU2lnbmVkQnkgImR1a2UyIjsKLX07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5V2l0aEphclRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvUG9saWN5L0V4dGVuc2libGVQb2xpY3kvRXh0ZW5zaWJsZVBvbGljeVdpdGhKYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjc3YjkuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9FeHRlbnNpYmxlUG9saWN5V2l0aEphclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IFRWSmFyLlRWUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuUHJvY2Vzc1Rvb2xzOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5KYXJVdGlsczsKLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MDUwNDAyCi0gKiBAc3VtbWFyeSBDaGVjayBwb2xpY3kgaXMgZXh0ZW5zaWJsZSB3aXRoIHVzZXIgZGVmaW5lZCBwZXJtaXNzaW9ucwotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQGNvbXBpbGUgVFZKYXIvVFZQZXJtaXNzaW9uLmphdmEKLSAqIEBydW4gbWFpbiBFeHRlbnNpYmxlUG9saWN5V2l0aEphclRlc3QKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2libGVQb2xpY3lXaXRoSmFyVGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIEZTID0gRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBQUyA9IEZpbGUucGF0aFNlcGFyYXRvcjsKLSAgICAgICAgZmluYWwgU3RyaW5nIFBPTCA9ICJFeHRlbnNpYmxlUG9saWN5VGVzdDMucG9saWN5IjsKLSAgICAgICAgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5qZGsiKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIEtFWVRPT0wgPSBKQVZBX0hPTUUgKyBGUyArICJiaW4iICsgRlMgKyAia2V5dG9vbCI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBKQVJTSUdORVIgPSBKQVZBX0hPTUUgKyBGUyArICJiaW4iICsgRlMgKyAiamFyc2lnbmVyIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIEtFWVNUT1JFID0gImVwa2V5c3RvcmUiOwotICAgICAgICBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgICAgICBmaW5hbCBTdHJpbmcgQUxJQVMgPSAiZHVrZTIiOwotICAgICAgICBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmNsYXNzLnBhdGgiLCAiIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBURVNUQ0xBU1NFUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5jbGFzc2VzIiwgIiIpOwotICAgICAgICBmaW5hbCBTdHJpbmcgVFZQRVJNSkFSID0gInR2UGVybS5qYXIiOwotICAgICAgICBmaW5hbCBTdHJpbmcgUEFUSFRPSkFSID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIsICIiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZTICsgVFZQRVJNSkFSOwotCi0gICAgICAgIC8vIGNyZWF0ZSBqYXIgZmlsZSBmb3IgVFZwZXJtaXNzaW9uCi0gICAgICAgIG5ldyBGaWxlKCJUVkphciIpLm1rZGlyKCk7Ci0gICAgICAgIEZpbGVzLmNvcHkoUGF0aHMuZ2V0KFRFU1RDTEFTU0VTICsgRlMgKyAiVFZKYXIiLCAiVFZQZXJtaXNzaW9uLmNsYXNzIiksCi0gICAgICAgICAgICAgICAgUGF0aHMuZ2V0KCJUVkphciIsICJUVlBlcm1pc3Npb24uY2xhc3MiKSk7Ci0gICAgICAgIEZpbGVzLmNvcHkoUGF0aHMuZ2V0KFRFU1RDTEFTU0VTICsgRlMgKyAiVFZKYXIiLAotICAgICAgICAgICAgICAgICJUVlBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzIiksCi0gICAgICAgICAgICAgICAgUGF0aHMuZ2V0KCJUVkphciIsICJUVlBlcm1pc3Npb25Db2xsZWN0aW9uLmNsYXNzIikpOwotICAgICAgICBKYXJVdGlscy5jcmVhdGVKYXIoVFZQRVJNSkFSLCAiVFZKYXIvVFZQZXJtaXNzaW9uLmNsYXNzIiwKLSAgICAgICAgICAgICAgICAiVFZKYXIvVFZQZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzcyIpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBrZXkgcGFpciBmb3IgamFyIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBBTElBUywKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXR5cGUiLCAiSktTIiwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgImNuPUJsYWgiLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQKLSAgICAgICAgKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotICAgICAgICAvLyBzaWduIGphcgotICAgICAgICBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFRWUEVSTUpBUiwKLSAgICAgICAgICAgICAgICBBTElBUykuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLSAgICAgICAgLy8gYWRkIGphciBmaWxlIHRvIGNsYXNzcGF0aAotICAgICAgICBTdHJpbmcgY3AgPSBQQVRIVE9KQVIgKyBQUyArIENMQVNTUEFUSDsKLQotICAgICAgICAvLyBwb2xpY3kgZmlsZSBncmFudHMgcGVybWlzc2lvbiBzaWduZWQgYnkgZHVrZTIgdG8gd2F0Y2ggVFZDaGFuZWwgNQotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nW10gY21kID0gewotICAgICAgICAgICAgIi1jbGFzc3BhdGgiLCBjcCwKLSAgICAgICAgICAgICItRGphdmEuc2VjdXJpdHkubWFuYWdlciIsCi0gICAgICAgICAgICAiLURqYXZhLnNlY3VyaXR5LnBvbGljeT0iICsgUE9MLAotICAgICAgICAgICAgIkV4dGVuc2libGVQb2xpY3lUZXN0X29yaWckVGVzdE1haW4ifTsKLSAgICAgICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlVGVzdEp2bShjbWQpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHRlbnNpYmxlUG9saWN5V2l0aEphclRlc3QgRmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1haW4gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7Ci0gICAgICAgICAgICBUVlBlcm1pc3Npb24gcGVybSA9IG5ldyBUVlBlcm1pc3Npb24oImNoYW5uZWw6NSIsICJ3YXRjaCIpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihwZXJtKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L1RWSmFyL1RWUGVybWlzc2lvbi5qYXZhIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9Qb2xpY3kvRXh0ZW5zaWJsZVBvbGljeS9UVkphci9UVlBlcm1pc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhYjc2My4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1BvbGljeS9FeHRlbnNpYmxlUG9saWN5L1RWSmFyL1RWUGVybWlzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotcGFja2FnZSBUVkphcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ0pvaW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVFZQZXJtaXNzaW9uIGV4dGVuZHMgUGVybWlzc2lvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBXYXRjaAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBXQVRDSCA9IDB4MTsKLQotICAgIC8qKgotICAgICAqIFByZXZpZXcKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUFJFVklFVyA9IDB4MjsKLQotICAgIC8qKgotICAgICAqIE5vIGFjdGlvbnMKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTk9ORSA9IDB4MDsKLQotICAgIC8qKgotICAgICAqIEFsbCBhY3Rpb25zCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEFMTCA9IFdBVENIIHwgUFJFVklFVzsKLQotICAgIC8vIHRoZSBhY3Rpb25zIG1hc2sKLSAgICBwcml2YXRlIGludCBtYXNrOwotCi0gICAgLy8gdGhlIGFjdGlvbnMgc3RyaW5nCi0gICAgcHJpdmF0ZSBTdHJpbmcgYWN0aW9uczsKLQotICAgIC8vIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgY2hhbm5lbAotICAgIHByaXZhdGUgU3RyaW5nIGNuYW1lOwotCi0gICAgLy8gdHJ1ZSBpZiB0aGUgY2hhbm5lbG5hbWUgaXMgYSB3aWxkY2FyZAotICAgIHByaXZhdGUgYm9vbGVhbiB3aWxkY2FyZDsKLQotICAgIC8vIG51bSByYW5nZSBvbiBjaGFubmVsCi0gICAgcHJpdmF0ZSBpbnRbXSBudW1yYW5nZTsKLQotICAgIC8vIHZhcmlvdXMgbnVtIGNvbnN0YW50cwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fTUlOID0gMTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTlVNX01BWCA9IDEyODsKLQotICAgIHB1YmxpYyBUVlBlcm1pc3Npb24oU3RyaW5nIGNoYW5uZWwsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgdGhpcyhjaGFubmVsLCBnZXRNYXNrKGFjdGlvbikpOwotICAgIH0KLQotICAgIFRWUGVybWlzc2lvbihTdHJpbmcgY2hhbm5lbCwgaW50IG1hc2spIHsKLSAgICAgICAgc3VwZXIoY2hhbm5lbCk7Ci0gICAgICAgIGluaXQoY2hhbm5lbCwgbWFzayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50W10gcGFyc2VOdW0oU3RyaW5nIG51bSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGlmIChudW0gPT0gbnVsbCB8fCBudW0uZXF1YWxzKCIiKSB8fCBudW0uZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgIHdpbGRjYXJkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgaW50W117TlVNX01JTiwgTlVNX01BWH07Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZGFzaCA9IG51bS5pbmRleE9mKCctJyk7Ci0KLSAgICAgICAgaWYgKGRhc2ggPT0gLTEpIHsKLSAgICAgICAgICAgIGludCBwID0gMDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcCA9IEludGVnZXIucGFyc2VJbnQobnVtKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGlucHV0IiArIG51bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGludFtde3AsIHB9OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGxvdyA9IG51bS5zdWJzdHJpbmcoMCwgZGFzaCk7Ci0gICAgICAgICAgICBTdHJpbmcgaGlnaCA9IG51bS5zdWJzdHJpbmcoZGFzaCArIDEpOwotICAgICAgICAgICAgaW50IGwsIGg7Ci0KLSAgICAgICAgICAgIGlmIChsb3cuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGwgPSBOVU1fTUlOOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBsID0gSW50ZWdlci5wYXJzZUludChsb3cpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBpbnB1dCIgKyBudW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhpZ2guZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGggPSBOVU1fTUFYOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBoID0gSW50ZWdlci5wYXJzZUludChoaWdoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgaW5wdXQiICsgbnVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaCA8IGwgfHwgbCA8IE5VTV9NSU4gfHwgaCA+IE5VTV9NQVgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG51bSByYW5nZSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IGludFtde2wsIGh9OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSB0aGUgVFZQZXJtaXNzaW9uIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXQoU3RyaW5nIGNoYW5uZWwsIGludCBtYXNrKSB7Ci0KLSAgICAgICAgLy8gUGFyc2UgdGhlIGNoYW5uZWwgbmFtZS4KLSAgICAgICAgaW50IHNlcCA9IGNoYW5uZWwuaW5kZXhPZignOicpOwotCi0gICAgICAgIGlmIChzZXAgIT0gLTEpIHsKLSAgICAgICAgICAgIFN0cmluZyBudW0gPSBjaGFubmVsLnN1YnN0cmluZyhzZXAgKyAxKTsKLSAgICAgICAgICAgIGNuYW1lID0gY2hhbm5lbC5zdWJzdHJpbmcoMCwgc2VwKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbnVtcmFuZ2UgPSBwYXJzZU51bShudW0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG51bSByYW5nZTogIiArIG51bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1yYW5nZSA9IG5ldyBpbnRbXXtOVU1fTUlOLCBOVU1fTUFYfTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgYW4gYWN0aW9uIHN0cmluZyB0byBhbiBpbnRlZ2VyIGFjdGlvbnMgbWFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBhY3Rpb24gbWFzawotICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBpbnQgZ2V0TWFzayhTdHJpbmcgYWN0aW9uKSB7Ci0gICAgICAgIGludCBtYXNrID0gTk9ORTsKLQotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXNrOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY3Rpb24udG9Mb3dlckNhc2UoKSwgIiwiKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uZXF1YWxzKCJ3YXRjaCIpKSB7Ci0gICAgICAgICAgICAgICAgbWFzayB8PSBXQVRDSDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uZXF1YWxzKCJwcmV2aWV3IikpIHsKLSAgICAgICAgICAgICAgICBtYXNrIHw9IFBSRVZJRVc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgVFYgcGVybWlzc2lvbjogIiArIHRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFzazsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcCkgewotICAgICAgICBpZiAoIShwIGluc3RhbmNlb2YgVFZQZXJtaXNzaW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRoaXMud2lsZGNhcmQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgVFZQZXJtaXNzaW9uIHRoYXQgPSAoVFZQZXJtaXNzaW9uKSBwOwotCi0gICAgICAgIGlmICgodGhpcy5tYXNrICYgdGhhdC5tYXNrKSAhPSB0aGF0Lm1hc2spIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWFza3MgYXJlIG5vdCBvayB0aGlzID0gIgotICAgICAgICAgICAgICAgICAgICArIHRoaXMubWFzayArICJUSGF0ID0gIiArIHRoYXQubWFzayk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHRoaXMubnVtcmFuZ2VbMF0gPiB0aGF0Lm51bXJhbmdlWzBdKQotICAgICAgICAgICAgICAgIHx8ICh0aGlzLm51bXJhbmdlWzFdIDwgdGhhdC5udW1yYW5nZVsxXSkpIHsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIDA9ICIgKyB0aGlzLm51bXJhbmdlWzBdCi0gICAgICAgICAgICAgICAgICAgICsgIiAxID0gIiArIHRoaXMubnVtcmFuZ2VbMV0pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGF0IDA9ICIgKyB0aGF0Lm51bXJhbmdlWzBdCi0gICAgICAgICAgICAgICAgICAgICsgIiAxID0gIiArIHRoYXQubnVtcmFuZ2VbMV0pOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0d28gVFZQZXJtaXNzaW9uIG9iamVjdHMgZm9yIGVxdWFsaXR5LgotICAgICAqIDxwPgotICAgICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB3ZSBhcmUgdGVzdGluZyBmb3IgZXF1YWxpdHkuCi0gICAgICogQHJldHVybiB0cnVlIGlmIG9iaiBpcyBhIFRWUGVybWlzc2lvbiwgYW5kIGhhcyB0aGUgc2FtZSBjaGFubmVsbmFtZSBhbmQKLSAgICAgKiBhY3Rpb24gbWFzayBhcyB0aGlzIFRWUGVybWlzc2lvbiBvYmplY3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRWUGVybWlzc2lvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFRWUGVybWlzc2lvbiB0aGF0ID0gKFRWUGVybWlzc2lvbikgb2JqOwotCi0gICAgICAgIC8vIGNoZWNrIHRoZSBtYXNrIGZpcnN0Ci0gICAgICAgIGlmICh0aGlzLm1hc2sgIT0gdGhhdC5tYXNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgY2hlY2sgdGhlIG51bSByYW5nZS4uLgotICAgICAgICBpZiAoKHRoaXMubnVtcmFuZ2VbMF0gIT0gdGhhdC5udW1yYW5nZVswXSkKLSAgICAgICAgICAgICAgICB8fCAodGhpcy5udW1yYW5nZVsxXSAhPSB0aGF0Lm51bXJhbmdlWzFdKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyh0aGF0LmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0aW9ucy4gQWx3YXlzIHJldHVybnMKLSAgICAgKiBhY3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IHdhdGNoLHByZXZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWFzayBhIHNwZWNpZmljIGludGVnZXIgYWN0aW9uIG1hc2sgdG8gdHJhbnNsYXRlIGludG8gYSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3Rpb25zCi0gICAgICovCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIFN0cmluZyBnZXRBY3Rpb25zKGludCBtYXNrKSB7Ci0gICAgICAgIFN0cmluZ0pvaW5lciBzaiA9IG5ldyBTdHJpbmdKb2luZXIoIiwiKTsKLSAgICAgICAgaWYgKChtYXNrICYgV0FUQ0gpID09IFdBVENIKSB7Ci0gICAgICAgICAgICBzai5hZGQoIndhdGNoIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtYXNrICYgUFJFVklFVykgPT0gUFJFVklFVykgewotICAgICAgICAgICAgc2ouYWRkKCJwcmV2aWV3Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNqLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3Rpb25zLiBBbHdheXMgcmV0dXJucwotICAgICAqIGFjdGlvbnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogd2F0Y2gscHJldmlldy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdGlvbnMuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewotICAgICAgICBpZiAoYWN0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY3Rpb25zID0gZ2V0QWN0aW9ucyh0aGlzLm1hc2spOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFjdGlvbnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyAiY25hbWUgPSAiICsgY25hbWUgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyAid2lsZGNhcmQgPSAiICsgd2lsZGNhcmQgKyAiXG4iCi0gICAgICAgICAgICAgICAgKyAibnVtcmFuZ2UgPSAiICsgbnVtcmFuZ2VbMF0gKyAiLCIgKyBudW1yYW5nZVsxXSArICJcbiI7Ci0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVFZQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwotICAgIH0KLX0KLQotZmluYWwgY2xhc3MgVFZQZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIFBlcm1pc3Npb25Db2xsZWN0aW9uIHsKLQotICAgIC8qKgotICAgICAqIFRoZSBUVlBlcm1pc3Npb25zIGZvciB0aGlzIHNldC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxUVlBlcm1pc3Npb24+IHBlcm1pc3Npb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgVFZQZXJtaXNzaW9ucy4gVGhlIGtleSBmb3IgdGhlIGhhc2ggaXMgdGhlIG5hbWUKLSAgICAgKiBpbiB0aGUgY2FzZSBvZiB3aWxkY2FyZHMsIG9yIGFsbCB0aGUgSVAgYWRkcmVzc2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHBlcm1pc3Npb24gdGhlIFBlcm1pc3Npb24gb2JqZWN0IHRvIGFkZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGQoUGVybWlzc2lvbiBwZXJtaXNzaW9uKSB7Ci0gICAgICAgIGlmICghKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBUVlBlcm1pc3Npb24pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHBlcm1pc3Npb246ICIgKyBwZXJtaXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBwZXJtaXNzaW9ucy5hZGQoKFRWUGVybWlzc2lvbikgcGVybWlzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgYW5kIHNlZSBpZiB0aGlzIGNvbGxlY3Rpb24gb2YgcGVybWlzc2lvbnMgaW1wbGllcyB0aGUgcGVybWlzc2lvbnMKLSAgICAgKiBleHByZXNzZWQgaW4gInBlcm1pc3Npb24iLgotICAgICAqCi0gICAgICogQHBhcmFtIHAgdGhlIFBlcm1pc3Npb24gb2JqZWN0IHRvIGNvbXBhcmUKLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiAicGVybWlzc2lvbiIgaXMgYSBwcm9wZXIgc3Vic2V0IG9mIGEgcGVybWlzc2lvbiBpbiB0aGUKLSAgICAgKiBjb2xsZWN0aW9uLCBmYWxzZSBpZiBub3QuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHApIHsKLSAgICAgICAgaWYgKCEocCBpbnN0YW5jZW9mIFRWUGVybWlzc2lvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEl0ZXJhdG9yPFRWUGVybWlzc2lvbj4gaSA9IHBlcm1pc3Npb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgaWYgKCgoVFZQZXJtaXNzaW9uKSBpLm5leHQoKSkuaW1wbGllcyhwKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCB0aGUgVFZQZXJtaXNzaW9uIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSBUVlBlcm1pc3Npb24gb2JqZWN0cy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihwZXJtaXNzaW9ucyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyZVJhbmRvbS9EZWZhdWx0UHJvdmlkZXIuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tL0RlZmF1bHRQcm92aWRlci5qYXZhCmluZGV4IDU5N2YyMzUuLjUwYjQ3MTkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tL0RlZmF1bHRQcm92aWRlci5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJlUmFuZG9tL0RlZmF1bHRQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDMsNyArNDMsMTIgQEAKICAgICAgICAgb3V0LnByaW50bG4oIlRFU1Q6IERlZmF1bHQgcHJvdmlkZXIgd2l0aCBjb25zdHJ1Y3RvciIpOwogICAgICAgICBTZWN1cmVSYW5kb20gc2VjdXJlUmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogICAgICAgICBTdHJpbmcgcHJvdmlkZXIgPSBzZWN1cmVSYW5kb20uZ2V0UHJvdmlkZXIoKS5nZXROYW1lKCk7Ci0gICAgICAgIGlmICghcHJvdmlkZXIuZXF1YWxzKCJTVU4iKSkgeworICAgICAgICBpZiAoT1NfTkFNRS5zdGFydHNXaXRoKFNVTk9TKSkgeworICAgICAgICAgICAgaWYgKCFwcm92aWRlci5zdGFydHNXaXRoKCJTdW5QS0NTMTEtIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBwcm92aWRlciBuYW1lOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghcHJvdmlkZXIuZXF1YWxzKCJTVU4iKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcHJvdmlkZXIgbmFtZTogIgogICAgICAgICAgICAgICAgICAgICArIHByb3ZpZGVyKTsKICAgICAgICAgfQpAQCAtNzIsNiArNzcsMTYgQEAKICAgICAgICAgaW5zdGFuY2UgPSBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKICAgICAgICAgYXNzZXJ0SW5zdGFuY2UoaW5zdGFuY2UsIGFsZ29yaXRobSwgcHJvdmlkZXIpOwogICAgICAgICBvdXQucHJpbnRsbigiUGFzc2VkLiIpOworCisgICAgICAgIGlmIChPU19OQU1FLnN0YXJ0c1dpdGgoU1VOT1MpKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgIlRFU1Q6IFBLQ1MxMSBpcyBzdXBwb3J0ZWQgb24gU29sYXJpcyBieSBTdW5QS0NTMTEgcHJvdmlkZXIiKTsKKyAgICAgICAgICAgIGFsZ29yaXRobSA9ICJQS0NTMTEiOworICAgICAgICAgICAgcHJvdmlkZXIgPSAiU3VuUEtDUzExLVNvbGFyaXMiOworICAgICAgICAgICAgaW5zdGFuY2UgPSBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIGFzc2VydEluc3RhbmNlKGluc3RhbmNlLCBhbGdvcml0aG0sIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCJQYXNzZWQuIik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEluc3RhbmNlKFNlY3VyZVJhbmRvbSBpbnN0YW5jZSwKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIuamF2YQppbmRleCBiNzAyMjIxLi4yNzU1OWZmIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0FkZFByb3ZpZGVyLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9BZGRQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgODAwMTMxOSA4MTU0MDA5CisgKiBAYnVnIDgwMDEzMTkKICAqIEBzdW1tYXJ5IGNoZWNrIHRoYXQgU2VjdXJpdHlQZXJtaXNzaW9uIGluc2VydFByb3ZpZGVyIHBlcm1pc3Npb24gaXMgZW5mb3JjZWQKICAqICAgICAgICAgIGNvcnJlY3RseQogICogQHJ1biBtYWluL290aGVydm0vcG9saWN5PUFkZFByb3ZpZGVyLnBvbGljeS4xIEFkZFByb3ZpZGVyIDEKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjEgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0FkZFByb3ZpZGVyLnBvbGljeS4xCmluZGV4IDY0YjQzZDcuLjE3YTQ5YjQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjEKKysrIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9BZGRQcm92aWRlci5wb2xpY3kuMQpAQCAtMSwzICsxLDcgQEAKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7e2phdmEuZXh0LmRpcnN9fS8qIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCiBncmFudCB7CiAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiaW5zZXJ0UHJvdmlkZXIiOwogfTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjIgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0FkZFByb3ZpZGVyLnBvbGljeS4yCmluZGV4IGUyYTg2NzcuLmQ1YTdjYTkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjIKKysrIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9BZGRQcm92aWRlci5wb2xpY3kuMgpAQCAtMSwzICsxLDcgQEAKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7e2phdmEuZXh0LmRpcnN9fS8qIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCiBncmFudCB7CiAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiaW5zZXJ0UHJvdmlkZXIuVGVzdDEiOwogICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gImluc2VydFByb3ZpZGVyLlRlc3QyIjsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjMgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0FkZFByb3ZpZGVyLnBvbGljeS4zCmluZGV4IDlhMTRkYjIuLjkzMGI0NDMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvQWRkUHJvdmlkZXIucG9saWN5LjMKKysrIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9BZGRQcm92aWRlci5wb2xpY3kuMwpAQCAtMSwzICsxLDcgQEAKK2dyYW50IGNvZGVCYXNlICJmaWxlOiR7e2phdmEuZXh0LmRpcnN9fS8qIiB7CisJcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCiBncmFudCB7CiAgICAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5UGVybWlzc2lvbiAiaW5zZXJ0UHJvdmlkZXIuKiI7CiB9OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9FbXB0eVBvbGljeS5wb2xpY3kgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0VtcHR5UG9saWN5LnBvbGljeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2NDU5Mi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L0VtcHR5UG9saWN5LnBvbGljeQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLy8gZW1wdHkgcG9saWN5IGZpbGUgZm9yIHRlc3RpbmcKLQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9HZXRQcm92aWRlcnMuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvR2V0UHJvdmlkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTY2NDUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9HZXRQcm92aWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNTQwMDkKLSAqIEBzdW1tYXJ5IG1ha2Ugc3VyZSBnZXRQcm92aWRlcnMoKSBkb2Vzbid0IHJlcXVpcmUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucwotICogQHJ1biBtYWluL290aGVydm0vcG9saWN5PUVtcHR5UG9saWN5LnBvbGljeSBHZXRQcm92aWRlcnMKLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBHZXRQcm92aWRlcnMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNlcnZpY2VBbGdGaWx0ZXIgPSAiU2lnbmF0dXJlLlNIQTF3aXRoUlNBIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW1wdHlTZXJ2QWxnRmlsdGVyID0gIndyb25nU2lnLndyb25nQWxnIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgUHJvdmlkZXJbXSBwcm92aWRlcnMxID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFtb3VudCBvZiBwcm92aWRlcnMxOiAiICsgcHJvdmlkZXJzMS5sZW5ndGgpOwotCi0gICAgICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVyczIgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoc2VydmljZUFsZ0ZpbHRlcik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFtb3VudCBvZiBwcm92aWRlcnMyOiAiICsgcHJvdmlkZXJzMi5sZW5ndGgpOwotCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGZpbHRlciA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZmlsdGVyLnB1dChzZXJ2aWNlQWxnRmlsdGVyLCAiIik7Ci0gICAgICAgICAgICBQcm92aWRlcltdIHByb3ZpZGVyczMgPSBTZWN1cml0eS5nZXRQcm92aWRlcnMoZmlsdGVyKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW1vdW50IG9mIHByb3ZpZGVyczM6ICIgKyBwcm92aWRlcnMzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIFByb3ZpZGVyW10gZW1wdHlQcm92MSA9IFNlY3VyaXR5LmdldFByb3ZpZGVycyhlbXB0eVNlcnZBbGdGaWx0ZXIpOwotICAgICAgICAgICAgaWYgKGVtcHR5UHJvdjEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFbXB0eSBGaWx0ZXIgcmV0dXJuZWQ6ICIgKwotICAgICAgICAgICAgICAgICAgICBlbXB0eVByb3YxLmxlbmd0aCArICIgcHJvdmlkZXJzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVtcHR5UHJvdjEgaXMgZW1wdHkgYXMgZXhwZWN0ZWQiKTsKLQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBlbXB0eUZpbHRlciA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZW1wdHlGaWx0ZXIucHV0KGVtcHR5U2VydkFsZ0ZpbHRlciwgIiIpOwotICAgICAgICAgICAgUHJvdmlkZXJbXSBlbXB0eVByb3YyID0gU2VjdXJpdHkuZ2V0UHJvdmlkZXJzKGVtcHR5RmlsdGVyKTsKLSAgICAgICAgICAgIGlmIChlbXB0eVByb3YyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRW1wdHkgRmlsdGVyIHJldHVybmVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgZW1wdHlQcm92Mi5sZW5ndGggKyAiIHByb3ZpZGVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJlbXB0eVByb3YyIGlzIGVtcHR5IGFzIGV4cGVjdGVkIik7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24gZXJyb3IgZHVlIHRvICIKLSAgICAgICAgICAgICAgICAgICAgKyBlLmdldENhdXNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvcmVtb3ZpbmcvUmVtb3ZlU3RhdGljUHJvdmlkZXIuamF2YSBiL2pkay90ZXN0L2phdmEvc2VjdXJpdHkvU2VjdXJpdHkvcmVtb3ZpbmcvUmVtb3ZlU3RhdGljUHJvdmlkZXIuamF2YQppbmRleCAyMGQ0NDM1Li42YTAzZWM3IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L3JlbW92aW5nL1JlbW92ZVN0YXRpY1Byb3ZpZGVyLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9yZW1vdmluZy9SZW1vdmVTdGF0aWNQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgNDQyMDY4NyA4MTU0MDA5CisgKiBAYnVnIDQ0MjA2ODcKICAqIEBzdW1tYXJ5IE1ha2Ugc3VyZSB0aGF0IGEgcmVtb3ZlZCBwcm92aWRlciB3b24ndCBiZSBhY2NlZXNzYWJsZS4KICAqIEBydW4gbWFpbi9vdGhlcnZtL3BvbGljeT1SZW1vdmVTdGF0aWNQcm92aWRlci5wb2xpY3kgUmVtb3ZlU3RhdGljUHJvdmlkZXIKICAqLwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9zZWN1cml0eS9TZWN1cml0eS9yZW1vdmluZy9SZW1vdmVTdGF0aWNQcm92aWRlci5wb2xpY3kgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L3JlbW92aW5nL1JlbW92ZVN0YXRpY1Byb3ZpZGVyLnBvbGljeQppbmRleCBmMzFlNTg3Li4zYjE4NmFmIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L3JlbW92aW5nL1JlbW92ZVN0YXRpY1Byb3ZpZGVyLnBvbGljeQorKysgYi9qZGsvdGVzdC9qYXZhL3NlY3VyaXR5L1NlY3VyaXR5L3JlbW92aW5nL1JlbW92ZVN0YXRpY1Byb3ZpZGVyLnBvbGljeQpAQCAtMywzICszLDggQEAKICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJpbnNlcnRQcm92aWRlci5TdW5KQ0UiOwogfTsKIAorLy8gU3RhbmRhcmQgZXh0ZW5zaW9ucyBnZXQgYWxsIHBlcm1pc3Npb25zCitncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vbGliL2V4dC8qIiB7CisgICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS90aW1lL3Rjay9qYXZhL3RpbWUvVENLWm9uZU9mZnNldC5qYXZhIGIvamRrL3Rlc3QvamF2YS90aW1lL3Rjay9qYXZhL3RpbWUvVENLWm9uZU9mZnNldC5qYXZhCmluZGV4IDc2NDY2NDMuLmMxMjEwNzkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdGltZS90Y2svamF2YS90aW1lL1RDS1pvbmVPZmZzZXQuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3RpbWUvdGNrL2phdmEvdGltZS9UQ0tab25lT2Zmc2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MTksMjEgKzQxOSw2IEBACiAgICAgICAgIFpvbmVPZmZzZXQub2ZIb3Vyc01pbnV0ZXNTZWNvbmRzKC0xOSwgMCwgMCk7CiAgICAgfQogCi0gICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zPURhdGVUaW1lRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZmFjdG9yeV9pbnRfaG91cnNfbWludXRlc19zZWNvbmRzX21pbnV0ZXNNaW5WYWx1ZSgpIHsKLSAgICAgICAgWm9uZU9mZnNldC5vZkhvdXJzTWludXRlc1NlY29uZHMoMCwgSW50ZWdlci5NSU5fVkFMVUUsIC0xKTsKLSAgICB9Ci0KLSAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnM9RGF0ZVRpbWVFeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgdGVzdF9mYWN0b3J5X2ludF9ob3Vyc19taW51dGVzX3NlY29uZHNfc2Vjb25kc01pblZhbHVlKCkgewotICAgICAgICBab25lT2Zmc2V0Lm9mSG91cnNNaW51dGVzU2Vjb25kcygwLCAwLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWRFeGNlcHRpb25zPURhdGVUaW1lRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZmFjdG9yeV9pbnRfaG91cnNfbWludXRlc19zZWNvbmRzX21pbnV0ZXNBbmRTZWNvbmRzTWluVmFsdWUoKSB7Ci0gICAgICAgIFpvbmVPZmZzZXQub2ZIb3Vyc01pbnV0ZXNTZWNvbmRzKDAsIEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0gICAgfQotCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdF9mYWN0b3J5X29mVG90YWxTZWNvbmRzKCkgewpAQCAtNDUyLDExICs0MzcsNiBAQAogICAgICAgICBab25lT2Zmc2V0Lm9mVG90YWxTZWNvbmRzKC0xOCAqIDYwICogNjAgLSAxKTsKICAgICB9CiAKLSAgICBAVGVzdChleHBlY3RlZEV4Y2VwdGlvbnM9RGF0ZVRpbWVFeGNlcHRpb24uY2xhc3MpCi0gICAgcHVibGljIHZvaWQgdGVzdF9mYWN0b3J5X29mVG90YWxTZWNvbmRzX21pblZhbHVlKCkgewotICAgICAgICBab25lT2Zmc2V0Lm9mVG90YWxTZWNvbmRzKEludGVnZXIuTUlOX1ZBTFVFKTsKLSAgICB9Ci0KICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gZnJvbSgpCiAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS90aW1lL3Rlc3QvamF2YS90aW1lL2Zvcm1hdC9UZXN0Wm9uZVRleHRQcmludGVyUGFyc2VyLmphdmEgYi9qZGsvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1Rlc3Rab25lVGV4dFByaW50ZXJQYXJzZXIuamF2YQppbmRleCA5NDg0ZTM4Li43ODA4NjI0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1Rlc3Rab25lVGV4dFByaW50ZXJQYXJzZXIuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1Rlc3Rab25lVGV4dFByaW50ZXJQYXJzZXIuamF2YQpAQCAtNDksNyArNDksNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgODA4MTAyMiA4MTUxODc2IDgxNjY4NzUKKyAqIEBidWcgODA4MTAyMiA4MTUxODc2CiAgKiBAa2V5IHJhbmRvbW5lc3MKICAqLwogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1pvbmVOYW1lLmphdmEgYi9qZGsvdGVzdC9qYXZhL3RpbWUvdGVzdC9qYXZhL3RpbWUvZm9ybWF0L1pvbmVOYW1lLmphdmEKaW5kZXggMWZiYjkxMy4uMmM0OTQ0NiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS90aW1lL3Rlc3QvamF2YS90aW1lL2Zvcm1hdC9ab25lTmFtZS5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdGltZS90ZXN0L2phdmEvdGltZS9mb3JtYXQvWm9uZU5hbWUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3OCw3ICszNzgsNiBAQAogICAgICAgICAiRXVyb3BlL0hlbHNpbmtpIiwgIkV1cm9wZV9FYXN0ZXJuIiwgIkV1cm9wZS9CdWNoYXJlc3QiLAogICAgICAgICAiQW1lcmljYS9Ob21lIiwgIkFsYXNrYSIsICJBbWVyaWNhL0p1bmVhdSIsCiAgICAgICAgICJBc2lhL1lha3V0c2siLCAiWWFrdXRzayIsICJBc2lhL1lha3V0c2siLAotICAgICAgICAiQXNpYS9ZYW5nb24iLCAiTXlhbm1hciIsICJBc2lhL1Jhbmdvb24iLAogICAgICAgICAiQWZyaWNhL0NvbmFrcnkiLCAiR01UIiwgIkF0bGFudGljL1JleWtqYXZpayIsCiAgICAgICAgICJBc2lhL1Nlb3VsIiwgIktvcmVhIiwgIkFzaWEvU2VvdWwiLAogICAgICAgICAiQW1lcmljYS9BbnRpZ3VhIiwgIkF0bGFudGljIiwgIkFtZXJpY2EvSGFsaWZheCIsCkBAIC03NDgsNyArNzQ3LDYgQEAKICAgICAgICAgIk5aIiwgIlBhY2lmaWMvQXVja2xhbmQiLAogICAgICAgICAiQXNpYS9UZWxfQXZpdiIsICJBc2lhL0plcnVzYWxlbSIsCiAgICAgICAgICJIb25na29uZyIsICJBc2lhL0hvbmdfS29uZyIsCi0gICAgICAgICJBc2lhL1Jhbmdvb24iLCAiQXNpYS9ZYW5nb24iLAogICAgIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHppZFRvTXpvbmUgPSBuZXcgSGFzaE1hcDw+KCk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvQmFzZTY0L1Rlc3RCYXNlNjQuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9CYXNlNjQvVGVzdEJhc2U2NC5qYXZhCmluZGV4IDVkZGFhZmUuLmJiZGU1ODcgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9CYXNlNjQvVGVzdEJhc2U2NC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9CYXNlNjQvVGVzdEJhc2U2NC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsMTEgKzIzLDggQEAKIAogLyoqCiAgKiBAdGVzdCA0MjM1NTE5IDgwMDQyMTIgODAwNTM5NCA4MDA3Mjk4IDgwMDYyOTUgODAwNjMxNSA4MDA2NTMwIDgwMDczNzkgODAwODkyNQotICogICAgICAgODAxNDIxNyA4MDI1MDAzIDgwMjYzMzAgODAyODM5NyA4MTY1MjQzCisgKiAgICAgICA4MDE0MjE3IDgwMjUwMDMgODAyNjMzMCA4MDI4Mzk3CiAgKiBAc3VtbWFyeSB0ZXN0cyBqYXZhLnV0aWwuQmFzZTY0Ci0gKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5Ci0gKiBAYnVpbGQgamRrLnRlc3RsaWJyYXJ5LioKLSAqIEBydW4gbWFpbiBUZXN0QmFzZTY0CiAgKi8KIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0zNywxNyArMzQsMTEgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuUmFuZG9tRmFjdG9yeTsKLQogcHVibGljIGNsYXNzIFRlc3RCYXNlNjQgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIHJuZCA9IFJhbmRvbUZhY3RvcnkuZ2V0UmFuZG9tKCk7Ci0KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgaW50IG51bVJ1bnMgID0gMTA7CiAgICAgICAgIGludCBudW1CeXRlcyA9IDIwMDsKQEAgLTYwLDYgKzUxLDcgQEAKICAgICAgICAgdGVzdChCYXNlNjQuZ2V0VXJsRW5jb2RlcigpLCBCYXNlNjQuZ2V0VXJsRGVjb2RlcigpLCBudW1SdW5zLCBudW1CeXRlcyk7CiAgICAgICAgIHRlc3QoQmFzZTY0LmdldE1pbWVFbmNvZGVyKCksIEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLCBudW1SdW5zLCBudW1CeXRlcyk7CiAKKyAgICAgICAgUmFuZG9tIHJuZCA9IG5ldyBqYXZhLnV0aWwuUmFuZG9tKCk7CiAgICAgICAgIGJ5dGVbXSBubF8xID0gbmV3IGJ5dGVbXSB7J1xuJ307CiAgICAgICAgIGJ5dGVbXSBubF8yID0gbmV3IGJ5dGVbXSB7J1xuJywgJ1xyJ307CiAgICAgICAgIGJ5dGVbXSBubF8zID0gbmV3IGJ5dGVbXSB7J1xuJywgJ1xyJywgJ1xuJ307CkBAIC04Myw3ICs3NSw3IEBACiAgICAgICAgIHRlc3ROdWxsKEJhc2U2NC5nZXREZWNvZGVyKCkpOwogICAgICAgICB0ZXN0TnVsbChCYXNlNjQuZ2V0VXJsRGVjb2RlcigpKTsKICAgICAgICAgdGVzdE51bGwoQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkpOwotICAgICAgICBjaGVja051bGwoKCkgLT4gQmFzZTY0LmdldE1pbWVFbmNvZGVyKDEwLCBudWxsKSk7CisgICAgICAgIGNoZWNrTnVsbChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKDEwLCBudWxsKTsgfX0pOwogCiAgICAgICAgIHRlc3RJT0UoQmFzZTY0LmdldEVuY29kZXIoKSk7CiAgICAgICAgIHRlc3RJT0UoQmFzZTY0LmdldFVybEVuY29kZXIoKSk7CkBAIC05MSwyMyArODMsMjYgQEAKICAgICAgICAgdGVzdElPRShCYXNlNjQuZ2V0TWltZUVuY29kZXIoMTAsIG5ldyBieXRlW117J1xuJ30pKTsKIAogICAgICAgICBieXRlW10gc3JjID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgIHJuZC5uZXh0Qnl0ZXMoc3JjKTsKKyAgICAgICAgbmV3IFJhbmRvbSgpLm5leHRCeXRlcyhzcmMpOwogICAgICAgICBmaW5hbCBieXRlW10gZGVjb2RlZCA9IEJhc2U2NC5nZXRFbmNvZGVyKCkuZW5jb2RlKHNyYyk7CiAgICAgICAgIHRlc3RJT0UoQmFzZTY0LmdldERlY29kZXIoKSwgZGVjb2RlZCk7CiAgICAgICAgIHRlc3RJT0UoQmFzZTY0LmdldE1pbWVEZWNvZGVyKCksIGRlY29kZWQpOwogICAgICAgICB0ZXN0SU9FKEJhc2U2NC5nZXRVcmxEZWNvZGVyKCksIEJhc2U2NC5nZXRVcmxFbmNvZGVyKCkuZW5jb2RlKHNyYykpOwogCiAgICAgICAgIC8vIGlsbGVnYWwgbGluZSBzZXBhcmF0b3IKLSAgICAgICAgY2hlY2tJQUUoKCkgLT4gQmFzZTY0LmdldE1pbWVFbmNvZGVyKDEwLCBuZXcgYnl0ZVtdeydccicsICdOJ30pKTsKKyAgICAgICAgY2hlY2tJQUUobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IEJhc2U2NC5nZXRNaW1lRW5jb2RlcigxMCwgbmV3IGJ5dGVbXXsnXHInLCAnTid9KTsgfX0pOwogCiAgICAgICAgIC8vIG1hbGZvcm1lZCBwYWRkaW5nL2VuZGluZwogICAgICAgICB0ZXN0TWFsZm9ybWVkUGFkZGluZygpOwogCiAgICAgICAgIC8vIGlsbGVnYWwgYmFzZTY0IGNoYXJhY3RlcgogICAgICAgICBkZWNvZGVkWzJdID0gKGJ5dGUpMHhlMDsKLSAgICAgICAgY2hlY2tJQUUoKCkgLT4gQmFzZTY0LmdldERlY29kZXIoKS5kZWNvZGUoZGVjb2RlZCkpOwotICAgICAgICBjaGVja0lBRSgoKSAtPiBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkLCBuZXcgYnl0ZVsxMDI0XSkpOwotICAgICAgICBjaGVja0lBRSgoKSAtPiBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZShCeXRlQnVmZmVyLndyYXAoZGVjb2RlZCkpKTsKKyAgICAgICAgY2hlY2tJQUUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeyBCYXNlNjQuZ2V0RGVjb2RlcigpLmRlY29kZShkZWNvZGVkKTsgfX0pOworICAgICAgICBjaGVja0lBRShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7IEJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKGRlY29kZWQsIG5ldyBieXRlWzEwMjRdKTsgfX0pOworICAgICAgICBjaGVja0lBRShuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIEJhc2U2NC5nZXREZWNvZGVyKCkuZGVjb2RlKEJ5dGVCdWZmZXIud3JhcChkZWNvZGVkKSk7IH19KTsKIAogICAgICAgICAvLyB0ZXN0IHNpbmdsZS1ub24tYmFzZTY0IGNoYXJhY3RlciBmb3IgbWltZSBkZWNvZGluZwogICAgICAgICB0ZXN0U2luZ2xlTm9uQmFzZTY0TWltZURlYygpOwpAQCAtMTE3LDE2ICsxMTIsNiBAQAogCiAgICAgICAgIC8vIHRlc3QgbWltZSBkZWNvZGluZyB3aXRoIGlnbm9yZWQgY2hhcmFjdGVyIGFmdGVyIHBhZGRpbmcKICAgICAgICAgdGVzdERlY29kZUlnbm9yZWRBZnRlclBhZGRpbmcoKTsKLQotICAgICAgICAvLyBnaXZlbiBpbnZhbGlkIGFyZ3MsIGVuY29kZXIgc2hvdWxkIG5vdCBwcm9kdWNlIG91dHB1dAotICAgICAgICB0ZXN0RW5jb2RlcktlZXBzU2lsZW5jZShCYXNlNjQuZ2V0RW5jb2RlcigpKTsKLSAgICAgICAgdGVzdEVuY29kZXJLZWVwc1NpbGVuY2UoQmFzZTY0LmdldFVybEVuY29kZXIoKSk7Ci0gICAgICAgIHRlc3RFbmNvZGVyS2VlcHNTaWxlbmNlKEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpKTsKLQotICAgICAgICAvLyBnaXZlbiBpbnZhbGlkIGFyZ3MsIGRlY29kZXIgc2hvdWxkIG5vdCBjb25zdW1lIGlucHV0Ci0gICAgICAgIHRlc3REZWNvZGVyS2VlcHNBYnN0aW5lbmNlKEJhc2U2NC5nZXREZWNvZGVyKCkpOwotICAgICAgICB0ZXN0RGVjb2RlcktlZXBzQWJzdGluZW5jZShCYXNlNjQuZ2V0VXJsRGVjb2RlcigpKTsKLSAgICAgICAgdGVzdERlY29kZXJLZWVwc0Fic3RpbmVuY2UoQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHN1bi5taXNjLkJBU0U2NEVuY29kZXIgc3VubWlzYyA9IG5ldyBzdW4ubWlzYy5CQVNFNjRFbmNvZGVyKCk7CkBAIC0yOTcsNDkgKzI4Miw0OCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzdHJfbnVsbCA9IG51bGw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBiYl9udWxsID0gbnVsbDsKIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdE51bGwoQmFzZTY0LkVuY29kZXIgZW5jKSB7Ci0gICAgICAgIGNoZWNrTnVsbCgoKSAtPiBlbmMuZW5jb2RlKGJhX251bGwpKTsKLSAgICAgICAgY2hlY2tOdWxsKCgpIC0+IGVuYy5lbmNvZGVUb1N0cmluZyhiYV9udWxsKSk7Ci0gICAgICAgIGNoZWNrTnVsbCgoKSAtPiBlbmMuZW5jb2RlKGJhX251bGwsIG5ldyBieXRlWzEwXSkpOwotICAgICAgICBjaGVja051bGwoKCkgLT4gZW5jLmVuY29kZShuZXcgYnl0ZVsxMF0sIGJhX251bGwpKTsKLSAgICAgICAgY2hlY2tOdWxsKCgpIC0+IGVuYy5lbmNvZGUoYmJfbnVsbCkpOwotICAgICAgICBjaGVja051bGwoKCkgLT4gZW5jLndyYXAoKE91dHB1dFN0cmVhbSludWxsKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TnVsbChmaW5hbCBCYXNlNjQuRW5jb2RlciBlbmMpIHsKKyAgICAgICAgY2hlY2tOdWxsKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyBlbmMuZW5jb2RlKGJhX251bGwpOyB9fSk7CisgICAgICAgIGNoZWNrTnVsbChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgZW5jLmVuY29kZVRvU3RyaW5nKGJhX251bGwpOyB9fSk7CisgICAgICAgIGNoZWNrTnVsbChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgZW5jLmVuY29kZShiYV9udWxsLCBuZXcgYnl0ZVsxMF0pOyB9fSk7CisgICAgICAgIGNoZWNrTnVsbChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgZW5jLmVuY29kZShuZXcgYnl0ZVsxMF0sIGJhX251bGwpOyB9fSk7CisgICAgICAgIGNoZWNrTnVsbChuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsgZW5jLmVuY29kZShiYl9udWxsKTsgfX0pOworICAgICAgICBjaGVja051bGwobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGVuYy53cmFwKChPdXRwdXRTdHJlYW0pbnVsbCk7IH19KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROdWxsKEJhc2U2NC5EZWNvZGVyIGRlYykgewotICAgICAgICBjaGVja051bGwoKCkgLT4gZGVjLmRlY29kZShiYV9udWxsKSk7Ci0gICAgICAgIGNoZWNrTnVsbCgoKSAtPiBkZWMuZGVjb2RlKHN0cl9udWxsKSk7Ci0gICAgICAgIGNoZWNrTnVsbCgoKSAtPiBkZWMuZGVjb2RlKGJhX251bGwsIG5ldyBieXRlWzEwXSkpOwotICAgICAgICBjaGVja051bGwoKCkgLT4gZGVjLmRlY29kZShuZXcgYnl0ZVsxMF0sIGJhX251bGwpKTsKLSAgICAgICAgY2hlY2tOdWxsKCgpIC0+IGRlYy5kZWNvZGUoYmJfbnVsbCkpOwotICAgICAgICBjaGVja051bGwoKCkgLT4gZGVjLndyYXAoKElucHV0U3RyZWFtKW51bGwpKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3ROdWxsKGZpbmFsIEJhc2U2NC5EZWNvZGVyIGRlYykgeworICAgICAgICBjaGVja051bGwobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUoYmFfbnVsbCk7IH19KTsKKyAgICAgICAgY2hlY2tOdWxsKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyBkZWMuZGVjb2RlKHN0cl9udWxsKTsgfX0pOworICAgICAgICBjaGVja051bGwobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUoYmFfbnVsbCwgbmV3IGJ5dGVbMTBdKTsgfX0pOworICAgICAgICBjaGVja051bGwobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUobmV3IGJ5dGVbMTBdLCBiYV9udWxsKTsgfX0pOworICAgICAgICBjaGVja051bGwobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUoYmJfbnVsbCk7IH19KTsKKyAgICAgICAgY2hlY2tOdWxsKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyBkZWMud3JhcCgoSW5wdXRTdHJlYW0pbnVsbCk7IH19KTsKICAgICB9CiAKLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQogICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBUZXN0YWJsZSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdElPRShCYXNlNjQuRW5jb2RlciBlbmMpIHRocm93cyBUaHJvd2FibGUgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdElPRShmaW5hbCBCYXNlNjQuRW5jb2RlciBlbmMpIHRocm93cyBUaHJvd2FibGUgewogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oODE5Mik7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IGVuYy53cmFwKGJhb3MpOworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSBlbmMud3JhcChiYW9zKTsKICAgICAgICAgb3Mud3JpdGUobmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9KTsKICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgY2hlY2tJT0UoKCkgLT4gb3Mud3JpdGUoMTApKTsKLSAgICAgICAgY2hlY2tJT0UoKCkgLT4gb3Mud3JpdGUobmV3IGJ5dGVbXSB7MTB9KSk7Ci0gICAgICAgIGNoZWNrSU9FKCgpIC0+IG9zLndyaXRlKG5ldyBieXRlW10gezEwfSwgMSwgNCkpOworICAgICAgICBjaGVja0lPRShuZXcgVGVzdGFibGUoKSB7IHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsgb3Mud3JpdGUoMTApOyB9fSk7CisgICAgICAgIGNoZWNrSU9FKG5ldyBUZXN0YWJsZSgpIHsgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyBvcy53cml0ZShuZXcgYnl0ZVtdIHsxMH0pOyB9fSk7CisgICAgICAgIGNoZWNrSU9FKG5ldyBUZXN0YWJsZSgpIHsgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyBvcy53cml0ZShuZXcgYnl0ZVtdIHsxMH0sIDEsIDQpOyB9fSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0SU9FKEJhc2U2NC5EZWNvZGVyIGRlYywgYnl0ZVtdIGRlY29kZWQpIHRocm93cyBUaHJvd2FibGUgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdElPRShmaW5hbCBCYXNlNjQuRGVjb2RlciBkZWMsIGJ5dGVbXSBkZWNvZGVkKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZWNvZGVkKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBkZWMud3JhcChiYWlzKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBkZWMud3JhcChiYWlzKTsKICAgICAgICAgaXMucmVhZChuZXcgYnl0ZVsxMF0pOwogICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICBjaGVja0lPRSgoKSAtPiBpcy5yZWFkKCkpOwotICAgICAgICBjaGVja0lPRSgoKSAtPiBpcy5yZWFkKG5ldyBieXRlW10gezEwfSkpOwotICAgICAgICBjaGVja0lPRSgoKSAtPiBpcy5yZWFkKG5ldyBieXRlW10gezEwfSwgMSwgNCkpOwotICAgICAgICBjaGVja0lPRSgoKSAtPiBpcy5hdmFpbGFibGUoKSk7Ci0gICAgICAgIGNoZWNrSU9FKCgpIC0+IGlzLnNraXAoMjApKTsKKyAgICAgICAgY2hlY2tJT0UobmV3IFRlc3RhYmxlKCkgeyBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7IGlzLnJlYWQoKTsgfX0pOworICAgICAgICBjaGVja0lPRShuZXcgVGVzdGFibGUoKSB7IHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsgaXMucmVhZChuZXcgYnl0ZVtdIHsxMH0pOyB9fSk7CisgICAgICAgIGNoZWNrSU9FKG5ldyBUZXN0YWJsZSgpIHsgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyBpcy5yZWFkKG5ldyBieXRlW10gezEwfSwgMSwgNCk7IH19KTsKKyAgICAgICAgY2hlY2tJT0UobmV3IFRlc3RhYmxlKCkgeyBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7IGlzLmF2YWlsYWJsZSgpOyB9fSk7CisgICAgICAgIGNoZWNrSU9FKG5ldyBUZXN0YWJsZSgpIHsgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgeyBpcy5za2lwKDIwKTsgfX0pOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgY2hlY2tOdWxsKFJ1bm5hYmxlIHIpIHsKQEAgLTQzMSwxMyArNDE1LDEzIEBACiAgICAgICAgICAgICAgICAgaW50IHBvcyA9IChJbnRlZ2VyKWRhdGFbaSArIDJdOwogCiAgICAgICAgICAgICAgICAgLy8gZGVjb2RlKGJ5dGVbXSkKLSAgICAgICAgICAgICAgICBjaGVja0lBRSgoKSAtPiBkZWMuZGVjb2RlKHNyY0J5dGVzKSk7CisgICAgICAgICAgICAgICAgY2hlY2tJQUUobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUoc3JjQnl0ZXMpOyB9fSk7CiAKICAgICAgICAgICAgICAgICAvLyBkZWNvZGUoU3RyaW5nKQotICAgICAgICAgICAgICAgIGNoZWNrSUFFKCgpIC0+IGRlYy5kZWNvZGUoc3JjU3RyKSk7CisgICAgICAgICAgICAgICAgY2hlY2tJQUUobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7IGRlYy5kZWNvZGUoc3JjU3RyKTsgfX0pOwogCiAgICAgICAgICAgICAgICAgLy8gZGVjb2RlKEJ5dGVCdWZmZXIpCi0gICAgICAgICAgICAgICAgY2hlY2tJQUUoKCkgLT4gZGVjLmRlY29kZShzcmNCQikpOworICAgICAgICAgICAgICAgIGNoZWNrSUFFKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgeyBkZWMuZGVjb2RlKHNyY0JCKTsgfX0pOwogCiAgICAgICAgICAgICAgICAgLy8gd3JhcCBzdHJlYW0KICAgICAgICAgICAgICAgICBjaGVja0lPRShuZXcgVGVzdGFibGUoKSB7CkBAIC01NDcsNjcgKzUzMSw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RFbmNvZGVyS2VlcHNTaWxlbmNlKEJhc2U2NC5FbmNvZGVyIGVuYykKLSAgICAgICAgICAgIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBMaXN0PEludGVnZXI+IHZhbHMgPSBBcnJheXMuYXNMaXN0KEludGVnZXIuTUlOX1ZBTFVFLAotICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFICsgMSwgLTExMTEsIC0yLCAtMSwgMCwgMSwgMiwgMywgMTExMSwKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSAtIDEsIEludGVnZXIuTUFYX1ZBTFVFLAotICAgICAgICAgICAgICAgIHJuZC5uZXh0SW50KCksIHJuZC5uZXh0SW50KCksIHJuZC5uZXh0SW50KCksCi0gICAgICAgICAgICAgICAgcm5kLm5leHRJbnQoKSk7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtdIHsxLCAwLCA5MX07Ci0gICAgICAgIGZvciAoaW50IG9mZiA6IHZhbHMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGxlbiA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAob2ZmID49IDAgJiYgbGVuID49IDAgJiYgb2ZmIDw9IGJ1Zi5sZW5ndGggLSBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWQgYXJncywgc2tpcCB0aGVtCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGFyZ3MsIHRlc3QgdGhlbQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdGluZyBvZmY9IiArIG9mZiArICIsIGxlbj0iICsgbGVuKTsKLQotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDApOwotICAgICAgICAgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIG9zID0gZW5jLndyYXAoYmFvcykpIHsKLSAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBJT09CRXggd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiYW9zLnNpemUoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBvdXRwdXQgd2FzIGV4cGVjdGVkLCBidXQgZ290ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJhb3Muc2l6ZSgpICsgIiBieXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0RGVjb2RlcktlZXBzQWJzdGluZW5jZShCYXNlNjQuRGVjb2RlciBkZWMpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTGlzdDxJbnRlZ2VyPiB2YWxzID0gQXJyYXlzLmFzTGlzdChJbnRlZ2VyLk1JTl9WQUxVRSwKLSAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSArIDEsIC0xMTExLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDExMTEsCi0gICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgLSAxLCBJbnRlZ2VyLk1BWF9WQUxVRSwKLSAgICAgICAgICAgICAgICBybmQubmV4dEludCgpLCBybmQubmV4dEludCgpLCBybmQubmV4dEludCgpLAotICAgICAgICAgICAgICAgIHJuZC5uZXh0SW50KCkpOwotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbM107Ci0gICAgICAgIGZvciAoaW50IG9mZiA6IHZhbHMpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGxlbiA6IHZhbHMpIHsKLSAgICAgICAgICAgICAgICBpZiAob2ZmID49IDAgJiYgbGVuID49IDAgJiYgb2ZmIDw9IGJ1Zi5sZW5ndGggLSBsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWQgYXJncywgc2tpcCB0aGVtCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGFyZ3MsIHRlc3QgdGhlbQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdGluZyBvZmY9IiArIG9mZiArICIsIGxlbj0iICsgbGVuKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dCA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIjsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiTGF0aW4xIikpOwotICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBkZWMud3JhcChiYWlzKSkgewotICAgICAgICAgICAgICAgICAgICBpcy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgSU9PQkV4IHdhcyBub3QgdGhyb3duIik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYmFpcy5hdmFpbGFibGUoKSAhPSBpbnB1dC5sZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vIGlucHV0IHNob3VsZCBiZSBjb25zdW1lZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJ1dCBjb25zdW1lZCAiICsgKGlucHV0Lmxlbmd0aCgpIC0gYmFpcy5hdmFpbGFibGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9DdXJyZW5jeS90YWJsZWExLnR4dCBiL2pkay90ZXN0L2phdmEvdXRpbC9DdXJyZW5jeS90YWJsZWExLnR4dAppbmRleCA5MmU0M2FkLi4xMmM5ZjdlIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvQ3VycmVuY3kvdGFibGVhMS50eHQKKysrIGIvamRrL3Rlc3QvamF2YS91dGlsL0N1cnJlbmN5L3RhYmxlYTEudHh0CkBAIC0xLDEyICsxLDEyIEBACiAjCiAjCi0jIEFtZW5kbWVudHMgdXAgdW50aWwgSVNPIDQyMTcgQU1FTkRNRU5UIE5VTUJFUiAxNjAKLSMgICAoQXMgb2YgMTkgSnVuZSAyMDE1KQorIyBBbWVuZG1lbnRzIHVwIHVudGlsIElTTyA0MjE3IEFNRU5ETUVOVCBOVU1CRVIgMTU5CisjICAgKEFzIG9mIDE1IEF1Z3VzdCAyMDE0KQogIwogCiAjIFZlcnNpb24KIEZJTEVWRVJTSU9OPTIKLURBVEFWRVJTSU9OPTE2MAorREFUQVZFUlNJT049MTU5CiAKICMgSVNPIDQyMTcgY3VycmVuY3kgZGF0YQogQUYJQUZOCTk3MQkyCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9jcnlwdG8vQ3J5cHRvUGVybWlzc2lvbi9UZXN0VW5saW1pdGVkLmphdmEgYi9qZGsvdGVzdC9qYXZheC9jcnlwdG8vQ3J5cHRvUGVybWlzc2lvbi9UZXN0VW5saW1pdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDI5ZjguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvY3J5cHRvL0NyeXB0b1Blcm1pc3Npb24vVGVzdFVubGltaXRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MTU3NTYxCi0gKiBAc3VtbWFyeSBTaGlwIHRoZSB1bmxpbWl0ZWQgcG9saWN5IGZpbGVzIGluIEpESyBVcGRhdGVzCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBUZXN0VW5saW1pdGVkICIiIGV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0gVGVzdFVubGltaXRlZCBsaW1pdGVkIGZhaWwKLSAqIEBydW4gbWFpbi9vdGhlcnZtIFRlc3RVbmxpbWl0ZWQgdW5saW1pdGVkIHBhc3MKLSAqIEBydW4gbWFpbi9vdGhlcnZtIFRlc3RVbmxpbWl0ZWQgdW5saW1pdGVkLyBwYXNzCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBUZXN0VW5saW1pdGVkIE5vc3VjaERpciBleGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtIFRlc3RVbmxpbWl0ZWQgLiBleGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtIFRlc3RVbmxpbWl0ZWQgL3RtcC91bmxpbWl0ZWQgZXhjZXB0aW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBUZXN0VW5saW1pdGVkIC4uL3BvbGljeS91bmxpbWl0ZWQgZXhjZXB0aW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBUZXN0VW5saW1pdGVkIC4vdW5saW1pdGVkIGV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0gVGVzdFVubGltaXRlZCAvdW5saW1pdGVkIGV4Y2VwdGlvbgotICovCi1pbXBvcnQgamF2YXguY3J5cHRvLio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLQotcHVibGljIGNsYXNzIFRlc3RVbmxpbWl0ZWQgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE92ZXJyaWRlIHRoZSBTZWN1cml0eSBwcm9wZXJ0eSB0byBhbGxvdyBmb3IgdW5saW1pdGVkIHBvbGljeS4KLSAgICAgICAgICogV291bGQgbmVlZCBhcHByb3ByaWF0ZSBwZXJtaXNzaW9ucyBpZiBTZWN1cml0eSBNYW5hZ2VyIHdlcmUKLSAgICAgICAgICogYWN0aXZlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlR3byBhcmdzIHJlcXVpcmVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGV4cGVjdGVkID0gYXJnc1sxXS5lcXVhbHMoInBhc3MiKTsKLSAgICAgICAgYm9vbGVhbiBleGNlcHRpb24gPSBhcmdzWzFdLmVxdWFscygiZXhjZXB0aW9uIik7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nOiAiICsgYXJnc1swXSk7Ci0KLSAgICAgICAgaWYgKGFyZ3NbMF0uZXF1YWxzKCJcIlwiIikpIHsKLSAgICAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJjcnlwdG8ucG9saWN5IiwgIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU2VjdXJpdHkuc2V0UHJvcGVydHkoImNyeXB0by5wb2xpY3kiLCBhcmdzWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVzZSB0aGUgQUVTIGFzIHRoZSB0ZXN0IENpcGhlcgotICAgICAgICAgKiBJZiB0aGVyZSBpcyBhbiBlcnJvciBpbml0aWFsaXppbmcsIHdlIHdpbGwgbmV2ZXIgZ2V0IHBhc3QgaGVyZS4KLSAgICAgICAgICovCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgbWF4S2V5TGVuID0gQ2lwaGVyLmdldE1heEFsbG93ZWRLZXlMZW5ndGgoIkFFUyIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtYXggQUVTIGtleSBsZW46IiArIG1heEtleUxlbik7Ci0gICAgICAgICAgICBpZiAobWF4S2V5TGVuID4gMTI4KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmxpbWl0ZWQgcG9saWN5IGlzIGFjdGl2ZSIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5saW1pdGVkIHBvbGljeSBpcyBOT1QgYWN0aXZlIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICBpZiAoIWV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6XHQiICsgZXhwZWN0ZWQgKyAiXG5SZXN1bHQ6XHRcdCIgKyByZXN1bHQpOwotICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gcmVzdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRPTkUhIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9NQmVhblNlcnZlci9FeGNlcHRpb25GYWN0b3J5LmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L01CZWFuU2VydmVyL0V4Y2VwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxNWVkZi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L01CZWFuU2VydmVyL0V4Y2VwdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkJhZEF0dHJpYnV0ZVZhbHVlRXhwRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQmFkQmluYXJ5T3BWYWx1ZUV4cEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkJhZFN0cmluZ09wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW52YWxpZEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5MaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RDb21wbGlhbnRNQmVhbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9wZXJhdGlvbnNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZUVycm9yRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU1CZWFuRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5TZXJ2aWNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5TdHJpbmdWYWx1ZUV4cDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4uSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuLlhNTFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvci5Nb25pdG9yU2V0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5JbnZhbGlkS2V5RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkludmFsaWRPcGVuVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5LZXlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5EYXRhRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24uSW52YWxpZFJlbGF0aW9uSWRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbi5JbnZhbGlkUmVsYXRpb25TZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24uSW52YWxpZFJlbGF0aW9uVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uLkludmFsaWRSb2xlSW5mb0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uLkludmFsaWRSb2xlVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbi5SZWxhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uLlJlbGF0aW9uTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbi5SZWxhdGlvblNlcnZpY2VOb3RSZWdpc3RlcmVkRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24uUmVsYXRpb25UeXBlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbi5Sb2xlSW5mb05vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24uUm9sZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFByb3ZpZGVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZlckVycm9yRXhjZXB0aW9uOwotCi0vKioKLSAqICB8LS0tLS0gT3JpZ2luYWwgRGVzY3JpcHRpb24gQ29taW5nIEZyb20gVG9uZ2EgT3JpZ2luYWwgU291cmNlIENvZGUgLS0tLS0tLXwKLSAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICB8IFRoYXQgY2xhc3MgY3JlYXRlcyBhbiBBcnJheUxpc3QgYW5kIGZpbGwgaXQgd2l0aCBhbiBpbnN0YW5jZSBvZiBlYWNoIG9mIHwKLSAqICB8IHRoZSBFeGNlcHRpb24gY2xhc3Mgb2YgdGhlIEpNWCBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICB8IEl0J3MgZGVkaWNhdGVkIHRvIHVzZSBieSBFeGNlcHRpb25UZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbkZhY3RvcnkgewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8RXhjZXB0aW9uPiBleGNlcHRpb25zID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8RXhjZXB0aW9uPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIG1lcyA9ICJTUUUiOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBCYWRBdHRyaWJ1dGVWYWx1ZUV4cEV4Y2VwdGlvbihtZXMpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEJhZEJpbmFyeU9wVmFsdWVFeHBFeGNlcHRpb24obmV3IFN0cmluZ1ZhbHVlRXhwKG1lcykpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEJhZFN0cmluZ09wZXJhdGlvbkV4Y2VwdGlvbihtZXMpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEluc3RhbmNlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSW52YWxpZEFwcGxpY2F0aW9uRXhjZXB0aW9uKG1lcykpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSk1FeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBKTVJ1bnRpbWVFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBMaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IE1CZWFuRXhjZXB0aW9uKG5ldyBFeGNlcHRpb24obWVzKSwgbWVzKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBNQmVhblJlZ2lzdHJhdGlvbkV4Y2VwdGlvbihuZXcgRXhjZXB0aW9uKG1lcyksIG1lcykpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgTm90Q29tcGxpYW50TUJlYW5FeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBPcGVyYXRpb25zRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgUmVmbGVjdGlvbkV4Y2VwdGlvbihuZXcgRXhjZXB0aW9uKG1lcyksIG1lcykpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgUnVudGltZUVycm9yRXhjZXB0aW9uKG5ldyBFcnJvcihtZXMpLCBtZXMpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IFJ1bnRpbWVNQmVhbkV4Y2VwdGlvbihuZXcgUnVudGltZUV4Y2VwdGlvbihtZXMpLCBtZXMpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IFJ1bnRpbWVPcGVyYXRpb25zRXhjZXB0aW9uKG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lcyksIG1lcykpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgU2VydmljZU5vdEZvdW5kRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSW52YWxpZFRhcmdldE9iamVjdFR5cGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBYTUxQYXJzZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IE1vbml0b3JTZXR0aW5nRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSW52YWxpZEtleUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEludmFsaWRPcGVuVHlwZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEtleUFscmVhZHlFeGlzdHNFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBPcGVuRGF0YUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEludmFsaWRSZWxhdGlvbklkRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSW52YWxpZFJlbGF0aW9uU2VydmljZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEludmFsaWRSZWxhdGlvblR5cGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBJbnZhbGlkUm9sZUluZm9FeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBJbnZhbGlkUm9sZVZhbHVlRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgUmVsYXRpb25FeGNlcHRpb24oKSk7Ci0gICAgICAgIGV4Y2VwdGlvbnMuYWRkKG5ldyBSZWxhdGlvbk5vdEZvdW5kRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgUmVsYXRpb25TZXJ2aWNlTm90UmVnaXN0ZXJlZEV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IFJlbGF0aW9uVHlwZU5vdEZvdW5kRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgUm9sZUluZm9Ob3RGb3VuZEV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IFJvbGVOb3RGb3VuZEV4Y2VwdGlvbigpKTsKLSAgICAgICAgZXhjZXB0aW9ucy5hZGQobmV3IEpNWFByb3ZpZGVyRXhjZXB0aW9uKCkpOwotICAgICAgICBleGNlcHRpb25zLmFkZChuZXcgSk1YU2VydmVyRXJyb3JFeGNlcHRpb24obWVzLCBuZXcgRXJyb3IobWVzKSkpOwotICAgICAgICBFeGNlcHRpb25UZXN0LlV0aWxzLmRlYnVnKEV4Y2VwdGlvblRlc3QuVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgIkRhdGFGYWN0b3J5Ojp1cGRhdGVNYXA6IEluaXRpYWxpemVkIiArCi0gICAgICAgICAgICAgICAgIiBhbiBBcnJheUxpc3Qgd2l0aCB0aGUgIiArCi0gICAgICAgICAgICAgICAgZXhjZXB0aW9ucy5zaXplKCkgKyAiIGV4Y2VwdGlvbnMgb2YgdGhlIEpNWCBBUEkiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L01CZWFuU2VydmVyL0V4Y2VwdGlvblRlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvTUJlYW5TZXJ2ZXIvRXhjZXB0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzFlNDNkLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvTUJlYW5TZXJ2ZXIvRXhjZXB0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA1ODg2NQotICogQHN1bW1hcnkgQ2hlY2tzIHRoYXQgZXhjZXB0aW9ucyBhcmUgY29ycmVjdGx5IHdpcmVkIChjb21wYXJlZCB0byByZWZlcmVuY2UpLgotICogQGF1dGhvciBPbGl2aWVyIExhZ25lYXUKLSAqIEBtb2R1bGVzIGphdmEubWFuYWdlbWVudAotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCBFeGNlcHRpb25UZXN0Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmljZVVSTDsKLQotCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uVGVzdCB7Ci0KLSAgICAvKgotICAgICAqIEZpcnN0IERlYnVnIHByb3BlcnRpZXMgYW5kIGFyZ3VtZW50cyBhcmUgY29sbGVjdCBpbiBleHBlY3RlZAotICAgICAqIG1hcCAgKGFyZ05hbWUsIHZhbHVlKSBmb3JtYXQsIHRoZW4gY2FsbHMgb3JpZ2luYWwgdGVzdCdzIHJ1biBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgICAgLy8gUGFyc2VzIHBhcmFtZXRlcnMKLSAgICAgICAgVXRpbHMucGFyc2VEZWJ1Z1Byb3BlcnRpZXMoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBVdGlscy5wYXJzZVBhcmFtZXRlcnMoYXJncykgOwotCi0gICAgICAgIC8vIFJ1biB0ZXN0Ci0gICAgICAgIEV4Y2VwdGlvblRlc3QgdGVzdCA9IG5ldyBFeGNlcHRpb25UZXN0KCk7Ci0gICAgICAgIHRlc3QucnVuKG1hcCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IFN0YXJ0Iik7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMDsKLQotICAgICAgICBKTVhDb25uZWN0b3JTZXJ2ZXIgY3MgPSBudWxsOwotICAgICAgICBKTVhDb25uZWN0b3IgY2MgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBKTVggTWJlYW5TZXJ2ZXIgdXNlZCBpbnNpZGUgc2luZ2xlIFZNIGFzIGlmIHJlbW90ZS4KLSAgICAgICAgICAgIE1CZWFuU2VydmVyIG1icyA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKLQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCB1cmwgPSBuZXcgSk1YU2VydmljZVVSTCgicm1pIiwgbnVsbCwgMCk7Ci0gICAgICAgICAgICBjcyA9IEpNWENvbm5lY3RvclNlcnZlckZhY3RvcnkubmV3Sk1YQ29ubmVjdG9yU2VydmVyKHVybCwgbnVsbCwgbWJzKTsKLSAgICAgICAgICAgIGNzLnN0YXJ0KCk7Ci0KLSAgICAgICAgICAgIEpNWFNlcnZpY2VVUkwgYWRkciA9IGNzLmdldEFkZHJlc3MoKTsKLSAgICAgICAgICAgIGNjID0gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KGFkZHIpOwotICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmpOYW1lID0KLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShFeGNlcHRpb25UaHJvd2VyLkVYQ0VQVElPTl9USFJPV0VSX05BTUUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IENyZWF0ZSBhbmQgcmVnaXN0ZXIgTUJlYW4gIiArIG9iak5hbWUpOwotICAgICAgICAgICAgbWJzYy5jcmVhdGVNQmVhbigiRXhjZXB0aW9uVGhyb3dlciIsIG9iak5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKTsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IEFzayBmb3IgZXhjZXB0aW9uKHMpIik7Ci0gICAgICAgICAgICBPYmplY3RbXSB0aHJvd0V4Y2VwdGlvblBhcmFtID0gbmV3IE9iamVjdFsxXTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRocm93RXhjZXB0aW9uU2lnID0gbmV3IFN0cmluZ1tdeyJpbnQifTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBFeGNlcHRpb25GYWN0b3J5LmV4Y2VwdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvblBhcmFtWzBdID0gbmV3IEludGVnZXIoaSk7Ci0KLSAgICAgICAgICAgICAgICBFeGNlcHRpb24gZXggPQotICAgICAgICAgICAgICAgICAgICAoRXhjZXB0aW9uKW1ic2MuaW52b2tlKG9iak5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhyb3dFeGNlcHRpb24iLCB0aHJvd0V4Y2VwdGlvblBhcmFtLCB0aHJvd0V4Y2VwdGlvblNpZyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoICEgbWF0Y2hlcyhleCwgRXhjZXB0aW9uRmFjdG9yeS5leGNlcHRpb25zLmdldChpKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IChFUlJPUikgUmVjZWl2ZWQgXG5bIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXggKyAiXVxuaW4gcGxhY2Ugb2ZcblsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBFeGNlcHRpb25GYWN0b3J5LmV4Y2VwdGlvbnMuZ2V0KGkpICsgIl0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9LIFsiICsgZXggKyAiXSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIERPTkVcbiIpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIENsb3NlIEpNWCBDb25uZWN0b3IgQ2xpZW50Ci0gICAgICAgICAgICAgICAgY2MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGNvbm5lcnRvciBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBjcy5zdG9wKCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZWl0aGVyIGNsb3NlIGNvbm5lY3RvciBjbGllbnQgb3Igc3RvcCBjb25uZWN0b3Igc2VydmVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyb3JDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvblRlc3Q6OnJ1bjogRG9uZSB3aXRob3V0IGFueSBlcnJvciIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IERvbmUgd2l0aCAiICsgZXJyb3JDb3VudAotICAgICAgICAgICAgICAgICAgICArICIgZXJyb3IocykiKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvckNvdW50ID0gIiArIGVycm9yQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb25UZXN0OjpydW46IERvbmUiKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBib3RoIEV4Y2VwdGlvbiBhcmUgaWRlbnRpY2FsLgotICAgIC8vIFRoYXQgbWVhbnM6Ci0gICAgLy8gLSBub25lIGlzIG51bGwuCi0gICAgLy8gLSB0aGV5IGFyZSBvZiB0aGUgc2FtZSBDbGFzcy4KLSAgICAvLyAtIGlmIHRoZWlyIHJlc3BlY3RpdmUgbWVzc2FnZXMgYXJlbid0IG51bGwgdGhleSdyZSBlcXVhbC4KLSAgICAvLyAtIGlmIHRoZSBtZXNzYWdlIG9mIG9uZSBpcyBudWxsIHRoZSBtZXNzYWdlIG9mIHRoZSBvdGhlciBpcyBudWxsIHRvby4KLSAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhFeGNlcHRpb24gZXgsIEV4Y2VwdGlvbiByZWZleCkgewotICAgICAgICBpZiAoIGV4ID09IG51bGwgfHwgcmVmZXggPT0gbnVsbCApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBDYWxsZWQgd2l0aCBvbmUgb3IgbW9yZSBudWxsIHBhcmFtZXRlcjsgY2hlY2sgIgotICAgICAgICAgICAgICAgICAgICArIGV4ICsgIiBhZ2FpbnN0ICIgKyByZWZleCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZXhDbGFzcyA9IGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgcmVmZXhDbGFzcyA9IHJlZmV4LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgIGlmICggISBleENsYXNzLmVxdWFscyhyZWZleENsYXNzKSApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBDbGFzcyBuYW1lcyBkb24ndCBtYXRjaDsgY2hlY2sgWyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXhDbGFzcyArICJdIGFnYWluc3QgWyIgKyByZWZleENsYXNzICsgIl0iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBleE1lcyA9IGV4LmdldE1lc3NhZ2UoKTsKLSAgICAgICAgU3RyaW5nIHJlZmV4TWVzID0gcmVmZXguZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIGlmICggZXhNZXMgIT0gbnVsbCAmJiByZWZleE1lcyAhPSBudWxsICkgewotICAgICAgICAgICAgaWYgKCAhIGV4TWVzLmVxdWFscyhyZWZleE1lcykgKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIE5vbiBudWxsIG1lc3NhZ2VzIGRvbid0IG1hdGNoOyBjaGVjayBbIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBleE1lcyArICJdIGFnYWluc3QgWyIgKyByZWZleE1lcyArICJdIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCAoZXhNZXMgPT0gbnVsbCAmJiByZWZleE1lcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHx8IChleE1lcyAhPSBudWxsICYmIHJlZmV4TWVzID09IG51bGwpICkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBNZXNzYWdlcyBkb24ndCBtYXRjaDsgY2hlY2sgWyIgKyBleE1lcwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSBhZ2FpbnN0IFsiICsgcmVmZXhNZXMgKyAiXSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gVXRpbGl0eSBpbm5lciBjbGFzcyBjb21pbmcgZnJvbSBKTVggVG9uZ2EgdGVzdCBzdWl0ZS4KLSAgICAvLyBBbHNvIHVzZWQgYnkgRXhjZXB0aW9uRmFjdG9yeS4KLSAgICBzdGF0aWMgY2xhc3MgVXRpbHMgewotCi0gICAgICAgIC8vIERFQlVHIGlzIHByaW50ZWQgZGVwZW5kaW5nIG9uIHRoZSBERUJVRyBhbmQgREVCVUdfTEVWRUwgSkFWQSBwcm9wZXJ0eQotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0hFQURFUiA9ICJbZGVidWddICI7Ci0KLSAgICAgICAgLy8gREVCVUcgbGV2ZWxzCi0gICAgICAgIHN0YXRpYyBpbnQgc2VsZWN0ZWREZWJ1Z0xldmVsID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUJVR19TVEFOREFSRCA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfVkVSQk9TRSA9IDI7ICAvLyBNYWlubHkgdXNlZCBmb3Igc3RyZXNzIHRlc3RzCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfQUxMID0gREVCVUdfU1RBTkRBUkQgfCBERUJVR19WRVJCT1NFOwotCi0gICAgICAgIHN0YXRpYyB2b2lkIHBhcnNlRGVidWdQcm9wZXJ0aWVzKCkgewotICAgICAgICAgICAgaW50IGxldmVsID0gMDsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCBzZWxlY3RlZCBsZXZlbHMKLSAgICAgICAgICAgIGlmIChwLmdldFByb3BlcnR5KCJERUJVR19TVEFOREFSRCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsZXZlbCB8PSBERUJVR19TVEFOREFSRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX1ZFUkJPU0UiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGV2ZWwgfD0gREVCVUdfVkVSQk9TRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX0FMTCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsZXZlbCB8PSBERUJVR19BTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdGVkRGVidWdMZXZlbCA9IGxldmVsOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJvZHVjZXMgdGhlIG9yaWdpbmFsIHBhcnNpbmcgYW5kIGNvbGxlY3Rpb24gb2YgdGVzdCBwYXJhbWV0ZXJzCi0gICAgICAgICAqIGZyb20gdGhlIERUb25nYSBKTVggdGVzdCBzdWl0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQ29sbGVjdHMgcGFzc2VkIGFyZ3MgYW5kIHJldHVybnMgdGhlbSBpbiBhIG1hcChhcmduYW1lLCB2YWx1ZSkgc3RydWN0dXJlLAotICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHRoZW4gcHJvcGFnYXRlZCBhcyBuZWNlc3NhcnkgdG8gdmFyaW91cyBjYWxsZWQgbWV0aG9kcy4KLSAgICAgICAgICovCi0gICAgICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcnNlUGFyYW1ldGVycyhTdHJpbmcgYXJnc1tdKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGRlYnVnKERFQlVHX1NUQU5EQVJELCAiVGVzdFJvb3Q6OnBhcnNlUGFyYW1ldGVyczogU3RhcnQiKTsKLSAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBpZiAoIGFyZ3NbaV0udHJpbSgpLnN0YXJ0c1dpdGgoIi0iKSApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpKzEpIDwgYXJncy5sZW5ndGggJiYgIWFyZ3NbaSsxXS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdFJvb3Q6OnBhcnNlUGFyYW1ldGVyczogYWRkZWQgaW4gbWFwID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIHZhbHVlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaSsxXSkgOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChhcmdzW2ldLnRyaW0oKSwgYXJnc1tpKzFdLnRyaW0oKSkgOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpKzEpIDwgYXJncy5sZW5ndGggJiYgYXJnc1tpKzFdLnN0YXJ0c1dpdGgoIi0iKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpKzEpID09IGFyZ3MubGVuZ3RoICkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBhZGRlZCBpbiBtYXAgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBudWxsIHZhbHVlIikgOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChhcmdzW2ldLnRyaW0oKSwgbnVsbCkgOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiAoV0FSTklORykgbm90IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0pIDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVidWcoREVCVUdfU1RBTkRBUkQsICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBEb25lIikgOwotICAgICAgICAgICAgcmV0dXJuIG1hcCA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBpbiBhbGwgdGVzdHMgdG8gcHJpbnQgYW55dGhpbmcKLSAgICAgICAgICogdGhhdCBpcyB0ZW1wb3JhcnkuCi0gICAgICAgICAqIFByaW50aW5nIGlzIGRvbmUgb25seSB3aGVuIGRlYnVnIGlzIGFjdGl2YXRlZCBieSB0aGUgcHJvcGVydHkgREVCVUcuCi0gICAgICAgICAqIFByaW50aW5nIGRlcGVuZHMgYWxzbyBvbiB0aGUgREVCVUdfTEVWRUwgcHJvcGVydHkuCi0gICAgICAgICAqIEhlcmUgaXQgZW5jYXBzdWxhdGVzIGEgU3lzdGVtLm91dC5wcmludGxuLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgZGVidWcoaW50IGxldmVsLCBTdHJpbmcgbGluZSkgewotICAgICAgICAgICAgaWYgKChzZWxlY3RlZERlYnVnTGV2ZWwgJiBsZXZlbCkgIT0gMCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihERUJVR19IRUFERVIgKyBsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEbyBwcmludCBzdGFjayB0cmFjZSB3aGVuIHdpdGhTdGFjayBpcyB0cnVlLgotICAgICAgICAgKiBEb2VzIHRyeSB0byBjYWxsIGdldFRhcmdldEV4Y2VwdGlvbigpIGFuZCBnZXRUYXJnZXRFcnJvcigpIHRoZW4KLSAgICAgICAgICogcHJpbnQgZW1iZWRkZWQgc3RhY2tzIGluIHRoZSBjYXNlIG9mIGFuIEV4Y2VwdGlvbiB3cmFwcGluZwotICAgICAgICAgKiBhbm90aGVyIEV4Y2VwdGlvbiBvciBhbiBFcnJvci4gUmVjdXJzZSB1bnRpbCBubyBtb3JlIHdyYXBwaW5nCi0gICAgICAgICAqIGlzIGZvdW5kLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIHZvaWQgcHJpbnRUaHJvd2FibGUoVGhyb3dhYmxlIHRoZVRocm8sIGJvb2xlYW4gd2l0aFN0YWNrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICh3aXRoU3RhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgdGhlVGhyby5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh0aGVUaHJvIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiB0ID0gKEV4Y2VwdGlvbikgdGhlVGhybzsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBibGFuayA9ICIgIjsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPSzogZ2V0VGFyZ2V0RXhjZXB0aW9uIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYmxhbmsgKyB0LmdldENsYXNzKCkgKyAiPT0+IiArIHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoRXhjZXB0aW9uKSB0YXJnZXQuaW52b2tlKHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLk9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rID0gYmxhbmsgKyAiICAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYmxhbmsgKyB0LmdldENsYXNzKCkgKyAiPT0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0VGFyZ2V0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9LOiBnZXRUYXJnZXRFeGNlcHRpb24gbWV0aG9kIGNvdWxkIGJlIHRoZXJlIG9yIG5vdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXkgaGF2ZSBleGNlcHRpb25zIHdyYXBwaW5nIGFuIEVycm9yIHRoZW4gaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2V0VGFyZ2V0RXJyb3IgdGhhdCBpcyBsaWtlbHkgdG8gYmUgY2FsbGVkCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAoKEV4Y2VwdGlvbikgdGhlVGhybykuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9LOiBnZXRUYXJnZXRFcnJvciBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGVyciA9IHRoZVRocm87Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAoRXJyb3IpIHRhcmdldC5pbnZva2UoZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5PYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmsgPSBibGFuayArICIgICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIGVyci5nZXRDbGFzcygpICsgIj09PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2l0aFN0YWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBlcnIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9LOiBnZXRUYXJnZXRFcnJvciBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93YWJsZSBpcyA6ICIgKyB0aGVUaHJvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIDogcmFpc2VkIGluIHByaW50RXhjZXB0aW9uIDogIiArIHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9NQmVhblNlcnZlci9FeGNlcHRpb25UaHJvd2VyLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L01CZWFuU2VydmVyL0V4Y2VwdGlvblRocm93ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkNjYxZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L01CZWFuU2VydmVyL0V4Y2VwdGlvblRocm93ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhIHNpbXBsZSBzdGFuZGFyZCBNQmVhbi4KLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvblRocm93ZXIgaW1wbGVtZW50cyBFeGNlcHRpb25UaHJvd2VyTUJlYW4gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX1RIUk9XRVJfTkFNRQotICAgICAgICAgICAgPSAic3FlOnR5cGU9RXhjZXB0aW9uVGhyb3dlciI7Ci0KLSAgICBwdWJsaWMgRXhjZXB0aW9uIHRocm93RXhjZXB0aW9uKGludCBleGNlcHRpb25JbmRleCkgewotICAgICAgICByZXR1cm4gRXhjZXB0aW9uRmFjdG9yeS5leGNlcHRpb25zLmdldChleGNlcHRpb25JbmRleCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9NQmVhblNlcnZlci9FeGNlcHRpb25UaHJvd2VyTUJlYW4uamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvTUJlYW5TZXJ2ZXIvRXhjZXB0aW9uVGhyb3dlck1CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NDg1ZDMuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9NQmVhblNlcnZlci9FeGNlcHRpb25UaHJvd2VyTUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBzaW1wbGUgc3RhbmRhcmQgTUJlYW4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjZXB0aW9uVGhyb3dlck1CZWFuIHsKLSAgICBwdWJsaWMgRXhjZXB0aW9uIHRocm93RXhjZXB0aW9uKGludCBleGNlcHRpb25JbmRleCk7Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L2tleXN0b3JlQWdlbnQgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L2tleXN0b3JlQWdlbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjAyZTAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9rZXlzdG9yZUFnZW50CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9rZXlzdG9yZUNsaWVudCBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQva2V5c3RvcmVDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTBiN2YuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9rZXlzdG9yZUNsaWVudAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbW9uaXRvci9HYXVnZU1vbml0b3JEZWFkbG9ja1Rlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbW9uaXRvci9HYXVnZU1vbml0b3JEZWFkbG9ja1Rlc3QuamF2YQppbmRleCA5ZTA2M2EyLi5jODVjMjIzIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvR2F1Z2VNb25pdG9yRGVhZGxvY2tUZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL0dhdWdlTW9uaXRvckRlYWRsb2NrVGVzdC5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiAgKiBAc3VtbWFyeSBUZXN0IHRoYXQgbm8gbG9ja3MgYXJlIGhlbGQgd2hlbiBhIG1vbml0b3IgYXR0cmlidXRlIGlzIHNhbXBsZWQKICAqIG9yIG5vdGlmIGRlbGl2ZXJlZC4KICAqIEBhdXRob3IgRWFtb25uIE1jTWFudXMKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkKICAqIEBydW4gY2xlYW4gR2F1Z2VNb25pdG9yRGVhZGxvY2tUZXN0CiAgKiBAcnVuIGJ1aWxkIEdhdWdlTW9uaXRvckRlYWRsb2NrVGVzdAogICogQHJ1biBtYWluIEdhdWdlTW9uaXRvckRlYWRsb2NrVGVzdCAxCkBAIC00OCw4ICs0Nyw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5tb25pdG9yLkdhdWdlTW9uaXRvcjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3IuR2F1Z2VNb25pdG9yTUJlYW47CiAKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuVXRpbHM7Ci0KIHB1YmxpYyBjbGFzcyBHYXVnZU1vbml0b3JEZWFkbG9ja1Rlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGVudW0gV2hlbiB7SU5fR0VUX0FUVFJJQlVURSwgSU5fTk9USUZZfTsKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGNoZWNraW5nVGltZTsKQEAgLTU3LDcgKzU0LDggQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDEpCiAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJBcmcgc2hvdWxkIGJlIHRlc3QgbnVtYmVyIik7Ci0gICAgICAgIGNoZWNraW5nVGltZSA9IFV0aWxzLmFkanVzdFRpbWVvdXQoMTAwMCk7IC8vIGRlZmF1bHQgMXMgdGltZW91dAorICAgICAgICBkb3VibGUgZmFjdG9yID0gRG91YmxlLnBhcnNlRG91YmxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC50aW1lb3V0LmZhY3RvciIsICIxLjAiKSk7CisgICAgICAgIGNoZWNraW5nVGltZSA9IChsb25nKWZhY3RvcioxMDAwOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PSBjaGVja2luZ1RpbWUgPSAiICsgY2hlY2tpbmdUaW1lICsgIm1zIik7CiAKICAgICAgICAgaW50IHRlc3RObyA9IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSkgLSAxOwpAQCAtMTAzLDEyICsxMDEsMTEgQEAKICAgICAgICAgICAgIG1vbml0b3JQcm94eS5zZXRHcmFudWxhcml0eVBlcmlvZCgxMEwpOyAvLyAxMCBtcwogICAgICAgICAgICAgbW9uaXRvclByb3h5LnNldE5vdGlmeUhpZ2godHJ1ZSk7CiAgICAgICAgICAgICBtb25pdG9yUHJveHkuc2V0Tm90aWZ5TG93KHRydWUpOworICAgICAgICAgICAgbW9uaXRvclByb3h5LnN0YXJ0KCk7CiAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09IFdhaXRpbmcgb2JzZXJ2ZWRQcm94eS5nZXRHZXRDb3VudCgpIHRvIGJlICIKICAgICAgICAgICAgICAgICAgICAgKyAiY2hhbmdlZCwgcHJlc3VtYWJsZSBkZWFkbG9jayBpZiB0aW1lb3V0PyIpOwogICAgICAgICAgICAgZmluYWwgaW50IGluaXRHZXRDb3VudCA9IG9ic2VydmVkUHJveHkuZ2V0R2V0Q291bnQoKTsKLSAgICAgICAgICAgIG1vbml0b3JQcm94eS5zdGFydCgpOwotCiAgICAgICAgICAgICBsb25nIGNoZWNrZWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgICAgICBsb25nIG5vd1RpbWU7CiAgICAgICAgICAgICBUaHJlYWRNWEJlYW4gdGhyZWFkTVhCZWFuID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvU3RyaW5nTW9uaXRvckRlYWRsb2NrVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9tb25pdG9yL1N0cmluZ01vbml0b3JEZWFkbG9ja1Rlc3QuamF2YQppbmRleCA3MjkyOWMyLi4yZjc4Y2U2IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L21vbml0b3IvU3RyaW5nTW9uaXRvckRlYWRsb2NrVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbW9uaXRvci9TdHJpbmdNb25pdG9yRGVhZGxvY2tUZXN0LmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIAogaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1YOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247CkBAIC05NCwxMCArOTUsOSBAQAogICAgICAgICAgICAgbW9uaXRvclByb3h5LnNldFN0cmluZ1RvQ29tcGFyZSgib2xkIik7CiAgICAgICAgICAgICBtb25pdG9yUHJveHkuc2V0R3JhbnVsYXJpdHlQZXJpb2QoMTBMKTsgLy8gMTAgbXMKICAgICAgICAgICAgIG1vbml0b3JQcm94eS5zZXROb3RpZnlEaWZmZXIodHJ1ZSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBpbml0R2V0Q291bnQgPSBvYnNlcnZlZFByb3h5LmdldEdldENvdW50KCk7CiAgICAgICAgICAgICBtb25pdG9yUHJveHkuc3RhcnQoKTsKIAorICAgICAgICAgICAgZmluYWwgaW50IGluaXRHZXRDb3VudCA9IG9ic2VydmVkUHJveHkuZ2V0R2V0Q291bnQoKTsKICAgICAgICAgICAgIGludCBnZXRDb3VudCA9IGluaXRHZXRDb3VudDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsgLy8gNTAwICogMTAgPSA1IHNlY29uZHMKICAgICAgICAgICAgICAgICBnZXRDb3VudCA9IG9ic2VydmVkUHJveHkuZ2V0R2V0Q291bnQoKTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL0Jhc2ljLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9CYXNpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMyYWY2Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL0Jhc2ljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkltbXV0YWJsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5MaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5Ob3RpZmljYXRpb25JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkVtaXR0ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci0KLS8qKgotICogQ2xhc3MgQmFzaWMKLSAqIEJhc2ljIERlc2NyaXB0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpYyBpbXBsZW1lbnRzIEJhc2ljTVhCZWFuLCBOb3RpZmljYXRpb25FbWl0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5SZWdpc3RyYXRpb24gewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX01FU1NBR0UgPSAiZnJvbSBCYXNpYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX01FU1NBR0UgPSAiZnJvbSBCYXNpYyI7Ci0gICAgLyoqIEF0dHJpYnV0ZSA6IEludEF0dCAqLwotICAgIHByaXZhdGUgaW50IGludEF0dCA9IDA7Ci0gICAgLyoqIEF0dHJpYnV0ZSA6IEludGVnZXJBdHQgKi8KLSAgICBwcml2YXRlIEludGVnZXIgaW50ZWdlckF0dCA9IDA7Ci0gICAgLyoqIEF0dHJpYnV0ZSA6IEJvb2xBdHQgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gYm9vbEF0dCA9IGZhbHNlOwotICAgIC8qKiBBdHRyaWJ1dGUgOiBCb29sZWFuQXR0ICovCi0gICAgcHJpdmF0ZSBCb29sZWFuIGJvb2xlYW5BdHQgPSBmYWxzZTsKLSAgICAvKiogQXR0cmlidXRlIDogU3RyaW5nQXR0ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nQXR0ID0gbnVsbDsKLSAgICAvKiogQXR0cmlidXRlIDogRGF0ZUF0dCAqLwotICAgIHByaXZhdGUgRGF0ZSBkYXRlQXR0ID0gbnVsbDsKLSAgICAvKiogQXR0cmlidXRlIDogT2JqZWN0TmFtZUF0dCAqLwotICAgIHByaXZhdGUgT2JqZWN0TmFtZSBvYmplY3ROYW1lQXR0ID0gbnVsbDsKLSAgICAvKiogQXR0cmlidXRlIDogTm90aWZEZXNjcmlwdG9yQXNNYXBBdHQgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbm90aWZEZXNjcmlwdG9yQXNNYXBBdHQgPSBudWxsOwotICAgIC8qKiBBdHRyaWJ1dGUgOiBOb3RpZkRlc2NyaXB0b3JBdHQgKi8KLSAgICBwcml2YXRlIERlc2NyaXB0b3Igbm90aWZEZXNjcmlwdG9yQXR0ID0gbnVsbDsKLSAgICAvKiogQXR0cmlidXRlIDogU3FlUGFyYW1ldGVyICovCi0gICAgcHJpdmF0ZSBTcWVQYXJhbWV0ZXIgc3FlUGFyYW1ldGVyQXR0ID0gbnVsbDsKLQotICAgIC8qIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQmFzaWMgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQ09OU1RSVUNUT1IgQmFzaWMiKQotICAgIHB1YmxpYyBCYXNpYygpIHsKLSAgICB9Ci0KLSAgICAvKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJhc2ljICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkNPTlNUUlVDVE9SIEJhc2ljIikKLSAgICBwdWJsaWMgQmFzaWMoCi0gICAgICAgICAgICBAU3FlRGVzY3JpcHRvcktleSgiQ09OU1RSVUNUT1IgUEFSQU1FVEVSIFNxZVBhcmFtZXRlciIpIFNxZVBhcmFtZXRlciBwYXJhbSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBpbnQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnRBdHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnRBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGludCBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRBdHQoaW50IHZhbHVlKSB7Ci0gICAgICAgIGludEF0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBJbnRlZ2VyIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXJBdHQoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlZ2VyQXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBJbnRlZ2VyIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEludGVnZXJBdHQoSW50ZWdlciB2YWx1ZSkgewotICAgICAgICBpbnRlZ2VyQXR0ID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGJvb2xlYW4gYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbEF0dCgpIHsKLSAgICAgICAgcmV0dXJuIGJvb2xBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IGJvb2xlYW4gYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vbEF0dChib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIGJvb2xBdHQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQm9vbGVhbiBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgQm9vbGVhbiBnZXRCb29sZWFuQXR0KCkgewotICAgICAgICByZXR1cm4gYm9vbGVhbkF0dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQm9vbGVhbiBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRCb29sZWFuQXR0KEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgYm9vbGVhbkF0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBTdHJpbmcgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmdBdHQoKSB7Ci0gICAgICAgIHJldHVybiBzdHJpbmdBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IFN0cmluZyBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdBdHQoU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHN0cmluZ0F0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBEYXRlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldERhdGVBdHQoKSB7Ci0gICAgICAgIHJldHVybiBkYXRlQXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBEYXRlIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERhdGVBdHQoRGF0ZSB2YWx1ZSkgewotICAgICAgICBkYXRlQXR0ID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IE9iamVjdE5hbWUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdE5hbWUgZ2V0T2JqZWN0TmFtZUF0dCgpIHsKLSAgICAgICAgcmV0dXJuIG9iamVjdE5hbWVBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IE9iamVjdE5hbWUgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0TmFtZUF0dChPYmplY3ROYW1lIHZhbHVlKSB7Ci0gICAgICAgIG9iamVjdE5hbWVBdHQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgU3FlUGFyYW1ldGVyIGF0dHJpYnV0ZQotICAgICAqLwotICAgIHB1YmxpYyBTcWVQYXJhbWV0ZXIgZ2V0U3FlUGFyYW1ldGVyQXR0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcWVQYXJhbWV0ZXJBdHQgPT0gbnVsbCkgewotICAgICAgICAgICAgc3FlUGFyYW1ldGVyQXR0ID0gbmV3IFNxZVBhcmFtZXRlcigpOwotICAgICAgICAgICAgc3FlUGFyYW1ldGVyQXR0LnNldEdsb3AoIklOSVRJQUxJWkVEIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3FlUGFyYW1ldGVyQXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBTcWVQYXJhbWV0ZXIgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3FlUGFyYW1ldGVyQXR0KFNxZVBhcmFtZXRlciB2YWx1ZSkgewotICAgICAgICBzcWVQYXJhbWV0ZXJBdHQgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIERlc2NyaXB0b3IgdXNlZCB0byBidWlsZCB0aGUgTm90aWZpY2F0aW9uSW5mbwotICAgICAqIG9mIGVtaXR0ZWQgbm90aWZpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXROb3RpZkRlc2NyaXB0b3JBc01hcEF0dCgpIHsKLSAgICAgICAgaWYgKG5vdGlmRGVzY3JpcHRvckFzTWFwQXR0ID09IG51bGwpIHsKLSAgICAgICAgICAgIGluaXROb3RpZkRlc2NyaXB0b3JBdHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBub3RpZkRlc2NyaXB0b3JBc01hcEF0dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIERlc2NyaXB0b3IgdXNlZCB0byBidWlsZCB0aGUgTm90aWZpY2F0aW9uSW5mbwotICAgICAqIG9mIGVtaXR0ZWQgbm90aWZpY2F0aW9ucy4KLSAgICAgKiA8YnI+QSBNYXA8U3RyaW5nLCBPYmplY3Q+IHdvdWxkIGJldHRlciBmaXQgRGVzY3JpcHRvciBuZWVkcyBidXQgdGhlbgotICAgICAqIGl0IGlzIG5vdCBjb252ZXJ0aWJsZSBhY2NvcmRpbmcgdGhlIE1YQmVhbiBzcGVjaWZpY2F0aW9uIHNvIHRoZSBNQmVhbgotICAgICAqIHJlZ2lzdHJhdGlvbiBmYWlscy4KLSAgICAgKiBBcyB3ZSBwbGFuIHRvIHRlc3Qgb3VyIGN1c3RvbSBEZXNjcmlwdG9yIGZpbmRzIGl0cyB3YXkgaW50bwotICAgICAqIHRoZSBtZXRhZGF0YSBvZiBlbWl0dGVkIG5vdGlmaWNhdGlvbnMsIFN0cmluZyBpcyBnb29kIGVub3VnaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROb3RpZkRlc2NyaXB0b3JBc01hcEF0dChNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlKSB7Ci0gICAgICAgIG5vdGlmRGVzY3JpcHRvckFzTWFwQXR0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHZhbHVlKTsKLSAgICAgICAgbm90aWZEZXNjcmlwdG9yQXR0ID0gbmV3IEltbXV0YWJsZURlc2NyaXB0b3IodmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIG5vdGhpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkb05vdGhpbmcoKSB7Ci0gICAgICAgIC8vIEkgc2FpZCBOT1RISU5HICEKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyB0YWtlIFNxZVBhcmFtZXRlciBhcyBhIHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRvV2VpcmQoU3FlUGFyYW1ldGVyIHBhcmFtKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3cgYW4gRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbihFWENFUFRJT05fTUVTU0FHRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3cgYW4gRXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0aHJvd0Vycm9yKCkgewotICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihFWENFUFRJT05fTUVTU0FHRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVzZXQgYWxsIGF0dHJpYnV0ZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgaW50QXR0ID0gMDsKLSAgICAgICAgaW50ZWdlckF0dCA9IDA7Ci0gICAgICAgIGJvb2xBdHQgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbkF0dCA9IEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIHN0cmluZ0F0dCA9IG51bGw7Ci0gICAgICAgIGRhdGVBdHQgPSBudWxsOwotICAgICAgICBvYmplY3ROYW1lQXR0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3ZWF0aGVyIGZvciB0aGUgY29taW5nIGRheXMKLSAgICAgKiBAcGFyYW0gdmVyYm9zZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2ZXJib3NpdHkKLSAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gPGNvZGU+c3Rvcm08L2NvZGU+Ci0gICAgICogQHJldHVybiA8Y29kZT5PYmplY3ROYW1lPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBXZWF0aGVyIGdldFdlYXRoZXIoYm9vbGVhbiB2ZXJib3NlKQotICAgICAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gV2VhdGhlci5TVU5OWTsKLSAgICB9Ci0KLSAgICAvLyBTdGFydGluZyBoZXJlIGFyZSB0aGUgNCBtZXRob2RzIG9mIE1CZWFuUmVnaXN0cmF0aW9uIGludGVyZmFjZS4KLSAgICAvLyBXZSB1c2UgdGhhdCB0byBncmFiIHRoZSBPYmplY3ROYW1lIHRoZSBNQmVhbiBpcyByZWdpc3RlcmVkIHdpdGguCi0gICAgLy8KLSAgICBwdWJsaWMgT2JqZWN0TmFtZSBwcmVSZWdpc3RlcihNQmVhblNlcnZlciBzZXJ2ZXIsIE9iamVjdE5hbWUgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBHcmFiIGEgcmVmZXJlbmNlIG9uIHRoZSBNQmVhblNlcnZlciB3ZSdyZSByZWdpc3RlcmVkIGluLgotICAgICAgICBtYnMgPSBzZXJ2ZXI7Ci0gICAgICAgIC8vIENvbXB1dGUgdGhlIG5hbWUgd2UncmUgcmVnaXN0ZXJlZCB3aXRoLgotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtYmVhbk5hbWUgPSBuYW1lOwotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYmVhbk5hbWUgPQotICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKCJzcWU6dHlwZT0iICsgQmFzaWMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBtYmVhbk5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXIoQm9vbGVhbiByZWdpc3RyYXRpb25Eb25lKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKLSAgICAgICAgLy8gRG8gbm90aGluZwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmQgb25lIE5vdGlmaWNhdGlvbiBvZiB0aGUgcHJvdmlkZWQgbm90aWZUeXBlIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE5vdGlmaWNhdGlvbihTdHJpbmcgbm90aWZUeXBlKSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOwotCi0gICAgICAgIGlmIChub3RpZlR5cGUuZXF1YWxzKE5PVElGX1RZUEVfMCkpIHsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oTk9USUZfVFlQRV8wLAotICAgICAgICAgICAgICAgICAgICBtYmVhbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHNlcU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX01FU1NBR0UpOwotICAgICAgICB9IGVsc2UgaWYgKG5vdGlmVHlwZS5lcXVhbHMoTk9USUZfVFlQRV8xKSkgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uID0gbmV3IFNxZU5vdGlmaWNhdGlvbihOT1RJRl9UWVBFXzEsCi0gICAgICAgICAgICAgICAgICAgIG1iZWFuTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgc2VxTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fTUVTU0FHRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXFOdW1iZXIrKzsKLSAgICAgICAgYnJvYWRjYXN0ZXIuc2VuZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoYXQgbWV0aG9kIHN0YXJ0cyBhIHNldCBvZiB0aHJlYWRzLCBlYWNoIHRocmVhZCBzZW5kcyBhIGdpdmVuIG51bWJlciBvZgotICAgICAqIG5vdGlmaWNhdGlvbnMuCi0gICAgICogVGhlIG51bWJlciBvZiB0aHJlYWRzIGNhbiBiZSBzZXQgdmlhIHRoZSBhdHRyaWJ1dGUgbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzLgotICAgICAqIFRoZSBudW1iZXIgb2Ygbm90aWZpY2F0aW9uIHNlbnQgYnkgZWFjaCB0aHJlYWQgY2FuIGJlIHNldCB2aWEKLSAgICAgKiB0aGUgYXR0cmlidXRlIG51bU9mTm90aWZpY2F0aW9uU2VuZGVyTG9vcHMuCi0gICAgICogRGVwZW5kaW5nIG9uIHRoZSBwYXJhbWV0ZXIgY3VzdG9tTm90aWZpY2F0aW9uIHdlIHNlbmQgZWl0aGVyIGN1c3RvbQotICAgICAqIG5vdGlmaWNhdGlvbihzKSBvciBNQmVhblNlcnZlciByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIG5vdGlmaWNhdGlvbihzKS4KLSAgICAgKiBXaGVuIGN1c3RvbU5vdGlmaWNhdGlvbj10cnVlIHRoZSB0b3RhbCBudW1iZXIgb2Ygbm90aWZpY2F0aW9uKHMpIHNlbnQgaXMKLSAgICAgKiAobnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzICogbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJMb29wcykuIFRoZXkgYXJlCi0gICAgICogc2VxdWVudGlhbGx5IG9mIHR5cGUgTk9USUZfVFlQRV8wIHRoZW4gTk9USUZfVFlQRV8xIGFuZCBzbyBvbi4KLSAgICAgKgotICAgICAqIFdoZW4gY3VzdG9tTm90aWZpY2F0aW9uPWZhbHNlIHRoZSB0b3RhbCBudW1iZXIgb2Ygbm90aWZpY2F0aW9uKHMpIHNlbnQgaXMKLSAgICAgKiAobnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzICogbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJMb29wcykgcmVnaXN0cmF0aW9uCi0gICAgICogbm90aWZpY2F0aW9uKHMpCi0gICAgICogKwotICAgICAqIChudW1PZk5vdGlmaWNhdGlvblNlbmRlcnMgKiBudW1PZk5vdGlmaWNhdGlvblNlbmRlckxvb3BzKSB1bnJlZ2lzdHJhdGlvbgotICAgICAqIG5vdGlmaWNhdGlvbihzKQotICAgICAqCi0gICAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE5vdGlmaWNhdGlvbldhdmUoYm9vbGVhbiBjdXN0b21Ob3RpZmljYXRpb24pIHRocm93cwotICAgICAgICAgICAgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gQnVpbGQgdGhlIHNldCBvZiBub3RpZmljYXRpb24gc2VuZGVyLgotICAgICAgICBDb2xsZWN0aW9uPENhbGxhYmxlPEludGVnZXI+PiB0YXNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Q2FsbGFibGU8SW50ZWdlcj4+KG51bU9mTm90aWZpY2F0aW9uU2VuZGVycyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzOyBpKyspIHsKLSAgICAgICAgICAgIHRhc2tzLmFkZChuZXcgTm90aWZTZW5kZXIobnVtT2ZOb3RpZmljYXRpb25TZW5kZXJMb29wcywKLSAgICAgICAgICAgICAgICAgICAgY3VzdG9tTm90aWZpY2F0aW9uLCBpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdGFydCBhbGwgbm90aWZpY2F0aW9uIHNlbmRlciBpbiBwYXJhbGxlbC4KLSAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWNTZXJ2ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWNTZXJ2ID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1PZk5vdGlmaWNhdGlvblNlbmRlcnMpOwotICAgICAgICAgICAgTGlzdDxGdXR1cmU8SW50ZWdlcj4+IHRhc2tIYW5kbGVycyA9IGV4ZWNTZXJ2Lmludm9rZUFsbCh0YXNrcyk7Ci0gICAgICAgICAgICBjaGVja05vdGlmU2VuZGVyVGhyZWFkU3RhdHVzKHRhc2tIYW5kbGVycyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoIWV4ZWNTZXJ2LmlzU2h1dGRvd24oKSkgewotICAgICAgICAgICAgICAgIGV4ZWNTZXJ2LnNodXRkb3duKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXROdW1PZk5vdGlmaWNhdGlvblNlbmRlcnMoaW50IHZhbHVlKSB7Ci0gICAgICAgIG51bU9mTm90aWZpY2F0aW9uU2VuZGVycyA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bU9mTm90aWZpY2F0aW9uU2VuZGVyTG9vcHMoaW50IHZhbHVlKSB7Ci0gICAgICAgIG51bU9mTm90aWZpY2F0aW9uU2VuZGVyTG9vcHMgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNQmVhbiBOb3RpZmljYXRpb24gc3VwcG9ydAotICAgICAqIFlvdSBzaG91bGRuJ3QgdXBkYXRlIHRoZXNlIG1ldGhvZHMKLSAgICAgKi8KLSAgICAvLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPSJjb2xsYXBzZWQiIGRlc2M9IiBHZW5lcmF0ZWQgQ29kZSAiPgotICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRiYWNrKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJyb2FkY2FzdGVyLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyLCBmaWx0ZXIsIGhhbmRiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTUJlYW5Ob3RpZmljYXRpb25JbmZvW10gZ2V0Tm90aWZpY2F0aW9uSW5mbygpIHsKLSAgICAgICAgaWYgKG5vdGlmRGVzY3JpcHRvckF0dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0Tm90aWZEZXNjcmlwdG9yQXR0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mb1tdewotICAgICAgICAgICAgICAgICAgICBuZXcgTUJlYW5Ob3RpZmljYXRpb25JbmZvKG5ldyBTdHJpbmdbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5PVElGX1RZUEVfMAotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbi5jbGFzcy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZCBKTVggTm90aWZpY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZEZXNjcmlwdG9yQXR0KSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE1CZWFuTm90aWZpY2F0aW9uSW5mbyhuZXcgU3RyaW5nW117Ci0gICAgICAgICAgICAgICAgICAgICAgICBOT1RJRl9UWVBFXzEKLSAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgU3FlTm90aWZpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgIlNRRSBOb3RpZmljYXRpb24iLAotICAgICAgICAgICAgICAgICAgICBub3RpZkRlc2NyaXB0b3JBdHQpCi0gICAgICAgICAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLSAgICAgICAgICAgIHRocm93cyBMaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgYnJvYWRjYXN0ZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRiYWNrKQotICAgICAgICAgICAgdGhyb3dzIExpc3RlbmVyTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBicm9hZGNhc3Rlci5yZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihsaXN0ZW5lciwgZmlsdGVyLCBoYW5kYmFjayk7Ci0gICAgfQotICAgIC8vIDwvZWRpdG9yLWZvbGQ+Ci0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbG9uZyBnZXROZXh0U2VxTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gc2VxTnVtYmVyKys7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXROb3RpZkRlc2NyaXB0b3JBdHQoKSB7Ci0gICAgICAgIFN0cmluZyBrZXkgPSAiQ1JBQkUiOwotICAgICAgICBTdHJpbmcgdmFsdWUgPSAiVEFNQk9VUiI7Ci0gICAgICAgIG5vdGlmRGVzY3JpcHRvckF0dCA9Ci0gICAgICAgICAgICAgICAgbmV3IEltbXV0YWJsZURlc2NyaXB0b3IobmV3IFN0cmluZ1tde2tleSArICI9IiArIHZhbHVlfSk7Ci0gICAgICAgIG5vdGlmRGVzY3JpcHRvckFzTWFwQXR0ID0KLSAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgbm90aWZEZXNjcmlwdG9yQXNNYXBBdHQucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja05vdGlmU2VuZGVyVGhyZWFkU3RhdHVzKAotICAgICAgICAgICAgTGlzdDxGdXR1cmU8SW50ZWdlcj4+IHRhc2tIYW5kbGVycykKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbXNnVGFnID0gIkJhc2ljOjpjaGVja05vdGlmU2VuZGVyVGhyZWFkU3RhdHVzOiAiOwotICAgICAgICAvLyBHcmFiIGJhY2sgc3RhdHVzIG9mIGVhY2ggbm90aWZpY2F0aW9uIHNlbmRlci4KLSAgICAgICAgZm9yIChGdXR1cmU8SW50ZWdlcj4gZiA6IHRhc2tIYW5kbGVycykgewotICAgICAgICAgICAgaWYgKGYuaXNDYW5jZWxsZWQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbXNnVGFnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICItLS0tIEVSUk9SIDogT25lIHRocmVhZCBoYXMgYmVlbiBjYW5jZWxsZWQiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSW50ZWdlciBlZmZlY3RpdmVOdW1PZkxvb3BzID0gZi5nZXQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVOdW1PZkxvb3BzICE9IG51bU9mTm90aWZpY2F0aW9uU2VuZGVyTG9vcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtc2dUYWcgKyAiLS0tLSBFUlJPUiA6IE9uZSB0aHJlYWQgZGlkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZU51bU9mTG9vcHMgKyAiIGxvb3BzIGluIHBsYWNlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU9mTm90aWZpY2F0aW9uU2VuZGVyTG9vcHM7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vCi0gICAgcHJpdmF0ZSBpbnQgbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJMb29wcyA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzID0gMTM7Ci0KLSAgICBwcml2YXRlIGNsYXNzIE5vdGlmU2VuZGVyIGltcGxlbWVudHMgQ2FsbGFibGU8SW50ZWdlcj4gewotCi0gICAgICAgIHByaXZhdGUgaW50IGN5Y2xlczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGN1c3RvbU5vdGlmaWNhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgc2VuZGVySUQ7Ci0KLSAgICAgICAgcHVibGljIE5vdGlmU2VuZGVyKGludCBjeWNsZXMsIGJvb2xlYW4gY3VzdG9tTm90aWZpY2F0aW9uLCBpbnQgaWQpIHsKLSAgICAgICAgICAgIHRoaXMuY3ljbGVzID0gY3ljbGVzOwotICAgICAgICAgICAgdGhpcy5jdXN0b21Ob3RpZmljYXRpb24gPSBjdXN0b21Ob3RpZmljYXRpb247Ci0gICAgICAgICAgICB0aGlzLnNlbmRlcklEID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW50ZWdlciBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgY2FsbHNEb25lID0gMDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjeWNsZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3VzdG9tTm90aWZpY2F0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmROb3RpZmljYXRpb24oTk9USUZfVFlQRV8wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbihOT1RJRl9UWVBFXzEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBtYmVhbk5hbWUgPSBuZXcgT2JqZWN0TmFtZSgiU1FFOnR5cGU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iZWFuQ2xhc3NOYW1lICsgIixzZW5kZXJJRD0iICsgc2VuZGVySUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWJzLmNyZWF0ZU1CZWFuKG1iZWFuQ2xhc3NOYW1lLCBtYmVhbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWJzLnVucmVnaXN0ZXJNQmVhbihtYmVhbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxzRG9uZSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZlNlbmRlcjo6Y2FsbDogKEVSUk9SKSBUaHJlYWQgWyIgKyBzZW5kZXJJRCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXSBmYWlsZWQgYWZ0ZXIgIiArIGNhbGxzRG9uZSArICIgY3ljbGVzIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihjYWxsc0RvbmUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICBwcml2YXRlIGxvbmcgc2VxTnVtYmVyOwotICAgIHByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0IGJyb2FkY2FzdGVyID0KLSAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb25Ccm9hZGNhc3RlclN1cHBvcnQoKTsKLSAgICBwcml2YXRlIE9iamVjdE5hbWUgbWJlYW5OYW1lOwotICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbWJzOwotICAgIHByaXZhdGUgU3RyaW5nIG1iZWFuQ2xhc3NOYW1lID0gIlNpbXBsZSI7Ci0KLSAgICAvKioKLSAgICAgKiBOb3RpZmljYXRpb24gdHlwZXMgZGVmaW5pdGlvbnMuIFRvIHVzZSB3aGVuIGNyZWF0aW5nIEpNWCBOb3RpZmljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGX1RZUEVfMCA9Ci0gICAgICAgICAgICAic3FlLm5vdGlmaWNhdGlvbi5hLnR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGX1RZUEVfMSA9Ci0gICAgICAgICAgICAic3FlLm5vdGlmaWNhdGlvbi5iLnR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vQmFzaWNNWEJlYW4uamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL0Jhc2ljTVhCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OTNiZTkuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vQmFzaWNNWEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci0KLS8qKgotICogSW50ZXJmYWNlIEJhc2ljTUJlYW4KLSAqIEJhc2ljIERlc2NyaXB0aW9uCi0gKi8KLUBTcWVEZXNjcmlwdG9yS2V5KCJJTlRFUkZBQ0UgQmFzaWNNWEJlYW4iKQotcHVibGljIGludGVyZmFjZSBCYXNpY01YQmVhbgotewotICAgLyoqCi0gICAgKiBHZXQgaW50IGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBpbnRBdHQiKQotICAgIHB1YmxpYyBpbnQgZ2V0SW50QXR0KCk7Ci0KLSAgIC8qKgotICAgICogU2V0IGludCBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgaW50QXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRBdHQoaW50IHZhbHVlKTsKLQotICAgLyoqCi0gICAgKiBHZXQgSW50ZWdlciBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgaW50ZWdlckF0dCIpCi0gICAgcHVibGljIEludGVnZXIgZ2V0SW50ZWdlckF0dCgpOwotCi0gICAvKioKLSAgICAqIFNldCBJbnRlZ2VyIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBpbnRlZ2VyQXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlZ2VyQXR0KEludGVnZXIgdmFsdWUpOwotCi0gICAvKioKLSAgICAqIEdldCBib29sZWFuIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBib29sQXR0IikKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sQXR0KCk7Ci0KLSAgIC8qKgotICAgICogU2V0IGJvb2xlYW4gYXR0cmlidXRlCi0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIGJvb2xBdHQiKQotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xBdHQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgIC8qKgotICAgICogR2V0IEJvb2xlYW4gYXR0cmlidXRlCi0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIGJvb2xlYW5BdHQiKQotICAgIHB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW5BdHQoKTsKLQotICAgLyoqCi0gICAgKiBTZXQgQm9vbGVhbiBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgYm9vbGVhbkF0dCIpCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbkF0dChCb29sZWFuIHZhbHVlKTsKLQotICAgLyoqCi0gICAgKiBHZXQgU3RyaW5nIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBzdHJpbmdBdHQiKQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nQXR0KCk7Ci0KLSAgIC8qKgotICAgICogU2V0IFN0cmluZyBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgc3RyaW5nQXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmdBdHQoU3RyaW5nIHZhbHVlKTsKLQotICAgLyoqCi0gICAgKiBHZXQgRGF0ZSBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgZGF0ZUF0dCIpCi0gICAgcHVibGljIERhdGUgZ2V0RGF0ZUF0dCgpOwotCi0gICAvKioKLSAgICAqIFNldCBEYXRlIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBkYXRlQXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRlQXR0KERhdGUgdmFsdWUpOwotCi0gICAvKioKLSAgICAqIEdldCBPYmplY3ROYW1lIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBvYmplY3ROYW1lQXR0IikKLSAgICBwdWJsaWMgT2JqZWN0TmFtZSBnZXRPYmplY3ROYW1lQXR0KCk7Ci0KLSAgIC8qKgotICAgICogU2V0IE9iamVjdE5hbWUgYXR0cmlidXRlCi0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIG9iamVjdE5hbWVBdHQiKQotICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdE5hbWVBdHQoT2JqZWN0TmFtZSB2YWx1ZSk7Ci0KLSAgIC8qKgotICAgICogR2V0IFNxZVBhcmFtZXRlciBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgc3FlUGFyYW1ldGVyQXR0IikKLSAgICBwdWJsaWMgU3FlUGFyYW1ldGVyIGdldFNxZVBhcmFtZXRlckF0dCgpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgIC8qKgotICAgICogU2V0IFNxZVBhcmFtZXRlciBhdHRyaWJ1dGUKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgc3FlUGFyYW1ldGVyQXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXRTcWVQYXJhbWV0ZXJBdHQoU3FlUGFyYW1ldGVyIHZhbHVlKTsKLQotICAgLyoqCi0gICAgKiBTZXQgTnVtT2ZOb3RpZmljYXRpb25TZW5kZXJzIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBOdW1PZk5vdGlmaWNhdGlvblNlbmRlcnMiKQotICAgIHB1YmxpYyB2b2lkIHNldE51bU9mTm90aWZpY2F0aW9uU2VuZGVycyhpbnQgdmFsdWUpOwotCi0gICAvKioKLSAgICAqIFNldCBOdW1PZk5vdGlmaWNhdGlvblNlbmRlckxvb3BzIGF0dHJpYnV0ZQotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBOdW1PZk5vdGlmaWNhdGlvblNlbmRlckxvb3BzIikKLSAgICBwdWJsaWMgdm9pZCBzZXROdW1PZk5vdGlmaWNhdGlvblNlbmRlckxvb3BzKGludCB2YWx1ZSk7Ci0KLSAgIC8qKgotICAgICogZG8gbm90aGluZwotICAgICoKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gZG9Ob3RoaW5nIikKLSAgICBwdWJsaWMgdm9pZCBkb05vdGhpbmcoKTsKLQotICAgLyoqCi0gICAgKiBEbyB0YWtlIFNxZVBhcmFtZXRlciBhcyBhIHBhcmFtZXRlcgotICAgICovCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIk9QRVJBVElPTiBkb1dlaXJkIikKLSAgICBwdWJsaWMgdm9pZCBkb1dlaXJkKEBTcWVEZXNjcmlwdG9yS2V5KCJNRVRIT0QgUEFSQU1FVEVSIilTcWVQYXJhbWV0ZXIgcGFyYW0pOwotCi0gICAgLyoqCi0gICAgKiB0aHJvdyBhbiBFeGNlcHRpb24KLSAgICAqCi0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHRocm93RXhjZXB0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgIC8qKgotICAgICogdGhyb3cgYW4gRXJyb3IKLSAgICAqCi0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHRocm93RXJyb3IiKQotICAgIHB1YmxpYyB2b2lkIHRocm93RXJyb3IoKTsKLQotICAgLyoqCi0gICAgKiByZXNldCBhbGwgYXR0cmlidXRlcwotICAgICoKLSAgICAqLwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gcmVzZXQiKQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0KLSAgIC8qKgotICAgICogcmV0dXJucyB0aGUgd2VhdGhlciBmb3IgdGhlIGNvbWluZyBkYXlzCi0gICAgKgotICAgICogQHBhcmFtIHZlcmJvc2UgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmVyYm9zaXR5Ci0gICAgKiBAcmV0dXJuIDxjb2RlPk9iamVjdE5hbWU8L2NvZGU+Ci0gICAgKi8KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIGdldFdlYXRoZXIiKQotICAgIHB1YmxpYyBXZWF0aGVyIGdldFdlYXRoZXIoQFNxZURlc2NyaXB0b3JLZXkoIk1FVEhPRCBQQVJBTUVURVIiKWJvb2xlYW4gdmVyYm9zZSkKLSAgICAgICAgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgZW51bSBXZWF0aGVyIHsKLSAgICAgICAgQ0xPVURZLCBTVU5OWQotICAgIH0KLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgbm90aWZEZXNjcmlwdG9yQXNNYXBBdHQiKQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldE5vdGlmRGVzY3JpcHRvckFzTWFwQXR0KCk7Ci0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIG5vdGlmRGVzY3JpcHRvckFzTWFwQXR0IikKLSAgICBwdWJsaWMgdm9pZCBzZXROb3RpZkRlc2NyaXB0b3JBc01hcEF0dChNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlKTsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gc2VuZE5vdGlmaWNhdGlvbiIpCi0gICAgcHVibGljIHZvaWQgc2VuZE5vdGlmaWNhdGlvbihAU3FlRGVzY3JpcHRvcktleSgiTUVUSE9EIFBBUkFNRVRFUiIpU3RyaW5nIG5vdGlmVHlwZSk7Ci0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHNlbmROb3RpZmljYXRpb25XYXZlIikKLSAgICBwdWJsaWMgdm9pZCBzZW5kTm90aWZpY2F0aW9uV2F2ZShib29sZWFuIGN1c3RvbU5vdGlmaWNhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vTVhCZWFuRXhjZXB0aW9uSGFuZGxpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MDcxOTguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vTVhCZWFuRXhjZXB0aW9uSGFuZGxpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDU4ODY1Ci0gKiBAc3VtbWFyeSBDaGVja3MgY29ycmVjdCBleGNlcHRpb24gYW5kIGVycm9yIGV2ZW50cyBmcm9tIE5vdGlmaWNhdGlvbkxpc3RlbmVyCi0gKiBAYXV0aG9yIE9saXZpZXIgTGFnbmVhdQotICogQG1vZHVsZXMgamF2YS5tYW5hZ2VtZW50Ci0gKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5Ci0gKiBAY29tcGlsZSBCYXNpYy5qYXZhCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIE1YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdCAtdGltZUZvck5vdGlmaWNhdGlvbkluU2Vjb25kcyAzCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKLQotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRGVsZWdhdGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5SdW50aW1lRXJyb3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmljZVVSTDsKLQotcHVibGljIGNsYXNzIE1YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdCBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvbkxpc3RlbmVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBCQVNJQ19NWEJFQU5fQ0xBU1NfTkFNRSA9ICJCYXNpYyI7Ci0KLSAgICBwcml2YXRlIGxvbmcgdGltZUZvck5vdGlmaWNhdGlvbkluU2Vjb25kcyA9IDNMOwotICAgIHByaXZhdGUgaW50IG51bU9mTm90aWZpY2F0aW9ucyA9IDI7Ci0gICAgcHJpdmF0ZSBCbG9ja2luZ1F1ZXVlPE5vdGlmaWNhdGlvbj4gbm90aWZMaXN0ID0gbnVsbDsKLQotCi0gICAgLyoKLSAgICAgKiBGaXJzdCBEZWJ1ZyBwcm9wZXJ0aWVzIGFuZCBhcmd1bWVudHMgYXJlIGNvbGxlY3QgaW4gZXhwZWN0ZWQKLSAgICAgKiBtYXAgIChhcmdOYW1lLCB2YWx1ZSkgZm9ybWF0LCB0aGVuIGNhbGxzIG9yaWdpbmFsIHRlc3QncyBydW4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIC8vIFBhcnNlcyBwYXJhbWV0ZXJzCi0gICAgICAgIFV0aWxzLnBhcnNlRGVidWdQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gVXRpbHMucGFyc2VQYXJhbWV0ZXJzKGFyZ3MpIDsKLQotICAgICAgICAvLyBSdW4gdGVzdAotICAgICAgICBNWEJlYW5FeGNlcHRpb25IYW5kbGluZ1Rlc3QgdGVzdCA9IG5ldyBNWEJlYW5FeGNlcHRpb25IYW5kbGluZ1Rlc3QoKTsKLSAgICAgICAgdGVzdC5ydW4obWFwKTsKLQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlQXJncyhNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBhcmcgPSBudWxsOwotCi0gICAgICAgIC8vIEluaXQgdGltZUZvck5vdGlmaWNhdGlvbkluU2Vjb25kcwotICAgICAgICAvLyBJdCBpcyB0aGUgbWF4aW11bSB0aW1lIGluIHNlY29uZHMgd2Ugd2FpdCBmb3IgYSBub3RpZmljYXRpb24uCi0gICAgICAgIGFyZyA9IChTdHJpbmcpYXJncy5nZXQoIi10aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzIikgOwotICAgICAgICBpZiAoYXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpbWVGb3JOb3RpZmljYXRpb25JblNlY29uZHMgPSAobmV3IExvbmcoYXJnKSkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdDo6cnVuOiBTdGFydCIpIDsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICAgICAgbm90aWZMaXN0ID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxOb3RpZmljYXRpb24+KG51bU9mTm90aWZpY2F0aW9ucyk7Ci0KLSAgICAgICAgICAgIC8vIEpNWCBNYmVhblNlcnZlciB1c2VkIGluc2lkZSBzaW5nbGUgVk0gYXMgaWYgcmVtb3RlLgotICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbWJzID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOwotCi0gICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIHVybCA9IG5ldyBKTVhTZXJ2aWNlVVJMKCJybWkiLCBudWxsLCAwKTsKLSAgICAgICAgICAgIEpNWENvbm5lY3RvclNlcnZlciBjcyA9Ci0gICAgICAgICAgICAgICAgSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeS5uZXdKTVhDb25uZWN0b3JTZXJ2ZXIodXJsLCBudWxsLCBtYnMpOwotICAgICAgICAgICAgY3Muc3RhcnQoKTsKLQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gY3MuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgSk1YQ29ubmVjdG9yIGNjID0gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KGFkZHIpOwotICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBZGQgbWUgYXMgbm90aWZpY2F0aW9uIGxpc3RlbmVyIik7Ci0gICAgICAgICAgICBtYnNjLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKE1CZWFuU2VydmVyRGVsZWdhdGUuREVMRUdBVEVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBNQmVhbiIpOwotICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmpOYW1lID0gbmV3IE9iamVjdE5hbWUoInNxZTp0eXBlPUJhc2ljLHByb3RvY29sPXJtaSIpIDsKLSAgICAgICAgICAgIG1ic2MuY3JlYXRlTUJlYW4oQkFTSUNfTVhCRUFOX0NMQVNTX05BTUUsIG9iak5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FsbCBtZXRob2QgdGhyb3dFeGNlcHRpb24gb24gb3VyIE1YQmVhbiIpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ic2MuaW52b2tlKG9iak5hbWUsICJ0aHJvd0V4Y2VwdGlvbiIsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgRGlkIG5vdCBnZXQgYXdhaXRlZCBNQmVhbkV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE1CZWFuRXhjZXB0aW9uIG1iZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKE9LKSBHb3QgYXdhaXRlZCBNQmVhbkV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBtYmUuZ2V0Q2F1c2UoKTsKLQotICAgICAgICAgICAgICAgIGlmICggY2F1c2UgaW5zdGFuY2VvZiBqYXZhLmxhbmcuRXhjZXB0aW9uICkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykgQ2F1c2UgaXMgb2YgdGhlIHJpZ2h0IGNsYXNzIikgOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzcyA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIG1lc3MuZXF1YWxzKEJhc2ljLkVYQ0VQVElPTl9NRVNTQUdFICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykgQ2F1c2UgbWVzc2FnZSBpcyBmaW5lIikgOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIENhdXNlIGhhcyBtZXNzYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXVzZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIHdlIGV4cGVjdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQmFzaWMuRVhDRVBUSU9OX01FU1NBR0UpIDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIENhdXNlIGlzIG9mICBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXVzZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcyB3ZSBleHBlY3QgamF2YS5sYW5nLkV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgRGlkIG5vdCBnZXQgYXdhaXRlZCBNQmVhbkV4Y2VwdGlvbiBidXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBlKSA7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRE9ORVxuIikgOwotCi0gICAgICAgICAgICAvLyAtLS0tCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNhbGwgbWV0aG9kIHRocm93RXJyb3Igb24gb3VyIE1YQmVhbiIpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ic2MuaW52b2tlKG9iak5hbWUsICJ0aHJvd0Vycm9yIiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBEaWQgbm90IGdldCBhd2FpdGVkIFJ1bnRpbWVFcnJvckV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFcnJvckV4Y2VwdGlvbiByZWUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykgR290IGF3YWl0ZWQgUnVudGltZUVycm9yRXhjZXB0aW9uIikgOwotICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IHJlZS5nZXRDYXVzZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjYXVzZSBpbnN0YW5jZW9mIGphdmEubGFuZy5JbnRlcm5hbEVycm9yICkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykgQ2F1c2UgaXMgb2YgdGhlIHJpZ2h0IGNsYXNzIikgOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzcyA9IGNhdXNlLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIG1lc3MuZXF1YWxzKEJhc2ljLkVYQ0VQVElPTl9NRVNTQUdFICkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykgQ2F1c2UgbWVzc2FnZSBpcyBmaW5lIikgOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIENhdXNlIGhhcyBtZXNzYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXVzZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIHdlIGV4cGVjdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQmFzaWMuRVhDRVBUSU9OX01FU1NBR0UpIDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIENhdXNlIGlzIG9mICBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjYXVzZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcyB3ZSBleHBlY3QgamF2YS5sYW5nLkludGVybmFsRXJyb3IiKSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIERpZCBub3QgZ2V0IGF3YWl0ZWQgUnVudGltZUVycm9yRXhjZXB0aW9uIGJ1dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGUpIDsKLSAgICAgICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBET05FXG4iKSA7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5yZWdpc3RlciB0aGUgTUJlYW4iKTsKLSAgICAgICAgICAgIG1ic2MudW5yZWdpc3Rlck1CZWFuKG9iak5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0KLSAgICAgICAgICAgIFRocmVhZC5zbGVlcCh0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzICogMTAwMCk7Ci0gICAgICAgICAgICBpbnQgbnVtT2ZSZWNlaXZlZE5vdGlmID0gbm90aWZMaXN0LnNpemUoKTsKLQotICAgICAgICAgICAgaWYgKCBudW1PZlJlY2VpdmVkTm90aWYgPT0gbnVtT2ZOb3RpZmljYXRpb25zICkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKE9LKSBXZSByZWNlaXZlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG51bU9mTm90aWZpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIE5vdGlmaWNhdGlvbnMiKSA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgV2UgcmVjZWl2ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBudW1PZlJlY2VpdmVkTm90aWYKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBOb3RpZmljYXRpb25zIGluIHBsYWNlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbnVtT2ZOb3RpZmljYXRpb25zKSA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBlcnJvckNvdW50ID09IDAgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdDo6cnVuOiBEb25lIHdpdGhvdXQgYW55IGVycm9yIikgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5FeGNlcHRpb25IYW5kbGluZ1Rlc3Q6OnJ1bjogRG9uZSB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgKyBlcnJvckNvdW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiBlcnJvcihzKSIpIDsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvckNvdW50ID0gIiArIGVycm9yQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIE9iamVjdCBoYW5kYmFjaykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbkV4Y2VwdGlvbkhhbmRsaW5nVGVzdDo6aGFuZGxlTm90aWZpY2F0aW9uOiBSZWNlaXZlZCAiCi0gICAgICAgICAgICAgICAgKyBub3RpZmljYXRpb24pOwotICAgICAgICBub3RpZkxpc3QuYWRkKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5JbnRlcm9wVGVzdDEuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbkludGVyb3BUZXN0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjBlODM0Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbkludGVyb3BUZXN0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA1ODg2NQotICogQHN1bW1hcnkgVGVzdCBhbGwgTVhCZWFucyBhdmFpbGFibGUgYnkgZGVmYXVsdCBvbiB0aGUgcGxhdGZvcm0KLSAqIEBhdXRob3IgT2xpdmllciBMYWduZWF1Ci0gKiBAbW9kdWxlcyBqYXZhLm1hbmFnZW1lbnQKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgTVhCZWFuSW50ZXJvcFRlc3QxCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50LkNsYXNzTG9hZGluZ01YQmVhbjsKLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5Db21waWxhdGlvbk1YQmVhbjsKLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5HYXJiYWdlQ29sbGVjdG9yTVhCZWFuOwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1lbW9yeU1YQmVhbjsKLWltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NZW1vcnlNYW5hZ2VyTVhCZWFuOwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1lbW9yeVBvb2xNWEJlYW47Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuT3BlcmF0aW5nU3lzdGVtTVhCZWFuOwotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50LlJ1bnRpbWVNWEJlYW47Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuVGhyZWFkTVhCZWFuOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTVg7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkF0dHJpYnV0ZUluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkNvbnN0cnVjdG9ySW5mbzsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5Ob3RpZmljYXRpb25JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhTZXJ2aWNlVVJMOwotCi1wdWJsaWMgY2xhc3MgTVhCZWFuSW50ZXJvcFRlc3QxIHsKLQotICAgIC8qCi0gICAgICogRmlyc3QgRGVidWcgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIGFyZSBjb2xsZWN0IGluIGV4cGVjdGVkCi0gICAgICogbWFwICAoYXJnTmFtZSwgdmFsdWUpIGZvcm1hdCwgdGhlbiBjYWxscyBvcmlnaW5hbCB0ZXN0J3MgcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICAvLyBQYXJzZXMgcGFyYW1ldGVycwotICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IFV0aWxzLnBhcnNlUGFyYW1ldGVycyhhcmdzKSA7Ci0KLSAgICAgICAgLy8gUnVuIHRlc3QKLSAgICAgICAgTVhCZWFuSW50ZXJvcFRlc3QxIHRlc3QgPSBuZXcgTVhCZWFuSW50ZXJvcFRlc3QxKCk7Ci0gICAgICAgIHRlc3QucnVuKG1hcCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5JbnRlcm9wVGVzdDE6OnJ1bjogU3RhcnQiKSA7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEpNWCBNYmVhblNlcnZlciB1c2VkIGluc2lkZSBzaW5nbGUgVk0gYXMgaWYgcmVtb3RlLgotICAgICAgICAgICAgLy8gTUJlYW5TZXJ2ZXIgbWJzID0gTUJlYW5TZXJ2ZXJGYWN0b3J5Lm5ld01CZWFuU2VydmVyKCk7Ci0gICAgICAgICAgICBNQmVhblNlcnZlciBtYnMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7Ci0KLSAgICAgICAgICAgIEpNWFNlcnZpY2VVUkwgdXJsID0gbmV3IEpNWFNlcnZpY2VVUkwoInJtaSIsIG51bGwsIDApOwotICAgICAgICAgICAgSk1YQ29ubmVjdG9yU2VydmVyIGNzID0KLSAgICAgICAgICAgICAgICBKTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5Lm5ld0pNWENvbm5lY3RvclNlcnZlcih1cmwsIG51bGwsIG1icyk7Ci0gICAgICAgICAgICBjcy5zdGFydCgpOwotCi0gICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIGFkZHIgPSBjcy5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBKTVhDb25uZWN0b3IgY2MgPSBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QoYWRkcik7Ci0gICAgICAgICAgICBNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYyA9IGNjLmdldE1CZWFuU2VydmVyQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICAvLyBQcmludCBvdXQgcmVnaXN0ZXJlZCBqYXZhLmxhbmcubWFuYWdlbWVudCBNWEJlYW5zIGZvdW5kCi0gICAgICAgICAgICAvLyBpbiB0aGUgcmVtb3RlIGp2bS4KLSAgICAgICAgICAgIHByaW50TUJlYW5zKG1ic2MpIDsKLQotICAgICAgICAgICAgLy8gRm9yIGVhY2ggcG9zc2libGUga2luZCBvZiBKREsgNSBkZWZpbmVkIE1YQmVhbiwgd2UgcmV0cmlldmUgaXRzCi0gICAgICAgICAgICAvLyBNQmVhbkluZm8gYW5kIHByaW50IGl0IGFuZCB3ZSBjYWxsIGFsbCBnZXR0ZXJzIGFuZCBwcmludAotICAgICAgICAgICAgLy8gdGhlaXIgb3V0cHV0LgotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb0NsYXNzTG9hZGluZ01YQmVhblRlc3QobWJzYykgOwotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb01lbW9yeU1YQmVhblRlc3QobWJzYykgOwotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb1RocmVhZE1YQmVhblRlc3QobWJzYykgOwotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb1J1bnRpbWVNWEJlYW5UZXN0KG1ic2MpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gZG9PcGVyYXRpbmdTeXN0ZW1NWEJlYW5UZXN0KG1ic2MpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gZG9Db21waWxhdGlvbk1YQmVhblRlc3QobWJzYykgOwotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb0dhcmJhZ2VDb2xsZWN0b3JNWEJlYW5UZXN0KG1ic2MpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gZG9NZW1vcnlNYW5hZ2VyTVhCZWFuVGVzdChtYnNjKSA7Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGRvTWVtb3J5UG9vbE1YQmVhblRlc3QobWJzYykgOwotCi0gICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIEpNWCBDbGllbnQKLSAgICAgICAgICAgIGNjLmNsb3NlKCk7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGVycm9yQ291bnQgPT0gMCApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuSW50ZXJvcFRlc3QxOjpydW46IERvbmUgd2l0aG91dCBhbnkgZXJyb3IiKSA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbkludGVyb3BUZXN0MTo6cnVuOiBEb25lIHdpdGggIgotICAgICAgICAgICAgICAgICAgICArIGVycm9yQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGVycm9yKHMpIikgOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVycm9yQ291bnQgPSAiICsgZXJyb3JDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYWxsIE1CZWFucyBvZiBkb21haW4gamF2YS5sYW5nLgotICAgICAqIFRoZXkgYXJlIE1CZWFucyByZWxhdGVkIHRvIHRoZSBKU1IgMTc0IHRoYXQgZGVmaW5lcwotICAgICAqIHBhY2thZ2UgamF2YS5sYW5nLm1hbmFnZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE1CZWFucyhNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdE5hbWUgZmlsdGVyTmFtZSA9IG5ldyBPYmplY3ROYW1lKCJqYXZhLmxhbmc6KiIpOwotICAgICAgICBTZXQ8T2JqZWN0TmFtZT4gc2V0ID0gbWJzYy5xdWVyeU5hbWVzKGZpbHRlck5hbWUsIG51bGwpOwotCi0gICAgICAgIGlmICggc2V0LnNpemUoKSA9PSAwICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIihFUlJPUikgTm8gTUJlYW4gZm91bmQgd2l0aCBmaWx0ZXIgIgotICAgICAgICAgICAgICAgICAgICArIGZpbHRlck5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE1CZWFucyBmb3VuZCBpbiBkb21haW4gamF2YS5sYW5nIDoiKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yPE9iamVjdE5hbWU+IGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGl0ZXIubmV4dCgpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiIpIDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGRvQ2xhc3NMb2FkaW5nTVhCZWFuVGVzdChNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYykgewotICAgICAgICBpbnQgZXJyb3JDb3VudCA9IDAgOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gQ2xhc3NMb2FkaW5nTVhCZWFuIikgOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3ROYW1lIGNsYXNzTG9hZGluZ05hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShNYW5hZ2VtZW50RmFjdG9yeS5DTEFTU19MT0FESU5HX01YQkVBTl9OQU1FKSA7Ci0gICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8oY2xhc3NMb2FkaW5nTmFtZSk7Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrTm9uRW1wdHkobWJJbmZvKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBtYkluZm8pOwotICAgICAgICAgICAgQ2xhc3NMb2FkaW5nTVhCZWFuIGNsYXNzTG9hZGluZyA9IG51bGw7Ci0KLSAgICAgICAgICAgIGNsYXNzTG9hZGluZyA9IEpNWC5uZXdNWEJlYW5Qcm94eShtYnNjLAotICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRpbmdOYW1lLAotICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRpbmdNWEJlYW4uY2xhc3MpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TG9hZGVkQ2xhc3NDb3VudFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgY2xhc3NMb2FkaW5nLmdldExvYWRlZENsYXNzQ291bnQoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFRvdGFsTG9hZGVkQ2xhc3NDb3VudFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgY2xhc3NMb2FkaW5nLmdldFRvdGFsTG9hZGVkQ2xhc3NDb3VudCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VW5sb2FkZWRDbGFzc0NvdW50XHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBjbGFzc0xvYWRpbmcuZ2V0VW5sb2FkZWRDbGFzc0NvdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc1ZlcmJvc2VcdFx0IgotICAgICAgICAgICAgICAgICAgICArIGNsYXNzTG9hZGluZy5pc1ZlcmJvc2UoKSk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICBlcnJvckNvdW50KysgOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEVSUk9SXG4iKSA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyb3JDb3VudCA7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBkb01lbW9yeU1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE1lbW9yeU1YQmVhbiIpIDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0TmFtZSBtZW1vcnlOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoTWFuYWdlbWVudEZhY3RvcnkuTUVNT1JZX01YQkVBTl9OQU1FKSA7Ci0gICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8obWVtb3J5TmFtZSk7Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrTm9uRW1wdHkobWJJbmZvKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBtYkluZm8pOwotICAgICAgICAgICAgTWVtb3J5TVhCZWFuIG1lbW9yeSA9IG51bGwgOwotCi0gICAgICAgICAgICBtZW1vcnkgPQotICAgICAgICAgICAgICAgICAgICBKTVgubmV3TVhCZWFuUHJveHkobWJzYywKLSAgICAgICAgICAgICAgICAgICAgbWVtb3J5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgTWVtb3J5TVhCZWFuLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICB0cnVlKSA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE1lbW9yeUhlYXBVc2FnZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgbWVtb3J5LmdldEhlYXBNZW1vcnlVc2FnZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9uSGVhcE1lbW9yeUhlYXBVc2FnZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgbWVtb3J5LmdldE5vbkhlYXBNZW1vcnlVc2FnZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0T2JqZWN0UGVuZGluZ0ZpbmFsaXphdGlvbkNvdW50XHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBtZW1vcnkuZ2V0T2JqZWN0UGVuZGluZ0ZpbmFsaXphdGlvbkNvdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc1ZlcmJvc2VcdFx0IgotICAgICAgICAgICAgICAgICAgICArIG1lbW9yeS5pc1ZlcmJvc2UoKSk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICBlcnJvckNvdW50KysgOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEVSUk9SXG4iKSA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyb3JDb3VudCA7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBkb1RocmVhZE1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFRocmVhZE1YQmVhbiIpIDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0TmFtZSB0aHJlYWROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoTWFuYWdlbWVudEZhY3RvcnkuVEhSRUFEX01YQkVBTl9OQU1FKSA7Ci0gICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8odGhyZWFkTmFtZSk7Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrTm9uRW1wdHkobWJJbmZvKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIgKyBtYkluZm8pOwotICAgICAgICAgICAgVGhyZWFkTVhCZWFuIHRocmVhZCA9IG51bGwgOwotCi0gICAgICAgICAgICB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICBKTVgubmV3TVhCZWFuUHJveHkobWJzYywKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkTVhCZWFuLmNsYXNzKSA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbmRNb25pdG9yRGVhZGxvY2tlZFRocmVhZHNcdFx0IgotICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5maW5kTW9uaXRvckRlYWRsb2NrZWRUaHJlYWRzKCkpOwotICAgICAgICAgICAgbG9uZ1tdIHRocmVhZElEcyA9IHRocmVhZC5nZXRBbGxUaHJlYWRJZHMoKSA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldEFsbFRocmVhZElkc1x0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgdGhyZWFkSURzKTsKLQotICAgICAgICAgICAgZm9yICggbG9uZyB0aHJlYWRJRCA6IHRocmVhZElEcyApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFRocmVhZEluZm8gbG9uZ1x0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5nZXRUaHJlYWRJbmZvKHRocmVhZElEKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRUaHJlYWRJbmZvIGxvbmcsIGludFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5nZXRUaHJlYWRJbmZvKHRocmVhZElELCAyKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VGhyZWFkSW5mbyBsb25nW11cdFx0IgotICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5nZXRUaHJlYWRJbmZvKHRocmVhZElEcykpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRUaHJlYWRJbmZvIGxvbmdbXSwgaW50XHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyB0aHJlYWQuZ2V0VGhyZWFkSW5mbyh0aHJlYWRJRHMsIDIpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RGFlbW9uVGhyZWFkQ291bnRcdFx0IgotICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5nZXREYWVtb25UaHJlYWRDb3VudCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0UGVha1RocmVhZENvdW50XHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyB0aHJlYWQuZ2V0UGVha1RocmVhZENvdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRUaHJlYWRDb3VudFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgdGhyZWFkLmdldFRocmVhZENvdW50KCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRUb3RhbFN0YXJ0ZWRUaHJlYWRDb3VudFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgdGhyZWFkLmdldFRvdGFsU3RhcnRlZFRocmVhZENvdW50KCkpOwotICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0ZWQgPSB0aHJlYWQuaXNUaHJlYWRDb250ZW50aW9uTW9uaXRvcmluZ1N1cHBvcnRlZCgpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNUaHJlYWRDb250ZW50aW9uTW9uaXRvcmluZ1N1cHBvcnRlZFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgc3VwcG9ydGVkKTsKLQotICAgICAgICAgICAgaWYgKCBzdXBwb3J0ZWQgKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc1RocmVhZENvbnRlbnRpb25Nb25pdG9yaW5nRW5hYmxlZFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHRocmVhZC5pc1RocmVhZENvbnRlbnRpb25Nb25pdG9yaW5nRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3VwcG9ydGVkID0gdGhyZWFkLmlzVGhyZWFkQ3B1VGltZVN1cHBvcnRlZCgpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNUaHJlYWRDcHVUaW1lU3VwcG9ydGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBzdXBwb3J0ZWQpOwotCi0gICAgICAgICAgICBpZiAoIHN1cHBvcnRlZCApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImlzVGhyZWFkQ3B1VGltZUVuYWJsZWRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0aHJlYWQuaXNUaHJlYWRDcHVUaW1lRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgICAgIGZvciAobG9uZyBpZCA6IHRocmVhZElEcykgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFRocmVhZENwdVRpbWUoIiArIGlkICsgIilcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyZWFkLmdldFRocmVhZENwdVRpbWUoaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRUaHJlYWRVc2VyVGltZSgiICsgaWQgKyAiKVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aHJlYWQuZ2V0VGhyZWFkVXNlclRpbWUoaWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN1cHBvcnRlZCA9IHRocmVhZC5pc0N1cnJlbnRUaHJlYWRDcHVUaW1lU3VwcG9ydGVkKCkgOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc0N1cnJlbnRUaHJlYWRDcHVUaW1lU3VwcG9ydGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBzdXBwb3J0ZWQpOwotCi0gICAgICAgICAgICBpZiAoIHN1cHBvcnRlZCApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldEN1cnJlbnRUaHJlYWRDcHVUaW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyZWFkLmdldEN1cnJlbnRUaHJlYWRDcHVUaW1lKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Q3VycmVudFRocmVhZFVzZXJUaW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyZWFkLmdldEN1cnJlbnRUaHJlYWRVc2VyVGltZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyZWFkLnJlc2V0UGVha1RocmVhZENvdW50KCkgOwotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKyA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1JcbiIpIDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnJvckNvdW50IDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGRvUnVudGltZU1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIFJ1bnRpbWVNWEJlYW4iKSA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgcnVudGltZU5hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShNYW5hZ2VtZW50RmFjdG9yeS5SVU5USU1FX01YQkVBTl9OQU1FKSA7Ci0gICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8ocnVudGltZU5hbWUpOwotICAgICAgICAgICAgZXJyb3JDb3VudCArPSBjaGVja05vbkVtcHR5KG1iSW5mbyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE1CZWFuSW5mb1x0XHQiICsgbWJJbmZvKTsKLSAgICAgICAgICAgIFJ1bnRpbWVNWEJlYW4gcnVudGltZSA9IG51bGw7Ci0KLSAgICAgICAgICAgIHJ1bnRpbWUgPQotICAgICAgICAgICAgICAgICAgICBKTVgubmV3TVhCZWFuUHJveHkobWJzYywKLSAgICAgICAgICAgICAgICAgICAgcnVudGltZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVNWEJlYW4uY2xhc3MpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Q2xhc3NQYXRoXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldENsYXNzUGF0aCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0SW5wdXRBcmd1bWVudHNcdFx0IgotICAgICAgICAgICAgICAgICAgICArIHJ1bnRpbWUuZ2V0SW5wdXRBcmd1bWVudHMoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldExpYnJhcnlQYXRoXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldExpYnJhcnlQYXRoKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRNYW5hZ2VtZW50U3BlY1ZlcnNpb25cdFx0IgotICAgICAgICAgICAgICAgICAgICArIHJ1bnRpbWUuZ2V0TWFuYWdlbWVudFNwZWNWZXJzaW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROYW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFNwZWNOYW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldFNwZWNOYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRTcGVjVmVuZG9yXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldFNwZWNWZW5kb3IoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFNwZWNWZXJzaW9uXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldFNwZWNWZXJzaW9uKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRTdGFydFRpbWVcdFx0IgotICAgICAgICAgICAgICAgICAgICArIHJ1bnRpbWUuZ2V0U3RhcnRUaW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRTeXN0ZW1Qcm9wZXJ0aWVzXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldFN5c3RlbVByb3BlcnRpZXMoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFVwdGltZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgcnVudGltZS5nZXRVcHRpbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZtTmFtZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgcnVudGltZS5nZXRWbU5hbWUoKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFZtVmVuZG9yXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldFZtVmVuZG9yKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRWbVZlcnNpb25cdFx0IgotICAgICAgICAgICAgICAgICAgICArIHJ1bnRpbWUuZ2V0Vm1WZXJzaW9uKCkpOwotICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0ZWQgPSBydW50aW1lLmlzQm9vdENsYXNzUGF0aFN1cHBvcnRlZCgpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNCb290Q2xhc3NQYXRoU3VwcG9ydGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBzdXBwb3J0ZWQpOwotCi0gICAgICAgICAgICBpZiAoIHN1cHBvcnRlZCApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldEJvb3RDbGFzc1BhdGhcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBydW50aW1lLmdldEJvb3RDbGFzc1BhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgZXJyb3JDb3VudCsrIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUlxuIikgOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yQ291bnQgOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZG9PcGVyYXRpbmdTeXN0ZW1NWEJlYW5UZXN0KE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnNjKSB7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPcGVyYXRpbmdTeXN0ZW1NWEJlYW4iKSA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgb3BlcmF0aW9uTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKE1hbmFnZW1lbnRGYWN0b3J5Lk9QRVJBVElOR19TWVNURU1fTVhCRUFOX05BTUUpIDsKLSAgICAgICAgICAgIE1CZWFuSW5mbyBtYkluZm8gPSBtYnNjLmdldE1CZWFuSW5mbyhvcGVyYXRpb25OYW1lKTsKLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gY2hlY2tOb25FbXB0eShtYkluZm8pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRNQmVhbkluZm9cdFx0IiArIG1iSW5mbyk7Ci0gICAgICAgICAgICBPcGVyYXRpbmdTeXN0ZW1NWEJlYW4gb3BlcmF0aW9uID0gbnVsbCA7Ci0KLSAgICAgICAgICAgIG9wZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIEpNWC5uZXdNWEJlYW5Qcm94eShtYnNjLAotICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICBPcGVyYXRpbmdTeXN0ZW1NWEJlYW4uY2xhc3MpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0QXJjaFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgb3BlcmF0aW9uLmdldEFyY2goKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldEF2YWlsYWJsZVByb2Nlc3NvcnNcdFx0IgotICAgICAgICAgICAgICAgICAgICArIG9wZXJhdGlvbi5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROYW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBvcGVyYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VmVyc2lvblx0XHQiCi0gICAgICAgICAgICAgICAgICAgICsgb3BlcmF0aW9uLmdldFZlcnNpb24oKSk7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgZXJyb3JDb3VudCsrIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUlxuIikgOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yQ291bnQgOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZG9Db21waWxhdGlvbk1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIENvbXBpbGF0aW9uTVhCZWFuIikgOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3ROYW1lIGNvbXBpbGF0aW9uTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKE1hbmFnZW1lbnRGYWN0b3J5LkNPTVBJTEFUSU9OX01YQkVBTl9OQU1FKTsKLQotICAgICAgICAgICAgaWYgKCBtYnNjLmlzUmVnaXN0ZXJlZChjb21waWxhdGlvbk5hbWUpICkgewotICAgICAgICAgICAgICAgIE1CZWFuSW5mbyBtYkluZm8gPSBtYnNjLmdldE1CZWFuSW5mbyhjb21waWxhdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIGVycm9yQ291bnQgKz0gY2hlY2tOb25FbXB0eShtYkluZm8pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIgKyBtYkluZm8pOwotICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uTVhCZWFuIGNvbXBpbGF0aW9uID0gbnVsbCA7Ci0KLSAgICAgICAgICAgICAgICBjb21waWxhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBKTVgubmV3TVhCZWFuUHJveHkobWJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGF0aW9uTVhCZWFuLmNsYXNzKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROYW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGlsYXRpb24uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHN1cHBvcnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21waWxhdGlvbi5pc0NvbXBpbGF0aW9uVGltZU1vbml0b3JpbmdTdXBwb3J0ZWQoKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc0NvbXBpbGF0aW9uVGltZU1vbml0b3JpbmdTdXBwb3J0ZWRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzdXBwb3J0ZWQpOwotCi0gICAgICAgICAgICAgICAgaWYgKCBzdXBwb3J0ZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VG90YWxDb21waWxhdGlvblRpbWVcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGlsYXRpb24uZ2V0VG90YWxDb21waWxhdGlvblRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKyA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1JcbiIpIDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnJvckNvdW50IDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGRvR2FyYmFnZUNvbGxlY3Rvck1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEdhcmJhZ2VDb2xsZWN0b3JNWEJlYW4iKSA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgZmlsdGVyTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKE1hbmFnZW1lbnRGYWN0b3J5LkdBUkJBR0VfQ09MTEVDVE9SX01YQkVBTl9ET01BSU5fVFlQRQotICAgICAgICAgICAgICAgICAgICArICIsKiIpOwotICAgICAgICAgICAgU2V0PE9iamVjdE5hbWU+IG9uU2V0ID0gbWJzYy5xdWVyeU5hbWVzKGZpbHRlck5hbWUsIG51bGwpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPE9iamVjdE5hbWU+IGl0ZXIgPSBvblNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBnYXJiYWdlTmFtZSA9IGl0ZXIubmV4dCgpIDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tICIgKyBnYXJiYWdlTmFtZSkgOwotICAgICAgICAgICAgICAgIE1CZWFuSW5mbyBtYkluZm8gPSBtYnNjLmdldE1CZWFuSW5mbyhnYXJiYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBjaGVja05vbkVtcHR5KG1iSW5mbyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRNQmVhbkluZm9cdFx0IiArIG1iSW5mbyk7Ci0gICAgICAgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rvck1YQmVhbiBnYXJiYWdlID0gbnVsbCA7Ci0KLSAgICAgICAgICAgICAgICBnYXJiYWdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpNWC5uZXdNWEJlYW5Qcm94eShtYnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2FyYmFnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBHYXJiYWdlQ29sbGVjdG9yTVhCZWFuLmNsYXNzKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRDb2xsZWN0aW9uQ291bnRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBnYXJiYWdlLmdldENvbGxlY3Rpb25Db3VudCgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldENvbGxlY3Rpb25UaW1lXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FyYmFnZS5nZXRDb2xsZWN0aW9uVGltZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICBlcnJvckNvdW50KysgOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEVSUk9SXG4iKSA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyb3JDb3VudCA7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIGZpbmFsIGludCBkb01lbW9yeU1hbmFnZXJNWEJlYW5UZXN0KE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnNjKSB7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBNZW1vcnlNYW5hZ2VyTVhCZWFuIikgOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3ROYW1lIGZpbHRlck5hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShNYW5hZ2VtZW50RmFjdG9yeS5NRU1PUllfTUFOQUdFUl9NWEJFQU5fRE9NQUlOX1RZUEUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCoiKTsKLSAgICAgICAgICAgIFNldDxPYmplY3ROYW1lPiBvblNldCA9IG1ic2MucXVlcnlOYW1lcyhmaWx0ZXJOYW1lLCBudWxsKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxPYmplY3ROYW1lPiBpdGVyID0gb25TZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbWVtb3J5TWFuYWdlck5hbWUgPSBpdGVyLm5leHQoKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLSAiICsgbWVtb3J5TWFuYWdlck5hbWUpIDsKLSAgICAgICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8obWVtb3J5TWFuYWdlck5hbWUpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIgKyBtYkluZm8pOwotICAgICAgICAgICAgICAgIGVycm9yQ291bnQgKz0gY2hlY2tOb25FbXB0eShtYkluZm8pOwotICAgICAgICAgICAgICAgIE1lbW9yeU1hbmFnZXJNWEJlYW4gbWVtb3J5TWFuYWdlciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICBtZW1vcnlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpNWC5uZXdNWEJlYW5Qcm94eShtYnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5TWFuYWdlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlNYW5hZ2VyTVhCZWFuLmNsYXNzKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRNZW1vcnlQb29sTmFtZXNcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMuZGVlcFRvU3RyaW5nKG1lbW9yeU1hbmFnZXIuZ2V0TWVtb3J5UG9vbE5hbWVzKCkpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5hbWVcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZW1vcnlNYW5hZ2VyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc1ZhbGlkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbWVtb3J5TWFuYWdlci5pc1ZhbGlkKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKyA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1JcbiIpIDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnJvckNvdW50IDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGRvTWVtb3J5UG9vbE1YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE1lbW9yeVBvb2xNWEJlYW4iKSA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgZmlsdGVyTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKE1hbmFnZW1lbnRGYWN0b3J5Lk1FTU9SWV9QT09MX01YQkVBTl9ET01BSU5fVFlQRQotICAgICAgICAgICAgICAgICAgICArICIsKiIpOwotICAgICAgICAgICAgU2V0PE9iamVjdE5hbWU+IG9uU2V0ID0gbWJzYy5xdWVyeU5hbWVzKGZpbHRlck5hbWUsIG51bGwpOwotCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPE9iamVjdE5hbWU+IGl0ZXIgPSBvblNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBtZW1vcnlQb29sTmFtZSA9IGl0ZXIubmV4dCgpIDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tICIgKyBtZW1vcnlQb29sTmFtZSkgOwotICAgICAgICAgICAgICAgIE1CZWFuSW5mbyBtYkluZm8gPSBtYnNjLmdldE1CZWFuSW5mbyhtZW1vcnlQb29sTmFtZSk7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBjaGVja05vbkVtcHR5KG1iSW5mbyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRNQmVhbkluZm9cdFx0IiArIG1iSW5mbyk7Ci0gICAgICAgICAgICAgICAgTWVtb3J5UG9vbE1YQmVhbiBtZW1vcnlQb29sID0gbnVsbDsKLQotICAgICAgICAgICAgICAgIG1lbW9yeVBvb2wgPQotICAgICAgICAgICAgICAgICAgICAgICAgSk1YLm5ld01YQmVhblByb3h5KG1ic2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlQb29sTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeVBvb2xNWEJlYW4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRDb2xsZWN0aW9uVXNhZ2VcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZW1vcnlQb29sLmdldENvbGxlY3Rpb25Vc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE1lbW9yeU1hbmFnZXJOYW1lc1x0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy5kZWVwVG9TdHJpbmcobWVtb3J5UG9vbC5nZXRNZW1vcnlNYW5hZ2VyTmFtZXMoKSkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TmFtZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFBlYWtVc2FnZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuZ2V0UGVha1VzYWdlKCkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VHlwZVx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFVzYWdlXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbWVtb3J5UG9vbC5nZXRVc2FnZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImlzVmFsaWRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBtZW1vcnlQb29sLmlzVmFsaWQoKSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0ZWQgPSBtZW1vcnlQb29sLmlzVXNhZ2VUaHJlc2hvbGRTdXBwb3J0ZWQoKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc1VzYWdlVGhyZXNob2xkU3VwcG9ydGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3VwcG9ydGVkKTsKLQotICAgICAgICAgICAgICAgIGlmICggc3VwcG9ydGVkICkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFVzYWdlVGhyZXNob2xkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuZ2V0VXNhZ2VUaHJlc2hvbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaXNVc2FnZVRocmVzaG9sZEV4Y2VlZGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuaXNVc2FnZVRocmVzaG9sZEV4Y2VlZGVkKCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldFVzYWdlVGhyZXNob2xkQ291bnRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWVtb3J5UG9vbC5nZXRVc2FnZVRocmVzaG9sZENvdW50KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN1cHBvcnRlZCA9IG1lbW9yeVBvb2wuaXNDb2xsZWN0aW9uVXNhZ2VUaHJlc2hvbGRTdXBwb3J0ZWQoKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc0NvbGxlY3Rpb25Vc2FnZVRocmVzaG9sZFN1cHBvcnRlZFx0XHQiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHN1cHBvcnRlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIHN1cHBvcnRlZCApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXRDb2xsZWN0aW9uVXNhZ2VUaHJlc2hvbGRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWVtb3J5UG9vbC5nZXRDb2xsZWN0aW9uVXNhZ2VUaHJlc2hvbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Q29sbGVjdGlvblVzYWdlVGhyZXNob2xkQ291bnRcdFx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWVtb3J5UG9vbC5nZXRDb2xsZWN0aW9uVXNhZ2VUaHJlc2hvbGRDb3VudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJpc0NvbGxlY3Rpb25Vc2FnZVRocmVzaG9sZEV4Y2VlZGVkXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1lbW9yeVBvb2wuaXNDb2xsZWN0aW9uVXNhZ2VUaHJlc2hvbGRFeGNlZWRlZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtZW1vcnlQb29sLnJlc2V0UGVha1VzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgZXJyb3JDb3VudCsrIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUlxuIikgOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yQ291bnQgOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBpbnQgY2hlY2tOb25FbXB0eShNQmVhbkluZm8gbWJpKSB7Ci0gICAgICAgIGlmICggbWJpLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBNQmVhbkluZm8gaXMgZW1wdHkgISIpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vTVhCZWFuSW50ZXJvcFRlc3QyLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5JbnRlcm9wVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3MTM1Ny4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5JbnRlcm9wVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwNTg4NjUKLSAqIEBzdW1tYXJ5IENoZWNrcyBhY2Nlc3MgdG8gdGVzdCBNWEJlYW4KLSAqIEBhdXRob3IgT2xpdmllciBMYWduZWF1Ci0gKiBAbW9kdWxlcyBqYXZhLm1hbmFnZW1lbnQKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkKLSAqIEBjb21waWxlIEJhc2ljLmphdmEKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgTVhCZWFuSW50ZXJvcFRlc3QyCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkpNWDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQXR0cmlidXRlSW5mbzsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuQ29uc3RydWN0b3JJbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk5vdGlmaWNhdGlvbkluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk9wZXJhdGlvbkluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkw7Ci0KLXB1YmxpYyBjbGFzcyBNWEJlYW5JbnRlcm9wVGVzdDIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJBU0lDX01YQkVBTl9DTEFTU19OQU1FID0gIkJhc2ljIjsKLQotICAgIC8qCi0gICAgICogRmlyc3QgRGVidWcgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIGFyZSBjb2xsZWN0IGluIGV4cGVjdGVkCi0gICAgICogbWFwICAoYXJnTmFtZSwgdmFsdWUpIGZvcm1hdCwgdGhlbiBjYWxscyBvcmlnaW5hbCB0ZXN0J3MgcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICAvLyBQYXJzZXMgcGFyYW1ldGVycwotICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IFV0aWxzLnBhcnNlUGFyYW1ldGVycyhhcmdzKSA7Ci0KLSAgICAgICAgLy8gUnVuIHRlc3QKLSAgICAgICAgTVhCZWFuSW50ZXJvcFRlc3QyIHRlc3QgPSBuZXcgTVhCZWFuSW50ZXJvcFRlc3QyKCk7Ci0gICAgICAgIHRlc3QucnVuKG1hcCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBydW4oTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5JbnRlcm9wVGVzdDI6OnJ1bjogU3RhcnQiKSA7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEpNWCBNYmVhblNlcnZlciB1c2VkIGluc2lkZSBzaW5nbGUgVk0gYXMgaWYgcmVtb3RlLgotICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbWJzID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOwotCi0gICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIHVybCA9IG5ldyBKTVhTZXJ2aWNlVVJMKCJybWkiLCBudWxsLCAwKTsKLSAgICAgICAgICAgIEpNWENvbm5lY3RvclNlcnZlciBjcyA9Ci0gICAgICAgICAgICAgICAgSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeS5uZXdKTVhDb25uZWN0b3JTZXJ2ZXIodXJsLCBudWxsLCBtYnMpOwotICAgICAgICAgICAgY3Muc3RhcnQoKTsKLQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gY3MuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgSk1YQ29ubmVjdG9yIGNjID0gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KGFkZHIpOwotICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gUHJpbnRzIGFsbCBNQmVhbnMgd2hhdGV2ZXIgdGhlIGRvbWFpbiBpcy4KLSAgICAgICAgICAgIHByaW50TUJlYW5zKG1ic2MpIDsKLQotICAgICAgICAgICAgLy8gQ2FsbCB0ZXN0IGJvZHkKLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gZG9CYXNpY01YQmVhblRlc3QobWJzYykgOwotCi0gICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIEpNWCBDbGllbnQKLSAgICAgICAgICAgIGNjLmNsb3NlKCk7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGVycm9yQ291bnQgPT0gMCApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuSW50ZXJvcFRlc3QyOjpydW46IERvbmUgd2l0aG91dCBhbnkgZXJyb3IiKSA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbkludGVyb3BUZXN0Mjo6cnVuOiBEb25lIHdpdGggIgotICAgICAgICAgICAgICAgICAgICArIGVycm9yQ291bnQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGVycm9yKHMpIikgOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVycm9yQ291bnQgPSAiICsgZXJyb3JDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhbGwgTUJlYW5zIHdoYXRldmVyIHRoZSBkb21haW4gaXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE1CZWFucyhNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNldDxPYmplY3ROYW1lPiBzZXQgPSBtYnNjLnF1ZXJ5TmFtZXMobnVsbCwgbnVsbCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBNQmVhbnMgZm91bmQgOiIpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3I8T2JqZWN0TmFtZT4gaXRlciA9IHNldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaXRlci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuIikgOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgZG9CYXNpY01YQmVhblRlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIGRvQmFzaWNNWEJlYW5UZXN0IikgOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPYmplY3ROYW1lIG9iak5hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSgic3FlOnR5cGU9QmFzaWNNWEJlYW4iKSA7Ci0gICAgICAgICAgICBtYnNjLmNyZWF0ZU1CZWFuKEJBU0lDX01YQkVBTl9DTEFTU19OQU1FLCBvYmpOYW1lKTsKLSAgICAgICAgICAgIE1CZWFuSW5mbyBtYkluZm8gPSBtYnNjLmdldE1CZWFuSW5mbyhvYmpOYW1lKTsKLSAgICAgICAgICAgIHByaW50TUJlYW5JbmZvKG1iSW5mbyk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0TUJlYW5JbmZvXHRcdCIKLSAgICAgICAgICAgICAgICAgICAgKyBtYkluZm8pOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2sgbXhiZWFuIGZpZWxkIGluIHRoZSBNQmVhbkluZm8iKTsKLSAgICAgICAgICAgIFN0cmluZyBteGJlYW5GaWVsZCA9Ci0gICAgICAgICAgICAgICAgICAgIChTdHJpbmcpbWJJbmZvLmdldERlc2NyaXB0b3IoKS5nZXRGaWVsZFZhbHVlKEpNWC5NWEJFQU5fRklFTEQpOwotCi0gICAgICAgICAgICBpZiAoIG14YmVhbkZpZWxkID09IG51bGwgfHwgISBteGJlYW5GaWVsZC5lcXVhbHMoInRydWUiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUiA6IEltcHJvcGVyIG14YmVhbiBmaWVsZCB2YWx1ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG14YmVhbkZpZWxkKTsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXQgYXR0cmlidXRlIE9iamVjdE5hbWVBdHQiKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHQgPSBuZXcgQXR0cmlidXRlKCJPYmplY3ROYW1lQXR0Iiwgb2JqTmFtZSk7Ci0gICAgICAgICAgICBtYnNjLnNldEF0dHJpYnV0ZShvYmpOYW1lLCBhdHQpOwotICAgICAgICAgICAgT2JqZWN0TmFtZSB2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChPYmplY3ROYW1lKW1ic2MuZ2V0QXR0cmlidXRlKG9iak5hbWUsICJPYmplY3ROYW1lQXR0Iik7Ci0KLSAgICAgICAgICAgIGlmICggISB2YWx1ZS5lcXVhbHMob2JqTmFtZSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUiA6IHNldEF0dHJpYnV0ZSBmYWlsZWQsIGdvdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgd2hpbGUgZXhwZWN0aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgb2JqTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsIG9wZXJhdGlvbiBkb05vdGhpbmciKTsKLSAgICAgICAgICAgIG1ic2MuaW52b2tlKG9iak5hbWUsICAiZG9Ob3RoaW5nIiwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDYWxsIG9wZXJhdGlvbiBnZXRXZWF0aGVyIik7Ci0gICAgICAgICAgICBPYmplY3Qgd2VhdGhlciA9IG1ic2MuaW52b2tlKG9iak5hbWUsCi0gICAgICAgICAgICAgICAgICAgICJnZXRXZWF0aGVyIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde0Jvb2xlYW4uVFJVRX0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiYm9vbGVhbiJ9KTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2VhdGhlciBpcyAiICsgd2VhdGhlcik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKyA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1JcbiIpIDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnJvckNvdW50IDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRNQmVhbkluZm8oTUJlYW5JbmZvIG1iSW5mbykgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0aW9uICIgKyBtYkluZm8uZ2V0RGVzY3JpcHRpb24oKSk7Ci0KLSAgICAgICAgZm9yIChNQmVhbkNvbnN0cnVjdG9ySW5mbyBjdG9yIDogbWJJbmZvLmdldENvbnN0cnVjdG9ycygpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbnN0cnVjdG9yICIgKyBjdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1CZWFuQXR0cmlidXRlSW5mbyBhdHQgOiBtYkluZm8uZ2V0QXR0cmlidXRlcygpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF0dHJpYnV0ZSAiICsgYXR0LmdldE5hbWUoKQotICAgICAgICAgICAgKyAiIFsiICsgYXR0LmdldFR5cGUoKSArICJdIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1CZWFuT3BlcmF0aW9uSW5mbyBvcGVyIDogbWJJbmZvLmdldE9wZXJhdGlvbnMoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcGVyYXRpb24gIiArIG9wZXIuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoTUJlYW5Ob3RpZmljYXRpb25JbmZvIG5vdGlmIDogbWJJbmZvLmdldE5vdGlmaWNhdGlvbnMoKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3RpZmljYXRpb24gIiArIG5vdGlmLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5Mb2FkaW5nVGVzdDEuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbkxvYWRpbmdUZXN0MS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTkyNjA3Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbkxvYWRpbmdUZXN0MS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODA1ODg2NQotICogQHN1bW1hcnkgQ2hlY2tzIGNvcnJlY3QgY29sbGVjdGlvbiBvZiBNWEJlYW4ncyBjbGFzcyBhZnRlciB1bnJlZ2lzdHJhdGlvbgotICogQGF1dGhvciBPbGl2aWVyIExhZ25lYXUKLSAqIEBtb2R1bGVzIGphdmEubWFuYWdlbWVudAotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgTVhCZWFuTG9hZGluZ1Rlc3QxCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1YOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5PcGVyYXRpb25JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NWEJlYW47Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQubG9hZGluZy5Qcml2YXRlTUxldDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGFTdXBwb3J0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZVR5cGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlblR5cGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uU2ltcGxlVHlwZTsKLQotcHVibGljIGNsYXNzIE1YQmVhbkxvYWRpbmdUZXN0MSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTVhCZWFuTG9hZGluZ1Rlc3QxIHRlc3QgPSBuZXcgTVhCZWFuTG9hZGluZ1Rlc3QxKCk7Ci0gICAgICAgIHRlc3QucnVuKChNYXA8U3RyaW5nLCBPYmplY3Q+KW51bGwpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgcnVuKE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuTG9hZGluZ1Rlc3QxOjpydW46IFN0YXJ0IikgOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlIGVuc3VyZSBubyByZWZlcmVuY2UgaXMgcmV0YWluZWQgb24gTVhCZWFuIGNsYXNzIgotICAgICAgICAgICAgICAgICAgICArICIgYWZ0ZXIgaXQgaXMgdW5yZWdpc3RlcmVkLiBXZSB0YWtlIHRpbWUgdG8gcGVyZm9ybSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNvbWUgbGl0dGxlIGV4dHJhIGNoZWNrIG9mIERlc2NyaXB0b3JzLCBNQmVhbipJbmZvLiIpOwotCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBteUNsYXNzTG9hZGVyID0gTVhCZWFuTG9hZGluZ1Rlc3QxLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmICghKG15Q2xhc3NMb2FkZXIgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIFRlc3QncyBjbGFzcyBsb2FkZXIgaXMgbm90ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImEgVVJMQ2xhc3NMb2FkZXIiOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVVJMQ2xhc3NMb2FkZXIgbXlVUkxDbGFzc0xvYWRlciA9IChVUkxDbGFzc0xvYWRlcikgbXlDbGFzc0xvYWRlcjsKLSAgICAgICAgICAgIFVSTFtdIHVybHMgPSBteVVSTENsYXNzTG9hZGVyLmdldFVSTHMoKTsKLSAgICAgICAgICAgIFByaXZhdGVNTGV0IG1sZXQgPSBuZXcgUHJpdmF0ZU1MZXQodXJscywgbnVsbCwgZmFsc2UpOwotICAgICAgICAgICAgQ2xhc3M8Pz4gc2hhZG93Q2xhc3MgPSBtbGV0LmxvYWRDbGFzcyhUZXN0TVhCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChzaGFkb3dDbGFzcyA9PSBUZXN0TVhCZWFuLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBNTGV0IGdvdCBvcmlnaW5hbCBUZXN0TVhCZWFuLCBub3Qgc2hhZG93IjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaGFkb3dDbGFzcyA9IG51bGw7Ci0KLSAgICAgICAgICAgIE1CZWFuU2VydmVyIG1icyA9IE1CZWFuU2VydmVyRmFjdG9yeS5jcmVhdGVNQmVhblNlcnZlcigpOwotICAgICAgICAgICAgT2JqZWN0TmFtZSBtbGV0TmFtZSA9IG5ldyBPYmplY3ROYW1lKCJ4OnR5cGU9bWxldCIpOwotICAgICAgICAgICAgbWJzLnJlZ2lzdGVyTUJlYW4obWxldCwgbWxldE5hbWUpOwotCi0gICAgICAgICAgICBPYmplY3ROYW1lIHRlc3ROYW1lID0gbmV3IE9iamVjdE5hbWUoIng6dHlwZT10ZXN0Iik7Ci0gICAgICAgICAgICBtYnMuY3JlYXRlTUJlYW4oVGVzdC5jbGFzcy5nZXROYW1lKCksIHRlc3ROYW1lLCBtbGV0TmFtZSk7Ci0KLSAgICAgICAgICAgIC8vIFRoYXQgdGVzdCBmYWlscyBiZWNhdXNlIHRoZSBNWEJlYW4gaW5zdGFuY2UgaXMgYWNjZXNzZWQgdmlhCi0gICAgICAgICAgICAvLyBhIGRlbGVnYXRlIE9wZW5NQmVhbiB3aGljaCBoYXMKLSAgICAgICAgICAgIENsYXNzTG9hZGVyIHRlc3RMb2FkZXIgPSBtYnMuZ2V0Q2xhc3NMb2FkZXJGb3IodGVzdE5hbWUpOwotCi0gICAgICAgICAgICBpZiAodGVzdExvYWRlciAhPSBtbGV0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNTGV0ICIgKyBtbGV0KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIE1YQmVhbidzIGNsYXNzIGxvYWRlciBpcyBub3QgTUxldDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyB0ZXN0TG9hZGVyOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlc3RMb2FkZXIgPSBudWxsOwotCi0KLSAgICAgICAgICAgIC8vIEN5Y2xlIGdldC9zZXQvZ2V0IG9mIHRoZSBhdHRyaWJ1dGUgb2YgdHlwZSBMdWlzLgotICAgICAgICAgICAgLy8gV2UgY2hlY2sgdGhlIHNldCBpcyBlZmZlY3RpdmUuCi0gICAgICAgICAgICBDb21wb3NpdGVEYXRhIGNkX0IgPSAoQ29tcG9zaXRlRGF0YSltYnMuZ2V0QXR0cmlidXRlKHRlc3ROYW1lLCAiQiIpOwotICAgICAgICAgICAgQ29tcG9zaXRlVHlwZSBjb21wVHlwZV9CID0gY2RfQi5nZXRDb21wb3NpdGVUeXBlKCk7Ci0KLSAgICAgICAgICAgIENvbXBvc2l0ZURhdGFTdXBwb3J0IGNkc19CID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvc2l0ZURhdGFTdXBwb3J0KGNvbXBUeXBlX0IsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsic29tZXRoaW5nIn0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtJbnRlZ2VyLnZhbHVlT2YoMTMpfSk7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgbXlBdHQgPSBuZXcgQXR0cmlidXRlKCJCIiwgIGNkc19CKTsKLSAgICAgICAgICAgIG1icy5zZXRBdHRyaWJ1dGUodGVzdE5hbWUsIG15QXR0KTsKLQotICAgICAgICAgICAgQ29tcG9zaXRlRGF0YSBjZF9CMiA9IChDb21wb3NpdGVEYXRhKW1icy5nZXRBdHRyaWJ1dGUodGVzdE5hbWUsICJCIik7Ci0KLSAgICAgICAgICAgIGlmICggKChJbnRlZ2VyKWNkX0IyLmdldCgic29tZXRoaW5nIikpLmludFZhbHVlKCkgIT0gMTMgKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBUaGUgc2V0QXR0cmlidXRlIG9mIGF0dCBCIGRpZCBub3Qgd29yazsiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZXhwZWN0IEx1aXMuc29tZXRoaW5nID0gMTMgYnV0IGdvdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNkX0IyLmdldCgic29tZXRoaW5nIik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNQmVhbkluZm8gaW5mbyA9IG1icy5nZXRNQmVhbkluZm8odGVzdE5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIG14YmVhbkZpZWxkID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZylpbmZvLmdldERlc2NyaXB0b3IoKS5nZXRGaWVsZFZhbHVlKEpNWC5NWEJFQU5fRklFTEQpOwotCi0gICAgICAgICAgICBpZiAoIG14YmVhbkZpZWxkID09IG51bGwgfHwgISBteGJlYW5GaWVsZC5lcXVhbHMoInRydWUiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIihFUlJPUikgSW1wcm9wZXIgbXhiZWFuIGZpZWxkIHZhbHVlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbXhiZWFuRmllbGQ7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayB0aGUgMiBhdHRyaWJ1dGVzLgotICAgICAgICAgICAgTUJlYW5BdHRyaWJ1dGVJbmZvW10gYXR0cnMgPSBpbmZvLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICAgICAgaWYgKCBhdHRycy5sZW5ndGggPT0gMiApIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1CZWFuQXR0cmlidXRlSW5mbyBtYmFpIDogYXR0cnMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpbWJhaS5nZXREZXNjcmlwdG9yKCkuZ2V0RmllbGRWYWx1ZShKTVguT1JJR0lOQUxfVFlQRV9GSUVMRCk7Ci0gICAgICAgICAgICAgICAgICAgIE9wZW5UeXBlPD8+IG9wZW5UeXBlRmllbGRWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wZW5UeXBlPD8+KW1iYWkuZ2V0RGVzY3JpcHRvcigpLmdldEZpZWxkVmFsdWUoSk1YLk9QRU5fVFlQRV9GSUVMRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBtYmFpLmdldE5hbWUoKS5lcXVhbHMoIkEiKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW1iYWkuaXNSZWFkYWJsZSgpIHx8ICFtYmFpLmlzV3JpdGFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWJhaS5pc0lzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtYmFpLmdldFR5cGUoKS5lcXVhbHMoImludCIpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIihFUlJPUikgVW5leHBlY3RlZCBNQmVhbkF0dHJpYnV0ZUluZm8gZm9yIEEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtYmFpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWUuZXF1YWxzKCJpbnQiKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIFVuZXhwZWN0ZWQgb3JpZ2luYWxUeXBlIGluIERlc2NyaXB0b3IgZm9yIEEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvcmlnaW5hbFR5cGVGaWVsZFZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIG9wZW5UeXBlRmllbGRWYWx1ZS5lcXVhbHMoU2ltcGxlVHlwZS5JTlRFR0VSKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIFVuZXhwZWN0ZWQgb3BlblR5cGUgaW4gRGVzY3JpcHRvciBmb3IgQSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBtYmFpLmdldE5hbWUoKS5lcXVhbHMoIkIiKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW1iYWkuaXNSZWFkYWJsZSgpIHx8ICFtYmFpLmlzV3JpdGFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWJhaS5pc0lzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtYmFpLmdldFR5cGUoKS5lcXVhbHMoImphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGEiKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIFVuZXhwZWN0ZWQgTUJlYW5BdHRyaWJ1dGVJbmZvIGZvciBCICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWJhaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBvcmlnaW5hbFR5cGVGaWVsZFZhbHVlLmVxdWFscyhMdWlzLmNsYXNzLmdldE5hbWUoKSkgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBVbmV4cGVjdGVkIG9yaWdpbmFsVHlwZSBpbiBEZXNjcmlwdG9yIGZvciBCICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3JpZ2luYWxUeXBlRmllbGRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISBvcGVuVHlwZUZpZWxkVmFsdWUuZXF1YWxzKGNvbXBUeXBlX0IpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIihFUlJPUikgVW5leHBlY3RlZCBvcGVuVHlwZSBpbiBEZXNjcmlwdG9yIGZvciBCICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcFR5cGVfQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICIoRVJST1IpIFVua25vd24gYXR0cmlidXRlIG5hbWUiOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIihFUlJPUikgVW5leHBlY3RlZCBNQmVhbkF0dHJpYnV0ZUluZm8gYXJyYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy5kZWVwVG9TdHJpbmcoYXR0cnMpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIE1YQmVhbiBvcGVyYXRpb24uCi0gICAgICAgICAgICBNQmVhbk9wZXJhdGlvbkluZm9bXSBvcHMgPSBpbmZvLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIC8vIFRoZSBpbXBhY3QgaXMgQUNUSU9OX0lORk8gYXMgZm9yIGEgc3RhbmRhcmQgTUJlYW4gaXQgaXMgVU5LTk9XTiwKLSAgICAgICAgICAgIC8vIGxvZ2dlZCA2MzIwMTA0LgotICAgICAgICAgICAgaWYgKG9wcy5sZW5ndGggIT0gMSB8fCAhb3BzWzBdLmdldE5hbWUoKS5lcXVhbHMoImJvZ3VzIikKLSAgICAgICAgICAgIHx8IG9wc1swXS5nZXRTaWduYXR1cmUoKS5sZW5ndGggPiAwCi0gICAgICAgICAgICAgICAgICAgIHx8ICFvcHNbMF0uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscygidm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBVbmV4cGVjdGVkIE1CZWFuT3BlcmF0aW9uSW5mbyBhcnJheSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5cy5kZWVwVG9TdHJpbmcob3BzKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbFR5cGVGaWVsZFZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgKFN0cmluZylvcHNbMF0uZ2V0RGVzY3JpcHRvcigpLmdldEZpZWxkVmFsdWUoSk1YLk9SSUdJTkFMX1RZUEVfRklFTEQpOwotICAgICAgICAgICAgT3BlblR5cGU8Pz4gb3BlblR5cGVGaWVsZFZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgKE9wZW5UeXBlPD8+KW9wc1swXS5nZXREZXNjcmlwdG9yKCkuZ2V0RmllbGRWYWx1ZShKTVguT1BFTl9UWVBFX0ZJRUxEKTsKLQotICAgICAgICAgICAgaWYgKCAhIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWUuZXF1YWxzKCJ2b2lkIikgKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBVbmV4cGVjdGVkIG9yaWdpbmFsVHlwZSBpbiBEZXNjcmlwdG9yIGZvciBib2d1cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoICEgb3BlblR5cGVGaWVsZFZhbHVlLmVxdWFscyhTaW1wbGVUeXBlLlZPSUQpICkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIihFUlJPUikgVW5leHBlY3RlZCBvcGVuVHlwZSBpbiBEZXNjcmlwdG9yIGZvciBib2d1cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG9yaWdpbmFsVHlwZUZpZWxkVmFsdWU7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayB0aGVyZSBpcyAyIGNvbnN0cnVjdG9ycy4KLSAgICAgICAgICAgIGlmIChpbmZvLmdldENvbnN0cnVjdG9ycygpLmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBXcm9uZyBudW1iZXIgb2YgY29uc3RydWN0b3JzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgImluIGludHJvc3BlY3RlZCBiZWFuOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoaW5mby5nZXRDb25zdHJ1Y3RvcnMoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDaGVjayBNWEJlYW4gY2xhc3MgbmFtZS4KLSAgICAgICAgICAgIGlmICghaW5mby5nZXRDbGFzc05hbWUoKS5lbmRzV2l0aCgiVGVzdCIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBXcm9uZyBpbmZvIGNsYXNzIG5hbWU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5nZXRDbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1icy51bnJlZ2lzdGVyTUJlYW4odGVzdE5hbWUpOwotICAgICAgICAgICAgbWJzLnVucmVnaXN0ZXJNQmVhbihtbGV0TmFtZSk7Ci0KLSAgICAgICAgICAgIFdlYWtSZWZlcmVuY2U8UHJpdmF0ZU1MZXQ+IG1sZXRSZWYgPQotICAgICAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxQcml2YXRlTUxldD4obWxldCk7Ci0gICAgICAgICAgICBtbGV0ID0gbnVsbDsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW4gcmVnaXN0ZXJlZCBhbmQgdW5yZWdpc3RlcmVkLCB3YWl0aW5nIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgImdhcmJhZ2UgY29sbGVjdG9yIHRvIGNvbGxlY3QgY2xhc3MgbG9hZGVyIik7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAgJiYgbWxldFJlZi5nZXQoKSAhPSBudWxsOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtbGV0UmVmLmdldCgpID09IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoT0spIGNsYXNzIGxvYWRlciB3YXMgR0MnZCIpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiKEVSUk9SKSBDbGFzcyBsb2FkZXIgd2FzIG5vdCBHQydkIjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5Mb2FkaW5nVGVzdDE6OnJ1bjogRG9uZSB3aXRob3V0IGFueSBlcnJvciIpIDsKLSAgICB9Ci0KLQotICAgIC8vIEkgYWdyZWUgdGhlIHVzZSBvZiB0aGUgTVhCZWFuIGFubm90YXRpb24gYW5kIHRoZSBNWEJlYW4gc3VmZml4IGZvciB0aGUKLSAgICAvLyBpbnRlcmZhY2UgbmFtZSBhcmUgcmVkdW5kYW50IGJ1dCBob3dldmVyIGhhcm1sZXNzLgotICAgIC8vCi0gICAgQE1YQmVhbih0cnVlKQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFRlc3RNWEJlYW4gewotICAgICAgICBwdWJsaWMgdm9pZCBib2d1cygpOwotICAgICAgICBwdWJsaWMgaW50IGdldEEoKTsKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QShpbnQgYSk7Ci0gICAgICAgIHB1YmxpYyBMdWlzIGdldEIoKTsKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QihMdWlzIG1pKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdCBpbXBsZW1lbnRzIFRlc3RNWEJlYW4gewotICAgICAgICBwcml2YXRlIEx1aXMgbHVpcyA9IG5ldyBMdWlzKCkgOwotICAgICAgICBwdWJsaWMgVGVzdCgpIHt9Ci0gICAgICAgIHB1YmxpYyBUZXN0KGludCB4KSB7fQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGJvZ3VzKCkge30KLSAgICAgICAgcHVibGljIGludCBnZXRBKCkge3JldHVybiAwO30KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QShpbnQgYSkge30KLSAgICAgICAgcHVibGljIEx1aXMgZ2V0QigpIHtyZXR1cm4gdGhpcy5sdWlzO30KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QihMdWlzIGx1aXMpIHt0aGlzLmx1aXMgPSBsdWlzO30KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTHVpcyB7Ci0gICAgICAgIHByaXZhdGUgaW50IHNvbWV0aGluZyA9IDA7Ci0gICAgICAgIHB1YmxpYyBMdWlzKCkge30KLSAgICAgICAgcHVibGljIGludCBnZXRTb21ldGhpbmcoKSB7cmV0dXJuIHNvbWV0aGluZzt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNvbWV0aGluZyhpbnQgdikge3NvbWV0aGluZyA9IHY7fQotICAgICAgICBwdWJsaWMgdm9pZCBkb05vdGhpbmcoKSB7fQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbk5vdGlmVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vTVhCZWFuTm90aWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTczMWUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vTVhCZWFuTm90aWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDU4ODY1Ci0gKiBAc3VtbWFyeSBDaGVja3MgTVhCZWFuIHByb3BlciByZWdpc3RyYXRpb24gYm90aCBhcyBpdHMgaW1wbGVtZW50YXRpb24gY2xhc3MgYW5kIGludGVyZmFjZQotICogQGF1dGhvciBPbGl2aWVyIExhZ25lYXUKLSAqIEBtb2R1bGVzIGphdmEubWFuYWdlbWVudAotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQGNvbXBpbGUgQmFzaWMuamF2YQotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCBNWEJlYW5Ob3RpZlRlc3QgLW51bU9mTm90aWZpY2F0aW9ucyAyMzkgLXRpbWVGb3JOb3RpZmljYXRpb25JblNlY29uZHMgNAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkRlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbW11dGFibGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbk5vdGlmaWNhdGlvbkluZm87Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhTZXJ2aWNlVVJMOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGFTdXBwb3J0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5UeXBlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhckRhdGE7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhckRhdGFTdXBwb3J0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlRhYnVsYXJUeXBlOwotCi1wdWJsaWMgY2xhc3MgTVhCZWFuTm90aWZUZXN0IGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJBU0lDX01YQkVBTl9DTEFTU19OQU1FID0gIkJhc2ljIjsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkFTSUNfTVhCRUFOX0lOVEVSRkFDRV9OQU1FID0gIkJhc2ljTVhCZWFuIjsKLQotICAgIHByaXZhdGUgbG9uZyB0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzID0gM0w7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtT2ZOb3RpZmljYXRpb25zID0gMTsKLSAgICBwcml2YXRlIEJsb2NraW5nUXVldWU8Tm90aWZpY2F0aW9uPiBub3RpZkxpc3QgPSBudWxsOwotICAgIHByaXZhdGUgaW50IG51bU9mTm90aWZEZXNjcmlwdG9yRWxlbWVudHMgPSAxMzsKLQotICAgIC8qCi0gICAgICogRmlyc3QgRGVidWcgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIGFyZSBjb2xsZWN0IGluIGV4cGVjdGVkCi0gICAgICogbWFwICAoYXJnTmFtZSwgdmFsdWUpIGZvcm1hdCwgdGhlbiBjYWxscyBvcmlnaW5hbCB0ZXN0J3MgcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICAvLyBQYXJzZXMgcGFyYW1ldGVycwotICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IFV0aWxzLnBhcnNlUGFyYW1ldGVycyhhcmdzKSA7Ci0KLSAgICAgICAgLy8gUnVuIHRlc3QKLSAgICAgICAgTVhCZWFuTm90aWZUZXN0IHRlc3QgPSBuZXcgTVhCZWFuTm90aWZUZXN0KCk7Ci0gICAgICAgIHRlc3QucnVuKG1hcCk7Ci0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwYXJzZUFyZ3MoTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgYXJnID0gbnVsbDsKLQotICAgICAgICAvLyBJbml0IG51bU9mTm90aWZpY2F0aW9ucwotICAgICAgICAvLyBJdCBpcyB0aGUgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgd2Ugc2hvdWxkIHRyaWdnZXIgYW5kIGNoZWNrLgotICAgICAgICBhcmcgPSAoU3RyaW5nKWFyZ3MuZ2V0KCItbnVtT2ZOb3RpZmljYXRpb25zIikgOwotICAgICAgICBpZiAoYXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIG51bU9mTm90aWZpY2F0aW9ucyA9IChuZXcgSW50ZWdlcihhcmcpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5pdCB0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzCi0gICAgICAgIC8vIEl0IGlzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB3ZSB3YWl0IGZvciBlYWNoIG5vdGlmaWNhdGlvbi4KLSAgICAgICAgYXJnID0gKFN0cmluZylhcmdzLmdldCgiLXRpbWVGb3JFYWNoTm90aWZpY2F0aW9uSW5TZWNvbmRzIikgOwotICAgICAgICBpZiAoYXJnICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpbWVGb3JOb3RpZmljYXRpb25JblNlY29uZHMgPSAobmV3IExvbmcoYXJnKSkubG9uZ1ZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbk5vdGlmVGVzdDo6cnVuOiBTdGFydCIpIDsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwIDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICAgICAgbm90aWZMaXN0ID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxOb3RpZmljYXRpb24+KG51bU9mTm90aWZpY2F0aW9ucyk7Ci0KLSAgICAgICAgICAgIC8vIEpNWCBNYmVhblNlcnZlciB1c2VkIGluc2lkZSBzaW5nbGUgVk0gYXMgaWYgcmVtb3RlLgotICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgbWJzID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOwotCi0gICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIHVybCA9IG5ldyBKTVhTZXJ2aWNlVVJMKCJybWkiLCBudWxsLCAwKTsKLSAgICAgICAgICAgIEpNWENvbm5lY3RvclNlcnZlciBjcyA9Ci0gICAgICAgICAgICAgICAgSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeS5uZXdKTVhDb25uZWN0b3JTZXJ2ZXIodXJsLCBudWxsLCBtYnMpOwotICAgICAgICAgICAgY3Muc3RhcnQoKTsKLQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gY3MuZ2V0QWRkcmVzcygpOwotICAgICAgICAgICAgSk1YQ29ubmVjdG9yIGNjID0gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KGFkZHIpOwotICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5Ob3RpZlRlc3Q6OnJ1bjogQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgTUJlYW4iKTsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgb2JqTmFtZSA9IG5ldyBPYmplY3ROYW1lKCJzcWU6dHlwZT1CYXNpYyxwcm90b2NvbD1ybWkiKSA7Ci0gICAgICAgICAgICBtYnNjLmNyZWF0ZU1CZWFuKEJBU0lDX01YQkVBTl9DTEFTU19OQU1FLCBvYmpOYW1lKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotCi0gICAgICAgICAgICAvLyAtLS0tCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbk5vdGlmVGVzdDo6cnVuOiBBZGQgbWUgYXMgbm90aWZpY2F0aW9uIGxpc3RlbmVyIik7Ci0gICAgICAgICAgICBtYnNjLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKG9iak5hbWUsIHRoaXMsIG51bGwsIG51bGwpOwotCi0gICAgICAgICAgICAvLyAtLS0tCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbk5vdGlmVGVzdDo6cnVuOiBSZXRyaWV2ZSB0aGUgRGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHRoYXQgc2hvdWxkIGJlIGluIE1CZWFuTm90aWZpY2F0aW9uSW5mbyIpOwotICAgICAgICAgICAgVGFidWxhckRhdGEgdGFiRGF0YSA9Ci0gICAgICAgICAgICAgICAgKFRhYnVsYXJEYXRhKW1ic2MuZ2V0QXR0cmlidXRlKG9iak5hbWUsICJOb3RpZkRlc2NyaXB0b3JBc01hcEF0dCIpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBkZXNjck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpdCA9IHRhYkRhdGEudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgICAgICBDb21wb3NpdGVEYXRhIGNvbXBEYXRhID0gKENvbXBvc2l0ZURhdGEpaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIGRlc2NyTWFwLnB1dCgoU3RyaW5nKWNvbXBEYXRhLmdldCgia2V5IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKWNvbXBEYXRhLmdldCgidmFsdWUiKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERlc2NyaXB0b3IgcmVmTm90aWZEZXNjcmlwdG9yID0gbmV3IEltbXV0YWJsZURlc2NyaXB0b3IoZGVzY3JNYXApOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIE1CZWFuIGhvbGRpbmcgdGhlIHRhcmdldGVkIGF0dHJpYnV0ZSBpcyBNWEJlYW4sIHdlCi0gICAgICAgICAgICAvLyBzaG91bGQgdXNlIGZvciB0aGUgc2V0QXR0cmlidXRlIGEgY29udmVydGVkIGZvcm0gZm9yIHRoZQotICAgICAgICAgICAgLy8gYXR0cmlidXRlIHZhbHVlIGFzIGRlc2NyaWJlZCBieSB0aGUgTVhCZWFuIG1hcHBpbmcgcnVsZXMuCi0gICAgICAgICAgICAvLyBUaGlzIGV4cGxhaW5zIGFsbCB0aGF0IGxvdmVseSBzdHVmZiBmb3IgY3JlYXRpbmcgYQotICAgICAgICAgICAgLy8gVGFidWxhckRhdGFTdXBwb3J0LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFdBUk5JTkcgOiB0aGUgTUJlYW5JbmZvIG9mIHRoZSBNWEJlYW4gdXNlZCBvbiBvcHBvc2l0ZSBzaWRlCi0gICAgICAgICAgICAvLyBpcyBjb21wdXRlZCB3aGVuIHRoZSBNQmVhbiBpcyByZWdpc3RlcmVkLgotICAgICAgICAgICAgLy8gSXQgbWVhbnMgdGhlIERlc2NyaXB0b3IgY29uc2lkZXJlZCBmb3IgdGhlIE1CZWFuTm90aWZpY2F0aW9uSW5mbwotICAgICAgICAgICAgLy8gaXMgbm90IHRoZSBvbmUgd2Ugc2V0IGluIHRoZSBsaW5lcyBiZWxvdywgaXQgaXMgdG9vIGxhdGUuCi0gICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBjaGVjayB0aGF0IHNldCBpcyBoYXJtbGVzcyB3aGVuIHdlIGNoZWNrCi0gICAgICAgICAgICAvLyB0aGUgTUJlYW5Ob3RpZmljYXRpb25JbmZvLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuTm90aWZUZXN0OjpydW46IFNldCBhIE1hcDxTdHJpbmcsIFN0cmluZz4iCi0gICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICJqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsamF2YS5sYW5nLlN0cmluZz4iOwotICAgICAgICAgICAgU3RyaW5nW10ga2V5VmFsdWUgPSBuZXcgU3RyaW5nW10geyJrZXkiLCAidmFsdWUifTsKLSAgICAgICAgICAgIE9wZW5UeXBlPD8+W10gb3BlblR5cGVzID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE9wZW5UeXBlPD8+W10ge1NpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklOR307Ci0gICAgICAgICAgICBDb21wb3NpdGVUeXBlIHJvd1R5cGUgPSBuZXcgQ29tcG9zaXRlVHlwZSh0eXBlTmFtZSwgdHlwZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlLCBrZXlWYWx1ZSwgb3BlblR5cGVzKTsKLSAgICAgICAgICAgIFRhYnVsYXJUeXBlIHRhYlR5cGUgPSBuZXcgVGFidWxhclR5cGUodHlwZU5hbWUsIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICByb3dUeXBlLCBuZXcgU3RyaW5nW117ImtleSJ9KTsKLSAgICAgICAgICAgIFRhYnVsYXJEYXRhU3VwcG9ydCBjb252ZXJ0ZWREZXNjck1hcCA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBUYWJ1bGFyRGF0YVN1cHBvcnQodGFiVHlwZSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2ZOb3RpZkRlc2NyaXB0b3JFbGVtZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gZGVzY3JWYWx1ZSA9IHsiZmllbGQiICsgaSwgInZhbHVlIiArIGl9OwotICAgICAgICAgICAgICAgIENvbXBvc2l0ZURhdGEgZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9zaXRlRGF0YVN1cHBvcnQocm93VHlwZSwga2V5VmFsdWUsIGRlc2NyVmFsdWUpOwotICAgICAgICAgICAgICAgIGNvbnZlcnRlZERlc2NyTWFwLnB1dChkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXR0cmlidXRlIGRlc2NyQXR0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEF0dHJpYnV0ZSgiTm90aWZEZXNjcmlwdG9yQXNNYXBBdHQiLCBjb252ZXJ0ZWREZXNjck1hcCk7Ci0gICAgICAgICAgICBtYnNjLnNldEF0dHJpYnV0ZShvYmpOYW1lLCBkZXNjckF0dCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5Ob3RpZlRlc3Q6OnJ1bjogQ29tcGFyZSB0aGUgRGVzY3JpcHRvciBmcm9tIgotICAgICAgICAgICAgICAgICAgICArICIgdGhlIE1CZWFuTm90aWZpY2F0aW9uSW5mbyBhZ2FpbnN0IGEgcmVmZXJlbmNlIik7Ci0gICAgICAgICAgICBNQmVhbkluZm8gbWJJbmZvID0gbWJzYy5nZXRNQmVhbkluZm8ob2JqTmFtZSk7Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrTUJlYW5JbmZvKG1iSW5mbywgcmVmTm90aWZEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBET05FXG4iKSA7Ci0KLSAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2hlY2sgaXNJbnN0YW5jZU9mKEJhc2ljKSIpOwotCi0gICAgICAgICAgICBpZiAoICEgbWJzYy5pc0luc3RhbmNlT2Yob2JqTmFtZSwgQkFTSUNfTVhCRUFOX0NMQVNTX05BTUUpICkgewotICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1IgaXNJbnN0YW5jZU9mIHJldHVybmVkIGZhbHNlXG4iKSA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPS1xuIikgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyAtLS0tCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrIGlzSW5zdGFuY2VPZihCYXNpY01YQmVhbikiKTsKLQotICAgICAgICAgICAgaWYgKCAhIG1ic2MuaXNJbnN0YW5jZU9mKG9iak5hbWUsIEJBU0lDX01YQkVBTl9JTlRFUkZBQ0VfTkFNRSkgKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUiBpc0luc3RhbmNlT2YgcmV0dXJuZWQgZmFsc2VcbiIpIDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LXG4iKSA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuTm90aWZUZXN0OjpydW46IEFzayBmb3IgIgotICAgICAgICAgICAgICAgICAgICArIG51bU9mTm90aWZpY2F0aW9ucyArICIgbm90aWZpY2F0aW9uKHMpIik7Ci0gICAgICAgICAgICBPYmplY3RbXSBzZW5kTm90aWZQYXJhbSA9IG5ldyBPYmplY3RbMV07Ci0gICAgICAgICAgICBTdHJpbmdbXSBzZW5kTm90aWZTaWcgPSBuZXcgU3RyaW5nW117ImphdmEubGFuZy5TdHJpbmcifTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZk5vdGlmaWNhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFNlbGVjdCB3aGljaCB0eXBlIG9mIG5vdGlmaWNhdGlvbiB3ZSBhc2sgZm9yCi0gICAgICAgICAgICAgICAgaWYgKCBpICUgMiA9PSAwICkgewotICAgICAgICAgICAgICAgICAgICBzZW5kTm90aWZQYXJhbVswXSA9IEJhc2ljLk5PVElGX1RZUEVfMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZW5kTm90aWZQYXJhbVswXSA9IEJhc2ljLk5PVElGX1RZUEVfMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIG5vdGlmaWNhdGlvbiBlbWlzc2lvbgotICAgICAgICAgICAgICAgIG1ic2MuaW52b2tlKG9iak5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2VuZE5vdGlmaWNhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kTm90aWZQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmROb3RpZlNpZyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBpdCB0aGVuIGNoZWNrIGl0IHdoZW4gaXQgY29tZXMgZWFybHkgZW5vdWdoCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmTGlzdC5wb2xsKHRpbWVGb3JOb3RpZmljYXRpb25JblNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSA7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3Qgbm90aWZpY2F0aW9uIGlzIGxpa2VseSB0byBjb21lIGluIHNsb3dlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBvdGhlcnMuIEJlY2F1c2UgdGhhdCB0ZXN0IGlzbid0IHRhcmdldGluZyB0aGUgc3BlZWQKLSAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb25zIGFyZSBkZWxpdmVyZWQgd2l0aCwgd2UgcHJlZmVyIHRvIHNlY3VyZSBpdC4KLSAgICAgICAgICAgICAgICBpZiAoaSA9PSAwICYmIG5vdGlmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5Ob3RpZlRlc3Q6OnJ1bjogV2FpdCBleHRyYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzICsgIiBzZWNvbmQocykgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdmVyeSBmaXJzdCBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWYgPSBub3RpZkxpc3QucG9sbCh0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggbm90aWYgPT0gbnVsbCApIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1IgTm8gbm90aWZpY2F0aW9uIHJlY2VpdmVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoaW4gYWxsb2NhdGVkICIgKyB0aW1lRm9yTm90aWZpY2F0aW9uSW5TZWNvbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlY29uZChzKSAhIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTm90aWZpY2F0aW9uKG5vdGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpc2VuZE5vdGlmUGFyYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWMuTk9USUZJQ0FUSU9OX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdG9jID0gMDsKLSAgICAgICAgICAgIHdoaWxlICggbm90aWZMaXN0LnNpemUoKSA8IDIgJiYgdG9jIDwgMTAgKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDQ5OSk7Ci0gICAgICAgICAgICAgICAgdG9jKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRE9ORVxuIikgOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZXJyb3JDb3VudCA9PSAwICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5Ob3RpZlRlc3Q6OnJ1bjogRG9uZSB3aXRob3V0IGFueSBlcnJvciIpIDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTVhCZWFuTm90aWZUZXN0OjpydW46IERvbmUgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICsgZXJyb3JDb3VudAotICAgICAgICAgICAgICAgICAgICArICIgZXJyb3IocykiKSA7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXJyb3JDb3VudCA9ICIgKyBlcnJvckNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBpbnQgY2hlY2tNQmVhbkluZm8oTUJlYW5JbmZvIG1iaSwgRGVzY3JpcHRvciByZWZEZXNjcikgewotICAgICAgICBNQmVhbk5vdGlmaWNhdGlvbkluZm9bXSBub3RpZnNJbmZvID0gbWJpLmdldE5vdGlmaWNhdGlvbnMoKTsKLSAgICAgICAgaW50IHJlcyA9IDA7Ci0KLSAgICAgICAgZm9yIChNQmVhbk5vdGlmaWNhdGlvbkluZm8gbWJuaSA6IG5vdGlmc0luZm8pIHsKLSAgICAgICAgICAgIGlmICggbWJuaS5nZXREZXNjcmlwdG9yKCkuZXF1YWxzKHJlZkRlc2NyKSApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihPSykiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIERlc2NyaXB0b3Igb2YgdGhlIG5vdGlmaWNhdGlvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1ibmkuZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgd2UgZXhwZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVmRGVzY3IpOwotICAgICAgICAgICAgICAgIHJlcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgaW50IGNoZWNrTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZiwKLSAgICAgICAgICAgIFN0cmluZyByZWZUeXBlLAotICAgICAgICAgICAgU3RyaW5nIHJlZk1lc3NhZ2UsCi0gICAgICAgICAgICBPYmplY3ROYW1lIHJlZlNvdXJjZSkgewotICAgICAgICBpbnQgcmVzID0gMDsKLQotICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19WRVJCT1NFLAotICAgICAgICAgICAgICAgICJcdCBnZXRTb3VyY2UgIiArIG5vdGlmLmdldFNvdXJjZSgpKTsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiXHQgZ2V0TWVzc2FnZSAiICsgbm90aWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiXHQgZ2V0U2VxdWVuY2VOdW1iZXIgIiArIG5vdGlmLmdldFNlcXVlbmNlTnVtYmVyKCkpOwotICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19WRVJCT1NFLAotICAgICAgICAgICAgICAgICJcdCBnZXRUaW1lU3RhbXAgIiArIG5vdGlmLmdldFRpbWVTdGFtcCgpKTsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiXHQgZ2V0VHlwZSAiICsgbm90aWYuZ2V0VHlwZSgpKTsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiXHQgZ2V0VXNlckRhdGEgIiArIG5vdGlmLmdldFVzZXJEYXRhKCkpOwotCi0gICAgICAgIGlmICggISBub3RpZi5nZXRUeXBlKCkuZXF1YWxzKHJlZlR5cGUpICkgewotICAgICAgICAgICAgcmVzKys7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgVHlwZSBpcyBub3QgIgotICAgICAgICAgICAgICAgICAgICArIHJlZlR5cGUgKyAiIGluIG5vdGlmaWNhdGlvblxuIiArIG5vdGlmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICggbm90aWYuZ2V0VHlwZSgpLmVxdWFscyhCYXNpYy5OT1RJRl9UWVBFXzApCi0gICAgICAgICAgICAmJiAhIChub3RpZiBpbnN0YW5jZW9mIGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uKSApIHsKLSAgICAgICAgICAgICAgICByZXMrKzsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgTm90aWZpY2F0aW9uIGlzIG5vdCBpbnN0YW5jZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb24gYnV0IHJhdGhlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG5vdGlmLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIG5vdGlmLmdldFR5cGUoKS5lcXVhbHMoQmFzaWMuTk9USUZfVFlQRV8xKQotICAgICAgICAgICAgJiYgISAobm90aWYgaW5zdGFuY2VvZiBTcWVOb3RpZmljYXRpb24pICkgewotICAgICAgICAgICAgICAgIHJlcysrOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBOb3RpZmljYXRpb24gaXMgbm90IGluc3RhbmNlIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBqYXZhc29mdC5zcWUuam14LnNoYXJlLlNxZU5vdGlmaWNhdGlvbiBidXQgcmF0aGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbm90aWYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhIG5vdGlmLmdldE1lc3NhZ2UoKS5lcXVhbHMocmVmTWVzc2FnZSkgKSB7Ci0gICAgICAgICAgICByZXMrKzsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKEVSUk9SKSBNZXNzYWdlIGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICsgcmVmTWVzc2FnZSArICIgaW4gbm90aWZpY2F0aW9uXG4iICsgbm90aWYpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhIG5vdGlmLmdldFNvdXJjZSgpLmVxdWFscyhyZWZTb3VyY2UpICkgewotICAgICAgICAgICAgcmVzKys7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihFUlJPUikgU291cmNlIGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICsgcmVmU291cmNlICsgIiBpbiBub3RpZmljYXRpb25cbiIgKyBub3RpZik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBPYmplY3QgaGFuZGJhY2spIHsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiTVhCZWFuTm90aWZUZXN0OjpoYW5kbGVOb3RpZmljYXRpb246IFJlY2VpdmVkICIKLSAgICAgICAgICAgICAgICArIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIG5vdGlmTGlzdC5hZGQobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbldlaXJkUGFyYW1UZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9NWEJlYW5XZWlyZFBhcmFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTgyMzNmLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL01YQmVhbldlaXJkUGFyYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDU4ODY1Ci0gKiBAc3VtbWFyeSBDaGVja3MgdGhhdCBhIHNlcmlhbGl6ZWQgaW5zdGFuY2UgaXMgbm90IHRyYW5zbWl0dGVkIGZyb20gYW4gTVhCZWFuLgotICogQWxsIHRoZSBjb21tdW5pY2F0aW9uIHNob3VsZCBiZSBkb25lIHZpYSBPcGVuIFR5cGVzCi0gKiBAYXV0aG9yIE9saXZpZXIgTGFnbmVhdQotICogQG1vZHVsZXMgamF2YS5tYW5hZ2VtZW50Ci0gKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5Ci0gKiBAY29tcGlsZSBCYXNpYy5qYXZhCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIE1YQmVhbldlaXJkUGFyYW1UZXN0Ci0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgamF2YS5sYW5nLlByb2Nlc3M7Ci1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJDb25uZWN0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkw7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGFTdXBwb3J0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5UeXBlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhckRhdGFTdXBwb3J0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlRhYnVsYXJUeXBlOwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSkRLVG9vbEZpbmRlcjsKLQotcHVibGljIGNsYXNzIE1YQmVhbldlaXJkUGFyYW1UZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBCQVNJQ19NWEJFQU5fQ0xBU1NfTkFNRSA9ICJCYXNpYyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NMQVNTX01BSU4gPQotICAgICAgICAiTVhCZWFuV2VpcmRQYXJhbVRlc3QkQ2xpZW50U2lkZSI7Ci0KLSAgICBwcml2YXRlIEpNWENvbm5lY3RvclNlcnZlciBjczsKLQotICAgIC8qCi0gICAgICogRmlyc3QgRGVidWcgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIGFyZSBjb2xsZWN0IGluIGV4cGVjdGVkCi0gICAgICogbWFwICAoYXJnTmFtZSwgdmFsdWUpIGZvcm1hdCwgdGhlbiBjYWxscyBvcmlnaW5hbCB0ZXN0J3MgcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICAvLyBQYXJzZXMgcGFyYW1ldGVycwotICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IFV0aWxzLnBhcnNlUGFyYW1ldGVycyhhcmdzKSA7Ci0KLSAgICAgICAgLy8gUnVuIHRlc3QKLSAgICAgICAgTVhCZWFuV2VpcmRQYXJhbVRlc3QgdGVzdCA9IG5ldyBNWEJlYW5XZWlyZFBhcmFtVGVzdCgpOwotICAgICAgICB0ZXN0LnJ1bihtYXApOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgdGhlIE1CZWFuc1NlcnZlIHNpZGUgb2YgdGhlIHRlc3QgYW5kIHJldHVybnMgaXRzIGFkZHJlc3MKLSAgICAgKi8KLSAgICBwcml2YXRlIEpNWFNlcnZpY2VVUkwgY3JlYXRlU2VydmVyU2lkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgTklORVRZX1NFQ09ORFMgPSA5MDsKLQotICAgICAgICAvLyBXZSB3aWxsIHVzZSB0aGUgcGxhdGZvcm0gbWJlYW4gc2VydmVyCi0gICAgICAgIE1CZWFuU2VydmVyIG1icyA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKLQotICAgICAgICBKTVhTZXJ2aWNlVVJMIHVybCA9IG5ldyBKTVhTZXJ2aWNlVVJMKCJybWkiLCBudWxsLCAwKTsKLSAgICAgICAgY3MgPSBKTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5Lm5ld0pNWENvbm5lY3RvclNlcnZlcih1cmwsIG51bGwsIG1icyk7Ci0gICAgICAgIGNzLnN0YXJ0KCk7Ci0KLSAgICAgICAgVXRpbHMud2FpdFJlYWR5KGNzLCBOSU5FVFlfU0VDT05EUyk7Ci0KLSAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gY3MuZ2V0QWRkcmVzcygpOwotICAgICAgICByZXR1cm4gYWRkcjsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ3JlYXRpbmcgY29tbWFuZC1saW5lIGZvciBydW5uaW5nIHN1YnByb2Nlc3MgSlZNOgotICAgICAqCi0gICAgICogSlZNIGNvbW1hbmQgbGluZSBpcyBsaWtlOgotICAgICAqIHt0ZXN0X2pka30vYmluL2phdmEge2RlZmF1bHRvcHRzfSAtY3Age3Rlc3QuY2xhc3MucGF0aH0ge3Rlc3RvcHRzfSBtYWluCi0gICAgICoKLSAgICAgKiB7ZGVmYXVsdG9wdHN9IGFyZSB0aGUgZGVmYXVsdCBqYXZhIG9wdGlvbnMgc2V0IGJ5IHRoZSBmcmFtZXdvcmsuCi0gICAgICoKLSAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZENvbW1hbmRMaW5lKCkgewotICAgICAgICBMaXN0PFN0cmluZz4gb3B0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBvcHRzLmFkZChKREtUb29sRmluZGVyLmdldEpES1Rvb2woImphdmEiKSk7Ci0gICAgICAgIG9wdHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoamRrLnRlc3RsaWJyYXJ5LlV0aWxzLmdldFRlc3RKYXZhT3B0cygpKSk7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IFdFSVJEX1BBUkFNIHByb3BlcnR0eSBvbiB0aGUgY2xpZW50LXNpZGUKLSAgICAgICAgb3B0cy5hZGQoIi1EV0VJUkRfUEFSQU0iKTsKLSAgICAgICAgb3B0cy5hZGQoIi1jcCIpOwotICAgICAgICBvcHRzLmFkZChTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuY2xhc3MucGF0aCIsICJ0ZXN0LmNsYXNzLnBhdGgiKSk7Ci0gICAgICAgIG9wdHMuYWRkKENMSUVOVF9DTEFTU19NQUlOKTsKLQotICAgICAgICByZXR1cm4gb3B0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSdW5zIE1YQmVhbldlaXJkUGFyYW1UZXN0JENsaWVudFNpZGUgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnMgYW5kIHJlZGlyZWN0cwotICAgICAqIHN1YnByb2Nlc3Mgc3RhbmRhcmQgSS9PIHRvIHRoZSBjdXJyZW50IChwYXJlbnQpIHByb2Nlc3MuIFRoaXMgcHJvdmlkZXMgYQotICAgICAqIHRyYWNlIG9mIHdoYXQgaGFwcGVucyBpbiB0aGUgc3VicHJvY2VzcyB3aGlsZSBpdCBpcyBydW5ubmluZyAoYW5kIGJlZm9yZQotICAgICAqIGl0IHRlcm1pbmF0ZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VVcmxTdHIgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSk1YIHNlcnZpY2UgVXJsIHRvIGNvbm5lY3QgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgcnVuQ2xpZW50U2lkZShTdHJpbmcgc2VydmljZVVybFN0cikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLy8gQnVpbGRpbmcgY29tbWFuZC1saW5lCi0gICAgICAgIExpc3Q8U3RyaW5nPiBvcHRzID0gYnVpbGRDb21tYW5kTGluZSgpOwotICAgICAgICBvcHRzLmFkZChzZXJ2aWNlVXJsU3RyKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2VwYXJhdGUgSlZNIHN1YnByb2Nlc3MKLSAgICAgICAgaW50IGV4aXRDb2RlID0gMDsKLSAgICAgICAgU3RyaW5nW10gb3B0c0FycmF5ID0gb3B0cy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihvcHRzQXJyYXkpOwotICAgICAgICBQcm9jZXNzIHAgPSBQcm9jZXNzVG9vbHMuc3RhcnRQcm9jZXNzKCJNWEJlYW5XZWlyZFBhcmFtVGVzdCRDbGllbnRTaWRlIiwgcGIpOwotCi0gICAgICAgIC8vIEhhbmRsaW5nIGVuZCBvZiBzdWJwcm9jZXNzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGl0Q29kZSA9IHAud2FpdEZvcigpOwotICAgICAgICAgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJTdWJwcm9jZXNzIHVuZXhwZWN0ZWQgZXhpdCB2YWx1ZSBvZiBbIiArIGV4aXRDb2RlICsKLSAgICAgICAgICAgICAgICAgICAgIl0uIEV4cGVjdGVkIDAuXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJlbnQgcHJvY2VzcyBpbnRlcnJ1cHRlZCB3aXRoIGV4Y2VwdGlvbiA6IFxuICIgKyBlICsgIiA6IiApOwotCi0gICAgICAgICAgICAvLyBQYXJlbnQgdGhyZWFkIHVua25vd24gc3RhdGUsIGtpbGxpbmcgc3VicHJvY2Vzcy4KLSAgICAgICAgICAgIHAuZGVzdHJveUZvcmNpYmx5KCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQYXJlbnQgcHJvY2VzcyBpbnRlcnJ1cHRlZCB3aXRoIGV4Y2VwdGlvbiA6IFxuICIgKyBlICsgIiA6IiApOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmV0dXJuIGV4aXRDb2RlOwotICAgICAgICB9Ci0KLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5XZWlyZFBhcmFtVGVzdDo6cnVuOiBTdGFydCIpIDsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbml0aWFsaXNlIHRoZSBzZXJ2ZXIgc2lkZQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCB1cmxUb1VzZSA9IGNyZWF0ZVNlcnZlclNpZGUoKTsKLQotICAgICAgICAgICAgLy8gUnVuIGNsaWVudCBzaWRlCi0gICAgICAgICAgICBlcnJvckNvdW50ID0gcnVuQ2xpZW50U2lkZSh1cmxUb1VzZS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKCBlcnJvckNvdW50ID09IDAgKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNWEJlYW5XZWlyZFBhcmFtVGVzdDo6cnVuOiBEb25lIHdpdGhvdXQgYW55IGVycm9yIikgOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1YQmVhbldlaXJkUGFyYW1UZXN0OjpydW46IERvbmUgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGVycm9yQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBlcnJvcihzKSIpIDsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZXJyb3JDb3VudCA9ICIgKyBlcnJvckNvdW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3Muc3RvcCgpOwotCi0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGllbnRTaWRlIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnVGFnID0gIkNsaWVudFNpZGU6Om1haW46ICI7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBHZXQgYSBjb25uZWN0aW9uIHRvIHJlbW90ZSBtYmVhbiBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIGFkZHIgPSBuZXcgSk1YU2VydmljZVVSTChhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICBKTVhDb25uZWN0b3IgY2MgPSBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QoYWRkcik7Ci0gICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsgIkNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIE1CZWFuIik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmpOYW1lID0gbmV3IE9iamVjdE5hbWUoInNxZTp0eXBlPUJhc2ljLHByb3RvY29sPXJtaSIpIDsKLSAgICAgICAgICAgICAgICBtYnNjLmNyZWF0ZU1CZWFuKEJBU0lDX01YQkVBTl9DTEFTU19OQU1FLCBvYmpOYW1lKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiLS0tLSBPS1xuIikgOwotCi0gICAgICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2dUYWcgKyJHZXQgYXR0cmlidXRlIFNxZVBhcmFtZXRlckF0dCBvbiBvdXIgTVhCZWFuIik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ic2MuZ2V0QXR0cmlidXRlKG9iak5hbWUsICJTcWVQYXJhbWV0ZXJBdHQiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiKE9LKSBHb3QgcmVzdWx0IG9mIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzdWx0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiUmVjZWl2ZWQgQ29tcG9zaXRlRGF0YSBpcyAiICsgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiLS0tLSBPS1xuIikgOwotCi0gICAgICAgICAgICAgICAgLy8gLS0tLQotICAgICAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0QXR0cmlidXRlIHRvIHBlcmZvcm0gdGhlIGludm9rZS4KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiQ2FsbCBvcGVyYXRpb24gZG9XZWlyZCBvbiBvdXIgTVhCZWFuIFsxXSIpOwotICAgICAgICAgICAgICAgIG1ic2MuaW52b2tlKG9iak5hbWUsICJkb1dlaXJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtyZXN1bHR9LAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhIn0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2dUYWcgKyItLS0tIE9LXG4iKSA7Ci0KLSAgICAgICAgICAgICAgICAvLyAtLS0tCi0gICAgICAgICAgICAgICAgLy8gV2UgYnVpbGQgdGhlIENvbXBvc2l0ZURhdGEgb3Vyc2VsdmVzIHRoYXQgdGltZS4KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiQ2FsbCBvcGVyYXRpb24gZG9XZWlyZCBvbiBvdXIgTVhCZWFuIFsyXSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9ICJTcWVQYXJhbWV0ZXIiOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGl0ZW1OYW1lcyA9IG5ldyBTdHJpbmdbXSB7Imdsb3AifTsKLSAgICAgICAgICAgICAgICBPcGVuVHlwZTw/PltdIG9wZW5UeXBlcyA9IG5ldyBPcGVuVHlwZTw/PltdIHtTaW1wbGVUeXBlLlNUUklOR307Ci0gICAgICAgICAgICAgICAgQ29tcG9zaXRlVHlwZSByb3dUeXBlID0gbmV3IENvbXBvc2l0ZVR5cGUodHlwZU5hbWUsIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWVzLCBpdGVtTmFtZXMsIG9wZW5UeXBlcyk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0W10gaXRlbVZhbHVlcyA9IHsiSEVDVE9SIn07Ci0gICAgICAgICAgICAgICAgQ29tcG9zaXRlRGF0YSBkYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb3NpdGVEYXRhU3VwcG9ydChyb3dUeXBlLCBpdGVtTmFtZXMsIGl0ZW1WYWx1ZXMpOwotICAgICAgICAgICAgICAgIFRhYnVsYXJUeXBlIHRhYlR5cGUgPSBuZXcgVGFidWxhclR5cGUodHlwZU5hbWUsIHR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcm93VHlwZSwgbmV3IFN0cmluZ1tdeyJnbG9wIn0pOwotICAgICAgICAgICAgICAgIFRhYnVsYXJEYXRhU3VwcG9ydCB0ZHMgPSBuZXcgVGFidWxhckRhdGFTdXBwb3J0KHRhYlR5cGUpOwotICAgICAgICAgICAgICAgIHRkcy5wdXQoZGF0YSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZ1RhZyArIlNvdXJjZSBDb21wb3NpdGVEYXRhIGlzICIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICBtYnNjLmludm9rZShvYmpOYW1lLCAiZG9XZWlyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117ZGF0YX0sCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117ImphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGEifSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZ1RhZyArIi0tLS0gT0tcbiIpIDsKLQotICAgICAgICAgICAgICAgIC8vIC0tLS0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiVW5yZWdpc3RlciB0aGUgTUJlYW4iKTsKLSAgICAgICAgICAgICAgICBtYnNjLnVucmVnaXN0ZXJNQmVhbihvYmpOYW1lKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXNnVGFnICsiLS0tLSBPS1xuIikgOwotCi0gICAgICAgICAgICAgICAgLy8gVGVybWluYXRlIHRoZSBKTVggQ2xpZW50Ci0gICAgICAgICAgICAgICAgY2MuY2xvc2UoKTsKLQotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KGVycm9yQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vU3FlRGVzY3JpcHRvcktleS5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vU3FlRGVzY3JpcHRvcktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGU0OTI2Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL1NxZURlc2NyaXB0b3JLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuRGVzY3JpcHRvcktleTsKLQotLyoqCi0gKiBUaGF0IGFubm90YXRpb24gaXMgdXNhYmxlIGV2ZXJ5d2hlcmUgRGVzY3JpcHRvcktleSBpcyAoYW5kIGV2ZW4gbW9yZSkuCi0gKiBJdCBpcyBmb3IgdXNlIHRvIHRlc3QgdGhhdCB5b3UgY2FuIHJldHJpZXZlIHRoZSBTcWVEZXNjcmlwdG9yS2V5IGludG8gdGhlCi0gKiBhcHByb3ByaWF0ZSBEZXNjcmlwdG9yIGluc3RhbmNlcyBhcyBidWlsdCBieSB0aGUgSk1YIHJ1bnRpbWUuCi0gKi8KLUBEb2N1bWVudGVkCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQotcHVibGljIEBpbnRlcmZhY2UgU3FlRGVzY3JpcHRvcktleSB7Ci0gICAgQERlc2NyaXB0b3JLZXkoInNxZURlc2NyaXB0b3JLZXkiKQotICAgIFN0cmluZyB2YWx1ZSgpOwotCi0gICAgLy8gTGlzdCBkZXNjcmlwdG9yIGZpZWxkcyB0aGF0IG1heSBiZSBhZGRlZCBvciBtYXkgYmUgdXBkYXRlZAotICAgIC8vIHdoZW4gcmV0cmlldmluZyBhbiBNQmVhbkluZm8gdXNpbmcgYSBKTVhXUyBjb25uZWN0aW9uIGNvbXBhcmVkIHRvIHRoZQotICAgIC8vIE1CZWFuSW5mbyByZXR1cm5lZCBieSBhIGxvY2FsIE1CZWFuU2VydmVyLgotICAgIC8vIFRoZSBhbm5vdGF0aW9uIGZvcm1hdCBpcyA6Ci0gICAgLy8gICA8ZGVzY3JpcHRvckZpZWxkTmFtZT49PGRlc2NyaXB0b3JGaWVsZFZhbHVlPgotICAgIC8vIFRoZSB2YWx1ZXMgYWN0dWFsbHkgaGFuZGxlZCBieSB0aGUgdGVzdCBzdWl0ZSBhcmUgOgotICAgIC8vICAgb3BlblR5cGU9U2ltcGxlVHlwZS5WT0lECi0gICAgQERlc2NyaXB0b3JLZXkoImRlc2NyaXB0b3JGaWVsZHMiKQotICAgIFN0cmluZ1tdIGRlc2NyaXB0b3JGaWVsZHMoKSBkZWZhdWx0IHt9OwotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vU3FlTm90aWZpY2F0aW9uLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9TcWVOb3RpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwMTMwZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9TcWVOb3RpZmljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5Ob3RpZmljYXRpb247Ci0KLS8qKgotICogQ291bGQgaG9sZCBzb21lZGF5IGEgc3BlY2lmaWMgc2VtYW50aWMuCi0gKiBGb3Igbm93IGl0IGlzIHVzZWQgdG8gaGF2ZSBhIE5vdGlmaWNhdGlvbiB3aGljaCBvZiBhbm90aGVyIGNsYXNzLCBubyBtb3JlLgotICovCi1wdWJsaWMgY2xhc3MgU3FlTm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uIHsKLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNxZU5vdGlmaWNhdGlvbiAqLwotICAgIHB1YmxpYyBTcWVOb3RpZmljYXRpb24oU3RyaW5nIHR5cGUsIE9iamVjdCBzb3VyY2UsIGxvbmcgc2VxdWVuY2VOdW1iZXIpIHsKLSAgICAgICAgc3VwZXIodHlwZSwgc291cmNlLCBzZXF1ZW5jZU51bWJlcik7Ci0gICAgfQotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU3FlTm90aWZpY2F0aW9uICovCi0gICAgcHVibGljIFNxZU5vdGlmaWNhdGlvbihTdHJpbmcgdHlwZSwgT2JqZWN0IHNvdXJjZSwgbG9uZyBzZXF1ZW5jZU51bWJlciwKLSAgICAgICAgICAgIGxvbmcgdGltZVN0YW1wKSB7Ci0gICAgICAgIHN1cGVyKHR5cGUsIHNvdXJjZSwgc2VxdWVuY2VOdW1iZXIsIHRpbWVTdGFtcCk7Ci0gICAgfQotCi0gICAgLyoqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU3FlTm90aWZpY2F0aW9uICovCi0gICAgcHVibGljIFNxZU5vdGlmaWNhdGlvbihTdHJpbmcgdHlwZSwgT2JqZWN0IHNvdXJjZSwgbG9uZyBzZXF1ZW5jZU51bWJlciwKLSAgICAgICAgICAgIGxvbmcgdGltZVN0YW1wLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcih0eXBlLCBzb3VyY2UsIHNlcXVlbmNlTnVtYmVyLCB0aW1lU3RhbXAsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFNxZU5vdGlmaWNhdGlvbiAqLwotICAgIHB1YmxpYyBTcWVOb3RpZmljYXRpb24oU3RyaW5nIHR5cGUsIE9iamVjdCBzb3VyY2UsIGxvbmcgc2VxdWVuY2VOdW1iZXIsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBzdXBlcih0eXBlLCBzb3VyY2UsIHNlcXVlbmNlTnVtYmVyLCBtZXNzYWdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L214YmVhbi9TcWVQYXJhbWV0ZXIuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL1NxZVBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE2ZmYwLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL1NxZVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGF0IGNsYXNzIGlzIHRvIHVzZSBhcyBhbiBNQmVhbiBvcGVyYXRpb24gcGFyYW1ldGVyIG9yIHJldHVybmVkIHZhbHVlLgotICogVGhlIHByb3BlcnR5IEdsb3Agd2l0aCBpdHMgcHVibGljIGdldHRlciArIHNldHRlciBpcyBvbmx5IHRoZXJlIHRvIGJlCi0gKiByZWNvbnN0cnVjdGlibGUgZm9sbG93aW5nIE1YQmVhbiBzcGVjaWZpY2F0aW9uLCBzbyB0aGF0IFNxZVBhcmFtZXRlciBjYW4gYmUKLSAqIHVzZWQgZm9yIHdoYXQgaXQgaXMgZGVzaWduZWQgdG8uCi0gKi8KLXB1YmxpYyBjbGFzcyBTcWVQYXJhbWV0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3ZWlyZDsKLSAgICBwcml2YXRlIFN0cmluZyBnbG9wOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgaWYgKCBTeXN0ZW0uZ2V0UHJvcGVydHkoIldFSVJEX1BBUkFNIikgIT0gbnVsbCApIHsKLSAgICAgICAgICAgIHdlaXJkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgU3FlUGFyYW1ldGVyLgotICAgICAqIDxicj5XaGVuIHRoZSBKYXZhIHByb3BlcnR5IFdFSVJEX1BBUkFNIGlzIHNldCwgdGhhdCBjb25zdHJ1Y3RvcgotICAgICAqIHRocm93cyBhbiBleGNlcHRpb24uCi0gICAgICogPGJyPlRoYXQgY2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoZSBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgb24gc2VydmVyIHNpZGUKLSAgICAgKiBidXQgbmV2ZXIgb24gY2xpZW50IHNpZGUuCi0gICAgICovCi0gICAgcHVibGljIFNxZVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIHdlaXJkICkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRHbG9wKCkgewotICAgICAgICByZXR1cm4gZ2xvcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHbG9wKFN0cmluZyB2YWx1ZSkgewotICAgICAgICBnbG9wID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vVXRpbHMuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvbXhiZWFuL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzE5NmIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9teGJlYW4vVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlck1CZWFuOwotCi0vLyB1dGlsaXR5IGNsYXNzIGZvciBNWEJlYW4qIHRlc3RzIGNvbWluZyBmcm9tIEpNWCBUb25nYSB0ZXN0IHN1aXRlCi1jbGFzcyBVdGlscyB7Ci0KLSAgICAvLyBERUJVRyBpcyBwcmludGVkIGRlcGVuZGluZyBvbiB0aGUgREVCVUcgYW5kIERFQlVHX0xFVkVMIEpBVkEgcHJvcGVydHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfSEVBREVSID0gIltkZWJ1Z10gIjsKLQotICAgIC8vIERFQlVHIGxldmVscwotICAgIHByaXZhdGUgc3RhdGljIGludCBzZWxlY3RlZERlYnVnTGV2ZWwgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfU1RBTkRBUkQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfVkVSQk9TRSA9IDI7ICAvLyBNYWlubHkgdXNlZCBmb3Igc3RyZXNzIHRlc3RzCi0gICAgc3RhdGljIGZpbmFsIGludCBERUJVR19BTEwgPSBERUJVR19TVEFOREFSRCB8IERFQlVHX1ZFUkJPU0U7Ci0KLSAgICBzdGF0aWMgdm9pZCBwYXJzZURlYnVnUHJvcGVydGllcygpIHsKLSAgICAgICAgaW50IGxldmVsID0gMDsKLSAgICAgICAgUHJvcGVydGllcyBwID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAvLyBnZXQgc2VsZWN0ZWQgbGV2ZWxzCi0gICAgICAgIGlmIChwLmdldFByb3BlcnR5KCJERUJVR19TVEFOREFSRCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX1NUQU5EQVJEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX1ZFUkJPU0UiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsZXZlbCB8PSBERUJVR19WRVJCT1NFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX0FMTCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX0FMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGVjdGVkRGVidWdMZXZlbCA9IGxldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJvZHVjZXMgdGhlIG9yaWdpbmFsIHBhcnNpbmcgYW5kIGNvbGxlY3Rpb24gb2YgdGVzdCBwYXJhbWV0ZXJzCi0gICAgICogZnJvbSB0aGUgRFRvbmdhIEpNWCB0ZXN0IHN1aXRlLgotICAgICAqCi0gICAgICogQ29sbGVjdHMgcGFzc2VkIGFyZ3MgYW5kIHJldHVybnMgdGhlbSBpbiBhIG1hcChhcmduYW1lLCB2YWx1ZSkgc3RydWN0dXJlLAotICAgICAqIHdoaWNoIHdpbGwgYmUgdGhlbiBwcm9wYWdhdGVkIGFzIG5lY2Vzc2FyeSB0byB2YXJpb3VzIGNhbGxlZCBtZXRob2RzLgotICAgICAqLwotICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcnNlUGFyYW1ldGVycyhTdHJpbmcgYXJnc1tdKQotICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlscy5kZWJ1ZyhERUJVR19TVEFOREFSRCwgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IFN0YXJ0Iik7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgaWYgKCBhcmdzW2ldLnRyaW0oKS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpKzEpIDwgYXJncy5sZW5ndGggJiYgIWFyZ3NbaSsxXS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKERFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggdmFsdWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2krMV0pIDsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChhcmdzW2ldLnRyaW0oKSwgYXJnc1tpKzFdLnRyaW0oKSkgOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGkrMSkgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2krMV0uc3RhcnRzV2l0aCgiLSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaSsxKSA9PSBhcmdzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBudWxsIHZhbHVlIikgOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGFyZ3NbaV0udHJpbSgpLCBudWxsKSA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IChXQVJOSU5HKSBub3QgYWRkZWQgaW4gbWFwID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldKSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbHMuZGVidWcoREVCVUdfU1RBTkRBUkQsICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBEb25lIikgOwotICAgICAgICByZXR1cm4gbWFwIDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIGluIGFsbCB0ZXN0cyB0byBwcmludCBhbnl0aGluZwotICAgICAqIHRoYXQgaXMgdGVtcG9yYXJ5LgotICAgICAqIFByaW50aW5nIGlzIGRvbmUgb25seSB3aGVuIGRlYnVnIGlzIGFjdGl2YXRlZCBieSB0aGUgcHJvcGVydHkgREVCVUcuCi0gICAgICogUHJpbnRpbmcgZGVwZW5kcyBhbHNvIG9uIHRoZSBERUJVR19MRVZFTCBwcm9wZXJ0eS4KLSAgICAgKiBIZXJlIGl0IGVuY2Fwc3VsYXRlcyBhIFN5c3RlbS5vdXQucHJpbnRsbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoaW50IGxldmVsLCBTdHJpbmcgbGluZSkgewotICAgICAgICBpZiAoKHNlbGVjdGVkRGVidWdMZXZlbCAmIGxldmVsKSAhPSAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oREVCVUdfSEVBREVSICsgbGluZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEbyBwcmludCBzdGFjayB0cmFjZSB3aGVuIHdpdGhTdGFjayBpcyB0cnVlLgotICAgICAqIERvZXMgdHJ5IHRvIGNhbGwgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgYW5kIGdldFRhcmdldEVycm9yKCkgdGhlbgotICAgICAqIHByaW50IGVtYmVkZGVkIHN0YWNrcyBpbiB0aGUgY2FzZSBvZiBhbiBFeGNlcHRpb24gd3JhcHBpbmcKLSAgICAgKiBhbm90aGVyIEV4Y2VwdGlvbiBvciBhbiBFcnJvci4gUmVjdXJzZSB1bnRpbCBubyBtb3JlIHdyYXBwaW5nCi0gICAgICogaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VGhyb3dhYmxlKFRocm93YWJsZSB0aGVUaHJvLCBib29sZWFuIHdpdGhTdGFjaykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHdpdGhTdGFjaykgewotICAgICAgICAgICAgICAgIHRoZVRocm8ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRoZVRocm8gaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBFeGNlcHRpb24gdCA9IChFeGNlcHRpb24pIHRoZVRocm87Ci0gICAgICAgICAgICAgICAgTWV0aG9kIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGJsYW5rID0gIiAiOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAvLyBPSzogZ2V0VGFyZ2V0RXhjZXB0aW9uIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJsYW5rICsgdC5nZXRDbGFzcygpICsgIj09PiIgKyB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gKEV4Y2VwdGlvbikgdGFyZ2V0Lmludm9rZSh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLk9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rID0gYmxhbmsgKyAiICAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIHQuZ2V0Q2xhc3MoKSArICI9PT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPSzogZ2V0VGFyZ2V0RXhjZXB0aW9uIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGhhdmUgZXhjZXB0aW9ucyB3cmFwcGluZyBhbiBFcnJvciB0aGVuIGl0IGlzCi0gICAgICAgICAgICAgICAgLy8gZ2V0VGFyZ2V0RXJyb3IgdGhhdCBpcyBsaWtlbHkgdG8gYmUgY2FsbGVkCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKChFeGNlcHRpb24pIHRoZVRocm8pLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRUYXJnZXRFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAvLyBPSzogZ2V0VGFyZ2V0RXJyb3IgbWV0aG9kIGNvdWxkIGJlIHRoZXJlIG9yIG5vdAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXJyID0gdGhlVGhybzsKLSAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IChFcnJvcikgdGFyZ2V0Lmludm9rZShlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rID0gYmxhbmsgKyAiICAiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIGVyci5nZXRDbGFzcygpICsgIj09PiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhTdGFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBlcnIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFRhcmdldEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLkNsYXNzPD8+W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9LOiBnZXRUYXJnZXRFcnJvciBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyb3dhYmxlIGlzIDogIiArIHRoZVRocm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gOiByYWlzZWQgaW4gcHJpbnRFeGNlcHRpb24gOiAiICsgeCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWl0IHVwIHRvIG1heFRpbWVJblNlY29uZHMgc2Vjb25kKHMpIHRoZSBnaXZlbiBKTVggY29ubmVjdG9yIHNlcnZlcgotICAgICAqIGNvbWVzIHVwICh3aGljaCBtZWFucyBpc0FjdGl2ZSByZXR1cm5zIHRydWUpLgotICAgICAqIElmIGl0IGZhaWxzIHRvIGRvIHNvIHdlIHRocm93IGEgUnVuVGltZSBleGNlcHRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRSZWFkeShKTVhDb25uZWN0b3JTZXJ2ZXJNQmVhbiBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGltZUluU2Vjb25kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBlbGFwc2VkID0gMDsKLQotICAgICAgICB3aGlsZSAoIXNlcnZlci5pc0FjdGl2ZSgpICYmIGVsYXBzZWQgPCBtYXhUaW1lSW5TZWNvbmRzKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBlbGFwc2VkKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlV0aWxzOjp3YWl0UmVhZHk6IEpNWCBjb25uZWN0b3Igc2VydmVyIGNhbWUgdXAiOwotICAgICAgICAgICAgaWYgKCBlbGFwc2VkID09IDApIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICIgaW1tZWRpYXRlbHkiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICIgYWZ0ZXIgIiArIGVsYXBzZWQgKyAiIHNlY29uZHMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVzc2FnZSArPSAiIFsiICsgc2VydmVyLmdldEFkZHJlc3MoKSArICJdIjsKLSAgICAgICAgICAgIFV0aWxzLmRlYnVnKERFQlVHX1NUQU5EQVJELCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlV0aWxzOjp3YWl0UmVhZHk6IChFUlJPUikgSk1YIGNvbm5lY3RvciIgKwotICAgICAgICAgICAgICAgICAgICAiIHNlcnZlciBkaWRuJ3QgY29tZSB1cCBhZnRlciAiICsgZWxhcHNlZCArICIgc2Vjb25kcyBbIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRBZGRyZXNzKCkgKyAiXSI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvUXVlcnlEYXRhLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3F1ZXJ5L1F1ZXJ5RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWRjNmQzLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvUXVlcnlEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXJ5RGF0YSB7Ci0gICAgcHJvdGVjdGVkIGludCBpbnRWYWx1ZSA9IDk7Ci0gICAgcHJvdGVjdGVkIGxvbmcgbG9uZ1ZhbHVlID0gOUw7Ci0gICAgcHJvdGVjdGVkIEludGVnZXIgaW50ZWdlclZhbHVlID0gSW50ZWdlci52YWx1ZU9mKDkpOwotICAgIHByb3RlY3RlZCBib29sZWFuIGJvb2xlYW5WYWx1ZSA9IHRydWU7Ci0gICAgcHJvdGVjdGVkIGRvdWJsZSBkb3VibGVWYWx1ZSA9IDlEOwotICAgIHByb3RlY3RlZCBmbG9hdCBmbG9hdFZhbHVlID0gOS4wRjsKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHN0cmluZ1ZhbHVlID0gIjkiOwotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9RdWVyeUZhY3RvcnkuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvUXVlcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Mzk0OTkuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9RdWVyeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LlF1ZXJ5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5WYWx1ZUV4cDsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIGZvciBidWlsZGluZyBRdWVyeUV4cCBpbnN0YW5jZXMgb2YgYWxsIGV2ZXJ5IHBvc3NpYmxlIHR5cGUKLSAqIGluIHRlcm1zIG9mIEpNWCBBUEkgbWVtYmVyczsgbm90ZSB0aGF0IHNldmVyYWwgSk1YIGNsYXNzZXMgYXJlIHByaXZhdGUKLSAqIGFuZCBhcHBlYXJzIGluIHRoZSBKREsgQVBJIG9ubHkgYnkgdGhlaXIgc2VyaWFsIGZvcm0uCi0gKiBDb21tZW50cyBpbiBlYWNoIGNhc2Ugb2YgdGhlIGJpZyBzd2l0Y2ggaW4gbWV0aG9kIGdldFF1ZXJ5KCkgZGV0YWlscyB3aGljaAotICogQVBJIG1lbWJlciB3ZSBjb3ZlciB3aXRoIGEgZ2l2ZW4gcXVlcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeUZhY3RvcnkgZXh0ZW5kcyBRdWVyeURhdGEgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWJlYW5DbGFzc05hbWUgPSAiIjsKLSAgICBwcml2YXRlIFN0cmluZyBwcmltaXRpdmVJbnRBdHROYW1lID0gIkludEF0dCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbWl0aXZlTG9uZ0F0dE5hbWUgPSAiTG9uZ0F0dCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW50ZWdlckF0dE5hbWUgPSAiSW50ZWdlckF0dCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbWl0aXZlQm9vbGVhbkF0dE5hbWUgPSAiQm9vbGVhbkF0dCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJpbWl0aXZlRG91YmxlQXR0TmFtZSA9ICJEb3VibGVBdHQiOwotICAgIHByaXZhdGUgU3RyaW5nIHByaW1pdGl2ZUZsb2F0QXR0TmFtZSA9ICJGbG9hdEF0dCI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nQXR0TmFtZSA9ICJTdHJpbmdBdHQiOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PFF1ZXJ5RXhwPiBxdWVyaWVzID0gbmV3IEFycmF5TGlzdDxRdWVyeUV4cD4oKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUXVlcnlGYWN0b3J5LgotICAgICAqIFRoZSBuYW1lIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhbiBNQmVhbi4KLSAgICAgKiBUaGVyZSBpcyBzZXZlcmUgY29uc3RyYWludHMgb24gdGhhdCBNQmVhbiB0aGF0IG11c3Q6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5leHRlbmQgUXVlcnlEYXRhIGluIG9yZGVyIHRvIGluaGVyaXQgYXR0cmlidXRlIHZhbHVlcy4KLSAgICAgKiA8bGk+ZGVmaW5lIGEgUlcgYXR0cmlidXRlIEludEF0dCBvZiB0eXBlIGludAotICAgICAqIGluaXRpYWxpemVkIHRvIFF1ZXJ5RGF0YS5sb25nVmFsdWUKLSAgICAgKiA8bGk+ZGVmaW5lIGEgUlcgYXR0cmlidXRlIExvbmdBdHQgb2YgdHlwZSBsb25nCi0gICAgICogaW5pdGlhbGl6ZWQgdG8gUXVlcnlEYXRhLmludFZhbHVlCi0gICAgICogPGxpPmRlZmluZSBhIFJXIGF0dHJpYnV0ZSBJbnRlZ2VyQXR0IG9mIHR5cGUgSW50ZWdlcgotICAgICAqIGluaXRpYWxpemVkIHRvIFF1ZXJ5RGF0YS5pbnRlZ2VyVmFsdWUKLSAgICAgKiA8bGk+ZGVmaW5lIGEgUlcgYXR0cmlidXRlIEJvb2xlYW5BdHQgb2YgdHlwZSBib29sZWFuCi0gICAgICogaW5pdGlhbGl6ZWQgdG8gUXVlcnlEYXRhLmJvb2xlYW5WYWx1ZQotICAgICAqIDxsaT5kZWZpbmUgYSBSVyBhdHRyaWJ1dGUgRG91YmxlQXR0IG9mIHR5cGUgZG91YmxlCi0gICAgICogaW5pdGlhbGl6ZWQgdG8gUXVlcnlEYXRhLmRvdWJsZVZhbHVlCi0gICAgICogPGxpPmRlZmluZSBhIFJXIGF0dHJpYnV0ZSBGbG9hdEF0dCBvZiB0eXBlIGZsb2F0Ci0gICAgICogaW5pdGlhbGl6ZWQgdG8gUXVlcnlEYXRhLmZsb2F0VmFsdWUKLSAgICAgKiA8bGk+ZGVmaW5lIGEgUlcgYXR0cmlidXRlIFN0cmluZ0F0dCBvZiB0eXBlIFN0cmluZwotICAgICAqIGluaXRpYWxpemVkIHRvIFF1ZXJ5RGF0YS5zdHJpbmdWYWx1ZQotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIFF1ZXJ5RmFjdG9yeShTdHJpbmcgbmFtZSkgewotICAgICAgICB0aGlzLm1iZWFuQ2xhc3NOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoaWdoZXN0IGluZGV4IHZhbHVlIHRoZSBtZXRob2QgZ2V0UXVlcnkgc3VwcG9ydHMuCi0gICAgICogV0FSTklORyA6IHJldHVybnMgMCBpZiBidWlsZFF1ZXJpZXMgaGF2ZW4ndCBiZWVuIGNhbGxlZCBmaXJzdCAhCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gcXVlcmllcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wdWxhdGVzIGFuIEFycmF5TGlzdCBvZiBRdWVyeUV4cC4KLSAgICAgKiBMb3dlc3QgaW5kZXggaXMgMS4KLSAgICAgKiBIaWdoZXN0IGluZGV4IGlzIHJldHVybmVkIGJ5IGdldFNpemUoKS4KLSAgICAgKiA8YnI+VGhlIHF1ZXJpZXMgbnVtYmVyZWQgMSB0byAyMyBhbGxvdyB0byBjb3ZlciBhbGwgdGhlIHVuZGVybHlpbmcKLSAgICAgKiBKYXZhIGNsYXNzZXMgb2YgdGhlIEpNWCBBUEkgdXNlZCB0byBidWlsZCBxdWVyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGJ1aWxkUXVlcmllcygpIHsKLSAgICAgICAgaWYgKCBxdWVyaWVzLnNpemUoKSA9PSAwICkgewotICAgICAgICAgICAgaW50IHNtYWxsZXJJbnRWYWx1ZSA9IGludFZhbHVlIC0gMTsKLSAgICAgICAgICAgIGludCBiaWdnZXJJbnRWYWx1ZSA9IGludFZhbHVlICsgMTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiB0aGUgTUJlYW4gaXMgb2YgY2xhc3MgbWJlYW5DbGFzc05hbWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VPZlF1ZXJ5RXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5pc0luc3RhbmNlT2YoUXVlcnkudmFsdWUobWJlYW5DbGFzc05hbWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgMjoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgdGhlIE1CZWFuIGlzIG9mIGNsYXNzIG1iZWFuQ2xhc3NOYW1lCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50Lk1hdGNoUXVlcnlFeHAgYW5kCi0gICAgICAgICAgICAvLyBqYXZheC5tYW5hZ2VtZW50LkNsYXNzQXR0cmlidXRlVmFsdWVFeHAKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5Lm1hdGNoKFF1ZXJ5LmNsYXNzYXR0cigpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShtYmVhbkNsYXNzTmFtZSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAzOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpbnRWYWx1ZQotICAgICAgICAgICAgLy8gV2UgY292ZXIgamF2YXgubWFuYWdlbWVudC5CaW5hcnlSZWxRdWVyeUV4cCB3aXRoCi0gICAgICAgICAgICAvLyBhIHJlbE9wIGVxdWFsIHRvIEVRIGFuZCBqYXZheC5tYW5hZ2VtZW50Lk51bWVyaWNWYWx1ZUV4cAotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZXEoUXVlcnkuYXR0cihwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoaW50VmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgNDoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUxvbmdBdHROYW1lIG9mIHR5cGUgbG9uZyBoYXMKLSAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBsb25nVmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBFUSBhbmQgamF2YXgubWFuYWdlbWVudC5OdW1lcmljVmFsdWVFeHAKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlTG9uZ0F0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShsb25nVmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgNToKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZURvdWJsZUF0dE5hbWUgb2YgdHlwZSBkb3VibGUKLSAgICAgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgZG91YmxlVmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBFUSBhbmQgamF2YXgubWFuYWdlbWVudC5OdW1lcmljVmFsdWVFeHAKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlRG91YmxlQXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LnZhbHVlKGRvdWJsZVZhbHVlKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDY6Ci0gICAgICAgICAgICAvLyBUcnVlIGlmIGFuIGF0dHJpYnV0ZSBuYW1lZCBwcmltaXRpdmVGbG9hdEF0dE5hbWUgb2YgdHlwZSBmbG9hdAotICAgICAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBmbG9hdFZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LkJpbmFyeVJlbFF1ZXJ5RXhwIHdpdGgKLSAgICAgICAgICAgIC8vIGEgcmVsT3AgZXF1YWwgdG8gRVEgYW5kIGphdmF4Lm1hbmFnZW1lbnQuTnVtZXJpY1ZhbHVlRXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5lcShRdWVyeS5hdHRyKHByaW1pdGl2ZUZsb2F0QXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LnZhbHVlKGZsb2F0VmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgNzoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUludEF0dE5hbWUgb2YgdHlwZSBpbnQgaXMKLSAgICAgICAgICAgIC8vIGhvbGQgYnkgYW4gTUJlYW4gb2YgY2xhc3MgbWJlYW5DbGFzc05hbWUgYW5kIGhhcwotICAgICAgICAgICAgLy8gdGhlIHZhbHVlIGludFZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LlF1YWxpZmllZEF0dHJpYnV0ZVZhbHVlRXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5lcShRdWVyeS5hdHRyKG1iZWFuQ2xhc3NOYW1lLCBwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoaW50VmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgODoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHN0cmluZ0F0dE5hbWUgb2YgdHlwZSBTdHJpbmcgaGFzCi0gICAgICAgICAgICAvLyB0aGUgdmFsdWUgc3RyaW5nVmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBFUSBhbmQgamF2YXgubWFuYWdlbWVudC5TdHJpbmdWYWx1ZUV4cAotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZXEoUXVlcnkuYXR0cihzdHJpbmdBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoc3RyaW5nVmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgOToKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIGludGVnZXJBdHROYW1lIG9mIHR5cGUgSW50ZWdlciBoYXMKLSAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpbnRlZ2VyVmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBFUSBhbmQgamF2YXgubWFuYWdlbWVudC5OdW1lcmljVmFsdWVFeHAKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIoaW50ZWdlckF0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShpbnRlZ2VyVmFsdWUpKSk7Ci0KLSAgICAgICAgICAgIC8vIGNhc2UgMTA6Ci0gICAgICAgICAgICAvLyBUcnVlIGlmIGFuIGF0dHJpYnV0ZSBuYW1lZCBwcmltaXRpdmVCb29sZWFuQXR0TmFtZSBvZiB0eXBlIGJvb2xlYW4KLSAgICAgICAgICAgIC8vIGhhcyB0aGUgdmFsdWUgYm9vbGVhblZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LkJpbmFyeVJlbFF1ZXJ5RXhwIHdpdGgKLSAgICAgICAgICAgIC8vIGEgcmVsT3AgZXF1YWwgdG8gRVEgYW5kIGphdmF4Lm1hbmFnZW1lbnQuQm9vbGVhblZhbHVlRXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5lcShRdWVyeS5hdHRyKHByaW1pdGl2ZUJvb2xlYW5BdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoYm9vbGVhblZhbHVlKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDExOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIG5vdCB0aGUgdmFsdWUgc21hbGxlckludFZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50Lk5vdFF1ZXJ5RXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5ub3QoUXVlcnkuZXEoUXVlcnkuYXR0cihwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoc21hbGxlckludFZhbHVlKSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxMjoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgZWl0aGVyCi0gICAgICAgICAgICAvLyBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpbnRWYWx1ZQotICAgICAgICAgICAgLy8gb3IKLSAgICAgICAgICAgIC8vIGFuIGF0dHJpYnV0ZSBuYW1lZCBwcmltaXRpdmVMb25nQXR0TmFtZSBvZiB0eXBlIGxvbmcgaGFzCi0gICAgICAgICAgICAvLyB0aGUgdmFsdWUgbG9uZ1ZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50Lk9yUXVlcnlFeHAKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5Lm9yKAotICAgICAgICAgICAgICAgICAgICBRdWVyeS5lcShRdWVyeS5hdHRyKHByaW1pdGl2ZUludEF0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShpbnRWYWx1ZSkpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS5lcShRdWVyeS5hdHRyKHByaW1pdGl2ZUxvbmdBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUobG9uZ1ZhbHVlKSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxMzoKLSAgICAgICAgICAgIC8vIFRydWUgaWYKLSAgICAgICAgICAgIC8vIGFuIGF0dHJpYnV0ZSBuYW1lZCBwcmltaXRpdmVJbnRBdHROYW1lIG9mIHR5cGUgaW50IGhhcwotICAgICAgICAgICAgLy8gdGhlIHZhbHVlIGludFZhbHVlCi0gICAgICAgICAgICAvLyBhbmQKLSAgICAgICAgICAgIC8vIGFuIGF0dHJpYnV0ZSBuYW1lZCBwcmltaXRpdmVMb25nQXR0TmFtZSBvZiB0eXBlIGxvbmcgaGFzCi0gICAgICAgICAgICAvLyB0aGUgdmFsdWUgbG9uZ1ZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LkFuZFF1ZXJ5RXhwCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5hbmQoCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlSW50QXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LnZhbHVlKGludFZhbHVlKSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlTG9uZ0F0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShsb25nVmFsdWUpKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDE0OgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBpbnRWYWx1ZQotICAgICAgICAgICAgLy8gV2UgY292ZXIgamF2YXgubWFuYWdlbWVudC5JblF1ZXJ5RXhwCi0gICAgICAgICAgICBWYWx1ZUV4cFtdIGluQXJyYXkgPSB7UXVlcnkudmFsdWUoaW50VmFsdWUpfTsKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5LmluKFF1ZXJ5LmF0dHIocHJpbWl0aXZlSW50QXR0TmFtZSksIGluQXJyYXkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxNToKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUludEF0dE5hbWUgb2YgdHlwZSBpbnQgaGFzCi0gICAgICAgICAgICAvLyBpdHMgdmFsdWUgaW4gYmV0d2VlbiBzbWFsbGVySW50VmFsdWUgYW5kIGJpZ2dlckludFZhbHVlCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LkJldHdlZW5SZWxRdWVyeUV4cAotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuYmV0d2VlbihRdWVyeS5hdHRyKHByaW1pdGl2ZUludEF0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShzbWFsbGVySW50VmFsdWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShiaWdnZXJJbnRWYWx1ZSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxNjoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUludEF0dE5hbWUgb2YgdHlwZSBpbnQgaGFzCi0gICAgICAgICAgICAvLyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBzbWFsbGVySW50VmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBHVAotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZ3QoUXVlcnkuYXR0cihwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudmFsdWUoc21hbGxlckludFZhbHVlKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDE3OgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIGEgdmFsdWUgZ3JlYXRlciBvciBlcXVhbCB0byBzbWFsbGVySW50VmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBHRQotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZ2VxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlSW50QXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LnZhbHVlKHNtYWxsZXJJbnRWYWx1ZSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxODoKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUludEF0dE5hbWUgb2YgdHlwZSBpbnQgaGFzCi0gICAgICAgICAgICAvLyBhIHZhbHVlIHNtYWxsZXIgdGhhbiBiaWdnZXJJbnRWYWx1ZQotICAgICAgICAgICAgLy8gV2UgY292ZXIgamF2YXgubWFuYWdlbWVudC5CaW5hcnlSZWxRdWVyeUV4cCB3aXRoCi0gICAgICAgICAgICAvLyBhIHJlbE9wIGVxdWFsIHRvIExUCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5sdChRdWVyeS5hdHRyKHByaW1pdGl2ZUludEF0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS52YWx1ZShiaWdnZXJJbnRWYWx1ZSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAxOToKLSAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYXR0cmlidXRlIG5hbWVkIHByaW1pdGl2ZUludEF0dE5hbWUgb2YgdHlwZSBpbnQgaGFzCi0gICAgICAgICAgICAvLyBhIHZhbHVlIHNtYWxsZXIgb3IgZXF1YWwgdG8gYmlnZ2VySW50VmFsdWUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBMRQotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkubGVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlSW50QXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LnZhbHVlKGJpZ2dlckludFZhbHVlKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDIwOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIGEgdmFsdWUgZXF1YWwgdG8gaW50VmFsdWUgbWludXMgemVybwotICAgICAgICAgICAgLy8gV2UgY292ZXIgamF2YXgubWFuYWdlbWVudC5CaW5hcnlSZWxRdWVyeUV4cCB3aXRoCi0gICAgICAgICAgICAvLyBhIHJlbE9wIGVxdWFsIHRvIE1JTlVTCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5lcShRdWVyeS5hdHRyKHByaW1pdGl2ZUludEF0dE5hbWUpLAotICAgICAgICAgICAgICAgICAgICBRdWVyeS5taW51cyhRdWVyeS52YWx1ZShpbnRWYWx1ZSksIFF1ZXJ5LnZhbHVlKDApKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDIxOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIGEgdmFsdWUgZXF1YWwgdG8gaW50VmFsdWUgcGx1cyB6ZXJvCi0gICAgICAgICAgICAvLyBXZSBjb3ZlciBqYXZheC5tYW5hZ2VtZW50LkJpbmFyeVJlbFF1ZXJ5RXhwIHdpdGgKLSAgICAgICAgICAgIC8vIGEgcmVsT3AgZXF1YWwgdG8gUExVUwotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZXEoUXVlcnkuYXR0cihwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkucGx1cyhRdWVyeS52YWx1ZShpbnRWYWx1ZSksIFF1ZXJ5LnZhbHVlKDApKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDIyOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIGEgdmFsdWUgZXF1YWwgdG8gaW50VmFsdWUgZGl2aWRlZCBieSBvbmUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBESVYKLSAgICAgICAgICAgIHF1ZXJpZXMuYWRkKFF1ZXJ5LmVxKFF1ZXJ5LmF0dHIocHJpbWl0aXZlSW50QXR0TmFtZSksCi0gICAgICAgICAgICAgICAgICAgIFF1ZXJ5LmRpdihRdWVyeS52YWx1ZShpbnRWYWx1ZSksIFF1ZXJ5LnZhbHVlKDEpKSkpOwotCi0gICAgICAgICAgICAvLyBjYXNlIDIzOgotICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhdHRyaWJ1dGUgbmFtZWQgcHJpbWl0aXZlSW50QXR0TmFtZSBvZiB0eXBlIGludCBoYXMKLSAgICAgICAgICAgIC8vIGEgdmFsdWUgZXF1YWwgdG8gaW50VmFsdWUgbXVsdGlwbGljYXRlZCBieSBvbmUKLSAgICAgICAgICAgIC8vIFdlIGNvdmVyIGphdmF4Lm1hbmFnZW1lbnQuQmluYXJ5UmVsUXVlcnlFeHAgd2l0aAotICAgICAgICAgICAgLy8gYSByZWxPcCBlcXVhbCB0byBUSU1FUwotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuZXEoUXVlcnkuYXR0cihwcmltaXRpdmVJbnRBdHROYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgUXVlcnkudGltZXMoUXVlcnkudmFsdWUoaW50VmFsdWUpLCBRdWVyeS52YWx1ZSgxKSkpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAyNDoKLSAgICAgICAgICAgIC8vIFRoYXQgcXVlcnkgaXMgYSBjb21wbGV4IG9uZSB0aGF0IGNvbWJpbmVzIHdpdGhpbiBhIGJpZyBBTkQKLSAgICAgICAgICAgIC8vIHF1ZXJpZXMgd2l0aCBpbmRleCAyIHRvIDIzIGluY2x1c2l2ZS4gQnV0IGJlY2F1c2UgYSBMaXN0IGlzCi0gICAgICAgICAgICAvLyB6ZXJvIGJhc2VkLCB3ZSBtdXN0IGRlY3JlbWVudCBhbGwgaW5kZXhlcyBieSAxIHdoZW4gcmV0cmlldmluZwotICAgICAgICAgICAgLy8gYW55IHByZXZpb3VzbHkgc3RvcmVkIHF1ZXJ5LgotICAgICAgICAgICAgUXVlcnlFeHAgcTJfMyA9IFF1ZXJ5LmFuZChxdWVyaWVzLmdldCgyLTEpLCBxdWVyaWVzLmdldCgzLTEpKTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHE0XzUgPSBRdWVyeS5hbmQocXVlcmllcy5nZXQoNC0xKSwgcXVlcmllcy5nZXQoNS0xKSk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxNl83ID0gUXVlcnkuYW5kKHF1ZXJpZXMuZ2V0KDYtMSksIHF1ZXJpZXMuZ2V0KDctMSkpOwotICAgICAgICAgICAgUXVlcnlFeHAgcThfOSA9IFF1ZXJ5LmFuZChxdWVyaWVzLmdldCg4LTEpLCBxdWVyaWVzLmdldCg5LTEpKTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHExMF8xMSA9IFF1ZXJ5LmFuZChxdWVyaWVzLmdldCgxMC0xKSwgcXVlcmllcy5nZXQoMTEtMSkpOwotICAgICAgICAgICAgUXVlcnlFeHAgcTEyXzEzID0gUXVlcnkuYW5kKHF1ZXJpZXMuZ2V0KDEyLTEpLCBxdWVyaWVzLmdldCgxMy0xKSk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxMTRfMTUgPSBRdWVyeS5hbmQocXVlcmllcy5nZXQoMTQtMSksIHF1ZXJpZXMuZ2V0KDE1LTEpKTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHExNl8xNyA9IFF1ZXJ5LmFuZChxdWVyaWVzLmdldCgxNi0xKSwgcXVlcmllcy5nZXQoMTctMSkpOwotICAgICAgICAgICAgUXVlcnlFeHAgcTE4XzE5ID0gUXVlcnkuYW5kKHF1ZXJpZXMuZ2V0KDE4LTEpLCBxdWVyaWVzLmdldCgxOS0xKSk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxMjBfMjEgPSBRdWVyeS5hbmQocXVlcmllcy5nZXQoMjAtMSksIHF1ZXJpZXMuZ2V0KDIxLTEpKTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHEyMl8yMyA9IFF1ZXJ5LmFuZChxdWVyaWVzLmdldCgyMi0xKSwgcXVlcmllcy5nZXQoMjMtMSkpOwotICAgICAgICAgICAgUXVlcnlFeHAgcTJfNSA9IFF1ZXJ5LmFuZChxMl8zLCBxNF81KTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHE2XzkgPSBRdWVyeS5hbmQocTZfNywgcThfOSk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxMTBfMTMgPSBRdWVyeS5hbmQocTEwXzExLCBxMTJfMTMpOwotICAgICAgICAgICAgUXVlcnlFeHAgcTE0XzE3ID0gUXVlcnkuYW5kKHExNF8xNSwgcTE2XzE3KTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHExOF8yMSA9IFF1ZXJ5LmFuZChxMThfMTksIHEyMF8yMSk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxMl85ID0gUXVlcnkuYW5kKHEyXzUsIHE2XzkpOwotICAgICAgICAgICAgUXVlcnlFeHAgcTEwXzE3ID0gUXVlcnkuYW5kKHExMF8xMywgcTE0XzE3KTsKLSAgICAgICAgICAgIFF1ZXJ5RXhwIHExOF8yMyA9IFF1ZXJ5LmFuZChxMThfMjEsIHEyMl8yMyk7Ci0gICAgICAgICAgICBRdWVyeUV4cCBxMl8xNyA9IFF1ZXJ5LmFuZChxMl85LCBxMTBfMTcpOwotICAgICAgICAgICAgcXVlcmllcy5hZGQoUXVlcnkuYW5kKHEyXzE3LCBxMThfMjMpKTsKLQotICAgICAgICAgICAgLy8gY2FzZSAyNToKLSAgICAgICAgICAgIC8vIENvbXBsZXggcXVlcnkgbWl4aW5nIEFORCBhbmQgT1IuCi0gICAgICAgICAgICBxdWVyaWVzLmFkZChRdWVyeS5vcihxNl85LCBxMThfMjMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBRdWVyeUV4cCB0YWtlbiBpcyB0aGUgQXJyYXlMaXN0IHBvcHVsYXRlZCBieSBidWlsZFF1ZXJpZXMoKS4KLSAgICAgKiBMb3dlc3QgaW5kZXggaXMgMS4KLSAgICAgKiBIaWdoZXN0IGluZGV4IGlzIHJldHVybmVkIGJ5IGdldFNpemUoKS4KLSAgICAgKiA8YnI+VGhlIHF1ZXJpZXMgbnVtYmVyZWQgMSB0byAyMyBhbGxvdyB0byBjb3ZlciBhbGwgdGhlIHVuZGVybHlpbmcKLSAgICAgKiBKYXZhIGNsYXNzZXMgb2YgdGhlIEpNWCBBUEkgdXNlZCB0byBidWlsZCBxdWVyaWVzLgotICAgICAqLwotICAgIHB1YmxpYyBRdWVyeUV4cCBnZXRRdWVyeShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHF1ZXJpZXMuZ2V0KGluZGV4IC0gMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2U1ZmFjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU2VydmVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhTZXJ2aWNlVVJMIDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUmVnaXN0cmF0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuU3RhbmRhcmRNQmVhbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgYW4gTUJlYW4gdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBhbmQgdXNlZCBvbiBjbGllbnQgc2lkZQotICogdG8gaGFuZGxlIGluZm9ybWF0aW9ucyBvciBwcm9wZXJ0aWVzIG9mIHRoZSByZW1vdGUgc2VydmVyLgotICoKLSAqIEZvciBleGFtcGxlLCB0aGlzIE1CZWFuIGNhbiBzdG9yZSBJT1IgYWRkcmVzc2VzCi0gKiBvZiBSTUkvSUlPUCBjb25uZWN0b3IocykgdXNlZCBpbiBhIHRlc3QuCi0gKgotICogVGhhdCBNQmVhbiBtaWdodCBub3QgYmUgdXNlZCBmb3IgdGVzdGluZyBwdXJwb3NlIGl0c2VsZi4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudHMgU2VydmVyRGVsZWdhdGVNQmVhbiwgTUJlYW5SZWdpc3RyYXRpb24gewotCi0gICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtYmVhblNlcnZlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBMaXN0PEpNWFNlcnZpY2VVUkw+IGFkZHJlc3NlcyAgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHBvcnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGphdmFWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLSAgICBwcml2YXRlIGludCBzcWVKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJDYWxsQ291bnQgPSAwOwotICAgIHByaXZhdGUgU3RyaW5nIGpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgdGVzdEpNWEF1dGhlbnRpY2F0b3JDYWxsQ291bnQgPSAwOwotICAgIHByaXZhdGUgUHJpbmNpcGFsIHRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsID0gbnVsbDsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJOTyBQQVJBTUVURVIgQ09OU1RSVUNUT1IgU2VydmVyRGVsZWdhdGUiKQotICAgIHB1YmxpYyBTZXJ2ZXJEZWxlZ2F0ZSgpIHsKLSAgICAgICAgYWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDxKTVhTZXJ2aWNlVVJMPigpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwgT2JqZWN0TmFtZSBuYW1lKQotICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBJbml0aWFsaXplIE1CZWFuU2VydmVyIGF0dHJpYnV0ZQotICAgICAgICBtYmVhblNlcnZlciA9IHNlcnZlcjsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBvc3RSZWdpc3RlcihCb29sZWFuIHJlZ2lzdHJhdGlvbkRvbmUpIHsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJlRGVyZWdpc3RlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwb3N0RGVyZWdpc3RlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRBZGRyZXNzKEpNWFNlcnZpY2VVUkwgdXJsKSB7Ci0gICAgICAgIGFkZHJlc3Nlcy5hZGQodXJsKSA7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8Sk1YU2VydmljZVVSTD4gZ2V0QWRkcmVzc2VzKCkgewotICAgICAgICByZXR1cm4gYWRkcmVzc2VzIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwKSB7Ci0gICAgICAgIHBvcnQgPSBwIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0IDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gamF2YVZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3FlSm14d3NDcmVkZW50aWFsc1Byb3ZpZGVyQ2FsbGVkKCkgewotICAgICAgICBzcWVKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJDYWxsQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFNxZUpteHdzQ3JlZGVudGlhbHNQcm92aWRlckNhbGxDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHNxZUpteHdzQ3JlZGVudGlhbHNQcm92aWRlckNhbGxDb3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmwoU3RyaW5nIHVybCkgewotICAgICAgICBqbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmwgPSB1cmw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmwoKSB7Ci0gICAgICAgIHJldHVybiBqbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEpNWEF1dGhlbnRpY2F0b3JDYWxsZWQoKSB7Ci0gICAgICAgIHRlc3RKTVhBdXRoZW50aWNhdG9yQ2FsbENvdW50Kys7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRUZXN0Sk1YQXV0aGVudGljYXRvckNhbGxDb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIHRlc3RKTVhBdXRoZW50aWNhdG9yQ2FsbENvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsKFByaW5jaXBhbCBwcmluY2lwYWwpIHsKLSAgICAgICAgdGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWwgPSBwcmluY2lwYWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXN0Sk1YQXV0aGVudGljYXRvclByaW5jaXBhbFN0cmluZygpIHsKLSAgICAgICAgaWYgKCB0ZXN0Sk1YQXV0aGVudGljYXRvclByaW5jaXBhbCAhPSBudWxsICkgewotICAgICAgICAgICAgcmV0dXJuIHRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhbmQgcmVnaXN0ZXJzIGEgU3RhbmRhcmRNQmVhbiBpbiB0aGUgTUJlYW4gc2VydmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lCi0gICAgICogICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZSBvZiB0aGUgTUJlYW4uCi0gICAgICogQHBhcmFtIGludGVyZmFjZUNsYXNzTmFtZQotICAgICAqICAgICAgVGhlIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGNsYXNzIG5hbWUgb2YgdGhlIE1CZWFuLgotICAgICAqIEBwYXJhbSBpc01YQmVhbgotICAgICAqICAgICAgSWYgdHJ1ZSwgdGhlIHJlc3VsdGFudCBNQmVhbiBpcyBhbiBNWEJlYW4uCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiAgICAgIFRoZSBvYmplY3QgbmFtZSBvZiB0aGUgU3RhbmRhcmRNQmVhbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdGFuZGFyZE1CZWFuKAotICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLAotICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZUNsYXNzTmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNNWEJlYW4sCi0gICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBPYmplY3QgaW1wbGVtZW50YXRpb24gPQotICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoaW1wbGVtZW50YXRpb25DbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIENsYXNzPE9iamVjdD4gaW50ZXJmYWNlQ2xhc3MgPSBpbnRlcmZhY2VDbGFzc05hbWUgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgKENsYXNzPE9iamVjdD4pQ2xhc3MuZm9yTmFtZShpbnRlcmZhY2VDbGFzc05hbWUpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0aGUgU3RhbmRhcmRNQmVhbgotICAgICAgICBTdGFuZGFyZE1CZWFuIHN0YW5kYXJkTUJlYW4gPSBuZXcgU3RhbmRhcmRNQmVhbigKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiwKLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VDbGFzcywKLSAgICAgICAgICAgICAgICBpc01YQmVhbik7Ci0KLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIFN0YW5kYXJkTUJlYW4KLSAgICAgICAgbWJlYW5TZXJ2ZXIucmVnaXN0ZXJNQmVhbihzdGFuZGFyZE1CZWFuLCBuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgYW5kIHJlZ2lzdGVycyBhIFN0YW5kYXJkTUJlYW4gaW4gdGhlIE1CZWFuIHNlcnZlci4KLSAgICAgKiBUaGUgb2JqZWN0IHdpbGwgdXNlIHN0YW5kYXJkIEpNWCBkZXNpZ24gcGF0dGVybiB0byBkZXRlcm1pbmUKLSAgICAgKiB0aGUgbWFuYWdlbWVudCBpbnRlcmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdGFuZGFyZE1CZWFuKAotICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLAotICAgICAgICAgICAgYm9vbGVhbiBpc01YQmVhbiwKLSAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGNyZWF0ZVN0YW5kYXJkTUJlYW4oaW1wbGVtZW50YXRpb25DbGFzc05hbWUsIG51bGwsIGlzTVhCZWFuLCBuYW1lKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3F1ZXJ5L1NlcnZlckRlbGVnYXRlTUJlYW4uamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU2VydmVyRGVsZWdhdGVNQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGYwYjNmLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU2VydmVyRGVsZWdhdGVNQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkwgOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKLQotQFNxZURlc2NyaXB0b3JLZXkoIklOVEVSRkFDRSBTZXJ2ZXJEZWxlZ2F0ZU1CZWFuIikKLXB1YmxpYyBpbnRlcmZhY2UgU2VydmVyRGVsZWdhdGVNQmVhbiB7Ci0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBBZGRyZXNzIikKLSAgICBwdWJsaWMgdm9pZCBhZGRBZGRyZXNzKEpNWFNlcnZpY2VVUkwgdXJsKTsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgQWRkcmVzcyIpCi0gICAgcHVibGljIExpc3Q8Sk1YU2VydmljZVVSTD4gZ2V0QWRkcmVzc2VzKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBvcnQoKTsKLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0KFN0cmluZyBwKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZlcnNpb24oKTsKLQotICAgIHB1YmxpYyB2b2lkIHNxZUpteHdzQ3JlZGVudGlhbHNQcm92aWRlckNhbGxlZCgpOwotICAgIHB1YmxpYyBpbnQgZ2V0U3FlSm14d3NDcmVkZW50aWFsc1Byb3ZpZGVyQ2FsbENvdW50KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmwoU3RyaW5nIHVybCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXRKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJVcmwoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKTVhBdXRoZW50aWNhdG9yQ2FsbGVkKCk7Ci0gICAgcHVibGljIGludCBnZXRUZXN0Sk1YQXV0aGVudGljYXRvckNhbGxDb3VudCgpOwotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCk7Ci0gICAgcHVibGljIFN0cmluZyBnZXRUZXN0Sk1YQXV0aGVudGljYXRvclByaW5jaXBhbFN0cmluZygpOwotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU3RhbmRhcmRNQmVhbigKLSAgICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBpbnRlcmZhY2VDbGFzc05hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzTVhCZWFuLAotICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVN0YW5kYXJkTUJlYW4oCi0gICAgICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25DbGFzc05hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzTVhCZWFuLAotICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU3FlRGVzY3JpcHRvcktleS5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9TcWVEZXNjcmlwdG9yS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTQ5MjYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9xdWVyeS9TcWVEZXNjcmlwdG9yS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkRlc2NyaXB0b3JLZXk7Ci0KLS8qKgotICogVGhhdCBhbm5vdGF0aW9uIGlzIHVzYWJsZSBldmVyeXdoZXJlIERlc2NyaXB0b3JLZXkgaXMgKGFuZCBldmVuIG1vcmUpLgotICogSXQgaXMgZm9yIHVzZSB0byB0ZXN0IHRoYXQgeW91IGNhbiByZXRyaWV2ZSB0aGUgU3FlRGVzY3JpcHRvcktleSBpbnRvIHRoZQotICogYXBwcm9wcmlhdGUgRGVzY3JpcHRvciBpbnN0YW5jZXMgYXMgYnVpbHQgYnkgdGhlIEpNWCBydW50aW1lLgotICovCi1ARG9jdW1lbnRlZAotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNxZURlc2NyaXB0b3JLZXkgewotICAgIEBEZXNjcmlwdG9yS2V5KCJzcWVEZXNjcmlwdG9yS2V5IikKLSAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgIC8vIExpc3QgZGVzY3JpcHRvciBmaWVsZHMgdGhhdCBtYXkgYmUgYWRkZWQgb3IgbWF5IGJlIHVwZGF0ZWQKLSAgICAvLyB3aGVuIHJldHJpZXZpbmcgYW4gTUJlYW5JbmZvIHVzaW5nIGEgSk1YV1MgY29ubmVjdGlvbiBjb21wYXJlZCB0byB0aGUKLSAgICAvLyBNQmVhbkluZm8gcmV0dXJuZWQgYnkgYSBsb2NhbCBNQmVhblNlcnZlci4KLSAgICAvLyBUaGUgYW5ub3RhdGlvbiBmb3JtYXQgaXMgOgotICAgIC8vICAgPGRlc2NyaXB0b3JGaWVsZE5hbWU+PTxkZXNjcmlwdG9yRmllbGRWYWx1ZT4KLSAgICAvLyBUaGUgdmFsdWVzIGFjdHVhbGx5IGhhbmRsZWQgYnkgdGhlIHRlc3Qgc3VpdGUgYXJlIDoKLSAgICAvLyAgIG9wZW5UeXBlPVNpbXBsZVR5cGUuVk9JRAotICAgIEBEZXNjcmlwdG9yS2V5KCJkZXNjcmlwdG9yRmllbGRzIikKLSAgICBTdHJpbmdbXSBkZXNjcmlwdG9yRmllbGRzKCkgZGVmYXVsdCB7fTsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiODEyOC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3F1ZXJ5L1N1cHBvcnRlZFF1ZXJ5VHlwZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDU4ODY1Ci0gKiBAc3VtbWFyeSBUZXN0cyBtb3N0IG9mIHRoZSBleGlzdGluZyBxdWVyeSB0eXBlcy4KLSAqIEBhdXRob3IgT2xpdmllciBMYWduZWF1Ci0gKiBAbW9kdWxlcyBqYXZhLm1hbmFnZW1lbnQKLSAqIEBjb21waWxlIFRlc3RRdWVyeS5qYXZhCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIFN1cHBvcnRlZFF1ZXJ5VHlwZXNUZXN0IC1tYmVhbkNsYXNzTmFtZSBUZXN0UXVlcnkKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLk1hcCA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5RdWVyeUV4cDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkw7Ci0KLXB1YmxpYyBjbGFzcyBTdXBwb3J0ZWRRdWVyeVR5cGVzVGVzdCB7Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIG1iZWFuQ2xhc3NOYW1lID0gbnVsbDsKLQotICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MgPSBudWxsOwotCi0KLSAgICAvKgotICAgICAqIEZpcnN0IERlYnVnIHByb3BlcnRpZXMgYW5kIGFyZ3VtZW50cyBhcmUgY29sbGVjdCBpbiBleHBlY3RlZAotICAgICAqIG1hcCAgKGFyZ05hbWUsIHZhbHVlKSBmb3JtYXQsIHRoZW4gY2FsbHMgb3JpZ2luYWwgdGVzdCdzIHJ1biBtZXRob2QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0KLSAgICAgICAgLy8gUGFyc2VzIHBhcmFtZXRlcnMKLSAgICAgICAgVXRpbHMucGFyc2VEZWJ1Z1Byb3BlcnRpZXMoKTsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBVdGlscy5wYXJzZVBhcmFtZXRlcnMoYXJncykgOwotCi0gICAgICAgIC8vIFJ1biB0ZXN0Ci0gICAgICAgIFN1cHBvcnRlZFF1ZXJ5VHlwZXNUZXN0IHRlc3QgPSBuZXcgU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3QoKTsKLSAgICAgICAgdGVzdC5ydW4obWFwKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwOwotCi0gICAgICAgIE9iamVjdE5hbWUgb24gPSBudWxsOwotICAgICAgICBPYmplY3ROYW1lIHNlcnZlckRlbGVnYXRlT2JqZWN0TmFtZSA9IG51bGw7Ci0KLSAgICAgICAgSk1YQ29ubmVjdG9yU2VydmVyIGNzID0gbnVsbDsKLSAgICAgICAgSk1YQ29ubmVjdG9yIGNjID0gbnVsbDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1cHBvcnRlZFF1ZXJ5VHlwZXNUZXN0OjpydW46IFN0YXJ0IikgOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSk1YIE1iZWFuU2VydmVyIHVzZWQgaW5zaWRlIHNpbmdsZSBWTSBhcyBpZiByZW1vdGUuCi0gICAgICAgICAgICBNQmVhblNlcnZlciBtYnMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7Ci0KLSAgICAgICAgICAgIEpNWFNlcnZpY2VVUkwgdXJsID0gbmV3IEpNWFNlcnZpY2VVUkwoInJtaSIsIG51bGwsIDApOwotICAgICAgICAgICAgY3MgPSBKTVhDb25uZWN0b3JTZXJ2ZXJGYWN0b3J5Lm5ld0pNWENvbm5lY3RvclNlcnZlcih1cmwsIG51bGwsIG1icyk7Ci0gICAgICAgICAgICBjcy5zdGFydCgpOwotCi0gICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIGFkZHIgPSBjcy5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICBjYyA9IEpNWENvbm5lY3RvckZhY3RvcnkuY29ubmVjdChhZGRyKTsKLSAgICAgICAgICAgIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBTZXJ2ZXJEZWxlZ2F0ZSBNQmVhbiBvbiB0aGUgcmVtb3RlIE1CZWFuU2VydmVyCi0gICAgICAgICAgICBTdHJpbmcgc2VydmVyRGVsZWdhdGVDbGFzc05hbWUgPSBTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBzZXJ2ZXJEZWxlZ2F0ZU9iamVjdE5hbWUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZSgiZGVmYXVsdERvbWFpbjpjbGFzcz0iICsgc2VydmVyRGVsZWdhdGVDbGFzc05hbWUpOwotICAgICAgICAgICAgbWJzYy5jcmVhdGVNQmVhbihzZXJ2ZXJEZWxlZ2F0ZUNsYXNzTmFtZSwgc2VydmVyRGVsZWdhdGVPYmplY3ROYW1lKTsKLQotICAgICAgICAgICAgLy8gUmV0cmlldmUgdGhlIE1CZWFuIGNsYXNzIG5hbWUKLSAgICAgICAgICAgIG1iZWFuQ2xhc3NOYW1lID0gKFN0cmluZykgYXJncy5nZXQoIi1tYmVhbkNsYXNzTmFtZSIpIDsKLSAgICAgICAgICAgIG9uID0gbmV3IE9iamVjdE5hbWUoImRlZmF1bHREb21haW46Y2xhc3M9IiArIG1iZWFuQ2xhc3NOYW1lKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgTUJlYW4gb24gdGhlIHJlbW90ZSBNQmVhblNlcnZlcgotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdXBwb3J0ZWRRdWVyeVR5cGVzVGVzdDo6cnVuOiBDUkVBVEUgIiArCi0gICAgICAgICAgICAgICAgICAgIG1iZWFuQ2xhc3NOYW1lICsgIiBvbiB0aGUgcmVtb3RlIE1CZWFuU2VydmVyIHdpdGggbmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICsgb24pOwotICAgICAgICAgICAgbWJzYy5jcmVhdGVNQmVhbihtYmVhbkNsYXNzTmFtZSwgb24pOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBRdWVyeUZhY3RvcnkgYW5kIHNldHVwIHdoaWNoIHF1ZXJ5IHdlJ2xsIHVzZS4KLSAgICAgICAgICAgIFF1ZXJ5RmFjdG9yeSBxdWVyaWVzID0gbmV3IFF1ZXJ5RmFjdG9yeShtYmVhbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBxdWVyaWVzLmJ1aWxkUXVlcmllcygpOwotICAgICAgICAgICAgaW50IG1heEluZGV4ID0gcXVlcmllcy5nZXRTaXplKCk7Ci0gICAgICAgICAgICBpbnQgbWluSW5kZXggPSAxOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgU2V0PE9iamVjdE5hbWU+IHRvIGNoZWNrIGxhdGVyIG9uCi0gICAgICAgICAgICAvLyB0aGUgcXVlcnlOYW1lcygpIHJlc3VsdHMKLSAgICAgICAgICAgIFNldDxPYmplY3ROYW1lPiByZWZlcmVuY2VOYW1lU2V0ID0gbmV3IEhhc2hTZXQ8T2JqZWN0TmFtZT4oKTsKLSAgICAgICAgICAgIHJlZmVyZW5jZU5hbWVTZXQuYWRkKG9uKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcmVmZXJlbmNlIFNldDxPYmplY3RJbnN0YW5jZT4gdG8gY2hlY2sgbGF0ZXIgb24KLSAgICAgICAgICAgIC8vIHRoZSBxdWVyeU1CZWFucygpIHJlc3VsdHMKLSAgICAgICAgICAgIE9iamVjdEluc3RhbmNlIG9pID0gbmV3IE9iamVjdEluc3RhbmNlKG9uLCBtYmVhbkNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBTZXQ8T2JqZWN0SW5zdGFuY2U+IHJlZmVyZW5jZUluc3RhbmNlU2V0ID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8T2JqZWN0SW5zdGFuY2U+KCk7Ci0gICAgICAgICAgICByZWZlcmVuY2VJbnN0YW5jZVNldC5hZGQob2kpOwotCi0gICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBxdWVyeU5hbWVzIGFuZCBxdWVyeU1CZWFucyByZXF1ZXN0cwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1pbkluZGV4OyBpIDw9IG1heEluZGV4OyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgUXVlcnlFeHAgcXVlcnkgPSBxdWVyaWVzLmdldFF1ZXJ5KGkpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3Q6OnJ1bjogUXVlcnkgIyAiICsgaSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJxdWVyeSAiICsgcXVlcnkpOwotICAgICAgICAgICAgICAgIGVycm9yQ291bnQgKz0KLSAgICAgICAgICAgICAgICAgICAgZG9RdWVyeU5hbWVzKHF1ZXJ5LCByZWZlcmVuY2VOYW1lU2V0KTsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9Ci0gICAgICAgICAgICAgICAgICAgIGRvUXVlcnlNQmVhbnMocXVlcnksIHJlZmVyZW5jZUluc3RhbmNlU2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gRG8gdW5yZWdpc3RlciB0aGUgTUJlYW4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ic2MuaXNSZWdpc3RlcmVkKG9uKSkgewotICAgICAgICAgICAgICAgICAgICBtYnNjLnVucmVnaXN0ZXJNQmVhbihvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtYnNjLmlzUmVnaXN0ZXJlZChzZXJ2ZXJEZWxlZ2F0ZU9iamVjdE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ic2MudW5yZWdpc3Rlck1CZWFuKHNlcnZlckRlbGVnYXRlT2JqZWN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIENsb3NlIEpNWCBDb25uZWN0b3IgQ2xpZW50Ci0gICAgICAgICAgICAgICAgY2MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGNvbm5lcnRvciBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBjcy5zdG9wKCk7Ci0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3Q6OnJ1bjogRG9uZSIpIDsKLQotICAgICAgICAvLyBIYW5kbGUgcmVzdWx0Ci0gICAgICAgIGlmIChlcnJvckNvdW50ID09IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3Q6OnJ1bjogKE9LKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiU3VwcG9ydGVkUXVlcnlUeXBlc1Rlc3Q6OnJ1bjogKEVSUk9SKSBHb3QgIiArCi0gICAgICAgICAgICAgICAgICAgICsgZXJyb3JDb3VudCArICIgZXJyb3IocykiOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgaW50IGRvUXVlcnlOYW1lcyhRdWVyeUV4cCBxdWVyeSwgU2V0PE9iamVjdE5hbWU+IHJlZmVyZW5jZVNldCkgewotICAgICAgICBpbnQgZXJyb3JDb3VudCA9IDA7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIDwqPiBQZXJmb3JtIHF1ZXJ5TmFtZXMgY2FsbCAiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2FsbCBxdWVyeU5hbWVzIG9uIHRoZSByZW1vdGUgTUJlYW5TZXJ2ZXIKLSAgICAgICAgICAgIFNldDxPYmplY3ROYW1lPiByZW1vdGVTZXQgPSAgbWJzYy5xdWVyeU5hbWVzKG51bGwsIHF1ZXJ5KTsKLQotICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgMiBTZXQ8T2JqZWN0TmFtZT4KLSAgICAgICAgICAgIGVycm9yQ291bnQgKz0gY2hlY2tTZXQocmVtb3RlU2V0LCByZWZlcmVuY2VTZXQpOwotCi0gICAgICAgICAgICAvLyBDbGVhbmluZwotICAgICAgICAgICAgcmVtb3RlU2V0LmNsZWFyKCk7Ci0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpOwotICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBlcnJvckNvdW50ID09IDAgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0KE9LKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdChFUlJPUikgUXVlcnkgZmFpbGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyb3JDb3VudDsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgaW50IGRvUXVlcnlNQmVhbnMoUXVlcnlFeHAgcXVlcnksIFNldDxPYmplY3RJbnN0YW5jZT4gcmVmZXJlbmNlU2V0KSB7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMDsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgPCo+IFBlcmZvcm0gcXVlcnlNQmVhbnMgY2FsbCAiKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gQ2FsbCBxdWVyeU1CZWFucyBvbiB0aGUgcmVtb3RlIE1CZWFuU2VydmVyCi0gICAgICAgICAgICBTZXQ8T2JqZWN0SW5zdGFuY2U+IHJlbW90ZVNldCA9ICBtYnNjLnF1ZXJ5TUJlYW5zKG51bGwsIHF1ZXJ5KTsKLQotICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgMiBTZXQ8T2JqZWN0SW5zdGFuY2U+Ci0gICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrU2V0KHJlbW90ZVNldCwgcmVmZXJlbmNlU2V0KTsKLQotICAgICAgICAgICAgLy8gQ2xlYW5pbmcKLSAgICAgICAgICAgIHJlbW90ZVNldC5jbGVhcigpOwotCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZXJyb3JDb3VudCA9PSAwICkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdChPSykiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQoRVJST1IpIFF1ZXJ5IGZhaWxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycm9yQ291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJldHR5IHByaW50IG9mIGEgU2V0IGNvbnRlbnQuCi0gICAgICogV2hlbiB0aGUgU2V0IGlzbid0IGVtcHR5LCB0b1N0cmluZygpIGlzIGNhbGxlZCBvbiBlYWNoIGVsZW1lbnQuCi0gICAgICogPGJyPlRoZSB2YXJpYWJsZSdzIG5hbWUgdXNlZCB0byBob2xkIHRoYXQgU2V0IGlzIGdpdmVuIHZpYSB0aGUgc2V0TmFtZQotICAgICAqIHBhcmFtZXRlciBhbmQgdXNlZCBpbiB0aGUgb3V0cHV0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRTZXQoU2V0PD8+IHByaW50YWJsZVNldCwgU3RyaW5nIHNldE5hbWUpIHsKLSAgICAgICAgaWYgKCBwcmludGFibGVTZXQuc2l6ZSgpID09IDAgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBTZXQgIiArIHNldE5hbWUgKyAiIGlzIGVtcHR5Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBTZXQgIiArIHNldE5hbWUgKyAiIGNvbnRhaW5zIDoiKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpdCA9IHByaW50YWJsZVNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGVsZW0gPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBlbGVtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVjayB0aGUgU2V0IHJlbW90ZVNldCBpcyBlcXVhbCB0bwotICAgICAqIHRoZSByZWZlcmVuY2UgU2V0IHJlZmVyZW5jZVNldCwKLSAgICAgKiB3aGljaCBtZWFucyBzYW1lIHNpemUgYW5kIGNvbnRlbnQgKG9yZGVyIGRvZXNuJ3QgbWF0dGVyKS4KLSAgICAgKiA8YnI+SXQgcmV0dXJucyAwIHdoZW4gdGhlIGNoZWNrIGlzIGZpbmUsIG90aGVyd2lzZSAxLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGNoZWNrU2V0KFNldDw/PiByZW1vdGVTZXQsIFNldDw/PiByZWZlcmVuY2VTZXQpIHsKLSAgICAgICAgaWYgKCAhICByZW1vdGVTZXQuZXF1YWxzKHJlZmVyZW5jZVNldCkgKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1cHBvcnRlZFF1ZXJ5VHlwZXNUZXN0OjpjaGVja1NldDoiCi0gICAgICAgICAgICAgICAgICAgICsgIiAoRVJST1IpIFNldCBhcmVuJ3QgYXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIHByaW50U2V0KHJlbW90ZVNldCwgInJlbW90ZVNldCIpOwotICAgICAgICAgICAgcHJpbnRTZXQocmVmZXJlbmNlU2V0LCAicmVmZXJlbmNlU2V0Iik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVXRpbGl0eSBpbm5lciBjbGFzcyBjb21pbmcgZnJvbSBKTVggVG9uZ2EgdGVzdCBzdWl0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVdGlscyB7Ci0KLSAgICAgICAgLy8gREVCVUcgaXMgcHJpbnRlZCBkZXBlbmRpbmcgb24gdGhlIERFQlVHIGFuZCBERUJVR19MRVZFTCBKQVZBIHByb3BlcnR5Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfSEVBREVSID0gIltkZWJ1Z10gIjsKLQotICAgICAgICAvLyBERUJVRyBsZXZlbHMKLSAgICAgICAgc3RhdGljIGludCBzZWxlY3RlZERlYnVnTGV2ZWwgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFQlVHX1NUQU5EQVJEID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUJVR19WRVJCT1NFID0gMjsgIC8vIE1haW5seSB1c2VkIGZvciBzdHJlc3MgdGVzdHMKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUJVR19BTEwgPSBERUJVR19TVEFOREFSRCB8IERFQlVHX1ZFUkJPU0U7Ci0KLSAgICAgICAgc3RhdGljIHZvaWQgcGFyc2VEZWJ1Z1Byb3BlcnRpZXMoKSB7Ci0gICAgICAgICAgICBpbnQgbGV2ZWwgPSAwOwotICAgICAgICAgICAgUHJvcGVydGllcyBwID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHNlbGVjdGVkIGxldmVscwotICAgICAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX1NUQU5EQVJEIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX1NUQU5EQVJEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5nZXRQcm9wZXJ0eSgiREVCVUdfVkVSQk9TRSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsZXZlbCB8PSBERUJVR19WRVJCT1NFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocC5nZXRQcm9wZXJ0eSgiREVCVUdfQUxMIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX0FMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VsZWN0ZWREZWJ1Z0xldmVsID0gbGV2ZWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcm9kdWNlcyB0aGUgb3JpZ2luYWwgcGFyc2luZyBhbmQgY29sbGVjdGlvbiBvZiB0ZXN0IHBhcmFtZXRlcnMKLSAgICAgICAgICogZnJvbSB0aGUgRFRvbmdhIEpNWCB0ZXN0IHN1aXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBDb2xsZWN0cyBwYXNzZWQgYXJncyBhbmQgcmV0dXJucyB0aGVtIGluIGEgbWFwKGFyZ25hbWUsIHZhbHVlKSBzdHJ1Y3R1cmUsCi0gICAgICAgICAqIHdoaWNoIHdpbGwgYmUgdGhlbiBwcm9wYWdhdGVkIGFzIG5lY2Vzc2FyeSB0byB2YXJpb3VzIGNhbGxlZCBtZXRob2RzLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyc2VQYXJhbWV0ZXJzKFN0cmluZyBhcmdzW10pCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgZGVidWcoREVCVUdfU1RBTkRBUkQsICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBTdGFydCIpOwotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgICAgIGlmICggYXJnc1tpXS50cmltKCkuc3RhcnRzV2l0aCgiLSIpICkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKGkrMSkgPCBhcmdzLmxlbmd0aCAmJiAhYXJnc1tpKzFdLnN0YXJ0c1dpdGgoIi0iKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKERFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBhZGRlZCBpbiBtYXAgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggdmFsdWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpKzFdKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGFyZ3NbaV0udHJpbSgpLCBhcmdzW2krMV0udHJpbSgpKSA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGkrMSkgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2krMV0uc3RhcnRzV2l0aCgiLSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkrMSkgPT0gYXJncy5sZW5ndGggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIG51bGwgdmFsdWUiKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGFyZ3NbaV0udHJpbSgpLCBudWxsKSA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IChXQVJOSU5HKSBub3QgYWRkZWQgaW4gbWFwID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSkgOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWJ1ZyhERUJVR19TVEFOREFSRCwgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IERvbmUiKSA7Ci0gICAgICAgICAgICByZXR1cm4gbWFwIDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIGluIGFsbCB0ZXN0cyB0byBwcmludCBhbnl0aGluZwotICAgICAgICAgKiB0aGF0IGlzIHRlbXBvcmFyeS4KLSAgICAgICAgICogUHJpbnRpbmcgaXMgZG9uZSBvbmx5IHdoZW4gZGVidWcgaXMgYWN0aXZhdGVkIGJ5IHRoZSBwcm9wZXJ0eSBERUJVRy4KLSAgICAgICAgICogUHJpbnRpbmcgZGVwZW5kcyBhbHNvIG9uIHRoZSBERUJVR19MRVZFTCBwcm9wZXJ0eS4KLSAgICAgICAgICogSGVyZSBpdCBlbmNhcHN1bGF0ZXMgYSBTeXN0ZW0ub3V0LnByaW50bG4uCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBkZWJ1ZyhpbnQgbGV2ZWwsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgICAgICBpZiAoKHNlbGVjdGVkRGVidWdMZXZlbCAmIGxldmVsKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKERFQlVHX0hFQURFUiArIGxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvIHByaW50IHN0YWNrIHRyYWNlIHdoZW4gd2l0aFN0YWNrIGlzIHRydWUuCi0gICAgICAgICAqIERvZXMgdHJ5IHRvIGNhbGwgZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgYW5kIGdldFRhcmdldEVycm9yKCkgdGhlbgotICAgICAgICAgKiBwcmludCBlbWJlZGRlZCBzdGFja3MgaW4gdGhlIGNhc2Ugb2YgYW4gRXhjZXB0aW9uIHdyYXBwaW5nCi0gICAgICAgICAqIGFub3RoZXIgRXhjZXB0aW9uIG9yIGFuIEVycm9yLiBSZWN1cnNlIHVudGlsIG5vIG1vcmUgd3JhcHBpbmcKLSAgICAgICAgICogaXMgZm91bmQuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgdm9pZCBwcmludFRocm93YWJsZShUaHJvd2FibGUgdGhlVGhybywgYm9vbGVhbiB3aXRoU3RhY2spIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdpdGhTdGFjaykgewotICAgICAgICAgICAgICAgICAgICB0aGVUaHJvLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRoZVRocm8gaW5zdGFuY2VvZiBFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIHQgPSAoRXhjZXB0aW9uKSB0aGVUaHJvOwotICAgICAgICAgICAgICAgICAgICBNZXRob2QgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJsYW5rID0gIiAiOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0VGFyZ2V0RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE9LOiBnZXRUYXJnZXRFeGNlcHRpb24gbWV0aG9kIGNvdWxkIGJlIHRoZXJlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIHQuZ2V0Q2xhc3MoKSArICI9PT4iICsgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChFeGNlcHRpb24pIHRhcmdldC5pbnZva2UodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuT2JqZWN0W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbmsgPSBibGFuayArICIgICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIHQuZ2V0Q2xhc3MoKSArICI9PT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRUYXJnZXRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLkNsYXNzPD8+W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEV4Y2VwdGlvbiBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIGV4Y2VwdGlvbnMgd3JhcHBpbmcgYW4gRXJyb3IgdGhlbiBpdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBnZXRUYXJnZXRFcnJvciB0aGF0IGlzIGxpa2VseSB0byBiZSBjYWxsZWQKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICgoRXhjZXB0aW9uKSB0aGVUaHJvKS5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0VGFyZ2V0RXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLkNsYXNzPD8+W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEVycm9yIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXJyID0gdGhlVGhybzsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IChFcnJvcikgdGFyZ2V0Lmludm9rZShlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLk9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFuayA9IGJsYW5rICsgIiAgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJsYW5rICsgZXJyLmdldENsYXNzKCkgKyAiPT0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoU3RhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGVyci5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0VGFyZ2V0RXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLkNsYXNzPD8+W10pIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEVycm9yIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyb3dhYmxlIGlzIDogIiArIHRoZVRocm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB4KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gOiByYWlzZWQgaW4gcHJpbnRFeGNlcHRpb24gOiAiICsgeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvVGVzdFF1ZXJ5LmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3F1ZXJ5L1Rlc3RRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI4OTZlLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvVGVzdFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogQ2xhc3MgVGVzdFF1ZXJ5Ci0gKiBNQmVhbiB1c2VkIGZvciB0ZXN0aW5nIHRoZSB0eXBlcyB3aXJlZCB3aGVuIHVzaW5nIFF1ZXJ5RXhwLgotICogSXQgaXMgaGVhdmlseSBsaW5rZWQgdG8gUXVlcnlGYWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFF1ZXJ5IGV4dGVuZHMgUXVlcnlEYXRhIGltcGxlbWVudHMgVGVzdFF1ZXJ5TUJlYW4gewotCi0gICAgLyoqCi0gICAgICogQXR0cmlidXRlIDogQm9vbGVhbkF0dAotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBib29sZWFuQXR0ID0gYm9vbGVhblZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQXR0cmlidXRlIDogRG91YmxlQXR0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBkb3VibGUgZG91YmxlQXR0ID0gZG91YmxlVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgOiBGbG9hdEF0dAotICAgICAqLwotICAgIHByaXZhdGUgZmxvYXQgZmxvYXRBdHQgPSBmbG9hdFZhbHVlOwotCi0gICAgLyoqCi0gICAgICogQXR0cmlidXRlIDogSW50QXR0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgaW50QXR0ID0gaW50VmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgOiBJbnRlZ2VyQXR0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGludGVnZXJBdHQgPSBpbnRlZ2VyVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgOiBMb25nQXR0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBsb25nIGxvbmdBdHQgPSBsb25nVmFsdWU7Ci0KLSAgICAvKioKLSAgICAgKiBBdHRyaWJ1dGUgOiBTdHJpbmdBdHQKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdBdHQgPSBzdHJpbmdWYWx1ZTsKLQotICAgIHB1YmxpYyBUZXN0UXVlcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuQXR0KCkgewotICAgICAgICByZXR1cm4gYm9vbGVhbkF0dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQXR0IG9mIHR5cGUgYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5BdHQoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICBib29sZWFuQXR0ID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIGRvdWJsZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlQXR0KCkgewotICAgICAgICByZXR1cm4gZG91YmxlQXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBBdHQgb2YgdHlwZSBkb3VibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVBdHQoZG91YmxlIHZhbHVlKSB7Ci0gICAgICAgIGRvdWJsZUF0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBmbG9hdAotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdEF0dCgpIHsKLSAgICAgICAgcmV0dXJuIGZsb2F0QXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBBdHQgb2YgdHlwZSBmbG9hdAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZsb2F0QXR0KGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgIGZsb2F0QXR0ID0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50QXR0KCkgewotICAgICAgICByZXR1cm4gaW50QXR0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBBdHQgb2YgdHlwZSBpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRBdHQoaW50IHZhbHVlKSB7Ci0gICAgICAgIGludEF0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBJbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIEludGVnZXIgZ2V0SW50ZWdlckF0dCgpIHsKLSAgICAgICAgcmV0dXJuIGludGVnZXJBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEF0dCBvZiB0eXBlIEludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnRlZ2VyQXR0KEludGVnZXIgdmFsdWUpIHsKLSAgICAgICAgaW50ZWdlckF0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBsb25nCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ0F0dCgpIHsKLSAgICAgICAgcmV0dXJuIGxvbmdBdHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IEF0dCBvZiB0eXBlIGxvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nQXR0KGxvbmcgdmFsdWUpIHsKLSAgICAgICAgbG9uZ0F0dCA9IHZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBTdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ0F0dCgpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZ0F0dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQXR0IG9mIHR5cGUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nQXR0KFN0cmluZyB2YWx1ZSkgewotICAgICAgICBzdHJpbmdBdHQgPSB2YWx1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvVGVzdFF1ZXJ5TUJlYW4uamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvcXVlcnkvVGVzdFF1ZXJ5TUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmMzIxZi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3F1ZXJ5L1Rlc3RRdWVyeU1CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogSW50ZXJmYWNlIFRlc3RRdWVyeU1CZWFuCi0gKiBNQmVhbiB1c2VkIGZvciB0ZXN0aW5nIHRoZSB0eXBlcyB3aXJlZCB3aGVuIHVzaW5nIFF1ZXJ5RXhwLgotICogSXQgaXMgaGVhdmlseSBsaW5rZWQgdG8gUXVlcnlGYWN0b3J5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RRdWVyeU1CZWFuCi17Ci0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIGJvb2xlYW4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuQXR0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQXR0IG9mIHR5cGUgYm9vbGVhbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEJvb2xlYW5BdHQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQXR0IG9mIHR5cGUgZG91YmxlCi0gICAgICovCi0gICAgcHVibGljIGRvdWJsZSBnZXREb3VibGVBdHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldCBBdHQgb2YgdHlwZSBkb3VibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREb3VibGVBdHQoZG91YmxlIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBmbG9hdAotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdEF0dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IEF0dCBvZiB0eXBlIGZsb2F0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmxvYXRBdHQoZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIGludAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW50QXR0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQXR0IG9mIHR5cGUgaW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50QXR0KGludCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgQXR0IG9mIHR5cGUgSW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlZ2VyIGdldEludGVnZXJBdHQoKTsKLQotICAgIC8qKgotICAgICAqIFNldCBBdHQgb2YgdHlwZSBJbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW50ZWdlckF0dChJbnRlZ2VyIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEdldCBBdHQgb2YgdHlwZSBsb25nCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ0F0dCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IEF0dCBvZiB0eXBlIGxvbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRMb25nQXR0KGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogR2V0IEF0dCBvZiB0eXBlIFN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nQXR0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgQXR0IG9mIHR5cGUgU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RyaW5nQXR0KFN0cmluZyB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvQXV0aG9yaXphdGlvblRlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvQXV0aG9yaXphdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzMDlhYi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L0F1dGhvcml6YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDU4ODY1Ci0gKiBAc3VtbWFyeSBDaGVja3MgdmFyaW91cyBhdXRoZW50aWNhdGlvbiBiZWhhdmlvciBmcm9tIHJlbW90ZSBqbXggY2xpZW50Ci0gKiBAYXV0aG9yIE9saXZpZXIgTGFnbmVhdQotICogQG1vZHVsZXMgamF2YS5tYW5hZ2VtZW50Ci0gKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5Ci0gKiBAY29tcGlsZSBTaW1wbGUuamF2YQotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPXVzZXJuYW1lMSAtRHBhc3N3b3JkPXBhc3N3b3JkMSBBdXRob3JpemF0aW9uVGVzdCAtc2VydmVyIC1tYXBUeXBlIHguYWNjZXNzLmZpbGU7eC5wYXNzd29yZC5maWxlIC1wb3B1bGF0ZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIC1EdXNlcm5hbWU9dXNlcm5hbWUyIC1EcGFzc3dvcmQ9cGFzc3dvcmQyIEF1dGhvcml6YXRpb25UZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5hY2Nlc3MuZmlsZTt4LnBhc3N3b3JkLmZpbGUgLXBvcHVsYXRlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkQ3JlYXRlRXhjZXB0aW9uIC1leHBlY3RlZFNldEV4Y2VwdGlvbiAtZXhwZWN0ZWRJbnZva2VFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLUR1c2VybmFtZT11c2VybmFtZTYgLURwYXNzd29yZD1wYXNzd29yZDYgQXV0aG9yaXphdGlvblRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LmFjY2Vzcy5maWxlO3gucGFzc3dvcmQuZmlsZSAtcG9wdWxhdGUgLWNsaWVudCAtbWFwVHlwZSBjcmVkZW50aWFscyAtZXhwZWN0ZWRDcmVhdGVFeGNlcHRpb24gLWV4cGVjdGVkR2V0RXhjZXB0aW9uIC1leHBlY3RlZFNldEV4Y2VwdGlvbiAtZXhwZWN0ZWRJbnZva2VFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwL3BvbGljeT1qYXZhLnBvbGljeS5hdXRob3JpemF0aW9uIC1EREVCVUdfU1RBTkRBUkQgLUR1c2VybmFtZT11c2VybmFtZTEgLURwYXNzd29yZD1wYXNzd29yZDEgQXV0aG9yaXphdGlvblRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LnBhc3N3b3JkLmZpbGUgLXBvcHVsYXRlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwL3BvbGljeT1qYXZhLnBvbGljeS5hdXRob3JpemF0aW9uIC1EREVCVUdfU1RBTkRBUkQgLUR1c2VybmFtZT11c2VybmFtZTMgLURwYXNzd29yZD1wYXNzd29yZDMgQXV0aG9yaXphdGlvblRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LnBhc3N3b3JkLmZpbGUgLXBvcHVsYXRlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkR2V0RXhjZXB0aW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMC9wb2xpY3k9amF2YS5wb2xpY3kuYXV0aG9yaXphdGlvbiAtRERFQlVHX1NUQU5EQVJEIC1EdXNlcm5hbWU9dXNlcm5hbWU1IC1EcGFzc3dvcmQ9cGFzc3dvcmQ1IEF1dGhvcml6YXRpb25UZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5wYXNzd29yZC5maWxlIC1wb3B1bGF0ZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZENyZWF0ZUV4Y2VwdGlvbiAtZXhwZWN0ZWRHZXRFeGNlcHRpb24gLWV4cGVjdGVkU2V0RXhjZXB0aW9uIC1leHBlY3RlZEludm9rZUV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAvcG9saWN5PWphdmEucG9saWN5LmF1dGhvcml6YXRpb24gLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPXVzZXJuYW1lNiAtRHBhc3N3b3JkPXBhc3N3b3JkNiBBdXRob3JpemF0aW9uVGVzdCAtc2VydmVyIC1tYXBUeXBlIHgucGFzc3dvcmQuZmlsZSAtcG9wdWxhdGUgLWNsaWVudCAtbWFwVHlwZSBjcmVkZW50aWFscyAtZXhwZWN0ZWRDcmVhdGVFeGNlcHRpb24gLWV4cGVjdGVkR2V0RXhjZXB0aW9uIC1leHBlY3RlZFNldEV4Y2VwdGlvbiAtZXhwZWN0ZWRJbnZva2VFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwL3BvbGljeT1qYXZhLnBvbGljeS5hdXRob3JpemF0aW9uIC1EREVCVUdfU1RBTkRBUkQgLUR1c2VybmFtZT11c2VybmFtZTEgLURwYXNzd29yZD1wYXNzd29yZDEgQXV0aG9yaXphdGlvblRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LmFjY2Vzcy5maWxlO3gucGFzc3dvcmQuZmlsZSAtcG9wdWxhdGUgLWNsaWVudCAtbWFwVHlwZSBjcmVkZW50aWFscwotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAvcG9saWN5PWphdmEucG9saWN5LmF1dGhvcml6YXRpb24gLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPXVzZXJuYW1lMiAtRHBhc3N3b3JkPXBhc3N3b3JkMiBBdXRob3JpemF0aW9uVGVzdCAtc2VydmVyIC1tYXBUeXBlIHguYWNjZXNzLmZpbGU7eC5wYXNzd29yZC5maWxlIC1wb3B1bGF0ZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZENyZWF0ZUV4Y2VwdGlvbiAtZXhwZWN0ZWRTZXRFeGNlcHRpb24gLWV4cGVjdGVkSW52b2tlRXhjZXB0aW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMC9wb2xpY3k9amF2YS5wb2xpY3kuYXV0aG9yaXphdGlvbiAtRERFQlVHX1NUQU5EQVJEIC1EdXNlcm5hbWU9dXNlcm5hbWUzIC1EcGFzc3dvcmQ9cGFzc3dvcmQzIEF1dGhvcml6YXRpb25UZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5hY2Nlc3MuZmlsZTt4LnBhc3N3b3JkLmZpbGUgLXBvcHVsYXRlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkQ3JlYXRlRXhjZXB0aW9uIC1leHBlY3RlZEdldEV4Y2VwdGlvbiAtZXhwZWN0ZWRTZXRFeGNlcHRpb24gLWV4cGVjdGVkSW52b2tlRXhjZXB0aW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMC9wb2xpY3k9amF2YS5wb2xpY3kuYXV0aG9yaXphdGlvbiAtRERFQlVHX1NUQU5EQVJEIC1EdXNlcm5hbWU9dXNlcm5hbWU0IC1EcGFzc3dvcmQ9cGFzc3dvcmQ0IEF1dGhvcml6YXRpb25UZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5hY2Nlc3MuZmlsZTt4LnBhc3N3b3JkLmZpbGUgLXBvcHVsYXRlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkR2V0RXhjZXB0aW9uIC1leHBlY3RlZFNldEV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAvcG9saWN5PWphdmEucG9saWN5LmF1dGhvcml6YXRpb24gLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPXVzZXJuYW1lNSAtRHBhc3N3b3JkPXBhc3N3b3JkNSBBdXRob3JpemF0aW9uVGVzdCAtc2VydmVyIC1tYXBUeXBlIHguYWNjZXNzLmZpbGU7eC5wYXNzd29yZC5maWxlIC1wb3B1bGF0ZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZENyZWF0ZUV4Y2VwdGlvbiAtZXhwZWN0ZWRHZXRFeGNlcHRpb24gLWV4cGVjdGVkU2V0RXhjZXB0aW9uIC1leHBlY3RlZEludm9rZUV4Y2VwdGlvbgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcCA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXAgOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyRmFjdG9yeSA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvclNlcnZlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmljZVVSTDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlIDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUgOwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSkRLVG9vbEZpbmRlcjsKLQotcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25UZXN0IHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NMQVNTX05BTUUgPSAiQXV0aG9yaXphdGlvblRlc3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NMQVNTX05BTUUgPSAiQXV0aG9yaXphdGlvblRlc3QkQ2xpZW50U2lkZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfQ0xBU1NfTUFJTiA9IENMSUVOVF9DTEFTU19OQU1FOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSTkFNRV9QUk9QRVJUWSA9ICJ1c2VybmFtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7Ci0KLSAgICBwcml2YXRlIEpNWENvbm5lY3RvclNlcnZlciBjczsKLQotICAgIC8qCi0gICAgICogRmlyc3QgRGVidWcgcHJvcGVydGllcyBhbmQgYXJndW1lbnRzIGFyZSBjb2xsZWN0IGluIGV4cGVjdGVkCi0gICAgICogbWFwICAoYXJnTmFtZSwgdmFsdWUpIGZvcm1hdCwgdGhlbiBjYWxscyBvcmlnaW5hbCB0ZXN0J3MgcnVuIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKLQotICAgICAgICAvLyBQYXJzZXMgcGFyYW1ldGVycwotICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotCi0gICAgICAgIC8vIFN1cHBvcnRlZCBwYXJhbWV0ZXJzIGxpc3QgZm9ybWF0IGlzIDoKLSAgICAgICAgLy8gIk1haW5DbGFzcyBbLXNlcnZlciA8cGFyYW0tc3BlYz4gLi4uXSBbLWNsaWVudCA8cGFyYW0tc3BlYz4gLi4uXQotICAgICAgICAvLyB3aXRoIDxwYXJhbS1zcGVjPiBlaXRoZXIgIi1wYXJhbWkgdmFsdWVpIiBvciAiLXBhcmFtaSIKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmVyTWFwID0gbmV3IEhhc2hNYXA8PigpIDsKLSAgICAgICAgaW50IGNsaWVudEFyZ3NJbmRleCA9Ci0gICAgICAgICAgICBVdGlscy5wYXJzZVNlcnZlclBhcmFtZXRlcnMoYXJncywgU0VSVkVSX0NMQVNTX05BTUUsIHNlcnZlck1hcCk7Ci0KLSAgICAgICAgLy8gRXh0cmFjdCBhbmQgcmVjb3JkcyBjbGllbnQgcGFyYW1zCi0gICAgICAgIFN0cmluZ1tdIGNsaWVudFBhcmFtcyA9IG51bGw7Ci0gICAgICAgIGlmIChjbGllbnRBcmdzSW5kZXggPCBhcmdzLmxlbmd0aCkgewotICAgICAgICAgICAgaW50IGNsaWVudFBhcmFtc1NpemUgPSBhcmdzLmxlbmd0aCAtIGNsaWVudEFyZ3NJbmRleDsKLSAgICAgICAgICAgIGNsaWVudFBhcmFtcyA9IG5ldyBTdHJpbmdbY2xpZW50UGFyYW1zU2l6ZV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIGNsaWVudEFyZ3NJbmRleCwgY2xpZW50UGFyYW1zLCAwLCBjbGllbnRQYXJhbXNTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsaWVudFBhcmFtcyA9IG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW4gdGVzdAotICAgICAgICBBdXRob3JpemF0aW9uVGVzdCB0ZXN0ID0gbmV3IEF1dGhvcml6YXRpb25UZXN0KCk7Ci0gICAgICAgIHRlc3QucnVuKHNlcnZlck1hcCwgY2xpZW50UGFyYW1zKTsKLQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBNQmVhbnNTZXJ2ZXIgc2lkZSBvZiB0aGUgdGVzdCBhbmQgcmV0dXJucyBpdHMgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgSk1YU2VydmljZVVSTCBjcmVhdGVTZXJ2ZXJTaWRlKE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmVyTWFwKQotICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgTklORVRZX1NFQ09ORFMgPSA5MDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvcml6YXRpb25UZXN0OjpjcmVhdGVTZXJ2ZXJTaWRlOiBTdGFydCIpIDsKLQotICAgICAgICBNQmVhblNlcnZlciBtYnMgPSBNQmVhblNlcnZlckZhY3RvcnkubmV3TUJlYW5TZXJ2ZXIoKTsKLSAgICAgICAgSk1YU2VydmljZVVSTCB1cmwgPSBuZXcgSk1YU2VydmljZVVSTCgicm1pIiwgbnVsbCwgMCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlcyBjb25uZWN0aW9uIGVudmlyb25tZW50IGZyb20gc2VydmVyIHNpZGUgcGFyYW1zCi0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGVudiA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotICAgICAgICBpZiAoKHZhbHVlID0gKFN0cmluZylzZXJ2ZXJNYXAuZ2V0KCItbWFwVHlwZSIpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoInguYWNjZXNzLmZpbGUiKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhY2Nlc3NGaWxlU3RyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIpICsKLSAgICAgICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IgKyAiYWNjZXNzLnByb3BlcnRpZXMiOwotICAgICAgICAgICAgICAgIGVudi5wdXQoImpteC5yZW1vdGUueC5hY2Nlc3MuZmlsZSIsIGFjY2Vzc0ZpbGVTdHIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkZWQgIiArIGFjY2Vzc0ZpbGVTdHIgKyAiIGZpbGUgYXMgam14LnJlbW90ZS54LmFjY2Vzcy5maWxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoIngucGFzc3dvcmQuZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkRmlsZVN0ciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiKSArCi0gICAgICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yICsgInBhc3N3b3JkLnByb3BlcnRpZXMiOwotICAgICAgICAgICAgICAgIGVudi5wdXQoImpteC5yZW1vdGUueC5wYXNzd29yZC5maWxlIiwgcGFzc3dvcmRGaWxlU3RyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkICIgKyBwYXNzd29yZEZpbGVTdHIgKyAiIGZpbGUgYXMgam14LnJlbW90ZS54LnBhc3N3b3JkLmZpbGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzZXJ2ZXJNYXAuY29udGFpbnNLZXkoIi1wb3B1bGF0ZSIpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcG9wdWxhdGVDbGFzc05hbWUgPSAiU2ltcGxlIjsKLSAgICAgICAgICAgIE9iamVjdE5hbWUgb24gPQotICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKCJkZWZhdWx0RG9tYWluOmNsYXNzPVNpbXBsZSIpOwotCi0gICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwgImNyZWF0ZSBhbmQgcmVnaXN0ZXIgU2ltcGxlIE1CZWFuIikgOwotICAgICAgICAgICAgbWJzLmNyZWF0ZU1CZWFuKHBvcHVsYXRlQ2xhc3NOYW1lLCBvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBjcyA9IEpNWENvbm5lY3RvclNlcnZlckZhY3RvcnkubmV3Sk1YQ29ubmVjdG9yU2VydmVyKHVybCwgZW52LCBtYnMpOwotICAgICAgICBjcy5zdGFydCgpOwotCi0gICAgICAgIFV0aWxzLndhaXRSZWFkeShjcywgTklORVRZX1NFQ09ORFMpOwotCi0gICAgICAgIEpNWFNlcnZpY2VVUkwgYWRkciA9IGNzLmdldEFkZHJlc3MoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvcml6YXRpb25UZXN0OjpjcmVhdGVTZXJ2ZXJTaWRlOiBEb25lLiIpIDsKLQotICAgICAgICByZXR1cm4gYWRkcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0aW5nIGNvbW1hbmQtbGluZSBmb3IgcnVubmluZyBzdWJwcm9jZXNzIEpWTToKLSAgICAgKgotICAgICAqIEpWTSBjb21tYW5kIGxpbmUgaXMgbGlrZToKLSAgICAgKiB7dGVzdF9qZGt9L2Jpbi9qYXZhIHtkZWZhdWx0b3B0c30gLWNwIHt0ZXN0LmNsYXNzLnBhdGh9IHt0ZXN0b3B0c30gbWFpbgotICAgICAqCi0gICAgICoge2RlZmF1bHRvcHRzfSBhcmUgdGhlIGRlZmF1bHQgamF2YSBvcHRpb25zIHNldCBieSB0aGUgZnJhbWV3b3JrLgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDb21tYW5kTGluZShTdHJpbmcgYXJnc1tdKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBvcHRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG9wdHMuYWRkKEpES1Rvb2xGaW5kZXIuZ2V0SkRLVG9vbCgiamF2YSIpKTsKLSAgICAgICAgb3B0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqZGsudGVzdGxpYnJhcnkuVXRpbHMuZ2V0VGVzdEphdmFPcHRzKCkpKTsKLQotICAgICAgICBTdHJpbmcgdXNlcm5hbWVWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShVU0VSTkFNRV9QUk9QRVJUWSk7Ci0gICAgICAgIGlmICh1c2VybmFtZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG9wdHMuYWRkKCItRCIgKyBVU0VSTkFNRV9QUk9QRVJUWSArICI9IiArIHVzZXJuYW1lVmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBwYXNzd29yZFZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KFBBU1NXT1JEX1BST1BFUlRZKTsKLSAgICAgICAgaWYgKHBhc3N3b3JkVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0cy5hZGQoIi1EIiArIFBBU1NXT1JEX1BST1BFUlRZICsgIj0iICsgcGFzc3dvcmRWYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRzLmFkZCgiLWNwIik7Ci0gICAgICAgIG9wdHMuYWRkKFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5jbGFzcy5wYXRoIiwgInRlc3QuY2xhc3MucGF0aCIpKTsKLSAgICAgICAgb3B0cy5hZGQoQ0xJRU5UX0NMQVNTX01BSU4pOwotICAgICAgICBvcHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGFyZ3MpKTsKLSAgICAgICAgcmV0dXJuIG9wdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVucyBBdXRob3JpemF0aW9uVGVzdCRDbGllbnRTaWRlIHdpdGggdGhlIHBhc3NlZCBvcHRpb25zIGFuZCByZWRpcmVjdHMKLSAgICAgKiBzdWJwcm9jZXNzIHN0YW5kYXJkIEkvTyB0byB0aGUgY3VycmVudCAocGFyZW50KSBwcm9jZXNzLiBUaGlzIHByb3ZpZGVzIGEKLSAgICAgKiB0cmFjZSBvZiB3aGF0IGhhcHBlbnMgaW4gdGhlIHN1YnByb2Nlc3Mgd2hpbGUgaXQgaXMgcnVubm5pbmcgKGFuZCBiZWZvcmUKLSAgICAgKiBpdCB0ZXJtaW5hdGVzKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZXJ2aWNlVXJsU3RyIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIEpNWCBzZXJ2aWNlIFVybCB0byBjb25uZWN0IHRvLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJ1bkNsaWVudFNpZGUoU3RyaW5nIGFyZ3NbXSwgU3RyaW5nIHNlcnZpY2VVcmxTdHIpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIEJ1aWxkaW5nIGNvbW1hbmQtbGluZQotICAgICAgICBMaXN0PFN0cmluZz4gb3B0cyA9IGJ1aWxkQ29tbWFuZExpbmUoYXJncyk7Ci0gICAgICAgIG9wdHMuYWRkKCItc2VydmljZVVybCIpOwotICAgICAgICBvcHRzLmFkZChzZXJ2aWNlVXJsU3RyKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2VwYXJhdGUgSlZNIHN1YnByb2Nlc3MKLSAgICAgICAgaW50IGV4aXRDb2RlID0gMDsKLSAgICAgICAgU3RyaW5nW10gb3B0c0FycmF5ID0gb3B0cy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihvcHRzQXJyYXkpOwotICAgICAgICBQcm9jZXNzIHAgPSBQcm9jZXNzVG9vbHMuc3RhcnRQcm9jZXNzKCJBdXRob3JpemF0aW9uVGVzdCRDbGllbnRTaWRlIiwgcGIpOwotCi0gICAgICAgIC8vIEhhbmRsaW5nIGVuZCBvZiBzdWJwcm9jZXNzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBleGl0Q29kZSA9IHAud2FpdEZvcigpOwotICAgICAgICAgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJTdWJwcm9jZXNzIHVuZXhwZWN0ZWQgZXhpdCB2YWx1ZSBvZiBbIiArIGV4aXRDb2RlICsKLSAgICAgICAgICAgICAgICAgICAgIl0uIEV4cGVjdGVkIDAuXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJlbnQgcHJvY2VzcyBpbnRlcnJ1cHRlZCB3aXRoIGV4Y2VwdGlvbiA6IFxuICIgKyBlICsgIiA6IiApOwotCi0gICAgICAgICAgICAvLyBQYXJlbnQgdGhyZWFkIHVua25vd24gc3RhdGUsIGtpbGxpbmcgc3VicHJvY2Vzcy4KLSAgICAgICAgICAgIHAuZGVzdHJveUZvcmNpYmx5KCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQYXJlbnQgcHJvY2VzcyBpbnRlcnJ1cHRlZCB3aXRoIGV4Y2VwdGlvbiA6IFxuICIgKyBlICsgIiA6IiApOwotCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocC5pc0FsaXZlKCkpIHsKLSAgICAgICAgICAgICAgICBwLmRlc3Ryb3lGb3JjaWJseSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGV4aXRDb2RlOwotICAgICAgICB9Ci0KLSAgICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuKE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmVyQXJncywgU3RyaW5nIGNsaWVudEFyZ3NbXSkgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0aG9yaXphdGlvblRlc3Q6OnJ1bjogU3RhcnQiKSA7Ci0gICAgICAgIGludCBlcnJvckNvdW50ID0gMDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gSW5pdGlhbGlzZSB0aGUgc2VydmVyIHNpZGUKLSAgICAgICAgICAgIEpNWFNlcnZpY2VVUkwgdXJsVG9Vc2UgPSBjcmVhdGVTZXJ2ZXJTaWRlKHNlcnZlckFyZ3MpOwotCi0gICAgICAgICAgICAvLyBSdW4gY2xpZW50IHNpZGUKLSAgICAgICAgICAgIGVycm9yQ291bnQgPSBydW5DbGllbnRTaWRlKGNsaWVudEFyZ3MsIHVybFRvVXNlLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICBpZiAoIGVycm9yQ291bnQgPT0gMCApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkF1dGhvcml6YXRpb25UZXN0OjpydW46IERvbmUgd2l0aG91dCBhbnkgZXJyb3IiKSA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0aG9yaXphdGlvblRlc3Q6OnJ1bjogRG9uZSB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXJyb3JDb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGVycm9yKHMpIikgOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJlcnJvckNvdW50ID0gIiArIGVycm9yQ291bnQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjcy5zdG9wKCk7Ci0KLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENsaWVudFNpZGUgewotCi0gICAgICAgIHByaXZhdGUgSk1YQ29ubmVjdG9yIGNjID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYyA9IG51bGw7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIC8vIFBhcnNlcyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICBVdGlscy5wYXJzZURlYnVnUHJvcGVydGllcygpOwotCi0gICAgICAgICAgICAvLyBTdXBwb3J0ZWQgcGFyYW1ldGVycyBsaXN0IGZvcm1hdCBpcyA6ICJNYWluQ2xhc3MgWy1jbGllbnQgPHBhcmFtLXNwZWM+IC4uLl0KLSAgICAgICAgICAgIC8vIHdpdGggPHBhcmFtLXNwZWM+IGVpdGhlciAiLXBhcmFtaSB2YWx1ZWkiIG9yICItcGFyYW1pIgotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gY2xpZW50TWFwID0gbmV3IEhhc2hNYXA8PigpIDsKLSAgICAgICAgICAgIFV0aWxzLnBhcnNlQ2xpZW50UGFyYW1ldGVycyhhcmdzLCBDTElFTlRfQ0xBU1NfTkFNRSwgY2xpZW50TWFwKTsKLQotICAgICAgICAgICAgLy8gUnVuIHRlc3QKLSAgICAgICAgICAgIENsaWVudFNpZGUgdGVzdCA9IG5ldyBDbGllbnRTaWRlKCk7Ci0gICAgICAgICAgICB0ZXN0LnJ1bihjbGllbnRNYXApOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB7Ci0KLSAgICAgICAgICAgIGludCBlcnJvckNvdW50ID0gMCA7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZENyZWF0ZUV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYXJncy5jb250YWluc0tleSgiLWV4cGVjdGVkQ3JlYXRlRXhjZXB0aW9uIikpID8gdHJ1ZSA6IGZhbHNlIDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdGVkR2V0RXhjZXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzLmNvbnRhaW5zS2V5KCItZXhwZWN0ZWRHZXRFeGNlcHRpb24iKSkgPyB0cnVlIDogZmFsc2UgOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWRTZXRFeGNlcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MuY29udGFpbnNLZXkoIi1leHBlY3RlZFNldEV4Y2VwdGlvbiIpKSA/IHRydWUgOiBmYWxzZSA7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZEludm9rZUV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYXJncy5jb250YWluc0tleSgiLWV4cGVjdGVkSW52b2tlRXhjZXB0aW9uIikpID8gdHJ1ZSA6IGZhbHNlIDsKLSAgICAgICAgICAgICAgICAvLyBKU1IyNjIgKHNlZSBidWcgNjQ0MDM3NCkKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzcGVjaWFsIEpTUjI2MiBwcm90b2NvbCBvcGVyYXRpb24gZm9yIGNvbm5lY3QuCi0gICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHJlcXVlc3Qgc2VudCBpbml0aWF0ZSB0aGUgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBJbiB0aGUgSlNSMjYyIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGdldERlZmF1bHREb21haW4gaXMgc2VudCB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgaW4gb3JkZXIgdG8gZ2V0IHRoZSBzZXJ2ZXIgcGFydCBvZiB0aGUgY29ubmVjdGlvbiBJRC4KLSAgICAgICAgICAgICAgICAvLyA9PiB0aGUgY29ubmVjdGlvbiBtYXkgZmFpbCBpZiBubyBhY2Nlc3MgcGVybWlzc2lvbiBvbiBnZXQgcmVxdWVzdHMuCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZENvbm5lY3RFeGNlcHRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MuY29udGFpbnNLZXkoIi1leHBlY3RlZENvbm5lY3RFeGNlcHRpb24iKSkgPyB0cnVlIDogZmFsc2UgOwotICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZWxlbWVudCBvZiB0aGUgTWFwIHdpdGggbnVsbCB2YWx1ZXMgKG5vdCBzdXBwb3J0ZWQgYnkgUk1JKQotICAgICAgICAgICAgICAgIC8vIFNlZSBidWcgNDk4MjY2OAotICAgICAgICAgICAgICAgIGFyZ3MucmVtb3ZlKCItZXhwZWN0ZWRDcmVhdGVFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICBhcmdzLnJlbW92ZSgiLWV4cGVjdGVkR2V0RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgYXJncy5yZW1vdmUoIi1leHBlY3RlZFNldEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgIGFyZ3MucmVtb3ZlKCItZXhwZWN0ZWRJbnZva2VFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICBhcmdzLnJlbW92ZSgiLWV4cGVjdGVkQ29ubmVjdEV4Y2VwdGlvbiIpOwotCi0KLSAgICAgICAgICAgICAgICAvLyBIZXJlIGRvIGNvbm5lY3QgdG8gdGhlIEpNWCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXJuYW1lIik7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICJDbGllbnRTaWRlOjpydW46IENPTk5FQ1Qgb24gYmVoYWxmIG9mIFwiIiArIHVzZXJuYW1lICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgZG9Db25uZWN0KGFyZ3MsIGV4cGVjdGVkQ29ubmVjdEV4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiBkaWQgbm90IGZhaWwsIHBlcmZvcm0gc29tZSByZXF1ZXN0cy4KLSAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHN0YWdlIHRoZSBtYmVhbnNlcnZlciBjb25uZWN0aW9uIGlzIHVwIGFuZCBydW5uaW5nCi0gICAgICAgICAgICAgICAgaWYgKG1ic2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uID0gbmV3IE9iamVjdE5hbWUoImRlZmF1bHREb21haW46Y2xhc3M9U2ltcGxlIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2xpZW50U2lkZTo6cnVuOiBDUkVBVEUgb24gYmVoYWxmIG9mIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9IGRvQ3JlYXRlUmVxdWVzdChtYnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoImRlZmF1bHREb21haW46Y2xhc3M9U2ltcGxlLHVzZXI9IiArIHVzZXJuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkQ3JlYXRlRXhjZXB0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBHZXQgcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJDbGllbnRTaWRlOjpydW46IEdFVCBvbiBiZWhhbGYgb2YgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQgKz0gZG9HZXRSZXF1ZXN0KG1ic2MsIG9uLCBleHBlY3RlZEdldEV4Y2VwdGlvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2xpZW50U2lkZTo6cnVuOiBTRVQgb24gYmVoYWxmIG9mIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9IGRvU2V0UmVxdWVzdChtYnNjLCBvbiwgZXhwZWN0ZWRTZXRFeGNlcHRpb24pOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEludm9rZSByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgIkNsaWVudFNpZGU6OnJ1bjogSU5WT0tFIG9uIGJlaGFsZiBvZiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBkb0ludm9rZVJlcXVlc3QobWJzYywgb24sIGV4cGVjdGVkSW52b2tlRXhjZXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKSA7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUgdGhlIEpNWCBDbGllbnQKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYy5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpydW46IERvbmUiKSA7Ci0KLSAgICAgICAgICAgIC8vIEhhbmRsZSByZXN1bHQKLSAgICAgICAgICAgIGlmIChlcnJvckNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OnJ1bjogKE9LKSBhdXRob3JpemF0aW9uIHRlc3Qgc3VjY2VlZGVkLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJBdXRob3JpemF0aW9uVGVzdCRDbGllbnRTaWRlOjpydW46IChFUlJPUikgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGF1dGhvcml6YXRpb24gdGVzdCBmYWlsZWQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQgKyAiIGVycm9yKHMpIjsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb0Nvbm5lY3QoTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZEV4Y2VwdGlvbikgewotCi0gICAgICAgICAgICBTdHJpbmcgbXNnVGFnID0gIkNsaWVudFNpZGU6OmRvQ29ubmVjdCI7Ci0gICAgICAgICAgICBib29sZWFuIHRocm93UnVudGltZUV4Y2VwdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgIkNsaWVudFNpZGU6OmRvQ29ubmVjdDogQ29ubmVjdCB0aGUgY2xpZW50Iik7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb2xsZWN0IGNvbm5lY3Rpb24gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBlbnYgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhcmdzLmdldCgiLW1hcFR5cGUiKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXJuYW1lIik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicGFzc3dvcmQiKTsKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2dUYWcgKyAiYWRkIFwiam14LnJlbW90ZS5jcmVkZW50aWFsc1wiID0gXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lICsgIlwiLCBcIiIgKyBwYXNzd29yZCArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBlbnYucHV0KCJqbXgucmVtb3RlLmNyZWRlbnRpYWxzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHVzZXJuYW1lICwgcGFzc3dvcmQgfSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gR2V0IGEgY29ubmVjdGlvbiB0byByZW1vdGUgbWJlYW4gc2VydmVyCi0gICAgICAgICAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gbmV3IEpNWFNlcnZpY2VVUkwoKFN0cmluZylhcmdzLmdldCgiLXNlcnZpY2VVcmwiKSk7Ci0gICAgICAgICAgICAgICAgY2MgPSBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QoYWRkcixlbnYpOwotICAgICAgICAgICAgICAgIG1ic2MgPSBjYy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkNsaWVudFNpZGU6OmRvQ29ubmVjdDogKEVSUk9SKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0IGRpZCBub3QgZmFpbCB3aXRoIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIjsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9Db25uZWN0OiAoT0spIENvbm5lY3Qgc3VjY2VlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9Db25uZWN0OiAoT0spICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0IGZhaWxlZCB3aXRoIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gIkNsaWVudFNpZGU6OmRvQ29ubmVjdDogKEVSUk9SKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlIGZhaWxlZCB3aXRoICIgKyBlLmdldENsYXNzKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5zdGVhZCBvZiBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJDbGllbnRTaWRlOjpkb0Nvbm5lY3Q6IChFUlJPUikgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdCBmYWlsZWQiOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93UnVudGltZUV4Y2VwdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGUgY29ubmVjdGlvbiBmYWlsZWQsIG9yIGlmIHRoZSBjb25uZWN0aW9uIHN1Y2NlZWRlZCBidXQgc2hvdWxkIG5vdCwKLSAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZ28gZnVydGhlciA9PiB0aHJvdyBSdW50aW1lRXhjZXB0aW9uIGFuZCBleGl0IHRoZSB0ZXN0Ci0gICAgICAgICAgICBpZiAodGhyb3dSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGRvQ3JlYXRlUmVxdWVzdChNQmVhblNlcnZlckNvbm5lY3Rpb24gbWJzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgaW50IGVycm9yQ291bnQgPSAwOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAiQ2xpZW50U2lkZTo6ZG9DcmVhdGVSZXF1ZXN0OiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSBNQmVhbiIpIDsKLQotICAgICAgICAgICAgICAgIG1ic2MuY3JlYXRlTUJlYW4oIlNpbXBsZSIsIG9uKSA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb0NyZWF0ZVJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIihFUlJPUikgQ3JlYXRlIGRpZCBub3QgZmFpbCB3aXRoIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvQ3JlYXRlUmVxdWVzdDogKE9LKSBDcmVhdGUgc3VjY2VlZCIpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb0NyZWF0ZVJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoT0spIENyZWF0ZSBmYWlsZWQgd2l0aCBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9DcmVhdGVSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEVSUk9SKSBDcmVhdGUgZmFpbGVkIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpICsgIiBpbnN0ZWFkIG9mIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvQ3JlYXRlUmVxdWVzdDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiKEVSUk9SKSBDcmVhdGUgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZG9HZXRSZXF1ZXN0KE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdGVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBpbnQgZXJyb3JDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICJDbGllbnRTaWRlOjpkb0dldFJlcXVlc3Q6IEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBNQmVhbiIpIDsKLQotICAgICAgICAgICAgICAgIG1ic2MuZ2V0QXR0cmlidXRlKG9uLCAiQXR0cmlidXRlIik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb0dldFJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIihFUlJPUikgR2V0IGRpZCBub3QgZmFpbCB3aXRoIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvR2V0UmVxdWVzdDogKE9LKSBHZXQgc3VjY2VlZCIpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb0dldFJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoT0spIEdldCBmYWlsZWQgd2l0aCBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9HZXRSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEVSUk9SKSBHZXQgZmFpbGVkIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpICsgIiBpbnN0ZWFkIG9mIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvR2V0UmVxdWVzdDogKEVSUk9SKSBHZXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnJvckNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBkb1NldFJlcXVlc3QoTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1ic2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIGludCBlcnJvckNvdW50ID0gMDsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgIkNsaWVudFNpZGU6OmRvU2V0UmVxdWVzdDogU2V0IGF0dHJpYnV0ZXMgb2YgdGhlIE1CZWFuIikgOwotCi0gICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG5ldyBBdHRyaWJ1dGUoIkF0dHJpYnV0ZSIsICJNeSB2YWx1ZSIpIDsKLSAgICAgICAgICAgICAgICBtYnNjLnNldEF0dHJpYnV0ZShvbiwgYXR0cmlidXRlKSA7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb1NldFJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIihFUlJPUikgU2V0IGRpZCBub3QgZmFpbCB3aXRoIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvU2V0UmVxdWVzdDogKE9LKSBTZXQgc3VjY2VlZCIpIDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSkgOwotICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZEV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb1NldFJlcXVlc3Q6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoT0spIFNldCBmYWlsZWQgd2l0aCBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpIDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9TZXRSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKEVSUk9SKSBTZXQgZmFpbGVkIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpICsgIiBpbnN0ZWFkIG9mIGV4cGVjdGVkIFNlY3VyaXR5RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvU2V0UmVxdWVzdDogKEVSUk9SKSBTZXQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZXJyb3JDb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZG9JbnZva2VSZXF1ZXN0KE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdGVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBpbnQgZXJyb3JDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICJDbGllbnRTaWRlOjpkb0ludm9rZVJlcXVlc3Q6IEludm9rZSBvcGVyYXRpb25zIG9uIHRoZSBNQmVhbiIpIDsKLQotICAgICAgICAgICAgICAgIG1ic2MuaW52b2tlKG9uLCAib3BlcmF0aW9uIiwgbnVsbCwgbnVsbCkgOwotCi0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9JbnZva2VSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIoRVJST1IpIEludm9rZSBkaWQgbm90IGZhaWwgd2l0aCBleHBlY3RlZCBTZWN1cml0eUV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpkb0ludm9rZVJlcXVlc3Q6IChPSykgSW52b2tlIHN1Y2NlZWQiKSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9JbnZva2VSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKE9LKSBJbnZva2UgZmFpbGVkIHdpdGggZXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24iKSA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OmRvSW52b2tlUmVxdWVzdDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoRVJST1IpIEludm9rZSBmYWlsZWQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkgKyAiIGluc3RlYWQgb2YgZXhwZWN0ZWQgU2VjdXJpdHlFeGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6ZG9JbnZva2VSZXF1ZXN0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIoRVJST1IpIEludm9rZSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcnJvckNvdW50OwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L01CU19MaWdodC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9NQlNfTGlnaHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNDU5ZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L01CU19MaWdodC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblJlZ2lzdHJhdGlvbiA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlciA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgTUJTX0xpZ2h0IGV4dGVuZHMgTm90aWZpY2F0aW9uQnJvYWRjYXN0ZXJTdXBwb3J0Ci0gICAgaW1wbGVtZW50cyBNQlNfTGlnaHRNQmVhbiwgTUJlYW5SZWdpc3RyYXRpb24sIE5vdGlmaWNhdGlvbkxpc3RlbmVyCi17Ci0gICAgcHJpdmF0ZSBSam14TUJlYW5QYXJhbWV0ZXIgcGFyYW0gPSBudWxsIDsKLSAgICBwcml2YXRlIFN0cmluZyBhU3RyaW5nID0gIm5vdHNldCIgOwotICAgIHByaXZhdGUgaW50IGFuSW50ID0gMCA7Ci0gICAgcHJpdmF0ZSBNQmVhblNlcnZlciBtYnMgPSBudWxsIDsKLSAgICBwcml2YXRlIE9iamVjdE5hbWUgb2JqbmFtZSA9IG51bGwgOwotICAgIHByaXZhdGUgRXhjZXB0aW9uIGFuRXhjZXB0aW9uID0gbnVsbCA7Ci0gICAgcHJpdmF0ZSBFcnJvciBhbkVycm9yID0gbnVsbCA7Ci0gICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotICAgIHByaXZhdGUgU2ltcGxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2ltcGxlTGlzdGVuZXIoKTsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJOTyBQQVJBTUVURVIgQ09OU1RSVUNUT1IgTUJTX0xpZ2h0IikKLSAgICBwdWJsaWMgTUJTX0xpZ2h0KCkgewotICAgIH0KLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPTkUgUmpteE1CZWFuUGFyYW1ldGVyIFBBUkFNRVRFUiBDT05TVFJVQ1RPUiBNQlNfTGlnaHQiKQotICAgIHB1YmxpYyBNQlNfTGlnaHQoQFNxZURlc2NyaXB0b3JLZXkoIkNPTlNUUlVDVE9SIFBBUkFNRVRFUiBwYXJhbSIpCi0gICAgICAgICAgICAgICAgICAgICBSam14TUJlYW5QYXJhbWV0ZXIgcGFyYW0pIHsKLSAgICAgICAgdGhpcy5wYXJhbSA9IHBhcmFtIDsKLSAgICB9Ci0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT05FIFN0cmluZyBQQVJBTUVURVIgQ09OU1RSVUNUT1IgTUJTX0xpZ2h0IikKLSAgICBwdWJsaWMgTUJTX0xpZ2h0KEBTcWVEZXNjcmlwdG9yS2V5KCJDT05TVFJVQ1RPUiBQQVJBTUVURVIgcGFyYW0iKVN0cmluZyBwYXJhbSkgewotICAgICAgICB0aGlzLmFTdHJpbmcgPSBwYXJhbSA7Ci0gICAgfQotCi0gICAgLy8gR2V0dGVyIGZvciBwcm9wZXJ0eSBwYXJhbQotICAgIHB1YmxpYyBSam14TUJlYW5QYXJhbWV0ZXIgZ2V0UGFyYW0oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnBhcmFtIDsKLSAgICB9Ci0KLSAgICAvLyBTZXR0ZXIgZm9yIHByb3BlcnR5IHBhcmFtCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW0oUmpteE1CZWFuUGFyYW1ldGVyIHBhcmFtKSB7Ci0gICAgICAgIHRoaXMucGFyYW0gPSBwYXJhbSA7Ci0gICAgfQotCi0gICAgLy8gR2V0dGVyIGZvciBwcm9wZXJ0eSBhU3RyaW5nCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3RyaW5nKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hU3RyaW5nIDsKLSAgICB9Ci0KLSAgICAvLyBTZXR0ZXIgZm9yIHByb3BlcnR5IGFTdHJpbmcKLSAgICBwdWJsaWMgdm9pZCBzZXRBc3RyaW5nKFN0cmluZyBhU3RyaW5nKSB7Ci0gICAgICAgIHRoaXMuYVN0cmluZyA9IGFTdHJpbmcgOwotICAgIH0KLQotICAgIC8vIEdldHRlciBmb3IgcHJvcGVydHkgYW5JbnQKLSAgICBwdWJsaWMgaW50IGdldEFuSW50KCkgewotICAgICAgICByZXR1cm4gdGhpcy5hbkludCA7Ci0gICAgfQotCi0gICAgLy8gU2V0dGVyIGZvciBwcm9wZXJ0eSBhbkludAotICAgIHB1YmxpYyB2b2lkIHNldEFuSW50KGludCBhbkludCkgewotICAgICAgICB0aGlzLmFuSW50ID0gYW5JbnQgOwotICAgIH0KLQotICAgIC8vIEdldHRlciBmb3IgcHJvcGVydHkgYW5FeGNlcHRpb24KLSAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEFuRXhjZXB0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hbkV4Y2VwdGlvbiA7Ci0gICAgfQotCi0gICAgLy8gU2V0dGVyIGZvciBwcm9wZXJ0eSBhbkV4Y2VwdGlvbgotICAgIHB1YmxpYyB2b2lkIHNldEFuRXhjZXB0aW9uKEV4Y2VwdGlvbiBhbkV4Y2VwdGlvbikgewotICAgICAgICB0aGlzLmFuRXhjZXB0aW9uID0gYW5FeGNlcHRpb24gOwotICAgIH0KLQotICAgIC8vIEdldHRlciBmb3IgcHJvcGVydHkgYW5FcnJvcgotICAgIHB1YmxpYyBFcnJvciBnZXRBbkVycm9yKCkgewotICAgICAgICByZXR1cm4gdGhpcy5hbkVycm9yIDsKLSAgICB9Ci0KLSAgICAvLyBTZXR0ZXIgZm9yIHByb3BlcnR5IGFuRXJyb3IKLSAgICBwdWJsaWMgdm9pZCBzZXRBbkVycm9yKEVycm9yIGFuRXJyb3IpIHsKLSAgICAgICAgdGhpcy5hbkVycm9yID0gYW5FcnJvciA7Ci0gICAgfQotCi0gICAgLy8gQW4gb3BlcmF0aW9uCi0gICAgcHVibGljIFJqbXhNQmVhblBhcmFtZXRlciBvcGVyYXRlMShTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFJqbXhNQmVhblBhcmFtZXRlcihuYW1lKSA7Ci0gICAgfQotCi0gICAgLy8gQW4gb3BlcmF0aW9uCi0gICAgcHVibGljIFN0cmluZyBvcGVyYXRlMihSam14TUJlYW5QYXJhbWV0ZXIgcGFyYW0pIHsKLSAgICAgICAgcmV0dXJuIHBhcmFtLm5hbWUgOwotICAgIH0KLQotICAgIC8vIEFuIG9wZXJhdGlvbgotICAgIHB1YmxpYyB2b2lkIHRocm93RXJyb3IoKSB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcigiSlNSLTE2MC1FUlJPUiIpOwotICAgIH0KLQotICAgIC8vIEFuIG9wZXJhdGlvbgotICAgIHB1YmxpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkpTUi0xNjAtRVhDRVBUSU9OIik7Ci0gICAgfQotCi0gICAgLy8gTUJlYW5SZWdpc3RyYXRpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgcG9zdERlcmVnaXN0ZXIoKSB7Ci0gICAgfQotCi0gICAgLy8gTUJlYW5SZWdpc3RyYXRpb24gbWV0aG9kCi0gICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgewotICAgIH0KLQotICAgIC8vIE1CZWFuUmVnaXN0cmF0aW9uIG1ldGhvZAotICAgIHB1YmxpYyB2b2lkIHByZURlcmVnaXN0ZXIoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgIH0KLQotICAgIC8vIE1CZWFuUmVnaXN0cmF0aW9uIG1ldGhvZAotICAgIHB1YmxpYyBPYmplY3ROYW1lIHByZVJlZ2lzdGVyKE1CZWFuU2VydmVyIHNlcnZlciwgT2JqZWN0TmFtZSBuYW1lKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzLm1icyA9IHNlcnZlciA7Ci0gICAgICAgIGlmICggbmFtZSA9PSBudWxsICkgewotICAgICAgICAgICAgdGhpcy5vYmpuYW1lID0gbmV3IE9iamVjdE5hbWUoInByb3RvY29sOmNsYXNzPU1CU19MaWdodCIpIDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMub2JqbmFtZSA9IG5hbWUgOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLm9iam5hbWUgOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBoYW5kYmFjaykgewotICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICJNQlNfTGlnaHQ6OmhhbmRsZU5vdGlmaWNhdGlvbjogIiArIG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIGxpc3RlbmVyLmhhbmRsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGhhbmRiYWNrKTsKLSAgICB9Ci0KLSAgICAvLyBTZW5kIGEgbm90aWZpY2F0aW9uCi0gICAgcHVibGljIHZvaWQgc2VuZE5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiA9Ci0gICAgICAgICAgICBuZXcgTm90aWZpY2F0aW9uKCJKU1IxNjAtVENLLU5PVElGSUNBVElPTiIsIHRoaXMsIGNvdW50KyspOwotICAgICAgICBzZW5kTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCB3YWl0Rm9yTm90aWZpY2F0aW9uSEIoKSB7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lci53YWl0Rm9yTm90aWZpY2F0aW9uSEIoKTsKLSAgICB9Ci0KLSAgICAvLyBSZWNlaXZlIG11bHRpIG5vdGlmaWNhdGlvbnMgYW5kIHNlbmQgYmFjayBoYW5kYmFja3MKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdFtdIHdhaXRGb3JNdWx0aU5vdGlmaWNhdGlvbnMoU3RyaW5nIG5iKSB7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lci53YWl0Rm9yTXVsdGlOb3RpZmljYXRpb25zKEludGVnZXIudmFsdWVPZihuYikuaW50VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gUmVjZWl2ZSBhIG5vdGlmaWNhdGlvbgotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHdhaXRGb3JOb3RpZmljYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBsaXN0ZW5lci53YWl0Rm9yTm90aWZpY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gSXMgdGhlIG5vdGlmaWNhdGlvbiByZWNlaXZlZAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQm9vbGVhbiBub3RpZmljYXRpb25SZWNlaXZlZCgpIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihsaXN0ZW5lci5pc05vdGlmaWNhdGlvblJlY2VpdmVkKCkpOwotICAgIH0KLQotICAgIC8vIFRoZSBhdXRob3JpemF0aW9uIElkCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpemF0aW9uSWQoKSB7Ci0gICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBTdWJqZWN0IHN1YmplY3QgPSBTdWJqZWN0LmdldFN1YmplY3QoYWNjKTsKLSAgICAgICAgU2V0PFByaW5jaXBhbD4gcHJpbmNpcGFscyA9IHN1YmplY3QuZ2V0UHJpbmNpcGFscygpOwotICAgICAgICBJdGVyYXRvcjxQcmluY2lwYWw+IGkgPSBwcmluY2lwYWxzLml0ZXJhdG9yKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBQcmluY2lwYWwgcCA9IGkubmV4dCgpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChwLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBpZihpLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9NQlNfTGlnaHRNQmVhbi5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9NQlNfTGlnaHRNQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzgwYWY5Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvTUJTX0xpZ2h0TUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotQFNxZURlc2NyaXB0b3JLZXkoIklOVEVSRkFDRSBNQlNfTGlnaHRNQmVhbiIpCi1wdWJsaWMgaW50ZXJmYWNlIE1CU19MaWdodE1CZWFuIHsKLSAgICAvLyBHZXR0ZXIgZm9yIHByb3BlcnR5IHBhcmFtCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBQYXJhbSIpCi0gICAgcHVibGljIFJqbXhNQmVhblBhcmFtZXRlciBnZXRQYXJhbSgpIDsKLQotICAgIC8vIFNldHRlciBmb3IgcHJvcGVydHkgcGFyYW0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIFBhcmFtIikKLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbShSam14TUJlYW5QYXJhbWV0ZXIgcGFyYW0pIDsKLQotICAgIC8vIEdldHRlciBmb3IgcHJvcGVydHkgYVN0cmluZwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgQXN0cmluZyIpCi0gICAgcHVibGljIFN0cmluZyBnZXRBc3RyaW5nKCkgOwotCi0gICAgLy8gU2V0dGVyIGZvciBwcm9wZXJ0eSBhU3RyaW5nCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBBc3RyaW5nIikKLSAgICBwdWJsaWMgdm9pZCBzZXRBc3RyaW5nKFN0cmluZyBhU3RyaW5nKSA7Ci0KLSAgICAvLyBHZXR0ZXIgZm9yIHByb3BlcnR5IGFuSW50Ci0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBBbkludCIpCi0gICAgcHVibGljIGludCBnZXRBbkludCgpIDsKLQotICAgIC8vIFNldHRlciBmb3IgcHJvcGVydHkgYW5JbnQKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIEFuSW50IikKLSAgICBwdWJsaWMgdm9pZCBzZXRBbkludChpbnQgYW5JbnQpIDsKLQotICAgIC8vIEdldHRlciBmb3IgcHJvcGVydHkgYW5FeGNlcHRpb24KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIEFuRXhjZXB0aW9uIikKLSAgICBwdWJsaWMgRXhjZXB0aW9uIGdldEFuRXhjZXB0aW9uKCkgOwotCi0gICAgLy8gU2V0dGVyIGZvciBwcm9wZXJ0eSBhbkV4Y2VwdGlvbgotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgQW5FeGNlcHRpb24iKQotICAgIHB1YmxpYyB2b2lkIHNldEFuRXhjZXB0aW9uKEV4Y2VwdGlvbiBhbkV4Y2VwdGlvbikgOwotCi0gICAgLy8gR2V0dGVyIGZvciBwcm9wZXJ0eSBhbkVycm9yCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBBbkVycm9yIikKLSAgICBwdWJsaWMgRXJyb3IgZ2V0QW5FcnJvcigpIDsKLQotICAgIC8vIFNldHRlciBmb3IgcHJvcGVydHkgYW5FcnJvcgotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgQW5FcnJvciIpCi0gICAgcHVibGljIHZvaWQgc2V0QW5FcnJvcihFcnJvciBhbkVycm9yKSA7Ci0KLSAgICAvLyBBbiBvcGVyYXRpb24KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIG9wZXJhdGUxIikKLSAgICBwdWJsaWMgUmpteE1CZWFuUGFyYW1ldGVyIG9wZXJhdGUxKAotICAgICAgICAgICAgQFNxZURlc2NyaXB0b3JLZXkoIk9QRVJBVElPTiBQQVJBTUVURVIgbmFtZSIpU3RyaW5nIG5hbWUpIDsKLQotICAgIC8vIEFuIG9wZXJhdGlvbgotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gb3BlcmF0ZTIiKQotICAgIHB1YmxpYyBTdHJpbmcgb3BlcmF0ZTIoCi0gICAgICAgICAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIFBBUkFNRVRFUiBwYXJhbSIpUmpteE1CZWFuUGFyYW1ldGVyIHBhcmFtKSA7Ci0KLSAgICAvLyBUaHJvd3MgYW4gZXJyb3IKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHRocm93RXJyb3IiKQotICAgIHB1YmxpYyB2b2lkIHRocm93RXJyb3IoKTsKLQotICAgIC8vIFRocm93cyBhbiBleGNlcHRpb24KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHRocm93RXhjZXB0aW9uIikKLSAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgICAvLyBTZW5kIGEgbm90aWZpY2F0aW9uCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIk9QRVJBVElPTiBzZW5kTm90aWZpY2F0aW9uIikKLSAgICBwdWJsaWMgdm9pZCBzZW5kTm90aWZpY2F0aW9uKCk7Ci0KLSAgICAvLyBSZWNlaXZlIGEgbm90aWZpY2F0aW9uIGFuZCByZXR1cm4gdGhlIHR5cGUKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIHdhaXRGb3JOb3RpZmljYXRpb24iKQotICAgIHB1YmxpYyBTdHJpbmcgd2FpdEZvck5vdGlmaWNhdGlvbigpOwotCi0gICAgLy8gUmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBhbmQgcmV0dXJuIHRoZSBIYW5kQmFjawotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gd2FpdEZvck5vdGlmaWNhdGlvbkhCIikKLSAgICBwdWJsaWMgT2JqZWN0IHdhaXRGb3JOb3RpZmljYXRpb25IQigpOwotCi0gICAgLy8gUmVjZWl2ZSBtdWx0aSBub3RpZmljYXRpb25zIGFuZCByZXR1cm4gdGhlIEhhbmRCYWNrcwotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJPUEVSQVRJT04gd2FpdEZvck11bHRpTm90aWZpY2F0aW9ucyIpCi0gICAgcHVibGljIE9iamVjdFtdIHdhaXRGb3JNdWx0aU5vdGlmaWNhdGlvbnMoCi0gICAgICAgICAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIFBBUkFNRVRFUiBuYiIpU3RyaW5nIG5iKTsKLQotICAgIC8vIElzIHRoZSBub3RpZmljYXRpb24gcmVjZWl2ZWQKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIG5vdGlmaWNhdGlvblJlY2VpdmVkIikKLSAgICBwdWJsaWMgQm9vbGVhbiBub3RpZmljYXRpb25SZWNlaXZlZCgpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IGF1dGhvcml6YXRpb24gSWQKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiT1BFUkFUSU9OIGdldEF1dGhvcml6YXRpb25JZCIpCi0gICAgcHVibGljIFN0cmluZyBnZXRBdXRob3JpemF0aW9uSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvUmpteE1CZWFuUGFyYW1ldGVyLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1JqbXhNQmVhblBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZlOWExLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvUmpteE1CZWFuUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlIDsKLQotLyoqCi0gKiBUaGF0IGNsYXNzIGlzIHVzZWQgdG8gbW9kZWxpemUgYSBwYXJhbWV0ZXIgdG8gYmUgdXNlZCBhcyBNQmVhbiBwcm9wZXJ0eQotICogdmFsdWUgb3IgTUJlYW4gb3BlcmF0aW9uIHBhcmFtZXRlciBvciByZXR1cm5lZCB2YWx1ZS4KLSAqLwotcHVibGljIGNsYXNzIFJqbXhNQmVhblBhcmFtZXRlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lID0gInVuc2V0IiA7Ci0KLSAgICBwdWJsaWMgUmpteE1CZWFuUGFyYW1ldGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBSam14TUJlYW5QYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZSA7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCB0aGlzLm5hbWUuZXF1YWxzKCgoUmpteE1CZWFuUGFyYW1ldGVyKW9iaikubmFtZSkgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZSA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2UgOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TZWN1cml0eVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvU2VjdXJpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjQ1YmQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TZWN1cml0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwNTg4NjUKLSAqIEBzdW1tYXJ5IENoZWNrcyB2YXJpb3VzIHNlY3VyZSB3YXlzIG9mIGNvbm5lY3RpbmcgZnJvbSByZW1vdGUgam14IGNsaWVudAotICogQGF1dGhvciBPbGl2aWVyIExhZ25lYXUKLSAqIEBtb2R1bGVzIGphdmEubWFuYWdlbWVudAotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQGNvbXBpbGUgTUJTX0xpZ2h0LmphdmEgU2VydmVyRGVsZWdhdGUuamF2YSBUZXN0U2FtcGxlTG9naW5Nb2R1bGUuamF2YQotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPVNRRV91c2VybmFtZSAtRHBhc3N3b3JkPVNRRV9wYXNzd29yZCBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LnBhc3N3b3JkLmZpbGUgLWNsaWVudCAtbWFwVHlwZSBjcmVkZW50aWFscwotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPVVOS05PV05fdXNlcm5hbWUgLURwYXNzd29yZD1TUUVfcGFzc3dvcmQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5wYXNzd29yZC5maWxlIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRHVzZXJuYW1lPVNRRV91c2VybmFtZSAtRHBhc3N3b3JkPVdST05HX3Bhc3N3b3JkIFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHgucGFzc3dvcmQuZmlsZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZFRocm93YWJsZSBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURzdXNlcm5hbWU9VGVzdEpNWEF1dGhlbnRpY2F0b3JVc2VybmFtZSAtRHNwYXNzd29yZD1UZXN0Sk1YQXV0aGVudGljYXRvclBhc3N3b3JkIC1EdXNlcm5hbWU9VGVzdEpNWEF1dGhlbnRpY2F0b3JVc2VybmFtZSAtRHBhc3N3b3JkPVRlc3RKTVhBdXRoZW50aWNhdG9yUGFzc3dvcmQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5hdXRoZW50aWNhdG9yIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURzdXNlcm5hbWU9VGVzdEpNWEF1dGhlbnRpY2F0b3JVc2VybmFtZSAtRHNwYXNzd29yZD1UZXN0Sk1YQXV0aGVudGljYXRvclBhc3N3b3JkIC1EdXNlcm5hbWU9QW5vdGhlclRlc3RKTVhBdXRoZW50aWNhdG9yVXNlcm5hbWUgLURwYXNzd29yZD1UZXN0Sk1YQXV0aGVudGljYXRvclBhc3N3b3JkIFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHguYXV0aGVudGljYXRvciAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZFRocm93YWJsZSBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURsb2dpbi5jb25maWcuZmlsZT0ke3Rlc3Quc3JjfS9sb2dpbi5jb25maWcgLURwYXNzd29yZC5maWxlPXBhc3N3b3JkLnByb3BlcnRpZXMgLUR1c2VybmFtZT11c2VybmFtZUZpbGVMb2dpbk1vZHVsZSAtRHBhc3N3b3JkPXBhc3N3b3JkRmlsZUxvZ2luTW9kdWxlIFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHgubG9naW4uY29uZmlnLlBhc3N3b3JkRmlsZUF1dGhlbnRpY2F0aW9uIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURsb2dpbi5jb25maWcuZmlsZT0ke3Rlc3Quc3JjfS9sb2dpbi5jb25maWcuVU5LTk9XTiAtRHBhc3N3b3JkLmZpbGU9cGFzc3dvcmQucHJvcGVydGllcyAtRHVzZXJuYW1lPXVzZXJuYW1lRmlsZUxvZ2luTW9kdWxlIC1EcGFzc3dvcmQ9cGFzc3dvcmRGaWxlTG9naW5Nb2R1bGUgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5sb2dpbi5jb25maWcuUGFzc3dvcmRGaWxlQXV0aGVudGljYXRpb24gLWNsaWVudCAtbWFwVHlwZSBjcmVkZW50aWFsc3MgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRGxvZ2luLmNvbmZpZy5maWxlPSR7dGVzdC5zcmN9L2xvZ2luLmNvbmZpZyAtRHBhc3N3b3JkLmZpbGU9cGFzc3dvcmQucHJvcGVydGllcyAtRHVzZXJuYW1lPXVzZXJuYW1lRmlsZUxvZ2luTW9kdWxlIC1EcGFzc3dvcmQ9cGFzc3dvcmRGaWxlTG9naW5Nb2R1bGUgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgeC5sb2dpbi5jb25maWcuVW5rbm93bkF1dGhlbnRpY2F0aW9uIC1jbGllbnQgLW1hcFR5cGUgY3JlZGVudGlhbHMgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRGxvZ2luLmNvbmZpZy5maWxlPSR7dGVzdC5zcmN9L2xvZ2luLmNvbmZpZyAtRHN1c2VybmFtZT11c2VybmFtZVNhbXBsZUxvZ2luTW9kdWxlIC1Ec3Bhc3N3b3JkPXBhc3N3b3JkU2FtcGxlTG9naW5Nb2R1bGUgLURwYXNzd29yZC5maWxlPXBhc3N3b3JkLnByb3BlcnRpZXMgLUR1c2VybmFtZT11c2VybmFtZVNhbXBsZUxvZ2luTW9kdWxlIC1EcGFzc3dvcmQ9cGFzc3dvcmRTYW1wbGVMb2dpbk1vZHVsZSBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LmxvZ2luLmNvbmZpZy5TYW1wbGVMb2dpbk1vZHVsZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIC1EbG9naW4uY29uZmlnLmZpbGU9JHt0ZXN0LnNyY30vbG9naW4uY29uZmlnIC1Ec3VzZXJuYW1lPXVzZXJuYW1lU2FtcGxlTG9naW5Nb2R1bGUgLURzcGFzc3dvcmQ9cGFzc3dvcmRTYW1wbGVMb2dpbk1vZHVsZSAtRHBhc3N3b3JkLmZpbGU9cGFzc3dvcmQucHJvcGVydGllcyAtRHVzZXJuYW1lPUFub3RoZXJVc2VybmFtZVNhbXBsZUxvZ2luTW9kdWxlIC1EcGFzc3dvcmQ9cGFzc3dvcmRTYW1wbGVMb2dpbk1vZHVsZSBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSB4LmxvZ2luLmNvbmZpZy5TYW1wbGVMb2dpbk1vZHVsZSAtY2xpZW50IC1tYXBUeXBlIGNyZWRlbnRpYWxzIC1leHBlY3RlZFRocm93YWJsZSBqYXZhLmxhbmcuU2VjdXJpdHlFeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2w7cm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2w7cm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgV1JPTkdfcGFzc3dvcmQgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2wgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2w7cm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtZXhwZWN0ZWRUaHJvd2FibGUgamF2YS5pby5JT0V4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSBybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5LnNzbDtybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5uZWVkLmNsaWVudC5hdXRoZW50aWNhdGlvbiAta2V5c3RvcmUga2V5c3RvcmVBZ2VudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQWdlbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtY2xpZW50ICAta2V5c3RvcmUga2V5c3RvcmVDbGllbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLXRydXN0c3RvcmUgdHJ1c3RzdG9yZUNsaWVudCAtdHJ1c3RzdG9yZXBhc3N3b3JkIGdsb3BnbG9wCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHJtaS5jbGllbnQuc29ja2V0LmZhY3Rvcnkuc3NsO3JtaS5zZXJ2ZXIuc29ja2V0LmZhY3Rvcnkuc3NsLm5lZWQuY2xpZW50LmF1dGhlbnRpY2F0aW9uIC1rZXlzdG9yZSBrZXlzdG9yZUFnZW50IC1rZXlzdG9yZXBhc3N3b3JkIGdsb3BnbG9wIC10cnVzdHN0b3JlIHRydXN0c3RvcmVBZ2VudCAtdHJ1c3RzdG9yZXBhc3N3b3JkIGdsb3BnbG9wIC1jbGllbnQgLWtleXN0b3JlIGtleXN0b3JlQ2xpZW50IC1rZXlzdG9yZXBhc3N3b3JkIFdST05HX3Bhc3N3b3JkIC10cnVzdHN0b3JlIHRydXN0c3RvcmVDbGllbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtZXhwZWN0ZWRUaHJvd2FibGUgamF2YS5pby5JT0V4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSBybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5LnNzbDtybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5uZWVkLmNsaWVudC5hdXRoZW50aWNhdGlvbiAta2V5c3RvcmUga2V5c3RvcmVBZ2VudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQWdlbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtY2xpZW50IC10cnVzdHN0b3JlIHRydXN0c3RvcmVDbGllbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtZXhwZWN0ZWRUaHJvd2FibGUgamF2YS5pby5JT0V4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSBybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5LnNzbDtybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5uZWVkLmNsaWVudC5hdXRoZW50aWNhdGlvbiAta2V5c3RvcmUga2V5c3RvcmVBZ2VudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtY2xpZW50IC1rZXlzdG9yZSBrZXlzdG9yZUNsaWVudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkQ2lwaGVyU3VpdGVzPVNTTF9SU0FfV0lUSF9SQzRfMTI4X01ENSBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSBybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5LnNzbDtybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMubWQ1IC1rZXlzdG9yZSBrZXlzdG9yZUFnZW50IC1rZXlzdG9yZXBhc3N3b3JkIGdsb3BnbG9wIC1jbGllbnQgLXRydXN0c3RvcmUgdHJ1c3RzdG9yZUNsaWVudCAtdHJ1c3RzdG9yZXBhc3N3b3JkIGdsb3BnbG9wCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIC1EamF2YXgucm1pLnNzbC5jbGllbnQuZW5hYmxlZENpcGhlclN1aXRlcz1TU0xfUlNBX1dJVEhfUkM0XzEyOF9TSEEgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2w7cm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wuZW5hYmxlZC5jaXBoZXIuc3VpdGVzLm1kNSAta2V5c3RvcmUga2V5c3RvcmVBZ2VudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtY2xpZW50IC10cnVzdHN0b3JlIHRydXN0c3RvcmVDbGllbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtZXhwZWN0ZWRUaHJvd2FibGUgamF2YS5pby5JT0V4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRGphdmF4LnJtaS5zc2wuY2xpZW50LmVuYWJsZWRDaXBoZXJTdWl0ZXM9U1NMX1JTQV9XSVRIX1JDNF8xMjhfTUQ1IFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHJtaS5jbGllbnQuc29ja2V0LmZhY3Rvcnkuc3NsO3JtaS5zZXJ2ZXIuc29ja2V0LmZhY3Rvcnkuc3NsLmVuYWJsZWQuY2lwaGVyLnN1aXRlcy5zaGEgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqIEBydW4gbWFpbi9vdGhlcnZtL3RpbWVvdXQ9MzAwIC1EREVCVUdfU1RBTkRBUkQgLURqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkUHJvdG9jb2xzPVNTTHYzIFNlY3VyaXR5VGVzdCAtc2VydmVyIC1tYXBUeXBlIHJtaS5jbGllbnQuc29ja2V0LmZhY3Rvcnkuc3NsO3JtaS5zZXJ2ZXIuc29ja2V0LmZhY3Rvcnkuc3NsLmVuYWJsZWQucHJvdG9jb2xzLnNzbHYzIC1rZXlzdG9yZSBrZXlzdG9yZUFnZW50IC1rZXlzdG9yZXBhc3N3b3JkIGdsb3BnbG9wIC1jbGllbnQgLXRydXN0c3RvcmUgdHJ1c3RzdG9yZUNsaWVudCAtdHJ1c3RzdG9yZXBhc3N3b3JkIGdsb3BnbG9wCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS90aW1lb3V0PTMwMCAtRERFQlVHX1NUQU5EQVJEIC1EamF2YXgucm1pLnNzbC5jbGllbnQuZW5hYmxlZFByb3RvY29scz1UTFN2MSBTZWN1cml0eVRlc3QgLXNlcnZlciAtbWFwVHlwZSBybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5LnNzbDtybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5lbmFibGVkLnByb3RvY29scy5zc2x2MyAta2V5c3RvcmUga2V5c3RvcmVBZ2VudCAta2V5c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtY2xpZW50IC10cnVzdHN0b3JlIHRydXN0c3RvcmVDbGllbnQgLXRydXN0c3RvcmVwYXNzd29yZCBnbG9wZ2xvcCAtZXhwZWN0ZWRUaHJvd2FibGUgamF2YS5pby5JT0V4Y2VwdGlvbgotICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD0zMDAgLURERUJVR19TVEFOREFSRCAtRGphdmF4LnJtaS5zc2wuY2xpZW50LmVuYWJsZWRQcm90b2NvbHM9U1NMdjMgU2VjdXJpdHlUZXN0IC1zZXJ2ZXIgLW1hcFR5cGUgcm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2w7cm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wuZW5hYmxlZC5wcm90b2NvbHMudGxzdjEgLWtleXN0b3JlIGtleXN0b3JlQWdlbnQgLWtleXN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWNsaWVudCAtdHJ1c3RzdG9yZSB0cnVzdHN0b3JlQ2xpZW50IC10cnVzdHN0b3JlcGFzc3dvcmQgZ2xvcGdsb3AgLWV4cGVjdGVkVGhyb3dhYmxlIGphdmEuaW8uSU9FeGNlcHRpb24KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXAgOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwIDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJGYWN0b3J5IDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhTZXJ2aWNlVVJMOwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGUgOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSA7Ci0KLWltcG9ydCBqYXZheC5ybWkuc3NsLlNzbFJNSUNsaWVudFNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgucm1pLnNzbC5Tc2xSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLQotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LkpES1Rvb2xGaW5kZXI7Ci0KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVRlc3QgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfQ0xBU1NfTkFNRSA9ICJTZWN1cml0eVRlc3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NMQVNTX05BTUUgPSAiU2VjdXJpdHlUZXN0JENsaWVudFNpZGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0NMQVNTX01BSU4gPSBDTElFTlRfQ0xBU1NfTkFNRTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUVfUFJPUEVSVFkgPSAidXNlcm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfUFJPUEVSVFkgPSAicGFzc3dvcmQiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfREVMRUdBVEVfTUJFQU5fTkFNRSA9Ci0gICAgICAgICJkZWZhdWx0RG9tYWluOmNsYXNzPVNlcnZlckRlbGVnYXRlIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1JX1NFUlZFUl9TT0NLRVRfRkFDVE9SWV9TU0wgPSAicm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1JX0NMSUVOVF9TT0NLRVRfRkFDVE9SWV9TU0wgPSAicm1pLmNsaWVudC5zb2NrZXQuZmFjdG9yeS5zc2wiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1RPUkVfUFJPUE5BTUUgPSAiamF2YXgubmV0LnNzbC5rZXlTdG9yZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTVE9SRV9QV0RfUFJPUE5BTUUgPSAiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUU1RPUkVfUFJPUE5BTUUgPSAiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUU1RPUkVfUFdEX1BST1BOQU1FID0gImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk1JX1NTTF9DTElFTlRfRU5BQkxFRENJUEhFUlNVSVRFUyA9Ci0gICAgICAgICJqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkQ2lwaGVyU3VpdGVzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSV9TU0xfQ0xJRU5UX0VOQUJMRURQUk9UT0NPTFMgPQotICAgICAgICAiamF2YXgucm1pLnNzbC5jbGllbnQuZW5hYmxlZFByb3RvY29scyI7Ci0KLSAgICBwcml2YXRlIEpNWENvbm5lY3RvclNlcnZlciBjczsKLQotICAgIC8vIENvbnN0cnVjdCBhbmQgc2V0IGtleVN0b3JlIHByb3BlcnRpZXMgZnJvbSBnaXZlbiBtYXAKLSAgICBzdGF0aWMgdm9pZCBzZXRLZXlTdG9yZVByb3BlcnRpZXMoTWFwPFN0cmluZywgT2JqZWN0PiBtYXApIHsKLQotICAgICAgICBTdHJpbmcga2V5U3RvcmUgPSAoU3RyaW5nKSBtYXAuZ2V0KCIta2V5c3RvcmUiKTsKLSAgICAgICAga2V5U3RvcmUgPSBidWlsZFNvdXJjZVBhdGgoa2V5U3RvcmUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoS0VZU1RPUkVfUFJPUE5BTUUsIGtleVN0b3JlKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJrZXlTdG9yZSBsb2NhdGlvbiA9IFwiIiArIGtleVN0b3JlICsgIlwiIik7Ci0KLSAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gKFN0cmluZykgbWFwLmdldCgiLWtleXN0b3JlcGFzc3dvcmQiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEtFWVNUT1JFX1BXRF9QUk9QTkFNRSwgcGFzc3dvcmQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImtleVN0b3JlIHBhc3N3b3JkID0gIiArIHBhc3N3b3JkKTsKLQotICAgIH0KLQotICAgIC8vIENvbnN0cnVjdCBhbmQgc2V0IHRydXN0U3RvcmUgcHJvcGVydGllcyBmcm9tIGdpdmVuIG1hcAotICAgIHN0YXRpYyB2b2lkIHNldFRydXN0U3RvcmVQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwKSB7Ci0KLSAgICAgICAgU3RyaW5nIHRydXN0U3RvcmUgPSAoU3RyaW5nKSBtYXAuZ2V0KCItdHJ1c3RzdG9yZSIpOwotICAgICAgICB0cnVzdFN0b3JlID0gYnVpbGRTb3VyY2VQYXRoKHRydXN0U3RvcmUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVFJVU1RTVE9SRV9QUk9QTkFNRSwgdHJ1c3RTdG9yZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidHJ1c3RTdG9yZSBsb2NhdGlvbiA9IFwiIiArIHRydXN0U3RvcmUgKyAiXCIiKTsKLQotICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSAoU3RyaW5nKSBtYXAuZ2V0KCItdHJ1c3RzdG9yZXBhc3N3b3JkIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShUUlVTVFNUT1JFX1BXRF9QUk9QTkFNRSwgcGFzc3dvcmQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRydXN0U3RvcmUgcGFzc3dvcmQgPSAiICsgcGFzc3dvcmQpOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaXJzdCBEZWJ1ZyBwcm9wZXJ0aWVzIGFuZCBhcmd1bWVudHMgYXJlIGNvbGxlY3QgaW4gZXhwZWN0ZWQKLSAgICAgKiBtYXAgIChhcmdOYW1lLCB2YWx1ZSkgZm9ybWF0LCB0aGVuIGNhbGxzIG9yaWdpbmFsIHRlc3QncyBydW4gbWV0aG9kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotCi0gICAgICAgIC8vIFBhcnNlcyBwYXJhbWV0ZXJzCi0gICAgICAgIFV0aWxzLnBhcnNlRGVidWdQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgLy8gU3VwcG9ydGVkIHBhcmFtZXRlcnMgbGlzdCBmb3JtYXQgaXMgOgotICAgICAgICAvLyAiTWFpbkNsYXNzIFstc2VydmVyIDxwYXJhbS1zcGVjPiAuLi5dIFstY2xpZW50IDxwYXJhbS1zcGVjPiAuLi5dCi0gICAgICAgIC8vIHdpdGggPHBhcmFtLXNwZWM+IGVpdGhlciAiLXBhcmFtaSB2YWx1ZWkiIG9yICItcGFyYW1pIgotICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBzZXJ2ZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCkgOwotICAgICAgICBpbnQgY2xpZW50QXJnc0luZGV4ID0KLSAgICAgICAgICAgIFV0aWxzLnBhcnNlU2VydmVyUGFyYW1ldGVycyhhcmdzLCBTRVJWRVJfQ0xBU1NfTkFNRSwgc2VydmVyTWFwKTsKLQotICAgICAgICAvLyBFeHRyYWN0IGFuZCByZWNvcmRzIGNsaWVudCBwYXJhbXMKLSAgICAgICAgU3RyaW5nW10gY2xpZW50UGFyYW1zID0gbnVsbDsKLSAgICAgICAgaWYgKGNsaWVudEFyZ3NJbmRleCA8IGFyZ3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgY2xpZW50UGFyYW1zU2l6ZSA9IGFyZ3MubGVuZ3RoIC0gY2xpZW50QXJnc0luZGV4OwotICAgICAgICAgICAgY2xpZW50UGFyYW1zID0gbmV3IFN0cmluZ1tjbGllbnRQYXJhbXNTaXplXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJncywgY2xpZW50QXJnc0luZGV4LCBjbGllbnRQYXJhbXMsIDAsIGNsaWVudFBhcmFtc1NpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2xpZW50UGFyYW1zID0gbmV3IFN0cmluZ1swXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1biB0ZXN0Ci0gICAgICAgIFNlY3VyaXR5VGVzdCB0ZXN0ID0gbmV3IFNlY3VyaXR5VGVzdCgpOwotICAgICAgICB0ZXN0LnJ1bihzZXJ2ZXJNYXAsIGNsaWVudFBhcmFtcyk7Ci0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gZnVsbCBwYXRoIG9mIGZpbGVuYW1lIGluIHRoZSB0ZXN0IHNvcHVyY2UgZGlyZWN0b3J5Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkU291cmNlUGF0aChTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiKSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZW5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDb2xsZWN0cyBzZWN1cml0eSBydW4gcGFyYW1zIGZvciBzZXJ2ZXIgc2lkZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHNldFNlcnZlclNlY3VyaXR5RW52KE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwKQotICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vIENyZWF0ZXMgQXV0aGVudGljYXRpb24gZW52aXJvbm1lbnQgZnJvbSBzZXJ2ZXIgc2lkZSBwYXJhbXMKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW52ID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgICAgIC8vIFJldHJpZXZlIGFuZCBzZXQga2V5c3RvcmUgYW5kIHRydXN0c3RvcmUgY29uZmlnIGlmIGFueQotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KCIta2V5c3RvcmUiKSAmJgotICAgICAgICAgICAgbWFwLmdldCgiLWtleXN0b3JlIikgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0S2V5U3RvcmVQcm9wZXJ0aWVzKG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIGtleXN0b3JlIHByb3BlcnRpZXMiKTsKLQotICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KCItdHJ1c3RzdG9yZSIpICYmCi0gICAgICAgICAgICBtYXAuZ2V0KCItdHJ1c3RzdG9yZSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFRydXN0U3RvcmVQcm9wZXJ0aWVzKG1hcCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHRydXN0c3RvcmUgcHJvcGVydGllcyIpOwotCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgIGlmICgodmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQoIi1tYXBUeXBlIikpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgLy8gQ2FzZSBvZiByZW1vdGUgcGFzc3dvcmQgZmlsZSB3aXRoIGFsbCBhdXRob3JpemVkIGNyZWRlbnRpYWxzCi0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoIngucGFzc3dvcmQuZmlsZSIpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkRmlsZVN0ciA9IGJ1aWxkU291cmNlUGF0aCgicGFzc3dvcmQucHJvcGVydGllcyIpOwotICAgICAgICAgICAgICAgIGVudi5wdXQoImpteC5yZW1vdGUueC5wYXNzd29yZC5maWxlIiwgcGFzc3dvcmRGaWxlU3RyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkICIgKyBwYXNzd29yZEZpbGVTdHIgKwotICAgICAgICAgICAgICAgICAgICAiIGZpbGUgYXMgam14LnJlbW90ZS54LnBhc3N3b3JkLmZpbGUiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FzZSBvZiBkZWRpY2F0ZWQgYXV0aGVudGljYXRvciBjbGFzcyA6IFRlc3RKTVhBdXRoZW50aWNhdG9yCi0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoInguYXV0aGVudGljYXRvciIpKSB7Ci0gICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5hdXRoZW50aWNhdG9yIiwgbmV3IFRlc3RKTVhBdXRoZW50aWNhdG9yKCkpIDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJBZGRlZCBcImpteC5yZW1vdGUuYXV0aGVudGljYXRvclwiID0gVGVzdEpNWEF1dGhlbnRpY2F0b3IiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2FzZSBvZiBzZWN1cml0eSBjb25maWcgZmlsZSB3aXRoIHN0YW5kYXJkIEF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoIngubG9naW4uY29uZmlnLlBhc3N3b3JkRmlsZUF1dGhlbnRpY2F0aW9uIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9naW5Db25maWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZ2luLmNvbmZpZy5maWxlIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBKQUFTIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAiZmlsZToiICsgbG9naW5Db25maWcpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3ZlcnJpZGVkIGRlZmF1bHQgSkFBUyBjb25maWd1cmF0aW9uIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICJcImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWdcIiA9IFwiIiArIGxvZ2luQ29uZmlnICsgIlwiIikgOwotCi0gICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS54LmxvZ2luLmNvbmZpZyIsICJQYXNzd29yZEZpbGVBdXRoZW50aWNhdGlvbiIpIDsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJBZGRlZCBcImpteC5yZW1vdGUueC5sb2dpbi5jb25maWdcIiA9ICIgKwotICAgICAgICAgICAgICAgICAgICAiXCJQYXNzd29yZEZpbGVBdXRoZW50aWNhdGlvblwiIikgOwotCi0gICAgICAgICAgICAgICAgLy8gcmVkaXJlY3RzICJwYXNzd29yZC5maWxlIiBwcm9wZXJ0eSB0byBmaWxlIGluICR7dGVzdC5zcmN9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkRmlsZVN0ciA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkU291cmNlUGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhc3N3b3JkLmZpbGUiKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJwYXNzd29yZC5maWxlIiwgcGFzc3dvcmRGaWxlU3RyKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJSZWRpcmVjdGVkIFwicGFzc3dvcmQuZmlsZVwiIHByb3BlcnR5IHZhbHVlIHRvID0gIiArCi0gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkRmlsZVN0cikgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDYXNlIG9mIHNlY3VyaXR5IGNvbmZpZyBmaWxlIHdpdGggdW5leGlzdGluZyBhdGhlbnRpY2F0aW9uIGNvbmZpZwotICAgICAgICAgICAgaWYgKHZhbHVlLmNvbnRhaW5zKCJ4LmxvZ2luLmNvbmZpZy5Vbmtub3duQXV0aGVudGljYXRpb24iKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBsb2dpbkNvbmZpZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibG9naW4uY29uZmlnLmZpbGUiKTsKLQotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IEpBQVMgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmlsZToiICsgbG9naW5Db25maWcpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT3ZlcnJpZGVkIGRlZmF1bHQgSkFBUyBjb25maWd1cmF0aW9uIHdpdGggIiArCi0gICAgICAgICAgICAgICAgICAgICJcImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWdcIiA9IFwiIiArIGxvZ2luQ29uZmlnICsgIlwiIikgOwotCi0gICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS54LmxvZ2luLmNvbmZpZyIsICJVbmtub3duQXV0aGVudGljYXRpb24iKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiQWRkZWQgXCJqbXgucmVtb3RlLngubG9naW4uY29uZmlnXCIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlwiVW5rbm93bkF1dGhlbnRpY2F0aW9uXCIiKSA7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWRpcmVjdHMgInBhc3N3b3JkLmZpbGUiIHByb3BlcnR5IHRvIGZpbGUgaW4gJHt0ZXN0LnNyY30KLSAgICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkRmlsZVN0ciA9Ci0gICAgICAgICAgICAgICAgICAgYnVpbGRTb3VyY2VQYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgicGFzc3dvcmQuZmlsZSIpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInBhc3N3b3JkLmZpbGUiLCBwYXNzd29yZEZpbGVTdHIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIlJlZGlyZWN0ZWQgXCJwYXNzd29yZC5maWxlXCIgcHJvcGVydHkgdmFsdWUgdG8gPSAiICsKLSAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmRGaWxlU3RyKSA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhc2Ugb2Ygc2VjdXJpdHkgY29uZmlnIGZpbGUgd2l0aCBkZWRpY2F0ZWQgbG9naW4gbW9kdWxlCi0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoIngubG9naW4uY29uZmlnLlNhbXBsZUxvZ2luTW9kdWxlIikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbG9naW5Db25maWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxvZ2luLmNvbmZpZy5maWxlIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBKQUFTIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciLAotICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU6IiArIGxvZ2luQ29uZmlnKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk92ZXJyaWRlZCBkZWZhdWx0IEpBQVMgY29uZmlndXJhdGlvbiB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAiXCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnXCIgPSBcIiIgKyBsb2dpbkNvbmZpZyArICJcIiIpIDsKLQotICAgICAgICAgICAgICAgIGVudi5wdXQoImpteC5yZW1vdGUueC5sb2dpbi5jb25maWciLCAiU2FtcGxlTG9naW5Nb2R1bGUiKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiQWRkZWQgXCJqbXgucmVtb3RlLngubG9naW4uY29uZmlnXCIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlwiU2FtcGxlTG9naW5Nb2R1bGVcIiIpIDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2ltcGxlIHJtaSBzc2wgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgIGlmICh2YWx1ZS5jb250YWlucyhSTUlfQ0xJRU5UX1NPQ0tFVF9GQUNUT1JZX1NTTCkpIHsKLSAgICAgICAgICAgICAgICBlbnYucHV0KCJqbXgucmVtb3RlLnJtaS5jbGllbnQuc29ja2V0LmZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICBuZXcgU3NsUk1JQ2xpZW50U29ja2V0RmFjdG9yeSgpKSA7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgIkFkZGVkIFwiam14LnJlbW90ZS5ybWkuY2xpZW50LnNvY2tldC5mYWN0b3J5XCIiICsKLSAgICAgICAgICAgICAgICAgICAgICIgPSBTc2xSTUlDbGllbnRTb2NrZXRGYWN0b3J5IikgOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUuY29udGFpbnMoUk1JX1NFUlZFUl9TT0NLRVRfRkFDVE9SWV9TU0wpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNvbnRhaW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgInJtaS5zZXJ2ZXIuc29ja2V0LmZhY3Rvcnkuc3NsLm5lZWQuY2xpZW50LmF1dGhlbnRpY2F0aW9uIikpIHsKLSAgICAgICAgICAgICAgICAgICAvLyBybWkgc3NsIGF1dGhlbnRpY2F0aW9uIHdpdGggY2xpZW50IGF1dGhlbnRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5ybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNzbFJNSVNlcnZlclNvY2tldEZhY3RvcnkobnVsbCwgbnVsbCwgdHJ1ZSkpIDsKLSAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICJBZGRlZCBcImpteC5yZW1vdGUucm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeVwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICIgPSBTc2xSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5IHdpdGggY2xpZW50IGF1dGhlbnRpY2F0aW9uIikgOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jb250YWlucygicm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeS5zc2wuZW5hYmxlZC5jaXBoZXIuc3VpdGVzLm1kNSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93cyBhbGwgY2lwaGVyaW5nIGFuZCBwcm90b2NvbHMgZm9yIHRlc3RpbmcgcHVycG9zZQotICAgICAgICAgICAgICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgiamRrLnRscy5kaXNhYmxlZEFsZ29yaXRobXMiLCAiIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5ybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTc2xSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IlNTTF9SU0FfV0lUSF9SQzRfMTI4X01ENSJ9LCBudWxsLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQWRkZWQgXCJqbXgucmVtb3RlLnJtaS5zZXJ2ZXIuc29ja2V0LmZhY3RvcnlcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA9IFNzbFJNSVNlcnZlclNvY2tldEZhY3Rvcnkgd2l0aCBTU0xfUlNBX1dJVEhfUkM0XzEyOF9NRDUgY2lwaGVyIHN1aXRlIik7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnRhaW5zKCJybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMuc2hhIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3dzIGFsbCBjaXBoZXJpbmcgYW5kIHByb3RvY29scyBmb3IgdGVzdGluZyBwdXJwb3NlCi0gICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJqZGsudGxzLmRpc2FibGVkQWxnb3JpdGhtcyIsICIiKTsKLQotICAgICAgICAgICAgICAgICAgICBlbnYucHV0KCJqbXgucmVtb3RlLnJtaS5zZXJ2ZXIuc29ja2V0LmZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNzbFJNSVNlcnZlclNvY2tldEZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIlNTTF9SU0FfV0lUSF9SQzRfMTI4X1NIQSIgfSwgbnVsbCwgZmFsc2UpKSA7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJBZGRlZCBcImpteC5yZW1vdGUucm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeVwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiID0gU3NsUk1JU2VydmVyU29ja2V0RmFjdG9yeSB3aXRoIFNTTF9SU0FfV0lUSF9SQzRfMTI4X1NIQSBjaXBoZXIgc3VpdGUiKSA7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnRhaW5zKCJybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5LnNzbC5lbmFibGVkLnByb3RvY29scy5zc2x2MyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93cyBhbGwgY2lwaGVyaW5nIGFuZCBwcm90b2NvbHMgZm9yIHRlc3RpbmcgcHVycG9zZQotICAgICAgICAgICAgICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgiamRrLnRscy5kaXNhYmxlZEFsZ29yaXRobXMiLCAiIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5ybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTc2xSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5KG51bGwsIG5ldyBTdHJpbmdbXSB7IlNTTHYzIn0sIGZhbHNlKSkgOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQWRkZWQgXCJqbXgucmVtb3RlLnJtaS5zZXJ2ZXIuc29ja2V0LmZhY3RvcnlcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA9IFNzbFJNSVNlcnZlclNvY2tldEZhY3Rvcnkgd2l0aCBTU0x2MyBwcm90b2NvbCIpIDsKLQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuY29udGFpbnMoInJtaS5zZXJ2ZXIuc29ja2V0LmZhY3Rvcnkuc3NsLmVuYWJsZWQucHJvdG9jb2xzLnRsc3YxIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3dzIGFsbCBjaXBoZXJpbmcgYW5kIHByb3RvY29scyBmb3IgdGVzdGluZyBwdXJwb3NlCi0gICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJqZGsudGxzLmRpc2FibGVkQWxnb3JpdGhtcyIsICIiKTsKLQotICAgICAgICAgICAgICAgICAgICBlbnYucHV0KCJqbXgucmVtb3RlLnJtaS5zZXJ2ZXIuc29ja2V0LmZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNzbFJNSVNlcnZlclNvY2tldEZhY3RvcnkobnVsbCwgbmV3IFN0cmluZ1tdIHsiVExTdjEifSwgZmFsc2UpKSA7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJBZGRlZCBcImpteC5yZW1vdGUucm1pLnNlcnZlci5zb2NrZXQuZmFjdG9yeVwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiID0gU3NsUk1JU2VydmVyU29ja2V0RmFjdG9yeSB3aXRoIFRMU3YxIHByb3RvY29sIikgOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5ybWkuc2VydmVyLnNvY2tldC5mYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTc2xSTUlTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQWRkZWQgXCJqbXgucmVtb3RlLnJtaS5zZXJ2ZXIuc29ja2V0LmZhY3RvcnlcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiA9IFNzbFJNSVNlcnZlclNvY2tldEZhY3RvcnkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW52OwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBNQmVhbnNTZXJ2ZXIgc2lkZSBvZiB0aGUgdGVzdCBhbmQgcmV0dXJucyBpdHMgYWRkcmVzcwotICAgICAqLwotICAgIHByaXZhdGUgSk1YU2VydmljZVVSTCBjcmVhdGVTZXJ2ZXJTaWRlKE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmVyTWFwKQotICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBpbnQgTklORVRZX1NFQ09ORFMgPSA5MDsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5VGVzdDo6Y3JlYXRlU2VydmVyU2lkZTogU3RhcnQiKSA7Ci0KLSAgICAgICAgLy8gUHJlcGFyZSBzZXJ2ZXIgc2lkZSBzZWN1cml0eSBlbnYKLSAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW52ID0gc2V0U2VydmVyU2VjdXJpdHlFbnYoc2VydmVyTWFwKTsKLQotICAgICAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IG1iZWFuIHNlcnZlciBhbmQgY29ubmVjdG9yIHNlcnZlcgotICAgICAgICBNQmVhblNlcnZlciBtYnMgPSBNQmVhblNlcnZlckZhY3RvcnkubmV3TUJlYW5TZXJ2ZXIoKTsKLSAgICAgICAgSk1YU2VydmljZVVSTCB1cmwgPSBuZXcgSk1YU2VydmljZVVSTCgicm1pIiwgbnVsbCwgMCk7Ci0gICAgICAgIGNzID0gSk1YQ29ubmVjdG9yU2VydmVyRmFjdG9yeS5uZXdKTVhDb25uZWN0b3JTZXJ2ZXIodXJsLCBlbnYsIG1icyk7Ci0gICAgICAgIGNzLnN0YXJ0KCk7Ci0KLSAgICAgICAgLy8gV2FpdHMgYXZhaWxpYmlsaXR5IG9mIGNvbm5lY3RvciBzZXJ2ZXIKLSAgICAgICAgVXRpbHMud2FpdFJlYWR5KGNzLCBOSU5FVFlfU0VDT05EUyk7Ci0KLSAgICAgICAgSk1YU2VydmljZVVSTCBhZGRyID0gY3MuZ2V0QWRkcmVzcygpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHlUZXN0OjpjcmVhdGVTZXJ2ZXJTaWRlOiBEb25lLiIpIDsKLQotICAgICAgICByZXR1cm4gYWRkcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0aW5nIGNvbW1hbmQtbGluZSBmb3IgcnVubmluZyBzdWJwcm9jZXNzIEpWTToKLSAgICAgKgotICAgICAqIEpWTSBjb21tYW5kIGxpbmUgaXMgbGlrZToKLSAgICAgKiB7dGVzdF9qZGt9L2Jpbi9qYXZhIHtkZWZhdWx0b3B0c30gLWNwIHt0ZXN0LmNsYXNzLnBhdGh9IHt0ZXN0b3B0c30gbWFpbgotICAgICAqCi0gICAgICoge2RlZmF1bHRvcHRzfSBhcmUgdGhlIGRlZmF1bHQgamF2YSBvcHRpb25zIHNldCBieSB0aGUgZnJhbWV3b3JrLgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDb21tYW5kTGluZShTdHJpbmcgYXJnc1tdKSB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eVRlc3Q6OmJ1aWxkQ29tbWFuZExpbmU6IFN0YXJ0IikgOwotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBvcHRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG9wdHMuYWRkKEpES1Rvb2xGaW5kZXIuZ2V0SkRLVG9vbCgiamF2YSIpKTsKLSAgICAgICAgb3B0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChqZGsudGVzdGxpYnJhcnkuVXRpbHMuZ2V0VGVzdEphdmFPcHRzKCkpKTsKLQotICAgICAgICAvLyBXZSBuZWVkIHRvIGZvcndhcmQgc29tZSBwcm9wZXJ0aWVzIHRvIHRoZSBjbGllbnQgc2lkZQotICAgICAgICBvcHRzLmFkZCgiLUR0ZXN0LnNyYz0iICsgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIpKTsKLQotICAgICAgICBTdHJpbmcgdXNlcm5hbWVWYWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShVU0VSTkFNRV9QUk9QRVJUWSk7Ci0gICAgICAgIGlmICh1c2VybmFtZVZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHlUZXN0OjpidWlsZENvbW1hbmRMaW5lOiAiKwotICAgICAgICAgICAgICAgICIgZm9yd2FyZCB1c2VybmFtZSBwcm9wZXJ0eSB0byBjbGllbnQgc2lkZSIpOwotICAgICAgICAgICAgb3B0cy5hZGQoIi1EIiArIFVTRVJOQU1FX1BST1BFUlRZICsgIj0iICsgdXNlcm5hbWVWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHBhc3N3b3JkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUEFTU1dPUkRfUFJPUEVSVFkpOwotICAgICAgICBpZiAocGFzc3dvcmRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5VGVzdDo6YnVpbGRDb21tYW5kTGluZTogIisKLSAgICAgICAgICAgICAgICAiIGZvcndhcmQgcGFzc3dvcmQgcHJvcGVydHkgdG8gY2xpZW50IHNpZGUiKTsKLSAgICAgICAgICAgIG9wdHMuYWRkKCItRCIgKyBQQVNTV09SRF9QUk9QRVJUWSArICI9IiArIHBhc3N3b3JkVmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVuYWJsZWRDaXBoZXJTdWl0ZXMgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KFJNSV9TU0xfQ0xJRU5UX0VOQUJMRURDSVBIRVJTVUlURVMpOwotICAgICAgICBpZiAoZW5hYmxlZENpcGhlclN1aXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5VGVzdDo6YnVpbGRDb21tYW5kTGluZTogIisKLSAgICAgICAgICAgICAgICAiIGZvcndhcmQgZW5hYmxlZENpcGhlclN1aXRlcyBwcm9wZXJ0eSB0byBjbGllbnQgc2lkZSIpOwotICAgICAgICAgICAgb3B0cy5hZGQoIi1EIiArIFJNSV9TU0xfQ0xJRU5UX0VOQUJMRURDSVBIRVJTVUlURVMgKwotICAgICAgICAgICAgICAgICI9IiArIGVuYWJsZWRDaXBoZXJTdWl0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGVuYWJsZWRQcm90b2NvbHMgPQotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KFJNSV9TU0xfQ0xJRU5UX0VOQUJMRURQUk9UT0NPTFMpOwotICAgICAgICBpZiAoZW5hYmxlZFByb3RvY29scyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5VGVzdDo6YnVpbGRDb21tYW5kTGluZTogIisKLSAgICAgICAgICAgICAgICAiIGZvcndhcmQgZW5hYmxlZFByb3RvY29scyBwcm9wZXJ0eSB0byBjbGllbnQgc2lkZSIpOwotICAgICAgICAgICAgb3B0cy5hZGQoIi1EIiArIFJNSV9TU0xfQ0xJRU5UX0VOQUJMRURQUk9UT0NPTFMgKwotICAgICAgICAgICAgICAgICI9IiArIGVuYWJsZWRQcm90b2NvbHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0cy5hZGQoIi1jcCIpOwotICAgICAgICBvcHRzLmFkZChTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuY2xhc3MucGF0aCIsICJ0ZXN0LmNsYXNzLnBhdGgiKSk7Ci0gICAgICAgIG9wdHMuYWRkKENMSUVOVF9DTEFTU19NQUlOKTsKLSAgICAgICAgb3B0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcmdzKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eVRlc3Q6OmJ1aWxkQ29tbWFuZExpbmU6IERvbmUuIikgOwotCi0gICAgICAgIHJldHVybiBvcHRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJ1bnMgU2VjdXJpdHlUZXN0JENsaWVudFNpZGUgd2l0aCB0aGUgcGFzc2VkIG9wdGlvbnMgYW5kIHJlZGlyZWN0cwotICAgICAqIHN1YnByb2Nlc3Mgc3RhbmRhcmQgSS9PIHRvIHRoZSBjdXJyZW50IChwYXJlbnQpIHByb2Nlc3MuIFRoaXMgcHJvdmlkZXMgYQotICAgICAqIHRyYWNlIG9mIHdoYXQgaGFwcGVucyBpbiB0aGUgc3VicHJvY2VzcyB3aGlsZSBpdCBpcyBydW5ubmluZyAoYW5kIGJlZm9yZQotICAgICAqIGl0IHRlcm1pbmF0ZXMpLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlcnZpY2VVcmxTdHIgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgSk1YIHNlcnZpY2UgVXJsIHRvIGNvbm5lY3QgdG8uCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgcnVuQ2xpZW50U2lkZShTdHJpbmcgYXJnc1tdLCBTdHJpbmcgc2VydmljZVVybFN0cikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eVRlc3Q6OnJ1bkNsaWVudFNpZGU6IFN0YXJ0IikgOwotCi0gICAgICAgIC8vIEJ1aWxkaW5nIGNvbW1hbmQtbGluZQotICAgICAgICBMaXN0PFN0cmluZz4gb3B0cyA9IGJ1aWxkQ29tbWFuZExpbmUoYXJncyk7Ci0gICAgICAgIG9wdHMuYWRkKCItc2VydmljZVVybCIpOwotICAgICAgICBvcHRzLmFkZChzZXJ2aWNlVXJsU3RyKTsKLQotICAgICAgICAvLyBMYXVuY2ggc2VwYXJhdGUgSlZNIHN1YnByb2Nlc3MKLSAgICAgICAgaW50IGV4aXRDb2RlID0gMDsKLSAgICAgICAgU3RyaW5nW10gb3B0c0FycmF5ID0gb3B0cy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcihvcHRzQXJyYXkpOwotICAgICAgICBQcm9jZXNzIHAgPSBQcm9jZXNzVG9vbHMuc3RhcnRQcm9jZXNzKCJTZWN1cml0eVRlc3QkQ2xpZW50U2lkZSIsIHBiKTsKLQotICAgICAgICAvLyBIYW5kbGluZyBlbmQgb2Ygc3VicHJvY2VzcwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZXhpdENvZGUgPSBwLndhaXRGb3IoKTsKLSAgICAgICAgICAgIGlmIChleGl0Q29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAiU3VicHJvY2VzcyB1bmV4cGVjdGVkIGV4aXQgdmFsdWUgb2YgWyIgKyBleGl0Q29kZSArCi0gICAgICAgICAgICAgICAgICAgICJdLiBFeHBlY3RlZCAwLlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGFyZW50IHByb2Nlc3MgaW50ZXJydXB0ZWQgd2l0aCBleGNlcHRpb24gOiBcbiAiICsgZSArICIgOiIgKTsKLQotICAgICAgICAgICAgLy8gUGFyZW50IHRocmVhZCB1bmtub3duIHN0YXRlLCBraWxsaW5nIHN1YnByb2Nlc3MuCi0gICAgICAgICAgICBwLmRlc3Ryb3lGb3JjaWJseSgpOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiUGFyZW50IHByb2Nlc3MgaW50ZXJydXB0ZWQgd2l0aCBleGNlcHRpb24gOiBcbiAiICsgZSArICIgOiIgKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHAuaXNBbGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcC5kZXN0cm95Rm9yY2libHkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZWN1cml0eVRlc3Q6OnJ1bkNsaWVudFNpZGU6IERvbmUiKSA7Ci0KLSAgICAgICAgICAgIHJldHVybiBleGl0Q29kZTsKLSAgICAgICAgfQotCi0gICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJ1bihNYXA8U3RyaW5nLCBPYmplY3Q+IHNlcnZlckFyZ3MsIFN0cmluZyBjbGllbnRBcmdzW10pIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlY3VyaXR5VGVzdDo6cnVuOiBTdGFydCIpIDsKLSAgICAgICAgaW50IGVycm9yQ291bnQgPSAwOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBJbml0aWFsaXNlIHRoZSBzZXJ2ZXIgc2lkZQotICAgICAgICAgICAgSk1YU2VydmljZVVSTCB1cmxUb1VzZSA9IGNyZWF0ZVNlcnZlclNpZGUoc2VydmVyQXJncyk7Ci0KLSAgICAgICAgICAgIC8vIFJ1biBjbGllbnQgc2lkZQotICAgICAgICAgICAgZXJyb3JDb3VudCA9IHJ1bkNsaWVudFNpZGUoY2xpZW50QXJncywgdXJsVG9Vc2UudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGlmICggZXJyb3JDb3VudCA9PSAwICkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdXJpdHlUZXN0OjpydW46IERvbmUgd2l0aG91dCBhbnkgZXJyb3IiKSA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIlNlY3VyaXR5VGVzdDo6cnVuOiBEb25lIHdpdGggIiArIGVycm9yQ291bnQgKyAiIGVycm9yKHMpIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImVycm9yQ291bnQgPSAiICsgZXJyb3JDb3VudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNzLnN0b3AoKTsKLQotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xpZW50U2lkZSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBKTVhDb25uZWN0b3IgY2MgPSBudWxsOwotICAgICAgICBwcml2YXRlIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnNjID0gbnVsbDsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgLy8gUGFyc2VzIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIFV0aWxzLnBhcnNlRGVidWdQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgICAgIC8vIFN1cHBvcnRlZCBwYXJhbWV0ZXJzIGxpc3QgZm9ybWF0IGlzIDogIk1haW5DbGFzcyBbLWNsaWVudCA8cGFyYW0tc3BlYz4gLi4uXQotICAgICAgICAgICAgLy8gd2l0aCA8cGFyYW0tc3BlYz4gZWl0aGVyICItcGFyYW1pIHZhbHVlaSIgb3IgIi1wYXJhbWkiCi0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBjbGllbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCkgOwotICAgICAgICAgICAgVXRpbHMucGFyc2VDbGllbnRQYXJhbWV0ZXJzKGFyZ3MsIENMSUVOVF9DTEFTU19OQU1FLCBjbGllbnRNYXApOwotCi0gICAgICAgICAgICAvLyBSdW4gdGVzdAotICAgICAgICAgICAgQ2xpZW50U2lkZSB0ZXN0ID0gbmV3IENsaWVudFNpZGUoKTsKLSAgICAgICAgICAgIHRlc3QucnVuKGNsaWVudE1hcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKSB7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6cnVuOiBTdGFydCIpOwotICAgICAgICAgICAgaW50IGVycm9yQ291bnQgPSAwOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNldHVwIGNsaWVudCBzaWRlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBlbnYgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBuZWVkZWQgYWxsb3dzIGFsbCBjaXBoZXJpbmcgYW5kIHByb3RvY29scyBmb3IgdGVzdGluZyBwdXJwb3NlCi0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShSTUlfU1NMX0NMSUVOVF9FTkFCTEVEQ0lQSEVSU1VJVEVTKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJqZGsudGxzLmRpc2FibGVkQWxnb3JpdGhtcyIsICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiBuZWVkZWQgYWxsb3dzIGFsbCBjaXBoZXJpbmcgYW5kIHByb3RvY29scyBmb3IgdGVzdGluZyBwdXJwb3NlCi0gICAgICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShSTUlfU1NMX0NMSUVOVF9FTkFCTEVEUFJPVE9DT0xTKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJqZGsudGxzLmRpc2FibGVkQWxnb3JpdGhtcyIsICIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSBhbmQgc2V0IGtleXN0b3JlIGFuZCB0cnVzdHN0b3JlIGNvbmZpZyBpZiBhbnkKLSAgICAgICAgICAgICAgICBpZiAoYXJncy5jb250YWluc0tleSgiLWtleXN0b3JlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgYXJncy5nZXQoIi1rZXlzdG9yZSIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlUZXN0LnNldEtleVN0b3JlUHJvcGVydGllcyhhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ3MuY29udGFpbnNLZXkoIi10cnVzdHN0b3JlIikgJiYKLSAgICAgICAgICAgICAgICAgICAgYXJncy5nZXQoIi10cnVzdHN0b3JlIikgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTZWN1cml0eVRlc3Quc2V0VHJ1c3RTdG9yZVByb3BlcnRpZXMoYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXJncy5nZXQoIi1tYXBUeXBlIik7Ci0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lcXVhbHMoImNyZWRlbnRpYWxzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VybmFtZSIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhc3N3b3JkIik7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgImFkZCBcImpteC5yZW1vdGUuY3JlZGVudGlhbHNcIiA9IFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSArICJcIiwgXCIiICsgcGFzc3dvcmQgKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgZW52LnB1dCgiam14LnJlbW90ZS5jcmVkZW50aWFscyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyB1c2VybmFtZSAsIHBhc3N3b3JkIH0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRocm93YWJsZSA9IChTdHJpbmcpIGFyZ3MuZ2V0KCItZXhwZWN0ZWRUaHJvd2FibGUiKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoQ2FsbENvdW50TmFtZSA9ICItZXhwZWN0ZWRBdXRoZW50aWNhdG9yQ2FsbENvdW50IjsKLSAgICAgICAgICAgICAgICBpbnQgYXV0aENhbGxDb3VudFZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoYXJncy5jb250YWluc0tleShhdXRoQ2FsbENvdW50TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV0aENhbGxDb3VudFZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgSW50ZWdlcigoU3RyaW5nKSBhcmdzLmdldChhdXRoQ2FsbENvdW50TmFtZSkpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhIGNvbm5lY3Rpb24gdG8gcmVtb3RlIG1iZWFuIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICBKTVhTZXJ2aWNlVVJMIGFkZHIgPSBuZXcgSk1YU2VydmljZVVSTCgoU3RyaW5nKWFyZ3MuZ2V0KCItc2VydmljZVVybCIpKTsKLSAgICAgICAgICAgICAgICAgICAgY2MgPSBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QoYWRkcixlbnYpOwotICAgICAgICAgICAgICAgICAgICBtYnNjID0gY2MuZ2V0TUJlYW5TZXJ2ZXJDb25uZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB3ZSBzaG91bGQgaGF2ZSBnb3QgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFRocm93YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OnJ1bjogKEVSUk9SKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENvbm5lY3QgZGlkIG5vdCBmYWlsIHdpdGggZXhwZWN0ZWQgIiArIGV4cGVjdGVkVGhyb3dhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50U2lkZTo6cnVuOiAoT0spIENvbm5lY3Qgc3VjY2VlZCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMucHJpbnRUaHJvd2FibGUoZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFRocm93YWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuY29tcGFyZVRocm93YWJsZShlLCBleHBlY3RlZFRocm93YWJsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OnJ1bjogKE9LKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3QgZmFpbGVkIHdpdGggZXhwZWN0ZWQgIiArIGV4cGVjdGVkVGhyb3dhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpydW46IChFUlJPUikgQ29ubmVjdCBmYWlsZWQgd2l0aCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpICsgIiBpbnN0ZWFkIG9mIGV4cGVjdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFRocm93YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpydW46IChFUlJPUikgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3QgZmFpbGVkIHdpdGggZXhjZXB0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEZXBlbmRpbmcgb24gdGhlIGNsaWVudCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAvLyBwZXJmb3JtIHNvbWUgcmVxdWVzdHMKLSAgICAgICAgICAgICAgICBpZiAobWJzYyAhPSBudWxsICYmIGVycm9yQ291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBQZXJmb3JtIHNvbWUgbGl0dGxlIEpNWCByZXF1ZXN0cwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudFNpZGU6OnJ1bjogU3RhcnQgc2VuZGluZyByZXF1ZXN0cyIpOwotCi0gICAgICAgICAgICAgICAgICAgIGRvUmVxdWVzdHMoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGF1dGhlbnRpY2F0aW9uIGhhcyBiZWVuIHVzZWQgd2UgY2hlY2sgaG93IGl0IGRpZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhDYWxsQ291bnRWYWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvdW50ICs9IGNoZWNrQXV0aGVudGljYXRvcihtYnNjLCBhdXRoQ2FsbENvdW50VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBVdGlscy5wcmludFRocm93YWJsZShlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0aGUgSk1YIENsaWVudCBpZiBhbnkKLSAgICAgICAgICAgICAgICBpZiAoY2MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnByaW50VGhyb3dhYmxlKGUsIHRydWUpIDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnRTaWRlOjpydW46IERvbmUiKTsKLQotICAgICAgICAgICAgLy8gSGFuZGxlIHJlc3VsdAotICAgICAgICAgICAgaWYgKGVycm9yQ291bnQgIT0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZG9SZXF1ZXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgICAgICAvLyBTZW5kICBzb21lIHJlcXVlc3RzIHRvIHRoZSByZW1vdGUgSk1YIHNlcnZlcgotICAgICAgICAgICAgT2JqZWN0TmFtZSBvYmpOYW1lMSA9Ci0gICAgICAgICAgICAgICAgbmV3IE9iamVjdE5hbWUoIlRlc3REb21haW46Y2xhc3M9TUJTX0xpZ2h0LHJhbms9MSIpOwotICAgICAgICAgICAgU3RyaW5nIG1iZWFuQ2xhc3MgPSAiTUJTX0xpZ2h0IjsKLSAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgRXhjZXB0aW9uKCJNWSBURVNUIEVYQ0VQVElPTiIpOwotICAgICAgICAgICAgQXR0cmlidXRlIGF0dEV4Y2VwdGlvbiA9IG5ldyBBdHRyaWJ1dGUoIkFuRXhjZXB0aW9uIiwgZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIEVycm9yIGVycm9yID0gbmV3IEVycm9yKCJNWSBURVNUIEVSUk9SIik7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0RXJyb3IgPSBuZXcgQXR0cmlidXRlKCJBbkVycm9yIiwgZXJyb3IpOwotICAgICAgICAgICAgU3RyaW5nIG9wUGFyYW1TdHJpbmcgPSAiVE9UT1JPIjsKLSAgICAgICAgICAgIFJqbXhNQmVhblBhcmFtZXRlciBvcFBhcmFtID0gbmV3IFJqbXhNQmVhblBhcmFtZXRlcihvcFBhcmFtU3RyaW5nKTsKLSAgICAgICAgICAgIE9iamVjdFtdIHBhcmFtczEgPSB7b3BQYXJhbVN0cmluZ307Ci0gICAgICAgICAgICBTdHJpbmdbXSBzaWcxID0geyJqYXZhLmxhbmcuU3RyaW5nIn07Ci0gICAgICAgICAgICBPYmplY3RbXSBwYXJhbXMyID0ge29wUGFyYW19OwotICAgICAgICAgICAgU3RyaW5nW10gc2lnMiA9IHsiUmpteE1CZWFuUGFyYW1ldGVyIn07Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIE1CZWFuCi0gICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAiQ2xpZW50U2lkZTo6ZG9SZXF1ZXN0czogQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgTUJlYW4iKTsKLSAgICAgICAgICAgIG1ic2MuY3JlYXRlTUJlYW4obWJlYW5DbGFzcywgb2JqTmFtZTEpOwotICAgICAgICAgICAgaWYgKCFtYnNjLmlzUmVnaXN0ZXJlZChvYmpOYW1lMSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVnaXN0ZXIgYW4gTUJlYW4iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2V0IGF0dHJpYnV0ZXMgb2YgdGhlIE1CZWFuCi0gICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAiQ2xpZW50U2lkZTo6ZG9SZXF1ZXN0czogU2V0IGF0dHJpYnV0ZXMgb2YgdGhlIE1CZWFuIik7Ci0gICAgICAgICAgICBtYnNjLnNldEF0dHJpYnV0ZShvYmpOYW1lMSwgYXR0RXhjZXB0aW9uKTsKLSAgICAgICAgICAgIG1ic2Muc2V0QXR0cmlidXRlKG9iak5hbWUxLCBhdHRFcnJvcik7Ci0KLSAgICAgICAgICAgIC8vIEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBNQmVhbgotICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgIkNsaWVudFNpZGU6OmRvUmVxdWVzdHM6IEdldCBhdHRyaWJ1dGVzIG9mIHRoZSBNQmVhbiIpOwotICAgICAgICAgICAgRXhjZXB0aW9uIHJldEV4Y2VwdGlvbiA9Ci0gICAgICAgICAgICAgICAgKEV4Y2VwdGlvbikgbWJzYy5nZXRBdHRyaWJ1dGUob2JqTmFtZTEsIkFuRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBpZiAoIXJldEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuZXF1YWxzKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCA9ICIgKyBleGNlcHRpb24pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290ID0gIiArIHJldEV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQXR0cmlidXRlIEFuRXhjZXB0aW9uIG5vdCBhcyBleHBlY3RlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRXJyb3IgcmV0RXJyb3IgPSAoRXJyb3IpIG1ic2MuZ2V0QXR0cmlidXRlKG9iak5hbWUxLCAiQW5FcnJvciIpOwotICAgICAgICAgICAgaWYgKCFyZXRFcnJvci5nZXRNZXNzYWdlKCkuZXF1YWxzKGVycm9yLmdldE1lc3NhZ2UoKSkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkID0gIiArIGVycm9yKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdCA9ICIgKyByZXRFcnJvcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQXR0cmlidXRlIEFuRXJyb3Igbm90IGFzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEludm9rZSBvcGVyYXRpb25zIG9uIHRoZSBNQmVhbgotICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgIkNsaWVudFNpZGU6OmRvUmVxdWVzdHM6IEludm9rZSBvcGVyYXRpb25zIG9uIHRoZSBNQmVhbiIpOwotICAgICAgICAgICAgUmpteE1CZWFuUGFyYW1ldGVyIHJlczEgPQotICAgICAgICAgICAgICAgIChSam14TUJlYW5QYXJhbWV0ZXIpIG1ic2MuaW52b2tlKG9iak5hbWUxLCAib3BlcmF0ZTEiLCBwYXJhbXMxLCBzaWcxKTsKLSAgICAgICAgICAgIGlmICghcmVzMS5lcXVhbHMob3BQYXJhbSkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkID0gIiArIG9wUGFyYW0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290ID0gIiArIHJlczEpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk9wZXJhdGlvbiBvcGVyYXRlMSBiZWhhdmVkIGJhZGx5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmVzMiA9Ci0gICAgICAgICAgICAgICAgKFN0cmluZykgbWJzYy5pbnZva2Uob2JqTmFtZTEsICJvcGVyYXRlMiIsIHBhcmFtczIsIHNpZzIpOwotICAgICAgICAgICAgaWYgKCFyZXMyLmVxdWFscyhvcFBhcmFtU3RyaW5nKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgPSAiICsgb3BQYXJhbVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgPSAiICsgcmVzMik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT3BlcmF0aW9uIG9wZXJhdGUyIGJlaGF2ZWQgYmFkbHkiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgTUJlYW4KLSAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICJDbGllbnRTaWRlOjpkb1JlcXVlc3RzOiBVbnJlZ2lzdGVyIHRoZSBNQmVhbiIpOwotICAgICAgICAgICAgbWJzYy51bnJlZ2lzdGVyTUJlYW4ob2JqTmFtZTEpOwotICAgICAgICAgICAgaWYgKG1ic2MuaXNSZWdpc3RlcmVkKG9iak5hbWUxKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVuYWJsZSB0byB1bnJlZ2lzdGVyIGFuIE1CZWFuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogTWFrZSBzb21lIGNoZWNrIGFib3V0IHRoZSBpbnN0YW5jZSBvZiBUZXN0Sk1YQXV0aGVudGljYXRvci4KLSAgICAgICAgICogVGhlIGF1dGhlbnRpY2F0b3IgaXMgc3VwcG9zZWQgdG8gaGF2ZSBzZXQgc29tZSBwcm9wZXJ0aWVzIG9uCi0gICAgICAgICAqIGEgU2VydmVyRGVsZWdhdGUgTUJlYW4uCi0gICAgICAgICAqIFdlIGNvbXBhcmUgdGhlIG51bWJlciBvZiB0aW1lcyBpdCBoYXMgYmVlbiBjYWxsZWQgd2l0aCB0aGUgZXhwZWN0ZWQgdmFsdWUuCi0gICAgICAgICAqIFdlIGFsc28gY2hlY2sgdGhlIFByaW5jaXBhbCB0aGF0IGhhcyBiZWVuIGdpdmVuIHRvIHRoZSBhdXRoZW50aWNhdG9yCi0gICAgICAgICAqIHdhcyBub3QgbnVsbC4KLSAgICAgICAgICogVGhhdCBtZXRob2QgaXMgb2YgdXNlIHRvIGF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIEpTUiAyNjIuCi0gICAgICAgICAqIEBwYXJhbSBtYnMKLSAgICAgICAgICogQHBhcmFtIGV4cGVjdGVkQXV0aGVudGljYXRvckNhbGxDb3VudAotICAgICAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkLgotICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBpbnQgY2hlY2tBdXRoZW50aWNhdG9yKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBtYnMsCi0gICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkQXV0aGVudGljYXRvckNhbGxDb3VudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgZXJyb3JDb3VudCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgYXV0aGVudGljYXRvciBoYXMgYmVlbiBjYWxsZWQgdGhlIHJpZ2h0IG51bWJlcgotICAgICAgICAgICAgLy8gb2YgdGltZXMuCi0gICAgICAgICAgICBpbnQgY2FsbENvdW50ID0KLSAgICAgICAgICAgICAgICAgICAgKChJbnRlZ2VyKSBtYnMuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0TmFtZShTRVJWRVJfREVMRUdBVEVfTUJFQU5fTkFNRSksCi0gICAgICAgICAgICAgICAgICAgICJUZXN0Sk1YQXV0aGVudGljYXRvckNhbGxDb3VudCIpKS5pbnRWYWx1ZSgpOwotCi0gICAgICAgICAgICBpZiAoY2FsbENvdW50ID09IGV4cGVjdGVkQXV0aGVudGljYXRvckNhbGxDb3VudCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBPSyBBdXRoZW50aWNhdG9yIGhhcyBiZWVuIGNhbGxlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkQXV0aGVudGljYXRvckNhbGxDb3VudCArICIgdGltZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIEVSUk9SIEF1dGhlbnRpY2F0b3IgaGFzIGJlZW4gY2FsbGVkICIgKyBjYWxsQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lcyBpbiBwbGFjZSBvZiAiICsgZXhwZWN0ZWRBdXRoZW50aWNhdG9yQ2FsbENvdW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwcm92aWRlciBoYXMgYmVlbiBjYWxsZWQgd2l0aAotICAgICAgICAgICAgLy8gYSBub24gbnVsbCBQcmluY2lwYWwuCi0gICAgICAgICAgICBTdHJpbmcgcHJpbmNpcGFsU3RyaW5nID0KLSAgICAgICAgICAgICAgICAoU3RyaW5nKSBtYnMuZ2V0QXR0cmlidXRlKAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3ROYW1lKFNFUlZFUl9ERUxFR0FURV9NQkVBTl9OQU1FKSwKLSAgICAgICAgICAgICAgICAiVGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWxTdHJpbmciKTsKLQotICAgICAgICAgICAgaWYgKHByaW5jaXBhbFN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBFUlJPUiBBdXRoZW50aWNhdG9yIGhhcyBiZWVuIGNhbGxlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIGEgbnVsbCBQcmluY2lwYWwiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW5jaXBhbFN0cmluZy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tIE9LIEF1dGhlbnRpY2F0b3IgaGFzIGJlZW4gY2FsbGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHRoZSBQcmluY2lwYWwgIiArIHByaW5jaXBhbFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRVJST1IgQXV0aGVudGljYXRvciBoYXMgYmVlbiBjYWxsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggYW4gZW1wdHkgUHJpbmNpcGFsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZXJyb3JDb3VudDsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1NlcnZlckRlbGVnYXRlLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1NlcnZlckRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTVmYWMuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TZXJ2ZXJEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkwgOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5TdGFuZGFyZE1CZWFuOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbiBNQmVhbiB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGFuZCB1c2VkIG9uIGNsaWVudCBzaWRlCi0gKiB0byBoYW5kbGUgaW5mb3JtYXRpb25zIG9yIHByb3BlcnRpZXMgb2YgdGhlIHJlbW90ZSBzZXJ2ZXIuCi0gKgotICogRm9yIGV4YW1wbGUsIHRoaXMgTUJlYW4gY2FuIHN0b3JlIElPUiBhZGRyZXNzZXMKLSAqIG9mIFJNSS9JSU9QIGNvbm5lY3RvcihzKSB1c2VkIGluIGEgdGVzdC4KLSAqCi0gKiBUaGF0IE1CZWFuIG1pZ2h0IG5vdCBiZSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2UgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBTZXJ2ZXJEZWxlZ2F0ZU1CZWFuLCBNQmVhblJlZ2lzdHJhdGlvbiB7Ci0KLSAgICBwcml2YXRlIE1CZWFuU2VydmVyIG1iZWFuU2VydmVyID0gbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8Sk1YU2VydmljZVVSTD4gYWRkcmVzc2VzICA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcG9ydDsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgamF2YVZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVyc2lvbiIpOwotICAgIHByaXZhdGUgaW50IHNxZUpteHdzQ3JlZGVudGlhbHNQcm92aWRlckNhbGxDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgam14d3NDcmVkZW50aWFsc1Byb3ZpZGVyVXJsID0gbnVsbDsKLSAgICBwcml2YXRlIGludCB0ZXN0Sk1YQXV0aGVudGljYXRvckNhbGxDb3VudCA9IDA7Ci0gICAgcHJpdmF0ZSBQcmluY2lwYWwgdGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWwgPSBudWxsOwotCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIk5PIFBBUkFNRVRFUiBDT05TVFJVQ1RPUiBTZXJ2ZXJEZWxlZ2F0ZSIpCi0gICAgcHVibGljIFNlcnZlckRlbGVnYXRlKCkgewotICAgICAgICBhZGRyZXNzZXMgPSBuZXcgQXJyYXlMaXN0PEpNWFNlcnZpY2VVUkw+KCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdE5hbWUgcHJlUmVnaXN0ZXIoTUJlYW5TZXJ2ZXIgc2VydmVyLCBPYmplY3ROYW1lIG5hbWUpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgTUJlYW5TZXJ2ZXIgYXR0cmlidXRlCi0gICAgICAgIG1iZWFuU2VydmVyID0gc2VydmVyOwotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcG9zdFJlZ2lzdGVyKEJvb2xlYW4gcmVnaXN0cmF0aW9uRG9uZSkgewotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmVEZXJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHBvc3REZXJlZ2lzdGVyKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFkZHJlc3MoSk1YU2VydmljZVVSTCB1cmwpIHsKLSAgICAgICAgYWRkcmVzc2VzLmFkZCh1cmwpIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxKTVhTZXJ2aWNlVVJMPiBnZXRBZGRyZXNzZXMoKSB7Ci0gICAgICAgIHJldHVybiBhZGRyZXNzZXMgOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHApIHsKLSAgICAgICAgcG9ydCA9IHAgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIHBvcnQgOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBqYXZhVmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzcWVKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJDYWxsZWQoKSB7Ci0gICAgICAgIHNxZUpteHdzQ3JlZGVudGlhbHNQcm92aWRlckNhbGxDb3VudCsrOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U3FlSm14d3NDcmVkZW50aWFsc1Byb3ZpZGVyQ2FsbENvdW50KCkgewotICAgICAgICByZXR1cm4gc3FlSm14d3NDcmVkZW50aWFsc1Byb3ZpZGVyQ2FsbENvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybChTdHJpbmcgdXJsKSB7Ci0gICAgICAgIGpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybCA9IHVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybCgpIHsKLSAgICAgICAgcmV0dXJuIGpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Sk1YQXV0aGVudGljYXRvckNhbGxlZCgpIHsKLSAgICAgICAgdGVzdEpNWEF1dGhlbnRpY2F0b3JDYWxsQ291bnQrKzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFRlc3RKTVhBdXRoZW50aWNhdG9yQ2FsbENvdW50KCkgewotICAgICAgICByZXR1cm4gdGVzdEpNWEF1dGhlbnRpY2F0b3JDYWxsQ291bnQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWwoUHJpbmNpcGFsIHByaW5jaXBhbCkgewotICAgICAgICB0ZXN0Sk1YQXV0aGVudGljYXRvclByaW5jaXBhbCA9IHByaW5jaXBhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsU3RyaW5nKCkgewotICAgICAgICBpZiAoIHRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsICE9IG51bGwgKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGVzdEpNWEF1dGhlbnRpY2F0b3JQcmluY2lwYWwudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgLyoqCi0gICAgICogSW5zdGFudGlhdGVzIGFuZCByZWdpc3RlcnMgYSBTdGFuZGFyZE1CZWFuIGluIHRoZSBNQmVhbiBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25DbGFzc05hbWUKLSAgICAgKiAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lIG9mIHRoZSBNQmVhbi4KLSAgICAgKiBAcGFyYW0gaW50ZXJmYWNlQ2xhc3NOYW1lCi0gICAgICogICAgICBUaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UgY2xhc3MgbmFtZSBvZiB0aGUgTUJlYW4uCi0gICAgICogQHBhcmFtIGlzTVhCZWFuCi0gICAgICogICAgICBJZiB0cnVlLCB0aGUgcmVzdWx0YW50IE1CZWFuIGlzIGFuIE1YQmVhbi4KLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgVGhlIG9iamVjdCBuYW1lIG9mIHRoZSBTdGFuZGFyZE1CZWFuLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVN0YW5kYXJkTUJlYW4oCi0gICAgICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25DbGFzc05hbWUsCi0gICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlQ2xhc3NOYW1lLAotICAgICAgICAgICAgYm9vbGVhbiBpc01YQmVhbiwKLSAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIE9iamVjdCBpbXBsZW1lbnRhdGlvbiA9Ci0gICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgQ2xhc3M8T2JqZWN0PiBpbnRlcmZhY2VDbGFzcyA9IGludGVyZmFjZUNsYXNzTmFtZSA9PSBudWxsID8gbnVsbCA6Ci0gICAgICAgICAgICAoQ2xhc3M8T2JqZWN0PilDbGFzcy5mb3JOYW1lKGludGVyZmFjZUNsYXNzTmFtZSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBTdGFuZGFyZE1CZWFuCi0gICAgICAgIFN0YW5kYXJkTUJlYW4gc3RhbmRhcmRNQmVhbiA9IG5ldyBTdGFuZGFyZE1CZWFuKAotICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLAotICAgICAgICAgICAgICAgIGludGVyZmFjZUNsYXNzLAotICAgICAgICAgICAgICAgIGlzTVhCZWFuKTsKLQotICAgICAgICAvLyBSZWdpc3RlciB0aGUgU3RhbmRhcmRNQmVhbgotICAgICAgICBtYmVhblNlcnZlci5yZWdpc3Rlck1CZWFuKHN0YW5kYXJkTUJlYW4sIG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3RhbnRpYXRlcyBhbmQgcmVnaXN0ZXJzIGEgU3RhbmRhcmRNQmVhbiBpbiB0aGUgTUJlYW4gc2VydmVyLgotICAgICAqIFRoZSBvYmplY3Qgd2lsbCB1c2Ugc3RhbmRhcmQgSk1YIGRlc2lnbiBwYXR0ZXJuIHRvIGRldGVybWluZQotICAgICAqIHRoZSBtYW5hZ2VtZW50IGludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVN0YW5kYXJkTUJlYW4oCi0gICAgICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25DbGFzc05hbWUsCi0gICAgICAgICAgICBib29sZWFuIGlzTVhCZWFuLAotICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lKQotICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgY3JlYXRlU3RhbmRhcmRNQmVhbihpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwgbnVsbCwgaXNNWEJlYW4sIG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvU2VydmVyRGVsZWdhdGVNQmVhbi5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TZXJ2ZXJEZWxlZ2F0ZU1CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjBiM2YuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TZXJ2ZXJEZWxlZ2F0ZU1CZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmljZVVSTCA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotCi1AU3FlRGVzY3JpcHRvcktleSgiSU5URVJGQUNFIFNlcnZlckRlbGVnYXRlTUJlYW4iKQotcHVibGljIGludGVyZmFjZSBTZXJ2ZXJEZWxlZ2F0ZU1CZWFuIHsKLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIEFkZHJlc3MiKQotICAgIHB1YmxpYyB2b2lkIGFkZEFkZHJlc3MoSk1YU2VydmljZVVSTCB1cmwpOwotCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBBZGRyZXNzIikKLSAgICBwdWJsaWMgTGlzdDxKTVhTZXJ2aWNlVVJMPiBnZXRBZGRyZXNzZXMoKTsKLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpOwotICAgIHB1YmxpYyB2b2lkIHNldFBvcnQoU3RyaW5nIHApOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhVmVyc2lvbigpOwotCi0gICAgcHVibGljIHZvaWQgc3FlSm14d3NDcmVkZW50aWFsc1Byb3ZpZGVyQ2FsbGVkKCk7Ci0gICAgcHVibGljIGludCBnZXRTcWVKbXh3c0NyZWRlbnRpYWxzUHJvdmlkZXJDYWxsQ291bnQoKTsKLQotICAgIHB1YmxpYyB2b2lkIHNldEpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybChTdHJpbmcgdXJsKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldEpteHdzQ3JlZGVudGlhbHNQcm92aWRlclVybCgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEpNWEF1dGhlbnRpY2F0b3JDYWxsZWQoKTsKLSAgICBwdWJsaWMgaW50IGdldFRlc3RKTVhBdXRoZW50aWNhdG9yQ2FsbENvdW50KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Sk1YQXV0aGVudGljYXRvclByaW5jaXBhbChQcmluY2lwYWwgcHJpbmNpcGFsKTsKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RKTVhBdXRoZW50aWNhdG9yUHJpbmNpcGFsU3RyaW5nKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTdGFuZGFyZE1CZWFuKAotICAgICAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lLAotICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZUNsYXNzTmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNNWEJlYW4sCi0gICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlU3RhbmRhcmRNQmVhbigKLSAgICAgICAgICAgIFN0cmluZyBpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSwKLSAgICAgICAgICAgIGJvb2xlYW4gaXNNWEJlYW4sCi0gICAgICAgICAgICBPYmplY3ROYW1lIG5hbWUpCi0gICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TaW1wbGUuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvU2ltcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjVlZDAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TaW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0KLWltcG9ydCBqYXZhLmJlYW5zLkNvbnN0cnVjdG9yUHJvcGVydGllczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgYSBzaW1wbGUgc3RhbmRhcmQgTUJlYW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGUgaW1wbGVtZW50cyBTaW1wbGVNQmVhbiB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGUgPSAiaW5pdGlhbF92YWx1ZSI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG9wZXJhdGlvbkludm9rZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gb3BlcmF0aW9uMkludm9rZWQgPSBmYWxzZTsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJOTyBQQVJBTUVURVIgQ09OU1RSVUNUT1IgU2ltcGxlIikKLSAgICBwdWJsaWMgU2ltcGxlKCkgewotICAgIH0KLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJUV08gUEFSQU1FVEVSUyBDT05TVFJVQ1RPUiBTaW1wbGUiKQotICAgIEBDb25zdHJ1Y3RvclByb3BlcnRpZXMoeyJ1bnVzZWQxIiwgInVudXNlZDIifSkKLSAgICBwdWJsaWMgU2ltcGxlKEBTcWVEZXNjcmlwdG9yS2V5KCJDT05TVFJVQ1RPUiBQQVJBTUVURVIgdW51c2VkMSIpaW50IHVudXNlZDEsCi0gICAgICAgICAgICBAU3FlRGVzY3JpcHRvcktleSgiQ09OU1RSVUNUT1IgUEFSQU1FVEVSIHVudXNlZDIiKWludCB1bnVzZWQyKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgcykgewotICAgICAgICBhdHRyaWJ1dGUgPSBzOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcGVyYXRpb25JbnZva2VkKCkgewotICAgICAgICByZXR1cm4gb3BlcmF0aW9uSW52b2tlZDsKLSAgICB9Ci0gICAgcHVibGljIGJvb2xlYW4gZ2V0T3BlcmF0aW9uMkludm9rZWQoKSB7Ci0gICAgICAgIHJldHVybiBvcGVyYXRpb24ySW52b2tlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVyYXRpb24oKSB7Ci0gICAgICAgIG9wZXJhdGlvbkludm9rZWQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBvcGVyYXRpb24yKGludCBpKSB7Ci0gICAgICAgIG9wZXJhdGlvbjJJbnZva2VkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBhdHRyaWJ1dGUgPSAiaW5pdGlhbF92YWx1ZSI7Ci0gICAgICAgIG9wZXJhdGlvbkludm9rZWQgPSBmYWxzZTsKLSAgICAgICAgb3BlcmF0aW9uMkludm9rZWQgPSBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1NpbXBsZUxpc3RlbmVyLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1NpbXBsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTAxNTAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TaW1wbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vLyBKREsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBKTVgKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdGVuZXIgaW1wbGVtZW50cyBOb3RpZmljYXRpb25MaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHJlY2VpdmVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBPYmplY3QgaGFuZGJhY2sgPSBudWxsOwotICAgIHByaXZhdGUgVmVjdG9yPE9iamVjdD4gaGFuZGJhY2tzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7Ci0gICAgcHJpdmF0ZSBpbnQgbmJyZWMgPSAwOwotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRiYWNrKSB7Ci0gICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgIlNpbXBsZUxpc3RlbmVyOjpoYW5kbGVOb3RpZmljYXRpb24gOiIgKyBub3RpZmljYXRpb24pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVjZWl2ZWQgPSB0cnVlOwotICAgICAgICAgICAgdHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRUeXBlKCk7Ci0gICAgICAgICAgICB0aGlzLmhhbmRiYWNrID0gaGFuZGJhY2s7Ci0gICAgICAgICAgICBoYW5kYmFja3MuYWRkKGhhbmRiYWNrKTsKLSAgICAgICAgICAgIG5icmVjKys7Ci0gICAgICAgICAgICBub3RpZnkoKTsKLSAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoRVJST1IpIFNpbXBsZUxpc3RlbmVyOjpoYW5kbGVOb3RpZmljYXRpb24gOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDYXVnaHQgZXhjZXB0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZSkgOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTm90aWZpY2F0aW9uUmVjZWl2ZWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gcmV0ID0gcmVjZWl2ZWQ7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3RbXSB3YWl0Rm9yTXVsdGlOb3RpZmljYXRpb25zKGludCBuYikgewotICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgICBpZihuYnJlYyA8IG5iKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpbXBsZUxpc3RlbmVyOjp3YWl0Rm9yTXVsdGlOb3RpZmljYXRpb25zIHdhaXQiKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB3YWl0KCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPSyA6IHdlIHdhaXQgZm9yIGJlaW5nIGludGVycnVwdGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW1wbGVMaXN0ZW5lcjo6d2FpdEZvck11bHRpTm90aWZpY2F0aW9ucyB3YWl0IG92ZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIE9iamVjdFtdIHJldCA9IGhhbmRiYWNrcy50b0FycmF5KCk7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotICAgICAgICByZWNlaXZlZCA9IGZhbHNlOwotICAgICAgICBoYW5kYmFjayA9IG51bGw7Ci0gICAgICAgIGhhbmRiYWNrcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICB0eXBlID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCB3YWl0Rm9yTm90aWZpY2F0aW9uSEIoKSB7Ci0gICAgICAgIHdoaWxlKHRydWUpIHsKLSAgICAgICAgICAgIGlmKCFyZWNlaXZlZCkgewotICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAiU2ltcGxlTGlzdGVuZXI6OndhaXRGb3JOb3RpZmljYXRpb25IQiB3YWl0Iik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT0sgOiB3ZSB3YWl0IGZvciBiZWluZyBpbnRlcnJ1cHRlZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgIlNpbXBsZUxpc3RlbmVyOjp3YWl0Rm9yTm90aWZpY2F0aW9uSEIgcmVjZWl2ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBPYmplY3QgcmV0ID0gaGFuZGJhY2s7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgd2FpdEZvck5vdGlmaWNhdGlvbigpIHsKLSAgICAgICAgd2hpbGUodHJ1ZSkgewotICAgICAgICAgICAgaWYoIXJlY2VpdmVkKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICJTaW1wbGVMaXN0ZW5lcjo6d2FpdEZvck5vdGlmaWNhdGlvbiB3YWl0Iik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT0sgOiB3ZSB3YWl0IGZvciBiZWluZyBpbnRlcnJ1cHRlZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgIlNpbXBsZUxpc3RlbmVyOjp3YWl0Rm9yTm90aWZpY2F0aW9uIHJlY2VpdmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHJldCA9IHR5cGU7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TaW1wbGVNQmVhbi5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TaW1wbGVNQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZhYzRhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvU2ltcGxlTUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBzaW1wbGUgc3RhbmRhcmQgTUJlYW4uCi0gKi8KLUBTcWVEZXNjcmlwdG9yS2V5KCJJTlRFUkZBQ0UgU2ltcGxlTUJlYW4iKQotcHVibGljIGludGVyZmFjZSBTaW1wbGVNQmVhbiB7Ci0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIEF0dHJpYnV0ZSIpCi0gICAgcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoKTsKLQotICAgIEBTcWVEZXNjcmlwdG9yS2V5KCJBVFRSSUJVVEUgQXR0cmlidXRlIikKLSAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIHMpOwotCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIkFUVFJJQlVURSBPcGVyYXRpb25JbnZva2VkIikKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcGVyYXRpb25JbnZva2VkKCk7Ci0KLSAgICBAU3FlRGVzY3JpcHRvcktleSgiQVRUUklCVVRFIE9wZXJhdGlvbjJJbnZva2VkIikKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRPcGVyYXRpb24ySW52b2tlZCgpOwotCi0gICAgLy8gVm9pZCBvcGVyYXRpb24KLSAgICAvLyBUaGUgYXNzb2NpYXRlZCBNQmVhbk9wZXJhdGlvbkluZm8gaXMgbWFwcGVkIHRvIE9wZW5NQmVhbk9wZXJhdGlvbkluZm8KLSAgICAvLyA9PiBvcGVuVHlwZSBpcyBhZGRlZCB0byB0aGUgZGVzY3JpcHRvcgotICAgIEBTcWVEZXNjcmlwdG9yS2V5KHZhbHVlID0gIk9QRVJBVElPTiBvcGVyYXRpb24iLAotICAgIGRlc2NyaXB0b3JGaWVsZHMgPSB7Im9wZW5UeXBlPVNpbXBsZVR5cGUuVk9JRCJ9KQotICAgIHB1YmxpYyB2b2lkIG9wZXJhdGlvbigpOwotCi0gICAgQFNxZURlc2NyaXB0b3JLZXkoIk9QRVJBVElPTiBvcGVyYXRpb24yIikKLSAgICBwdWJsaWMgU3RyaW5nIG9wZXJhdGlvbjIoaW50IGkpOwotCi0gICAgLy8gVm9pZCBvcGVyYXRpb24KLSAgICAvLyBUaGUgYXNzb2NpYXRlZCBNQmVhbk9wZXJhdGlvbkluZm8gaXMgbWFwcGVkIHRvIE9wZW5NQmVhbk9wZXJhdGlvbkluZm8KLSAgICAvLyA9PiBvcGVuVHlwZSBpcyBhZGRlZCB0byB0aGUgZGVzY3JpcHRvcgotICAgIEBTcWVEZXNjcmlwdG9yS2V5KHZhbHVlID0gIk9QRVJBVElPTiByZXNldCIsCi0gICAgZGVzY3JpcHRvckZpZWxkcyA9IHsib3BlblR5cGU9U2ltcGxlVHlwZS5WT0lEIn0pCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvU3FlRGVzY3JpcHRvcktleS5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TcWVEZXNjcmlwdG9yS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTQ5MjYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9TcWVEZXNjcmlwdG9yS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkRlc2NyaXB0b3JLZXk7Ci0KLS8qKgotICogVGhhdCBhbm5vdGF0aW9uIGlzIHVzYWJsZSBldmVyeXdoZXJlIERlc2NyaXB0b3JLZXkgaXMgKGFuZCBldmVuIG1vcmUpLgotICogSXQgaXMgZm9yIHVzZSB0byB0ZXN0IHRoYXQgeW91IGNhbiByZXRyaWV2ZSB0aGUgU3FlRGVzY3JpcHRvcktleSBpbnRvIHRoZQotICogYXBwcm9wcmlhdGUgRGVzY3JpcHRvciBpbnN0YW5jZXMgYXMgYnVpbHQgYnkgdGhlIEpNWCBydW50aW1lLgotICovCi1ARG9jdW1lbnRlZAotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFNxZURlc2NyaXB0b3JLZXkgewotICAgIEBEZXNjcmlwdG9yS2V5KCJzcWVEZXNjcmlwdG9yS2V5IikKLSAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgIC8vIExpc3QgZGVzY3JpcHRvciBmaWVsZHMgdGhhdCBtYXkgYmUgYWRkZWQgb3IgbWF5IGJlIHVwZGF0ZWQKLSAgICAvLyB3aGVuIHJldHJpZXZpbmcgYW4gTUJlYW5JbmZvIHVzaW5nIGEgSk1YV1MgY29ubmVjdGlvbiBjb21wYXJlZCB0byB0aGUKLSAgICAvLyBNQmVhbkluZm8gcmV0dXJuZWQgYnkgYSBsb2NhbCBNQmVhblNlcnZlci4KLSAgICAvLyBUaGUgYW5ub3RhdGlvbiBmb3JtYXQgaXMgOgotICAgIC8vICAgPGRlc2NyaXB0b3JGaWVsZE5hbWU+PTxkZXNjcmlwdG9yRmllbGRWYWx1ZT4KLSAgICAvLyBUaGUgdmFsdWVzIGFjdHVhbGx5IGhhbmRsZWQgYnkgdGhlIHRlc3Qgc3VpdGUgYXJlIDoKLSAgICAvLyAgIG9wZW5UeXBlPVNpbXBsZVR5cGUuVk9JRAotICAgIEBEZXNjcmlwdG9yS2V5KCJkZXNjcmlwdG9yRmllbGRzIikKLSAgICBTdHJpbmdbXSBkZXNjcmlwdG9yRmllbGRzKCkgZGVmYXVsdCB7fTsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvVGVzdEpNWEF1dGhlbnRpY2F0b3IuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvVGVzdEpNWEF1dGhlbnRpY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlYTA1ZC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1Rlc3RKTVhBdXRoZW50aWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKLQotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWEF1dGhlbnRpY2F0b3I7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YUHJpbmNpcGFsOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKLQotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RKTVhBdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSk1YQXV0aGVudGljYXRvciB7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBwcm90b2NvbCA9ICIiOwotICAgIHByaXZhdGUgTUJlYW5TZXJ2ZXIgbWJzID0gbnVsbDsKLQotICAgIHB1YmxpYyBUZXN0Sk1YQXV0aGVudGljYXRvcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEpNWEF1dGhlbnRpY2F0b3IoU3RyaW5nIHByb3RvY29sKSB7Ci0gICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEpNWEF1dGhlbnRpY2F0b3IoU3RyaW5nIHByb3RvY29sLCBNQmVhblNlcnZlciBtYnMpIHsKLSAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICB0aGlzLm1icyA9IG1iczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3ViamVjdCBhdXRoZW50aWNhdGUoT2JqZWN0IGNyZWRlbnRpYWxzKSB7Ci0KLSAgICAgICAgU3RyaW5nIGNyZWRlbnRpYWxzX3VzZXJuYW1lID0gIiI7Ci0gICAgICAgIFN0cmluZyBjcmVkZW50aWFsc19wYXNzd29yZCA9ICIiOwotICAgICAgICBQcmluY2lwYWwgYVByaW5jaXBhbCA9IG51bGw7Ci0KLSAgICAgICAgY3JlZGVudGlhbHNfdXNlcm5hbWUgPSAoKFN0cmluZ1tdKSBjcmVkZW50aWFscylbMF07Ci0gICAgICAgIGNyZWRlbnRpYWxzX3Bhc3N3b3JkID0gKChTdHJpbmdbXSkgY3JlZGVudGlhbHMpWzFdOwotCi0gICAgICAgIFN0cmluZyBhdXRoZW50aWNhdGVkX3VzZXJuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJzdXNlcm5hbWUiKTsKLSAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0ZWRfcGFzc3dvcmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNwYXNzd29yZCIpOwotICAgICAgICBTdHJpbmcgcHJpbmNpcGFsID0gU3lzdGVtLmdldFByb3BlcnR5KCJwcmluY2lwYWwiKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RKTVhBdXRoZW50aWNhdG9yOjphdXRoZW50aWNhdGU6IFN0YXJ0Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEpNWEF1dGhlbnRpY2F0b3I6OmF1dGhlbnRpY2F0ZTogY3JlZGVudGlhbHMgdXNlcm5hbWUgPSAiICsKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFsc191c2VybmFtZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEpNWEF1dGhlbnRpY2F0b3I6OmF1dGhlbnRpY2F0ZTogY3JlZGVudGlhbHMgcGFzc3dvcmQgPSAiICsKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFsc19wYXNzd29yZCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEpNWEF1dGhlbnRpY2F0b3I6OmF1dGhlbnRpY2F0ZTogYXV0aGVudGljYXRlZCB1c2VybmFtZSA9ICIgKwotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRfdXNlcm5hbWUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RKTVhBdXRoZW50aWNhdG9yOjphdXRoZW50aWNhdGU6IGF1dGhlbnRpY2F0ZWQgcGFzc3dvcmQgPSAiICsKLSAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkX3Bhc3N3b3JkKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Sk1YQXV0aGVudGljYXRvcjo6YXV0aGVudGljYXRlOiBwcmluY2lwYWwgdXNlZCBmb3IgIiArCi0gICAgICAgICAgICAgICAgImF1dGhvcml6YXRpb24gPSAiICsgcHJpbmNpcGFsKTsKLQotICAgICAgICBpZiAoY3JlZGVudGlhbHNfdXNlcm5hbWUuZXF1YWxzKGF1dGhlbnRpY2F0ZWRfdXNlcm5hbWUpICYmCi0gICAgICAgICAgICAgICAgY3JlZGVudGlhbHNfcGFzc3dvcmQuZXF1YWxzKGF1dGhlbnRpY2F0ZWRfcGFzc3dvcmQpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RKTVhBdXRoZW50aWNhdG9yOjphdXRoZW50aWNhdGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRvciBzaG91bGQgc3VjY2VlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Sk1YQXV0aGVudGljYXRvcjo6YXV0aGVudGljYXRlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0b3Igc2hvdWxkIHJlamVjdCIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJUZXN0Sk1YQXV0aGVudGljYXRvciB0aHJvd3MgRVhDRVBUSU9OIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBhdXRoZW50aWNhdGlvbiBoYXMgc3VjY2VlZGVkCi0gICAgICAgIC8vIChubyBTZWN1cml0eUV4Y2VwdGlvbiB0aHJvd24pLgotICAgICAgICAvLwotICAgICAgICAvLyBJZiBubyBhdXRob3JpemF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgcmV0dXJuZWQgc3ViamVjdCAoZW1wdHkgb3Igbm90KQotICAgICAgICAvLyBpcyB1c2VsZXNzLgotICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBzdWJqZWN0IG11c3QgZGVmaW5lIGEgcHJpbmNpcGFsCi0gICAgICAgIC8vIGFuZCBhdXRob3JpemF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkIGFnYWluc3QgdGhpcyBwcmluY2lwYWwuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGN1c3RvbSBKTVhBdXRoZW50aWNhdG9yIGlzIHVzZWQgZm9yIHRlc3QgcHVycG9zZSBhbmQKLSAgICAgICAgLy8gdGhlIHVzZXJuYW1lIHVzZWQgdG8gcGVyZm9ybSBhdXRoZW50aWNhdGlvbiBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlCi0gICAgICAgIC8vIHVzZXJuYW1lIHVzZWQgdG8gcGVyZm9ybSBhdXRob3JpemF0aW9uLgotICAgICAgICAvLwotICAgICAgICBTdWJqZWN0IHN1YmplY3QgPSBuZXcgU3ViamVjdCgpOwotCi0gICAgICAgIGlmIChwcmluY2lwYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0Sk1YQXV0aGVudGljYXRvcjo6YXV0aGVudGljYXRlOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIkFkZCAiICsgcHJpbmNpcGFsICsgIiBwcmluY2lwYWwgdG8gdGhlIHJldHVybmVkIHN1YmplY3QiKTsKLSAgICAgICAgICAgIHN1YmplY3QuZ2V0UHJpbmNpcGFscygpLmFkZChuZXcgSk1YUHJpbmNpcGFsKHByaW5jaXBhbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1YmplY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9UZXN0U2FtcGxlTG9naW5Nb2R1bGUuamF2YSBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvVGVzdFNhbXBsZUxvZ2luTW9kdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDM0MmQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9UZXN0U2FtcGxlTG9naW5Nb2R1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjazsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLk5hbWVDYWxsYmFjazsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlBhc3N3b3JkQ2FsbGJhY2s7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLnNwaS5Mb2dpbk1vZHVsZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFNhbXBsZUxvZ2luTW9kdWxlIGltcGxlbWVudHMgTG9naW5Nb2R1bGUgewotCi0gICAgcHJpdmF0ZSBTdWJqZWN0IHN1YmplY3Q7Ci0gICAgcHJpdmF0ZSBDYWxsYmFja0hhbmRsZXIgY2FsbGJhY2tIYW5kbGVyOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgPz4gc2hhcmVkU3RhdGU7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCA/PiBvcHRpb25zOwotCi0gICAgcHVibGljIFRlc3RTYW1wbGVMb2dpbk1vZHVsZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN1YmplY3Qgc3ViamVjdCwKLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlciBjYWxsYmFja0hhbmRsZXIsCi0gICAgICAgICAgICBNYXA8U3RyaW5nLD8+IHNoYXJlZFN0YXRlLAotICAgICAgICAgICAgTWFwPFN0cmluZyw/PiBvcHRpb25zKSB7Ci0KLSAgICAgICAgdGhpcy5zdWJqZWN0ID0gc3ViamVjdDsKLSAgICAgICAgdGhpcy5jYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFja0hhbmRsZXI7Ci0gICAgICAgIHRoaXMuc2hhcmVkU3RhdGUgPSBzaGFyZWRTdGF0ZTsKLSAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLSAgICB9Ci0KLSAgLyoKLSAgICogQXV0aGVudGljYXRlIHRoZSB1c2VyIGJ5IGNvbXBhcmluZyB0aGUgdmFsdWVzIG9mIHRoZSBqYXZhIHByb3BlcnRpZXMKLSAgICogKHVzZXJuYW1lIGFuZCBwYXNzd29yZCkgYWdhaW5zdCB0aGUgdmFsdWVzIG9mIHRoZSBjcmVkZW50aWFscy4KLSAgICogKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2dpbigpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGNyZWRlbnRpYWxzX3VzZXJuYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNyZWRlbnRpYWxzX3Bhc3N3b3JkID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0ZWRfdXNlcm5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1c2VybmFtZSIpOwotICAgICAgICBTdHJpbmcgYXV0aGVudGljYXRlZF9wYXNzd29yZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic3Bhc3N3b3JkIik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0U2FtcGxlTG9naW5Nb2R1bGU6OmxvZ2luOiBTdGFydCIpOwotCi0gICAgICAgIC8vIEZpcnN0IHJldHJlaXZlIHRoZSBjcmVkZW50aWFscyB7dXNlcm5hbWUsIHBhc3N3b3JkfSBmcm9tCi0gICAgICAgIC8vIHRoZSBjYWxsYmFjayBoYW5kbGVyCi0gICAgICAgIENhbGxiYWNrW10gY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrWzJdOwotICAgICAgICBjYWxsYmFja3NbMF0gPSBuZXcgTmFtZUNhbGxiYWNrKCJ1c2VybmFtZSIpOwotICAgICAgICBjYWxsYmFja3NbMV0gPSBuZXcgUGFzc3dvcmRDYWxsYmFjaygicGFzc3dvcmQiLCBmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYWxsYmFja0hhbmRsZXIuaGFuZGxlKGNhbGxiYWNrcyk7Ci0gICAgICAgICAgICBjcmVkZW50aWFsc191c2VybmFtZSA9ICgoTmFtZUNhbGxiYWNrKWNhbGxiYWNrc1swXSkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgY3JlZGVudGlhbHNfcGFzc3dvcmQgPSBuZXcgU3RyaW5nKCgoUGFzc3dvcmRDYWxsYmFjayljYWxsYmFja3NbMV0pLgotICAgICAgICAgICAgICAgICAgICBnZXRQYXNzd29yZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBMb2dpbkV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0U2FtcGxlTG9naW5Nb2R1bGU6OmxvZ2luOiBjcmVkZW50aWFscyB1c2VybmFtZSA9ICIgKwotICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzX3VzZXJuYW1lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0U2FtcGxlTG9naW5Nb2R1bGU6OmxvZ2luOiBjcmVkZW50aWFscyBwYXNzd29yZCA9ICIgKwotICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzX3Bhc3N3b3JkKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0U2FtcGxlTG9naW5Nb2R1bGU6OmxvZ2luOiBhdXRoZW50aWNhdGVkIHVzZXJuYW1lID0gIiArCi0gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZF91c2VybmFtZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdFNhbXBsZUxvZ2luTW9kdWxlOjpsb2dpbjogYXV0aGVudGljYXRlZCBwYXNzd29yZCA9ICIgKwotICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWRfcGFzc3dvcmQpOwotCi0gICAgICAgIGlmIChjcmVkZW50aWFsc191c2VybmFtZS5lcXVhbHMoYXV0aGVudGljYXRlZF91c2VybmFtZSkgJiYKLSAgICAgICAgICAgICAgICBjcmVkZW50aWFsc19wYXNzd29yZC5lcXVhbHMoYXV0aGVudGljYXRlZF9wYXNzd29yZCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdFNhbXBsZUxvZ2luTW9kdWxlOjpsb2dpbjogIiArCi0gICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBzaG91bGQgc3VjY2VlZCIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RTYW1wbGVMb2dpbk1vZHVsZTo6bG9naW46ICIgKwotICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gc2hvdWxkIHJlamVjdCIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IExvZ2luRXhjZXB0aW9uKCJUZXN0U2FtcGxlTG9naW5Nb2R1bGUgdGhyb3dzIEVYQ0VQVElPTiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY29tbWl0KCkgdGhyb3dzIExvZ2luRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gYWJvcnQoKSB0aHJvd3MgTG9naW5FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBsb2dvdXQoKSB0aHJvd3MgTG9naW5FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1V0aWxzLmphdmEgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWYwMzcuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JTZXJ2ZXJNQmVhbjsKLQotLy8gdXRpbGl0eSBjbGFzcyBmb3IgTVhCZWFuKiB0ZXN0cyBjb21pbmcgZnJvbSBKTVggVG9uZ2EgdGVzdCBzdWl0ZQotY2xhc3MgVXRpbHMgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9TSURFX05BTUUgPSAiLXNlcnZlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9TSURFX05BTUUgPSAiLWNsaWVudCI7Ci0KLSAgICAvLyBERUJVRyBpcyBwcmludGVkIGRlcGVuZGluZyBvbiB0aGUgREVCVUcgYW5kIERFQlVHX0xFVkVMIEpBVkEgcHJvcGVydHkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfSEVBREVSID0gIltkZWJ1Z10gIjsKLQotICAgIC8vIERFQlVHIGxldmVscwotICAgIHByaXZhdGUgc3RhdGljIGludCBzZWxlY3RlZERlYnVnTGV2ZWwgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfU1RBTkRBUkQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUdfVkVSQk9TRSA9IDI7ICAvLyBNYWlubHkgdXNlZCBmb3Igc3RyZXNzIHRlc3RzCi0gICAgc3RhdGljIGZpbmFsIGludCBERUJVR19BTEwgPSBERUJVR19TVEFOREFSRCB8IERFQlVHX1ZFUkJPU0U7Ci0KLSAgICBzdGF0aWMgdm9pZCBwYXJzZURlYnVnUHJvcGVydGllcygpIHsKLSAgICAgICAgaW50IGxldmVsID0gMDsKLSAgICAgICAgUHJvcGVydGllcyBwID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKLQotICAgICAgICAvLyBnZXQgc2VsZWN0ZWQgbGV2ZWxzCi0gICAgICAgIGlmIChwLmdldFByb3BlcnR5KCJERUJVR19TVEFOREFSRCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX1NUQU5EQVJEOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX1ZFUkJPU0UiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsZXZlbCB8PSBERUJVR19WRVJCT1NFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAuZ2V0UHJvcGVydHkoIkRFQlVHX0FMTCIpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxldmVsIHw9IERFQlVHX0FMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHNlbGVjdGVkRGVidWdMZXZlbCA9IGxldmVsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJvZHVjZXMgdGhlIG9yaWdpbmFsIHBhcnNpbmcgYW5kIGNvbGxlY3Rpb24gb2YgdGVzdCBwYXJhbWV0ZXJzCi0gICAgICogZnJvbSB0aGUgRFRvbmdhIEpNWCB0ZXN0IHN1aXRlLgotICAgICAqCi0gICAgICogQ29sbGVjdHMgcGFzc2VkIGFyZ3MgYW5kIHJldHVybnMgdGhlbSBpbiBhIG1hcChhcmduYW1lLCB2YWx1ZSkgc3RydWN0dXJlLAotICAgICAqIHdoaWNoIHdpbGwgYmUgdGhlbiBwcm9wYWdhdGVkIGFzIG5lY2Vzc2FyeSB0byB2YXJpb3VzIGNhbGxlZCBtZXRob2RzLgotICAgICAqLwotICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcnNlUGFyYW1ldGVycyhTdHJpbmcgYXJnc1tdKQotICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBVdGlscy5kZWJ1ZyhERUJVR19TVEFOREFSRCwgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IFN0YXJ0Iik7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgaWYgKCBhcmdzW2ldLnRyaW0oKS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChpKzEpIDwgYXJncy5sZW5ndGggJiYgIWFyZ3NbaSsxXS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKERFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggdmFsdWUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2krMV0pIDsKLSAgICAgICAgICAgICAgICAgICAgbWFwLnB1dChhcmdzW2ldLnRyaW0oKSwgYXJnc1tpKzFdLnRyaW0oKSkgOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGkrMSkgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2krMV0uc3RhcnRzV2l0aCgiLSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoaSsxKSA9PSBhcmdzLmxlbmd0aCApIHsKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IGFkZGVkIGluIG1hcCA9ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBudWxsIHZhbHVlIikgOwotICAgICAgICAgICAgICAgICAgICBtYXAucHV0KGFyZ3NbaV0udHJpbSgpLCBudWxsKSA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RSb290OjpwYXJzZVBhcmFtZXRlcnM6IChXQVJOSU5HKSBub3QgYWRkZWQgaW4gbWFwID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldKSA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbHMuZGVidWcoREVCVUdfU1RBTkRBUkQsICJUZXN0Um9vdDo6cGFyc2VQYXJhbWV0ZXJzOiBEb25lIikgOwotICAgICAgICByZXR1cm4gbWFwIDsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSBzZXJ2ZXIgcGFyYW1ldGVycyBhbmQgcHV0IHRoZW0gaW4gcGFzc2VkIHNlcnZlck1hcAotICAgIHN0YXRpYyBpbnQgcGFyc2VTZXJ2ZXJQYXJhbWV0ZXJzKFN0cmluZyBhcmdzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZlclNpZGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc2VydmVyTWFwICkKLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICBzZXJ2ZXJTaWRlTmFtZSArICI6OnBhcnNlU2VydmVyUGFyYW1ldGVyczogU3RhcnQiKTsKLQotICAgICAgICBpbnQgbmV4dEluZGV4ID0gMDsKLSAgICAgICAgYm9vbGVhbiBzZWVuU2VydmVyRmxhZyA9IGZhbHNlOwotCi0gICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgICAgICAvLyBDYXNlIG9mIHJlYWNoaW5nICItc2VydmVyIiBmbGFnIHBhcmFtZXRlcgotICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKFNFUlZFUl9TSURFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWVuU2VydmVyRmxhZykgewotICAgICAgICAgICAgICAgICAgICBzZWVuU2VydmVyRmxhZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFscmVhZHkgcGFyc2luZyBzZXJ2ZXIgcGFyYW1zLCBpbnZhbGlkIHBhcmFtcyBsaXN0Ci0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU2lkZU5hbWUgKyAiOjpwYXJzZVBhcmFtZXRlcnM6IEludmFsaWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldICsgIiBwYXJhbWV0ZXIgZGV0ZWN0ZWQgaW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBTRVJWRVJfU0lERV9OQU1FICsgIiBwYXJhbWV0ZXJzIGxpc3QiKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIFBhcmFtZXRlciBsaXN0Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDYXNlIG9mIHJlYWNoaW5nICItY2xpZW50IiBmbGFnIHBhcmFtZXRlcgotICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKENMSUVOVF9TSURFX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2hpbGUgcGFyc2luZyBzZXJ2ZXIgcGFyYW1ldGVycywgdGhlbiBwYXJzaW5nIGlzIGRvbmUuCi0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlclNpZGVOYW1lICsgIjo6cGFyc2VTZXJ2ZXJQYXJhbWV0ZXJzOiBQYXJzaW5nIG9mICIgKwotICAgICAgICAgICAgICAgICAgICBTRVJWRVJfU0lERV9OQU1FICsgIiBwYXJhbWV0ZXJzIGRvbmUuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkgPSBwYXJzZVBhcmFtQXRJbmRleChhcmdzLCBpLCBzZXJ2ZXJNYXApOwotICAgICAgICAgICAgbmV4dEluZGV4ID0gaTsKLSAgICAgICAgfQotCi0gICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgc2VydmVyU2lkZU5hbWUgKyAiOjpwYXJzZVNlcnZlclBhcmFtZXRlcnM6IFBhcnNpbmcgb2YgcGFyYW1ldGVycyBkb25lIik7Ci0KLSAgICAgICAgcmV0dXJuIG5leHRJbmRleDsKLSAgICB9Ci0KLSAgICAvLyBQYXJzZSBjbGllbnQgcGFyYW1ldGVycyBhbmQgcHV0IHRoZW0gaW4gcGFzc2VkIGNsaWVudE1hcAotICAgIHN0YXRpYyB2b2lkIHBhcnNlQ2xpZW50UGFyYW1ldGVycyhTdHJpbmcgYXJnc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xpZW50U2lkZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY2xpZW50TWFwICkKLSAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgIGNsaWVudFNpZGVOYW1lICsgIjo6cGFyc2VDbGllbnRQYXJhbWV0ZXJzOiBTdGFydCIpOwotCi0gICAgICAgIGJvb2xlYW4gc2VlbkNsaWVudEZsYWcgPSBmYWxzZTsKLQotICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgLy8gQ2FzZSBvZiByZWFjaGluZyAiLWNsaWVudCIgZmxhZyBwYXJhbWV0ZXIKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscyhDTElFTlRfU0lERV9OQU1FKSkgewotICAgICAgICAgICAgICAgIGlmICghc2VlbkNsaWVudEZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VlbkNsaWVudEZsYWcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBBbHJlYWR5IHBhcnNpbmcgY2xpZW50IHBhcmFtcywgaW52YWxpZCBwYXJhbXMgbGlzdAotICAgICAgICAgICAgICAgICAgICBVdGlscy5kZWJ1ZyhVdGlscy5ERUJVR19TVEFOREFSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNpZGVOYW1lICsgIjo6cGFyc2VDbGllbnRQYXJhbWV0ZXJzOiBJbnZhbGlkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1NJREVfTkFNRSArICIgcGFyYW1ldGVyIGRldGVjdGVkIGluICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1NJREVfTkFNRSArICIgcGFyYW1ldGVycyBsaXN0LiIpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIgaW4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTaWRlTmFtZSArICIgcGFyYW1ldGVyIGxpc3QiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENhc2Ugb2YgcmVhY2hpbmcgIi1zZXJ2ZXIiIGZsYWcgcGFyYW1ldGVyCi0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoU0VSVkVSX1NJREVfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGlsZSBwYXJzaW5nIGNsaWVudCBwYXJhbWV0ZXJzLCBpbnZhbGlkIHBhcmFtZXRlciBsaXN0LgotICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICBjbGllbnRTaWRlTmFtZSArICI6OnBhcnNlQ2xpZW50UGFyYW1ldGVyczogSW52YWxpZCAiICsKLSAgICAgICAgICAgICAgICAgICAgU0VSVkVSX1NJREVfTkFNRSArICIgcGFyYW1ldGVyIGluc2lkZSAiICsKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1NJREVfTkFNRSArICIgcGFyYW1ldGVycyBsaXN0LiIpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlciBpbiAiICsKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50U2lkZU5hbWUgKyAiIHBhcmFtZXRlciBsaXN0Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGkgPSBwYXJzZVBhcmFtQXRJbmRleChhcmdzLCBpLCBjbGllbnRNYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICBjbGllbnRTaWRlTmFtZSArICI6OnBhcnNlQ2xpZW50UGFyYW1ldGVyczogUGFyc2luZyBvZiBwYXJhbWV0ZXJzIGRvbmUuIik7Ci0gICAgfQotCi0gICAgLy8gQWRkIHBhcmFtIGZvdW5kIGF0IGluZGV4IHRvIHBhc3NlZCBtYXAKLSAgICAvLyBXZSBvbmx5IGFjY2VwdCBlaXRoZXIgIi1wYXJhbSB2YWx1ZSIgb3IgIi1wYXJhbSIgZm9ybS4KLSAgICAvLyBUaGUgInZhbHVlIiBmb3JtIGlzIGludmFsaWQgYnV0IGp1c3QgaWdub3JlZC4KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VQYXJhbUF0SW5kZXgoU3RyaW5nIGFyZ3NbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotCi0gICAgICAgIGlmIChhcmdzW2luZGV4XS50cmltKCkuc3RhcnRzV2l0aCgiLSIpICkgewotICAgICAgICAgICAgLy8gQ2FzZSBvZiBhICItcGFyYW0gdmFsdWUiIGZvcm0KLSAgICAgICAgICAgIGlmICgoaW5kZXgrMSkgPCBhcmdzLmxlbmd0aCAmJiAhYXJnc1tpbmRleCsxXS5zdGFydHNXaXRoKCItIikgKSB7Ci0gICAgICAgICAgICAgICAgVXRpbHMuZGVidWcoVXRpbHMuREVCVUdfU1RBTkRBUkQsCi0gICAgICAgICAgICAgICAgICAgICJUZXN0Um9vdDo6cGFyc2VQYXJhbUF0SW5kZXg6IGFkZGVkIGluIG1hcCA9ICIKLSAgICAgICAgICAgICAgICAgICAgKyBhcmdzW2luZGV4XQotICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB2YWx1ZSAiCi0gICAgICAgICAgICAgICAgICAgICsgYXJnc1tpbmRleCsxXSkgOwotICAgICAgICAgICAgICAgIC8vIGFkZGluZyAoInBhcmFtIiwgdmFsdWUpIHRvIHRoZSBwYXNzZWQgbWFwCi0gICAgICAgICAgICAgICAgbWFwLnB1dChhcmdzW2luZGV4XS50cmltKCksIGFyZ3NbaW5kZXgrMV0udHJpbSgpKSA7Ci0gICAgICAgICAgICAgICAgLy8gdmFsdWUgc2hvdWxkIG5vdCBiZSBwYXJzZWQgYSBzZWNvbmQgdGltZQotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleCsxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQ2FzZSBvZiBhICItcGFyYW0iIGZvcm0gKGZsYWcgcGFyYW1ldGVyKQotICAgICAgICAgICAgZWxzZSBpZiAoKChpbmRleCsxKSA8IGFyZ3MubGVuZ3RoICYmIGFyZ3NbaW5kZXgrMV0uc3RhcnRzV2l0aCgiLSIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKGluZGV4KzEpID09IGFyZ3MubGVuZ3RoICkgewotICAgICAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICAgICAiVGVzdFJvb3Q6OnBhcnNlUGFyYW1BdEluZGV4OiBhZGRlZCBpbiBtYXAgPSAiCi0gICAgICAgICAgICAgICAgICAgICsgYXJnc1tpbmRleF0KLSAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGggbnVsbCB2YWx1ZSIpIDsKLSAgICAgICAgICAgICAgICAvLyBhZGRpbmcgKCJwYXJhbSIsIG51bGwpIHRvIHBhc3NlZCBtYXAKLSAgICAgICAgICAgICAgICBtYXAucHV0KGFyZ3NbaW5kZXhdLnRyaW0oKSwgbnVsbCkgOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgInZhbHVlIiBhbG9uZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgIFV0aWxzLmRlYnVnKFV0aWxzLkRFQlVHX1NUQU5EQVJELAotICAgICAgICAgICAgICAgICJUZXN0Um9vdDo6cGFyc2VQYXJhbUF0SW5kZXg6IGludmFsaWQgIiArCi0gICAgICAgICAgICAgICAgIiB2YWx1ZS1hbG9uZSBcIiIgKyBhcmdzW2luZGV4XSArICJcIiBwYXJhbWV0ZXIuIiArCi0gICAgICAgICAgICAgICAgIiBQYXJhbWV0ZXIgaWdub3JlZC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbmRleDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB0byBiZSB1c2VkIGluIGFsbCB0ZXN0cyB0byBwcmludCBhbnl0aGluZwotICAgICAqIHRoYXQgaXMgdGVtcG9yYXJ5LgotICAgICAqIFByaW50aW5nIGlzIGRvbmUgb25seSB3aGVuIGRlYnVnIGlzIGFjdGl2YXRlZCBieSB0aGUgcHJvcGVydHkgREVCVUcuCi0gICAgICogUHJpbnRpbmcgZGVwZW5kcyBhbHNvIG9uIHRoZSBERUJVR19MRVZFTCBwcm9wZXJ0eS4KLSAgICAgKiBIZXJlIGl0IGVuY2Fwc3VsYXRlcyBhIFN5c3RlbS5vdXQucHJpbnRsbi4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBkZWJ1ZyhpbnQgbGV2ZWwsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIGlmICgoc2VsZWN0ZWREZWJ1Z0xldmVsICYgbGV2ZWwpICE9IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihERUJVR19IRUFERVIgKyBsaW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHByaW50IHN0YWNrIHRyYWNlIHdoZW4gd2l0aFN0YWNrIGlzIHRydWUuCi0gICAgICogRG9lcyB0cnkgdG8gY2FsbCBnZXRUYXJnZXRFeGNlcHRpb24oKSBhbmQgZ2V0VGFyZ2V0RXJyb3IoKSB0aGVuCi0gICAgICogcHJpbnQgZW1iZWRkZWQgc3RhY2tzIGluIHRoZSBjYXNlIG9mIGFuIEV4Y2VwdGlvbiB3cmFwcGluZwotICAgICAqIGFub3RoZXIgRXhjZXB0aW9uIG9yIGFuIEVycm9yLiBSZWN1cnNlIHVudGlsIG5vIG1vcmUgd3JhcHBpbmcKLSAgICAgKiBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBwcmludFRocm93YWJsZShUaHJvd2FibGUgdGhlVGhybywgYm9vbGVhbiB3aXRoU3RhY2spIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICh3aXRoU3RhY2spIHsKLSAgICAgICAgICAgICAgICB0aGVUaHJvLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aGVUaHJvIGluc3RhbmNlb2YgRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9uIHQgPSAoRXhjZXB0aW9uKSB0aGVUaHJvOwotICAgICAgICAgICAgICAgIE1ldGhvZCB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyBibGFuayA9ICIgIjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRUYXJnZXRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEV4Y2VwdGlvbiBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihibGFuayArIHQuZ2V0Q2xhc3MoKSArICI9PT4iICsgdC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChFeGNlcHRpb24pIHRhcmdldC5pbnZva2UodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5PYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFuayA9IGJsYW5rICsgIiAgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYmxhbmsgKyB0LmdldENsYXNzKCkgKyAiPT0+IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRUYXJnZXRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEV4Y2VwdGlvbiBtZXRob2QgY291bGQgYmUgdGhlcmUgb3Igbm90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdlIG1heSBoYXZlIGV4Y2VwdGlvbnMgd3JhcHBpbmcgYW4gRXJyb3IgdGhlbiBpdCBpcwotICAgICAgICAgICAgICAgIC8vIGdldFRhcmdldEVycm9yIHRoYXQgaXMgbGlrZWx5IHRvIGJlIGNhbGxlZAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICgoRXhjZXB0aW9uKSB0aGVUaHJvKS5nZXRDbGFzcygpLmdldE1ldGhvZCgiZ2V0VGFyZ2V0RXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgLy8gT0s6IGdldFRhcmdldEVycm9yIG1ldGhvZCBjb3VsZCBiZSB0aGVyZSBvciBub3QKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlIGVyciA9IHRoZVRocm87Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRhcmdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAoRXJyb3IpIHRhcmdldC5pbnZva2UoZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoamF2YS5sYW5nLk9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFuayA9IGJsYW5rICsgIiAgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYmxhbmsgKyBlcnIuZ2V0Q2xhc3MoKSArICI9PT4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aXRoU3RhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZXJyLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRUYXJnZXRFcnJvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGphdmEubGFuZy5DbGFzczw/PltdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPSzogZ2V0VGFyZ2V0RXJyb3IgbWV0aG9kIGNvdWxkIGJlIHRoZXJlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocm93YWJsZSBpcyA6ICIgKyB0aGVUaHJvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHgpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIDogcmFpc2VkIGluIHByaW50RXhjZXB0aW9uIDogIiArIHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2FpdCB1cCB0byBtYXhUaW1lSW5TZWNvbmRzIHNlY29uZChzKSB0aGUgZ2l2ZW4gSk1YIGNvbm5lY3RvciBzZXJ2ZXIKLSAgICAgKiBjb21lcyB1cCAod2hpY2ggbWVhbnMgaXNBY3RpdmUgcmV0dXJucyB0cnVlKS4KLSAgICAgKiBJZiBpdCBmYWlscyB0byBkbyBzbyB3ZSB0aHJvdyBhIFJ1blRpbWUgZXhjZXB0aW9uLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHdhaXRSZWFkeShKTVhDb25uZWN0b3JTZXJ2ZXJNQmVhbiBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGltZUluU2Vjb25kcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBlbGFwc2VkID0gMDsKLQotICAgICAgICB3aGlsZSAoIXNlcnZlci5pc0FjdGl2ZSgpICYmIGVsYXBzZWQgPCBtYXhUaW1lSW5TZWNvbmRzKSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBlbGFwc2VkKys7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VydmVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlV0aWxzOjp3YWl0UmVhZHk6IEpNWCBjb25uZWN0b3Igc2VydmVyIGNhbWUgdXAiOwotICAgICAgICAgICAgaWYgKCBlbGFwc2VkID09IDApIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICIgaW1tZWRpYXRlbHkiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlICs9ICIgYWZ0ZXIgIiArIGVsYXBzZWQgKyAiIHNlY29uZHMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVzc2FnZSArPSAiIFsiICsgc2VydmVyLmdldEFkZHJlc3MoKSArICJdIjsKLSAgICAgICAgICAgIFV0aWxzLmRlYnVnKERFQlVHX1NUQU5EQVJELCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlV0aWxzOjp3YWl0UmVhZHk6IChFUlJPUikgSk1YIGNvbm5lY3RvciIgKwotICAgICAgICAgICAgICAgICAgICAiIHNlcnZlciBkaWRuJ3QgY29tZSB1cCBhZnRlciAiICsgZWxhcHNlZCArICIgc2Vjb25kcyBbIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRBZGRyZXNzKCkgKyAiXSI7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29tcGFyZSB0aGUgc3BlY2lmaWVkIFRocm93YWJsZSBhbmQgcG9zc2libHkKLSAgICAgKiB0aGUgZGVyaXZlZCBjYXVzZXMgdG8gdGhlIHNwZWNpZmllZCBTdHJpbmcgYXJndW1lbnQuCi0gICAgICogVGhlIGV4cGVjdGVkIFN0cmluZyBhcmd1bWVudCBmb3JtYXQgaXMgOgotICAgICAqICAgICAgdGhyb3dhYmxlXzE7dGhyb3dhYmxlXzI7Li4uO3Rocm93YWJsZV9OCi0gICAgICogd2hlcmUgdGhyb3dhYmxlX2kgY2FuIGJlIDoKLSAgICAgKiAgICAgIC0gZWl0aGVyIGEgdGhyb3dhYmxlIGNsYXNzIG5hbWUKLSAgICAgKiAgICAgIC0gb3IgdGhlICIqIiBjaGFyYWN0ZXIgbWVhbmluZyBzZXZlcmFsIHVua25vd24gdGhyb3dhYmxlIGNsYXNzIG5hbWVzCi0gICAgICogICAgICBUaGlzIGNoYXJhY3RlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgdGhyb3dhYmxlIGNsYXNzIG5hbWUKLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBjb21wYXJlVGhyb3dhYmxlKAotICAgICAgICAgICAgVGhyb3dhYmxlIHQsCi0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUaHJvd2FibGUpIHsKLQotICAgICAgICAvLyBGaXJzdCBwYXJzZSB0aGUgZXhwZWN0ZWRUaHJvd2FibGUgU3RyaW5nCi0gICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4cGVjdGVkVGhyb3dhYmxlLCAiOyIpOwotICAgICAgICBTdHJpbmcgdG9rZW4gPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIGlmICghdG9rZW4uZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFDbGFzcy5mb3JOYW1lKHRva2VuKS5pc0luc3RhbmNlKHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFDbGFzcy5mb3JOYW1lKHRva2VuKS5pc0luc3RhbmNlKHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0ID0gdC5nZXRDYXVzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhwZWN0ZWQgdGhyb3dhYmxlIGNsYXNzKGVzKSAiICsgZXhwZWN0ZWRUaHJvd2FibGUgKwotICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIGxvY2F0ZWQiOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9hY2Nlc3MucHJvcGVydGllcyBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvYWNjZXNzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZjg5YTguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9hY2Nlc3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgQWNjZXNzIGNvbnRyb2wgZmlsZSBmb3IgU1FFIHRlc3RzLgotCi0jIERlZmF1bHQgdXNlcm5hbWUKLVNRRV91c2VybmFtZSByZWFkd3JpdGUgY3JlYXRlIFNpbXBsZQotCi0jIEZ1bmN0aW9uYWwgYXV0aG9yaXphdGlvbiB0ZXN0cwotdXNlcm5hbWUxIHJlYWR3cml0ZSBjcmVhdGUgU2ltcGxlCi11c2VybmFtZTIgcmVhZG9ubHkKLXVzZXJuYW1lMyByZWFkb25seQotdXNlcm5hbWU0IHJlYWR3cml0ZSBjcmVhdGUgU2ltcGxlCi11c2VybmFtZTUgcmVhZHdyaXRlIGNyZWF0ZSBTaW1wbGUKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvamF2YS5wb2xpY3kuYXV0aG9yaXphdGlvbiBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvamF2YS5wb2xpY3kuYXV0aG9yaXphdGlvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3MTI3Ni4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L2phdmEucG9saWN5LmF1dGhvcml6YXRpb24KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLyBTdGFuZGFyZCBleHRlbnNpb25zIGdldCBhbGwgcGVybWlzc2lvbnMgYnkgZGVmYXVsdAotCi1ncmFudCBjb2RlQmFzZSAiZmlsZToke2phdmEuaG9tZX0vbGliL2V4dC8qIiB7Ci0JcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Ci19OwotCi0vLyBkZWZhdWx0IHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYWxsIGRvbWFpbnMKLWdyYW50IHsgCi0JLy8gQWxsb3dzIGFueSB0aHJlYWQgdG8gc3RvcCBpdHNlbGYgdXNpbmcgdGhlIGphdmEubGFuZy5UaHJlYWQuc3RvcCgpCi0JLy8gbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnQuCi0JLy8gTm90ZSB0aGF0IHRoaXMgcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IGRlZmF1bHQgb25seSB0byByZW1haW4KLQkvLyBiYWNrd2FyZHMgY29tcGF0aWJsZS4KLQkvLyBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBlaXRoZXIgcmVtb3ZlIHRoaXMgcGVybWlzc2lvbgotCS8vIGZyb20gdGhpcyBwb2xpY3kgZmlsZSBvciBmdXJ0aGVyIHJlc3RyaWN0IGl0IHRvIGNvZGUgc291cmNlcwotCS8vIHRoYXQgeW91IHNwZWNpZnksIGJlY2F1c2UgVGhyZWFkLnN0b3AoKSBpcyBwb3RlbnRpYWxseSB1bnNhZmUuCi0JLy8gU2VlICJodHRwOi8vamF2YS5zdW4uY29tL25vdGVzIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAic3RvcFRocmVhZCI7Ci0KLQkvLyBhbGxvd3MgYW55b25lIHRvIGxpc3RlbiBvbiB1bi1wcml2aWxlZ2VkIHBvcnRzCi0JcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICJsb2NhbGhvc3Q6MTAyNC0iLCAibGlzdGVuIjsKLQotCS8vICJzdGFuZGFyZCIgcHJvcGVyaWVzIHRoYXQgY2FuIGJlIHJlYWQgYnkgYW55b25lCi0KLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudmVyc2lvbiIsICJyZWFkIjsKLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudmVuZG9yIiwgInJlYWQiOwotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52ZW5kb3IudXJsIiwgInJlYWQiOwotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS5jbGFzcy52ZXJzaW9uIiwgInJlYWQiOwotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAib3MubmFtZSIsICJyZWFkIjsKLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIm9zLnZlcnNpb24iLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJvcy5hcmNoIiwgInJlYWQiOwotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiZmlsZS5zZXBhcmF0b3IiLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJwYXRoLnNlcGFyYXRvciIsICJyZWFkIjsKLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImxpbmUuc2VwYXJhdG9yIiwgInJlYWQiOwotCi0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnNwZWNpZmljYXRpb24udmVyc2lvbiIsICJyZWFkIjsKLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEuc3BlY2lmaWNhdGlvbi52ZW5kb3IiLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnNwZWNpZmljYXRpb24ubmFtZSIsICJyZWFkIjsKLQotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnNwZWNpZmljYXRpb24udmVuZG9yIiwgInJlYWQiOwotCXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiamF2YS52bS5zcGVjaWZpY2F0aW9uLm5hbWUiLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnZlcnNpb24iLCAicmVhZCI7Ci0JcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICJqYXZhLnZtLnZlbmRvciIsICJyZWFkIjsKLQlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEudm0ubmFtZSIsICJyZWFkIjsKLQotICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiKiIsInJlYWQsd3JpdGUiOwotCi19OwotCi1ncmFudCBjb2RlQmFzZSAiZmlsZTovLSIgewotCXBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOwotICAgICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiKiIsInJlYWQsd3JpdGUiOwotfTsKLQotZ3JhbnQgcHJpbmNpcGFsIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFByaW5jaXBhbCAiU1FFX3VzZXJuYW1lIiB7Ci0gICAgcGVybWlzc2lvbiBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyUGVybWlzc2lvbiAiKiI7Ci0gICAgcGVybWlzc2lvbiBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUGVybWlzc2lvbiAiU2ltcGxlIiwgImluc3RhbnRpYXRlIjsKLSAgICBwZXJtaXNzaW9uIGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5QZXJtaXNzaW9uICJTaW1wbGUiLCAicmVnaXN0ZXJNQmVhbiI7Ci19OwotCi1ncmFudCBwcmluY2lwYWwgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YUHJpbmNpcGFsICJ1c2VybmFtZTEiIHsKLSAgICAvLwotICAgIC8vIEpNWFByaW5jaXBhbHMgInVzZXJuYW1lMSIgaGFzIGFsbCBwZXJtaXNzaW9ucy4KLSAgICAvLwotICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOwotfTsKLQotZ3JhbnQgcHJpbmNpcGFsIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFByaW5jaXBhbCAidXNlcm5hbWUyIiB7Ci0gICAgLy8KLSAgICAvLyBKTVhQcmluY2lwYWxzICJ1c2VybmFtZTIiIGhhcyBhbGwgcGVybWlzc2lvbnMuCi0gICAgLy8KLSAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKLX07Ci0KLWdyYW50IHByaW5jaXBhbCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhQcmluY2lwYWwgInVzZXJuYW1lMyIgewotICAgIC8vCi0gICAgLy8gSk1YUHJpbmNpcGFscyAidXNlcm5hbWUzIiBoYXMgc29tZSBwZXJtaXNzaW9ucy4KLSAgICAvLwotICAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblBlcm1pc3Npb24gIlNpbXBsZSIsICJpbnN0YW50aWF0ZSI7Ci0gICAgcGVybWlzc2lvbiBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuUGVybWlzc2lvbiAiU2ltcGxlIiwgInJlZ2lzdGVyTUJlYW4iOwotICAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblBlcm1pc3Npb24gIlNpbXBsZSIsICJzZXRBdHRyaWJ1dGUiOwotICAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblBlcm1pc3Npb24gIlNpbXBsZSIsICJpbnZva2UiOwotfTsKLQotZ3JhbnQgcHJpbmNpcGFsIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFByaW5jaXBhbCAidXNlcm5hbWU0IiB7Ci0gICAgLy8KLSAgICAvLyBKTVhQcmluY2lwYWxzICJ1c2VybmFtZTQiIGhhcyBhbGwgcGVybWlzc2lvbnMuCi0gICAgLy8KLSAgICBwZXJtaXNzaW9uIGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5QZXJtaXNzaW9uICJTaW1wbGUiLCAiaW5zdGFudGlhdGUiOwotICAgIHBlcm1pc3Npb24gamF2YXgubWFuYWdlbWVudC5NQmVhblBlcm1pc3Npb24gIlNpbXBsZSIsICJyZWdpc3Rlck1CZWFuIjsKLSAgICBwZXJtaXNzaW9uIGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5QZXJtaXNzaW9uICJTaW1wbGUiLCAiaW52b2tlIjsKLX07Ci0KLWdyYW50IHByaW5jaXBhbCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhQcmluY2lwYWwgInVzZXJuYW1lNSIgewotICAgIC8vCi0gICAgLy8gSk1YUHJpbmNpcGFscyAidXNlcm5hbWU1IiBoYXMgbm8gcGVybWlzc2lvbnMuCi0gICAgLy8KLX07CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L2tleXN0b3JlQWdlbnQgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L2tleXN0b3JlQWdlbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjAyZTAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9rZXlzdG9yZUFnZW50CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9rZXlzdG9yZUNsaWVudCBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkva2V5c3RvcmVDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTBiN2YuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9rZXlzdG9yZUNsaWVudAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvbG9naW4uY29uZmlnIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9sb2dpbi5jb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZDE1MDIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9sb2dpbi5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVBhc3N3b3JkRmlsZUF1dGhlbnRpY2F0aW9uIHsKLSAgICBjb20uc3VuLmpteC5yZW1vdGUuc2VjdXJpdHkuRmlsZUxvZ2luTW9kdWxlIHJlcXVpcmVkCi0JcGFzc3dvcmRGaWxlPSIke3Bhc3N3b3JkLmZpbGV9IjsKLX07Ci0KLVNhbXBsZUxvZ2luTW9kdWxlIHsKLSAgICBUZXN0U2FtcGxlTG9naW5Nb2R1bGUgcmVxdWlyZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9wYXNzd29yZC5wcm9wZXJ0aWVzIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS9wYXNzd29yZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTUwOTliLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvcGFzc3dvcmQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgUGFzc3dvcmQgZmlsZSBmb3IgZGVmYXVsdCBTUUUgdXNlcm5hbWUuCi1TUUVfdXNlcm5hbWUgU1FFX3Bhc3N3b3JkCi0KLSMgRnVuY3Rpb25hbCBhdXRob3JpemF0aW9uIHRlc3RzCi11c2VybmFtZTEgcGFzc3dvcmQxCi11c2VybmFtZTIgcGFzc3dvcmQyCi11c2VybmFtZTMgcGFzc3dvcmQzCi11c2VybmFtZTQgcGFzc3dvcmQ0Ci11c2VybmFtZTUgcGFzc3dvcmQ1Ci11c2VybmFtZTYgcGFzc3dvcmQ2Ci0KLXVzZXJuYW1lRmlsZUxvZ2luTW9kdWxlIHBhc3N3b3JkRmlsZUxvZ2luTW9kdWxlCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3NlY3VyaXR5L3RydXN0c3RvcmVBZ2VudCBiL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvdHJ1c3RzdG9yZUFnZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjVmNjk4Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvdHJ1c3RzdG9yZUFnZW50CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS90cnVzdHN0b3JlQ2xpZW50IGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC9zZWN1cml0eS90cnVzdHN0b3JlQ2xpZW50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmE2YTAwLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvc2VjdXJpdHkvdHJ1c3RzdG9yZUNsaWVudAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L21hbmFnZW1lbnQvdHJ1c3RzdG9yZUFnZW50IGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC90cnVzdHN0b3JlQWdlbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNWY2OTguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC90cnVzdHN0b3JlQWdlbnQKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3RydXN0c3RvcmVDbGllbnQgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3RydXN0c3RvcmVDbGllbnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTZhMDAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC90cnVzdHN0b3JlQ2xpZW50CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL0Jlc3RFZmZvcnRPbkxhenlDb25uZWN0ZWQuamF2YSBiL2pkay90ZXN0L2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9CZXN0RWZmb3J0T25MYXp5Q29ubmVjdGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGY0ZmUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL0Jlc3RFZmZvcnRPbkxhenlDb25uZWN0ZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLy8KLS8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCi0vLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgotLy8KLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MTQ0NTY2Ci0gKiBAc3VtbWFyeSBDdXN0b20gSG9zdG5hbWVWZXJpZmllciBkaXNhYmxlcyBTTkkgZXh0ZW5zaW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBCZXN0RWZmb3J0T25MYXp5Q29ubmVjdGVkCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKLQotcHVibGljIGNsYXNzIEJlc3RFZmZvcnRPbkxhenlDb25uZWN0ZWQgewotCi0gICAgLyoKLSAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgotICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPwotICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKLSAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IHRydWU7Ci0KLSAgICAvKgotICAgICAqIFdoZXJlIGRvIHdlIGZpbmQgdGhlIGtleXN0b3Jlcz8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGF0aFRvU3RvcmVzID0gIi4uLy4uLy4uLy4uL3N1bi9zZWN1cml0eS9zc2wvZXRjIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5U3RvcmVGaWxlID0gImtleXN0b3JlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdHJ1c3RTdG9yZUZpbGUgPSAidHJ1c3RzdG9yZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhc3N3ZCA9ICJwYXNzcGhyYXNlIjsKLQotICAgIC8qCi0gICAgICogSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLSAgICAvKgotICAgICAqIHRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgb2YgbG9jYWxob3N0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhvc3RuYW1lID0gbnVsbDsKLQotICAgIC8qCi0gICAgICogSWYgdGhlIGNsaWVudCBvciBzZXJ2ZXIgaXMgZG9pbmcgc29tZSBraW5kIG9mIG9iamVjdCBjcmVhdGlvbgotICAgICAqIHRoYXQgdGhlIG90aGVyIHNpZGUgZGVwZW5kcyBvbiwgYW5kIHRoYXQgdGhyZWFkIHByZW1hdHVyZWx5Ci0gICAgICogZXhpdHMsIHlvdSBtYXkgZXhwZXJpZW5jZSBhIGhhbmcuICBUaGUgdGVzdCBoYXJuZXNzIHdpbGwKLSAgICAgKiB0ZXJtaW5hdGUgYWxsIGh1bmcgdGhyZWFkcyBhZnRlciBpdHMgdGltZW91dCBoYXMgZXhwaXJlZCwKLSAgICAgKiBjdXJyZW50bHkgMyBtaW51dGVzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgbWlnaHQgdHJ5IHRvIGJlCi0gICAgICogc21hcnQgYWJvdXQgaXQuLi4uCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCi0gICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvU2VydmVyU2lkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IHNzbHNzZiA9Ci0gICAgICAgICAgICAoU1NMU2VydmVyU29ja2V0RmFjdG9yeSkgU1NMU2VydmVyU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHRyeSAoU1NMU2VydmVyU29ja2V0IHNzbFNlcnZlclNvY2tldCA9Ci0gICAgICAgICAgICAgICAgKFNTTFNlcnZlclNvY2tldCkgc3Nsc3NmLmNyZWF0ZVNlcnZlclNvY2tldChzZXJ2ZXJQb3J0KSkgewotCi0gICAgICAgICAgICBzZXJ2ZXJQb3J0ID0gc3NsU2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7Ci0KLSAgICAgICAgICAgIHRyeSAoU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpc3NsU2VydmVyU29ja2V0LmFjY2VwdCgpKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgICAgICBzc2xJUy5yZWFkKCk7Ci0gICAgICAgICAgICAgICAgc3NsT1Mud3JpdGUoODUpOwotICAgICAgICAgICAgICAgIHNzbE9TLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbFNvY2tldC5nZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gZXhwZWN0ZWQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KLSAgICAgKgotICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKLSAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3Nsc2YgPQotICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCi0gICAgICAgIHRyeSAoU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpc3Nsc2YuY3JlYXRlU29ja2V0KCkpIHsKLQotICAgICAgICAgICAgc3NsU29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RuYW1lLCBzZXJ2ZXJQb3J0KSwgMCk7Ci0KLSAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7Ci0gICAgICAgICAgICBzc2xPUy5mbHVzaCgpOwotICAgICAgICAgICAgc3NsSVMucmVhZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgotICAgICAqLwotCi0gICAgLy8gdXNlIGFueSBmcmVlIHBvcnQgYnkgZGVmYXVsdAotICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHNlcnZlclBvcnQgPSAwOwotCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBrZXlGaWxlbmFtZSA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCi0gICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOwotICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlbmFtZSA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCi0gICAgICAgICAgICAgICAgIi8iICsgdHJ1c3RTdG9yZUZpbGU7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwga2V5RmlsZW5hbWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RGaWxlbmFtZSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOwotCi0gICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuZGVidWciLCAiYWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaG9zdG5hbWUgPSBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRDYW5vbmljYWxIb3N0TmFtZSgpOwotICAgICAgICB9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiB1aGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAiSWdub3JlIHRoZSB0ZXN0IGFzIHRoZSBsb2NhbCBob3N0bmFtZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIlRoZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgb2YgdGhlIGxvY2FsIGhvc3QgaXMgIiArCi0gICAgICAgICAgICAgICAgaG9zdG5hbWUpOwotICAgICAgICAvLyBJZ25vcmUgdGhlIHRlc3QgaWYgdGhlIGhvc3RuYW1lIGRvZXMgbm90IHNvdW5kIGxpa2UgYSBkb21haW4gbmFtZS4KLSAgICAgICAgaWYgKChob3N0bmFtZSA9PSBudWxsKSB8fCBob3N0bmFtZS5pc0VtcHR5KCkgfHwKLSAgICAgICAgICAgICAgICAhaG9zdG5hbWUuY29udGFpbnMoIi4iKSB8fCBob3N0bmFtZS5lbmRzV2l0aCgiLiIpIHx8Ci0gICAgICAgICAgICAgICAgaG9zdG5hbWUuc3RhcnRzV2l0aCgibG9jYWxob3N0IikgfHwKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIuaXNEaWdpdChob3N0bmFtZS5jaGFyQXQoaG9zdG5hbWUubGVuZ3RoKCkgLSAxKSkpIHsKLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZ25vcmUgdGhlIHRlc3QgYXMgdGhlIGxvY2FsIGhvc3RuYW1lICIgKwotICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGRldGVybWluZWQgYXMgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIik7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IHRoZSB0ZXN0cy4KLSAgICAgICAgICovCi0gICAgICAgIG5ldyBCZXN0RWZmb3J0T25MYXp5Q29ubmVjdGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUaHJlYWQgY2xpZW50VGhyZWFkID0gbnVsbDsKLSAgICBwcml2YXRlIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOwotCi0gICAgLyoKLSAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KLSAgICAgKgotICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KLSAgICAgKi8KLSAgICBCZXN0RWZmb3J0T25MYXp5Q29ubmVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOwotICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHN3YWxsb3cgZm9yIG5vdy4gIFNob3cgbGF0ZXIKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdhaXQgZm9yIG90aGVyIHNpZGUgdG8gY2xvc2UgZG93bi4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgewotICAgICAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsaWVudFRocmVhZC5qb2luKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgdGVzdCBpcyBwcmV0dHkgbXVjaCBvdmVyLgotICAgICAgICAgKiBXaGljaCBzaWRlIHRocmV3IHRoZSBlcnJvcj8KLSAgICAgICAgICovCi0gICAgICAgIEV4Y2VwdGlvbiBsb2NhbDsKLSAgICAgICAgRXhjZXB0aW9uIHJlbW90ZTsKLSAgICAgICAgU3RyaW5nIHdoaWNoUmVtb3RlOwotCi0gICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgewotICAgICAgICAgICAgcmVtb3RlID0gc2VydmVyRXhjZXB0aW9uOwotICAgICAgICAgICAgbG9jYWwgPSBjbGllbnRFeGNlcHRpb247Ci0gICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJzZXJ2ZXIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVtb3RlID0gY2xpZW50RXhjZXB0aW9uOwotICAgICAgICAgICAgbG9jYWwgPSBzZXJ2ZXJFeGNlcHRpb247Ci0gICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJjbGllbnQiOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgYm90aCBmYWlsZWQsIHJldHVybiB0aGUgY3VydGhyZWFkJ3MgZXhjZXB0aW9uLCBidXQgYWxzbwotICAgICAgICAgKiBwcmludCB0aGUgcmVtb3RlIHNpZGUgRXhjZXB0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKGxvY2FsICE9IG51bGwpICYmIChyZW1vdGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3aGljaFJlbW90ZSArICIgYWxzbyB0aHJldzoiKTsKLSAgICAgICAgICAgIHJlbW90ZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgICAgICAgdGhyb3cgbG9jYWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVtb3RlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IHJlbW90ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2NhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBsb2NhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuZXdUaHJlYWQpIHsKLSAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnRDbGllbnQoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAobmV3VGhyZWFkKSB7Ci0gICAgICAgICAgICBjbGllbnRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBjbGllbnQgdGhyZWFkIGp1c3QgZGllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGllbnQgZGllZC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBjbGllbnRUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9IZWxsb0NsaWVudC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvSGVsbG9DbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZWYwOC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9IZWxsb0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5Db250ZXh0OwotaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5ybWkuUG9ydGFibGVSZW1vdGVPYmplY3Q7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSGVsbG9DbGllbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfUkVUUlkgPSAxMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE9ORV9TRUNPTkQgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVzcG9uc2VSZWNlaXZlZDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBleGVjdXRlUm1pQ2xpZW50Q2FsbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4ZWN1dGVSbWlDbGllbnRDYWxsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jlc3BvbnNlUmVjZWl2ZWQgKCkgewotICAgICAgICByZXR1cm4gcmVzcG9uc2VSZWNlaXZlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZVJtaUNsaWVudENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29udGV4dCBpYzsKLSAgICAgICAgT2JqZWN0IG9ianJlZjsKLSAgICAgICAgSGVsbG9JbnRlcmZhY2UgaGVsbG9TdmM7Ci0gICAgICAgIFN0cmluZyByZXNwb25zZTsKLSAgICAgICAgT2JqZWN0IHRlc3RSZXNwb25zZTsKLSAgICAgICAgaW50IHJldHJ5Q291bnQgPSAwOwotCi0gICAgICAgIEFycmF5TGlzdDxUZXN0PiBsaXN0UGFyYW0gPSBuZXcgQXJyYXlMaXN0PFRlc3Q+KCk7Ci0gICAgICAgIGxpc3RQYXJhbS5hZGQobnVsbCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG9DbGllbnQubWFpbjogZW50ZXIgLi4uIik7Ci0gICAgICAgIHdoaWxlIChyZXRyeUNvdW50IDwgTUFYX1JFVFJZKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGljID0gbmV3IEluaXRpYWxDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsb0NsaWVudC5tYWluOiBIZWxsb1NlcnZpY2UgbG9va3VwIC4uLiIpOwotICAgICAgICAgICAgICAgIC8vIFNURVAgMTogR2V0IHRoZSBPYmplY3QgcmVmZXJlbmNlIGZyb20gdGhlIE5hbWUgU2VydmljZQotICAgICAgICAgICAgICAgIC8vIHVzaW5nIEpOREkgY2FsbC4KLSAgICAgICAgICAgICAgICBvYmpyZWYgPSBpYy5sb29rdXAoIkhlbGxvU2VydmljZSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG9DbGllbnQ6IE9idGFpbmVkIGEgcmVmLiB0byBIZWxsbyBzZXJ2ZXIuIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBTVEVQIDI6IE5hcnJvdyB0aGUgb2JqZWN0IHJlZmVyZW5jZSB0byB0aGUgY29uY3JldGUgdHlwZSBhbmQKLSAgICAgICAgICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBoZWxsb1N2YyA9IChIZWxsb0ludGVyZmFjZSkgUG9ydGFibGVSZW1vdGVPYmplY3QubmFycm93KG9ianJlZiwKLSAgICAgICAgICAgICAgICAgICAgSGVsbG9JbnRlcmZhY2UuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgVGVzdDMgdGVzdDMgPSBuZXcgVGVzdDMobGlzdFBhcmFtKTsKLSAgICAgICAgICAgICAgICBUZXN0MyB0ZXN0M1Jlc3BvbnNlID0gaGVsbG9TdmMuc2F5SGVsbG9XaXRoVGVzdDModGVzdDMpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIHNheXM6IFRlc3QzIHJlc3BvbnNlICA9PSAgIiArIHRlc3QzUmVzcG9uc2UpOwotCi0gICAgICAgICAgICAgICAgVGVzdDMgdGVzdDNXaXRoTnVsbExpc3QgPSBuZXcgVGVzdDMobnVsbCk7Ci0gICAgICAgICAgICAgICAgdGVzdDNSZXNwb25zZSA9IGhlbGxvU3ZjLnNheUhlbGxvV2l0aFRlc3QzKHRlc3QzV2l0aE51bGxMaXN0KTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlciBzYXlzOiBUZXN0MyByZXNwb25zZSAgPT0gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGVzdDNSZXNwb25zZSk7Ci0KLSAgICAgICAgICAgICAgICBUZXN0NCB0ZXN0NCA9IG5ldyBUZXN0NChsaXN0UGFyYW0pOwotICAgICAgICAgICAgICAgIFRlc3QzIHRlc3Q0UmVzcG9uc2UgPSBoZWxsb1N2Yy5zYXlIZWxsb1dpdGhUZXN0Myh0ZXN0NCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgc2F5czogVGVzdDMgcmVzcG9uc2UgID09ICAiICsgdGVzdDRSZXNwb25zZSk7Ci0KLSAgICAgICAgICAgICAgICByZXNwb25zZVJlY2VpdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBubmZFeCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTmFtZU5vdEZvdW5kRXhjZXB0aW9uIENhdWdodCAgLi4uLiB0cnkgYWdhaW4iKTsKLSAgICAgICAgICAgICAgICByZXRyeUNvdW50Kys7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE9ORV9TRUNPTkQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uICIgKyBlICsgIkNhdWdodCIpOwotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJIZWxsb0NsaWVudCB0ZXJtaW5hdGluZyAiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFRocmVhZC5zbGVlcChPTkVfU0VDT05EKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L0hlbGxvSW1wbC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvSGVsbG9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDA1ZmEuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvSGVsbG9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5ybWkuUG9ydGFibGVSZW1vdGVPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBIZWxsb0ltcGwgZXh0ZW5kcyBQb3J0YWJsZVJlbW90ZU9iamVjdCBpbXBsZW1lbnRzIEhlbGxvSW50ZXJmYWNlIHsKLQotICAgIHB1YmxpYyBIZWxsb0ltcGwoKSB0aHJvd3MgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIoKTsgLy8gaW52b2tlIHJtaSBsaW5raW5nIGFuZCByZW1vdGUgb2JqZWN0IGluaXRpYWxpemF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3QzIHNheUhlbGxvV2l0aFRlc3QzKFRlc3QzIHRlc3QpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNheUhlbGxvVG9UZXN0MzogRU5URVIgIiApOwotCi0gICAgICAgIHJldHVybiB0ZXN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L0hlbGxvSW50ZXJmYWNlLmphdmEgYi9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9IZWxsb0ludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQ1M2ZhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L0hlbGxvSW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKLQotcHVibGljIGludGVyZmFjZSBIZWxsb0ludGVyZmFjZSBleHRlbmRzIFJlbW90ZSB7Ci0gICAgcHVibGljIFRlc3QzIHNheUhlbGxvV2l0aFRlc3QzKCBUZXN0MyB0ZXN0ICkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L0hlbGxvU2VydmVyLmphdmEgYi9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9IZWxsb1NlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFmNDYzLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L0hlbGxvU2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKLWltcG9ydCBqYXZheC5uYW1pbmcuQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhlbGxvU2VydmVyIHsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFVFJZID0gMTA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBPTkVfU0VDT05EID0gMTAwMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaW50IHJldHJ5Q291bnQgPSAwOwotICAgICAgICB3aGlsZSAocmV0cnlDb3VudCA8IE1BWF9SRVRSWSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvL0hlbGxvU2VydmVyLnNldCgiU0VUVElORyBURVNUIElUTCIpOwotICAgICAgICAgICAgICAgIC8vIFN0ZXAgMTogSW5zdGFudGlhdGUgdGhlIEhlbGxvIHNlcnZhbnQKLSAgICAgICAgICAgICAgICBIZWxsb0ltcGwgaGVsbG9SZWYgPSBuZXcgSGVsbG9JbXBsKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTdGVwIDI6IFB1Ymxpc2ggdGhlIHJlZmVyZW5jZSBpbiB0aGUgTmFtaW5nIFNlcnZpY2UKLSAgICAgICAgICAgICAgICAvLyB1c2luZyBKTkRJIEFQSQotICAgICAgICAgICAgICAgIENvbnRleHQgaW5pdGlhbE5hbWluZ0NvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpbml0aWFsTmFtaW5nQ29udGV4dC5yZWJpbmQoIkhlbGxvU2VydmljZSIsIGhlbGxvUmVmKTsKLQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gU2VydmVyOiBSZWFkeS4uLiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlciBpbml0aWFsaXphdGlvbiBwcm9ibGVtOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICByZXRyeUNvdW50Kys7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE9ORV9TRUNPTkQpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGUxLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L1JtaUlpb3BSZXR1cm5WYWx1ZVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L1JtaUlpb3BSZXR1cm5WYWx1ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwZDFiNy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9SbWlJaW9wUmV0dXJuVmFsdWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MTQ2OTc1Ci0gKiBAc3VtbWFyeSB0ZXN0IFJNSS1JSU9QIHdpdGggdmFsdWUgb2JqZWN0IHJldHVybgotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQGJ1aWxkIGpkay50ZXN0bGlicmFyeS4qCi0gKiBAY29tcGlsZSBUZXN0LmphdmEgVGVzdDIuamF2YSBUZXN0My5qYXZhIFRlc3Q0LmphdmEKLSAqIEhlbGxvSW50ZXJmYWNlLmphdmEgSGVsbG9TZXJ2ZXIuamF2YSBIZWxsb0NsaWVudC5qYXZhCi0gKiBIZWxsb0ltcGwuamF2YSBfSGVsbG9JbXBsX1RpZS5qYXZhIF9IZWxsb0ludGVyZmFjZV9TdHViLmphdmEKLSAqIFJtaUlpb3BSZXR1cm5WYWx1ZVRlc3QuamF2YQotICogQHJ1biBtYWluL290aGVydm0gLURqYXZhLm5hbWluZy5wcm92aWRlci51cmw9aWlvcDovL2xvY2FsaG9zdDo1MDUwCi0gKiAgICAgLURqYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWw9Y29tLnN1bi5qbmRpLmNvc25hbWluZy5DTkN0eEZhY3RvcnkKLSAqICAgICBSbWlJaW9wUmV0dXJuVmFsdWVUZXN0IC1wb3J0IDUwNDkKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3NlY3VyZT1qYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyL3BvbGljeT1qdHJlZy50ZXN0LnBvbGljeQotICogICAgIC1EamF2YS5uYW1pbmcucHJvdmlkZXIudXJsPWlpb3A6Ly9sb2NhbGhvc3Q6NTA1MAotICogICAgIC1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPWNvbS5zdW4uam5kaS5jb3NuYW1pbmcuQ05DdHhGYWN0b3J5Ci0gKiAgICAgUm1pSWlvcFJldHVyblZhbHVlVGVzdCAtcG9ydCA1MDQ5Ci0gKi8KLQotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSkRLVG9vbEZpbmRlcjsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSkRLVG9vbExhdW5jaGVyOwotCi1wdWJsaWMgY2xhc3MgUm1pSWlvcFJldHVyblZhbHVlVGVzdCB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQkQgPSBKREtUb29sRmluZGVyLmdldFRlc3RKREtUb29sKCJvcmJkIik7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBID0gSkRLVG9vbEZpbmRlci5nZXRUZXN0SkRLVG9vbCgiamF2YSIpOwotICAgIHN0YXRpYyBmaW5hbCBKREtUb29sTGF1bmNoZXIgb3JiZExhdW5jaGVyID0gSkRLVG9vbExhdW5jaGVyLmNyZWF0ZVVzaW5nVGVzdEpESygib3JiZCIpOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IEZJVkVfU0VDT05EUyA9IDUwMDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUaHJvd2FibGUgY2xpZW50RXhjZXB0aW9uOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhjZXB0aW9uSW5DbGllbnQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUHJvY2VzcyBvcmJkUHJvY2VzczsKLSAgICBwcml2YXRlIHN0YXRpYyBQcm9jZXNzIHJtaVNlcnZlclByb2Nlc3M7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3RhcnRUZXN0Q29tcG9uZW50cygpOwotICAgICAgICBzdG9wVGVzdENvbXBvbmVudHMoKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUZXN0IGNvbXBsZXRlZCBPSyAiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzdGFydFRlc3RDb21wb25lbnRzICgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdGFydE9yYmQoKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKEZJVkVfU0VDT05EUyk7Ci0gICAgICAgIHN0YXJ0Um1pSWlvcFNlcnZlcigpOwotICAgICAgICBUaHJlYWQuc2xlZXAoRklWRV9TRUNPTkRTKTsKLSAgICAgICAgZXhlY3V0ZVJtaUlpb3BDbGllbnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHN0b3BUZXN0Q29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdG9wUm1pSWlvcFNlcnZlcigpOwotICAgICAgICBzdG9wT3JiZCgpOwotICAgICAgICBpZiAoZXhjZXB0aW9uSW5DbGllbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNsaWVudEV4Y2VwdGlvbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWlzUmVzcG9uc2VSZWNlaXZlZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgUmVzcG9uc2Ugbm90IHJlY2VpdmVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzdGFydE9yYmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblN0YXJ0aW5nIG9yYmQgd2l0aCBOUyBwb3J0IDUwNTAgYW5kIGFjdGl2YXRpb24gcG9ydCA1MDQ5ICIpOwotCi0gICAgICAgIC8vb3JiZCAtT1JCSW5pdGlhbEhvc3QgbG9jYWxob3N0IC1PUkJJbml0aWFsUG9ydCA1MDUwIC1wb3J0IDUwNDkKLSAgICAgICAgb3JiZExhdW5jaGVyLmFkZFRvb2xBcmcoIi1PUkJJbml0aWFsSG9zdCIpLmFkZFRvb2xBcmcoImxvY2FsaG9zdCIpCi0gICAgICAgICAgICAuYWRkVG9vbEFyZygiLU9SQkluaXRpYWxQb3J0IikuYWRkVG9vbEFyZygiNTA1MCIpCi0gICAgICAgICAgICAuYWRkVG9vbEFyZygiLXBvcnQiKS5hZGRUb29sQXJnKCI1MDQ5Iik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSbWlJaW9wUmV0dXJuVmFsdWVUZXN0OiBFeGVjdXRpbmc6ICIgKyBBcnJheXMuYXNMaXN0KG9yYmRMYXVuY2hlci5nZXRDb21tYW5kKCkpKTsKLSAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIob3JiZExhdW5jaGVyLmdldENvbW1hbmQoKSk7Ci0gICAgICAgIHBiLnJlZGlyZWN0RXJyb3IoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuSU5IRVJJVCk7Ci0gICAgICAgIG9yYmRQcm9jZXNzID0gcGIuc3RhcnQoKTsKLSAgICB9Ci0KLQotICAgIHN0YXRpYyB2b2lkIHN0YXJ0Um1pSWlvcFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgUm1pSWlvcFNlcnZlciIpOwotICAgICAgICAvLyBqYXZhIC1jcCAuCi0gICAgICAgIC8vIC1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPWNvbS5zdW4uam5kaS5jb3NuYW1pbmcuQ05DdHhGYWN0b3J5Ci0gICAgICAgIC8vIC1EamF2YS5uYW1pbmcucHJvdmlkZXIudXJsPWlpb3A6Ly9sb2NhbGhvc3Q6NTA1MCBIZWxsb1NlcnZlciAtcG9ydCA1MDQ5Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBjb21tYW5kcy5hZGQoUm1pSWlvcFJldHVyblZhbHVlVGVzdC5KQVZBKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKCItRGphdmEubmFtaW5nLmZhY3RvcnkuaW5pdGlhbD1jb20uc3VuLmpuZGkuY29zbmFtaW5nLkNOQ3R4RmFjdG9yeSIpOwotICAgICAgICBjb21tYW5kcy5hZGQoIi1EamF2YS5uYW1pbmcucHJvdmlkZXIudXJsPWlpb3A6Ly9sb2NhbGhvc3Q6NTA1MCIpOwotICAgICAgICBjb21tYW5kcy5hZGQoIi1jcCIpOwotICAgICAgICBjb21tYW5kcy5hZGQoUm1pSWlvcFJldHVyblZhbHVlVGVzdC5DTEFTU1BBVEgpOwotICAgICAgICBjb21tYW5kcy5hZGQoIkhlbGxvU2VydmVyIik7Ci0gICAgICAgIGNvbW1hbmRzLmFkZCgiLXBvcnQiKTsKLSAgICAgICAgY29tbWFuZHMuYWRkKCI1MDQ5Iik7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSbWlJaW9wUmV0dXJuVmFsdWVUZXN0OiBFeGVjdXRpbmc6ICIgKyBjb21tYW5kcyk7Ci0gICAgICAgIFByb2Nlc3NCdWlsZGVyIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKGNvbW1hbmRzKTsKLSAgICAgICAgcGIucmVkaXJlY3RFcnJvcihQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5JTkhFUklUKTsKLSAgICAgICAgcm1pU2VydmVyUHJvY2VzcyA9IHBiLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNSZXNwb25zZVJlY2VpdmVkKCkgewotICAgICAgICByZXR1cm4gSGVsbG9DbGllbnQuaXNSZXNwb25zZVJlY2VpdmVkKCk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc3RvcFJtaUlpb3BTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJtaVNlcnZlclByb2Nlc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSbWlJaW9wUmV0dXJuVmFsdWVUZXN0LnN0b3BSbWlJaW9wU2VydmVyOiBkZXN0cm95IHJtaVNlcnZlclByb2Nlc3MiKTsKLSAgICAgICAgICAgIHJtaVNlcnZlclByb2Nlc3MuZGVzdHJveUZvcmNpYmx5KCk7Ci0gICAgICAgICAgICBybWlTZXJ2ZXJQcm9jZXNzLndhaXRGb3IoKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2VydmVyUHJvY2VzcyBleGl0Q29kZToiCi0gICAgICAgICAgICAgICAgKyBybWlTZXJ2ZXJQcm9jZXNzLmV4aXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHN0b3BPcmJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm1pSWlvcFJldHVyblZhbHVlVGVzdC5zdG9wT3JiZDogZGVzdHJveSBvcmJkUHJvY2VzcyAiKTsKLSAgICAgICAgb3JiZFByb2Nlc3MuZGVzdHJveUZvcmNpYmx5KCk7Ci0gICAgICAgIG9yYmRQcm9jZXNzLndhaXRGb3IoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJvcmJkIGV4aXRDb2RlOiIKLSAgICAgICAgICAgICsgb3JiZFByb2Nlc3MuZXhpdFZhbHVlKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGVSbWlJaW9wQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUm1pSWlvcFJldHVyblZhbHVlVGVzdC5leGVjdXRlUm1pSWlvcENsaWVudDogSGVsbG9DbGllbnQuZXhlY3V0ZVJtaUNsaWVudENhbGwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEhlbGxvQ2xpZW50LmV4ZWN1dGVSbWlDbGllbnRDYWxsKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSB0OwotICAgICAgICAgICAgZXhjZXB0aW9uSW5DbGllbnQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTAzMzFmLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3QgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9UZXN0Mi5qYXZhIGIvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4ZjBhZi4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9UZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdDIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHJpdmF0ZSBpbnQgdGVzdFZhbHVlOwotICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7Ci0gICAgcHJpdmF0ZSBUZXN0IGFUZXN0OwotCi0gICAgcHVibGljIFRlc3QyIChTdHJpbmcgbmFtZSwgaW50IHZhbHVlLCBUZXN0IHRlc3QpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5hVGVzdCA9IHRlc3Q7Ci0gICAgICAgIHRoaXMudGVzdFZhbHVlID0gdmFsdWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdDMuamF2YSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L1Rlc3QzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NmNjMTIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRlc3QzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotICAgIHByaXZhdGUgTGlzdDxUZXN0PiBsaXN0OwotCi0gICAgcHVibGljIFRlc3QzKExpc3Q8VGVzdD4gbGlzdCkgewotICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdDQuamF2YSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L1Rlc3Q0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDVmZjIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvVGVzdDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIFRlc3Q0IGV4dGVuZHMgVGVzdDMgewotCi0gICAgcHJpdmF0ZSBpbnQgYU51bWJlciA9IDE7Ci0KLSAgICBwdWJsaWMgVGVzdDQoTGlzdDxUZXN0PiBsaXN0KSB7Ci0gICAgICAgIHN1cGVyKGxpc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvX0hlbGxvSW1wbF9UaWUuamF2YSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L19IZWxsb0ltcGxfVGllLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yjg1NmIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0LzgxNDY5NzUvX0hlbGxvSW1wbF9UaWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLy8gVGllIGNsYXNzIGdlbmVyYXRlZCBieSBybWljLCBkbyBub3QgZWRpdC4KLS8vIENvbnRlbnRzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLgotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5ybWkuUmVtb3RlOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5ybWkuQ09SQkEuVGllOwotaW1wb3J0IGphdmF4LnJtaS5DT1JCQS5VdGlsOwotaW1wb3J0IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTjsKLWltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKLWltcG9ydCBvcmcub21nLkNPUkJBLlN5c3RlbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVzcG9uc2VIYW5kbGVyOwotaW1wb3J0IG9yZy5vbWcuQ09SQkEucG9ydGFibGUuVW5rbm93bkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PYmplY3RJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBfSGVsbG9JbXBsX1RpZSBleHRlbmRzIE9iamVjdEltcGwgaW1wbGVtZW50cyBUaWUgewotCi0gICAgdm9sYXRpbGUgcHJpdmF0ZSBIZWxsb0ltcGwgdGFyZ2V0ID0gbnVsbDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF90eXBlX2lkcyA9IHsKLSAgICAgICAgIlJNSTpIZWxsb0ludGVyZmFjZTowMDAwMDAwMDAwMDAwMDAwIgotICAgIH07Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoUmVtb3RlIHRhcmdldCkgewotICAgICAgICB0aGlzLnRhcmdldCA9IChIZWxsb0ltcGwpIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVtb3RlIGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3JnLm9tZy5DT1JCQS5PYmplY3QgdGhpc09iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLSAgICAgICAgX29yYigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0gICAgICAgIF9zZXRfZGVsZWdhdGUobnVsbCk7Ci0gICAgICAgIHRhcmdldCA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIE9SQiBvcmIoKSB7Ci0gICAgICAgIHJldHVybiBfb3JiKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb3JiKE9SQiBvcmIpIHsKLSAgICAgICAgb3JiLmNvbm5lY3QodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZ1tdIF9pZHMoKSB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIF90eXBlX2lkcy5jbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gIF9pbnZva2UoU3RyaW5nIG1ldGhvZCwgSW5wdXRTdHJlYW0gX2luLCBSZXNwb25zZUhhbmRsZXIgcmVwbHkpIHRocm93cyBTeXN0ZW1FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSGVsbG9JbXBsIHRhcmdldCA9IHRoaXMudGFyZ2V0OwotICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtIGluID0KLSAgICAgICAgICAgICAgICAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuSW5wdXRTdHJlYW0pIF9pbjsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZXF1YWxzKCJzYXlIZWxsb1dpdGhUZXN0MyIpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdDMgYXJnMCA9IChUZXN0MykgaW4ucmVhZF92YWx1ZShUZXN0My5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgVGVzdDMgcmVzdWx0ID0gdGFyZ2V0LnNheUhlbGxvV2l0aFRlc3QzKGFyZzApOwotICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPQotICAgICAgICAgICAgICAgICAgICAob3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUuT3V0cHV0U3RyZWFtKSByZXBseS5jcmVhdGVSZXBseSgpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZV92YWx1ZShyZXN1bHQsVGVzdDMuY2xhc3MpOwotICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQkFEX09QRVJBVElPTigpOwotICAgICAgICB9IGNhdGNoIChTeXN0ZW1FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbmtub3duRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L19IZWxsb0ludGVyZmFjZV9TdHViLmphdmEgYi9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9fSGVsbG9JbnRlcmZhY2VfU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzA1ODczLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L19IZWxsb0ludGVyZmFjZV9TdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLy8gU3R1YiBjbGFzcyBnZW5lcmF0ZWQgYnkgcm1pYywgZG8gbm90IGVkaXQuCi0vLyBDb250ZW50cyBzdWJqZWN0IHRvIGNoYW5nZSB3aXRob3V0IG5vdGljZS4KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEucm1pLlJlbW90ZTsKLWltcG9ydCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuVW5leHBlY3RlZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5ybWkuQ09SQkEuU3R1YjsKLWltcG9ydCBqYXZheC5ybWkuQ09SQkEuVXRpbDsKLWltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKLWltcG9ydCBvcmcub21nLkNPUkJBLlN5c3RlbUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZXNwb25zZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5TZXJ2YW50T2JqZWN0OwotCi0KLXB1YmxpYyBjbGFzcyBfSGVsbG9JbnRlcmZhY2VfU3R1YiBleHRlbmRzIFN0dWIgaW1wbGVtZW50cyBIZWxsb0ludGVyZmFjZSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBfdHlwZV9pZHMgPSB7Ci0gICAgICAgICJSTUk6SGVsbG9JbnRlcmZhY2U6MDAwMDAwMDAwMDAwMDAwMCIKLSAgICB9OwotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBfaWRzKCkgewotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgX3R5cGVfaWRzLmNsb25lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVGVzdDMgc2F5SGVsbG9XaXRoVGVzdDMoVGVzdDMgYXJnMCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIVV0aWwuaXNMb2NhbCh0aGlzKSkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5PdXRwdXRTdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JlcXVlc3QoInNheUhlbGxvV2l0aFRlc3QzIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVfdmFsdWUoYXJnMCxUZXN0My5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbiA9IChvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZS5JbnB1dFN0cmVhbSlfaW52b2tlKG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFRlc3QzKSBpbi5yZWFkX3ZhbHVlKFRlc3QzLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluID0gKG9yZy5vbWcuQ09SQkFfMl8zLnBvcnRhYmxlLklucHV0U3RyZWFtKSBleC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICRfaWQgPSBpbi5yZWFkX3N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFeGNlcHRpb24oJF9pZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbWFyc2hhbEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNheUhlbGxvV2l0aFRlc3QzKGFyZzApOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseShpbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTeXN0ZW1FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgVXRpbC5tYXBTeXN0ZW1FeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU2VydmFudE9iamVjdCBzbyA9IF9zZXJ2YW50X3ByZWludm9rZSgic2F5SGVsbG9XaXRoVGVzdDMiLEhlbGxvSW50ZXJmYWNlLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc28gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2F5SGVsbG9XaXRoVGVzdDMoYXJnMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3QzIGFyZzBDb3B5ID0gKFRlc3QzKSBVdGlsLmNvcHlPYmplY3QoYXJnMCxfb3JiKCkpOwotICAgICAgICAgICAgICAgICAgICBUZXN0MyByZXN1bHQgPSAoKEhlbGxvSW50ZXJmYWNlKXNvLnNlcnZhbnQpLnNheUhlbGxvV2l0aFRlc3QzKGFyZzBDb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUZXN0MylVdGlsLmNvcHlPYmplY3QocmVzdWx0LF9vcmIoKSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleENvcHkgPSAoVGhyb3dhYmxlKVV0aWwuY29weU9iamVjdChleCxfb3JiKCkpOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBVdGlsLndyYXBFeGNlcHRpb24oZXhDb3B5KTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBfc2VydmFudF9wb3N0aW52b2tlKHNvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvODE0Njk3NS9qdHJlZy50ZXN0LnBvbGljeSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L2p0cmVnLnRlc3QucG9saWN5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmRlMGQ0Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC84MTQ2OTc1L2p0cmVnLnRlc3QucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLQotZ3JhbnQgewotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIioiLCAicmVhZCI7Ci0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiLi8tIiwgInJlYWQsd3JpdGUsZXhlY3V0ZSI7Ci0gIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiKjoqIiwgImNvbm5lY3QsIGFjY2VwdCwgbGlzdGVuLCByZXNvbHZlIjsKLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLmNvbS5zdW4uY29yYmEuc2UuKiI7Ci0gIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4uc2VjdXJpdHkudXRpbCI7Ci0gIHBlcm1pc3Npb24gamF2YS5pby5TZXJpYWxpemFibGVQZXJtaXNzaW9uICJlbmFibGVTdWJjbGFzc0ltcGxlbWVudGF0aW9uIjsKLSAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICIqIiwgInJlYWQsIHdyaXRlIjsKLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiwgInJlYWQsd3JpdGUsZXhlY3V0ZSI7Ci19OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0L0NvbmN1cnJlbnRIYXNoTWFwVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvcm1pL1BvcnRhYmxlUmVtb3RlT2JqZWN0L0NvbmN1cnJlbnRIYXNoTWFwVGVzdC5qYXZhCmluZGV4IDI3YjU3ODIuLjM4MmYyMDEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC9Db25jdXJyZW50SGFzaE1hcFRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvQ29uY3VycmVudEhhc2hNYXBUZXN0LmphdmEKQEAgLTI4LDExICsyOCw3IEBACiAgKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5CiAgKiBAYnVpbGQgamRrLnRlc3RsaWJyYXJ5LioKICAqIEBidWlsZCBUZXN0IEhlbGxvSW50ZXJmYWNlIEhlbGxvU2VydmVyIEhlbGxvQ2xpZW50IEhlbGxvSW1wbCBfSGVsbG9JbXBsX1RpZSBfSGVsbG9JbnRlcmZhY2VfU3R1YiBDb25jdXJyZW50SGFzaE1hcFRlc3QKLSAqIEBydW4gbWFpbi9vdGhlcnZtIC1EamF2YS5uYW1pbmcucHJvdmlkZXIudXJsPWlpb3A6Ly9sb2NhbGhvc3Q6MTA1MAotICogICAgLURqYXZhLm5hbWluZy5mYWN0b3J5LmluaXRpYWw9Y29tLnN1bi5qbmRpLmNvc25hbWluZy5DTkN0eEZhY3RvcnkgIENvbmN1cnJlbnRIYXNoTWFwVGVzdAotICogQHJ1biBtYWluL290aGVydm0vc2VjdXJlPWphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIvcG9saWN5PWp0cmVnLnRlc3QucG9saWN5Ci0gKiAgICAtRGphdmEubmFtaW5nLnByb3ZpZGVyLnVybD1paW9wOi8vbG9jYWxob3N0OjEwNTAKLSAqICAgIC1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPWNvbS5zdW4uam5kaS5jb3NuYW1pbmcuQ05DdHhGYWN0b3J5IENvbmN1cnJlbnRIYXNoTWFwVGVzdAorICogQHJ1biBtYWluL290aGVydm0gLURqYXZhLm5hbWluZy5wcm92aWRlci51cmw9aWlvcDovL2xvY2FsaG9zdDoxMDUwIC1EamF2YS5uYW1pbmcuZmFjdG9yeS5pbml0aWFsPWNvbS5zdW4uam5kaS5jb3NuYW1pbmcuQ05DdHhGYWN0b3J5ICBDb25jdXJyZW50SGFzaE1hcFRlc3QKICAqLwogCiAKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC9qdHJlZy50ZXN0LnBvbGljeSBiL2pkay90ZXN0L2phdmF4L3JtaS9Qb3J0YWJsZVJlbW90ZU9iamVjdC9qdHJlZy50ZXN0LnBvbGljeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkZTBkNC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9ybWkvUG9ydGFibGVSZW1vdGVPYmplY3QvanRyZWcudGVzdC5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotCi1ncmFudCB7Ci0gIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiKiIsICJyZWFkIjsKLSAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIuLy0iLCAicmVhZCx3cml0ZSxleGVjdXRlIjsKLSAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqOioiLCAiY29ubmVjdCwgYWNjZXB0LCBsaXN0ZW4sIHJlc29sdmUiOwotICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2UuY29tLnN1bi5jb3JiYS5zZS4qIjsKLSAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5zZWN1cml0eS51dGlsIjsKLSAgcGVybWlzc2lvbiBqYXZhLmlvLlNlcmlhbGl6YWJsZVBlcm1pc3Npb24gImVuYWJsZVN1YmNsYXNzSW1wbGVtZW50YXRpb24iOwotICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCwgd3JpdGUiOwotICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIjw8QUxMIEZJTEVTPj4iLCAicmVhZCx3cml0ZSxleGVjdXRlIjsKLX07CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL1ByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbi9Nb3JlVGhlbk9uZVByaW5jaXBhbHMuamF2YSBiL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgvUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uL01vcmVUaGVuT25lUHJpbmNpcGFscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY3ZjAxLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgvUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uL01vcmVUaGVuT25lUHJpbmNpcGFscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBjb20uc3VuLnNlY3VyaXR5LmF1dGguTlRVc2VyUHJpbmNpcGFsOwotaW1wb3J0IGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5Vbml4UHJpbmNpcGFsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDUwNDA5Ci0gKiBAc3VtbWFyeSBUZXN0cyB3aXRoIFN1YmplY3QuZ2V0UHJpdmF0ZUNyZWRlbnRpYWxzIHRvIGNoZWNrIHBlcm1pc3Npb24gY2hlY2tzIHdpdGggb25lIG9yIG1vcmUgcHJpbmNpcGFscy4KLSAqIEBydW4gdGVzdG5nL290aGVydm0vcG9saWN5PU1vcmVUaGVuT25lUHJpbmNpcGFscy5wb2xpY3kgTW9yZVRoZW5PbmVQcmluY2lwYWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3JlVGhlbk9uZVByaW5jaXBhbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENSRURfVkFMVUVTID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsidGVzdFByaXZhdGVDcmVkZW50aWFsLTEiLCAidGVzdFByaXZhdGVDcmVkZW50aWFscy0yIn07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaFNldCBDUkVEUyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChDUkVEX1ZBTFVFUykpOwotCi0gICAgLyoqCi0gICAgICogUG9saWN5IGZpbGUgZ3JhbnRzIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBDcmVkZW50aWFsLGJlbG9uZ2luZyB0byBhCi0gICAgICogU3ViamVjdCB3aXRoIGF0IGxlYXN0IHR3byBhc3NvY2lhdGVkIFByaW5jaXBhbHM6ImNvbS5zdW4uc2VjdXJpdHkuYXV0aAotICAgICAqIC5OVFVzZXJQcmluY2lwYWwiLCB3aXRoIHRoZSBuYW1lLCJOVFVzZXJQcmluY2lwYWwtMSIsIGFuZAotICAgICAqICJjb20uc3VuLnNlY3VyaXR5LmF1dGguVW5peFByaW5jaXBhbCIsIHdpdGggdGhlIG5hbWUsICJVbml4UHJpbmNpcGFscy0xIi4KLSAgICAgKgotICAgICAqIEZvciB0ZXN0MSBhbmQgdGVzdDIsIHN1YmplY3RzIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9uZSBvciBvbmx5IG9uZSBvZgotICAgICAqIHByaW5jaXBhbHMgbWVudGlvbmVkIGFib3ZlLCBTZWN1cml0eUV4Y2VwdGlvbiBpcyBleHBlY3RlZC4KLSAgICAgKiBGb3IgdGVzdCAzIGFuZCB0ZXN0IDQsIHN1YmplY3RzIGFyZSBhc3NvY2lhdGVkIHdpdGggdHdvIG9yIG1vcmUKLSAgICAgKiBQcmluY2lwYWxzIChhYm92ZSBwcmluY2lwYWxzIGFyZSBpbmNsdWRlZCksIG5vIGV4Y2VwdGlvbiBpcyBleHBlY3RlZC4KLSAgICAgKgotICAgICAqLwotCi0gICAgQFRlc3QoZGF0YVByb3ZpZGVyID0gIlByb3ZpZGVyMSIsIGV4cGVjdGVkRXhjZXB0aW9ucyA9IFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3QxKFN1YmplY3QgcykgewotICAgICAgICBzLmdldFByaXZhdGVDcmVkZW50aWFscyhTdHJpbmcuY2xhc3MpOwotICAgIH0KLQotICAgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJQcm92aWRlcjEiLCBleHBlY3RlZEV4Y2VwdGlvbnMgPSBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MihTdWJqZWN0IHMpIHsKLSAgICAgICAgcy5nZXRQcml2YXRlQ3JlZGVudGlhbHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiUHJvdmlkZXIyIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MyhTdWJqZWN0IHMpIHsKLSAgICAgICAgcy5nZXRQcml2YXRlQ3JlZGVudGlhbHMoU3RyaW5nLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAiUHJvdmlkZXIyIikKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NChTdWJqZWN0IHMpIHsKLSAgICAgICAgcy5nZXRQcml2YXRlQ3JlZGVudGlhbHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci0KLSAgICBARGF0YVByb3ZpZGVyCi0gICAgcHVibGljIE9iamVjdFtdW10gUHJvdmlkZXIxKCkgewotICAgICAgICBTdWJqZWN0IHMxID0gbmV3IFN1YmplY3QoZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDUkVEUyk7Ci0gICAgICAgIHMxLmdldFByaW5jaXBhbHMoKS5hZGQobmV3IE5UVXNlclByaW5jaXBhbCgiTlRVc2VyUHJpbmNpcGFsLTIiKSk7Ci0gICAgICAgIFN1YmplY3QgczIgPSBuZXcgU3ViamVjdChmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENSRURTKTsKLSAgICAgICAgczIuZ2V0UHJpbmNpcGFscygpLmFkZChuZXcgTlRVc2VyUHJpbmNpcGFsKCJOVFVzZXJQcmluY2lwYWwtMSIpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtde3tzMX0sIHtzMn19OwotICAgIH0KLQotICAgIEBEYXRhUHJvdmlkZXIKLSAgICBwdWJsaWMgT2JqZWN0W11bXSBQcm92aWRlcjIoKSB7Ci0gICAgICAgIFN1YmplY3QgczMgPSBuZXcgU3ViamVjdChmYWxzZSwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENSRURTKTsKLSAgICAgICAgczMuZ2V0UHJpbmNpcGFscygpLmFkZChuZXcgTlRVc2VyUHJpbmNpcGFsKCJOVFVzZXJQcmluY2lwYWwtMSIpKTsKLSAgICAgICAgczMuZ2V0UHJpbmNpcGFscygpLmFkZChuZXcgVW5peFByaW5jaXBhbCgiVW5peFByaW5jaXBhbHMtMSIpKTsKLSAgICAgICAgU3ViamVjdCBzNCA9IG5ldyBTdWJqZWN0KGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCwgQ1JFRFMpOwotICAgICAgICBzNC5nZXRQcmluY2lwYWxzKCkuYWRkKG5ldyBOVFVzZXJQcmluY2lwYWwoIk5UVXNlclByaW5jaXBhbC0xIikpOwotICAgICAgICBzNC5nZXRQcmluY2lwYWxzKCkuYWRkKG5ldyBVbml4UHJpbmNpcGFsKCJVbml4UHJpbmNpcGFscy0xIikpOwotICAgICAgICBzNC5nZXRQcmluY2lwYWxzKCkuYWRkKG5ldyBVbml4UHJpbmNpcGFsKCJVbml4UHJpbmNpcGFscy0yIikpOwotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW117e3MzfSwge3M0fX07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL1ByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbi9Nb3JlVGhlbk9uZVByaW5jaXBhbHMucG9saWN5IGIvamRrL3Rlc3QvamF2YXgvc2VjdXJpdHkvYXV0aC9Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24vTW9yZVRoZW5PbmVQcmluY2lwYWxzLnBvbGljeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1NjkwMC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL1ByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbi9Nb3JlVGhlbk9uZVByaW5jaXBhbHMucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotZ3JhbnR7Ci0vLyBwZXJtaXNzaW9ucyBmb3IgVGVzdE5HIGV4ZWN1dGlvbgotcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIqIiwicmVhZCx3cml0ZSI7Ci1wZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKLXBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiKiIsInJlYWQiOwotcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOwotLy8gcGVybWlzc2lvbnMgZm9yIHRlc3QgaXRzZWxmCi1wZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gIm1vZGlmeVByaW5jaXBhbHMiOwotcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbiAiKiBjb20uc3VuLnNlY3VyaXR5LmF1dGguTlRVc2VyUHJpbmNpcGFsIFwiTlRVc2VyUHJpbmNpcGFsLTFcIiBjb20uc3VuLnNlY3VyaXR5LmF1dGguVW5peFByaW5jaXBhbCBcIlVuaXhQcmluY2lwYWxzLTFcIiIsICJyZWFkIjsKLX07CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3QvZG9Bcy9OZXN0ZWRBY3Rpb25zLmphdmEgYi9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL1N1YmplY3QvZG9Bcy9OZXN0ZWRBY3Rpb25zLmphdmEKaW5kZXggYTRmMjQ5ZS4uZjAyYjJmZiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YXgvc2VjdXJpdHkvYXV0aC9TdWJqZWN0L2RvQXMvTmVzdGVkQWN0aW9ucy5qYXZhCisrKyBiL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgvU3ViamVjdC9kb0FzL05lc3RlZEFjdGlvbnMuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogICovCiAKIGltcG9ydCBqZGsudGVzdGxpYnJhcnkuUHJvY2Vzc1Rvb2xzOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5KYXJVdGlsczsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAuWDUwMFByaW5jaXBhbDsKQEAgLTM2LDcgKzM1LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIAogLyoqCiAgKiBAdGVzdApAQCAtMTAxLDcgKzk5LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICBpZiAoImphciIuZXF1YWxzKGFyZ3NbMF0pICYmIGFyZ3MubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihhcmdzWzFdLCBQYXRocy5nZXQoVEVTVF9DTEFTU0VTICsgRlMpLAorICAgICAgICAgICAgICAgIGNyZWF0ZUphcihhcmdzWzFdLAogICAgICAgICAgICAgICAgICAgICBBcnJheXMuY29weU9mUmFuZ2UoYXJncywgMiwgYXJncy5sZW5ndGgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcnVuSmF2YShhcmdzKTsKQEAgLTExMSw3ICsxMDksMjQgQEAKICAgICAgICAgfQogICAgIH0KIAotCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSmFyKFN0cmluZyBkZXN0LCBTdHJpbmcuLi4gZmlsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlYXRlICIgKyBkZXN0ICsgIiB3aXRoIHRoZSBmb2xsb3dpbmcgY29udGVudDoiKTsKKyAgICAgICAgdHJ5IChKYXJPdXRwdXRTdHJlYW0gam9zID0gbmV3IEphck91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KSwgbmV3IE1hbmlmZXN0KCkpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIiArIGZpbGUpOworICAgICAgICAgICAgICAgIGpvcy5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KGZpbGUpKTsKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9DTEFTU0VTICsgRlMgKyBmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgICAgIGludCByZWFkOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBmaXMucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpvcy53cml0ZShidWZmZXIsIDAsIHJlYWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgc3RhdGljIHZvaWQgcnVuSmF2YShTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIGlmIChhcmdzID09IG51bGwgfHwgYXJncy5sZW5ndGggPCAzKSB7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL0tlcmJlcm9zVGl4RGF0ZVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvS2VyYmVyb3NUaXhEYXRlVGVzdC5qYXZhCmluZGV4IDg5ZDM4YmMuLmMwNjFkMWIgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvS2VyYmVyb3NUaXhEYXRlVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmF4L3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvS2VyYmVyb3NUaXhEYXRlVGVzdC5qYXZhCkBAIC0yMywxOCArMjMsMTUgQEAKIAogLyoKICAqIEB0ZXN0Ci0gKiBAYnVnIDY2NTk5OTAgODE0Nzc3MgotICogQHN1bW1hcnkgdGVzdCB0aGUgaW1tdXRhYmlsaXR5IG9mIHRoZSBEYXRlIGZpZWxkcyBpbiBLZXJiZXJvc1RpY2tldCBjbGFzcywKLSAqICAgICAgICAgIHNlcmlhbGl6YXRpb24sIGFuZCBiZWhhdmlvciBhZnRlciBiZWluZyBkZXN0cm95ZWQuCisgKiBAYnVnIDY2NTk5OTAKKyAqIEBzdW1tYXJ5IHRlc3QgdGhlIGltbXV0YWJpbGl0eSBvZiB0aGUgRGF0ZSBmaWVsZHMgaW4gS2VyYmVyb3NUaWNrZXQgY2xhc3MuCiAgKiBAaWdub3JlIE11c3Qgc2V0IHVwIEtEQyBhbmQgc2V0dXAgS2VyYmVyb3MgY29uZmlndXJhdGlvbiBmaWxlCiAgKi8KIAotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlJlZnJlc2hGYWlsZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5LZXJiZXJvc0tleTsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLktlcmJlcm9zUHJpbmNpcGFsOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuS2VyYmVyb3NUaWNrZXQ7CiBpbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKQEAgLTc4LDcgKzc1LDYgQEAKIAogICAgICAgICB0ZXN0RGF0ZUltbXV0YWJpbGl0eSh0LCBvcmlnaW5hbFRpbWUpOwogICAgICAgICB0ZXN0UzExbkNvbXBhdGliaWxpdHkodCk7IC8vIFMxMW46IFNlcmlhbGl6YXRpb24KLSAgICAgICAgdGVzdERlc3Ryb3kodCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1RpbWUoS2VyYmVyb3NUaWNrZXQga3QsIGxvbmcgdGltZVZhbHVlKSB7CkBAIC0xNDEsMzAgKzEzNyw0IEBACiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTMTFuQ29tcGF0aWJpbGl0eSBUZXN0IFBhc3NlZCIpOwogICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdERlc3Ryb3koS2VyYmVyb3NUaWNrZXQgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHQuZGVzdHJveSgpOwotICAgICAgICBpZiAoIXQuaXNEZXN0cm95ZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInRpY2tldCBzaG91bGQgaGF2ZSBiZWVuIGRlc3Ryb3llZCIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFsdGhvdWdoIHRoZXNlIG1ldGhvZHMgYXJlIG1lYW5pbmdsZXNzLCB0aGV5IGNhbiBiZSBjYWxsZWQKLSAgICAgICAgZm9yIChNZXRob2QgbTogS2VyYmVyb3NUaWNrZXQuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKQotICAgICAgICAgICAgICAgICAgICAmJiBtLmdldFBhcmFtZXRlckNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdGluZyAiICsgbS5nZXROYW1lKCkgKyAiLi4uIik7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UodCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgUmVmcmVzaEZhaWxlZEV4Y2VwdGlvbiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlIGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIE9LCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzdHJveSBUZXN0IFBhc3NlZCIpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3NtYXJ0Y2FyZGlvL0NvbW1hbmRBUERVVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvc21hcnRjYXJkaW8vQ29tbWFuZEFQRFVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Y2U1YzYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc21hcnRjYXJkaW8vQ29tbWFuZEFQRFVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ5MDIxCi0gKiBAc3VtbWFyeSBUZXN0IGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgZm9yIENvbW1hbmRBUERVIGFuZCBjaGVjayBDTEEsSU5TLE5DLE5FLAotICogUDEsYW5kIFAyCi0gKiBAcnVuIHRlc3RuZyBDb21tYW5kQVBEVVRlc3QKLSAqLwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YXguc21hcnRjYXJkaW8uQ29tbWFuZEFQRFU7Ci1pbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0Lio7Ci1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQVBEVVRlc3QgewotCi0gICAgc3RhdGljIGZpbmFsIGJ5dGVbXSBDMSA9IHsoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4QTQsIChieXRlKSAweDA0LAotICAgICAgICAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDcsIChieXRlKSAweEEwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsCi0gICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHg2MiwgKGJ5dGUpIDB4ODEsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMH07Ci0gICAgc3RhdGljIGludCBjbGEsIGlucywgbmMsIG5lLCBwMSwgcDI7Ci0gICAgc3RhdGljIGJ5dGVbXSBhcGR1LCBkYXRhOwotICAgIHN0YXRpYyBDb21tYW5kQVBEVSBjbTEsIGNtMiwgY20zLCBjbTQsIGNtNSwgY202LCBjbTcsIGNtOCwgY205OwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy9leHBlY3RlZCB2YWx1ZXMgb2YgYXBkdSwgZGF0YSwgaGVhZGVycywgbmMsIG5lCi0gICAgICAgIENvbW1hbmRBUERVIGNhcGR1ID0gbmV3IENvbW1hbmRBUERVKEMxKTsKLSAgICAgICAgYXBkdSA9IGNhcGR1LmdldEJ5dGVzKCk7Ci0gICAgICAgIGRhdGEgPSBjYXBkdS5nZXREYXRhKCk7Ci0KLSAgICAgICAgY2xhID0gY2FwZHUuZ2V0Q0xBKCk7Ci0gICAgICAgIGlmIChjbGEgIT0gKEMxWzBdICYgMHhmZikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsdXJlOiBjbGEgaXMgbm90IHJpZ2h0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnMgPSBjYXBkdS5nZXRJTlMoKTsKLSAgICAgICAgaWYgKGlucyAhPSAoQzFbMV0gJiAweGZmKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWx1cmU6IGlucyBpcyBub3QgcmlnaHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHAxID0gY2FwZHUuZ2V0UDEoKTsKLSAgICAgICAgaWYgKHAxICE9IChDMVsyXSAmIDB4ZmYpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbHVyZTogcDEgaXMgbm90IHJpZ2h0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwMiA9IGNhcGR1LmdldFAyKCk7Ci0gICAgICAgIGlmIChwMiAhPSAoQzFbM10gJiAweGZmKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWx1cmU6IHAyIGlzIG5vdCByaWdodCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbmMgPSBjYXBkdS5nZXROYygpOwotICAgICAgICBuZSA9IGNhcGR1LmdldE5lKCk7Ci0KLSAgICAgICAgLy9UZXN0IG9uIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMKLSAgICAgICAgY20xID0gbmV3IENvbW1hbmRBUERVKGFwZHUpOwotICAgICAgICBjbTIgPSBuZXcgQ29tbWFuZEFQRFUoY2xhLCBpbnMsIHAxLCBwMik7Ci0gICAgICAgIGNtMyA9IG5ldyBDb21tYW5kQVBEVShjbGEsIGlucywgcDEsIHAyLCBkYXRhKTsKLSAgICAgICAgY200ID0gbmV3IENvbW1hbmRBUERVKGNsYSwgaW5zLCBwMSwgcDIsIGRhdGEsIG5lKTsKLSAgICAgICAgY201ID0gbmV3IENvbW1hbmRBUERVKGNsYSwgaW5zLCBwMSwgcDIsIG5lKTsKLSAgICAgICAgY202ID0gbmV3IENvbW1hbmRBUERVKEJ5dGVCdWZmZXIud3JhcChhcGR1KSk7Ci0gICAgICAgIGNtNyA9IG5ldyBDb21tYW5kQVBEVShhcGR1LCAwLCBhcGR1Lmxlbmd0aCk7Ci0gICAgICAgIGNtOCA9IG5ldyBDb21tYW5kQVBEVShjbGEsIGlucywgcDEsIHAyLCBkYXRhLCAwLCBuYyk7Ci0gICAgICAgIGNtOSA9IG5ldyBDb21tYW5kQVBEVShjbGEsIGlucywgcDEsIHAyLCBkYXRhLCAwLCBuYywgbmUpOwotICAgIH0KLQotICAgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJwcm92aWRlcjEiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SGVhZGVycyhDb21tYW5kQVBEVSBjbSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoY2xhLCBjbS5nZXRDTEEoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhpbnMsIGNtLmdldElOUygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHAxLCBjbS5nZXRQMSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHAyLCBjbS5nZXRQMigpKTsKLSAgICB9Ci0KLSAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAicHJvdmlkZXIyIikKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdEFQRFUoQ29tbWFuZEFQRFUgY20pIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGFwZHUsIGNtLmdldEJ5dGVzKCkpOwotICAgIH0KLQotICAgIEBUZXN0KGRhdGFQcm92aWRlciA9ICJwcm92aWRlcjMiKQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0RGF0YShDb21tYW5kQVBEVSBjbSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoZGF0YSwgY20uZ2V0RGF0YSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdChkYXRhUHJvdmlkZXIgPSAicHJvdmlkZXIzIikKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE5DKENvbW1hbmRBUERVIGNtKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuYywgY20uZ2V0TmMoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QoZGF0YVByb3ZpZGVyID0gInByb3ZpZGVyNCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RORShDb21tYW5kQVBEVSBjbSkgewotICAgICAgICBhc3NlcnRFcXVhbHMobmUsIGNtLmdldE5lKCkpOwotICAgIH0KLQotICAgIEBEYXRhUHJvdmlkZXIKLSAgICBwdWJsaWMgT2JqZWN0W11bXSBwcm92aWRlcjEoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgT2JqZWN0W11bXXt7Y20xfSwge2NtMn0sIHtjbTN9LCB7Y200fSwge2NtNX0sIHtjbTZ9LCB7Y203fSwKLSAgICAgICAge2NtOH0sIHtjbTl9fTsKLSAgICB9Ci0KLSAgICBARGF0YVByb3ZpZGVyCi0gICAgcHVibGljIE9iamVjdFtdW10gcHJvdmlkZXIyKCkgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW117e2NtMX0sIHtjbTZ9LCB7Y203fX07Ci0gICAgfQotCi0gICAgQERhdGFQcm92aWRlcgotICAgIHB1YmxpYyBPYmplY3RbXVtdIHByb3ZpZGVyMygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXVtde3tjbTF9LCB7Y20zfSwge2NtNH0sIHtjbTZ9LCB7Y203fSwge2NtOH0sIHtjbTl9fTsKLSAgICB9Ci0KLSAgICBARGF0YVByb3ZpZGVyCi0gICAgcHVibGljIE9iamVjdFtdW10gcHJvdmlkZXI0KCkgewotICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdW117e2NtMX0sIHtjbTR9LCB7Y201fSwge2NtNn0sIHtjbTd9LCB7Y205fX07Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9SZXNwb25zZUFQRFVUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9SZXNwb25zZUFQRFVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NWNkMTIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc21hcnRjYXJkaW8vUmVzcG9uc2VBUERVVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ5MDIxCi0gKiBAc3VtbWFyeSBDb25zdHJ1Y3QgUmVzcG9uc2VBUERVIGZyb20gYnl0ZSBhcnJheSBhbmQgY2hlY2sgTlI8IFNXLCBTVzEgYW5kIFNXMgotICogQHJ1biB0ZXN0bmcgUmVzcG9uc2VBUERVVGVzdAotICovCi1pbXBvcnQgamF2YXguc21hcnRjYXJkaW8uUmVzcG9uc2VBUERVOwotaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC4qOwotaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OwotCi1wdWJsaWMgY2xhc3MgUmVzcG9uc2VBUERVVGVzdCB7Ci0KLSAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIFIxID0geyhieXRlKSAweDA3LCAoYnl0ZSkgMHhBMCwgKGJ5dGUpIDB4MDAsCi0gICAgICAgIChieXRlKSAweDAwLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4NjIsIChieXRlKSAweDgxLCAoYnl0ZSkgMHgwMSwKLSAgICAgICAgKGJ5dGUpIDB4MDQsIChieXRlKSAweDAxLCAoYnl0ZSkgMHgwMCwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDI0LAotICAgICAgICAoYnl0ZSkgMHgwNSwgKGJ5dGUpIDB4MDAsIChieXRlKSAweDBCLCAoYnl0ZSkgMHgwNCwgKGJ5dGUpIDB4QjAsCi0gICAgICAgIChieXRlKSAweDI1LCAoYnl0ZSkgMHg5MCwgKGJ5dGUpIDB4MDB9OwotICAgIHN0YXRpYyBmaW5hbCBSZXNwb25zZUFQRFUgUkFQRFUgPSBuZXcgUmVzcG9uc2VBUERVKFIxKTsKLSAgICBzdGF0aWMgYnl0ZVtdIGV4cGVjdGVkRGF0YTsKLSAgICBzdGF0aWMgaW50IGV4cGVjdGVkTnIsIGV4cGVjdGVkU3cxLCBleHBlY3RlZFN3MiwgZXhwZWN0ZWRTdzsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vZXhwZWN0ZWQgdmFsdWVzIGZvciBkYXRhLG5yLHN3MSxzdzIgYW5kIHN3Ci0KLSAgICAgICAgaW50IGFwZHVMZW4gPSBSMS5sZW5ndGg7Ci0gICAgICAgIGV4cGVjdGVkRGF0YSA9IG5ldyBieXRlW2FwZHVMZW4gLSAyXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoYXBkdUxlbiAtIDIpOyBpKyspIHsKLSAgICAgICAgICAgIGV4cGVjdGVkRGF0YVtpXSA9IFIxW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgZXhwZWN0ZWROciA9IGV4cGVjdGVkRGF0YS5sZW5ndGg7Ci0gICAgICAgIGV4cGVjdGVkU3cxID0gUjFbYXBkdUxlbiAtIDJdICYgMHhmZjsKLSAgICAgICAgZXhwZWN0ZWRTdzIgPSBSMVthcGR1TGVuIC0gMV0gJiAweGZmOwotICAgICAgICBleHBlY3RlZFN3ID0gKGV4cGVjdGVkU3cxIDw8IDgpIHwgZXhwZWN0ZWRTdzI7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFJBUERVLmdldEJ5dGVzKCksIFIxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFJBUERVLmdldERhdGEoKSwgZXhwZWN0ZWREYXRhKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFJBUERVLmdldE5yKCksIGV4cGVjdGVkTnIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUkFQRFUuZ2V0U1coKSwgZXhwZWN0ZWRTdyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhSQVBEVS5nZXRTVzEoKSwgZXhwZWN0ZWRTdzEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoUkFQRFUuZ2V0U1cyKCksIGV4cGVjdGVkU3cyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9UZXJtaW5hbEZhY3RvcnlTcGlUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9UZXJtaW5hbEZhY3RvcnlTcGlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYzRjNDQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc21hcnRjYXJkaW8vVGVybWluYWxGYWN0b3J5U3BpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ5MDIxCi0gKiBAc3VtbWFyeSBUZXN0IGlmIHdlIGNhbiB3cml0ZSBuZXcgcHJvdmlkZXIgZm9yIHNtYXJ0IGNhcmQKLSAqIEBydW4gbWFpbi9vdGhlcnZtL3BvbGljeT1wb2xpY3kgVGVybWluYWxGYWN0b3J5U3BpVGVzdAotICovCi1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YXguc21hcnRjYXJkaW8uQ2FyZFRlcm1pbmFsczsKLWltcG9ydCBqYXZheC5zbWFydGNhcmRpby5UZXJtaW5hbEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc21hcnRjYXJkaW8uVGVybWluYWxGYWN0b3J5U3BpOwotCi1wdWJsaWMgY2xhc3MgVGVybWluYWxGYWN0b3J5U3BpVGVzdCB7Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjYWxsTWV0aG9kID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvdmlkZXIgbXlQcm92aWRlciA9IG5ldyBNeVByb3ZpZGVyKCk7Ci0gICAgICAgIFNlY3VyaXR5LmFkZFByb3ZpZGVyKG15UHJvdmlkZXIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLmFzTGlzdChTZWN1cml0eS5nZXRQcm92aWRlcnMoKSkpOwotCi0gICAgICAgIFRlcm1pbmFsRmFjdG9yeS5nZXRJbnN0YW5jZSgiTXlUeXBlIiwgbmV3IE9iamVjdCgpKS50ZXJtaW5hbHMoKTsKLSAgICAgICAgaWYgKCFjYWxsTWV0aG9kKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZW5naW5lVGVybWluYWxzKCkgbm90IGNhbGxlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIgewotCi0gICAgICAgIE15UHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICBzdXBlcigiTXlQcm92aWRlciIsIDEuMGQsICJzbWFydCBDYXJkIEV4YW1wbGUiKTsKLSAgICAgICAgICAgIHB1dCgiVGVybWluYWxGYWN0b3J5Lk15VHlwZSIsICJUZXJtaW5hbEZhY3RvcnlTcGlUZXN0JE15VGVybWluYWxGYWN0b3J5U3BpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGVybWluYWxGYWN0b3J5U3BpIGV4dGVuZHMgVGVybWluYWxGYWN0b3J5U3BpIHsKLQotICAgICAgICBwdWJsaWMgTXlUZXJtaW5hbEZhY3RvcnlTcGkoT2JqZWN0IG9iKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgQ2FyZFRlcm1pbmFscyBlbmdpbmVUZXJtaW5hbHMoKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk15VGVybWluYWxGYWN0b3J5LmVuZ2luZVRlcm1pbmFscygpIik7Ci0gICAgICAgICAgICBjYWxsTWV0aG9kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9wb2xpY3kgYi9qZGsvdGVzdC9qYXZheC9zbWFydGNhcmRpby9wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg5MmUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc21hcnRjYXJkaW8vcG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1ncmFudCB7Ci0gICAgICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gImluc2VydFByb3ZpZGVyLk15UHJvdmlkZXIiOwotICAgICAgICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuU2VjdXJpdHlQZXJtaXNzaW9uICJwdXRQcm92aWRlclByb3BlcnR5Lk15UHJvdmlkZXIiOwotfTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3N3aW5nL0pDb21ib0JveC84MTM2OTk4L2J1ZzgxMzY5OTguamF2YSBiL2pkay90ZXN0L2phdmF4L3N3aW5nL0pDb21ib0JveC84MTM2OTk4L2J1ZzgxMzY5OTguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkOWUwYS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9zd2luZy9KQ29tYm9Cb3gvODEzNjk5OC9idWc4MTM2OTk4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmF3dC5BV1RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLmF3dC5Sb2JvdDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm94TGF5b3V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nVXRpbGl0aWVzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXIuTG9va0FuZEZlZWxJbmZvOwotaW1wb3J0IGphdmF4LnN3aW5nLlVuc3VwcG9ydGVkTG9va0FuZEZlZWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi0vKiBAdGVzdAotICogQGJ1ZyA4MTM2OTk4Ci0gKiBAc3VtbWFyeSBDaGVja3MgdGhhdCBKQ29tYm9Cb3ggZG9lcyBub3QgcHJldmVudCBtb3VzZS13aGVlbCBzY3JvbGxpbmcgSlNjcm9sbFBhbmUuCi0gKiBAbGlicmFyeSAuLi8uLi9yZWd0ZXN0aGVscGVycwotICogQGJ1aWxkIFV0aWwKLSAqIEBydW4gbWFpbiBidWc4MTM2OTk4Ci0gKiBAYXV0aG9yIEFsZXhleSBJdmFub3YKLSAqLwotcHVibGljIGNsYXNzIGJ1ZzgxMzY5OTggewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSVRFTVMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAiQSIsICJCIiwgIkMiLCAiRCIsICJFIiwgIkYiCi0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgUm9ib3Qgcm9ib3Q7Ci0KLSAgICBwcml2YXRlIEpGcmFtZSBmcmFtZTsKLSAgICBwcml2YXRlIEpDb21ib0JveCBjb21ib0JveDsKLSAgICBwcml2YXRlIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaXRlcmF0ZUxvb2tBbmRGZWVscyhuZXcgYnVnODEzNjk5OCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaXRlcmF0ZUxvb2tBbmRGZWVscyhmaW5hbCBidWc4MTM2OTk4IHRlc3QpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb29rQW5kRmVlbEluZm9bXSBsYWZJbmZvID0gVUlNYW5hZ2VyLmdldEluc3RhbGxlZExvb2tBbmRGZWVscygpOwotICAgICAgICBmb3IgKExvb2tBbmRGZWVsSW5mbyBpbmZvIDogbGFmSW5mbykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoaW5mby5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb29rIGFuZCBGZWVsOiAiICsgaW5mby5nZXRDbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgdGVzdC5ydW5UZXN0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIHVuc3VwcG9ydGVkIExhRjogIiArIGluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJ1ZzgxMzY5OTgoKSB0aHJvd3MgQVdURXhjZXB0aW9uIHsKLSAgICAgICAgcm9ib3QgPSBuZXcgUm9ib3QoKTsKLSAgICAgICAgcm9ib3Quc2V0QXV0b0RlbGF5KDIwMCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldHVwVUkoKSB7Ci0gICAgICAgIGZyYW1lID0gbmV3IEpGcmFtZSgpOwotICAgICAgICBmcmFtZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkVYSVRfT05fQ0xPU0UpOwotCi0gICAgICAgIGNvbWJvQm94ID0gbmV3IEpDb21ib0JveDw+KElURU1TKTsKLQotICAgICAgICBKUGFuZWwgc2Nyb2xsYWJsZSA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgc2Nyb2xsYWJsZS5zZXRMYXlvdXQobmV3IEJveExheW91dChzY3JvbGxhYmxlLCBCb3hMYXlvdXQuWV9BWElTKSk7Ci0KLSAgICAgICAgc2Nyb2xsYWJsZS5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMjAwKSk7Ci0gICAgICAgIHNjcm9sbGFibGUuYWRkKGNvbWJvQm94KTsKLSAgICAgICAgc2Nyb2xsYWJsZS5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMjAwKSk7Ci0KLSAgICAgICAgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZShzY3JvbGxhYmxlKTsKLQotICAgICAgICBmcmFtZS5hZGQoc2Nyb2xsUGFuZSk7Ci0KLSAgICAgICAgZnJhbWUuc2V0U2l6ZSgxMDAsIDIwMCk7Ci0gICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdCh0aGlzOjpzZXR1cFVJKTsKLQotICAgICAgICAgICAgcm9ib3Qud2FpdEZvcklkbGUoKTsKLQotICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdCgoKSAtPgotICAgICAgICAgICAgICAgIHNjcm9sbFBhbmUuZ2V0Vmlld3BvcnQoKS5zY3JvbGxSZWN0VG9WaXNpYmxlKGNvbWJvQm94LmdldEJvdW5kcygpKQotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIHJvYm90LndhaXRGb3JJZGxlKCk7Ci0KLSAgICAgICAgICAgIC8vIE1vdmUgbW91c2UgcG9pbnRlciB0byB0aGUgY2VudGVyIG9mIHRoZSBjb21ibyBib3gKLSAgICAgICAgICAgIFBvaW50IHAgPSBjb21ib0JveC5nZXRMb2NhdGlvbk9uU2NyZWVuKCk7Ci0gICAgICAgICAgICBEaW1lbnNpb24gZCA9IGNvbWJvQm94LmdldFNpemUoKTsKLSAgICAgICAgICAgIHJvYm90Lm1vdXNlTW92ZShwLnggKyBkLndpZHRoIC8gMiwgcC55ICsgZC5oZWlnaHQgLyAyKTsKLQotICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSB2aXNpYmxlIHJlY3RhbmdsZSBpbiBzY3JvbGxQYW5lCi0gICAgICAgICAgICBSZWN0YW5nbGUgdmlld1JlY3QwID0gVXRpbC5pbnZva2VPbkVEVChzY3JvbGxQYW5lLmdldFZpZXdwb3J0KCk6OmdldFZpZXdSZWN0KTsKLQotICAgICAgICAgICAgLy8gU2Nyb2xsIHRoZSBzY3JvbGxQYW5lIHdpdGggbW91c2Ugd2hlZWwKLSAgICAgICAgICAgIHJvYm90Lm1vdXNlV2hlZWwoMSk7Ci0gICAgICAgICAgICByb2JvdC53YWl0Rm9ySWRsZSgpOwotCi0gICAgICAgICAgICAvLyBUaGUgdXBkYXRlZCByZWN0YW5nbGUKLSAgICAgICAgICAgIFJlY3RhbmdsZSB2aWV3UmVjdDEgPSBVdGlsLmludm9rZU9uRURUKHNjcm9sbFBhbmUuZ2V0Vmlld3BvcnQoKTo6Z2V0Vmlld1JlY3QpOwotCi0gICAgICAgICAgICBpZiAodmlld1JlY3QwLnkgPT0gdmlld1JlY3QxLnkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTW91c2Ugd2hlZWwgc2hvdWxkIGhhdmUgc2Nyb2xsZWQgdGhlIEpTY3JvbGxQYW5lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy9KUHJvZ3Jlc3NCYXIvODE2MTY2NC9Qcm9ncmVzc0Jhck1lbW9yeUxlYWtUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zd2luZy9KUHJvZ3Jlc3NCYXIvODE2MTY2NC9Qcm9ncmVzc0Jhck1lbW9yeUxlYWtUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MmFhY2IuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc3dpbmcvSlByb2dyZXNzQmFyLzgxNjE2NjQvUHJvZ3Jlc3NCYXJNZW1vcnlMZWFrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNjE2NjQKLSAqIEBzdW1tYXJ5IE1lbW9yeSBsZWFrIGluIGNvbS5hcHBsZS5sYWYuQXF1YVByb2dyZXNzQmFyVUk6IHJlbW92ZWQgcHJvZ3Jlc3MgYmFyIHN0aWxsIHJlZmVyZW5jZWQKLSAqIEBsaWJyYXJ5IC4uLy4uL3JlZ3Rlc3RoZWxwZXJzCi0gKiBAYnVpbGQgVXRpbAotICogQHJ1biBtYWluL3RpbWVvdXQ9MzAwL290aGVydm0gLVhteDE2bSBQcm9ncmVzc0Jhck1lbW9yeUxlYWtUZXN0Ci0gKi8KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlByb2dyZXNzQmFyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5VbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvZ3Jlc3NCYXJNZW1vcnlMZWFrVGVzdCB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSkZyYW1lIHNGcmFtZTsKLSAgcHJpdmF0ZSBzdGF0aWMgV2Vha1JlZmVyZW5jZTxKUHJvZ3Jlc3NCYXI+IHNQcm9ncmVzc0JhcjsKLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBVSU1hbmFnZXIuTG9va0FuZEZlZWxJbmZvW10gaW5zdGFsbGVkTG9va0FuZEZlZWxzID0gVUlNYW5hZ2VyLmdldEluc3RhbGxlZExvb2tBbmRGZWVscygpOwotICAgIGZvciAoIFVJTWFuYWdlci5Mb29rQW5kRmVlbEluZm8gaW5zdGFsbGVkTG9va0FuZEZlZWwgOiBpbnN0YWxsZWRMb29rQW5kRmVlbHMgKSB7Ci0gICAgICBleGVjdXRlVGVzdENhc2UoaW5zdGFsbGVkTG9va0FuZEZlZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgZXhlY3V0ZVRlc3RDYXNlKFN0cmluZyBsb29rQW5kRmVlbFN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICBpZiAodHJ5TG9va0FuZEZlZWwobG9va0FuZEZlZWxTdHJpbmcpKSB7Ci0gICAgICBFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQoIG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICBzaG93VUkoKTsKLSAgICAgICAgfQotICAgICAgfSApOwotICAgICAgRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KCBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgZGlzcG9zZVVJKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gKTsKLSAgICAgIFV0aWwuZ2VuZXJhdGVPT01FKCk7Ci0gICAgICBKUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIgPSBzUHJvZ3Jlc3NCYXIuZ2V0KCk7Ci0gICAgICBpZiAoIHByb2dyZXNzQmFyICE9IG51bGwgKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiUHJvZ3Jlc3MgYmFyICh1c2luZyBMJkY6ICIgKyBsb29rQW5kRmVlbFN0cmluZyArICIpIHNob3VsZCBoYXZlIGJlZW4gR0MtZWQiICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzaG93VUkoKXsKLSAgICBzRnJhbWUgPSBuZXcgSkZyYW1lKCk7Ci0KLSAgICBKUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXIgPSBuZXcgSlByb2dyZXNzQmFyKCk7Ci0gICAgcHJvZ3Jlc3NCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgcHJvZ3Jlc3NCYXIuc2V0SW5kZXRlcm1pbmF0ZShmYWxzZSk7Ci0gICAgcHJvZ3Jlc3NCYXIuc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKLSAgICBwcm9ncmVzc0Jhci5zZXRJbmRldGVybWluYXRlKGZhbHNlKTsKLSAgICBwcm9ncmVzc0Jhci5zZXRWYWx1ZSgxMCk7Ci0gICAgcHJvZ3Jlc3NCYXIuc2V0U3RyaW5nKCJQcm9ncmVzcyIpOwotCi0gICAgc0ZyYW1lLmFkZChwcm9ncmVzc0Jhcik7Ci0KLSAgICBzUHJvZ3Jlc3NCYXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHByb2dyZXNzQmFyKTsKLQotICAgIHNGcmFtZS5zZXRTaXplKDIwMCwyMDApOwotICAgIHNGcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkaXNwb3NlVUkoKXsKLSAgICBzRnJhbWUuc2V0Q29udGVudFBhbmUobmV3IEpQYW5lbCgpKTsKLSAgICBzRnJhbWUuZGlzcG9zZSgpOwotICAgIHNGcmFtZSA9IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeUxvb2tBbmRGZWVsKFN0cmluZyBsb29rQW5kRmVlbFN0cmluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChsb29rQW5kRmVlbFN0cmluZyk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRMb29rQW5kRmVlbEV4Y2VwdGlvbiB8IENsYXNzTm90Rm91bmRFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljQ29tYm9Qb3B1cC84MTU0MDY5L0J1ZzgxNTQwNjkuamF2YSBiL2pkay90ZXN0L2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNDb21ib1BvcHVwLzgxNTQwNjkvQnVnODE1NDA2OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTI1MGE1Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3N3aW5nL3BsYWYvYmFzaWMvQmFzaWNDb21ib1BvcHVwLzgxNTQwNjkvQnVnODE1NDA2OS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MTU0MDY5Ci0gKiBAc3VtbWFyeSBKYXdzIHJlYWRzIHdyb25nIHZhbHVlcyBmcm9tIGNvbWJvYm94ZXMgd2hlbiBubyBlbGVtZW50IGlzIHNlbGVjdGVkCi0gKiBAcnVuIG1haW4gQnVnODE1NDA2OQotICovCi0KLWltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGU7Ci1pbXBvcnQgamF2YXguYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udGV4dDsKLWltcG9ydCBqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVTZWxlY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcucGxhZi5uaW1idXMuTmltYnVzTG9va0FuZEZlZWw7Ci0KLXB1YmxpYyBjbGFzcyBCdWc4MTU0MDY5IHsKLQotICAgIHByaXZhdGUgc3RhdGljIEpGcmFtZSBmcmFtZTsKLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobmV3IE5pbWJ1c0xvb2tBbmRGZWVsKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3dpbmdVdGlsaXRpZXMuaW52b2tlQW5kV2FpdCgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgZnJhbWUgPSBuZXcgSkZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGV0U3RyaW5ncyA9IHsgIkJpcmQiLCAiQ2F0IiB9OwotICAgICAgICAgICAgICAgIEpDb21ib0JveDxTdHJpbmc+IGNiID0gbmV3IEpDb21ib0JveDw+KHBldFN0cmluZ3MpOwotICAgICAgICAgICAgICAgIGNiLnNldFNlbGVjdGVkSW5kZXgoMSk7ICAvLyBzZWxlY3QgQ2F0Ci0gICAgICAgICAgICAgICAgZnJhbWUuYWRkKGNiKTsKLSAgICAgICAgICAgICAgICBmcmFtZS5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2Iuc2V0U2VsZWN0ZWRJbmRleCgtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gY2IuZ2V0U2VsZWN0ZWRJbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldFNlbGVjdGVkSW5kZXggaXMgbm90IC0xIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBjYi5nZXRTZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImdldFNlbGVjdGVkSXRlbSBpcyBub3QgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGVDb250ZXh0IGFjID0gY2IuZ2V0QWNjZXNzaWJsZUNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJsZVNlbGVjdGlvbiBhcyA9IGFjLmdldEFjY2Vzc2libGVTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gYXMuZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbkNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZ2V0QWNjZXNzaWJsZVNlbGVjdGlvbiBjb3VudCBpcyBub3QgMCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc2libGUgYSA9IGFzLmdldEFjY2Vzc2libGVTZWxlY3Rpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJnZXRBY2Nlc3NpYmxlU2VsZWN0aW9uKDApIGlzIG5vdCBudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gPSBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IGZhaWxlZDogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHBhc3NlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUFuZFdhaXQoKCkgLT4gewotICAgICAgICAgICAgICAgIGZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljU2Nyb2xsUGFuZVVJLzgxNjY1OTEvVG9vTXVjaFdoZWVsUm90YXRpb25FdmVudHNUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zd2luZy9wbGFmL2Jhc2ljL0Jhc2ljU2Nyb2xsUGFuZVVJLzgxNjY1OTEvVG9vTXVjaFdoZWVsUm90YXRpb25FdmVudHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGJjNzAuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc3dpbmcvcGxhZi9iYXNpYy9CYXNpY1Njcm9sbFBhbmVVSS84MTY2NTkxL1Rvb011Y2hXaGVlbFJvdGF0aW9uRXZlbnRzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZEJhZ0NvbnN0cmFpbnRzOwotaW1wb3J0IGphdmEuYXd0LkdyaWRCYWdMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3hMYXlvdXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUZXh0QXJlYTsKLWltcG9ydCBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllczsKLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNjY1OTEKLSAqIEBzdW1tYXJ5IFttYWNvcyAxMC4xMl0gVHJhY2twYWQgc2Nyb2xsaW5nIG9mIHRleHQgb24gT1MgWCAxMC4xMiBTaWVycmEKLSAqICAgIGlzIHZlcnkgZmFzdCAoVHJhY2twYWQsIFJldGluYSBvbmx5KQotICogQHJ1biBtYWluL21hbnVhbC9vdGhlcnZtIFRvb011Y2hXaGVlbFJvdGF0aW9uRXZlbnRzVGVzdAotICovCi1wdWJsaWMgY2xhc3MgVG9vTXVjaFdoZWVsUm90YXRpb25FdmVudHNUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gdGVzdFJlc3VsdCA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUUlVDVElPTlMgPSAiSU5TVFJVQ1RJT05TOlxuIgotICAgICAgICAgICAgKyAiVHJ5IHRvIGNoZWNrIHRoZSBpc3N1ZSBvbiBNYWMgT1MgWCAxMC4xMiBTaWVycmEgd2l0aCB0cmFja3BhZCIKLSAgICAgICAgICAgICsgIiBvbiBSZXRpbmEgZGlzcGxheS5cbiIKLSAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgKyAiSWYgdGhlIHRyYWNrcGFkIGlzIG5vdCBzdXBwb3J0ZWQsIHByZXNzIFBBU1NcbiIKLSAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgKyAiVXNlIHRoZSB0cmFja3BhZCB0byBzbGlnaHRseSBzY3JvbGwgdGhlIEpUZXh0QXJlYSBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuXG4iCi0gICAgICAgICAgICArICJJZiB0aGUgdGV4dCBhcmVhIGlzIHNjcm9sbGVkIHRvbyBmYXN0IHByZXNzIEZBSUwsIGVsc2UgcHJlc3MgUEFTUy4iOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvdW50RG93bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotCi0gICAgICAgIFN3aW5nVXRpbGl0aWVzLmludm9rZUxhdGVyKFRvb011Y2hXaGVlbFJvdGF0aW9uRXZlbnRzVGVzdDo6Y3JlYXRlVUkpOwotICAgICAgICBjb3VudERvd25MYXRjaC5hd2FpdCgxNSwgVGltZVVuaXQuTUlOVVRFUyk7Ci0KLSAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBmYWlscyEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlVUkoKSB7Ci0KLSAgICAgICAgZmluYWwgSkZyYW1lIG1haW5GcmFtZSA9IG5ldyBKRnJhbWUoIlRyYWNrcGFkIHNjcm9sbGluZyB0ZXN0Iik7Ci0gICAgICAgIEdyaWRCYWdMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRCYWdMYXlvdXQoKTsKLSAgICAgICAgSlBhbmVsIG1haW5Db250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKGxheW91dCk7Ci0gICAgICAgIEpQYW5lbCByZXN1bHRCdXR0b25QYW5lbCA9IG5ldyBKUGFuZWwobGF5b3V0KTsKLQotICAgICAgICBHcmlkQmFnQ29uc3RyYWludHMgZ2JjID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOwotCi0gICAgICAgIEpQYW5lbCB0ZXN0UGFuZWwgPSBjcmVhdGVUZXN0UGFuZWwoKTsKLQotICAgICAgICBnYmMuZ3JpZHggPSAwOwotICAgICAgICBnYmMuZ3JpZHkgPSAwOwotICAgICAgICBnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOwotICAgICAgICBtYWluQ29udHJvbFBhbmVsLmFkZCh0ZXN0UGFuZWwsIGdiYyk7Ci0KLSAgICAgICAgSlRleHRBcmVhIGluc3RydWN0aW9uVGV4dEFyZWEgPSBuZXcgSlRleHRBcmVhKCk7Ci0gICAgICAgIGluc3RydWN0aW9uVGV4dEFyZWEuc2V0VGV4dChJTlNUUlVDVElPTlMpOwotICAgICAgICBpbnN0cnVjdGlvblRleHRBcmVhLnNldEVkaXRhYmxlKGZhbHNlKTsKLSAgICAgICAgaW5zdHJ1Y3Rpb25UZXh0QXJlYS5zZXRCYWNrZ3JvdW5kKENvbG9yLndoaXRlKTsKLQotICAgICAgICBnYmMuZ3JpZHggPSAwOwotICAgICAgICBnYmMuZ3JpZHkgPSAxOwotICAgICAgICBnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOwotICAgICAgICBtYWluQ29udHJvbFBhbmVsLmFkZChpbnN0cnVjdGlvblRleHRBcmVhLCBnYmMpOwotCi0gICAgICAgIEpCdXR0b24gcGFzc0J1dHRvbiA9IG5ldyBKQnV0dG9uKCJQYXNzIik7Ci0gICAgICAgIHBhc3NCdXR0b24uc2V0QWN0aW9uQ29tbWFuZCgiUGFzcyIpOwotICAgICAgICBwYXNzQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKChBY3Rpb25FdmVudCBlKSAtPiB7Ci0gICAgICAgICAgICB0ZXN0UmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1haW5GcmFtZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKLQotICAgICAgICB9KTsKLQotICAgICAgICBKQnV0dG9uIGZhaWxCdXR0b24gPSBuZXcgSkJ1dHRvbigiRmFpbCIpOwotICAgICAgICBmYWlsQnV0dG9uLnNldEFjdGlvbkNvbW1hbmQoIkZhaWwiKTsKLSAgICAgICAgZmFpbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbWFpbkZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMDsKLSAgICAgICAgZ2JjLmdyaWR5ID0gMDsKLSAgICAgICAgcmVzdWx0QnV0dG9uUGFuZWwuYWRkKHBhc3NCdXR0b24sIGdiYyk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMTsKLSAgICAgICAgZ2JjLmdyaWR5ID0gMDsKLSAgICAgICAgcmVzdWx0QnV0dG9uUGFuZWwuYWRkKGZhaWxCdXR0b24sIGdiYyk7Ci0KLSAgICAgICAgZ2JjLmdyaWR4ID0gMDsKLSAgICAgICAgZ2JjLmdyaWR5ID0gMjsKLSAgICAgICAgbWFpbkNvbnRyb2xQYW5lbC5hZGQocmVzdWx0QnV0dG9uUGFuZWwsIGdiYyk7Ci0KLSAgICAgICAgbWFpbkZyYW1lLmFkZChtYWluQ29udHJvbFBhbmVsKTsKLSAgICAgICAgbWFpbkZyYW1lLnBhY2soKTsKLQotICAgICAgICBtYWluRnJhbWUuYWRkV2luZG93TGlzdGVuZXIobmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbWFpbkZyYW1lLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1haW5GcmFtZS5zZXRWaXNpYmxlKHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEpQYW5lbCBjcmVhdGVUZXN0UGFuZWwoKSB7Ci0gICAgICAgIEpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKLSAgICAgICAgcGFuZWwuc2V0TGF5b3V0KG5ldyBCb3hMYXlvdXQocGFuZWwsIEJveExheW91dC5ZX0FYSVMpKTsKLSAgICAgICAgSlRleHRBcmVhIHRleHRBcmVhID0gbmV3IEpUZXh0QXJlYSgyMCwgMjApOwotICAgICAgICB0ZXh0QXJlYS5zZXRUZXh0KGdldExvbmdTdHJpbmcoKSk7Ci0gICAgICAgIEpTY3JvbGxQYW5lIHNjcm9sbFBhbmUgPSBuZXcgSlNjcm9sbFBhbmUodGV4dEFyZWEpOwotICAgICAgICBwYW5lbC5hZGQoc2Nyb2xsUGFuZSk7Ci0gICAgICAgIHJldHVybiBwYW5lbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9uZ1N0cmluZygpIHsKLQotICAgICAgICBTdHJpbmcgbG93Q2FzZVN0cmluZyA9IGdldExvbmdTdHJpbmcoJ2EnLCAneicpOwotICAgICAgICBTdHJpbmcgdXBwZXJDYXNlU3RyaW5nID0gZ2V0TG9uZ1N0cmluZygnQScsICdaJyk7Ci0gICAgICAgIFN0cmluZyBkaWdpdHNTdHJpbmcgPSBnZXRMb25nU3RyaW5nKCcwJywgJzknKTsKLQotICAgICAgICBpbnQgcmVwZWF0ID0gMzA7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgbG93Q2FzZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHVwcGVyQ2FzZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGRpZ2l0c0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKLSAgICAgICAgICAgIGxvd0Nhc2VCdWlsZGVyLmFwcGVuZChsb3dDYXNlU3RyaW5nKS5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIHVwcGVyQ2FzZUJ1aWxkZXIuYXBwZW5kKHVwcGVyQ2FzZVN0cmluZykuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICBkaWdpdHNCdWlsZGVyLmFwcGVuZChkaWdpdHNTdHJpbmcpLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDA7IGkrKykgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodXBwZXJDYXNlQnVpbGRlcikuYXBwZW5kKCdcbicpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobG93Q2FzZUJ1aWxkZXIpLmFwcGVuZCgnXG4nKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGRpZ2l0c0J1aWxkZXIpLmFwcGVuZCgiXG5cblxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMb25nU3RyaW5nKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQotICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltjMiAtIGMxICsgMV07Ci0gICAgICAgIGZvciAoY2hhciBpID0gYzE7IGkgPD0gYzI7IGkrKykgewotICAgICAgICAgICAgY2hhcnNbaSAtIGMxXSA9IGk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY2hhcnMpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3N3aW5nL3BsYWYvbmltYnVzLzgwNTc3OTEvYnVnODA1Nzc5MS5qYXZhIGIvamRrL3Rlc3QvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvODA1Nzc5MS9idWc4MDU3NzkxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMzE1NDQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvODA1Nzc5MS9idWc4MDU3NzkxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qIEB0ZXN0Ci0gICBAYnVnIDgwNTc3OTEKLSAgIEBzdW1tYXJ5IFNlbGVjdGlvbiBpbiBKTGlzdCBpcyBkcmF3biB3aXRoIHdyb25nIGNvbG9ycyBpbiBOaW1idXMgTCZGCi0gICBAYXV0aG9yIEFudG9uIExpdHZpbm92Ci0gICBAcnVuIG1haW4gYnVnODA1Nzc5MQotICovCi0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljczsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdVdGlsaXRpZXM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVuc3VwcG9ydGVkTG9va0FuZEZlZWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcucGxhZi5uaW1idXMuTmltYnVzTG9va0FuZEZlZWw7Ci0KLXB1YmxpYyBjbGFzcyBidWc4MDU3NzkxIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobmV3IE5pbWJ1c0xvb2tBbmRGZWVsKCkpOwotCi0gICAgICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsaXN0V2lkdGggPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxpc3RIZWlnaHQgPSA1MDsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbENlbGxJbmRleCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgSkxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEpMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5zZXRTaXplKGxpc3RXaWR0aCwgbGlzdEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIERlZmF1bHRMaXN0TW9kZWw8U3RyaW5nPiBsaXN0TW9kZWwgPSBuZXcgRGVmYXVsdExpc3RNb2RlbDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RNb2RlbC5hZGQoc2VsQ2VsbEluZGV4LCAiRSIpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LnNldE1vZGVsKGxpc3RNb2RlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3Quc2V0U2VsZWN0ZWRJbmRleChzZWxDZWxsSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1nID0gbmV3IEJ1ZmZlcmVkSW1hZ2UobGlzdFdpZHRoLCBsaXN0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKLSAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3MgZyA9IGltZy5nZXRHcmFwaGljcygpOwotICAgICAgICAgICAgICAgICAgICBsaXN0LnBhaW50KGcpOwotICAgICAgICAgICAgICAgICAgICBnLmRpc3Bvc2UoKTsKLQotICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgY2VsbFJlY3QgPSBsaXN0LmdldENlbGxCb3VuZHMoc2VsQ2VsbEluZGV4LCBzZWxDZWxsSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBIYXNoU2V0PENvbG9yPiBjZWxsQ29sb3JzID0gbmV3IEhhc2hTZXQ8Q29sb3I+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB1bmlxdWVDb2xvckluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IGNlbGxSZWN0Lng7IHggPCAoY2VsbFJlY3QueCArIGNlbGxSZWN0LndpZHRoKTsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB5ID0gY2VsbFJlY3QueTsgeSA8IChjZWxsUmVjdC55ICsgY2VsbFJlY3QuaGVpZ2h0KTsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgY2VsbENvbG9yID0gbmV3IENvbG9yKGltZy5nZXRSR0IoeCwgeSksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsQ29sb3JzLmFkZChjZWxsQ29sb3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJDZWxsIGNvbG9yICMlZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlQ29sb3JJbmRleCsrLCBjZWxsQ29sb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDb2xvciBzZWxGb3JlZ3JvdW5kQ29sb3IgPSBsaXN0LmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sb3Igc2VsQmFja2dyb3VuZENvbG9yID0gbGlzdC5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2VsbENvbG9ycy5jb250YWlucyhuZXcgQ29sb3Ioc2VsRm9yZWdyb3VuZENvbG9yLmdldFJHQigpLCB0cnVlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGNlbGwgaXMgZHJhd24gd2l0aG91dCBzZWxlY3Rpb24gZm9yZWdyb3VuZCBjb2xvciAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsRm9yZWdyb3VuZENvbG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsQ29sb3JzLmNvbnRhaW5zKG5ldyBDb2xvcihzZWxCYWNrZ3JvdW5kQ29sb3IuZ2V0UkdCKCksIHRydWUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0ZWQgY2VsbCBpcyBkcmF3biB3aXRob3V0IHNlbGVjdGlvbiBiYWNrZ3JvdW5kIGNvbG9yICclcycuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxCYWNrZ3JvdW5kQ29sb3IpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvc3dpbmcvdGV4dC9odG1sL3BhcnNlci9QYXJzZXIvODA3ODI2OC9idWc4MDc4MjY4LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zd2luZy90ZXh0L2h0bWwvcGFyc2VyL1BhcnNlci84MDc4MjY4L2J1ZzgwNzgyNjguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9zd2luZy90ZXh0L2h0bWwvcGFyc2VyL1BhcnNlci84MDc4MjY4L2J1ZzgwNzgyNjguamF2YQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy90ZXh0L2h0bWwvcGFyc2VyL1BhcnNlci84MDc4MjY4L3Nsb3dwYXJzZS5odG1sIGIvamRrL3Rlc3QvamF2YXgvc3dpbmcvdGV4dC9odG1sL3BhcnNlci9QYXJzZXIvODA3ODI2OC9zbG93cGFyc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC9zd2luZy90ZXh0L2h0bWwvcGFyc2VyL1BhcnNlci84MDc4MjY4L3Nsb3dwYXJzZS5odG1sCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3htbC9jcnlwdG8vZHNpZy9HZW5lcmF0aW9uVGVzdHMuamF2YSBiL2pkay90ZXN0L2phdmF4L3htbC9jcnlwdG8vZHNpZy9HZW5lcmF0aW9uVGVzdHMuamF2YQppbmRleCA4OWZkNDZhLi42Y2M3YmJiIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZheC94bWwvY3J5cHRvL2RzaWcvR2VuZXJhdGlvblRlc3RzLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YXgveG1sL2NyeXB0by9kc2lnL0dlbmVyYXRpb25UZXN0cy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNyBAQAogCiAvKioKICAqIEB0ZXN0Ci0gKiBAYnVnIDQ2MzUyMzAgNjI4MzM0NSA2MzAzODMwIDY4MjQ0NDAgNjg2NzM0OCA3MDk0MTU1IDgwMzgxODQgODAzODM0OSA4MDc0Nzg0CisgKiBAYnVnIDQ2MzUyMzAgNjI4MzM0NSA2MzAzODMwIDY4MjQ0NDAgNjg2NzM0OCA3MDk0MTU1IDgwMzgxODQgODAzODM0OQogICogQHN1bW1hcnkgQmFzaWMgdW5pdCB0ZXN0cyBmb3IgZ2VuZXJhdGluZyBYTUwgU2lnbmF0dXJlcyB3aXRoIEpTUiAxMDUKICAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBLZXlTZWxlY3RvcnMuamF2YSBTaWduYXR1cmVWYWxpZGF0b3IuamF2YQogICogICAgIFg1MDlLZXlTZWxlY3Rvci5qYXZhIEdlbmVyYXRpb25UZXN0cy5qYXZhCkBAIC0zMSwyMyArMzEsMTYgQEAKICAqIEBhdXRob3IgU2VhbiBNdWxsYW4KICAqLwogCi1pbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwRXhjaGFuZ2U7Ci1pbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwSGFuZGxlcjsKLWltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyR2VuZXJhdG9yOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDUkw7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLktleVNwZWM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkRTQVByaXZhdGVLZXlTcGVjOwpAQCAtNTUsMTAgKzQ4LDEwIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlJTQVByaXZhdGVLZXlTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQdWJsaWNLZXlTcGVjOwogaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LmNyeXB0by5LZXlHZW5lcmF0b3I7CiBpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKIGltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CitpbXBvcnQgb3JnLnczYy5kb20uKjsKIGltcG9ydCBqYXZheC54bWwuY3J5cHRvLkRhdGE7CiBpbXBvcnQgamF2YXgueG1sLmNyeXB0by5LZXlTZWxlY3RvcjsKIGltcG9ydCBqYXZheC54bWwuY3J5cHRvLk9jdGV0U3RyZWFtRGF0YTsKQEAgLTc2LDcgKzY5LDYgQEAKIGltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwogaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwogCiAvKioKICAqIFRlc3QgdGhhdCByZWNyZWF0ZXMgbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlIHRlc3QgdmVjdG9ycyBidXQgd2l0aApAQCAtMTE4LDczICsxMTAsNiBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEU0FfU0hBMjU2ID0KICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZHNpZzExI2RzYS1zaGEyNTYiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPR1VTID0gImJvZ3VzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsICBTdHJpbmcgeHNsdCA9ICIiCi0gICAgICAgICAgKyAiPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0naHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJ1xuIgotICAgICAgICAgICsgIiAgICAgICAgICAgIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvc3RyaWN0JyBcbiIKLSAgICAgICAgICArICIgICAgICAgICAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0nZm9vJyBcbiIKLSAgICAgICAgICArICIgICAgICAgICAgICB2ZXJzaW9uPScxLjAnPlxuIgotICAgICAgICAgICsgIiAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9J1VURi04JyBcbiIKLSAgICAgICAgICArICIgICAgICAgICAgIGluZGVudD0nbm8nIFxuIgotICAgICAgICAgICsgIiAgICAgICAgICAgbWV0aG9kPSd4bWwnIC8+XG4iCi0gICAgICAgICAgKyAiICA8eHNsOnRlbXBsYXRlIG1hdGNoPScvJz5cbiIKLSAgICAgICAgICArICIgICAgPGh0bWw+XG4iCi0gICAgICAgICAgKyAiICAgPGhlYWQ+XG4iCi0gICAgICAgICAgKyAiICAgIDx0aXRsZT5Ob3RhcmllczwvdGl0bGU+XG4iCi0gICAgICAgICAgKyAiICAgPC9oZWFkPlxuIgotICAgICAgICAgICsgIiAgIDxib2R5PlxuIgotICAgICAgICAgICsgIiAgICA8dGFibGU+XG4iCi0gICAgICAgICAgKyAiICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J05vdGFyaWVzL05vdGFyeSc+XG4iCi0gICAgICAgICAgKyAiICAgICAgICAgICA8dHI+XG4iCi0gICAgICAgICAgKyAiICAgICAgICAgICA8dGg+XG4iCi0gICAgICAgICAgKyAiICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9J0BuYW1lJyAvPlxuIgotICAgICAgICAgICsgIiAgICAgICAgICAgPC90aD5cbiIKLSAgICAgICAgICArICIgICAgICAgICAgIDwvdHI+XG4iCi0gICAgICAgICAgKyAiICAgICAgPC94c2w6Zm9yLWVhY2g+XG4iCi0gICAgICAgICAgKyAiICAgIDwvdGFibGU+XG4iCi0gICAgICAgICAgKyAiICAgPC9ib2R5PlxuIgotICAgICAgICAgICsgIiAgICA8L2h0bWw+XG4iCi0gICAgICAgICAgKyAiICA8L3hzbDp0ZW1wbGF0ZT5cbiIKLSAgICAgICAgICArICI8L3hzbDpzdHlsZXNoZWV0PlxuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNhbm9uaWNhbGl6YXRpb25NZXRob2RzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5FWENMVVNJVkUsCi0gICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuRVhDTFVTSVZFX1dJVEhfQ09NTUVOVFMsCi0gICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuSU5DTFVTSVZFLAotICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kLklOQ0xVU0lWRV9XSVRIX0NPTU1FTlRTCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHhtbF90cmFuc2Zvcm1zID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgVHJhbnNmb3JtLlhTTFQsCi0gICAgICAgIFRyYW5zZm9ybS5YUEFUSCwKLSAgICAgICAgVHJhbnNmb3JtLlhQQVRIMiwKLSAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5FWENMVVNJVkUsCi0gICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuRVhDTFVTSVZFX1dJVEhfQ09NTUVOVFMsCi0gICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuSU5DTFVTSVZFLAotICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kLklOQ0xVU0lWRV9XSVRIX0NPTU1FTlRTLAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBub25feG1sX3RyYW5zZm9ybXMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICBudWxsLCBUcmFuc2Zvcm0uQkFTRTY0Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHNpZ25hdHVyZU1ldGhvZHMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICBTaWduYXR1cmVNZXRob2QuRFNBX1NIQTEsCi0gICAgICAgIFNpZ25hdHVyZU1ldGhvZC5SU0FfU0hBMSwKLSAgICAgICAgU2lnbmF0dXJlTWV0aG9kLkhNQUNfU0hBMQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBlbnVtIENvbnRlbnQgewotICAgICAgICBYbWwsIFRleHQsIEJhc2U2NCwgTm90RXhpc2l0bmcKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBlbnVtIEtleUluZm9UeXBlIHsKLSAgICAgICAgS2V5VmFsdWUsIHg1MDlkYXRhLCBLZXlOYW1lCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHNldHVwKCk7CiAgICAgICAgIHRlc3RfY3JlYXRlX3NpZ25hdHVyZV9lbnZlbG9wZWRfZHNhKDEwMjQpOwpAQCAtMjE1LDk3ICsxNDAsNiBAQAogICAgICAgICB0ZXN0X2NyZWF0ZV9zaWduYXR1cmVfcmVmZXJlbmNlX2RlcGVuZGVuY3koKTsKICAgICAgICAgdGVzdF9jcmVhdGVfc2lnbmF0dXJlX3dpdGhfYXR0cl9pbl9ub19uYW1lc3BhY2UoKTsKICAgICAgICAgdGVzdF9jcmVhdGVfc2lnbmF0dXJlX3dpdGhfZW1wdHlfaWQoKTsKLQotICAgICAgICAvLyBydW4gdGVzdHMgZm9yIGRldGFjaGVkIHNpZ25hdHVyZXMgd2l0aCBsb2NhbCBodHRwIHNlcnZlcgotICAgICAgICB0cnkgKEh0dHAgc2VydmVyID0gSHR0cC5zdGFydFNlcnZlcigpKSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKLQotICAgICAgICAgICAgLy8gdGVzdHMgZm9yIFhNTCBkb2N1bWVudHMKLSAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oY2Fub25pY2FsaXphdGlvbk1ldGhvZHMpLmZvckVhY2goYyAtPgotICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oc2lnbmF0dXJlTWV0aG9kcykuZm9yRWFjaChzIC0+Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oeG1sX3RyYW5zZm9ybXMpLmZvckVhY2godCAtPgotICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShLZXlJbmZvVHlwZS52YWx1ZXMoKSkuZm9yRWFjaChrIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NyZWF0ZV9kZXRhY2hlZF9zaWduYXR1cmUoYywgcywgdCwgaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQuWG1sLCBzZXJ2ZXIuZ2V0UG9ydCgpLCBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKLQotICAgICAgICAgICAgLy8gdGVzdHMgZm9yIHRleHQgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybQotICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShjYW5vbmljYWxpemF0aW9uTWV0aG9kcykuZm9yRWFjaChjIC0+Ci0gICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShzaWduYXR1cmVNZXRob2RzKS5mb3JFYWNoKHMgLT4KLSAgICAgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShLZXlJbmZvVHlwZS52YWx1ZXMoKSkuZm9yRWFjaChrIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY3JlYXRlX2RldGFjaGVkX3NpZ25hdHVyZShjLCBzLCBudWxsLCBrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50LlRleHQsIHNlcnZlci5nZXRQb3J0KCksIGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSkpKTsKLQotICAgICAgICAgICAgLy8gdGVzdHMgZm9yIGJhc2U2NCBkYXRhCi0gICAgICAgICAgICBBcnJheXMuc3RyZWFtKGNhbm9uaWNhbGl6YXRpb25NZXRob2RzKS5mb3JFYWNoKGMgLT4KLSAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKHNpZ25hdHVyZU1ldGhvZHMpLmZvckVhY2gocyAtPgotICAgICAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKG5vbl94bWxfdHJhbnNmb3JtcykuZm9yRWFjaCh0IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuc3RyZWFtKEtleUluZm9UeXBlLnZhbHVlcygpKS5mb3JFYWNoKGsgLT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY3JlYXRlX2RldGFjaGVkX3NpZ25hdHVyZShjLCBzLCB0LCBrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudC5CYXNlNjQsIHNlcnZlci5nZXRQb3J0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKLQotICAgICAgICAgICAgLy8gbmVnYXRpdmUgdGVzdHMKLQotICAgICAgICAgICAgLy8gdW5rbm93biBDYW5vbmljYWxpemF0aW9uTWV0aG9kCi0gICAgICAgICAgICB0ZXN0X2NyZWF0ZV9kZXRhY2hlZF9zaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuRVhDTFVTSVZFICsgQk9HVVMsCi0gICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZU1ldGhvZC5EU0FfU0hBMSwKLSAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5JTkNMVVNJVkUsCi0gICAgICAgICAgICAgICAgICAgIEtleUluZm9UeXBlLktleU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIENvbnRlbnQuWG1sLAotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuZ2V0UG9ydCgpLAotICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24uY2xhc3MpOwotCi0gICAgICAgICAgICAvLyB1bmtub3duIFNpZ25hdHVyZU1ldGhvZAotICAgICAgICAgICAgdGVzdF9jcmVhdGVfZGV0YWNoZWRfc2lnbmF0dXJlKAotICAgICAgICAgICAgICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kLkVYQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlTWV0aG9kLkRTQV9TSEExICsgQk9HVVMsCi0gICAgICAgICAgICAgICAgICAgIENhbm9uaWNhbGl6YXRpb25NZXRob2QuSU5DTFVTSVZFLAotICAgICAgICAgICAgICAgICAgICBLZXlJbmZvVHlwZS5LZXlOYW1lLCBDb250ZW50LlhtbCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldFBvcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLmNsYXNzKTsKLQotICAgICAgICAgICAgLy8gdW5rbm93biBUcmFuc2Zvcm0KLSAgICAgICAgICAgIHRlc3RfY3JlYXRlX2RldGFjaGVkX3NpZ25hdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5FWENMVVNJVkUsCi0gICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZU1ldGhvZC5EU0FfU0hBMSwKLSAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5JTkNMVVNJVkUgKyBCT0dVUywKLSAgICAgICAgICAgICAgICAgICAgS2V5SW5mb1R5cGUuS2V5TmFtZSwgQ29udGVudC5YbWwsCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlci5nZXRQb3J0KCksCi0gICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbi5jbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIG5vIHNvdXJjZSBkb2N1bWVudAotICAgICAgICAgICAgdGVzdF9jcmVhdGVfZGV0YWNoZWRfc2lnbmF0dXJlKAotICAgICAgICAgICAgICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kLkVYQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlTWV0aG9kLkRTQV9TSEExLAotICAgICAgICAgICAgICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kLklOQ0xVU0lWRSwKLSAgICAgICAgICAgICAgICAgICAgS2V5SW5mb1R5cGUuS2V5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ29udGVudC5Ob3RFeGlzaXRuZywKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldFBvcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgWE1MU2lnbmF0dXJlRXhjZXB0aW9uLmNsYXNzKTsKLQotICAgICAgICAgICAgLy8gd3JvbmcgdHJhbnNmb3JtIGZvciB0ZXh0IGRhdGEKLSAgICAgICAgICAgIHRlc3RfY3JlYXRlX2RldGFjaGVkX3NpZ25hdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5FWENMVVNJVkUsCi0gICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZU1ldGhvZC5EU0FfU0hBMSwKLSAgICAgICAgICAgICAgICAgICAgQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5JTkNMVVNJVkUsCi0gICAgICAgICAgICAgICAgICAgIEtleUluZm9UeXBlLktleU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIENvbnRlbnQuVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldFBvcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgWE1MU2lnbmF0dXJlRXhjZXB0aW9uLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIHRlc3QgY2FzZSBmYWlsZWQiKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTg4Miw2ICs3MTYsMzMgQEAKIAogICAgICAgICAvLyBNYW5pZmVzdCBSZWZlcmVuY2UgMwogICAgICAgICBMaXN0PFRyYW5zZm9ybT4gbWFuVHJhbnMgPSBuZXcgQXJyYXlMaXN0PFRyYW5zZm9ybT4oKTsKKyAgICAgICAgU3RyaW5nIHhzbHQgPSAiIgorICAgICAgICAgICsgIjx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSdcbiIKKyAgICAgICAgICArICIgICAgICAgICAgICB4bWxucz0naHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL3N0cmljdCcgXG4iCisgICAgICAgICAgKyAiICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9J2ZvbycgXG4iCisgICAgICAgICAgKyAiICAgICAgICAgICAgdmVyc2lvbj0nMS4wJz5cbiIKKyAgICAgICAgICArICIgIDx4c2w6b3V0cHV0IGVuY29kaW5nPSdVVEYtOCcgXG4iCisgICAgICAgICAgKyAiICAgICAgICAgICBpbmRlbnQ9J25vJyBcbiIKKyAgICAgICAgICArICIgICAgICAgICAgIG1ldGhvZD0neG1sJyAvPlxuIgorICAgICAgICAgICsgIiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+XG4iCisgICAgICAgICAgKyAiICAgIDxodG1sPlxuIgorICAgICAgICAgICsgIiAgIDxoZWFkPlxuIgorICAgICAgICAgICsgIiAgICA8dGl0bGU+Tm90YXJpZXM8L3RpdGxlPlxuIgorICAgICAgICAgICsgIiAgIDwvaGVhZD5cbiIKKyAgICAgICAgICArICIgICA8Ym9keT5cbiIKKyAgICAgICAgICArICIgICAgPHRhYmxlPlxuIgorICAgICAgICAgICsgIiAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSdOb3Rhcmllcy9Ob3RhcnknPlxuIgorICAgICAgICAgICsgIiAgICAgICAgICAgPHRyPlxuIgorICAgICAgICAgICsgIiAgICAgICAgICAgPHRoPlxuIgorICAgICAgICAgICsgIiAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScgLz5cbiIKKyAgICAgICAgICArICIgICAgICAgICAgIDwvdGg+XG4iCisgICAgICAgICAgKyAiICAgICAgICAgICA8L3RyPlxuIgorICAgICAgICAgICsgIiAgICAgIDwveHNsOmZvci1lYWNoPlxuIgorICAgICAgICAgICsgIiAgICA8L3RhYmxlPlxuIgorICAgICAgICAgICsgIiAgIDwvYm9keT5cbiIKKyAgICAgICAgICArICIgICAgPC9odG1sPlxuIgorICAgICAgICAgICsgIiAgPC94c2w6dGVtcGxhdGU+XG4iCisgICAgICAgICAgKyAiPC94c2w6c3R5bGVzaGVldD5cbiI7CiAgICAgICAgIERvY3VtZW50IGRvY3hzbHQgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeHNsdC5nZXRCeXRlcygpKSk7CiAgICAgICAgIE5vZGUgeHNsRWxlbSA9IGRvY3hzbHQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CiAKQEAgLTEyNjAsMjAwICsxMTIxLDYgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgfQogCi0gICAgc3RhdGljIHZvaWQgdGVzdF9jcmVhdGVfZGV0YWNoZWRfc2lnbmF0dXJlKFN0cmluZyBjYW5vbmljYWxpemF0aW9uTWV0aG9kLAotICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZU1ldGhvZCwgU3RyaW5nIHRyYW5zZm9ybSwgS2V5SW5mb1R5cGUga2V5SW5mbywKLSAgICAgICAgICAgIENvbnRlbnQgY29udGVudFR5cGUsIGludCBwb3J0LCBib29sZWFuIGV4cGVjdGVkRmFpbHVyZSwKLSAgICAgICAgICAgIENsYXNzIGV4cGVjdGVkRXhjZXB0aW9uKSB7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGRpZ2VzdE1ldGhvZCA9IERpZ2VzdE1ldGhvZC5TSEExOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgZGV0YWNoZWQgc2lnbmF0dXJlOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBDYW5vbmljYWxpemF0aW9uIG1ldGhvZDogIgotICAgICAgICAgICAgICAgICsgY2Fub25pY2FsaXphdGlvbk1ldGhvZCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIFNpZ25hdHVyZSBtZXRob2Q6ICIgKyBzaWduYXR1cmVNZXRob2QpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBUcmFuc2Zvcm06ICIgKyB0cmFuc2Zvcm0pOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBEaWdlc3QgbWV0aG9kOiAiICsgZGlnZXN0TWV0aG9kKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgS2V5SW5mb1R5cGU6ICIgKyBrZXlJbmZvKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgQ29udGVudCB0eXBlOiAiICsgY29udGVudFR5cGUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBFeHBlY3RlZCBmYWlsdXJlOiAiCi0gICAgICAgICAgICAgICAgKyAoZXhwZWN0ZWRGYWlsdXJlID8gInllcyIgOiAibm8iKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIEV4cGVjdGVkIGV4Y2VwdGlvbjogIgotICAgICAgICAgICAgICAgICsgKGV4cGVjdGVkRXhjZXB0aW9uID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgIm5vIiA6IGV4cGVjdGVkRXhjZXB0aW9uLmdldE5hbWUoKSkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0ZXN0X2NyZWF0ZV9kZXRhY2hlZF9zaWduYXR1cmUoCi0gICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6YXRpb25NZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZU1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgZGlnZXN0TWV0aG9kLAotICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgIGtleUluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICBwb3J0KTsKLQotICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgZXhwZWN0ZWRGYWlsdXJlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTaWduYXR1cmUgdmFsaWRhdGlvbiB1bmV4cGVjdGVkbHkgcGFzc2VkIik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdWNjZXNzICYmICFleHBlY3RlZEZhaWx1cmUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNpZ25hdHVyZSB2YWxpZGF0aW9uIHVuZXhwZWN0ZWRseSBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgIiArIGV4cGVjdGVkRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHRocm93biIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGV4cGVjdGVkRXhjZXB0aW9uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgIWUuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKGV4cGVjdGVkRXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBjYXNlIHBhc3NlZCIpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIHRlc3RfY3JlYXRlX2RldGFjaGVkX3NpZ25hdHVyZShTdHJpbmcgY2Fub25pY2FsaXphdGlvbk1ldGhvZCwKLSAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVNZXRob2QsIFN0cmluZyBkaWdlc3RNZXRob2QsIFN0cmluZyB0cmFuc2Zvcm0sCi0gICAgICAgICAgICBLZXlJbmZvVHlwZSBrZXlJbmZvLCBDb250ZW50IGNvbnRlbnRUeXBlLCBpbnQgcG9ydCkKLSAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNpZ24gLi4uIik7Ci0KLSAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgZGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCi0gICAgICAgIC8vIENyZWF0ZSBTaWduZWRJbmZvCi0gICAgICAgIERpZ2VzdE1ldGhvZCBkbSA9IGZhYy5uZXdEaWdlc3RNZXRob2QoZGlnZXN0TWV0aG9kLCBudWxsKTsKLQotICAgICAgICBMaXN0IHRyYW5zZm9ybUxpc3QgPSBudWxsOwotICAgICAgICBpZiAodHJhbnNmb3JtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRyYW5zZm9ybVBhcmFtZXRlclNwZWMgcGFyYW1zID0gbnVsbDsKLSAgICAgICAgICAgIHN3aXRjaCAodHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUcmFuc2Zvcm0uWFBBVEg6Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBYUGF0aEZpbHRlclBhcmFtZXRlclNwZWMoIi8vLiIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRyYW5zZm9ybS5YUEFUSDI6Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBYUGF0aEZpbHRlcjJQYXJhbWV0ZXJTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFhQYXRoVHlwZSgiLy8uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoVHlwZS5GaWx0ZXIuSU5URVJTRUNUKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRyYW5zZm9ybS5YU0xUOgotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhzbHQuZ2V0Qnl0ZXMoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBET01TdHJ1Y3R1cmUgc3R5bGVzaGVldCA9IG5ldyBET01TdHJ1Y3R1cmUoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBYU0xUVHJhbnNmb3JtUGFyYW1ldGVyU3BlYyhzdHlsZXNoZWV0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFuc2Zvcm1MaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChmYWMubmV3VHJhbnNmb3JtKAotICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sIHBhcmFtcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHVybCA9IFN0cmluZy5mb3JtYXQoImh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXMiLCBwb3J0LCBjb250ZW50VHlwZSk7Ci0gICAgICAgIExpc3QgcmVmcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZmFjLm5ld1JlZmVyZW5jZSh1cmwsIGRtLAotICAgICAgICAgICAgICAgIHRyYW5zZm9ybUxpc3QsIG51bGwsIG51bGwpKTsKLQotICAgICAgICBDYW5vbmljYWxpemF0aW9uTWV0aG9kIGNtID0gZmFjLm5ld0Nhbm9uaWNhbGl6YXRpb25NZXRob2QoCi0gICAgICAgICAgICAgICAgY2Fub25pY2FsaXphdGlvbk1ldGhvZCwgKEMxNE5NZXRob2RQYXJhbWV0ZXJTcGVjKSBudWxsKTsKLQotICAgICAgICBTaWduYXR1cmVNZXRob2Qgc20gPSBmYWMubmV3U2lnbmF0dXJlTWV0aG9kKHNpZ25hdHVyZU1ldGhvZCwgbnVsbCk7Ci0KLSAgICAgICAgS2V5IHNpZ25pbmdLZXk7Ci0gICAgICAgIEtleSB2YWxpZGF0aW9uS2V5OwotICAgICAgICBzd2l0Y2ggKHNpZ25hdHVyZU1ldGhvZCkgewotICAgICAgICAgICAgY2FzZSBTaWduYXR1cmVNZXRob2QuRFNBX1NIQTE6Ci0gICAgICAgICAgICBjYXNlIFNpZ25hdHVyZU1ldGhvZC5SU0FfU0hBMToKLSAgICAgICAgICAgICAgICBLZXlQYWlyIGtwID0gZ2VuZXJhdGVLZXlQYWlyKHNtKTsKLSAgICAgICAgICAgICAgICB2YWxpZGF0aW9uS2V5ID0ga3AuZ2V0UHVibGljKCk7Ci0gICAgICAgICAgICAgICAgc2lnbmluZ0tleSA9IGtwLmdldFByaXZhdGUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2lnbmF0dXJlTWV0aG9kLkhNQUNfU0hBMToKLSAgICAgICAgICAgICAgICBLZXlHZW5lcmF0b3Iga2cgPSBLZXlHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkhtYWNTSEExIik7Ci0gICAgICAgICAgICAgICAgc2lnbmluZ0tleSA9IGtnLmdlbmVyYXRlS2V5KCk7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGlvbktleSA9IHNpZ25pbmdLZXk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIik7Ci0gICAgICAgIH0KLQotICAgICAgICBTaWduZWRJbmZvIHNpID0gZmFjLm5ld1NpZ25lZEluZm8oY20sIHNtLCByZWZzLCBudWxsKTsKLQotICAgICAgICAvLyBDcmVhdGUgS2V5SW5mbwotICAgICAgICBLZXlJbmZvRmFjdG9yeSBraWYgPSBmYWMuZ2V0S2V5SW5mb0ZhY3RvcnkoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGtleUluZm8gPT0gS2V5SW5mb1R5cGUuS2V5VmFsdWUpIHsKLSAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uS2V5IGluc3RhbmNlb2YgUHVibGljS2V5KSB7Ci0gICAgICAgICAgICAgICAgS2V5VmFsdWUga3YgPSBraWYubmV3S2V5VmFsdWUoKFB1YmxpY0tleSkgdmFsaWRhdGlvbktleSk7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoa3YpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGtleUluZm8gPT0gS2V5SW5mb1R5cGUueDUwOWRhdGEpIHsKLSAgICAgICAgICAgIGxpc3QgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KAotICAgICAgICAgICAgICAgICAgICBraWYubmV3WDUwOURhdGEoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiY249VGVzdCIpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoa2V5SW5mbyA9PSBLZXlJbmZvVHlwZS5LZXlOYW1lKSB7Ci0gICAgICAgICAgICBsaXN0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChraWYubmV3S2V5TmFtZSgiVGVzdCIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIEtleUluZm86ICIgKyBrZXlJbmZvKTsKLSAgICAgICAgfQotICAgICAgICBLZXlJbmZvIGtpID0gbGlzdCAhPSBudWxsID8ga2lmLm5ld0tleUluZm8obGlzdCkgOiBudWxsOwotCi0gICAgICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBkb2MgZm9yIGRldGFjaGVkIHNpZ25hdHVyZQotICAgICAgICBEb2N1bWVudCBkb2MgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLSAgICAgICAgRE9NU2lnbkNvbnRleHQgeHNjID0gbmV3IERPTVNpZ25Db250ZXh0KHNpZ25pbmdLZXksIGRvYyk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgc2lnbmF0dXJlCi0gICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPSBmYWMubmV3WE1MU2lnbmF0dXJlKHNpLCBraSk7Ci0gICAgICAgIHNpZ25hdHVyZS5zaWduKHhzYyk7Ci0KLSAgICAgICAgLy8gU2F2ZSBzaWduYXR1cmUKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZVN0cmluZzsKLSAgICAgICAgdHJ5IChTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpKSB7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zID0gdGYubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICAgIE5vZGUgcGFyZW50ID0geHNjLmdldFBhcmVudCgpOwotICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UocGFyZW50KSwgbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpKTsKLSAgICAgICAgICAgIHNpZ25hdHVyZVN0cmluZyA9IHdyaXRlci50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiVmFsaWRhdGUgLi4uICIpOwotICAgICAgICB0cnkgKEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBzaWduYXR1cmVTdHJpbmcuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShiaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgTm9kZUxpc3Qgbm9kZUxzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU2lnbmF0dXJlIik7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVMc3QuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQgU2lnbmF0dXJlIGVsZW1lbnQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIG5vZGUgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIEVsZW1lbnQgc2lnID0gKEVsZW1lbnQpIG5vZGU7Ci0KLSAgICAgICAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlCi0gICAgICAgIERPTVZhbGlkYXRlQ29udGV4dCB2YyA9IG5ldyBET01WYWxpZGF0ZUNvbnRleHQodmFsaWRhdGlvbktleSwgc2lnKTsKLSAgICAgICAgdmMuc2V0UHJvcGVydHkoIm9yZy5qY3AueG1sLmRzaWcuc2VjdXJlVmFsaWRhdGlvbiIsIEJvb2xlYW4uRkFMU0UpOwotICAgICAgICBzaWduYXR1cmUgPSBmYWMudW5tYXJzaGFsWE1MU2lnbmF0dXJlKHZjKTsKLQotICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBzaWduYXR1cmUudmFsaWRhdGUodmMpOwotICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29yZSBzaWduYXR1cmUgdmFsaWRhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1Y2Nlc3MgPSBzaWduYXR1cmUuZ2V0U2lnbmF0dXJlVmFsdWUoKS52YWxpZGF0ZSh2Yyk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcnlwdG9ncmFwaGljIHZhbGlkYXRpb24gb2Ygc2lnbmF0dXJlIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERTQV9ZID0KICAgICAgICAgIjA3MDY2Mjg0MjE2NzU2NTc3MTkzNjU4ODMzNTEyODYzNDM5NjE3MTc4OTMzMTY1NjMxODQ4MzU4NDQ1NTQ5MzgyMiIgKwogICAgICAgICAiNDAwODExMjAwODUzMzMxMzczMDMwNjY5MjM1NDI0OTI4MzQ2MTkwMjc0MDQ0NjMxOTQ5NTYwNDM4MDIzOTM0NjIzIiArCkBAIC0xNTY0LDI1ICsxMjMxLDYgQEAKICAgICAgICAgfTsKICAgICB9CiAKLSAgICBzdGF0aWMgS2V5UGFpciBnZW5lcmF0ZUtleVBhaXIoU2lnbmF0dXJlTWV0aG9kIHNtKQotICAgICAgICAgICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7Ci0gICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga2V5Z2VuOwotICAgICAgICBzd2l0Y2ggKHNtLmdldEFsZ29yaXRobSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFNpZ25hdHVyZU1ldGhvZC5EU0FfU0hBMToKLSAgICAgICAgICAgICAgICBrZXlnZW4gPSBLZXlQYWlyR2VuZXJhdG9yLmdldEluc3RhbmNlKCJEU0EiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2lnbmF0dXJlTWV0aG9kLlJTQV9TSEExOgotICAgICAgICAgICAgICAgIGtleWdlbiA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIlJTQSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2VjdXJlUmFuZG9tIHJhbmRvbSA9IG5ldyBTZWN1cmVSYW5kb20oKTsKLSAgICAgICAga2V5Z2VuLmluaXRpYWxpemUoMTAyNCwgcmFuZG9tKTsKLSAgICAgICAgcmV0dXJuIGtleWdlbi5nZW5lcmF0ZUtleVBhaXIoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBUaGlzIFVSSURlcmVmZXJlbmNlciByZXR1cm5zIGxvY2FsbHkgY2FjaGVkIGNvcGllcyBvZiBodHRwIGNvbnRlbnQgdG8KICAgICAgKiBhdm9pZCB0ZXN0IGZhaWx1cmVzIGR1ZSB0byBuZXR3b3JrIGdsaXRjaGVzLCBldGMuCkBAIC0xNjA5LDgyICsxMjU3LDQgQEAKICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VWQuZGVyZWZlcmVuY2UocmVmLCBjdHgpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gbG9jYWwgaHR0cCBzZXJ2ZXIKLSAgICBzdGF0aWMgY2xhc3MgSHR0cCBpbXBsZW1lbnRzIEh0dHBIYW5kbGVyLCBBdXRvQ2xvc2VhYmxlIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyOwotCi0gICAgICAgIHByaXZhdGUgSHR0cChIdHRwU2VydmVyIHNlcnZlcikgewotICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgSHR0cCBzdGFydFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBIdHRwU2VydmVyIHNlcnZlciA9IEh0dHBTZXJ2ZXIuY3JlYXRlKG5ldyBJbmV0U29ja2V0QWRkcmVzcygwKSwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEh0dHAoc2VydmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuY3JlYXRlQ29udGV4dCgiLyIsIHRoaXMpOwotICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHN0b3AoKSB7Ci0gICAgICAgICAgICBzZXJ2ZXIuc3RvcCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRQb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZlci5nZXRBZGRyZXNzKCkuZ2V0UG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZShIdHRwRXhjaGFuZ2UgdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSB0LmdldFJlcXVlc3RVUkkoKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgPSBwYXRoLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0eXBlID0gcGF0aDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudFR5cGVIZWFkZXIgPSAiIjsKLSAgICAgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gbmV3IGJ5dGVbXSB7fTsKLSAgICAgICAgICAgICAgICBpbnQgY29kZSA9IDIwMDsKLSAgICAgICAgICAgICAgICBDb250ZW50IHRlc3RDb250ZW50VHlwZSA9IENvbnRlbnQudmFsdWVPZih0eXBlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRlc3RDb250ZW50VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEJhc2U2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSGVhZGVyID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAiVkdWemRBPT0iLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUZXh0OgotICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVIZWFkZXIgPSAidGV4dC9wbGFpbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAiVGV4dCIuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFhtbDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlSGVhZGVyID0gImFwcGxpY2F0aW9uL3htbCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAiPHRhZz50ZXN0PC90YWc+Ii5nZXRCeXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTm90RXhpc2l0bmc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gNDA0OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVua25vd24gdGVzdCBjb250ZW50IHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0LmdldFJlc3BvbnNlSGVhZGVycygpLnNldCgiQ29udGVudC1UeXBlIiwgY29udGVudFR5cGVIZWFkZXIpOwotICAgICAgICAgICAgICAgIHQuc2VuZFJlc3BvbnNlSGVhZGVycyhjb2RlLCBvdXRwdXQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB0LmdldFJlc3BvbnNlQm9keSgpLndyaXRlKG91dHB1dCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgICAgICB0LnNlbmRSZXNwb25zZUhlYWRlcnMoNTAwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHQuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3htbC9qYXhwL2RhdGF0eXBlL1Rlc3RYTUxHcmVnb3JpYW5DYWxlbmRhclRpbWVab25lLmphdmEgYi9qZGsvdGVzdC9qYXZheC94bWwvamF4cC9kYXRhdHlwZS9UZXN0WE1MR3JlZ29yaWFuQ2FsZW5kYXJUaW1lWm9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJkNThlLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2phdmF4L3htbC9qYXhwL2RhdGF0eXBlL1Rlc3RYTUxHcmVnb3JpYW5DYWxlbmRhclRpbWVab25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjgzNjMKLSAqIEBzdW1tYXJ5IFhtbEdyZWdvcmlhbkNhbGVuZGFySW1wbC5nZXRUaW1lem9uZSgpIHJldHVybnMgd3JvbmcgdGltZXpvbmUgaWYKLSAqIG9mZnNldCdzIG1pbnV0ZXMgdmFsdWUgaXMgbGVzcyB0aGVuIDEwIChlLmcuIEdNVCsxMDowNSkKLSAqIEBydW4gbWFpbiBUZXN0WE1MR3JlZ29yaWFuQ2FsZW5kYXJUaW1lWm9uZQotKi8KLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLkRhdGF0eXBlQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotcHVibGljIGNsYXNzIFRlc3RYTUxHcmVnb3JpYW5DYWxlbmRhclRpbWVab25lIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBEYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24gewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYwOyBpKyspIHsKLSAgICAgICAgICAgIHRlc3QoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3QoaW50IG9mZnNldE1pbnV0ZXMpCi0gICAgICAgICAgICB0aHJvd3MgRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgY2FsZW5kYXIgPSBEYXRhdHlwZUZhY3RvcnkubmV3SW5zdGFuY2UoKS4KLSAgICAgICAgICAgICAgICBuZXdYTUxHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICBjYWxlbmRhci5zZXRUaW1lem9uZSg2MCArIG9mZnNldE1pbnV0ZXMpOwotICAgICAgICBUaW1lWm9uZSB0aW1lWm9uZSA9IGNhbGVuZGFyLmdldFRpbWVab25lKERhdGF0eXBlQ29uc3RhbnRzLkZJRUxEX1VOREVGSU5FRCk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IChvZmZzZXRNaW51dGVzIDwgMTAgPyAiR01UKzAxOjAiIDogIkdNVCswMToiKQotICAgICAgICAgICAgICAgICsgb2Zmc2V0TWludXRlczsKLSAgICAgICAgaWYgKCF0aW1lWm9uZS5nZXRJRCgpLmVxdWFscyhleHBlY3RlZCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUZXN0IGZhaWxlZDogZXhwZWN0ZWQgdGltZXpvbmU6ICIgKwotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCArICIgQWN0dWFsOiAiICsgdGltZVpvbmUuZ2V0SUQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC94bWwvamF4cC9zdHJlYW0vODE1Mzc4MS9Ta2lwRFREVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgveG1sL2pheHAvc3RyZWFtLzgxNTM3ODEvU2tpcERURFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YmZiYS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9qYXZheC94bWwvamF4cC9zdHJlYW0vODE1Mzc4MS9Ta2lwRFREVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLmltcGwuWE1MRW50aXR5TWFuYWdlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTEV2ZW50UmVhZGVyOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uZXZlbnRzLlhNTEV2ZW50OwotaW1wb3J0IG9yZy50ZXN0bmcuQXNzZXJ0OwotaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgxNTM3ODEKLSAqIEBydW4gdGVzdG5nL290aGVydm0gU2tpcERURFRlc3QKLSAqIEBzdW1tYXJ5IFRlc3QgaWYgbWV0aG9kIHNraXBEVEQgb2YgY2xhc3MgWE1MRFREU2Nhbm5lckltcGwgd2lsbCBjb3JyZWN0bHkgc2tpcCB0aGUgRFREIHNlY3Rpb24sCi0gKiAgICAgICAgICBldmVuIGlmIGEgY2FsbCB0byBYTUxFbnRpdHlTY2FubmVyLnNjYW5EYXRhIGZvciBza2lwcGluZyB0byB0aGUgY2xvc2luZyAnXScgcmV0dXJucyB0cnVlLgotICovCi1wdWJsaWMgY2xhc3MgU2tpcERURFRlc3QgewotICAgIHB1YmxpYyBzdGF0aWMgaW50IERPQ1RZUEVfU0VDVElPTl9MRU5HVEggPSBYTUxFbnRpdHlNYW5hZ2VyLkRFRkFVTFRfQlVGRkVSX1NJWkUgKiAyOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IERPQ1VNRU5UX0xFTkdUSCA9IERPQ1RZUEVfU0VDVElPTl9MRU5HVEggKyA0MDk2OwotCi0gICAgcHVibGljIFN0cmluZyBjcmVhdGVYTUxEb2N1bWVudChpbnQgZG9jdHlwZW9mZnNldCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHhtbGNvbnRlbnRidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoRE9DVU1FTlRfTEVOR1RIKTsKLSAgICAgICAgeG1sY29udGVudGJ1aWxkZXIuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJJU08tODg1OS0xXCI/PlxyXG4iKTsKLSAgICAgICAgeG1sY29udGVudGJ1aWxkZXIuYXBwZW5kKCI8IURPQ1RZUEUgZHVtbXkgW1xyXG4iKTsKLSAgICAgICAgeG1sY29udGVudGJ1aWxkZXIuYXBwZW5kKCIgIDwhRUxFTUVOVCBkdW1teSBFTVBUWT5cclxuIik7Ci0gICAgICAgIHhtbGNvbnRlbnRidWlsZGVyLmFwcGVuZCgiICA8IS0tXHJcbiIpOwotICAgICAgICBpbnQgZG9jdHlwZWxpbmVzID0gRE9DVFlQRV9TRUNUSU9OX0xFTkdUSCAvIDM7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jdHlwZW9mZnNldDsgaSsrKQotICAgICAgICAgICAgeG1sY29udGVudGJ1aWxkZXIuYXBwZW5kKCdhJyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jdHlwZWxpbmVzOyBpKyspCi0gICAgICAgICAgICB4bWxjb250ZW50YnVpbGRlci5hcHBlbmQoImFcclxuIik7Ci0gICAgICAgIHhtbGNvbnRlbnRidWlsZGVyLmFwcGVuZCgiICAtLT5cclxuIik7Ci0gICAgICAgIHhtbGNvbnRlbnRidWlsZGVyLmFwcGVuZCgiICBdXHJcbiIpOwotICAgICAgICB4bWxjb250ZW50YnVpbGRlci5hcHBlbmQoIj5cclxuIik7Ci0gICAgICAgIHhtbGNvbnRlbnRidWlsZGVyLmFwcGVuZCgiPGR1bW15PlxyXG4iKTsKLSAgICAgICAgeG1sY29udGVudGJ1aWxkZXIuYXBwZW5kKCI8L2R1bW15PlxyXG4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb2N1bWVudCBsZW5ndGg6IiArIHhtbGNvbnRlbnRidWlsZGVyLmxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuIHhtbGNvbnRlbnRidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcnVuUmVhZGVyKFhNTElucHV0RmFjdG9yeSBmYWN0b3J5LCBpbnQgb2Zmc2V0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nUmVhZGVyIHN0cmluZ1JlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoY3JlYXRlWE1MRG9jdW1lbnQob2Zmc2V0KSk7Ci0gICAgICAgIFhNTEV2ZW50UmVhZGVyIHJlYWRlciA9IGZhY3RvcnkuY3JlYXRlWE1MRXZlbnRSZWFkZXIoc3RyaW5nUmVhZGVyKTsKLQotICAgICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgWE1MRXZlbnQgZXZlbnQgPSByZWFkZXIubmV4dEV2ZW50KCk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV2ZW50IFR5cGU6ICIgKyBldmVudC5nZXRFdmVudFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBYTUxJbnB1dEZhY3RvcnkgZmFjdG9yeSA9IFhNTElucHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmFjdG9yeS5zZXRQcm9wZXJ0eShYTUxJbnB1dEZhY3RvcnkuU1VQUE9SVF9EVEQsIGZhbHNlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcnVuUmVhZGVyKGZhY3RvcnksIGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24geGUpIHsKLSAgICAgICAgICAgIHhlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoeGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmF4L3htbC9qYXhwL3RyYW5zZm9ybS84MTYyNTk4L1RyYW5zZm9ybWVyVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgveG1sL2pheHAvdHJhbnNmb3JtLzgxNjI1OTgvVHJhbnNmb3JtZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWQzOTguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgveG1sL2pheHAvdHJhbnNmb3JtLzgxNjI1OTgvVHJhbnNmb3JtZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qIEB0ZXN0Ci0gKiBAYnVnIDgxNjI1OTgKLSAqIEBzdW1tYXJ5IFRlc3QgWFNMVEMgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcywgZXNwZWNpYWxseSBlbXB0eSBuYW1lc3BhY2UgZGVmaW5pdGlvbnMgdG8gcmVzZXQgdGhlCi0gKiAgICAgICAgICBkZWZhdWx0IG5hbWVzcGFjZS4KLSAqIEBydW4gdGVzdG5nL290aGVydm0gVHJhbnNmb3JtZXJUZXN0Ci0gKi8KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci0KLWltcG9ydCBvcmcudGVzdG5nLkFzc2VydDsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5zdW4ub3JnLmFwYWNoZS54bWwuaW50ZXJuYWwuc2VyaWFsaXplLk91dHB1dEZvcm1hdDsKLWltcG9ydCBjb20uc3VuLm9yZy5hcGFjaGUueG1sLmludGVybmFsLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtZXJUZXN0IHsKLQotICAgIHByaXZhdGUgVHJhbnNmb3JtZXIgY3JlYXRlVHJhbnNmb3JtZXJGcm9tSW5wdXRzdHJlYW0oSW5wdXRTdHJlYW0geHNsU3RyZWFtKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIobmV3IFN0cmVhbVNvdXJjZSh4c2xTdHJlYW0pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERvY3VtZW50IHRyYW5zZm9ybUlucHV0U3RyZWFtVG9Eb2N1bWVudChUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBET01SZXN1bHQgcmVzcG9uc2UgPSBuZXcgRE9NUmVzdWx0KCk7Ci0gICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKHNvdXJjZVN0cmVhbSksIHJlc3BvbnNlKTsKLSAgICAgICAgcmV0dXJuIChEb2N1bWVudClyZXNwb25zZS5nZXROb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXRpbGl0eSBtZXRob2QgZm9yIHRlc3RCdWc4MTYyNTk4KCkuCi0gICAgICogUHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBjaGVjay9hc3NlcnQgdGhlIGV4cGVjdGVkIG5hbWVzcGFjZXMKLSAgICAgKiBvZiBhIE5vZGUgYW5kIGl0cyBzaWJsaW5ncy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0Ci0gICAgICogVGhlIG5vZGUgdG8gY2hlY2sKLSAgICAgKiBAcGFyYW0gbnN0ZXN0Ci0gICAgICogRXhwZWN0ZWQgbmFtZXNwYWNlIG9mIHRoZSBub2RlCi0gICAgICogQHBhcmFtIG5zYgotICAgICAqIEV4cGVjdGVkIG5hbWVzcGFjZSBvZiB0aGUgZmlyc3Qgc2libGluZwotICAgICAqIEBwYXJhbSBuc2MKLSAgICAgKiBFeHBlY3RlZCBuYW1lc3BhY2Ugb2YgdGhlIGZpcnN0IHNpYmxpbmcgb2YgdGhlIGZpcnN0IHNpYmxpbmcKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tOb2RlTlM4MTYyNTk4KE5vZGUgdGVzdCwgU3RyaW5nIG5zdGVzdCwgU3RyaW5nIG5zYiwgU3RyaW5nIG5zYykgewotICAgICAgICBTdHJpbmcgdGVzdE5vZGVOYW1lID0gdGVzdC5nZXROb2RlTmFtZSgpOwotICAgICAgICBpZiAobnN0ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRlc3QuZ2V0TmFtZXNwYWNlVVJJKCksICJ1bmV4cGVjdGVkIG5hbWVzcGFjZSBmb3IgIiArIHRlc3ROb2RlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3QuZ2V0TmFtZXNwYWNlVVJJKCksIG5zdGVzdCwgInVuZXhwZWN0ZWQgbmFtZXNwYWNlIGZvciAiICsgdGVzdE5vZGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBOb2RlIGIgPSB0ZXN0LmdldENoaWxkTm9kZXMoKS5pdGVtKDApOwotICAgICAgICBpZiAobnNiID09IG51bGwpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGIuZ2V0TmFtZXNwYWNlVVJJKCksICJ1bmV4cGVjdGVkIG5hbWVzcGFjZSBmb3IgIiArIHRlc3ROb2RlTmFtZSArICItPmIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYi5nZXROYW1lc3BhY2VVUkkoKSwgbnNiLCAidW5leHBlY3RlZCBuYW1lc3BhY2UgZm9yICIgKyB0ZXN0Tm9kZU5hbWUgKyAiLT5iIik7Ci0gICAgICAgIH0KLSAgICAgICAgTm9kZSBjID0gYi5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKTsKLSAgICAgICAgaWYgKG5zYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChjLmdldE5hbWVzcGFjZVVSSSgpLCAidW5leHBlY3RlZCBuYW1lc3BhY2UgZm9yICIgKyB0ZXN0Tm9kZU5hbWUgKyAiLT5iLT5jIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGMuZ2V0TmFtZXNwYWNlVVJJKCksIG5zYywgInVuZXhwZWN0ZWQgbmFtZXNwYWNlIGZvciAiICsgdGVzdE5vZGVOYW1lICsgIi0+Yi0+YyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAYnVnIDgxNjI1OTgKLSAgICAgKiBAc3VtbWFyeSBUZXN0IFhTTFRDIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMsIGVzcGVjaWFsbHkgZW1wdHkgbmFtZXNwYWNlIGRlZmluaXRpb25zIHRvIHJlc2V0IHRoZQotICAgICAqICAgICAgICAgIGRlZmF1bHQgbmFtZXNwYWNlCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QnVnODE2MjU5OCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHhzbCA9Ci0gICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICI8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtXCIgdmVyc2lvbj1cIjEuMFwiPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCIvXCI+IiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICIgICAgICAgIDxyb290IHhtbG5zPVwibnMxXCI+IiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICIgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT1cInRyYW5zZm9ybVwiLz4iICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgIiAgICAgICAgPC9yb290PiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgIDwveHNsOnRlbXBsYXRlPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgIDx4c2w6dGVtcGxhdGUgbmFtZT1cInRyYW5zZm9ybVwiPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgICAgICA8dGVzdDEgeG1sbnM9XCJuczJcIj48YiB4bWxucz1cIm5zMlwiPjxjIHhtbG5zPVwiXCI+PC9jPjwvYj48L3Rlc3QxPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgICAgICA8dGVzdDIgeG1sbnM9XCJuczFcIj48YiB4bWxucz1cIm5zMlwiPjxjIHhtbG5zPVwiXCI+PC9jPjwvYj48L3Rlc3QyPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgICAgICA8dGVzdDM+PGI+PGMgeG1sbnM9XCJcIj48L2M+PC9iPjwvdGVzdDM+IiArIExJTkVfU0VQQVJBVE9SICsKLSAgICAgICAgICAgICIgICAgICAgIDx0ZXN0NCB4bWxucz1cIlwiPjxiPjxjIHhtbG5zPVwiXCI+PC9jPjwvYj48L3Rlc3Q0PiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgICAgICA8dGVzdDUgeG1sbnM9XCJuczFcIj48Yj48YyB4bWxucz1cIlwiPjwvYz48L2I+PC90ZXN0NT4iICsgTElORV9TRVBBUkFUT1IgKwotICAgICAgICAgICAgIiAgICAgICAgPHRlc3Q2IHhtbG5zPVwiXCIvPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiICAgIDwveHNsOnRlbXBsYXRlPiIgKyBMSU5FX1NFUEFSQVRPUiArCi0gICAgICAgICAgICAiPC94c2w6c3R5bGVzaGVldD4iOwotCi0KLSAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZVhtbCA9Ci0gICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PjxhYWE+PC9hYWE+IiArIExJTkVfU0VQQVJBVE9SOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3R5bGVzaGVldDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oeHNsKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTb3VyY2UgYmVmb3JlIHRyYW5zZm9ybWF0aW9uOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2VYbWwpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3VsdCBhZnRlciB0cmFuc2Zvcm1hdGlvbjoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gdHJhbnNmb3JtSW5wdXRTdHJlYW1Ub0RvY3VtZW50KAotICAgICAgICAgICAgY3JlYXRlVHJhbnNmb3JtZXJGcm9tSW5wdXRzdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhzbC5nZXRCeXRlcygpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc291cmNlWG1sLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IG5ldyBPdXRwdXRGb3JtYXQoKTsKLSAgICAgICAgZm9ybWF0LnNldEluZGVudGluZyh0cnVlKTsKLSAgICAgICAgbmV3IFhNTFNlcmlhbGl6ZXIoU3lzdGVtLm91dCwgZm9ybWF0KS5zZXJpYWxpemUoZG9jdW1lbnQpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICAgICAgY2hlY2tOb2RlTlM4MTYyNTk4KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZXN0MSIpLml0ZW0oMCksICJuczIiLCAibnMyIiwgbnVsbCk7Ci0gICAgICAgIGNoZWNrTm9kZU5TODE2MjU5OChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGVzdDIiKS5pdGVtKDApLCAibnMxIiwgIm5zMiIsIG51bGwpOwotICAgICAgICBjaGVja05vZGVOUzgxNjI1OTgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRlc3QzIikuaXRlbSgwKSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGNoZWNrTm9kZU5TODE2MjU5OChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGVzdDQiKS5pdGVtKDApLCBudWxsLCBudWxsLCBudWxsKTsKLSAgICAgICAgY2hlY2tOb2RlTlM4MTYyNTk4KGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZXN0NSIpLml0ZW0oMCksICJuczEiLCAibnMxIiwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZXN0NiIpLml0ZW0oMCkuZ2V0TmFtZXNwYWNlVVJJKCksICJ1bmV4cGVjdGVkIG5hbWVzcGFjZSBmb3IgdGVzdDYiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC94bWwvamF4cC90cmFuc2Zvcm0vODE2NzE3OS9OYW1lc3BhY2VQcmVmaXhUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZheC94bWwvamF4cC90cmFuc2Zvcm0vODE2NzE3OS9OYW1lc3BhY2VQcmVmaXhUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDQ2NDEuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvamF2YXgveG1sL2pheHAvdHJhbnNmb3JtLzgxNjcxNzkvTmFtZXNwYWNlUHJlZml4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UZW1wbGF0ZXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OwotaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRUcnVlOwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODE2NzE3OQotICogQHJ1biB0ZXN0bmcvb3RoZXJ2bSBOYW1lc3BhY2VQcmVmaXhUZXN0Ci0gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHRlc3RzIHRoZSBnZW5lcmF0aW9uIG9mIG5hbWVzcGFjZSBwcmVmaXhlcwotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlUHJlZml4VGVzdCB7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXVzZVRlbXBsYXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgZmluYWwgU291cmNlIHhzbHNyYyA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IFN0cmluZ1JlYWRlcihYU0wpKTsKLSAgICAgICAgZmluYWwgVGVtcGxhdGVzIHRtcGwgPSB0Zi5uZXdUZW1wbGF0ZXMoeHNsc3JjKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUUkFOU0ZfQ09VTlQ7IGkrKykgewotICAgICAgICAgICAgY2hlY2tSZXN1bHQoZG9UcmFuc2Zvcm1hdGlvbih0bXBsLm5ld1RyYW5zZm9ybWVyKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJldXNlVHJhbnNmb3JtZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNvdXJjZSB4c2xzcmMgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoWFNMKSk7Ci0gICAgICAgIGZpbmFsIFRyYW5zZm9ybWVyIHQgPSB0Zi5uZXdUcmFuc2Zvcm1lcih4c2xzcmMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRSQU5TRl9DT1VOVDsgaSsrKSB7Ci0gICAgICAgICAgICBjaGVja1Jlc3VsdChkb1RyYW5zZm9ybWF0aW9uKHQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRUcmFuc2Zvcm1hdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgVHJhbnNmb3JtZXJGYWN0b3J5IHRmID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIGZpbmFsIFNvdXJjZSB4c2xzcmMgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoWFNMKSk7Ci0gICAgICAgIGZpbmFsIFRlbXBsYXRlcyB0bXBsID0gdGYubmV3VGVtcGxhdGVzKHhzbHNyYyk7Ci0gICAgICAgIGNvbmN1cnJlbnRUZXN0UGFzc2VkLnNldCh0cnVlKTsKLQotICAgICAgICAvLyBFeGVjdXRlIG11bHRpcGxlIFRlc3RXb3JrZXIgdGFza3MKLSAgICAgICAgZm9yIChpbnQgaWQgPSAwOyBpZCA8IFRIUkVBRFNfQ09VTlQ7IGlkKyspIHsKLSAgICAgICAgICAgIEVYRUNVVE9SLmV4ZWN1dGUobmV3IFRyYW5zZm9ybWVyVGhyZWFkKHRtcGwubmV3VHJhbnNmb3JtZXIoKSwgaWQpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBJbml0aWF0ZSBzaHV0ZG93biBvZiBwcmV2aW91c2x5IHN1Ym1pdHRlZCB0YXNrCi0gICAgICAgIEVYRUNVVE9SLnNodXRkb3duKCk7Ci0gICAgICAgIC8vIFdhaXQgZm9yIHRlcm1pbmF0aW9uIG9mIHN1Ym1pdHRlZCB0YXNrcwotICAgICAgICBpZiAoIUVYRUNVVE9SLmF3YWl0VGVybWluYXRpb24oVEhSRUFEU19DT1VOVCwgVGltZVVuaXQuU0VDT05EUykpIHsKLSAgICAgICAgICAgIC8vIElmIG5vdCBhbGwgdGFza3MgdGVybWluYXRlcyBkdXJpbmcgdGhlIHRpbWUgb3V0IGZvcmNlIHRoZW0gdG8gc2h1dGRvd24KLSAgICAgICAgICAgIEVYRUNVVE9SLnNodXRkb3duTm93KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYWxsIHRyYW5zZm9ybWF0aW9uIHRocmVhZHMgZ2VuZXJhdGVkIHRoZSBjb3JyZWN0IG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb25jdXJyZW50VGVzdFBhc3NlZC5nZXQoKSk7Ci0gICAgfQotCi0gICAgLy8gRG8gb25lIHRyYW5zZm9ybWF0aW9uIHdpdGggdGhlIHByb3ZpZGVkIHRyYW5zZm9ybWVyCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRvVHJhbnNmb3JtYXRpb24oVHJhbnNmb3JtZXIgdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciByZXNXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFNvdXJjZSB4bWxTcmMgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBTdHJpbmdSZWFkZXIoWE1MKSk7Ci0gICAgICAgIHQudHJhbnNmb3JtKHhtbFNyYywgbmV3IFN0cmVhbVJlc3VsdChyZXNXcml0ZXIpKTsKLSAgICAgICAgcmV0dXJuIHJlc1dyaXRlci50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgc3RyaW5nIGNvbnRhaW5zIHRoZQotICAgIC8vIGVsZW1lbnQgd2l0aCB0aGUgZXhhY3QgbmFtZXNwYWNlIHByZWZpeCBnZW5lcmF0ZWQuCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1Jlc3VsdChTdHJpbmcgcmVzdWx0KSB7Ci0gICAgICAgIC8vIENoZWNrIHByZWZpeCBvZiAnRWxlbWVudDInIGVsZW1lbnQsIGl0IHNob3VsZCBhbHdheXMgYmUgdGhlIHNhbWUKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoRVhQRUNURURfQ09OVEVOVCkpOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHQgc3RyaW5nIGNvbnRhaW5zIHRoZSBlbGVtZW50IHdpdGgKLSAgICAvLyB0aGUgZXhhY3QgbmFtZXNwYWNlIHByZWZpeCBnZW5lcmF0ZWQgYnkgY3VycmVudCB0aHJlYWQuCi0gICAgLy8gSWYgdGhlIGV4cGVjdGVkIHByZWZpeCBpcyBub3QgZm91bmQgYW5kIHRoZXJlIHdhcyBubyBmYWlsdXJlcyBvYnNlcnZlZCBieQotICAgIC8vIG90aGVyIHRlc3QgdGhyZWFkcyB0aGVuIG1hcmsgY29uY3VycmVudCB0ZXN0IGFzIGZhaWxlZC4KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVGhyZWFkUmVzdWx0KFN0cmluZyByZXN1bHQsIGludCBpZCkgewotICAgICAgICBib29sZWFuIHJlcyA9IHJlc3VsdC5jb250YWlucyhFWFBFQ1RFRF9DT05URU5UKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiVkOiB0cmFuc2Zvcm1hdGlvbiByZXN1bHQ6ICVzJW4iLCBpZCwgcmVzID8gIlBhc3MiIDogIkZhaWwiKTsKLSAgICAgICAgaWYgKCFyZXMpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlZCByZXN1bHQ6JXMlbiIsIGlkLCByZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIGNvbmN1cnJlbnRUZXN0UGFzc2VkLmNvbXBhcmVBbmRTZXQodHJ1ZSwgcmVzKTsKLSAgICB9Ci0KLSAgICAvLyBUcmFuc2Zvcm1lclRocmVhZCB0YXNrIHRoYXQgZG9lcyB0aGUgdHJhbnNmb3JtYXRpb24gc2ltaWxhcgotICAgIC8vIHRvIHRlc3RSZXVzZVRyYW5zZm9ybWVyIHRlc3QgbWV0aG9kCi0gICAgcHJpdmF0ZSBjbGFzcyBUcmFuc2Zvcm1lclRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpZDsKLQotICAgICAgICBUcmFuc2Zvcm1lclRocmVhZChUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciwgaW50IGlkKSB7Ci0gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJWQ6IHdhaXRpbmcgZm9yIGJhcnJpZXIlbiIsIGlkKTsKLSAgICAgICAgICAgICAgICAvL1N5bmNocm9uaXplIHN0YXJ0dXAgb2YgYWxsIHRhc2tzCi0gICAgICAgICAgICAgICAgQkFSUklFUi5hd2FpdCgpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlZDogc3RhcnRpbmcgdHJhbnNmb3JtYXRpb24lbiIsIGlkKTsKLSAgICAgICAgICAgICAgICBjaGVja1RocmVhZFJlc3VsdChkb1RyYW5zZm9ybWF0aW9uKHRyYW5zZm9ybWVyKSwgaWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyYW5zZm9ybWVyVGhyZWFkICIgKyBpZCArICIgZmFpbGVkIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTnVtYmVyIG9mIHN1YnNlcXVlbnQgdHJhbnNmb3JtYXRpb25zCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSQU5TRl9DT1VOVCA9IDEwOwotCi0gICAgLy8gTnVtYmVyIG9mIHRyYW5zZm9ybWVyIHRocmVhZHMgcnVubmluZyBjb25jdXJlbnRseQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJFQURTX0NPVU5UID0gMTA7Ci0KLSAgICAvLyBWYXJpYWJsZSBmb3Igc3RvcmluZyB0aGUgY29uY3VycmVudCB0cmFuc2Zvcm1hdGlvbiB0ZXN0IHJlc3VsdC4gSXQgaXMKLSAgICAvLyB1cGRhdGVkIGJ5IHRyYW5zZm9ybWVyIHRocmVhZHMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIGNvbmN1cnJlbnRUZXN0UGFzc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7Ci0KLSAgICAvLyBDeWNsaWMgYmFycmllciBmb3IgdGhyZWFkcyBzdGFydHVwIHN5bmNocm9uaXphdGlvbgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEN5Y2xpY0JhcnJpZXIgQkFSUklFUiA9IG5ldyBDeWNsaWNCYXJyaWVyKFRIUkVBRFNfQ09VTlQpOwotCi0gICAgLy8gVGhyZWFkIHBvb2wKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgRVhFQ1VUT1IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOwotCi0gICAgLy8gWFNMIHRoYXQgdHJhbnNmb3JtcyBYTUwgYW5kIHByb2R1Y2VzIHVuaXF1ZSBuYW1lc3BhY2UgcHJlZml4ZXMgZm9yIGVhY2ggZWxlbWVudAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYU0wgPSAiPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249XCIxLjBcIiB4bWxuczp4c2w9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm1cIj5cbiIKLSAgICAgICAgICAgICsgIiA8eHNsOnRlbXBsYXRlIG1hdGNoPVwibm9kZSgpfEAqXCIgcHJpb3JpdHk9XCIxXCI+XG4iCi0gICAgICAgICAgICArICIgICAgIDx4c2w6Y29weT5cbiIKLSAgICAgICAgICAgICsgIiAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJub2RlKCl8QCpcIi8+XG4iCi0gICAgICAgICAgICArICIgICAgIDwveHNsOmNvcHk+XG4iCi0gICAgICAgICAgICArICIgPC94c2w6dGVtcGxhdGU+XG4iCi0gICAgICAgICAgICArICIgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIipcIiBwcmlvcml0eT1cIjJcIj5cbiIKLSAgICAgICAgICAgICsgIiAgPHhzbDplbGVtZW50IG5hbWU9XCJ7bmFtZSgpfVwiIG5hbWVzcGFjZT1cIntuYW1lc3BhY2UtdXJpKCl9XCI+XG4iCi0gICAgICAgICAgICArICIgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJub2RlKCl8QCpcIi8+XG4iCi0gICAgICAgICAgICArICIgIDwveHNsOmVsZW1lbnQ+XG4iCi0gICAgICAgICAgICArICIgPC94c2w6dGVtcGxhdGU+XG4iCi0gICAgICAgICAgICArICI8L3hzbDpzdHlsZXNoZWV0PiI7Ci0KLSAgICAvLyBTaW1wbGUgWE1MIGNvbnRlbnQgd2l0aCByb290IGFuZCB0d28gY2hpbGQgZWxlbWVudHMKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MID0gIjxUZXN0Um9vdCB4bWxucz1cInRlc3QueG1sbnNcIj5cbiIKLSAgICAgICAgICAgICsgIiAgPEVsZW1lbnQxIHhtbG5zPVwidGVzdC54bWxuc1wiPlxuIgotICAgICAgICAgICAgKyAiICA8L0VsZW1lbnQxPlxuIgotICAgICAgICAgICAgKyAiICA8RWxlbWVudDIgeG1sbnM9XCJ0ZXN0LnhtbG5zXCI+XG4iCi0gICAgICAgICAgICArICIgIDwvRWxlbWVudDI+XG4iCi0gICAgICAgICAgICArICI8L1Rlc3RSb290PiI7Ci0KLSAgICAvLyBXaXRoIHRocmVhZCBsb2NhbCBuYW1lc3BhY2UgcHJlZml4IGluZGV4IGVhY2ggdHJhbnNmb3JtYXRpb24gcmVzdWx0IHNob3VsZAotICAgIC8vIGJlIHRoZSBzYW1lIGFuZCBjb250YWluIHRoZSBzYW1lIHByZWZpeCBmb3IgRWxlbWVudDIKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhQRUNURURfQ09OVEVOVCA9ICI8L25zMjpFbGVtZW50Mj4iOwotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9saWIvdGVzdGxpYnJhcnkvamRrL3Rlc3RsaWJyYXJ5L0phclV0aWxzLmphdmEgYi9qZGsvdGVzdC9saWIvdGVzdGxpYnJhcnkvamRrL3Rlc3RsaWJyYXJ5L0phclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzU5NGQuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3QvbGliL3Rlc3RsaWJyYXJ5L2pkay90ZXN0bGlicmFyeS9KYXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGpkay50ZXN0bGlicmFyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKLQotLyoqCi0gKiBDb21tb24gbGlicmFyeSBmb3IgdmFyaW91cyB0ZXN0IGphciBmaWxlIHV0aWxpdHkgZnVuY3Rpb25zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmFyVXRpbHMgewotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgamFyIGZpbGUgd2l0aCBzcGVjaWZpZWQgZmlsZXMuIElmIGEgc3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3QsCi0gICAgICogYSBuZXcgamFyIGVudHJ5IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBmaWxlIG5hbWUgaXRzZWxmIGFzIHRoZSBjb250ZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVKYXIoU3RyaW5nIGRlc3QsIFBhdGggZmlsZXNMb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy4uLiBmaWxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCksIG5ldyBNYW5pZmVzdCgpKSkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQWRkaW5nICVzIHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBkZXN0KSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBhZGQgYW4gYXJjaGl2ZSBlbnRyeSwgYW5kIHdyaXRlIGEgZmlsZQotICAgICAgICAgICAgICAgIGpvcy5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KGZpbGVOYW1lKSk7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlOwotICAgICAgICAgICAgICAgIGlmIChmaWxlc0xvY2F0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGVzTG9jYXRpb24ucmVzb2x2ZShmaWxlTmFtZSkudG9GaWxlKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICBVdGlscy50cmFuc2ZlckJldHdlZW5TdHJlYW1zKGZpcywgam9zKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBqb3Mud3JpdGUoZmlsZU5hbWUuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBqYXIgZmlsZSB3aXRoIHNwZWNpZmllZCBmaWxlcyBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVKYXIoU3RyaW5nIGRlc3QsIFN0cmluZy4uLiBmaWxlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZUphcihkZXN0LCBudWxsLCBmaWxlcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIG9yIHJlbW92ZSBzcGVjaWZpZWQgZmlsZXMgdG8gZXhpc3RpbmcgamFyIGZpbGUuIElmIGEgc3BlY2lmaWVkIGZpbGUKLSAgICAgKiB0byBiZSB1cGRhdGVkIG9yIGFkZGVkIGRvZXMgbm90IGV4aXN0LCB0aGUgamFyIGVudHJ5IHdpbGwgYmUgY3JlYXRlZAotICAgICAqIHdpdGggdGhlIGZpbGUgbmFtZSBpdHNlbGYgYXMgdGhlIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3JjIHRoZSBvcmlnaW5hbCBqYXIgZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGRlc3QgdGhlIG5ldyBqYXIgZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGZpbGVzIHRoZSBmaWxlcyB0byB1cGRhdGUuIFRoZSBsaXN0IGlzIGJyb2tlbiBpbnRvIDIgZ3JvdXBzCi0gICAgICogICAgICAgICAgICAgIGJ5IGEgIi0iIHN0cmluZy4gVGhlIGZpbGVzIGJlZm9yZSBpbiB0aGUgMXN0IGdyb3VwIHdpbGwKLSAgICAgKiAgICAgICAgICAgICAgYmUgZWl0aGVyIHVwZGF0ZWQgb3IgYWRkZWQuIFRoZSBmaWxlcyBpbiB0aGUgMm5kIGdyb3VwCi0gICAgICogICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZC4gSWYgbm8gIi0iIGV4aXN0cywgYWxsIGZpbGVzIGJlbG9uZyB0bwotICAgICAqICAgICAgICAgICAgICB0aGUgMXN0IGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVKYXIoU3RyaW5nIHNyYywgU3RyaW5nIGRlc3QsIFN0cmluZy4uLiBmaWxlcykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCkpKSB7Ci0KLSAgICAgICAgICAgIC8vIGNvcHkgZWFjaCBvbGQgZW50cnkgaW50byBkZXN0aW5hdGlvbiB1bmxlc3MgdGhlIGVudHJ5IG5hbWUKLSAgICAgICAgICAgIC8vIGlzIGluIHRoZSB1cGRhdGVkIGxpc3QKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB1cGRhdGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIHRyeSAoSmFyRmlsZSBzcmNKYXJGaWxlID0gbmV3IEphckZpbGUoc3JjKSkgewotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gc3JjSmFyRmlsZS5lbnRyaWVzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5lcXVhbHMoIi0iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscyhmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRGaWxlcy5hZGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiVXBkYXRpbmcgJXMgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsIG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvcy5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KG5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy50cmFuc2ZlckJldHdlZW5TdHJlYW1zKGZpcywgam9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3Mud3JpdGUobmFtZS5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJSZW1vdmluZyAlcyBmcm9tICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGRlc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJDb3B5aW5nICVzIHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZGVzdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgam9zLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy50cmFuc2ZlckJldHdlZW5TdHJlYW1zKHNyY0phckZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElucHV0U3RyZWFtKGVudHJ5KSwgam9zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXBwZW5kIG5ldyBmaWxlcwotICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKCItIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZEZpbGVzLmNvbnRhaW5zKGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBZGRpbmcgJXMgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCwgZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICBqb3MucHV0TmV4dEVudHJ5KG5ldyBKYXJFbnRyeShmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnRyYW5zZmVyQmV0d2VlblN0cmVhbXMoZmlzLCBqb3MpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgam9zLndyaXRlKGZpbGUuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2xpYi90ZXN0bGlicmFyeS9qZGsvdGVzdGxpYnJhcnkvT3V0cHV0QW5hbHl6ZXIuamF2YSBiL2pkay90ZXN0L2xpYi90ZXN0bGlicmFyeS9qZGsvdGVzdGxpYnJhcnkvT3V0cHV0QW5hbHl6ZXIuamF2YQppbmRleCBiNzYwYjliLi43YzBkMzY0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9saWIvdGVzdGxpYnJhcnkvamRrL3Rlc3RsaWJyYXJ5L091dHB1dEFuYWx5emVyLmphdmEKKysrIGIvamRrL3Rlc3QvbGliL3Rlc3RsaWJyYXJ5L2pkay90ZXN0bGlicmFyeS9PdXRwdXRBbmFseXplci5qYXZhCkBAIC05MCwxNCArOTAsMTMgQEAKICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0QW5hbHl6ZXIgc2hvdWxkQ29udGFpbihTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRDb250YWluKFN0cmluZyBleHBlY3RlZFN0cmluZykgewogICAgICAgICBpZiAoIXN0ZG91dC5jb250YWlucyhleHBlY3RlZFN0cmluZykKICAgICAgICAgICAgICAgICAmJiAhc3RkZXJyLmNvbnRhaW5zKGV4cGVjdGVkU3RyaW5nKSkgewogICAgICAgICAgICAgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIGV4cGVjdGVkU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICsgIicgbWlzc2luZyBmcm9tIHN0ZG91dC9zdGRlcnIgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTEwOCwxMyArMTA3LDEyIEBACiAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmluZyB3YXMgbm90IGZvdW5kCiAgICAgICovCi0gICAgcHVibGljIE91dHB1dEFuYWx5emVyIHN0ZG91dFNob3VsZENvbnRhaW4oU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7CisgICAgcHVibGljIHZvaWQgc3Rkb3V0U2hvdWxkQ29udGFpbihTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKICAgICAgICAgaWYgKCFzdGRvdXQuY29udGFpbnMoZXhwZWN0ZWRTdHJpbmcpKSB7CiAgICAgICAgICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiciICsgZXhwZWN0ZWRTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgKyAiJyBtaXNzaW5nIGZyb20gc3Rkb3V0IFxuIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjUsMjUgKzEyMywyNCBAQAogICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIHRoZSBzdHJpbmcgd2FzIG5vdCBmb3VuZAogICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRBbmFseXplciBzdGRlcnJTaG91bGRDb250YWluKFN0cmluZyBleHBlY3RlZFN0cmluZykgeworICAgIHB1YmxpYyB2b2lkIHN0ZGVyclNob3VsZENvbnRhaW4oU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7CiAgICAgICAgIGlmICghc3RkZXJyLmNvbnRhaW5zKGV4cGVjdGVkU3RyaW5nKSkgewogICAgICAgICAgICAgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIGV4cGVjdGVkU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICsgIicgbWlzc2luZyBmcm9tIHN0ZGVyciBcbiIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFZlcmlmeSB0aGF0IHRoZSBzdGRvdXQgYW5kIHN0ZGVyciBjb250ZW50cyBvZiBvdXRwdXQgYnVmZmVyIGRvZXMgbm90CiAgICAgICogY29udGFpbiB0aGUgc3RyaW5nCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbm90RXhwZWN0ZWRTdHJpbmcKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRTdHJpbmcKICAgICAgKiAgICAgICAgICAgIFN0cmluZyB0aGF0IHRoZSBidWZmZXIgc2hvdWxkIG5vdCBjb250YWluCiAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgdGhlIHN0cmluZyB3YXMgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0QW5hbHl6ZXIgc2hvdWxkTm90Q29udGFpbihTdHJpbmcgbm90RXhwZWN0ZWRTdHJpbmcpIHsKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RDb250YWluKFN0cmluZyBub3RFeHBlY3RlZFN0cmluZykgewogICAgICAgICBpZiAoc3Rkb3V0LmNvbnRhaW5zKG5vdEV4cGVjdGVkU3RyaW5nKSkgewogICAgICAgICAgICAgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIG5vdEV4cGVjdGVkU3RyaW5nCkBAIC0xNTQsMjUgKzE1MSwyMyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiciICsgbm90RXhwZWN0ZWRTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgKyAiJyBmb3VuZCBpbiBzdGRlcnIgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBWZXJpZnkgdGhhdCB0aGUgc3Rkb3V0IGNvbnRlbnRzIG9mIG91dHB1dCBidWZmZXIgZG9lcyBub3QgY29udGFpbiB0aGUKICAgICAgKiBzdHJpbmcKICAgICAgKgotICAgICAqIEBwYXJhbSBub3RFeHBlY3RlZFN0cmluZworICAgICAqIEBwYXJhbSBleHBlY3RlZFN0cmluZwogICAgICAqICAgICAgICAgICAgU3RyaW5nIHRoYXQgdGhlIGJ1ZmZlciBzaG91bGQgbm90IGNvbnRhaW4KICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBJZiB0aGUgc3RyaW5nIHdhcyBmb3VuZAogICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRBbmFseXplciBzdGRvdXRTaG91bGROb3RDb250YWluKFN0cmluZyBub3RFeHBlY3RlZFN0cmluZykgeworICAgIHB1YmxpYyB2b2lkIHN0ZG91dFNob3VsZE5vdENvbnRhaW4oU3RyaW5nIG5vdEV4cGVjdGVkU3RyaW5nKSB7CiAgICAgICAgIGlmIChzdGRvdXQuY29udGFpbnMobm90RXhwZWN0ZWRTdHJpbmcpKSB7CiAgICAgICAgICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiciICsgbm90RXhwZWN0ZWRTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgKyAiJyBmb3VuZCBpbiBzdGRvdXQgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMCw3ICsxOTUsNyBAQAogICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIHRoZSBwYXR0ZXJuIHdhcyBub3QgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0QW5hbHl6ZXIgc2hvdWxkTWF0Y2goU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRNYXRjaChTdHJpbmcgcGF0dGVybikgewogICAgICAgICBNYXRjaGVyIHN0ZG91dE1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5NVUxUSUxJTkUpCiAgICAgICAgICAgICAgICAgLm1hdGNoZXIoc3Rkb3V0KTsKICAgICAgICAgTWF0Y2hlciBzdGRlcnJNYXRjaGVyID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKQpAQCAtMjEwLDcgKzIwNSw2IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJyIgKyBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICsgIicgbWlzc2luZyBmcm9tIHN0ZG91dC9zdGRlcnIgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMCw3ICsyMTQsNyBAQAogICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbgogICAgICAqICAgICAgICAgICAgIElmIHRoZSBwYXR0ZXJuIHdhcyBub3QgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0QW5hbHl6ZXIgc3Rkb3V0U2hvdWxkTWF0Y2goU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBwdWJsaWMgdm9pZCBzdGRvdXRTaG91bGRNYXRjaChTdHJpbmcgcGF0dGVybikgewogICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIoCiAgICAgICAgICAgICAgICAgc3Rkb3V0KTsKICAgICAgICAgaWYgKCFtYXRjaGVyLmZpbmQoKSkgewpAQCAtMjI4LDcgKzIyMiw2IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJyIgKyBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICsgIicgbWlzc2luZyBmcm9tIHN0ZG91dCBcbiIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM4LDcgKzIzMSw3IEBACiAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgdGhlIHBhdHRlcm4gd2FzIG5vdCBmb3VuZAogICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRBbmFseXplciBzdGRlcnJTaG91bGRNYXRjaChTdHJpbmcgcGF0dGVybikgeworICAgIHB1YmxpYyB2b2lkIHN0ZGVyclNob3VsZE1hdGNoKFN0cmluZyBwYXR0ZXJuKSB7CiAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCBQYXR0ZXJuLk1VTFRJTElORSkubWF0Y2hlcigKICAgICAgICAgICAgICAgICBzdGRlcnIpOwogICAgICAgICBpZiAoIW1hdGNoZXIuZmluZCgpKSB7CkBAIC0yNDYsNyArMjM5LDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIHBhdHRlcm4KICAgICAgICAgICAgICAgICAgICAgKyAiJyBtaXNzaW5nIGZyb20gc3RkZXJyIFxuIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTcsNyArMjQ5LDcgQEAKICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBJZiB0aGUgcGF0dGVybiB3YXMgZm91bmQKICAgICAgKi8KLSAgICBwdWJsaWMgT3V0cHV0QW5hbHl6ZXIgc2hvdWxkTm90TWF0Y2goU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RNYXRjaChTdHJpbmcgcGF0dGVybikgewogICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5NVUxUSUxJTkUpLm1hdGNoZXIoCiAgICAgICAgICAgICAgICAgc3Rkb3V0KTsKICAgICAgICAgaWYgKG1hdGNoZXIuZmluZCgpKSB7CkBAIC0yNzEsNyArMjYzLDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIHBhdHRlcm4gKyAiJyBmb3VuZCBpbiBzdGRlcnI6ICciCiAgICAgICAgICAgICAgICAgICAgICsgbWF0Y2hlci5ncm91cCgpICsgIicgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MiwxNCArMjczLDEzIEBACiAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgdGhlIHBhdHRlcm4gd2FzIGZvdW5kCiAgICAgICovCi0gICAgcHVibGljIE91dHB1dEFuYWx5emVyIHN0ZG91dFNob3VsZE5vdE1hdGNoKFN0cmluZyBwYXR0ZXJuKSB7CisgICAgcHVibGljIHZvaWQgc3Rkb3V0U2hvdWxkTm90TWF0Y2goU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKS5tYXRjaGVyKAogICAgICAgICAgICAgICAgIHN0ZG91dCk7CiAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIHBhdHRlcm4gKyAiJyBmb3VuZCBpbiBzdGRvdXQgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTMwMCwxNCArMjkwLDEzIEBACiAgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgSWYgdGhlIHBhdHRlcm4gd2FzIGZvdW5kCiAgICAgICovCi0gICAgcHVibGljIE91dHB1dEFuYWx5emVyIHN0ZGVyclNob3VsZE5vdE1hdGNoKFN0cmluZyBwYXR0ZXJuKSB7CisgICAgcHVibGljIHZvaWQgc3RkZXJyU2hvdWxkTm90TWF0Y2goU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKHBhdHRlcm4sIFBhdHRlcm4uTVVMVElMSU5FKS5tYXRjaGVyKAogICAgICAgICAgICAgICAgIHN0ZGVycik7CiAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCInIiArIHBhdHRlcm4gKyAiJyBmb3VuZCBpbiBzdGRlcnIgXG4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKQEAgLTM1NSwxMyArMzQ0LDEyIEBACiAgICAgICogICAgICAgICAgICAgSWYgdGhlIGV4aXQgdmFsdWUgZnJvbSB0aGUgcHJvY2VzcyBkaWQgbm90IG1hdGNoIHRoZSBleHBlY3RlZAogICAgICAqICAgICAgICAgICAgIHZhbHVlCiAgICAgICovCi0gICAgcHVibGljIE91dHB1dEFuYWx5emVyIHNob3VsZEhhdmVFeGl0VmFsdWUoaW50IGV4cGVjdGVkRXhpdFZhbHVlKSB7CisgICAgcHVibGljIHZvaWQgc2hvdWxkSGF2ZUV4aXRWYWx1ZShpbnQgZXhwZWN0ZWRFeGl0VmFsdWUpIHsKICAgICAgICAgaWYgKGdldEV4aXRWYWx1ZSgpICE9IGV4cGVjdGVkRXhpdFZhbHVlKSB7CiAgICAgICAgICAgICByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHRvIGdldCBleGl0IHZhbHVlIG9mIFsiCiAgICAgICAgICAgICAgICAgICAgICsgZXhwZWN0ZWRFeGl0VmFsdWUgKyAiXVxuIik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNjksMTIgKzM1NywxMSBAQAogICAgICAqIC0gc3RhbmRhcmQgaW5wdXQgcHJvZHVjZWQgYnkgdGhlIHByb2Nlc3MgdW5kZXIgdGVzdCAtIHN0YW5kYXJkIG91dHB1dCAtCiAgICAgICogZXhpdCBjb2RlIE5vdGU6IHRoZSBjb21tYW5kIGxpbmUgaXMgcHJpbnRlZCBieSB0aGUgUHJvY2Vzc1Rvb2xzCiAgICAgICovCi0gICAgcHJpdmF0ZSBPdXRwdXRBbmFseXplciByZXBvcnREaWFnbm9zdGljU3VtbWFyeSgpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0RGlhZ25vc3RpY1N1bW1hcnkoKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPSAiIHN0ZG91dDogWyIgKyBzdGRvdXQgKyAiXTtcbiIgKyAiIHN0ZGVycjogWyIgKyBzdGRlcnIKICAgICAgICAgICAgICAgICArICJdXG4iICsgIiBleGl0VmFsdWUgPSAiICsgZ2V0RXhpdFZhbHVlKCkgKyAiXG4iOwogCiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2xpYi90ZXN0bGlicmFyeS9qZGsvdGVzdGxpYnJhcnkvVXRpbHMuamF2YSBiL2pkay90ZXN0L2xpYi90ZXN0bGlicmFyeS9qZGsvdGVzdGxpYnJhcnkvVXRpbHMuamF2YQppbmRleCAzOTk5MDlmLi5jMjE5MjM0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9saWIvdGVzdGxpYnJhcnkvamRrL3Rlc3RsaWJyYXJ5L1V0aWxzLmphdmEKKysrIGIvamRrL3Rlc3QvbGliL3Rlc3RsaWJyYXJ5L2pkay90ZXN0bGlicmFyeS9VdGlscy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjksOCArMjksNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKQEAgLTMzNCw0MyArMzMyLDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAxMDI0OwotCi0gICAgLyoqCi0gICAgICogUmVhZHMgYWxsIGJ5dGVzIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgd3JpdGVzIHRoZSBieXRlcyB0byB0aGUKLSAgICAgKiBnaXZlbiBvdXRwdXQgc3RyZWFtIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJlYWQuIE9uIHJldHVybiwgdGhlCi0gICAgICogaW5wdXQgc3RyZWFtIHdpbGwgYmUgYXQgZW5kIG9mIHN0cmVhbS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2xvc2UgZWl0aGVyCi0gICAgICogc3RyZWFtLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBibG9jayBpbmRlZmluaXRlbHkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yCi0gICAgICogd3JpdGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlIGJlaGF2aW9yIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaW5wdXQKLSAgICAgKiBhbmQvb3Igb3V0cHV0IHN0cmVhbSBpcyA8aT5hc3luY2hyb25vdXNseSBjbG9zZWQ8L2k+LCBvciB0aGUgdGhyZWFkCi0gICAgICogaW50ZXJydXB0ZWQgZHVyaW5nIHRoZSB0cmFuc2ZlciwgaXMgaGlnaGx5IGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtCi0gICAgICogc3BlY2lmaWMsIGFuZCB0aGVyZWZvcmUgbm90IHNwZWNpZmllZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBhbiBJL08gZXJyb3Igb2NjdXJzIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIG9yIHdyaXRpbmcgdG8gdGhlCi0gICAgICogb3V0cHV0IHN0cmVhbSwgdGhlbiBpdCBtYXkgZG8gc28gYWZ0ZXIgc29tZSBieXRlcyBoYXZlIGJlZW4gcmVhZCBvcgotICAgICAqIHdyaXR0ZW4uIENvbnNlcXVlbnRseSB0aGUgaW5wdXQgc3RyZWFtIG1heSBub3QgYmUgYXQgZW5kIG9mIHN0cmVhbSBhbmQKLSAgICAgKiBvbmUsIG9yIGJvdGgsIHN0cmVhbXMgbWF5IGJlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gSXQgaXMgc3Ryb25nbHkKLSAgICAgKiByZWNvbW1lbmRlZCB0aGF0IGJvdGggc3RyZWFtcyBiZSBwcm9tcHRseSBjbG9zZWQgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgaW4gdGhlIGlucHV0IHN0cmVhbSwgbm9uLW51bGwKLSAgICAgKiBAcGFyYW0gIG91dCB0aGUgb3V0cHV0IHN0cmVhbSwgbm9uLW51bGwKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBpbn0gb3Ige0Bjb2RlIG91dH0gaXMge0Bjb2RlIG51bGx9Ci0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgdHJhbnNmZXJCZXR3ZWVuU3RyZWFtcyhJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiAgewotICAgICAgICBsb25nIHRyYW5zZmVycmVkID0gMDsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgaW50IHJlYWQ7Ci0gICAgICAgIHdoaWxlICgocmVhZCA9IGluLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSkpID49IDApIHsKLSAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIHJlYWQpOwotICAgICAgICAgICAgdHJhbnNmZXJyZWQgKz0gcmVhZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJhbnNmZXJyZWQ7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL2phdmEyZC9DbGFzc0Nhc3RFeGNlcHRpb25Gb3JJbnZhbGlkU3VyZmFjZS5qYXZhIGIvamRrL3Rlc3Qvc3VuL2phdmEyZC9DbGFzc0Nhc3RFeGNlcHRpb25Gb3JJbnZhbGlkU3VyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY4MTVlLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9qYXZhMmQvQ2xhc3NDYXN0RXhjZXB0aW9uRm9ySW52YWxpZFN1cmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5HcmFwaGljc0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NFbnZpcm9ubWVudDsKLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5Gb250UmVuZGVyQ29udGV4dDsKLWltcG9ydCBqYXZhLmF3dC5mb250LkdseXBoVmVjdG9yOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuaW1hZ2UuVm9sYXRpbGVJbWFnZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlLlRZUEVfSU5UX0FSR0I7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODE1ODA3MiA3MTcyNzQ5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc0Nhc3RFeGNlcHRpb25Gb3JJbnZhbGlkU3VyZmFjZSB7Ci0KLSAgICBzdGF0aWMgR3JhcGhpY3NFbnZpcm9ubWVudCBnZQotICAgICAgICAgICAgPSBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpOwotCi0gICAgc3RhdGljIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYwotICAgICAgICAgICAgPSBnZS5nZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkuZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQotICAgIHN0YXRpYyB2b2xhdGlsZSBWb2xhdGlsZUltYWdlIHZpID0gZ2MuY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoMTAsIDEwKTsKLQotICAgIHN0YXRpYyB2b2xhdGlsZSBUaHJvd2FibGUgZmFpbGVkOwotCi0gICAgc3RhdGljIEJsb2NraW5nUXVldWU8Vm9sYXRpbGVJbWFnZT4gbGlzdCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8Pig1MCk7Ci0KLSAgICAvLyBXaWxsIHJ1biB0aGUgdGVzdCBubyBtb3JlIHRoYW4gMTUgc2Vjb25kcwotICAgIHN0YXRpYyBsb25nIGVuZHRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKSArIFRpbWVVbml0LlNFQ09ORFMudG9OYW5vcygxNSk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIENhdGNoIGFsbCB1bmNhdWdodCBleGNlcHRpb25zIGFuZCB0cmVhdCB0aGVtIGFzIHRlc3QgZmFpbHVyZQotICAgICAgICBUaHJlYWQuc2V0RGVmYXVsdFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigodCwgZSkgLT4gZmFpbGVkID0gZSk7Ci0KLSAgICAgICAgLy8gRGF0YSBmb3IgcmVuZGVyaW5nCi0gICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSgxMCwgMTAsIFRZUEVfSU5UX0FSR0IpOwotICAgICAgICBGb250UmVuZGVyQ29udGV4dCBmcmMgPSBuZXcgRm9udFJlbmRlckNvbnRleHQobnVsbCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgRm9udCBmb250ID0gbmV3IEZvbnQoIlNlcmlmIiwgRm9udC5QTEFJTiwgMTIpOwotICAgICAgICBHbHlwaFZlY3RvciBndiA9IGZvbnQuY3JlYXRlR2x5cGhWZWN0b3IoZnJjLCBuZXcgY2hhcltdeydhJywgJzEnfSk7Ci0KLSAgICAgICAgVGhyZWFkIHQxID0gbmV3IFRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICB3aGlsZSAoIWlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgICAgIHZpID0gZ2MuY3JlYXRlQ29tcGF0aWJsZVZvbGF0aWxlSW1hZ2UoMTAsIDEwKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3Qub2ZmZXIodmkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdC5mb3JFYWNoKEltYWdlOjpmbHVzaCk7Ci0gICAgICAgIH0pOwotICAgICAgICBUaHJlYWQgdDIgPSBuZXcgVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIHdoaWxlICghaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgVm9sYXRpbGVJbWFnZSB2aSA9IGxpc3QucG9sbCgpOwotICAgICAgICAgICAgICAgIGlmICh2aSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBUaHJlYWQgdDMgPSBuZXcgVGhyZWFkKCgpIC0+IHsKLSAgICAgICAgICAgIHdoaWxlICghaXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgdmkuY3JlYXRlR3JhcGhpY3MoKS5kcmF3SW1hZ2UoYmksIDEsIDEsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVGhyZWFkIHQ0ID0gbmV3IFRocmVhZCgoKSAtPiB7Ci0gICAgICAgICAgICB3aGlsZSAoIWlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgICAgIHZpLmNyZWF0ZUdyYXBoaWNzKCkuZHJhd0dseXBoVmVjdG9yKGd2LCAwLCAwKTsKLSAgICAgICAgICAgICAgICB2aS5jcmVhdGVHcmFwaGljcygpLmRyYXdPdmFsKDAsIDAsIDEwLCAxMCk7Ci0gICAgICAgICAgICAgICAgdmkuY3JlYXRlR3JhcGhpY3MoKS5kcmF3TGluZSgwLCAwLCAxMCwgMTApOwotICAgICAgICAgICAgICAgIHZpLmNyZWF0ZUdyYXBoaWNzKCkuZHJhd1N0cmluZygiMTIzIiwgMSwgMSk7Ci0gICAgICAgICAgICAgICAgdmkuY3JlYXRlR3JhcGhpY3MoKS5kcmF3KG5ldyBSZWN0YW5nbGUoMCwgMCwgMTAsIDEwKSk7Ci0gICAgICAgICAgICAgICAgdmkuY3JlYXRlR3JhcGhpY3MoKS5maWxsT3ZhbCgwLCAwLCAxMCwgMTApOwotICAgICAgICAgICAgICAgIGZpbmFsIEdyYXBoaWNzMkQgZ3JhcGhpY3MgPSB2aS5jcmVhdGVHcmFwaGljcygpOwotICAgICAgICAgICAgICAgIGdyYXBoaWNzLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzLlZBTFVFX0FOVElBTElBU19PTik7Ci0gICAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFBvbHlnb24obmV3IGludFtdIHswLCAxMCwgMTAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnQgW10gezAsIDAsIDEwLCAxMH0sIDQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgdDEuc3RhcnQoKTsKLSAgICAgICAgdDIuc3RhcnQoKTsKLSAgICAgICAgdDMuc3RhcnQoKTsKLSAgICAgICAgdDQuc3RhcnQoKTsKLSAgICAgICAgdDEuam9pbigpOwotICAgICAgICB0Mi5qb2luKCk7Ci0gICAgICAgIHQzLmpvaW4oKTsKLSAgICAgICAgdDQuam9pbigpOwotCi0gICAgICAgIGlmIChmYWlsZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUZXN0IGZhaWxlZCIpOwotICAgICAgICAgICAgZmFpbGVkLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gZW5kdGltZSAtIFN5c3RlbS5uYW5vVGltZSgpIDwgMCB8fCBmYWlsZWQgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vbWFuYWdlbWVudC9MYXp5Q29tcG9zaXRlRGF0YVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9tYW5hZ2VtZW50L0xhenlDb21wb3NpdGVEYXRhVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QwNjUyLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9tYW5hZ2VtZW50L0xhenlDb21wb3NpdGVEYXRhVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5BcnJheVR5cGU7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlRGF0YTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhU3VwcG9ydDsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVUeXBlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5EYXRhRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5UeXBlOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7Ci1pbXBvcnQgc3VuLm1hbmFnZW1lbnQuTGF6eUNvbXBvc2l0ZURhdGE7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODEzOTg3MAotICogQHN1bW1hcnkgc3VuLm1hbmFnZW1lbnQuTGF6eUNvbXBvc2l0ZURhdGEuaXNUeXBlTWF0Y2hlZCgpIGZhaWxzIGZvciBjb21wb3NpdGUgdHlwZXMgd2l0aCBpdGVtcyBvZiBBcnJheVR5cGUKLSAqIEBtb2R1bGVzIGphdmEubWFuYWdlbWVudC9zdW4ubWFuYWdlbWVudAotICogQGF1dGhvciBKYXJvc2xhdiBCYWNob3JpawotICovCi0KLXB1YmxpYyBjbGFzcyBMYXp5Q29tcG9zaXRlRGF0YVRlc3QgewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENvbXBvc2l0ZURhdGEgZGF0YVYxLCBkYXRhVjI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gKioqCi0gICAgICAgICAgICAvLyBwcmVwYXJlIHRoZSBjb21wb3NpdGUgdHlwZXMKLQotICAgICAgICAgICAgLy8gY29tcG9zaXRlIHR5cGUgc3RvcmVkIGluIGFuIGFycmF5OyBWMQotICAgICAgICAgICAgQ29tcG9zaXRlVHlwZSBzdWJ0eXBlVjEgPSBuZXcgQ29tcG9zaXRlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgIlN1YnR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gMSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiaXRlbTEifSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJJdGVtIDEifSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9wZW5UeXBlPD8+W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVUeXBlLlNUUklORwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotCi0gICAgICAgICAgICAvLyBjb21wb3NpdGUgdHlwZSBzdG9yZWQgaW4gYW4gYXJyYXk7IFYyCi0gICAgICAgICAgICBDb21wb3NpdGVUeXBlIHN1YnR5cGVWMiA9IG5ldyBDb21wb3NpdGVUeXBlKAotICAgICAgICAgICAgICAgICAgICAiU3VidHlwZTIiLAotICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiAyIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJpdGVtMSIsICJpdGVtMiJ9LAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ikl0ZW0gMSIsICJJdGVtIDIifSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9wZW5UeXBlPD8+W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVR5cGUuSU5URUdFUgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotCi0KLSAgICAgICAgICAgIC8vIG1haW4gY29tcG9zaXRlIHR5cGU7IFYxCi0gICAgICAgICAgICAvLyBvbmUgb2YgdGhlIGl0ZW1zIGlzIGFycmF5IG9mICdzdWJ0eXBlVjEnIGluc3RhbmNlcwotICAgICAgICAgICAgQ29tcG9zaXRlVHlwZSB0eXBlVjEgPSBuZXcgQ29tcG9zaXRlVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgIk15RGF0YVYxIiwKLSAgICAgICAgICAgICAgICAgICAgIlZlcnNpb24gMSIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiaXRlbTEiLCAiaXRlbTIifSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJJdGVtIDEiLCAiSXRlbSAyIn0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPcGVuVHlwZTw/PltdewotICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlVHlwZS5TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheVR5cGUuZ2V0QXJyYXlUeXBlKHN1YnR5cGVWMSkKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgLy8gbWFpbiBjb21wb3NpdGUgdHlwZTsgVjIKLSAgICAgICAgICAgIC8vIG9uZSBvZiB0aGUgaXRlbXMgaXMgYXJyYXkgb2YgJ3N1YnR5cGVWMicgaW5zdGFuY2VzCi0gICAgICAgICAgICBDb21wb3NpdGVUeXBlIHR5cGVWMiA9IG5ldyBDb21wb3NpdGVUeXBlKAotICAgICAgICAgICAgICAgICAgICAiTXlEYXRhVjIiLAotICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiAyIiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJpdGVtMSIsICJpdGVtMiJ9LAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ikl0ZW0gMSIsICJJdGVtIDIifSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9wZW5UeXBlPD8+W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVUeXBlLlNUUklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5VHlwZS5nZXRBcnJheVR5cGUoc3VidHlwZVYyKQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICApOwotICAgICAgICAgICAgLy8gKioqCi0KLSAgICAgICAgICAgIC8vICoqKgotICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBkYXRhCi0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHN1Yml0ZW1zVjEgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHN1Yml0ZW1zVjIgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gaXRlbXNWMSA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gaXRlbXNWMiA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICAgICAgc3ViaXRlbXNWMS5wdXQoIml0ZW0xIiwgIml0ZW0xIik7Ci0gICAgICAgICAgICBzdWJpdGVtc1YyLnB1dCgiaXRlbTEiLCAiaXRlbTEiKTsKLSAgICAgICAgICAgIHN1Yml0ZW1zVjIucHV0KCJpdGVtMiIsIDQyKTsKLQotICAgICAgICAgICAgaXRlbXNWMS5wdXQoIml0ZW0xIiwgIml0ZW0xIik7Ci0gICAgICAgICAgICBpdGVtc1YxLnB1dCgiaXRlbTIiLCBuZXcgQ29tcG9zaXRlRGF0YVtde25ldyBDb21wb3NpdGVEYXRhU3VwcG9ydChzdWJ0eXBlVjEsIHN1Yml0ZW1zVjEpfSk7Ci0KLSAgICAgICAgICAgIGl0ZW1zVjIucHV0KCJpdGVtMSIsICJpdGVtMSIpOwotICAgICAgICAgICAgaXRlbXNWMi5wdXQoIml0ZW0yIiwgbmV3IENvbXBvc2l0ZURhdGFbXXtuZXcgQ29tcG9zaXRlRGF0YVN1cHBvcnQoc3VidHlwZVYyLCBzdWJpdGVtc1YyKX0pOwotCi0gICAgICAgICAgICBkYXRhVjEgPSBuZXcgQ29tcG9zaXRlRGF0YVN1cHBvcnQodHlwZVYxLCBpdGVtc1YxKTsKLSAgICAgICAgICAgIGRhdGFWMiA9IG5ldyBDb21wb3NpdGVEYXRhU3VwcG9ydCh0eXBlVjIsIGl0ZW1zVjIpOwotICAgICAgICAgICAgLy8gKioqCi0gICAgICAgIH0gY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RGF0YVYxIGV4dGVuZHMgTGF6eUNvbXBvc2l0ZURhdGEgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIENvbXBvc2l0ZURhdGEgZ2V0Q29tcG9zaXRlRGF0YSgpIHsKLSAgICAgICAgICAgIHJldHVybiBkYXRhVjE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1R5cGVNYWNoZWQoQ29tcG9zaXRlVHlwZSB0eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNUeXBlTWF0Y2hlZCh0aGlzLmdldENvbXBvc2l0ZVR5cGUoKSwgdHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeURhdGFWMiBleHRlbmRzIExhenlDb21wb3NpdGVEYXRhIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBDb21wb3NpdGVEYXRhIGdldENvbXBvc2l0ZURhdGEoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YVYyOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGVja2luZyBMYXp5Q29tcG9zaXRlRGF0YS5pc1R5cGVNYXRjaGVkKCkiKTsKLSAgICAgICAgTXlEYXRhVjEgdjEgPSBuZXcgTXlEYXRhVjEoKTsKLSAgICAgICAgTXlEYXRhVjIgdjIgPSBuZXcgTXlEYXRhVjIoKTsKLQotICAgICAgICBpZiAoIXYxLmlzVHlwZU1hY2hlZCh2Mi5nZXRDb21wb3NpdGVUeXBlKCkpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIj09PSBGQUlMRUQiKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVjEgc2hvdWxkIGJlIG1hdGNoZWQgYnkgVjIiKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiXG49PT0gVjEiKTsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih2MS5nZXRDb21wb3NpdGVUeXBlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcbj09PSBWMiIpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHYyLmdldENvbXBvc2l0ZVR5cGUoKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PSBQQVNTRUQiKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL21pc2MvVVJMQ2xhc3NQYXRoL0NsYXNzbmFtZUNoYXJUZXN0LmphdmEgYi9qZGsvdGVzdC9zdW4vbWlzYy9VUkxDbGFzc1BhdGgvQ2xhc3NuYW1lQ2hhclRlc3QuamF2YQppbmRleCA2ZWVjN2NjLi4zMzBlYzMyIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vbWlzYy9VUkxDbGFzc1BhdGgvQ2xhc3NuYW1lQ2hhclRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vbWlzYy9VUkxDbGFzc1BhdGgvQ2xhc3NuYW1lQ2hhclRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwMiw2MCArMTAyLDE2IEBACiAKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbmZyYXN0cnVjdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBzdGF0aWMgdm9sYXRpbGUgaW50IHBhc3NlZCA9IDAsIGZhaWxlZCA9IDA7Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBwYXNzKCkgewotICAgICAgICBwYXNzZWQrKzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gZmFpbCgpIHsKLSAgICAgICAgZmFpbGVkKys7Ci0gICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmVyLnN0b3AoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgVGhyZWFkLmR1bXBTdGFjaygpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gZmFpbChTdHJpbmcgbXNnKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotICAgICAgICByZXR1cm4gZmFpbCgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHVuZXhwZWN0ZWQoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgZmFpbGVkKys7Ci0gICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2VydmVyLnN0b3AoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjaGVjayhib29sZWFuIGNvbmQpIHsKLSAgICAgICAgaWYgKGNvbmQpIHsKLSAgICAgICAgICAgIHBhc3MoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZhaWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29uZDsKLSAgICB9Ci0KKyAgICBzdGF0aWMgYm9vbGVhbiBwYXNzKCkge3Bhc3NlZCsrOyByZXR1cm4gdHJ1ZTt9CisgICAgc3RhdGljIGJvb2xlYW4gZmFpbCgpIHtmYWlsZWQrKzsgc2VydmVyLnN0b3AoMCk7IFRocmVhZC5kdW1wU3RhY2soKTsgcmV0dXJuIGZhbHNlO30KKyAgICBzdGF0aWMgYm9vbGVhbiBmYWlsKFN0cmluZyBtc2cpIHtTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsgcmV0dXJuIGZhaWwoKTt9CisgICAgc3RhdGljIHZvaWQgdW5leHBlY3RlZChUaHJvd2FibGUgdCkge2ZhaWxlZCsrOyBzZXJ2ZXIuc3RvcCgwKTsgdC5wcmludFN0YWNrVHJhY2UoKTt9CisgICAgc3RhdGljIGJvb2xlYW4gY2hlY2soYm9vbGVhbiBjb25kKSB7aWYgKGNvbmQpIHBhc3MoKTsgZWxzZSBmYWlsKCk7IHJldHVybiBjb25kO30KICAgICBzdGF0aWMgYm9vbGVhbiBlcXVhbChPYmplY3QgeCwgT2JqZWN0IHkpIHsKLSAgICAgICAgaWYgKHggPT0gbnVsbCA/IHkgPT0gbnVsbCA6IHguZXF1YWxzKHkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhaWwoeCArICIgbm90IGVxdWFsIHRvICIgKyB5KTsKLSAgICAgICAgfQotICAgIH0KLQorICAgICAgICBpZiAoeCA9PSBudWxsID8geSA9PSBudWxsIDogeC5lcXVhbHMoeSkpIHJldHVybiBwYXNzKCk7CisgICAgICAgIGVsc2UgcmV0dXJuIGZhaWwoeCArICIgbm90IGVxdWFsIHRvICIgKyB5KTt9CiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZWFsTWFpbihhcmdzKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgICAgIHVuZXhwZWN0ZWQodCk7Ci0gICAgICAgIH0KKyAgICAgICAgdHJ5IHtyZWFsTWFpbihhcmdzKTt9IGNhdGNoIChUaHJvd2FibGUgdCkge3VuZXhwZWN0ZWQodCk7fQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuUGFzc2VkID0gIiArIHBhc3NlZCArICIgZmFpbGVkID0gIiArIGZhaWxlZCk7Ci0gICAgICAgIGlmIChmYWlsZWQgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlNvbWUgdGVzdHMgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICB9CisgICAgICAgIGlmIChmYWlsZWQgPiAwKSB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlNvbWUgdGVzdHMgZmFpbGVkIik7fQogfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL25ldC9mdHAvVGVzdEZ0cENsaWVudE5hbWVMaXN0V2l0aE51bGwuamF2YSBiL2pkay90ZXN0L3N1bi9uZXQvZnRwL1Rlc3RGdHBDbGllbnROYW1lTGlzdFdpdGhOdWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTQyZjYuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL25ldC9mdHAvVGVzdEZ0cENsaWVudE5hbWVMaXN0V2l0aE51bGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjI1ODAKLSAqIEBzdW1tYXJ5ICJudWxsIiBzaG91bGQgYmUgdHJlYXRlZCBhcyAiY3VycmVudCBkaXJlY3RvcnkiIGluIG5hbWVMaXN0KCkKLSAqIG1ldGhvZCBvZiBGdHBDbGllbnQKLSAqIEBtb2R1bGVzIGphdmEuYmFzZS9zdW4ubmV0LmZ0cAotICogQHJ1biBtYWluIFRlc3RGdHBDbGllbnROYW1lTGlzdFdpdGhOdWxsCi0qLwotCi0KLWltcG9ydCBzdW4ubmV0LmZ0cC5GdHBDbGllbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RnRwQ2xpZW50TmFtZUxpc3RXaXRoTnVsbCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGNvbW1hbmRIYXNBcmdzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoRnRwU2VydmVyIHNlcnZlciA9IG5ldyBGdHBTZXJ2ZXIoKTsKLSAgICAgICAgICAgICBGdHBDbGllbnQgY2xpZW50ID0gRnRwQ2xpZW50LmNyZWF0ZSgpKSB7Ci0gICAgICAgICAgICAobmV3IFRocmVhZChzZXJ2ZXIpKS5zdGFydCgpOwotICAgICAgICAgICAgaW50IHBvcnQgPSBzZXJ2ZXIuZ2V0UG9ydCgpOwotICAgICAgICAgICAgY2xpZW50LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKCJsb2NhbGhvc3QiLCBwb3J0KSk7Ci0gICAgICAgICAgICBjbGllbnQubmFtZUxpc3QobnVsbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZEhhc0FyZ3MpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGVzdCBmYWlsZWQuIE5MU1Qgc2hvdWxkbid0IGhhdmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXJncyBpZiBuYW1lTGlzdCBwYXJhbWV0ZXIgaXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRnRwU2VydmVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSwgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7Ci0KLSAgICAgICAgRnRwU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVDbGllbnQoU29ja2V0IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgY2xpZW50LnNldFNvVGltZW91dCgyMDAwKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjbGllbnQuCi0gICAgICAgICAgICAgICAgICAgIGdldElucHV0U3RyZWFtKCkpKTsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIG91dCA9IG5ldyBQcmludFdyaXRlcihjbGllbnQuZ2V0T3V0cHV0U3RyZWFtKCksIHRydWUpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oIjIyMCBGVFAgc2VydmVyU29ja2V0IGlzIHJlYWR5LiIpOwotICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBjbWQgPSBzdHIuc3Vic3RyaW5nKDAsIHN0ci5pbmRleE9mKCIgIikgPiAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKCIgIikgOiBzdHIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBhcmdzID0gKGNtZC5lcXVhbHMoc3RyKSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgIiIgOiBzdHIuc3Vic3RyaW5nKHN0ci5pbmRleE9mKCIgIikpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIlFVSVQiOgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjIyMSBHb29kYnllLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJFUFNWIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiYWxsIi5lcXVhbHNJZ25vcmVDYXNlKGFyZ3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIjIwMCBFUFNWIEFMTCBjb21tYW5kIHN1Y2Nlc3NmdWwuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiMjI5IEVudGVyaW5nIEV4dGVuZGVkIFBhc3NpdmUgTW9kZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih8fHwiICsgZ2V0UG9ydCgpICsgInwpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiTkxTVCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncy50cmltKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRIYXNBcmdzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIyMDAgQ29tbWFuZCBva2F5LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiNTAwIHVuc3VwcG9ydGVkIGNvbW1hbmQ6ICIgKyBzdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJTb2NrZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChzZXJ2ZXJTb2NrZXQgIT0gbnVsbCAmJiAhc2VydmVyU29ja2V0LmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyeSAoU29ja2V0IGNsaWVudCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGllbnQoY2xpZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2JsZW0gaW4gdGVzdCBleGVjdXRpb24iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cElucHV0U3RyZWFtLmphdmEgYi9qZGsvdGVzdC9zdW4vbmV0L3d3dy9wcm90b2NvbC9odHRwL0h0dHBJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGQ5NDc4Y2EuLjQxM2Y1NWEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9uZXQvd3d3L3Byb3RvY29sL2h0dHAvSHR0cElucHV0U3RyZWFtLmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL25ldC93d3cvcHJvdG9jb2wvaHR0cC9IdHRwSW5wdXRTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDk1ICsyMyw3NyBAQAogCiAvKiBAdGVzdAogICogQGJ1ZyA0OTM3NTk4Ci0gKiBAc3VtbWFyeSBodHRwOi8vd3d3LmNsaXBzdHJlYW0uY29tIHZpZGVvIGRvZXMgbm90IHBsYXk7IHJlYWQoKSBwcm9ibGVtCisgKiBAc3VtbWFyeSBodHRwOi8vd3d3LmNsaXBzdHJlYW0uY29tIHZlZGlvIGRvZXMgbm90IHBsYXk7IHJlYWQoKSBwcm9ibGVtCiAgKi8KK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnRleHQuKjsKKworcHVibGljIGNsYXNzIEh0dHBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29jazsKKworICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICB0cnkgeworICAgICAgICAgIFNvY2tldCBzID0gc2VydmVyU29jay5hY2NlcHQoKTsKKyAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICBieXRlIGJbXSA9IG5ldyBieXRlWzQwOTZdOworCisgICAgICAgICAgLy8gYXNzdW1lIHdlIHJlYWQgdGhlIGVudGlyZSBodHRwIHJlcXVlc3QKKyAgICAgICAgICAvLyAoYmFkIGFzc3VtcHRpb24gYnV0IG9rYXkgZm9yIHRlc3QgY2FzZSkKKyAgICAgICAgICBpbnQgbnJlYWQgPSBpbi5yZWFkKGIpOworCisgICAgICAgICAgT3V0cHV0U3RyZWFtIG8gPSBzLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgby53cml0ZSggIkhUVFAvMS4xIDIwMCBPSyIuZ2V0Qnl0ZXMoKSApOworICAgICAgICAgIG8ud3JpdGUoICJDb250ZW50LUxlbmd0aDogMjAiLmdldEJ5dGVzKCkgKTsKKyAgICAgICAgICBvLndyaXRlKCAoYnl0ZSknXHInICk7CisgICAgICAgICAgby53cml0ZSggKGJ5dGUpJ1xuJyApOworICAgICAgICAgIG8ud3JpdGUoIChieXRlKSdccicgKTsKKyAgICAgICAgICBvLndyaXRlKCAoYnl0ZSknXG4nICk7CisKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgICAgby53cml0ZSgoYnl0ZSkweGZmKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBvLmZsdXNoKCk7CisgICAgICAgICAgby5jbG9zZSgpOworCisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeyB9CisgIH0KIAogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOworICBwdWJsaWMgSHR0cElucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLXB1YmxpYyBjbGFzcyBIdHRwSW5wdXRTdHJlYW0geworICAgICBzZXJ2ZXJTb2NrID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgaW50IHBvcnQgPSBzZXJ2ZXJTb2NrLmdldExvY2FsUG9ydCgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfTEVOR1RIID0gMjA7CisgICAgIFRocmVhZCB0aHIgPSBuZXcgVGhyZWFkKHRoaXMpOworICAgICB0aHIuc3RhcnQoKTsKIAotICAgIHN0YXRpYyBjbGFzcyBTZXJ2ZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlLCBSdW5uYWJsZSB7CisgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpLTE0NDAwMDApOyAvLyB0aGlzIHRpbWUgeWVzdGVyZGF5CisgICAgIFVSTCB1cmw7CisgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbjsKIAotICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0OwotICAgICAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlcXVlc3RFbmQgPSBuZXcgYnl0ZVtdeydccicsICdcbicsICdccicsICdcbid9OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSAxMCAqIDEwMDA7CisgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIFN0cmluZy52YWx1ZU9mKHBvcnQpICsKKyAgICAgICAgICAgICAgICAgICAiL2FueXRoaW5nIik7CisgICAgIGNvbiA9IChIdHRwVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKIAotICAgICAgICBTZXJ2ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwKTsKLSAgICAgICAgfQorICAgICBpbnQgcmV0ID0gY29uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICBieXRlW10gYiA9IG5ldyBieXRlWzIwXTsKKyAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb24uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgaW50IGkgPSAwLCBjb3VudCA9IDA7CisgICAgIHdoaWxlICgoaSA9IGlzLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiaSA9ICIraSk7CisgICAgICAgICBjb3VudCsrOworICAgICB9CisgICAgIGlmIChjb3VudCAhPSAyMCkgeworICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkh0dHBJbnB1dFN0cmVhbS5yZWFkKCkgZmFpbGVkIHdpdGggMHhmZiIpOworICAgICB9CisgIH0KIAotICAgICAgICB2b2lkIHJlYWRPbmVSZXF1ZXN0KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaW50IHJlcXVlc3RFbmRDb3VudCA9IDAsIHI7Ci0gICAgICAgICAgICB3aGlsZSAoKHIgPSBpcy5yZWFkKCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gcmVxdWVzdEVuZFtyZXF1ZXN0RW5kQ291bnRdKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RFbmRDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdEVuZENvdW50ID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEVuZENvdW50ID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IChTb2NrZXQgcyA9IHNlcnZlclNvY2tldC5hY2NlcHQoKSkgewotICAgICAgICAgICAgICAgIHMuc2V0U29UaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICAgICAgICAgIHJlYWRPbmVSZXF1ZXN0KHMuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldE91dHB1dFN0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKCJIVFRQLzEuMSAyMDAgT0siLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICBvcy53cml0ZSgoIkNvbnRlbnQtTGVuZ3RoOiAiICsgQ09OVEVOVF9MRU5HVEgpLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICBvcy53cml0ZSgiXHJcblxyXG4iLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTlRFTlRfTEVOR1RIOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9zLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKCFzZXJ2ZXJTb2NrZXQuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRQb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICB3aGlsZSAoaXMucmVhZCgpICE9IC0xKSB7Ci0gICAgICAgICAgICBsZW4rKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIoKSkgewotICAgICAgICAgICAgKG5ldyBUaHJlYWQoc2VydmVyKSkuc3RhcnQoKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OiIgKyBzZXJ2ZXIuZ2V0UG9ydCgpICsgIi9hbnl0aGluZyIpOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuQ29ubmVjdGlvbigpLmdldElucHV0U3RyZWFtKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVhZChpcykgIT0gQ09OVEVOVF9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkh0dHBJbnB1dFN0cmVhbS5yZWFkKCkgZmFpbGVkIHdpdGggMHhmZiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBuZXcgSHR0cElucHV0U3RyZWFtKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9uZXQvd3d3L3Byb3RvY29sL2h0dHBzL0h0dHBzVVJMQ29ubmVjdGlvbi9JbXBhY3RPblNOSS5qYXZhIGIvamRrL3Rlc3Qvc3VuL25ldC93d3cvcHJvdG9jb2wvaHR0cHMvSHR0cHNVUkxDb25uZWN0aW9uL0ltcGFjdE9uU05JLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZjExNmIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL25ldC93d3cvcHJvdG9jb2wvaHR0cHMvSHR0cHNVUkxDb25uZWN0aW9uL0ltcGFjdE9uU05JLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8vCi0vLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQotLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KLS8vCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MTQ0NTY2Ci0gKiBAc3VtbWFyeSBDdXN0b20gSG9zdG5hbWVWZXJpZmllciBkaXNhYmxlcyBTTkkgZXh0ZW5zaW9uCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBJbXBhY3RPblNOSQotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZheC5uZXQuc3NsLio7Ci0KLXB1YmxpYyBjbGFzcyBJbXBhY3RPblNOSSB7Ci0KLSAgICAvKgotICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCi0gICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCi0gICAgICovCi0KLSAgICAvKgotICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/Ci0gICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQotICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHNlcGFyYXRlU2VydmVyVGhyZWFkID0gdHJ1ZTsKLQotICAgIC8qCi0gICAgICogV2hlcmUgZG8gd2UgZmluZCB0aGUga2V5c3RvcmVzPwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYXRoVG9TdG9yZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi8uLi8uLi8uLi9zdW4vc2VjdXJpdHkvc3NsL2V0YyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGtleVN0b3JlRmlsZSA9ICJrZXlzdG9yZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRydXN0U3RvcmVGaWxlID0gInRydXN0c3RvcmUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwYXNzd2QgPSAicGFzc3BocmFzZSI7Ci0KLSAgICAvKgotICAgICAqIElzIHRoZSBzZXJ2ZXIgcmVhZHkgdG8gc2VydmU/Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOwotCi0gICAgLyoKLSAgICAgKiBJcyB0aGUgY29ubmVjdGlvbiByZWFkeSB0byBjbG9zZT8KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGNsb3NlUmVhZHkgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogVHVybiBvbiBTU0wgZGVidWdnaW5nPwotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZSBwb3N0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcG9zdE1zZyA9ICJIVFRQIHBvc3Qgb24gYSBodHRwcyBzZXJ2ZXIiOwotCi0gICAgLyoKLSAgICAgKiB0aGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9mIGxvY2FsaG9zdAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBob3N0bmFtZSA9IG51bGw7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZSBjbGllbnQgb3Igc2VydmVyIGlzIGRvaW5nIHNvbWUga2luZCBvZiBvYmplY3QgY3JlYXRpb24KLSAgICAgKiB0aGF0IHRoZSBvdGhlciBzaWRlIGRlcGVuZHMgb24sIGFuZCB0aGF0IHRocmVhZCBwcmVtYXR1cmVseQotICAgICAqIGV4aXRzLCB5b3UgbWF5IGV4cGVyaWVuY2UgYSBoYW5nLiAgVGhlIHRlc3QgaGFybmVzcyB3aWxsCi0gICAgICogdGVybWluYXRlIGFsbCBodW5nIHRocmVhZHMgYWZ0ZXIgaXRzIHRpbWVvdXQgaGFzIGV4cGlyZWQsCi0gICAgICogY3VycmVudGx5IDMgbWludXRlcyBieSBkZWZhdWx0LCBidXQgeW91IG1pZ2h0IHRyeSB0byBiZQotICAgICAqIHNtYXJ0IGFib3V0IGl0Li4uLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgotICAgICAqCi0gICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQotICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU1NMU2VydmVyU29ja2V0RmFjdG9yeSBzc2xzc2YgPQotICAgICAgICAgICAgKFNTTFNlcnZlclNvY2tldEZhY3RvcnkpU1NMU2VydmVyU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIHRyeSAoU1NMU2VydmVyU29ja2V0IHNzbFNlcnZlclNvY2tldCA9Ci0gICAgICAgICAgICAgICAgKFNTTFNlcnZlclNvY2tldClzc2xzc2YuY3JlYXRlU2VydmVyU29ja2V0KHNlcnZlclBvcnQpKSB7Ci0KLSAgICAgICAgICAgIHNlcnZlclBvcnQgPSBzc2xTZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFjY2VwdCBjb25uZWN0aW9ucwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB0cnkgKFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KXNzbFNlcnZlclNvY2tldC5hY2NlcHQoKSkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3NsSVMpKTsKLSAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShzc2xPUyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIEhUVFAgUE9TVCByZXF1ZXN0IGZyb20gY2xpZW50Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGF0dXMgbGluZTogIiArIGJyLnJlYWRMaW5lKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICAgICAgICAgIHdoaWxlICgobXNnID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKTsKLQotICAgICAgICAgICAgICAgIG1zZyA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1zZy5lcXVhbHMocG9zdE1zZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnRsbigiSFRUUC8xLjEgMjAwIE9LXG5cbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50bG4oIkhUVFAvMS4xIDUwMCBOb3QgT0tcblxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBzLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbFNvY2tldC5nZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gZXhwZWN0ZWQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzb2NrZXQKLSAgICAgICAgICAgICAgICB3aGlsZSAoIWNsb3NlUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIERlZmluZSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIHRlc3QuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCi0gICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvKgotICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7Ci0gICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VuZCBIVFRQIFBPU1QgcmVxdWVzdCB0byBzZXJ2ZXIKLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImh0dHBzOi8vIiArIGhvc3RuYW1lICsgIjoiICsgc2VydmVyUG9ydCk7Ci0KLSAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uLnNldERlZmF1bHRIb3N0bmFtZVZlcmlmaWVyKG5ldyBOYW1lVmVyaWZpZXIoKSk7Ci0gICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbiBodHRwID0gKEh0dHBzVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgaHR0cC5zZXREb091dHB1dCh0cnVlKTsKLQotICAgICAgICBodHRwLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oaHR0cC5nZXRPdXRwdXRTdHJlYW0oKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcy5wcmludGxuKHBvc3RNc2cpOwotICAgICAgICAgICAgcHMuZmx1c2goKTsKLSAgICAgICAgICAgIGlmIChodHRwLmdldFJlc3BvbnNlQ29kZSgpICE9IDIwMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ0ZXN0IEZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcHMuY2xvc2UoKTsKLSAgICAgICAgICAgIGh0dHAuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgY2xvc2VSZWFkeSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOYW1lVmVyaWZpZXIgaW1wbGVtZW50cyBIb3N0bmFtZVZlcmlmaWVyIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5KFN0cmluZyBob3N0bmFtZSwgU1NMU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAqIFRoZSByZW1haW5kZXIgaXMganVzdCBzdXBwb3J0IHN0dWZmCi0gICAgICovCi0KLSAgICAvLyB1c2UgYW55IGZyZWUgcG9ydCBieSBkZWZhdWx0Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7Ci0KLSAgICBwcml2YXRlIHZvbGF0aWxlIEV4Y2VwdGlvbiBzZXJ2ZXJFeGNlcHRpb24gPSBudWxsOwotICAgIHByaXZhdGUgdm9sYXRpbGUgRXhjZXB0aW9uIGNsaWVudEV4Y2VwdGlvbiA9IG51bGw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGtleUZpbGVuYW1lID0KLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLi8iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCi0gICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOwotICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlbmFtZSA9Ci0gICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4vIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKwotICAgICAgICAgICAgICAgICIvIiArIHRydXN0U3RvcmVGaWxlOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIGtleUZpbGVuYW1lKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIsIHRydXN0RmlsZW5hbWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKLQotICAgICAgICBpZiAoZGVidWcpIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGhvc3RuYW1lID0gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gdWhlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgIklnbm9yZSB0aGUgdGVzdCBhcyB0aGUgbG9jYWwgaG9zdG5hbWUgY2Fubm90IGJlIGRldGVybWluZWQiKTsKLQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAotICAgICAgICAgICAgICAgICJUaGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIG9mIHRoZSBsb2NhbCBob3N0IGlzICIgKwotICAgICAgICAgICAgICAgIGhvc3RuYW1lKTsKLSAgICAgICAgLy8gSWdub3JlIHRoZSB0ZXN0IGlmIHRoZSBob3N0bmFtZSBkb2VzIG5vdCBzb3VuZCBsaWtlIGEgZG9tYWluIG5hbWUuCi0gICAgICAgIGlmICgoaG9zdG5hbWUgPT0gbnVsbCkgfHwgaG9zdG5hbWUuaXNFbXB0eSgpIHx8Ci0gICAgICAgICAgICAgICAgIWhvc3RuYW1lLmNvbnRhaW5zKCIuIikgfHwgaG9zdG5hbWUuZW5kc1dpdGgoIi4iKSB8fAotICAgICAgICAgICAgICAgIGhvc3RuYW1lLnN0YXJ0c1dpdGgoImxvY2FsaG9zdCIpIHx8Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyLmlzRGlnaXQoaG9zdG5hbWUuY2hhckF0KGhvc3RuYW1lLmxlbmd0aCgpIC0gMSkpKSB7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSWdub3JlIHRoZSB0ZXN0IGFzIHRoZSBsb2NhbCBob3N0bmFtZSAiICsKLSAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBkZXRlcm1pbmVkIGFzIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSIpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCi0gICAgICAgICAqLwotICAgICAgICBuZXcgSW1wYWN0T25TTkkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOwotICAgIHByaXZhdGUgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7Ci0KLSAgICAvKgotICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgotICAgICAqCi0gICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgotICAgICAqLwotICAgIEltcGFjdE9uU05JKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4Y2VwdGlvbiBzdGFydEV4Y2VwdGlvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKLSAgICAgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOwotICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHN0YXJ0RXhjZXB0aW9uID0gZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFdhaXQgZm9yIG90aGVyIHNpZGUgdG8gY2xvc2UgZG93bi4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgewotICAgICAgICAgICAgaWYgKHNlcnZlclRocmVhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjbGllbnRUaHJlYWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZC5qb2luKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgdGVzdCBpcyBwcmV0dHkgbXVjaCBvdmVyLgotICAgICAgICAgKiBXaGljaCBzaWRlIHRocmV3IHRoZSBlcnJvcj8KLSAgICAgICAgICovCi0gICAgICAgIEV4Y2VwdGlvbiBsb2NhbDsKLSAgICAgICAgRXhjZXB0aW9uIHJlbW90ZTsKLQotICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKLSAgICAgICAgICAgIHJlbW90ZSA9IHNlcnZlckV4Y2VwdGlvbjsKLSAgICAgICAgICAgIGxvY2FsID0gY2xpZW50RXhjZXB0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVtb3RlID0gY2xpZW50RXhjZXB0aW9uOwotICAgICAgICAgICAgbG9jYWwgPSBzZXJ2ZXJFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayB2YXJpb3VzIGV4Y2VwdGlvbiBjb25kaXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChsb2NhbCAhPSBudWxsKSAmJiAocmVtb3RlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAvLyBJZiBib3RoIGZhaWxlZCwgcmV0dXJuIHRoZSBjdXJ0aHJlYWQncyBleGNlcHRpb24uCi0gICAgICAgICAgICBsb2NhbC5pbml0Q2F1c2UocmVtb3RlKTsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGxvY2FsOwotICAgICAgICB9IGVsc2UgaWYgKGxvY2FsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGxvY2FsOwotICAgICAgICB9IGVsc2UgaWYgKHJlbW90ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSByZW1vdGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhcnRFeGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgZXhjZXB0aW9uID0gc3RhcnRFeGNlcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGVyZSB3YXMgYW4gZXhjZXB0aW9uICpBTkQqIGEgc3RhcnRFeGNlcHRpb24sCi0gICAgICAgICAqIG91dHB1dCBpdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBzdGFydEV4Y2VwdGlvbiAmJiBzdGFydEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZXhjZXB0aW9uLmFkZFN1cHByZXNzZWQoc3RhcnRFeGNlcHRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmFsbC10aHJvdWdoOiBubyBleGNlcHRpb24gdG8gdGhyb3chCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U2VydmVyKGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG5ld1RocmVhZCkgewotICAgICAgICAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgc2VydmVyIHRocmVhZCBqdXN0IGRpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsZWFzZSB0aGUgY2xpZW50LCBpZiBub3QgYWN0aXZlIGFscmVhZHkuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydENsaWVudChib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChuZXdUaHJlYWQpIHsKLSAgICAgICAgICAgIGNsaWVudFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIGNsaWVudCB0aHJlYWQganVzdCBkaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWVudCBkaWVkLi4uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGNsaWVudFRocmVhZC5zdGFydCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uVXNlQ2FjaGVzLmphdmEgYi9qZGsvdGVzdC9zdW4vbmV0L3d3dy9wcm90b2NvbC9qYXIvSmFyVVJMQ29ubmVjdGlvblVzZUNhY2hlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzNhNzJjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9uZXQvd3d3L3Byb3RvY29sL2phci9KYXJVUkxDb25uZWN0aW9uVXNlQ2FjaGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDY5NDc5MTYKLSAqIEBzdW1tYXJ5ICBKYXJVUkxDb25uZWN0aW9uIGRvZXMgbm90IGhhbmRsZSB1c2VDYWNoZXMgY29ycmVjdGx5Ci0gKiBAcnVuIG1haW4vb3RoZXJ2bSBKYXJVUkxDb25uZWN0aW9uVXNlQ2FjaGVzCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLXB1YmxpYyBjbGFzcyBKYXJVUkxDb25uZWN0aW9uVXNlQ2FjaGVzIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEphck91dHB1dFN0cmVhbSBvdXQgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJ1c2VjYWNoZS5qYXIiKSk7Ci0gICAgICAgIG91dC5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KCJ0ZXN0LnR4dCIpKTsKLSAgICAgICAgb3V0LndyaXRlKCJUZXN0IHR4dCBmaWxlIi5nZXRCeXRlcygpKTsKLSAgICAgICAgb3V0LmNsb3NlRW50cnkoKTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0KLSAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwoImphcjoiCi0gICAgICAgICAgICArIG5ldyBGaWxlKCIuIikudG9VUkkoKS50b1N0cmluZygpCi0gICAgICAgICAgICArICIvdXNlY2FjaGUuamFyIS90ZXN0LnR4dCIpOwotCi0gICAgICAgIEphclVSTENvbm5lY3Rpb24gYzEgPSAoSmFyVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgICAgYzEuc2V0RGVmYXVsdFVzZUNhY2hlcyggZmFsc2UgKTsKLSAgICAgICAgYzEuc2V0VXNlQ2FjaGVzKCB0cnVlICk7Ci0gICAgICAgIGMxLmNvbm5lY3QoKTsKLQotICAgICAgICBKYXJVUkxDb25uZWN0aW9uIGMyID0gKEphclVSTENvbm5lY3Rpb24pdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgIGMyLnNldERlZmF1bHRVc2VDYWNoZXMoIGZhbHNlICk7Ci0gICAgICAgIGMyLnNldFVzZUNhY2hlcyggdHJ1ZSApOwotICAgICAgICBjMi5jb25uZWN0KCk7Ci0KLSAgICAgICAgYzEuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgICAgICBjMi5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKTsKLSAgICAgICAgYzIuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQm9ndXNLREMuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQm9ndXNLREMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkOWFkZC4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0JvZ3VzS0RDLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0OwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA0NTE1ODUzIDgwNzUyOTcKLSAqIEBzdW1tYXJ5IENoZWNrcyB0aGF0IEtlcmJlcm9zIGNsaWVudCB0cmllcyBzbGF2ZSBLREMKLSAqICAgICAgICAgIGlmIG1hc3RlciBLREMgaXMgbm90IHJlc3BvbmRpbmcKLSAqIEBydW4gbWFpbi9vdGhlcnZtIEJvZ3VzS0RDCi0gKi8KLXB1YmxpYyBjbGFzcyBCb2d1c0tEQyB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU1JDID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIik7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRVhJU1RJTkdfSE9TVCA9ICJub3QuZXhpc3RpbmcuaG9zdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTSA9ICJURVNULlJFQUxNIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiVVNFUiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BSSU5DSVBBTCA9IFVTRVIgKyAiQCIgKyBSRUFMTTsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1JCVEdUX1BSSU5DSVBBTCA9ICJrcmJ0Z3QvIiArIFJFQUxNOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1JCNV9DT05GID0gImtyYjUuY29uZiI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBXUk9OR19LRENfUE9SVCA9IDIxOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfVEVNUExBVEUgPSAiIgotICAgICAgICAgICAgKyAiW2xpYmRlZmF1bHRzXVxuIgotICAgICAgICAgICAgKyAiZGVmYXVsdF9yZWFsbSA9IFRFU1QuUkVBTE1cbiIKLSAgICAgICAgICAgICsgIm1heF9yZXRyaWVzID0gMVxuIgotICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICArICJbcmVhbG1zXVxuIgotICAgICAgICAgICAgKyAiVEVTVC5SRUFMTSA9IHtcbiIKLSAgICAgICAgICAgICsgIiAgICBrZGMgPSAlc1xuIgotICAgICAgICAgICAgKyAiICAgIGtkYyA9IGxvY2FsaG9zdDolZFxuIgotICAgICAgICAgICAgKyAifSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgTG9naW5FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVU0VSX1BSSU5DSVBBTCwgVVNFUl9QQVNTV09SRCk7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KEtSQlRHVF9QUklOQ0lQQUwsIG51bGwpOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LmNvbmYiLCBLUkI1X0NPTkYpOwotCi0gICAgICAgIC8vIHN0YXJ0IGEgbG9jYWwgS0RDCi0gICAgICAgIEtEQyBrZGMgPSBLREMuc3RhcnRLREMoSE9TVCwgS1JCNV9DT05GLCBSRUFMTSwgcHJpbmNpcGFscywgbnVsbCwgbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIiwKLSAgICAgICAgICAgICAgICBURVNUX1NSQyArIEZpbGUuc2VwYXJhdG9yICsgInJlZnJlc2hLcmI1Q29uZmlnLmphYXMiKTsKLQotICAgICAgICBDYWxsYmFja0hhbmRsZXIgaGFuZGxlciA9IG5ldyBIZWxwZXIuVXNlclBhc3N3b3JkSGFuZGxlcigKLSAgICAgICAgICAgICAgICBVU0VSLCBVU0VSX1BBU1NXT1JEKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBrcmI1IGNvbmZpZyB3aXRoIG5vbi1leGlzdGluZyBob3N0IGZvciBtYXN0ZXIgS0RDLAotICAgICAgICAvLyBhbmQgd3JvbmcgcG9ydCBmb3Igc2xhdmUgS0RDCi0gICAgICAgIHRyeSAoUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihLUkI1X0NPTkYpKSkgewotICAgICAgICAgICAgdy53cml0ZShTdHJpbmcuZm9ybWF0KEtSQjVfQ09ORl9URU1QTEFURSwKLSAgICAgICAgICAgICAgICAgICAgS0RDLktEQ05hbWVTZXJ2aWNlLk5PVF9FWElTVElOR19IT1NULCBXUk9OR19LRENfUE9SVCkpOwotICAgICAgICAgICAgdy5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9naW4gd2l0aCBub3QtcmVmcmVzaGFibGUgY29uZmlnCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgTG9naW5Db250ZXh0KCJOb3RSZWZyZXNoYWJsZSIsIGhhbmRsZXIpLmxvZ2luKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoTG9naW5FeGNlcHRpb24gbGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9naW4gZmFpbHVyZTogIiArIGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGtyYjUgY29uZmlnIHdpdGggbm9uLWV4aXN0aW5nIGhvc3QgZm9yIG1hc3RlciBLREMsCi0gICAgICAgIC8vIGJ1dCBjb3JyZWN0IHBvcnQgZm9yIHNsYXZlIEtEQwotICAgICAgICB0cnkgKFByaW50V3JpdGVyIHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIoS1JCNV9DT05GKSkpIHsKLSAgICAgICAgICAgIHcud3JpdGUoU3RyaW5nLmZvcm1hdChLUkI1X0NPTkZfVEVNUExBVEUsCi0gICAgICAgICAgICAgICAgICAgIEtEQy5LRENOYW1lU2VydmljZS5OT1RfRVhJU1RJTkdfSE9TVCwga2RjLmdldFBvcnQoKSkpOwotICAgICAgICAgICAgdy5mbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbG9naW4gd2l0aCBub3QtcmVmcmVzaGFibGUgY29uZmlnCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgTG9naW5Db250ZXh0KCJOb3RSZWZyZXNoYWJsZSIsIGhhbmRsZXIpLmxvZ2luKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoTG9naW5FeGNlcHRpb24gbGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9naW4gZmFpbHVyZTogIiArIGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvZ2luIHdpdGggcmVmcmVzaGFibGUgY29uZmlnCi0gICAgICAgIG5ldyBMb2dpbkNvbnRleHQoIlJlZnJlc2hhYmxlIiwgaGFuZGxlcikubG9naW4oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9Db21tTWF0Y2hlci5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9Db21tTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZlMjVhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQ29tbU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBNYXRjaGVzIHRoZSBrcmI1IGRlYnVnIG91dHB1dDoKLSAqID4+PiBLRENDb21tdW5pY2F0aW9uOiBrZGM9aG9zdCBVRFA6MTE1NTUsIHRpbWVvdXQ9MTAwLEF0dGVtcHQgPTEsICNieXRlcz0xMzgKLSAqCi0gKiBFeGFtcGxlOgotICogICBDb21tTWF0Y2hlciBjbSA9IG5ldyBDb21tTWF0Y2hlcigpOwotICogICBjbS5hZGRQb3J0KDEyMzQ1KS5hZGRQb3J0KDIzNDU2KTsKLSAqICAgZm9yIChTdHJpbmcgbGluZSA6IGRlYnVnT3V0cHV0KSB7Ci0gKiAgICAgICBpZiAoY20ubWF0Y2gobGluZSkpIHsKLSAqICAgICAgICAgICBwcmludGxuKCJLREM6ICVjLCAlcywgVGltZW91dDogJWRcbiIsCi0gKiAgICAgICAgICAgICAgY20ua2RjKCksIGNtLnByb3RvY29sKCksIGNtLnRpbWVvdXQoKSk7Ci0gKiAgICAgICB9Ci0gKiAgIH0KLSAqLwotcHVibGljIGNsYXNzIENvbW1NYXRjaGVyIHsKLQotICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHJlID0gUGF0dGVybi5jb21waWxlKAotICAgICAgICAgICAgIj4+PiBLRENDb21tdW5pY2F0aW9uOiBrZGM9XFxTKyAoVENQfFVEUCk6KFxcZCspLCAiICsKLSAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQ9KFxcZCspLEF0dGVtcHRcXHMqPShcXGQrKSIpOwotCi0gICAgTGlzdDxJbnRlZ2VyPiBrZGNQb3J0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIE1hdGNoZXIgbWF0Y2hlcjsKLQotICAgIC8qKgotICAgICAqIEFkZCBLREMgcG9ydHMgb25lIGJ5IG9uZS4gVGhlIDFzdCBLREMgd2lsbCBiZSAnYScgaW4ge0BsaW5rICNrZGMoKX0sCi0gICAgICogMm5kIGlzICdiJywgZXRjLCBldGMuCi0gICAgICovCi0gICAgcHVibGljIENvbW1NYXRjaGVyIGFkZFBvcnQoaW50IHBvcnQpIHsKLSAgICAgICAgaWYgKHBvcnQgPiAwKSB7Ci0gICAgICAgICAgICBrZGNQb3J0cy5hZGQocG9ydCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBrZGNQb3J0cy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIG1hdGNoZXIgPSByZS5tYXRjaGVyKGxpbmUpOwotICAgICAgICByZXR1cm4gbWF0Y2hlci5maW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBwcm90b2NvbCgpIHsKLSAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXIga2RjKCkgewotICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQobWF0Y2hlci5ncm91cCgyKSk7Ci0gICAgICAgIHJldHVybiAoY2hhcikoa2RjUG9ydHMuaW5kZXhPZihwb3J0KSArICdhJyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCB0aW1lb3V0KCkgewotICAgICAgICByZXR1cm4gQmFkS2RjLnRvU3ltYm9saWNTZWMoSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDMpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBhdHRlbXB0KCkgewotICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChtYXRjaGVyLmdyb3VwKDQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0NvbnRleHQuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQ29udGV4dC5qYXZhCmluZGV4IGY2NjQ2MDUuLjcxNWExYWQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQ29udGV4dC5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vQ29udGV4dC5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiAKIGltcG9ydCBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTU4MiwxMiArNTgxLDcgQEAKICAgICAgICAgICAgIG91dC5uYW1lID0gbmFtZSArICIgYXMgIiArIG91dC5jcmVkLmdldE5hbWUoKS50b1N0cmluZygpOwogICAgICAgICAgICAgcmV0dXJuIG91dDsKICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKLSAgICAgICAgICAgIEV4Y2VwdGlvbiBlID0gcGFlLmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbikoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgcGFlLmdldEV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0ZvcndhcmRhYmxlQ2hlY2suamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vRm9yd2FyZGFibGVDaGVjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjZlNDllLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vRm9yd2FyZGFibGVDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDIyNTgyCi0gKiBAc3VtbWFyeSBSZWxheCByZXNwb25zZSBmbGFncyBjaGVja2luZyBpbiBzdW4uc2VjdXJpdHkua3JiNS5LcmJLZGNSZXAuY2hlY2suCi0gKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGUgRm9yd2FyZGFibGVDaGVjay5qYXZhCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBGb3J3YXJkYWJsZUNoZWNrCi0gKi8KLQotaW1wb3J0IG9yZy5pZXRmLmpnc3MuR1NTRXhjZXB0aW9uOwotaW1wb3J0IHN1bi5zZWN1cml0eS5qZ3NzLkdTU1V0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgRm9yd2FyZGFibGVDaGVjayB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgT25lS0RDIGtkYyA9IG5ldyBPbmVLREMobnVsbCk7Ci0gICAgICAgIGtkYy53cml0ZUpBQVNDb25mKCk7Ci0KLSAgICAgICAgLy8gVVNFUiBjYW4gaW1wZXJzb25hdGUgc29tZW9uZSBlbHNlCi0gICAgICAgIGtkYy5zZXRPcHRpb24oS0RDLk9wdGlvbi5BTExPV19TNFUyU0VMRiwKLSAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KE9uZUtEQy5VU0VSICsgIkAiICsgT25lS0RDLlJFQUxNKSk7Ci0gICAgICAgIC8vIFVTRVIyIGlzIHNlbnNpdGl2ZQotICAgICAgICBrZGMuc2V0T3B0aW9uKEtEQy5PcHRpb24uU0VOU0lUSVZFX0FDQ09VTlRTLAotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoT25lS0RDLlVTRVIyICsgIkAiICsgT25lS0RDLlJFQUxNKSk7Ci0KLSAgICAgICAgQ29udGV4dCBjOwotCi0gICAgICAgIC8vIFVTRVIyIGlzIHNlbnNpdGl2ZSBidXQgaXQncyBzdGlsbCBhYmxlIHRvIGdldCBhIG5vcm1hbCB0aWNrZXQKLSAgICAgICAgYyA9IENvbnRleHQuZnJvbVVzZXJQYXNzKE9uZUtEQy5VU0VSMiwgT25lS0RDLlBBU1MyLCBmYWxzZSk7Ci0KLSAgICAgICAgLy8gLi4uIGFuZCBjb25uZWN0IHRvIGFub3RoZXIgYWNjb3VudAotICAgICAgICBjLnN0YXJ0QXNDbGllbnQoT25lS0RDLlVTRVIsIEdTU1V0aWwuR1NTX0tSQjVfTUVDSF9PSUQpOwotICAgICAgICBjLngoKS5yZXF1ZXN0Q3JlZERlbGVnKHRydWUpOwotICAgICAgICBjLngoKS5yZXF1ZXN0TXV0dWFsQXV0aChmYWxzZSk7Ci0KLSAgICAgICAgYy50YWtlKG5ldyBieXRlWzBdKTsKLQotICAgICAgICBpZiAoIWMueCgpLmlzRXN0YWJsaXNoZWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ29udGV4dCBzaG91bGQgaGF2ZSBiZWVuIGVzdGFibGlzaGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAuLi4gYnV0IHdpbGwgbm90IGJlIGFibGUgdG8gZGVsZWdhdGUgaXRzZWxmCi0gICAgICAgIGlmIChjLngoKS5nZXRDcmVkRGVsZWdTdGF0ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbXBvc3NpYmxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbHRob3VnaCBVU0VSIGlzIGFsbG93ZWQgdG8gaW1wZXJzb25hdGUgb3RoZXIgcGVvcGxlLAotICAgICAgICAvLyBpdCBjYW5ub3QgaW1wZXJzb25hdGUgVVNFUjIgY296IGl0J3Mgc2Vuc2l0aXZlLgotICAgICAgICBjID0gQ29udGV4dC5mcm9tVXNlclBhc3MoT25lS0RDLlVTRVIsIE9uZUtEQy5QQVNTLCBmYWxzZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjLmltcGVyc29uYXRlKE9uZUtEQy5VU0VSMik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTaG91bGQgZmFpbCIpOwotICAgICAgICB9IGNhdGNoIChHU1NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vSGVscGVyLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzYzBiLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2s7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5OYW1lQ2FsbGJhY2s7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5QYXNzd29yZENhbGxiYWNrOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEhlbHBlciB7Ci0KLSAgICBzdGF0aWMgY2xhc3MgVXNlclBhc3N3b3JkSGFuZGxlciBpbXBsZW1lbnRzIENhbGxiYWNrSGFuZGxlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7Ci0KLSAgICAgICAgVXNlclBhc3N3b3JkSGFuZGxlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZShDYWxsYmFja1tdIGNhbGxiYWNrcykKLSAgICAgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRDYWxsYmFja0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBmb3IgKENhbGxiYWNrIGNhbGxiYWNrIDogY2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrIGluc3RhbmNlb2YgUGFzc3dvcmRDYWxsYmFjaykgewotICAgICAgICAgICAgICAgICAgICAoKFBhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrKS5zZXRQYXNzd29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZC50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrIGluc3RhbmNlb2YgTmFtZUNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICgoTmFtZUNhbGxiYWNrKWNhbGxiYWNrKS5zZXROYW1lKG5hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uKGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0tEQy5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9LREMuamF2YQppbmRleCBiMmY3ZDU3Li5lM2Q2M2QwIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL0tEQy5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vS0RDLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMCw3ICszMCw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cmVSYW5kb207CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKLQogaW1wb3J0IHN1bi5uZXQuc3BpLm5hbWVzZXJ2aWNlLk5hbWVTZXJ2aWNlOwogaW1wb3J0IHN1bi5uZXQuc3BpLm5hbWVzZXJ2aWNlLk5hbWVTZXJ2aWNlRGVzY3JpcHRvcjsKIGltcG9ydCBzdW4uc2VjdXJpdHkua3JiNS4qOwpAQCAtMTQ2LDE0ICsxNDUsOSBAQAogICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbmYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHByaXZhdGUgVGhyZWFkIHRocmVhZDEsIHRocmVhZDIsIHRocmVhZDM7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHVkcENvbnN1bWVyUmVhZHkgPSBmYWxzZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gdGNwQ29uc3VtZXJSZWFkeSA9IGZhbHNlOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXNwYXRjaGVyUmVhZHkgPSBmYWxzZTsKICAgICBEYXRhZ3JhbVNvY2tldCB1MSA9IG51bGw7CiAgICAgU2VydmVyU29ja2V0IHQxID0gbnVsbDsKIAotICAgIHB1YmxpYyBzdGF0aWMgZW51bSBLdGFiTW9kZSB7IEFQUEVORCwgRVhJU1RJTkcgfTsKLQogICAgIC8qKgogICAgICAqIE9wdGlvbiBuYW1lcywgdG8gYmUgZXhwYW5kZWQgZm9yZXZlci4KICAgICAgKi8KQEAgLTIwMCwxMCArMTk0LDYgQEAKICAgICAgICAgICogS3JiNS5LRENfRVJSX1BPTElDWSB3aWxsIGJlIHNlbmQgZm9yIFM0VTJwcm94eSByZXF1ZXN0LgogICAgICAgICAgKi8KICAgICAgICAgQUxMT1dfUzRVMlBST1hZLAotICAgICAgICAvKioKLSAgICAgICAgICogU2Vuc2l0aXZlIGFjY291bnRzIGNhbiBuZXZlciBiZSBkZWxlZ2F0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBTRU5TSVRJVkVfQUNDT1VOVFMsCiAgICAgfTsKIAogICAgIHN0YXRpYyB7CkBAIC02NDgsNyArNjM4LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZWFsbSArICI+ICIgKyB0Z3NSZXEucmVxQm9keS5jbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICIgc2VuZHMgVEdTLVJFUSBmb3IgIiArCi0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyAiLCAiICsgdGdzUmVxLnJlcUJvZHkua2RjT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UpOwogICAgICAgICAgICAgS0RDUmVxQm9keSBib2R5ID0gdGdzUmVxLnJlcUJvZHk7CiAgICAgICAgICAgICBpbnRbXSBlVHlwZXMgPSBLRENSZXFCb2R5RG90RVR5cGUoYm9keSk7CiAgICAgICAgICAgICBpbnQgZTIgPSBlVHlwZXNbMF07ICAgICAvLyBldHlwZSBmb3Igb3V0Z29pbmcgc2Vzc2lvbiBrZXkKQEAgLTcyNCwxMyArNzE0LDcgQEAKICAgICAgICAgICAgIGJvb2xlYW5bXSBiRmxhZ3MgPSBuZXcgYm9vbGVhbltLcmI1LlRLVF9PUFRTX01BWCsxXTsKICAgICAgICAgICAgIGlmIChib2R5LmtkY09wdGlvbnMuZ2V0KEtEQ09wdGlvbnMuRk9SV0FSREFCTEUpCiAgICAgICAgICAgICAgICAgICAgICYmIGFsbG93Rm9yd2FyZGFibGUpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc2Vuc2l0aXZlcyA9IChMaXN0PFN0cmluZz4pCi0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdldChPcHRpb24uU0VOU0lUSVZFX0FDQ09VTlRTKTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vuc2l0aXZlcyAhPSBudWxsICYmIHNlbnNpdGl2ZXMuY29udGFpbnMoY25hbWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IG1ha2UgRk9SV0FSREFCTEUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiRmxhZ3NbS3JiNS5US1RfT1BUU19GT1JXQVJEQUJMRV0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiRmxhZ3NbS3JiNS5US1RfT1BUU19GT1JXQVJEQUJMRV0gPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJvZHkua2RjT3B0aW9ucy5nZXQoS0RDT3B0aW9ucy5GT1JXQVJERUQpIHx8CiAgICAgICAgICAgICAgICAgICAgIGV0cC5mbGFncy5nZXQoS3JiNS5US1RfT1BUU19GT1JXQVJERUQpKSB7CkBAIC04MzUsOCArODE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgZWRhdGEpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgIFJldHVybiAiICsgdGdzUmVwLmNuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aWNrZXQgZm9yICIgKyB0Z3NSZXAudGlja2V0LnNuYW1lICsgIiwgZmxhZ3MgIgotICAgICAgICAgICAgICAgICAgICArIHRGbGFncyk7CisgICAgICAgICAgICAgICAgICAgICsgIiB0aWNrZXQgZm9yICIgKyB0Z3NSZXAudGlja2V0LnNuYW1lKTsKIAogICAgICAgICAgICAgRGVyT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEZXJPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIG91dC53cml0ZShEZXJWYWx1ZS5jcmVhdGVUYWcoRGVyVmFsdWUuVEFHX0FQUExJQ0FUSU9OLApAQCAtODgyLDcgKzg2NSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVhbG0gKyAiPiAiICsgYXNSZXEucmVxQm9keS5jbmFtZSArCiAgICAgICAgICAgICAgICAgICAgICIgc2VuZHMgQVMtUkVRIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZSArICIsICIgKyBhc1JlcS5yZXFCb2R5LmtkY09wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKTsKIAogICAgICAgICAgICAgS0RDUmVxQm9keSBib2R5ID0gYXNSZXEucmVxQm9keTsKIApAQCAtOTI1LDEzICs5MDgsNyBAQAogICAgICAgICAgICAgLy9ib2R5LmZyb20KICAgICAgICAgICAgIGJvb2xlYW5bXSBiRmxhZ3MgPSBuZXcgYm9vbGVhbltLcmI1LlRLVF9PUFRTX01BWCsxXTsKICAgICAgICAgICAgIGlmIChib2R5LmtkY09wdGlvbnMuZ2V0KEtEQ09wdGlvbnMuRk9SV0FSREFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlbnNpdGl2ZXMgPSAoTGlzdDxTdHJpbmc+KQotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXQoT3B0aW9uLlNFTlNJVElWRV9BQ0NPVU5UUyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbnNpdGl2ZXMgIT0gbnVsbCAmJiBzZW5zaXRpdmVzLmNvbnRhaW5zKGJvZHkuY25hbWUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2Fubm90IG1ha2UgRk9SV0FSREFCTEUKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiRmxhZ3NbS3JiNS5US1RfT1BUU19GT1JXQVJEQUJMRV0gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiRmxhZ3NbS3JiNS5US1RfT1BUU19GT1JXQVJEQUJMRV0gPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGJvZHkua2RjT3B0aW9ucy5nZXQoS0RDT3B0aW9ucy5SRU5FV0FCTEUpKSB7CiAgICAgICAgICAgICAgICAgYkZsYWdzW0tyYjUuVEtUX09QVFNfUkVORVdBQkxFXSA9IHRydWU7CkBAIC0xMTA3LDggKzEwODQsNyBAQAogICAgICAgICAgICAgICAgICAgICBlZGF0YSk7CiAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgICBSZXR1cm4gIiArIGFzUmVwLmNuYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiB0aWNrZXQgZm9yICIgKyBhc1JlcC50aWNrZXQuc25hbWUgKyAiLCBmbGFncyAiCi0gICAgICAgICAgICAgICAgICAgICsgdEZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRpY2tldCBmb3IgIiArIGFzUmVwLnRpY2tldC5zbmFtZSk7CiAKICAgICAgICAgICAgIERlck91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRGVyT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBvdXQud3JpdGUoRGVyVmFsdWUuY3JlYXRlVGFnKERlclZhbHVlLlRBR19BUFBMSUNBVElPTiwKQEAgLTEyMTYsNyArMTE5Miw2IEBACiAgICAgICAgIC8vIFRoZSBVRFAgY29uc3VtZXIKICAgICAgICAgdGhyZWFkMSA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdWRwQ29uc3VtZXJSZWFkeSA9IHRydWU7CiAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBpbmJ1ZiA9IG5ldyBieXRlWzgxOTJdOwpAQCAtMTIzNyw3ICsxMjEyLDYgQEAKICAgICAgICAgLy8gVGhlIFRDUCBjb25zdW1lcgogICAgICAgICB0aHJlYWQyID0gbmV3IFRocmVhZCgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0Y3BDb25zdW1lclJlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCA9IHRjcC5hY2NlcHQoKTsKQEAgLTEyNjAsNyArMTIzNCw2IEBACiAgICAgICAgIC8vIFRoZSBkaXNwYXRjaGVyCiAgICAgICAgIHRocmVhZDMgPSBuZXcgVGhyZWFkKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJSZWFkeSA9IHRydWU7CiAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHEudGFrZSgpLnNlbmQoKTsKQEAgLTEyNzEsMTkgKzEyNDQsNiBAQAogICAgICAgICB9OwogICAgICAgICB0aHJlYWQzLnNldERhZW1vbih0cnVlKTsKICAgICAgICAgdGhyZWFkMy5zdGFydCgpOwotCi0gICAgICAgIC8vIHdhaXQgZm9yIHRoZSBLREMgaXMgcmVhZHkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdoaWxlICghaXNSZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1JlYWR5KCkgewotICAgICAgICByZXR1cm4gdWRwQ29uc3VtZXJSZWFkeSAmJiB0Y3BDb25zdW1lclJlYWR5ICYmIGRpc3BhdGNoZXJSZWFkeTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB7CkBAIC0xMjk3LDcyICsxMjU3LDYgQEAKICAgICAgICAgICAgIC8vIE9LCiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEtEQyBzdGFydEtEQyhmaW5hbCBTdHJpbmcgaG9zdCwgZmluYWwgU3RyaW5nIGtyYkNvbmZGaWxlTmFtZSwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWFsbSwgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzLAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGt0YWIsIGZpbmFsIEt0YWJNb2RlIG1vZGUpIHsKLQotICAgICAgICBLREMga2RjOwotICAgICAgICB0cnkgewotICAgICAgICAgICAga2RjID0gS0RDLmNyZWF0ZShyZWFsbSwgaG9zdCwgMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBrZGMuc2V0T3B0aW9uKEtEQy5PcHRpb24uUFJFQVVUSF9SRVFVSVJFRCwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgICAgICAgICBpZiAoa3JiQ29uZkZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBLREMuc2F2ZUNvbmZpZyhrcmJDb25mRmlsZU5hbWUsIGtkYyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBwcmluY2lwYWxzCi0gICAgICAgICAgICBpZiAocHJpbmNpcGFscyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbmNpcGFscy5mb3JFYWNoKChuYW1lLCBwYXNzd29yZCkgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCB8fCBwYXNzd29yZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0RDOmFkZCBhIHByaW5jaXBhbCAnJXMnIHdpdGggYSByYW5kb20gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3N3b3JkIiwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAga2RjLmFkZFByaW5jaXBhbFJhbmRLZXkobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktEQzphZGQgYSBwcmluY2lwYWwgJyVzJyB3aXRoICclcycgcGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBwYXNzd29yZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAga2RjLmFkZFByaW5jaXBhbChuYW1lLCBwYXNzd29yZC50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDcmVhdGUgb3IgYXBwZW5kIGtleXMgdG8gZXhpc3Rpbmcga2V5dGFiIGZpbGUKLSAgICAgICAgICAgIGlmIChrdGFiICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGt0YWJGaWxlID0gbmV3IEZpbGUoa3RhYik7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBUFBFTkQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa3RhYkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLREM6YXBwZW5kIGtleXMgdG8gYW4gZXhpc2luZyBrZXl0YWIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZSAlcyIsIGt0YWIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZGMuYXBwZW5kS3RhYihrdGFiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0RDOmNyZWF0ZSBhIG5ldyBrZXl0YWIgZmlsZSAlcyIsIGt0YWIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZGMud3JpdGVLdGFiKGt0YWIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRVhJU1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktEQzp1c2UgYW4gZXhpc3Rpbmcga2V5dGFiIGZpbGUgJXMiLCBrdGFiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLREM6dW5zdXBwb3J0ZWQga2V5dGFiIG1vZGU6ICVzIiwgbW9kZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJLREM6IHN0YXJ0ZWQgb24gJXM6JXMgd2l0aCAnJXMnIHJlYWxtIiwKLSAgICAgICAgICAgICAgICAgICAgaG9zdCwga2RjLmdldFBvcnQoKSwgcmVhbG0pKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLREM6IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIiwgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4ga2RjOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEhlbHBlciBjbGFzcyB0byBlbmNhcHN1bGF0ZSBhIGpvYiBpbiBhIEtEQy4KICAgICAgKi8KQEAgLTE0MTAsMjAgKzEzMDQsMTMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEtEQ05hbWVTZXJ2aWNlIGltcGxlbWVudHMgTmFtZVNlcnZpY2VEZXNjcmlwdG9yIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfRVhJU1RJTkdfSE9TVCA9ICJub3QuZXhpc3RpbmcuaG9zdCI7Ci0KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBOYW1lU2VydmljZSBjcmVhdGVOYW1lU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICAgICAgTmFtZVNlcnZpY2UgbnMgPSBuZXcgTmFtZVNlcnZpY2UoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIEluZXRBZGRyZXNzW10gbG9va3VwQWxsSG9zdEFkZHIoU3RyaW5nIGhvc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIGxvY2FsaG9zdCBleGNlcHQgTk9UX0VYSVNUSU5HX0hPU1QKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5PVF9FWElTVElOR19IT1NULmVxdWFscyhob3N0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVua25vd25Ib3N0RXhjZXB0aW9uKCJVbmtub3duIGhvc3QgbmFtZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE5PVF9FWElTVElOR19IT1NUKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGlzIGxvY2FsaG9zdAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZXRBZGRyZXNzW117CiAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaG9zdCwgbmV3IGJ5dGVbXXsxMjcsMCwwLDF9KQogICAgICAgICAgICAgICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9LcmJUaWNrZXQuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vS3JiVGlja2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWQxY2MuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9LcmJUaWNrZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKLWltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlJlZnJlc2hGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuS2VyYmVyb3NUaWNrZXQ7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkNvbnRleHQ7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA2ODU3Nzk1IDgwNzUyOTkKLSAqIEBzdW1tYXJ5IENoZWNrcyBLZXJiZXJvcyB0aWNrZXQgcHJvcGVydGllcwotICogQHJ1biBtYWluL290aGVydm0gS3JiVGlja2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBLcmJUaWNrZXQgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNID0gIlRFU1QuUkVBTE0iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gImxvY2FsaG9zdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiVEVTVEVSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUklOQ0lQQUwgPSBVU0VSICsgIkAiICsgUkVBTE07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInBhc3N3b3JkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1JCVEdUX1BSSU5DSVBBTCA9ICJrcmJ0Z3QvIiArIFJFQUxNOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfRklMRU5BTUUgPSAia3JiNS5jb25mIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFBU19DT05GID0gImphYXMuY29uZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSUNLRVRfTElGVEVUSU1FID0gNSAqIDYwICogMTAwMDsgLy8gNSBtaW5zCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gZGVmaW5lIHByaW5jaXBhbHMKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVU0VSX1BSSU5DSVBBTCwgUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChLUkJUR1RfUFJJTkNJUEFMLCBudWxsKTsKLQotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkua3JiNS5jb25mIiwgS1JCNV9DT05GX0ZJTEVOQU1FKTsKLQotICAgICAgICAvLyBzdGFydCBhIGxvY2FsIEtEQyBpbnN0YW5jZQotICAgICAgICBLREMga2RjID0gS0RDLnN0YXJ0S0RDKEhPU1QsIG51bGwsIFJFQUxNLCBwcmluY2lwYWxzLCBudWxsLCBudWxsKTsKLSAgICAgICAgS0RDLnNhdmVDb25maWcoS1JCNV9DT05GX0ZJTEVOQU1FLCBrZGMsCi0gICAgICAgICAgICAgICAgImZvcndhcmRhYmxlID0gdHJ1ZSIsICJwcm94aWFibGUgPSB0cnVlIik7Ci0KLSAgICAgICAgLy8gY3JlYXRlIEpBQVMgY29uZmlnCi0gICAgICAgIEZpbGVzLndyaXRlKFBhdGhzLmdldChKQUFTX0NPTkYpLCBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgICAgICJDbGllbnQgeyIsCi0gICAgICAgICAgICAgICAgIiAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZSByZXF1aXJlZDsiLAotICAgICAgICAgICAgICAgICJ9OyIKLSAgICAgICAgKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsIEpBQVNfQ09ORik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXguc2VjdXJpdHkuYXV0aC51c2VTdWJqZWN0Q3JlZHNPbmx5IiwgImZhbHNlIik7Ci0KLSAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBJbnN0YW50Lm5vdygpLmdldEVwb2NoU2Vjb25kKCkgKiAxMDAwOwotCi0gICAgICAgIExvZ2luQ29udGV4dCBsYyA9IG5ldyBMb2dpbkNvbnRleHQoIkNsaWVudCIsCi0gICAgICAgICAgICAgICAgbmV3IEhlbHBlci5Vc2VyUGFzc3dvcmRIYW5kbGVyKFVTRVIsIFBBU1NXT1JEKSk7Ci0gICAgICAgIGxjLmxvZ2luKCk7Ci0KLSAgICAgICAgU3ViamVjdCBzdWJqZWN0ID0gbGMuZ2V0U3ViamVjdCgpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1YmplY3Q6ICIgKyBzdWJqZWN0KTsKLQotICAgICAgICBTZXQgY3JlZHMgPSBzdWJqZWN0LmdldFByaXZhdGVDcmVkZW50aWFscygKLSAgICAgICAgICAgICAgICBLZXJiZXJvc1RpY2tldC5jbGFzcyk7Ci0KLSAgICAgICAgaWYgKGNyZWRzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNdWx0aXBsZSBjcmVkaW50aWFscyBmb3VuZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgT2JqZWN0IG8gPSBjcmVkcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEtlcmJlcm9zVGlja2V0KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluc3RhbmNlIG9mIEtlcmJlcm9zVGlja2V0IGV4cGVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgS2VyYmVyb3NUaWNrZXQga3JiVGt0ID0gKEtlcmJlcm9zVGlja2V0KSBvOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm9yd2FyZGFibGUgPSAiICsga3JiVGt0LmlzRm9yd2FyZGFibGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicHJveGlhYmxlICAgPSAiICsga3JiVGt0LmlzUHJveGlhYmxlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlbmV3YWJsZSAgID0gIiArIGtyYlRrdC5pc1JlbmV3YWJsZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50ICAgICA9ICIgKyBrcmJUa3QuaXNDdXJyZW50KCkpOwotCi0gICAgICAgIGlmICgha3JiVGt0LmlzRm9yd2FyZGFibGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZvcndhcmRhYmxlIHRpY2tldCBleHBlY3RlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFrcmJUa3QuaXNQcm94aWFibGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb3hpYWJsZSB0aWNrZXQgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgha3JiVGt0LmlzQ3VycmVudCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGlja2V0IGlzIG5vdCBjdXJyZW50Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoa3JiVGt0LmlzUmVuZXdhYmxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJOb3QgcmVuZXdhYmxlIHRpY2tldCBleHBlY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBrcmJUa3QucmVmcmVzaCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBSZWZyZXNoRmFpbGVkRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaChSZWZyZXNoRmFpbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNoZWNrVGltZShrcmJUa3QsIHN0YXJ0VGltZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcm9uZyB0aWNrZXQgbGlmZSB0aW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICBrcmJUa3QuZGVzdHJveSgpOwotICAgICAgICBpZiAoIWtyYlRrdC5pc0Rlc3Ryb3llZCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGlja2V0IG5vdCBkZXN0cm95ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrVGltZShLZXJiZXJvc1RpY2tldCBrcmJUa3QsIGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgIGxvbmcgdGlja2V0RW5kVGltZSA9IGtyYlRrdC5nZXRFbmRUaW1lKCkuZ2V0VGltZSgpOwotICAgICAgICBsb25nIHJvdWdoTGlmZVRpbWUgPSB0aWNrZXRFbmRUaW1lIC0gc3RhcnRUaW1lOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0IHRpbWUgICAgICAgICAgICA9ICIgKyBzdGFydFRpbWUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVuZCB0aW1lICAgICAgICAgICAgICA9ICIgKyB0aWNrZXRFbmRUaW1lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyb3VnaCBsaWZlIHRpbWUgICAgICAgPSAiICsgcm91Z2hMaWZlVGltZSk7Ci0gICAgICAgIHJldHVybiByb3VnaExpZmVUaW1lID49IFRJQ0tFVF9MSUZURVRJTUU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9NYXhSZXRyaWVzLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL01heFJldHJpZXMuamF2YQppbmRleCAyZGUzODE3Li44ODBjMDIzIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL01heFJldHJpZXMuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL01heFJldHJpZXMuamF2YQpAQCAtMjksOTQgKzI5LDQ5IEBACiAgKiBAc3VtbWFyeSBzdXBwb3J0IG1heF9yZXRyaWVzIGluIGtyYjUuY29uZgogICovCiAKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwogCiBwdWJsaWMgY2xhc3MgTWF4UmV0cmllcyB7Ci0KLSAgICBzdGF0aWMgaW50IGlkbGVQb3J0ID0gLTE7Ci0gICAgc3RhdGljIENvbW1NYXRjaGVyIGNtID0gbmV3IENvbW1NYXRjaGVyKCk7Ci0KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzdW4uc2VjdXJpdHkua3JiNS5kZWJ1ZyIsICJ0cnVlIik7Ci0gICAgICAgIE9uZUtEQyBrZGMgPSBuZXcgT25lS0RDKG51bGwpLndyaXRlSkFBU0NvbmYoKTsKKyAgICAgICAgbmV3IE9uZUtEQyhudWxsKS53cml0ZUpBQVNDb25mKCk7CiAKLSAgICAgICAgLy8gQW4gaWRsZSBVRFAgc29ja2V0IHRvIHByZXZlbnQgUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uCi0gICAgICAgIERhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KCk7Ci0gICAgICAgIGlkbGVQb3J0ID0gZHMuZ2V0TG9jYWxQb3J0KCk7Ci0KLSAgICAgICAgY20uYWRkUG9ydChpZGxlUG9ydCk7Ci0gICAgICAgIGNtLmFkZFBvcnQoa2RjLmdldFBvcnQoKSk7CisgICAgICAgIC8vIEFuIGlkbGUgVURQIHNvY2tldCB0byByZXZlbnQgUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uCisgICAgICAgIERhdGFncmFtU29ja2V0IGRzID0gbmV3IERhdGFncmFtU29ja2V0KDMzMzMzKTsKIAogICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkua3JiNS5jb25mIiwgImFsdGVybmF0aXZlLWtyYjUuY29uZiIpOwogCisgICAgICAgIC8vIEZvciB0cnlMYXN0CiAgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJrcmI1LmtkYy5iYWQucG9saWN5IiwgInRyeWxhc3QiKTsKLQotICAgICAgICAvLyBXZSBhbHdheXMgbWFrZSB0aGUgcmVhbCB0aW1lb3V0IHRvIGJlIDEgc2Vjb25kCi0gICAgICAgIEJhZEtkYy5zZXRSYXRpbygwLjI1Zik7CiAgICAgICAgIHJld3JpdGVNYXhSZXRyaWVzKDQpOworICAgICAgICB0ZXN0MSg0MDAwLCA2KTsgICAgICAgICAvLyAxIDEgMSAxIDIgMgorICAgICAgICB0ZXN0MSg0MDAwLCAyKTsgICAgICAgICAvLyAyIDIKIAotICAgICAgICAvLyBFeHBsYW5hdGlvbjogSW4gdGhpcyBjYXNlLCBtYXhfcmV0cmllcz00IGFuZCB0aW1lb3V0PTRzLgotICAgICAgICAvLyBGb3IgQVMtUkVRIHdpdGhvdXQgcHJlYXV0aCwgd2Ugd2lsbCBzZWUgNCA0cyB0aW1lb3V0IG9uIGtkYyMxCi0gICAgICAgIC8vICgiYTQiIHJlcGVhdCA0IHRpbWVzKSwgYW5kIG9uZSA0cyB0aW1lb3V0IG9uIGtkYyMyICgiYjQiKS4gRm9yCi0gICAgICAgIC8vIEFTLVJFUSB3aXRoIHByZWF1dGgsIG9uZSA0cyB0aW1lb3V0IG9uIGtkYyMyIChzZWNvbmQgImI0IikuCi0gICAgICAgIC8vIHdlIHRvbGVyYXRlIDQgcmVhbCB0aW1lb3V0IG9uIGtkYyMyLCBzbyBtYWtlIGl0ICIoYjQpezIsNn0iLgotICAgICAgICB0ZXN0MSgiYTRhNGE0YTRiNGI0IiwgImE0YTRhNGE0KGI0KXsyLDZ9Iik7Ci0gICAgICAgIHRlc3QxKCJiNGI0IiwgIihiNCl7Miw2fSIpOwotCi0gICAgICAgIEJhZEtkYy5zZXRSYXRpbygxZik7CiAgICAgICAgIHJld3JpdGVNYXhSZXRyaWVzKDEpOwotICAgICAgICAvLyBFeHBsYW5hdGlvbjogU2luY2UgbWF4X3JldHJpZXM9MSBvbmx5LCB3ZSBjb3VsZCBmYWlsIGluIDFzdCBvciAybmQKLSAgICAgICAgLy8gQVMtUkVRIHRvIGtkYyMyLgotICAgICAgICBTdHJpbmcgYWN0dWFsID0gdGVzdDEoImExYjFiMSIsICIoYTFiMWIxfGExYjF4fGExYjFiMXgpIik7Ci0gICAgICAgIGlmIChhY3R1YWwuZW5kc1dpdGgoIngiKSkgewotICAgICAgICAgICAgLy8gSWYgMXN0IGF0dGVtcHQgZmFpbHMsIGFsbCBiYWRzIGFyZSBiYWNrIGF2YWlsYWJsZQotICAgICAgICAgICAgdGVzdDEoImExYjFiMSIsICIoYTFiMWIxfGExYjF4fGExYjFiMXgpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZXN0MSgiYjFiMSIsICIoYjFiMXxiMXh8YjFiMXgpIik7Ci0gICAgICAgIH0KKyAgICAgICAgdGVzdDEoMTAwMCwgMyk7ICAgICAgICAgLy8gMSAyIDIKKyAgICAgICAgdGVzdDEoMTAwMCwgMik7ICAgICAgICAgLy8gMiAyCiAKLSAgICAgICAgQmFkS2RjLnNldFJhdGlvKDAuMmYpOwogICAgICAgICByZXdyaXRlTWF4UmV0cmllcygtMSk7Ci0gICAgICAgIHRlc3QxKCJhNWE1YTViNWI1IiwgImE1YTVhNShiNSl7Miw0fSIpOwotICAgICAgICB0ZXN0MSgiYjViNSIsICIoYjUpezIsNH0iKTsKKyAgICAgICAgdGVzdDEoNTAwMCwgNCk7ICAgICAgICAgLy8gMSAxIDIgMgorICAgICAgICB0ZXN0MSg1MDAwLCAyKTsgICAgICAgICAvLyAyIDIKIAotICAgICAgICBCYWRLZGMuc2V0UmF0aW8oMC4yNWYpOwotICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgia3JiNS5rZGMuYmFkLnBvbGljeSIsCi0gICAgICAgICAgICAgICAgInRyeWxlc3M6MSwxMDAwIik7CisgICAgICAgIC8vIEZvciB0cnlMZXNzCisgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJrcmI1LmtkYy5iYWQucG9saWN5IiwgInRyeWxlc3M6MSwiICsgQmFkS2RjLnRvUmVhbCg1MDAwKSk7CiAgICAgICAgIHJld3JpdGVNYXhSZXRyaWVzKDQpOwotICAgICAgICB0ZXN0MSgiYTRhNGE0YTRiNGE0YjQiLCAiYTRhNGE0YTQoYjQpezEsM31hNChiNCl7MSwzfSIpOwotICAgICAgICB0ZXN0MSgiYTRiNGE0YjQiLCAiYTQoYjQpezEsM31hNChiNCl7MSwzfSIpOworICAgICAgICB0ZXN0MSg0MDAwLCA3KTsgICAgICAgICAvLyAxIDEgMSAxIDIgMSAyCisgICAgICAgIHRlc3QxKDQwMDAsIDQpOyAgICAgICAgIC8vIDEgMiAxIDIKIAotICAgICAgICBCYWRLZGMuc2V0UmF0aW8oMWYpOwogICAgICAgICByZXdyaXRlTWF4UmV0cmllcygxKTsKLSAgICAgICAgYWN0dWFsID0gdGVzdDEoImExYjFhMWIxIiwgIihhMWIxfGExYjF4fGExYjFhMWIxfGExYjFhMWIxeCkiKTsKLSAgICAgICAgaWYgKGFjdHVhbC5lbmRzV2l0aCgieCIpKSB7Ci0gICAgICAgICAgICB0ZXN0MSgiYTFiMWExYjEiLCAiKGExYjF8YTFiMXh8YTFiMWExYjF8YTFiMWExYjF4KSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGVzdDEoImExYjFhMWIxIiwgIihhMWIxfGExYjF4fGExYjFhMWIxfGExYjFhMWIxeCkiKTsKLSAgICAgICAgfQorICAgICAgICB0ZXN0MSgxMDAwLCA0KTsgICAgICAgICAvLyAxIDIgMSAyCisgICAgICAgIHRlc3QxKDEwMDAsIDQpOyAgICAgICAgIC8vIDEgMiAxIDIKIAotICAgICAgICBCYWRLZGMuc2V0UmF0aW8oLjJmKTsKICAgICAgICAgcmV3cml0ZU1heFJldHJpZXMoLTEpOwotICAgICAgICB0ZXN0MSgiYTVhNWE1YjVhNWI1IiwgImE1YTVhNShiNSl7MSwyfWE1KGI1KXsxLDJ9Iik7Ci0gICAgICAgIHRlc3QxKCJhNWI1YTViNSIsICJhNShiNSl7MSwyfWE1KGI1KXsxLDJ9Iik7Ci0KLSAgICAgICAgQmFkS2RjLnNldFJhdGlvKDFmKTsKLSAgICAgICAgcmV3cml0ZU1heFJldHJpZXMoMik7Ci0gICAgICAgIGlmIChCYWRLZGMudG9SZWFsKDIwMDApID4gMTAwMCkgewotICAgICAgICAgICAgLy8gRXhwbGFuYXRpb246IGlmIHRpbWVvdXQgaXMgbG9uZ2VyIHRoYW4gMXMgaW4gdHJ5TGVzcywKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgc2VlICJhMSIgYXQgMm5kIGtkYyMxIGFjY2VzcwotICAgICAgICAgICAgdGVzdDEoImEyYTJiMmExYjIiLCAiYTJhMihiMil7MSwyfWExKGIyKXsxLDJ9Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0ZXN0MSgiYTJhMmIyYTJiMiIsICJhMmEyKGIyKXsxLDJ9YTIoYjIpezEsMn0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJhZEtkYy5zZXRSYXRpbygxZik7CisgICAgICAgIHRlc3QxKDUwMDAsIDUpOyAgICAgICAgIC8vIDEgMSAyIDEgMgorICAgICAgICB0ZXN0MSg1MDAwLCA0KTsgICAgICAgICAvLyAxIDIgMSAyCiAKICAgICAgICAgcmV3cml0ZVVkcFByZWZMaW1pdCgtMSwgLTEpOyAgICAvLyBkZWZhdWx0LCBubyBsaW1pdAogICAgICAgICB0ZXN0MigiVURQIik7CkBAIC0xMzUsNTIgKzkwLDMyIEBACiAKICAgICAvKioKICAgICAgKiBPbmUgcm91bmQgb2YgdGVzdCBmb3IgbWF4X3JldHJpZXMgYW5kIHRpbWVvdXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhhY3QgdGhlIGV4cGVjdGVkIGV4YWN0IG1hdGNoLCB3aGVyZSBubyB0aW1lb3V0Ci0gICAgICogICAgICAgICAgICAgIGhhcHBlbnMgZm9yIHJlYWwgS0RDcwotICAgICAqIEBwYXJhbSByZWxheGVkIHRoZSBleHBlY3RlZCByZWxheGVkIG1hdGNoLCB3aGVyZSBzb21lIHRpbWVvdXQKLSAgICAgKiAgICAgICAgICAgICAgICBjb3VsZCBoYXBwZW4gZm9yIHJlYWwgS0RDcwotICAgICAqIEByZXR1cm4gdGhlIGFjdHVhbCByZXN1bHQKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgZXhwZWN0ZWQgdGltZW91dAorICAgICAqIEBwYXJhbSBjb3VudCB0aGUgZXhwZWN0ZWQgdG90YWwgdHJ5CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3QxKFN0cmluZyBleGFjdCwgU3RyaW5nIHJlbGF4ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdDEoaW50IHRpbWVvdXQsIGludCBjb3VudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0aW1lb3V0VGFnID0gInRpbWVvdXQ9IiArIEJhZEtkYy50b1JlYWwodGltZW91dCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBibyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgUHJpbnRTdHJlYW0gb2xkb3V0ID0gU3lzdGVtLm91dDsKICAgICAgICAgU3lzdGVtLnNldE91dChuZXcgUHJpbnRTdHJlYW0oYm8pKTsKLSAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29udGV4dCBjID0gQ29udGV4dC5mcm9tSkFBUygiY2xpZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgIH0KKyAgICAgICAgQ29udGV4dCBjID0gQ29udGV4dC5mcm9tSkFBUygiY2xpZW50Iik7CiAgICAgICAgIFN5c3RlbS5zZXRPdXQob2xkb3V0KTsKIAogICAgICAgICBTdHJpbmdbXSBsaW5lcyA9IG5ldyBTdHJpbmcoYm8udG9CeXRlQXJyYXkoKSkuc3BsaXQoIlxuIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0gVEVTVCAoIiArIGV4YWN0Ci0gICAgICAgICAgICAgICAgKyAiKSAtLS0tLS0tLS0tLS0tLS0tLSIpOwotCi0gICAgICAgIC8vIFJlc3VsdCwgYSBzZXJpZXMgb2YgdGltZW91dCArIGtkYyMKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0gVEVTVCAoIiArIHRpbWVvdXQgKyAiLCIgKworICAgICAgICAgICAgICAgIGNvdW50ICsgIikgLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICAgZm9yIChTdHJpbmcgbGluZTogbGluZXMpIHsKLSAgICAgICAgICAgIGlmIChjbS5tYXRjaChsaW5lKSkgeworICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiPj4+IEtEQ0NvbW11bmljYXRpb24iKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoY20ua2RjKCkpLmFwcGVuZChjbS50aW1lb3V0KCkpOworICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YodGltZW91dFRhZykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIHRpbWVvdXQgdmFsdWUiICsgdGltZW91dFRhZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZhaWxlZCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKCJ4Iik7CisgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJSZXRyeSBjb3VudCBpcyAiICsgY291bnQgKyAiIGxlc3MiKTsKICAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWU6ICIgKyAoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydCkgLyAxMDAwMDAwMDAwZCk7Ci0gICAgICAgIFN0cmluZyBhY3R1YWwgPSBzYi50b1N0cmluZygpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFjdHVhbDogIiArIGFjdHVhbCk7Ci0gICAgICAgIGlmIChhY3R1YWwuZXF1YWxzKGV4YWN0KSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGFjdCBtYXRjaDogIiArIGV4YWN0KTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3R1YWwubWF0Y2hlcyhyZWxheGVkKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIhISEhIFRvbGVyYW50IG1hdGNoOiAiICsgcmVsYXhlZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJNYXRjaCBuZWl0aGVyICIgKyBleGFjdCArICIgbm9yICIgKyByZWxheGVkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYWN0dWFsOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk4LDExICsxMzMsMTEgQEAKICAgICAgICAgU3RyaW5nW10gbGluZXMgPSBuZXcgU3RyaW5nKGJvLnRvQnl0ZUFycmF5KCkpLnNwbGl0KCJcbiIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIFRFU1QgLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICAgZm9yIChTdHJpbmcgbGluZTogbGluZXMpIHsKLSAgICAgICAgICAgIGlmIChjbS5tYXRjaChsaW5lKSkgeworICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgiPj4+IEtEQ0NvbW11bmljYXRpb24iKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKICAgICAgICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgICAgIGlmICghY20ucHJvdG9jb2woKS5lcXVhbHMocHJvdG8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIHByb3RvY29sIHZhbHVlIik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZihwcm90bykgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIldyb25nIHRpbWVvdXQgdmFsdWUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyNSw3ICsxNjAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiW3JlYWxtc10iKSkgewogICAgICAgICAgICAgICAgIC8vIFJlY29uZmlnIGdsb2JhbCBzZXR0aW5nCi0gICAgICAgICAgICAgICAgZncud3JpdGUoImtkY190aW1lb3V0ID0gNTAwMFxuIik7CiAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbCAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICBmdy53cml0ZSgidWRwX3ByZWZlcmVuY2VfbGltaXQgPSAiICsgZ2xvYmFsICsgIlxuIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjQ0LDggKzE3OCw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgbWF4X3JldHJpZXMgYW5kIHRpbWVvdXQgdmFsdWUgZm9yIHJlYWxtLiBUaGUgZ2xvYmFsIHZhbHVlIGlzIGFsd2F5cwotICAgICAqIDMgYW5kIDUwMDAuCi0gICAgICoKKyAgICAgKiAyIGFuZCA1MDAwLgogICAgICAqIEBwYXJhbSB2YWx1ZSBtYXhfcmV0cmllcyBhbmQgdGltZW91dC8xMDAwIGZvciBhIHJlYWxtLCAtMSBtZWFucyBub25lLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmV3cml0ZU1heFJldHJpZXMoaW50IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI1OCw3ICsxOTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiW3JlYWxtc10iKSkgewogICAgICAgICAgICAgICAgIC8vIFJlY29uZmlnIGdsb2JhbCBzZXR0aW5nCi0gICAgICAgICAgICAgICAgZncud3JpdGUoIm1heF9yZXRyaWVzID0gM1xuIik7CisgICAgICAgICAgICAgICAgZncud3JpdGUoIm1heF9yZXRyaWVzID0gMlxuIik7CiAgICAgICAgICAgICAgICAgZncud3JpdGUoImtkY190aW1lb3V0ID0gIiArIEJhZEtkYy50b1JlYWwoNTAwMCkgKyAiXG4iKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAocy50cmltKCkuc3RhcnRzV2l0aCgia2RjID0gIikpIHsKICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHsKQEAgLTI2Nyw3ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICBmdy53cml0ZSgiICAgIGtkY190aW1lb3V0ID0gIiArIEJhZEtkYy50b1JlYWwodmFsdWUqMTAwMCkgKyAiXG4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gQWRkIGEgYmFkIEtEQyBhcyB0aGUgZmlyc3QgY2FuZGlkYXRlCi0gICAgICAgICAgICAgICAgZncud3JpdGUoIiAgICBrZGMgPSBsb2NhbGhvc3Q6IiArIGlkbGVQb3J0ICsgIlxuIik7CisgICAgICAgICAgICAgICAgZncud3JpdGUoIiAgICBrZGMgPSBsb2NhbGhvc3Q6MzMzMzNcbiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZncud3JpdGUocyArICJcbiIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL09uZUtEQy5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9PbmVLREMuamF2YQppbmRleCA3NTI2NjI4Li4yZDNmYzU0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL09uZUtEQy5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vT25lS0RDLmphdmEKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgKiBlbnRyaWVzIHdpdGggbmFtZXMgdXNpbmcgZXhpc3RpbmcgT25lS0RDIHByaW5jaXBhbHMuCiAgICAgICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KLSAgICBwdWJsaWMgT25lS0RDIHdyaXRlSkFBU0NvbmYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHdyaXRlSkFBU0NvbmYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciLCBKQUFTX0NPTkYpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShKQUFTX0NPTkYpOwogICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwpAQCAtMTIzLDcgKzEyMyw2IEBACiAgICAgICAgICAgICAgICAgIiAgICBpc0luaXRpYXRvcj1mYWxzZTtcbn07XG4iCiAgICAgICAgICAgICAgICAgKS5nZXRCeXRlcygpKTsKICAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9SZWZyZXNoS3JiNUNvbmZpZy5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9SZWZyZXNoS3JiNUNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzIyNThmLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vUmVmcmVzaEtyYjVDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkNvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDQ3NDUwNTYgODA3NTI5NwotICogQHN1bW1hcnkgQ2hlY2tzIGlmIHJlZnJlc2hLcmI1Q29uZmlnIGlzIHNldCB0byB0cnVlIGZvciBLcmI1TG9naW5Nb2R1bGUsCi0gKiAgICAgICAgICB0aGVuIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSByZWZyZXNoZWQgYmVmb3JlIGxvZ2luKCkgbWV0aG9kIGlzIGNhbGxlZAotICogQHJ1biBtYWluL290aGVydm0gUmVmcmVzaEtyYjVDb25maWcKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hLcmI1Q29uZmlnIHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUkMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKTsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9FWElTVElOR19IT1NUID0gIm5vdC5leGlzdGluZy5ob3N0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNID0gIlRFU1QuUkVBTE0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJVU0VSIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUFJJTkNJUEFMID0gVVNFUiArICJAIiArIFJFQUxNOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QQVNTV09SRCA9ICJwYXNzd29yZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLUkJUR1RfUFJJTkNJUEFMID0gImtyYnRndC8iICsgUkVBTE07Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfRklMRU5BTUUgPSAia3JiNS5jb25mIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByaW5jaXBhbHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KFVTRVJfUFJJTkNJUEFMLCBVU0VSX1BBU1NXT1JEKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoS1JCVEdUX1BSSU5DSVBBTCwgbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUuY29uZiIsIEtSQjVfQ09ORl9GSUxFTkFNRSk7Ci0KLSAgICAgICAgLy8gc3RhcnQgYSBsb2NhbCBLREMsIGFuZCBzYXZlIGtyYjUgY29uZmlnCi0gICAgICAgIEtEQyBrZGMgPSBLREMuc3RhcnRLREMoSE9TVCwgbnVsbCwgUkVBTE0sIHByaW5jaXBhbHMsIG51bGwsIG51bGwpOwotICAgICAgICBLREMuc2F2ZUNvbmZpZyhLUkI1X0NPTkZfRklMRU5BTUUsIGtkYywgIm1heF9yZXRyaWVzID0gMSIpOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsCi0gICAgICAgICAgICAgICAgVEVTVF9TUkMgKyBGaWxlLnNlcGFyYXRvciArICJyZWZyZXNoS3JiNUNvbmZpZy5qYWFzIik7Ci0KLSAgICAgICAgQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIgPSBuZXcgSGVscGVyLlVzZXJQYXNzd29yZEhhbmRsZXIoCi0gICAgICAgICAgICAgICAgVVNFUiwgVVNFUl9QQVNTV09SRCk7Ci0KLSAgICAgICAgLy8gc2V0IGluY29ycmVjdCBLREMKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJqYXZhLnNlY3VyaXR5LmtyYjUua2RjID0gIiArIE5PVF9FWElTVElOR19IT1NUKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUua2RjIiwgTk9UX0VYSVNUSU5HX0hPU1QpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImphdmEuc2VjdXJpdHkua3JiNS5yZWFsbSA9ICIgKyBSRUFMTSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LnJlYWxtIiwgUkVBTE0pOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IExvZ2luQ29udGV4dCgiUmVmcmVzaGFibGUiLCBoYW5kbGVyKS5sb2dpbigpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGxlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkIGxvZ2luIGZhaWx1cmU6ICIgKyBsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXNldCBwcm9wZXJ0aWVzCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzZXQgamF2YS5zZWN1cml0eS5rcmI1LmtkYyIpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LmtkYyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc2V0IGphdmEuc2VjdXJpdHkua3JiNS5yZWFsbSIpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LnJlYWxtIik7Ci0KLSAgICAgICAgLy8gbG9naW4gd2l0aCBub3QtcmVmcmVzaGFibGUgY29uZmlnCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgTG9naW5Db250ZXh0KCJOb3RSZWZyZXNoYWJsZSIsIGhhbmRsZXIpLmxvZ2luKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoTG9naW5FeGNlcHRpb24gbGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgbG9naW4gZmFpbHVyZTogIiArIGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvZ2luIHdpdGggcmVmcmVzaGFibGUgY29uZmlnCi0gICAgICAgIG5ldyBMb2dpbkNvbnRleHQoIlJlZnJlc2hhYmxlIiwgaGFuZGxlcikubG9naW4oKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL1VuYm91bmRTU0wuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vVW5ib3VuZFNTTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY3M2FhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vVW5ib3VuZFNTTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDI1MTIzCi0gKiBAc3VtbWFyeSBDaGVja3MgaWYgYW4gdW5ib3VuZCBzZXJ2ZXIgY2FuIGhhbmRsZSBjb25uZWN0aW9ucwotICogICAgICAgICAgb25seSBmb3IgYWxsb3dlZCBzZXJ2aWNlIHByaW5jaXBhbHMKLSAqIEBydW4gbWFpbi9vdGhlcnZtL2phdmEuc2VjdXJpdHkucG9saWN5PXVuYm91bmQuc3NsLnBvbGljeSBVbmJvdW5kU1NMCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYm91bmQuc3NsLmphYXMuY29uZiBzZXJ2ZXJfc3RhcgotICogQHJ1biBtYWluL290aGVydm0vamF2YS5zZWN1cml0eS5wb2xpY3k9dW5ib3VuZC5zc2wucG9saWN5IFVuYm91bmRTU0wKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZC5zc2wuamFhcy5jb25mIHNlcnZlcl9tdWx0aXBsZV9wcmluY2lwYWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmJvdW5kU1NMIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbixMb2dpbkV4Y2VwdGlvbiwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgVW5ib3VuZFNTTCB0ZXN0ID0gbmV3IFVuYm91bmRTU0woKTsKLSAgICAgICAgdGVzdC5zdGFydChhcmdzWzBdLCBhcmdzWzFdKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoU3RyaW5nIGphYWNDb25maWdGaWxlLCBTdHJpbmcgc2VydmVySmFhc0NvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLExvZ2luRXhjZXB0aW9uLAotICAgICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGRlZmluZSBwcmluY2lwYWxzCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlMWhvc3QgPSAic2VydmljZTEuIiArIFVuYm91bmRTU0xVdGlscy5IT1NUOwotICAgICAgICBTdHJpbmcgc2VydmljZTJob3N0ID0gInNlcnZpY2UyLiIgKyBVbmJvdW5kU1NMVXRpbHMuSE9TVDsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UzaG9zdCA9ICJzZXJ2aWNlMy4iICsgVW5ib3VuZFNTTFV0aWxzLkhPU1Q7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlMVByaW5jaXBhbCA9ICJob3N0LyIgKyBzZXJ2aWNlMWhvc3QgKyAiQCIKLSAgICAgICAgICAgICAgICArIFVuYm91bmRTU0xVdGlscy5SRUFMTTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UyUHJpbmNpcGFsID0gImhvc3QvIiArIHNlcnZpY2UyaG9zdCArICJAIgotICAgICAgICAgICAgICAgICsgVW5ib3VuZFNTTFV0aWxzLlJFQUxNOwotICAgICAgICBTdHJpbmcgc2VydmljZTNQcmluY2lwYWwgPSAiaG9zdC8iICsgc2VydmljZTNob3N0ICsgIkAiCi0gICAgICAgICAgICAgICAgKyBVbmJvdW5kU1NMVXRpbHMuUkVBTE07Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuVVNFUl9QUklOQ0lQQUwsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlVTRVJfUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuS1JCVEdUX1BSSU5DSVBBTCwgbnVsbCk7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KHNlcnZpY2UxUHJpbmNpcGFsLCBudWxsKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoc2VydmljZTJQcmluY2lwYWwsIG51bGwpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChzZXJ2aWNlM1ByaW5jaXBhbCwgbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUuY29uZiIsCi0gICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuS1JCNV9DT05GX0ZJTEVOQU1FKTsKLQotICAgICAgICAvLyBzdGFydCBhIGxvY2FsIEtEQyBpbnN0YW5jZQotICAgICAgICBLREMuc3RhcnRLREMoVW5ib3VuZFNTTFV0aWxzLkhPU1QsIFVuYm91bmRTU0xVdGlscy5LUkI1X0NPTkZfRklMRU5BTUUsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlJFQUxNLCBwcmluY2lwYWxzLAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5LVEFCX0ZJTEVOQU1FLCBLREMuS3RhYk1vZGUuQVBQRU5EKTsKLQotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciLAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5URVNUX1NSQyArIFVuYm91bmRTU0xVdGlscy5GUyArIGphYWNDb25maWdGaWxlKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5zZWN1cml0eS5hdXRoLnVzZVN1YmplY3RDcmVkc09ubHkiLCAiZmFsc2UiKTsKLQotICAgICAgICB0cnkgKGZpbmFsIFNTTEVjaG9TZXJ2ZXIgc2VydmVyID0gU1NMRWNob1NlcnZlci5pbml0KAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5UTFNfS1JCNV9GSUxURVIsIFVuYm91bmRTU0xVdGlscy5TTklfUEFUVEVSTikpIHsKLQotICAgICAgICAgICAgLy8gc3RhcnQgYSBzZXJ2ZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5zdGFydFNlcnZlcldpdGhKYWFzKHNlcnZlciwgc2VydmVySmFhc0NvbmZpZyk7Ci0KLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgaXMgcmVhZHkKLSAgICAgICAgICAgIHdoaWxlICghc2VydmVyLmlzUmVhZHkoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChVbmJvdW5kU1NMVXRpbHMuREVMQVkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9ydCA9IHNlcnZlci5nZXRQb3J0KCk7Ci0KLSAgICAgICAgICAgIC8vIHJ1biBjbGllbnRzCi0KLSAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgc2hvdWxkIGhhdmUgYSBwZXJtaXNzaW9uIHRvIGhhbmRsZSBhIHJlcXVlc3QKLSAgICAgICAgICAgIC8vIHdpdGggdGhpcyBzZXJ2aWNlIHByaW5jaXBhbCAodGhlcmUgc2hvdWxkIGJlIGFuIGFwcHJvcHJpYXRlCi0gICAgICAgICAgICAvLyBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLlNlcnZpY2VQZXJtaXNzaW9uIGluIHBvbGljeSBmaWxlKQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0OiBTTkkgaG9zdG5hbWUgPSAiICsgc2VydmljZTFob3N0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICBTU0xDbGllbnQuaW5pdChVbmJvdW5kU1NMVXRpbHMuSE9TVCwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRMU19LUkI1X0ZJTFRFUiwgc2VydmljZTFob3N0KS5jb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vIHRoZSBzZXJ2ZXIgc2hvdWxkIE5PVCBoYXZlIGEgcGVybWlzc2lvbiB0byBoYW5kbGUgYSByZXF1ZXN0Ci0gICAgICAgICAgICAvLyB3aXRoIHRoaXMgc2VydmljZSBwcmluY2lwYWwgKHRoZXJlIHNob3VsZCBiZSBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5TZXJ2aWNlUGVybWlzc2lvbiBpbiBwb2xpY3kgZmlsZSkKLSAgICAgICAgICAgIC8vIGhhbmRzaGFrZSBmYWlsdXJlcyBpcyBleHBlY3RlZAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0OiBTTkkgaG9zdG5hbWUgPSAiICsgc2VydmljZTJob3N0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGlvbiBmYWlsdXJlIGlzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNTTENsaWVudC5pbml0KFVuYm91bmRTU0xVdGlscy5IT1NULCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRMU19LUkI1X0ZJTFRFUiwgc2VydmljZTJob3N0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleHBlY3RlZCBJT0V4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhlIHNlcnZlciBzaG91bGQgaGF2ZSBhIHBlcm1pc3Npb24gdG8gaGFuZGxlIGEgcmVxdWVzdAotICAgICAgICAgICAgLy8gd2l0aCB0aGlzIHNlcnZpY2UgcHJpbmNpcGFsICh0aGVyZSBzaG91bGQgYmUgYW4gYXBwcm9wcmlhdGUKLSAgICAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuU2VydmljZVBlcm1pc3Npb24gaW4gcG9saWN5IGZpbGUpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3Q6IFNOSSBob3N0bmFtZSA9ICIgKyBzZXJ2aWNlM2hvc3QKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gaXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIFNTTENsaWVudC5pbml0KFVuYm91bmRTU0xVdGlscy5IT1NULCBwb3J0LAotICAgICAgICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuVExTX0tSQjVfRklMVEVSLCBzZXJ2aWNlM2hvc3QpLmNvbm5lY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL1VuYm91bmRTU0xNdWx0aXBsZUtleXMuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vVW5ib3VuZFNTTE11bHRpcGxlS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFlYTJiLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vVW5ib3VuZFNTTE11bHRpcGxlS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDI1MTIzCi0gKiBAc3VtbWFyeSBDaGVja3MgaWYgYW4gdW5ib3VuZCBzZXJ2ZXIgcGljayB1cCBhIGNvcnJlY3Qga2V5IGZyb20ga2V5dGFiCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBVbmJvdW5kU1NMTXVsdGlwbGVLZXlzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYm91bmQuc3NsLmphYXMuY29uZiBzZXJ2ZXJfc3RhcgotICogQHJ1biBtYWluL290aGVydm0gVW5ib3VuZFNTTE11bHRpcGxlS2V5cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kLnNzbC5qYWFzLmNvbmYgc2VydmVyX211bHRpcGxlX3ByaW5jaXBhbHMKLSAqLwotcHVibGljIGNsYXNzIFVuYm91bmRTU0xNdWx0aXBsZUtleXMgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBMb2dpbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgVW5ib3VuZFNTTE11bHRpcGxlS2V5cyB0ZXN0ID0gbmV3IFVuYm91bmRTU0xNdWx0aXBsZUtleXMoKTsKLSAgICAgICAgdGVzdC5zdGFydChhcmdzWzBdLCBhcmdzWzFdKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoU3RyaW5nIGphYWNDb25maWdGaWxlLCBTdHJpbmcgc2VydmVySmFhc0NvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBMb2dpbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBkZWZpbmUgc2VydmljZSBwcmluY2lwYWxzCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlMWhvc3QgPSAic2VydmljZTEuIiArIFVuYm91bmRTU0xVdGlscy5IT1NUOwotICAgICAgICBTdHJpbmcgc2VydmljZTJob3N0ID0gInNlcnZpY2UyLiIgKyBVbmJvdW5kU1NMVXRpbHMuSE9TVDsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UzaG9zdCA9ICJzZXJ2aWNlMy4iICsgVW5ib3VuZFNTTFV0aWxzLkhPU1Q7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlMVByaW5jaXBhbCA9ICJob3N0LyIgKyBzZXJ2aWNlMWhvc3QgKyAiQCIKLSAgICAgICAgICAgICAgICArIFVuYm91bmRTU0xVdGlscy5SRUFMTTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UyUHJpbmNpcGFsID0gImhvc3QvIiArIHNlcnZpY2UyaG9zdCArICJAIgotICAgICAgICAgICAgICAgICsgVW5ib3VuZFNTTFV0aWxzLlJFQUxNOwotICAgICAgICBTdHJpbmcgc2VydmljZTNQcmluY2lwYWwgPSAiaG9zdC8iICsgc2VydmljZTNob3N0ICsgIkAiCi0gICAgICAgICAgICAgICAgKyBVbmJvdW5kU1NMVXRpbHMuUkVBTE07Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuVVNFUl9QUklOQ0lQQUwsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlVTRVJfUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuS1JCVEdUX1BSSU5DSVBBTCwgInBhc3MiKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoc2VydmljZTFQcmluY2lwYWwsICJwYXNzMCIpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChzZXJ2aWNlMVByaW5jaXBhbCwgInBhc3MxIik7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KHNlcnZpY2UxUHJpbmNpcGFsLCAicGFzczIiKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoc2VydmljZTJQcmluY2lwYWwsICJwYXNzIik7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KHNlcnZpY2UzUHJpbmNpcGFsLCAicGFzcyIpOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LmNvbmYiLAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5LUkI1X0NPTkZfRklMRU5BTUUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFN0YXJ0IGEgbG9jYWwgS0RDIGluc3RhbmNlCi0gICAgICAgICAqCi0gICAgICAgICAqIEtleXRhYiBmaWxlIGNvbnRhaW5zIDMga2V5cyAod2l0aCBkaWZmZXJlbnQgS1ZOTykgZm9yIHNlcnZpY2UxCi0gICAgICAgICAqIHByaW5jaXBhbCwgYnV0IHBhc3N3b3JkIGZvciBvbmx5IG9uZSBrZXkgaXMgdGhlIHNhbWUgd2l0aCB0aGUgcmVjb3JkCi0gICAgICAgICAqIGZvciBzZXJ2aWNlMSBwcmluY2lwYWwgaW4gS0RDLgotICAgICAgICAgKi8KLSAgICAgICAgS0RDLnN0YXJ0S0RDKFVuYm91bmRTU0xVdGlscy5IT1NULCBVbmJvdW5kU1NMVXRpbHMuS1JCNV9DT05GX0ZJTEVOQU1FLAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5SRUFMTSwgcHJpbmNpcGFscywKLSAgICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuS1RBQl9GSUxFTkFNRSwgS0RDLkt0YWJNb2RlLkFQUEVORCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIiwKLSAgICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuVEVTVF9TUkMgKyBVbmJvdW5kU1NMVXRpbHMuRlMgKyBqYWFjQ29uZmlnRmlsZSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXguc2VjdXJpdHkuYXV0aC51c2VTdWJqZWN0Q3JlZHNPbmx5IiwgImZhbHNlIik7Ci0KLSAgICAgICAgLy8gc3RhcnQgYW4gU1NMIHNlcnZlciBpbnN0YW5jZQotICAgICAgICB0cnkgKFNTTEVjaG9TZXJ2ZXIgc2VydmVyID0gU1NMRWNob1NlcnZlci5pbml0KAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5UTFNfS1JCNV9GSUxURVIsIFVuYm91bmRTU0xVdGlscy5TTklfUEFUVEVSTikpIHsKLQotICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLnN0YXJ0U2VydmVyV2l0aEphYXMoc2VydmVyLCBzZXJ2ZXJKYWFzQ29uZmlnKTsKLQotICAgICAgICAgICAgLy8gIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgaXMgcmVhZHkKLSAgICAgICAgICAgIHdoaWxlICghc2VydmVyLmlzUmVhZHkoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChVbmJvdW5kU1NMVXRpbHMuREVMQVkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBydW4gYSBjbGllbnQKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICBTU0xDbGllbnQuaW5pdChVbmJvdW5kU1NMVXRpbHMuSE9TVCwgc2VydmVyLmdldFBvcnQoKSwKLSAgICAgICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRMU19LUkI1X0ZJTFRFUiwgc2VydmljZTFob3N0KS5jb25uZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL1VuYm91bmRTU0xQcmluY2lwYWxQcm9wZXJ0eS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9VbmJvdW5kU1NMUHJpbmNpcGFsUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4NTQ5ZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL1VuYm91bmRTU0xQcmluY2lwYWxQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODAyNTEyMwotICogQHN1bW1hcnkgQ2hlY2tzIGlmIGFuIHVuYm91bmQgc2VydmVyIHVzZXMgYSBzZXJ2aWNlIHByaW5jaXBhbAotICogICAgICAgICAgZnJvbSBzdW4uc2VjdXJpdHkua3JiNS5wcmluY2lwYWwgc3lzdGVtIHByb3BlcnR5IGlmIHNwZWNpZmllZAotICogQHJ1biBtYWluL290aGVydm0gVW5ib3VuZFNTTFByaW5jaXBhbFByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYm91bmQuc3NsLmphYXMuY29uZiBzZXJ2ZXJfc3RhcgotICogQHJ1biBtYWluL290aGVydm0gVW5ib3VuZFNTTFByaW5jaXBhbFByb3BlcnR5Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYm91bmQuc3NsLmphYXMuY29uZiBzZXJ2ZXJfbXVsdGlwbGVfcHJpbmNpcGFscwotICovCi1wdWJsaWMgY2xhc3MgVW5ib3VuZFNTTFByaW5jaXBhbFByb3BlcnR5IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbixMb2dpbkV4Y2VwdGlvbiwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgVW5ib3VuZFNTTFByaW5jaXBhbFByb3BlcnR5IHRlc3QgPSBuZXcgVW5ib3VuZFNTTFByaW5jaXBhbFByb3BlcnR5KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoYXJnc1swXSwgYXJnc1sxXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoU3RyaW5nIGphYWNDb25maWdGaWxlLCBTdHJpbmcgc2VydmVySmFhc0NvbmZpZykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLExvZ2luRXhjZXB0aW9uLAotICAgICAgICAgICAgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0gICAgICAgIC8vIGRlZmluZSBwcmluY2lwYWxzCi0gICAgICAgIFN0cmluZyBzZXJ2aWNlMWhvc3QgPSAic2VydmljZTEuIiArIFVuYm91bmRTU0xVdGlscy5IT1NUOwotICAgICAgICBTdHJpbmcgc2VydmljZTNob3N0ID0gInNlcnZpY2UzLiIgKyBVbmJvdW5kU1NMVXRpbHMuSE9TVDsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2UxUHJpbmNpcGFsID0gImhvc3QvIiArIHNlcnZpY2UxaG9zdCArICJAIgotICAgICAgICAgICAgICAgICsgVW5ib3VuZFNTTFV0aWxzLlJFQUxNOwotICAgICAgICBTdHJpbmcgc2VydmljZTNQcmluY2lwYWwgPSAiaG9zdC8iICsgc2VydmljZTNob3N0Ci0gICAgICAgICAgICAgICAgKyAiQCIgKyBVbmJvdW5kU1NMVXRpbHMuUkVBTE07Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcmluY2lwYWxzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuVVNFUl9QUklOQ0lQQUwsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlVTRVJfUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChVbmJvdW5kU1NMVXRpbHMuS1JCVEdUX1BSSU5DSVBBTCwgbnVsbCk7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KHNlcnZpY2UxUHJpbmNpcGFsLCBudWxsKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoc2VydmljZTNQcmluY2lwYWwsIG51bGwpOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LmNvbmYiLAotICAgICAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5LUkI1X0NPTkZfRklMRU5BTUUpOwotCi0gICAgICAgIC8vIHN0YXJ0IGEgbG9jYWwgS0RDIGluc3RhbmNlCi0gICAgICAgIEtEQy5zdGFydEtEQyhVbmJvdW5kU1NMVXRpbHMuSE9TVCwgVW5ib3VuZFNTTFV0aWxzLktSQjVfQ09ORl9GSUxFTkFNRSwKLSAgICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuUkVBTE0sIHByaW5jaXBhbHMsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLktUQUJfRklMRU5BTUUsIEtEQy5LdGFiTW9kZS5BUFBFTkQpOwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsCi0gICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRFU1RfU1JDICsgVW5ib3VuZFNTTFV0aWxzLkZTICsgamFhY0NvbmZpZ0ZpbGUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnNlY3VyaXR5LmF1dGgudXNlU3ViamVjdENyZWRzT25seSIsICJmYWxzZSIpOwotCi0gICAgICAgIC8vIHN0YXJ0IGFuIFNTTCBzZXJ2ZXIgaW5zdGFuY2UKLSAgICAgICAgdHJ5IChmaW5hbCBTU0xFY2hvU2VydmVyIHNlcnZlciA9IFNTTEVjaG9TZXJ2ZXIuaW5pdCgKLSAgICAgICAgICAgICAgICBVbmJvdW5kU1NMVXRpbHMuVExTX0tSQjVfRklMVEVSLCBVbmJvdW5kU1NMVXRpbHMuU05JX1BBVFRFUk4pKSB7Ci0KLSAgICAgICAgICAgIC8vIHNwZWNpZnkgYSBzZXJ2aWNlIHByaW5jaXBhbCBmb3IgdGhlIHNlcnZlcgotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzdW4uc2VjdXJpdHkua3JiNS5wcmluY2lwYWwiLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlM1ByaW5jaXBhbCk7Ci0KLSAgICAgICAgICAgIFVuYm91bmRTU0xVdGlscy5zdGFydFNlcnZlcldpdGhKYWFzKHNlcnZlciwgc2VydmVySmFhc0NvbmZpZyk7Ci0KLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgaXMgcmVhZHkKLSAgICAgICAgICAgIHdoaWxlICghc2VydmVyLmlzUmVhZHkoKSkgewotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChVbmJvdW5kU1NMVXRpbHMuREVMQVkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcG9ydCA9IHNlcnZlci5nZXRQb3J0KCk7Ci0KLSAgICAgICAgICAgIC8vIGNvbm5ldGlvbiBmYWlsdXJlIGlzIGV4cGVjdGVkCi0gICAgICAgICAgICAvLyBzaW5jZSBzZXJ2aWNlMyBwcmluY2lwYWwgd2FzIHNwZWNpZmllZCB0byB1c2UgYnkgdGhlIHNlcnZlcgotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0OiBTTkkgaG9zdG5hbWUgPSAiICsgc2VydmljZTFob3N0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGlvbiBmYWlsdXJlIGlzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFNTTENsaWVudC5pbml0KFVuYm91bmRTU0xVdGlscy5IT1NULCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRMU19LUkI1X0ZJTFRFUiwgc2VydmljZTFob3N0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25uZWN0KCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJleHBlY3RlZCBJT0V4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0OiBTTkkgaG9zdG5hbWUgPSAiICsgc2VydmljZTNob3N0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlzIGV4cGVjdGVkIik7Ci0gICAgICAgICAgICBTU0xDbGllbnQuaW5pdChVbmJvdW5kU1NMVXRpbHMuSE9TVCwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgVW5ib3VuZFNTTFV0aWxzLlRMU19LUkI1X0ZJTFRFUiwgc2VydmljZTNob3N0KS5jb25uZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9VbmJvdW5kU1NMVXRpbHMuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vVW5ib3VuZFNTTFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZWZhYzIuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9VbmJvdW5kU1NMVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TTklIb3N0TmFtZTsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNOSU1hdGNoZXI7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TTklTZXJ2ZXJOYW1lOwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKLWltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnM7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXQ7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkNvbnRleHQ7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKLQotLyoKLSAqIEhlbHBlciBjbGFzcyBmb3IgdW5ib3VuZCBrcmI1IHRlc3RzLgotICovCi1jbGFzcyBVbmJvdW5kU1NMVXRpbHMgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLVEFCX0ZJTEVOQU1FID0gImtyYjUua2V5dGFiLmRhdGEiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAiVEVTVC5SRUFMTSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLUkJUR1RfUFJJTkNJUEFMID0gImtyYnRndC8iICsgUkVBTE07Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1NSQyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVExTX0tSQjVfRklMVEVSID0gIlRMU19LUkI1IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiVVNFUiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZTID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05JX1BBVFRFUk4gPSAiLioiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUklOQ0lQQUwgPSBVU0VSICsgIkAiICsgUkVBTE07Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfRklMRU5BTUUgPSAia3JiNS5jb25mIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IERFTEFZID0gMTAwMDsKLQotICAgc3RhdGljIFN0cmluZ1tdIGZpbHRlclN0cmluZ0FycmF5KFN0cmluZ1tdIHNyYywgU3RyaW5nIGZpbHRlcikgewotICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShzcmMpLmZpbHRlcigoaXRlbSkgLT4gaXRlbS5zdGFydHNXaXRoKGZpbHRlcikpCi0gICAgICAgICAgICAgICAgLnRvQXJyYXkoc2l6ZSAtPiBuZXcgU3RyaW5nW3NpemVdKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBtZXRob2QgZG9lcyBKQUFTIGxvZ2luLAotICAgICAqIGFuZCBydW5zIGFuIFNTTCBzZXJ2ZXIgaW4gdGhlIEpBQVMgY29udGV4dC4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBzdGFydFNlcnZlcldpdGhKYWFzKGZpbmFsIFNTTEVjaG9TZXJ2ZXIgc2VydmVyLAotICAgICAgICAgICAgU3RyaW5nIGNvbmZpZykgdGhyb3dzIExvZ2luRXhjZXB0aW9uLCBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgTG9naW5Db250ZXh0IGNvbnRleHQgPSBuZXcgTG9naW5Db250ZXh0KGNvbmZpZyk7Ci0gICAgICAgIGNvbnRleHQubG9naW4oKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXI6IHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24iKTsKLSAgICAgICAgU3ViamVjdC5kb0FzKGNvbnRleHQuZ2V0U3ViamVjdCgpLAotICAgICAgICAgICAgICAgIChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPE9iamVjdD4pICgpIC0+IHsKLSAgICAgICAgICAgIFNTTEVjaG9TZXJ2ZXIuc3RhcnRTZXJ2ZXIoc2VydmVyKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9KTsKLSAgICB9Ci0KLX0KLQotY2xhc3MgU1NMQ2xpZW50IHsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXVtdIGFycmF5cyA9IHsKLSAgICAgICAgbmV3IGJ5dGVbXSB7LTEsIDAsIDJ9LAotICAgICAgICBuZXcgYnl0ZVtdIHt9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgU1NMU29ja2V0IHNvY2tldDsKLQotICAgIHByaXZhdGUgU1NMQ2xpZW50KFNTTFNvY2tldCBzb2NrZXQpIHsKLSAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7Ci0gICAgfQotCi0gICAgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQ6IGNvbm5lY3QgdG8gc2VydmVyIik7Ci0gICAgICAgIHRyeSAoQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpKSB7Ci0KLSAgICAgICAgICAgIGZvciAoYnl0ZVtdIGJ5dGVzIDogYXJyYXlzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQ6IHNlbmQgYnl0ZSBhcnJheTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcoYnl0ZXMpKTsKLQotICAgICAgICAgICAgICAgIGJvcy53cml0ZShieXRlcyk7Ci0gICAgICAgICAgICAgICAgYm9zLmZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICBieXRlW10gcmVjaWV2ZWQgPSBuZXcgYnl0ZVtieXRlcy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGludCByZWFkID0gYmlzLnJlYWQocmVjaWV2ZWQsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2xpZW50OiBjb3VsZG4ndCByZWFkIGEgcmVzcG9uc2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudDogcmVjaWV2ZWQgYnl0ZSBhcnJheTogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcocmVjaWV2ZWQpKTsKLQotICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhieXRlcywgcmVjaWV2ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2xpZW50OiBzZW50IGJ5dGUgYXJyYXkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpcyBub3QgZXF1YWwgd2l0aCByZWNpZXZlZCBieXRlIGFycmF5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc29ja2V0LmdldFNlc3Npb24oKS5pbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoIXNvY2tldC5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU1NMQ2xpZW50IGluaXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgY2lwaGVyU3VpdGVGaWx0ZXIsCi0gICAgICAgICAgICBTdHJpbmcgc25pSG9zdE5hbWUpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gU1NMQ29udGV4dC5nZXREZWZhdWx0KCk7Ci0gICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3NmID0gKFNTTFNvY2tldEZhY3RvcnkpIHNzbENvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpOwotICAgICAgICBTU0xTb2NrZXQgc29ja2V0ID0gKFNTTFNvY2tldCkgc3NmLmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKLSAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgU1NMUGFyYW1ldGVycygpOwotCi0gICAgICAgIGlmIChjaXBoZXJTdWl0ZUZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBjaXBoZXJTdWl0ZXMgPSBVbmJvdW5kU1NMVXRpbHMuZmlsdGVyU3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgIHNzZi5nZXRTdXBwb3J0ZWRDaXBoZXJTdWl0ZXMoKSwgY2lwaGVyU3VpdGVGaWx0ZXIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQ6IGVuYWJsZWQgY2lwaGVyIHN1aXRlczogIgotICAgICAgICAgICAgICAgICAgICArIEFycmF5cy50b1N0cmluZyhjaXBoZXJTdWl0ZXMpKTsKLSAgICAgICAgICAgIHBhcmFtcy5zZXRDaXBoZXJTdWl0ZXMoY2lwaGVyU3VpdGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzbmlIb3N0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudDogc2V0IFNOSSBob3N0bmFtZTogIiArIHNuaUhvc3ROYW1lKTsKLSAgICAgICAgICAgIFNOSUhvc3ROYW1lIHNlcnZlck5hbWUgPSBuZXcgU05JSG9zdE5hbWUoc25pSG9zdE5hbWUpOwotICAgICAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgc2VydmVyTmFtZXMuYWRkKHNlcnZlck5hbWUpOwotICAgICAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTU0xDbGllbnQoc29ja2V0KTsKLSAgICB9Ci0KLX0KLQotY2xhc3MgU1NMRWNob1NlcnZlciBpbXBsZW1lbnRzIFJ1bm5hYmxlLCBBdXRvQ2xvc2VhYmxlIHsKLQotICAgIHByaXZhdGUgZmluYWwgU1NMU2VydmVyU29ja2V0IHNzb2NrZXQ7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gcmVhZHkgPSBmYWxzZTsKLQotICAgIC8qCi0gICAgICogU3RhcnRzIHRoZSBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgc3RhcnRTZXJ2ZXIoU1NMRWNob1NlcnZlciBzZXJ2ZXIpIHsKLSAgICAgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoc2VydmVyLCAiU1NMIGVjaG8gc2VydmVyIHRocmVhZCIpOwotICAgICAgICBzZXJ2ZXJUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFNTTEVjaG9TZXJ2ZXIoU1NMU2VydmVyU29ja2V0IHNzb2NrZXQpIHsKLSAgICAgICAgdGhpcy5zc29ja2V0ID0gc3NvY2tldDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE1haW4gc2VydmVyIGxvb3AuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlcjogc3RhcnRlZCIpOwotICAgICAgICB3aGlsZSAoIXN0b3BwZWQpIHsKLSAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIHRyeSAoU1NMU29ja2V0IHNvY2tldCA9IChTU0xTb2NrZXQpIHNzb2NrZXQuYWNjZXB0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlcjogY2xpZW50IGNvbm5lY3Rpb24gYWNjZXB0ZWQiKTsKLSAgICAgICAgICAgICAgICB0cnkgKAotICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSkKLSAgICAgICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gYmlzLnJlYWQoYnVmZmVyKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3Mud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyOiByZWNpZXZlZCAiICsgcmVhZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcoQXJyYXlzLmNvcHlPZihidWZmZXIsIHJlYWQpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib3MuZmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RvcHBlZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBzdG9wcGVkID09IHRydWUgbWVhbnMgdGhhdCBzdG9wKCkgbWV0aG9kIHdhcyBjYWxsZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGp1c3QgaWdub3JlIHRoZSBleGNlcHRpb24sIGFuZCBmaW5pc2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyOiBjb3VsZG4ndCBhY2NlcHQgY2xpZW50IGNvbm5lY3Rpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXI6IGZpbmlzaGVkIik7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1JlYWR5KCkgewotICAgICAgICByZXR1cm4gcmVhZHk7Ci0gICAgfQotCi0gICAgdm9pZCBzdG9wKCkgewotICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgcmVhZHkgPSBmYWxzZTsKLQotICAgICAgICAvLyBjbG9zZSB0aGUgc2VydmVyIHNvY2tldCB0byBpbnRlcnVwdCBhY2NlcHQoKSBtZXRob2QKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghc3NvY2tldC5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgc3NvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICBzdG9wKCk7Ci0gICAgfQotCi0gICAgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBzc29ja2V0LmdldExvY2FsUG9ydCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlcyBzZXJ2ZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2lwaGVyU3VpdGVGaWx0ZXIgRmlsdGVyIGZvciBlbmFibGVkIGNpcGhlciBzdWl0ZXMKLSAgICAgKiBAcGFyYW0gc25pTWF0Y2hlclBhdHRlcm4gUGF0dGVybiBmb3IgU05JIHNlcnZlciBoYW1lCi0gICAgICovCi0gICAgc3RhdGljIFNTTEVjaG9TZXJ2ZXIgaW5pdChTdHJpbmcgY2lwaGVyU3VpdGVGaWx0ZXIsCi0gICAgICAgICAgICBTdHJpbmcgc25pUGF0dGVybikgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTU0xDb250ZXh0IGNvbnRleHQgPSBTU0xDb250ZXh0LmdldERlZmF1bHQoKTsKLSAgICAgICAgU1NMU2VydmVyU29ja2V0RmFjdG9yeSBzc2YgPQotICAgICAgICAgICAgICAgIChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBjb250ZXh0LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKTsKLSAgICAgICAgU1NMU2VydmVyU29ja2V0IHNzb2NrZXQgPQotICAgICAgICAgICAgICAgIChTU0xTZXJ2ZXJTb2NrZXQpIHNzZi5jcmVhdGVTZXJ2ZXJTb2NrZXQoMCk7Ci0KLSAgICAgICAgLy8gc3BlY2lmeSBlbmFibGVkIGNpcGhlciBzdWl0ZXMKLSAgICAgICAgaWYgKGNpcGhlclN1aXRlRmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGNpcGhlcnN1aXRlcyA9IFVuYm91bmRTU0xVdGlscy5maWx0ZXJTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgc3NmLmdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpLCBjaXBoZXJTdWl0ZUZpbHRlcik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlcjogZW5hYmxlZCBjaXBoZXIgc3VpdGVzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgQXJyYXlzLnRvU3RyaW5nKGNpcGhlcnN1aXRlcykpOwotICAgICAgICAgICAgc3NvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKGNpcGhlcnN1aXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzcGVjaWZ5IFNOSSBtYXRjaGVyIHBhdHRlcm4KLSAgICAgICAgaWYgKHNuaVBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXI6IHNldCBTTkkgbWF0Y2hlcjogIiArIHNuaVBhdHRlcm4pOwotICAgICAgICAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0gU05JSG9zdE5hbWUuY3JlYXRlU05JTWF0Y2hlcihzbmlQYXR0ZXJuKTsKLSAgICAgICAgICAgIExpc3Q8U05JTWF0Y2hlcj4gbWF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIG1hdGNoZXJzLmFkZChtYXRjaGVyKTsKLSAgICAgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NvY2tldC5nZXRTU0xQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBwYXJhbXMuc2V0U05JTWF0Y2hlcnMobWF0Y2hlcnMpOwotICAgICAgICAgICAgc3NvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFNTTEVjaG9TZXJ2ZXIoc3NvY2tldCk7Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcHJpbmNpcGFsUHJvcGVydHkvUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcHJpbmNpcGFsUHJvcGVydHkvUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyZTFkYS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3ByaW5jaXBhbFByb3BlcnR5L1ByaW5jaXBhbFN5c3RlbVByb3BUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDc1MzAxCi0gKiBAbGlicmFyeSAvc3VuL3NlY3VyaXR5L2tyYjUvYXV0bwotICogQHN1bW1hcnkgTmV3IHRlc3QgZm9yIHN1bi5zZWN1cml0eS5rcmI1LnByaW5jaXBhbCBzeXN0ZW0gcHJvcGVydHkuCi0gKiBUaGUgcHJpbmNpcGFsIGNhbiBzZXQgdXNpbmcgdGhlIHN5c3RlbSBwcm9wZXJ0eSBzdW4uc2VjdXJpdHkua3JiNS5wcmluY2lwYWwuCi0gKiBUaGlzIHByb3BlcnR5IGlzIGNoZWNrZWQgZHVyaW5nIGxvZ2luLiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQsCi0gKiB0aGVuIHRoZSBwcmluY2lwYWwgbmFtZSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGlzIHVzZWQuCi0gKiBAcnVuIG1haW4vb3RoZXJ2bS9qYXZhLnNlY3VyaXR5LnBvbGljeT1wcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdC5wb2xpY3kKLSAqIFByaW5jaXBhbFN5c3RlbVByb3BUZXN0Ci0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnNlY3VyaXR5LmF1dGguY2FsbGJhY2suVGV4dENhbGxiYWNrSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIFByaW5jaXBhbFN5c3RlbVByb3BUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFTUyA9IEJvb2xlYW4uVFJVRTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZBSUwgPSBCb29sZWFuLkZBTFNFOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJRF9QUklOQ0lQQUxfSkFBU19FTlRSWSA9Ci0gICAgICAgICAgICAiVmFsaWRQcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfUFJJTkNJUEFMX0pBQVNfRU5UUlkgPQotICAgICAgICAgICAgIkludmFsaWRQcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1BSSU5DSVBBTF9KQUFTX0VOVFJZID0KLSAgICAgICAgICAgICJOb1ByaW5jaXBhbFN5c3RlbVByb3BUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNRV9QUklOQ0lQQUxfSkFBU19FTlRSWSA9Ci0gICAgICAgICAgICAiU2VsZlByaW5jaXBhbFN5c3RlbVByb3BUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLVEFCX0ZJTEVOQU1FID0gImtyYjUua2V5dGFiLmRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTSA9ICJURVNULlJFQUxNIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TUkMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJVU0VSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVZBSUxBQkxFX1VTRVIgPSAiQVZBSUxBQkxFIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QQVNTV09SRCA9ICJwYXNzd29yZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZTID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfRklMRU5BTUUgPSAia3JiNS5jb25mIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFBU19DT05GX0ZJTEVOQU1FID0gImphYXMuY29uZiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtSQlRHVF9QUklOQ0lQQUwgPSAia3JidGd0LyIgKyBSRUFMTTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUklOQ0lQQUwgPSBVU0VSICsgIkAiICsgUkVBTE07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFWQUlMQUJMRV9VU0VSX1BSSU5DSVBBTCA9Ci0gICAgICAgICAgICBBVkFJTEFCTEVfVVNFUiArICJAIiArIFJFQUxNOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgc2V0dXBUZXN0KCk7Ci0KLSAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0LCBKYWFzIENvbmZpZyBFbnRyeSwgTG9naW4gUHJpbmNpcGFsIEV4cGVjdGVkLAotICAgICAgICAvLyBQcmluY2lwYWwgcGFzc2VkIHRocm91Z2ggU3lzdGVtIHByb3BlcnR5Ci0gICAgICAgIHJ1blRlc3QoUEFTUywgVkFMSURfUFJJTkNJUEFMX0pBQVNfRU5UUlksCi0gICAgICAgICAgICAgICAgVVNFUl9QUklOQ0lQQUwsICJVU0VSQFRFU1QuUkVBTE0iKTsKLSAgICAgICAgcnVuVGVzdChQQVNTLCBWQUxJRF9QUklOQ0lQQUxfSkFBU19FTlRSWSwKLSAgICAgICAgICAgICAgICBBVkFJTEFCTEVfVVNFUl9QUklOQ0lQQUwsICBudWxsKTsKLSAgICAgICAgcnVuVGVzdChQQVNTLCBJTlZBTElEX1BSSU5DSVBBTF9KQUFTX0VOVFJZLAotICAgICAgICAgICAgICAgIFVTRVJfUFJJTkNJUEFMLCAiVVNFUkBURVNULlJFQUxNIik7Ci0gICAgICAgIHJ1blRlc3QoRkFJTCwgSU5WQUxJRF9QUklOQ0lQQUxfSkFBU19FTlRSWSwgbnVsbCwgIG51bGwpOwotICAgICAgICBydW5UZXN0KFBBU1MsIE5PX1BSSU5DSVBBTF9KQUFTX0VOVFJZLAotICAgICAgICAgICAgICAgIFVTRVJfUFJJTkNJUEFMLCAiVVNFUkBURVNULlJFQUxNIik7Ci0gICAgICAgIHJ1blRlc3QoRkFJTCwgTk9fUFJJTkNJUEFMX0pBQVNfRU5UUlksIG51bGwsIG51bGwpOwotICAgICAgICBydW5UZXN0KFBBU1MsIFNBTUVfUFJJTkNJUEFMX0pBQVNfRU5UUlksCi0gICAgICAgICAgICAgICAgVVNFUl9QUklOQ0lQQUwsICJVU0VSQFRFU1QuUkVBTE0iKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBUZXN0KCkgewotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5rcmI1LmNvbmYiLCBLUkI1X0NPTkZfRklMRU5BTUUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciLAotICAgICAgICAgICAgICAgIFRFU1RfU1JDICsgRlMgKyBKQUFTX0NPTkZfRklMRU5BTUUpOwotCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJpbmNpcGFscyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoVVNFUl9QUklOQ0lQQUwsIFVTRVJfUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChBVkFJTEFCTEVfVVNFUl9QUklOQ0lQQUwsIFVTRVJfUEFTU1dPUkQpOwotICAgICAgICBwcmluY2lwYWxzLnB1dChLUkJUR1RfUFJJTkNJUEFMLCBudWxsKTsKLSAgICAgICAgS0RDLnN0YXJ0S0RDKEhPU1QsIEtSQjVfQ09ORl9GSUxFTkFNRSwgUkVBTE0sIHByaW5jaXBhbHMsCi0gICAgICAgICAgICAgICAgS1RBQl9GSUxFTkFNRSwgS0RDLkt0YWJNb2RlLkFQUEVORCk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJ1blRlc3QoYm9vbGVhbiBleHBlY3RlZCwgU3RyaW5nIGphYXNDb25maWdFbnRyeSwKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZExvZ2luVXNlciwgU3RyaW5nIGxvZ2luVXNlckJ5U3lzUHJvcCkgewotCi0gICAgICAgIGlmKGxvZ2luVXNlckJ5U3lzUHJvcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInN1bi5zZWN1cml0eS5rcmI1LnByaW5jaXBhbCIsCi0gICAgICAgICAgICAgICAgICAgIGxvZ2luVXNlckJ5U3lzUHJvcCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgic3VuLnNlY3VyaXR5LmtyYjUucHJpbmNpcGFsIik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTG9naW5Db250ZXh0IGxjID0gbmV3IExvZ2luQ29udGV4dChqYWFzQ29uZmlnRW50cnksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUZXh0Q2FsbGJhY2tIYW5kbGVyKCkpOwotICAgICAgICAgICAgbGMubG9naW4oKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gY29tcGxldGVkIHdpdGggU3ViamVjdCAnJXMnICIsCi0gICAgICAgICAgICAgICAgICAgIGxjLmdldFN1YmplY3QoKSkpOwotCi0gICAgICAgICAgICBpZiAoIWV4cGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBGQUlMRUQgLSBKQUFTIGxvZ2luIHN1Y2Nlc3MgaXNuJ3QgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGV4cGVjdGVkTG9naW5Vc2VyICE9IG51bGwgJiYgIWxjLmdldFN1YmplY3QoKS5nZXRQcmluY2lwYWxzKCkKLSAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpLm1hcChwIC0+IHAuZ2V0TmFtZSgpKS5maWx0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRMb2dpblVzZXIgOjogZXF1YWxzKS5maW5kRmlyc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBGQUlMRUQgLSBMb2dpbiBwcmluY2lwYWwgaXMgbm90IG1hdGNoZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAidG8gZXhwZWN0ZWQgcHJpbmNpcGFsICclcycuIiwgZXhwZWN0ZWRMb2dpblVzZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEIC0gSkFBUyBsb2dpbiBzdWNjZXNzIGlzIGV4cGVjdGVkLiIpOwotICAgICAgICB9IGNhdGNoIChMb2dpbkV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBmYWlsZWQgd2l0aCBleGNlcHRpb246ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgaWUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBGQUlMRUQgLSBKQUFTIGxvZ2luIGZhaWx1cmUgaXNuJ3QgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJURVNUIFBBU1NFRCAtIEpBQVMgbG9naW4gZmFpbHVyZSBpcyBleHBlY3RlZC4iKTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3ByaW5jaXBhbFByb3BlcnR5L2phYXMuY29uZiBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcHJpbmNpcGFsUHJvcGVydHkvamFhcy5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTViNzk0Li4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcHJpbmNpcGFsUHJvcGVydHkvamFhcy5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTm9QcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdCB7Ci0JY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQgCi0JdXNlS2V5VGFiID0gdHJ1ZQotICAJa2V5VGFiID0ga3JiNS5rZXl0YWIuZGF0YQotICAJZG9Ob3RQcm9tcHQgPXRydWUKLSAgCWRlYnVnPXRydWU7Ci19OwotCi1JbnZhbGlkUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QgewotICAJY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQgCi0gIAlwcmluY2lwYWw9IlVOQVZBSUxBQkxFQFRFU1QuUkVBTE0iCi0gIAl1c2VLZXlUYWIgPSB0cnVlCi0gIAlrZXlUYWIgPSBrcmI1LmtleXRhYi5kYXRhCi0gIAlkb05vdFByb21wdCA9dHJ1ZQotICAJZGVidWc9dHJ1ZTsKLX07Ci0KLVZhbGlkUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QgewotICAJY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQgCi0gIAlwcmluY2lwYWw9IkFWQUlMQUJMRUBURVNULlJFQUxNIgotICAJdXNlS2V5VGFiID0gdHJ1ZQotICAJa2V5VGFiID0ga3JiNS5rZXl0YWIuZGF0YQotICAJZG9Ob3RQcm9tcHQgPXRydWUKLSAgCWRlYnVnPXRydWU7Ci19OwotCi1TZWxmUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QgewotICAJY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQgCi0gIAlwcmluY2lwYWw9IlVTRVJAVEVTVC5SRUFMTSIKLSAgCXVzZUtleVRhYiA9IHRydWUKLSAgCWtleVRhYiA9IGtyYjUua2V5dGFiLmRhdGEKLSAgCWRvTm90UHJvbXB0ID10cnVlCi0gIAlkZWJ1Zz10cnVlOwotfTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcHJpbmNpcGFsUHJvcGVydHkvcHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QucG9saWN5IGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9wcmluY2lwYWxQcm9wZXJ0eS9wcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdC5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWVmNDguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9wcmluY2lwYWxQcm9wZXJ0eS9wcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdC5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1ncmFudCB7DQotICAJcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uDQotICAgIAkiY3JlYXRlTG9naW5Db250ZXh0LlZhbGlkUHJpbmNpcGFsU3lzdGVtUHJvcFRlc3QiOw0KLSAgICAJcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uDQotICAgIAkiY3JlYXRlTG9naW5Db250ZXh0LkludmFsaWRQcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdCI7DQotICAgIAlwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24NCi0gICAgCSJjcmVhdGVMb2dpbkNvbnRleHQuTm9QcmluY2lwYWxTeXN0ZW1Qcm9wVGVzdCI7DQotICAgIAlwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24NCi0gICAgCSJjcmVhdGVMb2dpbkNvbnRleHQuU2VsZlByaW5jaXBhbFN5c3RlbVByb3BUZXN0IjsNCi0gIAlwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gImRvQXMiOw0KLSAgCXBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiAibW9kaWZ5UHJpbmNpcGFscyI7DQotICAJcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uICJnZXRTdWJqZWN0IjsNCi0gIAlwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCx3cml0ZSI7DQotICAJcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICIqIiwgInJlYWQsd3JpdGUsZGVsZXRlIjsNCi0gIAlwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsNCi0gIAlwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7DQotICAJcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLioiOw0KLSAgCXBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiKjoqIiwgDQotICAJCSJsaXN0ZW4scmVzb2x2ZSxhY2NlcHQsY29ubmVjdCI7DQotfTsgDQotDQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9yZWZyZXNoS3JiNUNvbmZpZy5qYWFzIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by9yZWZyZXNoS3JiNUNvbmZpZy5qYWFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNiNjBkLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vcmVmcmVzaEtyYjVDb25maWcuamFhcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVJlZnJlc2hhYmxlIHsKLSAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZSByZXF1aXJlZAotICAgICAgICB1c2VUaWNrZXRDYWNoZT1mYWxzZQotICAgICAgICByZWZyZXNoS3JiNUNvbmZpZz10cnVlOwotfTsKLQotTm90UmVmcmVzaGFibGUgewotICAgIGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5tb2R1bGUuS3JiNUxvZ2luTW9kdWxlIHJlcXVpcmVkCi0gICAgICAgIHVzZVRpY2tldENhY2hlPWZhbHNlCi0gICAgICAgIHJlZnJlc2hLcmI1Q29uZmlnPWZhbHNlOwotfTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vdG9vbHMvS2luaXRDb25mUGx1c1Byb3BzLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3Rvb2xzL0tpbml0Q29uZlBsdXNQcm9wcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAyMjRiLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vdG9vbHMvS2luaXRDb25mUGx1c1Byb3BzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuUG9ydFVucmVhY2hhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA2ODU3Nzk1IDgwNzUyOTkKLSAqIEBzdW1tYXJ5IENoZWNrcyBpZiBraW5pdCB1c2VzIGJvdGgga3JiNSBjb25mIGZpbGUgYW5kIHN5c3RlbSBwcm9wZXJ0aWVzCi0gKiBAcmVxdWlyZXMgb3MuZmFtaWx5ID09ICJ3aW5kb3dzIgotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQGxpYnJhcnkgL3N1bi9zZWN1cml0eS9rcmI1L2F1dG8KLSAqIEBydW4gbWFpbi9vdGhlcnZtIEtpbml0Q29uZlBsdXNQcm9wcwotICovCi1wdWJsaWMgY2xhc3MgS2luaXRDb25mUGx1c1Byb3BzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLSU5JVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiYmluIiArIEZpbGUuc2VwYXJhdG9yICsgImtpbml0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0xJU1QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0gICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImJpbiIgKyBGaWxlLnNlcGFyYXRvciArICJrbGlzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNID0gIlJFQUxNIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5PVEhFUl9SRUFMTSA9ICJBTk9USEVSLlJFQUxNIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQ19GSUxFTkFNRSA9ICJrcmI1Y2NfdGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiVEVTVEVSIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9QUklOQ0lQQUwgPSBVU0VSICsgIkAiICsgUkVBTE07Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtSQlRHVF9QUklOQ0lQQUwgPSAia3JidGd0LyIgKyBSRUFMTTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZVEFCX0ZJTEUgPSAidGVzdC5rZXl0YWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLUkI1X0NPTkZfRklMRU5BTUUgPSAia3JiNS5jb25mIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBkZWZpbmUgcHJpbmNpcGFscwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByaW5jaXBhbHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaW5jaXBhbHMucHV0KFVTRVJfUFJJTkNJUEFMLCBudWxsKTsKLSAgICAgICAgcHJpbmNpcGFscy5wdXQoS1JCVEdUX1BSSU5DSVBBTCwgbnVsbCk7Ci0KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUuY29uZiIsIEtSQjVfQ09ORl9GSUxFTkFNRSk7Ci0KLSAgICAgICAgLy8gc3RhcnQgYSBsb2NhbCBLREMgaW5zdGFuY2UKLSAgICAgICAgS0RDIGtkYyA9IEtEQy5zdGFydEtEQyhIT1NULCBudWxsLCBSRUFMTSwgcHJpbmNpcGFscywgS0VZVEFCX0ZJTEUsCi0gICAgICAgICAgICAgICAgS0RDLkt0YWJNb2RlLkFQUEVORCk7Ci0gICAgICAgIEtEQy5zYXZlQ29uZmlnKEtSQjVfQ09ORl9GSUxFTkFNRSwga2RjLAotICAgICAgICAgICAgICAgICJmb3J3YXJkYWJsZSA9IHRydWUiLCAicHJveGlhYmxlID0gdHJ1ZSIpOwotCi0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHRydWU7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICoga2luaXQgc2hvdWxkIGZhaWwgc2luY2UgamF2YS5zZWN1cml0eS5rcmI1LmtkYwotICAgICAgICAgKiBhbmQgamF2YS5zZWN1cml0eS5rcmI1LnJlYWxtIHByb3BlcnRpZXMgb3ZlcnJpZGUgY29ycmVjdCB2YWx1ZXMKLSAgICAgICAgICogaW4ga3JiNSBjb25mIGZpbGUKLSAgICAgICAgICovCi0gICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSB7S0lOSVQsICItayIsCi0gICAgICAgICAgICAiLUotRGphdmEuc2VjdXJpdHkua3JiNS5yZWFsbT0iICsgUkVBTE0sCi0gICAgICAgICAgICAiLUotRGphdmEuc2VjdXJpdHkua3JiNS5rZGM9IiArIEhPU1QsICAgLy8gd2l0aG91dCBwb3J0Ci0gICAgICAgICAgICAiLUotRGphdmEuc2VjdXJpdHkua3JiNS5jb25mPSIgKyBLUkI1X0NPTkZfRklMRU5BTUUsCi0gICAgICAgICAgICAiLXQiLCBLRVlUQUJfRklMRSwKLSAgICAgICAgICAgICItYyIsIENDX0ZJTEVOQU1FLAotICAgICAgICAgICAgVVNFUgotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPdXRwdXRBbmFseXplciBvdXQgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgtMSk7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkQ29udGFpbihQb3J0VW5yZWFjaGFibGVFeGNlcHRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBraW5pdCBzaG91bGQgc3VjY2VlZAotICAgICAgICAgKiBzaW5jZSByZWFsbSBzaG91bGQgYmUgcGlja2VkIHVwIGZyb20gcHJpbmNpcGFsIG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10ge0tJTklULCAiLWsiLAotICAgICAgICAgICAgIi1KLURqYXZhLnNlY3VyaXR5LmtyYjUucmVhbG09IiArIEFOT1RIRVJfUkVBTE0sCi0gICAgICAgICAgICAiLUotRGphdmEuc2VjdXJpdHkua3JiNS5rZGM9IiArIEhPU1QsCi0gICAgICAgICAgICAiLUotRGphdmEuc2VjdXJpdHkua3JiNS5jb25mPSIgKyBLUkI1X0NPTkZfRklMRU5BTUUsCi0gICAgICAgICAgICAiLXQiLCBLRVlUQUJfRklMRSwKLSAgICAgICAgICAgICItYyIsIENDX0ZJTEVOQU1FLAotICAgICAgICAgICAgVVNFUl9QUklOQ0lQQUwKLSAgICAgICAgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3V0cHV0QW5hbHl6ZXIgb3V0ID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgICAgb3V0LnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkQ29udGFpbihDQ19GSUxFTkFNRSk7Ci0gICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VjY2VzcyAmPSBjaGVja1RpY2tldEZsYWdzKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICoga2luaXQgc2hvdWxkIHN1Y2NlZWQKLSAgICAgICAgICogc2luY2UgcmVhbG0gc2hvdWxkIGJlIHBpY2tlZCB1cCBmcm9tIHByaW5jaXBhbCBuYW1lLAotICAgICAgICAgKiBhbmQgb3RoZXIgZGF0YSBzaG91bGQgY29tZSBmcm9tIGtyYjUgY29uZiBmaWxlCi0gICAgICAgICAqLwotICAgICAgICBjb21tYW5kID0gbmV3IFN0cmluZ1tdIHtLSU5JVCwgIi1rIiwKLSAgICAgICAgICAgICItSi1EamF2YS5zZWN1cml0eS5rcmI1LmNvbmY9IiArIEtSQjVfQ09ORl9GSUxFTkFNRSwKLSAgICAgICAgICAgICItdCIsIEtFWVRBQl9GSUxFLAotICAgICAgICAgICAgIi1jIiwgQ0NfRklMRU5BTUUsCi0gICAgICAgICAgICBVU0VSX1BSSU5DSVBBTAotICAgICAgICB9OwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPdXRwdXRBbmFseXplciBvdXQgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLSAgICAgICAgICAgIG91dC5zaG91bGRDb250YWluKENDX0ZJTEVOQU1FKTsKLSAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzdWNjZXNzICY9IGNoZWNrVGlja2V0RmxhZ3MoKTsKLQotICAgICAgICAvLyBraW5pdCBzaG91bGQgc3VjY2VlZCBldmVuIGlmIGEgcHJpbmNpcGFsIG5hbWUgZG9lc24ndCBoYXZlIHJlYWxtCi0gICAgICAgIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10ge0tJTklULCAiLWsiLAotICAgICAgICAgICAgIi1KLURqYXZhLnNlY3VyaXR5LmtyYjUuY29uZj0iICsgS1JCNV9DT05GX0ZJTEVOQU1FLAotICAgICAgICAgICAgIi10IiwgS0VZVEFCX0ZJTEUsCi0gICAgICAgICAgICAiLWMiLCBDQ19GSUxFTkFNRSwKLSAgICAgICAgICAgIFVTRVIKLSAgICAgICAgfTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT3V0cHV0QW5hbHl6ZXIgb3V0ID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotICAgICAgICAgICAgb3V0LnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkQ29udGFpbihDQ19GSUxFTkFNRSk7Ci0gICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VjY2VzcyAmPSBjaGVja1RpY2tldEZsYWdzKCk7Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIHRlc3QgY2FzZSBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgaWYgYSB0aWNrZXQgaGFzIGZvcndhcmRhYmxlIGFuZCBwcm94aWFibGUgZmxhZ3MKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrVGlja2V0RmxhZ3MoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10ge0tMSVNULCAiLWYiLCAiLWMiLCBDQ19GSUxFTkFNRX07Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE91dHB1dEFuYWx5emVyIG91dCA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgIG91dC5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotICAgICAgICAgICAgb3V0LnNob3VsZENvbnRhaW4oIkZPUldBUkRBQkxFIik7Ci0gICAgICAgICAgICBvdXQuc2hvdWxkQ29udGFpbigiUFJPWElBQkxFIik7Ci0gICAgICAgIH0gY2F0Y2goVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5leHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by91bmJvdW5kLnNzbC5qYWFzLmNvbmYgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3VuYm91bmQuc3NsLmphYXMuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlMGE2Ny4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3VuYm91bmQuc3NsLmphYXMuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLWNvbS5zdW4ubmV0LnNzbC5jbGllbnQgewotICAgIGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5tb2R1bGUuS3JiNUxvZ2luTW9kdWxlIHJlcXVpcmVkCi0gICAgcHJpbmNpcGFsPSJVU0VSQFRFU1QuUkVBTE0iCi0gICAgZG9Ob3RQcm9tcHQ9dHJ1ZQotICAgIHVzZUtleVRhYj10cnVlCi0gICAga2V5VGFiPSJrcmI1LmtleXRhYi5kYXRhIjsKLX07Ci0KLXNlcnZlcl9zdGFyIHsKLSAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZSByZXF1aXJlZAotICAgIHByaW5jaXBhbD0iKiIKLSAgICBpc0luaXRpYXRvcj1mYWxzZQotICAgIHVzZUtleVRhYj10cnVlCi0gICAga2V5VGFiPSJrcmI1LmtleXRhYi5kYXRhIgotICAgIHN0b3JlS2V5PXRydWU7Ci19OwotCi1zZXJ2ZXJfbXVsdGlwbGVfcHJpbmNpcGFscyB7Ci0gICAgY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQKLSAgICBwcmluY2lwYWw9Imhvc3Qvc2VydmljZTEubG9jYWxob3N0QFRFU1QuUkVBTE0iCi0gICAgaXNJbml0aWF0b3I9ZmFsc2UKLSAgICB1c2VLZXlUYWI9dHJ1ZQotICAgIGtleVRhYj0ia3JiNS5rZXl0YWIuZGF0YSIKLSAgICBzdG9yZUtleT10cnVlOwotCi0gICAgY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQKLSAgICBwcmluY2lwYWw9Imhvc3Qvc2VydmljZTIubG9jYWxob3N0QFRFU1QuUkVBTE0iCi0gICAgaXNJbml0aWF0b3I9ZmFsc2UKLSAgICB1c2VLZXlUYWI9dHJ1ZQotICAgIGtleVRhYj0ia3JiNS5rZXl0YWIuZGF0YSIKLSAgICBzdG9yZUtleT10cnVlOwotCi0gICAgY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQKLSAgICBwcmluY2lwYWw9Imhvc3Qvc2VydmljZTMubG9jYWxob3N0QFRFU1QuUkVBTE0iCi0gICAgaXNJbml0aWF0b3I9ZmFsc2UKLSAgICB1c2VLZXlUYWI9dHJ1ZQotICAgIGtleVRhYj0ia3JiNS5rZXl0YWIuZGF0YSIKLSAgICBzdG9yZUtleT10cnVlOwotfTsKLQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvYXV0by91bmJvdW5kLnNzbC5wb2xpY3kgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3VuYm91bmQuc3NsLnBvbGljeQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmODM5Yy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9hdXRvL3VuYm91bmQuc3NsLnBvbGljeQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLWdyYW50IHsKLSAgICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCx3cml0ZSI7Ci0gICAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqOioiLCAibGlzdGVuLHJlc29sdmUsYWNjZXB0LGNvbm5lY3QiOwotICAgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiKiIsICJyZWFkLHdyaXRlLGRlbGV0ZSI7Ci0gICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7Ci0gICAgcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOwotICAgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS4qIjsKLSAgICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gImRvQXMiOwotICAgIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbiAiZ2V0U3ViamVjdCI7Ci0gICAgcGVybWlzc2lvbiBqYXZheC5zZWN1cml0eS5hdXRoLkF1dGhQZXJtaXNzaW9uCi0gICAgICAgICAgICAgICAgICAgICJjcmVhdGVMb2dpbkNvbnRleHQuc2VydmVyX3N0YXIiOwotICAgIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5BdXRoUGVybWlzc2lvbgotICAgICAgICAgICAgICAgICAgICAiY3JlYXRlTG9naW5Db250ZXh0LnNlcnZlcl9tdWx0aXBsZV9wcmluY2lwYWxzIjsKLSAgICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGguQXV0aFBlcm1pc3Npb24gIm1vZGlmeVByaW5jaXBhbHMiOwotICAgIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24gImphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuS2V5VGFiIGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsIFwia3JiNS5rZXl0YWIuZGF0YVwiIiwgInJlYWQiOwotCi0gICAgLy8gY2xpZW50cyBoYXZlIGEgcGVybWlzc2lvbiB0byB1c2UgYWxsIHNlcnZpY2UgcHJpbmNpcGFscwotICAgIHBlcm1pc3Npb24gamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5TZXJ2aWNlUGVybWlzc2lvbiAiKiIsICJpbml0aWF0ZSI7Ci0KLSAgICAvLyBzZXJ2ZXIgaGFzIGEgc2VydmljZSBwZXJtaXNzaW9uCi0gICAgLy8gdG8gYWNjZXB0IG9ubHkgc2VydmljZTEgYW5kIHNlcnZpY2UzIHByaW5jaXBhbHMKLSAgICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuU2VydmljZVBlcm1pc3Npb24KLSAgICAgICAgICAgICAgICAgICAgImhvc3Qvc2VydmljZTEubG9jYWxob3N0QFRFU1QuUkVBTE0iLCAiYWNjZXB0IjsKLSAgICBwZXJtaXNzaW9uIGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuU2VydmljZVBlcm1pc3Npb24KLSAgICAgICAgICAgICAgICAgICAgImhvc3Qvc2VydmljZTMubG9jYWxob3N0QFRFU1QuUkVBTE0iLCAiYWNjZXB0IjsKLQotICAgIC8vIHBlcm1pc3Npb24gdG8gdXNlIFN1bkpDRSBwcm92aWRlcgotICAgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5TZWN1cml0eVBlcm1pc3Npb24gInB1dFByb3ZpZGVyUHJvcGVydHkuU3VuSkNFIjsKLX07CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9jYW5vbmljYWxpemUvVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY2Fub25pY2FsaXplL1Rlc3QuamF2YQppbmRleCAzYmQwYmFjLi45MzQwMTYzIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9jYW5vbmljYWxpemUvVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2Nhbm9uaWNhbGl6ZS9UZXN0LmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKICAqLwogLyoKICAqIEB0ZXN0Ci0gKiBAYnVnIDY2ODI1MTYgODE0OTUyMQorICogQGJ1ZyA2NjgyNTE2CiAgKiBAc3VtbWFyeSBTUE5FR09fSFRUUF9BVVRIL1dXV19LUkIgYW5kIFNQTkVHT19IVFRQX0FVVEgvV1dXX1NQTkVHTyBmYWlsZWQgb24gYWxsIG5vbi13aW5kb3dzIHBsYXRmb3JtcwogICogQHJ1biBtYWluL290aGVydm0gLURzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5wcm92aWRlci4xPW5zLG1vY2sgLURqYXZhLnNlY3VyaXR5LmtyYjUuY29uZj1rcmI1LmNvbmYgVGVzdAogICovCkBAIC00MywxMSArNDMsOSBAQAogICAgICAgICBjaGVjaygiYzEiLCAiYzEudGhpcy5kb21haW4iKTsKICAgICAgICAgY2hlY2soImMxLnRoaXMiLCAiYzEudGhpcy5kb21haW4iKTsKICAgICAgICAgY2hlY2soImMxLnRoaXMuZG9tYWluIiwgImMxLnRoaXMuZG9tYWluIik7Ci0gICAgICAgIGNoZWNrKCJjMS50aGlzLmRvbWFpbi4iLCAiYzEudGhpcy5kb21haW4iKTsKIAogICAgICAgICAvLyBjYW5vbmljYWxpemVkIG5hbWUgZ29lcyBJUCwgcmVqZWN0CiAgICAgICAgIGNoZWNrKCJjMiIsICJjMiIpOwotICAgICAgICBjaGVjaygiYzIuIiwgImMyIik7CiAKICAgICAgICAgLy8gY2Fub25pY2FsaXplZCBuYW1lIGdvZXMgc3RyYW5nZSwgcmVqZWN0CiAgICAgICAgIGNoZWNrKCJjMyIsICJjMyIpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY29uZmlnL1NlbWljb2xvbi5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY29uZmlnL1NlbWljb2xvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM5MjBjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2NvbmZpZy9TZW1pY29sb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODE2MDUxOAotICogQHN1bW1hcnkgU2VtaWNvbG9uIGlzIG5vdCByZWNvZ25pemVkIGFzIGNvbW1lbnQgc3RhcnRpbmcgY2hhcmFjdGVyCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBTZW1pY29sb24KLSAqLwotCi1pbXBvcnQgc3VuLnNlY3VyaXR5LmtyYjUuQ29uZmlnOwotCi1wdWJsaWMgY2xhc3MgU2VtaWNvbG9uIHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmtyYjUuY29uZiIsCi0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiL2NvbW1lbnRzLmNvbmYiKTsKLSAgICAgICAgQ29uZmlnIGNvbmZpZyA9IENvbmZpZy5nZXRJbnN0YW5jZSgpOwotICAgICAgICBjb25maWcuZ2V0KCJzZWN0aW9uIiwgInZhbHVlIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY29uZmlnL2NvbW1lbnRzLmNvbmYgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9jb25maWcvY29tbWVudHMuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NzlkZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9jb25maWcvY29tbWVudHMuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVtzZWN0aW9uXQotCi0jICAgICAgICAgICBjb21tZW50Ci0gIyAgICAgICAgICBjb21tZW50Ci0JICMgIGNvbW1lbnQKLSAJIyAgIGNvbW1lbnQKLTsgICAgICAgICAgIGNvbW1lbnQKLSA7ICAgICAgICAgIGNvbW1lbnQKLQkgOyAgY29tbWVudAotIAk7ICAgY29tbWVudAotCi12YWx1ZSA9IHRydWUKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9tc2NhcGkvU2hvcnRSU0FLZXlXaXRoaW5UTFMuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9tc2NhcGkvU2hvcnRSU0FLZXlXaXRoaW5UTFMuamF2YQppbmRleCA0YTY2YWJiLi5mMmE3NTI1IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvbXNjYXBpL1Nob3J0UlNBS2V5V2l0aGluVExTLmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L21zY2FwaS9TaG9ydFJTQUtleVdpdGhpblRMUy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTAgKzIyLDcgQEAKICAqLwogCiBpbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwogaW1wb3J0IGphdmF4Lm5ldC4qOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKIApAQCAtNzQsMzQgKzcxLDIyIEBACiAgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBsb2FkIHRoZSBrZXkgc3RvcmUKLSAgICAgICAgc2VydmVyS1MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiV2luZG93cy1NWSIsICJTdW5NU0NBUEkiKTsKLSAgICAgICAgc2VydmVyS1MubG9hZChudWxsLCBudWxsKTsKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiV2luZG93cy1NWSIsICJTdW5NU0NBUEkiKTsKKyAgICAgICAga3MubG9hZChudWxsLCBudWxsKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQga2V5c3RvcmU6IFdpbmRvd3MtTVkiKTsKIAogICAgICAgICAvLyBjaGVjayBrZXkgc2l6ZQotICAgICAgICBjaGVja0tleVNpemUoc2VydmVyS1MpOworICAgICAgICBjaGVja0tleVNpemUoa3MpOwogCiAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIFNTTENvbnRleHQKICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoIlN1blg1MDkiKTsKLSAgICAgICAga21mLmluaXQoc2VydmVyS1MsIG51bGwpOworICAgICAgICBrbWYuaW5pdChrcywgbnVsbCk7CiAKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCJTdW5YNTA5Iik7Ci0gICAgICAgIHRtZi5pbml0KHNlcnZlcktTKTsKLSAgICAgICAgVHJ1c3RNYW5hZ2VyW10gdG1zID0gdG1mLmdldFRydXN0TWFuYWdlcnMoKTsKLSAgICAgICAgaWYgKHRtcyA9PSBudWxsIHx8IHRtcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCB0cnVzdCBtYW5hZ2VyIGltcGxlbWVudGF0aW9uIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoISh0bXNbMF0gaW5zdGFuY2VvZiBYNTA5VHJ1c3RNYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgdHJ1c3QgbWFuYWdlciIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIiBpbXBsZW1lbnRhdGlvbjogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICB0bXNbMF0uZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNlcnZlclRNID0gbmV3IE15RXh0ZW5kZWRYNTA5VE0oKFg1MDlUcnVzdE1hbmFnZXIpdG1zWzBdKTsKLSAgICAgICAgdG1zID0gbmV3IFRydXN0TWFuYWdlcltdIHtzZXJ2ZXJUTX07CisgICAgICAgIHRtZi5pbml0KGtzKTsKIAogICAgICAgICBTU0xDb250ZXh0IGN0eCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2UoIlRMUyIpOwotICAgICAgICBjdHguaW5pdChrbWYuZ2V0S2V5TWFuYWdlcnMoKSwgdG1zLCBudWxsKTsKKyAgICAgICAgY3R4LmluaXQoa21mLmdldEtleU1hbmFnZXJzKCksIHRtZi5nZXRUcnVzdE1hbmFnZXJzKCksIG51bGwpOwogCiAgICAgICAgIFNlcnZlclNvY2tldEZhY3Rvcnkgc3NmID0gY3R4LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKTsKICAgICAgICAgU1NMU2VydmVyU29ja2V0IHNzbFNlcnZlclNvY2tldCA9IChTU0xTZXJ2ZXJTb2NrZXQpCkBAIC0yNDMsOCArMjI4LDYgQEAKIAogICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOwogICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOwotICAgIEtleVN0b3JlIHNlcnZlcktTOwotICAgIE15RXh0ZW5kZWRYNTA5VE0gc2VydmVyVE07CiAKICAgICAvKgogICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgpAQCAtMzY1LDYwICszNDgsNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0KLSAgICBjbGFzcyBNeUV4dGVuZGVkWDUwOVRNIGV4dGVuZHMgWDUwOUV4dGVuZGVkVHJ1c3RNYW5hZ2VyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFg1MDlUcnVzdE1hbmFnZXIgewotCi0gICAgICAgIFg1MDlUcnVzdE1hbmFnZXIgdG07Ci0KLSAgICAgICAgTXlFeHRlbmRlZFg1MDlUTShYNTA5VHJ1c3RNYW5hZ2VyIHRtKSB7Ci0gICAgICAgICAgICB0aGlzLnRtID0gdG07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0NsaWVudFRydXN0ZWQoWDUwOUNlcnRpZmljYXRlIGNoYWluW10sIFN0cmluZyBhdXRoVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgdG0uY2hlY2tDbGllbnRUcnVzdGVkKGNoYWluLCBhdXRoVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoWDUwOUNlcnRpZmljYXRlIGNoYWluW10sIFN0cmluZyBhdXRoVHlwZSkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgdG0uY2hlY2tTZXJ2ZXJUcnVzdGVkKGNoYWluLCBhdXRoVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlW10gZ2V0QWNjZXB0ZWRJc3N1ZXJzKCkgewotICAgICAgICAgICAgTGlzdDxYNTA5Q2VydGlmaWNhdGU+IGNlcnRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZvciAoWDUwOUNlcnRpZmljYXRlIGMgOiB0bS5nZXRBY2NlcHRlZElzc3VlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyS1MuZ2V0Q2VydGlmaWNhdGVBbGlhcyhjKS5lcXVhbHMoa2V5QWxpYXMpKQotICAgICAgICAgICAgICAgICAgICAgICAgY2VydHMuYWRkKGMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGtzZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGtzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2VydHMudG9BcnJheShuZXcgWDUwOUNlcnRpZmljYXRlW2NlcnRzLnNpemUoKV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUsCi0gICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRtLmNoZWNrQ2xpZW50VHJ1c3RlZChjaGFpbiwgYXV0aFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTZXJ2ZXJUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUsCi0gICAgICAgICAgICAgICAgU29ja2V0IHNvY2tldCkgdGhyb3dzIENlcnRpZmljYXRlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRtLmNoZWNrU2VydmVyVHJ1c3RlZChjaGFpbiwgYXV0aFR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tDbGllbnRUcnVzdGVkKFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluLCBTdHJpbmcgYXV0aFR5cGUsCi0gICAgICAgICAgICBTU0xFbmdpbmUgZW5naW5lKSB0aHJvd3MgQ2VydGlmaWNhdGVFeGNlcHRpb24gewotICAgICAgICAgICAgdG0uY2hlY2tDbGllbnRUcnVzdGVkKGNoYWluLCBhdXRoVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1NlcnZlclRydXN0ZWQoWDUwOUNlcnRpZmljYXRlW10gY2hhaW4sIFN0cmluZyBhdXRoVHlwZSwKLSAgICAgICAgICAgIFNTTEVuZ2luZSBlbmdpbmUpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0bS5jaGVja1NlcnZlclRydXN0ZWQoY2hhaW4sIGF1dGhUeXBlKTsKLSAgICAgICAgfQotICAgIH0KLQogfQogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1BLQ1MxMVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvUEtDUzExVGVzdC5qYXZhCmluZGV4IDkxNTVjODMuLmM4YTE0N2EgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvUEtDUzExVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvUEtDUzExVGVzdC5qYXZhCkBAIC0zNCw4ICszNCw2IEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQS0NTMTFUZXN0IHsKIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtDUzExID0gIlBLQ1MxMSI7Ci0KICAgICAvLyBkaXJlY3Rvcnkgb2YgdGhlIHRlc3Qgc291cmNlCiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIik7CiAKQEAgLTU3MCwxNCArNTY4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXRpYyBieXRlW10gZ2VuZXJhdGVEYXRhKGludCBsZW5ndGgpIHsKLSAgICAgICAgYnl0ZSBkYXRhW10gPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZGF0YVtpXSA9IChieXRlKSAoaSAlIDI1Nik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCiAgICAgPFQ+IFRbXSBjb25jYXQoVFtdIGEsIFRbXSBiKSB7CiAgICAgICAgIGlmICgoYiA9PSBudWxsKSB8fCAoYi5sZW5ndGggPT0gMCkpIHsKICAgICAgICAgICAgIHJldHVybiBhOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvQWRkUHJpdmF0ZUtleS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvQWRkUHJpdmF0ZUtleS5qYXZhCmluZGV4IDU2ODMzYmQuLmM5OWM0OTggMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0FkZFByaXZhdGVLZXkuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9BZGRQcml2YXRlS2V5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MiwxMyArNDIsNiBAQAogLy8gYWxsIHByb3ZpZGVycy4KIHB1YmxpYyBjbGFzcyBBZGRQcml2YXRlS2V5IGV4dGVuZHMgU2VjbW9kVGVzdCB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVMxID0gImVudHJ5MSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTMiA9ICJlbnRyeTIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBUzMgPSAiZW50cnkzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xJTkUgPSA4NTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQV9MRU5HVEggPSA0MDk2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBEQVRBID0gZ2VuZXJhdGVEYXRhKERBVEFfTEVOR1RIKTsKLQogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBpZiAoaW5pdFNlY21vZCgpID09IGZhbHNlKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02Myw3ICs1Niw3IEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgICAgICBTZWN1cml0eS5hZGRQcm92aWRlcihwKTsKIAotICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKFBLQ1MxMSwgcCk7CisgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIlBLQ1MxMSIsIHApOwogICAgICAgICBrcy5sb2FkKG51bGwsIHBhc3N3b3JkKTsKICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBhbGlhc2VzKGtzKSkgewogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWxldGluZzogIiArIGFsaWFzKTsKQEAgLTcxLDI4ICs2NCwyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgS2V5U3RvcmUgamtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkpLUyIpOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShCQVNFICsgU0VQICsgImtleXN0b3JlLmprcyIpKSB7Ci0gICAgICAgICAgICBjaGFyW10gamtzcGFzcyA9ICJwYXNzcGhyYXNlIi50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgamtzLmxvYWQoaW4sIGprc3Bhc3MpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBDb2xsZWN0aW9ucy5saXN0KGprcy5hbGlhc2VzKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGprcy5lbnRyeUluc3RhbmNlT2YoYWxpYXMsIFByaXZhdGVLZXlFbnRyeS5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZUtleUVudHJ5IGVudHJ5ID0gKFByaXZhdGVLZXlFbnRyeSlqa3MuZ2V0RW50cnkoYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhc3N3b3JkUHJvdGVjdGlvbihqa3NwYXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbGdvcml0aG0gPSBlbnRyeS5nZXRQcml2YXRlS2V5KCkuZ2V0QWxnb3JpdGhtKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCItRW50cnkgJXMgKCVzKSVuIiwgYWxpYXMsIGFsZ29yaXRobSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3VwcG9ydHNFQyA9PSBmYWxzZSkgJiYgYWxnb3JpdGhtLmVxdWFscygiRUMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFQyBub3Qgc3VwcG9ydGVkIGJ5IHByb3ZpZGVyLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNraXBwaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKHN1cHBvcnRzRUMgPT0gZmFsc2UpICYmIGFsZ29yaXRobS5lcXVhbHMoIkRTQSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb3ZpZGVyIGRvZXMgbm90IGFwcGVhciB0byBoYXZlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0tBX05FVFNDQVBFX0RCIGZpeCwgc2tpcHBpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRlc3QocCwgZW50cnkpOwotICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBpZ25vcmUKLSAgICAgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKEJBU0UsICJrZXlzdG9yZS5qa3MiKSk7CisgICAgICAgIGNoYXJbXSBqa3NwYXNzID0gInBhc3NwaHJhc2UiLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGprcy5sb2FkKGluLCBqa3NwYXNzKTsKKyAgICAgICAgTGlzdDxQcml2YXRlS2V5RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PFByaXZhdGVLZXlFbnRyeT4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBDb2xsZWN0aW9ucy5saXN0KGprcy5hbGlhc2VzKCkpKSB7CisgICAgICAgICAgICBpZiAoamtzLmVudHJ5SW5zdGFuY2VPZihhbGlhcywgUHJpdmF0ZUtleUVudHJ5LmNsYXNzKSkgeworICAgICAgICAgICAgICAgIFByaXZhdGVLZXlFbnRyeSBlbnRyeSA9IChQcml2YXRlS2V5RW50cnkpamtzLmdldEVudHJ5KGFsaWFzLCBuZXcgUGFzc3dvcmRQcm90ZWN0aW9uKGprc3Bhc3MpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gZW50cnkuZ2V0UHJpdmF0ZUtleSgpLmdldEFsZ29yaXRobSgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLUVudHJ5ICIgKyBhbGlhcyArICIgKCIgKyBhbGdvcml0aG0gKyAiKSIpOworICAgICAgICAgICAgICAgIGlmICgoc3VwcG9ydHNFQyA9PSBmYWxzZSkgJiYgYWxnb3JpdGhtLmVxdWFscygiRUMiKSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVDIG5vdCBzdXBwb3J0ZWQgYnkgcHJvdmlkZXIsIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHN1cHBvcnRzRUMgPT0gZmFsc2UpICYmIGFsZ29yaXRobS5lcXVhbHMoIkRTQSIpKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvdmlkZXIgZG9lcyBub3QgYXBwZWFyIHRvIGhhdmUgQ0tBX05FVFNDQVBFX0RCIGZpeCwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlc3QocCwgZW50cnkpOworICAgICAgICAgICAgfSAvLyBlbHNlIGlnbm9yZQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT0siKTsKICAgICB9CkBAIC0xMDEsNiArOTEsMTAgQEAKICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmxpc3Qoa3MuYWxpYXNlcygpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUxJQVMxID0gImVudHJ5MSI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFMSUFTMiA9ICJlbnRyeTIiOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBTElBUzMgPSAiZW50cnkzIjsKKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdChQcm92aWRlciBwLCBQcml2YXRlS2V5RW50cnkgZW50cnkpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcml2YXRlS2V5IGtleSA9IGVudHJ5LmdldFByaXZhdGVLZXkoKTsKICAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gY2hhaW4gPSAoWDUwOUNlcnRpZmljYXRlW10pZW50cnkuZ2V0Q2VydGlmaWNhdGVDaGFpbigpOwpAQCAtMTI3LDggKzEyMSwxMSBAQAogCiAgICAgICAgIFByaXZhdGVLZXkga2V5MiA9IChQcml2YXRlS2V5KWtzLmdldEtleShBTElBUzEsIG51bGwpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcoa2V5MikpOwotICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbjIgPQotICAgICAgICAgICAgICAgIChYNTA5Q2VydGlmaWNhdGVbXSkga3MuZ2V0Q2VydGlmaWNhdGVDaGFpbihBTElBUzEpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbjIgPSAoWDUwOUNlcnRpZmljYXRlW10pa3MuZ2V0Q2VydGlmaWNhdGVDaGFpbihBTElBUzEpOworICAgICAgICAvLyBOU1MgbWFrZXMgdG9rZW4ga2V5cyBhbHdheXMgc2Vuc2l0aXZlLCBza2lwIHRoaXMgY2hlY2sKKy8vICAgICAgaWYgKGtleS5lcXVhbHMoa2V5MikgPT0gZmFsc2UpIHsKKy8vICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImtleSBtaXNtYXRjaCIpOworLy8gICAgICB9CiAgICAgICAgIGlmIChBcnJheXMuZXF1YWxzKGNoYWluLCBjaGFpbjIpID09IGZhbHNlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJjaGFpbiBtaXNtYXRjaCIpOwogICAgICAgICB9CkBAIC0xNTYsOCArMTUzLDcgQEAKIAogICAgICAgICBQcml2YXRlS2V5IGtleTQgPSAoUHJpdmF0ZUtleSlrcy5nZXRLZXkoQUxJQVMyLCBudWxsKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRvU3RyaW5nKGtleTQpKTsKLSAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gY2hhaW40ID0gKFg1MDlDZXJ0aWZpY2F0ZVtdKQotICAgICAgICAgICAgICAgIGtzLmdldENlcnRpZmljYXRlQ2hhaW4oQUxJQVMyKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gY2hhaW40ID0gKFg1MDlDZXJ0aWZpY2F0ZVtdKWtzLmdldENlcnRpZmljYXRlQ2hhaW4oQUxJQVMyKTsKICAgICAgICAgaWYgKEFycmF5cy5lcXVhbHMoY2hhaW4sIGNoYWluNCkgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImNoYWluIG1pc21hdGNoIik7CiAgICAgICAgIH0KQEAgLTE3NSw4ICsxNzEsNyBAQAogCiAgICAgICAgIFByaXZhdGVLZXkga2V5NSA9IChQcml2YXRlS2V5KWtzLmdldEtleShBTElBUzMsIG51bGwpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcoa2V5NSkpOwotICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbjUgPSAoWDUwOUNlcnRpZmljYXRlW10pCi0gICAgICAgICAgICAgICAga3MuZ2V0Q2VydGlmaWNhdGVDaGFpbihBTElBUzMpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbjUgPSAoWDUwOUNlcnRpZmljYXRlW10pa3MuZ2V0Q2VydGlmaWNhdGVDaGFpbihBTElBUzMpOwogICAgICAgICBpZiAoQXJyYXlzLmVxdWFscyhjaGFpbiwgY2hhaW41KSA9PSBmYWxzZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY2hhaW4gbWlzbWF0Y2giKTsKICAgICAgICAgfQpAQCAtMTkwLDIyICsxODUsMjQgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPSyIpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2lnbihQcm92aWRlciBwLCBQcml2YXRlS2V5IHByaXZhdGVLZXksCi0gICAgICAgICAgICBQdWJsaWNLZXkgcHVibGljS2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gREFUQSA9IG5ldyBieXRlWzQwOTZdOworCisgICAgc3RhdGljIHsKKyAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhEQVRBKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNpZ24oUHJvdmlkZXIgcCwgUHJpdmF0ZUtleSBwcml2YXRlS2V5LCBQdWJsaWNLZXkgcHVibGljS2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGtleUFsZyA9IHByaXZhdGVLZXkuZ2V0QWxnb3JpdGhtKCk7CiAgICAgICAgIFN0cmluZyBhbGc7Ci0gICAgICAgIHN3aXRjaCAoa2V5QWxnKSB7Ci0gICAgICAgICAgICBjYXNlICJSU0EiOgotICAgICAgICAgICAgICAgIGFsZyA9ICJTSEExd2l0aFJTQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICJEU0EiOgotICAgICAgICAgICAgICAgIGFsZyA9ICJTSEExd2l0aERTQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICJFQyI6Ci0gICAgICAgICAgICAgICAgYWxnID0gIlNIQTF3aXRoRUNEU0EiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIGFsZ29yaXRobSAiICsga2V5QWxnKTsKKyAgICAgICAgaWYgKGtleUFsZy5lcXVhbHMoIlJTQSIpKSB7CisgICAgICAgICAgICBhbGcgPSAiU0hBMXdpdGhSU0EiOworICAgICAgICB9IGVsc2UgaWYgKGtleUFsZy5lcXVhbHMoIkRTQSIpKSB7CisgICAgICAgICAgICBhbGcgPSAiU0hBMXdpdGhEU0EiOworICAgICAgICB9IGVsc2UgaWYgKGtleUFsZy5lcXVhbHMoIkVDIikpIHsKKyAgICAgICAgICAgIGFsZyA9ICJTSEExd2l0aEVDRFNBIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gYWxnb3JpdGhtICIgKyBrZXlBbGcpOwogICAgICAgICB9CiAgICAgICAgIFNpZ25hdHVyZSBzID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKGFsZywgcCk7CiAgICAgICAgIHMuaW5pdFNpZ24ocHJpdmF0ZUtleSk7CkBAIC0yMTksNiArMjE2LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfTElORSA9IDg1OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvKSB7CiAgICAgICAgIFN0cmluZyBzID0gU3RyaW5nLnZhbHVlT2Yobykuc3BsaXQoIlxuIilbMF07CiAgICAgICAgIHJldHVybiAocy5sZW5ndGgoKSA8PSBNQVhfTElORSkgPyBzIDogcy5zdWJzdHJpbmcoMCwgTUFYX0xJTkUpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvQWRkVHJ1c3RlZENlcnQuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0FkZFRydXN0ZWRDZXJ0LmphdmEKaW5kZXggNmIyYjU0NS4uMWIzZmY4MSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvQWRkVHJ1c3RlZENlcnQuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9BZGRUcnVzdGVkQ2VydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDQsNDcgKzQ0LDI5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oQkFTRSArIFNFUCArICJhbmNob3IuY2VyIikpIHsKLSAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOwotICAgICAgICAgICAgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpZmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKGluKTsKLSAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oQkFTRSArIFNFUCArICJhbmNob3IuY2VyIik7CisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBmYWN0b3J5ID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IChYNTA5Q2VydGlmaWNhdGUpZmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKGluKTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKy8vICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNlcnQpOwogCiAgICAgICAgIFN0cmluZyBjb25maWdOYW1lID0gQkFTRSArIFNFUCArICJuc3MuY2ZnIjsKICAgICAgICAgUHJvdmlkZXIgcCA9IGdldFN1blBLQ1MxMShjb25maWdOYW1lKTsKIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocCk7CiAgICAgICAgIFNlY3VyaXR5LmFkZFByb3ZpZGVyKHApOwotICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKFBLQ1MxMSwgcCk7CisgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIlBLQ1MxMSIsIHApOwogICAgICAgICBrcy5sb2FkKG51bGwsIHBhc3N3b3JkKTsKLSAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGFsaWFzZXMgPSBuZXcgVHJlZVNldDw+KENvbGxlY3Rpb25zLmxpc3QoCi0gICAgICAgICAgICAgICAga3MuYWxpYXNlcygpKSk7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBhbGlhc2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihDb2xsZWN0aW9ucy5saXN0KGtzLmFsaWFzZXMoKSkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudHJpZXM6ICIgKyBhbGlhc2VzLnNpemUoKSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbGlhc2VzKTsKICAgICAgICAgaW50IHNpemUxID0gYWxpYXNlcy5zaXplKCk7CiAKICAgICAgICAgU3RyaW5nIGFsaWFzID0gImFuY2hvciI7Ci0gICAgICAgIGlmIChrcy5jb250YWluc0FsaWFzKGFsaWFzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQWxpYXMgZXhpc3RzOiAiICsgYWxpYXMpOwotICAgICAgICB9Ci0KICAgICAgICAga3Muc2V0Q2VydGlmaWNhdGVFbnRyeShhbGlhcywgY2VydCk7Ci0gICAgICAgIEtleVN0b3JlLkVudHJ5IGZpcnN0ID0ga3MuZ2V0RW50cnkoYWxpYXMsIG51bGwpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpcnN0IGVudHJ5ID0gIiArIGZpcnN0KTsKLSAgICAgICAgaWYgKCFrcy5lbnRyeUluc3RhbmNlT2YoYWxpYXMsIFRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5LmNsYXNzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5leHBlY3RlZCBmaXJzdCBlbnRyeSB0eXBlOiAiICsgZmlyc3QpOwotICAgICAgICB9Ci0KICAgICAgICAga3Muc2V0Q2VydGlmaWNhdGVFbnRyeShhbGlhcywgY2VydCk7Ci0gICAgICAgIEtleVN0b3JlLkVudHJ5IHNlY29uZCA9IGtzLmdldEVudHJ5KGFsaWFzLCBudWxsKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZWNvbmQgZW50cnkgPSAiICsgc2Vjb25kKTsKLSAgICAgICAgaWYgKCFrcy5lbnRyeUluc3RhbmNlT2YoYWxpYXMsIFRydXN0ZWRDZXJ0aWZpY2F0ZUVudHJ5LmNsYXNzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzZWNvbmQgZW50cnkgdHlwZTogIgotICAgICAgICAgICAgICAgICAgICArIHNlY29uZCk7Ci0gICAgICAgIH0KIAotICAgICAgICBhbGlhc2VzID0gbmV3IFRyZWVTZXQ8PihDb2xsZWN0aW9ucy5saXN0KGtzLmFsaWFzZXMoKSkpOworICAgICAgICBhbGlhc2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihDb2xsZWN0aW9ucy5saXN0KGtzLmFsaWFzZXMoKSkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudHJpZXM6ICIgKyBhbGlhc2VzLnNpemUoKSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbGlhc2VzKTsKICAgICAgICAgaW50IHNpemUyID0gYWxpYXNlcy5zaXplKCk7CkBAIC05NywxMiArNzksOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiS2V5U3RvcmUgcmV0dXJuZWQgaW5jb3JyZWN0IGNlcnRpZmljYXRlIik7CiAgICAgICAgIH0KIAotICAgICAgICBrcy5kZWxldGVFbnRyeShhbGlhcyk7Ci0gICAgICAgIGlmIChrcy5jb250YWluc0FsaWFzKGFsaWFzKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQWxpYXMgc3RpbGwgZXhpc3RzOiAiICsgYWxpYXMpOwotICAgICAgICB9Ci0KICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPSyIpOworCiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9DcnlwdG8uamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0NyeXB0by5qYXZhCmluZGV4IDczNTE0OWYuLmM0NGFiODcgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0NyeXB0by5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0NyeXB0by5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsNiArMzAsOCBAQAogICogQHJ1biBtYWluL290aGVydm0gQ3J5cHRvCiAgKi8KIAoraW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgamF2YS5zZWN1cml0eS4qOwogCiBwdWJsaWMgY2xhc3MgQ3J5cHRvIGV4dGVuZHMgU2VjbW9kVGVzdCB7CkBAIC00OCw3ICs1MCw5IEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihrcC5nZXRQdWJsaWMoKSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihrcC5nZXRQcml2YXRlKCkpOwogCi0gICAgICAgIGJ5dGVbXSBkYXRhID0gZ2VuZXJhdGVEYXRhKDIwNDgpOworICAgICAgICBTZWN1cmVSYW5kb20gcmFuZG9tID0gbmV3IFNlY3VyZVJhbmRvbSgpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzIwNDhdOworICAgICAgICByYW5kb20ubmV4dEJ5dGVzKGRhdGEpOwogCiAgICAgICAgIFNpZ25hdHVyZSBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoIlNIQTF3aXRoUlNBIiwgcCk7CiAgICAgICAgIHNpZy5pbml0U2lnbihrcC5nZXRQcml2YXRlKCkpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvR2V0UHJpdmF0ZUtleS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvR2V0UHJpdmF0ZUtleS5qYXZhCmluZGV4IGJlYjA3YjYuLmE0MWJlZjkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTEvU2VjbW9kL0dldFByaXZhdGVLZXkuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9HZXRQcml2YXRlS2V5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00OCwxNyArNDgsMTggQEAKIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocCk7CiAgICAgICAgIFNlY3VyaXR5LmFkZFByb3ZpZGVyKHApOwotICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKFBLQ1MxMSwgcCk7CisgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIlBLQ1MxMSIsIHApOwogICAgICAgICBrcy5sb2FkKG51bGwsIHBhc3N3b3JkKTsKLSAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGFsaWFzZXMgPSBuZXcgVHJlZVNldDw+KAotICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmxpc3Qoa3MuYWxpYXNlcygpKSk7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBhbGlhc2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihDb2xsZWN0aW9ucy5saXN0KGtzLmFsaWFzZXMoKSkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudHJpZXM6ICIgKyBhbGlhc2VzLnNpemUoKSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihhbGlhc2VzKTsKIAogICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPSAoUHJpdmF0ZUtleSlrcy5nZXRLZXkoa2V5QWxpYXMsIHBhc3N3b3JkKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByaXZhdGVLZXkpOwogCi0gICAgICAgIGJ5dGVbXSBkYXRhID0gZ2VuZXJhdGVEYXRhKDEwMjQpOworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICByYW5kb20ubmV4dEJ5dGVzKGRhdGEpOwogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2lnbmluZy4uLiIpOwogICAgICAgICBTaWduYXR1cmUgc2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldEluc3RhbmNlKCJNRDV3aXRoUlNBIik7CkBAIC02Niw4ICs2Nyw3IEBACiAgICAgICAgIHNpZ25hdHVyZS51cGRhdGUoZGF0YSk7CiAgICAgICAgIGJ5dGVbXSBzaWcgPSBzaWduYXR1cmUuc2lnbigpOwogCi0gICAgICAgIFg1MDlDZXJ0aWZpY2F0ZVtdIGNoYWluID0KLSAgICAgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlW10pIGtzLmdldENlcnRpZmljYXRlQ2hhaW4oa2V5QWxpYXMpOworICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbiA9IChYNTA5Q2VydGlmaWNhdGVbXSlrcy5nZXRDZXJ0aWZpY2F0ZUNoYWluKGtleUFsaWFzKTsKICAgICAgICAgc2lnbmF0dXJlLmluaXRWZXJpZnkoY2hhaW5bMF0uZ2V0UHVibGljS2V5KCkpOwogICAgICAgICBzaWduYXR1cmUudXBkYXRlKGRhdGEpOwogICAgICAgICBib29sZWFuIG9rID0gc2lnbmF0dXJlLnZlcmlmeShzaWcpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMS9TZWNtb2QvTG9hZEtleXN0b3JlLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9Mb2FkS2V5c3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxYWE2OS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczExL1NlY21vZC9Mb2FkS2V5c3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MDQ4NjIyIDgxMzQyMzIKLSAqIEBzdW1tYXJ5IENoZWNrcyB0aGF0IFBLQ1MjMTEga2V5c3RvcmUgY2FuJ3QgYmUgbG9hZGVkIHdpdGggd3JvbmcgcGFzc3dvcmQKLSAqIEBsaWJyYXJ5IC4uLwotICogQHJ1biBtYWluL290aGVydm0gTG9hZEtleXN0b3JlCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2FkS2V5c3RvcmUgZXh0ZW5kcyBTZWNtb2RUZXN0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoIWluaXRTZWNtb2QoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ05hbWUgPSBCQVNFICsgU0VQICsgIm5zcy5jZmciOwotICAgICAgICBQcm92aWRlciBwID0gZ2V0U3VuUEtDUzExKGNvbmZpZ05hbWUpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkIHByb3ZpZGVyICIgKyBwKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7Ci0gICAgICAgIFNlY3VyaXR5LmFkZFByb3ZpZGVyKHApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWQga2V5c3RvcmUgd2l0aCB3cm9uZyB0eXBlIik7Ci0gICAgICAgICAgICBLZXlTdG9yZS5nZXRJbnN0YW5jZSgidW5rbm93biIsIHApOwotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2goS2V5U3RvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIlBLQ1MxMSIsIHApOwotICAgICAgICBpZiAoISJQS0NTMTEiLmVxdWFscyhrcy5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBrZXlzdG9yZSB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICsga3MuZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXAuZXF1YWxzKGtzLmdldFByb3ZpZGVyKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBrZXlzdG9yZSBwcm92aWRlcjogIgotICAgICAgICAgICAgICAgICAgICArIGtzLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZCBrZXlzdG9yZSB3aXRoIHdyb25nIHBhc3N3b3JkIik7Ci0gICAgICAgICAgICBrcy5sb2FkKG51bGwsICJ3cm9uZyIudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUpOwotICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgaWYgKCEoY2F1c2UgaW5zdGFuY2VvZiBVbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNhdXNlOiAiICsgY2F1c2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBjYXVzZTogIiArIGNhdXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTG9hZCBrZXlzdG9yZSB3aXRoIGNvcnJlY3QgcGFzc3dvcmQiKTsKLSAgICAgICAga3MubG9hZChudWxsLCBwYXNzd29yZCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFsaWFzIDogQ29sbGVjdGlvbnMubGlzdChrcy5hbGlhc2VzKCkpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFsaWFzOiAiICsgYWxpYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHBhc3NlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL0tleVN0b3JlL0RLU1Rlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wcm92aWRlci9LZXlTdG9yZS9ES1NUZXN0LmphdmEKaW5kZXggMzllNGUxOC4uYTExMjEwZSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL0tleVN0b3JlL0RLU1Rlc3QuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcHJvdmlkZXIvS2V5U3RvcmUvREtTVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjAsMzggKzYwLDggQEAKICAgICAgICAgICAgICAgICBuZXcgS2V5U3RvcmUuUGFzc3dvcmRQcm90ZWN0aW9uKCJwYXNzcGhyYXNlIi50b0NoYXJBcnJheSgpKSk7CiAgICAgICAgIH19OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgS2V5U3RvcmUuUHJvdGVjdGlvblBhcmFtZXRlcj4KLSAgICAgICAgV1JPTkdfUEFTU1dPUkRTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBLZXlTdG9yZS5Qcm90ZWN0aW9uUGFyYW1ldGVyPigpIHt7Ci0gICAgICAgICAgICBwdXQoInBvbGljeV9rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIndyb25nIi50b0NoYXJBcnJheSgpKSk7Ci0gICAgICAgICAgICBwdXQoInB3X2tleXN0b3JlIiwKLSAgICAgICAgICAgICAgICBuZXcgS2V5U3RvcmUuUGFzc3dvcmRQcm90ZWN0aW9uKCJ3cm9uZyIudG9DaGFyQXJyYXkoKSkpOwotICAgICAgICAgICAgcHV0KCJlY2tleXN0b3JlMSIsCi0gICAgICAgICAgICAgICAgbmV3IEtleVN0b3JlLlBhc3N3b3JkUHJvdGVjdGlvbigid3JvbmciLnRvQ2hhckFycmF5KCkpKTsKLSAgICAgICAgICAgIHB1dCgiZWNrZXlzdG9yZTIiLAotICAgICAgICAgICAgICAgIG5ldyBLZXlTdG9yZS5QYXNzd29yZFByb3RlY3Rpb24oIndyb25nIi50b0NoYXJBcnJheSgpKSk7Ci0gICAgICAgIH19OwotCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8qCi0gICAgICAgICAqIGRvbWFpbiBrZXlzdG9yZToga2V5c3RvcmVzIHdpdGggd3JvbmcgcGFzc3dvcmRzCi0gICAgICAgICAqLwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJJIGNvbmZpZyA9IG5ldyBVUkkoQ09ORklHICsgIiNrZXlzdG9yZXMiKTsKLSAgICAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkRLUyIpOwotICAgICAgICAgICAga3MubG9hZChuZXcgRG9tYWluTG9hZFN0b3JlUGFyYW1ldGVyKGNvbmZpZywgV1JPTkdfUEFTU1dPUkRTKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBleGNlcHRpb246ICIgKyBlKTsKLSAgICAgICAgICAgIGlmICghY2F1c2VkQnkoZSwgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbi5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYXVzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCBjYXVzZTogIiArIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKICAgICAgICAgICogZG9tYWluIGtleXN0b3JlOiBzeXN0ZW0KICAgICAgICAgICovCiAgICAgICAgIFVSSSBjb25maWcgPSBuZXcgVVJJKENPTkZJRyArICIjc3lzdGVtIik7CkBAIC0yMTIsMTUgKzE4Miw0IEBACiAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKGNlcnRTdHJlYW0pOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gY2hlY2tzIGlmIGFuIGV4Y2VwdGlvbiB3YXMgY2F1c2VkIGJ5IHNwZWNpZmllZCBleGNlcHRpb24gY2xhc3MKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhdXNlZEJ5KEV4Y2VwdGlvbiBlLCBDbGFzcyBrbGFzcykgewotICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBlOwotICAgICAgICB3aGlsZSAoKGNhdXNlID0gY2F1c2UuZ2V0Q2F1c2UoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNhdXNlLmdldENsYXNzKCkuZXF1YWxzKGtsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2NvbS9zdW4vbmV0L3NzbC9pbnRlcm5hbC9zc2wvU1NMQ29udGV4dEltcGwvVHJ1c3RUcnVzdGVkQ2VydC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9jb20vc3VuL25ldC9zc2wvaW50ZXJuYWwvc3NsL1NTTENvbnRleHRJbXBsL1RydXN0VHJ1c3RlZENlcnQuamF2YQppbmRleCBiMTA0MzFiLi5iODEyYmE1IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2NvbS9zdW4vbmV0L3NzbC9pbnRlcm5hbC9zc2wvU1NMQ29udGV4dEltcGwvVHJ1c3RUcnVzdGVkQ2VydC5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvY29tL3N1bi9uZXQvc3NsL2ludGVybmFsL3NzbC9TU0xDb250ZXh0SW1wbC9UcnVzdFRydXN0ZWRDZXJ0LmphdmEKQEAgLTMwLDEzICszMCwxMiBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgNzExMzI3NSA4MTY0ODQ2CisgKiBAYnVnIDcxMTMyNzUKICAqIEBzdW1tYXJ5IGNvbXBhdGliaWxpdHkgaXNzdWUgd2l0aCBNRDIgdHJ1c3QgYW5jaG9yIGFuZCBvbGQgWDUwOVRydXN0TWFuYWdlcgotICogQHJ1biBtYWluL290aGVydm0gVHJ1c3RUcnVzdGVkQ2VydCBQS0lYIFRMU3YxLjEgdHJ1ZQotICogQHJ1biBtYWluL290aGVydm0gVHJ1c3RUcnVzdGVkQ2VydCBQS0lYIFRMU3YxLjEgZmFsc2UKLSAqIEBydW4gbWFpbi9vdGhlcnZtIFRydXN0VHJ1c3RlZENlcnQgU3VuWDUwOSBUTFN2MS4xIGZhbHNlCi0gKiBAcnVuIG1haW4vb3RoZXJ2bSBUcnVzdFRydXN0ZWRDZXJ0IFBLSVggVExTdjEuMiBmYWxzZQotICogQHJ1biBtYWluL290aGVydm0gVHJ1c3RUcnVzdGVkQ2VydCBTdW5YNTA5IFRMU3YxLjIgZmFsc2UKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFRydXN0VHJ1c3RlZENlcnQgUEtJWCBUTFN2MS4xCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBUcnVzdFRydXN0ZWRDZXJ0IFN1blg1MDkgVExTdjEuMQorICogQHJ1biBtYWluL290aGVydm0gVHJ1c3RUcnVzdGVkQ2VydCBQS0lYIFRMU3YxLjIKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFRydXN0VHJ1c3RlZENlcnQgU3VuWDUwOSBUTFN2MS4yCiAgKi8KIAogaW1wb3J0IGphdmEubmV0Lio7CkBAIC0xODIsMzIgKzE4MSwyMyBAQAogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKICAgICAgICAgfQogCi0gICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU1NMQ29udGV4dCBjb250ZXh0ID0gZ2VuZXJhdGVTU0xDb250ZXh0KCk7Ci0gICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0gY29udGV4dC5nZXRTb2NrZXRGYWN0b3J5KCk7CisgICAgICAgIFNTTENvbnRleHQgY29udGV4dCA9IGdlbmVyYXRlU1NMQ29udGV4dCgpOworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0gY29udGV4dC5nZXRTb2NrZXRGYWN0b3J5KCk7CiAKLSAgICAgICAgICAgIHNzbFNvY2tldCA9IChTU0xTb2NrZXQpc3Nsc2YuY3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKyAgICAgICAgU1NMU29ja2V0IHNzbFNvY2tldCA9CisgICAgICAgICAgICAoU1NMU29ja2V0KXNzbHNmLmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CiAKLSAgICAgICAgICAgIC8vIGVuYWJsZSB0aGUgc3BlY2lmaWVkIFRMUyBwcm90b2NvbAotICAgICAgICAgICAgc3NsU29ja2V0LnNldEVuYWJsZWRQcm90b2NvbHMobmV3IFN0cmluZ1tdIHt0bHNQcm90b2NvbH0pOworICAgICAgICAvLyBlbmFibGUgdGhlIHNwZWNpZmllZCBUTFMgcHJvdG9jb2wKKyAgICAgICAgc3NsU29ja2V0LnNldEVuYWJsZWRQcm90b2NvbHMobmV3IFN0cmluZ1tdIHt0bHNQcm90b2NvbH0pOwogCi0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgc3NsT1Mud3JpdGUoJ0InKTsKLSAgICAgICAgICAgIHNzbE9TLmZsdXNoKCk7Ci0gICAgICAgICAgICBzc2xJUy5yZWFkKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBmb2N1cyBpbiBvbiB0aGUgQ2VydFBhdGhWYWxpZGF0b3JFeGNlcHRpb24KLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRDYXVzZSgpLmdldENhdXNlKCk7Ci0gICAgICAgICAgICBpZiAoKHQgPT0gbnVsbCkgfHwgKGV4cGVjdEZhaWwgJiYKLSAgICAgICAgICAgICAgICAhdC50b1N0cmluZygpLmNvbnRhaW5zKCJNRDV3aXRoUlNBIikpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCB0byBzZWUgTUQ1d2l0aFJTQSBpbiBleGNlcHRpb24gb3V0cHV0ICIgKyB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzc2xTb2NrZXQgIT0gbnVsbCkgc3NsU29ja2V0LmNsb3NlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgIHNzbE9TLndyaXRlKCdCJyk7CisgICAgICAgIHNzbE9TLmZsdXNoKCk7CisgICAgICAgIHNzbElTLnJlYWQoKTsKKworICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKICAgICB9CiAKICAgICAvKgpAQCAtMjE2LDEzICsyMDYsMTAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG1BbGdvcml0aG07ICAgICAgICAvLyB0cnVzdCBtYW5hZ2VyCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRsc1Byb3RvY29sOyAgICAgICAgLy8gdHJ1c3QgbWFuYWdlcgotICAgIC8vIHNldCB0aGlzIGZsYWcgdG8gdGVzdCBjb250ZXh0IG9mIENlcnRpZmljYXRlRXhjZXB0aW9uCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBleHBlY3RGYWlsOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIHRtQWxnb3JpdGhtID0gYXJnc1swXTsKICAgICAgICAgdGxzUHJvdG9jb2wgPSBhcmdzWzFdOwotICAgICAgICBleHBlY3RGYWlsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oYXJnc1syXSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBnZW5lcmF0ZVNTTENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTI0NSw3ICsyMzIsNyBAQAogCiAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBwcml2YXRlIGtleS4KICAgICAgICAgUEtDUzhFbmNvZGVkS2V5U3BlYyBwcmlLZXlTcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKHRhcmdldFByaXZhdGVLZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKHRhcmdldFByaXZhdGVLZXkpKTsKICAgICAgICAgS2V5RmFjdG9yeSBrZiA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlJTQSIpOwogICAgICAgICBSU0FQcml2YXRlS2V5IHByaUtleSA9CiAgICAgICAgICAgICAgICAgKFJTQVByaXZhdGVLZXkpa2YuZ2VuZXJhdGVQcml2YXRlKHByaUtleVNwZWMpOwpAQCAtMzUxLDE5ICszMzgsOSBAQAogICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgY3VzdG9taXplZCBhcmd1bWVudHMuCi0gICAgICAgICAqLwotICAgICAgICBwYXJzZUFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNRDUgaXMgdXNlZCBpbiB0aGlzIHRlc3QgY2FzZSwgZG9uJ3QgZGlzYWJsZSBNRDUgYWxnb3JpdGhtLgotICAgICAgICAgKiBpZiBleHBlY3RGYWlsIGlzIHNldCwgd2UncmUgdGVzdGluZyBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFleHBlY3RGYWlsKSB7Ci0gICAgICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgiamRrLmNlcnRwYXRoLmRpc2FibGVkQWxnb3JpdGhtcyIsCisgICAgICAgIC8vIE1ENSBpcyB1c2VkIGluIHRoaXMgdGVzdCBjYXNlLCBkb24ndCBkaXNhYmxlIE1ENSBhbGdvcml0aG0uCisgICAgICAgIFNlY3VyaXR5LnNldFByb3BlcnR5KCJqZGsuY2VydHBhdGguZGlzYWJsZWRBbGdvcml0aG1zIiwKICAgICAgICAgICAgICAgICAiTUQyLCBSU0Ega2V5U2l6ZSA8IDEwMjQiKTsKLSAgICAgICAgfQogICAgICAgICBTZWN1cml0eS5zZXRQcm9wZXJ0eSgiamRrLnRscy5kaXNhYmxlZEFsZ29yaXRobXMiLAogICAgICAgICAgICAgICAgICJTU0x2MywgUkM0LCBESCBrZXlTaXplIDwgNzY4Iik7CiAKQEAgLTM3MSw2ICszNDgsMTEgQEAKICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOwogCiAgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgY3VzdG9taXplZCBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwYXJzZUFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAvKgogICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCiAgICAgICAgICAqLwogICAgICAgICBuZXcgVHJ1c3RUcnVzdGVkQ2VydCgpOwpAQCAtMzk0LDggKzM3Niw3IEBACiAgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIik7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgLy8gc3dhbGxvdyBmb3Igbm93LiAgU2hvdyBsYXRlcgogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTQ1OSwxMSArNDQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlY3RGYWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSByZWNvcmQgaWYgd2Ugd2VyZW4ndCBleHBlY3RpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHNpZGUgd2lsbCByZWNvcmQgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwpAQCAtNDcyLDExICs0NDksNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSByZWNvcmQgaWYgd2Ugd2VyZW4ndCBleHBlY3RpbmcuCi0gICAgICAgICAgICAgICAgLy8gY2xpZW50IHNpZGUgd2lsbCByZWNvcmQgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgaWYgKCFleHBlY3RGYWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvY29tL3N1bi9uZXQvc3NsL2ludGVybmFsL3NzbC9TU0xTb2NrZXRJbXBsL0Nsb3NlU29ja2V0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2NvbS9zdW4vbmV0L3NzbC9pbnRlcm5hbC9zc2wvU1NMU29ja2V0SW1wbC9DbG9zZVNvY2tldC5qYXZhCmluZGV4IDEyYmZiNGUuLjRjNTMyYmUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvY29tL3N1bi9uZXQvc3NsL2ludGVybmFsL3NzbC9TU0xTb2NrZXRJbXBsL0Nsb3NlU29ja2V0LmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9jb20vc3VuL25ldC9zc2wvaW50ZXJuYWwvc3NsL1NTTFNvY2tldEltcGwvQ2xvc2VTb2NrZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDk2ICsyNiw2NyBAQAogICogQGJ1ZyA0Njc0OTEzCiAgKiBAc3VtbWFyeSBWZXJpZnkgdGhhdCBFT0ZFeGNlcHRpb24gYXJlIGNvcnJlY3RseSBoYW5kbGVkIGR1cmluZyB0aGUgaGFuZHNoYWtlCiAgKiBAYXV0aG9yIEFuZHJlYXMgU3RlcmJlbnoKLSAqIEBydW4gbWFpbi9vdGhlcnZtIENsb3NlU29ja2V0CiAgKi8KIAotaW1wb3J0IGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworCitpbXBvcnQgamF2YXgubmV0LnNzbC4qOwogCiBwdWJsaWMgY2xhc3MgQ2xvc2VTb2NrZXQgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PFRlc3RDYXNlPiB0ZXN0Q2FzZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRlc3RDYXNlcy5hZGQoc29ja2V0IC0+IHNvY2tldC5zdGFydEhhbmRzaGFrZSgpKTsKLSAgICAgICAgdGVzdENhc2VzLmFkZChzb2NrZXQgLT4geworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgICAgaW50IHNlcnZlclBvcnQgPSBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU29ja2V0IHMgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIGFjY2VwdGVkIGNvbm5lY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhIGJpdCBiZWZvcmUgY2xvc2luZyB0aGUgc29ja2V0IHRvIGdpdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNsaWVudCB0aW1lIHRvIHNlbmQgaXRzIGhlbGxvIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICBzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmVyIGNsb3NlZCBzb2NrZXQsIGRvbmUuIik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgZXhjZXB0aW9uOiIpOworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnkgPSAoU1NMU29ja2V0RmFjdG9yeSlTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICAgICAgU1NMU29ja2V0IHNvY2tldCA9IChTU0xTb2NrZXQpZmFjdG9yeS5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudCBlc3RhYmxpc2hlZCBUQ1AgY29ubmVjdGlvbiIpOworICAgICAgICBib29sZWFuIGZhaWxlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBoYW5kc2hha2UuLi4iKTsKKyAgICAgICAgICAgIHNvY2tldC5zdGFydEhhbmRzaGFrZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUjogbm8gZXhjZXB0aW9uIik7CisgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCBhcyBleHBlY3RlZDogIiArIGUpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeWluZyByZWFkLi4uIik7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgaW4ucmVhZCgpOwotICAgICAgICB9KTsKLSAgICAgICAgdGVzdENhc2VzLmFkZChzb2NrZXQgLT4geworICAgICAgICAgICAgaW50IGIgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBubyBleGNlcHRpb24sIHJlYWQ6ICIgKyBiKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIGFzIGV4cGVjdGVkOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5aW5nIHJlYWQuLi4iKTsKICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBvdXQud3JpdGUoNDMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcigpKSB7Ci0gICAgICAgICAgICBuZXcgVGhyZWFkKHNlcnZlcikuc3RhcnQoKTsKLQotICAgICAgICAgICAgU29ja2V0RmFjdG9yeSBmYWN0b3J5ID0gU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0gICAgICAgICAgICB0cnkgKFNTTFNvY2tldCBzb2NrZXQgPSAoU1NMU29ja2V0KSBmYWN0b3J5LmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgc2VydmVyLmdldFBvcnQoKSkpIHsKLSAgICAgICAgICAgICAgICBzb2NrZXQuc2V0U29UaW1lb3V0KDIwMDApOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpZW50IGVzdGFibGlzaGVkIFRDUCBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBmb3IgKFRlc3RDYXNlIHRlc3RDYXNlIDogdGVzdENhc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q2FzZS50ZXN0KHNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBubyBleGNlcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIGFzIGV4cGVjdGVkOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZhaWxlZCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJPbmUgb3IgbW9yZSB0ZXN0cyBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBubyBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIGFzIGV4cGVjdGVkOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT25lIG9yIG1vcmUgdGVzdHMgZmFpbGVkIik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgU2VydmVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSwgUnVubmFibGUgewotCi0gICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQ7Ci0KLSAgICAgICAgU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHRyeSAoU29ja2V0IHMgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNlcnZlciBhY2NlcHRlZCBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgLy8gd2FpdCBhIGJpdCBiZWZvcmUgY2xvc2luZyB0aGUgc29ja2V0IHRvIGdpdmUKLSAgICAgICAgICAgICAgICAvLyB0aGUgY2xpZW50IHRpbWUgdG8gc2VuZCBpdHMgaGVsbG8gbWVzc2FnZQotICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXIgY2xvc2VkIHNvY2tldCwgZG9uZS4iKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2JsZW0gaW4gdGVzdCBleGVjdXRpb24iLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKCFzZXJ2ZXJTb2NrZXQuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50ZXJmYWNlIFRlc3RDYXNlIHsKLSAgICAgICAgdm9pZCB0ZXN0KFNTTFNvY2tldCBzb2NrZXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1RpbWVzdGFtcENoZWNrLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1RpbWVzdGFtcENoZWNrLmphdmEKaW5kZXggNmU1MTI1Ny4uMTEzYmIyNiAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9UaW1lc3RhbXBDaGVjay5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVGltZXN0YW1wQ2hlY2suamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDMxICsyMiwyNSBAQAogICovCiAKIGltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLio7CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2YXRlS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CiAKIGltcG9ydCBzdW4ubWlzYy5JT1V0aWxzOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS4qOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5KYXJVdGlsczsKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjcy5Db250ZW50SW5mbzsKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjcy5QS0NTNzsKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjcy5QS0NTOUF0dHJpYnV0ZTsKQEAgLTU4LDI5ICs1MiwxMyBAQAogaW1wb3J0IHN1bi5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkOwogaW1wb3J0IHN1bi5zZWN1cml0eS54NTA5Llg1MDBOYW1lOwogCi0vKgotICogQHRlc3QKLSAqIEBidWcgNjU0Mzg0MiA2NTQzNDQwIDY5MzkyNDggODAwOTYzNiA4MDI0MzAyIDgxNjMzMDQKLSAqIEBzdW1tYXJ5IGNoZWNraW5nIHJlc3BvbnNlIG9mIHRpbWVzdGFtcAotICogQG1vZHVsZXMgamF2YS5iYXNlL3N1bi5zZWN1cml0eS5wa2NzCi0gKiAgICAgICAgICBqYXZhLmJhc2Uvc3VuLnNlY3VyaXR5LnRpbWVzdGFtcAotICogICAgICAgICAgamF2YS5iYXNlL3N1bi5zZWN1cml0eS54NTA5Ci0gKiAgICAgICAgICBqYXZhLmJhc2Uvc3VuLnNlY3VyaXR5LnV0aWwKLSAqICAgICAgICAgIGphdmEuYmFzZS9zdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbAotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQHJ1biBtYWluL3RpbWVvdXQ9NjAwIFRpbWVzdGFtcENoZWNrCi0gKi8KIHB1YmxpYyBjbGFzcyBUaW1lc3RhbXBDaGVjayB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUU0tTID0gInRza3MiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSID0gIm9sZC5qYXIiOwogCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0UG9saWN5SWQgPSAiMi4zLjQiOwotICAgIHN0YXRpYyBTdHJpbmcgaG9zdCA9IG51bGw7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZhdWx0UG9saWN5SWQgPSAiMi4zLjQuNSI7CiAKLSAgICBzdGF0aWMgY2xhc3MgSGFuZGxlciBpbXBsZW1lbnRzIEh0dHBIYW5kbGVyLCBBdXRvQ2xvc2VhYmxlIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgaHR0cFNlcnZlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5c3RvcmU7Ci0KLSAgICAgICAgQE92ZXJyaWRlCisgICAgc3RhdGljIGNsYXNzIEhhbmRsZXIgaW1wbGVtZW50cyBIdHRwSGFuZGxlciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZShIdHRwRXhjaGFuZ2UgdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGludCBsZW4gPSAwOwogICAgICAgICAgICAgZm9yIChTdHJpbmcgaDogdC5nZXRSZXF1ZXN0SGVhZGVycygpLmtleVNldCgpKSB7CkBAIC05Miw3ICs3MCwxMSBAQAogICAgICAgICAgICAgdC5nZXRSZXF1ZXN0Qm9keSgpLnJlYWQoaW5wdXQpOwogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdC5nZXRSZXF1ZXN0VVJJKCkuZ2V0UGF0aCgpLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpbnQgcGF0aCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHQuZ2V0UmVxdWVzdFVSSSgpLmdldFBhdGgoKS5sZW5ndGgoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IEludGVnZXIucGFyc2VJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRSZXF1ZXN0VVJJKCkuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBzaWduKGlucHV0LCBwYXRoKTsKICAgICAgICAgICAgICAgICBIZWFkZXJzIG91dCA9IHQuZ2V0UmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgICAgICAgb3V0LnNldCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1yZXBseSIpOwpAQCAtMTEwLDkgKzkyLDI0IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGRhdGEgdG8gc2lnbgogICAgICAgICAgKiBAcGFyYW0gcGF0aCBkaWZmZXJlbnQgY2FzZXMgdG8gc2ltdWxhdGUsIGltcGwgb24gVVJMIHBhdGgKKyAgICAgICAgICogMDogbm9ybWFsCisgICAgICAgICAqIDE6IE1pc3Npbmcgbm9uY2UKKyAgICAgICAgICogMjogRGlmZmVyZW50IG5vbmNlCisgICAgICAgICAqIDM6IEJhZCBkaWdldHMgb2N0ZXRzIGluIG1lc3NhZ2VJbXByaW50CisgICAgICAgICAqIDQ6IERpZmZlcmVudCBhbGdvcml0aG1JZCBpbiBtZXNzYWdlSW1wcmludAorICAgICAgICAgKiA1OiB3aG9sZSBjaGFpbiBpbiBjZXJ0IHNldAorICAgICAgICAgKiA2OiBleHRlbnNpb24gaXMgbWlzc2luZworICAgICAgICAgKiA3OiBleHRlbnNpb24gaXMgbm9uLWNyaXRpY2FsCisgICAgICAgICAqIDg6IGV4dGVuc2lvbiBkb2VzIG5vdCBoYXZlIHRpbWVzdGFtcGluZworICAgICAgICAgKiA5OiBubyBjZXJ0IGluIHJlc3BvbnNlCisgICAgICAgICAqIDEwOiBub3JtYWwKKyAgICAgICAgICogMTE6IGFsd2F5cyByZXR1cm4gZGVmYXVsdCBwb2xpY3kgaWQKKyAgICAgICAgICogMTI6IG5vcm1hbAorICAgICAgICAgKiBvdGhlcndpc2U6IG5vcm1hbAogICAgICAgICAgKiBAcmV0dXJucyB0aGUgc2lnbmVkCiAgICAgICAgICAqLwotICAgICAgICBieXRlW10gc2lnbihieXRlW10gaW5wdXQsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIHNpZ24oYnl0ZVtdIGlucHV0LCBpbnQgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBSZWFkIFRTUmVxdWVzdAogICAgICAgICAgICAgRGVyVmFsdWUgdmFsdWUgPSBuZXcgRGVyVmFsdWUoaW5wdXQpOwogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcbkluY29taW5nIFJlcXVlc3Rcbj09PT09PT09PT09PT09PT09PT0iKTsKICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVmVyc2lvbjogIiArIHZhbHVlLmRhdGEuZ2V0SW50ZWdlcigpKTsKQEAgLTEzNiwzNSArMTMzLDM0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBXcml0ZSBUU1Jlc3BvbnNlCiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlxuUmVzcG9uc2Vcbj09PT09PT09PT09PT09PT09PT0iKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oa2V5c3RvcmUpOwotICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSkNFS1MiKTsKLSAgICAgICAgICAgIGtzLmxvYWQoaXMsICJjaGFuZ2VpdCIudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgICAgICBrcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oVFNLUyksICJjaGFuZ2VpdCIudG9DaGFyQXJyYXkoKSk7CiAKICAgICAgICAgICAgIFN0cmluZyBhbGlhcyA9ICJ0cyI7Ci0gICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCJiYWQiKSB8fCBwYXRoLmVxdWFscygid2VhayIpKSB7Ci0gICAgICAgICAgICAgICAgYWxpYXMgPSAidHMiICsgcGF0aDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXRoID09IDYpIGFsaWFzID0gInRzYmFkMSI7CisgICAgICAgICAgICBpZiAocGF0aCA9PSA3KSBhbGlhcyA9ICJ0c2JhZDIiOworICAgICAgICAgICAgaWYgKHBhdGggPT0gOCkgYWxpYXMgPSAidHNiYWQzIjsKIAotICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCJkaWZmcG9saWN5IikpIHsKKyAgICAgICAgICAgIGlmIChwYXRoID09IDExKSB7CiAgICAgICAgICAgICAgICAgcG9saWN5SWQgPSBuZXcgT2JqZWN0SWRlbnRpZmllcihkZWZhdWx0UG9saWN5SWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBEZXJPdXRwdXRTdHJlYW0gc3RhdHVzSW5mbyA9IG5ldyBEZXJPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHN0YXR1c0luZm8ucHV0SW50ZWdlcigwKTsKIAorICAgICAgICAgICAgRGVyT3V0cHV0U3RyZWFtIHRva2VuID0gbmV3IERlck91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgQWxnb3JpdGhtSWRbXSBhbGdvcml0aG1zID0ge2FpZH07CiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNoYWluID0ga3MuZ2V0Q2VydGlmaWNhdGVDaGFpbihhbGlhcyk7Ci0gICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGVbXSBzaWduZXJDZXJ0aWZpY2F0ZUNoYWluOworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gc2lnbmVyQ2VydGlmaWNhdGVDaGFpbiA9IG51bGw7CiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgc2lnbmVyID0gKFg1MDlDZXJ0aWZpY2F0ZSljaGFpblswXTsKLQotICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCJmdWxsY2hhaW4iKSkgeyAgIC8vIE9ubHkgY2FzZSA1IHVzZXMgZnVsbCBjaGFpbgorICAgICAgICAgICAgaWYgKHBhdGggPT0gNSkgeyAgIC8vIE9ubHkgY2FzZSA1IHVzZXMgZnVsbCBjaGFpbgogICAgICAgICAgICAgICAgIHNpZ25lckNlcnRpZmljYXRlQ2hhaW4gPSBuZXcgWDUwOUNlcnRpZmljYXRlW2NoYWluLmxlbmd0aF07CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoYWluLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHNpZ25lckNlcnRpZmljYXRlQ2hhaW5baV0gPSAoWDUwOUNlcnRpZmljYXRlKWNoYWluW2ldOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5lcXVhbHMoIm5vY2VydCIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGggPT0gOSkgewogICAgICAgICAgICAgICAgIHNpZ25lckNlcnRpZmljYXRlQ2hhaW4gPSBuZXcgWDUwOUNlcnRpZmljYXRlWzBdOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzaWduZXJDZXJ0aWZpY2F0ZUNoYWluID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZVsxXTsKQEAgLTE3NiwxMSArMTcyLDExIEBACiAgICAgICAgICAgICB0c3QucHV0SW50ZWdlcigxKTsKICAgICAgICAgICAgIHRzdC5wdXRPSUQocG9saWN5SWQpOwogCi0gICAgICAgICAgICBpZiAoIXBhdGguZXF1YWxzKCJiYWRkaWdlc3QiKSAmJiAhcGF0aC5lcXVhbHMoImRpZmZhbGciKSkgeworICAgICAgICAgICAgaWYgKHBhdGggIT0gMyAmJiBwYXRoICE9IDQpIHsKICAgICAgICAgICAgICAgICB0c3QucHV0RGVyVmFsdWUobWVzc2FnZUltcHJpbnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG1lc3NhZ2VJbXByaW50LnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKCJkaWZmYWxnIikpIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgIGRhdGFbNl0gPSAoYnl0ZSkweDAxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGRhdGFbZGF0YS5sZW5ndGgtMV0gPSAoYnl0ZSkweDAxOwpAQCAtMTk1LDEwICsxOTEsMTAgQEAKICAgICAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgICB0c3QucHV0R2VuZXJhbGl6ZWRUaW1lKGNhbC5nZXRUaW1lKCkpOwogCi0gICAgICAgICAgICBpZiAocGF0aC5lcXVhbHMoImRpZmZub25jZSIpKSB7CisgICAgICAgICAgICBpZiAocGF0aCA9PSAyKSB7CiAgICAgICAgICAgICAgICAgdHN0LnB1dEludGVnZXIoMTIzNCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGguZXF1YWxzKCJub25vbmNlIikpIHsKLSAgICAgICAgICAgICAgICAvLyBubyBub2NlCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGggPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdHN0LnB1dEludGVnZXIobm9uY2UpOwogICAgICAgICAgICAgfQpAQCAtMjA5LDggKzIwNSw2IEBACiAgICAgICAgICAgICBEZXJPdXRwdXRTdHJlYW0gdHN0SW5mbzIgPSBuZXcgRGVyT3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0c3RJbmZvMi5wdXRPY3RldFN0cmluZyh0c3RJbmZvLnRvQnl0ZUFycmF5KCkpOwogCi0gICAgICAgICAgICAvLyBBbHdheXMgdXNlIHRoZSBzYW1lIGFsZ29yaXRobSBhdCB0aW1lc3RhbXAgc2lnbmluZwotICAgICAgICAgICAgLy8gc28gaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGhhc2ggYWxnb3JpdGhtLgogICAgICAgICAgICAgU2lnbmF0dXJlIHNpZyA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZSgiU0hBMXdpdGhSU0EiKTsKICAgICAgICAgICAgIHNpZy5pbml0U2lnbigoUHJpdmF0ZUtleSkoa3MuZ2V0S2V5KAogICAgICAgICAgICAgICAgICAgICBhbGlhcywgImNoYW5nZWl0Ii50b0NoYXJBcnJheSgpKSkpOwpAQCAtMjI4LDExICsyMjIsMTIgQEAKICAgICAgICAgICAgIFNpZ25lckluZm8gc2lnbmVySW5mbyA9IG5ldyBTaWduZXJJbmZvKAogICAgICAgICAgICAgICAgICAgICBuZXcgWDUwME5hbWUoc2lnbmVyLmdldElzc3Vlclg1MDBQcmluY2lwYWwoKS5nZXROYW1lKCkpLAogICAgICAgICAgICAgICAgICAgICBzaWduZXIuZ2V0U2VyaWFsTnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobUlkLmdldCgiU0hBLTEiKSwgQWxnb3JpdGhtSWQuZ2V0KCJSU0EiKSwgc2lnLnNpZ24oKSk7CisgICAgICAgICAgICAgICAgICAgIGFpZCwgQWxnb3JpdGhtSWQuZ2V0KCJSU0EiKSwgc2lnLnNpZ24oKSk7CiAKICAgICAgICAgICAgIFNpZ25lckluZm9bXSBzaWduZXJJbmZvcyA9IHtzaWduZXJJbmZvfTsKLSAgICAgICAgICAgIFBLQ1M3IHA3ID0gbmV3IFBLQ1M3KGFsZ29yaXRobXMsIGNvbnRlbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICBzaWduZXJDZXJ0aWZpY2F0ZUNoYWluLCBzaWduZXJJbmZvcyk7CisgICAgICAgICAgICBQS0NTNyBwNyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBQS0NTNyhhbGdvcml0aG1zLCBjb250ZW50SW5mbywgc2lnbmVyQ2VydGlmaWNhdGVDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgc2lnbmVySW5mb3MpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHA3b3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgcDcuZW5jb2RlU2lnbmVkRGF0YShwN291dCk7CiAKQEAgLTI0NSwyMTUgKzI0MCw2MCBAQAogCiAgICAgICAgICAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEhhbmRsZXIoSHR0cFNlcnZlciBodHRwU2VydmVyLCBTdHJpbmcga2V5c3RvcmUpIHsKLSAgICAgICAgICAgIHRoaXMuaHR0cFNlcnZlciA9IGh0dHBTZXJ2ZXI7Ci0gICAgICAgICAgICB0aGlzLmtleXN0b3JlID0ga2V5c3RvcmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogSW5pdGlhbGl6ZSBUU0EgaW5zdGFuY2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEV4dGVuZGVkIEtleSBJbmZvIGV4dGVuc2lvbiBvZiBjZXJ0aWZpY2F0ZSB0aGF0IGlzIHVzZWQgZm9yCi0gICAgICAgICAqIHNpZ25pbmcgVFNBIHJlc3BvbnNlcyBzaG91bGQgY29udGFpbiB0aW1lU3RhbXBpbmcgdmFsdWUuCi0gICAgICAgICAqLwotICAgICAgICBzdGF0aWMgSGFuZGxlciBpbml0KGludCBwb3J0LCBTdHJpbmcga2V5c3RvcmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBIdHRwU2VydmVyIGh0dHBTZXJ2ZXIgPSBIdHRwU2VydmVyLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpLCAwKTsKLSAgICAgICAgICAgIEhhbmRsZXIgdHNhID0gbmV3IEhhbmRsZXIoaHR0cFNlcnZlciwga2V5c3RvcmUpOwotICAgICAgICAgICAgaHR0cFNlcnZlci5jcmVhdGVDb250ZXh0KCIvIiwgdHNhKTsKLSAgICAgICAgICAgIHJldHVybiB0c2E7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RhcnQgVFNBIHNlcnZpY2UuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgaHR0cFNlcnZlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0b3AgVFNBIHNlcnZpY2UuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIHN0b3AoKSB7Ci0gICAgICAgICAgICBodHRwU2VydmVyLnN0b3AoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJuIHNlcnZlciBwb3J0IG51bWJlci4KLSAgICAgICAgICovCi0gICAgICAgIGludCBnZXRQb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIGh0dHBTZXJ2ZXIuZ2V0QWRkcmVzcygpLmdldFBvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgcHJlcGFyZSgpOworICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOworICAgICAgICBIdHRwU2VydmVyIHNlcnZlciA9IEh0dHBTZXJ2ZXIuY3JlYXRlKG5ldyBJbmV0U29ja2V0QWRkcmVzcygwKSwgMCk7CisgICAgICAgIGludCBwb3J0ID0gc2VydmVyLmdldEFkZHJlc3MoKS5nZXRQb3J0KCk7CisgICAgICAgIEh0dHBDb250ZXh0IGN0eCA9IHNlcnZlci5jcmVhdGVDb250ZXh0KCIvIiwgaCk7CisgICAgICAgIHNlcnZlci5zdGFydCgpOwogCi0gICAgICAgIHRyeSAoSGFuZGxlciB0c2EgPSBIYW5kbGVyLmluaXQoMCwgInRza3MiKTspIHsKLSAgICAgICAgICAgIHRzYS5zdGFydCgpOwotICAgICAgICAgICAgaW50IHBvcnQgPSB0c2EuZ2V0UG9ydCgpOworICAgICAgICBTdHJpbmcgY21kID0gbnVsbDsKKyAgICAgICAgLy8gVXNlIC1KLURqYXZhLnNlY3VyaXR5LmVnZD1maWxlOi9kZXYvLi91cmFuZG9tIHRvIHNwZWVkIHVwCisgICAgICAgIC8vIG5vbmNlIGdlbmVyYXRpb24gaW4gdGltZXN0YW1waW5nIHJlcXVlc3QuIE5vdCBhdmFpYmFsZSBvbgorICAgICAgICAvLyBXaW5kb3dzIGFuZCBkZWZhdWx0cyB0byB0aHJlYWQgc2VlZCBnZW5lcmF0b3IsIG5vdCB0b28gYmFkLgorICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKS5lbmRzV2l0aCgianJlIikpIHsKKyAgICAgICAgICAgIGNtZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyAiLy4uL2Jpbi9qYXJzaWduZXIiICsKKyAgICAgICAgICAgICAgICAiIC1KLURqYXZhLnNlY3VyaXR5LmVnZD1maWxlOi9kZXYvLi91cmFuZG9tIiArCisgICAgICAgICAgICAgICAgIiAtZGVidWcgLWtleXN0b3JlICIgKyBUU0tTICsgIiAtc3RvcmVwYXNzIGNoYW5nZWl0IiArCisgICAgICAgICAgICAgICAgIiAtdHNhIGh0dHA6Ly9sb2NhbGhvc3Q6IiArIHBvcnQgKyAiLyVkIiArCisgICAgICAgICAgICAgICAgIiAtc2lnbmVkamFyIG5ld18lZC5qYXIgIiArIEpBUiArICIgb2xkIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyAiL2Jpbi9qYXJzaWduZXIiICsKKyAgICAgICAgICAgICAgICAiIC1KLURqYXZhLnNlY3VyaXR5LmVnZD1maWxlOi9kZXYvLi91cmFuZG9tIiArCisgICAgICAgICAgICAgICAgIiAtZGVidWcgLWtleXN0b3JlICIgKyBUU0tTICsgIiAtc3RvcmVwYXNzIGNoYW5nZWl0IiArCisgICAgICAgICAgICAgICAgIiAtdHNhIGh0dHA6Ly9sb2NhbGhvc3Q6IiArIHBvcnQgKyAiLyVkIiArCisgICAgICAgICAgICAgICAgIiAtc2lnbmVkamFyIG5ld18lZC5qYXIgIiArIEpBUiArICIgb2xkIjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBob3N0ID0gImh0dHA6Ly9sb2NhbGhvc3Q6IiArIHBvcnQgKyAiLyI7Ci0KKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7ICAgICAgICAgLy8gUnVuIHRoaXMgdGVzdAotICAgICAgICAgICAgICAgIHNpZ24oIm5vbmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oImlzIG5vdCB0aW1lc3RhbXBlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAgICAgICAgIHNpZ24oImJhZGt1IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotICAgICAgICAgICAgICAgIGNoZWNrQmFkS1UoImJhZGt1LmphciIpOwotCi0gICAgICAgICAgICAgICAgc2lnbigibm9ybWFsIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGROb3RDb250YWluKCJpcyBub3QgdGltZXN0YW1wZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgICAgICAgICBzaWduKCJub25vbmNlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDEpOwotICAgICAgICAgICAgICAgIHNpZ24oImRpZmZub25jZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgxKTsKLSAgICAgICAgICAgICAgICBzaWduKCJiYWRkaWdlc3QiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMSk7Ci0gICAgICAgICAgICAgICAgc2lnbigiZGlmZmFsZyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgxKTsKLSAgICAgICAgICAgICAgICBzaWduKCJmdWxsY2hhaW4iKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7ICAgLy8gU3VjY2VzcywgNjU0MzQ0MCBzb2x2ZWQuCi0gICAgICAgICAgICAgICAgc2lnbigiYmFkMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgxKTsKLSAgICAgICAgICAgICAgICBzaWduKCJiYWQyIikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDEpOwotICAgICAgICAgICAgICAgIHNpZ24oImJhZDMiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMSk7Ci0gICAgICAgICAgICAgICAgc2lnbigibm9jZXJ0IikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDEpOwotCi0gICAgICAgICAgICAgICAgc2lnbigicG9saWN5IiwgIi10c2Fwb2xpY3lpZCIsICAiMS4yLjMiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tUaW1lc3RhbXAoInBvbGljeS5qYXIiLCAiMS4yLjMiLCAiU0hBLTI1NiIpOwotCi0gICAgICAgICAgICAgICAgc2lnbigiZGlmZnBvbGljeSIsICItdHNhcG9saWN5aWQiLCAiMS4yLjMiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMSk7Ci0KLSAgICAgICAgICAgICAgICBzaWduKCJ0c2FhbGciLCAiLXRzYWRpZ2VzdGFsZyIsICJTSEEiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tUaW1lc3RhbXAoInRzYWFsZy5qYXIiLCBkZWZhdWx0UG9saWN5SWQsICJTSEEtMSIpOwotCi0gICAgICAgICAgICAgICAgc2lnbigid2VhayIsICItZGlnZXN0YWxnIiwgIk1ENSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItc2lnYWxnIiwgIk1ENXdpdGhSU0EiLCAiLXRzYWRpZ2VzdGFsZyIsICJNRDUiKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tXZWFrKCJ3ZWFrLmphciIpOwotCi0gICAgICAgICAgICAgICAgLy8gV2hlbiAuU0Ygb3IgLlJTQSBpcyBtaXNzaW5nIG9yIGludmFsaWQKLSAgICAgICAgICAgICAgICBjaGVja01pc3NpbmdPckludmFsaWRGaWxlcygibm9ybWFsLmphciIpOworICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQsIDAsIHRydWUpOyAgICAvLyBTdWNjZXNzLCBub3JtYWwgY2FsbAorICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQsIDEsIGZhbHNlKTsgICAvLyBUaGVzZSA0IHNob3VsZCBmYWlsCisgICAgICAgICAgICAgICAgamFyc2lnbmVyKGNtZCwgMiwgZmFsc2UpOworICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQsIDMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBqYXJzaWduZXIoY21kLCA0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgamFyc2lnbmVyKGNtZCwgNSwgdHJ1ZSk7ICAgIC8vIFN1Y2Nlc3MsIDY1NDM0NDAgc29sdmVkLgorICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQsIDYsIGZhbHNlKTsgICAvLyB0c2JhZDEKKyAgICAgICAgICAgICAgICBqYXJzaWduZXIoY21kLCA3LCBmYWxzZSk7ICAgLy8gdHNiYWQyCisgICAgICAgICAgICAgICAgamFyc2lnbmVyKGNtZCwgOCwgZmFsc2UpOyAgIC8vIHRzYmFkMworICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQsIDksIGZhbHNlKTsgICAvLyBubyBjZXJ0IGluIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQgKyAiIC10c2Fwb2xpY3lpZCAxLjIuMy40IiwgMTAsIHRydWUpOworICAgICAgICAgICAgICAgIGNoZWNrVGltZXN0YW1wKCJuZXdfMTAuamFyIiwgIjEuMi4zLjQiLCAiU0hBLTI1NiIpOworICAgICAgICAgICAgICAgIGphcnNpZ25lcihjbWQgKyAiIC10c2Fwb2xpY3lpZCAxLjIuMy41IiwgMTEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBqYXJzaWduZXIoY21kICsgIiAtdHNhZGlnZXN0YWxnIFNIQSIsIDEyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBjaGVja1RpbWVzdGFtcCgibmV3XzEyLmphciIsIGRlZmF1bHRQb2xpY3lJZCwgIlNIQS0xIik7CiAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJ1biBhcyBhIHN0YW5kYWxvbmUgc2VydmVyCiAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQcmVzcyBFbnRlciB0byBxdWl0IHNlcnZlciIpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5pbi5yZWFkKCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgwKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tNaXNzaW5nT3JJbnZhbGlkRmlsZXMoU3RyaW5nIHMpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSmFyVXRpbHMudXBkYXRlSmFyKHMsICIxLmphciIsICItIiwgIk1FVEEtSU5GL09MRC5TRiIpOwotICAgICAgICB2ZXJpZnkoIjEuamFyIiwgIi12ZXJib3NlIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKQotICAgICAgICAgICAgICAgIC5zaG91bGRDb250YWluKCJ0cmVhdGVkIGFzIHVuc2lnbmVkIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigiTWlzc2luZyBzaWduYXR1cmUtcmVsYXRlZCBmaWxlIE1FVEEtSU5GL09MRC5TRiIpOwotICAgICAgICBKYXJVdGlscy51cGRhdGVKYXIocywgIjIuamFyIiwgIi0iLCAiTUVUQS1JTkYvT0xELlJTQSIpOwotICAgICAgICB2ZXJpZnkoIjIuamFyIiwgIi12ZXJib3NlIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKQotICAgICAgICAgICAgICAgIC5zaG91bGRDb250YWluKCJ0cmVhdGVkIGFzIHVuc2lnbmVkIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigiTWlzc2luZyBibG9jayBmaWxlIGZvciBzaWduYXR1cmUtcmVsYXRlZCBmaWxlIE1FVEEtSU5GL09MRC5TRiIpOwotICAgICAgICBKYXJVdGlscy51cGRhdGVKYXIocywgIjMuamFyIiwgIk1FVEEtSU5GL09MRC5TRiIpOwotICAgICAgICB2ZXJpZnkoIjMuamFyIiwgIi12ZXJib3NlIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKQotICAgICAgICAgICAgICAgIC5zaG91bGRDb250YWluKCJ0cmVhdGVkIGFzIHVuc2lnbmVkIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigiVW5wYXJzYWJsZSBzaWduYXR1cmUtcmVsYXRlZCBmaWxlIE1FVEEtSU5GL09MRC5TRiIpOwotICAgICAgICBKYXJVdGlscy51cGRhdGVKYXIocywgIjQuamFyIiwgIk1FVEEtSU5GL09MRC5SU0EiKTsKLSAgICAgICAgdmVyaWZ5KCI0LmphciIsICItdmVyYm9zZSIpCi0gICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCkKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigidHJlYXRlZCBhcyB1bnNpZ25lZCIpCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oIlVucGFyc2FibGUgc2lnbmF0dXJlLXJlbGF0ZWQgZmlsZSBNRVRBLUlORi9PTEQuUlNBIik7Ci0gICAgfQotCi0gICAgc3RhdGljIE91dHB1dEFuYWx5emVyIGphcnNpZ25lcihMaXN0PFN0cmluZz4gZXh0cmEpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgSkRLVG9vbExhdW5jaGVyIGxhdW5jaGVyID0gSkRLVG9vbExhdW5jaGVyLmNyZWF0ZVVzaW5nVGVzdEpESygiamFyc2lnbmVyIikKLSAgICAgICAgICAgICAgICAuYWRkVk1BcmcoIi1EdXNlci5sYW5ndWFnZT1lbiIpCi0gICAgICAgICAgICAgICAgLmFkZFZNQXJnKCItRHVzZXIuY291bnRyeT1VUyIpCi0gICAgICAgICAgICAgICAgLmFkZFRvb2xBcmcoIi1rZXlzdG9yZSIpCi0gICAgICAgICAgICAgICAgLmFkZFRvb2xBcmcoInRza3MiKQotICAgICAgICAgICAgICAgIC5hZGRUb29sQXJnKCItc3RvcmVwYXNzIikKLSAgICAgICAgICAgICAgICAuYWRkVG9vbEFyZygiY2hhbmdlaXQiKTsKLSAgICAgICAgZm9yIChTdHJpbmcgcyA6IGV4dHJhKSB7Ci0gICAgICAgICAgICBpZiAocy5zdGFydHNXaXRoKCItSiIpKSB7Ci0gICAgICAgICAgICAgICAgbGF1bmNoZXIuYWRkVk1Bcmcocy5zdWJzdHJpbmcoMikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYXVuY2hlci5hZGRUb29sQXJnKHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ09NTUFORDogIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNtZCA6IGxhdW5jaGVyLmdldENvbW1hbmQoKSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludChjbWQgKyAiICIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigpOwotICAgICAgICByZXR1cm4gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKGxhdW5jaGVyLmdldENvbW1hbmQoKSk7Ci0gICAgfQotCi0gICAgc3RhdGljIE91dHB1dEFuYWx5emVyIHZlcmlmeShTdHJpbmcgZmlsZSwgU3RyaW5nLi4uIGV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhcmdzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGFyZ3MuYWRkKCItdmVyaWZ5Iik7Ci0gICAgICAgIGFyZ3MuYWRkKGZpbGUpOwotICAgICAgICBhcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KGV4dHJhKSk7Ci0gICAgICAgIHJldHVybiBqYXJzaWduZXIoYXJncyk7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY2hlY2tCYWRLVShTdHJpbmcgZmlsZSkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQmFkS1U6ICIgKyBmaWxlKTsKLSAgICAgICAgdmVyaWZ5KGZpbGUpCi0gICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCkKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigidHJlYXRlZCBhcyB1bnNpZ25lZCIpCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oInJlLXJ1biBqYXJzaWduZXIgd2l0aCBkZWJ1ZyBlbmFibGVkIik7Ci0gICAgICAgIHZlcmlmeShmaWxlLCAiLXZlcmJvc2UiKQotICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDApCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oIlNpZ25lZCBieSIpCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oInRyZWF0ZWQgYXMgdW5zaWduZWQiKQotICAgICAgICAgICAgICAgIC5zaG91bGRDb250YWluKCJyZS1ydW4gamFyc2lnbmVyIHdpdGggZGVidWcgZW5hYmxlZCIpOwotICAgICAgICB2ZXJpZnkoZmlsZSwgIi1KLURqYXZhLnNlY3VyaXR5LmRlYnVnPWphciIpCi0gICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCkKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigiU2lnbmF0dXJlRXhjZXB0aW9uOiBLZXkgdXNhZ2UgcmVzdHJpY3RlZCIpCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oInRyZWF0ZWQgYXMgdW5zaWduZWQiKQotICAgICAgICAgICAgICAgIC5zaG91bGRDb250YWluKCJyZS1ydW4gamFyc2lnbmVyIHdpdGggZGVidWcgZW5hYmxlZCIpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGNoZWNrV2VhayhTdHJpbmcgZmlsZSkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIHZlcmlmeShmaWxlKQotICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDApCi0gICAgICAgICAgICAgICAgLnNob3VsZENvbnRhaW4oInRyZWF0ZWQgYXMgdW5zaWduZWQiKQotICAgICAgICAgICAgICAgIC5zaG91bGRNYXRjaCgid2VhayBhbGdvcml0aG0gdGhhdCBpcyBub3cgZGlzYWJsZWQuIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkTWF0Y2goIlJlLXJ1biBqYXJzaWduZXIgd2l0aCB0aGUgLXZlcmJvc2Ugb3B0aW9uIGZvciBtb3JlIGRldGFpbHMiKTsKLSAgICAgICAgdmVyaWZ5KGZpbGUsICItdmVyYm9zZSIpCi0gICAgICAgICAgICAgICAgLnNob3VsZEhhdmVFeGl0VmFsdWUoMCkKLSAgICAgICAgICAgICAgICAuc2hvdWxkQ29udGFpbigidHJlYXRlZCBhcyB1bnNpZ25lZCIpCi0gICAgICAgICAgICAgICAgLnNob3VsZE1hdGNoKCJ3ZWFrIGFsZ29yaXRobSB0aGF0IGlzIG5vdyBkaXNhYmxlZCBieSIpCi0gICAgICAgICAgICAgICAgLnNob3VsZE1hdGNoKCJEaWdlc3QgYWxnb3JpdGhtOiAuKndlYWsiKQotICAgICAgICAgICAgICAgIC5zaG91bGRNYXRjaCgiU2lnbmF0dXJlIGFsZ29yaXRobTogLip3ZWFrIikKLSAgICAgICAgICAgICAgICAuc2hvdWxkTWF0Y2goIlRpbWVzdGFtcCBkaWdlc3QgYWxnb3JpdGhtOiAuKndlYWsiKQotICAgICAgICAgICAgICAgIC5zaG91bGROb3RNYXRjaCgiVGltZXN0YW1wIHNpZ25hdHVyZSBhbGdvcml0aG06IC4qd2Vhay4qd2VhayIpCi0gICAgICAgICAgICAgICAgLnNob3VsZE1hdGNoKCJUaW1lc3RhbXAgc2lnbmF0dXJlIGFsZ29yaXRobTogLiprZXkuKndlYWsiKTsKLSAgICAgICAgdmVyaWZ5KGZpbGUsICItSi1EamF2YS5zZWN1cml0eS5kZWJ1Zz1qYXIiKQotICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDApCi0gICAgICAgICAgICAgICAgLnNob3VsZE1hdGNoKCJTaWduYXR1cmVFeGNlcHRpb246LipEaXNhYmxlZCIpOwotICAgIH0KLQogICAgIHN0YXRpYyB2b2lkIGNoZWNrVGltZXN0YW1wKFN0cmluZyBmaWxlLCBTdHJpbmcgcG9saWN5SWQsIFN0cmluZyBkaWdlc3RBbGcpCiAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IChKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoZmlsZSkpIHsKQEAgLTQ4MCw2NSArMzIwLDQxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgaW50IHdoaWNoID0gMDsKLQogICAgIC8qKgotICAgICAqIEBwYXJhbSBleHRyYSBtb3JlIGFyZ3MgZ2l2ZW4gdG8gamFyc2lnbmVyCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lICh3aXRoIGEgaG9sZSB0byBwbHVnIGluKQorICAgICAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIGluIHRoZSBVUkwsIGkuZSwgaHR0cDovL2xvY2FsaG9zdC9wYXRoCisgICAgICogQHBhcmFtIGV4cGVjdGVkIGlmIHRoaXMgY29tbWFuZCBzaG91bGQgc3VjY2VlZAogICAgICAqLwotICAgIHN0YXRpYyBPdXRwdXRBbmFseXplciBzaWduKFN0cmluZyBwYXRoLCBTdHJpbmcuLi4gZXh0cmEpCi0gICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgd2hpY2grKzsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJcbj4+IFRlc3QgIyIgKyB3aGljaCArICI6ICIgKyBBcnJheXMudG9TdHJpbmcoZXh0cmEpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgYXJncy5hZGQoIi1KLURqYXZhLnNlY3VyaXR5LmVnZD1maWxlOi9kZXYvLi91cmFuZG9tIik7Ci0gICAgICAgIGFyZ3MuYWRkKCItZGVidWciKTsKLSAgICAgICAgYXJncy5hZGQoIi1zaWduZWRqYXIiKTsKLSAgICAgICAgYXJncy5hZGQocGF0aCArICIuamFyIik7Ci0gICAgICAgIGFyZ3MuYWRkKCJvbGQuamFyIik7Ci0gICAgICAgIGFyZ3MuYWRkKHBhdGguZXF1YWxzKCJiYWRrdSIpID8gImJhZGt1IiA6ICJvbGQiKTsKLSAgICAgICAgaWYgKCFwYXRoLmVxdWFscygibm9uZSIpICYmICFwYXRoLmVxdWFscygiYmFka3UiKSkgewotICAgICAgICAgICAgYXJncy5hZGQoIi10c2EiKTsKLSAgICAgICAgICAgIGFyZ3MuYWRkKGhvc3QgKyBwYXRoKTsKLSAgICAgICAgIH0KLSAgICAgICAgYXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChleHRyYSkpOwotICAgICAgICByZXR1cm4gamFyc2lnbmVyKGFyZ3MpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHByZXBhcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgamRrLnRlc3RsaWJyYXJ5LkphclV0aWxzLmNyZWF0ZUphcigib2xkLmphciIsICJBIik7Ci0gICAgICAgIEZpbGVzLmRlbGV0ZUlmRXhpc3RzKFBhdGhzLmdldCgidHNrcyIpKTsKLSAgICAgICAga2V5dG9vbCgiLWFsaWFzIGNhIC1nZW5rZXlwYWlyIC1leHQgYmMgLWRuYW1lIENOPUNBIik7Ci0gICAgICAgIGtleXRvb2woIi1hbGlhcyBvbGQgLWdlbmtleXBhaXIgLWRuYW1lIENOPW9sZCIpOwotICAgICAgICBrZXl0b29sKCItYWxpYXMgYmFka3UgLWdlbmtleXBhaXIgLWRuYW1lIENOPWJhZGt1Iik7Ci0gICAgICAgIGtleXRvb2woIi1hbGlhcyB0cyAtZ2Vua2V5cGFpciAtZG5hbWUgQ049dHMiKTsKLSAgICAgICAga2V5dG9vbCgiLWFsaWFzIHRzd2VhayAtZ2Vua2V5cGFpciAta2V5c2l6ZSA1MTIgLWRuYW1lIENOPXRzYmFkMSIpOwotICAgICAgICBrZXl0b29sKCItYWxpYXMgdHNiYWQxIC1nZW5rZXlwYWlyIC1kbmFtZSBDTj10c2JhZDEiKTsKLSAgICAgICAga2V5dG9vbCgiLWFsaWFzIHRzYmFkMiAtZ2Vua2V5cGFpciAtZG5hbWUgQ049dHNiYWQyIik7Ci0gICAgICAgIGtleXRvb2woIi1hbGlhcyB0c2JhZDMgLWdlbmtleXBhaXIgLWRuYW1lIENOPXRzYmFkMyIpOwotCi0gICAgICAgIGdlbmNlcnQoIm9sZCIpOwotICAgICAgICBnZW5jZXJ0KCJiYWRrdSIsICItZXh0IGt1OmNyaXRpY2FsPWtleUFncmVlbWVudCIpOwotICAgICAgICBnZW5jZXJ0KCJ0cyIsICItZXh0IGVrdTpjcml0aWNhbD10cyIpOwotICAgICAgICBnZW5jZXJ0KCJ0c3dlYWsiLCAiLWV4dCBla3U6Y3JpdGljYWw9dHMiKTsKLSAgICAgICAgZ2VuY2VydCgidHNiYWQxIik7Ci0gICAgICAgIGdlbmNlcnQoInRzYmFkMiIsICItZXh0IGVrdT10cyIpOwotICAgICAgICBnZW5jZXJ0KCJ0c2JhZDMiLCAiLWV4dCBla3U6Y3JpdGljYWw9Y3MiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBnZW5jZXJ0KFN0cmluZyBhbGlhcywgU3RyaW5nLi4uIGV4dHJhKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAga2V5dG9vbCgiLWFsaWFzICIgKyBhbGlhcyArICIgLWNlcnRyZXEgLWZpbGUgIiArIGFsaWFzICsgIi5yZXEiKTsKLSAgICAgICAgU3RyaW5nIGdlbkNtZCA9ICItZ2VuY2VydCAtYWxpYXMgY2EgLWluZmlsZSAiICsKLSAgICAgICAgICAgICAgICBhbGlhcyArICIucmVxIC1vdXRmaWxlICIgKyBhbGlhcyArICIuY2VydCI7Ci0gICAgICAgIGZvciAoU3RyaW5nIHMgOiBleHRyYSkgewotICAgICAgICAgICAgZ2VuQ21kICs9ICIgIiArIHM7CisgICAgc3RhdGljIHZvaWQgamFyc2lnbmVyKFN0cmluZyBjbWQsIGludCBwYXRoLCBib29sZWFuIGV4cGVjdGVkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGVzdCAiICsgcGF0aCk7CisgICAgICAgIFByb2Nlc3MgcCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoU3RyaW5nLmZvcm1hdChjbWQsIHBhdGgsIHBhdGgpKTsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwLmdldEVycm9yU3RyZWFtKCkpKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICBpZiAocyA9PSBudWxsKSBicmVhazsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzKTsKICAgICAgICAgfQotICAgICAgICBrZXl0b29sKGdlbkNtZCk7Ci0gICAgICAgIGtleXRvb2woIi1hbGlhcyAiICsgYWxpYXMgKyAiIC1pbXBvcnRjZXJ0IC1maWxlICIgKyBhbGlhcyArICIuY2VydCIpOwotICAgIH0KIAotICAgIHN0YXRpYyB2b2lkIGtleXRvb2woU3RyaW5nIGNtZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNtZCA9ICIta2V5c3RvcmUgdHNrcyAtc3RvcmVwYXNzIGNoYW5nZWl0IC1rZXlwYXNzIGNoYW5nZWl0ICIgKwotICAgICAgICAgICAgICAgICIta2V5YWxnIHJzYSAtdmFsaWRpdHkgMjAwICIgKyBjbWQ7Ci0gICAgICAgIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4ubWFpbihjbWQuc3BsaXQoIiAiKSk7CisgICAgICAgIC8vIFdpbGwgbm90IHNlZSBub1RpbWVzdGFtcCB3YXJuaW5nCisgICAgICAgIGJvb2xlYW4gc2VlV2FybmluZyA9IGZhbHNlOworICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHAuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3RyaW5nIHMgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGlmIChzID09IG51bGwpIGJyZWFrOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHMpOworICAgICAgICAgICAgaWYgKHMuaW5kZXhPZigiV2FybmluZzoiKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgc2VlV2FybmluZyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IHJlc3VsdCA9IHAud2FpdEZvcigpOworICAgICAgICBpZiAoZXhwZWN0ZWQgJiYgcmVzdWx0ICE9IDAgfHwgIWV4cGVjdGVkICYmIHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJGYWlsZWQiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VlV2FybmluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU2VlIHdhcm5pbmciKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVHNhY2VydE9wdGlvblRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVHNhY2VydE9wdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2YWZmYy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1RzYWNlcnRPcHRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgZmlsZSB3aXRoIC10c2FjZXJ0IG9wdGlvbgotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeQotICogQHJ1biBtYWluIFRzYWNlcnRPcHRpb25UZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBUc2FjZXJ0T3B0aW9uVGVzdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5qZGsiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZVE9PTCA9IEpBVkFfSE9NRSArIEZTICsgImJpbiIgKyBGUwotICAgICAgICAgICAgKyAia2V5dG9vbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUlNJR05FUiA9IEpBVkFfSE9NRSArIEZTICsgImJpbiIgKyBGUwotICAgICAgICAgICAgKyAiamFyc2lnbmVyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TSUdORURfSkFSRklMRSA9ICJ1bnNpZ25lZC5qYXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdORURfSkFSRklMRSA9ICJzaWduZWQuamFyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSBUc2FjZXJ0T3B0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkKLSAgICAgICAgICAgICsgIi50eHQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJjaGFuZ2VpdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNUT1JFID0gImtzLmprcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05JTkdfS0VZX0FMSUFTID0gInNpZ25fYWxpYXMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUU0FfS0VZX0FMSUFTID0gInRzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMRyA9ICJSU0EiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRVlfU0laRSA9IDIwNDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZID0gMzY1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIldhcm5pbmc6IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1NJR05FRCA9ICJqYXIgc2lnbmVkLiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9WRVJJRklFRCA9ICJqYXIgdmVyaWZpZWQuIjsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXN0IHNpZ25zIGFuZCB2ZXJpZmllcyBhIGphciBmaWxlIHdpdGggLXRzYWNlcnQgb3B0aW9uLAotICAgICAqIGFuZCBjaGVja3MgdGhhdCBubyB3YXJuaW5nIHdhcyBzaG93bi4KLSAgICAgKiBBIGNlcnRpZmljYXRlIHRoYXQgaXMgYWRkcmVzc2VkIGluIC10c2FjZXJ0IG9wdGlvbiBjb250YWlucyBVUkwgdG8gVFNBCi0gICAgICogaW4gU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MgZXh0ZW5zaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBUc2FjZXJ0T3B0aW9uVGVzdCB0ZXN0ID0gbmV3IFRzYWNlcnRPcHRpb25UZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgb25lIGZpbGUKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklMRU5BTUUpOwotICAgICAgICBKYXJVdGlscy5jcmVhdGVKYXIoVU5TSUdORURfSkFSRklMRSwgRklMRU5BTUUpOwotCi0gICAgICAgIC8vIGxvb2sgZm9yIGZyZWUgbmV0d29yayBwb3J0IGZvciBUU0Egc2VydmljZQotICAgICAgICBpbnQgcG9ydCA9IGpkay50ZXN0bGlicmFyeS5VdGlscy5nZXRGcmVlUG9ydCgpOwotICAgICAgICBTdHJpbmcgaG9zdCA9IGpkay50ZXN0bGlicmFyeS5VdGlscy5nZXRIb3N0bmFtZSgpOwotICAgICAgICBTdHJpbmcgdHNhVXJsID0gImh0dHA6Ly8iICsgaG9zdCArICI6IiArIHBvcnQ7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGtleSBwYWlyIGZvciBqYXIgc2lnbmluZwotICAgICAgICBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoS0VZVE9PTCwKLSAgICAgICAgICAgICAgICAiLWdlbmtleSIsCi0gICAgICAgICAgICAgICAgIi1hbGlhcyIsIFNJR05JTkdfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVRlc3QiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyBjcmVhdGUga2V5IHBhaXIgZm9yIFRTQSBzZXJ2aWNlCi0gICAgICAgIC8vIFN1YmplY3RJbmZvQWNjZXNzIGV4dGVuc2lvbiBjb250YWlucyBVUkwgdG8gVFNBIHNlcnZpY2UKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItdiIsCi0gICAgICAgICAgICAgICAgIi1hbGlhcyIsIFRTQV9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZG5hbWUiLCAiQ049VFNBIiwKLSAgICAgICAgICAgICAgICAiLWV4dCIsICJFeHRlbmRlZGtleVVzYWdlOmNyaXRpY2FsPXRpbWVTdGFtcGluZyIsCi0gICAgICAgICAgICAgICAgIi1leHQiLCAiU3ViamVjdEluZm9BY2Nlc3M9dGltZVN0YW1waW5nOlVSSToiICsgdHNhVXJsLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICB0cnkgKFRpbWVzdGFtcENoZWNrLkhhbmRsZXIgdHNhID0gVGltZXN0YW1wQ2hlY2suSGFuZGxlci5pbml0KHBvcnQsCi0gICAgICAgICAgICAgICAgS0VZU1RPUkUpOykgewotCi0gICAgICAgICAgICAvLyBzdGFydCBUU0EKLSAgICAgICAgICAgIHRzYS5zdGFydCgpOwotCi0gICAgICAgICAgICAvLyBzaWduIGphciBmaWxlCi0gICAgICAgICAgICAvLyBzcGVjaWZ5IC10c2FkaWdlc3RhbGcgb3B0aW9uIGJlY2F1c2UKLSAgICAgICAgICAgIC8vIFRTQSBzZXJ2ZXIgdXNlcyBTSEEtMSBkaWdlc3QgYWxnb3JpdGhtCi0gICAgICAgICAgICAgT3V0cHV0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICAgICAiLXNpZ25lZGphciIsIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgICAgICAiLXRzYWNlcnQiLCBUU0FfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICAgICAiLXRzYWRpZ2VzdGFsZyIsICJTSEEtMSIsCi0gICAgICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgICAgIFNJR05JTkdfS0VZX0FMSUFTKTsKLQotICAgICAgICAgICAgYW5hbHl6ZXIuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLSAgICAgICAgICAgIGFuYWx5emVyLnN0ZG91dFNob3VsZE5vdENvbnRhaW4oV0FSTklORyk7Ci0gICAgICAgICAgICBhbmFseXplci5zaG91bGRDb250YWluKEpBUl9TSUdORUQpOwotCi0gICAgICAgICAgICAvLyB2ZXJpZnkgc2lnbmVkIGphcgotICAgICAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgICAgICBhbmFseXplci5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotICAgICAgICAgICAgYW5hbHl6ZXIuc3Rkb3V0U2hvdWxkTm90Q29udGFpbihXQVJOSU5HKTsKLSAgICAgICAgICAgIGFuYWx5emVyLnNob3VsZENvbnRhaW4oSkFSX1ZFUklGSUVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVXRpbHMuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjOTAwOS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFV0aWxzIHsKLQotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUZpbGVzKFN0cmluZy4uLiBmaWxlbmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogZmlsZW5hbWVzKSB7Ci0gICAgICAgICAgICBuZXcgRmlsZShmaWxlbmFtZSkuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvdHMuc2ggYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWU2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3RzLnNoCkBAIC0wLDAgKzEsOTEgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjIAorIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjIAorIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIyAKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgQHRlc3QKKyMgQGJ1ZyA2NTQzODQyIDY1NDM0NDAgNjkzOTI0OCA4MDA5NjM2IDgwMjQzMDIKKyMgQHN1bW1hcnkgY2hlY2tpbmcgcmVzcG9uc2Ugb2YgdGltZXN0YW1wCisjCisjIEBydW4gc2hlbGwvdGltZW91dD02MDAgdHMuc2gKKworIyBSdW4gZm9yIGEgbG9uZyB0aW1lIGJlY2F1c2UgamFyc2lnbmVyIHdpdGggdGltZXN0YW1wIG5lZWRzIHRvIGNyZWF0ZSBhCisjIDY0LWJpdCByYW5kb20gbnVtYmVyIGFuZCBpdCBtaWdodCBiZSBleHRyZW1lbHkgc2xvdyBvbiBhIG1hY2hpbmUgd2l0aAorIyBub3QgZW5vdWdoIGVudHJvcHkgcG9vbAorCisjIHNldCBwbGF0Zm9ybS1kZXBlbmRlbnQgdmFyaWFibGVzCitPUz1gdW5hbWUgLXNgCitjYXNlICIkT1MiIGluCisgIFdpbmRvd3NfKiApCisgICAgRlM9IlxcIgorICAgIDs7CisgICogKQorICAgIEZTPSIvIgorICAgIDs7Citlc2FjCisKK2lmIFsgIiR7VEVTVFNSQ30iID0gIiIgXSA7IHRoZW4KKyAgVEVTVFNSQz0iLiIKK2ZpCitpZiBbICIke1RFU1RKQVZBfSIgPSAiIiBdIDsgdGhlbgorICBKQVZBQ19DTUQ9YHdoaWNoIGphdmFjYAorICBURVNUSkFWQT1gZGlybmFtZSAkSkFWQUNfQ01EYC8uLgorZmkKKworSkFSPSIke1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXIiCitKQVZBPSIke1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXZhIgorSkFWQUM9IiR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmFjIgorS1Q9IiR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWtleXRvb2wgLWtleXN0b3JlIHRza3MgLXN0b3JlcGFzcyBjaGFuZ2VpdCAta2V5cGFzcyBjaGFuZ2VpdCAta2V5YWxnIHJzYSAtdmFsaWRpdHkgMjAwIgorCitybSB0c2tzCitlY2hvIE5vdGhpbmcgPiBBCitybSBvbGQuamFyCiskSkFSIGN2ZiBvbGQuamFyIEEKKworIyBjYSBpcyBDQQorIyBvbGQgaXMgc2lnbmVyIGZvciBjb2RlCisjIHRzIGlzIHNpZ25lciBmb3IgdGltZXN0YW1wCisjIHRzYmFkMSBoYXMgbm8gZXh0ZW5kZWRLZXlVc2FnZQorIyB0c2JhZDIncyBleHRlbmRlZEtleVVzYWdlIGlzIG5vbi1jcml0aWNhbAorIyB0c2JhZDMncyBleHRlbmRlZEtleVVzYWdlIGhhcyBubyB0aW1lc3RhbXBpbmcKKworJEtUIC1hbGlhcyBjYSAtZ2Vua2V5cGFpciAtZXh0IGJjIC1kbmFtZSBDTj1DQQorJEtUIC1hbGlhcyBvbGQgLWdlbmtleXBhaXIgLWRuYW1lIENOPW9sZAorJEtUIC1hbGlhcyB0cyAtZ2Vua2V5cGFpciAtZG5hbWUgQ049dHMKKyRLVCAtYWxpYXMgdHNiYWQxIC1nZW5rZXlwYWlyIC1kbmFtZSBDTj10c2JhZDEKKyRLVCAtYWxpYXMgdHNiYWQyIC1nZW5rZXlwYWlyIC1kbmFtZSBDTj10c2JhZDIKKyRLVCAtYWxpYXMgdHNiYWQzIC1nZW5rZXlwYWlyIC1kbmFtZSBDTj10c2JhZDMKKyRLVCAtYWxpYXMgdHMgLWNlcnRyZXEgfCBcCisgICAgICAgICRLVCAtYWxpYXMgY2EgLWdlbmNlcnQgLWV4dCBla3U6Y3JpdGljYWw9dHMgfCBcCisgICAgICAgICRLVCAtYWxpYXMgdHMgLWltcG9ydGNlcnQKKyRLVCAtYWxpYXMgdHNiYWQxIC1jZXJ0cmVxIHwgXAorICAgICAgICAkS1QgLWFsaWFzIGNhIC1nZW5jZXJ0IHwgXAorICAgICAgICAkS1QgLWFsaWFzIHRzYmFkMSAtaW1wb3J0Y2VydAorJEtUIC1hbGlhcyB0c2JhZDIgLWNlcnRyZXEgfCBcCisgICAgICAgICRLVCAtYWxpYXMgY2EgLWdlbmNlcnQgLWV4dCBla3U9dHMgfCBcCisgICAgICAgICRLVCAtYWxpYXMgdHNiYWQyIC1pbXBvcnRjZXJ0CiskS1QgLWFsaWFzIHRzYmFkMyAtY2VydHJlcSB8IFwKKyAgICAgICAgJEtUIC1hbGlhcyBjYSAtZ2VuY2VydCAtZXh0IGVrdTpjcml0aWNhbD1jcyB8IFwKKyAgICAgICAgJEtUIC1hbGlhcyB0c2JhZDMgLWltcG9ydGNlcnQKKworJEpBVkFDIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSAtZCAuICR7VEVTVFNSQ30vVGltZXN0YW1wQ2hlY2suamF2YQorJEpBVkEgJHtURVNUVk1PUFRTfSBUaW1lc3RhbXBDaGVjaworCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0FsaWFzTm90SW5TdG9yZVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQWxpYXNOb3RJblN0b3JlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTQ3NWZiLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQWxpYXNOb3RJblN0b3JlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5Lk91dHB1dEFuYWx5emVyOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LkphclV0aWxzOwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjQzMDIgODAyNjAzNwotICogQHN1bW1hcnkgVGVzdCBmb3IgYWxpYXNOb3RJblN0b3JlIHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gQWxpYXNOb3RJblN0b3JlVGVzdAotICovCi1wdWJsaWMgY2xhc3MgQWxpYXNOb3RJblN0b3JlVGVzdCBleHRlbmRzIFRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3Qgc2lnbnMgYW5kIHZlcmlmaWVzIGEgamFyIHRoYXQgY29udGFpbnMgc2lnbmVkIGVudHJpZXMKLSAgICAgKiB0aGF0IGFyZSBub3Qgc2lnbmVkIGJ5IGFueSBhbGlhcyBpbiBrZXlzdG9yZSAoYWxpYXNOb3RJblN0b3JlKS4KLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2UgaXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEFsaWFzTm90SW5TdG9yZVRlc3QgdGVzdCA9IG5ldyBBbGlhc05vdEluU3RvcmVUZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSwgU0VDT05EX0ZJTEUpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQ3JlYXRlIGEgJXMgdGhhdCBjb250YWlucyAlcyIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde1VOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEV9KSk7Ci0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUgZmlyc3Qga2V5IHBhaXIgZm9yIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBGSVJTVF9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBCT1RIX0tFWVNfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPUZpcnN0IiwKLSAgICAgICAgICAgICAgICAiLXZhbGlkaXR5IiwgSW50ZWdlci50b1N0cmluZyhWQUxJRElUWSkpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHNlY29uZCBrZXkgcGFpciBmb3Igc2lnbmluZwotICAgICAgICBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoS0VZVE9PTCwKLSAgICAgICAgICAgICAgICAiLWdlbmtleSIsCi0gICAgICAgICAgICAgICAgIi1hbGlhcyIsIFNFQ09ORF9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBCT1RIX0tFWVNfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVNlY29uZCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIHNpZ24gamFyIHdpdGggZmlyc3Qga2V5Ci0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgQk9USF9LRVlTX0tFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1zaWduZWRqYXIiLCBTSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBVTlNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEZJUlNUX0tFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tTaWduaW5nKGFuYWx5emVyKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQ29weSAlcyB0byAlcywgYW5kIGFkZCAlcyIsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtTSUdORURfSkFSRklMRSwgVVBEQVRFRF9TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICAgICAgU0VDT05EX0ZJTEV9KSk7Ci0KLSAgICAgICAgSmFyVXRpbHMudXBkYXRlSmFyKFNJR05FRF9KQVJGSUxFLCBVUERBVEVEX1NJR05FRF9KQVJGSUxFLCBTRUNPTkRfRklMRSk7Ci0KLSAgICAgICAgLy8gc2lnbiBqYXIgd2l0aCBzZWNvbmQga2V5Ci0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgQk9USF9LRVlTX0tFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgVVBEQVRFRF9TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBTRUNPTkRfS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1NpZ25pbmcoYW5hbHl6ZXIpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBrZXlzdG9yZSB0aGF0IGNvbnRhaW5zIG9ubHkgZmlyc3Qga2V5Ci0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItaW1wb3J0a2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICItc3Jja2V5c3RvcmUiLCBCT1RIX0tFWVNfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zcmNhbGlhcyIsIEZJUlNUX0tFWV9BTElBUywKLSAgICAgICAgICAgICAgICAiLXNyY3N0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItc3Jja2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZGVzdGtleXN0b3JlIiwgRklSU1RfS0VZX0tFWVNUT1JFLAotICAgICAgICAgICAgICAgICItZGVzdGFsaWFzIiwgRklSU1RfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICItZGVzdHN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZGVzdGtleXBhc3MiLCBQQVNTV09SRCkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyB2ZXJpZnkgamFyIHdpdGgga2V5c3RvcmUgdGhhdCBjb250YWlucyBvbmx5IGZpcnN0IGtleSBpbiBzdHJpY3QgbW9kZSwKLSAgICAgICAgLy8gc28gdGhlcmUgaXMgc2lnbmVkIGVudHJ5IChGaXJzdENsYXNzLmNsYXNzKSB0aGF0IGlzIG5vdCBzaWduZWQKLSAgICAgICAgLy8gYnkgYW55IGFsaWFzIGluIHRoZSBrZXlzdG9yZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEZJUlNUX0tFWV9LRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFVQREFURURfU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCAwLCBDSEFJTl9OT1RfVkFMSURBVEVEX1ZFUklGWUlOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIEFMSUFTX05PVF9JTl9TVE9SRV9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGphciB3aXRoIGtleXN0b3JlIHRoYXQgY29udGFpbnMgb25seSBmaXJzdCBrZXkgaW4gc3RyaWN0IG1vZGUKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICItc3RyaWN0IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgRklSU1RfS0VZX0tFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgVVBEQVRFRF9TSUdORURfSkFSRklMRSk7Ci0KLSAgICAgICAgaW50IGV4cGVjdGVkRXhpdENvZGUgPSBBTElBU19OT1RfSU5fU1RPUkVfRVhJVF9DT0RFCi0gICAgICAgICAgICAgICAgKyBDSEFJTl9OT1RfVkFMSURBVEVEX0VYSVRfQ09ERTsKLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIGV4cGVjdGVkRXhpdENvZGUsCi0gICAgICAgICAgICAgICAgQ0hBSU5fTk9UX1ZBTElEQVRFRF9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBBTElBU19OT1RfSU5fU1RPUkVfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQmFkRXh0ZW5kZWRLZXlVc2FnZVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQmFkRXh0ZW5kZWRLZXlVc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjM2M4YS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0JhZEV4dGVuZGVkS2V5VXNhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBUZXN0IGZvciBiYWRFeHRlbmRlZEtleVVzYWdlIHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gQmFkRXh0ZW5kZWRLZXlVc2FnZVRlc3QKLSAqLwotcHVibGljIGNsYXNzIEJhZEV4dGVuZGVkS2V5VXNhZ2VUZXN0IGV4dGVuZHMgVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyBlbnRyaWVzCi0gICAgICogd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlJ3MgRXh0ZW5kZWRLZXlVc2FnZSBleHRlbnNpb24KLSAgICAgKiBkb2Vzbid0IGFsbG93IGNvZGUgc2lnbmluZyAoYmFkRXh0ZW5kZWRLZXlVc2FnZSkuCi0gICAgICogV2FybmluZyBtZXNzYWdlIGlzIGV4cGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBCYWRFeHRlbmRlZEtleVVzYWdlVGVzdCB0ZXN0ID0gbmV3IEJhZEV4dGVuZGVkS2V5VXNhZ2VUZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgamFyIGZpbGUgdGhhdCBjb250YWlucyBvbmUgY2xhc3MgZmlsZQotICAgICAgICBVdGlscy5jcmVhdGVGaWxlcyhGSVJTVF9GSUxFKTsKLSAgICAgICAgSmFyVXRpbHMuY3JlYXRlSmFyKFVOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGNlcnRpZmljYXRlIHdob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSdzCi0gICAgICAgIC8vIEV4dGVuZGVkS2V5VXNhZ2UgZXh0ZW5zaW9uIGRvZXNuJ3QgYWxsb3cgY29kZSBzaWduaW5nCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVRlc3QiLAotICAgICAgICAgICAgICAgICItZXh0IiwgIkV4dGVuZGVka2V5VXNhZ2U9c2VydmVyQXV0aCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIHNpZ24gamFyCi0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItc2lnbmVkamFyIiwgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgVU5TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBLRVlfQUxJQVMpOwotCi0gICAgICAgIGNoZWNrU2lnbmluZyhhbmFseXplciwgQkFEX0VYVEVOREVEX0tFWV9VU0FHRV9TSUdOSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBzaWduZWQgamFyCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICBTSUdORURfSkFSRklMRSk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIEJBRF9FWFRFTkRFRF9LRVlfVVNBR0VfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcml0eSBzaWduZWQgamFyIGluIHN0cmljdCBtb2RlCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBCQURfRVhURU5ERURfS0VZX1VTQUdFX0VYSVRfQ09ERSwKLSAgICAgICAgICAgICAgICBCQURfRVhURU5ERURfS0VZX1VTQUdFX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0JhZEtleVVzYWdlVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9CYWRLZXlVc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzN2ViOS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0JhZEtleVVzYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5Lk91dHB1dEFuYWx5emVyOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LkphclV0aWxzOwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjQzMDIgODAyNjAzNwotICogQHN1bW1hcnkgVGVzdCBmb3IgYmFkS2V5VXNhZ2Ugd2FybmluZwotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeSAuLi8KLSAqIEBpZ25vcmUgdW50aWwgODAyNjM5MyBpcyBmaXhlZAotICogQHJ1biBtYWluIEJhZEtleVVzYWdlVGVzdAotICovCi1wdWJsaWMgY2xhc3MgQmFkS2V5VXNhZ2VUZXN0IGV4dGVuZHMgVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyBlbnRyaWVzCi0gICAgICogd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlJ3MgS2V5VXNhZ2UgZXh0ZW5zaW9uCi0gICAgICogZG9lc24ndCBhbGxvdyBjb2RlIHNpZ25pbmcgKGJhZEtleVVzYWdlKS4KLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2UgaXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEJhZEtleVVzYWdlVGVzdCB0ZXN0ID0gbmV3IEJhZEtleVVzYWdlVGVzdCgpOwotICAgICAgICB0ZXN0LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgb25lIGNsYXNzIGZpbGUKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSk7Ci0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBjZXJ0aWZpY2F0ZSB3aG9zZSBzaWduZXIgY2VydGlmaWNhdGUncyBLZXlVc2FnZSBleHRlbnNpb24KLSAgICAgICAgLy8gZG9lc24ndCBhbGxvdyBjb2RlIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBLRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZG5hbWUiLCAiQ049VGVzdCIsCi0gICAgICAgICAgICAgICAgIi1leHQiLCAiS2V5VXNhZ2U9a2V5QWdyZWVtZW50IiwKLSAgICAgICAgICAgICAgICAiLXZhbGlkaXR5IiwgSW50ZWdlci50b1N0cmluZyhWQUxJRElUWSkpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgLy8gc2lnbiBqYXIKLSAgICAgICAgT3V0cHV0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1zaWduZWRqYXIiLCBTSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBVTlNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tTaWduaW5nKGFuYWx5emVyLCBCQURfS0VZX1VTQUdFX1NJR05JTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgMCwgQkFEX0tFWV9VU0FHRV9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIgaW4gc3RyaWN0IG1vZGUKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICItc3RyaWN0IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICBTSUdORURfSkFSRklMRSk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIEJBRF9LRVlfVVNBR0VfRVhJVF9DT0RFLAotICAgICAgICAgICAgICAgIEJBRF9LRVlfVVNBR0VfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQmFkTmV0c2NhcGVDZXJ0VHlwZVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvQmFkTmV0c2NhcGVDZXJ0VHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJlODA4Ni4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0JhZE5ldHNjYXBlQ2VydFR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MDI0MzAyIDgwMjYwMzcKLSAqIEBzdW1tYXJ5IFRlc3QgZm9yIGJhZE5ldHNjYXBlQ2VydFR5cGUgd2FybmluZwotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeSAuLi8KLSAqIEBydW4gbWFpbiBCYWROZXRzY2FwZUNlcnRUeXBlVGVzdAotICovCi1wdWJsaWMgY2xhc3MgQmFkTmV0c2NhcGVDZXJ0VHlwZVRlc3QgZXh0ZW5kcyBUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTQ0FQRV9LRVlTVE9SRV9CQVNFNjQgPSBURVNUX1NPVVJDRVMgKyBGUwotICAgICAgICAgICAgKyAiYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5qa3MuYmFzZTY0IjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTQ0FQRV9LRVlTVE9SRQotICAgICAgICAgICAgPSAiYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5qa3MiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3Qgc2lnbnMgYW5kIHZlcmlmaWVzIGEgamFyIHRoYXQgY29udGFpbnMgZW50cmllcwotICAgICAqIHdob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSdzIE5ldHNjYXBlQ2VydFR5cGUgZXh0ZW5zaW9uCi0gICAgICogZG9lc24ndCBhbGxvdyBjb2RlIHNpZ25pbmcgKGJhZE5ldHNjYXBlQ2VydFR5cGUpLgotICAgICAqIFdhcm5pbmcgbWVzc2FnZSBpcyBleHBlY3RlZC4KLSAgICAgKiBSdW4gYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5zaCBzY3JpcHQgdG8gY3JlYXRlIGJhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuamtzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0KLSAgICAgICAgRmlsZXMud3JpdGUoUGF0aHMuZ2V0KE5FVFNDQVBFX0tFWVNUT1JFKSwKLSAgICAgICAgICAgICAgICBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgIEZpbGVzLnJlYWRBbGxCeXRlcyhQYXRocy5nZXQoTkVUU0NBUEVfS0VZU1RPUkVfQkFTRTY0KSkpKTsKLQotICAgICAgICBCYWROZXRzY2FwZUNlcnRUeXBlVGVzdCB0ZXN0ID0gbmV3IEJhZE5ldHNjYXBlQ2VydFR5cGVUZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgamFyIGZpbGUgdGhhdCBjb250YWlucyBvbmUgY2xhc3MgZmlsZQotICAgICAgICBVdGlscy5jcmVhdGVGaWxlcyhGSVJTVF9GSUxFKTsKLSAgICAgICAgSmFyVXRpbHMuY3JlYXRlSmFyKFVOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEUpOwotCi0gICAgICAgIC8vIHNpZ24gamFyCi0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBORVRTQ0FQRV9LRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItc2lnbmVkamFyIiwgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgVU5TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBLRVlfQUxJQVMpOwotCi0gICAgICAgIGNoZWNrU2lnbmluZyhhbmFseXplciwgQkFEX05FVFNDQVBFX0NFUlRfVFlQRV9TSUdOSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBzaWduZWQgamFyCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgTkVUU0NBUEVfS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICBTSUdORURfSkFSRklMRSk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIEJBRF9ORVRTQ0FQRV9DRVJUX1RZUEVfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBzaWduZWQgamFyIGluIHN0cmljdCBtb2RlCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIE5FVFNDQVBFX0tFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBCQURfTkVUU0NBUEVfQ0VSVF9UWVBFX0VYSVRfQ09ERSwKLSAgICAgICAgICAgICAgICBCQURfTkVUU0NBUEVfQ0VSVF9UWVBFX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0NoYWluTm90VmFsaWRhdGVkVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9DaGFpbk5vdFZhbGlkYXRlZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFmMDk3OS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0NoYWluTm90VmFsaWRhdGVkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5PdXRwdXRBbmFseXplcjsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuUHJvY2Vzc1Rvb2xzOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5KYXJVdGlsczsKLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MDI0MzAyIDgwMjYwMzcKLSAqIEBzdW1tYXJ5IFRlc3QgZm9yIGNoYWluTm90VmFsaWRhdGVkIHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gQ2hhaW5Ob3RWYWxpZGF0ZWRUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbk5vdFZhbGlkYXRlZFRlc3QgZXh0ZW5kcyBUZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFJTiA9ICJjaGFpbiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyBlbnRyaWVzCi0gICAgICogd2hvc2UgY2VydCBjaGFpbiBjYW4ndCBiZSBjb3JyZWN0bHkgdmFsaWRhdGVkIChjaGFpbk5vdFZhbGlkYXRlZCkuCi0gICAgICogV2FybmluZyBtZXNzYWdlIGlzIGV4cGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBDaGFpbk5vdFZhbGlkYXRlZFRlc3QgdGVzdCA9IG5ldyBDaGFpbk5vdFZhbGlkYXRlZFRlc3QoKTsKLSAgICAgICAgdGVzdC5zdGFydCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvLyBjcmVhdGUgYSBqYXIgZmlsZSB0aGF0IGNvbnRhaW5zIG9uZSBjbGFzcyBmaWxlCi0gICAgICAgIFV0aWxzLmNyZWF0ZUZpbGVzKEZJUlNUX0ZJTEUpOwotICAgICAgICBKYXJVdGlscy5jcmVhdGVKYXIoVU5TSUdORURfSkFSRklMRSwgRklSU1RfRklMRSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHdob3NlIEJhc2ljQ29uc3RyYWludHMgZXh0ZW5zaW9uCi0gICAgICAgIC8vIGlzIHNldCB0byBmYWxzZSwgc28gdGhlIGNlcnRpZmljYXRlIG1heSBub3QgYmUgdXNlZAotICAgICAgICAvLyBhcyBhIHBhcmVudCBjZXJ0aWZpY2F0ZSAoY2VydHBhdGggdmFsaWRhdGlvbiBzaG91bGQgZmFpbCkKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXlwYWlyIiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgQ0FfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPUNBIiwKLSAgICAgICAgICAgICAgICAiLWV4dCIsICJCYXNpY0NvbnN0cmFpbnRzOmNyaXRpY2FsPWNhOmZhbHNlIiwKLSAgICAgICAgICAgICAgICAiLXZhbGlkaXR5IiwgSW50ZWdlci50b1N0cmluZyhWQUxJRElUWSkpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGEgY2VydGlmaWNhdGUgdGhhdCBpcyBzaWduZWQgYnkgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUKLSAgICAgICAgLy8gZGVzcGl0ZSBvZiBpdCBtYXkgbm90IGJlIHVzZWQgYXMgYSBwYXJlbnQgY2VydGlmaWNhdGUKLSAgICAgICAgLy8gKGNlcnRwYXRoIHZhbGlkYXRpb24gc2hvdWxkIGZhaWwpCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5cGFpciIsCi0gICAgICAgICAgICAgICAgIi1hbGlhcyIsIEtFWV9BTElBUywKLSAgICAgICAgICAgICAgICAiLWtleWFsZyIsIEtFWV9BTEcsCi0gICAgICAgICAgICAgICAgIi1rZXlzaXplIiwgSW50ZWdlci50b1N0cmluZyhLRVlfU0laRSksCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1kbmFtZSIsICJDTj1UZXN0IiwKLSAgICAgICAgICAgICAgICAiLWV4dCIsICJCYXNpY0NvbnN0cmFpbnRzOmNyaXRpY2FsPWNhOmZhbHNlIiwKLSAgICAgICAgICAgICAgICAiLXZhbGlkaXR5IiwgSW50ZWdlci50b1N0cmluZyhWQUxJRElUWSkpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1jZXJ0cmVxIiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZmlsZSIsIENFUlRfUkVRVUVTVF9GSUxFTkFNRSkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoS0VZVE9PTCwKLSAgICAgICAgICAgICAgICAiLWdlbmNlcnQiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBDQV9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1pbmZpbGUiLCBDRVJUX1JFUVVFU1RfRklMRU5BTUUsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpLAotICAgICAgICAgICAgICAgICItb3V0ZmlsZSIsIENFUlRfRklMRU5BTUUpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1pbXBvcnRjZXJ0IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZmlsZSIsIENFUlRfRklMRU5BTUUpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgUHJvY2Vzc0J1aWxkZXIgcGIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoS0VZVE9PTCwKLSAgICAgICAgICAgICAgICAiLWV4cG9ydCIsCi0gICAgICAgICAgICAgICAgIi1yZmMiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBLRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQpOwotICAgICAgICBwYi5yZWRpcmVjdE91dHB1dChQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5hcHBlbmRUbyhuZXcgRmlsZShDSEFJTikpKTsKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKHBiKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIHBiID0gbmV3IFByb2Nlc3NCdWlsZGVyKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1leHBvcnQiLAotICAgICAgICAgICAgICAgICItcmZjIiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgQ0FfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JEKTsKLSAgICAgICAgcGIucmVkaXJlY3RPdXRwdXQoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuYXBwZW5kVG8obmV3IEZpbGUoQ0hBSU4pKSk7Ci0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChwYikuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyByZW1vdmUgQ0EgY2VydGlmaWNhdGUKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1kZWxldGUiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBDQV9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQpLnNob3VsZEhhdmVFeGl0VmFsdWUoMCk7Ci0KLSAgICAgICAgLy8gc2lnbiBqYXIKLSAgICAgICAgT3V0cHV0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItY2VydGNoYWluIiwgQ0hBSU4sCi0gICAgICAgICAgICAgICAgIi1zaWduZWRqYXIiLCBTSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBVTlNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tTaWduaW5nKGFuYWx5emVyLCBDSEFJTl9OT1RfVkFMSURBVEVEX1NJR05JTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItY2VydGNoYWluIiwgQ0hBSU4sCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCAwLCBDSEFJTl9OT1RfVkFMSURBVEVEX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyB2ZXJpZnkgc2lnbmVkIGphciBpbiBzdHJpY3QgbW9kZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1zdHJpY3QiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItY2VydGNoYWluIiwgQ0hBSU4sCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBDSEFJTl9OT1RfVkFMSURBVEVEX0VYSVRfQ09ERSwKLSAgICAgICAgICAgICAgICBDSEFJTl9OT1RfVkFMSURBVEVEX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0hhc0V4cGlyZWRDZXJ0VGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9IYXNFeHBpcmVkQ2VydFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiOGU5MS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0hhc0V4cGlyZWRDZXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5Lk91dHB1dEFuYWx5emVyOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LkphclV0aWxzOwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjQzMDIgODAyNjAzNwotICogQHN1bW1hcnkgVGVzdCBmb3IgaGFzRXhwaXJlZENlcnQgd2FybmluZwotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeSAuLi8KLSAqIEBydW4gbWFpbiBIYXNFeHBpcmVkQ2VydFRlc3QKLSAqLwotcHVibGljIGNsYXNzIEhhc0V4cGlyZWRDZXJ0VGVzdCBleHRlbmRzIFRlc3QgewotCi0gICAgc3RhdGljIGZpbmFsIGludCBTSE9SVF9WQUxJRElUWSA9IDM2NTsKLQotICAgIC8qKgotICAgICAqIFRoZSB0ZXN0IHNpZ25zIGFuZCB2ZXJpZmllcyBhIGphciB0aGF0IGNvbnRhaW5zIGVudHJpZXMKLSAgICAgKiB3aG9zZSBzaWduZXIgY2VydGlmaWNhdGUgaGFzIGV4cGlyZWQgKGhhc0V4cGlyZWRDZXJ0KS4KLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2UgaXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEhhc0V4cGlyZWRDZXJ0VGVzdCB0ZXN0ID0gbmV3IEhhc0V4cGlyZWRDZXJ0VGVzdCgpOwotICAgICAgICB0ZXN0LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgb25lIGNsYXNzIGZpbGUKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSk7Ci0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUga2V5IHBhaXIgZm9yIGphciBzaWduaW5nCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVRlc3QiLAotICAgICAgICAgICAgICAgICItc3RhcnRkYXRlIiwgIi0iICsgU0hPUlRfVkFMSURJVFkgKiAyICsgImQiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFNIT1JUX1ZBTElESVRZKSkKLSAgICAgICAgICAgICAgICAuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyBzaWduIGphcgotICAgICAgICBPdXRwdXRBbmFseXplciBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1zaWduZWRqYXIiLCBTSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBVTlNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tTaWduaW5nKGFuYWx5emVyLCBIQVNfRVhQSVJFRF9DRVJUX1NJR05JTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgMCwgSEFTX0VYUElSRURfQ0VSVF9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBIQVNfRVhQSVJFRF9DRVJUX0VYSVRfQ09ERSwKLSAgICAgICAgICAgICAgICBIQVNfRVhQSVJFRF9DRVJUX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgcGFzc2VkIik7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0hhc0V4cGlyaW5nQ2VydFRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvSGFzRXhwaXJpbmdDZXJ0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzQxNDhlLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvSGFzRXhwaXJpbmdDZXJ0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5Lk91dHB1dEFuYWx5emVyOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5Qcm9jZXNzVG9vbHM7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LkphclV0aWxzOwotCi0vKioKLSAqIEB0ZXN0Ci0gKiBAYnVnIDgwMjQzMDIgODAyNjAzNwotICogQHN1bW1hcnkgVGVzdCBmb3IgaGFzRXhwaXJpbmdDZXJ0IHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gSGFzRXhwaXJpbmdDZXJ0VGVzdAotICovCi1wdWJsaWMgY2xhc3MgSGFzRXhwaXJpbmdDZXJ0VGVzdCBleHRlbmRzIFRlc3QgewotCi0gICAgc3RhdGljIGZpbmFsIGludCBTSE9SVF9WQUxJRElUWSA9IDkwOyAvLyBsZXNzIHRoYW4gNiBtb250aAotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3Qgc2lnbnMgYW5kIHZlcmlmaWVzIGEgamFyIHRoYXQgY29udGFpbnMgZW50cmllcwotICAgICAqIHdob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSB3aWxsIGV4cGlyZSB3aXRoaW4gc2l4IG1vbnRocyAoaGFzRXhwaXJpbmdDZXJ0KS4KLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2UgaXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIEhhc0V4cGlyaW5nQ2VydFRlc3QgdGVzdCA9IG5ldyBIYXNFeHBpcmluZ0NlcnRUZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgamFyIGZpbGUgdGhhdCBjb250YWlucyBvbmUgY2xhc3MgZmlsZQotICAgICAgICBVdGlscy5jcmVhdGVGaWxlcyhGSVJTVF9GSUxFKTsKLSAgICAgICAgSmFyVXRpbHMuY3JlYXRlSmFyKFVOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBrZXkgcGFpciBmb3IgamFyIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBLRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZG5hbWUiLCAiQ049VGVzdCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoU0hPUlRfVkFMSURJVFkpKQotICAgICAgICAgICAgICAgIC5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIHNpZ24gamFyCi0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItc2lnbmVkamFyIiwgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgVU5TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBLRVlfQUxJQVMpOwotCi0gICAgICAgIGNoZWNrU2lnbmluZyhhbmFseXplciwgSEFTX0VYUElSSU5HX0NFUlRfU0lHTklOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyB2ZXJpZnkgc2lnbmVkIGphcgotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgMCwgSEFTX0VYUElSSU5HX0NFUlRfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBzaWduZWQgamFyIGluIHN0cmljdCBtb2RlCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgMCwgSEFTX0VYUElSSU5HX0NFUlRfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvSGFzVW5zaWduZWRFbnRyeVRlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvSGFzVW5zaWduZWRFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZmViMy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL0hhc1Vuc2lnbmVkRW50cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBUZXN0IGZvciBoYXNVbnNpZ25lZEVudHJ5IHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gSGFzVW5zaWduZWRFbnRyeVRlc3QKLSAqLwotcHVibGljIGNsYXNzIEhhc1Vuc2lnbmVkRW50cnlUZXN0IGV4dGVuZHMgVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyB1bnNpZ25lZCBlbnRyaWVzCi0gICAgICogd2hpY2ggaGF2ZSBub3QgYmVlbiBpbnRlZ3JpdHktY2hlY2tlZCAoaGFzVW5zaWduZWRFbnRyeSkuCi0gICAgICogV2FybmluZyBtZXNzYWdlIGlzIGV4cGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBIYXNVbnNpZ25lZEVudHJ5VGVzdCB0ZXN0ID0gbmV3IEhhc1Vuc2lnbmVkRW50cnlUZXN0KCk7Ci0gICAgICAgIHRlc3Quc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkNyZWF0ZSBhICVzIHRoYXQgY29udGFpbnMgJXMiLAotICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEUpKTsKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSwgU0VDT05EX0ZJTEUpOwotICAgICAgICBKYXJVdGlscy5jcmVhdGVKYXIoVU5TSUdORURfSkFSRklMRSwgRklSU1RfRklMRSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGtleSBwYWlyIGZvciBzaWduaW5nCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVRlc3QiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyBzaWduIGphcgotICAgICAgICBPdXRwdXRBbmFseXplciBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJib3NlIiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLXNpZ25lZGphciIsIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1NpZ25pbmcoYW5hbHl6ZXIpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJDb3B5ICVzIHRvICVzLCBhbmQgYWRkICVzLmNsYXNzLCAiCi0gICAgICAgICAgICAgICAgKyAic28gaXQgY29udGFpbnMgdW5zaWduZWQgZW50cnkiLAotICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXtTSUdORURfSkFSRklMRSwgVVBEQVRFRF9TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICAgICAgU0VDT05EX0ZJTEV9KSk7Ci0KLSAgICAgICAgSmFyVXRpbHMudXBkYXRlSmFyKFNJR05FRF9KQVJGSUxFLCBVUERBVEVEX1NJR05FRF9KQVJGSUxFLCBTRUNPTkRfRklMRSk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGphcgotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgVVBEQVRFRF9TSUdORURfSkFSRklMRSk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIEhBU19VTlNJR05FRF9FTlRSWV9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGphciBpbiBzdHJpY3QgbW9kZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1zdHJpY3QiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFVQREFURURfU0lHTkVEX0pBUkZJTEUpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBIQVNfVU5TSUdORURfRU5UUllfRVhJVF9DT0RFLAotICAgICAgICAgICAgICAgIEhBU19VTlNJR05FRF9FTlRSWV9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHBhc3NlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9NdWx0aXBsZVdhcm5pbmdzVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9NdWx0aXBsZVdhcm5pbmdzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc5MTRjLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTXVsdGlwbGVXYXJuaW5nc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5PdXRwdXRBbmFseXplcjsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuUHJvY2Vzc1Rvb2xzOwotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5KYXJVdGlsczsKLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA4MDI0MzAyIDgwMjYwMzcKLSAqIEBzdW1tYXJ5IENoZWNrcyBpZiBqYXJzaWduZXIgcHJpbnRzIGFwcHJvcHJpYXRlIHdhcm5pbmdzCi0gKiBAbGlicmFyeSAvbGliL3Rlc3RsaWJyYXJ5IC4uLwotICogQHJ1biBtYWluIE11bHRpcGxlV2FybmluZ3NUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZVdhcm5pbmdzVGVzdCBleHRlbmRzIFRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3Qgc2lnbnMgYW5kIHZlcmlmaWVzIGEgamFyIHRoYXQ6Ci0gICAgICogICAtIGNvbnRhaW5zIGVudHJpZXMgd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlIGhhcyBleHBpcmVkCi0gICAgICogICAtIGNvbnRhaW5zIGVudHJpZXMgd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlJ3MgRXh0ZW5kZWRLZXlVc2FnZQotICAgICAqICAgICBleHRlbnNpb24gZG9lc24ndCBhbGxvdyBjb2RlIHNpZ25pbmcKLSAgICAgKiAgIC0gY29udGFpbnMgdW5zaWduZWQgZW50cmllcyB3aGljaCBoYXZlIG5vdCBiZWVuIGludGVncml0eS1jaGVja2VkCi0gICAgICogICAtIGNvbnRhaW5zIHNpZ25lZCBlbnRyaWVzIHdoaWNoIGFyZSBub3Qgc2lnbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWxpYXMKLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBleHBlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgTXVsdGlwbGVXYXJuaW5nc1Rlc3QgdGVzdCA9IG5ldyBNdWx0aXBsZVdhcm5pbmdzVGVzdCgpOwotICAgICAgICB0ZXN0LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIFV0aWxzLmNyZWF0ZUZpbGVzKEZJUlNUX0ZJTEUsIFNFQ09ORF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUgYSBqYXIgZmlsZSB0aGF0IGNvbnRhaW5zIG9uZSBjbGFzcyBmaWxlCi0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUgZmlyc3QgZXhwaXJlZCBjZXJ0aWZpY2F0ZQotICAgICAgICAvLyB3aG9zZSBFeHRlbmRlZEtleVVzYWdlIGV4dGVuc2lvbiBkb2VzIG5vdCBhbGxvdyBjb2RlIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBGSVJTVF9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZG5hbWUiLCAiQ049Rmlyc3QiLAotICAgICAgICAgICAgICAgICItZXh0IiwgIkV4dGVuZGVka2V5VXNhZ2U9c2VydmVyQXV0aCIsCi0gICAgICAgICAgICAgICAgIi1zdGFydGRhdGUiLCAiLSIgKyBWQUxJRElUWSAqIDIgKyAiZCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIGNyZWF0ZSBzZWNvbmQgZXhwaXJlZCBjZXJ0aWZpY2F0ZQotICAgICAgICAvLyB3aG9zZSBLZXlVc2FnZSBleHRlbnNpb24gZG9lcyBub3QgYWxsb3cgY29kZSBzaWduaW5nCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgU0VDT05EX0tFWV9BTElBUywKLSAgICAgICAgICAgICAgICAiLWtleWFsZyIsIEtFWV9BTEcsCi0gICAgICAgICAgICAgICAgIi1rZXlzaXplIiwgSW50ZWdlci50b1N0cmluZyhLRVlfU0laRSksCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1kbmFtZSIsICJDTj1TZWNvbmQiLAotICAgICAgICAgICAgICAgICItZXh0IiwgIkV4dGVuZGVka2V5VXNhZ2U9c2VydmVyQXV0aCIsCi0gICAgICAgICAgICAgICAgIi1zdGFydGRhdGUiLCAiLSIgKyBWQUxJRElUWSAqIDIgKyAiZCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIHNpZ24gamFyIHdpdGggZmlyc3Qga2V5Ci0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLXNpZ25lZGphciIsIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgRklSU1RfS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1NpZ25pbmcoYW5hbHl6ZXIsIEhBU19FWFBJUkVEX0NFUlRfU0lHTklOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIEJBRF9FWFRFTkRFRF9LRVlfVVNBR0VfU0lHTklOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyBhZGQgYSBzZWNvbmQgY2xhc3MgdG8gY3JlYXRlZCBqYXIsIHNvIGl0IGNvbnRhaW5zIHVuc2lnbmVkIGVudHJ5Ci0gICAgICAgIEphclV0aWxzLnVwZGF0ZUphcihTSUdORURfSkFSRklMRSwgVVBEQVRFRF9TSUdORURfSkFSRklMRSwgU0VDT05EX0ZJTEUpOwotCi0gICAgICAgIC8vIHZlcmlmeSBqYXIgd2l0aCBzZWNvbmQga2V5Ci0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgVVBEQVRFRF9TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBTRUNPTkRfS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgMCwgQkFEX0VYVEVOREVEX0tFWV9VU0FHRV9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBIQVNfRVhQSVJFRF9DRVJUX1ZFUklGWUlOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIEhBU19VTlNJR05FRF9FTlRSWV9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBOT1RfU0lHTkVEX0JZX0FMSUFTX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyB2ZXJpZnkgamFyIHdpdGggc2Vjb25kIGtleSBpbiBzdHJpY3QgbW9kZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItc3RyaWN0IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICBVUERBVEVEX1NJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFNFQ09ORF9LRVlfQUxJQVMpOwotCi0gICAgICAgIGludCBleHBlY3RlZEV4aXRDb2RlID0gSEFTX0VYUElSRURfQ0VSVF9FWElUX0NPREUKLSAgICAgICAgICAgICAgICArIEJBRF9FWFRFTkRFRF9LRVlfVVNBR0VfRVhJVF9DT0RFCi0gICAgICAgICAgICAgICAgKyBIQVNfVU5TSUdORURfRU5UUllfRVhJVF9DT0RFCi0gICAgICAgICAgICAgICAgKyBOT1RfU0lHTkVEX0JZX0FMSUFTX0VYSVRfQ09ERTsKLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIGV4cGVjdGVkRXhpdENvZGUsCi0gICAgICAgICAgICAgICAgQkFEX0VYVEVOREVEX0tFWV9VU0FHRV9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBIQVNfRVhQSVJFRF9DRVJUX1ZFUklGWUlOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIEhBU19VTlNJR05FRF9FTlRSWV9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBOT1RfU0lHTkVEX0JZX0FMSUFTX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyB2ZXJpZnkgamFyIHdpdGggbm9uLWV4aXNpdGluZyBhbGlhcwotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFVQREFURURfU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgImJvZ3VzIik7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIEJBRF9FWFRFTkRFRF9LRVlfVVNBR0VfVkVSSUZZSU5HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgSEFTX0VYUElSRURfQ0VSVF9WRVJJRllJTkdfV0FSTklORywKLSAgICAgICAgICAgICAgICBIQVNfVU5TSUdORURfRU5UUllfVkVSSUZZSU5HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgTk9UX1NJR05FRF9CWV9BTElBU19WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGphciB3aXRoIG5vbi1leGlzaXRpbmcgYWxpYXMgaW4gc3RyaWN0IG1vZGUKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgVVBEQVRFRF9TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICAiYm9ndXMiKTsKLQotICAgICAgICBjaGVja1ZlcmlmeWluZyhhbmFseXplciwgZXhwZWN0ZWRFeGl0Q29kZSwKLSAgICAgICAgICAgICAgICBCQURfRVhURU5ERURfS0VZX1VTQUdFX1ZFUklGWUlOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIEhBU19FWFBJUkVEX0NFUlRfVkVSSUZZSU5HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgSEFTX1VOU0lHTkVEX0VOVFJZX1ZFUklGWUlOR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIE5PVF9TSUdORURfQllfQUxJQVNfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTm9UaW1lc3RhbXBUZXN0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL05vVGltZXN0YW1wVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIxNDJhLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTm9UaW1lc3RhbXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBDaGVja3Mgd2FybmluZ3MgaWYgLXRzYSBhbmQgLXRzYWNlcnQgb3B0aW9ucyBhcmUgbm90IHNwZWNpZmllZAotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeSAuLi8KLSAqIEBydW4gbWFpbiBOb1RpbWVzdGFtcFRlc3QKLSAqLwotcHVibGljIGNsYXNzIE5vVGltZXN0YW1wVGVzdCBleHRlbmRzIFRlc3QgewotCi0gICAgLyoqCi0gICAgICogVGhlIHRlc3Qgc2lnbnMgYW5kIHZlcmlmaWVzIGEgamFyIGZpbGUgd2l0aG91dCAtdHNhIGFuZCAtdHNhY2VydCBvcHRpb25zLAotICAgICAqIGFuZCBjaGVja3MgdGhhdCBwcm9wZXIgd2FybmluZ3MgYXJlIHNob3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBOb1RpbWVzdGFtcFRlc3QgdGVzdCA9IG5ldyBOb1RpbWVzdGFtcFRlc3QoKTsKLSAgICAgICAgdGVzdC5zdGFydCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBTdHJpbmcgdGltZXpvbmUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIudGltZXpvbmUiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlRpbWV6b25lID0gJXMiLCB0aW1lem9uZSkpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgb25lIGNsYXNzIGZpbGUKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSk7Ci0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgY2VydGlmaWNhdGUgZXhwaXJhdGlvbiBkYXRlCi0gICAgICAgIERhdGUgZXhwaXJhdGlvbkRhdGUgPSBuZXcgRGF0ZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFZBTElESVRZCi0gICAgICAgICAgICAgICAgKiAyNCAqIDYwICogNjAgKiAxMDAwTCk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIGtleSBwYWlyCi0gICAgICAgIFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChLRVlUT09MLAotICAgICAgICAgICAgICAgICItZ2Vua2V5IiwKLSAgICAgICAgICAgICAgICAiLWFsaWFzIiwgS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVRlc3QiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSk7Ci0KLSAgICAgICAgLy8gc2lnbiBqYXIgZmlsZQotICAgICAgICBPdXRwdXRBbmFseXplciBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi1KLUR1c2VyLnRpbWV6b25lPSIgKyB0aW1lem9uZSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLXNpZ25lZGphciIsIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgS0VZX0FMSUFTKTsKLQotICAgICAgICBTdHJpbmcgd2FybmluZyA9IFN0cmluZy5mb3JtYXQoTk9fVElNRVNUQU1QX1NJR05JTkdfV0FSTl9URU1QTEFURSwKLSAgICAgICAgICAgICAgICBleHBpcmF0aW9uRGF0ZSk7Ci0gICAgICAgIGNoZWNrU2lnbmluZyhhbmFseXplciwgd2FybmluZyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItSi1EdXNlci50aW1lem9uZT0iICsgdGltZXpvbmUsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgd2FybmluZyA9IFN0cmluZy5mb3JtYXQoTk9fVElNRVNUQU1QX1ZFUklGWUlOR19XQVJOX1RFTVBMQVRFLCBleHBpcmF0aW9uRGF0ZSk7Ci0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCAwLCB3YXJuaW5nKTsKLQotICAgICAgICAvLyB2ZXJpZnkgc2lnbmVkIGphciBpbiBzdHJpY3QgbW9kZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi1KLUR1c2VyLnRpbWV6b25lPSIgKyB0aW1lem9uZSwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi1zdHJpY3QiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIHdhcm5pbmcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTm90U2lnbmVkQnlBbGlhc1Rlc3QuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTm90U2lnbmVkQnlBbGlhc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBlZjY4ZS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL05vdFNpZ25lZEJ5QWxpYXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBUZXN0IGZvciBub3RTaWduZWRCeUFsaWFzIHdhcm5pbmcKLSAqIEBsaWJyYXJ5IC9saWIvdGVzdGxpYnJhcnkgLi4vCi0gKiBAcnVuIG1haW4gTm90U2lnbmVkQnlBbGlhc1Rlc3QKLSAqLwotcHVibGljIGNsYXNzIE5vdFNpZ25lZEJ5QWxpYXNUZXN0IGV4dGVuZHMgVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyBzaWduZWQgZW50cmllcwotICAgICAqIHdoaWNoIGFyZSBub3Qgc2lnbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWxpYXMoZXMpIChub3RTaWduZWRCeUFsaWFzKS4KLSAgICAgKiBXYXJuaW5nIG1lc3NhZ2UgaXMgZXhwZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIE5vdFNpZ25lZEJ5QWxpYXNUZXN0IHRlc3QgPSBuZXcgTm90U2lnbmVkQnlBbGlhc1Rlc3QoKTsKLSAgICAgICAgdGVzdC5zdGFydCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBhIGphciBmaWxlIHRoYXQgY29udGFpbnMgb25lIGNsYXNzIGZpbGUKLSAgICAgICAgVXRpbHMuY3JlYXRlRmlsZXMoRklSU1RfRklMRSk7Ci0gICAgICAgIEphclV0aWxzLmNyZWF0ZUphcihVTlNJR05FRF9KQVJGSUxFLCBGSVJTVF9GSUxFKTsKLQotICAgICAgICAvLyBjcmVhdGUgZmlyc3Qga2V5IHBhaXIgZm9yIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBGSVJTVF9LRVlfQUxJQVMsCi0gICAgICAgICAgICAgICAgIi1rZXlhbGciLCBLRVlfQUxHLAotICAgICAgICAgICAgICAgICIta2V5c2l6ZSIsIEludGVnZXIudG9TdHJpbmcoS0VZX1NJWkUpLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItZG5hbWUiLCAiQ049Rmlyc3QiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSkuc2hvdWxkSGF2ZUV4aXRWYWx1ZSgwKTsKLQotICAgICAgICAvLyBjcmVhdGUgZmlyc3Qga2V5IHBhaXIgZm9yIHNpZ25pbmcKLSAgICAgICAgUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEtFWVRPT0wsCi0gICAgICAgICAgICAgICAgIi1nZW5rZXkiLAotICAgICAgICAgICAgICAgICItYWxpYXMiLCBTRUNPTkRfS0VZX0FMSUFTLAotICAgICAgICAgICAgICAgICIta2V5YWxnIiwgS0VZX0FMRywKLSAgICAgICAgICAgICAgICAiLWtleXNpemUiLCBJbnRlZ2VyLnRvU3RyaW5nKEtFWV9TSVpFKSwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWRuYW1lIiwgIkNOPVNlY29uZCIsCi0gICAgICAgICAgICAgICAgIi12YWxpZGl0eSIsIEludGVnZXIudG9TdHJpbmcoVkFMSURJVFkpKS5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotCi0gICAgICAgIC8vIHNpZ24gamFyIHdpdGggZmlyc3Qga2V5Ci0gICAgICAgIE91dHB1dEFuYWx5emVyIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIiwgS0VZU1RPUkUsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MiLCBQQVNTV09SRCwKLSAgICAgICAgICAgICAgICAiLXNpZ25lZGphciIsIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFVOU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgRklSU1RfS0VZX0FMSUFTKTsKLQotICAgICAgICBjaGVja1NpZ25pbmcoYW5hbHl6ZXIpOwotCi0gICAgICAgIC8vIHZlcmlmeSBqYXIgd2l0aCBzZWNvbmQga2V5Ci0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgU0VDT05EX0tFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIE5PVF9TSUdORURfQllfQUxJQVNfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBqYXIgd2l0aCBzZWNvbmQga2V5IGluIHN0cmljdCBtb2RlCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi1zdHJpY3QiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIFNFQ09ORF9LRVlfQUxJQVMpOwotCi0gICAgICAgIGNoZWNrVmVyaWZ5aW5nKGFuYWx5emVyLCBOT1RfU0lHTkVEX0JZX0FMSUFTX0VYSVRfQ09ERSwKLSAgICAgICAgICAgICAgICBOT1RfU0lHTkVEX0JZX0FMSUFTX1ZFUklGWUlOR19XQVJOSU5HKTsKLQotICAgICAgICAvLyB2ZXJpZnkgamFyIHdpdGggbm9uLWV4aXN0aW5nIGFsaWFzCi0gICAgICAgIGFuYWx5emVyID0gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKEpBUlNJR05FUiwKLSAgICAgICAgICAgICAgICAiLXZlcmlmeSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgImJvZ3VzIik7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIE5PVF9TSUdORURfQllfQUxJQVNfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIC8vIHZlcmlmeSBqYXIgd2l0aCBub24tZXhpc3RpbmcgYWxpYXMgaW4gc3RyaWN0IG1vZGUKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXN0cmljdCIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgImJvZ3VzIik7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIE5PVF9TSUdORURfQllfQUxJQVNfRVhJVF9DT0RFLAotICAgICAgICAgICAgICAgIE5PVF9TSUdORURfQllfQUxJQVNfVkVSSUZZSU5HX1dBUk5JTkcpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCBwYXNzZWQiKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvTm90WWV0VmFsaWRDZXJ0VGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9Ob3RZZXRWYWxpZENlcnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NWMyNzguLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9Ob3RZZXRWYWxpZENlcnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuT3V0cHV0QW5hbHl6ZXI7Ci1pbXBvcnQgamRrLnRlc3RsaWJyYXJ5LlByb2Nlc3NUb29sczsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuSmFyVXRpbHM7Ci0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgODAyNDMwMiA4MDI2MDM3Ci0gKiBAc3VtbWFyeSBUZXN0IGZvciBub3RZZXRWYWxpZENlcnQgd2FybmluZwotICogQGxpYnJhcnkgL2xpYi90ZXN0bGlicmFyeSAuLi8KLSAqIEBydW4gbWFpbiBOb3RZZXRWYWxpZENlcnRUZXN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb3RZZXRWYWxpZENlcnRUZXN0IGV4dGVuZHMgVGVzdCB7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGVzdCBzaWducyBhbmQgdmVyaWZpZXMgYSBqYXIgdGhhdCBjb250YWlucyBlbnRyaWVzCi0gICAgICogd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlIGlzIG5vdCB5ZXQgdmFsaWQgKG5vdFlldFZhbGlkQ2VydCkuCi0gICAgICogV2FybmluZyBtZXNzYWdlIGlzIGV4cGVjdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBOb3RZZXRWYWxpZENlcnRUZXN0IHRlc3QgPSBuZXcgTm90WWV0VmFsaWRDZXJ0VGVzdCgpOwotICAgICAgICB0ZXN0LnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc3RhcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLy8gY3JlYXRlIGEgamFyIGZpbGUgdGhhdCBjb250YWlucyBvbmUgY2xhc3MgZmlsZQotICAgICAgICBVdGlscy5jcmVhdGVGaWxlcyhGSVJTVF9GSUxFKTsKLSAgICAgICAgSmFyVXRpbHMuY3JlYXRlSmFyKFVOU0lHTkVEX0pBUkZJTEUsIEZJUlNUX0ZJTEUpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBjZXJ0aWZpY2F0ZSB0aGF0IHdpbGwgYmUgdmFsaWQgb25seSB0b21vcnJvdwotICAgICAgICBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoS0VZVE9PTCwKLSAgICAgICAgICAgICAgICAiLWdlbmtleSIsCi0gICAgICAgICAgICAgICAgIi1hbGlhcyIsIEtFWV9BTElBUywKLSAgICAgICAgICAgICAgICAiLWtleWFsZyIsIEtFWV9BTEcsCi0gICAgICAgICAgICAgICAgIi1rZXlzaXplIiwgSW50ZWdlci50b1N0cmluZyhLRVlfU0laRSksCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSIsIEtFWVNUT1JFLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIiwgUEFTU1dPUkQsCi0gICAgICAgICAgICAgICAgIi1kbmFtZSIsICJDTj1UZXN0IiwKLSAgICAgICAgICAgICAgICAiLXN0YXJ0ZGF0ZSIsICIrMWQiLAotICAgICAgICAgICAgICAgICItdmFsaWRpdHkiLCBJbnRlZ2VyLnRvU3RyaW5nKFZBTElESVRZKSk7Ci0KLSAgICAgICAgLy8gc2lnbiBqYXIKLSAgICAgICAgT3V0cHV0QW5hbHl6ZXIgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICItc2lnbmVkamFyIiwgU0lHTkVEX0pBUkZJTEUsCi0gICAgICAgICAgICAgICAgVU5TSUdORURfSkFSRklMRSwKLSAgICAgICAgICAgICAgICBLRVlfQUxJQVMpOwotCi0gICAgICAgIGNoZWNrU2lnbmluZyhhbmFseXplciwgTk9UX1lFVF9WQUxJRF9DRVJUX1NJR05JTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IHNpZ25lZCBqYXIKLSAgICAgICAgYW5hbHl6ZXIgPSBQcm9jZXNzVG9vbHMuZXhlY3V0ZUNvbW1hbmQoSkFSU0lHTkVSLAotICAgICAgICAgICAgICAgICItdmVyaWZ5IiwKLSAgICAgICAgICAgICAgICAiLXZlcmJvc2UiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIDAsIE5PVF9ZRVRfVkFMSURfQ0VSVF9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgLy8gdmVyaWZ5IGphciBpbiBzdHJpY3QgbW9kZQotICAgICAgICBhbmFseXplciA9IFByb2Nlc3NUb29scy5leGVjdXRlQ29tbWFuZChKQVJTSUdORVIsCi0gICAgICAgICAgICAgICAgIi12ZXJpZnkiLAotICAgICAgICAgICAgICAgICItdmVyYm9zZSIsCi0gICAgICAgICAgICAgICAgIi1zdHJpY3QiLAotICAgICAgICAgICAgICAgICIta2V5c3RvcmUiLCBLRVlTVE9SRSwKLSAgICAgICAgICAgICAgICAiLXN0b3JlcGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgICIta2V5cGFzcyIsIFBBU1NXT1JELAotICAgICAgICAgICAgICAgIFNJR05FRF9KQVJGSUxFLAotICAgICAgICAgICAgICAgIEtFWV9BTElBUyk7Ci0KLSAgICAgICAgY2hlY2tWZXJpZnlpbmcoYW5hbHl6ZXIsIEhBU19FWFBJUkVEX0NFUlRfRVhJVF9DT0RFLAotICAgICAgICAgICAgICAgIE5PVF9ZRVRfVkFMSURfQ0VSVF9WRVJJRllJTkdfV0FSTklORyk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHBhc3NlZCIpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9UZXN0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5Nzg5YS4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotaW1wb3J0IGpkay50ZXN0bGlicmFyeS5PdXRwdXRBbmFseXplcjsKLWltcG9ydCBqZGsudGVzdGxpYnJhcnkuUHJvY2Vzc1Rvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0IHsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9TT1VSQ0VTID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIik7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTRVMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuY2xhc3NlcyIpOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0hPTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QuamRrIik7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlUT09MID0gSkFWQV9IT01FICsgRlMgKyAiYmluIiArIEZTICsgImtleXRvb2wiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSU0lHTkVSID0gSkFWQV9IT01FICsgRlMgKyAiYmluIiArIEZTICsgImphcnNpZ25lciI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNJR05FRF9KQVJGSUxFID0gInVuc2lnbmVkLmphciI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdORURfSkFSRklMRSA9ICJzaWduZWQuamFyIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURURfU0lHTkVEX0pBUkZJTEUgPSAidXBkYXRlZF9zaWduZWQuamFyIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX0ZJTEUgPSAiZmlyc3QudHh0IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09ORF9GSUxFID0gInNlY29uZC50eHQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9USF9LRVlTX0tFWVNUT1JFID0gImJvdGhfa2V5cy5qa3MiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklSU1RfS0VZX0tFWVNUT1JFID0gImZpcnN0X2tleS5qa3MiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1RPUkUgPSAia2V5c3RvcmUuamtzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUX0tFWV9BTElBUyA9ICJmaXJzdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfS0VZX0FMSUFTID0gInNlY29uZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxHID0gIlJTQSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxJQVMgPSAiYWxpYXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VSVF9SRVFVRVNUX0ZJTEVOQU1FID0gInRlc3QucmVxIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENFUlRfRklMRU5BTUUgPSAidGVzdC5jcnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FfS0VZX0FMSUFTID0gImNhIjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEtFWV9TSVpFID0gMjA0ODsKLSAgICBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVQgPSA2ICogNjAgKiAxMDAwOyAgIC8vIGluIG1pbGxpcwotICAgIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFkgPSAzNjU7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkcgPSAiV2FybmluZzoiOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFJTl9OT1RfVkFMSURBVEVEX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzICIKLSAgICAgICAgICAgICsgIndob3NlIGNlcnRpZmljYXRlIGNoYWluIGlzIG5vdCB2YWxpZGF0ZWQuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJQVNfTk9UX0lOX1NUT1JFX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBzaWduZWQgZW50cmllcyAiCi0gICAgICAgICAgICArICJ0aGF0IGFyZSBub3Qgc2lnbmVkIGJ5IGFsaWFzIGluIHRoaXMga2V5c3RvcmUuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX0VYVEVOREVEX0tFWV9VU0FHRV9TSUdOSU5HX1dBUk5JTkcKLSAgICAgICAgICAgID0gIlRoZSBzaWduZXIgY2VydGlmaWNhdGUncyBFeHRlbmRlZEtleVVzYWdlIGV4dGVuc2lvbiAiCi0gICAgICAgICAgICArICJkb2Vzbid0IGFsbG93IGNvZGUgc2lnbmluZy4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBCQURfRVhURU5ERURfS0VZX1VTQUdFX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzIHdob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSdzICIKLSAgICAgICAgICAgICsgIkV4dGVuZGVkS2V5VXNhZ2UgZXh0ZW5zaW9uIGRvZXNuJ3QgYWxsb3cgY29kZSBzaWduaW5nLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9LRVlfVVNBR0VfU0lHTklOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGUgc2lnbmVyIGNlcnRpZmljYXRlJ3MgS2V5VXNhZ2UgZXh0ZW5zaW9uICIKLSAgICAgICAgICAgICsgImRvZXNuJ3QgYWxsb3cgY29kZSBzaWduaW5nLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9LRVlfVVNBR0VfVkVSSUZZSU5HX1dBUk5JTkcKLSAgICAgICAgICAgID0gIlRoaXMgamFyIGNvbnRhaW5zIGVudHJpZXMgd2hvc2Ugc2lnbmVyIGNlcnRpZmljYXRlJ3MgS2V5VXNhZ2UgIgotICAgICAgICAgICAgKyAiZXh0ZW5zaW9uIGRvZXNuJ3QgYWxsb3cgY29kZSBzaWduaW5nLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBRF9ORVRTQ0FQRV9DRVJUX1RZUEVfU0lHTklOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGUgc2lnbmVyIGNlcnRpZmljYXRlJ3MgTmV0c2NhcGVDZXJ0VHlwZSBleHRlbnNpb24gIgotICAgICAgICAgICAgKyAiZG9lc24ndCBhbGxvdyBjb2RlIHNpZ25pbmcuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFEX05FVFNDQVBFX0NFUlRfVFlQRV9WRVJJRllJTkdfV0FSTklORwotICAgICAgICAgICAgPSAiVGhpcyBqYXIgY29udGFpbnMgZW50cmllcyAiCi0gICAgICAgICAgICArICJ3aG9zZSBzaWduZXIgY2VydGlmaWNhdGUncyBOZXRzY2FwZUNlcnRUeXBlIGV4dGVuc2lvbiAiCi0gICAgICAgICAgICArICJkb2Vzbid0IGFsbG93IGNvZGUgc2lnbmluZy4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFJTl9OT1RfVkFMSURBVEVEX1NJR05JTkdfV0FSTklORwotICAgICAgICAgICAgPSAiVGhlIHNpZ25lcidzIGNlcnRpZmljYXRlIGNoYWluIGlzIG5vdCB2YWxpZGF0ZWQuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX0VYUElSSU5HX0NFUlRfU0lHTklOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGUgc2lnbmVyIGNlcnRpZmljYXRlIHdpbGwgZXhwaXJlIHdpdGhpbiBzaXggbW9udGhzLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEhBU19FWFBJUklOR19DRVJUX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzICIKLSAgICAgICAgICAgICsgIndob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSB3aWxsIGV4cGlyZSB3aXRoaW4gc2l4IG1vbnRocy4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfRVhQSVJFRF9DRVJUX1NJR05JTkdfV0FSTklORwotICAgICAgICAgICAgPSAiVGhlIHNpZ25lciBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfRVhQSVJFRF9DRVJUX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzIHdob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSBoYXMgZXhwaXJlZC4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfVU5TSUdORURfRU5UUllfVkVSSUZZSU5HX1dBUk5JTkcKLSAgICAgICAgICAgID0gIlRoaXMgamFyIGNvbnRhaW5zIHVuc2lnbmVkIGVudHJpZXMgIgotICAgICAgICAgICAgKyAid2hpY2ggaGF2ZSBub3QgYmVlbiBpbnRlZ3JpdHktY2hlY2tlZC4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfU0lHTkVEX0JZX0FMSUFTX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBzaWduZWQgZW50cmllcyAiCi0gICAgICAgICAgICArICJ3aGljaCBhcmUgbm90IHNpZ25lZCBieSB0aGUgc3BlY2lmaWVkIGFsaWFzKGVzKS4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT19USU1FU1RBTVBfU0lHTklOR19XQVJOX1RFTVBMQVRFCi0gICAgICAgICAgICA9ICJObyAtdHNhIG9yIC10c2FjZXJ0IGlzIHByb3ZpZGVkICIKLSAgICAgICAgICAgICsgImFuZCB0aGlzIGphciBpcyBub3QgdGltZXN0YW1wZWQuICIKLSAgICAgICAgICAgICsgIldpdGhvdXQgYSB0aW1lc3RhbXAsIHVzZXJzIG1heSBub3QgYmUgYWJsZSB0byB2YWxpZGF0ZSB0aGlzIGphciAiCi0gICAgICAgICAgICArICJhZnRlciB0aGUgc2lnbmVyIGNlcnRpZmljYXRlJ3MgZXhwaXJhdGlvbiBkYXRlICIKLSAgICAgICAgICAgICsgIiglMSR0WS0lMSR0bS0lMSR0ZCkgb3IgYWZ0ZXIgYW55IGZ1dHVyZSByZXZvY2F0aW9uIGRhdGUuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fVElNRVNUQU1QX1ZFUklGWUlOR19XQVJOX1RFTVBMQVRFCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBzaWduYXR1cmVzIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIHRpbWVzdGFtcC4gIgotICAgICAgICAgICAgKyAiV2l0aG91dCBhIHRpbWVzdGFtcCwgdXNlcnMgbWF5IG5vdCBiZSBhYmxlIHRvIHZhbGlkYXRlIHRoaXMgamFyICIKLSAgICAgICAgICAgICsgImFmdGVyIHRoZSBzaWduZXIgY2VydGlmaWNhdGUncyBleHBpcmF0aW9uIGRhdGUgIgotICAgICAgICAgICAgKyAiKCUxJHRZLSUxJHRtLSUxJHRkKSBvciBhZnRlciBhbnkgZnV0dXJlIHJldm9jYXRpb24gZGF0ZS4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfWUVUX1ZBTElEX0NFUlRfU0lHTklOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGUgc2lnbmVyIGNlcnRpZmljYXRlIGlzIG5vdCB5ZXQgdmFsaWQuIjsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX1lFVF9WQUxJRF9DRVJUX1ZFUklGWUlOR19XQVJOSU5HCi0gICAgICAgICAgICA9ICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzICIKLSAgICAgICAgICAgICsgIndob3NlIHNpZ25lciBjZXJ0aWZpY2F0ZSBpcyBub3QgeWV0IHZhbGlkLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9TSUdORUQgPSAiamFyIHNpZ25lZC4iOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfVkVSSUZJRUQgPSAiamFyIHZlcmlmaWVkLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9WRVJJRklFRF9XSVRIX1NJR05FUl9FUlJPUlMKLSAgICAgICAgICAgID0gImphciB2ZXJpZmllZCwgd2l0aCBzaWduZXIgZXJyb3JzLiI7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENIQUlOX05PVF9WQUxJREFURURfRVhJVF9DT0RFID0gNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEhBU19FWFBJUkVEX0NFUlRfRVhJVF9DT0RFID0gNDsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBRF9LRVlfVVNBR0VfRVhJVF9DT0RFID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBRF9FWFRFTkRFRF9LRVlfVVNBR0VfRVhJVF9DT0RFID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJBRF9ORVRTQ0FQRV9DRVJUX1RZUEVfRVhJVF9DT0RFID0gODsKLSAgICBzdGF0aWMgZmluYWwgaW50IEhBU19VTlNJR05FRF9FTlRSWV9FWElUX0NPREUgPSAxNjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEFMSUFTX05PVF9JTl9TVE9SRV9FWElUX0NPREUgPSAzMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PVF9TSUdORURfQllfQUxJQVNfRVhJVF9DT0RFID0gMzI7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1ZlcmlmeWluZyhPdXRwdXRBbmFseXplciBhbmFseXplciwgaW50IGV4cGVjdGVkRXhpdENvZGUsCi0gICAgICAgICAgICBTdHJpbmcuLi4gd2FybmluZ3MpIHsKLSAgICAgICAgYW5hbHl6ZXIuc2hvdWxkSGF2ZUV4aXRWYWx1ZShleHBlY3RlZEV4aXRDb2RlKTsKLSAgICAgICAgZm9yIChTdHJpbmcgd2FybmluZyA6IHdhcm5pbmdzKSB7Ci0gICAgICAgICAgICBhbmFseXplci5zaG91bGRDb250YWluKHdhcm5pbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBhbmFseXplci5zaG91bGRDb250YWluKFdBUk5JTkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHBlY3RlZEV4aXRDb2RlID09IDApIHsKLSAgICAgICAgICAgIGFuYWx5emVyLnNob3VsZENvbnRhaW4oSkFSX1ZFUklGSUVEKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFuYWx5emVyLnNob3VsZENvbnRhaW4oSkFSX1ZFUklGSUVEX1dJVEhfU0lHTkVSX0VSUk9SUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1NpZ25pbmcoT3V0cHV0QW5hbHl6ZXIgYW5hbHl6ZXIsIFN0cmluZy4uLiB3YXJuaW5ncykgewotICAgICAgICBhbmFseXplci5zaG91bGRIYXZlRXhpdFZhbHVlKDApOwotICAgICAgICBmb3IgKFN0cmluZyB3YXJuaW5nIDogd2FybmluZ3MpIHsKLSAgICAgICAgICAgIGFuYWx5emVyLnNob3VsZENvbnRhaW4od2FybmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGFuYWx5emVyLnNob3VsZENvbnRhaW4oV0FSTklORyk7Ci0gICAgICAgIH0KLSAgICAgICAgYW5hbHl6ZXIuc2hvdWxkQ29udGFpbihKQVJfU0lHTkVEKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT3V0cHV0QW5hbHl6ZXIga2V5dG9vbChTdHJpbmcuLi4gY21kKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgcmV0dXJuIHRvb2woS0VZVE9PTCwgY21kKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT3V0cHV0QW5hbHl6ZXIgamFyc2lnbmVyKFN0cmluZy4uLiBjbWQpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICByZXR1cm4gdG9vbChKQVJTSUdORVIsIGNtZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPdXRwdXRBbmFseXplciB0b29sKFN0cmluZyB0b29sLCBTdHJpbmcuLi4gYXJncykgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjbWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgY21kLmFkZCh0b29sKTsKLSAgICAgICAgY21kLmFkZCgiLUotRHVzZXIubGFuZ3VhZ2U9ZW4iKTsKLSAgICAgICAgY21kLmFkZCgiLUotRHVzZXIuY291bnRyeT1VUyIpOwotICAgICAgICBjbWQuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykpOwotICAgICAgICByZXR1cm4gUHJvY2Vzc1Rvb2xzLmV4ZWN1dGVDb21tYW5kKGNtZC50b0FycmF5KG5ldyBTdHJpbmdbY21kLnNpemUoKV0pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL2JhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuamtzLmJhc2U2NCBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5qa3MuYmFzZTY0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZkNWZmLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvd2FybmluZ3MvYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5qa3MuYmFzZTY0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotL3UzKzdRQUFBQUlBQUFBQkFBQUFBUUFGWVd4cFlYTUFBQUZCcGt3VzBnQUFBcjB3Z2dLNU1BNEdDaXNHQVFRQgotS2dJUkFRRUZBQVNDQXFXa0dKM1BQalltV05LclYyM1kxdTQxM1JNQWtyUlorMU9MV1lSY1F0NGp0eHRJeUVINQotSG81YjlkeTlYTjlGQktsVE9ENGMyUGMxVDQzQkxLWGV1THUzdUxMZUl4Z1hGdDB6OUNMeUd3ZFlaWjc1MWtYcgotRFE5OXFZNmFOUVVPNlNlRTRXZHR5MEtQQXFpZDZaSjhiRjdUNndzVFpTdk5oYUJSenlGeWRFZkc3YmJVWWpPbAotbVdDNDRubHN1NlZFVTNvOVJRcGNtMWdJTXdyYWRPYUlWVC9Ib0IyYkttQXY4Z0hxSTZrcmVpRVp3VGRaa1NBSQotSVJpMnZ0MVJQbGxYdDVoZ2pEeFVmWmU4WE9ZWXdlUjRWdDIvalZ1S0xKODBETlR1LzlTZVVEODh6UUF6NTNrNAotcjNuUmh2NlRSY1BtNnRWL0ZoOTJYTEhpc2tMK1RBelRmbStiVUF1ZFBDQ1Z4Tit5UnR4dkFnQStVaGRWL1N1TQotWm41RjZucm1QK1lKRzFobXByZ0NKSUpKYUNFWGE5UlhZQyt2SVZwTzBXVk5SdUdsR20rLzFhZm5PdVFDOFdzcwotU2hYd2prYXFUd0FocUJGcTdlWW1tUDhCSzNnZmxZcnQyekRMWHZobDRuZFZ2TWhNdGhGSjNadkxoMkxXcHFMSQotL244RU1DZjhVUzNsSUVGazlEVEhCWmpmZmlIa3FLMmU3K0ZYRXBHM3hyZ0U2WllMTWRiZDVQYjNZalpmaFF4KwotWlR0aUVGellTYUVHaGFjZWsvbTdkUnExcW13Z0ZzeXRuZzJPZFdaZTJsbjhMSlkwb2RyMWRHVWZKSGZnYWZ2aQotdGxmYmtnL3Jnak9OdHdsaUNoRGdnYmtVd25lcnJqL0QvenJkRXVmVXZmeWx0U3NoaEhYUk5ERDNmSDZzcG1FawotaEhLZ3hFYzR5dnhxSnh6ZE1HdHVpYjM1NWFTZk5lZ3lsK0dzbnNLelhRQ1ZFSzJoM0JMVFFPYnphRCs4TloxMgotTFFIdmJyQ2lhUzM0dnhKM3JFQythK1NXN2l0WnAwYUNkWE1XZE1KTmtSS3F5TEJEM3ZHM3pOMDVzTjNYcmhFTQotOEJSVDAyMFRXWTAwdGJWRmJiQkZoZVlMUVJnVGpyUXRyMFl0NlVIV0JaYzROMjBjckRMY1NINWdxY0NPVnBsYQotMVkydXFGRW44eXFyR1J3bi9rZ2ZOZ0FBQUFFQUJWZ3VOVEE1QUFBQnRUQ0NBYkV3Z2dFYW9BTUNBUUlDQ1FESAotY0V1VnZ6Q3VxekFOQmdrcWhraUc5dzBCQVFVRkFEQVBNUTB3Q3dZRFZRUUREQVJVWlhOME1CNFhEVEV6TVRBeAotTVRBMk5UVXdObG9YRFRJek1UQXdPVEEyTlRVd05sb3dEekVOTUFzR0ExVUVBd3dFVkdWemREQ0JuekFOQmdrcQotaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQThoT2ZwMkRjbnZ0Ly9aWlFBamE5VFJpd0txWFZTK1RpWUUzUwotZ25nQ0JqSWkrWVlkbzBEc1VlTzVNQmZFNnV2Q1dPcjVsd0FSL3UxaWFKT2hJb0dKRGlHb1Bhc1psdCt5SWd0UgotTHpBN2oycSsxcTZrY3dpVnhmaWtJM2FVZ0hWL1FzeWJUcmlUNEJmN1RRTkt0SkcyM01RYTRzRDcrUGp0Q1dENwotcDNjSFRma0NBd0VBQWFNVk1CTXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnZUFNQTBHQ1NxR1NJYjNEUUVCQlFVQQotQTRHQkFLb0RsVEo4d0xSQTdHOFhkR200Z3Y3MzNuMWNTUXpsa2NzamZPTzYvbUE1SnZ1OHR5Rk5xOUhUZjlBVAotVlhicmJHY1VZSmpoelNTWTN3NWFwWEsxa1h5cVRCMUxVTkVKNDVXbm1jaXFTU2VjVlRwSno5VHVlZ3lvWDBaZgotSFNjU2dxZkRtanFvaWlGaU5DZ24zWkVKODV5a0d2b0ZZR0grcGhwK0JWaTNTMGJqNUUvalJweVYzdk5uaWkvUwotd0pEU0FYRjZiWVU9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL2JhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuc2ggYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL3dhcm5pbmdzL2JhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZmU5MWUuLjAwMDAwMDAKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci93YXJuaW5ncy9iYWRfbmV0c2NhcGVfY2VydF90eXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0jIS9iaW4vc2gKLQotIyBUaGlzIHNjcmlwdCBjcmVhdGVzIEpLUyBrZXlzdG9yZSB3aXRoIGEgY2VydGlmaWNhdGUKLSMgdGhhdCBjb250YWlucyBOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBUeXBlIGV4dGVuc2lvbgotIyB0aGF0IGRvZXMgbm90IGFsbG93IGNvZGUgc2lnbmluZwotIyBUaGUga2V5c3RvcmUgaXMgdXNlZCBieSBCYWROZXRzY2FwZUNlcnRUeXBlVGVzdC5qYXZhIHRlc3QKLQotcm0gLXJmIGtleXN0b3JlLmprcwotZWNobyAibnNDZXJ0VHlwZSA9IGNsaWVudCIgPiBleHQuY2ZnCi0KLW9wZW5zc2wgcmVxIC1uZXcgLW91dCBjZXJ0LnJlcSAta2V5b3V0IGtleS5wZW0gLWRheXMgMzY1MCBcCi0gICAgLXBhc3NpbiBwYXNzOnBhc3N3b3JkIC1wYXNzb3V0IHBhc3M6cGFzc3dvcmQgLXN1YmogIi9DTj1UZXN0Igotb3BlbnNzbCB4NTA5IC1pbiBjZXJ0LnJlcSAtb3V0IGNlcnQucGVtIC1yZXEgLXNpZ25rZXkga2V5LnBlbSAtZGF5cyAzNjUwIFwKLSAgICAtcGFzc2luIHBhc3M6cGFzc3dvcmQgLWV4dGZpbGUgZXh0LmNmZwotb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtaW4gY2VydC5wZW0gLWlua2V5IGtleS5wZW0gLW91dCBrZXlzdG9yZS5wMTIgXAotICAgIC1wYXNzaW4gcGFzczpwYXNzd29yZCAtcGFzc291dCBwYXNzOnBhc3N3b3JkIC1uYW1lIGFsaWFzCi0KLSR7SkFWQV9IT01FfS9iaW4va2V5dG9vbCAtaW1wb3J0a2V5c3RvcmUgXAotICAgIC1zcmNrZXlzdG9yZSBrZXlzdG9yZS5wMTIgLXNyY3N0b3JldHlwZSBwa2NzMTIgXAotICAgIC1zcmNzdG9yZXBhc3MgcGFzc3dvcmQgLWFsaWFzIGFsaWFzIFwKLSAgICAtZGVzdGtleXN0b3JlIGJhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuamtzIC1kZXN0c3RvcmV0eXBlIGprcyBcCi0gICAgLWRlc3RzdG9yZXBhc3MgcGFzc3dvcmQgLWRlc3RhbGlhcyBhbGlhcyBcCi0KLW9wZW5zc2wgYmFzZTY0IDwgYmFkX25ldHNjYXBlX2NlcnRfdHlwZS5qa3MgPiBiYWRfbmV0c2NhcGVfY2VydF90eXBlLmprcy5iYXNlNjQKLXJtIC1yZiBjZXJ0LnJlcSBrZXkucGVtIGNlcnQucGVtIGtleXN0b3JlLnAxMiBleHQuY2ZnIGJhZF9uZXRzY2FwZV9jZXJ0X3R5cGUuamtzCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YSBiL2pkay90ZXN0L3N1bi90ZXh0L3Jlc291cmNlcy9Mb2NhbGVEYXRhCmluZGV4IGRmNzhjODMuLmE4MGMxMjkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi90ZXh0L3Jlc291cmNlcy9Mb2NhbGVEYXRhCisrKyBiL2pkay90ZXN0L3N1bi90ZXh0L3Jlc291cmNlcy9Mb2NhbGVEYXRhCkBAIC04Mjg3LDYgKzgyODcsMyBAQAogCiAjIGJ1ZyAjODA3NTE3MwogRm9ybWF0RGF0YS9kZS9zdGFuZGFsb25lLk1vbnRoQWJicmV2aWF0aW9ucy8yPU1cdTAwZTRyCi0KLSMgYnVnICM4MTI5MzYxCi1DdXJyZW5jeU5hbWVzLy9ocms9S3VuYQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3RleHQvcmVzb3VyY2VzL0xvY2FsZURhdGFUZXN0LmphdmEgYi9qZGsvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YVRlc3QuamF2YQppbmRleCBjMDVmOWU1Li40NGY5NGU3IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YVRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vdGV4dC9yZXNvdXJjZXMvTG9jYWxlRGF0YVRlc3QuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogICogICAgICA2OTE5NjI0IDY5OTgzOTEgNzAxOTI2NyA3MDIwOTYwIDcwMjU4MzcgNzAyMDU4MyA3MDM2OTA1IDcwNjYyMDMgNzEwMTQ5NQogICogICAgICA3MDAzMTI0IDcwODU3NTcgNzAyODA3MyA3MTcxMDI4IDcxODk2MTEgODAwMDk4MyA3MTk1NzU5IDgwMDQ0ODkgODAwNjUwOQogICogICAgICA3MTE0MDUzIDcwNzQ4ODIgNzA0MDU1NiA4MDEzODM2IDgwMjExMjEgNjE5MjQwNyA2OTMxNTY0IDgwMjc2OTUgNzA5MDgyNgotICogICAgICA4MDE3MTQyIDgwMzczNDMgODA1NTIyMiA4MDQyMTI2IDgwNzQ3OTEgODA3NTE3MyA4MDgwNzc0IDgxMjkzNjEKKyAqICAgICAgODAxNzE0MiA4MDM3MzQzIDgwNTUyMjIgODA0MjEyNiA4MDc0NzkxIDgwNzUxNzMgODA4MDc3NAogICogQHN1bW1hcnkgVmVyaWZ5IGxvY2FsZSBkYXRhCiAgKgogICovCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vdG9vbHMvbmF0aXZlMmFzY2lpL05hdGl2ZTJBc2NpaVRlc3RzLnNoIGIvamRrL3Rlc3Qvc3VuL3Rvb2xzL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlUZXN0cy5zaAppbmRleCA1Yzg4NmMyLi5mNjU2YmJjIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vdG9vbHMvbmF0aXZlMmFzY2lpL05hdGl2ZTJBc2NpaVRlc3RzLnNoCisrKyBiL2pkay90ZXN0L3N1bi90b29scy9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpVGVzdHMuc2gKQEAgLTI0LDcgKzI0LDcgQEAKICMKIAogIyBAdGVzdAotIyBAYnVnIDQ2MzA0NjMgNDYzMDk3MSA0NjM2NDQ4IDQ3MDE2MTcgNDcyMTI5NiA0NzEwODkwIDYyNDc4MTcgNzAyMTk4NyA4MDY3OTY0CisjIEBidWcgNDYzMDQ2MyA0NjMwOTcxIDQ2MzY0NDggNDcwMTYxNyA0NzIxMjk2IDQ3MTA4OTAgNjI0NzgxNyA3MDIxOTg3CiAjIEBzdW1tYXJ5IFRlc3RzIG1pc2NlbGxhbmVvdXMgbmF0aXZlMmFzY2lpIGJ1Z2ZpeGVzIGFuZCByZWdyZXNzaW9ucwogCiAKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9WRVJTSU9OIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL1ZFUlNJT04KaW5kZXggZjU4N2NiNy4uNmJmMzY2MSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL1ZFUlNJT04KKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL1ZFUlNJT04KQEAgLTIxLDQgKzIxLDQgQEAKICMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQogIyBxdWVzdGlvbnMuCiAjCi10emRhdGEyMDE2ZwordHpkYXRhMjAxNmYKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hZnJpY2EgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYWZyaWNhCmluZGV4IGNiZGUyMzguLmI1MjNkYzMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hZnJpY2EKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2FmcmljYQpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAjIGh0dHA6Ly93d3cubGlieWFoZXJhbGQuY29tLzIwMTMvMTAvMjQvY29ycmVjdGlvbi1uby10aW1lLWNoYW5nZS10b21vcnJvdy8KICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxMy0xMC0yNSk6Ci0jIEZvciBub3csIGFzc3VtZSB0aGV5J3JlIHJldmVydGluZyB0byB0aGUgcHJlLTIwMTIgcnVsZXMgb2YgcGVybWFuZW50IFVUICswMi4KKyMgRm9yIG5vdywgYXNzdW1lIHRoZXkncmUgcmV2ZXJ0aW5nIHRvIHRoZSBwcmUtMjAxMiBydWxlcyBvZiBwZXJtYW5lbnQgVVRDKzIuCiAKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCUxpYnlhCTE5NTEJb25seQktCU9jdAkxNAkyOjAwCTE6MDAJUwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2FudGFyY3RpY2EgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYW50YXJjdGljYQppbmRleCBmOTY5NDdhLi5lMTJjNzY0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYW50YXJjdGljYQorKysgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYW50YXJjdGljYQpAQCAtMzMsNyArMzMsOSBAQAogIyBodHRwOi8vd3d3LnNwcmkuY2FtLmFjLnVrL2JvYi9wZXJpYW50Lmh0bQogIyBmb3IgaW5mb3JtYXRpb24uCiAjIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCB3ZSBoYXZlIG5vIHRpbWUgem9uZSBpbmZvcm1hdGlvbi4KLQorIworIyBFeGNlcHQgZm9yIHRoZSBGcmVuY2ggZW50cmllcywKKyMgSSBtYWRlIHVwIGFsbCB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucyBtZW50aW9uZWQgaGVyZTsgY29ycmVjdGlvbnMgd2VsY29tZSEKICMgRk9STUFUIGlzICctMDAnIGFuZCBHTVRPRkYgaXMgMCBmb3IgbG9jYXRpb25zIHdoaWxlIHVuaW5oYWJpdGVkLgogCiAjIEFyZ2VudGluYSAtIHllYXItcm91bmQgYmFzZXMKQEAgLTUwLDcgKzUyLDcgQEAKICMJcHJldmlvdXNseSBzZWFsZXJzIGFuZCBzY2llbnRpZmljIHBlcnNvbm5lbCB3aW50ZXJlZAogIwlNYXJnYXJldCBUdXJuZXIgcmVwb3J0cwogIwlodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTIwNDIyMjI0NS9odHRwOi8vd3d3LmRzdGMucXV0LmVkdS5hdS9EU1QvbWFyZy9kYXlsaWdodC5odG1sCi0jCSgxOTk5LTA5LTMwKSB0aGF0IHRoZXkncmUgVVQgKzA1LCB3aXRoIG5vIERTVDsKKyMJKDE5OTktMDktMzApIHRoYXQgdGhleSdyZSBVVEMrNSwgd2l0aCBubyBEU1Q7CiAjCXByZXN1bWFibHkgdGhpcyBpcyB3aGVuIHRoZXkgaGF2ZSB2aXNpdG9ycy4KICMKICMgeWVhci1yb3VuZCBiYXNlcwpAQCAtODksMjIgKzkxLDIzIEBACiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9DYXNleQkwCS0JLTAwCTE5NjkKLQkJCTg6MDAJLQkrMDgJMjAwOSBPY3QgMTggIDI6MDAKLQkJCTExOjAwCS0JKzExCTIwMTAgTWFyICA1ICAyOjAwCi0JCQk4OjAwCS0JKzA4CTIwMTEgT2N0IDI4ICAyOjAwCi0JCQkxMTowMAktCSsxMQkyMDEyIEZlYiAyMSAxNzowMHUKLQkJCTg6MDAJLQkrMDgKKwkJCTg6MDAJLQlBV1NUCTIwMDkgT2N0IDE4ICAyOjAwCisJCQkJCQkjIEF1c3RyYWxpYW4gV2VzdGVybiBTdGQgVGltZQorCQkJMTE6MDAJLQlDQVNUCTIwMTAgTWFyICA1ICAyOjAwICAjIENhc2V5IFRpbWUKKwkJCTg6MDAJLQlBV1NUCTIwMTEgT2N0IDI4ICAyOjAwCisJCQkxMTowMAktCUNBU1QJMjAxMiBGZWIgMjEgMTc6MDB1CisJCQk4OjAwCS0JQVdTVAogWm9uZSBBbnRhcmN0aWNhL0RhdmlzCTAJLQktMDAJMTk1NyBKYW4gMTMKLQkJCTc6MDAJLQkrMDcJMTk2NCBOb3YKKwkJCTc6MDAJLQlEQVZUCTE5NjQgTm92ICAgICMgRGF2aXMgVGltZQogCQkJMAktCS0wMAkxOTY5IEZlYgotCQkJNzowMAktCSswNwkyMDA5IE9jdCAxOCAgMjowMAotCQkJNTowMAktCSswNQkyMDEwIE1hciAxMCAyMDowMHUKLQkJCTc6MDAJLQkrMDcJMjAxMSBPY3QgMjggIDI6MDAKLQkJCTU6MDAJLQkrMDUJMjAxMiBGZWIgMjEgMjA6MDB1Ci0JCQk3OjAwCS0JKzA3CisJCQk3OjAwCS0JREFWVAkyMDA5IE9jdCAxOCAgMjowMAorCQkJNTowMAktCURBVlQJMjAxMCBNYXIgMTAgMjA6MDB1CisJCQk3OjAwCS0JREFWVAkyMDExIE9jdCAyOCAgMjowMAorCQkJNTowMAktCURBVlQJMjAxMiBGZWIgMjEgMjA6MDB1CisJCQk3OjAwCS0JREFWVAogWm9uZSBBbnRhcmN0aWNhL01hd3NvbgkwCS0JLTAwCTE5NTQgRmViIDEzCi0JCQk2OjAwCS0JKzA2CTIwMDkgT2N0IDE4ICAyOjAwCi0JCQk1OjAwCS0JKzA1CisJCQk2OjAwCS0JTUFXVAkyMDA5IE9jdCAxOCAgMjowMCAjIE1hd3NvbiBUaW1lCisJCQk1OjAwCS0JTUFXVAogIyBSZWZlcmVuY2VzOgogIyBDYXNleSBXZWF0aGVyICgxOTk4LTAyLTI2KQogIyBodHRwOi8vd3d3LmFudGRpdi5nb3YuYXUvYWFkL2V4b3Avc2ZvL2Nhc2V5L2Nhc2V5X2F3cy5odG1sCkBAIC0xNTgsNyArMTYxLDcgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgSW5kaWFuL0tlcmd1ZWxlbgkwCS0JLTAwCTE5NTAgIyBQb3J0LWF1eC1GcmFuw6dhaXMKLQkJCTU6MDAJLQkrMDUKKwkJCTU6MDAJLQlURlQJIyBJU08gY29kZSBURiBUaW1lCiAjCiAjIHllYXItcm91bmQgYmFzZSBpbiB0aGUgbWFpbiBjb250aW5lbnQKICMgRHVtb250IGQnVXJ2aWxsZSwgw45sZSBkZXMgUMOpdHJlbHMsIC02NjQwKzE0MDAxLCBzaW5jZSAxOTU2LTExCkBAIC0xNjksOSArMTcyLDkgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9EdW1vbnREVXJ2aWxsZSAwIC0JLTAwCTE5NDcKLQkJCTEwOjAwCS0JKzEwCTE5NTIgSmFuIDE0CisJCQkxMDowMAktCVBNVAkxOTUyIEphbiAxNCAjIFBvcnQtTWFydGluIFRpbWUKIAkJCTAJLQktMDAJMTk1NiBOb3YKLQkJCTEwOjAwCS0JKzEwCisJCQkxMDowMAktCUREVVQJIyBEdW1vbnQtZCdVcnZpbGxlIFRpbWUKIAogIyBGcmFuY2UgJiBJdGFseSAtIHllYXItcm91bmQgYmFzZQogIyBDb25jb3JkaWEsIC03NTA2MDArMTIzMjAwMCwgc2luY2UgMjAwNQpAQCAtMTk3LDcgKzIwMCw3IEBACiAjIHN0YXRpb24gb2YgSmFwYW4sIGl0J3MgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcmluY2lwYWwgbG9jYXRpb24uCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lIEFudGFyY3RpY2EvU3lvd2EJMAktCS0wMAkxOTU3IEphbiAyOQotCQkJMzowMAktCSswMworCQkJMzowMAktCVNZT1QJIyBTeW93YSBUaW1lCiAjIFNlZToKICMgTklQUiBBbnRhcmN0aWMgUmVzZWFyY2ggQWN0aXZpdGllcyAoMTk5OS0wOC0xNykKICMgaHR0cDovL3d3dy5uaXByLmFjLmpwL2VuZ2xpc2gvYXJhMDEuaHRtbApAQCAtMjM0LDE3ICsyMzcsMTcgQEAKICMgY29ycmVjdCwgYnV0IHRoZXkgc2hvdWxkIGJlIHF1aXRlIGNsb3NlIHRvIHRoZSBhY3R1YWwgZGF0ZXMuCiAjCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTQtMDMtMjEpOgotIyBUaGUgQ0VULXN3aXRjaGluZyBUcm9sbCBydWxlcyByZXF1aXJlIHppYyBmcm9tIHR6IDIwMTRiIG9yIGxhdGVyLCBzbyBhcworIyBUaGUgQ0VULXN3aXRjaGluZyBUcm9sbCBydWxlcyByZXF1aXJlIHppYyBmcm9tIHR6Y29kZSAyMDE0YiBvciBsYXRlciwgc28gYXMKICMgc3VnZ2VzdGVkIGJ5IEJlbmd0LUluZ2UgTGFyc3NvbiBjb21tZW50IHRoZW0gb3V0IGZvciBub3csIGFuZCBhcHByb3hpbWF0ZQogIyB3aXRoIG9ubHkgVVRDIGFuZCBDRVNULiAgVW5jb21tZW50IHRoZW0gd2hlbiAyMDE0YiBpcyBtb3JlIHByZXZhbGVudC4KICMKICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCi0jUnVsZQlUcm9sbAkyMDA1CW1heAktCU1hcgkgMQkxOjAwdQkxOjAwCSswMQotUnVsZQlUcm9sbAkyMDA1CW1heAktCU1hcglsYXN0U3VuCTE6MDB1CTI6MDAJKzAyCi0jUnVsZQlUcm9sbAkyMDA1CW1heAktCU9jdAlsYXN0U3VuCTE6MDB1CTE6MDAJKzAxCi0jUnVsZQlUcm9sbAkyMDA0CW1heAktCU5vdgkgNwkxOjAwdQkwOjAwCSswMAorI1J1bGUJVHJvbGwJMjAwNQltYXgJLQlNYXIJIDEJMTowMHUJMTowMAlDRVQKK1J1bGUJVHJvbGwJMjAwNQltYXgJLQlNYXIJbGFzdFN1bgkxOjAwdQkyOjAwCUNFU1QKKyNSdWxlCVRyb2xsCTIwMDUJbWF4CS0JT2N0CWxhc3RTdW4JMTowMHUJMTowMAlDRVQKKyNSdWxlCVRyb2xsCTIwMDQJbWF4CS0JTm92CSA3CTE6MDB1CTA6MDAJVVRDCiAjIFJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUgd2hlbiB1bmNvbW1lbnRpbmcgdGhlIGFib3ZlICcjUnVsZScgbGluZXMuCi1SdWxlCVRyb2xsCTIwMDQJbWF4CS0JT2N0CWxhc3RTdW4JMTowMHUJMDowMAkrMDAKK1J1bGUJVHJvbGwJMjAwNAltYXgJLQlPY3QJbGFzdFN1bgkxOjAwdQkwOjAwCVVUQwogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZSBBbnRhcmN0aWNhL1Ryb2xsCTAJLQktMDAJMjAwNSBGZWIgMTIKIAkJCTA6MDAJVHJvbGwJJXMKQEAgLTI4NSwxMCArMjg4LDEwIEBACiAjIGNoYW5nZXMgZHVyaW5nIHRoZSB5ZWFyIGFuZCBkb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIG1lYW4KICMgc29sYXIgbm9vbi4gIFNvIHRoZSBWb3N0b2sgdGltZSBtaWdodCBoYXZlIGJlZW4gd2hhdGV2ZXIgdGhlIGNsb2NrcwogIyBoYXBwZW5lZCB0byBiZSBkdXJpbmcgdGhlaXIgdmlzaXQuICBTbyB3ZSBzdGlsbCBkb24ndCByZWFsbHkga25vdyB3aGF0IHRpbWUKLSMgaXQgaXMgYXQgVm9zdG9rLiAgQnV0IHdlJ2xsIGd1ZXNzICswNi4KKyMgaXQgaXMgYXQgVm9zdG9rLiAgQnV0IHdlJ2xsIGd1ZXNzIFVUQys2LgogIwogWm9uZSBBbnRhcmN0aWNhL1Zvc3RvawkwCS0JLTAwCTE5NTcgRGVjIDE2Ci0JCQk2OjAwCS0JKzA2CisJCQk2OjAwCS0JVk9TVAkjIFZvc3RvayB0aW1lCiAKICMgUyBBZnJpY2EgLSB5ZWFyLXJvdW5kIGJhc2VzCiAjIE1hcmlvbiBJc2xhbmQsIC00NjUzKzAzNzUyCkBAIC0zMjEsNyArMzI0LDcgQEAKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUgQW50YXJjdGljYS9Sb3RoZXJhCTAJLQktMDAJMTk3NiBEZWMgIDEKLQkJCS0zOjAwCS0JLTAzCisJCQktMzowMAktCVJPVFQJIyBSb3RoZXJhIHRpbWUKIAogIyBVcnVndWF5IC0geWVhciByb3VuZCBiYXNlCiAjIEFydGlnYXMsIEtpbmcgR2VvcmdlIElzbGFuZCwgLTYyMTEwNC0wNTg1MTA3CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYXNpYSBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hc2lhCmluZGV4IDY1ZTVmOTQuLjM1YWMzN2MgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hc2lhCisrKyBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hc2lhCkBAIC0xMzksMTEgKzEzOSwxMyBAQAogIyBodHRwOi8vd3d3LndvcmxkdGltZXpvbmUuY29tL2RzdF9uZXdzL2RzdF9uZXdzX2FybWVuaWEwMy5odG1sCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvWWVyZXZhbgkyOjU4OjAwIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQkzOjAwCS0JKzAzCTE5NTcgTWFyCi0JCQk0OjAwIFJ1c3NpYUFzaWEgKzA0LyswNQkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTM6MDAgUnVzc2lhQXNpYQkrMDMvKzA0CTE5OTUgU2VwIDI0ICAyOjAwcwotCQkJNDowMAktCSswNAkxOTk3Ci0JCQk0OjAwIFJ1c3NpYUFzaWEJKzA0LyswNQorCQkJMzowMAktCVlFUlQJMTk1NyBNYXIgICAgIyBZZXJldmFuIFRpbWUKKwkJCTQ6MDAgUnVzc2lhQXNpYSBZRVIlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkzOjAwCTE6MDAJWUVSU1QJMTk5MSBTZXAgMjMgIyBpbmRlcGVuZGVuY2UKKwkJCTM6MDAgUnVzc2lhQXNpYQlBTSVzVAkxOTk1IFNlcCAyNCAgMjowMHMKKwkJCTQ6MDAJLQlBTVQJMTk5NworCQkJNDowMCBSdXNzaWFBc2lhCUFNJXNUCTIwMTIgRmViICA5CisJCQk0OjAwCS0JQU1UCiAKICMgQXplcmJhaWphbgogCkBAIC0xNjQsMTIgKzE2NiwxMyBAQAogUnVsZQlBemVyCTE5OTcJMjAxNQktCU9jdAlsYXN0U3VuCSA1OjAwCTAJLQogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL0Jha3UJMzoxOToyNCAtCUxNVAkxOTI0IE1heSAgMgotCQkJMzowMAktCSswMwkxOTU3IE1hcgotCQkJNDowMCBSdXNzaWFBc2lhICswNC8rMDUJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkzOjAwIFJ1c3NpYUFzaWEJKzAzLyswNAkxOTkyIFNlcCBsYXN0U3VuICAyOjAwcwotCQkJNDowMAktCSswNAkxOTk2Ci0JCQk0OjAwCUVVQXNpYQkrMDQvKzA1CTE5OTcKLQkJCTQ6MDAJQXplcgkrMDQvKzA1CisJCQkzOjAwCS0JQkFLVAkxOTU3IE1hciAgICAjIEJha3UgVGltZQorCQkJNDowMCBSdXNzaWFBc2lhIEJBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTM6MDAJMTowMAlCQUtTVAkxOTkxIEF1ZyAzMCAjIGluZGVwZW5kZW5jZQorCQkJMzowMCBSdXNzaWFBc2lhCUFaJXNUCTE5OTIgU2VwIGxhc3RTdW4gIDI6MDBzCisJCQk0OjAwCS0JQVpUCTE5OTYgICAgICMgQXplcmJhaWphbiBUaW1lCisJCQk0OjAwCUVVQXNpYQlBWiVzVAkxOTk3CisJCQk0OjAwCUF6ZXIJQVolc1QKIAogIyBCYWhyYWluCiAjIFNlZSBBc2lhL1FhdGFyLgpAQCAtMjg4LDcgKzI5MSw3IEBACiAjIE1pbG5lIHNheXMgNjoyNDo0MCB3YXMgdGhlIG1lcmlkaWFuIG9mIHRoZSB0aW1lIGJhbGwgb2JzZXJ2YXRvcnkgYXQgUmFuZ29vbi4KIAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQotWm9uZQlBc2lhL1lhbmdvbgk2OjI0OjQwIC0JTE1UCTE4ODAgICAgICAgICMgb3IgUmFuZ29vbgorWm9uZQlBc2lhL1Jhbmdvb24JNjoyNDo0MCAtCUxNVAkxODgwICAgICAgICAjIG9yIFlhbmdvbgogCQkJNjoyNDo0MAktCVJNVAkxOTIwICAgICAgICAjIFJhbmdvb24gTWVhbiBUaW1lPwogCQkJNjozMAktCUJVUlQJMTk0MiBNYXkgICAgIyBCdXJtYSBUaW1lCiAJCQk5OjAwCS0JSlNUCTE5NDUgTWF5ICAzCkBAIC00MDMsNyArNDA2LDcgQEAKICMgTGV3aXN0b24gKE1FKSBEYWlseSBTdW4gKDE5MzktMDUtMjkpLCBwIDE3LCBzYWlkICJFdmVuIHRoZSB0aW1lIGlzCiAjIGRpZmZlcmVudCAtIHRoZSBvY2N1cGllZCBkaXN0cmljdHMgZ29pbmcgYnkgVG9reW8gdGltZSwgYW4gaG91cgogIyBhaGVhZCBvZiB0aGF0IHByZXZhaWxpbmcgaW4gdGhlIHJlc3Qgb2YgU2hhbmdoYWkuIiAgR3Vlc3MgdGhhdCB0aGUKLSMgWHVqaWFodWkgT2JzZXJ2YXRvcnkgd2FzIHVuZGVyIEZyZW5jaCBjb250cm9sIGFuZCBzdHVjayB3aXRoIFVUICswOC4KKyMgWHVqaWFodWkgT2JzZXJ2YXRvcnkgd2FzIHVuZGVyIEZyZW5jaCBjb250cm9sIGFuZCBzdHVjayB3aXRoIFVUKzguCiAjCiAjIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLCBDaGluYSBoYWQgbWFueSBzZXBhcmF0ZSBab25lIGVudHJpZXMsIGJ1dAogIyB0aGlzIHdhcyBiYXNlZCBvbiB3aGF0IHdlcmUgYXBwYXJlbnRseSBpbmNvcnJlY3QgZGF0YSBpbiBTaGFua3MgJiBQb3R0ZW5nZXIuCkBAIC00MTIsMjYgKzQxNSwyNiBAQAogIyBQcm9wb3NlZCBpbiAxOTE4IGFuZCB0aGVvcmV0aWNhbGx5IGluIGVmZmVjdCB1bnRpbCAxOTQ5IChhbHRob3VnaCBpbiBwcmFjdGljZQogIyBtYWlubHkgb2JzZXJ2ZWQgaW4gY29hc3RhbCBhcmVhcyksIHRoZSBmaXZlIHpvbmVzIHdlcmU6CiAjCi0jIENoYW5nYmFpIFRpbWUgKCJMb25nLXdoaXRlIFRpbWUiLCBMb25nLXdoaXRlID0gSGVpbG9uZ2ppYW5nIGFyZWEpIFVUICswODozMAorIyBDaGFuZ2JhaSBUaW1lICgiTG9uZy13aGl0ZSBUaW1lIiwgTG9uZy13aGl0ZSA9IEhlaWxvbmdqaWFuZyBhcmVhKSBVVCs4LjUKICMgQXNpYS9IYXJiaW4gKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9TaGFuZ2hhaSkKICMgSGVpbG9uZ2ppYW5nIChleGNlcHQgTW9oZSBjb3VudHkpLCBKaWxpbgogIwotIyBaaG9uZ3l1YW4gVGltZSAoIkNlbnRyYWwgcGxhaW4gVGltZSIpIFVUICswOAorIyBaaG9uZ3l1YW4gVGltZSAoIkNlbnRyYWwgcGxhaW4gVGltZSIpIFVUKzgKICMgQXNpYS9TaGFuZ2hhaQogIyBtb3N0IG9mIENoaW5hCiAjIFRoaXMgY3VycmVudGx5IHJlcHJlc2VudHMgbW9zdCBvdGhlciB6b25lcyBhcyB3ZWxsLAogIyBhcyBhcHBhcmVudGx5IHRoZXNlIHJlZ2lvbnMgaGF2ZSBiZWVuIHRoZSBzYW1lIHNpbmNlIDE5NzAuCiAjIE1pbG5lIGdpdmVzIDg6MDU6NDMuMiBmb3IgWHVqaWFodWkgT2JzZXJ2YXRvcnkgdGltZTsgcm91bmQgdG8gbmVhcmVzdC4KLSMgR3VvIHNheXMgU2hhbmdoYWkgc3dpdGNoZWQgdG8gVVQgKzA4ICJmcm9tIHRoZSBlbmQgb2YgdGhlIDE5dGggY2VudHVyeSIuCisjIEd1byBzYXlzIFNoYW5naGFpIHN3aXRjaGVkIHRvIFVUKzggImZyb20gdGhlIGVuZCBvZiB0aGUgMTl0aCBjZW50dXJ5Ii4KICMKLSMgTG9uZy1zaHUgVGltZSAocHJvYmFibHkgZHVlIHRvIExvbmcgYW5kIFNodSBiZWluZyB0d28gbmFtZXMgb2YgdGhlIGFyZWEpIFVUICswNworIyBMb25nLXNodSBUaW1lIChwcm9iYWJseSBkdWUgdG8gTG9uZyBhbmQgU2h1IGJlaW5nIHR3byBuYW1lcyBvZiB0aGF0IGFyZWEpIFVUKzcKICMgQXNpYS9DaG9uZ3FpbmcgKGN1cnJlbnRseSBhIGxpbmsgdG8gQXNpYS9TaGFuZ2hhaSkKICMgR3Vhbmd4aSwgR3VpemhvdSwgSGFpbmFuLCBOaW5neGlhLCBTaWNodWFuLCBTaGFhbnhpLCBhbmQgWXVubmFuOwogIyBtb3N0IG9mIEdhbnN1OyB3ZXN0IElubmVyIE1vbmdvbGlhOyB3ZXN0IFFpbmdoYWk7IGFuZCB0aGUgR3Vhbmdkb25nCiAjIGNvdW50aWVzIERlcWluZywgRW5waW5nLCBLYWlwaW5nLCBMdW9kaW5nLCBUYWlzaGFuLCBYaW54aW5nLAogIyBZYW5nY2h1biwgWWFuZ2ppYW5nLCBZdSduYW4sIGFuZCBZdW5mdS4KICMKLSMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKSBVVCArMDYKKyMgWGluLXphbmcgVGltZSAoIlhpbmppYW5nLVRpYmV0IFRpbWUiKSBVVCs2CiAjIEFzaWEvVXJ1bXFpCiAjIFRoaXMgY3VycmVudGx5IHJlcHJlc2VudHMgS3VubHVuIFRpbWUgYXMgd2VsbCwKICMgYXMgYXBwYXJlbnRseSB0aGUgdHdvIHJlZ2lvbnMgaGF2ZSBiZWVuIHRoZSBzYW1lIHNpbmNlIDE5NzAuCkBAIC00NDQsNyArNDQ3LDcgQEAKICMgU2hpaGV6aSwgQ2hhbmdqaSwgWWFucWksIEhlc2h1bywgVHVva2V4dW4sIFR1bHVmYW4sIFNoYW5zaGFuLCBIYW1pLAogIyBGdWthbmcsIEt1aXR1biwgS3VtdWt1bGksIE1pcXVhbiwgUWl0YWksIGFuZCBUdXJmYW4uCiAjCi0jIEt1bmx1biBUaW1lIFVUICswNTozMAorIyBLdW5sdW4gVGltZSBVVCs1LjUKICMgQXNpYS9LYXNoZ2FyIChjdXJyZW50bHkgYSBsaW5rIHRvIEFzaWEvVXJ1bXFpKQogIyBXZXN0IFRpYmV0LCBpbmNsdWRpbmcgUHVsYW4sIEFoZXFpLCBTaHVmdSwgU2h1bGU7CiAjIFdlc3QgWGluamlhbmcsIGluY2x1ZGluZyBBa3N1LCBBdHVzaGksIFlpbmluZywgSGV0aWFuLCBDZWxlLCBMdW9wdSwgTmlsZWtlLApAQCAtNDYwLDcgKzQ2Myw3IEBACiAjCiAjIE9uIHRoZSBvdGhlciBoYW5kLCBldGhuaWMgVXlnaHVycywgd2hvIG1ha2UgdXAgYWJvdXQgaGFsZiB0aGUKICMgcG9wdWxhdGlvbiBvZiBYaW5qaWFuZywgdHlwaWNhbGx5IHVzZSAiWGluamlhbmcgdGltZSIgd2hpY2ggaXMgdHdvCi0jIGhvdXJzIGJlaGluZCBCZWlqaW5nIHRpbWUsIG9yIFVUICswNi4gVGhlIGdvdmVybm1lbnQgb2YgdGhlIFhpbmppYW5nCisjIGhvdXJzIGJlaGluZCBCZWlqaW5nIHRpbWUsIG9yIFVUQyArMDYwMC4gVGhlIGdvdmVybm1lbnQgb2YgdGhlIFhpbmppYW5nCiAjIFV5Z2h1ciBBdXRvbm9tb3VzIFJlZ2lvbiwgKFhBVVIsIG9yIGp1c3QgWGluamlhbmcgZm9yIHNob3J0KSBhcyB3ZWxsIGFzCiAjIGxvY2FsIGdvdmVybm1lbnRzIHN1Y2ggYXMgdGhlIMOccsO8bXFpIGNpdHkgZ292ZXJubWVudCB1c2UgYm90aCB0aW1lcyBpbgogIyBwdWJsaWNhdGlvbnMsIHJlZmVycmluZyB0byB3aGF0IGlzIHBvcHVsYXJseSBjYWxsZWQgWGluamlhbmcgdGltZSBhcwpAQCAtNTE2LDggKzUxOSw4IEBACiAjIGhhdmluZyB0aGUgc2FtZSB0aW1lIGFzIEJlaWppbmcuCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wNi0zMCk6Ci0jIEluIHRoZSBlYXJseSBkYXlzIG9mIHRoZSBQUkMsIFRpYmV0IHdhcyBnaXZlbiBpdHMgb3duIHRpbWUgem9uZSAoVVQgKzA2KQotIyBidXQgdGhpcyB3YXMgd2l0aGRyYXduIGluIDE5NTkgYW5kIG5ldmVyIHJlaW5zdGF0ZWQ7IHNlZSBUdWJ0ZW4gS2jDqXRzdW4sCisjIEluIHRoZSBlYXJseSBkYXlzIG9mIHRoZSBQUkMsIFRpYmV0IHdhcyBnaXZlbiBpdHMgb3duIHRpbWUgem9uZSAoVVQrNikgYnV0CisjIHRoaXMgd2FzIHdpdGhkcmF3biBpbiAxOTU5IGFuZCBuZXZlciByZWluc3RhdGVkOyBzZWUgVHVidGVuIEtow6l0c3VuLAogIyBNZW1vcmllcyBvZiBsaWZlIGluIExoYXNhIHVuZGVyIENoaW5lc2UgUnVsZSwgQ29sdW1iaWEgVSBQcmVzcywgSVNCTgogIyA5NzgtMDIzMTE0Mjg2MSAoMjAwOCksIHRyYW5zbGF0b3IncyBpbnRyb2R1Y3Rpb24gYnkgTWF0dGhldyBBa2VzdGVyLCBwIHguCiAjIEFzIHRoaXMgaXMgYmVmb3JlIG91ciAxOTcwIGN1dG9mZiwgVGliZXQgZG9lc24ndCBuZWVkIGEgc2VwYXJhdGUgem9uZS4KQEAgLTUzMSwxMiArNTM0LDEyIEBACiAjIFJlcHVibGljcywgdGhlIFNvdmlldCBVbmlvbiwgdGhlIEt1b21pbnRhbmcsIGFuZCB0aGUgUGVvcGxlJ3MgUmVwdWJsaWMgb2YKICMgQ2hpbmEsIGFuZCB0cmFja2luZyBkb3duIGFsbCB0aGVzZSBvcmdhbml6YXRpb25zJyB0aW1la2VlcGluZyBydWxlcyB3b3VsZCBiZQogIyBxdWl0ZSBhIHRyaWNrLiAgQXBwcm94aW1hdGUgdGhpcyBsb3N0IGhpc3RvcnkgYnkgYSB0cmFuc2l0aW9uIGZyb20gTE1UIHRvCi0jIFVUICswNiBhdCB0aGUgc3RhcnQgb2YgMTkyOCwgdGhlIHllYXIgb2YgYWNjZXNzaW9uIG9mIHRoZSB3YXJsb3JkIEppbiBTaHVyZW4sCisjIFhKVCBhdCB0aGUgc3RhcnQgb2YgMTkyOCwgdGhlIHllYXIgb2YgYWNjZXNzaW9uIG9mIHRoZSB3YXJsb3JkIEppbiBTaHVyZW4sCiAjIHdoaWNoIGhhcHBlbnMgdG8gYmUgdGhlIGRhdGUgZ2l2ZW4gYnkgU2hhbmtzICYgUG90dGVuZ2VyIChubyBkb3VidCBhcyBhCi0jIGd1ZXNzKSBhcyB0aGUgdHJhbnNpdGlvbiBmcm9tIExNVC4gIElnbm9yZSB0aGUgdXNhZ2Ugb2YgKzA4IGJlZm9yZQotIyAxOTg2LTAyLTAxIHVuZGVyIHRoZSB0aGVvcnkgdGhhdCB0aGUgdHJhbnNpdGlvbiBkYXRlIHRvICswOCBpcyB1bmtub3duIGFuZAorIyBndWVzcykgYXMgdGhlIHRyYW5zaXRpb24gZnJvbSBMTVQuICBJZ25vcmUgdGhlIHVzYWdlIG9mIFVUKzggYmVmb3JlCisjIDE5ODYtMDItMDEgdW5kZXIgdGhlIHRoZW9yeSB0aGF0IHRoZSB0cmFuc2l0aW9uIGRhdGUgdG8gVVQrOCBpcyB1bmtub3duIGFuZAogIyB0aGF0IHRoZSBzb3J0IG9mIHVzZXJzIHdobyBwcmVmZXIgQXNpYS9VcnVtcWkgbm93IHR5cGljYWxseSBpZ25vcmVkIHRoZQotIyArMDggbWFuZGF0ZSBiYWNrIHRoZW4uCisjIFVUKzggbWFuZGF0ZSBiYWNrIHRoZW4uCiAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KICMgQmVpamluZyB0aW1lLCB1c2VkIHRocm91Z2hvdXQgQ2hpbmE7IHJlcHJlc2VudGVkIGJ5IFNoYW5naGFpLgpAQCAtNzQxLDcgKzc0NCw3IEBACiAjIGJlIGZvdW5kIGZyb20gaGlzdG9yaWNhbCBnb3Zlcm5tZW50IGFubm91bmNlbWVudCBkYXRhYmFzZS4KIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA3LTAzKToKLSMgQXMgcGVyIFl1LUNoZW5nIENodWFuZywgc2F5IHRoYXQgVGFpd2FuIHdhcyBhdCBVVCArMDkgZnJvbSAxOTM3LTEwLTAxCisjIEFzIHBlciBZdS1DaGVuZyBDaHVhbmcsIHNheSB0aGF0IFRhaXdhbiB3YXMgYXQgVVQrOSBmcm9tIDE5MzctMTAtMDEKICMgdW50aWwgMTk0NS0wOS0yMSBhdCAwMTowMCwgb3ZlcnJpZGluZyBTaGFua3MgJiBQb3R0ZW5nZXIuCiAjIExpa2V3aXNlLCB1c2UgWXUtQ2hlbmcgQ2h1YW5nJ3MgZGF0YSBmb3IgRFNUIGluIFRhaXdhbi4KIApAQCAtODU1LDE1ICs4NTgsMTYgQEAKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9UYmlsaXNpCTI6NTk6MTEgLQlMTVQJMTg4MAogCQkJMjo1OToxMQktCVRCTVQJMTkyNCBNYXkgIDIgIyBUYmlsaXNpIE1lYW4gVGltZQotCQkJMzowMAktCSswMwkxOTU3IE1hcgotCQkJNDowMCBSdXNzaWFBc2lhICswNC8rMDUJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkzOjAwIFJ1c3NpYUFzaWEgKzAzLyswNAkxOTkyCi0JCQkzOjAwIEUtRXVyQXNpYQkrMDMvKzA0CTE5OTQgU2VwIGxhc3RTdW4KLQkJCTQ6MDAgRS1FdXJBc2lhCSswNC8rMDUJMTk5NiBPY3QgbGFzdFN1bgotCQkJNDowMAkxOjAwCSswNQkxOTk3IE1hciBsYXN0U3VuCi0JCQk0OjAwIEUtRXVyQXNpYQkrMDQvKzA1CTIwMDQgSnVuIDI3Ci0JCQkzOjAwIFJ1c3NpYUFzaWEJKzAzLyswNAkyMDA1IE1hciBsYXN0U3VuICAyOjAwCi0JCQk0OjAwCS0JKzA0CisJCQkzOjAwCS0JVEJJVAkxOTU3IE1hciAgICAjIFRiaWxpc2kgVGltZQorCQkJNDowMCBSdXNzaWFBc2lhIFRCSSVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTM6MDAJMTowMAlUQklTVAkxOTkxIEFwciAgOSAjIGluZGVwZW5kZW5jZQorCQkJMzowMCBSdXNzaWFBc2lhIEdFJXNUCTE5OTIgICAgICAgICMgR2VvcmdpYSBUaW1lCisJCQkzOjAwIEUtRXVyQXNpYQlHRSVzVAkxOTk0IFNlcCBsYXN0U3VuCisJCQk0OjAwIEUtRXVyQXNpYQlHRSVzVAkxOTk2IE9jdCBsYXN0U3VuCisJCQk0OjAwCTE6MDAJR0VTVAkxOTk3IE1hciBsYXN0U3VuCisJCQk0OjAwIEUtRXVyQXNpYQlHRSVzVAkyMDA0IEp1biAyNworCQkJMzowMCBSdXNzaWFBc2lhCUdFJXNUCTIwMDUgTWFyIGxhc3RTdW4gIDI6MDAKKwkJCTQ6MDAJLQlHRVQKIAogIyBFYXN0IFRpbW9yCiAKQEAgLTk0MCw3ICs5NDQsNyBAQAogIyBUaGVzZSB3b3VsZCBiZSB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZXMgZm9yIGEgY2hhbmdlLgogIyBSw6lnaW1lcyBob3JhaXJlcyBwb3VyIGxlIG1vbmRlIGVudGllciwgYnkgSGVucmkgTGUgQ29ycmUsICjDiWRpdGlvbnMKICMgVHJhZGl0aW9ubmVsbGVzLCAxOTg3LCBQYXJpcykgc2F5cyB0aGF0IEphdmEgYW5kIE1hZHVyYSBzd2l0Y2hlZAotIyBmcm9tIFVUICswOSB0byArMDc6MzAgb24gMTk0NS0wOS0yMywgYW5kIGdpdmVzIDE5NDQtMDktMDEgZm9yIEpheWFwdXJhCisjIGZyb20gSlNUIHRvIFVUQyswNzozMCBvbiAxOTQ1LTA5LTIzLCBhbmQgZ2l2ZXMgMTk0NC0wOS0wMSBmb3IgSmF5YXB1cmEKICMgKEhvbGxhbmRpYSkuICBGb3Igbm93LCBhc3N1bWUgYWxsIEluZG9uZXNpYW4gbG9jYXRpb25zIG90aGVyIHRoYW4gSmF5YXB1cmEKICMgc3dpdGNoZWQgb24gMTk0NS0wOS0yMy4KICMKQEAgLTk1MSwxMSArOTU1LDExIEBACiAjIHN1bW1hcnkgcHVibGlzaGVkIGJ5IHRoZSBUaW1lIGFuZCBGcmVxdWVuY3kgTGFib3JhdG9yeSBvZiB0aGUKICMgUmVzZWFyY2ggQ2VudGVyIGZvciBDYWxpYnJhdGlvbiwgSW5zdHJ1bWVudGF0aW9uIGFuZCBNZXRyb2xvZ3ksCiAjIEluZG9uZXNpYSwgPGh0dHA6Ly90aW1lLmtpbS5saXBpLmdvLmlkL3RpbWUtZW5nLnBocD4gKDIwMDYtMDktMjkpLgotIyBUaGUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgYW5kIFVUIG9mZnNldHMgYXJlOgorIyBUaGUgYWJicmV2aWF0aW9ucyBhcmU6CiAjCi0jIFdJQiAgLSArMDcgLSBXYWt0dSBJbmRvbmVzaWEgQmFyYXQgKEluZG9uZXNpYSB3ZXN0ZXJuIHRpbWUpCi0jIFdJVEEgLSArMDggLSBXYWt0dSBJbmRvbmVzaWEgVGVuZ2FoIChJbmRvbmVzaWEgY2VudHJhbCB0aW1lKQotIyBXSVQgIC0gKzA5IC0gV2FrdHUgSW5kb25lc2lhIFRpbXVyIChJbmRvbmVzaWEgZWFzdGVybiB0aW1lKQorIyBXSUIgIC0gVVRDKzcgLSBXYWt0dSBJbmRvbmVzaWEgQmFyYXQgKEluZG9uZXNpYSB3ZXN0ZXJuIHRpbWUpCisjIFdJVEEgLSBVVEMrOCAtIFdha3R1IEluZG9uZXNpYSBUZW5nYWggKEluZG9uZXNpYSBjZW50cmFsIHRpbWUpCisjIFdJVCAgLSBVVEMrOSAtIFdha3R1IEluZG9uZXNpYSBUaW11ciAoSW5kb25lc2lhIGVhc3Rlcm4gdGltZSkKICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KICMgSmF2YSwgU3VtYXRyYQpAQCAtMTg0NCwxMSArMTg0OCwxMSBAQAogUnVsZQlLeXJneXoJMTk5NwkyMDA0CS0JT2N0CWxhc3RTdW4JMjozMAkwCS0KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9CaXNoa2VrCTQ6NTg6MjQgLQlMTVQJMTkyNCBNYXkgIDIKLQkJCTU6MDAJLQkrMDUJMTkzMCBKdW4gMjEKLQkJCTY6MDAgUnVzc2lhQXNpYSArMDYvKzA3CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJNTowMCBSdXNzaWFBc2lhCSswNS8rMDYJMTk5MSBBdWcgMzEgIDI6MDAKLQkJCTU6MDAJS3lyZ3l6CSswNS8rMDYJMjAwNSBBdWcgMTIKLQkJCTY6MDAJLQkrMDYKKwkJCTU6MDAJLQlGUlVUCTE5MzAgSnVuIDIxICMgRnJ1bnplIFRpbWUKKwkJCTY6MDAgUnVzc2lhQXNpYSBGUlUlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQk1OjAwCTE6MDAJRlJVU1QJMTk5MSBBdWcgMzEgIDI6MDAgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAJS3lyZ3l6CUtHJXNUCTIwMDUgQXVnIDEyICMgS3lyZ3l6c3RhbiBUaW1lCisJCQk2OjAwCS0JS0dUCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMTg4NywyNCArMTg5MSwyNSBAQAogUnVsZQlST0sJMTk4NwkxOTg4CS0JTWF5CVN1bj49OAkyOjAwCTE6MDAJRAogUnVsZQlST0sJMTk4NwkxOTg4CS0JT2N0CVN1bj49OAkzOjAwCTAJUwogCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTYtMDgtMjMpOgorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTEwLTMwKToKICMgVGhlIEtvcmVhbiBXaWtpcGVkaWEgZW50cnkgZ2l2ZXMgdGhlIGZvbGxvd2luZyBzb3VyY2VzIGZvciBVVCBvZmZzZXRzOgogIwotIyAxOTA4OiBPZmZpY2lhbCBKb3VybmFsIEFydGljbGUgTm8uIDM5OTQgKGRlY3JlZSBOby4gNSkKKyMgMTkwODogT2ZmaWNpYWwgSm91cm5hbCBBcnRpY2xlIE5vLiAzOTk0IChFZGljdCBOby4gNSkKICMgMTkxMjogR292ZXJub3ItR2VuZXJhbCBvZiBLb3JlYSBPZmZpY2lhbCBHYXpldHRlIElzc3VlIE5vLiAzNjcKICMgICAgICAgKEFubm91bmNlbWVudCBOby4gMzM4KQogIyAxOTU0OiBQcmVzaWRlbnRpYWwgRGVjcmVlIE5vLiA4NzYgKDE5NTQtMDMtMTcpCiAjIDE5NjE6IExhdyBOby4gNjc2ICgxOTYxLTA4LTA3KQorIyAxOTg3OiBMYXcgTm8uIDM5MTkgKDE5ODYtMTItMzEpCiAjCi0jIChBbm90aGVyIHNvdXJjZSAiMTk4NzogTGF3IE5vLiAzOTE5ICgxOTg2LTEyLTMxKSIgd2FzIGluIHRoZSAyMDE0LTEwLTMwCi0jIGVkaXRpb24gb2YgdGhlIEtvcmVhbiBXaWtpcGVkaWEgZW50cnkuKQorIyBUaGUgV2lraXBlZGlhIGVudHJ5IGFsc28gaGFzIGNvbmZ1c2luZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNoYW5nZQorIyB0byBVVCs5IGluIEFwcmlsIDE5MTAsIGJ1dCB0aGVuIHdoYXQgd291bGQgYmUgdGhlIHBvaW50IG9mIHRoZSBsYXRlciBjaGFuZ2UKKyMgdG8gVVQrOSBvbiAxOTEyLTAxLTAxPyAgT21pdCB0aGUgMTkxMCBjaGFuZ2UgZm9yIG5vdy4KICMKICMgSSBndWVzc2VkIHRoYXQgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgdGhyb3VnaCAxOTQ1IGZvbGxvd2VkIHRoZSBzYW1lCiAjIHJ1bGVzIGFzIGRpc2N1c3NlZCB1bmRlciBUYWl3YW4sIHdpdGggbm9taW5hbCBzd2l0Y2hlcyBmcm9tIEpTVCB0byBLU1QKICMgd2hlbiB0aGUgcmVzcGVjdGl2ZSBjaXRpZXMgd2VyZSB0YWtlbiBvdmVyIGJ5IHRoZSBBbGxpZXMgYWZ0ZXIgV1dJSS4KICMKLSMgRm9yIFB5b25neWFuZywgZ3Vlc3Mgbm8gY2hhbmdlcyBmcm9tIFdvcmxkIFdhciBJSSB1bnRpbCAyMDE1LCBhcyB3ZQotIyBoYXZlIG5vIGluZm9ybWF0aW9uIG90aGVyd2lzZS4KKyMgRm9yIFB5b25neWFuZyB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uOyBndWVzcyBubyBjaGFuZ2VzIHNpbmNlIFdvcmxkIFdhciBJSS4KIAogIyBGcm9tIFN0ZWZmZW4gVGhvcnNlbiAoMjAxNS0wOC0wNyk6CiAjIEFjY29yZGluZyB0byBtYW55IG5ld3Mgc291cmNlcywgTm9ydGggS29yZWEgaXMgZ29pbmcgdG8gY2hhbmdlIHRvCkBAIC0yMDY0LDcgKzIwNjksNyBAQAogIyBCaWxsIEJvbm5ldCAoMjAwNS0wNS0xOSkgcmVwb3J0cyB0aGF0IHRoZSBVUyBFbWJhc3N5IGluIFVsYWFuYmFhdGFyIHNheXMKICMgdGhlcmUgaXMgb25seSBvbmUgdGltZSB6b25lIGFuZCB0aGF0IERTVCBpcyBvYnNlcnZlZCwgY2l0aW5nIE1pY3Jvc29mdAogIyBXaW5kb3dzIFhQIGFzIHRoZSBzb3VyY2UuICBSaXN0byBOeWvDpG5lbiAoMjAwNS0wNS0xNikgcmVwb3J0cyB0aGF0Ci0jIHRyYXZlbG1vbmdvbGlhLm9yZyBzYXlzIHRoZXJlIGFyZSB0d28gdGltZSB6b25lcyAoVVQgKzA3LCArMDgpIHdpdGggbm8gRFNULgorIyB0cmF2ZWxtb25nb2xpYS5vcmcgc2F5cyB0aGVyZSBhcmUgdHdvIHRpbWUgem9uZXMgKFVUQys3LCBVVEMrOCkgd2l0aCBubyBEU1QuCiAjIE9zY2FyIHZhbiBWbGlqbWVuICgyMDA1LTA1LTIwKSByZXBvcnRzIHRoYXQgdGhlIE1vbmdvbGlhbiBFbWJhc3N5IGluCiAjIFdhc2hpbmd0b24sIERDIHNheXMgdGhlcmUgYXJlIHR3byB0aW1lIHpvbmVzLCB3aXRoIERTVCBvYnNlcnZlZC4KICMgSGUgYWxzbyBmb3VuZApAQCAtMjcwMCw3ICsyNzA1LDcgQEAKICMgZWFybGllciBkYXRlLgogIwogIyBTaGFua3MgJiBQb3R0ZW5nZXIgYWxzbyBzdGF0ZSB0aGF0IHVudGlsIDE5NjgtMDUtMDEgU2F1ZGkgQXJhYmlhIGhhZCB0d28KLSMgdGltZSB6b25lczsgdGhlIG90aGVyIHpvbmUsIGF0IFVUICswNCwgd2FzIGluIHRoZSBmYXIgZWFzdGVybiBwYXJ0IG9mCisjIHRpbWUgem9uZXM7IHRoZSBvdGhlciB6b25lLCBhdCBVVEMrNCwgd2FzIGluIHRoZSBmYXIgZWFzdGVybiBwYXJ0IG9mCiAjIHRoZSBjb3VudHJ5LiAgSWdub3JlIHRoaXMsIGFzIGl0J3MgYmVmb3JlIG91ciAxOTcwIGN1dG9mZi4KICMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTI5NjksMTAgKzI5NzQsMTAgQEAKICMgRnJvbSBTaGFua3MgJiBQb3R0ZW5nZXIuCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUFzaWEvRHVzaGFuYmUJNDozNToxMiAtCUxNVAkxOTI0IE1heSAgMgotCQkJNTowMAktCSswNQkxOTMwIEp1biAyMQotCQkJNjowMCBSdXNzaWFBc2lhICswNi8rMDcJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQk1OjAwCTE6MDAJKzA1LyswNgkxOTkxIFNlcCAgOSAgMjowMHMKLQkJCTU6MDAJLQkrMDUKKwkJCTU6MDAJLQlEVVNUCTE5MzAgSnVuIDIxICMgRHVzaGFuYmUgVGltZQorCQkJNjowMCBSdXNzaWFBc2lhIERVUyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTU6MDAJMTowMAlEVVNTVAkxOTkxIFNlcCAgOSAgMjowMHMKKwkJCTU6MDAJLQlUSlQJIyBUYWppa2lzdGFuIFRpbWUKIAogIyBUaGFpbGFuZAogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQpAQCAtMjk4NiwxMCArMjk5MSwxMSBAQAogIyBGcm9tIFNoYW5rcyAmIFBvdHRlbmdlci4KICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KIFpvbmUJQXNpYS9Bc2hnYWJhdAkzOjUzOjMyIC0JTE1UCTE5MjQgTWF5ICAyICMgb3IgQXNoa2hhYmFkCi0JCQk0OjAwCS0JKzA0CTE5MzAgSnVuIDIxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJKzA1LyswNgkxOTkxIE1hciAzMSAgMjowMAotCQkJNDowMCBSdXNzaWFBc2lhCSswNC8rMDUJMTk5MiBKYW4gMTkgIDI6MDAKLQkJCTU6MDAJLQkrMDUKKwkJCTQ6MDAJLQlBU0hUCTE5MzAgSnVuIDIxICMgQXNoa2hhYmFkIFRpbWUKKwkJCTU6MDAgUnVzc2lhQXNpYQlBU0glc1QJMTk5MSBNYXIgMzEgIDI6MDAKKwkJCTQ6MDAgUnVzc2lhQXNpYQlBU0glc1QJMTk5MSBPY3QgMjcgIyBpbmRlcGVuZGVuY2UKKwkJCTQ6MDAgUnVzc2lhQXNpYQlUTSVzVAkxOTkyIEphbiAxOSAgMjowMAorCQkJNTowMAktCVRNVAogCiAjIFVuaXRlZCBBcmFiIEVtaXJhdGVzCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCkBAIC0zMDAxLDE4ICszMDA3LDIwIEBACiAjIEJ5YWxva296IDE5MTkgc2F5cyBVemJla2lzdGFuIHdhcyA0OjI3OjUzLgogIyBab25lCU5BTUUJCUdNVE9GRglSVUxFUwlGT1JNQVQJW1VOVElMXQogWm9uZQlBc2lhL1NhbWFya2FuZAk0OjI3OjUzIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQk0OjAwCS0JKzA0CTE5MzAgSnVuIDIxCi0JCQk1OjAwCS0JKzA1CTE5ODEgQXByICAxCi0JCQk1OjAwCTE6MDAJKzA2CTE5ODEgT2N0ICAxCi0JCQk2OjAwCS0JKzA2CTE5ODIgQXByICAxCi0JCQk1OjAwIFJ1c3NpYUFzaWEJKzA1LyswNgkxOTkyCi0JCQk1OjAwCS0JKzA1CisJCQk0OjAwCS0JU0FNVAkxOTMwIEp1biAyMSAjIFNhbWFya2FuZCBUaW1lCisJCQk1OjAwCS0JU0FNVAkxOTgxIEFwciAgMQorCQkJNTowMAkxOjAwCVNBTVNUCTE5ODEgT2N0ICAxCisJCQk2OjAwCS0JVEFTVAkxOTgyIEFwciAgMSAjIFRhc2hrZW50IFRpbWUKKwkJCTU6MDAgUnVzc2lhQXNpYQlTQU0lc1QJMTk5MSBTZXAgIDEgIyBpbmRlcGVuZGVuY2UKKwkJCTU6MDAgUnVzc2lhQXNpYQlVWiVzVAkxOTkyCisJCQk1OjAwCS0JVVpUCiAjIE1pbG5lIHNheXMgVGFzaGtlbnQgd2FzIDQ6Mzc6MTAuODsgcm91bmQgdG8gbmVhcmVzdC4KIFpvbmUJQXNpYS9UYXNoa2VudAk0OjM3OjExIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQk1OjAwCS0JKzA1CTE5MzAgSnVuIDIxCi0JCQk2OjAwIFJ1c3NpYUFzaWEJKzA2LyswNwkxOTkxIE1hciAzMSAgMjowMAotCQkJNTowMCBSdXNzaWFBc2lhCSswNS8rMDYJMTk5MgotCQkJNTowMAktCSswNQorCQkJNTowMAktCVRBU1QJMTkzMCBKdW4gMjEgIyBUYXNoa2VudCBUaW1lCisJCQk2OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgTWFyIDMxICAyOjAwCisJCQk1OjAwIFJ1c3NpYUFzaWEJVEFTJXNUCTE5OTEgU2VwICAxICMgaW5kZXBlbmRlbmNlCisJCQk1OjAwIFJ1c3NpYUFzaWEJVVolc1QJMTk5MgorCQkJNTowMAktCVVaVAogCiAjIFZpZXRuYW0KIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2F1c3RyYWxhc2lhIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2F1c3RyYWxhc2lhCmluZGV4IDIwYTQwMjAuLjEzNGEwMWUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9hdXN0cmFsYXNpYQorKysgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYXVzdHJhbGFzaWEKQEAgLTU2OCw3ICs1NjgsNyBAQAogIyBCYXNlIHRoZSBCb3VnYWludmlsbGUgZW50cnkgb24gdGhlIEFyYXdhLUtpZXRhIHJlZ2lvbiwgd2hpY2ggYXBwZWFycyB0byBoYXZlCiAjIHRoZSBtb3N0IHBlb3BsZSBldmVuIHRob3VnaCBpdCB3YXMgZGV2YXN0YXRlZCBpbiB0aGUgQm91Z2FpbnZpbGxlIENpdmlsIFdhci4KICMKLSMgQWx0aG91Z2ggU2hhbmtzIGdpdmVzIDE5NDItMDMtMTUgLyAxOTQzLTExLTAxIGZvciBVVCArMDksIHRoZXNlIGRhdGVzCisjIEFsdGhvdWdoIFNoYW5rcyBnaXZlcyAxOTQyLTAzLTE1IC8gMTk0My0xMS0wMSBmb3IgSlNULCB0aGVzZSBkYXRlcwogIyBhcmUgYXBwYXJlbnRseSByb3VnaCBndWVzc3dvcmsgZnJvbSB0aGUgc3RhcnRzIG9mIG1pbGl0YXJ5IGNhbXBhaWducy4KICMgVGhlIFdvcmxkIFdhciBJSSBlbnRyaWVzIGJlbG93IGFyZSBpbnN0ZWFkIGJhc2VkIG9uIEFyYXdhLUtpZXRhLgogIyBUaGUgSmFwYW5lc2Ugb2NjdXBpZWQgS2lldGEgaW4gSnVseSAxOTQyLApAQCAtNTc2LDggKzU3Niw4IEBACiAjIGh0dHA6Ly9wd2VuY3ljbC5rZ2J1ZGdlLmNvbS9CL28vQm91Z2FpbnZpbGxlLmh0bQogIyBhbmQgc2VlbSB0byBoYXZlIGNvbnRyb2xsZWQgaXQgdW50aWwgdGhlaXIgMTk0NS0wOC0yMSBzdXJyZW5kZXIuCiAjCi0jIFRoZSBBdXRvbm9tb3VzIFJlZ2lvbiBvZiBCb3VnYWludmlsbGUgc3dpdGNoZWQgZnJvbSBVVCArMTAgdG8gKzExCi0jIG9uIDIwMTQtMTItMjggYXQgMDI6MDAuICBUaGV5IGNhbGwgKzExICJCb3VnYWludmlsbGUgU3RhbmRhcmQgVGltZSI7CisjIFRoZSBBdXRvbm9tb3VzIFJlZ2lvbiBvZiBCb3VnYWludmlsbGUgcGxhbnMgdG8gc3dpdGNoIGZyb20gVVRDKzEwIHRvIFVUQysxMQorIyBvbiAyMDE0LTEyLTI4IGF0IDAyOjAwLiAgVGhleSBjYWxsIFVUQysxMSAiQm91Z2FpbnZpbGxlIFN0YW5kYXJkIFRpbWUiOwogIyBhYmJyZXZpYXRlIHRoaXMgYXMgQlNULiAgU2VlOgogIyBodHRwOi8vd3d3LmJvdWdhaW52aWxsZTI0LmNvbS9ib3VnYWludmlsbGUtaXNzdWVzL2JvdWdhaW52aWxsZS1nZXRzLW93bi10aW1lem9uZS8KICMKQEAgLTY0Myw3ICs2NDMsNyBAQAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTA2LTI3KToKICMgVGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIEFjdCAyMDExCiAjIGh0dHA6Ly93d3cucGFybGlhbWVudC5nb3Yud3MvaW1hZ2VzL0FDVFMvSW50ZXJuYXRpb25hbF9EYXRlX0xpbmVfQWN0X18yMDExXy1fRW5nLnBkZgotIyBjaGFuZ2VkIFNhbW9hIGZyb20gVVQgLTExIHRvICsxMywgZWZmZWN0aXZlICIxMiBvJ2Nsb2NrIG1pZG5pZ2h0LCBvbgorIyBjaGFuZ2VkIFNhbW9hIGZyb20gVVRDLTExIHRvIFVUQysxMywgZWZmZWN0aXZlICIxMiBvJ2Nsb2NrIG1pZG5pZ2h0LCBvbgogIyBUaHVyc2RheSAyOXRoIERlY2VtYmVyIDIwMTEiLiAgVGhlIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIHdhcyBhZGp1c3RlZAogIyBhY2NvcmRpbmdseS4KIApAQCAtNzM4LDcgKzczOCw3IEBACiAjIDE4ODYtMTg5MTsgQmFrZXIgd2FzIHNpbWlsYXIgYnV0IGV4YWN0IGRhdGVzIGFyZSBub3Qga25vd24uCiAjIEluaGFiaXRlZCBieSBjaXZpbGlhbnMgMTkzNS0xOTQyOyBVLlMuIG1pbGl0YXJ5IGJhc2VzIDE5NDMtMTk0NDsKICMgdW5pbmhhYml0ZWQgdGhlcmVhZnRlci4KLSMgSG93bGFuZCBvYnNlcnZlZCBIYXdhaWkgU3RhbmRhcmQgVGltZSAoVVQgLTEwOjMwKSBpbiAxOTM3OworIyBIb3dsYW5kIG9ic2VydmVkIEhhd2FpaSBTdGFuZGFyZCBUaW1lIChVVC0xMDozMCkgaW4gMTkzNzsKICMgc2VlIHBhZ2UgMjA2IG9mIEVsZ2VuIE0uIExvbmcgYW5kIE1hcmllIEsuIExvbmcsCiAjIEFtZWxpYSBFYXJoYXJ0OiB0aGUgTXlzdGVyeSBTb2x2ZWQsIFNpbW9uICYgU2NodXN0ZXIgKDIwMDApLgogIyBTbyBtb3N0IGxpa2VseSBIb3dsYW5kIGFuZCBCYWtlciBvYnNlcnZlZCBIYXdhaWkgVGltZSBmcm9tIDE5MzUKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAjIFplYWxhbmQgdGltZS4gIEkgdW5kZXJzdGFuZCB0aGF0IGlzIHRoZSB0aW1lIHRoZXkga2VlcCBsb2NhbGx5LCBhbnlob3cuIgogIyBGb3Igbm93LCBhc3N1bWUgdGhpcyBwcmFjdGljZSBnb2VzIGJhY2sgdG8gdGhlIGludHJvZHVjdGlvbiBvZiBzdGFuZGFyZCB0aW1lCiAjIGluIE5ldyBaZWFsYW5kLCBhcyB0aGlzIHdvdWxkIG1ha2UgQ2hhdGhhbSBJc2xhbmRzIHRpbWUgYWxtb3N0IGV4YWN0bHkgbWF0Y2gKLSMgTE1UIGJhY2sgd2hlbiBOZXcgWmVhbGFuZCB3YXMgYXQgVVQgKzExOjMwOyBhbHNvLCBhc3N1bWUgQ2hhdGhhbSBJc2xhbmRzIGRpZAorIyBMTVQgYmFjayB3aGVuIE5ldyBaZWFsYW5kIHdhcyBhdCBVVEMrMTE6MzA7IGFsc28sIGFzc3VtZSBDaGF0aGFtIElzbGFuZHMgZGlkCiAjIG5vdCBvYnNlcnZlIE5ldyBaZWFsYW5kJ3MgcHJld2FyIERTVC4KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTU1Miw3ICsxNTUyLDcgQEAKICMgRm9yIG5vdywgd2UgYXNzdW1lIHRoZSBMYWRyb25lcyBzd2l0Y2hlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBQaGlsaXBwaW5lczsKICMgc2VlIEFzaWEvTWFuaWxhLgogCi0jIFVTIFB1YmxpYyBMYXcgMTA2LTU2NCAoMjAwMC0xMi0yMykgbWFkZSBVVCArMTAgdGhlIG9mZmljaWFsIHN0YW5kYXJkIHRpbWUsCisjIFVTIFB1YmxpYyBMYXcgMTA2LTU2NCAoMjAwMC0xMi0yMykgbWFkZSBVVEMrMTAgdGhlIG9mZmljaWFsIHN0YW5kYXJkIHRpbWUsCiAjIHVuZGVyIHRoZSBuYW1lICJDaGFtb3JybyBTdGFuZGFyZCBUaW1lIi4gIFRoZXJlIGlzIG5vIG9mZmljaWFsIGFiYnJldmlhdGlvbiwKICMgYnV0IENvbmdyZXNzbWFuIFJvYmVydCBBLiBVbmRlcndvb2QsIGF1dGhvciBvZiB0aGUgYmlsbCB0aGF0IGJlY2FtZSBsYXcsCiAjIHdyb3RlIGluIGEgcHJlc3MgcmVsZWFzZSAoMjAwMC0xMi0yNykgdGhhdCBoZSB3aWxsIHNlZWsgdGhlIHVzZSBvZiAiQ2hTVCIuCkBAIC0xNTY0LDE1ICsxNTY0LDE1IEBACiAjICJJIGFtIGNlcnRhaW4sIGhhdmluZyBsaXZlZCB0aGVyZSBmb3IgdGhlIHBhc3QgZGVjYWRlLCB0aGF0ICdUcnVrJwogIyAobm93IHByb3Blcmx5IGtub3duIGFzIENodXVrKSAuLi4gaXMgaW4gdGhlIHRpbWUgem9uZSBHTVQrMTAuIgogIwotIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBUcnVrIHN3aXRjaGVkIGZyb20gVVQgKzEwIHRvICsxMQorIyBTaGFua3MgJiBQb3R0ZW5nZXIgd3JpdGUgdGhhdCBUcnVrIHN3aXRjaGVkIGZyb20gVVRDKzEwIHRvIFVUQysxMQogIyBvbiAxOTc4LTEwLTAxOyBpZ25vcmUgdGhpcyBmb3Igbm93LgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDE5OTktMTAtMjkpOgogIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIFZpc2l0b3JzIEJvYXJkIHdyaXRlcyBpbgogIyBUaGUgRmVkZXJhdGVkIFN0YXRlcyBvZiBNaWNyb25lc2lhIC0gVmlzaXRvciBJbmZvcm1hdGlvbiAoMTk5OS0wMS0yNikKICMgaHR0cDovL3d3dy5mc21nb3Yub3JnL2luZm8vY2xvY2tzLmh0bWwKLSMgdGhhdCBUcnVrIGFuZCBZYXAgYXJlIFVUICsxMCwgYW5kIFBvbmFwZSBhbmQgS29zcmFlIGFyZSArMTEuCi0jIFdlIGRvbid0IGtub3cgd2hlbiBLb3NyYWUgc3dpdGNoZWQgZnJvbSArMTI7IGFzc3VtZSBKYW51YXJ5IDEgZm9yIG5vdy4KKyMgdGhhdCBUcnVrIGFuZCBZYXAgYXJlIFVUQysxMCwgYW5kIFBvbmFwZSBhbmQgS29zcmFlIGFyZSBVVEMrMTEuCisjIFdlIGRvbid0IGtub3cgd2hlbiBLb3NyYWUgc3dpdGNoZWQgZnJvbSBVVEMrMTI7IGFzc3VtZSBKYW51YXJ5IDEgZm9yIG5vdy4KIAogCiAjIE1pZHdheQpAQCAtMTYzOCwxMSArMTYzOCwxMSBAQAogIyBvcmRhaW5pbmcgLSBieSBhIG1hc3RlcnBpZWNlIG9mIGRpcGxvbWF0aWMgZmxhdHRlcnkgLSB0aGF0CiAjIHRoZSBGb3VydGggb2YgSnVseSBzaG91bGQgYmUgY2VsZWJyYXRlZCB0d2ljZSBpbiB0aGF0IHllYXIuIgogCi0jIEFsdGhvdWdoIFNoYW5rcyAmIFBvdHRlbmdlciBzYXlzIHRoZXkgYm90aCBzd2l0Y2hlZCB0byBVVCAtMTE6MzAKLSMgaW4gMTkxMSwgYW5kIHRvIC0xMSBpbiAxOTUwLiBtYW55IGVhcmxpZXIgc291cmNlcyBnaXZlIC0xMQorIyBBbHRob3VnaCBTaGFua3MgJiBQb3R0ZW5nZXIgc2F5cyB0aGV5IGJvdGggc3dpdGNoZWQgdG8gVVRDLTExOjMwCisjIGluIDE5MTEsIGFuZCB0byBVVEMtMTEgaW4gMTk1MC4gbWFueSBlYXJsaWVyIHNvdXJjZXMgZ2l2ZSBVVEMtMTEKICMgZm9yIEFtZXJpY2FuIFNhbW9hLCBlLmcuLCB0aGUgVVMgTmF0aW9uYWwgQnVyZWF1IG9mIFN0YW5kYXJkcwogIyBjaXJjdWxhciAiU3RhbmRhcmQgVGltZSBUaHJvdWdob3V0IHRoZSBXb3JsZCIsIDE5MzIuCi0jIEFzc3VtZSBBbWVyaWNhbiBTYW1vYSBzd2l0Y2hlZCB0byAtMTEgaW4gMTkxMSwgbm90IDE5NTAsCisjIEFzc3VtZSBBbWVyaWNhbiBTYW1vYSBzd2l0Y2hlZCB0byBVVEMtMTEgaW4gMTkxMSwgbm90IDE5NTAsCiAjIGFuZCB0aGF0IGFmdGVyIDE5NTAgdGhleSBhZ3JlZWQgdW50aWwgKHdlc3Rlcm4pIFNhbW9hIHNraXBwZWQgYQogIyBkYXkgaW4gMjAxMS4gIEFzc3VtZSBhbHNvIHRoYXQgdGhlIFNhbW9hcyBmb2xsb3cgdGhlIFVTIGFuZCBOZXcKICMgWmVhbGFuZCdzICJTVCIvIkRUIiBzdHlsZSBvZiBkYXlsaWdodC1zYXZpbmcgYWJicmV2aWF0aW9ucy4KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9iYWNrd2FyZCBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9iYWNrd2FyZAppbmRleCBlYzk2YzdlLi44MzUyNzA1IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvYmFja3dhcmQKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2JhY2t3YXJkCkBAIC01OSw3ICs1OSw2IEBACiBMaW5rCUFzaWEvVXJ1bXFpCQlBc2lhL0thc2hnYXIKIExpbmsJQXNpYS9LYXRobWFuZHUJCUFzaWEvS2F0bWFuZHUKIExpbmsJQXNpYS9NYWNhdQkJQXNpYS9NYWNhbwotTGluawlBc2lhL1lhbmdvbgkJQXNpYS9SYW5nb29uCiBMaW5rCUFzaWEvSG9fQ2hpX01pbmgJQXNpYS9TYWlnb24KIExpbmsJQXNpYS9KZXJ1c2FsZW0JCUFzaWEvVGVsX0F2aXYKIExpbmsJQXNpYS9UaGltcGh1CQlBc2lhL1RoaW1idQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2V0Y2V0ZXJhIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2V0Y2V0ZXJhCmluZGV4IGVjMzFmMWIuLmQyZmI5MWMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ldGNldGVyYQorKysgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXRjZXRlcmEKQEAgLTMxLDEzICszMSw2IEBACiAjIG5lZWQgbm93IGZvciB0aGUgZW50cmllcyB0aGF0IGFyZSBub3Qgb24gVVRDIGFyZSBmb3Igc2hpcHMgYXQgc2VhCiAjIHRoYXQgY2Fubm90IHVzZSBQT1NJWCBUWiBzZXR0aW5ncy4KIAotIyBTdGFydGluZyB3aXRoIFBPU0lYIDEwMDMuMS0yMDAxLCB0aGUgZW50cmllcyBiZWxvdyBhcmUgYWxsCi0jIHVubmVjZXNzYXJ5IGFzIHNldHRpbmdzIGZvciB0aGUgVFogZW52aXJvbm1lbnQgdmFyaWFibGUuICBFLmcuLAotIyBpbnN0ZWFkIG9mIFRaPSdFdGMvR01UKzQnIG9uZSBjYW4gdXNlIHRoZSBQT1NJWCBzZXR0aW5nIFRaPSc8LTA0Pis0Jy4KLSMKLSMgRG8gbm90IHVzZSBhIFBPU0lYIFRaIHNldHRpbmcgbGlrZSBUWj0nR01UKzQnLCB3aGljaCBpcyBmb3VyIGhvdXJzCi0jIGJlaGluZCBHTVQgYnV0IHVzZXMgdGhlIGNvbXBsZXRlbHkgbWlzbGVhZGluZyBhYmJyZXZpYXRpb24gIkdNVCIuCi0KIFpvbmUJRXRjL0dNVAkJMAktCUdNVAogWm9uZQlFdGMvVVRDCQkwCS0JVVRDCiBab25lCUV0Yy9VQ1QJCTAJLQlVQ1QKQEAgLTU2LDEzICs0OSwyMyBAQAogTGluawlFdGMvR01UCQkJCUV0Yy9HTVQrMAogTGluawlFdGMvR01UCQkJCUV0Yy9HTVQwCiAKLSMgQmUgY29uc2lzdGVudCB3aXRoIFBPU0lYIFRaIHNldHRpbmdzIGluIHRoZSBab25lIG5hbWVzLAorIyBXZSB1c2UgUE9TSVgtc3R5bGUgc2lnbnMgaW4gdGhlIFpvbmUgbmFtZXMgYW5kIHRoZSBvdXRwdXQgYWJicmV2aWF0aW9ucywKICMgZXZlbiB0aG91Z2ggdGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBtYW55IHBlb3BsZSBleHBlY3QuCiAjIFBPU0lYIGhhcyBwb3NpdGl2ZSBzaWducyB3ZXN0IG9mIEdyZWVud2ljaCwgYnV0IG1hbnkgcGVvcGxlIGV4cGVjdAogIyBwb3NpdGl2ZSBzaWducyBlYXN0IG9mIEdyZWVud2ljaC4gIEZvciBleGFtcGxlLCBUWj0nRXRjL0dNVCs0JyB1c2VzCi0jIHRoZSBhYmJyZXZpYXRpb24gIi0wNCIgYW5kIGNvcnJlc3BvbmRzIHRvIDQgaG91cnMgYmVoaW5kIFVUCisjIHRoZSBhYmJyZXZpYXRpb24gIkdNVCs0IiBhbmQgY29ycmVzcG9uZHMgdG8gNCBob3VycyBiZWhpbmQgVVQKICMgKGkuZS4gd2VzdCBvZiBHcmVlbndpY2gpIGV2ZW4gdGhvdWdoIG1hbnkgcGVvcGxlIHdvdWxkIGV4cGVjdCBpdCB0bwogIyBtZWFuIDQgaG91cnMgYWhlYWQgb2YgVVQgKGkuZS4gZWFzdCBvZiBHcmVlbndpY2gpLgorIworIyBJbiB0aGUgZHJhZnQgNSBvZiBQT1NJWCAxMDAzLjEtMjAweCwgdGhlIGFuZ2xlIGJyYWNrZXQgbm90YXRpb24gYWxsb3dzIGZvcgorIyBUWj0nPEdNVC00Pis0JzsgaWYgeW91IHdhbnQgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgY29uZm9ybWluZyB0bworIyBJU08gODYwMSB5b3UgY2FuIHVzZSBUWj0nPC0wNDAwPis0Jy4gIFRodXMgdGhlIGNvbW1vbmx5LWV4cGVjdGVkCisjIG9mZnNldCBpcyBrZXB0IHdpdGhpbiB0aGUgYW5nbGUgYnJhY2tldCAoYW5kIGlzIHVzZWQgZm9yIGRpc3BsYXkpCisjIHdoaWxlIHRoZSBQT1NJWCBzaWduIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldCAoYW5kIGlzIHVzZWQKKyMgZm9yIGNhbGN1bGF0aW9uKS4KKyMKKyMgRG8gbm90IHVzZSBhIFRaIHNldHRpbmcgbGlrZSBUWj0nR01UKzQnLCB3aGljaCBpcyBmb3VyIGhvdXJzIGJlaGluZAorIyBHTVQgYnV0IHVzZXMgdGhlIGNvbXBsZXRlbHkgbWlzbGVhZGluZyBhYmJyZXZpYXRpb24gIkdNVCIuCiAKICMgRWFybGllciBpbmNhcm5hdGlvbnMgb2YgdGhpcyBwYWNrYWdlIHdlcmUgbm90IFBPU0lYLWNvbXBsaWFudCwKICMgYW5kIGhhZCBsaW5lcyBzdWNoIGFzCkBAIC03MSwzMSArNzQsMzAgQEAKICMgd2F5IGRvZXMgYQogIwkJemljIC1sIEdNVC0xMgogIyBzbyB3ZSBtb3ZlZCB0aGUgbmFtZXMgaW50byB0aGUgRXRjIHN1YmRpcmVjdG9yeS4KLSMgQWxzbywgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIGFyZSBub3cgY29tcGF0aWJsZSB3aXRoICV6LgogCi1ab25lCUV0Yy9HTVQtMTQJMTQJLQkrMTQKLVpvbmUJRXRjL0dNVC0xMwkxMwktCSsxMwotWm9uZQlFdGMvR01ULTEyCTEyCS0JKzEyCi1ab25lCUV0Yy9HTVQtMTEJMTEJLQkrMTEKLVpvbmUJRXRjL0dNVC0xMAkxMAktCSsxMAotWm9uZQlFdGMvR01ULTkJOQktCSswOQotWm9uZQlFdGMvR01ULTgJOAktCSswOAotWm9uZQlFdGMvR01ULTcJNwktCSswNwotWm9uZQlFdGMvR01ULTYJNgktCSswNgotWm9uZQlFdGMvR01ULTUJNQktCSswNQotWm9uZQlFdGMvR01ULTQJNAktCSswNAotWm9uZQlFdGMvR01ULTMJMwktCSswMwotWm9uZQlFdGMvR01ULTIJMgktCSswMgotWm9uZQlFdGMvR01ULTEJMQktCSswMQotWm9uZQlFdGMvR01UKzEJLTEJLQktMDEKLVpvbmUJRXRjL0dNVCsyCS0yCS0JLTAyCi1ab25lCUV0Yy9HTVQrMwktMwktCS0wMwotWm9uZQlFdGMvR01UKzQJLTQJLQktMDQKLVpvbmUJRXRjL0dNVCs1CS01CS0JLTA1Ci1ab25lCUV0Yy9HTVQrNgktNgktCS0wNgotWm9uZQlFdGMvR01UKzcJLTcJLQktMDcKLVpvbmUJRXRjL0dNVCs4CS04CS0JLTA4Ci1ab25lCUV0Yy9HTVQrOQktOQktCS0wOQotWm9uZQlFdGMvR01UKzEwCS0xMAktCS0xMAotWm9uZQlFdGMvR01UKzExCS0xMQktCS0xMQotWm9uZQlFdGMvR01UKzEyCS0xMgktCS0xMgorWm9uZQlFdGMvR01ULTE0CTE0CS0JR01ULTE0CSMgMTQgaG91cnMgYWhlYWQgb2YgR01UCitab25lCUV0Yy9HTVQtMTMJMTMJLQlHTVQtMTMKK1pvbmUJRXRjL0dNVC0xMgkxMgktCUdNVC0xMgorWm9uZQlFdGMvR01ULTExCTExCS0JR01ULTExCitab25lCUV0Yy9HTVQtMTAJMTAJLQlHTVQtMTAKK1pvbmUJRXRjL0dNVC05CTkJLQlHTVQtOQorWm9uZQlFdGMvR01ULTgJOAktCUdNVC04Citab25lCUV0Yy9HTVQtNwk3CS0JR01ULTcKK1pvbmUJRXRjL0dNVC02CTYJLQlHTVQtNgorWm9uZQlFdGMvR01ULTUJNQktCUdNVC01Citab25lCUV0Yy9HTVQtNAk0CS0JR01ULTQKK1pvbmUJRXRjL0dNVC0zCTMJLQlHTVQtMworWm9uZQlFdGMvR01ULTIJMgktCUdNVC0yCitab25lCUV0Yy9HTVQtMQkxCS0JR01ULTEKK1pvbmUJRXRjL0dNVCsxCS0xCS0JR01UKzEKK1pvbmUJRXRjL0dNVCsyCS0yCS0JR01UKzIKK1pvbmUJRXRjL0dNVCszCS0zCS0JR01UKzMKK1pvbmUJRXRjL0dNVCs0CS00CS0JR01UKzQKK1pvbmUJRXRjL0dNVCs1CS01CS0JR01UKzUKK1pvbmUJRXRjL0dNVCs2CS02CS0JR01UKzYKK1pvbmUJRXRjL0dNVCs3CS03CS0JR01UKzcKK1pvbmUJRXRjL0dNVCs4CS04CS0JR01UKzgKK1pvbmUJRXRjL0dNVCs5CS05CS0JR01UKzkKK1pvbmUJRXRjL0dNVCsxMAktMTAJLQlHTVQrMTAKK1pvbmUJRXRjL0dNVCsxMQktMTEJLQlHTVQrMTEKK1pvbmUJRXRjL0dNVCsxMgktMTIJLQlHTVQrMTIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ldXJvcGUgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZXVyb3BlCmluZGV4IGFlZGVkYjEuLjhlZDdkNGIgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ldXJvcGUKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2V1cm9wZQpAQCAtOTgsNyArOTgsOCBAQAogIyAgICAgICAgMTowMCAgICAgICBDRVQgQ0VTVCBDRU1UIENlbnRyYWwgRXVyb3BlCiAjICAgICAgICAxOjAwOjE0ICAgIFNFVCAgICAgICAgICAgU3dlZGlzaCAoMTg3OS0xODk5KSoKICMgICAgICAgIDI6MDAgICAgICAgRUVUIEVFU1QgICAgICBFYXN0ZXJuIEV1cm9wZQotIyAgICAgICAgMzowMCAgICAgICBNU0sgTVNEICAgICAgIE1vc2NvdworIyAgICAgICAgMzowMCAgICAgICBGRVQgICAgICAgICAgIEZ1cnRoZXItZWFzdGVybiBFdXJvcGUgKDIwMTEtMjAxNCkqCisjICAgICAgICAzOjAwICAgICAgIE1TSyBNU0QgIE1TTSogTWluc2ssIE1vc2NvdwogCiAjIEZyb20gUGV0ZXIgSWxpZXZlICgxOTk0LTEyLTA0KSwKICMgVGhlIG9yaWdpbmFsIHNpeCBbRVUgbWVtYmVyc106IEJlbGdpdW0sIEZyYW5jZSwgKFdlc3QpIEdlcm1hbnksIEl0YWx5LApAQCAtNjA1LDMzICs2MDYsMTYgQEAKIFJ1bGUJRS1FdXIJMTk4MQltYXgJLQlNYXIJbGFzdFN1bgkgMDowMAkxOjAwCVMKIFJ1bGUJRS1FdXIJMTk5NgltYXgJLQlPY3QJbGFzdFN1bgkgMDowMAkwCS0KIAotCi0jIERheWxpZ2h0IHNhdmluZyB0aW1lIGZvciBSdXNzaWEgYW5kIHRoZSBTb3ZpZXQgVW5pb24KLSMKLSMgVGhlIDE5MTctMTkyMSBkZWNyZWUgVVJMcyBhcmUgZnJvbSBBbGV4YW5kZXIgQmVsb3BvbHNreSAoMjAxNi0wOC0yMykuCi0KICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCVJ1c3NpYQkxOTE3CW9ubHkJLQlKdWwJIDEJMjM6MDAJMTowMAlNU1QgICMgTW9zY293IFN1bW1lciBUaW1lCi0jCi0jIERlY3JlZSBOby4gMTQyICgxOTE3LTEyLTIyKSBodHRwOi8vaXN0bWF0LmluZm8vbm9kZS8yODEzNwogUnVsZQlSdXNzaWEJMTkxNwlvbmx5CS0JRGVjCTI4CSAwOjAwCTAJTU1UICAjIE1vc2NvdyBNZWFuIFRpbWUKLSMKLSMgRGVjcmVlIE5vLiA0OTcgKDE5MTgtMDUtMzApIGh0dHA6Ly9pc3RtYXQuaW5mby9ub2RlLzMwMDAxCiBSdWxlCVJ1c3NpYQkxOTE4CW9ubHkJLQlNYXkJMzEJMjI6MDAJMjowMAlNRFNUICMgTW9zY293IERvdWJsZSBTdW1tZXIgVGltZQogUnVsZQlSdXNzaWEJMTkxOAlvbmx5CS0JU2VwCTE2CSAxOjAwCTE6MDAJTVNUCi0jCi0jIERlY3JlZSBOby4gMjU4ICgxOTE5LTA1LTI5KSBodHRwOi8vaXN0bWF0LmluZm8vbm9kZS8zNzk0OQogUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JTWF5CTMxCTIzOjAwCTI6MDAJTURTVAotIwotUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JSnVsCSAxCSAwOjAwdQkxOjAwCU1TRAorUnVsZQlSdXNzaWEJMTkxOQlvbmx5CS0JSnVsCSAxCSAyOjAwCTE6MDAJTVNECiBSdWxlCVJ1c3NpYQkxOTE5CW9ubHkJLQlBdWcJMTYJIDA6MDAJMAlNU0sKLSMKLSMgRGVjcmVlIE5vLiA2MyAoMTkyMS0wMi0wMykgaHR0cDovL2lzdG1hdC5pbmZvL25vZGUvNDU4NDAKIFJ1bGUJUnVzc2lhCTE5MjEJb25seQktCUZlYgkxNAkyMzowMAkxOjAwCU1TRAotIwotIyBEZWNyZWUgTm8uIDEyMSAoMTkyMS0wMy0wNykgaHR0cDovL2lzdG1hdC5pbmZvL25vZGUvNDU5NDkKLVJ1bGUJUnVzc2lhCTE5MjEJb25seQktCU1hcgkyMAkyMzowMAkyOjAwCSswNQotIworUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JTWFyCTIwCTIzOjAwCTI6MDAJTVNNICAjIE1pZHN1bW1lcgogUnVsZQlSdXNzaWEJMTkyMQlvbmx5CS0JU2VwCSAxCSAwOjAwCTE6MDAJTVNECiBSdWxlCVJ1c3NpYQkxOTIxCW9ubHkJLQlPY3QJIDEJIDA6MDAJMAktCiAjIEFjdCBOby4gOTI1IG9mIHRoZSBDb3VuY2lsIG9mIE1pbmlzdGVycyBvZiB0aGUgVVNTUiAoMTk4MC0xMC0yNCk6CkBAIC04MTQsNiArNzk4LDggQEAKICMgRnJvbSBBbGV4YW5kZXIgQm9rb3ZveSAoMjAxNC0xMC0wOSk6CiAjIEJlbGFydXNzaWFuIGdvdmVybm1lbnQgZGVjaWRlZCBhZ2FpbnN0IGNoYW5naW5nIHRvIHdpbnRlciB0aW1lLi4uLgogIyBodHRwOi8vZW5nLmJlbHRhLmJ5L2FsbF9uZXdzL3NvY2lldHkvQmVsYXJ1cy1kZWNpZGVzLWFnYWluc3QtYWRqdXN0aW5nLXRpbWUtaW4tUnVzc2lhcy13YWtlX2lfNzYzMzUuaHRtbAorIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE0LTEwLTA4KToKKyMgSGVuY2UgQmVsYXJ1cyBjYW4gc2hhcmUgdGltZSB6b25lIGFiYnJldmlhdGlvbnMgd2l0aCBNb3Njb3cgYWdhaW4uCiAjCiAjIFpvbmUJTkFNRQkJR01UT0ZGCVJVTEVTCUZPUk1BVAlbVU5USUxdCiBab25lCUV1cm9wZS9NaW5zawkxOjUwOjE2IC0JTE1UCTE4ODAKQEAgLTgyNCw3ICs4MTAsOCBAQAogCQkJMzowMAlSdXNzaWEJTVNLL01TRAkxOTkwCiAJCQkzOjAwCS0JTVNLCTE5OTEgTWFyIDMxICAyOjAwcwogCQkJMjowMAlSdXNzaWEJRUUlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkzOjAwCS0JKzAzCisJCQkzOjAwCS0JRkVUCTIwMTQgT2N0IDI2ICAxOjAwcworCQkJMzowMAktCU1TSwogCiAjIEJlbGdpdW0KICMKQEAgLTEzMzIsNyArMTMxOSw3IEBACiAjIGh0dHA6Ly93d3cucGFybGFtZW50LWJlcmxpbi5kZS9wZHMtZnJha3Rpb24ubnNmLzcyNzQ1OTEyN2M4YjY2ZWU4NTI1NjYyMzAwNDU5MDk5L2RlZmM3N2NiNzg0ZjE4MGFjMTI1NmMyYjAwMzAyNzRiLyRGSUxFL2JlcnNhcmludC5wZGYKICMgc2F5cyB0aGF0IEJlcnNhcmluIGlzc3VlZCBhbiBvcmRlciB0byB1c2UgTW9zY293IHRpbWUgb24gTWF5IDIwLgogIyBIb3dldmVyLCBNb3Njb3cgZGlkIG5vdCBvYnNlcnZlIGRheWxpZ2h0IHNhdmluZyBpbiAxOTQ1LCBzbwotIyB0aGlzIHdhcyBlcXVpdmFsZW50IHRvIFVUICswMywgbm90ICswNC4KKyMgdGhpcyB3YXMgZXF1aXZhbGVudCB0byBDRU1UIChHTVQrMyksIG5vdCBHTVQrNC4KIAogCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIvUwpAQCAtMjI5Niw2ICsyMjgzLDcgQEAKICMgaHR0cDovL3d3dy53b3JsZHRpbWV6b25lLmNvbS9kc3RfbmV3cy9kc3RfbmV3c19ydXNzaWEtbWFwLTIwMTQtMDcuaHRtbAogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMDYtMDMtMjIpOgorIyBFeGNlcHQgZm9yIE1vc2NvdyBhZnRlciAxOTE5LTA3LTAxLCBJIGludmVudGVkIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9ucy4KICMgTW9zY293IHRpbWUgem9uZSBhYmJyZXZpYXRpb25zIGFmdGVyIDE5MTktMDctMDEsIGFuZCBNb3Njb3cgcnVsZXMgYWZ0ZXIgMTk5MSwKICMgYXJlIGZyb20gQW5kcmV5IEEuIENoZXJub3YuICBUaGUgcmVzdCBpcyBmcm9tIFNoYW5rcyAmIFBvdHRlbmdlciwKICMgZXhjZXB0IHdlIGZvbGxvdyBDaGVybm92J3MgcmVwb3J0IHRoYXQgMTk5MiBEU1QgdHJhbnNpdGlvbnMgd2VyZSBTYXQKQEAgLTIzNzEsNyArMjM1OSw3IEBACiAJCQkgMjowMAlQb2xhbmQJQ0Ulc1QJMTk0NgogCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMTk4OSBNYXIgMjYgIDI6MDBzCiAJCQkgMjowMAlSdXNzaWEJRUUlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkgMzowMAktCSswMwkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSAzOjAwCS0JRkVUCTIwMTQgT2N0IDI2ICAyOjAwcwogCQkJIDI6MDAJLQlFRVQKIAogCkBAIC0yNDI0LDE2ICsyNDEyLDYgQEAKICMgNzgJUlUtU1BFCVNhaW50IFBldGVyc2J1cmcKICMgODMJUlUtTkVOCU5lbmV0cyBBdXRvbm9tb3VzIE9rcnVnCiAKLSMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wOC0yMyk6Ci0jIFRoZSBTb3ZpZXRzIHN3aXRjaGVkIHRvIFVULWJhc2VkIHRpbWUgaW4gMTkxOS4gIERlY3JlZSBOby4gNTkKLSMgKDE5MTktMDItMDgpIGh0dHA6Ly9pc3RtYXQuaW5mby9ub2RlLzM1NTY3IGVzdGFibGlzaGVkIFVULWJhc2VkIHRpbWUKLSMgem9uZXMsIGFuZCBEZWNyZWUgTm8uIDE0NyAoMTkxOS0wMy0yOSkgaHR0cDovL2lzdG1hdC5pbmZvL25vZGUvMzU4NTQKLSMgc3BlY2lmaWVkIGEgdHJhbnNpdGlvbiBkYXRlIG9mIDE5MTktMDctMDEsIGFwcGFyZW50bHkgYXQgMDA6MDAgVVQuCi0jIE5vIGRvdWJ0IG9ubHkgdGhlIFNvdmlldC1jb250cm9sbGVkIHJlZ2lvbnMgc3dpdGNoZWQgb24gdGhhdCBkYXRlOwotIyBsYXRlciB0cmFuc2l0aW9ucyB0byBVVC1iYXNlZCB0aW1lIGluIG90aGVyIHBhcnRzIG9mIFJ1c3NpYSBhcmUKLSMgdGFrZW4gZnJvbSB3aGF0IGFwcGVhciB0byBiZSBndWVzc2VzIGJ5IFNoYW5rcy4KLSMgKFRoYW5rcyB0byBBbGV4YW5kZXIgQmVsb3BvbHNreSBmb3IgcG9pbnRlcnMgdG8gdGhlIGRlY3JlZXMuKQotCiAjIEZyb20gU3RlcGFuIEdvbG9zdW5vdiAoMjAxNi0wMy0wNyk6CiAjIDExLiBSZWdpb25zLXZpb2xhdG9ycywgMTk4MS0xOTgyLgogIyBXaWtpcGVkaWEgcmVmZXJzIHRvCkBAIC0yNDc1LDcgKzI0NTMsNyBAQAogIyBhdHRyaWJ1dGVzIHRoZSAxOTgyIGNoYW5nZXMgdG8gdGhlIEFjdCBvZiB0aGUgQ291bmNpbCBvZiBNaW5pc3RlcnMKICMgb2YgdGhlIFVTU1IgTm8uIDEyNiBmcm9tIDE4LjAyLjE5ODIuICAxOTgwLTkyNS50eHQgYWxzbyBhZGRzCiAjIFVkbXVydGlhIHRvIHRoZSBsaXN0IG9mIGFmZmVjdGVkIHRlcnJpdG9yaWVzIGFuZCBsaXN0cyBLaGF0YW5nc2t5Ci0jIGRpc3RyaWN0IHNlcGFyYXRlbHkgZnJvbSBUYXlteXIgQXV0b25vbW91cyBPa3J1Zy4gIFByb2JhYmx5IGVycm9uZW91c2x5LgorIyBkaXN0cmljdCBzZXBhcmF0ZWx5IGZyb20gVGF5bXlyIEF1dG9ub21vdXMgT2t1cmcuICBQcm9iYWJseSBlcnJvbmVvdXNseS4KICMKICMgVGhlIGFmZmVjdGVkIHRlcnJpdG9yaWVzIGFyZSBjdXJyZW50bHkgbGlzdGVkIHVuZGVyIEV1cm9wZS9Nb3Njb3csCiAjIEFzaWEvWWVrYXRlcmluYnVyZyBhbmQgQXNpYS9LcmFzbm95YXJzay4KQEAgLTI1MzUsNyArMjUxMyw3IEBACiAKIFpvbmUgRXVyb3BlL01vc2NvdwkgMjozMDoxNyAtCUxNVAkxODgwCiAJCQkgMjozMDoxNyAtCU1NVAkxOTE2IEp1bCAgMyAjIE1vc2NvdyBNZWFuIFRpbWUKLQkJCSAyOjMxOjE5IFJ1c3NpYQklcwkxOTE5IEp1bCAgMSAgMDowMHUKKwkJCSAyOjMxOjE5IFJ1c3NpYQklcwkxOTE5IEp1bCAgMSAgMjowMAogCQkJIDM6MDAJUnVzc2lhCSVzCTE5MjEgT2N0CiAJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTIyIE9jdAogCQkJIDI6MDAJLQlFRVQJMTkzMCBKdW4gMjEKQEAgLTI2MTgsMjEgKzI1OTYsMjIgQEAKICMgVGhlIDE5ODggdHJhbnNpdGlvbiBpcyBmcm9tIFVTU1IgYWN0IE5vLiA1ICgxOTg4LTAxLTA0KS4KIAogWm9uZSBFdXJvcGUvVm9sZ29ncmFkCSAyOjU3OjQwIC0JTE1UCTE5MjAgSmFuICAzCi0JCQkgMzowMAktCSswMwkxOTMwIEp1biAyMQotCQkJIDQ6MDAJLQkrMDQJMTk2MSBOb3YgMTEKLQkJCSA0OjAwCVJ1c3NpYQkrMDQvKzA1CTE5ODggTWFyIDI3ICAyOjAwcwotCQkJIDM6MDAJUnVzc2lhCSswMy8rMDQJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkgNDowMAktCSswNAkxOTkyIE1hciAyOSAgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQkrMDMvKzA0CTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJIDQ6MDAJLQkrMDQJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkgMzowMAktCSswMworCQkJIDM6MDAJLQlUU0FUCTE5MjUgQXByICA2ICMgVHNhcml0c3luIFRpbWUKKwkJCSAzOjAwCS0JU1RBVAkxOTMwIEp1biAyMSAjIFN0YWxpbmdyYWQgVGltZQorCQkJIDQ6MDAJLQlTVEFUCTE5NjEgTm92IDExCisJCQkgNDowMAlSdXNzaWEJVk9MJXNUCTE5ODggTWFyIDI3ICAyOjAwcyAjIFZvbGdvZ3JhZCBUCisJCQkgMzowMAlSdXNzaWEJVk9MJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJIDQ6MDAJLQlWT0xUCTE5OTIgTWFyIDI5ICAyOjAwcworCQkJIDM6MDAJUnVzc2lhCU1TSy9NU0QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNDowMAktCU1TSwkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSAzOjAwCS0JTVNLCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wMy0xOCk6CiAjIEV1cm9wZS9LaXJvdiBjb3ZlcnM6CiAjIDQzCVJVLUtJUglLaXJvdiBPYmxhc3QKICMgVGhlIDE5ODkgdHJhbnNpdGlvbiBpcyBmcm9tIFVTU1IgYWN0IE5vLiAyMjcgKDE5ODktMDMtMTQpLgogIwotWm9uZSBFdXJvcGUvS2lyb3YJIDM6MTg6NDggLQlMTVQJMTkxOSBKdWwgIDEgIDA6MDB1Citab25lIEV1cm9wZS9LaXJvdgkgMzoxODo0OCAtCUxNVAkxOTE5IEp1bCAgMSAgMjowMAogCQkJIDM6MDAJLQkrMDMJMTkzMCBKdW4gMjEKIAkJCSA0OjAwCVJ1c3NpYQkrMDQvKzA1CTE5ODkgTWFyIDI2ICAyOjAwcwogCQkJIDM6MDAJUnVzc2lhCSswMy8rMDQJMTk5MSBNYXIgMzEgIDI6MDBzCkBAIC0yNjUwLDE2ICsyNjI5LDE2IEBACiAjIEJ5YWxva296IDE5MTkgc2F5cyBTYW1hcmEgd2FzIDM6MjA6MjAuCiAjIFRoZSAxOTg5IHRyYW5zaXRpb24gaXMgZnJvbSBVU1NSIGFjdCBOby4gMjI3ICgxOTg5LTAzLTE0KS4KIAotWm9uZSBFdXJvcGUvU2FtYXJhCSAzOjIwOjIwIC0JTE1UCTE5MTkgSnVsICAxICAwOjAwdQotCQkJIDM6MDAJLQkrMDMJMTkzMCBKdW4gMjEKLQkJCSA0OjAwCS0JKzA0CTE5MzUgSmFuIDI3Ci0JCQkgNDowMAlSdXNzaWEJKzA0LyswNQkxOTg5IE1hciAyNiAgMjowMHMKLQkJCSAzOjAwCVJ1c3NpYQkrMDMvKzA0CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDI6MDAJUnVzc2lhCSswMi8rMDMJMTk5MSBTZXAgMjkgIDI6MDBzCi0JCQkgMzowMAktCSswMwkxOTkxIE9jdCAyMCAgMzowMAotCQkJIDQ6MDAJUnVzc2lhCSswNC8rMDUJMjAxMCBNYXIgMjggIDI6MDBzCi0JCQkgMzowMAlSdXNzaWEJKzAzLyswNAkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA0OjAwCS0JKzA0Citab25lIEV1cm9wZS9TYW1hcmEJIDM6MjA6MjAgLQlMTVQJMTkxOSBKdWwgIDEgIDI6MDAKKwkJCSAzOjAwCS0JU0FNVAkxOTMwIEp1biAyMSAjIFNhbWFyYSBUaW1lCisJCQkgNDowMAktCVNBTVQJMTkzNSBKYW4gMjcKKwkJCSA0OjAwCVJ1c3NpYQlLVVklc1QJMTk4OSBNYXIgMjYgIDI6MDBzICMgS3V5YnlzaGV2CisJCQkgMzowMAlSdXNzaWEJTVNLL01TRAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSAyOjAwCVJ1c3NpYQlFRSVzVAkxOTkxIFNlcCAyOSAgMjowMHMKKwkJCSAzOjAwCS0JU0FNVAkxOTkxIE9jdCAyMCAgMzowMAorCQkJIDQ6MDAJUnVzc2lhCVNBTSVzVAkyMDEwIE1hciAyOCAgMjowMHMKKwkJCSAzOjAwCVJ1c3NpYQlTQU0lc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkgNDowMAktCVNBTVQKIAogIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE2LTAzLTE4KToKICMgRXVyb3BlL1VseWFub3ZzayBjb3ZlcnM6CkBAIC0yNjc0LDcgKzI2NTMsNyBAQAogIyBGcm9tIE1hdHQgSm9obnNvbiAoMjAxNi0wMy0wOSk6CiAjIGh0dHA6Ly9wdWJsaWNhdGlvbi5wcmF2by5nb3YucnUvRG9jdW1lbnQvVmlldy8wMDAxMjAxNjAzMDkwMDUxCiAKLVpvbmUgRXVyb3BlL1VseWFub3ZzawkgMzoxMzozNiAtCUxNVAkxOTE5IEp1bCAgMSAgMDowMHUKK1pvbmUgRXVyb3BlL1VseWFub3ZzawkgMzoxMzozNiAtCUxNVAkxOTE5IEp1bCAgMSAgMjowMAogCQkJIDM6MDAJLQkrMDMJMTkzMCBKdW4gMjEKIAkJCSA0OjAwCVJ1c3NpYQkrMDQvKzA1CTE5ODkgTWFyIDI2ICAyOjAwcwogCQkJIDM6MDAJUnVzc2lhCSswMy8rMDQJMTk5MSBNYXIgMzEgIDI6MDBzCkBAIC0yNzA2LDEyICsyNjg1LDEyIEBACiAKIFpvbmUgQXNpYS9ZZWthdGVyaW5idXJnCSA0OjAyOjMzIC0JTE1UCTE5MTYgSnVsICAzCiAJCQkgMzo0NTowNSAtCVBNVAkxOTE5IEp1bCAxNSAgNDowMAotCQkJIDQ6MDAJLQkrMDQJMTkzMCBKdW4gMjEKLQkJCSA1OjAwCVJ1c3NpYQkrMDUvKzA2CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDQ6MDAJUnVzc2lhCSswNC8rMDUJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgNTowMAlSdXNzaWEJKzA1LyswNgkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA2OjAwCS0JKzA2CTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDU6MDAJLQkrMDUKKwkJCSA0OjAwCS0JU1ZFVAkxOTMwIEp1biAyMSAjIFN2ZXJkbG92c2sgVGltZQorCQkJIDU6MDAJUnVzc2lhCVNWRSVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA0OjAwCVJ1c3NpYQlTVkUlc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgNTowMAlSdXNzaWEJWUVLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDY6MDAJLQlZRUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDU6MDAJLQlZRUtUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KToKQEAgLTI3MjEsMTIgKzI3MDAsMTIgQEAKICMgQnlhbG9rb3ogMTkxOSBzYXlzIE9tc2sgd2FzIDQ6NTM6MzAuCiAKIFpvbmUgQXNpYS9PbXNrCQkgNDo1MzozMCAtCUxNVAkxOTE5IE5vdiAxNAotCQkJIDU6MDAJLQkrMDUJMTkzMCBKdW4gMjEKLQkJCSA2OjAwCVJ1c3NpYQkrMDYvKzA3CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDU6MDAJUnVzc2lhCSswNS8rMDYJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJKzA2LyswNwkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA3OjAwCS0JKzA3CTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDY6MDAJLQkrMDYKKwkJCSA1OjAwCS0JT01TVAkxOTMwIEp1biAyMSAjIE9tc2sgVGltZQorCQkJIDY6MDAJUnVzc2lhCU9NUyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA1OjAwCVJ1c3NpYQlPTVMlc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgNjowMAlSdXNzaWEJT01TJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDc6MDAJLQlPTVNUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDY6MDAJLQlPTVNUCiAKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNi0wMi0yMik6CiAjIEFzaWEvQmFybmF1bCBjb3ZlcnM6CkBAIC0yODA2LDcgKzI3ODUsNyBAQAogIyBOb3RlIHRoYXQgdGltZSBiZWx0cyAobnVtYmVyZWQgZnJvbSAyIChNb3Njb3cpIHRvIDEyIGFjY29yZGluZyB0byB0aGVpcgogIyBHTVQvVVRDIG9mZnNldCBhbmQgaGF2aW5nIHRvbyBtYW55IGV4Y2VwdGlvbnMgbGlrZSByZWdpb25zIGZvcm1hbGx5CiAjIGJlbG9uZ2luZyB0byBvbmUgYmVsdCBidXQgdXNpbmcgdGltZSBmcm9tIGFub3RoZXIpIHdlcmUgcmVwbGFjZWQKLSMgd2l0aCB0aW1lIHpvbmVzIGluIDIwMTEgd2l0aCBkaWZmZXJlbnQgbnVtYmVyaW5nICh0aGVyZSB3YXMgYQorIyB3aXRoIHRpbWUgem9uZXMgaW4gMjAxMSB3aXRoIGRpZmZlcmVudCBudW1iZXJpbmdzICh0aGVyZSB3YXMgYQogIyAyLWhvdXIgZ2FwIGJldHdlZW4gc2Vjb25kIGFuZCB0aGlyZCB6b25lcyBpbiAyMDExLTIwMTQpLgogCiAjIEZyb20gU3RlcGFuIEdvbG9zdW5vdiAoMjAxNi0wNC0xMik6CkBAIC0yODg5LDEyICsyODY4LDEyIEBACiAjIEJ5YWxva296IDE5MTkgc2F5cyBLcmFzbm95YXJzayB3YXMgNjoxMToyNi4KIAogWm9uZSBBc2lhL0tyYXNub3lhcnNrCSA2OjExOjI2IC0JTE1UCTE5MjAgSmFuICA2Ci0JCQkgNjowMAktCSswNgkxOTMwIEp1biAyMQotCQkJIDc6MDAJUnVzc2lhCSswNy8rMDgJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkgNjowMAlSdXNzaWEJKzA2LyswNwkxOTkyIEphbiAxOSAgMjowMHMKLQkJCSA3OjAwCVJ1c3NpYQkrMDcvKzA4CTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJIDg6MDAJLQkrMDgJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkgNzowMAktCSswNworCQkJIDY6MDAJLQlLUkFUCTE5MzAgSnVuIDIxICMgS3Jhc25veWFyc2sgVGltZQorCQkJIDc6MDAJUnVzc2lhCUtSQSVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA2OjAwCVJ1c3NpYQlLUkElc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgNzowMAlSdXNzaWEJS1JBJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDg6MDAJLQlLUkFUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDc6MDAJLQlLUkFUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKSwgcGVyIE9zY2FyIHZhbiBWbGlqbWVuICgyMDAxLTA4LTI1KToKQEAgLTI5MTEsMTIgKzI4OTAsMTIgQEAKIAogWm9uZSBBc2lhL0lya3V0c2sJIDY6NTc6MDUgLQlMTVQJMTg4MAogCQkJIDY6NTc6MDUgLQlJTVQJMTkyMCBKYW4gMjUgIyBJcmt1dHNrIE1lYW4gVGltZQotCQkJIDc6MDAJLQkrMDcJMTkzMCBKdW4gMjEKLQkJCSA4OjAwCVJ1c3NpYQkrMDgvKzA5CTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDc6MDAJUnVzc2lhCSswNy8rMDgJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgODowMAlSdXNzaWEJKzA4LyswOQkyMDExIE1hciAyNyAgMjowMHMKLQkJCSA5OjAwCS0JKzA5CTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJIDg6MDAJLQkrMDgKKwkJCSA3OjAwCS0JSVJLVAkxOTMwIEp1biAyMSAjIElya3V0c2sgVGltZQorCQkJIDg6MDAJUnVzc2lhCUlSSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA3OjAwCVJ1c3NpYQlJUkslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJSVJLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJIDk6MDAJLQlJUktUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDg6MDAJLQlJUktUCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTA2KToKQEAgLTI5MzMsMTMgKzI5MTIsMTMgQEAKICMgaHR0cDovL3B1YmxpY2F0aW9uLnByYXZvLmdvdi5ydS9Eb2N1bWVudC9WaWV3LzAwMDEyMDE1MTIzMDAxMDcKIAogWm9uZSBBc2lhL0NoaXRhCSA3OjMzOjUyIC0JTE1UCTE5MTkgRGVjIDE1Ci0JCQkgODowMAktCSswOAkxOTMwIEp1biAyMQotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkgODowMAlSdXNzaWEJKzA4LyswOQkxOTkyIEphbiAxOSAgMjowMHMKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJMTA6MDAJLQkrMTAJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkgODowMAktCSswOAkyMDE2IE1hciAyNyAgMjowMAotCQkJIDk6MDAJLQkrMDkKKwkJCSA4OjAwCS0JWUFLVAkxOTMwIEp1biAyMSAjIFlha3V0c2sgVGltZQorCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCSA4OjAwCVJ1c3NpYQlZQUslc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkgOTowMAlSdXNzaWEJWUFLJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTA6MDAJLQlZQUtUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJIDg6MDAJLQlJUktUCTIwMTYgTWFyIDI3ICAyOjAwCisJCQkgOTowMAktCVlBS1QKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpLCBwZXIgT3NjYXIgdmFuIFZsaWptZW4gKDIwMDktMTEtMjkpOgpAQCAtMjk3OSwxMiArMjk1OCwxMiBAQAogIyBCeWFsb2tveiAxOTE5IHNheXMgWWFrdXRzayB3YXMgODozODo1OC4KIAogWm9uZSBBc2lhL1lha3V0c2sJIDg6Mzg6NTggLQlMTVQJMTkxOSBEZWMgMTUKLQkJCSA4OjAwCS0JKzA4CTE5MzAgSnVuIDIxCi0JCQkgOTowMAlSdXNzaWEJKzA5LysxMAkxOTkxIE1hciAzMSAgMjowMHMKLQkJCSA4OjAwCVJ1c3NpYQkrMDgvKzA5CTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMDowMAktCSsxMAkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCSA5OjAwCS0JKzA5CisJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEwOjAwCS0JWUFLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCSA5OjAwCS0JWUFLVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6CkBAIC0zMDAyLDEyICsyOTgxLDEyIEBACiAjIEdvIHdpdGggQnlhbG9rb3ouCiAKIFpvbmUgQXNpYS9WbGFkaXZvc3RvawkgODo0NzozMSAtCUxNVAkxOTIyIE5vdiAxNQotCQkJIDk6MDAJLQkrMDkJMTkzMCBKdW4gMjEKLQkJCTEwOjAwCVJ1c3NpYQkrMTAvKzExCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkyMDExIE1hciAyNyAgMjowMHMKLQkJCTExOjAwCS0JKzExCTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJMTA6MDAJLQkrMTAKKwkJCSA5OjAwCS0JVkxBVAkxOTMwIEp1biAyMSAjIFZsYWRpdm9zdG9rIFRpbWUKKwkJCTEwOjAwCVJ1c3NpYQlWTEElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgOTowMAlSdXNzaWEJVkxBJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCVZMQSVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JVkxBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JVkxBVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyk6CkBAIC0zMDI1LDE0ICszMDA0LDE0IEBACiAjIFRoaXMgdHJhbnNpdGlvbiBpcyBubyBkb3VidCB3cm9uZywgYnV0IHdlIGhhdmUgbm8gYmV0dGVyIGluZm8uCiAKIFpvbmUgQXNpYS9LaGFuZHlnYQkgOTowMjoxMyAtCUxNVAkxOTE5IERlYyAxNQotCQkJIDg6MDAJLQkrMDgJMTkzMCBKdW4gMjEKLQkJCSA5OjAwCVJ1c3NpYQkrMDkvKzEwCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJIDg6MDAJUnVzc2lhCSswOC8rMDkJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkgOTowMAlSdXNzaWEJKzA5LysxMAkyMDA0Ci0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkyMDExIE1hciAyNyAgMjowMHMKLQkJCTExOjAwCS0JKzExCTIwMTEgU2VwIDEzICAwOjAwcyAjIERlY3JlZSA3MjU/Ci0JCQkxMDowMAktCSsxMAkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCSA5OjAwCS0JKzA5CisJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKKwkJCSA5OjAwCVJ1c3NpYQlZQUslc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkgODowMAlSdXNzaWEJWUFLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJIDk6MDAJUnVzc2lhCVlBSyVzVAkyMDA0CisJCQkxMDowMAlSdXNzaWEJVkxBJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTE6MDAJLQlWTEFUCTIwMTEgU2VwIDEzICAwOjAwcyAjIERlY3JlZSA3MjU/CisJCQkxMDowMAktCVlBS1QJMjAxNCBPY3QgMjYgIDI6MDBzCisJCQkgOTowMAktCVlBS1QKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgpAQCAtMzA0OCwxNCArMzAyNywxNSBAQAogCiAjIFRoZSBab25lIG5hbWUgc2hvdWxkIGJlIEFzaWEvWXV6aG5vLVNha2hhbGluc2ssIGJ1dCB0aGF0J3MgdG9vIGxvbmcuCiBab25lIEFzaWEvU2FraGFsaW4JIDk6MzA6NDggLQlMTVQJMTkwNSBBdWcgMjMKLQkJCSA5OjAwCS0JKzA5CTE5NDUgQXVnIDI1Ci0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTkxIE1hciAzMSAgMjowMHMgIyBTYWtoYWxpbiBUCi0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkxOTkyIEphbiAxOSAgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTE5OTcgTWFyIGxhc3RTdW4gIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkyMDExIE1hciAyNyAgMjowMHMKLQkJCTExOjAwCS0JKzExCTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJMTA6MDAJLQkrMTAJMjAxNiBNYXIgMjcgIDI6MDBzCi0JCQkxMTowMAktCSsxMQorCQkJIDk6MDAJLQlKQ1NUCTE5MzcgT2N0ICAxCisJCQkgOTowMAktCUpTVAkxOTQ1IEF1ZyAyNQorCQkJMTE6MDAJUnVzc2lhCVNBSyVzVAkxOTkxIE1hciAzMSAgMjowMHMgIyBTYWtoYWxpbiBUCisJCQkxMDowMAlSdXNzaWEJU0FLJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCVNBSyVzVAkxOTk3IE1hciBsYXN0U3VuICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCVNBSyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JU0FLVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JU0FLVAkyMDE2IE1hciAyNyAgMjowMHMKKwkJCTExOjAwCS0JU0FLVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwOS0xMS0yOSk6CkBAIC0zMDc4LDEzICszMDU4LDEzIEBACiAjIGh0dHA6Ly9wdWJsaWNhdGlvbi5wcmF2by5nb3YucnUvRG9jdW1lbnQvVmlldy8wMDAxMjAxNjA0MDUwMDM4CiAKIFpvbmUgQXNpYS9NYWdhZGFuCTEwOjAzOjEyIC0JTE1UCTE5MjQgTWF5ICAyCi0JCQkxMDowMAktCSsxMAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkxMDowMAlSdXNzaWEJKzEwLysxMQkxOTkyIEphbiAxOSAgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTIwMTEgTWFyIDI3ICAyOjAwcwotCQkJMTI6MDAJLQkrMTIJMjAxNCBPY3QgMjYgIDI6MDBzCi0JCQkxMDowMAktCSsxMAkyMDE2IEFwciAyNCAgMjowMHMKLQkJCTExOjAwCS0JKzExCisJCQkxMDowMAktCU1BR1QJMTkzMCBKdW4gMjEgIyBNYWdhZGFuIFRpbWUKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMDowMAlSdXNzaWEJTUFHJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkyMDExIE1hciAyNyAgMjowMHMKKwkJCTEyOjAwCS0JTUFHVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JTUFHVAkyMDE2IEFwciAyNCAgMjowMHMKKwkJCTExOjAwCS0JTUFHVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wNik6CkBAIC0zMTI3LDE0ICszMTA3LDE3IEBACiAjIGluIFJ1c3NpYW4uKSAgSW4gYWRkaXRpb24sIFNyZWRuZWtvbHltc2sgYXBwZWFycyB0byBiZSBhIG11Y2ggb2xkZXIKICMgc2V0dGxlbWVudCBhbmQgdGhlIHBvcHVsYXRpb24gb2YgWnlyeWFua2Egc2VlbXMgdG8gYmUgZGVjbGluaW5nLgogIyBHbyB3aXRoIFNyZWRuZWtvbHltc2suCisjCisjIFNpbmNlIE1hZ2FkYW4gT2JsYXN0IG1vdmVzIHRvIFVUQysxMCBvbiAyMDE0LTEwLTI2LCB3ZSBjYW5ub3Qga2VlcCB1c2luZyBNQUdUCisjIGFzIHRoZSBhYmJyZXZpYXRpb24uICBVc2UgU1JFVCBpbnN0ZWFkLgogCiBab25lIEFzaWEvU3JlZG5la29seW1zawkxMDoxNDo1MiAtCUxNVAkxOTI0IE1heSAgMgotCQkJMTA6MDAJLQkrMTAJMTkzMCBKdW4gMjEKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkyMDExIE1hciAyNyAgMjowMHMKLQkJCTEyOjAwCS0JKzEyCTIwMTQgT2N0IDI2ICAyOjAwcwotCQkJMTE6MDAJLQkrMTEKKwkJCTEwOjAwCS0JTUFHVAkxOTMwIEp1biAyMSAjIE1hZ2FkYW4gVGltZQorCQkJMTE6MDAJUnVzc2lhCU1BRyVzVAkxOTkxIE1hciAzMSAgMjowMHMKKwkJCTEwOjAwCVJ1c3NpYQlNQUclc1QJMTk5MiBKYW4gMTkgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTIwMTEgTWFyIDI3ICAyOjAwcworCQkJMTI6MDAJLQlNQUdUCTIwMTQgT2N0IDI2ICAyOjAwcworCQkJMTE6MDAJLQlTUkVUCSMgU3JlZG5la29seW1zayBUaW1lCiAKIAogIyBGcm9tIFRpbSBQYXJlbnRpICgyMDE0LTA3LTAzKToKQEAgLTMxNTIsMTQgKzMxMzUsMTQgQEAKICMgVVRDKzEyIHNpbmNlIGF0IGxlYXN0IHRoZW4sIHRvby4KIAogWm9uZSBBc2lhL1VzdC1OZXJhCSA5OjMyOjU0IC0JTE1UCTE5MTkgRGVjIDE1Ci0JCQkgODowMAktCSswOAkxOTMwIEp1biAyMQotCQkJIDk6MDAJUnVzc2lhCSswOS8rMTAJMTk4MSBBcHIgIDEKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTE5OTEgTWFyIDMxICAyOjAwcwotCQkJMTA6MDAJUnVzc2lhCSsxMC8rMTEJMTk5MiBKYW4gMTkgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkyMDExIE1hciAyNyAgMjowMHMKLQkJCTEyOjAwCS0JKzEyCTIwMTEgU2VwIDEzICAwOjAwcyAjIERlY3JlZSA3MjU/Ci0JCQkxMTowMAktCSsxMQkyMDE0IE9jdCAyNiAgMjowMHMKLQkJCTEwOjAwCS0JKzEwCisJCQkgODowMAktCVlBS1QJMTkzMCBKdW4gMjEgIyBZYWt1dHNrIFRpbWUKKwkJCSA5OjAwCVJ1c3NpYQlZQUtUCTE5ODEgQXByICAxCisJCQkxMTowMAlSdXNzaWEJTUFHJXNUCTE5OTEgTWFyIDMxICAyOjAwcworCQkJMTA6MDAJUnVzc2lhCU1BRyVzVAkxOTkyIEphbiAxOSAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlNQUclc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCU1BR1QJMjAxMSBTZXAgMTMgIDA6MDBzICMgRGVjcmVlIDcyNT8KKwkJCTExOjAwCS0JVkxBVAkyMDE0IE9jdCAyNiAgMjowMHMKKwkJCTEwOjAwCS0JVkxBVAogCiAKICMgRnJvbSBUaW0gUGFyZW50aSAoMjAxNC0wNy0wMyksIHBlciBPc2NhciB2YW4gVmxpam1lbiAoMjAwMS0wOC0yNSk6CkBAIC0zMTcyLDEyICszMTU1LDEyIEBACiAjIFRoZSBab25lIG5hbWUgc2hvdWxkIGJlIEFzaWEvUGV0cm9wYXZsb3Zzay1LYW1jaGF0c2tpIG9yIHBlcmhhcHMKICMgQXNpYS9QZXRyb3BhdmxvdnNrLUthbWNoYXRza3ksIGJ1dCB0aGVzZSBhcmUgdG9vIGxvbmcuCiBab25lIEFzaWEvS2FtY2hhdGthCTEwOjM0OjM2IC0JTE1UCTE5MjIgTm92IDEwCi0JCQkxMTowMAktCSsxMQkxOTMwIEp1biAyMQotCQkJMTI6MDAJUnVzc2lhCSsxMi8rMTMJMTk5MSBNYXIgMzEgIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkxOTkyIEphbiAxOSAgMjowMHMKLQkJCTEyOjAwCVJ1c3NpYQkrMTIvKzEzCTIwMTAgTWFyIDI4ICAyOjAwcwotCQkJMTE6MDAJUnVzc2lhCSsxMS8rMTIJMjAxMSBNYXIgMjcgIDI6MDBzCi0JCQkxMjowMAktCSsxMgorCQkJMTE6MDAJLQlQRVRUCTE5MzAgSnVuIDIxICMgUC1LIFRpbWUKKwkJCTEyOjAwCVJ1c3NpYQlQRVQlc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJUEVUJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTI6MDAJUnVzc2lhCVBFVCVzVAkyMDEwIE1hciAyOCAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlQRVQlc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCVBFVFQKIAogCiAjIEZyb20gVGltIFBhcmVudGkgKDIwMTQtMDctMDMpOgpAQCAtMzE4NSwxMyArMzE2OCwxMyBAQAogIyA4NwlSVS1DSFUJQ2h1a290a2EgQXV0b25vbW91cyBPa3J1ZwogCiBab25lIEFzaWEvQW5hZHlyCTExOjQ5OjU2IC0JTE1UCTE5MjQgTWF5ICAyCi0JCQkxMjowMAktCSsxMgkxOTMwIEp1biAyMQotCQkJMTM6MDAJUnVzc2lhCSsxMy8rMTQJMTk4MiBBcHIgIDEgIDA6MDBzCi0JCQkxMjowMAlSdXNzaWEJKzEyLysxMwkxOTkxIE1hciAzMSAgMjowMHMKLQkJCTExOjAwCVJ1c3NpYQkrMTEvKzEyCTE5OTIgSmFuIDE5ICAyOjAwcwotCQkJMTI6MDAJUnVzc2lhCSsxMi8rMTMJMjAxMCBNYXIgMjggIDI6MDBzCi0JCQkxMTowMAlSdXNzaWEJKzExLysxMgkyMDExIE1hciAyNyAgMjowMHMKLQkJCTEyOjAwCS0JKzEyCisJCQkxMjowMAktCUFOQVQJMTkzMCBKdW4gMjEgIyBBbmFkeXIgVGltZQorCQkJMTM6MDAJUnVzc2lhCUFOQSVzVAkxOTgyIEFwciAgMSAgMDowMHMKKwkJCTEyOjAwCVJ1c3NpYQlBTkElc1QJMTk5MSBNYXIgMzEgIDI6MDBzCisJCQkxMTowMAlSdXNzaWEJQU5BJXNUCTE5OTIgSmFuIDE5ICAyOjAwcworCQkJMTI6MDAJUnVzc2lhCUFOQSVzVAkyMDEwIE1hciAyOCAgMjowMHMKKwkJCTExOjAwCVJ1c3NpYQlBTkElc1QJMjAxMSBNYXIgMjcgIDI6MDBzCisJCQkxMjowMAktCUFOQVQKIAogCiAjIFNhbiBNYXJpbm8KQEAgLTM1MTIsMTQgKzM0OTUsNiBAQAogIyBFbmdpbmVlcmVkIFN0YW5kYXJkIFRpbWUsIiBzYWlkIFR3aXR0ZXIgdXNlciBAYXlzZWthcmFoYXNhbi4KICMgaHR0cDovL3d3dy5iYmMuY29tL25ld3Mvd29ybGQtZXVyb3BlLTM0NjMxMzI2CiAKLSMgRnJvbSBCdXJhayBBWURJTiAoMjAxNi0wOS0wOCk6Ci0jIFR1cmtleSB3aWxsIHN0YXkgaW4gRGF5bGlnaHQgU2F2aW5nIFRpbWUgZXZlbiBpbiB3aW50ZXIuLi4uCi0jIGh0dHA6Ly93d3cucmVzbWlnYXpldGUuZ292LnRyL2Vza2lsZXIvMjAxNi8wOS8yMDE2MDkwOC0yLnBkZgotIwotIyBGcm9tIFBhdWwgRWdnZXJ0ICgyMDE2LTA5LTA3KToKLSMgVGhlIGNoYW5nZSBpcyBwZXJtYW5lbnQsIHNvIHRoaXMgaXMgdGhlIG5ldyBzdGFuZGFyZCB0aW1lIGluIFR1cmtleS4KLSMgSXQgdGFrZXMgZWZmZWN0IHRvZGF5LCB3aGljaCBpcyBub3QgbXVjaCBub3RpY2UuCi0KICMgUnVsZQlOQU1FCUZST00JVE8JVFlQRQlJTglPTglBVAlTQVZFCUxFVFRFUi9TCiBSdWxlCVR1cmtleQkxOTE2CW9ubHkJLQlNYXkJIDEJMDowMAkxOjAwCVMKIFJ1bGUJVHVya2V5CTE5MTYJb25seQktCU9jdAkgMQkwOjAwCTAJLQpAQCAtMzU4Myw3ICszNTU4LDcgQEAKIFpvbmUJRXVyb3BlL0lzdGFuYnVsCTE6NTU6NTIgLQlMTVQJMTg4MAogCQkJMTo1Njo1NgktCUlNVAkxOTEwIE9jdCAjIElzdGFuYnVsIE1lYW4gVGltZT8KIAkJCTI6MDAJVHVya2V5CUVFJXNUCTE5NzggT2N0IDE1Ci0JCQkzOjAwCVR1cmtleQkrMDMvKzA0CTE5ODUgQXByIDIwCisJCQkzOjAwCVR1cmtleQlUUiVzVAkxOTg1IEFwciAyMCAjIFR1cmtleSBUaW1lCiAJCQkyOjAwCVR1cmtleQlFRSVzVAkyMDA3CiAJCQkyOjAwCUVVCUVFJXNUCTIwMTEgTWFyIDI3ICAxOjAwdQogCQkJMjowMAktCUVFVAkyMDExIE1hciAyOCAgMTowMHUKQEAgLTM1OTEsOCArMzU2Niw3IEBACiAJCQkyOjAwCS0JRUVUCTIwMTQgTWFyIDMxICAxOjAwdQogCQkJMjowMAlFVQlFRSVzVAkyMDE1IE9jdCAyNSAgMTowMHUKIAkJCTI6MDAJMTowMAlFRVNUCTIwMTUgTm92ICA4ICAxOjAwdQotCQkJMjowMAlFVQlFRSVzVAkyMDE2IFNlcCAgNwotCQkJMzowMAktCSswMworCQkJMjowMAlFVQlFRSVzVAogTGluawlFdXJvcGUvSXN0YW5idWwJQXNpYS9Jc3RhbmJ1bAkjIElzdGFuYnVsIGlzIGluIGJvdGggY29udGluZW50cy4KIAogIyBVa3JhaW5lCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvZmFjdG9yeSBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9mYWN0b3J5CmluZGV4IDdkNzk2OTMuLjBhNjA0MWQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9mYWN0b3J5CisrKyBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9mYWN0b3J5CkBAIC0yNCwxMCArMjQsOSBAQAogIyBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4sIHNvIGNsYXJpZmllZCBhcyBvZgogIyAyMDA5LTA1LTE3IGJ5IEFydGh1ciBEYXZpZCBPbHNvbi4KIAotIyBGb3IgZGlzdHJpYnV0b3JzIHdobyBkb24ndCB3YW50IHRvIHB1dCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBpbgotIyB0aGVpciBpbnN0YWxsYXRpb24gcHJvY2VkdXJlcy4gIFVzZXJzIHRoYXQgcnVuICdkYXRlJyB3aWxsIGdldCB0aGUKLSMgdGltZSB6b25lIGFiYnJldmlhdGlvbiAiLTAwIiwgaW5kaWNhdGluZyB0aGF0IHRoZSBhY3R1YWwgdGltZSB6b25lCi0jIGlzIHVua25vd24uCisjIEZvciBjb21wYW5pZXMgd2hvIGRvbid0IHdhbnQgdG8gcHV0IHRpbWUgem9uZSBzcGVjaWZpY2F0aW9uIGluCisjIHRoZWlyIGluc3RhbGxhdGlvbiBwcm9jZWR1cmVzLiAgV2hlbiB1c2VycyBydW4gZGF0ZSwgdGhleSdsbCBnZXQgdGhlIG1lc3NhZ2UuCisjIEFsc28gdXNlZnVsIGZvciB0aGUgImNvbXAuc291cmNlcyIgdmVyc2lvbi4KIAogIyBab25lCU5BTUUJR01UT0ZGCVJVTEVTCUZPUk1BVAotWm9uZQlGYWN0b3J5CTAJLQktMDAKK1pvbmUJRmFjdG9yeQkwCS0gIkxvY2FsIHRpbWUgem9uZSBtdXN0IGJlIHNldC0tc2VlIHppYyBtYW51YWwgcGFnZSIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9sZWFwc2Vjb25kcyBiL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9sZWFwc2Vjb25kcwppbmRleCA3MWQ3NzRkLi5hMDhmYmM3IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbGVhcHNlY29uZHMKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL2xlYXBzZWNvbmRzCkBAIC03OSw3ICs3OSw2IEBACiBMZWFwCTIwMDgJRGVjCTMxCTIzOjU5OjYwCSsJUwogTGVhcAkyMDEyCUp1bgkzMAkyMzo1OTo2MAkrCVMKIExlYXAJMjAxNQlKdW4JMzAJMjM6NTk6NjAJKwlTCi1MZWFwCTIwMTYJRGVjCTMxCTIzOjU5OjYwCSsJUwogCi0jCVVwZGF0ZWQgdGhyb3VnaCBJRVJTIEJ1bGxldGluIEM1MgotIwlGaWxlIGV4cGlyZXMgb246ICAyOCBKdW5lIDIwMTcKKyMJVXBkYXRlZCB0aHJvdWdoIElFUlMgQnVsbGV0aW4gQzUxCisjCUZpbGUgZXhwaXJlcyBvbjogIDI4IERlY2VtYmVyIDIwMTYKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ub3J0aGFtZXJpY2EgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvbm9ydGhhbWVyaWNhCmluZGV4IDhhYjYzNWQuLmVjNTk1MTAgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9ub3J0aGFtZXJpY2EKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL25vcnRoYW1lcmljYQpAQCAtNDM2LDQyICs0MzYsMTEgQEAKICMgbm9ydGggb2YgdGhlIFNhbG1vbiBSaXZlciwgYW5kIHRoZSB0b3ducyBvZiBCdXJnZG9yZiBhbmQgV2FycmVuKSwKICMgTmV2YWRhIChleGNlcHQgV2VzdCBXZW5kb3ZlciksIE9yZWdvbiAoZXhjZXB0IHRoZSBub3J0aGVybiAzLzQgb2YKICMgTWFsaGV1ciBjb3VudHkpLCBhbmQgV2FzaGluZ3RvbgotCi0jIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTYtMDgtMjApOgotIyBJbiBlYXJseSBGZWJydWFyeSAxOTQ4LCBpbiByZXNwb25zZSB0byBDYWxpZm9ybmlhJ3MgZWxlY3RyaWNpdHkgc2hvcnRhZ2UsCi0jIFBHJkUgY2hhbmdlZCBwb3dlciBmcmVxdWVuY3kgZnJvbSA2MCB0byA1OS41IEh6IGR1cmluZyBkYXlsaWdodCBob3VycywKLSMgY2F1c2luZyBlbGVjdHJpYyBjbG9ja3MgdG8gbG9zZSBzaXggbWludXRlcyBwZXIgZGF5LiAgKFRoaXMgZGlkIG5vdCBjaGFuZ2UKLSMgbGVnYWwgdGltZSwgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBkYXRhIGhlcmUuKSAgU2VlOgotIyBSb3NzIFNBLiBBbiBlbmVyZ3kgY3Jpc2lzIGZyb20gdGhlIHBhc3Q6IE5vcnRoZXJuIENhbGlmb3JuaWEgaW4gMTk0OC4KLSMgV29ya2luZyBQYXBlciBOby4gOCwgSW5zdGl0dXRlIG9mIEdvdmVybm1lbnRhbCBTdHVkaWVzLCBVQyBCZXJrZWxleSwKLSMgMTk3My0xMS4gIGh0dHA6Ly9lc2Nob2xhcnNoaXAub3JnL3VjL2l0ZW0vOHgyMmszMGMKLSMKLSMgSW4gYW5vdGhlciBtZWFzdXJlIHRvIHNhdmUgZWxlY3RyaWNpdHksIERTVCB3YXMgaW5zdGl0dXRlZCBmcm9tIDE5NDgtMDMtMTQKLSMgYXQgMDI6MDEgdG8gMTk0OS0wMS0xNiBhdCAwMjowMCwgd2l0aCB0aGUgZ292ZXJub3IgaGF2aW5nIHRoZSBvcHRpb24gdG8gbW92ZQotIyB0aGUgZmFsbGJhY2sgdHJhbnNpdGlvbiBlYXJsaWVyLiAgU2VlIHBhZ2VzIDMtNCBvZjoKLSMgaHR0cDovL2NsZXJrLmFzc2VtYmx5LmNhLmdvdi9zaXRlcy9jbGVyay5hc3NlbWJseS5jYS5nb3YvZmlsZXMvYXJjaGl2ZS9TdGF0dXRlcy8xOTQ4LzQ4Vm9sMV9DaGFwdGVycy5wZGYKLSMKLSMgSW4gcmVzcG9uc2U6Ci0jCi0jICAgR292ZXJub3IgV2FycmVuIHJlY2VpdmVkIGEgdG9ycmVudCBvZiBvYmplY3RpbmcgbWFpbCwgYW5kIGl0IGlzIG5vdCB0b28gbXVjaAotIyAgIHRvIHNwZWN1bGF0ZSB0aGF0IHRoZSBvYmplY3Rpb25zIHRvIERheWxpZ2h0IFNhdmluZyBUaW1lIHdlcmUgb25lIGltcG9ydGFudAotIyAgIGZhY3RvciBpbiB0aGUgZGVmZWF0IG9mIHRoZSBEZXdleS1XYXJyZW4gUHJlc2lkZW50aWFsIHRpY2tldCBpbiBDYWxpZm9ybmlhLgotIyAgICAgLS0gUm9zcywgcCAyNQotIwotIyBPbiBEZWNlbWJlciA4IHRoZSBnb3Zlcm5vciBleGVyY2lzZWQgdGhlIG9wdGlvbiwgc2V0dGluZyB0aGUgZGF0ZSB0byBKYW51YXJ5IDEKLSMgKExBIFRpbWVzIDE5NDgtMTItMDkpLiAgVGhlIHRyYW5zaXRpb24gdGltZSB3YXMgMDI6MDAgKExBIFRpbWVzIDE5NDktMDEtMDEpLgotIwotIyBEZXNwaXRlIHRoZSBjb250cm92ZXJzeSwgaW4gMTk0OSBDYWxpZm9ybmlhIHZvdGVycyBhcHByb3ZlZCBQcm9wb3NpdGlvbiAxMiwKLSMgd2hpY2ggZXN0YWJsaXNoZWQgRFNUIGZyb20gQXByaWwncyBsYXN0IFN1bmRheSBhdCAwMTowMCB1bnRpbCBTZXB0ZW1iZXIncwotIyBsYXN0IFN1bmRheSBhdCAwMjowMC4gVGhpcyB3YXMgYW1lbmRlZCBieSAxOTYyJ3MgUHJvcG9zaXRpb24gNiwgd2hpY2ggY2hhbmdlZAotIyB0aGUgZmFsbC1iYWNrIGRhdGUgdG8gT2N0b2JlcidzIGxhc3QgU3VuZGF5LiBTZWU6Ci0jIGh0dHA6Ly9yZXBvc2l0b3J5LnVjaGFzdGluZ3MuZWR1L2NnaS92aWV3Y29udGVudC5jZ2k/YXJ0aWNsZT0xNTAxJmNvbnRleHQ9Y2FfYmFsbG90X3Byb3BzCi0jIGh0dHA6Ly9yZXBvc2l0b3J5LnVjaGFzdGluZ3MuZWR1L2NnaS92aWV3Y29udGVudC5jZ2k/YXJ0aWNsZT0xNjM2JmNvbnRleHQ9Y2FfYmFsbG90X3Byb3BzCiAjCiAjIFJ1bGUJTkFNRQlGUk9NCVRPCVRZUEUJSU4JT04JQVQJU0FWRQlMRVRURVIKLVJ1bGUJQ0EJMTk0OAlvbmx5CS0JTWFyCTE0CTI6MDEJMTowMAlECitSdWxlCUNBCTE5NDgJb25seQktCU1hcgkxNAkyOjAwCTE6MDAJRAogUnVsZQlDQQkxOTQ5CW9ubHkJLQlKYW4JIDEJMjowMAkwCVMKLVJ1bGUJQ0EJMTk1MAkxOTY2CS0JQXByCWxhc3RTdW4JMTowMAkxOjAwCUQKK1J1bGUJQ0EJMTk1MAkxOTY2CS0JQXByCWxhc3RTdW4JMjowMAkxOjAwCUQKIFJ1bGUJQ0EJMTk1MAkxOTYxCS0JU2VwCWxhc3RTdW4JMjowMAkwCVMKIFJ1bGUJQ0EJMTk2MgkxOTY2CS0JT2N0CWxhc3RTdW4JMjowMAkwCVMKICMgWm9uZQlOQU1FCQlHTVRPRkYJUlVMRVMJRk9STUFUCVtVTlRJTF0KQEAgLTMzMzUsNyArMzMwNCw3IEBACiAjIGluZGljYXRpbmcgdGhhdCB0aGUgbm9ybWFsIEVUIHJ1bGVzIGFyZSBmb2xsb3dlZC4KICMKICMgRnJvbSBQYXVsIEVnZ2VydCAoMjAxNC0wOC0xOSk6Ci0jIFRoZSAyMDE0LTA4LTEzIENhYmluZXQgbWVldGluZyBkZWNpZGVkIHRvIHN0YXkgb24gVVQgLTA0IHllYXItcm91bmQuICBTZWU6CisjIFRoZSAyMDE0LTA4LTEzIENhYmluZXQgbWVldGluZyBkZWNpZGVkIHRvIHN0YXkgb24gVVRDLTQgeWVhci1yb3VuZC4gIFNlZToKICMgaHR0cDovL3Rjd2Vla2x5bmV3cy5jb20vZGF5bGlnaHQtc2F2aW5ncy10aW1lLXRvLWJlLW1haW50YWluZWQtcDUzNTMtMTI3Lmh0bQogIyBNb2RlbCB0aGlzIGFzIGEgc3dpdGNoIGZyb20gRVNUL0VEVCB0byBBU1QgLi4uCiAjIEZyb20gQ2hyaXMgV2FsdG9uICgyMDE0LTExLTA0KToKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9zb3V0aGFtZXJpY2EgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvc291dGhhbWVyaWNhCmluZGV4IGJiYzBhOTUuLjA4Yzg5Y2EgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS9zb3V0aGFtZXJpY2EKKysrIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3NvdXRoYW1lcmljYQpAQCAtNDMzLDkgKzQzMyw5IEBACiAjIHN0dWNrIG9uIFN1bW1lciBkYXlsaWdodCBzYXZpbmdzIHRpbWUgZXZlbiB0aG91Z2ggdGhlIHN1bW1lciBpcyBvdmVyLgogCiAjIEZyb20gUGF1bCBFZ2dlcnQgKDIwMTMtMDktMDUpOgotIyBQZXJoYXBzIFNhbiBMdWlzIG9wZXJhdGVzIG9uIHRoZSBsZWdhbCBmaWN0aW9uIHRoYXQgaXQgaXMgYXQgLTA0CisjIFBlcmhhcHMgU2FuIEx1aXMgb3BlcmF0ZXMgb24gdGhlIGxlZ2FsIGZpY3Rpb24gdGhhdCBpdCBpcyBhdCBVVEMtNAogIyB3aXRoIHBlcnBldHVhbCBzdW1tZXIgdGltZSwgYnV0IG9yZGluYXJ5IHVzYWdlIHR5cGljYWxseSBzZWVtcyB0bwotIyBqdXN0IHNheSBpdCdzIGF0IC0wMzsgc2VlLCBmb3IgZXhhbXBsZSwKKyMganVzdCBzYXkgaXQncyBhdCBVVEMtMzsgc2VlLCBmb3IgZXhhbXBsZSwKICMgaHR0cDovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Ib3JhX29maWNpYWxfYXJnZW50aW5hCiAjIFdlJ3ZlIGRvY3VtZW50ZWQgc2ltaWxhciBzaXR1YXRpb25zIGFzIGJlaW5nIHBsYWluIGNoYW5nZXMgdG8KICMgc3RhbmRhcmQgdGltZSwgc28gbGV0J3MgZG8gdGhhdCBoZXJlIHRvby4gIFRoaXMgZG9lcyBub3QgY2hhbmdlIFVUQwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3pvbmUudGFiIGIvamRrL3Rlc3Qvc3VuL3V0aWwvY2FsZW5kYXIvemkvdHpkYXRhL3pvbmUudGFiCmluZGV4IGRiMDUwNjAuLjU2NDk2OTEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi91dGlsL2NhbGVuZGFyL3ppL3R6ZGF0YS96b25lLnRhYgorKysgYi9qZGsvdGVzdC9zdW4vdXRpbC9jYWxlbmRhci96aS90emRhdGEvem9uZS50YWIKQEAgLTI4NCw3ICsyODQsNyBAQAogTUgJKzA5MDUrMTY3MjAJUGFjaWZpYy9Ld2FqYWxlaW4JS3dhamFsZWluCiBNSwkrNDE1OSswMjEyNglFdXJvcGUvU2tvcGplCiBNTAkrMTIzOS0wMDgwMAlBZnJpY2EvQmFtYWtvCi1NTQkrMTY0NyswOTYxMAlBc2lhL1lhbmdvbgorTU0JKzE2NDcrMDk2MTAJQXNpYS9SYW5nb29uCiBNTgkrNDc1NSsxMDY1MwlBc2lhL1VsYWFuYmFhdGFyCU1vbmdvbGlhIChtb3N0IGFyZWFzKQogTU4JKzQ4MDErMDkxMzkJQXNpYS9Ib3ZkCUJheWFuLU9sZ2l5LCBHb3ZpLUFsdGFpLCBIb3ZkLCBVdnMsIFphdmtoYW4KIE1OCSs0ODA0KzExNDMwCUFzaWEvQ2hvaWJhbHNhbglEb3Jub2QsIFN1a2hiYWF0YXIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3Rvb2xzL2xhdW5jaGVyL0FycnJnaHMuamF2YSBiL2pkay90ZXN0L3Rvb2xzL2xhdW5jaGVyL0FycnJnaHMuamF2YQppbmRleCA3M2Q4Njg5Li44OTg5M2U0IDEwMDY0NAotLS0gYS9qZGsvdGVzdC90b29scy9sYXVuY2hlci9BcnJyZ2hzLmphdmEKKysrIGIvamRrL3Rlc3QvdG9vbHMvbGF1bmNoZXIvQXJycmdocy5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiAvKioKICAqIEB0ZXN0CiAgKiBAYnVnIDUwMzAyMzMgNjIxNDkxNiA2MzU2NDc1IDY1NzEwMjkgNjY4NDU4MiA2NzQyMTU5IDQ0NTk2MDAgNjc1ODg4MSA2NzUzOTM4Ci0gKiAgICAgIDY4OTQ3MTkgNjk2ODA1MyA3MTUxNDM0IDcxNDY0MjQgODAwNzMzMyA4MDc3ODIyIDgxNDM2NDAKKyAqICAgICAgNjg5NDcxOSA2OTY4MDUzIDcxNTE0MzQgNzE0NjQyNCA4MDA3MzMzIDgwNzc4MjIKICAqIEBzdW1tYXJ5IEFyZ3VtZW50IHBhcnNpbmcgdmFsaWRhdGlvbi4KICAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBBcnJyZ2hzLmphdmEKICAqIEBydW4gbWFpbi9vdGhlcnZtIEFycnJnaHMKQEAgLTMyNCw4ICszMjQsNiBAQAogICAgICAgICAvLyBtb3JlIHRyZWF0bWVudCBvZiAgbWl4ZWQgc2xhc2hlcwogICAgICAgICBjaGVja0FyZ3VtZW50UGFyc2luZygiZjEvIGYzXFwgZjQvIiwgImYxLyIsICJmM1xcIiwgImY0LyIpOwogICAgICAgICBjaGVja0FyZ3VtZW50UGFyc2luZygiZjEvIGYyXCcgJyBmMy8gZjQvIiwgImYxLyIsICJmMlwnIiwgIiciLCAiZjMvIiwgImY0LyIpOwotCi0gICAgICAgIGNoZWNrQXJndW1lbnRQYXJzaW5nKCJhXFwqXFxiIiwgImFcXCpcXGIiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW5pdEVtcHR5RGlyKEZpbGUgZW1wdHlEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvQVNTRU1CTFlfRVhDRVBUSU9OIGIvbGFuZ3Rvb2xzL0FTU0VNQkxZX0VYQ0VQVElPTgppbmRleCAwNjViOGQ5Li44YjdhYzFkIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvQVNTRU1CTFlfRVhDRVBUSU9OCisrKyBiL2xhbmd0b29scy9BU1NFTUJMWV9FWENFUFRJT04KQEAgLTEsMjcgKzEsMjcgQEAKIAogT1BFTkpESyBBU1NFTUJMWSBFWENFUFRJT04KIAotVGhlIE9wZW5KREsgc291cmNlIGNvZGUgbWFkZSBhdmFpbGFibGUgYnkgT3JhY2xlIEFtZXJpY2EsIEluYy4gKE9yYWNsZSkgYXQKLW9wZW5qZGsuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKK1RoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IFN1biBhdCBvcGVuamRrLmphdmEubmV0IGFuZAorb3Blbmpkay5kZXYuamF2YS5uZXQgKCJPcGVuSkRLIENvZGUiKSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSA8aHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sPiB2ZXJzaW9uIDIKIG9ubHkgKCJHUEwyIiksIHdpdGggdGhlIGZvbGxvd2luZyBjbGFyaWZpY2F0aW9uIGFuZCBzcGVjaWFsIGV4Y2VwdGlvbi4KIAogICAgIExpbmtpbmcgdGhpcyBPcGVuSkRLIENvZGUgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB3aXRoIG90aGVyIGNvZGUKICAgICBpcyBtYWtpbmcgYSBjb21iaW5lZCB3b3JrIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIFRodXMsIHRoZSB0ZXJtcwogICAgIGFuZCBjb25kaXRpb25zIG9mIEdQTDIgY292ZXIgdGhlIHdob2xlIGNvbWJpbmF0aW9uLgogCi0gICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgT3JhY2xlIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcwotICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBPcmFjbGUgYXMgaW5kaWNhdGVkIGF0CisgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgU3VuIGdpdmVzIHlvdSBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcworICAgIE9wZW5KREsgQ29kZSB3aXRoIGNlcnRhaW4gY29kZSBsaWNlbnNlZCBieSBTdW4gYXMgaW5kaWNhdGVkIGF0CiAgICAgaHR0cDovL29wZW5qZGsuamF2YS5uZXQvbGVnYWwvZXhjZXB0aW9uLW1vZHVsZXMtMjAwNy0wNS0wOC5odG1sCiAgICAgKCJEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIikgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAogICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpY2Vuc2UgdGVybXMgb2YgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMsCiAgICAgYW5kIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlIHVuZGVyIEdQTDIsCiAgICAgcHJvdmlkZWQgdGhhdCB0aGUgRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyBjb250aW51ZSB0byBiZQotICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBPcmFjbGUuCisgICAgZ292ZXJuZWQgYnkgdGhlIGxpY2Vuc2VzIHVuZGVyIHdoaWNoIHRoZXkgd2VyZSBvZmZlcmVkIGJ5IFN1bi4KIAotQXMgc3VjaCwgaXQgYWxsb3dzIGxpY2Vuc2VlcyBhbmQgc3VibGljZW5zZWVzIG9mIE9yYWNsZSdzIEdQTDIgT3BlbkpESyBDb2RlCi10byBidWlsZCBhbiBleGVjdXRhYmxlIHRoYXQgaW5jbHVkZXMgdGhvc2UgcG9ydGlvbnMgb2YgbmVjZXNzYXJ5IGNvZGUgdGhhdAotT3JhY2xlIGNvdWxkIG5vdCBwcm92aWRlIHVuZGVyIEdQTDIgKG9yIHRoYXQgT3JhY2xlIGhhcyBwcm92aWRlZCB1bmRlciBHUEwyCi13aXRoIHRoZSBDbGFzc3BhdGggZXhjZXB0aW9uKS4gIElmIHlvdSBtb2RpZnkgb3IgYWRkIHRvIHRoZSBPcGVuSkRLIGNvZGUsCi10aGF0IG5ldyBHUEwyIGNvZGUgbWF5IHN0aWxsIGJlIGNvbWJpbmVkIHdpdGggRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcwotaWYgdGhlIG5ldyBjb2RlIGlzIG1hZGUgc3ViamVjdCB0byB0aGlzIGV4Y2VwdGlvbiBieSBpdHMgY29weXJpZ2h0IGhvbGRlci4KK0FzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBTdW4ncyBHUEwyIE9wZW5KREsgQ29kZSB0bworYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQgU3VuCitjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IFN1biBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMiB3aXRoIHRoZQorQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLCB0aGF0IG5ldworR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgaWYgdGhlCituZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvTElDRU5TRSBiL2xhbmd0b29scy9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9MSUNFTlNFCisrKyBiL2xhbmd0b29scy9MSUNFTlNFCkBAIC0zLDcgKzMsNyBAQAogVmVyc2lvbiAyLCBKdW5lIDE5OTEKIAogQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQogZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KQEAgLTI4Nyw4ICsyODcsOCBAQAogICAgIG1vcmUgZGV0YWlscy4KIAogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgICAgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIAogQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvTGFtYmRhVG9NZXRob2QuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvTGFtYmRhVG9NZXRob2QuamF2YQppbmRleCA0MzZmZmVhLi5lNTBkMTkyIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0xhbWJkYVRvTWV0aG9kLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9MYW1iZGFUb01ldGhvZC5qYXZhCkBAIC0zMzgsMTEgKzMzOCw2IEBACiAgICAgICAgICAgICAgICAgc3ludGhldGljSW5pdHMuYXBwZW5kKChKQ0V4cHJlc3Npb24pIGNhcHR1cmVkX2xvY2FsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBhZGQgY2FwdHVyZWQgb3V0ZXIgdGhpcyBpbnN0YW5jZXMgKHVzZWQgb25seSB3aGVuIGB0aGlzJyBjYXB0dXJlIGl0c2VsZiBpcyBpbGxlZ2FsKQotICAgICAgICBmb3IgKFN5bWJvbCBmdiA6IGxvY2FsQ29udGV4dC5nZXRTeW1ib2xNYXAoQ0FQVFVSRURfT1VURVJfVEhJUykua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIEpDVHJlZSBjYXB0dXJlZF9sb2NhbCA9IG1ha2UuUXVhbFRoaXMoZnYudHlwZSk7Ci0gICAgICAgICAgICBzeW50aGV0aWNJbml0cy5hcHBlbmQoKEpDRXhwcmVzc2lvbikgY2FwdHVyZWRfbG9jYWwpOwotICAgICAgICB9CiAKICAgICAgICAgLy90aGVuLCBkZXRlcm1pbmUgdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5keSBjYWxsCiAgICAgICAgIExpc3Q8SkNFeHByZXNzaW9uPiBpbmR5X2FyZ3MgPSB0cmFuc2xhdGUoc3ludGhldGljSW5pdHMudG9MaXN0KCksIGxvY2FsQ29udGV4dC5wcmV2KTsKQEAgLTQzOSwzMiArNDM0LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRyYW5zbGF0ZSBxdWFsaWZpZWQgYHRoaXMnIHJlZmVyZW5jZXMgd2l0aGluIGEgbGFtYmRhIHRvIHRoZSBtYXBwZWQgaWRlbnRpZmllcgotICAgICAqIEBwYXJhbSB0cmVlCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdmlzaXRTZWxlY3QoSkNGaWVsZEFjY2VzcyB0cmVlKSB7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwgfHwgIWFuYWx5emVyLmxhbWJkYUZpZWxkQWNjZXNzRmlsdGVyKHRyZWUpKSB7Ci0gICAgICAgICAgICBzdXBlci52aXNpdFNlbGVjdCh0cmVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBwcmV2UG9zID0gbWFrZS5wb3M7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1ha2UuYXQodHJlZSk7Ci0KLSAgICAgICAgICAgICAgICBMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQgbGFtYmRhQ29udGV4dCA9IChMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQpIGNvbnRleHQ7Ci0gICAgICAgICAgICAgICAgSkNUcmVlIGx0cmVlID0gbGFtYmRhQ29udGV4dC50cmFuc2xhdGUodHJlZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGx0cmVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbHRyZWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIudmlzaXRTZWxlY3QodHJlZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBtYWtlLmF0KHByZXZQb3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmlzaXRWYXJEZWYoSkNWYXJpYWJsZURlY2wgdHJlZSkgewogICAgICAgICBMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQgbGFtYmRhQ29udGV4dCA9IChMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQpY29udGV4dDsKQEAgLTExNTcsMTEgKzExMjYsNiBAQAogICAgICAgICBwcml2YXRlIGludCBsYW1iZGFDb3VudCA9IDA7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIExpc3Qgb2YgdHlwZXMgdW5kZXJnb2luZyBjb25zdHJ1Y3Rpb24gdmlhIGV4cGxpY2l0IGNvbnN0cnVjdG9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBMaXN0PENsYXNzU3ltYm9sPiB0eXBlc1VuZGVyQ29uc3RydWN0aW9uOwotCi0gICAgICAgIC8qKgogICAgICAgICAgKiBrZWVwIHRoZSBjb3VudCBvZiBsYW1iZGEgZXhwcmVzc2lvbiBkZWZpbmVkIGluIGdpdmVuIGNvbnRleHQgKHVzZWQgdG8KICAgICAgICAgICogZ2VuZXJhdGUgdW5hbWJpZ3VvdXMgbmFtZXMgZm9yIHNlcmlhbGl6YWJsZSBsYW1iZGFzKQogICAgICAgICAgKi8KQEAgLTExOTIsMzYgKzExNTYsMTEgQEAKIAogICAgICAgICBwcml2YXRlIEpDQ2xhc3NEZWNsIGFuYWx5emVBbmRQcmVwcm9jZXNzQ2xhc3MoSkNDbGFzc0RlY2wgdHJlZSkgewogICAgICAgICAgICAgZnJhbWVTdGFjayA9IExpc3QubmlsKCk7Ci0gICAgICAgICAgICB0eXBlc1VuZGVyQ29uc3RydWN0aW9uID0gTGlzdC5uaWwoKTsKICAgICAgICAgICAgIGxvY2FsQ2xhc3NEZWZzID0gbmV3IEhhc2hNYXA8U3ltYm9sLCBKQ0NsYXNzRGVjbD4oKTsKICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUodHJlZSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmlzaXRBcHBseShKQ01ldGhvZEludm9jYXRpb24gdHJlZSkgewotICAgICAgICAgICAgTGlzdDxDbGFzc1N5bWJvbD4gcHJldmlvdXNOYXNjZW50VHlwZXMgPSB0eXBlc1VuZGVyQ29uc3RydWN0aW9uOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBOYW1lIG1ldGhOYW1lID0gVHJlZUluZm8ubmFtZSh0cmVlLm1ldGgpOwotICAgICAgICAgICAgICAgIGlmIChtZXRoTmFtZSA9PSBuYW1lcy5fdGhpcyB8fCBtZXRoTmFtZSA9PSBuYW1lcy5fc3VwZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZXNVbmRlckNvbnN0cnVjdGlvbiA9IHR5cGVzVW5kZXJDb25zdHJ1Y3Rpb24ucHJlcGVuZChjdXJyZW50Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cGVyLnZpc2l0QXBwbHkodHJlZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHR5cGVzVW5kZXJDb25zdHJ1Y3Rpb24gPSBwcmV2aW91c05hc2NlbnRUeXBlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgLy8gd2hlcmUKLSAgICAgICAgICAgIHByaXZhdGUgQ2xhc3NTeW1ib2wgY3VycmVudENsYXNzKCkgewotICAgICAgICAgICAgICAgIGZvciAoRnJhbWUgZnJhbWUgOiBmcmFtZVN0YWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS50cmVlLmhhc1RhZyhKQ1RyZWUuVGFnLkNMQVNTREVGKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSkNDbGFzc0RlY2wgY2RlZiA9IChKQ0NsYXNzRGVjbCkgZnJhbWUudHJlZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZGVmLnN5bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRCbG9jayhKQ0Jsb2NrIHRyZWUpIHsKICAgICAgICAgICAgIExpc3Q8RnJhbWU+IHByZXZTdGFjayA9IGZyYW1lU3RhY2s7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTY4NSwyMiArMTYyNCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXIgb3V0IHRob3NlIHNlbGVjdCBub2RlcyB0aGF0IG5lZWQgdG8gYmUgYWRqdXN0ZWQKLSAgICAgICAgICogIHdoZW4gdHJhbnNsYXRpbmcgYXdheSBsYW1iZGEgZXhwcmVzc2lvbnMgLSBhdCB0aGUgbW9tZW50LCB0aGlzIGlzIHRoZQotICAgICAgICAgKiAgc2V0IG9mIG5vZGVzIHRoYXQgc2VsZWN0IGB0aGlzJyAocXVhbGlmaWVkIHRoaXMpCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbGFtYmRhRmllbGRBY2Nlc3NGaWx0ZXIoSkNGaWVsZEFjY2VzcyBmQWNjZXNzKSB7Ci0gICAgICAgICAgICBMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQgbGFtYmRhQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQgaW5zdGFuY2VvZiBMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMYW1iZGFUcmFuc2xhdGlvbkNvbnRleHQpIGNvbnRleHQgOiBudWxsOwotICAgICAgICAgICAgcmV0dXJuIGxhbWJkYUNvbnRleHQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhZkFjY2Vzcy5zeW0uaXNTdGF0aWMoKQotICAgICAgICAgICAgICAgICAgICAmJiBmQWNjZXNzLm5hbWUgPT0gbmFtZXMuX3RoaXMKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZBY2Nlc3Muc3ltLm93bmVyLmtpbmQgPT0gVFlQKQotICAgICAgICAgICAgICAgICAgICAmJiAhbGFtYmRhQ29udGV4dC50cmFuc2xhdGVkU3ltYm9scy5nZXQoQ0FQVFVSRURfT1VURVJfVEhJUykuaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXIgb3V0IHRob3NlIG5ldyBjbGFzcyBleHByZXNzaW9ucyB0aGF0IG5lZWQgdG8KICAgICAgICAgICogYmUgcXVhbGlmaWVkIHdpdGggYW4gZW5jbG9zaW5nIHRyZWUKICAgICAgICAgICovCkBAIC0xODc0LDcgKzE3OTcsNiBAQAogICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRTeW1ib2xzLnB1dChMT0NBTF9WQVIsIG5ldyBMaW5rZWRIYXNoTWFwPFN5bWJvbCwgU3ltYm9sPigpKTsKICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkU3ltYm9scy5wdXQoQ0FQVFVSRURfVkFSLCBuZXcgTGlua2VkSGFzaE1hcDxTeW1ib2wsIFN5bWJvbD4oKSk7CiAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZFN5bWJvbHMucHV0KENBUFRVUkVEX1RISVMsIG5ldyBMaW5rZWRIYXNoTWFwPFN5bWJvbCwgU3ltYm9sPigpKTsKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVkU3ltYm9scy5wdXQoQ0FQVFVSRURfT1VURVJfVEhJUywgbmV3IExpbmtlZEhhc2hNYXA8U3ltYm9sLCBTeW1ib2w+KCkpOwogICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRTeW1ib2xzLnB1dChUWVBFX1ZBUiwgbmV3IExpbmtlZEhhc2hNYXA8U3ltYm9sLCBTeW1ib2w+KCkpOwogCiAgICAgICAgICAgICAgICAgZnJlZVZhclByb2Nlc3NlZExvY2FsQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKQEAgLTE5ODcsMTYgKzE5MDksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDQVBUVVJFRF9PVVRFUl9USElTOgotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBuYW1lID0gbmFtZXMuZnJvbVN0cmluZyhuZXcgU3RyaW5nKHN5bS5mbGF0TmFtZSgpLnRvU3RyaW5nKCkgKyBuYW1lcy5kb2xsYXJUaGlzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXcgVmFyU3ltYm9sKFNZTlRIRVRJQyB8IEZJTkFMIHwgUEFSQU1FVEVSLCBuYW1lLCB0eXBlcy5lcmFzdXJlKHN5bS50eXBlKSwgdHJhbnNsYXRlZFN5bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTeW1ib2wgYmFzZVN5bWJvbCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9rZWVwIG1hcHBpbmcgd2l0aCBvcmlnaW5hbCBjYXB0dXJlZCBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgTE9DQUxfVkFSOgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3IFZhclN5bWJvbChzeW0uZmxhZ3MoKSAmIEZJTkFMLCBzeW0ubmFtZSwgc3ltLnR5cGUsIHRyYW5zbGF0ZWRTeW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgKChWYXJTeW1ib2wpIHJldCkucG9zID0gKChWYXJTeW1ib2wpIHN5bSkucG9zOwpAQCAtMjAxNywxNCArMTkyOSw2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZvaWQgYWRkU3ltYm9sKFN5bWJvbCBzeW0sIExhbWJkYVN5bWJvbEtpbmQgc2tpbmQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2tpbmQgPT0gQ0FQVFVSRURfVEhJUyAmJiBzeW0gIT0gbnVsbCAmJiBzeW0ua2luZCA9PSBUWVAgJiYgIXR5cGVzVW5kZXJDb25zdHJ1Y3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzU3ltYm9sIGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudENsYXNzICE9IG51bGwgJiYgdHlwZXNVbmRlckNvbnN0cnVjdGlvbi5jb250YWlucyhjdXJyZW50Q2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2UgbXVzdCBiZSB0byBlbmNsb3Npbmcgb3V0ZXIgaW5zdGFuY2UsIG11dGF0ZSBjYXB0dXJlIGtpbmQuCi0gICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuY2hlY2soc3ltICE9IGN1cnJlbnRDbGFzcyk7IC8vIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IHJpZ2h0IGluIEF0dHIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNraW5kID0gQ0FQVFVSRURfT1VURVJfVEhJUzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNYXA8U3ltYm9sLCBTeW1ib2w+IHRyYW5zTWFwID0gZ2V0U3ltYm9sTWFwKHNraW5kKTsKICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zTWFwLmNvbnRhaW5zS2V5KHN5bSkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhbnNNYXAucHV0KHN5bSwgdHJhbnNsYXRlKHN5bSwgc2tpbmQpKTsKQEAgLTIwMzgsNDkgKzE5NDIsMTcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgSkNUcmVlIHRyYW5zbGF0ZShKQ0lkZW50IGxhbWJkYUlkZW50KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChMYW1iZGFTeW1ib2xLaW5kIGtpbmQgOiBMYW1iZGFTeW1ib2xLaW5kLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxTeW1ib2wsIFN5bWJvbD4gbSA9IGdldFN5bWJvbE1hcChraW5kKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGtpbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0uY29udGFpbnNLZXkobGFtYmRhSWRlbnQuc3ltKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgdFN5bSA9IG0uZ2V0KGxhbWJkYUlkZW50LnN5bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpDVHJlZSB0ID0gbWFrZS5JZGVudCh0U3ltKS5zZXRUeXBlKGxhbWJkYUlkZW50LnR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U3ltLnNldFR5cGVBdHRyaWJ1dGVzKGxhbWJkYUlkZW50LnN5bS5nZXRSYXdUeXBlQXR0cmlidXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQVBUVVJFRF9PVVRFUl9USElTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW1iZGFJZGVudC5zeW0ub3duZXIua2luZCA9PSBUWVAgJiYgbS5jb250YWluc0tleShsYW1iZGFJZGVudC5zeW0ub3duZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBvdXRlciBpbnN0YW5jZSB2YXJpYWJsZSByZWZlcmVuY2VzIGFuY2hvcmluZyB0aGVtIHRvIHRoZSBjYXB0dXJlZCBzeW50aGV0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCB0U3ltID0gbS5nZXQobGFtYmRhSWRlbnQuc3ltLm93bmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkNFeHByZXNzaW9uIHQgPSBtYWtlLklkZW50KHRTeW0pLnNldFR5cGUobGFtYmRhSWRlbnQuc3ltLm93bmVyLnR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0U3ltLnNldFR5cGVBdHRyaWJ1dGVzKGxhbWJkYUlkZW50LnN5bS5vd25lci5nZXRSYXdUeXBlQXR0cmlidXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG1ha2UuU2VsZWN0KHQsIGxhbWJkYUlkZW50Lm5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldFR5cGUobGFtYmRhSWRlbnQudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVJbmZvLnNldFN5bWJvbCh0LCBsYW1iZGFJZGVudC5zeW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZm9yIChNYXA8U3ltYm9sLCBTeW1ib2w+IG0gOiB0cmFuc2xhdGVkU3ltYm9scy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobS5jb250YWluc0tleShsYW1iZGFJZGVudC5zeW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgdFN5bSA9IG0uZ2V0KGxhbWJkYUlkZW50LnN5bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBKQ1RyZWUgdCA9IG1ha2UuSWRlbnQodFN5bSkuc2V0VHlwZShsYW1iZGFJZGVudC50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRTeW0uc2V0VHlwZUF0dHJpYnV0ZXMobGFtYmRhSWRlbnQuc3ltLmdldFJhd1R5cGVBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSBhd2F5IHF1YWxpZmllZCB0aGlzIGV4cHJlc3Npb25zLCBhbmNob3JpbmcgdGhlbSB0byBzeW50aGV0aWMgcGFyYW1ldGVycyB0aGF0Ci0gICAgICAgICAgICAgICBjYXB0dXJlIHRoZSBxdWFsaWZpZWQgdGhpcyBoYW5kbGUuIGBmaWVsZEFjY2VzcycgaXMgZ3VhcmFudGVlZCB0byBvbmUgc3VjaC4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgSkNUcmVlIHRyYW5zbGF0ZShKQ0ZpZWxkQWNjZXNzIGZpZWxkQWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmNoZWNrKGZpZWxkQWNjZXNzLm5hbWUgPT0gbmFtZXMuX3RoaXMpOwotICAgICAgICAgICAgICAgIE1hcDxTeW1ib2wsIFN5bWJvbD4gbSA9IHRyYW5zbGF0ZWRTeW1ib2xzLmdldChMYW1iZGFTeW1ib2xLaW5kLkNBUFRVUkVEX09VVEVSX1RISVMpOwotICAgICAgICAgICAgICAgIGlmIChtLmNvbnRhaW5zS2V5KGZpZWxkQWNjZXNzLnN5bS5vd25lcikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3ltYm9sIHRTeW0gPSBtLmdldChmaWVsZEFjY2Vzcy5zeW0ub3duZXIpOwotICAgICAgICAgICAgICAgICAgICBKQ0V4cHJlc3Npb24gdCA9IG1ha2UuSWRlbnQodFN5bSkuc2V0VHlwZShmaWVsZEFjY2Vzcy5zeW0ub3duZXIudHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRTeW0uc2V0VHlwZUF0dHJpYnV0ZXMoZmllbGRBY2Nlc3Muc3ltLm93bmVyLmdldFJhd1R5cGVBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogVGhlIHRyYW5zbGF0ZWRTeW0gaXMgbm90IGNvbXBsZXRlL2FjY3VyYXRlIHVudGlsIHRoZSBhbmFseXNpcyBpcwogICAgICAgICAgICAgICogZmluaXNoZWQuICBPbmNlIHRoZSBhbmFseXNpcyBpcyBmaW5pc2hlZCwgdGhlIHRyYW5zbGF0ZWRTeW0gaXMKQEAgLTIxMTgsMTAgKzE5OTAsNiBAQAogICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKG1ha2UuVmFyRGVmKChWYXJTeW1ib2wpIHRoaXNTeW0sIG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3ltYm9scy5hcHBlbmQoKFZhclN5bWJvbCkgdGhpc1N5bSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoU3ltYm9sIHRoaXNTeW0gOiBnZXRTeW1ib2xNYXAoQ0FQVFVSRURfT1VURVJfVEhJUykudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChtYWtlLlZhckRlZigoVmFyU3ltYm9sKSB0aGlzU3ltLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN5bWJvbHMuYXBwZW5kKChWYXJTeW1ib2wpIHRoaXNTeW0pOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKFN5bWJvbCB0aGlzU3ltIDogZ2V0U3ltYm9sTWFwKFBBUkFNKS52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKG1ha2UuVmFyRGVmKChWYXJTeW1ib2wpIHRoaXNTeW0sIG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyU3ltYm9scy5hcHBlbmQoKFZhclN5bWJvbCkgdGhpc1N5bSk7CkBAIC0yMjcwLDcgKzIxMzgsNiBAQAogICAgICAgICBMT0NBTF9WQVIsICAgICAgLy8gb3JpZ2luYWwgdG8gdHJhbnNsYXRlZCBsYW1iZGEgbG9jYWxzCiAgICAgICAgIENBUFRVUkVEX1ZBUiwgICAvLyB2YXJpYWJsZXMgaW4gZW5jbG9zaW5nIHNjb3BlIHRvIHRyYW5zbGF0ZWQgc3ludGhldGljIHBhcmFtZXRlcnMKICAgICAgICAgQ0FQVFVSRURfVEhJUywgIC8vIGNsYXNzIHN5bWJvbHMgdG8gdHJhbnNsYXRlZCBzeW50aGV0aWMgcGFyYW1ldGVycyAoZm9yIGNhcHR1cmVkIG1lbWJlciBhY2Nlc3MpCi0gICAgICAgIENBUFRVUkVEX09VVEVSX1RISVMsIC8vIHVzZWQgd2hlbiBgdGhpcycgY2FwdHVyZSBpcyBpbGxlZ2FsLCBidXQgb3V0ZXIgdGhpcyBjYXB0dXJlIGlzIGxlZ2l0IChKREstODEyOTc0MCkKICAgICAgICAgVFlQRV9WQVI7ICAgICAgIC8vIG9yaWdpbmFsIHRvIHRyYW5zbGF0ZWQgbGFtYmRhIHR5cGUgdmFyaWFibGVzCiAgICAgfQogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9yZXNvdXJjZXMvamF2YWNfamEucHJvcGVydGllcyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9qYXZhY19qYS5wcm9wZXJ0aWVzCmluZGV4IDI4NjE0MmIuLjYxMDNjYjggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9qYXZhY19qYS5wcm9wZXJ0aWVzCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9qYXZhY19qYS5wcm9wZXJ0aWVzCkBAIC0zNCw3ICszNCw3IEBACiBqYXZhYy5vcHQuY2xhc3NwYXRoPVx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQ1x1MzBGQlx1MzBBRlx1MzBFOVx1MzBCOVx1MzBGQlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA0QVx1MzA4OFx1MzA3M1x1NkNFOFx1OTFDOFx1MzBEN1x1MzBFRFx1MzBCQlx1MzBDM1x1MzBCNVx1MzA5Mlx1NjkxQ1x1N0QyMlx1MzA1OVx1MzA4Qlx1NEY0RFx1N0Y2RVx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1OVx1MzA4QgogamF2YWMub3B0LnNvdXJjZXBhdGg9XHU1MTY1XHU1MjlCXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDkyXHU2OTFDXHU3RDIyXHUzMDU5XHUzMDhCXHU0RjREXHU3RjZFXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCCiBqYXZhYy5vcHQuYm9vdGNsYXNzcGF0aD1cdTMwRDZcdTMwRkNcdTMwQzhcdTMwQjlcdTMwQzhcdTMwRTlcdTMwQzNcdTMwRDdcdTMwRkJcdTMwQUZcdTMwRTlcdTMwQjlcdTMwRkJcdTMwRDFcdTMwQjlcdTMwNkVcdTU4MzRcdTYyNDBcdTMwOTJcdTMwQUFcdTMwRkNcdTMwRDBcdTMwRkNcdTMwRTlcdTMwQTRcdTMwQzlcdTMwNTlcdTMwOEIKLWphdmFjLm9wdC5YYm9vdGNsYXNzcGF0aC5wPVx1MzBENlx1MzBGQ1x1MzBDOFx1MzBCOVx1MzBDOFx1MzBFOVx1MzBDM1x1MzBEN1x1MzBGQlx1MzBBRlx1MzBFOVx1MzBCOVx1MzBGQlx1MzBEMVx1MzBCOVx1MzA2RVx1NTE0OFx1OTgyRFx1MzA2Qlx1NEVEOFx1NTJBMFx1MzA1OVx1MzA4QgoramF2YWMub3B0Llhib290Y2xhc3NwYXRoLnA9XHUzMEQ2XHUzMEZDXHUzMEM4XHUzMEI5XHUzMEM4XHUzMEU5XHUzMEMzXHUzMEQ3XHUzMEZCXHUzMEFGXHUzMEU5XHUzMEI5XHUzMEZCXHUzMEQxXHUzMEI5XHUzMDZFXHU1MTQ4XHU5ODJEXHUzMDZCXHU0RUQ4XHU1MkEwCiBqYXZhYy5vcHQuWGJvb3RjbGFzc3BhdGguYT1cdTMwRDZcdTMwRkNcdTMwQzhcdTMwQjlcdTMwQzhcdTMwRTlcdTMwQzNcdTMwRDdcdTMwRkJcdTMwQUZcdTMwRTlcdTMwQjlcdTMwRkJcdTMwRDFcdTMwQjlcdTMwNkJcdThGRkRcdTUyQTBcdTMwNTlcdTMwOEIKIGphdmFjLm9wdC5lbmRvcnNlZGRpcnM9XHU2M0E4XHU1OTY4XHU4OThGXHU2ODNDXHUzMEQxXHUzMEI5XHUzMDZFXHU1ODM0XHU2MjQwXHUzMDkyXHUzMEFBXHUzMEZDXHUzMEQwXHUzMEZDXHUzMEU5XHUzMEE0XHUzMEM5XHUzMDU5XHUzMDhCCiBqYXZhYy5vcHQuZXh0ZGlycz1cdTMwQTRcdTMwRjNcdTMwQjlcdTMwQzhcdTMwRkNcdTMwRUJcdTZFMDhcdTYyRTFcdTVGMzVcdTZBNUZcdTgwRkRcdTMwNkVcdTU4MzRcdTYyNDBcdTMwOTJcdTMwQUFcdTMwRkNcdTMwRDBcdTMwRkNcdTMwRTlcdTMwQTRcdTMwQzlcdTMwNTlcdTMwOEIKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvVHJlZU1ha2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy90cmVlL1RyZWVNYWtlci5qYXZhCmluZGV4IDc5NGFiYTEuLmIzOWZkMDYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvVHJlZU1ha2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdHJlZS9UcmVlTWFrZXIuamF2YQpAQCAtNjIxLDEyICs2MjEsNiBAQAogICAgICAgICByZXR1cm4gSWRlbnQobmV3IFZhclN5bWJvbChGSU5BTCwgbmFtZXMuX3RoaXMsIHQsIHQudHN5bSkpOwogICAgIH0KIAotICAgIC8qKiBDcmVhdGUgYSB0cmVlIHJlcHJlc2VudGluZyBxdWFsaWZpZWQgYHRoaXMnIGdpdmVuIGl0cyB0eXBlCi0gICAgICovCi0gICAgcHVibGljIEpDRXhwcmVzc2lvbiBRdWFsVGhpcyhUeXBlIHQpIHsKLSAgICAgICAgcmV0dXJuIFNlbGVjdChUeXBlKHQpLCBuZXcgVmFyU3ltYm9sKEZJTkFMLCBuYW1lcy5fdGhpcywgdCwgdC50c3ltKSk7Ci0gICAgfQotCiAgICAgLyoqIENyZWF0ZSBhIHRyZWUgcmVwcmVzZW50aW5nIGEgY2xhc3MgbGl0ZXJhbC4KICAgICAgKi8KICAgICBwdWJsaWMgSkNFeHByZXNzaW9uIENsYXNzTGl0ZXJhbChDbGFzc1N5bWJvbCBjbGF6eikgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9OYW1lcy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9OYW1lcy5qYXZhCmluZGV4IDdmOGNlNDYuLmNjNTJlMGQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvTmFtZXMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL05hbWVzLmphdmEKQEAgLTE3Niw3ICsxNzYsNiBAQAogICAgIHB1YmxpYyBmaW5hbCBOYW1lIGxhbWJkYTsKICAgICBwdWJsaWMgZmluYWwgTmFtZSBtZXRhZmFjdG9yeTsKICAgICBwdWJsaWMgZmluYWwgTmFtZSBhbHRNZXRhZmFjdG9yeTsKLSAgICBwdWJsaWMgZmluYWwgTmFtZSBkb2xsYXJUaGlzOwogCiAgICAgcHVibGljIGZpbmFsIE5hbWUuVGFibGUgdGFibGU7CiAKQEAgLTIzNSw3ICsyMzQsNiBAQAogICAgICAgICB2YWx1ZSA9IGZyb21TdHJpbmcoInZhbHVlIik7CiAgICAgICAgIHZhbHVlT2YgPSBmcm9tU3RyaW5nKCJ2YWx1ZU9mIik7CiAgICAgICAgIHZhbHVlcyA9IGZyb21TdHJpbmcoInZhbHVlcyIpOwotICAgICAgICBkb2xsYXJUaGlzID0gZnJvbVN0cmluZygiJHRoaXMiKTsKIAogICAgICAgICAvLyBjbGFzcyBuYW1lcwogICAgICAgICBqYXZhX2lvX1NlcmlhbGl6YWJsZSA9IGZyb21TdHJpbmcoImphdmEuaW8uU2VyaWFsaXphYmxlIik7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvQWxsb3dFbmNsb3NpbmdWYXJDYXB0dXJlVGVzdC5qYXZhIGIvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL0FsbG93RW5jbG9zaW5nVmFyQ2FwdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0ZWIwZi4uMDAwMDAwMAotLS0gYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvQWxsb3dFbmNsb3NpbmdWYXJDYXB0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MTI5NzQwIDgxMzMxMTEgODE1NzE0MgotICogQHN1bW1hcnkgSW5jb3JyZWN0IGNsYXNzIGZpbGUgY3JlYXRlZCB3aGVuIHBhc3NpbmcgbGFtYmRhIGluIGlubmVyIGNsYXNzIGNvbnN0cnVjdG9yCi0gKiBAcnVuIG1haW4gQWxsb3dFbmNsb3NpbmdWYXJDYXB0dXJlVGVzdAotICovCi0KLXB1YmxpYyBjbGFzcyBBbGxvd0VuY2xvc2luZ1ZhckNhcHR1cmVUZXN0IHsKLQotICAgIGludCB2YXIgPSAwOwotCi0gICAgdm9pZCBmb28oKSB7Ci0gICAgICAgIHZhciAqPSAyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IEFsbG93RW5jbG9zaW5nVmFyQ2FwdHVyZVRlc3QoKS5uZXcgSW5uZXIoOTc2NCk7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIElubmVyIHsKLSAgICAgICAgcHVibGljIElubmVyKFJ1bm5hYmxlIHIpIHsKLSAgICAgICAgICAgIHIucnVuKCk7Ci0gICAgICAgICAgICBpZiAodmFyICE9IDY2NzA0KQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBvdXRwdXQ6ICIgKyB2YXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElubmVyKGludCB4KSB7Ci0gICAgICAgICAgICB0aGlzKCgpIC0+IHsKLSAgICAgICAgICAgICAgICB2YXIgPSB4ICsgMTIzNDsKLSAgICAgICAgICAgICAgICBBbGxvd0VuY2xvc2luZ1ZhckNhcHR1cmVUZXN0LnRoaXMudmFyICs9IDU2Nzg7Ci0gICAgICAgICAgICAgICAgZm9vKCk7Ci0gICAgICAgICAgICAgICAgQWxsb3dFbmNsb3NpbmdWYXJDYXB0dXJlVGVzdC50aGlzLmZvbygpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvQ2FwdHVyZUluQ3RvckNoYWluaW5nVGVzdC5qYXZhIGIvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL0NhcHR1cmVJbkN0b3JDaGFpbmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxNmE2MS4uMDAwMDAwMAotLS0gYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvQ2FwdHVyZUluQ3RvckNoYWluaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qCi0gKiBAdGVzdAotICogQGJ1ZyA4MTI5NzQwIDgxMzMxMTEgODE1NzE0MgotICogQHN1bW1hcnkgSW5jb3JyZWN0IGNsYXNzIGZpbGUgY3JlYXRlZCB3aGVuIHBhc3NpbmcgbGFtYmRhIGluIGlubmVyIGNsYXNzIGNvbnN0cnVjdG9yCi0gKiBAcnVuIG1haW4gQ2FwdHVyZUluQ3RvckNoYWluaW5nVGVzdAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ2FwdHVyZUluQ3RvckNoYWluaW5nVGVzdCB7Ci0KLSAgICBDYXB0dXJlSW5DdG9yQ2hhaW5pbmdUZXN0KEZ1bmN0aW9uPEZ1bmN0aW9uPEZ1bmN0aW9uPENvbnN1bWVyPFZvaWQ+LCBWb2lkPiwgVm9pZD4sIFZvaWQ+IGlubmVyQ2xhc3MpIHsKLSAgICAgICAgbmV3IElubmVyQ2xhc3MoaW5uZXJDbGFzcyk7Ci0gICAgfQotCi0gICAgdm9pZCBmb28oVm9pZCB2KSB7IH0KLQotICAgIGNsYXNzIElubmVyQ2xhc3MgewotCi0gICAgICAgIElubmVyQ2xhc3MoRnVuY3Rpb248RnVuY3Rpb248RnVuY3Rpb248Q29uc3VtZXI8Vm9pZD4sIFZvaWQ+LCBWb2lkPiwgVm9pZD4gZmFjdG9yeSkgewotICAgICAgICAgICAgdGhpcyhmYWN0b3J5LmFwcGx5KG8gLT4gby5hcHBseShDYXB0dXJlSW5DdG9yQ2hhaW5pbmdUZXN0LnRoaXM6OmZvbykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIElubmVyQ2xhc3MoVm9pZCB1bnVzZWQpIHsgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IENhcHR1cmVJbkN0b3JDaGFpbmluZ1Rlc3QobyAtPiBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvUXVhbGlmaWVkVGhpc0FjY2Vzc1Rlc3QuamF2YSBiL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2xhbWJkYS9UODEyOTc0MC9RdWFsaWZpZWRUaGlzQWNjZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDU5NmE1Li4wMDAwMDAwCi0tLSBhL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2xhbWJkYS9UODEyOTc0MC9RdWFsaWZpZWRUaGlzQWNjZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODEyOTc0MCA4MTMzMTExIDgxNTcxNDIKLSAqIEBzdW1tYXJ5IEluY29ycmVjdCBjbGFzcyBmaWxlIGNyZWF0ZWQgd2hlbiBwYXNzaW5nIGxhbWJkYSBpbiBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvcgotICogQHJ1biBtYWluIFF1YWxpZmllZFRoaXNBY2Nlc3NUZXN0Ci0gKi8KLQotcHVibGljIGNsYXNzIFF1YWxpZmllZFRoaXNBY2Nlc3NUZXN0IHsgLy8gTm90IHJlZmVyZW5jZWQgYnkgbGFtYmRhLCBzbyBzaG91bGQgbm90IGJlIGNhcHR1cmVkLgotCi0gICAgcHVibGljIGNsYXNzIFVuaXZlcnNlIHsgLy8gTm90IHJlZmVyZW5jZWQgYnkgbGFtYmRhLCBzbyBzaG91bGQgbm90IGJlIGNhcHR1cmVkLgotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHVibGljIGludCBnYWxheGllc0NvdW50OwotCi0gICAgICAgIHB1YmxpYyBVbml2ZXJzZShTdHJpbmcgbmFtZSwgaW50IGdhbGF4aWVzQ291bnQpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLmdhbGF4aWVzQ291bnQgPSBnYWxheGllc0NvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiVW5pdmVyc2UiICsgbmFtZSArICIgb2YgIiArIGdhbGF4aWVzQ291bnQgKyAiIGdhbGF4aWVzIjsKLSAgICAgICAgfQotCi0gICAgICAgIGNsYXNzIEdhbGF4eSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgc3RhcnNDb3VudDsKLQotICAgICAgICAgICAgR2FsYXh5KFN0cmluZyBuYW1lLCBpbnQgc3RhcnNDb3VudCkgewotICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5zdGFyc0NvdW50ID0gc3RhcnNDb3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gImdhbGF4eSAiICsgbmFtZSArICIgb2YgIiArIHN0YXJzQ291bnQgKyAiIHNvbGFyIHN5c3RlbXMiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgc3RhcnNDb3VudCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnNDb3VudDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2xhc3MgU29sYXJTeXN0ZW0gewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgaW50IHBsYW5ldHNDb3VudDsKLQotICAgICAgICAgICAgICAgIFNvbGFyU3lzdGVtKFN0cmluZyBuYW1lLCBpbnQgcGxhbmV0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucGxhbmV0c0NvdW50ID0gcGxhbmV0c0NvdW50OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiU29sYXIgU3lzdGVtIG9mICIgKyBuYW1lICsgIiB3aXRoICIgKyBwbGFuZXRzQ291bnQgKyAiIHBsYW5ldHMiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBwbGFuZXRzQ291bnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFuZXRzQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU29sYXJTeXN0ZW0gY29weShTb2xhclN5c3RlbSBzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNsYXNzIFBsYW5ldCB7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtb29uc0NvdW50OwotCi0gICAgICAgICAgICAgICAgICAgIFBsYW5ldChTdHJpbmcgbmFtZSwgaW50IG1vb25zQ291bnQsIFJ1bm5hYmxlIHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vb25zQ291bnQgPSBtb29uc0NvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgci5ydW4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBQbGFuZXQgKFN0cmluZyBuYW1lLCBpbnQgbW9vbnNDb3VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyhuYW1lLCBtb29uc0NvdW50LCAoKS0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHYWxheHkudGhpcy5uYW1lICsgIiB3aXRoICIgKyBzdGFyc0NvdW50ICsgIiBzdGFyc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFVuaXZlcnNlLkdhbGF4eS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHN0YXJzQ291bnQoKSArICIgc3RhcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHYWxheHkudGhpcy5uYW1lKCkgKyAiIHdpdGggIiArIHN0YXJzQ291bnQoKSArICIgc3RhcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBVbml2ZXJzZS5HYWxheHkudGhpcy5uYW1lKCkgKyAiIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFVuaXZlcnNlLkdhbGF4eS50aGlzKS5zdGFyc0NvdW50KCkgKyAiIHN0YXJzXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCArICIgcGxhbmV0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEdhbGF4eS5Tb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCgpICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFNvbGFyU3lzdGVtLnRoaXMpLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCArICIgcGxhbmV0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFVuaXZlcnNlLkdhbGF4eS5Tb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMubmFtZS50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29weShVbml2ZXJzZS5HYWxheHkuU29sYXJTeXN0ZW0udGhpcykubmFtZS50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi50b1N0cmluZygpLmVxdWFscyhvdXRwdXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgdmFsdWVcbiIgKyBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5IE1pbHkgd2F5IHdpdGggMjM0NTY3ODkgc3RhcnNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSBNaWx5IHdheSB3aXRoIDIzNDU2Nzg5IHN0YXJzXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBnYWxheHkgTWlseSB3YXkgd2l0aCAyMzQ1Njc4OSBzdGFyc1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5IE1pbHkgd2F5IHdpdGggMjM0NTY3ODkgc3RhcnNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTVU4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTVU4gd2l0aCA5IHBsYW5ldHNcbiI7Ci0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQbGFuZXQgIiArIG5hbWUgKyAiIHdpdGggIiArIG1vb25zQ291bnQgKyAiIG1vb24ocykiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgbmV3IFF1YWxpZmllZFRoaXNBY2Nlc3NUZXN0KCkubmV3IFVuaXZlcnNlKCJVbml2ZXJzZSIsIDEyMzQ1Njc4KS5uZXcgR2FsYXh5KCJNaWx5IHdheSIsIDIzNDU2Nzg5KS5uZXcgU29sYXJTeXN0ZW0oIlN1biIsIDkpLm5ldyBQbGFuZXQoIkVhcnRoIiwgMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL1NvdXJjZUZvclRyYW5zbGF0aW9uLmphdmEgYi9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvU291cmNlRm9yVHJhbnNsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkN2QzOC4uMDAwMDAwMAotLS0gYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvU291cmNlRm9yVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0gICAgY2xhc3MgVW5pdmVyc2UgeyAvLyBOb3QgcmVmZXJlbmNlZCBieSBsYW1iZGEsIHNvIHNob3VsZCBub3QgYmUgY2FwdHVyZWQuCi0KLSAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgICAgICBwdWJsaWMgaW50IGdhbGF4aWVzQ291bnQ7Ci0KLSAgICAgICAgcHVibGljIFVuaXZlcnNlKFN0cmluZyBuYW1lLCBpbnQgZ2FsYXhpZXNDb3VudCkgewotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMuZ2FsYXhpZXNDb3VudCA9IGdhbGF4aWVzQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJVbml2ZXJzZSIgKyBuYW1lICsgIiBvZiAiICsgZ2FsYXhpZXNDb3VudCArICIgZ2FsYXhpZXMiOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgR2FsYXh5IHsKLQotICAgICAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBzdGFyc0NvdW50OwotCi0gICAgICAgICAgICBHYWxheHkoU3RyaW5nIG5hbWUsIGludCBzdGFyc0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICB0aGlzLnN0YXJzQ291bnQgPSBzdGFyc0NvdW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiZ2FsYXh5ICIgKyBuYW1lICsgIiBvZiAiICsgc3RhcnNDb3VudCArICIgc29sYXIgc3lzdGVtcyI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBzdGFyc0NvdW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGFyc0NvdW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbGFzcyBTb2xhclN5c3RlbSB7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICBpbnQgcGxhbmV0c0NvdW50OwotCi0gICAgICAgICAgICAgICAgU29sYXJTeXN0ZW0oU3RyaW5nIG5hbWUsIGludCBwbGFuZXRzQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFuZXRzQ291bnQgPSBwbGFuZXRzQ291bnQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTb2xhciBTeXN0ZW0gb2YgIiArIG5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCArICIgcGxhbmV0cyI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IHBsYW5ldHNDb3VudCgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYW5ldHNDb3VudDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTb2xhclN5c3RlbSBjb3B5KFNvbGFyU3lzdGVtIHMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2xhc3MgUGxhbmV0IHsKLQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1vb25zQ291bnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgUGxhbmV0KFN0cmluZyBuYW1lLCBpbnQgbW9vbnNDb3VudCwgUnVubmFibGUgcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9vbnNDb3VudCA9IG1vb25zQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLnJ1bigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFBsYW5ldCAoU3RyaW5nIG5hbWUsIGludCBtb29uc0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzKG5hbWUsIG1vb25zQ291bnQsICgpLT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHYWxheHkudGhpcy5uYW1lICsgIiB3aXRoICIgKyBzdGFyc0NvdW50ICsgIiBzdGFyc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFVuaXZlcnNlLkdhbGF4eS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHN0YXJzQ291bnQoKSArICIgc3RhcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBHYWxheHkudGhpcy5uYW1lKCkgKyAiIHdpdGggIiArIHN0YXJzQ291bnQoKSArICIgc3RhcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBVbml2ZXJzZS5HYWxheHkudGhpcy5uYW1lKCkgKyAiIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFVuaXZlcnNlLkdhbGF4eS50aGlzKS5zdGFyc0NvdW50KCkgKyAiIHN0YXJzXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCArICIgcGxhbmV0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEdhbGF4eS5Tb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCgpICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKFNvbGFyU3lzdGVtLnRoaXMpLm5hbWUgKyAiIHdpdGggIiArIHBsYW5ldHNDb3VudCArICIgcGxhbmV0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFVuaXZlcnNlLkdhbGF4eS5Tb2xhclN5c3RlbS50aGlzLm5hbWUgKyAiIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMubmFtZS50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29weShVbml2ZXJzZS5HYWxheHkuU29sYXJTeXN0ZW0udGhpcykubmFtZS50b0xvd2VyQ2FzZSgpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCAiICsgVW5pdmVyc2UuR2FsYXh5LlNvbGFyU3lzdGVtLnRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi50b1N0cmluZygpLmVxdWFscyhvdXRwdXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgdmFsdWVcbiIgKyBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5IE1pbHkgd2F5IHdpdGggMjM0NTY3ODkgc3RhcnNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSBNaWx5IHdheSB3aXRoIDIzNDU2Nzg5IHN0YXJzXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBnYWxheHkgTWlseSB3YXkgd2l0aCAyMzQ1Njc4OSBzdGFyc1xuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5IE1pbHkgd2F5IHdpdGggMjM0NTY3ODkgc3RhcnNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTdW4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTVU4gd2l0aCA5IHBsYW5ldHNcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSBTVU4gd2l0aCA5IHBsYW5ldHNcbiI7Ci0KLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQbGFuZXQgIiArIG5hbWUgKyAiIHdpdGggIiArIG1vb25zQ291bnQgKyAiIG1vb24ocykiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL1NvdXJjZVRvU291cmNlVHJhbnNsYXRpb25UZXN0LmphdmEgYi9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvU291cmNlVG9Tb3VyY2VUcmFuc2xhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIxODhiNy4uMDAwMDAwMAotLS0gYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9sYW1iZGEvVDgxMjk3NDAvU291cmNlVG9Tb3VyY2VUcmFuc2xhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKgotICogQHRlc3QKLSAqIEBidWcgODEyOTc0MCA4MTMzMTExIDgxNTcxNDIKLSAqIEBzdW1tYXJ5IEluY29ycmVjdCBjbGFzcyBmaWxlIGNyZWF0ZWQgd2hlbiBwYXNzaW5nIGxhbWJkYSBpbiBpbm5lciBjbGFzcyBjb25zdHJ1Y3RvcgotICogQGxpYnJhcnkgL3Rvb2xzL2phdmFjL2xpYgotICogQGJ1aWxkIFRvb2xCb3gKLSAqIEBydW4gY29tcGlsZSAtWEQtcHJpbnRzb3VyY2UgU291cmNlRm9yVHJhbnNsYXRpb24uamF2YQotICogQHJ1biBtYWluIFNvdXJjZVRvU291cmNlVHJhbnNsYXRpb25UZXN0Ci0gKi8KLQotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU291cmNlVG9Tb3VyY2VUcmFuc2xhdGlvblRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFBhdGggcGF0aDEgPSBQYXRocy5nZXQoU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LmNsYXNzZXMiKSwgIlVuaXZlcnNlLmphdmEiKTsKLSAgICAgICAgUGF0aCBwYXRoMiA9IFBhdGhzLmdldChTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiksICJVbml2ZXJzZS5qYXZhLm91dCIpOwotICAgICAgICBUb29sQm94LmNvbXBhcmVMaW5lcyhwYXRoMSwgcGF0aDIsIG51bGwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL1VuaXZlcnNlLmphdmEub3V0IGIvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvbGFtYmRhL1Q4MTI5NzQwL1VuaXZlcnNlLmphdmEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhjMGUyLi4wMDAwMDAwCi0tLSBhL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2xhbWJkYS9UODEyOTc0MC9Vbml2ZXJzZS5qYXZhLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLQotY2xhc3MgVW5pdmVyc2UgewotICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKLSAgICBwdWJsaWMgaW50IGdhbGF4aWVzQ291bnQ7Ci0gICAgCi0gICAgcHVibGljIFVuaXZlcnNlKFN0cmluZyBuYW1lLCBpbnQgZ2FsYXhpZXNDb3VudCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmdhbGF4aWVzQ291bnQgPSBnYWxheGllc0NvdW50OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlVuaXZlcnNlIiArIG5hbWUgKyAiIG9mICIgKyBnYWxheGllc0NvdW50ICsgIiBnYWxheGllcyI7Ci0gICAgfQotICAgIAotICAgIGNsYXNzIEdhbGF4eSB7Ci0gICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICBwcml2YXRlIGludCBzdGFyc0NvdW50OwotICAgICAgICAKLSAgICAgICAgR2FsYXh5KFN0cmluZyBuYW1lLCBpbnQgc3RhcnNDb3VudCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB0aGlzLnN0YXJzQ291bnQgPSBzdGFyc0NvdW50OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJnYWxheHkgIiArIG5hbWUgKyAiIG9mICIgKyBzdGFyc0NvdW50ICsgIiBzb2xhciBzeXN0ZW1zIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IHN0YXJzQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnNDb3VudDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjbGFzcyBTb2xhclN5c3RlbSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIGludCBwbGFuZXRzQ291bnQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNvbGFyU3lzdGVtKFN0cmluZyBuYW1lLCBpbnQgcGxhbmV0c0NvdW50KSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIHRoaXMucGxhbmV0c0NvdW50ID0gcGxhbmV0c0NvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAiU29sYXIgU3lzdGVtIG9mICIgKyBuYW1lICsgIiB3aXRoICIgKyBwbGFuZXRzQ291bnQgKyAiIHBsYW5ldHMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgcGxhbmV0c0NvdW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBwbGFuZXRzQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFNvbGFyU3lzdGVtIGNvcHkoU29sYXJTeXN0ZW0gcykgewotICAgICAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBjbGFzcyBQbGFuZXQgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOwotICAgICAgICAgICAgICAgIGludCBtb29uc0NvdW50OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFBsYW5ldChTdHJpbmcgbmFtZSwgaW50IG1vb25zQ291bnQsIFJ1bm5hYmxlIHIpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5tb29uc0NvdW50ID0gbW9vbnNDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgci5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgUGxhbmV0KFN0cmluZyBuYW1lLCBpbnQgbW9vbnNDb3VudCkgewotICAgICAgICAgICAgICAgICAgICB0aGlzKG5hbWUsIG1vb25zQ291bnQsIGphdmEubGFuZy5pbnZva2UuTGFtYmRhTWV0YWZhY3RvcnkubWV0YWZhY3RvcnkobmFtZSwgVW5pdmVyc2UuR2FsYXh5LnRoaXMsIFVuaXZlcnNlLkdhbGF4eS5Tb2xhclN5c3RlbS50aGlzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSBNaWx5IHdheSB3aXRoIDIzNDU2Nzg5IHN0YXJzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBnYWxheHkgTWlseSB3YXkgd2l0aCAyMzQ1Njc4OSBzdGFyc1xuVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5IE1pbHkgd2F5IHdpdGggMjM0NTY3ODkgc3RhcnNcblRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIGdhbGF4eSBNaWx5IHdheSB3aXRoIDIzNDU2Nzg5IHN0YXJzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU3VuIHdpdGggOSBwbGFuZXRzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU3VuIHdpdGggOSBwbGFuZXRzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU3VuIHdpdGggOSBwbGFuZXRzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU3VuIHdpdGggOSBwbGFuZXRzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU1VOIHdpdGggOSBwbGFuZXRzXG5UaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gU1VOIHdpdGggOSBwbGFuZXRzXG4iOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGxhbmV0ICIgKyBuYW1lICsgIiB3aXRoICIgKyBtb29uc0NvdW50ICsgIiBtb29uKHMpIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLypzeW50aGV0aWMqLyBwcml2YXRlIHN0YXRpYyB2b2lkIGxhbWJkYSRuZXckMCgvKnN5bnRoZXRpYyovIGZpbmFsIFN0cmluZyBuYW1lLCAvKnN5bnRoZXRpYyovIGZpbmFsIFVuaXZlcnNlLkdhbGF4eSBVbml2ZXJzZSRHYWxheHkkdGhpcywgLypzeW50aGV0aWMqLyBmaW5hbCBVbml2ZXJzZS5HYWxheHkuU29sYXJTeXN0ZW0gVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG4gPSBuYW1lOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBnYWxheHkgIiArIFVuaXZlcnNlJEdhbGF4eSR0aGlzLm5hbWUgKyAiIHdpdGggIiArIFVuaXZlcnNlJEdhbGF4eSR0aGlzLnN0YXJzQ291bnQgKyAiIHN0YXJzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5ICIgKyBVbml2ZXJzZSRHYWxheHkkdGhpcy5uYW1lICsgIiB3aXRoICIgKyBVbml2ZXJzZSRHYWxheHkkdGhpcy5zdGFyc0NvdW50KCkgKyAiIHN0YXJzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgZ2FsYXh5ICIgKyBVbml2ZXJzZSRHYWxheHkkdGhpcy5uYW1lKCkgKyAiIHdpdGggIiArIFVuaXZlcnNlJEdhbGF4eSR0aGlzLnN0YXJzQ291bnQoKSArICIgc3RhcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBnYWxheHkgIiArIFVuaXZlcnNlJEdhbGF4eSR0aGlzLm5hbWUoKSArICIgd2l0aCAiICsgKFVuaXZlcnNlJEdhbGF4eSR0aGlzKS5zdGFyc0NvdW50KCkgKyAiIHN0YXJzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIgKyBVbml2ZXJzZSRHYWxheHkkU29sYXJTeXN0ZW0kdGhpcy5uYW1lICsgIiB3aXRoICIgKyBVbml2ZXJzZSRHYWxheHkkU29sYXJTeXN0ZW0kdGhpcy5wbGFuZXRzQ291bnQgKyAiIHBsYW5ldHNcbiIpOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJUaGlzIHBsYW5ldCBiZWxvbmdzIHRvIHRoZSBzb2xhciBzeXN0ZW0gIiArIFVuaXZlcnNlJEdhbGF4eSRTb2xhclN5c3RlbSR0aGlzLm5hbWUgKyAiIHdpdGggIiArIFVuaXZlcnNlJEdhbGF4eSRTb2xhclN5c3RlbSR0aGlzLnBsYW5ldHNDb3VudCgpICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIgKyAoVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMpLm5hbWUgKyAiIHdpdGggIiArIFVuaXZlcnNlJEdhbGF4eSRTb2xhclN5c3RlbSR0aGlzLnBsYW5ldHNDb3VudCArICIgcGxhbmV0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlRoaXMgcGxhbmV0IGJlbG9uZ3MgdG8gdGhlIHNvbGFyIHN5c3RlbSAiICsgVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMubmFtZSArICIgd2l0aCAiICsgVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIgKyBVbml2ZXJzZSRHYWxheHkkU29sYXJTeXN0ZW0kdGhpcy5uYW1lLnRvTG93ZXJDYXNlKCkudG9VcHBlckNhc2UoKSArICIgd2l0aCAiICsgVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiVGhpcyBwbGFuZXQgYmVsb25ncyB0byB0aGUgc29sYXIgc3lzdGVtICIgKyBVbml2ZXJzZSRHYWxheHkkU29sYXJTeXN0ZW0kdGhpcy5jb3B5KFVuaXZlcnNlJEdhbGF4eSRTb2xhclN5c3RlbSR0aGlzKS5uYW1lLnRvTG93ZXJDYXNlKCkudG9VcHBlckNhc2UoKSArICIgd2l0aCAiICsgVW5pdmVyc2UkR2FsYXh5JFNvbGFyU3lzdGVtJHRoaXMucGxhbmV0c0NvdW50ICsgIiBwbGFuZXRzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYudG9TdHJpbmcoKS5lcXVhbHMob3V0cHV0KSkgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkIHZhbHVlXG4iICsgYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9uYXNob3JuL0FTU0VNQkxZX0VYQ0VQVElPTiBiL25hc2hvcm4vQVNTRU1CTFlfRVhDRVBUSU9OCmluZGV4IDA2NWI4ZDkuLjhiN2FjMWQgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vQVNTRU1CTFlfRVhDRVBUSU9OCisrKyBiL25hc2hvcm4vQVNTRU1CTFlfRVhDRVBUSU9OCkBAIC0xLDI3ICsxLDI3IEBACiAKIE9QRU5KREsgQVNTRU1CTFkgRVhDRVBUSU9OCiAKLVRoZSBPcGVuSkRLIHNvdXJjZSBjb2RlIG1hZGUgYXZhaWxhYmxlIGJ5IE9yYWNsZSBBbWVyaWNhLCBJbmMuIChPcmFjbGUpIGF0Ci1vcGVuamRrLmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCitUaGUgT3BlbkpESyBzb3VyY2UgY29kZSBtYWRlIGF2YWlsYWJsZSBieSBTdW4gYXQgb3Blbmpkay5qYXZhLm5ldCBhbmQKK29wZW5qZGsuZGV2LmphdmEubmV0ICgiT3BlbkpESyBDb2RlIikgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgPGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbD4gdmVyc2lvbiAyCiBvbmx5ICgiR1BMMiIpLCB3aXRoIHRoZSBmb2xsb3dpbmcgY2xhcmlmaWNhdGlvbiBhbmQgc3BlY2lhbCBleGNlcHRpb24uCiAKICAgICBMaW5raW5nIHRoaXMgT3BlbkpESyBDb2RlIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgd2l0aCBvdGhlciBjb2RlCiAgICAgaXMgbWFraW5nIGEgY29tYmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUgdGVybXMKICAgICBhbmQgY29uZGl0aW9ucyBvZiBHUEwyIGNvdmVyIHRoZSB3aG9sZSBjb21iaW5hdGlvbi4KIAotICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIE9yYWNsZSBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKLSAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgT3JhY2xlIGFzIGluZGljYXRlZCBhdAorICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIFN1biBnaXZlcyB5b3UgcGVybWlzc2lvbiB0byBsaW5rIHRoaXMKKyAgICBPcGVuSkRLIENvZGUgd2l0aCBjZXJ0YWluIGNvZGUgbGljZW5zZWQgYnkgU3VuIGFzIGluZGljYXRlZCBhdAogICAgIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2xlZ2FsL2V4Y2VwdGlvbi1tb2R1bGVzLTIwMDctMDUtMDguaHRtbAogICAgICgiRGVzaWduYXRlZCBFeGNlcHRpb24gTW9kdWxlcyIpIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwKICAgICByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1zIG9mIHRoZSBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzLAogICAgIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlciBHUEwyLAogICAgIHByb3ZpZGVkIHRoYXQgdGhlIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMgY29udGludWUgdG8gYmUKLSAgICBnb3Zlcm5lZCBieSB0aGUgbGljZW5zZXMgdW5kZXIgd2hpY2ggdGhleSB3ZXJlIG9mZmVyZWQgYnkgT3JhY2xlLgorICAgIGdvdmVybmVkIGJ5IHRoZSBsaWNlbnNlcyB1bmRlciB3aGljaCB0aGV5IHdlcmUgb2ZmZXJlZCBieSBTdW4uCiAKLUFzIHN1Y2gsIGl0IGFsbG93cyBsaWNlbnNlZXMgYW5kIHN1YmxpY2Vuc2VlcyBvZiBPcmFjbGUncyBHUEwyIE9wZW5KREsgQ29kZQotdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSB0aGF0IGluY2x1ZGVzIHRob3NlIHBvcnRpb25zIG9mIG5lY2Vzc2FyeSBjb2RlIHRoYXQKLU9yYWNsZSBjb3VsZCBub3QgcHJvdmlkZSB1bmRlciBHUEwyIChvciB0aGF0IE9yYWNsZSBoYXMgcHJvdmlkZWQgdW5kZXIgR1BMMgotd2l0aCB0aGUgQ2xhc3NwYXRoIGV4Y2VwdGlvbikuICBJZiB5b3UgbW9kaWZ5IG9yIGFkZCB0byB0aGUgT3BlbkpESyBjb2RlLAotdGhhdCBuZXcgR1BMMiBjb2RlIG1heSBzdGlsbCBiZSBjb21iaW5lZCB3aXRoIERlc2lnbmF0ZWQgRXhjZXB0aW9uIE1vZHVsZXMKLWlmIHRoZSBuZXcgY29kZSBpcyBtYWRlIHN1YmplY3QgdG8gdGhpcyBleGNlcHRpb24gYnkgaXRzIGNvcHlyaWdodCBob2xkZXIuCitBcyBzdWNoLCBpdCBhbGxvd3MgbGljZW5zZWVzIGFuZCBzdWJsaWNlbnNlZXMgb2YgU3VuJ3MgR1BMMiBPcGVuSkRLIENvZGUgdG8KK2J1aWxkIGFuIGV4ZWN1dGFibGUgdGhhdCBpbmNsdWRlcyB0aG9zZSBwb3J0aW9ucyBvZiBuZWNlc3NhcnkgY29kZSB0aGF0IFN1bgorY291bGQgbm90IHByb3ZpZGUgdW5kZXIgR1BMMiAob3IgdGhhdCBTdW4gaGFzIHByb3ZpZGVkIHVuZGVyIEdQTDIgd2l0aCB0aGUKK0NsYXNzcGF0aCBleGNlcHRpb24pLiAgSWYgeW91IG1vZGlmeSBvciBhZGQgdG8gdGhlIE9wZW5KREsgY29kZSwgdGhhdCBuZXcKK0dQTDIgY29kZSBtYXkgc3RpbGwgYmUgY29tYmluZWQgd2l0aCBEZXNpZ25hdGVkIEV4Y2VwdGlvbiBNb2R1bGVzIGlmIHRoZQorbmV3IGNvZGUgaXMgbWFkZSBzdWJqZWN0IHRvIHRoaXMgZXhjZXB0aW9uIGJ5IGl0cyBjb3B5cmlnaHQgaG9sZGVyLgpkaWZmIC0tZ2l0IGEvbmFzaG9ybi9MSUNFTlNFIGIvbmFzaG9ybi9MSUNFTlNFCmluZGV4IDhiNDAwYzcuLmI0MGEwZjQgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vTElDRU5TRQorKysgYi9uYXNob3JuL0xJQ0VOU0UKQEAgLTMsNyArMyw3IEBACiBWZXJzaW9uIDIsIEp1bmUgMTk5MQogCiBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi01MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhpcyBsaWNlbnNlCiBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgpAQCAtMjg3LDggKzI4Nyw4IEBACiAgICAgbW9yZSBkZXRhaWxzLgogCiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgICAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgICBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogCiBBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KIApkaWZmIC0tZ2l0IGEvbmFzaG9ybi9tYWtlL2J1aWxkLnhtbCBiL25hc2hvcm4vbWFrZS9idWlsZC54bWwKaW5kZXggZDAwNDEwMi4uZTRjYTMyOCAxMDA2NDQKLS0tIGEvbmFzaG9ybi9tYWtlL2J1aWxkLnhtbAorKysgYi9uYXNob3JuL21ha2UvYnVpbGQueG1sCkBAIC04MywxMiArODMsNiBAQAogICAgIDxjb25kaXRpb24gcHJvcGVydHk9Impmci5vcHRpb25zIiB2YWx1ZT0iJHtydW4udGVzdC5qdm1hcmdzLmpmcn0iIGVsc2U9IiI+CiAgICAgICA8aXN0cnVlIHZhbHVlPSIke2pmcn0iLz4KICAgICA8L2NvbmRpdGlvbj4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3Qtc3lzLXByb3Atbm8tc2VjdXJpdHkub3Mubm90LndpbmRvd3MiPgotICAgICAgPG5vdD4KLSAgICAgICAgPG9zIGZhbWlseT0id2luZG93cyIvPgotICAgICAgPC9ub3Q+Ci0gICAgPC9jb25kaXRpb24+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gY2hlY2sgbWluaW11bSBhbnQgdmVyc2lvbiByZXF1aXJlZCB0byBiZSAxLjguNCAtLT4KQEAgLTQyNSwxMCArNDE5LDYgQEAKICAgICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIiR7YmFzZWRpcn0vdGVzdC9zY3JpcHQvZXh0ZXJuYWwvc2hvd2Rvd24vLSIsICJyZWFkIjsKIH07CiAKLWdyYW50IGNvZGVCYXNlICJmaWxlOi8ke2Jhc2VkaXJ9L3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU4NDY3LmpzIiB7Ci0gICAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm5hc2hvcm4uc2V0Q29uZmlnIjsKLX07Ci0KICAgICA8L2VjaG8+CiAKICAgICA8cmVwbGFjZSBmaWxlPSIke2J1aWxkLmRpcn0vbmFzaG9ybi5wb2xpY3kiPjxyZXBsYWNldG9rZW4+XDwvcmVwbGFjZXRva2VuPjxyZXBsYWNldmFsdWU+LzwvcmVwbGFjZXZhbHVlPjwvcmVwbGFjZT4gICAgPCEtLWhhY2sgZm9yIFdpbmRvd3MgLSB0byBtYWtlIFVSTHMgd2l0aCBub3JtYWwgcGF0aCBzZXBhcmF0b3JzIC0tPgpkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zYW1wbGVzL2V4ZWMuanMgYi9uYXNob3JuL3NhbXBsZXMvZXhlYy5qcwppbmRleCBkMTBiNjIxLi42ODU4MWMzIDEwMDY0NAotLS0gYS9uYXNob3JuL3NhbXBsZXMvZXhlYy5qcworKysgYi9uYXNob3JuL3NhbXBsZXMvZXhlYy5qcwpAQCAtMzksMTAgKzM5LDkgQEAKICRFWEVDKCJjYXQiLCAiSGVsbG8sIHdvcmxkISIpCiAKIC8vIEFkZGl0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSBwYXNzZWQgYWZ0ZXIgdGhlIHN0ZGluIGFyZ3VtZW50LCBhcyBhbiBhcnJheSBvZgotLy8gc3RyaW5ncywgb3IgYSBzZXF1ZW5jZSBvZiB2YXJhcmdzIChpZiB0aGVyZSBpcyBubyBzdGRpbiwgbnVsbCBvciB1bmRlZmluZWQKLS8vIGNhbiBiZSBwYXNzZWQpOgotJEVYRUMoImxzIiwgdW5kZWZpbmVkLCAiLWwiLCAiLWEiKQotJEVYRUMoImxzIiwgdW5kZWZpbmVkLCBbIi1sIiwgIi1hIl0pCisvLyBzdHJpbmdzLCBvciBhIHNlcXVlbmNlIG9mIHZhcmFyZ3M6CiskRVhFQygibHMiLCAiIiAvKiBubyBzdGRpbiAqLywgIi1sIiwgIi1hIikKKyRFWEVDKCJscyIsICIiIC8qIG5vIHN0ZGluICovLCBbIi1sIiwgIi1hIl0pCiAKIC8vIE91dHB1dCBvZiBydW5uaW5nIGV4dGVybmFsIGNvbW1hbmRzIGlzIHJldHVybmVkIGZyb20gJEVYRUM6CiBwcmludCgkRVhFQygibHMiKSkKZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvTmFzaG9ybkV4Y2VwdGlvbi5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vYXBpL3NjcmlwdGluZy9OYXNob3JuRXhjZXB0aW9uLmphdmEKaW5kZXggYWZhZWM5NS4uNGZlNDYxYyAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vYXBpL3NjcmlwdGluZy9OYXNob3JuRXhjZXB0aW9uLmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vYXBpL3NjcmlwdGluZy9OYXNob3JuRXhjZXB0aW9uLmphdmEKQEAgLTE3NSw4ICsxNzUsMTAgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHN0LmdldE1ldGhvZE5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5lcXVhbHMoQ29tcGlsZXJDb25zdGFudHMuUFJPR1JBTS5zeW1ib2xOYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUgPSAiPHByb2dyYW0+IjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gc3RyaXBNZXRob2ROYW1lKG1ldGhvZE5hbWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKENvbXBpbGVyQ29uc3RhbnRzLkFOT05fRlVOQ1RJT05fUFJFRklYLnN5bWJvbE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9ICI8YW5vbnltb3VzPiI7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZmlsdGVyZWQuYWRkKG5ldyBTdGFja1RyYWNlRWxlbWVudChjbGFzc05hbWUsIG1ldGhvZE5hbWUsCkBAIC0xODYsMjIgKzE4OCw2IEBACiAgICAgICAgIHJldHVybiBmaWx0ZXJlZC50b0FycmF5KG5ldyBTdGFja1RyYWNlRWxlbWVudFtmaWx0ZXJlZC5zaXplKCldKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RyaXBNZXRob2ROYW1lKGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gbWV0aG9kTmFtZTsKLQotICAgICAgICBmaW5hbCBpbnQgbmVzdGVkU2VwYXJhdG9yID0gbmFtZS5sYXN0SW5kZXhPZihDb21waWxlckNvbnN0YW50cy5ORVNURURfRlVOQ1RJT05fU0VQQVJBVE9SLnN5bWJvbE5hbWUoKSk7Ci0gICAgICAgIGlmIChuZXN0ZWRTZXBhcmF0b3IgPj0gMCkgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5lc3RlZFNlcGFyYXRvciArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGlkU2VwYXJhdG9yID0gbmFtZS5pbmRleE9mKENvbXBpbGVyQ29uc3RhbnRzLklEX0ZVTkNUSU9OX1NFUEFSQVRPUi5zeW1ib2xOYW1lKCkpOwotICAgICAgICBpZiAoaWRTZXBhcmF0b3IgPj0gMCkgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGlkU2VwYXJhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuYW1lLmNvbnRhaW5zKENvbXBpbGVyQ29uc3RhbnRzLkFOT05fRlVOQ1RJT05fUFJFRklYLnN5bWJvbE5hbWUoKSkgPyAiPGFub255bW91cz4iIDogbmFtZTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgc2NyaXB0IHN0YWNrIHRyYWNlIHN0cmluZyB3aXRoIGZyYW1lcyBpbmZvcm1hdGlvbiBzZXBhcmF0ZWQgYnkgJ1xuJwogICAgICAqCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9hcGkvc2NyaXB0aW5nL05hc2hvcm5TY3JpcHRFbmdpbmUuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvTmFzaG9yblNjcmlwdEVuZ2luZS5qYXZhCmluZGV4IDBhMWJmYjEuLjBmMmYzZDcgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvTmFzaG9yblNjcmlwdEVuZ2luZS5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvTmFzaG9yblNjcmlwdEVuZ2luZS5qYXZhCkBAIC0zMTksOSArMzE5LDYgQEAKICAgICAgICAgLy8gQ3JlYXRlIG5ldyBnbG9iYWwgaW5zdGFuY2UgbWlycm9yIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgQmluZGluZ3MuCiAgICAgICAgIGZpbmFsIFNjcmlwdE9iamVjdE1pcnJvciBtaXJyb3IgPSBjcmVhdGVHbG9iYWxNaXJyb3IoKTsKICAgICAgICAgYmluZGluZ3MucHV0KE5BU0hPUk5fR0xPQkFMLCBtaXJyb3IpOwotICAgICAgICAvLyBTaW5jZSB3ZSBjcmVhdGVkIHRoaXMgZ2xvYmFsIGV4cGxpY2l0bHkgZm9yIHRoZSBub24tZGVmYXVsdCBzY3JpcHQgY29udGV4dCB3ZSBzZXQgdGhlCi0gICAgICAgIC8vIGN1cnJlbnQgc2NyaXB0IGNvbnRleHQgaW4gZ2xvYmFsIHBlcm1hbmVudGx5IHNvIHRoYXQgaW52b2tlcyB3b3JrIGFzIGV4cGVjdGVkLiBTZWUgSkRLLTgxNTAyMTkKLSAgICAgICAgbWlycm9yLmdldEhvbWVHbG9iYWwoKS5zZXRJbml0U2NyaXB0Q29udGV4dChjdHh0KTsKICAgICAgICAgcmV0dXJuIG1pcnJvci5nZXRIb21lR2xvYmFsKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL0NvZGVHZW5lcmF0b3IuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vQ29kZUdlbmVyYXRvci5qYXZhCmluZGV4IGIyYTMxNjQuLjllMTE0OGYgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vQ29kZUdlbmVyYXRvci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vQ29kZUdlbmVyYXRvci5qYXZhCkBAIC0yNDU0LDYgKzI0NTQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbnRlck9iamVjdE5vZGUoZmluYWwgT2JqZWN0Tm9kZSBvYmplY3ROb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW50ZXJEZWZhdWx0KGZpbmFsIE5vZGUgbm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjUyMSw4ICsyNTI2LDcgQEAKICAgICAgICAgICAgIG9jID0gbmV3IEZpZWxkT2JqZWN0Q3JlYXRvcjxFeHByZXNzaW9uPih0aGlzLCB0dXBsZXMpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkVmFsdWUoZmluYWwgRXhwcmVzc2lvbiBub2RlLCBmaW5hbCBUeXBlIHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGdlbmVyaWMgdHlwZSBpbiBvcmRlciB0byBhdm9pZCBjb252ZXJzaW9uIGJldHdlZW4gb2JqZWN0IHR5cGVzCi0gICAgICAgICAgICAgICAgICAgIGxvYWRFeHByZXNzaW9uQXNUeXBlKG5vZGUsIFR5cGUuZ2VuZXJpYyh0eXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRFeHByZXNzaW9uQXNUeXBlKG5vZGUsIHR5cGUpOwogICAgICAgICAgICAgICAgIH19OwogICAgICAgICB9CiAKQEAgLTI1MzgsNyArMjU0MiwxMCBAQAogICAgICAgICAvL2hhbmRsZXIKICAgICAgICAgaWYgKHJlc3RPZlByb3BlcnR5KSB7CiAgICAgICAgICAgICBmaW5hbCBDb250aW51YXRpb25JbmZvIGNpID0gZ2V0Q29udGludWF0aW9uSW5mbygpOwotICAgICAgICAgICAgY2kuc2V0T2JqZWN0TGl0ZXJhbE1hcChtZXRob2QuZ2V0U3RhY2tTaXplKCksIG9jLmdldE1hcCgpKTsKKyAgICAgICAgICAgIC8vIENhbiBiZSBzZXQgYXQgbW9zdCBvbmNlIGZvciBhIHNpbmdsZSByZXN0LW9mIG1ldGhvZAorICAgICAgICAgICAgYXNzZXJ0IGNpLmdldE9iamVjdExpdGVyYWxNYXAoKSA9PSBudWxsOworICAgICAgICAgICAgY2kuc2V0T2JqZWN0TGl0ZXJhbE1hcChvYy5nZXRNYXAoKSk7CisgICAgICAgICAgICBjaS5zZXRPYmplY3RMaXRlcmFsU3RhY2tEZXB0aChtZXRob2QuZ2V0U3RhY2tTaXplKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbWV0aG9kLmR1cCgpOwpAQCAtNTI1Miw4ICs1MjU5LDEwIEBACiAgICAgICAgIHByaXZhdGUgVHlwZVtdIHN0YWNrVHlwZXM7CiAgICAgICAgIC8vIElmIG5vbi1udWxsLCB0aGlzIG5vZGUgc2hvdWxkIHBlcmZvcm0gdGhlIHJlcXVpc2l0ZSB0eXBlIGNvbnZlcnNpb24KICAgICAgICAgcHJpdmF0ZSBUeXBlIHJldHVyblZhbHVlVHlwZTsKLSAgICAgICAgLy8gSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gb2JqZWN0IGxpdGVyYWwgaW5pdGlhbGl6YXRpb24sIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwcm9wZXJ0eSBtYXBzCi0gICAgICAgIHByaXZhdGUgTWFwPEludGVnZXIsIFByb3BlcnR5TWFwPiBvYmplY3RMaXRlcmFsTWFwczsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYW4gb2JqZWN0IGxpdGVyYWwgaW5pdGlhbGl6YXRpb24sIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBtYXAKKyAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0eU1hcCBvYmplY3RMaXRlcmFsTWFwOworICAgICAgICAvLyBPYmplY3QgbGl0ZXJhbCBzdGFjayBkZXB0aCBmb3Igb2JqZWN0IGxpdGVyYWwgLSBub3QgbmVjZXNzYXJpbHkgdG9wIGlmIHByb3BlcnR5IGlzIGEgdHJlZQorICAgICAgICBwcml2YXRlIGludCBvYmplY3RMaXRlcmFsU3RhY2tEZXB0aCA9IC0xOwogICAgICAgICAvLyBUaGUgbGluZSBudW1iZXIgYXQgdGhlIGNvbnRpbnVhdGlvbiBwb2ludAogICAgICAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyOwogICAgICAgICAvLyBUaGUgYWN0aXZlIGNhdGNoIGxhYmVsLCBpbiBjYXNlIHRoZSBjb250aW51YXRpb24gcG9pbnQgaXMgaW4gYSB0cnkvY2F0Y2ggYmxvY2sKQEAgLTUzMDUsMTUgKzUzMTQsMjAgQEAKICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWVUeXBlID0gcmV0dXJuVmFsdWVUeXBlOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBzZXRPYmplY3RMaXRlcmFsTWFwKGZpbmFsIGludCBvYmplY3RMaXRlcmFsU3RhY2tEZXB0aCwgZmluYWwgUHJvcGVydHlNYXAgb2JqZWN0TGl0ZXJhbE1hcCkgewotICAgICAgICAgICAgaWYgKG9iamVjdExpdGVyYWxNYXBzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvYmplY3RMaXRlcmFsTWFwcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9iamVjdExpdGVyYWxNYXBzLnB1dChvYmplY3RMaXRlcmFsU3RhY2tEZXB0aCwgb2JqZWN0TGl0ZXJhbE1hcCk7CisgICAgICAgIGludCBnZXRPYmplY3RMaXRlcmFsU3RhY2tEZXB0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3RMaXRlcmFsU3RhY2tEZXB0aDsKICAgICAgICAgfQogCi0gICAgICAgIFByb3BlcnR5TWFwIGdldE9iamVjdExpdGVyYWxNYXAoZmluYWwgaW50IHN0YWNrRGVwdGgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RMaXRlcmFsTWFwcyA9PSBudWxsID8gbnVsbCA6IG9iamVjdExpdGVyYWxNYXBzLmdldChzdGFja0RlcHRoKTsKKyAgICAgICAgdm9pZCBzZXRPYmplY3RMaXRlcmFsU3RhY2tEZXB0aChmaW5hbCBpbnQgb2JqZWN0TGl0ZXJhbFN0YWNrRGVwdGgpIHsKKyAgICAgICAgICAgIHRoaXMub2JqZWN0TGl0ZXJhbFN0YWNrRGVwdGggPSBvYmplY3RMaXRlcmFsU3RhY2tEZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIFByb3BlcnR5TWFwIGdldE9iamVjdExpdGVyYWxNYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0TGl0ZXJhbE1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0T2JqZWN0TGl0ZXJhbE1hcChmaW5hbCBQcm9wZXJ0eU1hcCBvYmplY3RMaXRlcmFsTWFwKSB7CisgICAgICAgICAgICB0aGlzLm9iamVjdExpdGVyYWxNYXAgPSBvYmplY3RMaXRlcmFsTWFwOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC01NDAzLDkgKzU0MTcsMTAgQEAKICAgICAgICAgZmluYWwgaW50W10gICBzdGFja1N0b3JlU3BlYyA9IGNpLmdldFN0YWNrU3RvcmVTcGVjKCk7CiAgICAgICAgIGZpbmFsIFR5cGVbXSAgc3RhY2tUeXBlcyAgICAgPSBjaS5nZXRTdGFja1R5cGVzKCk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTdGFja0VtcHR5ICAgPSBzdGFja1N0b3JlU3BlYy5sZW5ndGggPT0gMDsKLSAgICAgICAgaW50IHJlcGxhY2VkT2JqZWN0TGl0ZXJhbE1hcHMgPSAwOworICAgICAgICBib29sZWFuIHJlcGxhY2VkT2JqZWN0TGl0ZXJhbE1hcCA9IGZhbHNlOwogICAgICAgICBpZighaXNTdGFja0VtcHR5KSB7CiAgICAgICAgICAgICAvLyBMb2FkIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgICAgIGZpbmFsIGludCBvYmplY3RMaXRlcmFsU3RhY2tEZXB0aCA9IGNpLmdldE9iamVjdExpdGVyYWxTdGFja0RlcHRoKCk7CiAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3RhY2tTdG9yZVNwZWMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2xvdCA9IHN0YWNrU3RvcmVTcGVjW2ldOwogICAgICAgICAgICAgICAgIG1ldGhvZC5sb2FkKGx2YXJUeXBlcy5nZXQoc2xvdCksIHNsb3QpOwpAQCAtNTQxMywxOCArNTQyOCwxOCBAQAogICAgICAgICAgICAgICAgIC8vIHN0YWNrOiBzMD1vYmplY3QgbGl0ZXJhbCBiZWluZyBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBtYXAgb2YgczAgc28gdGhhdCB0aGUgcHJvcGVydHkgd2UgYXJlIGluaXRpYWxpemluZyB3aGVuIHdlIGZhaWxlZAogICAgICAgICAgICAgICAgIC8vIGlzIG5vdyBjaS5yZXR1cm5WYWx1ZVR5cGUKLSAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eU1hcCBtYXAgPSBjaS5nZXRPYmplY3RMaXRlcmFsTWFwKGkpOwotICAgICAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpID09IG9iamVjdExpdGVyYWxTdGFja0RlcHRoKSB7CiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGNpLmdldE9iamVjdExpdGVyYWxNYXAoKSAhPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnQgU2NyaXB0T2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20obWV0aG9kLnBlZWtUeXBlKCkuZ2V0VHlwZUNsYXNzKCkpIDogbWV0aG9kLnBlZWtUeXBlKCkuZ2V0VHlwZUNsYXNzKCkgKyAiIGlzIG5vdCBhIHNjcmlwdCBvYmplY3QiOwotICAgICAgICAgICAgICAgICAgICBsb2FkQ29uc3RhbnQobWFwKTsKKyAgICAgICAgICAgICAgICAgICAgbG9hZENvbnN0YW50KGNpLmdldE9iamVjdExpdGVyYWxNYXAoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoU2NyaXB0T2JqZWN0LlNFVF9NQVApOwotICAgICAgICAgICAgICAgICAgICByZXBsYWNlZE9iamVjdExpdGVyYWxNYXBzKys7CisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkT2JqZWN0TGl0ZXJhbE1hcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIE11c3QgaGF2ZSBlbWl0dGVkIHRoZSBjb2RlIGZvciByZXBsYWNpbmcgYWxsIG9iamVjdCBsaXRlcmFsIG1hcHMKLSAgICAgICAgYXNzZXJ0IGNpLm9iamVjdExpdGVyYWxNYXBzID09IG51bGwgfHwgY2kub2JqZWN0TGl0ZXJhbE1hcHMuc2l6ZSgpID09IHJlcGxhY2VkT2JqZWN0TGl0ZXJhbE1hcHM7CisgICAgICAgIC8vIE11c3QgaGF2ZSBlbWl0dGVkIHRoZSBjb2RlIGZvciByZXBsYWNpbmcgdGhlIG1hcCBvZiBhbiBvYmplY3QgbGl0ZXJhbCBpZiB3ZSBoYXZlIGEgc2V0IG9iamVjdCBsaXRlcmFsIHN0YWNrIGRlcHRoCisgICAgICAgIGFzc2VydCBjaS5nZXRPYmplY3RMaXRlcmFsU3RhY2tEZXB0aCgpID09IC0xIHx8IHJlcGxhY2VkT2JqZWN0TGl0ZXJhbE1hcDsKICAgICAgICAgLy8gTG9hZCBSZXdyaXRlRXhjZXB0aW9uIGJhY2suCiAgICAgICAgIG1ldGhvZC5sb2FkKHJld3JpdGVFeGNlcHRpb25UeXBlLCBsdmFyQ291bnQpOwogICAgICAgICAvLyBHZXQgcmlkIG9mIHRoZSBzdG9yZWQgcmVmZXJlbmNlCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL0NvbXBpbGVyQ29uc3RhbnRzLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL0NvbXBpbGVyQ29uc3RhbnRzLmphdmEKaW5kZXggMjhiZDE5Zi4uMGQ2NGFjMiAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvY29kZWdlbi9Db21waWxlckNvbnN0YW50cy5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vQ29tcGlsZXJDb25zdGFudHMuamF2YQpAQCAtNzgsMTIgKzc4LDYgQEAKICAgICAvKiogZnVuY3Rpb24gcHJlZml4IGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zICovCiAgICAgQU5PTl9GVU5DVElPTl9QUkVGSVgoIkw6IiksCiAKLSAgICAvKiogc2VwYXJhdG9yIGZvciBtZXRob2QgbmFtZXMgb2YgbmVzdGVkIGZ1bmN0aW9ucyAqLwotICAgIE5FU1RFRF9GVU5DVElPTl9TRVBBUkFUT1IoIiMiKSwKLQotICAgIC8qKiBzZXBhcmF0b3IgZm9yIG1ha2luZyBtZXRob2QgbmFtZXMgdW5pcXVlIGJ5IGFwcGVuZGluZyBudW1lcmljIGlkcyAqLwotICAgIElEX0ZVTkNUSU9OX1NFUEFSQVRPUigiLSIpLAotCiAgICAgLyoqIG1ldGhvZCBuYW1lIGZvciBKYXZhIG1ldGhvZCB0aGF0IGlzIHRoZSBwcm9ncmFtIGVudHJ5IHBvaW50ICovCiAgICAgUFJPR1JBTSgiOnByb2dyYW0iKSwKIApkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvY29kZWdlbi9OYW1lc3BhY2UuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vTmFtZXNwYWNlLmphdmEKaW5kZXggMDhhZTM1Ni4uMTczMDRhOSAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvY29kZWdlbi9OYW1lc3BhY2UuamF2YQorKysgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL05hbWVzcGFjZS5qYXZhCkBAIC02OCw3ICs2OCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgdW5pcXVlTmFtZSBuYW1lIGluIHRoZSBuYW1lc3BhY2UgaW4gdGhlIGZvcm0gYmFzZS1uIHdoZXJlIG4gdmFyaWVzLgorICAgICAqIENyZWF0ZSBhIHVuaXF1ZU5hbWUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlIGluIHRoZSBmb3JtIGJhc2UkbiB3aGVyZSBuIHZhcmllcy4KICAgICAgKiBBbHNvIHRydW5jYXRlcyB2ZXJ5IGxvbmcgbmFtZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYnJlYWsgQVNNLgogICAgICAqCiAgICAgICogQHBhcmFtIGJhc2UgQmFzZSBvZiBuYW1lLiAgQmFzZSB3aWxsIGJlIHJldHVybmVkIGlmIHVuaXF1ZU5hbWUuCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgICAgICBpZiAoY291bnRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY291bnRlciArIDE7CiAgICAgICAgICAgICAgICAgbmFtZXNwYWNlRGlyZWN0b3J5LnB1dCh0cnVuY2F0ZWRCYXNlLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZEJhc2UgKyBDb21waWxlckNvbnN0YW50cy5JRF9GVU5DVElPTl9TRVBBUkFUT1Iuc3ltYm9sTmFtZSgpICsgY291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydW5jYXRlZEJhc2UgKyAnLScgKyBjb3VudDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL1NwaWxsT2JqZWN0Q3JlYXRvci5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvY29kZWdlbi9TcGlsbE9iamVjdENyZWF0b3IuamF2YQppbmRleCAyMmRjNzJlLi4zNzgzYWQ4IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9jb2RlZ2VuL1NwaWxsT2JqZWN0Q3JlYXRvci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL2NvZGVnZW4vU3BpbGxPYmplY3RDcmVhdG9yLmphdmEKQEAgLTE4OCw4ICsxODgsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFZhbHVlKGZpbmFsIEV4cHJlc3Npb24gZXhwciwgZmluYWwgVHlwZSB0eXBlKSB7Ci0gICAgICAgIC8vIFVzZSBnZW5lcmljIHR5cGUgaW4gb3JkZXIgdG8gYXZvaWQgY29udmVyc2lvbiBiZXR3ZWVuIG9iamVjdCB0eXBlcwotICAgICAgICBjb2RlZ2VuLmxvYWRFeHByZXNzaW9uQXNUeXBlKGV4cHIsIFR5cGUuZ2VuZXJpYyh0eXBlKSk7CisgICAgICAgIGNvZGVnZW4ubG9hZEV4cHJlc3Npb25Bc1R5cGUoZXhwciwgdHlwZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL0dsb2JhbC5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9HbG9iYWwuamF2YQppbmRleCA3YWQyNTI0Li5jZjgzNDY4IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL0dsb2JhbC5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvR2xvYmFsLmphdmEKQEAgLTkyOCw4ICs5MjgsNiBAQAogICAgIHByaXZhdGUgVGhyZWFkTG9jYWw8U2NyaXB0Q29udGV4dD4gc2NvbnRleHQ7CiAgICAgLy8gY3VycmVudCBTY3JpcHRFbmdpbmUgYXNzb2NpYXRlZCAtIGNhbiBiZSBudWxsLgogICAgIHByaXZhdGUgU2NyaXB0RW5naW5lIGVuZ2luZTsKLSAgICAvLyBpbml0aWFsIFNjcmlwdENvbnRleHQgLSB1c3VhbGx5IG51bGwgYW5kIG9ubHkgdXNlZCBmb3Igc3BlY2lhbCBjYXNlCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTY3JpcHRDb250ZXh0IGluaXRzY29udGV4dDsKIAogICAgIC8vIEVTNiBnbG9iYWwgbGV4aWNhbCBzY29wZS4KICAgICBwcml2YXRlIGZpbmFsIExleGljYWxTY29wZSBsZXhpY2FsU2NvcGU7CkBAIC05NTUsMjIgKzk1Myw5IEBACiAgICAgICAgIHJldHVybiBzY29udGV4dC5nZXQoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGluaXRpYWwgc2NyaXB0IGNvbnRleHQKLSAgICAgKiBAcGFyYW0gY3R4dCBpbml0aWFsIHNjcmlwdCBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5pdFNjcmlwdENvbnRleHQoZmluYWwgU2NyaXB0Q29udGV4dCBjdHh0KSB7Ci0gICAgICAgIHRoaXMuaW5pdHNjb250ZXh0ID0gY3R4dDsKLSAgICB9Ci0KICAgICBwcml2YXRlIFNjcmlwdENvbnRleHQgY3VycmVudENvbnRleHQoKSB7CiAgICAgICAgIGZpbmFsIFNjcmlwdENvbnRleHQgc2MgPSBzY29udGV4dCAhPSBudWxsPyBzY29udGV4dC5nZXQoKSA6IG51bGw7Ci0gICAgICAgIGlmIChzYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2M7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW5pdHNjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBpbml0c2NvbnRleHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZ2luZSAhPSBudWxsPyBlbmdpbmUuZ2V0Q29udGV4dCgpIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIChzYyAhPSBudWxsKT8gc2MgOiAoZW5naW5lICE9IG51bGw/IGVuZ2luZS5nZXRDb250ZXh0KCkgOiBudWxsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvTmF0aXZlQXJyYXkuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvTmF0aXZlQXJyYXkuamF2YQppbmRleCAwYjAzNmEyLi5lMDU0MzVhIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL05hdGl2ZUFycmF5LmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVBcnJheS5qYXZhCkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgY2FsbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb290c3RyYXAuY3JlYXRlRHluYW1pY0ludm9rZXIoImR5bjpjYWxsIiwgZG91YmxlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0RnVuY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgfQpAQCAtMTIxOSwyMyArMTIxOSwyMyBAQAogICAgICAgICByZXR1cm4gY29weTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY29tcGFyZUZ1bmN0aW9uKGZpbmFsIE9iamVjdCBjb21wYXJlZm4pIHsKKyAgICBwcml2YXRlIHN0YXRpYyBTY3JpcHRGdW5jdGlvbiBjb21wYXJlRnVuY3Rpb24oZmluYWwgT2JqZWN0IGNvbXBhcmVmbikgewogICAgICAgICBpZiAoY29tcGFyZWZuID09IFNjcmlwdFJ1bnRpbWUuVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghQm9vdHN0cmFwLmlzQ2FsbGFibGUoY29tcGFyZWZuKSkgeworICAgICAgICBpZiAoISAoY29tcGFyZWZuIGluc3RhbmNlb2YgU2NyaXB0RnVuY3Rpb24pKSB7CiAgICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3IoIm5vdC5hLmZ1bmN0aW9uIiwgU2NyaXB0UnVudGltZS5zYWZlVG9TdHJpbmcoY29tcGFyZWZuKSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gY29tcGFyZWZuOworICAgICAgICByZXR1cm4gKFNjcmlwdEZ1bmN0aW9uKWNvbXBhcmVmbjsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBzb3J0KGZpbmFsIE9iamVjdFtdIGFycmF5LCBmaW5hbCBPYmplY3QgY29tcGFyZWZuKSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCBjbXAgPSBjb21wYXJlRnVuY3Rpb24oY29tcGFyZWZuKTsKKyAgICAgICAgZmluYWwgU2NyaXB0RnVuY3Rpb24gY21wID0gY29tcGFyZUZ1bmN0aW9uKGNvbXBhcmVmbik7CiAKICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGxpc3QgPSBBcnJheXMuYXNMaXN0KGFycmF5KTsKLSAgICAgICAgZmluYWwgT2JqZWN0IGNtcFRoaXMgPSBjbXAgPT0gbnVsbCB8fCBCb290c3RyYXAuaXNTdHJpY3RDYWxsYWJsZShjbXApID8gU2NyaXB0UnVudGltZS5VTkRFRklORUQgOiBHbG9iYWwuaW5zdGFuY2UoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGNtcFRoaXMgPSBjbXAgPT0gbnVsbCB8fCBjbXAuaXNTdHJpY3QoKSA/IFNjcmlwdFJ1bnRpbWUuVU5ERUZJTkVEIDogR2xvYmFsLmluc3RhbmNlKCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvTmF0aXZlSlNPTi5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVKU09OLmphdmEKaW5kZXggZTRhOWFjNS4uODc3ZGU1MCAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVKU09OLmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVKU09OLmphdmEKQEAgLTM1LDEwICszNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5KU09iamVjdDsKLWltcG9ydCBqZGsubmFzaG9ybi5hcGkuc2NyaXB0aW5nLlNjcmlwdE9iamVjdE1pcnJvcjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5vYmplY3RzLmFubm90YXRpb25zLkF0dHJpYnV0ZTsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5vYmplY3RzLmFubm90YXRpb25zLkZ1bmN0aW9uOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLm9iamVjdHMuYW5ub3RhdGlvbnMuU2NyaXB0Q2xhc3M7CkBAIC00Nyw2ICs0NCw3IEBACiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5KU09ORnVuY3Rpb25zOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuSlNUeXBlOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuUHJvcGVydHlNYXA7CitpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRGdW5jdGlvbjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlNjcmlwdE9iamVjdDsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLmFycmF5cy5BcnJheUxpa2VJdGVyYXRvcjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLmxpbmtlci5Cb290c3RyYXA7CkBAIC03MCwxOCArNjgsNiBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBKU09CSkVDVF9JTlZPS0VSID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIGdldEpTT0JKRUNUX0lOVk9LRVIoKSB7Ci0gICAgICAgIHJldHVybiBHbG9iYWwuaW5zdGFuY2UoKS5nZXREeW5hbWljSW52b2tlcihKU09CSkVDVF9JTlZPS0VSLAotICAgICAgICAgICAgICAgIG5ldyBDYWxsYWJsZTxNZXRob2RIYW5kbGU+KCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIE1ldGhvZEhhbmRsZSBjYWxsKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb3RzdHJhcC5jcmVhdGVEeW5hbWljSW52b2tlcigiZHluOmNhbGwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFJFUExBQ0VSX0lOVk9LRVIgPSBuZXcgT2JqZWN0KCk7CiAKQEAgLTkxLDcgKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgY2FsbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb290c3RyYXAuY3JlYXRlRHluYW1pY0ludm9rZXIoImR5bjpjYWxsIiwgT2JqZWN0LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NyaXB0RnVuY3Rpb24uY2xhc3MsIFNjcmlwdE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgfQpAQCAtMTQxLDEwICsxMjcsOSBAQAogICAgICAgICBmaW5hbCBTdHJpbmdpZnlTdGF0ZSBzdGF0ZSA9IG5ldyBTdHJpbmdpZnlTdGF0ZSgpOwogCiAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVwbGFjZXIsIGl0IG11c3QgYmUgYSBmdW5jdGlvbiBvciBhbiBhcnJheS4KLSAgICAgICAgaWYgKEJvb3RzdHJhcC5pc0NhbGxhYmxlKHJlcGxhY2VyKSkgewotICAgICAgICAgICAgc3RhdGUucmVwbGFjZXJGdW5jdGlvbiA9IHJlcGxhY2VyOworICAgICAgICBpZiAocmVwbGFjZXIgaW5zdGFuY2VvZiBTY3JpcHRGdW5jdGlvbikgeworICAgICAgICAgICAgc3RhdGUucmVwbGFjZXJGdW5jdGlvbiA9IChTY3JpcHRGdW5jdGlvbikgcmVwbGFjZXI7CiAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShyZXBsYWNlcikgfHwKLSAgICAgICAgICAgICAgICBpc0pTT2JqZWN0QXJyYXkocmVwbGFjZXIpIHx8CiAgICAgICAgICAgICAgICAgcmVwbGFjZXIgaW5zdGFuY2VvZiBJdGVyYWJsZSB8fAogICAgICAgICAgICAgICAgIChyZXBsYWNlciAhPSBudWxsICYmIHJlcGxhY2VyLmdldENsYXNzKCkuaXNBcnJheSgpKSkgewogCkBAIC0yMTYsMTkgKzIwMSwxOCBAQAogICAgIC8vIHN0cmluZ2lmeSBoZWxwZXJzLgogCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5naWZ5U3RhdGUgewotICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHN0YWNrID0gbmV3IElkZW50aXR5SGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIE1hcDxTY3JpcHRPYmplY3QsIFNjcmlwdE9iamVjdD4gc3RhY2sgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKIAogICAgICAgICBTdHJpbmdCdWlsZGVyICBpbmRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBTdHJpbmcgICAgICAgICBnYXAgPSAiIjsKICAgICAgICAgTGlzdDxTdHJpbmc+ICAgcHJvcGVydHlMaXN0ID0gbnVsbDsKLSAgICAgICAgT2JqZWN0ICAgICAgICAgcmVwbGFjZXJGdW5jdGlvbiA9IG51bGw7CisgICAgICAgIFNjcmlwdEZ1bmN0aW9uIHJlcGxhY2VyRnVuY3Rpb24gPSBudWxsOwogICAgIH0KIAogICAgIC8vIFNwZWM6IFRoZSBhYnN0cmFjdCBvcGVyYXRpb24gU3RyKGtleSwgaG9sZGVyKS4KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgc3RyKGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIE9iamVjdCBob2xkZXIsIGZpbmFsIFN0cmluZ2lmeVN0YXRlIHN0YXRlKSB7Ci0gICAgICAgIGFzc2VydCBob2xkZXIgaW5zdGFuY2VvZiBTY3JpcHRPYmplY3QgfHwgaG9sZGVyIGluc3RhbmNlb2YgSlNPYmplY3Q7CisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IHN0cihmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBTY3JpcHRPYmplY3QgaG9sZGVyLCBmaW5hbCBTdHJpbmdpZnlTdGF0ZSBzdGF0ZSkgeworICAgICAgICBPYmplY3QgdmFsdWUgPSBob2xkZXIuZ2V0KGtleSk7CiAKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0UHJvcGVydHkoaG9sZGVyLCBrZXkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2NyaXB0T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgZmluYWwgSW52b2tlQnlOYW1lIHRvSlNPTkludm9rZXIgPSBnZXRUT19KU09OKCk7CkBAIC0yMzcsMTIgKzIyMSw2IEBACiAgICAgICAgICAgICAgICAgaWYgKEJvb3RzdHJhcC5pc0NhbGxhYmxlKHRvSlNPTikpIHsKICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0b0pTT05JbnZva2VyLmdldEludm9rZXIoKS5pbnZva2VFeGFjdCh0b0pTT04sIHN2YWx1ZSwga2V5KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSlNPYmplY3QpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBKU09iamVjdCBqc09iaiA9IChKU09iamVjdCl2YWx1ZTsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdG9KU09OID0ganNPYmouZ2V0TWVtYmVyKCJ0b0pTT04iKTsKLSAgICAgICAgICAgICAgICBpZiAoQm9vdHN0cmFwLmlzQ2FsbGFibGUodG9KU09OKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldEpTT0JKRUNUX0lOVk9LRVIoKS5pbnZva2VFeGFjdCh0b0pTT04sIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzdGF0ZS5yZXBsYWNlckZ1bmN0aW9uICE9IG51bGwpIHsKQEAgLTI4NCwxMCArMjYyLDEwIEBACiAKICAgICAgICAgZmluYWwgSlNUeXBlIHR5cGUgPSBKU1R5cGUub2YodmFsdWUpOwogICAgICAgICBpZiAodHlwZSA9PSBKU1R5cGUuT0JKRUNUKSB7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkgfHwgaXNKU09iamVjdEFycmF5KHZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBKQSh2YWx1ZSwgc3RhdGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdCB8fCB2YWx1ZSBpbnN0YW5jZW9mIEpTT2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEpPKHZhbHVlLCBzdGF0ZSk7CisgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSkEoKFNjcmlwdE9iamVjdCl2YWx1ZSwgc3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBKTygoU2NyaXB0T2JqZWN0KXZhbHVlLCBzdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjk1LDkgKzI3Myw3IEBACiAgICAgfQogCiAgICAgLy8gU3BlYzogVGhlIGFic3RyYWN0IG9wZXJhdGlvbiBKTyh2YWx1ZSkgc2VyaWFsaXplcyBhbiBvYmplY3QuCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpPKGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgU3RyaW5naWZ5U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgYXNzZXJ0IHZhbHVlIGluc3RhbmNlb2YgU2NyaXB0T2JqZWN0IHx8IHZhbHVlIGluc3RhbmNlb2YgSlNPYmplY3Q7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSk8oZmluYWwgU2NyaXB0T2JqZWN0IHZhbHVlLCBmaW5hbCBTdHJpbmdpZnlTdGF0ZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUuc3RhY2suY29udGFpbnNLZXkodmFsdWUpKSB7CiAgICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3IoIkpTT04uc3RyaW5naWZ5LmN5Y2xpYyIpOwogICAgICAgICB9CkBAIC0zMDgsOCArMjg0LDcgQEAKIAogICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGZpbmFsU3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+ICBwYXJ0aWFsICA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gIGsgICAgICAgID0gc3RhdGUucHJvcGVydHlMaXN0ID09IG51bGwgPwotICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoZ2V0T3duS2V5cyh2YWx1ZSkpIDogc3RhdGUucHJvcGVydHlMaXN0OworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gIGsgICAgICAgID0gc3RhdGUucHJvcGVydHlMaXN0ID09IG51bGwgPyBBcnJheXMuYXNMaXN0KHZhbHVlLmdldE93bktleXMoZmFsc2UpKSA6IHN0YXRlLnByb3BlcnR5TGlzdDsKIAogICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBwIDogaykgewogICAgICAgICAgICAgZmluYWwgT2JqZWN0IHN0clAgPSBzdHIocCwgdmFsdWUsIHN0YXRlKTsKQEAgLTM3NCw5ICszNDksNyBAQAogICAgIH0KIAogICAgIC8vIFNwZWM6IFRoZSBhYnN0cmFjdCBvcGVyYXRpb24gSkEodmFsdWUpIHNlcmlhbGl6ZXMgYW4gYXJyYXkuCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IEpBKGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgU3RyaW5naWZ5U3RhdGUgc3RhdGUpIHsKLSAgICAgICAgYXNzZXJ0IHZhbHVlIGluc3RhbmNlb2YgU2NyaXB0T2JqZWN0IHx8IHZhbHVlIGluc3RhbmNlb2YgSlNPYmplY3Q7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgSkEoZmluYWwgU2NyaXB0T2JqZWN0IHZhbHVlLCBmaW5hbCBTdHJpbmdpZnlTdGF0ZSBzdGF0ZSkgewogICAgICAgICBpZiAoc3RhdGUuc3RhY2suY29udGFpbnNLZXkodmFsdWUpKSB7CiAgICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3IoIkpTT04uc3RyaW5naWZ5LmN5Y2xpYyIpOwogICAgICAgICB9CkBAIC0zODYsNyArMzU5LDcgQEAKICAgICAgICAgc3RhdGUuaW5kZW50LmFwcGVuZChzdGF0ZS5nYXApOwogICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gcGFydGlhbCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCi0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBKU1R5cGUudG9JbnRlZ2VyKGdldExlbmd0aCh2YWx1ZSkpOworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gSlNUeXBlLnRvSW50ZWdlcih2YWx1ZS5nZXRMZW5ndGgoKSk7CiAgICAgICAgIGludCBpbmRleCA9IDA7CiAKICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CkBAIC00NDAsNDggKzQxMyw0IEBACiAKICAgICAgICAgcmV0dXJuIGZpbmFsU3RyLnRvU3RyaW5nKCk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0T3duS2V5cyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTY3JpcHRPYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNjcmlwdE9iamVjdClvYmopLmdldE93bktleXMoZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdE1pcnJvcikgewotICAgICAgICAgICAgcmV0dXJuICgoU2NyaXB0T2JqZWN0TWlycm9yKW9iaikuZ2V0T3duS2V5cyhmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSlNPYmplY3QpIHsKLSAgICAgICAgICAgIC8vIE5vIG5vdGlvbiBvZiAib3duIGtleXMiIG9yICJwcm90byIgZm9yIGdlbmVyYWwgSlNPYmplY3QhIFdlIGp1c3QKLSAgICAgICAgICAgIC8vIHJldHVybiBhbGwga2V5cyBvZiB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgYmUgdXNlZnVsIGZvciBQT0pPcwotICAgICAgICAgICAgLy8gaW1wbGVtZW50aW5nIEpTT2JqZWN0IGludGVyZmFjZS4KLSAgICAgICAgICAgIHJldHVybiAoKEpTT2JqZWN0KW9iaikua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCByZWFjaCBoZXJlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0TGVuZ3RoKGZpbmFsIE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoU2NyaXB0T2JqZWN0KW9iaikuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSlNPYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEpTT2JqZWN0KW9iaikuZ2V0TWVtYmVyKCJsZW5ndGgiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCByZWFjaCBoZXJlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSlNPYmplY3RBcnJheShmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHJldHVybiAob2JqIGluc3RhbmNlb2YgSlNPYmplY3QpICYmICgoSlNPYmplY3Qpb2JqKS5pc0FycmF5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIE9iamVjdCBob2xkZXIsIGZpbmFsIE9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKGhvbGRlciBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoU2NyaXB0T2JqZWN0KWhvbGRlcikuZ2V0KGtleSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaG9sZGVyIGluc3RhbmNlb2YgSlNPYmplY3QpIHsKLSAgICAgICAgICAgIEpTT2JqZWN0IGpzT2JqID0gKEpTT2JqZWN0KWhvbGRlcjsKLSAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpzT2JqLmdldFNsb3QoKEludGVnZXIpa2V5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpzT2JqLmdldE1lbWJlcihPYmplY3RzLnRvU3RyaW5nKGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCByZWFjaCBoZXJlIik7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL05hdGl2ZVJlZ0V4cC5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVSZWdFeHAuamF2YQppbmRleCA1MmU4N2QzLi5kYTY0MzcyIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL05hdGl2ZVJlZ0V4cC5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvTmF0aXZlUmVnRXhwLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLkpTVHlwZTsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlBhcnNlckV4Y2VwdGlvbjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlByb3BlcnR5TWFwOworaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuU2NyaXB0RnVuY3Rpb247CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRPYmplY3Q7CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRSdW50aW1lOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUubGlua2VyLkJvb3RzdHJhcDsKQEAgLTY1NSw3ICs2NTYsNyBAQAogICAgICAqIEBwYXJhbSByZXBsYWNlbWVudCBSZXBsYWNlbWVudCBzdHJpbmcuCiAgICAgICogQHJldHVybiBTdHJpbmcgd2l0aCBzdWJzdGl0dXRpb25zLgogICAgICAqLwotICAgIFN0cmluZyByZXBsYWNlKGZpbmFsIFN0cmluZyBzdHJpbmcsIGZpbmFsIFN0cmluZyByZXBsYWNlbWVudCwgZmluYWwgT2JqZWN0IGZ1bmN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBTdHJpbmcgcmVwbGFjZShmaW5hbCBTdHJpbmcgc3RyaW5nLCBmaW5hbCBTdHJpbmcgcmVwbGFjZW1lbnQsIGZpbmFsIFNjcmlwdEZ1bmN0aW9uIGZ1bmN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgZmluYWwgUmVnRXhwTWF0Y2hlciBtYXRjaGVyID0gcmVnZXhwLm1hdGNoKHN0cmluZyk7CiAKICAgICAgICAgaWYgKG1hdGNoZXIgPT0gbnVsbCkgewpAQCAtNjcxLDcgKzY3Miw3IEBACiAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nLCAwLCBtYXRjaGVyLnN0YXJ0KCkpOwogCiAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBzZWxmID0gQm9vdHN0cmFwLmlzU3RyaWN0Q2FsbGFibGUoZnVuY3Rpb24pID8gVU5ERUZJTkVEIDogR2xvYmFsLmluc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHNlbGYgPSBmdW5jdGlvbi5pc1N0cmljdCgpID8gVU5ERUZJTkVEIDogR2xvYmFsLmluc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxSZXBsYWNlVmFsdWUoZ2V0UmVwbGFjZVZhbHVlSW52b2tlcigpLCBmdW5jdGlvbiwgc2VsZiwgbWF0Y2hlciwgc3RyaW5nKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFwcGVuZFJlcGxhY2VtZW50KG1hdGNoZXIsIHN0cmluZywgcmVwbGFjZW1lbnQsIHNiKTsKQEAgLTY5MSw3ICs2OTIsNyBAQAogICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogICAgICAgICBmaW5hbCBNZXRob2RIYW5kbGUgaW52b2tlciA9IGZ1bmN0aW9uID09IG51bGwgPyBudWxsIDogZ2V0UmVwbGFjZVZhbHVlSW52b2tlcigpOwotICAgICAgICBmaW5hbCBPYmplY3Qgc2VsZiA9IGZ1bmN0aW9uID09IG51bGwgfHwgQm9vdHN0cmFwLmlzU3RyaWN0Q2FsbGFibGUoZnVuY3Rpb24pID8gVU5ERUZJTkVEIDogR2xvYmFsLmluc3RhbmNlKCk7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZWxmID0gZnVuY3Rpb24gPT0gbnVsbCB8fCBmdW5jdGlvbi5pc1N0cmljdCgpID8gVU5ERUZJTkVEIDogR2xvYmFsLmluc3RhbmNlKCk7CiAKICAgICAgICAgZG8gewogICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZywgdGhpc0luZGV4LCBtYXRjaGVyLnN0YXJ0KCkpOwpAQCAtODA3LDEzICs4MDgsMTIgQEAKICAgICAgICAgICAgICAgICBuZXcgQ2FsbGFibGU8TWV0aG9kSGFuZGxlPigpIHsKICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZXRob2RIYW5kbGUgY2FsbCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb290c3RyYXAuY3JlYXRlRHluYW1pY0ludm9rZXIoImR5bjpjYWxsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vdHN0cmFwLmNyZWF0ZUR5bmFtaWNJbnZva2VyKCJkeW46Y2FsbCIsIFN0cmluZy5jbGFzcywgU2NyaXB0RnVuY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2FsbFJlcGxhY2VWYWx1ZShmaW5hbCBNZXRob2RIYW5kbGUgaW52b2tlciwgZmluYWwgT2JqZWN0IGZ1bmN0aW9uLCBmaW5hbCBPYmplY3Qgc2VsZiwgZmluYWwgUmVnRXhwTWF0Y2hlciBtYXRjaGVyLCBmaW5hbCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBjYWxsUmVwbGFjZVZhbHVlKGZpbmFsIE1ldGhvZEhhbmRsZSBpbnZva2VyLCBmaW5hbCBTY3JpcHRGdW5jdGlvbiBmdW5jdGlvbiwgZmluYWwgT2JqZWN0IHNlbGYsIGZpbmFsIFJlZ0V4cE1hdGNoZXIgbWF0Y2hlciwgZmluYWwgU3RyaW5nIHN0cmluZykgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdIGdyb3VwcyA9IGdyb3VwcyhtYXRjaGVyKTsKICAgICAgICAgZmluYWwgT2JqZWN0W10gYXJncyAgID0gQXJyYXlzLmNvcHlPZihncm91cHMsIGdyb3Vwcy5sZW5ndGggKyAyKTsKIApkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVTdHJpbmcuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL29iamVjdHMvTmF0aXZlU3RyaW5nLmphdmEKaW5kZXggMzA0ZWM5OS4uN2U4NjJjYiAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvb2JqZWN0cy9OYXRpdmVTdHJpbmcuamF2YQorKysgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9vYmplY3RzL05hdGl2ZVN0cmluZy5qYXZhCkBAIC01NiwxMyArNTYsMTQgQEAKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLkpTVHlwZTsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLk9wdGltaXN0aWNCdWlsdGluczsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlByb3BlcnR5TWFwOworaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuU2NyaXB0RnVuY3Rpb247CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRPYmplY3Q7CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRSdW50aW1lOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuYXJyYXlzLkFycmF5SW5kZXg7Ci1pbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5saW5rZXIuQm9vdHN0cmFwOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUubGlua2VyLk5hc2hvcm5HdWFyZHM7CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5saW5rZXIuUHJpbWl0aXZlTG9va3VwOwogCisKIC8qKgogICogRUNNQSAxNS41IFN0cmluZyBPYmplY3RzLgogICovCkBAIC03NDgsOCArNzQ5LDggQEAKICAgICAgICAgICAgIG5hdGl2ZVJlZ0V4cCA9IE5hdGl2ZVJlZ0V4cC5mbGF0UmVnRXhwKEpTVHlwZS50b1N0cmluZyhzdHJpbmcpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChCb290c3RyYXAuaXNDYWxsYWJsZShyZXBsYWNlbWVudCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZWdFeHAucmVwbGFjZShzdHIsICIiLCByZXBsYWNlbWVudCk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCBpbnN0YW5jZW9mIFNjcmlwdEZ1bmN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlUmVnRXhwLnJlcGxhY2Uoc3RyLCAiIiwgKFNjcmlwdEZ1bmN0aW9uKXJlcGxhY2VtZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBuYXRpdmVSZWdFeHAucmVwbGFjZShzdHIsIEpTVHlwZS50b1N0cmluZyhyZXBsYWNlbWVudCksIG51bGwpOwpkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcGFyc2VyL0Fic3RyYWN0UGFyc2VyLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9wYXJzZXIvQWJzdHJhY3RQYXJzZXIuamF2YQppbmRleCAxYzdmNDEwLi5hN2M3ZmI5IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9wYXJzZXIvQWJzdHJhY3RQYXJzZXIuamF2YQorKysgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9wYXJzZXIvQWJzdHJhY3RQYXJzZXIuamF2YQpAQCAtMjAwLDEwICsyMDAsOCBAQAogICAgICAqIEByZXR1cm4gdG9rZW5UeXBlIG9mIG5leHQgdG9rZW4uCiAgICAgICovCiAgICAgcHJpdmF0ZSBUb2tlblR5cGUgbmV4dFRva2VuKCkgewotICAgICAgICAvLyBDYXB0dXJlIGxhc3QgdG9rZW4gdHlwZSwgYnV0IGlnbm9yZSBjb21tZW50cyAod2hpY2ggYXJlIGlycmVsZXZhbnQgZm9yIHRoZSBwdXJwb3NlIG9mIG5ld2xpbmUgZGV0ZWN0aW9uKS4KLSAgICAgICAgaWYgKHR5cGUgIT0gQ09NTUVOVCkgewotICAgICAgICAgICAgbGFzdCA9IHR5cGU7Ci0gICAgICAgIH0KKyAgICAgICAgLy8gQ2FwdHVyZSBsYXN0IHRva2VuIHRva2VuVHlwZS4KKyAgICAgICAgbGFzdCA9IHR5cGU7CiAgICAgICAgIGlmICh0eXBlICE9IEVPRikgewogCiAgICAgICAgICAgICAvLyBTZXQgdXAgbmV4dCB0b2tlbi4KZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3BhcnNlci9QYXJzZXIuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3BhcnNlci9QYXJzZXIuamF2YQppbmRleCA5MWNkMjY2Li5jZmRkNTk5IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9wYXJzZXIvUGFyc2VyLmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcGFyc2VyL1BhcnNlci5qYXZhCkBAIC00NTksNyArNDU5LDcgQEAKIAogICAgICAgICBmaW5hbCBGdW5jdGlvbk5vZGUgcGFyZW50RnVuY3Rpb24gPSBsYy5nZXRDdXJyZW50RnVuY3Rpb24oKTsKICAgICAgICAgaWYgKHBhcmVudEZ1bmN0aW9uICE9IG51bGwgJiYgIXBhcmVudEZ1bmN0aW9uLmlzUHJvZ3JhbSgpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGFyZW50RnVuY3Rpb24uZ2V0TmFtZSgpKS5hcHBlbmQoQ29tcGlsZXJDb25zdGFudHMuTkVTVEVEX0ZVTkNUSU9OX1NFUEFSQVRPUi5zeW1ib2xOYW1lKCkpOworICAgICAgICAgICAgc2IuYXBwZW5kKHBhcmVudEZ1bmN0aW9uLmdldE5hbWUoKSkuYXBwZW5kKCckJyk7CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQgaWRlbnQuZ2V0TmFtZSgpICE9IG51bGw7CkBAIC0xMTM1LDcgKzExMzUsNyBAQAogCiAgICAgLyoqCiAgICAgICogRXhwcmVzc2lvblN0YXRlbWVudCA6Ci0gICAgICogICAgICBFeHByZXNzaW9uIDsgLy8gW2xvb2thaGVhZCB+KHsgb3IgIGZ1bmN0aW9uICldCisgICAgICogICAgICBFeHByZXNzaW9uIDsgLy8gW2xvb2thaGVhZCB+KCBvciAgZnVuY3Rpb24gKV0KICAgICAgKgogICAgICAqIFNlZSAxMi40CiAgICAgICoKZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvQ29udGV4dC5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9Db250ZXh0LmphdmEKaW5kZXggNDdhODIzMy4uMGQ4MjEzNiAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9Db250ZXh0LmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9Db250ZXh0LmphdmEKQEAgLTM3NywxMiArMzc3LDEwIEBACiAgICAgZmluYWwgYm9vbGVhbiBfc3RyaWN0OwogCiAgICAgLyoqIGNsYXNzIGxvYWRlciB0byByZXNvbHZlIGNsYXNzZXMgZnJvbSBzY3JpcHQuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciBhcHBMb2FkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciAgYXBwTG9hZGVyOwogCi0gICAgLypwYWNrYWdlLXByaXZhdGUqLwotICAgIENsYXNzTG9hZGVyIGdldEFwcExvYWRlcigpIHsKLSAgICAgICAgcmV0dXJuIGFwcExvYWRlcjsKLSAgICB9CisgICAgLyoqIENsYXNzIGxvYWRlciB0byBsb2FkIGNsYXNzZXMgZnJvbSAtY2xhc3NwYXRoIG9wdGlvbiwgaWYgc2V0LiAqLworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgIGNsYXNzUGF0aExvYWRlcjsKIAogICAgIC8qKiBDbGFzcyBsb2FkZXIgdG8gbG9hZCBjbGFzc2VzIGNvbXBpbGVkIGZyb20gc2NyaXB0cy4gKi8KICAgICBwcml2YXRlIGZpbmFsIFNjcmlwdExvYWRlciBzY3JpcHRMb2FkZXI7CkBAIC0zOTcsMTIgKzM5NSwxMSBAQAogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NGaWx0ZXIgY2xhc3NGaWx0ZXI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc0xvYWRlciBteUxvYWRlciA9IENvbnRleHQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAvKiogUHJvY2Vzcy13aWRlIHNpbmdsZXRvbiBzdHJ1Y3R1cmUgbG9hZGVyICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RydWN0dXJlTG9hZGVyIHRoZVN0cnVjdExvYWRlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJ1Y3R1cmVMb2FkZXIgc2hhcmVkTG9hZGVyOwogCiAgICAgLypwYWNrYWdlLXByaXZhdGUqLyBAU3VwcHJlc3NXYXJuaW5ncygic3RhdGljLW1ldGhvZCIpCi0gICAgQ2xhc3NMb2FkZXIgZ2V0U3RydWN0TG9hZGVyKCkgewotICAgICAgICByZXR1cm4gdGhlU3RydWN0TG9hZGVyOworICAgIENsYXNzTG9hZGVyIGdldFNoYXJlZExvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHNoYXJlZExvYWRlcjsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NDb250cm9sQ29udGV4dCBjcmVhdGVOb1Blcm1BY2NDdHh0KCkgewpAQCAtNDIwLDcgKzQxNyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgQ1JFQVRFX0dMT0JBTF9BQ0NfQ1RYVCAgPSBjcmVhdGVQZXJtQWNjQ3R4dChOQVNIT1JOX0NSRUFURV9HTE9CQUwpOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgdGhlU3RydWN0TG9hZGVyID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248U3RydWN0dXJlTG9hZGVyPigpIHsKKyAgICAgICAgc2hhcmVkTG9hZGVyID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248U3RydWN0dXJlTG9hZGVyPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cnVjdHVyZUxvYWRlciBydW4oKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVMb2FkZXIobXlMb2FkZXIpOwpAQCAtNDk4LDYgKzQ5NSw3IEBACiAgICAgICAgIHRoaXMuY2xhc3NGaWx0ZXIgPSBjbGFzc0ZpbHRlcjsKICAgICAgICAgdGhpcy5lbnYgICAgICAgPSBuZXcgU2NyaXB0RW52aXJvbm1lbnQob3B0aW9ucywgb3V0LCBlcnIpOwogICAgICAgICB0aGlzLl9zdHJpY3QgICA9IGVudi5fc3RyaWN0OworICAgICAgICB0aGlzLmFwcExvYWRlciA9IGFwcExvYWRlcjsKICAgICAgICAgaWYgKGVudi5fbG9hZGVyX3Blcl9jb21waWxlKSB7CiAgICAgICAgICAgICB0aGlzLnNjcmlwdExvYWRlciA9IG51bGw7CiAgICAgICAgICAgICB0aGlzLnVuaXF1ZVNjcmlwdElkID0gbnVsbDsKQEAgLTUwNywxNyArNTA1LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhpcy5lcnJvcnMgICAgPSBlcnJvcnM7CiAKLSAgICAgICAgLy8gaWYgdXNlciBwYXNzZWQgLWNsYXNzcGF0aCBvcHRpb24sIG1ha2UgYSBVUkxDbGFzc0xvYWRlciB3aXRoIHRoYXQgYW5kCi0gICAgICAgIC8vIHRoZSBhcHAgbG9hZGVyIGFzIHRoZSBwYXJlbnQuCisgICAgICAgIC8vIGlmIHVzZXIgcGFzc2VkIC1jbGFzc3BhdGggb3B0aW9uLCBtYWtlIGEgY2xhc3MgbG9hZGVyIHdpdGggdGhhdCBhbmQgc2V0IGl0IGFzCisgICAgICAgIC8vIHRocmVhZCBjb250ZXh0IGNsYXNzIGxvYWRlciBzbyB0aGF0IHNjcmlwdCBjYW4gYWNjZXNzIGNsYXNzZXMgZnJvbSB0aGF0IHBhdGguCiAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc1BhdGggPSBvcHRpb25zLmdldFN0cmluZygiY2xhc3NwYXRoIik7CiAgICAgICAgIGlmICghZW52Ll9jb21waWxlX29ubHkgJiYgY2xhc3NQYXRoICE9IG51bGwgJiYgIWNsYXNzUGF0aC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGNhbGxlciBjYW4gY3JlYXRlIGEgY2xhc3MgbG9hZGVyLgogICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzbS5jaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKG5ldyBSdW50aW1lUGVybWlzc2lvbigiY3JlYXRlQ2xhc3NMb2FkZXIiKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmFwcExvYWRlciA9IE5hc2hvcm5Mb2FkZXIuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NQYXRoLCBhcHBMb2FkZXIpOworICAgICAgICAgICAgdGhpcy5jbGFzc1BhdGhMb2FkZXIgPSBOYXNob3JuTG9hZGVyLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzUGF0aCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aGlzLmFwcExvYWRlciA9IGFwcExvYWRlcjsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NQYXRoTG9hZGVyID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIGludCBjYWNoZVNpemUgPSBlbnYuX2NsYXNzX2NhY2hlX3NpemU7CkBAIC05MjksNyArOTI3LDcgQEAKICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsICYmICFTdHJ1Y3R1cmVMb2FkZXIuaXNTdHJ1Y3R1cmVDbGFzcyhmdWxsTmFtZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGZ1bGxOYW1lKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gKENsYXNzPD8gZXh0ZW5kcyBTY3JpcHRPYmplY3Q+KUNsYXNzLmZvck5hbWUoZnVsbE5hbWUsIHRydWUsIHRoZVN0cnVjdExvYWRlcik7CisgICAgICAgIHJldHVybiAoQ2xhc3M8PyBleHRlbmRzIFNjcmlwdE9iamVjdD4pQ2xhc3MuZm9yTmFtZShmdWxsTmFtZSwgdHJ1ZSwgc2hhcmVkTG9hZGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNDYsMTggKzEwNDQsMTcgQEAKICAgICAgICAgICAgIGNoZWNrUGFja2FnZUFjY2VzcyhzbSwgZnVsbE5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVHJ5IGZpbmRpbmcgdXNpbmcgdGhlICJhcHAiIGxvYWRlci4KLSAgICAgICAgaWYgKGFwcExvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShmdWxsTmFtZSwgdHJ1ZSwgYXBwTG9hZGVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsID0gQ2xhc3MuZm9yTmFtZShmdWxsTmFtZSk7Ci0gICAgICAgICAgICAvLyByZXR1cm4gdGhlIENsYXNzIG9ubHkgaWYgaXQgd2FzIGxvYWRlZCBieSBib290IGxvYWRlcgotICAgICAgICAgICAgaWYgKGNsLmdldENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oZnVsbE5hbWUpOworICAgICAgICAvLyB0cnkgdGhlIHNjcmlwdCAtY2xhc3NwYXRoIGxvYWRlciwgaWYgdGhhdCBpcyBzZXQKKyAgICAgICAgaWYgKGNsYXNzUGF0aExvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGZ1bGxOYW1lLCB0cnVlLCBjbGFzc1BhdGhMb2FkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBjb250aW51ZSBzZWFyY2gKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIFRyeSBmaW5kaW5nIHVzaW5nIHRoZSAiYXBwIiBsb2FkZXIuCisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGZ1bGxOYW1lLCB0cnVlLCBhcHBMb2FkZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA4OCw3ICsxMDg1LDcgQEAKICAgICAgICAgICAgIC8vIE5vIHZlcmlmaWNhdGlvbiB3aGVuIHNlY3VyaXR5IG1hbmFnZXIgaXMgYXJvdW5kIGFzIHZlcmlmaWVyCiAgICAgICAgICAgICAvLyBtYXkgbG9hZCBmdXJ0aGVyIGNsYXNzZXMgLSB3aGljaCBzaG91bGQgYmUgYXZvaWRlZC4KICAgICAgICAgICAgIGlmIChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIENoZWNrQ2xhc3NBZGFwdGVyLnZlcmlmeShuZXcgQ2xhc3NSZWFkZXIoYnl0ZWNvZGUpLCB0aGVTdHJ1Y3RMb2FkZXIsIGZhbHNlLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVyciwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIENoZWNrQ2xhc3NBZGFwdGVyLnZlcmlmeShuZXcgQ2xhc3NSZWFkZXIoYnl0ZWNvZGUpLCBzaGFyZWRMb2FkZXIsIGZhbHNlLCBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLmVyciwgdHJ1ZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTIwNCwxMCArMTIwMSwxNSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgVVJMIGdldFJlc291cmNlVVJMKGZpbmFsIFN0cmluZyByZXNOYW1lKSB7Ci0gICAgICAgIGlmIChhcHBMb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAvLyB0cnkgdGhlIGNsYXNzUGF0aExvYWRlciBpZiB3ZSBoYXZlIGFuZCB0aGVuCisgICAgICAgIC8vIHRyeSB0aGUgYXBwTG9hZGVyIGlmIG5vbi1udWxsLgorICAgICAgICBpZiAoY2xhc3NQYXRoTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc1BhdGhMb2FkZXIuZ2V0UmVzb3VyY2UocmVzTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXBwTG9hZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBhcHBMb2FkZXIuZ2V0UmVzb3VyY2UocmVzTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKHJlc05hbWUpOworCisgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIHByaXZhdGUgT2JqZWN0IGV2YWx1YXRlU291cmNlKGZpbmFsIFNvdXJjZSBzb3VyY2UsIGZpbmFsIFNjcmlwdE9iamVjdCBzY29wZSwgZmluYWwgU2NyaXB0T2JqZWN0IHRoaXopIHsKQEAgLTEzMzQsNyArMTMzNiw3IEBACiAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb248U2NyaXB0TG9hZGVyPigpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgU2NyaXB0TG9hZGVyIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRMb2FkZXIoQ29udGV4dC50aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JpcHRMb2FkZXIoYXBwTG9hZGVyLCBDb250ZXh0LnRoaXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBDUkVBVEVfTE9BREVSX0FDQ19DVFhUKTsKICAgICB9CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL0pTT05GdW5jdGlvbnMuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvSlNPTkZ1bmN0aW9ucy5qYXZhCmluZGV4IDNjNGQ1NzQuLmQyNjVlNmQgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvSlNPTkZ1bmN0aW9ucy5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvSlNPTkZ1bmN0aW9ucy5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWV0aG9kSGFuZGxlIGNhbGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vdHN0cmFwLmNyZWF0ZUR5bmFtaWNJbnZva2VyKCJkeW46Y2FsbCIsIE9iamVjdC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY3JpcHRGdW5jdGlvbi5jbGFzcywgU2NyaXB0T2JqZWN0LmNsYXNzLCBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKICAgICB9CkBAIC05MCwxNiArOTAsMTYgQEAKIAogICAgIC8vIGFwcGx5ICdyZXZpdmVyJyBmdW5jdGlvbiBpZiBhdmFpbGFibGUKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgYXBwbHlSZXZpdmVyKGZpbmFsIEdsb2JhbCBnbG9iYWwsIGZpbmFsIE9iamVjdCB1bmZpbHRlcmVkLCBmaW5hbCBPYmplY3QgcmV2aXZlcikgewotICAgICAgICBpZiAoQm9vdHN0cmFwLmlzQ2FsbGFibGUocmV2aXZlcikpIHsKKyAgICAgICAgaWYgKHJldml2ZXIgaW5zdGFuY2VvZiBTY3JpcHRGdW5jdGlvbikgewogICAgICAgICAgICAgZmluYWwgU2NyaXB0T2JqZWN0IHJvb3QgPSBnbG9iYWwubmV3T2JqZWN0KCk7CiAgICAgICAgICAgICByb290LmFkZE93blByb3BlcnR5KCIiLCBQcm9wZXJ0eS5XUklUQUJMRV9FTlVNRVJBQkxFX0NPTkZJR1VSQUJMRSwgdW5maWx0ZXJlZCk7Ci0gICAgICAgICAgICByZXR1cm4gd2Fsayhyb290LCAiIiwgcmV2aXZlcik7CisgICAgICAgICAgICByZXR1cm4gd2Fsayhyb290LCAiIiwgKFNjcmlwdEZ1bmN0aW9uKXJldml2ZXIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB1bmZpbHRlcmVkOwogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgdGhlIGFic3RyYWN0ICJXYWxrIiBvcGVyYXRpb24gZnJvbSB0aGUgc3BlYy4KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgd2FsayhmaW5hbCBTY3JpcHRPYmplY3QgaG9sZGVyLCBmaW5hbCBPYmplY3QgbmFtZSwgZmluYWwgT2JqZWN0IHJldml2ZXIpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgd2FsayhmaW5hbCBTY3JpcHRPYmplY3QgaG9sZGVyLCBmaW5hbCBPYmplY3QgbmFtZSwgZmluYWwgU2NyaXB0RnVuY3Rpb24gcmV2aXZlcikgewogICAgICAgICBmaW5hbCBPYmplY3QgdmFsID0gaG9sZGVyLmdldChuYW1lKTsKICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFNjcmlwdE9iamVjdCkgewogICAgICAgICAgICAgZmluYWwgU2NyaXB0T2JqZWN0ICAgICB2YWx1ZU9iaiA9IChTY3JpcHRPYmplY3QpdmFsOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAvLyBPYmplY3QuY2xhc3MsIFNjcmlwdEZ1bmN0aW9uLmNsYXNzLCBTY3JpcHRPYmplY3QuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgICAgICByZXR1cm4gZ2V0UkVWSVZFUl9JTlZPS0VSKCkuaW52b2tlRXhhY3QocmV2aXZlciwgKE9iamVjdClob2xkZXIsIEpTVHlwZS50b1N0cmluZyhuYW1lKSwgdmFsKTsKKyAgICAgICAgICAgICByZXR1cm4gZ2V0UkVWSVZFUl9JTlZPS0VSKCkuaW52b2tlRXhhY3QocmV2aXZlciwgaG9sZGVyLCBKU1R5cGUudG9TdHJpbmcobmFtZSksIHZhbCk7CiAgICAgICAgIH0gY2F0Y2goRXJyb3J8UnVudGltZUV4Y2VwdGlvbiB0KSB7CiAgICAgICAgICAgICB0aHJvdyB0OwogICAgICAgICB9IGNhdGNoKGZpbmFsIFRocm93YWJsZSB0KSB7CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL0pTVHlwZS5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9KU1R5cGUuamF2YQppbmRleCA4OWU1Y2I1Li45Y2E1OTljIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL0pTVHlwZS5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvSlNUeXBlLmphdmEKQEAgLTQ1Nyw4ICs0NTcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHRvUHJpbWl0aXZlKChTY3JpcHRPYmplY3Qpb2JqLCBoaW50KTsKICAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7CiAgICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB9IGVsc2UgaWYgKGhpbnQgPT0gTnVtYmVyLmNsYXNzICYmIG9iaiBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBvYmopLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSlNPYmplY3QpIHsKICAgICAgICAgICAgIHJldHVybiB0b1ByaW1pdGl2ZSgoSlNPYmplY3Qpb2JqLCBoaW50KTsKICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBTdGF0aWNDbGFzcykgewpkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9OYXNob3JuTG9hZGVyLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL05hc2hvcm5Mb2FkZXIuamF2YQppbmRleCAyMzdjY2FhLi40MjNiODdkIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL05hc2hvcm5Mb2FkZXIuamF2YQorKysgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL05hc2hvcm5Mb2FkZXIuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZUNsYXNzTG9hZGVyOworaW1wb3J0IGpkay5uYXNob3JuLnRvb2xzLlNoZWxsOwogCiAvKioKICAqIFN1cGVyY2xhc3MgZm9yIE5hc2hvcm4gY2xhc3MgbG9hZGVyIGNsYXNzZXMuCkBAIC0xMDIsMTAgKzEwMywxMCBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHNlY3VyZSBVUkwgY2xhc3MgbG9hZGVyIGZvciB0aGUgZ2l2ZW4gY2xhc3NwYXRoCiAgICAgICogQHBhcmFtIGNsYXNzUGF0aCBjbGFzc3BhdGggZm9yIHRoZSBsb2FkZXIgdG8gc2VhcmNoIGZyb20KLSAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY2xhc3MgbG9hZGVyIGZvciB0aGUgbmV3IGNsYXNzIGxvYWRlcgogICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGxvYWRlcgogICAgICAqLwotICAgIHN0YXRpYyBDbGFzc0xvYWRlciBjcmVhdGVDbGFzc0xvYWRlcihmaW5hbCBTdHJpbmcgY2xhc3NQYXRoLCBmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICBzdGF0aWMgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoZmluYWwgU3RyaW5nIGNsYXNzUGF0aCkgeworICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnQgPSBTaGVsbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwogICAgICAgICBmaW5hbCBVUkxbXSB1cmxzID0gcGF0aFRvVVJMcyhjbGFzc1BhdGgpOwogICAgICAgICByZXR1cm4gVVJMQ2xhc3NMb2FkZXIubmV3SW5zdGFuY2UodXJscywgcGFyZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL1NjcmlwdExvYWRlci5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9TY3JpcHRMb2FkZXIuamF2YQppbmRleCAyZjc0MDFmLi4zYjY2Yzk5IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL1NjcmlwdExvYWRlci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvU2NyaXB0TG9hZGVyLmphdmEKQEAgLTQ0LDQ1ICs0NCwyMCBAQAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yLgogICAgICAqLwotICAgIFNjcmlwdExvYWRlcihmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dC5nZXRTdHJ1Y3RMb2FkZXIoKSk7CisgICAgU2NyaXB0TG9hZGVyKGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudCwgZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKHBhcmVudCk7CiAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGxvYWRDbGFzcyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYm9vbGVhbiByZXNvbHZlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrUGFja2FnZUFjY2VzcyhuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChOQVNIT1JOX1BLR19QUkVGSVgpKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTaGFyZWRMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKICAgICB9CiAKLQotICAgICBAT3ZlcnJpZGUKLSAgICAgcHJvdGVjdGVkIENsYXNzPD8+IGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgYXBwTG9hZGVyID0gY29udGV4dC5nZXRBcHBMb2FkZXIoKTsKLQotICAgICAgICAgLyoKLSAgICAgICAgICAqIElmIHRoZSBhcHBMb2FkZXIgaXMgbnVsbCwgZG9uJ3QgYm90aGVyIHNpZGUtZGVsZWdhdGluZyB0byBpdCEKLSAgICAgICAgICAqIEJvb3Rsb2FkZXIgaGFzIGJlZW4gYWxyZWFkeSBhdHRlbXB0ZWQgdmlhIHBhcmVudCBsb2FkZXIKLSAgICAgICAgICAqIGRlbGVnYXRpb24gZnJvbSB0aGUgImxvYWRDbGFzcyIgbWV0aG9kLgotICAgICAgICAgICoKLSAgICAgICAgICAqIEFsc28sIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGRlbGVnYXRlIHRvIHRoZSBhcHAgbG9hZGVyCi0gICAgICAgICAgKiBmb3IgbmFzaG9ybidzIG93biBjbGFzc2VzIG9yIG5hc2hvcm4gZ2VuZXJhdGVkIGNsYXNzZXMhCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmIChhcHBMb2FkZXIgPT0gbnVsbCB8fCBuYW1lLnN0YXJ0c1dpdGgoTkFTSE9STl9QS0dfUFJFRklYKSkgewotICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKG5hbWUpOwotICAgICAgICAgfQotCi0gICAgICAgICAvKgotICAgICAgICAgICogVGhpcyBzcGxpdC1kZWxlZ2F0aW9uIGlzIHVzZWQgc28gdGhhdCBjYWxsZXIgbG9hZGVyCi0gICAgICAgICAgKiBiYXNlZCByZXNvbHV0aW9ucyBvZiBjbGFzc2VzIHdvdWxkIHdvcmsuIEZvciBleGFtcGxlLAotICAgICAgICAgICogamF2YS5zcWwuRHJpdmVyTWFuYWdlciB1c2VzIGNhbGxlcidzIGNsYXNzIGxvYWRlciB0bwotICAgICAgICAgICogZ2V0IERyaXZlciBpbnN0YW5jZXMuIFdpdGhvdXQgdGhpcyBzcGxpdC1kZWxlZ2F0aW9uCi0gICAgICAgICAgKiBhIHNjcmlwdCBjbGFzcyBldmFsdWF0aW5nIERyaXZlck1hbmFnZXIuZ2V0RHJpdmVycygpCi0gICAgICAgICAgKiB3aWxsIG5vdCBnZXQgYmFjayBhbnkgSkRCQyBkcml2ZXIhCi0gICAgICAgICAgKi8KLSAgICAgICAgIHJldHVybiBhcHBMb2FkZXIubG9hZENsYXNzKG5hbWUpOwotICAgICB9Ci0KICAgICAvLyBwYWNrYWdlLXByaXZhdGUgYW5kIHByaXZhdGUgc3R1ZmYgYmVsb3cgdGhpcyBwb2ludAogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL1NjcmlwdGluZ0Z1bmN0aW9ucy5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9TY3JpcHRpbmdGdW5jdGlvbnMuamF2YQppbmRleCA1Zjg0OWVhLi5kMDZjMDZmIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL1NjcmlwdGluZ0Z1bmN0aW9ucy5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvU2NyaXB0aW5nRnVuY3Rpb25zLmphdmEKQEAgLTEzMiw5ICsxMzIsOSBAQAogICAgICAqIE5hc2hvcm4gZXh0ZW5zaW9uOiBleGVjIGEgc3RyaW5nIGluIGEgc2VwYXJhdGUgcHJvY2Vzcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxmICAgc2VsZiByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gYXJncyAgIHN0cmluZyB0byBleGVjdXRlLCBpbnB1dCBhbmQgYWRkaXRpb25hbCBhcmd1bWVudHMsIHRvIGJlIGFwcGVuZGVkIHRvIHtAY29kZSBzdHJpbmd9LiBBZGRpdGlvbmFsCi0gICAgICogICAgICAgICAgICAgICBhcmd1bWVudHMgY2FuIGJlIHBhc3NlZCBhcyBlaXRoZXIgb25lIEphdmFTY3JpcHQgYXJyYXksIHdob3NlIGVsZW1lbnRzIHdpbGwgYmUgY29udmVydGVkIHRvCi0gICAgICogICAgICAgICAgICAgICBzdHJpbmdzOyBvciBhcyBhIHNlcXVlbmNlIG9mIHZhcmFyZ3MsIGVhY2ggb2Ygd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcuCisgICAgICogQHBhcmFtIGFyZ3MgICBzdHJpbmcgdG8gZXhlY3V0ZSwgaW5wdXQgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLCB0byBiZSBhcHBlbmRlZCB0byB7QGNvZGUgc3RyaW5nfS4gQWRkaXRpb25hbCBhcmd1bWVudHMgY2FuIGJlIHBhc3NlZCBhcworICAgICAqICAgICAgICAgICAgICAgZWl0aGVyIG9uZSBKYXZhU2NyaXB0IGFycmF5LCB3aG9zZSBlbGVtZW50cyB3aWxsIGJlIGNvbnZlcnRlZCB0byBzdHJpbmdzOyBvciBhcyBhIHNlcXVlbmNlIG9mCisgICAgICogICAgICAgICAgICAgICB2YXJhcmdzLCBlYWNoIG9mIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3RyaW5nLgogICAgICAqCiAgICAgICogQHJldHVybiBvdXRwdXQgc3RyaW5nIGZyb20gdGhlIHJlcXVlc3QKICAgICAgKgpAQCAtMTY3LDEwICsxNjcsNyBAQAogICAgICAgICAgICAgLy8gSWYgYSB3b3JraW5nIGRpcmVjdG9yeSBpcyBwcmVzZW50LCB1c2UgaXQuCiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHdkID0gZW52UHJvcGVydGllcy5nZXQoUFdEX05BTUUpOwogICAgICAgICAgICAgaWYgKHB3ZCAhPSBVTkRFRklORUQpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHB3ZEZpbGUgPSBuZXcgRmlsZShKU1R5cGUudG9TdHJpbmcocHdkKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHB3ZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0J1aWxkZXIuZGlyZWN0b3J5KHB3ZEZpbGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcm9jZXNzQnVpbGRlci5kaXJlY3RvcnkobmV3IEZpbGUoSlNUeXBlLnRvU3RyaW5nKHB3ZCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gU2V0IHVwIEVOViB2YXJpYWJsZXMuCkBAIC0yMjIsMTMgKzIxOSwxMyBAQAogICAgICAgICBlcnJUaHJlYWQuc3RhcnQoKTsKIAogICAgICAgICAvLyBJZiBpbnB1dCBpcyBwcmVzZW50LCBwYXNzIG9uIHRvIHByb2Nlc3MuCi0gICAgICAgIGlmICghSlNUeXBlLm51bGxPclVuZGVmaW5lZChpbnB1dCkpIHsKLSAgICAgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocHJvY2Vzcy5nZXRPdXRwdXRTdHJlYW0oKSkpIHsKKyAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihwcm9jZXNzLmdldE91dHB1dFN0cmVhbSgpKSkgeworICAgICAgICAgICAgaWYgKGlucHV0ICE9IFVOREVGSU5FRCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbiA9IEpTVHlwZS50b1N0cmluZyhpbnB1dCk7CiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGluLCAwLCBpbi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFByb2Nlc3Mgd2FzIG5vdCBleHBlY3RpbmcgaW5wdXQuICBNYXkgYmUgbm9ybWFsIHN0YXRlIG9mIGFmZmFpcnMuCiAgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBQcm9jZXNzIHdhcyBub3QgZXhwZWN0aW5nIGlucHV0LiAgTWF5IGJlIG5vcm1hbCBzdGF0ZSBvZiBhZmZhaXJzLgogICAgICAgICB9CiAKICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUuCkBAIC0yNzgsOCArMjc1LDkgQEAKICAgICAgKiBAcGFyYW0gc3RyIGEge0BsaW5rIFN0cmluZ30gdG8gdG9rZW5pemUuCiAgICAgICogQHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgU3RyaW5nfXMgcmVwcmVzZW50aW5nIHRoZSB0b2tlbnMgdGhhdAogICAgICAqIGNvbnN0aXR1dGUgdGhlIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGluIGNhc2Uge0BsaW5rIFN0cmVhbVRva2VuaXplciNuZXh0VG9rZW4oKX0gcmFpc2VzIGl0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHRva2VuaXplU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB0b2tlbml6ZVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJlYW1Ub2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmVhbVRva2VuaXplcihuZXcgU3RyaW5nUmVhZGVyKHN0cikpOwogICAgICAgICB0b2tlbml6ZXIucmVzZXRTeW50YXgoKTsKICAgICAgICAgdG9rZW5pemVyLndvcmRDaGFycygwLCAyNTUpOwpAQCAtMjg5LDcgKzI4Nyw3IEBACiAgICAgICAgIHRva2VuaXplci5xdW90ZUNoYXIoJ1wnJyk7CiAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB0b2tlbkxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0b0FwcGVuZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHdoaWxlIChuZXh0VG9rZW4odG9rZW5pemVyKSAhPSBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GKSB7CisgICAgICAgIHdoaWxlICh0b2tlbml6ZXIubmV4dFRva2VuKCkgIT0gU3RyZWFtVG9rZW5pemVyLlRUX0VPRikgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0b2tlbml6ZXIuc3ZhbDsKICAgICAgICAgICAgIC8vIFRoZSB0b2tlbml6ZXIgdW5kZXJzdGFuZHMgYWJvdXQgaG9ub3JpbmcgcXVvdGVkIHN0cmluZ3MgYW5kIHJlY29nbml6ZXMKICAgICAgICAgICAgIC8vIHRoZW0gYXMgb25lIHRva2VuIHRoYXQgcG9zc2libHkgY29udGFpbnMgbXVsdGlwbGUgc3BhY2Utc2VwYXJhdGVkIHdvcmRzLgpAQCAtMzA4LDEyICszMDYsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0b2tlbkxpc3Q7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5leHRUb2tlbihmaW5hbCBTdHJlYW1Ub2tlbml6ZXIgdG9rZW5pemVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5pemVyLm5leHRUb2tlbigpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJlYW1Ub2tlbml6ZXIuVFRfRU9GOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9saW5rZXIvQm9vdHN0cmFwLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9Cb290c3RyYXAuamF2YQppbmRleCBkMjQ0N2JlLi5jYTNmYzc2IDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9Cb290c3RyYXAuamF2YQorKysgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9Cb290c3RyYXAuamF2YQpAQCAtMTU5LDkgKzE1OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gKChKU09iamVjdCljYWxsYWJsZSkuaXNTdHJpY3RGdW5jdGlvbigpOwogICAgICAgICB9IGVsc2UgaWYgKGNhbGxhYmxlIGluc3RhbmNlb2YgQm91bmRDYWxsYWJsZSkgewogICAgICAgICAgICAgcmV0dXJuIGlzU3RyaWN0Q2FsbGFibGUoKChCb3VuZENhbGxhYmxlKWNhbGxhYmxlKS5nZXRDYWxsYWJsZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChCZWFuc0xpbmtlci5pc0R5bmFtaWNNZXRob2QoY2FsbGFibGUpIHx8Ci0gICAgICAgICAgICAgICAgY2FsbGFibGUgaW5zdGFuY2VvZiBTdGF0aWNDbGFzcyB8fAotICAgICAgICAgICAgICAgIGlzRnVuY3Rpb25hbEludGVyZmFjZU9iamVjdChjYWxsYWJsZSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChCZWFuc0xpbmtlci5pc0R5bmFtaWNNZXRob2QoY2FsbGFibGUpIHx8IGNhbGxhYmxlIGluc3RhbmNlb2YgU3RhdGljQ2xhc3MpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBub3RGdW5jdGlvbihjYWxsYWJsZSk7CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9KU09iamVjdExpbmtlci5qYXZhIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9saW5rZXIvSlNPYmplY3RMaW5rZXIuamF2YQppbmRleCBlOGU0OTNiLi44ZmQyOGNjIDEwMDY0NAotLS0gYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9KU09iamVjdExpbmtlci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvbGlua2VyL0pTT2JqZWN0TGlua2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOSw3ICsyOSw2IEBACiAKIGltcG9ydCBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZTsKIGltcG9ydCBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZXM7Ci1pbXBvcnQgamF2YS5sYW5nLmludm9rZS5NZXRob2RUeXBlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YXguc2NyaXB0LkJpbmRpbmdzOwogaW1wb3J0IGpkay5pbnRlcm5hbC5keW5hbGluay5DYWxsU2l0ZURlc2NyaXB0b3I7CkBAIC0xNDEsMTUgKzE0MCwxMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEd1YXJkZWRJbnZvY2F0aW9uIGZpbmRDYWxsTWV0aG9kKGZpbmFsIENhbGxTaXRlRGVzY3JpcHRvciBkZXNjKSB7CisgICAgICAgIC8vIFRPRE86IGlmIGNhbGwgc2l0ZSBpcyBhbHJlYWR5IGEgdmFyYXJnLCBkb24ndCBkbyBhc0NvbGxlY3RvcgogICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBKU09CSkVDVF9DQUxMOwogICAgICAgICBpZiAoTmFzaG9ybkNhbGxTaXRlRGVzY3JpcHRvci5pc0FwcGx5VG9DYWxsKGRlc2MpKSB7CiAgICAgICAgICAgICBtaCA9IE1ILmluc2VydEFyZ3VtZW50cyhKU09CSkVDVF9DQUxMX1RPX0FQUExZLCAwLCBKU09CSkVDVF9DQUxMKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBNZXRob2RUeXBlIHR5cGUgPSBkZXNjLmdldE1ldGhvZFR5cGUoKTsKLSAgICAgICAgbWggPSB0eXBlLnBhcmFtZXRlclR5cGUodHlwZS5wYXJhbWV0ZXJDb3VudCgpIC0gMSkgPT0gT2JqZWN0W10uY2xhc3MgPwotICAgICAgICAgICAgICAgIG1oIDoKLSAgICAgICAgICAgICAgICBNSC5hc0NvbGxlY3RvcihtaCwgT2JqZWN0W10uY2xhc3MsIHR5cGUucGFyYW1ldGVyQ291bnQoKSAtIDIpOwotICAgICAgICByZXR1cm4gbmV3IEd1YXJkZWRJbnZvY2F0aW9uKG1oLCBJU19KU09CSkVDVF9HVUFSRCk7CisgICAgICAgIHJldHVybiBuZXcgR3VhcmRlZEludm9jYXRpb24oTUguYXNDb2xsZWN0b3IobWgsIE9iamVjdFtdLmNsYXNzLCBkZXNjLmdldE1ldGhvZFR5cGUoKS5wYXJhbWV0ZXJDb3VudCgpIC0gMiksIElTX0pTT0JKRUNUX0dVQVJEKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBHdWFyZGVkSW52b2NhdGlvbiBmaW5kTmV3TWV0aG9kKGZpbmFsIENhbGxTaXRlRGVzY3JpcHRvciBkZXNjKSB7CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL2xpbmtlci9OYXNob3JuQmVhbnNMaW5rZXIuamF2YSBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvbGlua2VyL05hc2hvcm5CZWFuc0xpbmtlci5qYXZhCmluZGV4IGQ2ZDRmNjEuLjZiN2JjZTMgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvbGlua2VyL05hc2hvcm5CZWFuc0xpbmtlci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvbGlua2VyL05hc2hvcm5CZWFuc0xpbmtlci5qYXZhCkBAIC0xNzcsNyArMTc3LDcgQEAKICAgICAgICAgICAgIGlmIChpZmFjZS5pc0Fubm90YXRpb25QcmVzZW50KEZ1bmN0aW9uYWxJbnRlcmZhY2UuY2xhc3MpKSB7CiAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCBhYnN0cmFjdCBtZXRob2QKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE1ldGhvZCBtIDogaWZhY2UuZ2V0TWV0aG9kcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KG0uZ2V0TW9kaWZpZXJzKCkpICYmICFpc092ZXJyaWRhYmxlT2JqZWN0TWV0aG9kKG0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KG0uZ2V0TW9kaWZpZXJzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xODgsMjMgKzE4OCw2IEBACiAgICAgICAgIHJldHVybiBmaW5kRnVuY3Rpb25hbEludGVyZmFjZU1ldGhvZE5hbWUoY2xhenouZ2V0U3VwZXJjbGFzcygpKTsKICAgICB9CiAKLSAgICAvLyBpcyB0aGlzIGFuIG92ZXJyaWRhYmxlIGphdmEubGFuZy5PYmplY3QgbWV0aG9kPwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZU9iamVjdE1ldGhvZChmaW5hbCBNZXRob2QgbSkgewotICAgICAgICBzd2l0Y2ggKG0uZ2V0TmFtZSgpKSB7Ci0gICAgICAgICAgICBjYXNlICJlcXVhbHMiOgotICAgICAgICAgICAgICAgIGlmIChtLmdldFJldHVyblR5cGUoKSA9PSBib29sZWFuLmNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+W10gcGFyYW1zID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLmxlbmd0aCA9PSAxICYmIHBhcmFtc1swXSA9PSBPYmplY3QuY2xhc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGNhc2UgImhhc2hDb2RlIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbS5nZXRSZXR1cm5UeXBlKCkgPT0gaW50LmNsYXNzICYmIG0uZ2V0UGFyYW1ldGVyQ291bnQoKSA9PSAwOwotICAgICAgICAgICAgY2FzZSAidG9TdHJpbmciOgotICAgICAgICAgICAgICAgIHJldHVybiBtLmdldFJldHVyblR5cGUoKSA9PSBTdHJpbmcuY2xhc3MgJiYgbS5nZXRQYXJhbWV0ZXJDb3VudCgpID09IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIC8vIFJldHVybnMgQEZ1bmN0aW9uYWxJbnRlcmZhY2UgYW5ub3RhdGVkIGludGVyZmFjZSdzIHNpbmdsZSBhYnN0cmFjdAogICAgIC8vIG1ldGhvZCBuYW1lLiBJZiBub3QgZm91bmQsIHJldHVybnMgbnVsbC4KICAgICBzdGF0aWMgU3RyaW5nIGdldEZ1bmN0aW9uYWxJbnRlcmZhY2VNZXRob2ROYW1lKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CmRpZmYgLS1naXQgYS9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL3JlZ2V4cC9SZWdFeHBTY2FubmVyLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi9pbnRlcm5hbC9ydW50aW1lL3JlZ2V4cC9SZWdFeHBTY2FubmVyLmphdmEKaW5kZXggZDE5NGUyZC4uODhiMDIzYSAxMDA2NDQKLS0tIGEvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vaW50ZXJuYWwvcnVudGltZS9yZWdleHAvUmVnRXhwU2Nhbm5lci5qYXZhCisrKyBiL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL2ludGVybmFsL3J1bnRpbWUvcmVnZXhwL1JlZ0V4cFNjYW5uZXIuamF2YQpAQCAtODAsMTcgKzgwLDggQEAKICAgICAgICAgICAgIHRoaXMubmVnTG9va2FoZWFkTGV2ZWwgPSBuZWdMb29rYWhlYWRMZXZlbDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBDYXB0dXJlIGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieSB0aGUKLSAgICAgICAgICogZ3JvdXAgYW5kIGxldmVsIHBhcmFtZXRlcnMuIFRoaXMgaXMgdGhlIGNhc2UgaWYgZWl0aGVyIHRoZSBncm91cCBpcyBub3Qgd2l0aGluCi0gICAgICAgICAqIGEgbmVnYXRpdmUgbG9va2FoZWFkLCBvciB0aGUgcG9zaXRpb24gb2YgdGhlIHJlZmVycmVyIGlzIGluIHRoZSBzYW1lIG5lZ2F0aXZlIGxvb2thaGVhZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGdyb3VwIGN1cnJlbnQgbmVnYXRpdmUgbG9va2FoZWFkIGdyb3VwCi0gICAgICAgICAqIEBwYXJhbSBsZXZlbCBjdXJyZW50IG5lZ2F0aXZlIGxva2FoZWFkIGxldmVsCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNhcHR1cmUgZ3JvdXAgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGUgZ2l2ZW4gcG9zaXRpb24KLSAgICAgICAgICovCi0gICAgICAgIGJvb2xlYW4gY2FuQmVSZWZlcmVuY2VkRnJvbShmaW5hbCBpbnQgZ3JvdXAsIGZpbmFsIGludCBsZXZlbCkgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMubmVnTG9va2FoZWFkTGV2ZWwgPT0gMCB8fCAoZ3JvdXAgPT0gdGhpcy5uZWdMb29rYWhlYWRHcm91cCAmJiBsZXZlbCA+PSB0aGlzLm5lZ0xvb2thaGVhZExldmVsKTsKKyAgICAgICAgYm9vbGVhbiBpc0NvbnRhaW5lZChmaW5hbCBpbnQgZ3JvdXAsIGZpbmFsIGludCBsZXZlbCkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwID09IHRoaXMubmVnTG9va2FoZWFkR3JvdXAgJiYgbGV2ZWwgPj0gdGhpcy5uZWdMb29rYWhlYWRMZXZlbDsKICAgICAgICAgfQogCiAgICAgfQpAQCAtNjgwLDkgKzY3MSw4IEBACiAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlY2ltYWxWYWx1ZSA8PSBjYXBzLnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyAgQ2FwdHVyZXMgaW5zaWRlIGEgbmVnYXRpdmUgbG9va2FoZWFkIGFyZSB1bmRlZmluZWQgd2hlbiByZWZlcmVuY2VkIGZyb20gdGhlIG91dHNpZGUuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENhcHR1cmUgY2FwdHVyZSA9IGNhcHMuZ2V0KGRlY2ltYWxWYWx1ZSAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmUuY2FuQmVSZWZlcmVuY2VkRnJvbShuZWdMb29rYWhlYWRHcm91cCwgbmVnTG9va2FoZWFkTGV2ZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXRzaWRlIHJlZmVyZW5jZSB0byBjYXB0dXJlIGluIG5lZ2F0aXZlIGxvb2thaGVhZCwgb21pdCBmcm9tIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIGlmICghY2Fwcy5nZXQoZGVjaW1hbFZhbHVlIC0gMSkuaXNDb250YWluZWQobmVnTG9va2FoZWFkR3JvdXAsIG5lZ0xvb2thaGVhZExldmVsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIHRvIGNhcHR1cmUgaW4gbmVnYXRpdmUgbG9va2FoZWFkLCBvbWl0IGZyb20gb3V0cHV0IGJ1ZmZlci4KICAgICAgICAgICAgICAgICAgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kIGJhY2tyZWZlcmVuY2UgdG8gb3V0cHV0IGJ1ZmZlci4KZGlmZiAtLWdpdCBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL3Rvb2xzL1NoZWxsLmphdmEgYi9uYXNob3JuL3NyYy9qZGsvbmFzaG9ybi90b29scy9TaGVsbC5qYXZhCmluZGV4IDJkY2YxOTAuLjllZTAyYWYgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vc3JjL2pkay9uYXNob3JuL3Rvb2xzL1NoZWxsLmphdmEKKysrIGIvbmFzaG9ybi9zcmMvamRrL25hc2hvcm4vdG9vbHMvU2hlbGwuamF2YQpAQCAtMjUsNiArMjUsMjAgQEAKIAogcGFja2FnZSBqZGsubmFzaG9ybi50b29sczsKIAoraW1wb3J0IHN0YXRpYyBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlNvdXJjZS5zb3VyY2VGb3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogaW1wb3J0IGpkay5uYXNob3JuLmFwaS5zY3JpcHRpbmcuTmFzaG9ybkV4Y2VwdGlvbjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5jb2RlZ2VuLkNvbXBpbGVyOwogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLmNvZGVnZW4uQ29tcGlsZXIuQ29tcGlsYXRpb25QaGFzZXM7CkBAIC00MCwzMCArNTQsOCBAQAogaW1wb3J0IGpkay5uYXNob3JuLmludGVybmFsLnJ1bnRpbWUuU2NyaXB0RW52aXJvbm1lbnQ7CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRGdW5jdGlvbjsKIGltcG9ydCBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlNjcmlwdFJ1bnRpbWU7Ci1pbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRpbmdGdW5jdGlvbnM7CiBpbXBvcnQgamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5vcHRpb25zLk9wdGlvbnM7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IHN0YXRpYyBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLlNvdXJjZS5zb3VyY2VGb3I7Ci0KIC8qKgogICogQ29tbWFuZCBsaW5lIFNoZWxsIGZvciBwcm9jZXNzaW5nIEphdmFTY3JpcHQgZmlsZXMuCiAgKi8KQEAgLTIwMyw4ICsxOTUsNyBAQAogICAgICAgICAvLyBwYXJzZSBvcHRpb25zCiAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcHJlcEFyZ3MgPSBwcmVwcm9jZXNzQXJncyhhcmdzKTsKLSAgICAgICAgICAgICAgICBvcHRpb25zLnByb2Nlc3MocHJlcEFyZ3MpOworICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvY2VzcyhhcmdzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgd2Vyci5wcmludGxuKGJ1bmRsZS5nZXRTdHJpbmcoInNoZWxsLnVzYWdlIikpOwogICAgICAgICAgICAgICAgIG9wdGlvbnMuZGlzcGxheUhlbHAoZSk7CkBAIC0yMzUsNzUgKzIyNiw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJlcHJvY2VzcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBwYXNzZWQgaW4gYnkgdGhlIHNoZWxsLiBUaGlzIG1ldGhvZCBjaGVja3MsIGZvciB0aGUgZmlyc3Qgbm9uLW9wdGlvbgotICAgICAqIGFyZ3VtZW50LCB3aGV0aGVyIHRoZSBmaWxlIGRlbm90ZWQgYnkgaXQgYmVnaW5zIHdpdGggYSBzaGViYW5nIGxpbmUuIElmIHNvLCBpdCBpcyBhc3N1bWVkIHRoYXQgZXhlY3V0aW9uIGluCi0gICAgICogc2hlYmFuZyBtb2RlIGlzIGludGVuZGVkLiBUaGUgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBpZGVudGlmaWVkIHNjcmlwdCBmaWxlIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUKLSAgICAgKiA8ZW0+b25seTwvZW0+IHNjcmlwdCBmaWxlLCBhbmQgYWxsIHN1YnNlcXVlbnQgYXJndW1lbnRzIHdpbGwgYmUgcmVnYXJkZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBzY3JpcHQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgY2Fub25pY2FsaXplcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byB0aGUgZm9ybSB7QGNvZGUgPG9wdGlvbnM+IDxzY3JpcHQ+IC0tIDxhcmd1bWVudHM+fSBpZiBhCi0gICAgICogc2hlYmFuZyBzY3JpcHQgaXMgaWRlbnRpZmllZC4gT24gcGxhdGZvcm1zIHRoYXQgcGFzcyBzaGViYW5nIGFyZ3VtZW50cyBhcyBzaW5nbGUgc3RyaW5ncywgdGhlIHNoZWJhbmcgYXJndW1lbnRzCi0gICAgICogd2lsbCBiZSBicm9rZW4gZG93biBpbnRvIHNpbmdsZSBhcmd1bWVudHM7IHdoaXRlc3BhY2UgaXMgdXNlZCBhcyBzZXBhcmF0b3IuCi0gICAgICogPHA+Ci0gICAgICogU2hlYmFuZyBtb2RlIGlzIGVudGVyZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzY3JpcHQgaXMgYWN0dWFsbHkgcnVuIGRpcmVjdGx5IGZyb20gdGhlIHNoZWxsLCBvciBpbmRpcmVjdGx5Ci0gICAgICogdmlhIHRoZSB7QGNvZGUgampzfSBleGVjdXRhYmxlLiBJdCBpcyB0aGUgdXNlcidzIC8gc2NyaXB0IGF1dGhvcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudHMKLSAgICAgKiBnaXZlbiBvbiB0aGUgc2hlYmFuZyBsaW5lIGRvIG5vdCBsZWFkIHRvIGEgbWFsZm9ybWVkIGFyZ3VtZW50IHNlcXVlbmNlLiBJbiBwYXJ0aWN1bGFyLCB0aGUgc2hlYmFuZyBhcmd1bWVudHMKLSAgICAgKiBzaG91bGQgbm90IGNvbnRhaW4gYW55IHdoaXRlc3BhY2UgZm9yIHB1cnBvc2VzIG90aGVyIHRoYW4gc2VwYXJhdGluZyBhcmd1bWVudHMsIGFzIHRoZSBkaWZmZXJlbnQgcGxhdGZvcm1zIGRlYWwKLSAgICAgKiB3aXRoIHdoaXRlc3BhY2UgaW4gZGlmZmVyZW50IGFuZCBpbmNvbXBhdGlibGUgd2F5cy4KLSAgICAgKiA8cD4KLSAgICAgKiBAaW1wbE5vdGUgRXhhbXBsZTo8dWw+Ci0gICAgICogPGxpPlNoZWJhbmcgbGluZSBpbiB7QGNvZGUgc2NyaXB0LmpzfToge0Bjb2RlICMhL3BhdGgvdG8vampzIC0tbGFuZ3VhZ2U9ZXM2fTwvbGk+Ci0gICAgICogPGxpPkNvbW1hbmQgbGluZToge0Bjb2RlIC4vc2NyaXB0LmpzIGFyZzJ9PC9saT4KLSAgICAgKiA8bGk+e0Bjb2RlIGFyZ3N9IGFycmF5IHBhc3NlZCB0byBOYXNob3JuOiB7QGNvZGUgLS1sYW5ndWFnZT1lczYsLi9zY3JpcHQuanMsYXJnfTwvbGk+Ci0gICAgICogPGxpPlJlcXVpcmVkIGNhbm9uaWNhbGl6ZWQgYXJndW1lbnRzIGFycmF5OiB7QGNvZGUgLS1sYW5ndWFnZT1lczYsLi9zY3JpcHQuanMsLS0sYXJnMn08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcyBwYXNzZWQgaW50byBOYXNob3JuLgotICAgICAqIEByZXR1cm4gdGhlIHBhc3NlZCBhbmQgcG9zc2libHkgY2Fub25pY2FsaXplZCBhcmd1bWVudCBsaXN0Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcHJlcHJvY2Vzc0FyZ3MoZmluYWwgU3RyaW5nW10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGFyZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcHJvY2Vzc2VkQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcm9jZXNzZWRBcmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KGFyZ3MpKTsKLQotICAgICAgICAvLyBOYXNob3JuIHN1cHBvcnRzIHBhc3NpbmcgbXVsdGlwbGUgc2hlYmFuZyBhcmd1bWVudHMuIE9uIHBsYXRmb3JtcyB0aGF0IHBhc3MgYW55dGhpbmcgZm9sbG93aW5nIHRoZQotICAgICAgICAvLyBzaGViYW5nIGludGVycHJldGVyIG5vdGljZSBhcyBvbmUgYXJndW1lbnQsIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcmd1bWVudCBhcnJheSBuZWVkcyB0byBiZSBzcGVjaWFsLWNhc2VkCi0gICAgICAgIC8vIGFzIGl0IG1pZ2h0IGFjdHVhbGx5IGNvbnRhaW4gc2V2ZXJhbCBhcmd1bWVudHMuIE1hYyBPUyBYIHNwbGl0cyBzaGViYW5nIGFyZ3VtZW50cywgb3RoZXIgcGxhdGZvcm1zIGRvbid0LgotICAgICAgICAvLyBUaGlzIHNwZWNpYWwgaGFuZGxpbmcgaXMgYWxzbyBvbmx5IG5lY2Vzc2FyeSBpZiB0aGUgZmlyc3QgYXJndW1lbnQgYWN0dWFsbHkgc3RhcnRzIHdpdGggYW4gb3B0aW9uLgotICAgICAgICBpZiAoYXJnc1swXS5zdGFydHNXaXRoKCItIikgJiYgIVN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIsICJnZW5lcmljIikuc3RhcnRzV2l0aCgiTWFjIE9TIFgiKSkgewotICAgICAgICAgICAgcHJvY2Vzc2VkQXJncy5hZGRBbGwoMCwgU2NyaXB0aW5nRnVuY3Rpb25zLnRva2VuaXplU3RyaW5nKHByb2Nlc3NlZEFyZ3MucmVtb3ZlKDApKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgc2hlYmFuZ0ZpbGVQb3MgPSAtMTsgLy8gLTEgc2lnbmlmaWVzICJub25lIGZvdW5kIgotICAgICAgICAvLyBpZGVudGlmeSBhIHNoZWJhbmcgZmlsZSBhbmQgaXRzIHBvc2l0aW9uIGluIHRoZSBhcmd1bWVudHMgYXJyYXkgKGlmIGFueSkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzZWRBcmdzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYSA9IHByb2Nlc3NlZEFyZ3MuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKCFhLnN0YXJ0c1dpdGgoIi0iKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggcCA9IFBhdGhzLmdldChhKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbCA9ICIiOwotICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgQnVmZmVyZWRSZWFkZXIgciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHApKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwgPSByLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobC5zdGFydHNXaXRoKCIjISIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWJhbmdGaWxlUG9zID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgb25seSBjaGVja2luZyB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudC4gSWYgaXQncyBub3QgYSBzaGViYW5nIGZpbGUsIHdlJ3JlIGluIG5vcm1hbAotICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGlvbiBtb2RlLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzaGViYW5nRmlsZVBvcyAhPSAtMSkgewotICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBhcmd1bWVudCBzZXBhcmF0b3IgYWZ0ZXIgdGhlIHNoZWJhbmcgc2NyaXB0IGZpbGUuCi0gICAgICAgICAgICBwcm9jZXNzZWRBcmdzLmFkZChzaGViYW5nRmlsZVBvcyArIDEsICItLSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzZWRBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQ29tcGlsZXMgdGhlIGdpdmVuIHNjcmlwdCBmaWxlcyBpbiB0aGUgY29tbWFuZCBsaW5lCiAgICAgICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHVzaW5nIHRoZSAtLWNvbXBpbGUtb25seSBmbGFnCiAgICAgICoKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgwMjU1MTUuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MDI1NTE1LmpzCmluZGV4IDY1MzhmNTQuLmI4ODg5N2IgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgwMjU1MTUuanMKKysrIGIvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODAyNTUxNS5qcwpAQCAtNjEsOCArNjEsOCBAQAogdmFyIGYgPSAoZnVuY3Rpb24oKSB7CiAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyBhLmIuYzsgfTsKIH0pKCk7Ci10ZXN0TWV0aG9kTmFtZShmLCAiZiNMOjYyIik7Cit0ZXN0TWV0aG9kTmFtZShmLCAiZiRMOjYyIik7CiAKIHRlc3RNZXRob2ROYW1lKChmdW5jdGlvbigpIHsKICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiBhLmIuYzsgfTsKLX0pKCksICJMOjY2I0w6NjciKTsKK30pKCksICJMOjY2JEw6NjciKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxMzcyNDAuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTM3MjQwLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU2NDNlLi4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxMzcyNDAuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBKREstODEzNzI0MDogTmVnYXRpdmUgbG9va2FoZWFkIGluIFJlZ0V4IGJyZWFrcyBiYWNrcmVmZXJlbmNlCi0gKgotICogQHRlc3QKLSAqIEBydW4KLSAqLwotCi0KLUFzc2VydC5hc3NlcnRFcXVhbHMoJ2FhJy5yZXBsYWNlKC8oYSkoPyFiKVwxL2dtLCAnYycpLCAnYycpOwotCi12YXIgcmVzdWx0ID0gJ2FhJy5tYXRjaCgvKGEpKD8hYilcMS8pOwotQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0Lmxlbmd0aCA9PT0gMik7Ci1Bc3NlcnQuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gPT09ICdhYScpOwotQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0WzFdID09PSAnYScpOwotCi1yZXN1bHQgPSAnYWEnLm1hdGNoKC8oYSkoPyEoYikpXDIoYSkvKTsKLUFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdC5sZW5ndGggPT09IDQpOwotQXNzZXJ0LmFzc2VydFRydWUocmVzdWx0WzBdID09PSAnYWEnKTsKLUFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdFsxXSA9PT0gJ2EnKTsKLUFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdFsyXSA9PT0gdW5kZWZpbmVkKTsKLUFzc2VydC5hc3NlcnRUcnVlKHJlc3VsdFszXSA9PT0gJ2EnKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTY3MTQuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU2NzE0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2E0ZTkwLi4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTY3MTQuanMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICogCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICogCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogSkRLLTgxNTY3MTQ6IFBhcnNpbmcgaXNzdWUgd2l0aCBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbgotICoKLSAqIEB0ZXN0Ci0gKiBAcnVuCi0gKi8KLQotYSA9IGZ1bmN0aW9uKCkgewotfQotCi0vKiAqLyBmdW5jdGlvbiBiKCkgewotfQotCi1jID0gZnVuY3Rpb24oKSB7Ci19IC8qCi0KLSovIGZ1bmN0aW9uIGQoKSB7Ci19Ci0KLXRyeSB7Ci0gICAgZXZhbCgieCA9IGZ1bmN0aW9uKCkge30gLyogKi8gZnVuY3Rpb24geSgpIHt9Iik7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJFcnJvciBleHBlY3RlZCIpOwotfSBjYXRjaCAoZSkgewotICAgIGlmICghKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikpIHsKLSAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGVycm9yOiAiICsgZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1Njg5Ni5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTY4OTYuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzFmMDcuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1Njg5Ni5qcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKiAKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICogCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKiAKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBKREstODE1Njg5NjogU2NyaXB0IHN0YWNrIHRyYWNlIHNob3VsZCBkaXNwbGF5IGZ1bmN0aW9uIG5hbWVzCi0gKgotICogQHRlc3QKLSAqIEBydW4KLSAqLwotCi1mdW5jdGlvbiBjaGVja05hbWVkRnVuY3Rpb24oc3RhY2spIHsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdGFjay5pbmRleE9mKCJFcnJvclxuXHRhdCBiYXIgKCIpID09PSAwKTsKLX0KLQotZnVuY3Rpb24gY2hlY2tBbm9ueW1vdXNGdW5jdGlvbihzdGFjaykgewotICAgIEFzc2VydC5hc3NlcnRUcnVlKHN0YWNrLmluZGV4T2YoIkVycm9yXG5cdGF0IDxhbm9ueW1vdXM+ICgiKSA9PT0gMCk7Ci19Ci0KLS8vIE5hbWVkIGZ1bmN0aW9ucwotZnVuY3Rpb24gYmFyKCkgeyB0cnkgeyB0aHJvdyBuZXcgRXJyb3IoKTsgfSBjYXRjaChlKSB7IHJldHVybiBlLnN0YWNrOyB9IH0KLWNoZWNrTmFtZWRGdW5jdGlvbihiYXIoKSk7Ci0KLWJhciA9IGZ1bmN0aW9uKCkgeyB0cnkgeyB0aHJvdyBuZXcgRXJyb3IoKTsgfSBjYXRjaChlKSB7IHJldHVybiBlLnN0YWNrOyB9IH07Ci1jaGVja05hbWVkRnVuY3Rpb24oYmFyKCkpOwotCi1mID0gKGZ1bmN0aW9uKCkge3JldHVybiBmdW5jdGlvbiBiYXIoKSB7IHRyeSB7IHRocm93IG5ldyBFcnJvcigpOyB9IGNhdGNoKGUpIHsgcmV0dXJuIGUuc3RhY2s7IH0gfSB9KSgpOwotY2hlY2tOYW1lZEZ1bmN0aW9uKGYoKSk7Ci0KLWYgPSBuZXcgRnVuY3Rpb24oInJldHVybiBmdW5jdGlvbiBiYXIoKSB7IHRyeSB7IHRocm93IG5ldyBFcnJvcigpOyB9IGNhdGNoKGUpIHsgcmV0dXJuIGUuc3RhY2s7IH0gfSIpKCk7Ci1jaGVja05hbWVkRnVuY3Rpb24oZigpKTsKLQotLy8gQW5vbnltb3VzIGZ1bmN0aW9ucwotY2hlY2tBbm9ueW1vdXNGdW5jdGlvbigoZnVuY3Rpb24oKSB7IHRyeSB7IHRocm93IG5ldyBFcnJvcigpOyB9IGNhdGNoKGUpIHsgcmV0dXJuIGUuc3RhY2s7IH0gfSkoKSk7Ci0KLWYgPSAoZnVuY3Rpb24oKSB7cmV0dXJuIGZ1bmN0aW9uKCkgeyB0cnkgeyB0aHJvdyBuZXcgRXJyb3IoKTsgfSBjYXRjaChlKSB7IHJldHVybiBlLnN0YWNrOyB9IH0gfSkoKTsKLWNoZWNrQW5vbnltb3VzRnVuY3Rpb24oZigpKTsKLQotZiA9IG5ldyBGdW5jdGlvbigicmV0dXJuIGZ1bmN0aW9uKCkgeyB0cnkgeyB0aHJvdyBuZXcgRXJyb3IoKTsgfSBjYXRjaChlKSB7IHJldHVybiBlLnN0YWNrOyB9IH0iKSgpOwotY2hlY2tBbm9ueW1vdXNGdW5jdGlvbihmKCkpOwpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1NzE2MC5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTcxNjAuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDc3Y2QuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1NzE2MC5qcworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBKREstODE1NzE2MDogSlNPTi5zdHJpbmdpZnkgZG9lcyBub3Qgd29yayBvbiBTY3JpcHRPYmplY3RNaXJyb3Igb2JqZWN0cwotICoKLSAqIEB0ZXN0Ci0gKiBAb3B0aW9uIC1zY3JpcHRpbmcKLSAqIEBydW4KLSAqLwotCi12YXIgU00gPSBKYXZhLnR5cGUoImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyIik7Ci12YXIgQUpTTyA9IEphdmEudHlwZSgiamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5BYnN0cmFjdEpTT2JqZWN0Iik7Ci12YXIgU3VwcGxpZXIgPSBKYXZhLnR5cGUoImphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllciIpOwotCi12YXIgZW5naW5lID0gbmV3IFNNKCkuZ2V0RW5naW5lQnlOYW1lKCJuYXNob3JuIik7Ci0KLS8vIEpTT04gc3RyaW5naWZ5IFNjcmlwdE9iamVjdE1pcnJvciBpbnN0YW5jZXMKLXByaW50KEpTT04uc3RyaW5naWZ5KGVuZ2luZS5ldmFsKCIoeyBmb28gOiA0MiB9KSIpKSk7Ci1wcmludChKU09OLnN0cmluZ2lmeShlbmdpbmUuZXZhbCgiKFs1LCA2LCA3NiwgN10pIikpKTsKLXByaW50KEpTT04uc3RyaW5naWZ5KGVuZ2luZS5ldmFsKDw8RU9GCi0gKHsKLSAgICAgdG9KU09OOiBmdW5jdGlvbigpICJoZWxsbyIKLSB9KQotRU9GCi0pKSk7Ci0KLXByaW50KEpTT04uc3RyaW5naWZ5KGVuZ2luZS5ldmFsKDw8RU9GCi1vYmogPSB7Ci0gICAgbmFtZTogJ25hc2hvcm4nLAotICAgIHZlcnNpb25zOiBbICdlczUuMScsICdlczYnIF0KLX0KLUVPRgotKSkpOwotCi12YXIgZG0gPSBlbmdpbmUuZXZhbCgibmV3IERhdGUoKSIpOwotcHJpbnQoJyInICsgZG0udG9KU09OKCkgKyAnIicgPT0gSlNPTi5zdHJpbmdpZnkoZG0pKTsKLQotLy8gSlNPTiBzdHJpbmdpZnlpbmcgYW4gYXJiaXRyYXJ5IEpTT2JqZWN0IGltcGwuCi12YXIganNPYmogPSBuZXcgQUpTTygpIHsKLSAgICBrZXlTZXQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIga2V5cyA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotICAgICAgICBrZXlzLmFkZCgieCIpOwotICAgICAgICBrZXlzLmFkZCgieSIpOwotICAgICAgICByZXR1cm4ga2V5czsKLSAgICB9LAotCi0gICAgZ2V0TWVtYmVyOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09ICJ4IikgewotICAgICAgICAgICAgcmV0dXJuIDQyOwotICAgICAgICB9IGVsc2UgaWYgKG5hbWUgPT0gInkiKSB7Ci0gICAgICAgICAgICByZXR1cm4gImhlbGxvIjsKLSAgICAgICAgfQotICAgIH0KLX07Ci1wcmludChKU09OLnN0cmluZ2lmeShqc09iaikpOwotCi0vLyB0cnkgdG9KU09OIGltcGxlbWVudGF0aW9uIG9uIEpTT2JqZWN0Ci12YXIganNPYmoyID0gbmV3IEFKU08oKSB7Ci0gICAgZ2V0TWVtYmVyOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lID09ICd0b0pTT04nKSB7Ci0gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJteSBqc29uIHJlcHJlc2VudGF0aW9uIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX07Ci1wcmludChKU09OLnN0cmluZ2lmeShqc09iajIpKTsKLQotdmFyIGpzT2JqMyA9IG5ldyBBSlNPKCkgewotICAgIGdldE1lbWJlcjogZnVuY3Rpb24obmFtZSkgewotICAgICAgICBpZiAobmFtZSA9PSAndG9KU09OJykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdXBwbGllcigpIHsKLSAgICAgICAgICAgICAgICAiZ2V0IjogZnVuY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFsdWUgZnJvbSB0b0pTT04gZnVuY3Rpb24iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci19OwotcHJpbnQoSlNPTi5zdHJpbmdpZnkoanNPYmozKSk7Ci0KLS8vIHJlcGxhY2VyIGZ1bmN0aW9uIGZyb20gYW5vdGhlciBzY3JpcHQgd29ybGQKLXByaW50KEpTT04uc3RyaW5naWZ5KHsKLSAgIGZvbzogImhlbGxvIgotfSwgZW5naW5lLmV2YWwoPDxFT0YKLSAgICBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewotICAgICAgIGlmIChrZXkgPT0gImZvbyIpIHsKLSAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCkKLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLUVPRikpKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTcxNjAuanMuRVhQRUNURUQgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU3MTYwLmpzLkVYUEVDVEVECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzlmYjc1Li4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTcxNjAuanMuRVhQRUNURUQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXsiZm9vIjo0Mn0KLVs1LDYsNzYsN10KLSJoZWxsbyIKLXsibmFtZSI6Im5hc2hvcm4iLCJ2ZXJzaW9ucyI6WyJlczUuMSIsImVzNiJdfQotdHJ1ZQoteyJ4Ijo0MiwieSI6ImhlbGxvIn0KLSJteSBqc29uIHJlcHJlc2VudGF0aW9uIgotInZhbHVlIGZyb20gdG9KU09OIGZ1bmN0aW9uIgoteyJmb28iOiJIRUxMTyJ9CmRpZmYgLS1naXQgYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU3NjgwLmpzIGIvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1NzY4MC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjODY4ZS4uMDAwMDAwMAotLS0gYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU3NjgwLmpzCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogSkRLLTgxNTc2ODA6IENhbGxiYWNrIHBhcmFtZXRlciBvZiBhbnkgSlMgYnVpbHRpbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWNjZXB0IGFueSBDYWxsYWJsZQotICoKLSAqIEBvcHRpb24gLXNjcmlwdGluZwotICogQHRlc3QKLSAqIEBydW4KLSAqLwotCi12YXIgU00gPSBKYXZhLnR5cGUoImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyIikKLXZhciBlbmdpbmUgPSBuZXcgU00oKS5nZXRFbmdpbmVCeU5hbWUoIm5hc2hvcm4iKQotCi1lbmdpbmUucHV0KCJvdXRwdXQiLCBwcmludCk7Ci12YXIgcmV2aXZlciA9IGVuZ2luZS5ldmFsKDw8RU9GCi1mdW5jdGlvbihuYW1lLCB2YWx1ZSkgewotICAgaWYgKG5hbWUgPT0gIiIpIHJldHVybiB2YWx1ZQotICAgb3V0cHV0KG5hbWUgKyAiID0gIiArIHZhbHVlKQotICAgcmV0dXJuIHZhbHVlCi19Ci1FT0YpCi0KLS8vIHJldml2ZXIgZnVuY3Rpb24gZnJvbSBtaXJyb3Igd29ybGQhCi1KU09OLnBhcnNlKCd7ICJmb28iIDogNDQsICJiYXIiIDogImhlbGxvIiB9JywgcmV2aXZlcikKLQotdmFyIEFKTyA9IEphdmEudHlwZSgiamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5BYnN0cmFjdEpTT2JqZWN0IikKLS8vIHJldml2ZXIgZnVuY3Rpb24gYXMgYSBKU09iamVjdCBmdW5jdGlvbgotSlNPTi5wYXJzZSgneyAibmFzaG9ybiIgOiAiaGVsbG8iIH0nLCBuZXcgQUpPKCkgewotICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCkgdHJ1ZSwKLSAgICBjYWxsOiBmdW5jdGlvbih0aGl6LCBhcmdzKSB7Ci0gICAgICAgIHZhciBuYW1lID0gYXJnc1swXSwgdmFsdWUgPSBhcmdzWzFdCi0gICAgICAgIGlmIChuYW1lID09ICIiKSByZXR1cm4gdmFsdWUKLSAgICAgICAgcHJpbnQobmFtZSArICIgLT4gIiArIHZhbHVlKQotICAgICAgICByZXR1cm4gdmFsdWUKLSAgICB9IAotfSkKLQotLy8gY29tcGFyZSBmdW5jdGlvbiBmcm9tIHRoZSBtaXJyb3Igd29ybGQKLXZhciBhcnIgPSBbMzQsNTY3LC0zLCA1M10uc29ydChlbmdpbmUuZXZhbCg8PEVPRgotICAgIGZ1bmN0aW9uKHgsIHkpIHggPCB5PyAtMSA6ICgoeCA+IHkpPyAxIDogMCkKLUVPRikpCi1wcmludChhcnIpCi0KLS8vIGNvbXBhcmUgZnVuY3Rpb24gYXMgYSBKU09iamVjdCBmdW5jdGlvbgotYXJyID0gWzM0LDU3LC0zLCA1MywgNjcwLCAzM10uc29ydChuZXcgQUpPKCkgewotICAgIGlzRnVuY3Rpb246IGZ1bmN0aW9uKCkgdHJ1ZSwKLSAgICBjYWxsOiBmdW5jdGlvbih0aGl6LCBhcmdzKSB7Ci0gICAgICAgIHZhciB4ID0gYXJnc1swXSwgeSA9IGFyZ3NbMV0KLSAgICAgICAgcmV0dXJuIHggPCB5PyAtMSA6ICgoeCA+IHkpPyAxIDogMCkKLSAgICB9Ci19KQotcHJpbnQoYXJyKQotCi0vLyByZXBsYWNlciBmdW5jdGlvbiBmcm9tIG1pcnJvciB3b3JsZAotdmFyIHN0ciA9ICJoZWxsbyIucmVwbGFjZSgvbC9nLCBlbmdpbmUuZXZhbCg8PEVPRgotICAgIGZ1bmN0aW9uKCkgIl8iCi1FT0YpKQotcHJpbnQoc3RyKQotCi0vLyByZXBsYWNlciBmdW5jdGlvbiBhcyBhIEpTT2JqZWN0IGZ1bmN0aW9uCi1zdHIgPSAiaGVsbG8iLnJlcGxhY2UoL1tlbF0vZywgbmV3IEFKTygpIHsKLSAgICBpc0Z1bmN0aW9uOiBmdW5jdGlvbigpIHRydWUsCi0gICAgY2FsbDogZnVuY3Rpb24odGhpeiwgYXJncykgewotICAgICAgICB2YXIgbWF0Y2ggPSBhcmdzWzBdCi0gICAgICAgIHJldHVybiBtYXRjaC50b1VwcGVyQ2FzZSgpCi0gICAgfQotfSkKLXByaW50KHN0cikKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTc2ODAuanMuRVhQRUNURUQgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU3NjgwLmpzLkVYUEVDVEVECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDgyZjYzLi4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTc2ODAuanMuRVhQRUNURUQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWZvbyA9IDQ0Ci1iYXIgPSBoZWxsbwotbmFzaG9ybiAtPiBoZWxsbwotLTMsMzQsNTMsNTY3Ci0tMywzMywzNCw1Myw1Nyw2NzAKLWhlX19vCi1oRUxMbwpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1NzgxOS5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTc4MTkuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWFhMTUuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1NzgxOS5qcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIEpESy04MTU3ODE5OiBUeXBlRXJyb3Igd2hlbiBhIGphdmEudXRpbC5Db21wYXJhdG9yIG9iamVjdCBpcyBpbnZva2VkIGFzIGEgZnVuY3Rpb24KLSAqCi0gKiBAdGVzdAotICogQHJ1bgotICovCi0KLXZhciBjb21wYXJlID0gamF2YS51dGlsLkNvbXBhcmF0b3IubmF0dXJhbE9yZGVyKCkKLUFzc2VydC5hc3NlcnRUcnVlKGNvbXBhcmUoIm5hc2hvcm4iLCAiZWNtYXNjcmlwdCIpID4gMCkKLUFzc2VydC5hc3NlcnRUcnVlKGNvbXBhcmUoImFiYyIsICJ4eXoiKSA8IDApCi1Bc3NlcnQuYXNzZXJ0VHJ1ZShjb21wYXJlKCJoZWxsbyIsICJoZWxsbyIpID09IDApCi0KLXZhciByY29tcGFyZSA9IGphdmEudXRpbC5Db21wYXJhdG9yLnJldmVyc2VPcmRlcigpCi1Bc3NlcnQuYXNzZXJ0VHJ1ZShyY29tcGFyZSgibmFzaG9ybiIsICJlY21hc2NyaXB0IikgPCAwKQotQXNzZXJ0LmFzc2VydFRydWUocmNvbXBhcmUoImFiYyIsICJ4eXoiKSA+IDApCi1Bc3NlcnQuYXNzZXJ0VHJ1ZShyY29tcGFyZSgiaGVsbG8iLCAiaGVsbG8iKSA9PSAwKQotCi12YXIgYXJyID0gWyAibmFzaG9ybiIsICJKYXZhU2NyaXB0IiwgIkVDTUFTY3JpcHQiLCAiZWNtYXNjcmlwdCIsICJqcyIgXQotQXNzZXJ0LmFzc2VydEVxdWFscyhhcnIuc29ydChjb21wYXJlKS5qb2luKCksCi0gICAgIkVDTUFTY3JpcHQsSmF2YVNjcmlwdCxlY21hc2NyaXB0LGpzLG5hc2hvcm4iKQotQXNzZXJ0LmFzc2VydEVxdWFscyhhcnIuc29ydChyY29tcGFyZSkuam9pbigpLAotICAgICJuYXNob3JuLGpzLGVjbWFzY3JpcHQsSmF2YVNjcmlwdCxFQ01BU2NyaXB0IikKLQpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1ODQ2Ny5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTg0NjcuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzEwNzcuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9iYXNpYy9KREstODE1ODQ2Ny5qcworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0vKioKLSAqIEpESy04MTU4NDY3OiBBY2Nlc3NDb250cm9sRXhjZXB0aW9uIGlzIHRocm93biBvbiBwdWJsaWMgSmF2YSBjbGFzcyBhY2Nlc3MgaWYgInNjcmlwdCBhcHAgbG9hZGVyIiBpcyBzZXQgdG8gbnVsbAotICoKLSAqIEBvcHRpb24gLXNjcmlwdGluZwotICogQHRlc3QKLSAqIEBydW4KLSAqLwotCi12YXIgRmFjdG9yeSA9IEphdmEudHlwZSgiamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5OYXNob3JuU2NyaXB0RW5naW5lRmFjdG9yeSIpOwotdmFyIGZhYyA9IG5ldyBGYWN0b3J5KCk7Ci0KLS8vIFRoaXMgc2NyaXB0IGhhcyB0byBiZSBnaXZlbiBSdW50aW1lUGVybWlzc2lvbigibmFzaG9ybi5zZXRDb25maWciKQotdmFyIGUgPSBmYWNbImdldFNjcmlwdEVuZ2luZShqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpIl0obnVsbCk7Ci0KLXByaW50KGUuZXZhbCgiamF2YS5sYW5nLlN5c3RlbSIpKTsKLXByaW50KGUuZXZhbCgiKHsgZm9vOiA0Mn0pIikuZm9vKTsKLXByaW50KChlLmV2YWwoImZ1bmN0aW9uKHgpIHgqeCIpKSgzMSkpOwotCi1lLnB1dCgib3V0cHV0IiwgcHJpbnQpOwotdmFyIHJ1bm5hYmxlID0gZS5ldmFsKDw8RU9GCi0gICAgbmV3IGphdmEubGFuZy5SdW5uYWJsZSgpIHsKLSAgICAgICAgcnVuOiBmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIG91dHB1dCgiaGVsbG8gUnVubmFibGUiKTsKLSAgICAgICAgfQotICAgIH0KLUVPRik7Ci0KLXJ1bm5hYmxlLnJ1bigpOwotCi12YXIgb2JqID0gZS5ldmFsKDw8RU9GCi1uZXcgKEphdmEuZXh0ZW5kKEphdmEudHlwZSgiamF2YS5sYW5nLk9iamVjdCIpKSkgewotICAgIGhhc2hDb2RlOiBmdW5jdGlvbigpIDMzLAotICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpICJJJ20gb2JqZWN0IgotfQotRU9GKTsKLQotcHJpbnQob2JqLmhhc2hDb2RlKCkpOwotcHJpbnQob2JqLnRvU3RyaW5nKCkpOwotCi0vLyBzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24hCi10cnkgewotICAgIGUuZXZhbCgiUGFja2FnZXMuamRrLmludGVybmFsIik7Ci19IGNhdGNoIChleCkgewotICAgIHByaW50KGV4KTsKLX0KLQotLy8gc2hvdWxkIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIQotdHJ5IHsKLSAgICBlLmV2YWwoIkphdmEudHlwZSgnamRrLmludGVybmFsLm1pc2MuVW5zYWZlJykiKTsKLX0gY2F0Y2ggKGV4KSB7Ci0gICAgcHJpbnQoZXgpOwotfQotCi0vLyBzaG91bGQgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24hCi10cnkgewotICAgIGUuZXZhbCgiSmF2YS50eXBlKCdqZGsubmFzaG9ybi5pbnRlcm5hbC5Db250ZXh0JykiKTsKLX0gY2F0Y2ggKGV4KSB7Ci0gICAgcHJpbnQoZXgpOwotfQotCi0vLyBzaG91bGQgdGhyb3cgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBhcyBudWxsIGlzIHNjcmlwdAotLy8gImFwcCBsb2FkZXIiIFthbmQgbm90IHBsYXRmb3JtIGxvYWRlciB3aGljaCBsb2FkcyBuYXNob3JuXQotZS5ldmFsKDw8RU9GCi10cnkgewotICAgIEphdmEudHlwZSgnamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5KU09iamVjdCcpOwotfSBjYXRjaCAoZXgpIHsKLSAgICBvdXRwdXQoZXgpOwotfQotRU9GKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTg0NjcuanMuRVhQRUNURUQgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTU4NDY3LmpzLkVYUEVDVEVECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWUzZWU5Li4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNTg0NjcuanMuRVhQRUNURUQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1bSmF2YUNsYXNzIGphdmEubGFuZy5TeXN0ZW1dDQotNDINCi05NjENCi1oZWxsbyBSdW5uYWJsZQ0KLTMzDQotSSdtIG9iamVjdA0KLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjogYWNjZXNzIGRlbmllZCAoImphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiIgImFjY2Vzc0NsYXNzSW5QYWNrYWdlLmpkay5pbnRlcm5hbCIpDQotamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOiBhY2Nlc3MgZGVuaWVkICgiamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uIiAiYWNjZXNzQ2xhc3NJblBhY2thZ2UuamRrLmludGVybmFsLm1pc2MiKQ0KLWphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjogYWNjZXNzIGRlbmllZCAoImphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiIgImFjY2Vzc0NsYXNzSW5QYWNrYWdlLmpkay5uYXNob3JuLmludGVybmFsIikNCi1qYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbjogamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5KU09iamVjdA0KZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNjM5NDUuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTYzOTQ1LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFkZDk0Li4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNjM5NDUuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBKREstODE2Mzk0NTogSG9ub3IgTnVtYmVyIHR5cGUgaGludCBpbiB0b1ByaW1pdGl2ZSBvbiBOdW1iZXJzCi0gKgotICogQHRlc3QKLSAqIEBydW4KLSAqLwotCi1mdW5jdGlvbiBhc3NlcnRMZXNzVGhhbihhLCBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUoYSA8IGIpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKGEgPD0gYik7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKGEgPj0gYik7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKGEgPiBiKTsKLX0KLQotYXNzZXJ0TGVzc1RoYW4obmV3IGphdmEubGFuZy5Mb25nKDIpLCBuZXcgamF2YS5sYW5nLkxvbmcoMTApKTsKLWFzc2VydExlc3NUaGFuKG5ldyBqYXZhLmxhbmcuTG9uZygyKSwgMTApOwotYXNzZXJ0TGVzc1RoYW4oMiwgbmV3IGphdmEubGFuZy5Mb25nKDEwKSk7Ci0KLWFzc2VydExlc3NUaGFuKG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigyKSwgbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKDEwKSk7Ci1hc3NlcnRMZXNzVGhhbihuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoMiksIDEwKTsKLWFzc2VydExlc3NUaGFuKDIsIG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigxMCkpOwotCi1hc3NlcnRMZXNzVGhhbihuZXcgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXIoMiksIG5ldyBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcigxMCkpOwotYXNzZXJ0TGVzc1RoYW4obmV3IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyKDIpLCAxMCk7Ci1hc3NlcnRMZXNzVGhhbigyLCBuZXcgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXIoMTApKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNjY5MDIuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2Jhc2ljL0pESy04MTY2OTAyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjE2NDUwLi4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvYmFzaWMvSkRLLTgxNjY5MDIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICogCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICogCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqIAotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICogCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogSkRLLTgxNjY5MDI6IE5lc3RlZCBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0eSBtYXBzIG5vdCByZXNldCBpbiBvcHRpbWlzdGljIHJlY29tcGlsYXRpb24KLSAqCi0gKiBAdGVzdAotICogQHJ1bgotICovCi0KLXZhciBvID0gewotICAgIGE6ICJBIiwKLSAgICBiOiAiQiIKLX07Ci0KLXZhciBtID0gewotICAgIHg6IHsgejogby5hIH0sCi0gICAgeTogby5iCi19OwotCi1Bc3NlcnQuYXNzZXJ0RXF1YWxzKG0ueC56LCAiQSIpOwotQXNzZXJ0LmFzc2VydEVxdWFscyhtLnksICJCIik7Ci0KZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvY3VycmVudGx5LWZhaWxpbmcvSkRLLTgxNDQyMjEuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L2N1cnJlbnRseS1mYWlsaW5nL0pESy04MTQ0MjIxLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTkzMzJkLi4wMDAwMDAwCi0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvY3VycmVudGx5LWZhaWxpbmcvSkRLLTgxNDQyMjEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogVGVzdCB0aGF0IHNoZWJhbmcgaGFuZGxpbmcgd29ya3MgcHJvcGVybHkuCi0gKgotICogQHRlc3QKLSAqIEBvcHRpb24gLXNjcmlwdGluZwotICogQHJ1bgotICovCi0KLS8vIFRoZSB0ZXN0IGdlbmVyYXRlcyB0aHJlZSBkaWZmZXJlbnQgSmF2YVNjcmlwdCBzb3VyY2UgZmlsZXMuIFRoZSBmaXJzdCB0d28KLS8vIGFyZSBnZW5lcmF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGVzdCBhbmQgZG8gbm90IGNoYW5nZS4KLS8vICogYS5qcwotLy8gICBwcmludCgiQTogIiArIGFyZ3VtZW50cykKLS8vICogYi5qcwotLy8gICAjITxwYXRoX3RvX2pqcz4gLWxhbGVsdSAtLSBpZ25vcmUKLS8vICAgcHJpbnQoIkI6ICIgKyBhcmd1bWVudHMpCi0vLwotLy8gVGhlIHRoaXJkIGZpbGUsIHNoZWJhbmcuanMsIGlzIGdlbmVyYXRlZCBkaWZmZXJlbnRseSBmb3IgZWFjaCBwYXJ0aWN1bGFyCi0vLyB0ZXN0IGNhc2UsIGNvbnRhaW5pbmcgZGlmZmVyZW50IHNoZWJhbmcgbGluZXMgYW5kIG9uZSBzdGF0ZW1lbnQ6Ci0vLyAqIHNoZWJhbmcuanMKLS8vICAgIyE8cGF0aF90b19qanM+IDxzaGViYW5nX2xpbmU+Ci0vLyAgIHByaW50KCJTOiAiICsgYXJndW1lbnRzKQotLy8KLS8vIFRoZSBwYXRoX3RvX2pqcyBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgYmFzZWQgb24gSkFWQV9IT01FLCBzbyB0aGUKLS8vIGxhdHRlciBtdXN0IGJlIHNldCBwcm9wZXJseS4KLS8vCi0vLyBFYWNoIHNoZWJhbmcuanMgaXMgcnVuIGZvdXIgdGltZXMsIGluIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgdmFsdWVzCi0vLyBmcm9tIHRoZSBmb2xsb3dpbmcgdHdvIGF4ZXM6Ci0vLyAqIHdpdGhvdXQgcGFzc2luZyBhbnkgYXJndW1lbnRzLCBhbmQgcGFzc2luZyB0aGUgYXJndW1lbnRzICdhLmpzJyBhbmQKLS8vICAgJyJoZWxsbyB3b3JsZCInICh0aGUgbGF0dGVyIGJlaW5nIGEgcXVvdGVkIHN0cmluZyk7Ci0vLyAqIHJ1biB2aWEgampzLCBhbmQgdmlhIGRpcmVjdCBzaGVsbCBleGVjdXRpb24gKHVzaW5nIHNoZWJhbmcpLgotCi12YXIgcHNldWRvc2hlYiAgPSAiIyEke2pqc30gLWxhbGVsdSAtLSBpZ25vcmUiLAotICAgIFN5c3RlbSAgICAgID0gSmF2YS50eXBlKCdqYXZhLmxhbmcuU3lzdGVtJyksCi0gICAgUGF0aHMgICAgICAgPSBKYXZhLnR5cGUoJ2phdmEubmlvLmZpbGUuUGF0aHMnKSwKLSAgICBGaWxlcyAgICAgICA9IEphdmEudHlwZSgnamF2YS5uaW8uZmlsZS5GaWxlcycpLAotICAgIE9wdCAgICAgICAgID0gSmF2YS50eXBlKCdqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbicpLAotICAgIEFycmF5cyAgICAgID0gSmF2YS50eXBlKCdqYXZhLnV0aWwuQXJyYXlzJykKLQotdmFyIHNlcCAgICAgID0gSmF2YS50eXBlKCdqYXZhLmlvLkZpbGUnKS5zZXBhcmF0b3IsCi0gICAgd2luICAgICAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIiksCi0gICAgampzTmFtZSAgPSAiampzIiArICh3aW4gPyAiLmV4ZSIgOiAiIiksCi0gICAgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCi0KLXZhciBqanMgPSBqYXZhSG9tZSArICIvLi4vYmluLyIucmVwbGFjZSgvXC8vZywgc2VwKSArIGpqc05hbWUKLWlmICghRmlsZXMuZXhpc3RzKFBhdGhzLmdldChqanMpKSkgewotICAgIGpqcyA9IGphdmFIb21lICsgIi9iaW4vIi5yZXBsYWNlKC9cLy9nLCBzZXApICsgampzTmFtZQotfQotCi0vLyBDcmVhdGUgYW5kIGN3ZCB0byBhIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0KLXZhciB0bXBkaXIgPSBGaWxlcy5jcmVhdGVUZW1wRGlyZWN0b3J5KG51bGwpLAotICAgIHRtcCAgICA9IHRtcGRpci50b0Fic29sdXRlUGF0aCgpLnRvU3RyaW5nKCksCi0gICAgY3VycHdkID0gJEVOVi5QV0QKLQotJEVOVi5QV0QgPSB0bXAKLQotLy8gVGVzdCBjYXNlcy4gRWFjaCBjYXNlIGlzIGRvY3VtZW50ZWQgd2l0aCB0aGUgZXhwZWN0ZWQgb3V0cHV0IGZvciB0aGUgZm91cgotLy8gZGlmZmVyZW50IGV4ZWN1dGlvbnMuCi0KLXZhciBzaGVicyA9IFsKLSAgICAgICAgLy8gTm8gYXJndW1lbnRzIG9uIHRoZSBzaGViYW5nIGxpbmUuCi0gICAgICAgIC8vIG5vYXJncyBqanMvc2hlYmFuZyAtPiBubyBvdXRwdXQgYnV0ICJTIiBwcmVmaXgKLSAgICAgICAgLy8gYXJncyBqanMvc2hlYmFuZyAgIC0+IG91dHB1dCB0aGUgYXJndW1lbnRzIHdpdGggIlMiIHByZWZpeAotICAgICAgICAiIiwKLSAgICAgICAgLy8gT25lIGludGVycHJldGVyIGFyZ3VtZW50LgotICAgICAgICAvLyBub2FyZ3MgampzL3NoZWJhbmcgLT4gbm8gb3V0cHV0IGJ1dCAiUyIgcHJlZml4Ci0gICAgICAgIC8vIGFyZ3MgampzL3NoZWJhbmcgICAtPiBvdXRwdXQgdGhlIGFyZ3VtZW50cyB3aXRoICJTIiBwcmVmaXgKLSAgICAgICAgIi0tbGFuZ3VhZ2U9ZXM2IiwKLSAgICAgICAgLy8gVHdvIGludGVycHJldGVyIGFyZ3VtZW50cy4KLSAgICAgICAgLy8gbm9hcmdzIGpqcy9zaGViYW5nIC0+IG5vIG91dHB1dCBidXQgIlMiIHByZWZpeAotICAgICAgICAvLyBhcmdzIGpqcy9zaGViYW5nICAgLT4gb3V0cHV0IHRoZSBhcmd1bWVudHMgd2l0aCAiUyIgcHJlZml4Ci0gICAgICAgICItLWxhbmd1YWdlPWVzNiAtc2NyaXB0aW5nIiwKLSAgICAgICAgLy8gT25lIGludGVycHJldGVyIGFyZ3VtZW50IGFuZCBhIEphdmFTY3JpcHQgZmlsZSB3aXRob3V0IHNoZWJhbmcuCi0gICAgICAgIC8vIChGb3Igc2hlYmFuZyBleGVjdXRpb24sIHRoaXMgaXMgYSBwYXRob2xvZ2ljYWwgZXhhbXBsZSwgYXMgdGhlCi0gICAgICAgIC8vIEphdmFTY3JpcHQgZmlsZSBwYXNzZWQgYXMgYSBzaGViYW5nIGFyZ3VtZW50IHdpbGwgYmUgYW5hbHl6ZWQgYW5kCi0gICAgICAgIC8vIHNoZWJhbmcgbW9kZSB3aWxsIG5vdCBiZSBlbnRlcmVkLikKLSAgICAgICAgLy8gbm9hcmdzIGpqcyAgICAgLT4gbm8gb3V0cHV0IGJ1dCAiUyIgcHJlZml4Ci0gICAgICAgIC8vIGFyZ3MgampzICAgICAgIC0+IG91dHB1dCB0aGUgYXJndW1lbnRzIHdpdGggIlMiIHByZWZpeAotICAgICAgICAvLyBub2FyZ3Mgc2hlYmFuZyAtPiBubyBvdXRwdXQgYnV0ICJBIiBhbmQgIlMiIHByZWZpeGVzCi0gICAgICAgIC8vIGFyZ3Mgc2hlYmFuZyAgIC0+IG91dHB1dCAiQSIsICJTIiwgYW5kICJBIiBwcmVmaXhlcywgdGhlbiB0aGUgZXJyb3IKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgbWVzc2FnZToKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb246IGhlbGxvIHdvcmxkIGlzIG5vdCBhIGZpbGUiCi0gICAgICAgICItc2NyaXB0aW5nIGEuanMiLAotICAgICAgICAvLyBPbmUgaW50ZXJwcmV0ZXIgYXJndW1lbnQgYW5kIGEgSmF2YVNjcmlwdCBmaWxlIHdpdGggc2hlYmFuZy4gKFRoaXMKLSAgICAgICAgLy8gaXMgYW5vdGhlciBwYXRob2xvZ2ljYWwgZXhhbXBsZSwgYXMgaXQgd2lsbCBmb3JjZSBzaGViYW5nIG1vZGUsCi0gICAgICAgIC8vIGxlYWRpbmcgdG8gYWxsIHN1YnNlcXVlbnQgYXJndW1lbnRzLCBpbmNsdWRpbmcgc2hlYmFuZy5qcywgYmVpbmcKLSAgICAgICAgLy8gdHJlYXRlZCBhcyBhcmd1bWVudHMgdG8gdGhlIHNjcmlwdCBiLmpzLikKLSAgICAgICAgLy8gbm9hcmdzIGpqcyAgICAgLT4gbm8gb3V0cHV0IGJ1dCB0aGUgIlMiIHByZWZpeAotICAgICAgICAvLyBhcmdzIGpqcyAgICAgICAtPiBvdXRwdXQgdGhlIGFyZ3VtZW50cyB3aXRoICJTIiBwcmVmaXgKLSAgICAgICAgLy8gbm9hcmdzIHNoZWJhbmcgLT4gb3V0cHV0IHNoZWJhbmcuanMgd2l0aCAiQiIgcHJlZml4Ci0gICAgICAgIC8vIGFyZ3Mgc2hlYmFuZyAgIC0+IG91dHB1dCBzaGViYW5nLmpzIGFuZCB0aGUgYXJndW1lbnRzIHdpdGggIkIiCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgIHByZWZpeAotICAgICAgICAiLXNjcmlwdGluZyBiLmpzIgotICAgIF0KLQotZnVuY3Rpb24gd3JpdGUoZmlsZSwgbGluZXMpIHsKLSAgICBGaWxlcy53cml0ZShQYXRocy5nZXQodG1wLCBmaWxlKSwgQXJyYXlzLmFzTGlzdChsaW5lcyksIE9wdC5DUkVBVEUsIE9wdC5XUklURSkKLX0KLQotZnVuY3Rpb24gaW5zbihuYW1lKSB7Ci0gICAgcmV0dXJuICJwcmludCgnJHtuYW1lfTonICsgYXJndW1lbnRzKSIKLX0KLQotZnVuY3Rpb24gcnVuKHZpYWpqcywgbmFtZSwgYXJnMSwgYXJnMikgewotICAgIHZhciBwcmVmaXggPSB2aWFqanMgPyAiJHtqanN9IC1zY3JpcHRpbmcgIiA6IHdpbiA/ICdzaCAtYyAiJyA6ICcnLAotICAgICAgICBzdWZmaXggPSB2aWFqanMgPyAnJyA6IHdpbiA/ICciJyA6ICcnCi0gICAgJEVYRUMoIiR7cHJlZml4fS4vc2hlYmFuZy5qcyAke2FyZzF9ICR7YXJnMn0ke3N1ZmZpeH0iKQotICAgIHByaW50KCIqICR7bmFtZX0gdmlhICR7dmlhampzID8gJ2pqcycgOiAnc2hlYmFuZyd9IikKLSAgICBwcmludCgkT1VULnRyaW0oKSkKLSAgICBwcmludCgkRVJSLnRyaW0oKSkKLX0KLQotd3JpdGUoJ2EuanMnLCBpbnNuKCdBJykpCi13cml0ZSgnYi5qcycsIFtwc2V1ZG9zaGViLCBpbnNuKCdCJyldKQotCi1zaGVicy5mb3JFYWNoKGZ1bmN0aW9uKHNoZWIpIHsKLSAgICB2YXIgc2hlYmFuZyA9ICIjISR7ampzfSAke3NoZWJ9IgotICAgIHByaW50KCI8PDwgJHtzaGVifSA+Pj4iKQotICAgIHdyaXRlKCdzaGViYW5nLmpzJywgW3NoZWJhbmcsIGluc24oJ1MnKV0pCi0gICAgJEVYRUMoJ2NobW9kICt4IHNoZWJhbmcuanMnKQotICAgIHJ1bihmYWxzZSwgJ25vYXJncycsICcnLCAnJykKLSAgICBydW4odHJ1ZSwgJ25vYXJncycsICcnLCAnJykKLSAgICBydW4oZmFsc2UsICd3aXRoYXJncycsICdhLmpzJywgIidoZWxsbyB3b3JsZCciKQotICAgIHJ1bih0cnVlLCAnd2l0aGFyZ3MnLCAnYS5qcycsICInaGVsbG8gd29ybGQnIikKLSAgICAkRVhFQygncm0gc2hlYmFuZy5qcycpCi19KQotCi0vLyBDbGVhbnVwLgotCi0kRVhFQygncm0gYS5qcyBiLmpzJykKLSRFTlYuUFdEID0gY3VycHdkCi1GaWxlcy5kZWxldGUodG1wZGlyKQpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9jdXJyZW50bHktZmFpbGluZy9KREstODE0NDIyMS5qcy5FWFBFQ1RFRCBiL25hc2hvcm4vdGVzdC9zY3JpcHQvY3VycmVudGx5LWZhaWxpbmcvSkRLLTgxNDQyMjEuanMuRVhQRUNURUQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjVkNzMuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9jdXJyZW50bHktZmFpbGluZy9KREstODE0NDIyMS5qcy5FWFBFQ1RFRAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw8PCAgPj4+Ci0qIG5vYXJncyB2aWEgc2hlYmFuZwotUzoKLQotKiBub2FyZ3MgdmlhIGpqcwotUzoKLQotKiB3aXRoYXJncyB2aWEgc2hlYmFuZwotUzphLmpzLGhlbGxvIHdvcmxkCi0KLSogd2l0aGFyZ3MgdmlhIGpqcwotUzphLmpzLGhlbGxvIHdvcmxkCi0KLTw8PCAtLWxhbmd1YWdlPWVzNiA+Pj4KLSogbm9hcmdzIHZpYSBzaGViYW5nCi1TOgotCi0qIG5vYXJncyB2aWEgampzCi1TOgotCi0qIHdpdGhhcmdzIHZpYSBzaGViYW5nCi1TOmEuanMsaGVsbG8gd29ybGQKLQotKiB3aXRoYXJncyB2aWEgampzCi1TOmEuanMsaGVsbG8gd29ybGQKLQotPDw8IC0tbGFuZ3VhZ2U9ZXM2IC1zY3JpcHRpbmcgPj4+Ci0qIG5vYXJncyB2aWEgc2hlYmFuZwotUzoKLQotKiBub2FyZ3MgdmlhIGpqcwotUzoKLQotKiB3aXRoYXJncyB2aWEgc2hlYmFuZwotUzphLmpzLGhlbGxvIHdvcmxkCi0KLSogd2l0aGFyZ3MgdmlhIGpqcwotUzphLmpzLGhlbGxvIHdvcmxkCi0KLTw8PCAtc2NyaXB0aW5nIGEuanMgPj4+Ci0qIG5vYXJncyB2aWEgc2hlYmFuZwotQToKLVM6Ci0KLSogbm9hcmdzIHZpYSBqanMKLVM6Ci0KLSogd2l0aGFyZ3MgdmlhIHNoZWJhbmcKLUE6Ci1TOgotQToKLWphdmEuaW8uSU9FeGNlcHRpb246IGhlbGxvIHdvcmxkIGlzIG5vdCBhIGZpbGUKLSogd2l0aGFyZ3MgdmlhIGpqcwotUzphLmpzLGhlbGxvIHdvcmxkCi0KLTw8PCAtc2NyaXB0aW5nIGIuanMgPj4+Ci0qIG5vYXJncyB2aWEgc2hlYmFuZwotQjouL3NoZWJhbmcuanMKLQotKiBub2FyZ3MgdmlhIGpqcwotUzoKLQotKiB3aXRoYXJncyB2aWEgc2hlYmFuZwotQjouL3NoZWJhbmcuanMsYS5qcyxoZWxsbyB3b3JsZAotCi0qIHdpdGhhcmdzIHZpYSBqanMKLVM6YS5qcyxoZWxsbyB3b3JsZAotCmRpZmYgLS1naXQgYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvSkRLLTgxMzAxMjcuanMgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvSkRLLTgxMzAxMjcuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjU2ZDEuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9ub3NlY3VyaXR5L0pESy04MTMwMTI3LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogSkRLLTgxMzAxMjc6IHN0cmVhbWxpbmUgaW5wdXQgcGFyYW1ldGVyIG9mIE5hc2hvcm4gc2NyaXB0aW5nICRFWEVDIGZ1bmN0aW9uCi0gKgotICogVGVzdCBkaWZmZXJlbnQgdmFyaWFudHMgb2Ygc3RkaW4gcGFzc2luZyB0byAkRVhFQy4KLSAqCi0gKiBAdGVzdAotICogQG9wdGlvbiAtc2NyaXB0aW5nCi0gKiBAcnVuCi0gKi8KLQotdmFyIEZpbGUgPSBqYXZhLmlvLkZpbGUsCi0gICAgc2VwID0gRmlsZS5zZXBhcmF0b3IsCi0gICAgU3lzdGVtID0gamF2YS5sYW5nLlN5c3RlbSwKLSAgICBvcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLAotICAgIHdpbiA9IG9zLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSwKLSAgICBqanNOYW1lID0gImpqcyIgKyAod2luID8gIi5leGUiIDogIiIpLAotICAgIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotCi12YXIgampzID0gamF2YUhvbWUgKyAiLy4uL2Jpbi8iLnJlcGxhY2UoL1wvL2csIHNlcCkgKyBqanNOYW1lCi1pZiAoIW5ldyBGaWxlKGpqcykuaXNGaWxlKCkpIHsKLSAgICBqanMgPSBqYXZhSG9tZSArICIvYmluLyIucmVwbGFjZSgvXC8vZywgc2VwKSArIGpqc05hbWUKLX0KLQotdmFyIGpqc0NtZCA9IGpqcyArICIgcmVhZHByaW50LmpzIgotCi1wcmludCgkRVhFQyhqanNDbWQpKQotcHJpbnQoJEVYRUMoampzQ21kLCBudWxsKSkKLXByaW50KCRFWEVDKGpqc0NtZCwgdW5kZWZpbmVkKSkKLXByaW50KCRFWEVDKGpqc0NtZCwgIiIpKQotCi1wcmludCgkRVhFQyhqanMsICJwcmludCgnaGVsbG8nKSIpKQotCmRpZmYgLS1naXQgYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvSkRLLTgxMzAxMjcuanMuRVhQRUNURUQgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvSkRLLTgxMzAxMjcuanMuRVhQRUNURUQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNjIwNTIuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NjcmlwdC9ub3NlY3VyaXR5L0pESy04MTMwMTI3LmpzLkVYUEVDVEVECisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0KLQotCi0KLWhlbGxvCi0KZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvbm9zZWN1cml0eS9vcy1ub3Qtd2luZG93cy5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvbm9zZWN1cml0eS9vcy1ub3Qtd2luZG93cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiNzRkNS4uMDAwMDAwMAotLS0gYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvb3Mtbm90LXdpbmRvd3MuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBUZXN0IHRoYXQgd2UncmUgbm90IHJ1bm5pbmcgb24gV2luZG93cy4gVGhlIHRlc3QgYWN0dWFsbHkgY2hlY2tzIGlmIHRoZSBvcy5ub3Qud2luZG93cyBwcm9wZXJ0eSBpcyBzZXQgYW5kIHByb2Nlc3NlZAotICogYnkgcnVuaWYgY29ycmVjdGx5LgotICoKLSAqIEB0ZXN0Ci0gKiBAcnVuaWYgb3Mubm90LndpbmRvd3MKLSAqIEBydW4KLSAqLwotCi12YXIgb3MgPSBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikKLQotaWYgKG9zLnN0YXJ0c1dpdGgoIldpbmRvd3MiKSkgewotICAgIHRocm93ICJUaGlzIHRlc3Qgc2hvdWxkIG5vdCBiZSBydW4gb24gV2luZG93cy4iCi19CmRpZmYgLS1naXQgYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvcmVhZHByaW50LmpzIGIvbmFzaG9ybi90ZXN0L3NjcmlwdC9ub3NlY3VyaXR5L3JlYWRwcmludC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhNjFiOC4uMDAwMDAwMAotLS0gYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L25vc2VjdXJpdHkvcmVhZHByaW50LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogVGhpcyBpcyBhIGR1bW15IHNjcmlwdCBhY2NvbXBhbnlpbmcgSkRLLTgxMzAxMjcuanMuCi0gKgotICogQHN1YnRlc3QKLSAqIEBydW4gaWdub3JlIHN1cHBsZW1lbnRhbAotICovCi0KLXZhciBsID0gcmVhZExpbmUoKQotcHJpbnQobCkKLQpkaWZmIC0tZ2l0IGEvbmFzaG9ybi90ZXN0L3NjcmlwdC90cnVzdGVkL0pESy04MDg3MjkyLmpzIGIvbmFzaG9ybi90ZXN0L3NjcmlwdC90cnVzdGVkL0pESy04MDg3MjkyLmpzCmluZGV4IDU3MjIzZDMuLjI5NzNlYjMgMTAwNjQ0Ci0tLSBhL25hc2hvcm4vdGVzdC9zY3JpcHQvdHJ1c3RlZC9KREstODA4NzI5Mi5qcworKysgYi9uYXNob3JuL3Rlc3Qvc2NyaXB0L3RydXN0ZWQvSkRLLTgwODcyOTIuanMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOSw1OCArMjksMjYgQEAKICAqIEBydW4KICAqLwogCi1sb2FkKF9fRElSX18gKyAiSkRLLXV0aWwuanMiKQotCi12YXIgakhvbWVQYXRoID0gU3lzdGVtLmdldGVudigiSkFWQV9IT01FIikKLXZhciBqTGF1bmNoZXIgPSAiJHtqSG9tZVBhdGh9L2Jpbi9qYXZhIgotdmFyIGFsdGpMYXVuY2hlciA9IHdoaWNoKCdqYXZhJykKLQotaWYgKHdpbmRvd3MpIHsKLSAgICBpZih3aW5DeWcpIHsKLSAgICAgICAgakxhdW5jaGVyID0gIiR7akhvbWVQYXRofSIgKyAiL2Jpbi9qYXZhLmV4ZSIKLSAgICAgICAgakxhdW5jaGVyID0gY3lncGF0aChqTGF1bmNoZXIsb3V0UGF0aC53aW5kb3dzKSAKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGpMYXVuY2hlciA9ICIke2pIb21lUGF0aH0iICsgIlxcYmluXFxqYXZhLmV4ZSIKLSAgICAgICAgYWx0akxhdW5jaGVyID0gd2hpY2goJ2phdmEuZXhlJykKLSAgICAgICAgYWx0akxhdW5jaGVyID0gY3lncGF0aChhbHRqTGF1bmNoZXIsb3V0UGF0aC53aW5kb3dzKQotICAgIH0KLX0KLQotZnVuY3Rpb24gZXhpc3RzKGYpIHsKLSAgICByZXR1cm4gRmlsZXMuZXhpc3RzKFBhdGhzLmdldChmKSkKLX0KLQotdmFyIGphdmFMYXVuY2hlciA9IGV4aXN0cyhqTGF1bmNoZXIpID8gakxhdW5jaGVyIDogYWx0akxhdW5jaGVyCi0KLQotaWYgKCFleGlzdHMoamF2YUxhdW5jaGVyKSkgewotICAgIHRocm93ICJubyBqYXZhIGxhdW5jaGVyIGZvdW5kOyB0cmllZCAke2pMYXVuY2hlcn0gYW5kICR7YWx0akxhdW5jaGVyfSIKLX0KLQogZnVuY3Rpb24gdHJ5RXhlYygpIHsKICAgICB0cnkgewotCSRFWEVDKCIke2phdmFMYXVuY2hlcn0iKQorICAgICAgICBgamF2YWAKICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICBwcmludChlKQorICAgICAgICBwcmludChlKTsKICAgICB9CiAKICAgICAvLyBtYWtlIHN1cmUgd2UgZ290IG5vbi16ZXJvICgiZmFpbHVyZSIpIGV4aXQgY29kZSEKICAgICBpZiAoJEVYSVQgPT0gMCkgewotICAgICAgICBwcmludCgiRXJyb3I6IGV4cGVjdGVkICRFWElUIGNvZGUgdG8gYmUgbm9uLXplcm8iKQorICAgICAgICBwcmludCgiRXJyb3I6IGV4cGVjdGVkICRFWElUIGNvZGUgdG8gYmUgbm9uLXplcm8iKTsKICAgICB9CiB9Ci0vL2NvbnZlcnQgd2luZG93cyBwYXRocyB0byBjeWd3aW4KLWlmICh3aW5kb3dzKQotICAgIGphdmFMYXVuY2hlciA9ICh3aW5DeWcpID8gY3lncGF0aChqYXZhTGF1bmNoZXIsb3V0UGF0aC5taXhlZCkudHJpbSgpIDogY3lncGF0aChqYXZhTGF1bmNoZXIsb3V0UGF0aC53aW5kb3dzKS50cmltKCkKIAogLy8gbm8gZXhjZXB0aW9uIG5vdyEKLXRyeUV4ZWMoKQordHJ5RXhlYygpOwogCiAvLyB0dXJuIG9uIGVycm9yIHdpdGggbm9uLXplcm8gZXhpdCBjb2RlCi0kRVhFQy50aHJvd09uRXJyb3IgPSB0cnVlCi10cnlFeGVjKCkKKyRFWEVDLnRocm93T25FcnJvciA9IHRydWU7Cit0cnlFeGVjKCk7CiAKIC8vIG5vIGV4Y2VwdGlvbiBhZnRlciB0aGlzCi0kRVhFQy50aHJvd09uRXJyb3IgPSBmYWxzZQotdHJ5RXhlYygpCiskRVhFQy50aHJvd09uRXJyb3IgPSBmYWxzZTsKK3RyeUV4ZWMoKTsKZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zY3JpcHQvdHJ1c3RlZC9KREstdXRpbC5qcyBiL25hc2hvcm4vdGVzdC9zY3JpcHQvdHJ1c3RlZC9KREstdXRpbC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiMGY1Yy4uMDAwMDAwMAotLS0gYS9uYXNob3JuL3Rlc3Qvc2NyaXB0L3RydXN0ZWQvSkRLLXV0aWwuanMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSBvdGhlciB0ZXN0cy4KLSAqIEBzdWJ0ZXN0Ci0gKi8KLQotdmFyIEZpbGVzID0gSmF2YS50eXBlKCdqYXZhLm5pby5maWxlLkZpbGVzJyksCi0gICAgUGF0aHMgPSBKYXZhLnR5cGUoJ2phdmEubmlvLmZpbGUuUGF0aHMnKSwKLSAgICBTeXN0ZW0gPSBKYXZhLnR5cGUoJ2phdmEubGFuZy5TeXN0ZW0nKQotCi12YXIgRmlsZSA9IGphdmEuaW8uRmlsZQotdmFyIHdpbmRvd3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW5kb3dzIikKLXZhciB3aW5DeWcgPSBmYWxzZQotCi12YXIgb3V0UGF0aCA9IHsKLSAgICB3aW5kb3dzOjAsIC8vQzpcZGlyCi0gICAgbWl4ZWQ6MSAgICAvL0M6L2RpcgotfQotCi1pZiAod2luZG93cykgewotICAgIC8vSXMgdGhlcmUgYW55IGJldHRlciB3YXkgdG8gZGlmZnJlbnRpYXRlIGJldHdlZW4gY3lnd2luL2NvbW1hbmQgcHJvbXB0IG9uIHdpbmRvd3MKLSAgICB2YXIgdGVybSA9IFN5c3RlbS5nZXRlbnYoIlRFUk0iKQotICAgIHdpbkN5ZyA9IHRlcm0gPyB0cnVlOmZhbHNlCi19Ci0KLS8qKgotICogUmV0dXJucyB3aGljaCBjb21tYW5kIGlzIHNlbGVjdGVkIGZyb20gUEFUSAotICogQHBhcmFtIGNtZCBuYW1lIG9mIHRoZSBjb21tYW5kIHNlYXJjaGVkIGZyb20gUEFUSAotICovCi1mdW5jdGlvbiB3aGljaChjbWQpIHsKLSAgICB2YXIgcGF0aCA9IFN5c3RlbS5nZXRlbnYoIlBBVEgiKQotICAgIHZhciBzdCA9IG5ldyBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyKHBhdGgsIEZpbGUucGF0aFNlcGFyYXRvcikKLSAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgIHZhciBmaWxlID0gbmV3IEZpbGUoc3QubmV4dFRva2VuKCksIGNtZCkKLSAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBVbml4IGN5Z3BhdGggaW1wbGVtZW50YXRpb24KLSAqIFN1cHBvcnRzIG9ubHkgdHdvIG91dHB1dHMsd2luZG93cyhDOlxkaXJcKSBhbmQgbWl4ZWQoQzovZGlyLykKLSAqLwotIAotZnVuY3Rpb24gY3lncGF0aChwYXRoLG1vZGUpIHsKLSAgIAotICAgIHZhciBuZXdwYXRoID0gcGF0aAotICAgIGlmKHBhdGguc3RhcnRzV2l0aCgiL2N5Z2RyaXZlLyIpKXsKLSAgICAgICAgdmFyIHN0ciA9IHBhdGguc3Vic3RyaW5nKDEwKQotICAgICAgICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZignLycsMCkKLSAgICAgICAgdmFyIGRydiA9IHN0ci5zdWJzdHJpbmcoMCxpbmRleCkKLSAgICAgICAgdmFyIHJzdHIgPSBkcnYudG9VcHBlckNhc2UoKSArICI6IgotICAgICAgICBuZXdwYXRoID0gc3RyLnJlcGxhY2VGaXJzdChkcnYscnN0cikKLSAgICB9Ci0gICAgaWYgKG1vZGUgPT0gb3V0UGF0aC53aW5kb3dzKQotICAgICAgICByZXR1cm4gUGF0aHMuZ2V0KG5ld3BhdGgpLnRvU3RyaW5nKCkKLSAgICBlbHNlIHsKLSAgICAgICAgbmV3cGF0aCA9IG5ld3BhdGgucmVwbGFjZUFsbCgnXFxcXCcsJy8nKQotICAgICAgICByZXR1cm4gbmV3cGF0aAotICAgIH0gICAgICAgICAgICAgICAgICAgCi0KLX0KLQotCmRpZmYgLS1naXQgYS9uYXNob3JuL3Rlc3Qvc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvdGVzdC9KREtfODE0ODE0MF9UZXN0LmphdmEgYi9uYXNob3JuL3Rlc3Qvc3JjL2pkay9uYXNob3JuL2FwaS9zY3JpcHRpbmcvdGVzdC9KREtfODE0ODE0MF9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjljNGIuLjAwMDAwMDAKLS0tIGEvbmFzaG9ybi90ZXN0L3NyYy9qZGsvbmFzaG9ybi9hcGkvc2NyaXB0aW5nL3Rlc3QvSkRLXzgxNDgxNDBfVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLXBhY2thZ2UgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lOwotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFeGNlcHRpb247Ci1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5BYnN0cmFjdEpTT2JqZWN0OwotCi1pbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuKjsKLQotLyoqCi0gKiBAYnVnIDgxNDgxNDAKLSAqIEBzdW1tYXJ5IGFyZ3VtZW50cyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiBhcHBseSBmb3IgSlMgZnVuY3Rpb25zIGFuZCBBYnN0cmFjdEpTT2JqZWN0cwotICovCi1wdWJsaWMgY2xhc3MgSkRLXzgxNDgxNDBfVGVzdCB7Ci0KLSAgICBTY3JpcHRFbmdpbmUgZW5naW5lOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFQgPSAiWzEsIDIsIDNdIjsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyB2b2lkIHNldHVwVGVzdCgpIHsKLSAgICAgICAgZW5naW5lID0gbmV3IFNjcmlwdEVuZ2luZU1hbmFnZXIoKS5nZXRFbmdpbmVCeU5hbWUoImpzIik7Ci0gICAgICAgIGVuZ2luZS5wdXQoImYiLCBuZXcgQWJzdHJhY3RKU09iamVjdCgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGdW5jdGlvbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKE9iamVjdCB0aGl6LCBPYmplY3QuLi4gYXJncykgewotICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuZGVlcFRvU3RyaW5nKGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsRigpIHRocm93cyBTY3JpcHRFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoUkVTVUxULCBlbmdpbmUuZXZhbCgiZigxLDIsMykiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbHlGKCkgdGhyb3dzIFNjcmlwdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhSRVNVTFQsIGVuZ2luZS5ldmFsKCJGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChmLCBudWxsLCBbMSwyLDNdKSIpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL25hc2hvcm4vdGVzdC9zcmMvamRrL25hc2hvcm4vYXBpL3NjcmlwdGluZy90ZXN0L1Njb3BlVGVzdC5qYXZhIGIvbmFzaG9ybi90ZXN0L3NyYy9qZGsvbmFzaG9ybi9hcGkvc2NyaXB0aW5nL3Rlc3QvU2NvcGVUZXN0LmphdmEKaW5kZXggYTRjMWY5NC4uMDViNjE0YSAxMDA2NDQKLS0tIGEvbmFzaG9ybi90ZXN0L3NyYy9qZGsvbmFzaG9ybi9hcGkvc2NyaXB0aW5nL3Rlc3QvU2NvcGVUZXN0LmphdmEKKysrIGIvbmFzaG9ybi90ZXN0L3NyYy9qZGsvbmFzaG9ybi9hcGkvc2NyaXB0aW5nL3Rlc3QvU2NvcGVUZXN0LmphdmEKQEAgLTMwLDggKzMwLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuZmFpbDsKIGltcG9ydCBqYXZheC5zY3JpcHQuQmluZGluZ3M7Ci1pbXBvcnQgamF2YXguc2NyaXB0LkNvbXBpbGFibGU7Ci1pbXBvcnQgamF2YXguc2NyaXB0LkNvbXBpbGVkU2NyaXB0OwogaW1wb3J0IGphdmF4LnNjcmlwdC5JbnZvY2FibGU7CiBpbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdENvbnRleHQ7CiBpbXBvcnQgamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZTsKQEAgLTkxMywyNyArOTExLDQgQEAKICAgICAgICAgIE9iamVjdCB2YWx1ZSA9ICgoSW52b2NhYmxlKWVuZ2luZSkuaW52b2tlRnVuY3Rpb24oIm5ld2Z1bmMiKTsKICAgICAgICAgIGFzc2VydFRydWUoKChOdW1iZXIpdmFsdWUpLmludFZhbHVlKCkgPT0gNDIpOwogICAgIH0KLQotICAgIC8vIEBidWcgODE1MDIxOSBSZWZlcmVuY2VFcnJvciBpbiAxLjguMF83MgotICAgIC8vIFdoZW4gd2UgY3JlYXRlIGEgR2xvYmFsIGZvciBhIG5vbi1kZWZhdWx0IFNjcmlwdENvbnRleHQgdGhhdCBuZWVkcyBvbmUga2VlcCB0aGUKLSAgICAvLyBTY3JpcHRDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgR2xvYmFsIHNvIHRoYXQgaW52b2tlIG1ldGhvZHMgd29yayBhcyBleHBlY3RlZC4KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGludm9rZUZ1bmN0aW9uV2l0aEN1c3RvbVNjcmlwdENvbnRleHRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBuZXcgU2NyaXB0RW5naW5lTWFuYWdlcigpLmdldEVuZ2luZUJ5TmFtZSgibmFzaG9ybiIpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBhbiBlbmdpbmUgYW5kIGEgU2NyaXB0Q29udGV4dCwgYnV0IGRvbid0IHNldCBpdCBhcyBkZWZhdWx0Ci0gICAgICAgIFNjcmlwdENvbnRleHQgc2NyaXB0Q29udGV4dCA9IG5ldyBTaW1wbGVTY3JpcHRDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gU2V0IHNvbWUgdmFsdWUgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgc2NyaXB0Q29udGV4dC5zZXRBdHRyaWJ1dGUoIm15U3RyaW5nIiwgImZvbyIsIFNjcmlwdENvbnRleHQuRU5HSU5FX1NDT1BFKTsKLQotICAgICAgICAvLyBFdmFsdWF0ZSBzY3JpcHQgd2l0aCBjdXN0b20gY29udGV4dCBhbmQgZ2V0IGJhY2sgYSBmdW5jdGlvbgotICAgICAgICBmaW5hbCBTdHJpbmcgc2NyaXB0ID0gImZ1bmN0aW9uIChjKSB7IHJldHVybiBteVN0cmluZy5pbmRleE9mKGMpOyB9IjsKLSAgICAgICAgQ29tcGlsZWRTY3JpcHQgY29tcGlsZWRTY3JpcHQgPSAoKENvbXBpbGFibGUpZW5naW5lKS5jb21waWxlKHNjcmlwdCk7Ci0gICAgICAgIE9iamVjdCBmdW5jID0gY29tcGlsZWRTY3JpcHQuZXZhbChzY3JpcHRDb250ZXh0KTsKLQotICAgICAgICAvLyBJbnZva2VkIGZ1bmN0aW9uIHNob3VsZCBiZSBhYmxlIHRvIHNlZSBjb250ZXh0IGl0IHdhcyBldmFsdWF0ZWQgd2l0aAotICAgICAgICBPYmplY3QgcmVzdWx0ID0gKChJbnZvY2FibGUpIGVuZ2luZSkuaW52b2tlTWV0aG9kKGZ1bmMsICJjYWxsIiwgZnVuYywgIm8iLCBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgoKE51bWJlcilyZXN1bHQpLmludFZhbHVlKCkgPT0gMSk7Ci0gICAgfQogfQo=